From 836c5c5d1c3bbe5b4a42237a45575961f8cbd2b6 Mon Sep 17 00:00:00 2001 From: TobiZog Date: Wed, 20 Nov 2024 19:20:22 +0100 Subject: [PATCH] Minor bugfixes, new logo --- backend/data/exercises.json | 30 +- backend/images/brand/logo.png | Bin 0 -> 61020 bytes backend/server.ts | 2 +- electron-builder.json | 11 +- package-lock.json | 395 +++--------------- package.json | 9 +- public/logo-small.png | Bin 0 -> 7950 bytes public/logo.png | Bin 5344 -> 0 bytes public/logo.svg | 79 ++++ src/components/navigation/companyFooter.vue | 12 +- .../navigation/navigationPrependItems.vue | 2 +- src/scripts/pdfScripts.ts | 8 +- src/stores/search.store.ts | 2 +- 13 files changed, 179 insertions(+), 371 deletions(-) create mode 100644 backend/images/brand/logo.png create mode 100644 public/logo-small.png delete mode 100644 public/logo.png create mode 100644 public/logo.svg diff --git a/backend/data/exercises.json b/backend/data/exercises.json index 0cb0f30..e8e2acc 100644 --- a/backend/data/exercises.json +++ b/backend/data/exercises.json @@ -4,26 +4,28 @@ "nameDe": "Den Shop kennenlernen", "nameEn": "Getting to know the shop", "groupNr": 0, + "descriptionDe": "Vor einem Angriff ist es wichtig zu verstehen, wie die Webseite aufgebaut ist. Wie sind die URLs strukturiert? Wo befinden sich Eingabefelder welche im Backend eine SQL Abfrage stellen?", + "descriptionEn": "todo", "exercises": [ { "nameDe": "Registrieren", "nameEn": "Register", "exerciseNr": 1, - "descriptionDe": "Erstelle einen neuen Account im Online Shop", + "descriptionDe": "Wir richten uns einen gewöhnlichen Account auf der Plattform ein. Navigiere hierzu auf die Account-Seite und registriere dich.", "descriptionEn": "Create a new account in the online shop" }, { "nameDe": "Profil vervollständigen", "nameEn": "Complete profile", "exerciseNr": 2, - "descriptionDe": "Suche dir ein Event deiner Wahl und kaufe dafür ein Ticket", + "descriptionDe": "Bestellungen sind erst möglich, wenn das Account-Profil vervollständigt ist. Logge dich ein, navigiere zu den Account-Einstellungen, fülle den Namen aus und füge je eine Adresse und Bezahlart hinzu. Speichere alles zum Schluss ab.", "descriptionEn": "Search for an event of choice and buy a ticket for" }, { "nameDe": "Ein Ticket kaufen", "nameEn": "Buy a ticket", "exerciseNr": 3, - "descriptionDe": "Suche dir ein Event deiner Wahl und kaufe dafür ein Ticket", + "descriptionDe": "Wir führen nun einen Bestellvorgang durch. Wähle hierzu ein Konzert deiner Wahl und lege Tickets in den Warenkorb. Öffne diesen und schließe die Bestellung ab. Beachte die Struktur der URL wenn du ein Konzert buchen willst. Sieh dir ruhig 2-3 Buchungsseiten an, wie sich die URL jeweils verändert.", "descriptionEn": "Search for an event of choice and buy a ticket for" } ] @@ -32,21 +34,21 @@ "nameDe": "Broken Access Control", "nameEn": "Broken Access Control", "groupNr": 1, - "descriptionDe": "Eine Webseite beinhaltet oft öffentlich einsehbare und einige Seiten, die nur mit passenden Berechtigungen erreicht werden dürfen, z.B. ein Admin-Panel oder einen Account-Bereich. Jede Seite ist über einen Suffix (z.B. '/concerts') erreichbar. Der Zugriff wird oft über Cookies oder eine Authentifizierung an einem Backend-Server geregelt. Bei Broken Access Control ist dieser Sicherheits-Mechanismus nicht oder fehlerhaft implementiert. Somit lassen sich Seiten unberechtigterweise über die URL erreichen.", + "descriptionDe": "Eine Webseite beinhaltet öffentlich einsehbare und einige geschützte Seiten. Letztere sind nur mit passenden Berechtigungen erreichbar. Beispiele hierfür sind ein Admin-Panel oder der persönliche Warenkorb. Der Zugriff wird oft über Cookies oder eine Authentifizierung an einem Backend-Server geregelt. Bei Broken Access Control ist dieser Sicherheits-Mechanismus nicht oder fehlerhaft implementiert. Somit lassen sich Seiten unberechtigterweise über die URL erreichen.", "descriptionEn": "todo", "exercises": [ { "nameDe": "Hilfe-Seite aufrufen", "nameEn": "Access Help Page", "exerciseNr": 1, - "descriptionDe": "Manipuliere die URL so, dass du die Hilfe-Seite erreichen kannst", + "descriptionDe": "Die Hilfe-Seite erlaubt dir einen Einblick auf den Bearbeitungszustand der Aufgaben. Sie ist dementsprechend nicht abgesichert, aber auch (noch) nicht in der Titel-Leiste als Button erreichbar. Erweitere die URL in der Adresszeile so, dass du auf die Hilfeseite gelangst.", "descriptionEn": "Manipulate the URL and access the help page" }, { "nameDe": "Das versteckte Konzert buchen", "nameEn": "Book the hidden concert", "exerciseNr": 2, - "descriptionDe": "Manipuliere die URL so, dass du das ausgebuchte Konzert aufrufen kannst und buche ein Ticket dafür", + "descriptionDe": "Die Band >>Arctic Monkeys<< will auf ihrer >>European Tour<< drei Konzerte spielen. Im Shop finden sich allerdings nur zwei Einträge. Zwischen den beiden Tourdaten soll eine Show in der Lanxess Arena in Köln stattfinden, der Datensatz hierfür ist bereits angelegt, jedoch nicht freigeschaltet. Besuche die Seite der Band. Sieh dir den Zeitraum zwischen beiden Konzerten an, in denen das versteckte Event liegen könnte. Öffne eine Buchungsseite eines anderen Konzertes und ändere die URL so ab, dass du das versteckte Konzert buchen kannst. Reserviere dir mindestens ein Ticket und schließe den Bestellprozess ab.", "descriptionEn": "Manipulate the URL and access the sold out concert and buy a ticket" } ] @@ -55,35 +57,35 @@ "nameDe": "SQL Injections", "nameEn": "SQL Injections", "groupNr": 2, - "descriptionDe": "Eine Datenbank arbeitet mit SQL Befehlen um Datensätze anzulegen, abzurufen, zu verändern und löschen. Ein Server wird über API-Schnittstellen angesprochen, führt die Befehle in der Datenbank aus und liefert das Ergebnis. Der Client darf keinen direkten Zugriff auf die Datenbank haben. Bei SQL Injections wird versucht über die API-Schnittstellen direkte SQL Befehle auszuführen.", + "descriptionDe": "Eine Datenbank arbeitet mit SQL Befehlen um Datensätze anzulegen, abzurufen, zu verändern und löschen. Ein Server wird über API-Schnittstellen angesprochen, führt die Befehle in der Datenbank aus und liefert das Ergebnis zurück. Der Client darf keinen direkten Zugriff auf die Datenbank haben. Bei SQL Injections wird versucht, diesen Sicherheitsmechanismus zu umgehen und über die API-Schnittstellen direkte SQL Befehle auszuführen.", "descriptionEn": "todo", "exercises": [ { "nameDe": "Alle Accounts ausspähen", "nameEn": "Get all accounts", "exerciseNr": 1, - "descriptionDe": "Ließ alle Konten aus der Tabelle >>Accounts<< aus. Nutze hierfür das Suchfeld.", + "descriptionDe": "Wir versuchen nun die Datenbank im Hintergrund anzugreifen. Gehe zur globalen Suchseite. Öffne mit der Tastenkombination >>Strg + D<< die >>Developer Tools<<. Klicke auf den Reiter >>Network<<. Hier siehst du, wie das Frontend mit dem Server kommuniziert. Schreibe nun eine SQL-Injection, welche den Suchbegriff ignoriert und dir stattdessen alle Datensätze der Tabelle >>Accounts<< zurück liefert. Führe den Angriff über das Suchfeld aus. Sieh dir die Rückmeldung des Servers an, indem du im >>Network<<-Tab auf die zurück gegebenen Objekte klickst (z.B. >>locations<<).", "descriptionEn": "Execute an SQL-Injection on the Search page to get all datasets from >>Accounts<< table." }, { "nameDe": "Alle Berechtigungsgruppen ausspähen", - "nameEn": "Get alls account roles", + "nameEn": "Get all account roles", "exerciseNr": 2, - "descriptionDe": "Ließ alle Berechtigungsgruppen aus der Tabelle >>AccountRoles<< aus.", + "descriptionDe": "Wir sehen nun alle Accounts. Jeder hat eine Berechtigungs-ID (accountRoleId) mit der Berechtigungen wie der Zugriff aufs Admin-Panel geregelt werden. Wir wissen aber nicht, was die ID's bedeuten. Schreibe darum eine SQL-Injection, welche den Suchbegriff ignoriert und dir stattdessen alle Datensätze der Tabelle >>AccountRoles<< zurück liefert. Führe den Angriff über das Suchfeld aus. Beobachte die Rückmeldung des Servers über den >>Network<<-Tab.", "descriptionEn": "Execute an SQL-Injection on the Search page to get all datasets from >>AccountRoles<< table." }, { "nameDe": "Eigene Berechtigungen erhöhen", "nameEn": "Upgrade your privileges", "exerciseNr": 3, - "descriptionDe": "Erhöhe deine eigene Berechtigung zu >>Admin<<.", + "descriptionDe": "Jetzt bearbeiten wir unseren eigenen Account. Schreibe hierfür einen >>UPDATE<<-SQL-Befehl, welcher die >>accountRoleId<< auf das Niveau eines >>Admin<< erhöht für deinen Account-Namen.", "descriptionEn": "Change the privileges of your account" }, { "nameDe": "Einen fremden Account übernehmen", "nameEn": "Capture another account", "exerciseNr": 4, - "descriptionDe": "Wir infiltrieren nun einen Account. Suche dir dafür aus der Liste der in Aufgabe 2.1 erhaltenen einen Account heraus, welcher die Rolle >>Super-Admin<< inne hat. Nur damit lässt sich die Dateiverwaltung welche wir später brauchen öffnen. Hast du den Account-Namen gefunden, gehe ins Login-Menü (logge dich aus, falls du noch angemeldet bist). Führe nun einen SQL-Injektion durch um diesen Account zu übernehmen.", + "descriptionDe": "Statt unsere eigenen Berechtigungen zu erhöhen, können wir auch einen Account übernehmen, welcher bereits ein >>Super-Admin<< ist. Suche dir dafür aus der Liste der in Aufgabe 2.1 erhaltenen Accounts einen aus, welcher die Rolle >>Super-Admin<< inne hat. Nur damit lässt sich die Dateiverwaltung öffnen, welche wir später brauchen. Hast du den Account-Namen gefunden, gehe ins Login-Menü (logge dich aus, falls du noch angemeldet bist). Führe nun einen SQL-Injektion durch um diesen Account zu übernehmen.", "descriptionEn": "todo" }, { @@ -99,7 +101,7 @@ "nameDe": "Cross-Site Scripting (XSS)", "nameEn": "Cross-Site Scripting (XSS)", "groupNr": 3, - "descriptionDe": "HTML und CSS sind für die Struktur und die Gestaltung einer Webseite verantwortlich. Um jedoch Programmcode für dynamische Inhalte auszuführen wird die Programmiersprache JavaScript verwendet, welche Programmcode direkt im Browser ausführen kann. Diese Scripts können nun aber auch Schaden anrichten, wenn sie im Rahmen eines Angriffs eingeschmuggelt werden.", + "descriptionDe": "Als nächstes wollen wir Schadcode in die Web-Applikation einschleusen. Zunächst testen wir, ob die Webseite hierfür anfällig ist. Manipuliere die URL der Band-Seite so, dass du eine >>Hallo Welt!<<-Nachricht als >>alert<< siehst. Hinweis: Nutze einen image tag! Setze als >>src<< die Zahl >>1<<. Den Befehl kannst du im Tag >>onerror<< ausführen.", "descriptionEn": "todo", "exercises": [ { @@ -113,7 +115,7 @@ "nameDe": "Ein externes Script aufrufen", "nameEn": "Run an external script", "exerciseNr": 2, - "descriptionDe": "Bearbeite die URL des Shops so, dass du das Script ausführen kannst", + "descriptionDe": "Wir haben festgestellt, dass die Seite für Cross-Site-Scripting angreifbar ist! Im zweiten Schritt binden wir nun das Script ein. Es wurde bereits auf den Server hochgeladen. Suche über die Dateiverwaltung im Admin-Panel nach dem Skript. Kopiere dir die URL der Ressource heraus. Gehe zum Login und log dich aus. Füge einen beliebig benannten Query Parameter zur URL hinzu um das Skript zu laden. Nutze ein >>import<<-Statement um das Skript einzubinden. Logge dich nun ganz normal ein und sieh dir über die Konsole (Strg + D) an, wie deine Login-Daten abgegriffen werden. Hinweis: Wenn das Skript richtig eingebunden wurde, erscheint in der Konsole eine >>Active<<-Benachrichtigung. Da das >>import<<-Statement nur beim erstmaligen Laden der Seite genutzt wird, musst nach Eingabe der URL eventuell den Neu-Laden-Button neben der URL-Leiste betätigen.", "descriptionEn": "Create an URL of the shop, which calls the script" } ] diff --git a/backend/images/brand/logo.png b/backend/images/brand/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..c9ecf1811a7ecd97f9707b52286ef77c2ba4f175 GIT binary patch literal 61020 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 literal 0 HcmV?d00001 diff --git a/backend/server.ts b/backend/server.ts index 28f49ff..57d838e 100644 --- a/backend/server.ts +++ b/backend/server.ts @@ -28,6 +28,7 @@ startDatabase() // Static files const path = require('path') app.use('/static', express.static(path.join(__dirname, 'images'))) +app.use("/exercises", exercises) // Add delay for more realistic response times app.use((req, res, next) => { @@ -43,7 +44,6 @@ app.use("/orders", order) app.use("/accounts", account) app.use("/cities", city) app.use("/concerts", concert) -app.use("/exercises", exercises) app.use("/files", files) // Start server diff --git a/electron-builder.json b/electron-builder.json index b333dd5..e2c4a00 100644 --- a/electron-builder.json +++ b/electron-builder.json @@ -1,6 +1,6 @@ { "asar": true, - "appId": "de.luh.app", + "appId": "de.luh.eventmaster", "directories": { "output": "out" }, @@ -9,17 +9,20 @@ "oneClick": false, "perMachine": false, "allowToChangeInstallationDirectory": true, - "shortcutName": "Electron App" + "shortcutName": "EventMaster" }, "mac": { "target": "dmg" }, "win": { - "target": "nsis" + "target": "nsis", + "icon": "public/logo-small.png" }, "linux": { "target": ["deb"], - "maintainer": "Tobias Zoghaib" + "maintainer": "Tobias Zoghaib", + "icon": "public/logo-small.png", + "category": "Education" }, "files": [ { diff --git a/package-lock.json b/package-lock.json index 8c8cbad..6e06bad 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,28 +10,21 @@ "license": "MIT", "dependencies": { "@mdi/font": "^7.4.47", - "@types/multer": "^1.4.12", "@vueuse/core": "^11.1.0", "axios": "^1.7.7", - "bcrypt": "^5.1.1", "body-parser": "^1.20.2", "cors": "^2.8.5", - "cryptojs": "^2.5.3", - "electron-squirrel-startup": "^1.0.1", "express": "^4.21.1", "jsonwebtoken": "^9.0.2", "jspdf": "^2.5.2", "jspdf-autotable": "^3.8.4", "moment": "^2.30.1", "multer": "^1.4.5-lts.1", - "mysql2": "^3.11.4", "pinia": "^2.2.4", - "qs": "^6.13.1", "reflect-metadata": "^0.2.2", "sequelize": "^6.37.4", "sequelize-typescript": "^2.1.6", "sqlite3": "^5.1.7", - "ts-node": "^10.9.2", "vue": "^3.4.29", "vue-i18n": "^10.0.4", "vue-router": "^4.4.5", @@ -45,6 +38,7 @@ "@types/cors": "^2.8.17", "@types/express": "^4.17.21", "@types/jsonwebtoken": "^9.0.7", + "@types/multer": "^1.4.12", "@types/node": "^22.9.0", "@vitejs/plugin-vue": "^5.1.4", "concurrently": "^9.0.1", @@ -53,6 +47,7 @@ "electron-builder": "^25.1.8", "nodemon": "^3.1.7", "rimraf": "^6.0.1", + "ts-node": "^10.9.2", "vite": "^5.4.9", "vue-tsc": "^2.1.10" } @@ -120,6 +115,7 @@ "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "0.3.9" @@ -1523,6 +1519,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" @@ -1538,6 +1535,7 @@ "version": "0.3.9", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", @@ -1647,90 +1645,6 @@ "node": ">= 10.0.0" } }, - "node_modules/@mapbox/node-pre-gyp": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", - "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", - "license": "BSD-3-Clause", - "dependencies": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "deprecated": "This package is no longer supported.", - "license": "ISC", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "deprecated": "This package is no longer supported.", - "license": "ISC", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "deprecated": "This package is no longer supported.", - "license": "ISC", - "dependencies": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@mdi/font": { "version": "7.4.47", "resolved": "https://registry.npmjs.org/@mdi/font/-/font-7.4.47.tgz", @@ -2076,24 +1990,28 @@ "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true, "license": "MIT" }, "node_modules/@tsconfig/node12": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, "license": "MIT" }, "node_modules/@tsconfig/node14": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, "license": "MIT" }, "node_modules/@tsconfig/node16": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true, "license": "MIT" }, "node_modules/@types/bcrypt": { @@ -2110,6 +2028,7 @@ "version": "1.19.5", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dev": true, "license": "MIT", "dependencies": { "@types/connect": "*", @@ -2133,6 +2052,7 @@ "version": "3.4.38", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, "license": "MIT", "dependencies": { "@types/node": "*" @@ -2168,6 +2088,7 @@ "version": "4.17.21", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dev": true, "license": "MIT", "dependencies": { "@types/body-parser": "*", @@ -2180,6 +2101,7 @@ "version": "4.19.6", "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", + "dev": true, "license": "MIT", "dependencies": { "@types/node": "*", @@ -2209,6 +2131,7 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "dev": true, "license": "MIT" }, "node_modules/@types/jsonwebtoken": { @@ -2235,6 +2158,7 @@ "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true, "license": "MIT" }, "node_modules/@types/ms": { @@ -2247,6 +2171,7 @@ "version": "1.4.12", "resolved": "https://registry.npmjs.org/@types/multer/-/multer-1.4.12.tgz", "integrity": "sha512-pQ2hoqvXiJt2FP9WQVLPRO+AmiIm/ZYkavPlIQnx282u4ZrVdztx0pkh3jjpQt0Kz+YI0YhSG264y08UJKoUQg==", + "dev": true, "license": "MIT", "dependencies": { "@types/express": "*" @@ -2277,6 +2202,7 @@ "version": "6.9.16", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.16.tgz", "integrity": "sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==", + "dev": true, "license": "MIT" }, "node_modules/@types/raf": { @@ -2290,6 +2216,7 @@ "version": "1.2.7", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true, "license": "MIT" }, "node_modules/@types/responselike": { @@ -2306,6 +2233,7 @@ "version": "0.17.4", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dev": true, "license": "MIT", "dependencies": { "@types/mime": "^1", @@ -2316,6 +2244,7 @@ "version": "1.15.7", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "dev": true, "license": "MIT", "dependencies": { "@types/http-errors": "*", @@ -2674,6 +2603,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "devOptional": true, "license": "ISC" }, "node_modules/accepts": { @@ -2693,6 +2623,7 @@ "version": "8.13.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.13.0.tgz", "integrity": "sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w==", + "dev": true, "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -2705,6 +2636,7 @@ "version": "8.3.4", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, "license": "MIT", "dependencies": { "acorn": "^8.11.0" @@ -2717,6 +2649,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "devOptional": true, "license": "MIT", "dependencies": { "debug": "4" @@ -2729,6 +2662,7 @@ "version": "4.3.7", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "devOptional": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -2746,6 +2680,7 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "devOptional": true, "license": "MIT" }, "node_modules/agentkeepalive": { @@ -2813,6 +2748,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "devOptional": true, "license": "MIT", "engines": { "node": ">=8" @@ -3002,6 +2938,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "devOptional": true, "license": "ISC" }, "node_modules/archiver": { @@ -3102,6 +3039,7 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, "license": "MIT" }, "node_modules/argparse": { @@ -3184,15 +3122,6 @@ "node": ">= 4.5.0" } }, - "node_modules/aws-ssl-profiles": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz", - "integrity": "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==", - "license": "MIT", - "engines": { - "node": ">= 6.0.0" - } - }, "node_modules/axios": { "version": "1.7.7", "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", @@ -3240,26 +3169,6 @@ ], "license": "MIT" }, - "node_modules/bcrypt": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.1.tgz", - "integrity": "sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@mapbox/node-pre-gyp": "^1.0.11", - "node-addon-api": "^5.0.0" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/bcrypt/node_modules/node-addon-api": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", - "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==", - "license": "MIT" - }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -3962,6 +3871,7 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "devOptional": true, "license": "ISC", "bin": { "color-support": "bin.js" @@ -4165,6 +4075,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "devOptional": true, "license": "ISC" }, "node_modules/content-disposition": { @@ -4339,12 +4250,13 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, "license": "MIT" }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "license": "MIT", "dependencies": { @@ -4356,14 +4268,6 @@ "node": ">= 8" } }, - "node_modules/cryptojs": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/cryptojs/-/cryptojs-2.5.3.tgz", - "integrity": "sha512-+rdPl1UCxE8s3R94NNn+zMKOiI4MJ7dyh3X0c5uBL3btDr4zQ6acd7f9mY7Wb5MrccZEi2Rrha3OEtLcc5XXog==", - "engines": { - "node": "*" - } - }, "node_modules/css-line-break": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz", @@ -4492,17 +4396,9 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "devOptional": true, "license": "MIT" }, - "node_modules/denque": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", - "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", - "license": "Apache-2.0", - "engines": { - "node": ">=0.10" - } - }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -4543,6 +4439,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" @@ -4676,13 +4573,13 @@ } }, "node_modules/dotenv-expand": { - "version": "11.0.6", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.6.tgz", - "integrity": "sha512-8NHi73otpWsZGBSZwwknTXS5pqMOrk9+Ssrna8xCaxkzEpU9OTf9R5ArQGVw03//Zmk9MOwLPng9WwndvpAJ5g==", + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", + "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "dotenv": "^16.4.4" + "dotenv": "^16.4.5" }, "engines": { "node": ">=12" @@ -4940,15 +4837,6 @@ "node": ">= 10.0.0" } }, - "node_modules/electron-squirrel-startup": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/electron-squirrel-startup/-/electron-squirrel-startup-1.0.1.tgz", - "integrity": "sha512-sTfFIHGku+7PsHLJ7v0dRcZNkALrV+YEozINTW8X1nM//e5O3L+rfYuvSW00lmGHnYmUjARZulD8F2V8ISI9RA==", - "license": "Apache-2.0", - "dependencies": { - "debug": "^2.2.0" - } - }, "node_modules/electron/node_modules/@types/node": { "version": "20.17.5", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.5.tgz", @@ -4963,6 +4851,7 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "devOptional": true, "license": "MIT" }, "node_modules/encodeurl": { @@ -5530,15 +5419,6 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/generate-function": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", - "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", - "license": "MIT", - "dependencies": { - "is-property": "^1.0.2" - } - }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -5756,6 +5636,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "devOptional": true, "license": "ISC" }, "node_modules/hasown": { @@ -5888,6 +5769,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "devOptional": true, "license": "MIT", "dependencies": { "agent-base": "6", @@ -5901,6 +5783,7 @@ "version": "4.3.7", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "devOptional": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -5918,6 +5801,7 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "devOptional": true, "license": "MIT" }, "node_modules/humanize-ms": { @@ -6117,6 +6001,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "devOptional": true, "license": "MIT", "engines": { "node": ">=8" @@ -6162,12 +6047,6 @@ "node": ">=0.12.0" } }, - "node_modules/is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==", - "license": "MIT" - }, "node_modules/is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", @@ -6560,12 +6439,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/long": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==", - "license": "Apache-2.0" - }, "node_modules/lowercase-keys": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", @@ -6589,21 +6462,6 @@ "node": ">=10" } }, - "node_modules/lru.min": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/lru.min/-/lru.min-1.1.1.tgz", - "integrity": "sha512-FbAj6lXil6t8z4z3j0E5mfRlPzxkySotzUHwRXjlpRh10vc6AI6WN62ehZj82VG7M20rqogJ0GLwar2Xa05a8Q==", - "license": "MIT", - "engines": { - "bun": ">=1.0.0", - "deno": ">=1.30.0", - "node": ">=8.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wellwelwel" - } - }, "node_modules/magic-string": { "version": "0.30.12", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", @@ -6613,34 +6471,11 @@ "@jridgewell/sourcemap-codec": "^1.5.0" } }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "license": "MIT", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, "license": "ISC" }, "node_modules/make-fetch-happen": { @@ -6979,59 +6814,6 @@ "mkdirp": "bin/cmd.js" } }, - "node_modules/mysql2": { - "version": "3.11.4", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.11.4.tgz", - "integrity": "sha512-Z2o3tY4Z8EvSRDwknaC40MdZ3+m0sKbpnXrShQLdxPrAvcNli7jLrD2Zd2IzsRMw4eK9Yle500FDmlkIqp+krg==", - "license": "MIT", - "dependencies": { - "aws-ssl-profiles": "^1.1.1", - "denque": "^2.1.0", - "generate-function": "^2.3.1", - "iconv-lite": "^0.6.3", - "long": "^5.2.1", - "lru.min": "^1.0.0", - "named-placeholders": "^1.1.3", - "seq-queue": "^0.0.5", - "sqlstring": "^2.3.2" - }, - "engines": { - "node": ">= 8.0" - } - }, - "node_modules/mysql2/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/named-placeholders": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz", - "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==", - "license": "MIT", - "dependencies": { - "lru-cache": "^7.14.1" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/named-placeholders/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, "node_modules/nanoid": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", @@ -7093,26 +6875,6 @@ "semver": "^7.3.5" } }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, "node_modules/node-gyp": { "version": "8.4.1", "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", @@ -7275,6 +7037,7 @@ "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", "license": "ISC", + "optional": true, "dependencies": { "abbrev": "1" }, @@ -7800,21 +7563,6 @@ "node": ">=6" } }, - "node_modules/qs": { - "version": "6.13.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.1.tgz", - "integrity": "sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/quick-lru": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", @@ -8367,11 +8115,6 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, - "node_modules/seq-queue": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", - "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==" - }, "node_modules/sequelize": { "version": "6.37.4", "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.37.4.tgz", @@ -8520,6 +8263,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "devOptional": true, "license": "ISC" }, "node_modules/set-function-length": { @@ -8600,6 +8344,7 @@ "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "devOptional": true, "license": "ISC" }, "node_modules/simple-concat": { @@ -8803,15 +8548,6 @@ } } }, - "node_modules/sqlstring": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz", - "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/ssri": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", @@ -8875,6 +8611,7 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "devOptional": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -8905,6 +8642,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "devOptional": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -9230,12 +8968,6 @@ "nodetouch": "bin/nodetouch.js" } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" - }, "node_modules/tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", @@ -9260,6 +8992,7 @@ "version": "10.9.2", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, "license": "MIT", "dependencies": { "@cspotcode/source-map-support": "^0.8.0", @@ -9354,6 +9087,7 @@ "version": "5.6.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "devOptional": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -9480,6 +9214,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true, "license": "MIT" }, "node_modules/validator": { @@ -9716,22 +9451,6 @@ "defaults": "^1.0.3" } }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "license": "BSD-2-Clause" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -9752,6 +9471,7 @@ "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "devOptional": true, "license": "ISC", "dependencies": { "string-width": "^1.0.2 || 2 || 3 || 4" @@ -9888,6 +9608,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" diff --git a/package.json b/package.json index e9272e1..5ff3fd6 100644 --- a/package.json +++ b/package.json @@ -34,28 +34,21 @@ }, "dependencies": { "@mdi/font": "^7.4.47", - "@types/multer": "^1.4.12", "@vueuse/core": "^11.1.0", "axios": "^1.7.7", - "bcrypt": "^5.1.1", "body-parser": "^1.20.2", "cors": "^2.8.5", - "cryptojs": "^2.5.3", - "electron-squirrel-startup": "^1.0.1", "express": "^4.21.1", "jsonwebtoken": "^9.0.2", "jspdf": "^2.5.2", "jspdf-autotable": "^3.8.4", "moment": "^2.30.1", "multer": "^1.4.5-lts.1", - "mysql2": "^3.11.4", "pinia": "^2.2.4", - "qs": "^6.13.1", "reflect-metadata": "^0.2.2", "sequelize": "^6.37.4", "sequelize-typescript": "^2.1.6", "sqlite3": "^5.1.7", - "ts-node": "^10.9.2", "vue": "^3.4.29", "vue-i18n": "^10.0.4", "vue-router": "^4.4.5", @@ -69,6 +62,7 @@ "@types/cors": "^2.8.17", "@types/express": "^4.17.21", "@types/jsonwebtoken": "^9.0.7", + "@types/multer": "^1.4.12", "@types/node": "^22.9.0", "@vitejs/plugin-vue": "^5.1.4", "concurrently": "^9.0.1", @@ -77,6 +71,7 @@ "electron-builder": "^25.1.8", "nodemon": "^3.1.7", "rimraf": "^6.0.1", + "ts-node": "^10.9.2", "vite": "^5.4.9", "vue-tsc": "^2.1.10" } diff --git a/public/logo-small.png b/public/logo-small.png new file mode 100644 index 0000000000000000000000000000000000000000..e79c8058d83c1f88cf2147f690f3fe2f3a922c33 GIT binary patch literal 7950 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 diff --git a/public/logo.svg b/public/logo.svg new file mode 100644 index 0000000..1a3c606 --- /dev/null +++ b/public/logo.svg @@ -0,0 +1,79 @@ + + + + + + + + + + + M + e + + diff --git a/src/components/navigation/companyFooter.vue b/src/components/navigation/companyFooter.vue index 388dbe2..cffc7e5 100644 --- a/src/components/navigation/companyFooter.vue +++ b/src/components/navigation/companyFooter.vue @@ -52,11 +52,19 @@ watch(() => route.path, () => {

- + {{ exerciseStore.solveExercise(3, 1) }} - + {{ exerciseStore.solveExercise(3, 2) }}
diff --git a/src/components/navigation/navigationPrependItems.vue b/src/components/navigation/navigationPrependItems.vue index ee88d1f..41b9a60 100644 --- a/src/components/navigation/navigationPrependItems.vue +++ b/src/components/navigation/navigationPrependItems.vue @@ -9,7 +9,7 @@ class="mr-5" to="/" > - +
diff --git a/src/scripts/pdfScripts.ts b/src/scripts/pdfScripts.ts index 3e4a85a..b1c05e4 100644 --- a/src/scripts/pdfScripts.ts +++ b/src/scripts/pdfScripts.ts @@ -27,11 +27,11 @@ export function generateResultsPdf() { // Title and image doc.setFontSize(48) doc.text("EventMaster", midPage, 25, { align: "center" }) - doc.addImage("../../public/logo.png", "PNG", 65, 36, 80, 80) + doc.addImage("http://localhost:3000/static/brand/logo.png", "PNG", 82, 36, 48, 48) // Data about student doc.setFontSize(24) - doc.text([preferencesStore.studentName, preferencesStore.registrationNumber], midPage, 130, { align: "center" }) + doc.text([preferencesStore.studentName, preferencesStore.registrationNumber], midPage, 100, { align: "center" }) // Progress total doc.setFontSize(28) @@ -41,13 +41,13 @@ export function generateResultsPdf() { } return counter - }, 0) + " von 10 Aufgaben gelöst.", midPage, 160, { align: "center" }) + }, 0) + " von " + exerciseStore.exercises.length + " Aufgaben gelöst", midPage, 130, { align: "center" }) // Progress table doc.setFontSize(22) autoTable(doc, { - startY: 170, + startY: 140, head: [[ "Aufgaben-Nr.", "Aufgabengruppe", "Aufgabe", "Abgeschlossen?"]], body: exerciseData }) diff --git a/src/stores/search.store.ts b/src/stores/search.store.ts index eee80aa..b4edf36 100644 --- a/src/stores/search.store.ts +++ b/src/stores/search.store.ts @@ -45,7 +45,7 @@ export const useSearchStore = defineStore("searchStore", { exerciseStore.solveExercise(2, 2) } else if (this.searchTerm.includes("'); UPDATE Accounts SET accountRoleId = 2 WHERE username = ")) { exerciseStore.solveExercise(2, 3) - } else if (this.searchTerm.includes("'); DELETE FROM Ratings WHERE rating = 5;")) { + } else if (this.searchTerm.includes("'); DELETE FROM Ratings WHERE rating = 5; --")) { exerciseStore.solveExercise(2, 5) }