소스 검색

删除文件 modules/src/wps

toor10 2 년 전
부모
커밋
cc4bfdbb45

+ 0 - 71
modules/src/wps/api/iwlist_parser.php

@@ -1,71 +0,0 @@
-<?php namespace pineapple;
-
-class iwlist_parser
-{
-    public function iwlist_parser()
-    {
-    }
-
-    public function parseString($string)
-    {
-        if (empty($string)) {
-            return false;
-        }
-
-        // Rueckgabe dieser Funktion:
-        // $array[device][Cell#][Cell-Feld] = Wert
-        // z.b. $array[eth0][1][ESSID] = "MGees_WLan"
-
-        $ergebnis = array();
-
-        $string = explode("\n", $string);
-
-        $device = $cell = "";
-
-        foreach ($string as $zeile) {
-            if (substr($zeile, 0, 1) != ' ') {
-                $device = substr($zeile, 0, strpos($zeile, ' '));
-                $ergebnis[$device] = array();
-            } else {
-                $zeile = trim($zeile);
-                // Zeile kann sein:
-                // Cell ## - Address: Wert
-                // Feld:Wert
-                // Quality=bla Signal Level=bla2
-                if (substr($zeile, 0, 5) == 'Cell ') {
-                    $cell = (int)substr($zeile, 5, 2);
-                    $ergebnis[$device][$cell] = array();
-                    $doppelp_pos = strpos($zeile, ':');
-                    $ergebnis[$device][$cell]['Address'] =
-                        trim(substr($zeile, $doppelp_pos + 1));
-                } elseif (substr($zeile, 0, 8) == 'Quality=') {
-                    $first_eq_pos = strpos($zeile, '=');
-                    $last_eq_pos = strrpos($zeile, '=');
-                    $slash_pos = strpos($zeile, '/') - $first_eq_pos;
-                    //$ergebnis[$device][$cell]['Quality'] = trim(substr($zeile, $first_eq_pos + 1, $slash_pos - 1));
-                    $ergebnis[$device][$cell]['Quality'] = trim(number_format(substr($zeile, $first_eq_pos + 1, $slash_pos - 1) * 100 / 70, 0));
-                    $ergebnis[$device][$cell]['Signal level'] = trim(substr($zeile, $last_eq_pos + 1));
-                } else {
-                    $doppelp_pos = strpos($zeile, ':');
-                    $feld = trim(substr($zeile, 0, $doppelp_pos));
-                    if (!empty($ergebnis[$device][$cell][$feld])) {
-                        $ergebnis[$device][$cell][$feld] .= "\n";
-                    }
-                    // Leer- und "-Zeichen rausschmeissen - ESSID steht immer in ""
-                    @$ergebnis[$device][$cell][$feld] .= trim(str_replace('"', '', substr($zeile, $doppelp_pos + 1)));
-                }
-            }
-        }
-        return $ergebnis;
-    }
-
-    public function parseScanAll()
-    {
-        return $this -> parseString(shell_exec("iwlist scan 2> /dev/null"));
-    }
-
-    public function parseScanDev($device)
-    {
-        return $this -> parseString(shell_exec("iwlist ".$device." scan 2> /dev/null"));
-    }
-}

+ 0 - 479
modules/src/wps/api/module.php

