5 <meta http-equiv="X-UA-Compatible" content="IE=edge">
6 <meta name="viewport" content="width=device-width, initial-scale=1.0">
8 <script src="js/jquery-3.1.0.min.js"></script>
9 <script src="js/js.storage.min.js"></script>
10 <script src="js/chart.umd.js"></script>
12 <script src="js/kismet.ui.theme.js"></script>
14 <script src="js/jquery-ui.min.js"></script>
15 <script src="js/jquery.ui.touch-punch.min.js"></script>
16 <script src="js/jquery.ajax.binary.js"></script>
17 <script src="js/jquery.jspanel-compiled.min.js"></script>
18 <script src="js/simple-expand.min.js"></script>
19 <script src="js/jqueryui-editable.min.js"></script>
21 <script src="js/datatables.min.js"></script>
22 <script src="js/dataTables.scrollResize.min.js"></script>
23 <script src="js/dataTables.pageResize.js"></script>
25 <script src="js/jquery.sparkline.min.js"></script>
27 <script src="js/raphael.min.js"></script>
28 <script src="js/morris.min.js"></script>
30 <script src="js/jquery.layout-latest.js"></script>
32 <script src="js/pushmenu.js"></script>
34 <script src="js/tooltipster.bundle.min.js"></script>
36 <script src="js/clipboard.min.js"></script>
38 <script src="js/kismet.utils.js"></script>
40 <!-- Core UI elements that get loaded first -->
42 <script src="js/kismet.ui.sidebar.js"></script>
43 <script src="js/kismet.ui.tabpane.js"></script>
44 <script src="js/kismet.ui.settings.js"></script>
46 <script src="js/kismet.ui.js"></script>
48 <script src="js/kismet.ui.base.js"></script>
49 <script src="js/kismet.ui.gadgets.js"></script>
51 <script src="js/jquery.kismet.devicedata.js"></script>
52 <script src="js/jquery.kismet.messagebus.js"></script>
53 <script src="js/jquery.kismet.channeldisplay.js"></script>
54 <script src="js/kismet.ui.alerts.js"></script>
56 <script src="js/kismet.ui.iconbar.js"></script>
57 <script src="js/jquery.kismet.battery.js"></script>
58 <script src="js/jquery.kismet.alert.js"></script>
59 <script src="js/jquery.kismet.gps.js"></script>
60 <script src="js/jquery.kismet.packetrate.js"></script>
62 <link rel="stylesheet" type="text/css" href="css/font-awesome.min.css">
64 <link rel="stylesheet" type="text/css" href="css/jquery.jspanel.min.css" />
65 <link rel="stylesheet" type="text/css" href="css/morris.css" />
67 <link rel="stylesheet" type="text/css" href="css/layout-default-1.4.0.css" />
69 <link rel="stylesheet" type="text/css" href="css/pushmenu.css" />
71 <link rel="stylesheet" type="text/css" href="css/tooltipster.bundle.min.css" />
73 <link rel="stylesheet" type="text/css" href="css/jqueryui-editable.css" />
75 <link rel="stylesheet" type="text/css" href="css/jquery.kismet.messagebus.css" />
76 <link rel="stylesheet" type="text/css" href="css/jquery.kismet.channeldisplay.css" />
77 <link rel="stylesheet" type="text/css" href="css/jquery.kismet.alert.css" />
78 <link rel="stylesheet" type="text/css" href="css/jquery.kismet.battery.css" />
79 <link rel="stylesheet" type="text/css" href="css/jquery.kismet.auth.css" />
80 <link rel="stylesheet" type="text/css" href="css/jquery.kismet.gps.css" />
82 <link rel="stylesheet" type="text/css" href="css/reset.css" />
83 <link rel="stylesheet" type="text/css" href="css/text.css" />
84 <link rel="stylesheet" type="text/css" href="css/layout.css" />
87 <style type="text/css">
88 /* Fix the hover-highlight of the device table */
90 background-color: #dddddd !important;
93 /* Accordion scroll */
101 <script src="dynamic.js"></script>
104 var KISMET_PROXY_PREFIX = "";
106 const queryString = window.location.search;
107 const urlParams = new URLSearchParams(queryString);
109 window['censor_macs'] = urlParams.get('censor_macs')
110 window['censor_location'] = urlParams.get('censor_location')
112 if (urlParams.get('censor')) {
113 window['censor_macs'] = 1
114 window['censor_location'] = 1
119 // Visibility detection from https://developer.mozilla.org/en-US/docs/Web/API/Page_Visibility_API
120 // Set the name of the hidden property and the change event for visibility
121 var hidden, visibilityChange;
122 if (typeof document.hidden !== "undefined") { // Opera 12.10 and Firefox 18 and later support
124 visibilityChange = "visibilitychange";
125 } else if (typeof document.msHidden !== "undefined") {
127 visibilityChange = "msvisibilitychange";
128 } else if (typeof document.webkitHidden !== "undefined") {
129 hidden = "webkitHidden";
130 visibilityChange = "webkitvisibilitychange";
133 function handleVisibilityChange() {
134 if (document[hidden]) {
135 kismet_ui.window_visible = false;
136 orig_title = document.title;
137 document.title = orig_title + " (Paused)"
139 kismet_ui.window_visible = true;
140 document.title = orig_title;
144 // Warn if the browser doesn't support addEventListener or the Page Visibility API
145 if (typeof document.addEventListener === "undefined" || hidden === undefined) {
148 // Handle page visibility change
149 document.addEventListener(visibilityChange, handleVisibilityChange, false);
152 function load_main_ui() {
153 load_dynamics().then((res) => {
154 // Don't let DT make alerts
155 $.fn.dataTableExt.sErrMode = "console";
157 $('#pm_menu').pushmenu({ button : "#pm_open" });
159 // Compute 30% height of window
160 var southsize = $(window).height() * 0.30;
162 // Load the framework
163 var layout = $('#panelcontainer').layout({
164 paneClass: 'kismet-ui-layout-pane',
165 resizerClass: 'kismet-ui-layout-resizer',
166 resizeWithWindowDelay: 250,
171 togglerLength_open: 0,
172 togglerLength_closed: -1,
177 onresize: function() {
178 $('#centerpane-tabs').tabs("refresh");
182 // Default to computed percentage of total window
184 onresize: function() {
185 $('#southpane-tabs').tabs("refresh");
191 // Derive the proxy prefix, if any, from the headers. We can't get this from our
192 // own current request, we have to do a HEAD req and nest everything inside that.
198 const pfx = jqxhr.getResponseHeader('X-Proxy-Dir');
201 KISMET_PROXY_PREFIX = pfx;
204 kismet_ui_base.OpenEventbusWs();
206 kismet_ui_iconbar.AddIconbarItem({
209 createCallback: function(div) {
214 kismet_ui_iconbar.AddIconbarItem({
217 createCallback: function(div) {
222 kismet_ui_iconbar.AddIconbarItem({
225 createCallback: function(div) {
230 kismet_ui_iconbar.AddIconbarItem({
233 createCallback: function(div) {
238 kismet_ui_iconbar.AddIconbarItem({
241 createCallback: function(div) {
246 kismet_ui_iconbar.makeIconbar($('#iconbar'));
248 kismet_ui.HealthCheck();
251 kismet_ui_tabpane.MakeTabPane($('#southpane-tabs'), 'south');
252 kismet_ui_tabpane.MakeTabPane($('#centerpane-tabs'), 'center');
254 // Finalize the sidebar
255 kismet_ui_sidebar.MakeSidebar($('.k-sb-main'));
257 // Try to scrape the server name
258 kismet_ui_base.FetchServerName(function(name) {
259 if (name.length > 0) {
260 $('#topbar_title').html("Kismet - " + name);
261 top.document.title = "Kismet - " + name;
266 }); // always head fetch
271 // jquery onload complete
273 // Set a global timeout
277 withCredentials: true
282 kismet_ui_base.FirstLoginCheck(function() {
292 box-sizing: border-box;
293 height: calc(100% - 30px);
294 padding: 0.5em 0.5em 1.5em 0.5em;
295 border-radius: 0.5em;
296 xbackground-color: #f9f9f9;
303 <div id="mainholder">
304 <div id="pm_menu" class="pm_hide pm_initial kismet_sidebar">
305 <div class="k-sb-header">
309 <div class="k-sb-main">
313 <div id="panelcontainer">
315 <div class="ui-layout-north">
317 <i id="pm_open" class="fa fa-bars k-sb-hamburger"></i>
318 <div id="topbar_title">Kismet</div>
319 <div class="topright_holder" id="iconbar"></div>
324 <div class="ui-layout-east">East</div>
326 <div class="ui-layout-west">West</div>
329 <div class="ui-layout-center" id="main_center">
330 <div id="centerpane-tabs" class="tabs-min"></div>
332 <div id="resize_wrapper">
333 <table id="devices" class="stripe hover nowrap" cell-spacing="0" width="100%"></table>
336 <!-- Must be named foo_status
337 <div id="devices_status" style="padding-bottom: 10px;"></div>
341 <div class="ui-layout-south">
342 <div id="southpane-tabs" class="tabs-min"></div>
348 <p>Powered by many OSS components, see the <a href="credit.html" target="_new">credits page</a>