From a93863f8d2a307443ab51ab6ca63e7ccb3f2bfb5 Mon Sep 17 00:00:00 2001 From: tobozo Date: Thu, 12 Oct 2017 16:32:43 +0200 Subject: [PATCH] implemented l10n --- README.md | 5 + esp8266_deauther/data/apscan.html | 30 ++-- esp8266_deauther/data/attack.html | 61 ++++--- esp8266_deauther/data/config.ru | 32 ++++ esp8266_deauther/data/error.html | 15 +- esp8266_deauther/data/index.html | 21 +-- esp8266_deauther/data/info.html | 33 ++-- esp8266_deauther/data/js/apscan.js | 12 +- esp8266_deauther/data/js/attack.js | 18 +- esp8266_deauther/data/js/functions.js | 12 +- esp8266_deauther/data/js/l10n.js | 244 ++++++++++++++++++++++++++ esp8266_deauther/data/js/settings.js | 12 +- esp8266_deauther/data/js/stations.js | 38 ++-- esp8266_deauther/data/l10n/en.json | 182 +++++++++++++++++++ esp8266_deauther/data/l10n/fr.json | 181 +++++++++++++++++++ esp8266_deauther/data/settings.html | 82 ++++++--- esp8266_deauther/data/stations.html | 43 +++-- esp8266_deauther/data/style.css | 13 ++ 18 files changed, 860 insertions(+), 174 deletions(-) create mode 100644 esp8266_deauther/data/config.ru create mode 100644 esp8266_deauther/data/js/l10n.js create mode 100644 esp8266_deauther/data/l10n/en.json create mode 100644 esp8266_deauther/data/l10n/fr.json diff --git a/README.md b/README.md index 63fea28..52992cb 100644 --- a/README.md +++ b/README.md @@ -172,6 +172,11 @@ If no port shows up you may have to reinstall the drivers. **18** Upload! +**19** Install the [ESP8266 Sketh Data uploader](https://github.com/esp8266/arduino-esp8266fs-plugin) plugin, your mileage may vary depending on your version of Arduino IDE. + +**20** Restart Arduino IDE, reopen the project, and from the "tools" menu, choose "ESP8266 Sketch Data Upload". + + **Note:** If you use a 512kb version of the ESP8266, you will need to comment out a part of the mac vendor list in data.h. Otherwise it will use too much memory to fit on 512kb. **Your ESP8266 Deauther is now ready!** diff --git a/esp8266_deauther/data/apscan.html b/esp8266_deauther/data/apscan.html index 091fcc7..8d62632 100644 --- a/esp8266_deauther/data/apscan.html +++ b/esp8266_deauther/data/apscan.html @@ -12,11 +12,11 @@
@@ -25,19 +25,19 @@
-

Scan for Wi-Fi access points

+

{h1}

- scanning... + {a1} - +

- Networks found: 0
- MAC:
+ {p1} 0
+ {p2}

- - + +
@@ -46,7 +46,7 @@

- INFO: You may have to reload the site to see the results. + {p3} {p4}

@@ -57,10 +57,10 @@ github.com/spacehuhn
- - + + diff --git a/esp8266_deauther/data/attack.html b/esp8266_deauther/data/attack.html index 2526045..a41680a 100644 --- a/esp8266_deauther/data/attack.html +++ b/esp8266_deauther/data/attack.html @@ -12,11 +12,11 @@
@@ -25,12 +25,12 @@
-

Attacks

+

{h1}

-

Selected AP(s):

+

{p1}

-

Selected Station(s):

+

{p2}

@@ -39,12 +39,12 @@ s - +


- INFO: You may lose connection when starting the attack.
- Change the channel in the settings to the same of the selected AP to prevent this. + {p3} {p4}
+ {p5}


@@ -53,16 +53,16 @@
- +
- +
- +
@@ -71,7 +71,7 @@
- +
@@ -81,34 +81,34 @@
- +
-

SSIDs: 0/48

+

{p6} 0/48

- - + +
- - + + -

saved

+

{p7}


- Deauth [deauthentication attack]:
- Constantly sends deauthentication and disassociation frames to the selected station(s) and access point(s).
+ {p8}
+ {p9}

- Beacon [beacon flooding]:
- Constantly broadcasts beacon frames to advertise all SSIDs in the list below.
+ {pa}
+ {pb}

- Probe-Request [probe request flooding]:
- Constantly broadcasts probe request frames with all SSIDs in the list below. + {pc}
+ {pd}

- - -
+ + diff --git a/esp8266_deauther/data/config.ru b/esp8266_deauther/data/config.ru new file mode 100644 index 0000000..f310609 --- /dev/null +++ b/esp8266_deauther/data/config.ru @@ -0,0 +1,32 @@ +# +# this is a small ruby webserver for fast UI development +# make sure you have ruby and rack gem +# +# $ sudo gem install rack +# +# once installed, run this: +# +# $ rackup config.ru +# +# and access the given port on localhost +# + + +require "net/http" +require "uri" + +# app root +@root = File.expand_path(File.dirname(__FILE__)) + +run Proc.new { |env| + request = Rack::Request.new(env) + path = Rack::Utils.unescape(env['PATH_INFO']) + index_file = @root + "#{path}/index.html" + if File.exists?(index_file) + # Return the index + [200, {'Content-Type' => 'text/html'}, [File.read(index_file)]] + else + # Pass the request to the directory app + Rack::Directory.new(@root).call(env) + end +} diff --git a/esp8266_deauther/data/error.html b/esp8266_deauther/data/error.html index 54a6d90..17c9d58 100644 --- a/esp8266_deauther/data/error.html +++ b/esp8266_deauther/data/error.html @@ -12,17 +12,17 @@
-

ERROR 404

-


Page not found ¯\_(ツ)_/¯

+

{h1}

+


{p1}

+ \ No newline at end of file diff --git a/esp8266_deauther/data/index.html b/esp8266_deauther/data/index.html index e43903d..28873a5 100644 --- a/esp8266_deauther/data/index.html +++ b/esp8266_deauther/data/index.html @@ -8,29 +8,29 @@ ESP8266 Deauther - +
-

WARNING

+

{h1}

- This software is meant for testing common vulnerabilities in the 802.11 standard.
- Please check the laws for your country before using it.
+ {p1}
+ {p2}

- Use it only on your own networks and devices!
+ {p3}

- You are resposible for everything you do with this software.
- The device will log every attack against any network or device.
+ {p4}
+ {p5}

- Please do not call this project a "jammer", it does not jam any frequencies! + {p6}
- Go to github.com/spacehuhn/esp8266_deauther for more information.
+ {p7} github.com/spacehuhn/esp8266_deauther {p8}


- I've read and understood the notice above + {p9}

+ diff --git a/esp8266_deauther/data/info.html b/esp8266_deauther/data/info.html index bba1ba4..639e24b 100644 --- a/esp8266_deauther/data/info.html +++ b/esp8266_deauther/data/info.html @@ -12,29 +12,29 @@
-

Info

+

{h1}

-

ESP8266 Deauther

+

{h2}

Copyright (c) 2017 Stefan Kremser

- This project is licensed under the MIT License. See the license file for details.
- The source code is available on GitHub.
+ {p1} {a1} {p2}
+ {p3} {a2}.

- Use it only for testing or educational purposes against your own devices!
+ {p4}

- Please do not call this project a "jammer", it does not jam any frequencies! + {p5}

Contributors

@@ -58,21 +58,21 @@

SIMPLE GRID - (C) ZACH COLE 2016

- The MAC address vendor list is based on the Wireshark manufacturer database.
+ {p6}
Source: https://www.wireshark.org/tools/oui-lookup.html
- Wireshark is released under the GNU General Public License version 2
+ {p7}

-

Contact

+

{p8}

Web: spacehuhn.de
GitHub: github.com/spacehuhn
Twitter: @spacehuhn
E-mail: mail@spacehuhn.de

- If you would like to support me with my projects, please consider becoming a patron on patreon.com/spacehuhn.
+ {p9} patreon.com/spacehuhn.

- Or buy the official hardware for this project from DSTIKE on tindie.com/stores/lspoplove. + {pa} tindie.com/stores/lspoplove.

+ \ No newline at end of file diff --git a/esp8266_deauther/data/js/apscan.js b/esp8266_deauther/data/js/apscan.js index e9dd4c5..4762216 100644 --- a/esp8266_deauther/data/js/apscan.js +++ b/esp8266_deauther/data/js/apscan.js @@ -37,7 +37,7 @@ function getResults() { res = JSON.parse(responseText); } catch(e) { // wut - showMessage("JSON Parsing failed :-(", 2500); + showMessage(_("JSON Parsing failed :-("), 2500); return; } // TODO: more sanity checks on res && res.aps @@ -50,7 +50,7 @@ function getResults() { var tr = ''; if (res.aps.length > 0) { - tr += 'ChSSID RSSISelect'; + tr += 'Ch' + _('SSID') + ' ' + _('RSSI') + '' + _('Select') + ''; } for (var i = 0; i < res.aps.length; i++) { @@ -69,10 +69,10 @@ function getResults() { tr += '
' + res.aps[i].r + '
'; if (res.aps[i].se) { - tr += ''; + tr += ''; apMAC.innerHTML = res.aps[i].m; } - else tr += ''; + else tr += ''; tr += ''; } table.innerHTML = tr; @@ -83,7 +83,7 @@ function scan() { toggleScan(false); getResponse("APScan.json", function(responseText) { if (responseText == "true") getResults(); - else showMessage("response error APScan.json"); + else showMessage(_("response error APScan.json")); toggleScan(true); }); } @@ -91,7 +91,7 @@ function scan() { function select(num) { getResponse("APSelect.json?num=" + num, function(responseText) { if (responseText == "true") getResults(); - else showMessage("response error APSelect.json"); + else showMessage(_("response error APSelect.json")); }); } diff --git a/esp8266_deauther/data/js/attack.js b/esp8266_deauther/data/js/attack.js index 74a4c20..07a6f54 100644 --- a/esp8266_deauther/data/js/attack.js +++ b/esp8266_deauther/data/js/attack.js @@ -19,21 +19,21 @@ function getResults() { res = JSON.parse(responseText); } catch(e) { // wut - showMessage("JSON Parsing failed :-(", 2500); + showMessage(_("JSON Parsing failed :-("), 2500); return; } // TODO: more sanity checks on res && res.aps var aps = ""; var clients = ""; - var tr = "AttackStatusStart/Stop"; + var tr = "" + _('Attack') + "" + _('Status') + "" + _('Start/Stop') + ""; for (var i = 0; i < res.aps.length; i++) aps += "
  • " + escapeHTML(res.aps[i]) + "
  • "; for (var i = 0; i < res.clients.length; i++) clients += "
  • " + escapeHTML(res.clients[i]) + "
  • "; selectedAPs.innerHTML = aps; selectedClients.innerHTML = clients; - if(res.randomMode == 1) randomBtn.innerHTML = "Disable Random"; - else randomBtn.innerHTML = "Enable Random"; + if(res.randomMode == 1) randomBtn.innerHTML = _("Disable Random"); + else randomBtn.innerHTML = _("Enable Random"); for (var i = 0; i < res.attacks.length; i++) { if (res.attacks[i].running) tr += ""; @@ -43,7 +43,7 @@ function getResults() { if (res.attacks[i].status == "ready") tr += "" + res.attacks[i].status + ""; else tr += "" + res.attacks[i].status + ""; if (res.attacks[i].running) tr += ""; - else tr += ""; + else tr += ""; tr += ""; } @@ -53,7 +53,7 @@ function getResults() { data = res.ssid; ssidCounter.innerHTML = data.length + "/48"; - var tr = "NameDel."; + var tr = ""+ _('Name') + "" + _('Del.') + ""; for (var i = 0; i < data.length; i++) { tr += ""; tr += "" + escapeHTML(data[i][0]) + ""; @@ -67,7 +67,7 @@ function getResults() { }, function() { clearInterval(resultInterval); - showMessage("error loading attackInfo.json"); + showMessage(_("error loading attackInfo.json")); }); } @@ -75,7 +75,7 @@ function startStop(num) { getResponse("attackStart.json?num=" + num, function(responseText) { getE("status"+num).innerHTML = "loading"; if (responseText == "true") getResults(); - else showMessage("response error attackStart.json"); + else showMessage(_("response error attackStart.json")); }); } @@ -83,7 +83,7 @@ function addSSID() { var _ssidName = ssid.value; if(_ssidName.length > 0){ - if(data.length >= 64) showMessage("SSID list full :(", 2500); + if(data.length >= 64) showMessage(_("SSID list full :("), 2500); else{ saved.innerHTML = ""; getResponse("addSSID.json?ssid=" + _ssidName + "&num="+num.value + "&enc=" + enc.checked, getResults); diff --git a/esp8266_deauther/data/js/functions.js b/esp8266_deauther/data/js/functions.js index f2916c4..a2e73a7 100644 --- a/esp8266_deauther/data/js/functions.js +++ b/esp8266_deauther/data/js/functions.js @@ -33,7 +33,7 @@ function getResponse(adr, callback, timeoutCallback, timeout, method){ if(timeoutCallback === undefined) { timeoutCallback = function(){ - showMessage("Timeout loading "+adr); + showMessage(_("Timeout loading") +" "+adr); }; } if(timeout === undefined) timeout = 8000; @@ -53,10 +53,14 @@ function getResponse(adr, callback, timeoutCallback, timeout, method){ xmlhttp.ontimeout = timeoutCallback; xmlhttp.onabort = function(e) { - showMessage("ABORT "+adr); + showMessage(_("ABORT")+" "+adr); }; xmlhttp.onerror = function(e) { - showMessage("ERROR loading "+adr +" :: "+ this.statusText); + showMessage(_("ERROR loading")+" "+adr +" :: "+ this.statusText); }; -} \ No newline at end of file +} + +function _(l10nid) { + return l10n.jsStrings[l10nid]; +} diff --git a/esp8266_deauther/data/js/l10n.js b/esp8266_deauther/data/js/l10n.js new file mode 100644 index 0000000..b6d557d --- /dev/null +++ b/esp8266_deauther/data/js/l10n.js @@ -0,0 +1,244 @@ +/* localstorage polyfill (supports Safari Private browsing mode /w fallback to cookie */ + +// Refer to https://gist.github.com/remy/350433 +try { + // Test webstorage existence. + if (!window.localStorage || !window.sessionStorage) throw "exception"; + // Test webstorage accessibility - Needed for Safari private browsing. + localStorage.setItem('storage_test', 1); + localStorage.removeItem('storage_test'); +} catch(e) { + (function () { + var Storage = function (type) { + function createCookie(name, value, days) { + var date, expires; + + if (days) { + date = new Date(); + date.setTime(date.getTime()+(days*24*60*60*1000)); + expires = "; expires="+date.toGMTString(); + } else { + expires = ""; + } + document.cookie = name+"="+value+expires+"; path=/"; + } + + function readCookie(name) { + var nameEQ = name + "=", + ca = document.cookie.split(';'), + i, c; + + for (i=0; i < ca.length; i++) { + c = ca[i]; + while (c.charAt(0)==' ') { + c = c.substring(1,c.length); + } + + if (c.indexOf(nameEQ) == 0) { + return c.substring(nameEQ.length,c.length); + } + } + return null; + } + + function setData(data) { + // Convert data into JSON and encode to accommodate for special characters. + data = encodeURIComponent(JSON.stringify(data)); + // Create cookie. + if (type == 'session') { + createCookie(getSessionName(), data, 365); + } else { + createCookie('localStorage', data, 365); + } + } + + function clearData() { + if (type == 'session') { + createCookie(getSessionName(), '', 365); + } else { + createCookie('localStorage', '', 365); + } + } + + function getData() { + // Get cookie data. + var data = type == 'session' ? readCookie(getSessionName()) : readCookie('localStorage'); + // If we have some data decode, parse and return it. + return data ? JSON.parse(decodeURIComponent(data)) : {}; + } + + function getSessionName() { + // If there is no name for this window, set one. + // To ensure it's unquie use the current timestamp. + if(!window.name) { + window.name = new Date().getTime(); + } + return 'sessionStorage' + window.name; + } + + // Initialise if there's already data. + var data = getData(); + + return { + length: 0, + clear: function () { + data = {}; + this.length = 0; + clearData(); + }, + getItem: function (key) { + return data[key] === undefined ? null : data[key]; + }, + key: function (i) { + // not perfect, but works + var ctr = 0; + for (var k in data) { + if (ctr == i) return k; + else ctr++; + } + return null; + }, + removeItem: function (key) { + delete data[key]; + this.length--; + setData(data); + }, + setItem: function (key, value) { + data[key] = value+''; // forces the value to a string + this.length++; + setData(data); + } + }; + }; + + // Replace window.localStorage and window.sessionStorage with out custom + // implementation. + var localStorage = new Storage('local'); + var sessionStorage = new Storage('session'); + window.localStorage = localStorage; + window.sessionStorage = sessionStorage; + // For Safari private browsing need to also set the proto value. + window.localStorage.__proto__ = localStorage; + window.sessionStorage.__proto__ = sessionStorage; + })(); +} + + +// returns "index" or "apscan" or "attack" .... etc +var page = location.href.split("/").slice(-1)[0].split('.')[0]; +if(page=='') page = 'index'; + +var l10n = {}; + +var language = 'en'; + +storage = window.sessionStorage;// window.localStorage is too persistent for what it's worth + +function fetchl10n(url) { + fetch(url) + .then((resp) => resp.json()) // Transform the data into json + .then(function(data) { + l10n = data; + console.log('saving l10n to storage'); + storage.setItem('l10n', JSON.stringify(l10n)); + loadl10n(); + + }).catch(function(error) { + // If there is any error you will catch them here + console.log(error); + alert('l10n FAIL: Could not fetch language file ' + url); + throw('Web UI l10n Failed, check your JSON files'); + }); +} + +function loadl10n() { + + // load language + var nav = document.querySelector('nav') || { innerHTML:'' }; + var container = document.querySelector('.container'); + + var blocks = { + navHTML: nav.innerHTML, + containerHTML: container.innerHTML + } + + if(blocks.navHTML!='') { + for(prop in l10n.navStrings) { + blocks.navHTML = blocks.navHTML.replace('{' + prop + '}', l10n.navStrings[prop]); + } + } + + for(prop in l10n.pageStrings[page]) { + //console.log('parsing ' + prop); + blocks.containerHTML = blocks.containerHTML.replace('{' + prop + '}', l10n.pageStrings[page][prop]); + } + + nav.innerHTML = blocks.navHTML; + container.innerHTML = blocks.containerHTML; + + loadComplete(); + +} + +function loadComplete() { + // l10n load complete, proceed to the page duty + const scriptcontext = document.querySelector('script[data-src]'); + if(scriptcontext) { + scriptcontext.src = scriptcontext.getAttribute('data-src'); + } +} + + +if(storage) { + console.log('storage available'); + if(storageLang = storage.getItem('language')) { + language = storageLang; + console.log('got language from storage: ' + language); + } else { + // first load, save language to storage + console.log('storing language: ' + language); + storage.setItem('language', language); + } + + if(storagel10n = storage.getItem('l10n')) { + console.log('got l10n from storage'); + l10n = JSON.parse(storagel10n); + // best use case: language is session preloaded, no neet to fetch JSON + loadl10n(); + } else { + // fetch it + console.log('will fetch l10n json'); + let url = '/l10n/' + language + '.json'; + fetchl10n(url); + } + +} else { + + // using default language + let url = '/l10n/' + language + '.json'; + fetchl10n(url); + // alert("no cookie or local/session storage"); + +} + + +if(page=="settings") { + // enable language switcher + var flagbuttons = document.querySelectorAll('.flag'); + for(i=0;i 0) tr += 'PktsNameMACAPSelect'; + if (res.clients.length > 0) tr += 'Pkts' + _('Name') + 'MACAP' + _('Select') + ''; for (var i = 0; i < res.clients.length; i++) { @@ -43,13 +43,13 @@ function getResults() { else tr += ''; tr += '' + res.clients[i].p + ''; if(res.clients[i].l >= 0) tr += '' + escapeHTML(res.clients[i].n) + ' '; - else tr += 'set'; + else tr += '' + _('set') + ''; if(res.clients[i].v.length > 1) tr += '' + res.clients[i].v + res.clients[i].m.substring(8, 20) + ''; else tr += '' + res.clients[i].m + ''; tr += '' + escapeHTML(res.clients[i].a) + ''; - if (res.clients[i].s == 1) tr += ''; - else tr += ''; + if (res.clients[i].s == 1) tr += ''; + else tr += ''; tr += ''; } @@ -57,22 +57,22 @@ function getResults() { clientNames.innerHTML = res.nameList.length + "/50"; - var tr = 'MACNameDel.Add'; + var tr = 'MAC' + _('Name') + '' + _('Del.') + '' + _('Add') + ''; for (var i = 0; i < res.nameList.length; i++) { tr += ''; tr += '' + res.nameList[i].m + ''; - tr += '' + escapeHTML(res.nameList[i].n) + ' edit'; + tr += '' + escapeHTML(res.nameList[i].n) + ' '+ _('edit') + ''; tr += ''; - tr += ''; + tr += ''; tr += ''; } nameListTable.innerHTML = tr; }, function() { - showMessage("reconnect and reload the site"); + showMessage(_("reconnect and reload the site")); }, 6000); } @@ -86,49 +86,49 @@ function scan() { getResults(); }, scanTime.value * 1000); } - else showMessage("response error ClientScan.json"); + else showMessage(_("response error ClientScan.json")); }); } function select(num) { getResponse("clientSelect.json?num=" + num, function(responseText) { if (responseText == "true") getResults(); - else showMessage("response error clientSelect.json"); + else showMessage(_("response error clientSelect.json")); }); } function clearNameList() { getResponse("clearNameList.json", function(responseText) { if (responseText == "true") getResults(); - else showMessage("response error clearNameList.json"); + else showMessage(_("response error clearNameList.json")); }); } function addClient(){ getResponse("addClient.json?mac="+cMac.value+"&name="+cName.value, function(responseText) { if (responseText == "true") getResults(); - else showMessage("response error addClient.json"); + else showMessage(_("response error addClient.json")); }); } function setName(id) { - var newName = prompt("Name for " + res.clients[id].m); + var newName = prompt(_("Name for ") + res.clients[id].m); if (newName != null) { getResponse("setName.json?id=" + id + "&name=" + newName, function(responseText) { if(responseText == "true") getResults(); - else showMessage("response error editNameList.json"); + else showMessage(_("response error editNameList.json")); }); } } function editNameList(id) { - var newName = prompt("Name for " + res.nameList[id].m); + var newName = prompt(_("Name for ") + res.nameList[id].m); if (newName != null) { getResponse("editNameList.json?id=" + id + "&name=" + newName, function(responseText) { if(responseText == "true") getResults(); - else showMessage("response error editNameList.json"); + else showMessage(_("response error editNameList.json")); }); } } @@ -136,14 +136,14 @@ function editNameList(id) { function deleteName(id) { getResponse("deleteName.json?num=" + id, function(responseText) { if (responseText == "true") getResults(); - else showMessage("response error deleteName.json"); + else showMessage(_("response error deleteName.json")); }); } function add(id){ getResponse("addClientFromList.json?num=" + id, function(responseText) { if (responseText == "true") getResults(); - else showMessage("response error addClientFromList.json"); + else showMessage(_("response error addClientFromList.json")); }); } diff --git a/esp8266_deauther/data/l10n/en.json b/esp8266_deauther/data/l10n/en.json new file mode 100644 index 0000000..ae3afaf --- /dev/null +++ b/esp8266_deauther/data/l10n/en.json @@ -0,0 +1,182 @@ +{ + "jsStrings": { + "SSID":"SSID", + "RSSI":"RSSI", + "Select":"Select", + "select":"select", + "deselect":"deselect", + "Attack":"Attack", + "Status":"Status", + "Start/Stop":"Start/Stop", + "Disable Random":"Disable Random", + "Enable Random":"Enable Random", + "start":"start", + "Name":"Name", + "Del.":"Del.", + "Add":"Add", + "add":"add", + "edit":"edit", + "set":"set", + "SSID list full :(":"SSID list full :(", + "Error: reset the settings.":"Error: reset the settings.", + "saving...":"saving...", + "saved":"saved", + "Name for ":"Name for ", + "Timeout loading":"Timeout loading", + "ABORT":"ABORT", + "ERROR loading":"ERROR loading", + "JSON Parsing failed :-(":"JSON Parsing failed :-(", + "response error APScan.json":"response error APScan.json", + "response error APSelect.json":"response error APSelect.json", + "error loading attackInfo.json":"error loading attackInfo.json", + "response error attackStart.json":"response error attackStart.json", + "response error settingsSave.json":"response error settingsSave.json", + "response error settingsReset.json":"response error settingsReset.json", + "Error: clear the client list.":"Error: clear the client list.", + "reconnect and reload the site":"reconnect and reload the site", + "response error ClientScan.json":"response error ClientScan.json", + "response error clientSelect.json":"response error clientSelect.json", + "response error clearNameList.json":"response error clearNameList.json", + "response error addClient.json":"response error addClient.json", + "response error editNameList.json":"response error editNameList.json", + "response error deleteName.json":"response error deleteName.json", + "response error addClientFromList.json":"response error addClientFromList.json" + }, + "navStrings": { + "APs":"APs", + "Stations":"Stations", + "Attacks":"Attacks", + "Settings":"Settings", + "Info":"Info" + }, + "pageStrings": { + "apscan": { + + "h1":"Scan for Wi-Fi access points", + "a1":"scanning...", + "button1":"scan", + "p1":"Networks found:", + "p2":"MAC:", + "button2":"deselect all", + "button3":"select all", + "p3":"INFO:", + "p4":"You may have to reload the site to see the results." + }, + "attack": { + "h1":"Attacks", + "p1":"Selected AP(s):", + "button1":"clone", + "p2":"Selected Station(s)", + "button2":"Enable Random", + "p3":"INFO:", + "p4":"You may lose connection when starting the attack.", + "p5":"Change the channel in the settings to the same of the selected AP to prevent this.", + "label1":"SSID", + "placeholder1":"SSID", + "label2":"Number of Clones", + "label3":"Encrypted", + "button3":"add", + "p6":"SSIDs:", + "button4":"clear", + "button5":"random", + "button6":"reset", + "button7":"save", + "p7":"saved", + "p8":"Deauth [deauthentication attack]:", + "p9":"Constantly sends deauthentication and disassociation frames to the selected station(s) and access point(s).", + "pa":"Beacon [beacon flooding]:", + "pb":"Constantly broadcasts beacon frames to advertise all SSIDs in the list below.", + "pc":"Probe-Request [probe request flooding]:", + "pd":"Constantly broadcasts probe request frames with all SSIDs in the list below." + }, + "error": { + "h1":"ERROR 404", + "p1":"Page not found ¯\\_(ツ)_/¯" + }, + "index": { + "h1":"WARNING", + "p1":"This software is meant for testing common vulnerabilities in the 802.11 standard.", + "p2":"Please check the laws for your country before using it.", + "p3":"Use it only on your own networks and devices!", + "p4":"You are resposible for everything you do with this software.", + "p5":"The device will log every attack against any network or device.", + "p6":"Please do not call this project a \"jammer\", it does not jam any frequencies!", + "p7":"Go to", + "p8":"for more information.", + "p9":"I've read and understood the notice above" + }, + "info": { + "h1":"Info", + "h2":"ESP8266 Deauther", + "p1":"This project is licensed under the MIT License. See the", + "a1":"license file", + "p2":"for details.", + "p3":"The source code is available on", + "a2":"GitHub", + "p4":"Use it only for testing or educational purposes against your own devices!", + "p5":"Please do not call this project a \"jammer\", it does not jam any frequencies!", + "p6":"The MAC address vendor list is based on the Wireshark manufacturer database.", + "p7":"Wireshark is released under the GNU General Public License version 2", + "p8":"Contact", + "p9":"If you would like to support me with my projects, please consider becoming a patron on", + "pa":"Or buy the official hardware for this project from DSTIKE on" + }, + "settings": { + "locale":"Change locale", + "english":"English", + "french":"French", + "german":"German", + "spanish":"Spanish", + "italian":"Italian", + "klingon":"Klingon", + "chinese":"Simplified Chinese", + "h1":"Settings", + "h2":"Wi-Fi", + "label01":"SSID", + "label02":"Password", + "label03":"min.8 chars", + "label04":"Hide SSID", + "label05":"be careful with this setting!", + "label06":"Channel", + "label07":"MAC", + "label08":"Random MAC", + "h3":"AP Scan", + "label09":"Scan Hidden APs", + "label10":"Select multiple SSIDs", + "h4":"Station Scan", + "label11":"Default Scan Time", + "h5":"Attack", + "label12":"Timeout (0 = no timeout)", + "label13":"Use LED", + "label14":"LED Pin", + "label15":"1s Beacon Interval (default: 100ms)", + "label16":"Deauth Reason-Code", + "label17":"Packetrate", + "label18":"may cause instability!", + "label19":"Enable Simultaneous Attacks", + "label20":"MAC Change Interval (used for beacons & probes)", + "label21":"Channel Hopping", + "button1":"reset", + "button2":"restart", + "button3":"save" + }, + "stations": { + "h1":"Scan for Wi-Fi Stations", + "label1":"Scan time:", + "button1":"start", + "a1":"scanning...", + "p1":"The access point will be unavailable while scanning and you may have to reconnect!", + "p2":"Stations found:", + "button2":"deselect all", + "button3":"select all", + "p3":"Saved stations:", + "button4":"clear", + "p4":"Add station:", + "label2":"MAC", + "placeholder1":"AA:BB:CC:DD:EE:FF", + "label3":"Name", + "placeholder2":"EXAMPLE", + "button5":"add" + } + } +} diff --git a/esp8266_deauther/data/l10n/fr.json b/esp8266_deauther/data/l10n/fr.json new file mode 100644 index 0000000..6ffab45 --- /dev/null +++ b/esp8266_deauther/data/l10n/fr.json @@ -0,0 +1,181 @@ +{ + "jsStrings": { + "SSID":"SSID", + "RSSI":"RSSI", + "Select":"Sélectionner", + "select":"sélectionner", + "deselect":"déselectionner", + "Attack":"Attaquer", + "Status":"Status", + "Start/Stop":"Démarrer/Arreter", + "Disable Random":"Désactiver Random", + "Enable Random":"Activer Random", + "start":"démarrer", + "Name":"Nom", + "Del.":"Eff.", + "Add":"Ajout", + "add":"ajout", + "edit":"éditer", + "set":"assigner", + "SSID list full :(":"List des SSID remplie :(", + "Error: reset the settings.":"Erreur: effacer les reglages.", + "saving...":"enregistrement...", + "saved":"enregistré", + "Name for ":"Nom pour ", + "Timeout loading":"Délai d'attente dépassé", + "ABORT":"INTERROMPRE", + "ERROR loading":"ERREUR de chargement", + "JSON Parsing failed :-(":"La lecture du JSON a échoué :-(", + "response error APScan.json":"Réponse foireuse de APScan.json", + "response error APSelect.json":"Réponse foireuse de APSelect.json", + "error loading attackInfo.json":"Réponse foireuse de attackInfo.json", + "response error attackStart.json":"Réponse foireuse de attackStart.json", + "response error settingsSave.json":"Réponse foireuse de settingsSave.json", + "response error settingsReset.json":"Réponse foireuse de settingsReset.json", + "Error: clear the client list.":"Erreur: il faut vier la listes des clients.", + "reconnect and reload the site":"Reconnecter le wifi et recharger la page", + "response error ClientScan.json":"Réponse foireuse de ClientScan.json", + "response error clientSelect.json":"Réponse foireuse de clientSelect.json", + "response error clearNameList.json":"Réponse foireuse de clearNameList.json", + "response error addClient.json":"Réponse foireuse de addClient.json", + "response error editNameList.json":"Réponse foireuse de editNameList.json", + "response error deleteName.json":"Réponse foireuse de deleteName.json", + "response error addClientFromList.json":"Réponse foireuse de addClientFromList.json" + }, + "navStrings": { + "APs":"APs", + "Stations":"Stations", + "Attacks":"Attaques", + "Settings":"Reglages", + "Info":"Info" + }, + "pageStrings": { + "apscan": { + + "h1":"Trouver des points d'acces WiFi", + "a1":"scan en cours...", + "button1":"scan", + "p1":"Réseaux trouvés:", + "p2":"MAC:", + "button2":"tout déselectionner", + "button3":"tout sélectionner", + "p3":"INFO:", + "p4":"Recharger la page si l'attente est trop longue." + }, + "attack": { + "h1":"Attaques", + "p1":"Points d'acces sélectionné(s):", + "button1":"cloner", + "p2":"Station(s) sélectionnée(s)", + "button2":"Taper au hasard", + "p3":"INFO:", + "p4":"La connexion peut etre coupée pendant l'attaque.", + "p5":"Il suffit de choisir le meme channel que celui du point d'acces sélectionné dans la page des parametres pour éviter ce souci.", + "label1":"SSID", + "placeholder1":"SSID", + "label2":"Nombre de Clones", + "label3":"Chiffré", + "button3":"ajout", + "p6":"SSIDs:", + "button4":"effacer", + "button5":"au hasard", + "button6":"remise a zéro", + "button7":"enregistrer", + "p7":"enregistré", + "p8":"Désauthentification [deauthentication attack]:", + "p9":"Envoi ininterrompu de paquets de désauthentification et dissociation aux stations et points d'acces sélectionnés.", + "pa":"Balise [beacon flooding]:", + "pb":"Diffusion ininterrompue de trames balises (beacon frames) qui annoncent tous les SSIDs de la liste ci-dessous.", + "pc":"Innondation aux requête de sondage [probe request flooding]:", + "pd":"Diffusion ininterrompue de trames de requêtes de sondage avec tous les SSIDs de la liste ci-dessous." + }, + "error": { + "h1":"ERREUR 404", + "p1":"Page non trouvée ¯\\_(ツ)_/¯" + }, + "index": { + "h1":"ATTENTION", + "p1":"Ce logiciel est prévu pour tester les failles connues du standard 802.11", + "p2":"Consultez les lois locales avant de l'utiliser.", + "p3":"Ne l'utilisez que sur votre réseau domestique et vos appareils personnels !", + "p4":"C'est votre responsabilité que vous engagez en utilisant cet outil.", + "p5":"Toutes les attaques sont enregistrées.", + "p6":"Ce projet ne s'appelle pas un \"brouilleur\" (\"jammer\"), aucune fréquence n'est brouillée !", + "p7":"Voir", + "p8":"pour plus d'informations.", + "p9":"J'ai lu et compris la notice" + }, + "info": { + "h1":"Info", + "h2":"ESP8266 Deauther", + "p1":"Ce projet est sous license MIT License. Voir le ", + "a1":"fichier de licence", + "p2":"pour plus d'infos.", + "p3":"Le code source de ce projet est dispo sur", + "a2":"GitHub", + "p4":"A n'utiliser que pour tester ou s'instruire, mais toujours sur vos propres appareils !", + "p5":"Ce projet ne s'appelle pas un \"brouilleur\" (\"jammer\"), aucune fréquence n'est brouillée !", + "p6":"La liste des constructeurs d'adresses MAC est basée sur celle de Wireshark.", + "p7":"Wireshark est diffusé sous licene GNU General Public License version 2", + "p8":"Contacter", + "p9":"Si vous voulez m'aider dans mes projets, considérez l'option de devenir mon patron sur", + "pa":"Ou offrez-vous le matériel officiel de DSTIKE lié a ce projet sur" + }, + "settings": { + "english":"Anglais", + "french":"Franchouillard", + "german":"Allemand", + "spanish":"Espagnol", + "italian":"Italien", + "klingon":"Klingon", + "chinese":"Chinois Simplifié", + "h1":"Parametres", + "h2":"Wi-Fi", + "label01":"SSID", + "label02":"Mot de passe", + "label03":"min.8 caracteres", + "label04":"Masquer SSID", + "label05":"gaffe avec ce parametre !", + "label06":"Channel", + "label07":"MAC", + "label08":"MAC au hasard", + "h3":"Scan de points d'acces", + "label09":"Scanner les points d'acces cachés", + "label10":"Sélectionne plusieurs SSIDs", + "h4":"Scan de stations", + "label11":"Durée du Scan", + "h5":"Attaque", + "label12":"Délai d'attente (0 = aucun)", + "label13":"Utiliser la LED", + "label14":"LED Pin", + "label15":"Intervalle d'annonce balise (par défault: 100ms)", + "label16":"Code raison de la désauthentification", + "label17":"Taux des paquets", + "label18":"provoque de l'instabilité !", + "label19":"Activer les attaques simultanées", + "label20":"Intervalle changement de MAC (utilisé par balise & sondage)", + "label21":"Danse avec les Channels", + "button1":"remise a zéro", + "button2":"redémarrer", + "button3":"enregistrer" + }, + "stations": { + "h1":"Scanner les Stations Wi-Fi", + "label1":"Durée du Scan:", + "button1":"lancer", + "a1":"scan en cours...", + "p1":"Le point d'acces sera indisponible pendantle scan, et il faudra peut etre reconnecter le WiFi !", + "p2":"Stations trouvées:", + "button2":"tout déselectionner", + "button3":"tout sélectionner", + "p3":"Stations enregistrées:", + "button4":"effacer", + "p4":"Ajouter une station:", + "label2":"MAC", + "placeholder1":"AA:BB:CC:DD:EE:FF", + "label3":"Nom", + "placeholder2":"EXEMPLE", + "button5":"ajouter" + } + } +} diff --git a/esp8266_deauther/data/settings.html b/esp8266_deauther/data/settings.html index 48dd3a2..51b25d0 100644 --- a/esp8266_deauther/data/settings.html +++ b/esp8266_deauther/data/settings.html @@ -12,11 +12,11 @@
    @@ -25,14 +25,37 @@
    -

    Settings

    -

    Wi-Fi

    +

    {h1}

    +

    {locale}

    +
    +
    + +
    +
    + {english} + + {french} + + {chinese} + + +
    +
    + +
    +
    +

    {h2}

    - +
    @@ -41,7 +64,7 @@
    - +
    @@ -50,7 +73,7 @@
    - +
    @@ -59,7 +82,7 @@
    - +
    @@ -68,7 +91,7 @@
    - +
    @@ -77,7 +100,7 @@
    - +
    @@ -87,13 +110,13 @@
    -

    AP Scan

    +

    {h3}

    - +
    @@ -102,7 +125,7 @@
    - +
    @@ -112,13 +135,13 @@
    -

    Station Scan

    +

    {h4}

    - +
    s @@ -128,13 +151,13 @@
    -

    Attack

    +

    {h5}

    - +
    s @@ -143,7 +166,7 @@
    - +
    @@ -152,7 +175,7 @@
    - +
    @@ -161,7 +184,7 @@
    - +
    @@ -170,7 +193,7 @@
    - +
    @@ -179,7 +202,7 @@
    - +
    pkts/s @@ -188,7 +211,7 @@
    - +
    @@ -197,7 +220,7 @@
    - +
    s @@ -208,7 +231,7 @@