@@ -1,479 +0,0 @@
-<?php namespace pineapple;
-
-
-require_once('/pineapple/modules/wps/api/iwlist_parser.php');
-
-class wps extends Module
-{
-    public function __construct($request)
-    {
-        parent::__construct($request, __CLASS__);
-        $this->iwlistparse = new iwlist_parser();
-    }
-
-    public function route()
-    {
-        switch ($this->request->action) {
-            case 'refreshInfo':
-                $this->refreshInfo();
-                break;
-            case 'refreshStatus':
-                $this->refreshStatus();
-                break;
-            case 'refreshOutput':
-                $this->refreshOutput();
-                break;
-            case 'handleDependencies':
-                $this->handleDependencies();
-                break;
-            case 'handleDependenciesStatus':
-                $this->handleDependenciesStatus();
-                break;
-            case 'getInterfaces':
-                $this->getInterfaces();
-                break;
-            case 'getMonitors':
-                $this->getMonitors();
-                break;
-            case 'startMonitor':
-                $this->startMonitor();
-                break;
-            case 'stopMonitor':
-                $this->stopMonitor();
-                break;
-            case 'scanForNetworks':
-                $this->scanForNetworks();
-                break;
-            case 'getMACInfo':
-                $this->getMACInfo();
-                break;
-            case 'togglewps':
-                $this->togglewps();
-                break;
-            case 'getProcesses':
-                $this->getProcesses();
-                break;
-            case 'refreshHistory':
-                $this->refreshHistory();
-                break;
-            case 'viewHistory':
-                $this->viewHistory();
-                break;
-            case 'deleteHistory':
-                $this->deleteHistory();
-                break;
-            case 'downloadHistory':
-                $this->downloadHistory();
-                break;
-        }
-    }
-
-    protected function checkDeps($dependencyName)
-    {
-        return ($this->checkDependency($dependencyName) && ($this->uciGet("wps.module.installed")));
-    }
-
-    protected function getDevice()
-    {
-        return trim(exec("cat /proc/cpuinfo | grep machine | awk -F: '{print $2}'"));
-    }
-
-    protected function checkRunning($processName)
-    {
-        return exec("ps -A | grep {$processName} | grep -v grep") !== '' ? 1 : 0;
-    }
-
-    protected function refreshInfo()
-    {
-        $moduleInfo = @json_decode(file_get_contents("/pineapple/modules/wps/module.info"));
-        $this->response = array('title' => $moduleInfo->title, 'version' => $moduleInfo->version);
-    }
-
-    private function handleDependencies()
-    {
-        if (!$this->checkDeps("reaver")) {
-            if (file_exists('/sd/modules/wps/scripts/dependencies.sh')) {
-                $this->execBackground("bash /sd/modules/wps/scripts/dependencies.sh install ".$this->request->destination);
-                $this->response = array('success' => true);
-            } else {
-                $this->execBackground("bash /pineapple/modules/wps/scripts/dependencies.sh install ".$this->request->destination);
-                $this->response = array('success' => true);
-            }
-        } else {
-            if (file_exists('/sd/modules/wps/scripts/dependencies.sh')) {
-                $this->execBackground("bash /sd/modules/wps/scripts/dependencies.sh remove");
-                $this->response = array('success' => true);
-            } else {
-                $this->execBackground("bash /pineapple/modules/wps/scripts/dependencies.sh remove");
-                $this->response = array('success' => true);
-            }
-        }
-    }
-
-    private function handleDependenciesStatus()
-    {
-        if (!file_exists('/tmp/wps.progress')) {
-            $this->response = array('success' => true);
-        } else {
-            $this->response = array('success' => false);
-        }
-    }
-
-    private function refreshStatus()
-    {
-        if (!file_exists('/tmp/wps.progress')) {
-            if (!$this->checkDeps("iwlist")) {
-                $installed = false;
-                $install = "Not installed";
-                $installLabel = "danger";
-                $processing = false;
-
-                $status = "开始";
-                $statusLabel = "success";
-            } else {
-                $installed = true;
-                $install = "Installed";
-                $installLabel = "success";
-                $processing = false;
-
-                if ($this->checkRunning("reaver") || $this->checkRunning("bully")) {
-                    $status = "Stop";
-                    $statusLabel = "danger";
-                } else {
-                    $status = "开始";
-                    $statusLabel = "success";
-                }
-            }
-        } else {
-            $installed = false;
-            $install = "Installing...";
-            $installLabel = "warning";
-            $processing = true;
-
-            $status = "开始";
-            $statusLabel = "success";
-        }
-
-        $device = $this->getDevice();
-        $sdAvailable = $this->isSDAvailable();
-
-        $this->response = array("device" => $device, "sdAvailable" => $sdAvailable, "status" => $status, "statusLabel" => $statusLabel, "installed" => $installed, "install" => $install, "installLabel" => $installLabel, "processing" => $processing);
-    }
-
-    private function togglewps()
-    {
-        if (!($this->checkRunning("reaver") || $this->checkRunning("bully"))) {
-            $full_cmd = $this->request->command . " &> /pineapple/modules/wps/log/log_".time().".log";
-            $lazy = $this->request->command;
-            shell_exec("echo -e \"{$full_cmd}\" > /tmp/wps.run");
-            shell_exec("echo -e \"{$lazy}\" > /tmp/lazy.read");
-
-            $this->execBackground("/pineapple/modules/wps/scripts/wps.sh start");
-        } else {
-            $this->execBackground("/pineapple/modules/wps/scripts/wps.sh stop");
-        }
-    }
-
-    private function refreshOutput()
-    {
-        if ($this->checkDeps("reaver") && $this->checkDeps("bully")) {
-            if ($this->checkRunning("reaver") || $this->checkRunning("bully")) {
-                $path = "/pineapple/modules/wps/log";
-
-                $latest_ctime = 0;
-                $latest_filename = '';
-
-                $d = dir($path);
-                while (false !== ($entry = $d->read())) {
-                    $filepath = "{$path}/{$entry}";
-                    if (is_file($filepath) && filectime($filepath) > $latest_ctime) {
-                        $latest_ctime = filectime($filepath);
-                        $latest_filename = $entry;
-                    }
-                }
-
-                if ($latest_filename != "") {
-                    $log_date = gmdate("F d Y H:i:s", filemtime("/pineapple/modules/wps/log/".$latest_filename));
-
-                    $cmd = "cat /pineapple/modules/wps/log/".$latest_filename;
-
-                    exec($cmd, $output);
-                    if (!empty($output)) {
-                        $this->response = implode("\n", $output);
-                    } else {
-                        $this->response = "Empty log...";
-                    }
-                }
-            } else {
-                $this->response = "wps is not running...";
-            }
-        } else {
-            $this->response = "wps is not installed...";
-        }
-    }
-
-    private function getInterfaces()
-    {
-        exec("iwconfig 2> /dev/null | grep \"wlan*\" | grep -v \"mon*\" | awk '{print $1}'", $interfaceArray);
-
-        $this->response = array("interfaces" => array_reverse($interfaceArray));
-    }
-
-    private function getMonitors()
-    {
-        exec("iwconfig 2> /dev/null | grep \"mon*\" | awk '{print $1}'", $monitorArray);
-
-        $this->response = array("monitors" => $monitorArray);
-    }
-
-    private function startMonitor()
-    {
-        exec("airmon-ng start ".$this->request->interface);
-    }
-
-    private function stopMonitor()
-    {
-        exec("airmon-ng stop ".$this->request->monitor);
-    }
-
-    private function scanForNetworks()
-    {
-        if ($this->request->duration && $this->request->monitor != "") {
-            exec("killall airodump-ng && rm -rf /tmp/wps-*");
-            $this->execBackground("airodump-ng -a --wps --output-format cap -w /tmp/wps ".$this->request->monitor." &> /dev/null");
-            sleep($this->request->duration);
-            exec("killall airodump-ng");
-            exec("wash -f /tmp/wps-01.cap > /tmp/wps-01.wash");
-        }
-        
-        $apArray;
-        if($this->request->monitor != null){
-            $tempStation = substr($this->request->monitor, 0, -3);
-            exec("airmon-ng stop ".$this->request->monitor);
-            $p = $this->iwlistparse->parseScanDev($tempStation);
-            $apArray = $p[$tempStation];
-            exec("airmon-ng start ".$tempStation);
-        } else {
-            $p = $this->iwlistparse->parseScanDev($this->request->interface);
-            $apArray = $p[$this->request->interface];
-        }
-
-        $returnArray = array();
-        foreach ($apArray as $apData) {
-            $accessPoint = array();
-            $accessPoint['mac'] = $apData["Address"];
-            $accessPoint['ssid'] = $apData["ESSID"];
-            $accessPoint['channel'] = intval($apData["Channel"]);
-
-            $frequencyData = explode(' ', $apData["Frequency"]);
-            $accessPoint['frequency'] = $frequencyData[0];
-
-            $accessPoint['signal'] = $apData["Signal level"];
-            $accessPoint['quality'] = intval($apData["Quality"]);
-
-            if ($apData["Quality"] <= 25) {
-                $accessPoint['qualityLabel'] = "danger";
-            } elseif ($apData["Quality"] <= 50) {
-                $accessPoint['qualityLabel'] = "warning";
-            } elseif ($apData["Quality"] <= 100) {
-                $accessPoint['qualityLabel'] = "success";
-            }
-
-            if (exec("cat /tmp/wps_capture.lock") == $apData["Address"]) {
-                $accessPoint['captureOnSelected'] = 1;
-            } else {
-                $accessPoint['captureOnSelected'] = 0;
-            }
-
-            if ($this->checkRunning("airodump-ng")) {
-                $accessPoint['captureRunning'] = 1;
-            } else {
-                $accessPoint['captureRunning'] = 0;
-            }
-
-            if (exec("cat /tmp/wps_deauth.lock") == $apData["Address"]) {
-                $accessPoint['deauthOnSelected'] = 1;
-            } else {
-                $accessPoint['deauthOnSelected'] = 0;
-            }
-
-            if ($this->checkRunning("aireplay-ng")) {
-                $accessPoint['deauthRunning'] = 1;
-            } else {
-                $accessPoint['deauthRunning'] = 0;
-            }
-
-            if ($apData["Encryption key"] == "on") {
-                $WPA = strstr($apData["IE"], "WPA Version 1");
-                $WPA2 = strstr($apData["IE"], "802.11i/WPA2 Version 1");
-
-                $auth_type = str_replace("\n", " ", $apData["Authentication Suites (1)"]);
-                $auth_type = implode(' ', array_unique(explode(' ', $auth_type)));
-
-                $cipher = $apData["Pairwise Ciphers (2)"] ? $apData["Pairwise Ciphers (2)"] : $apData["Pairwise Ciphers (1)"];
-                $cipher = str_replace("\n", " ", $cipher);
-                $cipher = implode(', ', array_unique(explode(' ', $cipher)));
-
-                if ($WPA2 != "" && $WPA != "") {
-                    $accessPoint['encryption'] = 'Mixed WPA/WPA2';
-                } elseif ($WPA2 != "") {
-                    $accessPoint['encryption'] = 'WPA2';
-                } elseif ($WPA != "") {
-                    $accessPoint['encryption'] = 'WPA';
-                } else {
-                    $accessPoint['encryption'] = 'WEP';
-                }
-
-                $accessPoint['cipher'] = $cipher;
-                $accessPoint['auth'] = $auth_type;
-            } else {
-                $accessPoint['encryption'] = 'None';
-                $accessPoint['cipher'] = '';
-                $accessPoint['auth'] = '';
-            }
-
-            if ($this->request->duration && $this->request->monitor != "") {
-                $accessPoint['wps'] = trim(exec("cat /tmp/wps-01.wash | tail -n +3 | grep ".$accessPoint['mac']." | awk '{ print $4; }'"));
-                $accessPoint['wpsLabel'] = "success";
-                
-            } 
-            
-            if ($accessPoint['wps'] == "") {
-                $accessPoint['wps'] = "No";
-                $accessPoint['wpsLabel'] = "";
-            }
-
-            array_push($returnArray, $accessPoint);
-        }
-
-        exec("rm -rf /tmp/wps-*");
-
-        $this->response = $returnArray;
-    }
-
-    private function getMACInfo()
-    {
-        $content = file_get_contents("https://api.macvendors.com/".$this->request->mac);
-        $this->response = array('title' => $this->request->mac, "output" => $content);
-    }
-
-    private function getProcesses()
-    {
-        $returnArray = array();
-
-        $process = array();
-        if (file_exists("/tmp/wps.run") && ($this->checkRunning("reaver") || $this->checkRunning("bully"))) {
-            $args = $this->parse_args(file_get_contents("/tmp/lazy.read"));
-
-            $process['ssid'] = $args["e"];
-            $process['mac'] = $args["b"];
-            $process['channel'] = $args["c"];
-
-            if ($args["reaver"]) {
-                $process['name'] = "reaver";
-            } elseif ($args["bully"]) {
-                $process['name'] = "bully";
-            }
-
-            array_push($returnArray, $process);
-        }
-
-        $this->response = $returnArray;
-    }
-
-    private function parse_args($args)
-    {
-        if (is_string($args)) {
-            $args = str_replace(array('=', "\'", '\"'), array('= ', '&#39;', '&#34;'), $args);
-            $args = str_getcsv($args, ' ', '"');
-            $tmp = array();
-            foreach ($args as $arg) {
-                if (!empty($arg) && $arg != "&#39;" && $arg != "=" && $arg != " ") {
-                    $tmp[] = str_replace(array('= ', '&#39;', '&#34;'), array('=', "'", '"'), trim($arg));
-                }
-            }
-            $args = $tmp;
-        }
-
-        $out = array();
-        $args_size = count($args);
-        for ($i = 0; $i < $args_size; $i++) {
-            $value = false;
-            if (substr($args[$i], 0, 2) == '--') {
-                $key = rtrim(substr($args[$i], 2), '=');
-                $out[$key] = true;
-            } elseif (substr($args[$i], 0, 1) == '-') {
-                $key = rtrim(substr($args[$i], 1), '=');
-
-                $opt = str_split($key);
-                $opt_size = count($opt);
-                if ($opt_size > 1) {
-                    for ($n=0; $n < $opt_size; $n++) {
-                        $key = $opt[$n];
-                        $out[$key] = true;
-                    }
-                }
-            } else {
-                $value = $args[$i];
-            }
-
-            if (isset($key)) {
-                if (isset($out[$key])) {
-                    if (is_bool($out[$key])) {
-                        $out[$key] = $value;
-                    } else {
-                        $out[$key] = trim($out[$key].' '.$value);
-                    }
-                } else {
-                    $out[$key] = $value;
-                }
-            } elseif ($value) {
-                $out[$value] = true;
-            }
-        }
-        return $out;
-    }
-
-    private function refreshHistory()
-    {
-        $this->streamFunction = function () {
-            $log_list = array_reverse(glob("/pineapple/modules/wps/log/*"));
-
-            echo '[';
-            for ($i=0;$i<count($log_list);$i++) {
-                $info = explode("_", basename($log_list[$i]));
-                $entryDate = gmdate('Y-m-d H-i-s', $info[1]);
-                $entryName = basename($log_list[$i]);
-
-                echo json_encode(array($entryDate, $entryName));
-
-                if ($i!=count($log_list)-1) {
-                    echo ',';
-                }
-            }
-            echo ']';
-        };
-    }
-
-    private function downloadHistory()
-    {
-        $this->response = array("download" => $this->downloadFile("/pineapple/modules/wps/log/".$this->request->file));
-    }
-
-    private function viewHistory()
-    {
-        $log_date = gmdate("F d Y H:i:s", filemtime("/pineapple/modules/wps/log/".$this->request->file));
-        exec("cat /pineapple/modules/wps/log/".$this->request->file, $output);
-
-        if (!empty($output)) {
-            $this->response = array("output" => implode("\n", $output), "date" => $log_date);
-        } else {
-            $this->response = array("output" => "Empty log...", "date" => $log_date);
-        }
-    }
-
-    private function deleteHistory()
-    {
-        exec("rm -rf /pineapple/modules/wps/log/".$this->request->file);
-    }
-}

