diff --git a/README.md b/README.md index fbc7a3a..01ffa2a 100644 --- a/README.md +++ b/README.md @@ -40,15 +40,6 @@ Once installed, you can connect yourself to the TinyCheck backend by browsing th The backend allows you to edit the configuration of TinyCheck, add extended IOCs and whitelisted elements in order to prevent false positives. Several IOCs are already provided such as few suricata rules, FreeDNS, Name servers, CIDRs known to host malicious servers and so on. -### Questions & Answers - -**Your project seem very cool, does it send data to Kaspersky or any telemetry server?**

-No, at all. You can look to the sources, the only data sent by TinyCheck is an HTTP GET request to a website that you can specify in the config, as well as the watchers URLs. Kaspersky don't - and will not - receive any telemetry from your TinyCheck device.

-**Can you list some hardware which can be used with this project (touch screen, wifi dongle etc.)?**

-Unfortunately, we prefer to not promote any hardware/constructor/website on this page. Do not hesitate to contact us if you want specific references.

-**I'm not very confortable with the concept of "watchers" as the IOCs downloaded are public. Do you plan to develop a server to centralize AMBER/RED IOCs?**

-Yes, if the demand is felt by NGOs (contact us!). Is it possible to develop this kind of thing, allowing you to centralize your IOCs and managing your fleet of TinyCheck instances on a server that you host. The server can also embed better detection rules thanks to the telemetry that it will receive from devices.
- ### Special thanks **Guys who provided some IOCs** diff --git a/app/frontend/package-lock.json b/app/frontend/package-lock.json index e53114f..f893086 100644 --- a/app/frontend/package-lock.json +++ b/app/frontend/package-lock.json @@ -1806,6 +1806,16 @@ "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==", "dev": true }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "optional": true, + "requires": { + "color-convert": "^2.0.1" + } + }, "cacache": { "version": "13.0.1", "resolved": "https://registry.npmjs.org/cacache/-/cacache-13.0.1.tgz", @@ -1832,6 +1842,34 @@ "unique-filename": "^1.1.1" } }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "optional": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "optional": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "optional": true + }, "find-cache-dir": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", @@ -1853,6 +1891,25 @@ "path-exists": "^4.0.0" } }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "optional": true + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "optional": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -1917,6 +1974,16 @@ "minipass": "^3.1.1" } }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "optional": true, + "requires": { + "has-flag": "^4.0.0" + } + }, "terser-webpack-plugin": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.3.8.tgz", @@ -1933,6 +2000,18 @@ "terser": "^4.6.12", "webpack-sources": "^1.4.3" } + }, + "vue-loader-v16": { + "version": "npm:vue-loader@16.1.2", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.1.2.tgz", + "integrity": "sha512-8QTxh+Fd+HB6fiL52iEVLKqE9N1JSlMXLR92Ijm6g8PZrwIxckgpqjPDWRP5TWxdiPaHR+alUWsnu1ShQOwt+Q==", + "dev": true, + "optional": true, + "requires": { + "chalk": "^4.1.0", + "hash-sum": "^2.0.0", + "loader-utils": "^2.0.0" + } } } }, @@ -11307,87 +11386,6 @@ } } }, - "vue-loader-v16": { - "version": "npm:vue-loader@16.1.2", - "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.1.2.tgz", - "integrity": "sha512-8QTxh+Fd+HB6fiL52iEVLKqE9N1JSlMXLR92Ijm6g8PZrwIxckgpqjPDWRP5TWxdiPaHR+alUWsnu1ShQOwt+Q==", - "dev": true, - "optional": true, - "requires": { - "chalk": "^4.1.0", - "hash-sum": "^2.0.0", - "loader-utils": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "optional": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "optional": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "optional": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "optional": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "optional": true - }, - "loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "dev": true, - "optional": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "optional": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, "vue-router": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.4.3.tgz", diff --git a/app/frontend/src/App.vue b/app/frontend/src/App.vue index b8668ba..846a3f8 100644 --- a/app/frontend/src/App.vue +++ b/app/frontend/src/App.vue @@ -55,11 +55,19 @@ this.set_lang(); }) .catch(error => { console.log(error) }); + }, + get_version: function() { + axios.get('/api/update/get-version', { timeout: 60000 }) + .then(response => { + if(response.data.status) window.current_version = response.data.current_version + }) + .catch(error => { console.log(error) }); } }, created: function() { window.config = {} this.get_config(); + this.get_version(); } } diff --git a/app/frontend/src/assets/custom.css b/app/frontend/src/assets/custom.css index 7c11c9c..73cda0e 100644 --- a/app/frontend/src/assets/custom.css +++ b/app/frontend/src/assets/custom.css @@ -683,6 +683,18 @@ ul { opacity: 0.1; } +.update-icon { + background-image: url("data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9JzMwMHB4JyB3aWR0aD0nMzAwcHgnICBmaWxsPSIjZmY4YjAwIiB4bWxuczp4PSJodHRwOi8vbnMuYWRvYmUuY29tL0V4dGVuc2liaWxpdHkvMS4wLyIgeG1sbnM6aT0iaHR0cDovL25zLmFkb2JlLmNvbS9BZG9iZUlsbHVzdHJhdG9yLzEwLjAvIiB4bWxuczpncmFwaD0iaHR0cDovL25zLmFkb2JlLmNvbS9HcmFwaHMvMS4wLyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDEwMCAxMDAiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDEwMCAxMDA7IiB4bWw6c3BhY2U9InByZXNlcnZlIj48c3dpdGNoPjxmb3JlaWduT2JqZWN0IHJlcXVpcmVkRXh0ZW5zaW9ucz0iaHR0cDovL25zLmFkb2JlLmNvbS9BZG9iZUlsbHVzdHJhdG9yLzEwLjAvIiB4PSIwIiB5PSIwIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIj48L2ZvcmVpZ25PYmplY3Q+PGcgaTpleHRyYW5lb3VzPSJzZWxmIj48Zz48cGF0aCBkPSJNNTI3My4xLDI0MDAuMXYtMmMwLTIuOC01LTQtOS43LTRzLTkuNywxLjMtOS43LDR2MmMwLDEuOCwwLjcsMy42LDIsNC45bDUsNC45YzAuMywwLjMsMC40LDAuNiwwLjQsMXY2LjQgICAgIGMwLDAuNCwwLjIsMC43LDAuNiwwLjhsMi45LDAuOWMwLjUsMC4xLDEtMC4yLDEtMC44di03LjJjMC0wLjQsMC4yLTAuNywwLjQtMWw1LjEtNUM1MjcyLjQsMjQwMy43LDUyNzMuMSwyNDAxLjksNTI3My4xLDI0MDAuMXogICAgICBNNTI2My40LDI0MDBjLTQuOCwwLTcuNC0xLjMtNy41LTEuOHYwYzAuMS0wLjUsMi43LTEuOCw3LjUtMS44YzQuOCwwLDcuMywxLjMsNy41LDEuOEM1MjcwLjcsMjM5OC43LDUyNjguMiwyNDAwLDUyNjMuNCwyNDAweiI+PC9wYXRoPjxwYXRoIGQ9Ik01MjY4LjQsMjQxMC4zYy0wLjYsMC0xLDAuNC0xLDFjMCwwLjYsMC40LDEsMSwxaDQuM2MwLjYsMCwxLTAuNCwxLTFjMC0wLjYtMC40LTEtMS0xSDUyNjguNHoiPjwvcGF0aD48cGF0aCBkPSJNNTI3Mi43LDI0MTMuN2gtNC4zYy0wLjYsMC0xLDAuNC0xLDFjMCwwLjYsMC40LDEsMSwxaDQuM2MwLjYsMCwxLTAuNCwxLTFDNTI3My43LDI0MTQuMSw1MjczLjMsMjQxMy43LDUyNzIuNywyNDEzLjd6Ij48L3BhdGg+PHBhdGggZD0iTTUyNzIuNywyNDE3aC00LjNjLTAuNiwwLTEsMC40LTEsMWMwLDAuNiwwLjQsMSwxLDFoNC4zYzAuNiwwLDEtMC40LDEtMUM1MjczLjcsMjQxNy41LDUyNzMuMywyNDE3LDUyNzIuNywyNDE3eiI+PC9wYXRoPjwvZz48cGF0aCBkPSJNNTAsMi41QzIzLjgsMi41LDIuNSwyMy44LDIuNSw1MGMwLDI2LjIsMjEuMyw0Ny41LDQ3LjUsNDcuNVM5Ny41LDc2LjIsOTcuNSw1MEM5Ny41LDIzLjgsNzYuMiwyLjUsNTAsMi41eiBNNDQuNywyNi4zICAgIGMwLTIuOSwyLjQtNS4zLDUuMy01LjNjMi45LDAsNS4zLDIuNCw1LjMsNS4zdjI2LjVjMCwyLjktMi40LDUuMy01LjMsNS4zYy0yLjksMC01LjMtMi40LTUuMy01LjNWMjYuM3ogTTUwLDc4LjcgICAgYy0zLjgsMC02LjktMy4xLTYuOS02LjlzMy4xLTYuOSw2LjktNi45czYuOSwzLjEsNi45LDYuOVM1My44LDc4LjcsNTAsNzguN3oiPjwvcGF0aD48L2c+PC9zd2l0Y2g+PC9zdmc+"); + width: 30px; + height: 30px; + display: block; + margin-right: 10px; + margin-top: 10px; + background-size: cover; + opacity: 0.2; +} + + .off-icon:hover { opacity: 0.3; cursor:pointer; @@ -691,4 +703,21 @@ ul { .quit-icon:hover { opacity: 0.3; cursor:pointer; +} + +.update-icon:hover { + opacity: 0.4; + cursor:pointer; +} + +sup { + top: -2em; + font-size: 12px; + left: -0.2em; + color: #CCC; + font-family: 'Lobster'; +} + +.color-green { + color:#35c435; } \ No newline at end of file diff --git a/app/frontend/src/components/Controls.vue b/app/frontend/src/components/Controls.vue index b0473ee..4f3c549 100644 --- a/app/frontend/src/components/Controls.vue +++ b/app/frontend/src/components/Controls.vue @@ -1,19 +1,22 @@ \ No newline at end of file diff --git a/app/frontend/src/locales/cat.json b/app/frontend/src/locales/cat.json index a21d106..07d182c 100644 --- a/app/frontend/src/locales/cat.json +++ b/app/frontend/src/locales/cat.json @@ -78,5 +78,12 @@ "tap_msg": "Podeu tocar la tecla USB per iniciar una nova captura.", "capture_download": "La descàrrega de la captura començarà ...", "start_capture_btn": "Inicia una altra captura" + }, + "update": { + "tinycheck_needs": "TinyCheck ha d´actualitzar-se a la propera versió", + "please_click": "Feu click al botó de sota per actualitzar", + "the_process": "El procés pot trigar uns minuts, si us plau esperi ...", + "update_finished": "Actualització finalitzada, actualitzant la interfície...", + "update_it": "Actualitzar ara" } } \ No newline at end of file diff --git a/app/frontend/src/locales/en.json b/app/frontend/src/locales/en.json index 9a4097b..b418328 100644 --- a/app/frontend/src/locales/en.json +++ b/app/frontend/src/locales/en.json @@ -78,5 +78,12 @@ "tap_msg": "You can tap the USB key to start a new capture.", "capture_download": "The capture download is going to start...", "start_capture_btn": "Start another capture" + }, + "update": { + "tinycheck_needs": "TinyCheck needs to be updated to the next version", + "please_click": "Please click on the button below to update it.", + "the_process": "The process can take few minutes, please wait...", + "update_finished": "Update finished, let's refresh the interface...", + "update_it": "Update it now" } } \ No newline at end of file diff --git a/app/frontend/src/locales/es.json b/app/frontend/src/locales/es.json index f12ef84..e1519aa 100644 --- a/app/frontend/src/locales/es.json +++ b/app/frontend/src/locales/es.json @@ -78,5 +78,12 @@ "tap_msg": "Puede tocar la llave USB para iniciar una nueva captura", "capture_download": "La descarga de la captura va a comenzar ...", "start_capture_btn": "Iniciar otra captura" + }, + "update": { + "tinycheck_needs": "TinyCheck debe actualizarse a la próxima versión", + "please_click": "Haga click en el botón de abajo para actualizar", + "the_process": "El proceso puede tardar unos minutos, por favor espere ...", + "update_finished": "Actualización finalizada, actualizando la interfaz...", + "update_it": "Actualizar ahora" } } \ No newline at end of file diff --git a/app/frontend/src/locales/fr.json b/app/frontend/src/locales/fr.json index 855ac23..b3326df 100644 --- a/app/frontend/src/locales/fr.json +++ b/app/frontend/src/locales/fr.json @@ -78,5 +78,12 @@ "tap_msg": "Vous pouvez appuyer sur l'animation pour lancer une nouvelle capture.", "capture_download": "Le téléchargement de la capture va se lancer...", "start_capture_btn": "Lancer une nouvelle capture" + }, + "update": { + "tinycheck_needs": "Une nouvelle mise à jour de TinyCheck est disponible", + "please_click": "Cliquez sur le bouton ci-dessous pour le mettre à jour", + "the_process": "La mise à jour peut prendre plusieurs minutes, merci d'attendre...", + "update_finished": "Mise à jour terminée, vous allez être redirigé...", + "update_it": "Mettre TinyCheck à jour" } } \ No newline at end of file diff --git a/app/frontend/src/router/index.js b/app/frontend/src/router/index.js index bcf457d..7e651b5 100644 --- a/app/frontend/src/router/index.js +++ b/app/frontend/src/router/index.js @@ -17,6 +17,12 @@ const routes = [ component: () => import('../views/home.vue'), props: true }, + { + path: '/update', + name: 'update', + component: () => import('../views/update.vue'), + props: true + }, { path: '/wifi-select', name: 'wifi-select', diff --git a/app/frontend/src/views/analysis.vue b/app/frontend/src/views/analysis.vue index c852ed7..a78ba42 100644 --- a/app/frontend/src/views/analysis.vue +++ b/app/frontend/src/views/analysis.vue @@ -25,8 +25,7 @@ export default { question: true, running: false, check_alerts: false, - long_waiting: false, - translation: {} + long_waiting: false } }, props: { diff --git a/app/frontend/src/views/capture.vue b/app/frontend/src/views/capture.vue index 4323d10..637815d 100644 --- a/app/frontend/src/views/capture.vue +++ b/app/frontend/src/views/capture.vue @@ -29,8 +29,7 @@ export default { loading: false, stats_interval: false, chrono_interval: false, - sparklines: false, - translation: {} + sparklines: false } }, props: { diff --git a/app/frontend/src/views/generate-ap.vue b/app/frontend/src/views/generate-ap.vue index a6eebad..09454b4 100644 --- a/app/frontend/src/views/generate-ap.vue +++ b/app/frontend/src/views/generate-ap.vue @@ -55,8 +55,7 @@ export default { interval: false, error: false, reboot_option: window.config.reboot_option, - attempts: 3, - translation: {} + attempts: 3 } }, methods: { diff --git a/app/frontend/src/views/home.vue b/app/frontend/src/views/home.vue index 2e8f1c2..d65b728 100644 --- a/app/frontend/src/views/home.vue +++ b/app/frontend/src/views/home.vue @@ -1,6 +1,6 @@