nano-tetra-modules/wps/module.html

574 lines
36 KiB
HTML

<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">
Controls
</h3>
</div>
<div class="panel-body">
<table style="width:100%">
<tr>
<td style="padding-bottom: .5em;" class="text-muted">Dependencies</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">Install dependencies</h4>
</div>
<div class="modal-body">
All required dependencies have to be installed first. This may take a few minutes.<br /><br />
Please wait, do not leave or refresh this page. Once the install is complete, this page will refresh automatically.
</div>
<div class="modal-footer">
<button type="button" class="btn btn-info" ng-click="handleDependencies('internal')" data-dismiss="modal">Internal</button>
<button type="button" class="btn btn-info" ng-hide="device == 'tetra' || sdAvailable == false" ng-click="handleDependencies('sd')" data-dismiss="modal">SD Card</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">Remove dependencies</h4>
</div>
<div class="modal-body">
All required dependencies will be removed. This may take a few minutes.<br /><br />
Please wait, do not leave or refresh this page. Once the remove is complete, this page will refresh automatically.
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
<button type="button" class="btn btn-info" ng-click="handleDependencies()" data-dismiss="modal">Confirm</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">Running Process</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 command">
</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="Channel">
</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 1'"> [1] Run pixiewps with PKE, PKR, E-Hash1, E-Hash2, E-Nonce and Authkey (Ralink, Broadcom & Realtek)</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>
</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="Search in scan results" 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()">Clear Filter</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">Close</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">Output</h4>
<div class="pull-right">
Auto-refresh <div class="btn-group">
<button ng-click="toggleAutoRefresh()" class="btn btn-xs btn-{{refreshLabelON}}">ON</button>
<button ng-click="toggleAutoRefresh()" class="btn btn-xs btn-{{refreshLabelOFF}}">OFF</button>
</div>
</div>
<div class="clearfix"></div>
</div>
<div class="panel-body">
<button class="btn btn-primary btn-sm pull-right" ng-click="refreshOutput()">Refresh log</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()">Refresh History</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>Date</th>
<th>Action</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])">View</button>
<button type="button" class="btn btn-sm btn-default" ng-click="downloadHistory(entry[1])">Download</button>
<button type="button" class="btn btn-fixed-length btn-sm btn-danger" ng-click="deleteHistory(entry[1])">Delete</button>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<div class="well" ng-show="(history.length === 0)">No history...</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">Close</button>
</div>
</div>
</div>
</div>
</div>