+ 0 - 648
modules/src/wps/js/module.js

@@ -1,648 +0,0 @@
-registerController('wps_Controller', ['$api', '$scope', '$rootScope', '$interval', '$timeout', function($api, $scope, $rootScope, $interval, $timeout) {
-	$scope.title = "Loading...";
-	$scope.version = "Loading...";
-
-	$scope.refreshInfo = (function() {
-		$api.request({
-			module: 'wps',
-			action: "refreshInfo"
-		}, function(response) {
-			$scope.title = response.title;
-			$scope.version = "v" + response.version;
-		})
-	});
-
-	$scope.refreshInfo();
-
-}]);
-
-registerController('wps_ControlsController', ['$api', '$scope', '$rootScope', '$interval', '$timeout', function($api, $scope, $rootScope, $interval, $timeout) {
-	$scope.status = "Loading...";
-	$scope.statusLabel = "default";
-	$scope.starting = false;
-
-	$scope.install = "Loading...";
-	$scope.installLabel = "default";
-	$scope.processing = false;
-
-	$scope.bootLabelON = "default";
-	$scope.bootLabelOFF = "default";
-
-	$scope.processes = [];
-
-	$scope.device = '';
-	$scope.sdAvailable = false;
-
-	$rootScope.status = {
-		installed: false,
-		refreshHistory: false,
-		refreshOutput: false,
-		refresMonitors: false,
-	};
-
-	$scope.refreshStatus = (function() {
-		$api.request({
-			module: 'wps',
-			action: "refreshStatus"
-		}, function(response) {
-			$scope.status = response.status;
-			$scope.statusLabel = response.statusLabel;
-
-			$rootScope.status.installed = response.installed;
-			$scope.device = response.device;
-			$scope.sdAvailable = response.sdAvailable;
-			if (response.processing) $scope.processing = true;
-			$scope.install = response.install;
-			$scope.installLabel = response.installLabel;
-
-			$scope.bootLabelON = response.bootLabelON;
-			$scope.bootLabelOFF = response.bootLabelOFF;
-		})
-	});
-
-	$scope.togglewps = (function() {
-		if ($scope.status != "Stop")
-			$scope.status = "Starting...";
-		else
-			$scope.status = "Stopping...";
-
-		$scope.statusLabel = "warning";
-		$scope.starting = true;
-
-		$rootScope.status.refreshOutput = false;
-		$rootScope.status.refreshHistory = false;
-
-		$api.request({
-			module: 'wps',
-			action: 'togglewps',
-			command: $rootScope.command
-		}, function(response) {
-			$timeout(function() {
-				$rootScope.status.refreshOutput = true;
-				$rootScope.status.refreshHistory = true;
-
-				$scope.getProcesses();
-
-				$scope.starting = false;
-				$scope.refreshStatus();
-
-			}, 2000);
-		})
-	});
-
-	$scope.handleDependencies = (function(param) {
-		if (!$rootScope.status.installed)
-			$scope.install = "Installing...";
-		else
-			$scope.install = "Removing...";
-
-		$api.request({
-			module: 'wps',
-			action: 'handleDependencies',
-			destination: param
-		}, function(response) {
-			if (response.success === true) {
-				$scope.installLabel = "warning";
-				$scope.processing = true;
-
-				$scope.handleDependenciesInterval = $interval(function() {
-					$api.request({
-						module: 'wps',
-						action: 'handleDependenciesStatus'
-					}, function(response) {
-						if (response.success === true) {
-							$scope.processing = false;
-							$interval.cancel($scope.handleDependenciesInterval);
-							$scope.refreshStatus();
-						}
-					});
-				}, 5000);
-			}
-		});
-	});
-
-	$scope.getProcesses = (function() {
-		$api.request({
-			module: 'wps',
-			action: 'getProcesses'
-		}, function(response) {
-			$scope.processes = response;
-		});
-	});
-
-	$scope.refreshStatus();
-	$scope.getProcesses();
-
-}]);
-
-registerController('wps_ScanController', ['$api', '$scope', '$rootScope', '$timeout', '$interval', '$filter', function($api, $scope, $rootScope, $timeout, $interval, $filter) {
-	$scope.accessPoints = [];
-	$scope.interfaces = [];
-	$scope.monitors = [];
-
-	$scope.scanLabel = "info";
-	$scope.scan = "Scan";
-	$scope.scanning = false;
-
-	$scope.startMonLabel = "default";
-	$scope.startMon = "Start Monitor";
-	$scope.startingMon = false;
-
-	$scope.stopMonLabel = "default";
-	$scope.stopMon = "Stop Monitor";
-	$scope.stoppingMon = false;
-
-	$scope.sortType = 'ssid';
-	$scope.sortReverse = false;
-	$scope.search = '';
-
-	$scope.scanDuration = '15';
-	var mytimeout = null;
-	var counter = 0;
-
-	$scope.clearFilter = (function() {
-		$scope.sortType = 'ssid';
-		$scope.sortReverse = false;
-		$scope.search = '';
-	});
-
-	$scope.getMACInfo = function(param) {
-		$scope.title = "Loading...";
-		$scope.output = "Loading...";
-
-		$api.request({
-			module: 'wps',
-			action: 'getMACInfo',
-			mac: param
-		}, function(response) {
-			$scope.title = response.title;
-			$scope.output = response.output;
-		});
-	};
-
-	$scope.startMonitor = (function() {
-		$scope.startMonLabel = "warning";
-		$scope.startMon = "Starting...";
-		$scope.startingMon = true;
-
-		$api.request({
-			module: 'wps',
-			action: 'startMonitor',
-			interface: $scope.selectedInterface
-		}, function(response) {
-			$scope.startMonLabel = "success";
-			$scope.startMon = "Done";
-
-			$timeout(function() {
-				$scope.getInterfaces();
-				$scope.getMonitors();
-
-				$scope.startMonLabel = "default";
-				$scope.startMon = "Start Monitor";
-				$scope.startingMon = false;
-			}, 2000);
-		});
-	});
-
-	$scope.stopMonitor = (function() {
-		$scope.stopMonLabel = "warning";
-		$scope.stopMon = "Stopping...";
-		$scope.stoppingMon = true;
-
-		$api.request({
-			module: 'wps',
-			action: 'stopMonitor',
-			monitor: $scope.selectedMonitor
-		}, function(response) {
-			$scope.stopMonLabel = "success";
-			$scope.stopMon = "Done";
-
-			$timeout(function() {
-				$scope.getInterfaces();
-				$scope.getMonitors();
-
-				$scope.stopMonLabel = "default";
-				$scope.stopMon = "Stop Monitor";
-				$scope.stoppingMon = false;
-			}, 2000);
-		});
-	});
-
-	$scope.onTimeout = function() {
-		if (counter === 0) {
-			$timeout.cancel(mytimeout);
-			$scope.scan = "Collecting results...";
-			return;
-		}
-		counter--;
-		$scope.scan = "Scanning... " + $filter('date')(new Date(1970, 0, 1).setSeconds(counter), 'mm:ss');
-		mytimeout = $timeout($scope.onTimeout, 1000);
-	};
-
-	$scope.scanForNetworks = (function() {
-		$scope.scanLabel = "warning";
-		$scope.scanning = true;
-
-		if ($scope.selectedMonitor) {
-			counter = $scope.scanDuration;
-			$scope.onTimeout();
-		} else {
-			$scope.scan = "Scanning...";
-		}
-
-		$api.request({
-			module: 'wps',
-			action: 'scanForNetworks',
-			interface: $scope.selectedInterface,
-			duration: $scope.scanDuration,
-			monitor: $scope.selectedMonitor
-		}, function(response) {
-			$scope.scanLabel = "success";
-			$scope.scan = "Done";
-			$scope.accessPoints = response;
-
-			$timeout(function() {
-				$scope.scanLabel = "info";
-				$scope.scan = "Scan";
-				$scope.scanning = false;
-			}, 2000);
-		});
-	});
-
-	$scope.getInterfaces = (function() {
-		$api.request({
-			module: 'wps',
-			action: 'getInterfaces'
-		}, function(response) {
-			$scope.interfaces = response.interfaces;
-			$scope.selectedInterface = $scope.interfaces[0];
-		});
-	});
-
-	$scope.getMonitors = (function() {
-		$rootScope.status.refreshMonitors = false;
-
-		$api.request({
-			module: 'wps',
-			action: 'getMonitors'
-		}, function(response) {
-			$scope.monitors = response.monitors;
-			$scope.selectedMonitor = $scope.monitors[0];
-
-			$rootScope.status.refreshMonitors = true;
-		});
-	});
-
-	$scope.target = (function(ap) {
-		$rootScope.target = ap;
-		$('#Options').collapse('show');
-	});
-
-	$scope.getInterfaces();
-	$scope.getMonitors();
-}]);
-
-registerController('wps_HistoryController', ['$api', '$scope', '$rootScope', function($api, $scope, $rootScope) {
-	$scope.history = [];
-	$scope.historyOutput = 'Loading...';
-	$scope.historyDate = 'Loading...';
-
-	$scope.refreshHistory = (function() {
-		$api.request({
-			module: "wps",
-			action: "refreshHistory"
-		}, function(response) {
-			$scope.history = response;
-		})
-	});
-
-	$scope.viewHistory = (function(param) {
-		$api.request({
-			module: "wps",
-			action: "viewHistory",
-			file: param
-		}, function(response) {
-			$scope.historyOutput = response.output;
-			$scope.historyDate = response.date;
-		})
-	});
-
-	$scope.deleteHistory = (function(param) {
-		$api.request({
-			module: "wps",
-			action: "deleteHistory",
-			file: param
-		}, function(response) {
-			$scope.refreshHistory();
-		})
-	});
-
-	$scope.downloadHistory = (function(param) {
-		$api.request({
-			module: 'wps',
-			action: 'downloadHistory',
-			file: param
-		}, function(response) {
-			if (response.error === undefined) {
-				window.location = '/api/?download=' + response.download;
-			}
-		});
-	});
-
-	$scope.refreshHistory();
-
-	$rootScope.$watch('status.refreshHistory', function(param) {
-		if (param) {
-			$scope.refreshHistory();
-		}
-	});
-
-}]);
-
-registerController('wps_OptionsController', ['$api', '$scope', '$rootScope', function($api, $scope, $rootScope) {
-	$scope.command = "";
-
-	$scope.program = "reaver";
-	$scope.bssid = '';
-	$scope.essid = '';
-	$scope.channel = '';
-	$scope.monitors = [];
-
-	$scope.reaverAdvancedOptions = {
-		option1: {
-			check: false,
-			val: '1'
-		},
-		option2: {
-			check: false,
-			val: '60'
-		},
-		option3: {
-			check: false,
-			val: '100'
-		},
-		option4: {
-			check: false,
-			val: '0'
-		},
-		option5: {
-			check: false,
-			val: '5'
-		},
-		option6: {
-			check: false,
-			val: '0.20'
-		},
-		option7: {
-			check: false,
-			val: '1:10'
-		},
-		option8: {
-			check: false,
-			val: '1'
-		}
-	};
-
-	$scope.bullyAdvancedOptions = {
-		option1: {
-			check: false,
-			val: '7'
-		},
-		option2: {
-			check: false,
-			val: '43'
-		},
-		option3: {
-			check: false,
-			val: '12345'
-		},
-		option4: {
-			check: false,
-			val: '3'
-		},
-		option5: {
-			check: false,
-			val: '2'
-		},
-		option6: {
-			check: false,
-			val: '0,1'
-		},
-		option7: {
-			check: false,
-			val: '5,1'
-		}
-	};
-
-	$scope.reaverOptions = {
-		option1: false,
-		option2: false,
-		option3: false,
-		option4: false,
-		option5: false,
-		option6: false,
-		option7: false,
-		option8: false,
-		option9: false,
-		option10: false,
-		option11: false,
-		option12: false,
-		option13: false,
-		option14: false,
-		option15: false,
-		option16: false,
-		option17: false,
-		option18: false
-	};
-
-	$scope.bullyOptions = {
-		option1: false,
-		option2: false,
-		option3: false,
-		option4: false,
-		option5: false,
-		option6: false,
-		option7: false,
-		option8: false,
-		option9: false,
-		option10: false,
-		option11: false,
-		option12: false,
-		option13: false,
-		option14: false,
-		option15: false
-	};
-
-	$scope.update = (function(param) {
-		if ($scope.program == "reaver")
-			$scope.command = updateProgram() + updateMonitor() + updateReaverOptions() + updateReaverAdvancedOptions() + updateBSSID() + updateESSID() + updateChannel();
-		else if ($scope.program == "bully")
-			$scope.command = updateProgram() + updateMonitor() + updateBullyOptions() + updateBullyAdvancedOptions() + updateBSSID() + updateESSID() + updateChannel();
-		else
-			$scope.command = '';
-
-		$rootScope.command = $scope.command;
-	});
-
-	$rootScope.$watch('target', function(param) {
-		if (param) {
-			$scope.bssid = $rootScope.target.mac;
-			$scope.essid = $rootScope.target.ssid;
-			$scope.channel = $rootScope.target.channel;
-			$scope.update();
-		}
-	});
-
-	$rootScope.$watch('status.refreshMonitors', function(param) {
-		if (param) {
-			$scope.getMonitors();
-		}
-	});
-
-	$scope.getMonitors = (function() {
-		$api.request({
-			module: 'wps',
-			action: 'getMonitors'
-		}, function(response) {
-			$scope.monitors = response.monitors;
-			$scope.selectedMonitor = $scope.monitors[0];
-			$scope.update();
-		});
-	});
-
-	function updateReaverOptions() {
-		var return_value = "";
-
-		angular.forEach($scope.reaverOptions, function(value, key) {
-			if (value != false)
-				return_value += value + " ";
-		});
-
-		return return_value;
-	}
-
-	function updateReaverAdvancedOptions() {
-		var return_value = "";
-
-		angular.forEach($scope.reaverAdvancedOptions, function(value, key) {
-			if (value.check != false)
-				return_value += value.check + " " + value.val + " ";
-		});
-
-		return return_value;
-	}
-
-	function updateBullyOptions() {
-		var return_value = "";
-
-		angular.forEach($scope.bullyOptions, function(value, key) {
-			if (value != false)
-				return_value += value + " ";
-		});
-
-		return return_value;
-	}
-
-	function updateBullyAdvancedOptions() {
-		var return_value = "";
-
-		angular.forEach($scope.bullyAdvancedOptions, function(value, key) {
-			if (value.check != false)
-				return_value += value.check + " " + value.val + " ";
-		});
-
-		return return_value;
-	}
-
-	function updateProgram() {
-		var return_value = "";
-
-		return_value = $scope.program + " ";
-
-		return return_value;
-	}
-
-	function updateMonitor() {
-		var return_value = "";
-
-		if (!angular.isUndefined($scope.selectedMonitor)) {
-			if ($scope.program == "reaver")
-				return_value = "-i " + $scope.selectedMonitor + " ";
-			else if ($scope.program == "bully")
-				return_value = $scope.selectedMonitor + " ";
-		}
-
-		return return_value;
-	}
-
-	function updateBSSID() {
-		var return_value = "";
-
-		if ($scope.bssid != "")
-			return_value = "-b " + $scope.bssid + " ";
-
-		return return_value;
-	}
-
-	function updateESSID() {
-		var return_value = "";
-
-		if ($scope.essid != "")
-			return_value = "-e \"" + $scope.essid + "\" ";
-
-		return return_value;
-	}
-
-	function updateChannel() {
-		var return_value = "";
-
-		if ($scope.channel != "")
-			return_value = "-c " + $scope.channel;
-
-		return return_value;
-	}
-	
-	$scope.update();
-}]);
-
-registerController('wps_OutputController', ['$api', '$scope', '$rootScope', '$interval', function($api, $scope, $rootScope, $interval) {
-	$scope.output = 'Loading...';
-	$scope.filter = '';
-
-	$scope.refreshLabelON = "default";
-	$scope.refreshLabelOFF = "danger";
-
-	$scope.refreshOutput = (function() {
-		$api.request({
-			module: "wps",
-			action: "refreshOutput"
-		}, function(response) {
-			$scope.output = response;
-		})
-	});
-
-	$scope.toggleAutoRefresh = (function() {
-		if ($scope.autoRefreshInterval) {
-			$interval.cancel($scope.autoRefreshInterval);
-			$scope.autoRefreshInterval = null;
-			$scope.refreshLabelON = "default";
-			$scope.refreshLabelOFF = "danger";
-		} else {
-			$scope.refreshLabelON = "success";
-			$scope.refreshLabelOFF = "default";
-
-			$scope.autoRefreshInterval = $interval(function() {
-				$scope.refreshOutput();
-			}, 5000);
-		}
-	});
-
-	$scope.refreshOutput();
-
-	$rootScope.$watch('status.refreshOutput', function(param) {
-		if (param) {
-			$scope.refreshOutput();
-		}
-	});
-
-}]);

+ 0 - 1
modules/src/wps/log/README.txt

@@ -1 +0,0 @@
-日志将保存在这里。

+ 0 - 574
modules/src/wps/module.html

@@ -1,574 +0,0 @@
-<div class="panel panel-default" ng-controller="wps_Controller"><div class="panel-heading"><h4 class="panel-title pull-left">{{title}}</h4><span class="pull-right">{{version}}</span><div class="clearfix"></div></div></div>
-
-<div class="row" ng-controller="wps_ControlsController">
-    <div class="col-md-4">
-        <div class="panel panel-default">
-            <div class="panel-heading">
-				          <h3 class="panel-title">
-                    控制
-                  </h3>
-            </div>
-			<div class="panel-body">
-				<table style="width:100%">
-					<tr>
-						<td style="padding-bottom: .5em;" class="text-muted">依赖</td>
-            <td ng-hide="$root.status.installed" style="text-align:right;padding-bottom: .5em;"><button type="button" style="width: 90px;" class="btn btn-{{installLabel}} btn-xs" data-toggle="modal" data-target="#dependenciesInstallModal" ng-disabled="processing">{{install}}</button></td>
-            <td ng-show="$root.status.installed" style="text-align:right;padding-bottom: .5em;"><button type="button" style="width: 90px;" class="btn btn-{{installLabel}} btn-xs" data-toggle="modal" data-target="#dependenciesRemoveModal" ng-disabled="processing">{{install}}</button></td>
-					</tr>
-          <tr ng-show="$root.status.installed">
-            <td style="padding-bottom: .5em;" class="text-muted">wps</td>
-            <td style="text-align:right;padding-bottom: .5em;"><button type="button" style="width: 90px;" class="btn btn-{{statusLabel}} btn-xs" ng-disabled="starting || $root.command == '' && status != 'Stop'" ng-click="togglewps()">{{status}}</button></td>
-          </tr>
-				</table>
-			</div>
-
-      <div class="modal fade" id="dependenciesInstallModal" tabindex="-1" role="dialog" aria-labelledby="dependenciesModalLabel">
-        <div class="modal-dialog" role="document">
-          <div class="modal-content">
-            <div class="modal-header">
-              <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
-              <h4 class="modal-title" id="dependenciesInstallModalLabel">安装依赖</h4>
-            </div>
-            <div class="modal-body">
-              必须首先安装所有必需的依赖项。这可能需要几分钟时间。<br /><br />
-              请稍候,不要离开或刷新此页面。安装完成后,此页面将自动刷新。
-            </div>
-            <div class="modal-footer">
-              <button type="button" class="btn btn-info" ng-click="handleDependencies('internal')" data-dismiss="modal">内部储存</button>
-              <button type="button" class="btn btn-info" ng-hide="device == 'tetra' || sdAvailable == false" ng-click="handleDependencies('sd')" data-dismiss="modal">外部储存</button>
-            </div>
-          </div>
-        </div>
-      </div>
-
-      <div class="modal fade" id="dependenciesRemoveModal" tabindex="-1" role="dialog" aria-labelledby="dependenciesModalLabel">
-        <div class="modal-dialog" role="document">
-          <div class="modal-content">
-            <div class="modal-header">
-              <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
-              <h4 class="modal-title" id="dependenciesRemoveModalLabel">移除依赖</h4>
-            </div>
-            <div class="modal-body">
-             所有必需的依赖项都将被删除。这可能需要几分钟时间。<br /><br />
-              请稍候,不要离开或刷新此页面。删除完成后,此页面将自动刷新。
-            </div>
-            <div class="modal-footer">
-              <button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
-              <button type="button" class="btn btn-info" ng-click="handleDependencies()" data-dismiss="modal">确认</button>
-            </div>
-          </div>
-        </div>
-      </div>
-
-        </div>
-    </div>
-
-    <div class="col-md-8">
-      <div class="panel panel-default" ng-show="$root.status.installed && processes.length">
-        <div class="panel-heading">
-              <h4 class="panel-title">运行过程</h4>
-        </div>
-        <div style="padding-bottom: 0px;" class="panel-body">
-          <table style="margin-bottom: 0px;" class="table">
-              <thead>
-                <tr>
-                  <th>Process</th>
-                  <th>SSID</th>
-                  <th>MAC</th>
-                  <th>Channel</th>
-              </thead>
-              <tbody>
-                <tr ng-repeat="proc in processes">
-                  <td>{{ proc.name }}</td>
-                  <td>{{ proc.ssid }}</td>
-                  <td>{{ proc.mac }}</td>
-                  <td>{{ proc.channel }}</td>
-                </tr>
-              </tbody>
-          </table>
-        </div>
-      </div>
-    </div>
-
-</div>
-
-<div class="panel panel-default" ng-show="$root.status.installed" ng-controller="wps_OptionsController">
-    <div class="panel-heading pointer" data-toggle="collapse" data-target="#Options">
-        <h4 class="panel-title">Options</h4>
-    </div>
-    <div id="Options" class="panel-collapse collapse">
-	    <div class="panel-body">
-
-          <div class="form-group">
-              <div class="input-group">
-                  <span class="input-group-addon input-sm">Command</span>
-                  <input type="text" class="form-control input-sm" ng-model="command" placeholder="wps 命令">
-              </div>
-          </div>
-
-          <div class="form-group">
-              <div class="input-group">
-                <span class="input-group-addon input-sm">Program</span>
-                <select ng-change="update()" ng-model="program" class="form-control input-sm">
-                  <option value="reaver">reaver</option>
-                  <option value="bully">bully</option>
-                </select>
-              </div>
-          </div>
-
-          <div ng-show="program!='--'" class="form-group">
-            <div class="input-group">
-              <span class="input-group-addon input-sm">Monitor</span>
-              <select ng-change="update()" class="form-control input-sm" ng-disabled="monitors.length == 0" ng-model="selectedMonitor">
-                  <option ng-repeat="monitor in monitors">{{ monitor }}</option>
-              </select>
-            </div>
-          </div>
-
-          <div ng-show="program!='--'" class="form-group">
-              <div class="input-group">
-                  <span class="input-group-addon input-sm">BSSID</span>
-                  <input ng-change="update()" type="text" class="form-control input-sm" ng-model="bssid" placeholder="BSSID">
-              </div>
-          </div>
-
-          <div ng-show="program!='--'" class="form-group">
-              <div class="input-group">
-                  <span class="input-group-addon input-sm">ESSID</span>
-                  <input ng-change="update()" type="text" class="form-control input-sm" ng-model="essid" placeholder="ESSID">
-              </div>
-          </div>
-
-          <div ng-show="program!='--'" class="form-group">
-              <div class="input-group">
-                  <span class="input-group-addon input-sm">Channel</span>
-                  <input ng-change="update()" type="text" class="form-control input-sm" ng-model="channel" placeholder="信道">
-              </div>
-          </div>
-
-          <div ng-show="program=='reaver'" class="panel panel-default">
-              <div class="panel-heading pointer" data-toggle="collapse" data-target="#reaverOptions">Options</div>
-              <div id="reaverOptions" class="panel-collapse collapse">
-                <div class="panel-body">
-
-                  <div class="form-group">
-                      <div class="input-group">
-                        <div class="checkbox"><label><input type="checkbox" ng-change="update()" ng-model="reaverOptions.option1" ng-true-value="'-a'"> Auto detect the best advanced options for the target AP</label></div>
-                        <div class="checkbox"><label><input type="checkbox" ng-change="update()" ng-model="reaverOptions.option2" ng-true-value="'-A'"> Do not associate with the AP (association must be done by another application)</label></div>
-                        <div class="checkbox"><label><input type="checkbox" ng-change="update()" ng-model="reaverOptions.option3" ng-true-value="'-N'"> Do not send NACK messages when out of order packets are received</label></div>
-                        <div class="checkbox"><label><input type="checkbox" ng-change="update()" ng-model="reaverOptions.option4" ng-true-value="'-S'"> Use small DH keys to improve crack speed</label></div>
-                        <div class="checkbox"><label><input type="checkbox" ng-change="update()" ng-model="reaverOptions.option5" ng-true-value="'-L'"> Ignore locked state reported by the target AP</label></div>
-                        <div class="checkbox"><label><input type="checkbox" ng-change="update()" ng-model="reaverOptions.option6" ng-true-value="'-E'"> Terminate each WPS session with an EAP FAIL packet</label></div>
-                        <div class="checkbox"><label><input type="checkbox" ng-change="update()" ng-model="reaverOptions.option7" ng-true-value="'-n'"> Target AP always sends a NACK [Auto]</label></div>
-                        <div class="checkbox"><label><input type="checkbox" ng-change="update()" ng-model="reaverOptions.option8" ng-true-value="'-w'"> Mimic a Windows 7 registrar [False]</label></div>
-                        <div class="checkbox"><label><input type="checkbox" ng-change="update()" ng-model="reaverOptions.option9" ng-true-value="'-X'"> Set exhaustive mode from the beginning of the session [False]</label></div>
-                        <div class="checkbox"><label><input type="checkbox" ng-change="update()" ng-model="reaverOptions.option10" ng-true-value="'-1'"> Set initial array index for the first half of the pin [False]</label></div>
-                        <div class="checkbox"><label><input type="checkbox" ng-change="update()" ng-model="reaverOptions.option11" ng-true-value="'-2'"> Set initial array index for the second half of the pin [False]</label></div>
-                        <div class="checkbox"><label><input type="checkbox" ng-change="update()" ng-model="reaverOptions.option12" ng-true-value="'-P'"> Set into PixieLoop mode (doesn't send M4, and loops through to M3) [False]</label></div>
-                        <div class="checkbox"><label><input type="checkbox" ng-change="update()" ng-model="reaverOptions.option13" ng-true-value="'-H'"> Enables logging of sequence completed PixieHashes</label></div>
-                        <div class="checkbox"><label><input type="checkbox" ng-change="update()" ng-model="reaverOptions.option14" ng-true-value="'-Z'"> Do NOT run reaver to auto retrieve WPA password if pixiewps attack is successful</label></div>
-                        <div class="checkbox"><label><input type="checkbox" ng-change="update()" ng-model="reaverOptions.option15" ng-true-value="'-K'"> Run pixiewps</label></div>
-                        <div class="checkbox"><label><input type="checkbox" ng-change="update()" ng-model="reaverOptions.option16" ng-true-value="'-vv'"> Display non-critical warnings</label></div>
-                        <div class="checkbox"><label><input type="checkbox" ng-change="update()" ng-model="reaverOptions.option17" ng-true-value="'-vvv'"> Display PixieHashes / enable pixiedust modes</label></div>
-                        <div class="checkbox"><label><input type="checkbox" ng-change="update()" ng-model="reaverOptions.option18" ng-true-value="'-q'"> Only display critical messages</label></div>
-                      </div>
-                  </div>
-                </div>
-              </div>
-          </div>
-
-          <div ng-show="program=='reaver'" class="panel panel-default">
-              <div class="panel-heading pointer" data-toggle="collapse" data-target="#reaverAdvancedOptions">Advanced</div>
-              <div id="reaverAdvancedOptions" class="panel-collapse collapse">
-                <div class="panel-body">
-
-                  <div class="form-group">
-                      <div class="input-group">
-                        <span class="input-group-addon input-sm"><input type="checkbox" ng-change="update()" ng-model="reaverAdvancedOptions.option1.check" ng-true-value="'-d'"></span><input type="text" ng-change="update()" ng-model="reaverAdvancedOptions.option1.val" class="form-control input-sm"><span class="input-group-addon input-sm">Set the delay between pin attempts [1]</span>
-                      </div>
-                  </div>
-
-                  <div class="form-group">
-                      <div class="input-group">
-                        <span class="input-group-addon input-sm"><input type="checkbox" ng-change="update()" ng-model="reaverAdvancedOptions.option2.check" ng-true-value="'-l'"></span><input type="text" ng-change="update()" ng-model="reaverAdvancedOptions.option2.val" class="form-control input-sm"><span class="input-group-addon input-sm">Set the time to wait if the AP locks WPS pin attempts [60]</span>
-                      </div>
-                    </div>
-
-                    <div class="form-group">
-                      <div class="input-group">
-                        <span class="input-group-addon input-sm"><input type="checkbox" ng-change="update()" ng-model="reaverAdvancedOptions.option3.check" ng-true-value="'-g'"></span><input type="text" ng-change="update()" ng-model="reaverAdvancedOptions.option3.val" class="form-control input-sm"><span class="input-group-addon input-sm">Quit after num pin attempts</span>
-                      </div>
-                    </div>
-
-                    <div class="form-group">
-                      <div class="input-group">
-                        <span class="input-group-addon input-sm"><input type="checkbox" ng-change="update()" ng-model="reaverAdvancedOptions.option4.check" ng-true-value="'-x'"></span><input type="text" ng-change="update()" ng-model="reaverAdvancedOptions.option4.val" class="form-control input-sm"><span class="input-group-addon input-sm">Set the time to sleep after 10 unexpected failures [0]</span>
-                      </div>
-                    </div>
-
-                    <div class="form-group">
-                      <div class="input-group">
-                        <span class="input-group-addon input-sm"><input type="checkbox" ng-change="update()" ng-model="reaverAdvancedOptions.option5.check" ng-true-value="'-t'"></span><input type="text" ng-change="update()" ng-model="reaverAdvancedOptions.option5.val" class="form-control input-sm"><span class="input-group-addon input-sm">Set the receive timeout period [5]</span>
-                      </div>
-                    </div>
-
-                    <div class="form-group">
-                      <div class="input-group">
-                        <span class="input-group-addon input-sm"><input type="checkbox" ng-change="update()" ng-model="reaverAdvancedOptions.option6.check" ng-true-value="'-T'"></span><input type="text" ng-change="update()" ng-model="reaverAdvancedOptions.option6.val" class="form-control input-sm"><span class="input-group-addon input-sm">Set the M5/M7 timeout period [0.20]</span>
-                      </div>
-                    </div>
-
-                    <div class="form-group">
-                      <div class="input-group">
-                        <span class="input-group-addon input-sm"><input type="checkbox" ng-change="update()" ng-model="reaverAdvancedOptions.option7.check" ng-true-value="'-r'"></span><input type="text" ng-change="update()" ng-model="reaverAdvancedOptions.option7.val" class="form-control input-sm"><span class="input-group-addon input-sm">Sleep for y seconds every x pin attempts</span>
-                      </div>
-                    </div>
-
-                    <div class="form-group">
-                      <div class="input-group">
-                        <span class="input-group-addon input-sm"><input type="checkbox" ng-change="update()" ng-model="reaverAdvancedOptions.option8.check" ng-true-value="'-W'"></span><input type="text" ng-change="update()" ng-model="reaverAdvancedOptions.option8.val" class="form-control"><span class="input-group-addon input-sm">Default Pin Generator by devttys0 team [1] Belkin [2] D-Link</span>
-                      </div>
-                    </div>
-
-                </div>
-              </div>
-          </div>
-
-          <div ng-show="program=='bully'" class="panel panel-default">
-              <div class="panel-heading pointer" data-toggle="collapse" data-target="#bullyOptions">Options</div>
-              <div id="bullyOptions" class="panel-collapse collapse">
-                <div class="panel-body">
-
-                  <div class="form-group">
-                      <div class="input-group">
-                        <div class="checkbox"><label><input type="checkbox" ng-change="update()" ng-model="bullyOptions.option1" ng-true-value="'-B'"> Bruteforce the WPS pin checksum digit</label></div>
-                        <div class="checkbox"><label><input type="checkbox" ng-change="update()" ng-model="bullyOptions.option2" ng-true-value="'-F'"> Force continue in spite of warnings</label></div>
-                        <div class="checkbox"><label><input type="checkbox" ng-change="update()" ng-model="bullyOptions.option3" ng-true-value="'-S'"> Sequential pins (do not randomize)</label></div>
-                        <div class="checkbox"><label><input type="checkbox" ng-change="update()" ng-model="bullyOptions.option4" ng-true-value="'-T'"> Test mode (do not inject any packets)</label></div>
-                        <div class="checkbox"><label><input type="checkbox" ng-change="update()" ng-model="bullyOptions.option5" ng-true-value="'-A'"> Disable ACK check for sent packets</label></div>
-                        <div class="checkbox"><label><input type="checkbox" ng-change="update()" ng-model="bullyOptions.option6" ng-true-value="'-C'"> Skip CRC/FCS validation (performance)</label></div>
-                        <div class="checkbox"><label><input type="checkbox" ng-change="update()" ng-model="bullyOptions.option7" ng-true-value="'-D'"> Detect WPS lockouts unreported by AP</label></div>
-                        <div class="checkbox"><label><input type="checkbox" ng-change="update()" ng-model="bullyOptions.option8" ng-true-value="'-E'"> EAP Failure terminate every exchange</label></div>
-                        <div class="checkbox"><label><input type="checkbox" ng-change="update()" ng-model="bullyOptions.option9" ng-true-value="'-L'"> Ignore WPS locks reported by the AP</label></div>
-                        <div class="checkbox"><label><input type="checkbox" ng-change="update()" ng-model="bullyOptions.option10" ng-true-value="'-M'"> M5/M7 timeouts treated as WSC_NACK's</label></div>
-                        <div class="checkbox"><label><input type="checkbox" ng-change="update()" ng-model="bullyOptions.option11" ng-true-value="'-N'"> Packets don't contain the FCS field</label></div>
-                        <div class="checkbox"><label><input type="checkbox" ng-change="update()" ng-model="bullyOptions.option12" ng-true-value="'-P'"> Use probe request for nonbeaconing AP</label></div>
-                        <div class="checkbox"><label><input type="checkbox" ng-change="update()" ng-model="bullyOptions.option13" ng-true-value="'-R'"> Assume radiotap headers are present</label></div>
-                        <div class="checkbox"><label><input type="checkbox" ng-change="update()" ng-model="bullyOptions.option14" ng-true-value="'-W'"> Masquerade as a Windows 7 registrar</label></div>
-                        <div class="checkbox"><label><input type="checkbox" ng-change="update()" ng-model="bullyOptions.option15" ng-true-value="'-Z'"> Suppress packet throttling algorithm</label></div>
- <div class="checkbox"><label><input type="checkbox" ng-change="update()" ng-model="bullyOptions.option16" ng-true-value="'-d'"> Enable Pixiewps</label></div>
-                      </div>
-                  </div>
-                </div>
-              </div>
-          </div>
-
-          <div ng-show="program=='bully'" class="panel panel-default">
-              <div class="panel-heading pointer" data-toggle="collapse" data-target="#bullyAdvancedOptions">Advanced</div>
-              <div id="bullyAdvancedOptions" class="panel-collapse collapse">
-                <div class="panel-body">
-
-                  <div class="form-group">
-                      <div class="input-group">
-                        <span class="input-group-addon input-sm"><input type="checkbox" ng-change="update()" ng-model="bullyAdvancedOptions.option1.check" ng-true-value="'-i'"></span><input type="text" ng-change="update()" ng-model="bullyAdvancedOptions.option1.val" class="form-control input-sm"><span class="input-group-addon input-sm">Starting pin index (7 or 8 digits) [Auto]</span>
-                      </div>
-                  </div>
-
-                  <div class="form-group">
-                      <div class="input-group">
-                        <span class="input-group-addon input-sm"><input type="checkbox" ng-change="update()" ng-model="bullyAdvancedOptions.option2.check" ng-true-value="'-l'"></span><input type="text" ng-change="update()" ng-model="bullyAdvancedOptions.option2.val" class="form-control input-sm"><span class="input-group-addon input-sm">Seconds to wait if the AP locks WPS [43]</span>
-                      </div>
-                  </div>
-
-                  <div class="form-group">
-                      <div class="input-group">
-                        <span class="input-group-addon input-sm"><input type="checkbox" ng-change="update()" ng-model="bullyAdvancedOptions.option3.check" ng-true-value="'-p'"></span><input type="text" ng-change="update()" ng-model="bullyAdvancedOptions.option3.val" class="form-control input-sm"><span class="input-group-addon input-sm">Starting pin number (7 or 8 digits) [Auto]</span>
-                      </div>
-                  </div>
-
-                  <div class="form-group">
-                      <div class="input-group">
-                        <span class="input-group-addon input-sm"><input type="checkbox" ng-change="update()" ng-model="bullyAdvancedOptions.option4.check" ng-true-value="'-v'"></span><input type="text" ng-change="update()" ng-model="bullyAdvancedOptions.option4.val" class="form-control input-sm"><span class="input-group-addon input-sm">Verbosity level 1-3, 1 is quietest [3]</span>
-                      </div>
-                  </div>
-
-                  <div class="form-group">
-                      <div class="input-group">
-                        <span class="input-group-addon input-sm"><input type="checkbox" ng-change="update()" ng-model="bullyAdvancedOptions.option5.check" ng-true-value="'-r'"></span><input type="text" ng-change="update()" ng-model="bullyAdvancedOptions.option5.val" class="form-control input-sm"><span class="input-group-addon input-sm">Resend packets N times when not acked [2]</span>
-                      </div>
-                  </div>
-
-                  <div class="form-group">
-                      <div class="input-group">
-                        <span class="input-group-addon input-sm"><input type="checkbox" ng-change="update()" ng-model="bullyAdvancedOptions.option6.check" ng-true-value="'-1'"></span><input type="text" ng-change="update()" ng-model="bullyAdvancedOptions.option6.val" class="form-control input-sm"><span class="input-group-addon input-sm">Delay M seconds every Nth nack at M5 [0,1]</span>
-                      </div>
-                  </div>
-
-                  <div class="form-group">
-                      <div class="input-group">
-                        <span class="input-group-addon input-sm"><input type="checkbox" ng-change="update()" ng-model="bullyAdvancedOptions.option7.check" ng-true-value="'-2'"></span><input type="text" ng-change="update()" ng-model="bullyAdvancedOptions.option7.val" class="form-control input-sm"><span class="input-group-addon input-sm">Delay M seconds every Nth nack at M7 [5,1]</span>
-                      </div>
-                  </div>
-
-                </div>
-              </div>
-          </div>
-
-	    </div>
-	</div>
-</div>
-
-<div ng-controller="wps_ScanController">
-
-<div class="panel panel-default" ng-show="$root.status.installed">
-    <div class="panel-heading pointer" data-toggle="collapse" data-target="#Interfaces">
-        <h4 class="panel-title">Interfaces</span></h4>
-    </div>
-    <div id="Interfaces" class="panel-collapse collapse">
-        <div class="panel-body">
-    <form>
-      <div class="form-group">
-        <div class="input-group">
-          <span class="input-group-addon input-sm">Interface</span>
-          <select class="form-control input-sm" ng-disabled="scanning" ng-model="selectedInterface">
-              <option ng-repeat="interface in interfaces">{{ interface }}</option>
-          </select>
-            <span class="input-group-btn">
-                <button class="btn btn-{{startMonLabel}} btn-sm" ng-disabled="scanning || startingMon" ng-click="startMonitor()">{{startMon}}</button>
-            </span>
-        </div>
-      </div>
-      <div class="form-group">
-        <div class="input-group">
-          <span class="input-group-addon input-sm">Monitor</span>
-          <select class="form-control input-sm" ng-disabled="scanning || monitors.length == 0" ng-model="selectedMonitor">
-              <option ng-repeat="monitor in monitors">{{ monitor }}</option>
-          </select>
-          <span class="input-group-btn">
-              <button class="btn btn-{{stopMonLabel}} btn-sm" ng-disabled="scanning || stoppingMon || monitors.length == 0" ng-click="stopMonitor()">{{stopMon}}</button>
-          </span>
-        </div>
-      </div>
-
-    </form>
-  </div>
-</div>
-</div>
-
-<div class="panel panel-default" ng-show="$root.status.installed">
-  <div class="panel-heading pointer" data-toggle="collapse" data-target="#APs">
-        <h4 class="panel-title">Scan Results <span class="badge">{{accessPoints.length}}</span></h4>
-    </div>
-    <div id="APs" class="panel-collapse collapse">
-    <div class="panel-body">
-      <form>
-        <div class="form-group form-inline">
-            <button class="btn btn-{{scanLabel}} btn-sm" ng-disabled="scanning" ng-click="scanForNetworks()">{{scan}}</button>
-
-            <select class="form-control input-sm" ng-model="scanDuration" ng-disabled="scanning">
-              <option value="15">15 Seconds</option>
-              <option value="30">30 Seconds</option>
-              <option value="60">1 Minute</option>
-              <option value="120">2 Minute</option>
-              <option value="300">5 Minutes</option>
-              <option value="600">10 Minutes</option>
-            </select>
-
-            <span ng-show="monitors.length == 0" class="text-danger pull-right" style="padding-top: 5px;">Warning: a monitor interface has to be enabled to display WPS information.</span>
-        </div>
-
-        <div class="form-group">
-          <div class="input-group">
-              <span class="input-group-addon input-sm">Search</span>
-              <input type="text" class="form-control input-sm" placeholder="在扫描结果中搜索" ng-disabled="(accessPoints.length === 0)" ng-model="search">
-              <div class="input-group-btn">
-                <button class="btn btn-default btn-sm" ng-disabled="(accessPoints.length === 0)" ng-click="clearFilter()">清除过滤器</button>
-              </div>
-          </div>
-        </div>
-      </form>
-
-      <div class="table-responsive">
-        <table class="table" ng-hide="(accessPoints.length === 0)">
-          <thead>
-            <tr>
-              <th>
-                <a class="pointer" ng-click="sortType = 'ssid'; sortReverse = !sortReverse">SSID
-                <span ng-show="sortType == 'ssid' && !sortReverse" class="caret pointer"></span>
-                <span ng-show="sortType == 'ssid' && sortReverse" class="dropup"><span class="caret pointer"></span></span>
-                </a>
-              </th>
-              <th>
-                <a class="pointer" ng-click="sortType = 'mac'; sortReverse = !sortReverse">MAC
-                <span ng-show="sortType == 'mac' && !sortReverse" class="caret pointer"></span>
-                <span ng-show="sortType == 'mac' && sortReverse" class="dropup"><span class="caret pointer"></span></span>
-                </a>
-              </th>
-              <th>
-                <a class="pointer" ng-click="sortType = 'encryption'; sortReverse = !sortReverse">Encryption
-                <span ng-show="sortType == 'encryption' && !sortReverse" class="caret pointer"></span>
-                <span ng-show="sortType == 'encryption' && sortReverse" class="dropup"><span class="caret pointer"></span></span>
-                </a>
-              </th>
-              <th>
-                <a class="pointer" ng-click="sortType = 'cipher'; sortReverse = !sortReverse">Cipher
-                <span ng-show="sortType == 'cipher' && !sortReverse" class="caret pointer"></span>
-                <span ng-show="sortType == 'cipher' && sortReverse" class="dropup"><span class="caret pointer"></span></span>
-                </a>
-              </th>
-              <th>
-                <a class="pointer" ng-click="sortType = 'auth'; sortReverse = !sortReverse">Auth
-                <span ng-show="sortType == 'auth' && !sortReverse" class="caret pointer"></span>
-                <span ng-show="sortType == 'auth' && sortReverse" class="dropup"><span class="caret pointer"></span></span>
-                </a>
-              </th>
-              <th>
-                <a class="pointer" ng-click="sortType = 'channel'; sortReverse = !sortReverse">Channel
-                <span ng-show="sortType == 'channel' && !sortReverse" class="caret pointer"></span>
-                <span ng-show="sortType == 'channel' && sortReverse" class="dropup"><span class="caret pointer"></span></span>
-                </a>
-              </th>
-              <th>
-                <a class="pointer" ng-click="sortType = 'frequency'; sortReverse = !sortReverse">Frequency
-                <span ng-show="sortType == 'frequency' && !sortReverse" class="caret pointer"></span>
-                <span ng-show="sortType == 'frequency' && sortReverse" class="dropup"><span class="caret pointer"></span></span>
-                </a>
-              </th>
-              <th>
-                <a class="pointer" ng-click="sortType = 'signal'; sortReverse = !sortReverse">Signal
-                <span ng-show="sortType == 'signal' && !sortReverse" class="caret pointer"></span>
-                <span ng-show="sortType == 'signal' && sortReverse" class="dropup"><span class="caret pointer"></span></span>
-                </a>
-              </th>
-              <th>
-                <a class="pointer" ng-click="sortType = 'quality'; sortReverse = !sortReverse">Quality
-                <span ng-show="sortType == 'quality' && !sortReverse" class="caret pointer"></span>
-                <span ng-show="sortType == 'quality' && sortReverse" class="dropup"><span class="caret pointer"></span></span>
-                </a>
-              </th>
-              <th>
-                <a class="pointer" ng-click="sortType = 'wps'; sortReverse = !sortReverse">WPS
-                <span ng-show="sortType == 'wps' && !sortReverse" class="caret pointer"></span>
-                <span ng-show="sortType == 'wps' && sortReverse" class="dropup"><span class="caret pointer"></span></span>
-                </a>
-              </th>
-            </tr>
-          </thead>
-          <tbody>
-            <tr ng-repeat="(id, accessPoint) in accessPoints | orderBy:sortType:sortReverse | filter:search" ng-click="target(accessPoint)" class="pointer">
-              <td class="autoselect">
-                <span class="text-muted" ng-hide="accessPoint.ssid"><i>Hidden</i></span>
-                {{ accessPoint.ssid }}
-                <hook-button hook="ssid" content="accessPoint.ssid"></hook-button>
-              </td>
-              <td class="autoselect">
-                <button type="button" class="btn btn-default btn-xs" ng-click="getMACInfo(accessPoint.mac)" data-toggle="modal" data-target="#infoModal">{{accessPoint.mac}}</button>
-                <hook-button hook="mac" content="accessPoint.mac"></hook-button>
-              </td>
-              <td>{{ accessPoint.encryption }}</td>
-              <td>{{ accessPoint.cipher }}</td>
-              <td>{{ accessPoint.auth }}</td>
-              <td>{{ accessPoint.channel }}</td>
-              <td>{{ accessPoint.frequency }} Ghz</td>
-              <td>{{ accessPoint.signal }}</td>
-              <td class="{{ accessPoint.qualityLabel }}">{{ accessPoint.quality }}%</td>
-              <td class="{{ accessPoint.wpsLabel }}">{{ accessPoint.wps }}</td>
-            </tr>
-          </tbody>
-        </table>
-      </div>
-
-      <div class="well" ng-show="(accessPoints.length === 0)">No scan results...</div>
-
-    </div>
-
-    <div class="modal fade" id="infoModal" tabindex="-1" role="dialog" aria-labelledby="infoModal">
-      <div class="modal-dialog modal-lg" role="document">
-        <div class="modal-content">
-          <div class="modal-header">
-            <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
-            <h4 class="modal-title" id="infoModalLabel">{{title}}</h4>
-          </div>
-          <div class="modal-body">
-            <pre class="scrollable-pre log-pre">{{output}}</pre>
-          </div>
-          <div class="modal-footer">
-            <button type="button" class="btn btn-info" data-dismiss="modal">关闭</button>
-          </div>
-        </div>
-      </div>
-    </div>
-
-</div>
-</div>
-
-</div>
-
-<div class="panel panel-default" ng-show="$root.status.installed" ng-controller="wps_OutputController">
-	<div class="panel-heading">
-        <h4 class="panel-title pull-left">输出</h4>
-		<div class="pull-right">
-			自动刷新 <div class="btn-group">
-			<button ng-click="toggleAutoRefresh()" class="btn btn-xs btn-{{refreshLabelON}}">开启</button>
-			<button ng-click="toggleAutoRefresh()" class="btn btn-xs btn-{{refreshLabelOFF}}">关闭</button>
-			</div>
-		</div>
-		<div class="clearfix"></div>
-    </div>
-    <div class="panel-body">
-        <button class="btn btn-primary btn-sm pull-right" ng-click="refreshOutput()">刷新日志</button><div class="clearfix"></div>
-		<pre class="scrollable-pre log-pre">{{output}}</pre>
-    </div>
-</div>
-
-<div class="panel panel-default" ng-show="$root.status.installed" ng-controller="wps_HistoryController">
-    <div class="panel-heading pointer" data-toggle="collapse" data-target="#History">
-        <h4 class="panel-title">History <span class="badge">{{history.length}}</span></h4>
-    </div>
-    <div id="History" class="panel-collapse collapse">
-        <div class="panel-body">
-	        <button class="btn btn-primary btn-sm pull-right" ng-click="refreshHistory()">刷新历史</button><div class="clearfix"></div>
-			<div class="table-responsive">
-	            <table class="table table-striped table-bordered table-hover" ng-hide="(history.length == 0)">
-	                <thead>
-	                    <tr>
-	                        <th>日期</th>
-	                        <th>操作</th>
-	                    </tr>
-	                </thead>
-	                <tbody>
-	                    <tr ng-repeat="entry in history" ng-if="entry != ''">
-	                        <td>{{entry[0]}}</td>
-	                        <td>
-								<div class="btn-group">
-									<button type="button" class="btn btn-fixed-length btn-sm btn-default" data-toggle="modal" data-target="#historyModal" ng-click="viewHistory(entry[1])">查看</button>
-									<button type="button" class="btn btn-sm btn-default" ng-click="downloadHistory(entry[1])">下载</button>
-                  <button type="button" class="btn btn-fixed-length btn-sm btn-danger" ng-click="deleteHistory(entry[1])">删除</button>
-								</div>
-							</td>
-	                    </tr>
-	                </tbody>
-	            </table>
-	        </div>
-			<div class="well" ng-show="(history.length === 0)">没有历史...</div>
-        </div>
-    </div>
-
-	<div class="modal fade" id="historyModal" tabindex="-1" role="dialog" aria-labelledby="historyModalLabel">
-	  <div class="modal-dialog modal-lg" role="document">
-	    <div class="modal-content">
-	      <div class="modal-header">
-	        <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
-	        <h4 class="modal-title" id="historyModalLabel">View History - {{historyDate}}</h4>
-	      </div>
-	      <div class="modal-body">
-	      <pre class="scrollable-pre log-pre">{{historyOutput}}</pre>
-	      </div>
-	      <div class="modal-footer">
-	        <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
-	      </div>
-	    </div>
-	  </div>
-	</div>
-
-</div>

+ 0 - 10
modules/src/wps/module.info

@@ -1,10 +0,0 @@
-{
-    "author": "Whistle Master",
-    "description": "WPS brute force attack using Reaver, Bully, and Pixiewps. Edited by m5kro to support new firmwares.",
-    "devices": [
-        "nano",
-        "tetra"
-    ],
-    "title": "wps",
-    "version": "1.9"
-}

+ 0 - 47
modules/src/wps/scripts/dependencies.sh

@@ -1,47 +0,0 @@
-#!/bin/sh
-#2022 - m5kro aka kraken5
-
-[[ -f /tmp/wps.progress ]] && {
-  exit 0
-}
-
-touch /tmp/wps.progress
-
-if [ "$1" = "install" ]; then
-  if [ "$2" = "internal" ]; then
-     opkg update
-     opkg install reaver
-     opkg install bully
-     opkg install pixiewps
-     opkg install libpcap
-     chmod +x /pineapple/modules/wps/scripts/wps.sh
-
-  elif [ "$2" = "sd" ]; then
-     opkg update
-     ln -s /sd/modules/wps /pineapple/modules/
-     opkg -d sd install reaver
-     opkg -d sd install bully
-     opkg -d sd install pixiewps
-     opkg -d sd install libpcap
-     chmod +x /sd/modules/wps/scripts/wps.sh
-
-  fi
-  
-  if [ ! -f /usr/lib/libpcap.so ] && [ -f /usr/lib/libpcap.so.1.3 ]; then
-  	ln -s /usr/lib/libpcap.so /usr/lib/libpcap.so.1.3
-  fi
-
-  touch /etc/config/wps
-  echo "config wps 'module'" > /etc/config/wps
-
-  uci set wps.module.installed=1
-  uci commit wps.module.installed
-
-elif [ "$1" = "remove" ]; then
-    opkg remove reaver
-    opkg remove bully
-    opkg remove pixiewps
-    rm -rf /etc/config/wps
-fi
-
-rm /tmp/wps.progress

+ 0 - 19
modules/src/wps/scripts/wps.sh

@@ -1,19 +0,0 @@
-#!/bin/sh
-#2015 - Whistle Master
-
-
-
-MYTIME=`date +%s`
-MYCMD=`cat /tmp/wps.run`
-
-if [ "$1" = "start" ]; then
-	eval ${MYCMD}
-	rm -rf /tmp/wps.run
-        rm -rf /tmp/lazy.read
-elif [ "$1" = "stop" ]; then
- 	killall -9 reaver
-	killall -9 bully
-
-	rm -rf /tmp/wps.run
-        rm -rf /tmp/lazy.read
-fi