diff --git a/README.md b/README.md index 915689a4..5d22c47a 100644 --- a/README.md +++ b/README.md @@ -52,6 +52,13 @@ When the adapter crashes or another Code error happens, this error message that ## Changelog +### **WORK IN PROGRESS** +* (simatec) dependencies updated +* (simatec) Design fix +* (simatec) Backup File upload added +* (simatec) Uploadserver added +* (simatec) Translation updated + ### 2.9.1 (2023-11-02) * (simatec) ignore Build directory for ESPHome added diff --git a/admin/i18n/de/translations.json b/admin/i18n/de/translations.json index 30bc3dd3..47646d1a 100644 --- a/admin/i18n/de/translations.json +++ b/admin/i18n/de/translations.json @@ -34,6 +34,7 @@ "Backitup Warning!": "Backitup Warnung!", "Backitup execution": "Backitup-Ausführung", "Backup Download": "Backup-Download", + "Backup Upload": "Backup Upload", "Backup error on:": "Sicherungsfehler bei:", "Backup history": "Backup Verlauf", "Backup of all scripts from Javascript adapter": "Backup aller Skripte des JavaScript-Adapters", @@ -230,11 +231,15 @@ "Telegram Receiver": "Telegram-Empfänger", "Telegram instance": "Telegram Instanz", "Test connection": "Verbindung testen", + "The Upload could not be started. The popup will close automaticall": "Der Upload konnte nicht gestartet werden. Der Popup schließt automatischall", "The connection to the WebDAV server was established successfully.": "Die Verbindung zum WebDAV-Server wurde erfolgreich hergestellt.", "The download could not be started. The popup will close automatically": "Der Download konnte nicht gestartet werden. Das Popup-Fenster wird automatisch geschlossen", "Token": "Token", "Token (only for v2.x)": "Token (nur für v2.x)", "Type": "Art", + "Upload Backup File": "Upload Backup Datei", + "Upload completed successfully. The popup will close automatically": "Upload erfolgreich abgeschlossen. Der Popup wird automatisch geschlossen", + "Upload from Backup File": "Upload von Backup Datei", "Username": "Benutzername", "Username of the CCU": "Benutzername der CCU", "Version": "Version", @@ -287,9 +292,9 @@ "path": "Pfad", "piece": "Stück", "port": "Port", - "restore Configuration": "Konfiguration wiederherstellen", + "restore Backitup settings": "Backitup-Einstellungen wiederherstellen", "restore type": "Wiederherstellungstyp", - "save Configuration": "Konfiguration sichern", + "save Backitup settings": "Backitup-Einstellungen sichern", "seconds": "Sekunden", "send analysis data": "Analysedaten senden", "slave instances": "Slave-Instanzen", diff --git a/admin/i18n/en/translations.json b/admin/i18n/en/translations.json index 73b415a3..4b5b6eaf 100644 --- a/admin/i18n/en/translations.json +++ b/admin/i18n/en/translations.json @@ -34,6 +34,7 @@ "Backitup Warning!": "Backitup warning!", "Backitup execution": "Backitup execution", "Backup Download": "Backup Download", + "Backup Upload": "Backup Upload", "Backup error on:": "Backup error on:", "Backup history": "Backup history", "Backup of all scripts from Javascript adapter": "Backup of all scripts of the JavaScript adapter", @@ -230,11 +231,15 @@ "Telegram Receiver": "Telegram recipient", "Telegram instance": "Telegram instance", "Test connection": "Test connection", + "The Upload could not be started. The popup will close automaticall": "The Upload could not be started. The popup will close automaticall", "The connection to the WebDAV server was established successfully.": "The connection to the WebDAV server was established successfully.", "The download could not be started. The popup will close automatically": "The download could not be started. The popup will close automatically", "Token": "Token", "Token (only for v2.x)": "Token (only for v2.x)", "Type": "Type", + "Upload Backup File": "Upload Backup file", + "Upload completed successfully. The popup will close automatically": "Upload completed successfully. The popup will close automatically", + "Upload from Backup File": "Upload from Backup File", "Username": "Username", "Username of the CCU": "Username of the CCU", "Version": "Version", @@ -287,9 +292,9 @@ "path": "Path", "piece": "piece", "port": "port", - "restore Configuration": "Restore configuration", + "restore Backitup settings": "restore Backitup settings", "restore type": "restore type", - "save Configuration": "save Configuration", + "save Backitup settings": "save Backitup settings", "seconds": "seconds", "send analysis data": "send analysis data", "slave instances": "slave instances", diff --git a/admin/i18n/es/translations.json b/admin/i18n/es/translations.json index ea50a62d..193c3371 100644 --- a/admin/i18n/es/translations.json +++ b/admin/i18n/es/translations.json @@ -34,6 +34,7 @@ "Backitup Warning!": "¡Advertencia de respaldo!", "Backitup execution": "Ejecución de backitup", "Backup Download": "Descarga de copia de seguridad", + "Backup Upload": "Backup Upload", "Backup error on:": "Error de copia de seguridad en:", "Backup history": "Historial de copias de seguridad", "Backup of all scripts from Javascript adapter": "Copia de seguridad de todos los scripts del adaptador Javascript", @@ -230,11 +231,15 @@ "Telegram Receiver": "Receptor de telegramas", "Telegram instance": "Instancia de Telegram", "Test connection": "Conexión de prueba", + "The Upload could not be started. The popup will close automaticall": "La carga no podía empezar. El popup cerrará automáticamente", "The connection to the WebDAV server was established successfully.": "La conexión con el servidor WebDAV se estableció correctamente.", "The download could not be started. The popup will close automatically": "No se pudo iniciar la descarga. La ventana emergente se cerrará automáticamente", "Token": "Simbólico", "Token (only for v2.x)": "Token (solo para v2.x)", "Type": "Tipo", + "Upload Backup File": "Subir archivo de copia de seguridad", + "Upload completed successfully. The popup will close automatically": "Carga completada con éxito. El popup se cerrará automáticamente", + "Upload from Backup File": "Subir desde Archivo de Backup", "Username": "nombre de usuario", "Username of the CCU": "Nombre de usuario de la CCU", "Version": "Versión", @@ -287,9 +292,9 @@ "path": "Ruta", "piece": "Pieza", "port": "Puerto", - "restore Configuration": "Restaurar configuración", + "restore Backitup settings": "restaurar configuración de Backitup", "restore type": "tipo de restauración", - "save Configuration": "guardar configuración", + "save Backitup settings": "guardar configuración de Backitup", "seconds": "segundos", "send analysis data": "enviar datos de análisis", "slave instances": "instancias esclavas", diff --git a/admin/i18n/fr/translations.json b/admin/i18n/fr/translations.json index 72aef9a9..6f1bb44d 100644 --- a/admin/i18n/fr/translations.json +++ b/admin/i18n/fr/translations.json @@ -34,6 +34,7 @@ "Backitup Warning!": "Avertissement de backitup!", "Backitup execution": "Exécution de backitup", "Backup Download": "Téléchargement de sauvegarde", + "Backup Upload": "Backup Upload", "Backup error on:": "Erreur de sauvegarde sur:", "Backup history": "Historique de sauvegarde", "Backup of all scripts from Javascript adapter": "Sauvegarde de tous les scripts de l'adaptateur Javascript", @@ -230,11 +231,15 @@ "Telegram Receiver": "Récepteur de télégramme", "Telegram instance": "Instance de télégramme", "Test connection": "Tester la connexion", + "The Upload could not be started. The popup will close automaticall": "Le téléchargement n'a pas pu être lancé. Le popup fermera automatiquement", "The connection to the WebDAV server was established successfully.": "La connexion au serveur WebDAV a été établie avec succès.", "The download could not be started. The popup will close automatically": "Le téléchargement n'a pas pu démarrer. La popup se fermera automatiquement", "Token": "Jeton", "Token (only for v2.x)": "Jeton (uniquement pour v2.x)", "Type": "Type", + "Upload Backup File": "Télécharger fichier de sauvegarde", + "Upload completed successfully. The popup will close automatically": "Chargement effectué avec succès. Le popup fermera automatiquement", + "Upload from Backup File": "Télécharger à partir du fichier de sauvegarde", "Username": "nom d'utilisateur", "Username of the CCU": "Nom d'utilisateur du CCU", "Version": "Version", @@ -287,9 +292,9 @@ "path": "Chemin", "piece": "Pièce", "port": "Port", - "restore Configuration": "Restaurer la configuration", + "restore Backitup settings": "restaurer les paramètres de sauvegarde", "restore type": "type de restauration", - "save Configuration": "enregistrer la configuration", + "save Backitup settings": "sauvegarder les paramètres de sauvegarde", "seconds": "secondes", "send analysis data": "envoyer des données d'analyse", "slave instances": "instances esclaves", diff --git a/admin/i18n/it/translations.json b/admin/i18n/it/translations.json index 32621ef8..5d323c62 100644 --- a/admin/i18n/it/translations.json +++ b/admin/i18n/it/translations.json @@ -34,6 +34,7 @@ "Backitup Warning!": "Avviso di backup!", "Backitup execution": "Esecuzione di Backitup", "Backup Download": "Download di backup", + "Backup Upload": "Caricamento di backup", "Backup error on:": "Errore di backup su:", "Backup history": "Cronologia di backup", "Backup of all scripts from Javascript adapter": "Backup di tutti gli script dall'adattatore Javascript", @@ -230,11 +231,15 @@ "Telegram Receiver": "Telegram Receiver", "Telegram instance": "Istanza di Telegram", "Test connection": "Verifica connessione", + "The Upload could not be started. The popup will close automaticall": "L'upload non poteva essere avviato. Il popup chiuderà automaticamente", "The connection to the WebDAV server was established successfully.": "La connessione al server WebDAV è stata stabilita correttamente.", "The download could not be started. The popup will close automatically": "Impossibile avviare il download. Il popup si chiuderà automaticamente", "Token": "Gettone", "Token (only for v2.x)": "Token (solo per v2.x)", "Type": "genere", + "Upload Backup File": "Carica file di backup", + "Upload completed successfully. The popup will close automatically": "Caricamento completato con successo. Il popup si chiude automaticamente", + "Upload from Backup File": "Carica da Backup File", "Username": "nome utente", "Username of the CCU": "Nome utente del CCU", "Version": "Versione", @@ -287,9 +292,9 @@ "path": "Percorso", "piece": "Pezzo", "port": "Porta", - "restore Configuration": "Ripristino della configurazione", + "restore Backitup settings": "ripristino delle impostazioni di backup", "restore type": "ripristinare il tipo", - "save Configuration": "salva configurazione", + "save Backitup settings": "salvare le impostazioni di backup", "seconds": "secondi", "send analysis data": "inviare dati di analisi", "slave instances": "istanze slave", diff --git a/admin/i18n/nl/translations.json b/admin/i18n/nl/translations.json index 9f8b0d62..404a08c5 100644 --- a/admin/i18n/nl/translations.json +++ b/admin/i18n/nl/translations.json @@ -34,6 +34,7 @@ "Backitup Warning!": "Backitup Waarschuwing!", "Backitup execution": "Backitup uitvoering", "Backup Download": "Back-up downloaden", + "Backup Upload": "Versterking", "Backup error on:": "Back-upfout op:", "Backup history": "Back-up geschiedenis", "Backup of all scripts from Javascript adapter": "Back-up van alle scripts van de Javascript-adapter", @@ -230,11 +231,15 @@ "Telegram Receiver": "Telegram-ontvanger", "Telegram instance": "Telegram-instantie", "Test connection": "Test verbinding", + "The Upload could not be started. The popup will close automaticall": "De Upload kon niet beginnen. De popup zal automatisch alles sluiten", "The connection to the WebDAV server was established successfully.": "De verbinding met de WebDAV-server is tot stand gebracht.", "The download could not be started. The popup will close automatically": "De download kon niet worden gestart. De pop-up wordt automatisch gesloten", "Token": "token", "Token (only for v2.x)": "Token (alleen voor v2.x)", "Type": "Type", + "Upload Backup File": "Upload back-up bestand", + "Upload completed successfully. The popup will close automatically": "Upload volbracht. De popup zal automatisch sluiten", + "Upload from Backup File": "Upload van back-up File", "Username": "Gebruikersnaam", "Username of the CCU": "Gebruikersnaam van de CCU", "Version": "Versie", @@ -287,9 +292,9 @@ "path": "Path", "piece": "Stuk", "port": "poort", - "restore Configuration": "Configuratie herstellen", + "restore Backitup settings": "herstellende backitup setting", "restore type": "herstel type", - "save Configuration": "configuratie opslaan", + "save Backitup settings": "red backitup setting", "seconds": "seconden", "send analysis data": "verzend analysegegevens", "slave instances": "slave-instanties", diff --git a/admin/i18n/pl/translations.json b/admin/i18n/pl/translations.json index 2d55129e..4ad3b61b 100644 --- a/admin/i18n/pl/translations.json +++ b/admin/i18n/pl/translations.json @@ -34,6 +34,7 @@ "Backitup Warning!": "Ostrzeżenie dotyczące tworzenia kopii zapasowych!", "Backitup execution": "Wykonanie Backitup", "Backup Download": "Pobieranie kopii zapasowej", + "Backup Upload": "Backup Upload (ang.)", "Backup error on:": "Błąd kopii zapasowej w:", "Backup history": "Historia kopii zapasowych", "Backup of all scripts from Javascript adapter": "Kopia zapasowa wszystkich skryptów z adaptera Javascript", @@ -230,11 +231,15 @@ "Telegram Receiver": "Odbiornik telegramu", "Telegram instance": "Instancja telegramu", "Test connection": "Testuj połączenie", + "The Upload could not be started. The popup will close automaticall": "Pojazd nie mógł zostać uruchomiony. Pojazd będzie zamykać automatycznie", "The connection to the WebDAV server was established successfully.": "Połączenie z serwerem WebDAV zostało pomyślnie nawiązane.", "The download could not be started. The popup will close automatically": "Nie można rozpocząć pobierania. Wyskakujące okienko zamknie się automatycznie", "Token": "Znak", "Token (only for v2.x)": "Token (tylko dla v2.x)", "Type": "Rodzaj", + "Upload Backup File": "Upload Backup", + "Upload completed successfully. The popup will close automatically": "Przeciążenie zakończyło się sukcesem. Pojazd automatycznie się zamyka", + "Upload from Backup File": "Wykaz gatunków Backup File", "Username": "nazwa uzytkownika", "Username of the CCU": "Nazwa uzytkownika CCU", "Version": "Wersja", @@ -287,9 +292,9 @@ "path": "Sciezka", "piece": "kawałek", "port": "Port", - "restore Configuration": "Przywracanie konfiguracji", + "restore Backitup settings": "przywracanie zapasów", "restore type": "typ przywracania", - "save Configuration": "zapisz konfigurację", + "save Backitup settings": "rekord Backitup", "seconds": "sekundy", "send analysis data": "przesłać dane analityczne", "slave instances": "instancje podrzędne", diff --git a/admin/i18n/pt/translations.json b/admin/i18n/pt/translations.json index 96eb601e..90791fed 100644 --- a/admin/i18n/pt/translations.json +++ b/admin/i18n/pt/translations.json @@ -34,6 +34,7 @@ "Backitup Warning!": "Aviso de backup!", "Backitup execution": "Execução de backitup", "Backup Download": "Download de backup", + "Backup Upload": "Fazer upload de backup", "Backup error on:": "Erro de backup em:", "Backup history": "Histórico de backup", "Backup of all scripts from Javascript adapter": "Backup de todos os scripts do adaptador Javascript", @@ -230,11 +231,15 @@ "Telegram Receiver": "Receptor de telegrama", "Telegram instance": "Instância do telegrama", "Test connection": "Conexão de teste", + "The Upload could not be started. The popup will close automaticall": "O Upload não pôde ser iniciado. O popup vai fechar automático tudo", "The connection to the WebDAV server was established successfully.": "A conexão com o servidor WebDAV foi estabelecida com sucesso.", "The download could not be started. The popup will close automatically": "O download não pôde ser iniciado. O pop-up será fechado automaticamente", "Token": "Símbolo", "Token (only for v2.x)": "Token (somente para v2.x)", "Type": "Tipo", + "Upload Backup File": "Carregar arquivo de backup", + "Upload completed successfully. The popup will close automatically": "Upload concluído com sucesso. O popup fechará automaticamente", + "Upload from Backup File": "Upload de arquivo de backup", "Username": "nome de usuário", "Username of the CCU": "Nome de usuário da CCU", "Version": "Versão", @@ -287,9 +292,9 @@ "path": "Caminho NAS", "piece": "Peça", "port": "Porta", - "restore Configuration": "Restaurar a configuração", + "restore Backitup settings": "restaurar configurações de backup", "restore type": "restaurar tipo", - "save Configuration": "salvar configuração", + "save Backitup settings": "salvar configurações de backup", "seconds": "segundos", "send analysis data": "enviar dados de análise", "slave instances": "instâncias escravas", diff --git a/admin/i18n/ru/translations.json b/admin/i18n/ru/translations.json index 79c974b2..377ce432 100644 --- a/admin/i18n/ru/translations.json +++ b/admin/i18n/ru/translations.json @@ -34,6 +34,7 @@ "Backitup Warning!": "Предупреждение о резервном копировании!", "Backitup execution": "Выполнение резервного копирования", "Backup Download": "Резервная загрузка", + "Backup Upload": "Backup Загрузить", "Backup error on:": "Ошибка резервного копирования:", "Backup history": "История резервного копирования", "Backup of all scripts from Javascript adapter": "Резервное копирование всех скриптов драйвера Javascript", @@ -230,11 +231,15 @@ "Telegram Receiver": "Приемник телеграмм", "Telegram instance": "Экземпляр Telegram", "Test connection": "Проверить соединение", + "The Upload could not be started. The popup will close automaticall": "Загрузка не может быть запущена. Попап закроет автоматический", "The connection to the WebDAV server was established successfully.": "Подключение к серверу WebDAV установлено успешно.", "The download could not be started. The popup will close automatically": "Загрузка не может быть запущена. Всплывающее окно закроется автоматически", "Token": "Токен", "Token (only for v2.x)": "Токен (только для v2.x)", "Type": "Тип", + "Upload Backup File": "Загрузить файл Backup", + "Upload completed successfully. The popup will close automatically": "Загрузите успешно. Попап закроется автоматически", + "Upload from Backup File": "Загрузить из Backup File", "Username": "Имя пользователя", "Username of the CCU": "Имя пользователя", "Version": "Версия", @@ -287,9 +292,9 @@ "path": "Путь", "piece": "часть", "port": "порт", - "restore Configuration": "Восстановление конфигурации", + "restore Backitup settings": "восстановить настройки Backitup", "restore type": "тип восстановления", - "save Configuration": "сохранить конфигурацию", + "save Backitup settings": "сохранить настройки Backitup", "seconds": "секунд", "send analysis data": "отправлять данные для анализа", "slave instances": "ведомые экземпляры", diff --git a/admin/i18n/uk/translations.json b/admin/i18n/uk/translations.json index 3e3214cd..571f5dd2 100644 --- a/admin/i18n/uk/translations.json +++ b/admin/i18n/uk/translations.json @@ -34,6 +34,7 @@ "Backitup Warning!": "Попередження про резервне копіювання!", "Backitup execution": "Виконання резервної копії", "Backup Download": "Завантаження резервної копії", + "Backup Upload": "Резервне копіювання", "Backup error on:": "Помилка резервного копіювання:", "Backup history": "Історія резервного копіювання", "Backup of all scripts from Javascript adapter": "Резервне копіювання всіх скриптів адаптера JavaScript", @@ -230,11 +231,15 @@ "Telegram Receiver": "Одержувач Telegram", "Telegram instance": "Примірник Telegram", "Test connection": "Тестове підключення", + "The Upload could not be started. The popup will close automaticall": "Завантажити не можна. Закриє автоматичне", "The connection to the WebDAV server was established successfully.": "Підключення до сервера WebDAV успішно встановлено.", "The download could not be started. The popup will close automatically": "Не вдалося розпочати завантаження. Спливаюче вікно закриється автоматично", "Token": "Токен", "Token (only for v2.x)": "Токен (тільки для v2.x)", "Type": "Тип", + "Upload Backup File": "Завантажити файл Backup", + "Upload completed successfully. The popup will close automatically": "Завантажити успішно. Закриється автоматично", + "Upload from Backup File": "Завантаження з резервного копіювання", "Username": "Ім'я користувача", "Username of the CCU": "Ім'я користувача ЦКУ", "Version": "Версія", @@ -287,9 +292,9 @@ "path": "шлях", "piece": "шматок", "port": "порт", - "restore Configuration": "Відновлення конфігурації", + "restore Backitup settings": "відновлення параметрів резервного копіювання", "restore type": "тип відновлення", - "save Configuration": "зберегти конфігурацію", + "save Backitup settings": "зберегти налаштування резервного копіювання", "seconds": "секунд", "send analysis data": "відправити дані аналізу", "slave instances": "підлеглі екземпляри", diff --git a/admin/i18n/zh-cn/translations.json b/admin/i18n/zh-cn/translations.json index 29e0e736..0209f203 100644 --- a/admin/i18n/zh-cn/translations.json +++ b/admin/i18n/zh-cn/translations.json @@ -34,6 +34,7 @@ "Backitup Warning!": "备份警告!", "Backitup execution": "备份执行", "Backup Download": "备份下载", + "Backup Upload": "包装", "Backup error on:": "备份错误:", "Backup history": "备份历史", "Backup of all scripts from Javascript adapter": "JavaScript 适配器的所有脚本的备份", @@ -230,11 +231,15 @@ "Telegram Receiver": "电报收件人", "Telegram instance": "电报实例", "Test connection": "测试连接", + "The Upload could not be started. The popup will close automaticall": "不能开始载荷。 人口将接近自动所有人", "The connection to the WebDAV server was established successfully.": "已成功建立与 WebDAV 服务器的连接。", "The download could not be started. The popup will close automatically": "无法开始下载。弹窗会自动关闭", "Token": "代币", "Token (only for v2.x)": "令牌(仅适用于 v2.x)", "Type": "类型", + "Upload Backup File": "包装档案", + "Upload completed successfully. The popup will close automatically": "成功完成的载荷。 人口将自动结束", + "Upload from Backup File": "Backile File的载荷", "Username": "用户名", "Username of the CCU": "CCU 的用户名", "Version": "版本", @@ -287,9 +292,9 @@ "path": "小路", "piece": "片", "port": "港口", - "restore Configuration": "恢复配置", + "restore Backitup settings": "b. 恢复包装环境", "restore type": "还原类型", - "save Configuration": "保存配置", + "save Backitup settings": "d. 挽救包装环境", "seconds": "秒", "send analysis data": "发送分析数据", "slave instances": "从实例", diff --git a/admin/tab_m.css b/admin/tab_m.css index 4a458ed2..b3eaaafd 100644 --- a/admin/tab_m.css +++ b/admin/tab_m.css @@ -119,7 +119,7 @@ body { border-radius: 4px; box-shadow: 0 3px 3px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -2px rgba(0, 0, 0, 0.2); } -.btn-himself, .btn-restore-himself { +.btn-himself, .btn-restore-himself, .btn-backup-upload { width: 100%; margin-top: 0.3rem; border-radius: 4px; @@ -301,4 +301,44 @@ li { .card-content-text { overflow-y: auto; max-height: 187px; -} \ No newline at end of file +} +#toast-container { + bottom: 94%; + left: 30%; + top: initial; + right: initial; + position: absolute; + background-color: #174475; + box-shadow: rgba(0, 0, 0, 0.14) 0px 3px 3px 0px, rgba(0, 0, 0, 0.12) 0px 1px 5px 0px, rgba(0, 0, 0, 0.2) 0px 3px 1px -2px; + background-image: linear-gradient(179deg, rgb(51, 153, 204) 0%, rgb(23, 68, 117) 60%) !important; + color: white; + padding: 1rem; + font-size: larger; + z-index: 999; +} + +#dialog-upload .title { + width: 100%; + margin-left: auto; + left: auto; + right: auto; + background: #174475; + padding: 0.5rem; + border-radius: 4px; +} + +#dialog-upload .modal-content { + width: 100% !important; + height: calc(100% - 10px) !important; +} + +#dialog-upload { + max-height: 40% !important; + max-width: 70% !important; + width: 65% !important; + height: 35% !important; + overflow: visible !important; + top: 10px !important; + width: calc(100% - 100px); + border-radius: 4px; +} diff --git a/admin/tab_m.html b/admin/tab_m.html index 25971f05..e8bbd4b9 100644 --- a/admin/tab_m.html +++ b/admin/tab_m.html @@ -50,7 +50,7 @@
-
Backupinformations
+
infoBackupinformations
@@ -110,7 +110,7 @@
activated backupoptions
-
System backup
+
backupSystem backup
@@ -123,12 +123,12 @@
searchBackup history
-
Restore
+
settings_backup_restoreRestore
@@ -149,7 +149,10 @@
searchGet list
+
\ No newline at end of file diff --git a/admin/tab_m.js b/admin/tab_m.js index 148ee3ab..24a3552a 100644 --- a/admin/tab_m.js +++ b/admin/tab_m.js @@ -4,6 +4,7 @@ //Settings var $dialogCommand = null; var $dialogDownload = null; +var $dialogUpload = null; var $output = null; var $dialogCommandProgress; var lastMessage = ''; @@ -418,7 +419,7 @@ function load(settings, onChange) { $('.downloadError').show(); } - sendTo(null, 'serverClose', { downloadFinish: true }, function (result) { + sendTo(null, 'serverClose', { downloadFinish: true, uploadFinish: false }, function (result) { if (result && result.serverClose) { $('.downloadProgress').hide(); $('.downloadFinish').show(); @@ -464,6 +465,7 @@ function load(settings, onChange) { $('.detect-backups').on('click', function () { initDialogBackups(); }); $('.btn-himself').on('click', function () { backupHimSelf(); }); $('.btn-restore-himself').on('click', function () { restoreHimSelf(); }); + $('.btn-backup-upload').on('click', function () { backupUpload(); }); showHideSettings(settings); onChange(false); @@ -506,6 +508,59 @@ function backupHimSelf() { }); } +function backupUpload() { + var input = document.createElement('input'); + input.setAttribute('type', 'file'); + input.setAttribute('id', 'files'); + input.setAttribute('opacity', 0); + input.addEventListener('change', function (e) { + handleUploadSelect(e, function () { }); + }, false); + (input.click)(); +} + +async function handleUploadSelect(evt) { + const uploadFile = evt.target.files[0]; + if (uploadFile) { + sendTo(null, 'uploadFile', { protocol: location.protocol }, async function (result) { + if (!result || result.error) { + showError('

Error:

' + JSON.stringify(result.error)); + } else { + initDialogUpload(); + + $('#backupUpload_name').text(` "${uploadFile.name}" `); + $('.uploadFinish').hide(); + $('.uploadError').hide(); + $('.uploadProgress').show(); + + let formData = new FormData(); + + formData.append('files', uploadFile); + + await fetch(`${location.protocol}//${location.hostname}:${result.listenPort}`, { + method: 'POST', + body: formData + }).then(() => { + console.log('Upload finish!'); + $('.uploadProgress').hide(); + $('.uploadFinish').show(); + setTimeout(() => $dialogUpload.modal('close'), 5000); + + sendTo(null, 'serverClose', { downloadFinish: false, uploadFinish: true }, function (result) { + if (result && result.serverClose) { + console.log('Upload-Server closed'); + } + }); + }).catch((e) => { + $('.uploadProgress').hide(); + $('.uploadError').show(); + setTimeout(() => $dialogUpload.modal('close'), 5000); + }); + } + }); + } +} + function restoreHimSelf() { var input = document.createElement('input'); input.setAttribute('type', 'file'); @@ -631,6 +686,17 @@ function initDialogDownload() { $dialogDownload.modal('open'); } +function initDialogUpload() { + $dialogUpload = $('#dialog-upload'); + if (!$dialogUpload.data('inited')) { + $dialogUpload.data('inited', true); + $dialogUpload.modal({ + dismissible: false + }); + } + $dialogUpload.modal('open'); +} + function initDialogRestore() { var $dialogRestore = $('#dialog-restore-show'); if (!$dialogRestore.data('inited')) { diff --git a/admin/words.js b/admin/words.js index c802c86e..ef43ebbd 100644 --- a/admin/words.js +++ b/admin/words.js @@ -37,6 +37,7 @@ var _systemDictionary = { "Backitup Warning!": { "en": "Backitup warning!", "de": "Backitup Warnung!", "ru": "Предупреждение о резервном копировании!", "pt": "Aviso de backup!", "nl": "Backitup Waarschuwing!", "fr": "Avertissement de backitup!", "it": "Avviso di backup!", "es": "¡Advertencia de respaldo!", "pl": "Ostrzeżenie dotyczące tworzenia kopii zapasowych!", "uk": "Попередження про резервне копіювання!", "zh-cn": "备份警告!"}, "Backitup execution": { "en": "Backitup execution", "de": "Backitup-Ausführung", "ru": "Выполнение резервного копирования", "pt": "Execução de backitup", "nl": "Backitup uitvoering", "fr": "Exécution de backitup", "it": "Esecuzione di Backitup", "es": "Ejecución de backitup", "pl": "Wykonanie Backitup", "uk": "Виконання резервної копії", "zh-cn": "备份执行"}, "Backup Download": { "en": "Backup Download", "de": "Backup-Download", "ru": "Резервная загрузка", "pt": "Download de backup", "nl": "Back-up downloaden", "fr": "Téléchargement de sauvegarde", "it": "Download di backup", "es": "Descarga de copia de seguridad", "pl": "Pobieranie kopii zapasowej", "uk": "Завантаження резервної копії", "zh-cn": "备份下载"}, + "Backup Upload": { "en": "Backup Upload", "de": "Backup Upload", "ru": "Backup Загрузить", "pt": "Fazer upload de backup", "nl": "Versterking", "fr": "Backup Upload", "it": "Caricamento di backup", "es": "Backup Upload", "pl": "Backup Upload (ang.)", "uk": "Резервне копіювання", "zh-cn": "包装"}, "Backup error on:": { "en": "Backup error on:", "de": "Sicherungsfehler bei:", "ru": "Ошибка резервного копирования:", "pt": "Erro de backup em:", "nl": "Back-upfout op:", "fr": "Erreur de sauvegarde sur:", "it": "Errore di backup su:", "es": "Error de copia de seguridad en:", "pl": "Błąd kopii zapasowej w:", "uk": "Помилка резервного копіювання:", "zh-cn": "备份错误:"}, "Backup history": { "en": "Backup history", "de": "Backup Verlauf", "ru": "История резервного копирования", "pt": "Histórico de backup", "nl": "Back-up geschiedenis", "fr": "Historique de sauvegarde", "it": "Cronologia di backup", "es": "Historial de copias de seguridad", "pl": "Historia kopii zapasowych", "uk": "Історія резервного копіювання", "zh-cn": "备份历史"}, "Backup of all scripts from Javascript adapter": {"en": "Backup of all scripts of the JavaScript adapter", "de": "Backup aller Skripte des JavaScript-Adapters", "ru": "Резервное копирование всех скриптов драйвера Javascript", "pt": "Backup de todos os scripts do adaptador Javascript", "nl": "Back-up van alle scripts van de Javascript-adapter", "fr": "Sauvegarde de tous les scripts de l'adaptateur Javascript", "it": "Backup di tutti gli script dall'adattatore Javascript", "es": "Copia de seguridad de todos los scripts del adaptador Javascript", "pl": "Kopia zapasowa wszystkich skryptów z adaptera Javascript", "uk": "Резервне копіювання всіх скриптів адаптера JavaScript", "zh-cn": "JavaScript 适配器的所有脚本的备份"}, @@ -233,11 +234,15 @@ var _systemDictionary = { "Telegram Receiver": { "en": "Telegram recipient", "de": "Telegram-Empfänger", "ru": "Приемник телеграмм", "pt": "Receptor de telegrama", "nl": "Telegram-ontvanger", "fr": "Récepteur de télégramme", "it": "Telegram Receiver", "es": "Receptor de telegramas", "pl": "Odbiornik telegramu", "uk": "Одержувач Telegram", "zh-cn": "电报收件人"}, "Telegram instance": { "en": "Telegram instance", "de": "Telegram Instanz", "ru": "Экземпляр Telegram", "pt": "Instância do telegrama", "nl": "Telegram-instantie", "fr": "Instance de télégramme", "it": "Istanza di Telegram", "es": "Instancia de Telegram", "pl": "Instancja telegramu", "uk": "Примірник Telegram", "zh-cn": "电报实例"}, "Test connection": { "en": "Test connection", "de": "Verbindung testen", "ru": "Проверить соединение", "pt": "Conexão de teste", "nl": "Test verbinding", "fr": "Tester la connexion", "it": "Verifica connessione", "es": "Conexión de prueba", "pl": "Testuj połączenie", "uk": "Тестове підключення", "zh-cn": "测试连接"}, + "The Upload could not be started. The popup will close automaticall": {"en": "The Upload could not be started. The popup will close automaticall", "de": "Der Upload konnte nicht gestartet werden. Der Popup schließt automatischall", "ru": "Загрузка не может быть запущена. Попап закроет автоматический", "pt": "O Upload não pôde ser iniciado. O popup vai fechar automático tudo", "nl": "De Upload kon niet beginnen. De popup zal automatisch alles sluiten", "fr": "Le téléchargement n'a pas pu être lancé. Le popup fermera automatiquement", "it": "L'upload non poteva essere avviato. Il popup chiuderà automaticamente", "es": "La carga no podía empezar. El popup cerrará automáticamente", "pl": "Pojazd nie mógł zostać uruchomiony. Pojazd będzie zamykać automatycznie", "uk": "Завантажити не можна. Закриє автоматичне", "zh-cn": "不能开始载荷。 人口将接近自动所有人"}, "The connection to the WebDAV server was established successfully.": {"en": "The connection to the WebDAV server was established successfully.", "de": "Die Verbindung zum WebDAV-Server wurde erfolgreich hergestellt.", "ru": "Подключение к серверу WebDAV установлено успешно.", "pt": "A conexão com o servidor WebDAV foi estabelecida com sucesso.", "nl": "De verbinding met de WebDAV-server is tot stand gebracht.", "fr": "La connexion au serveur WebDAV a été établie avec succès.", "it": "La connessione al server WebDAV è stata stabilita correttamente.", "es": "La conexión con el servidor WebDAV se estableció correctamente.", "pl": "Połączenie z serwerem WebDAV zostało pomyślnie nawiązane.", "uk": "Підключення до сервера WebDAV успішно встановлено.", "zh-cn": "已成功建立与 WebDAV 服务器的连接。"}, "The download could not be started. The popup will close automatically": {"en": "The download could not be started. The popup will close automatically", "de": "Der Download konnte nicht gestartet werden. Das Popup-Fenster wird automatisch geschlossen", "ru": "Загрузка не может быть запущена. Всплывающее окно закроется автоматически", "pt": "O download não pôde ser iniciado. O pop-up será fechado automaticamente", "nl": "De download kon niet worden gestart. De pop-up wordt automatisch gesloten", "fr": "Le téléchargement n'a pas pu démarrer. La popup se fermera automatiquement", "it": "Impossibile avviare il download. Il popup si chiuderà automaticamente", "es": "No se pudo iniciar la descarga. La ventana emergente se cerrará automáticamente", "pl": "Nie można rozpocząć pobierania. Wyskakujące okienko zamknie się automatycznie", "uk": "Не вдалося розпочати завантаження. Спливаюче вікно закриється автоматично", "zh-cn": "无法开始下载。弹窗会自动关闭"}, "Token": { "en": "Token", "de": "Token", "ru": "Токен", "pt": "Símbolo", "nl": "token", "fr": "Jeton", "it": "Gettone", "es": "Simbólico", "pl": "Znak", "uk": "Токен", "zh-cn": "代币"}, "Token (only for v2.x)": { "en": "Token (only for v2.x)", "de": "Token (nur für v2.x)", "ru": "Токен (только для v2.x)", "pt": "Token (somente para v2.x)", "nl": "Token (alleen voor v2.x)", "fr": "Jeton (uniquement pour v2.x)", "it": "Token (solo per v2.x)", "es": "Token (solo para v2.x)", "pl": "Token (tylko dla v2.x)", "uk": "Токен (тільки для v2.x)", "zh-cn": "令牌(仅适用于 v2.x)"}, "Type": { "en": "Type", "de": "Art", "ru": "Тип", "pt": "Tipo", "nl": "Type", "fr": "Type", "it": "genere", "es": "Tipo", "pl": "Rodzaj", "uk": "Тип", "zh-cn": "类型"}, + "Upload Backup File": { "en": "Upload Backup file", "de": "Upload Backup Datei", "ru": "Загрузить файл Backup", "pt": "Carregar arquivo de backup", "nl": "Upload back-up bestand", "fr": "Télécharger fichier de sauvegarde", "it": "Carica file di backup", "es": "Subir archivo de copia de seguridad", "pl": "Upload Backup", "uk": "Завантажити файл Backup", "zh-cn": "包装档案"}, + "Upload completed successfully. The popup will close automatically": {"en": "Upload completed successfully. The popup will close automatically", "de": "Upload erfolgreich abgeschlossen. Der Popup wird automatisch geschlossen", "ru": "Загрузите успешно. Попап закроется автоматически", "pt": "Upload concluído com sucesso. O popup fechará automaticamente", "nl": "Upload volbracht. De popup zal automatisch sluiten", "fr": "Chargement effectué avec succès. Le popup fermera automatiquement", "it": "Caricamento completato con successo. Il popup si chiude automaticamente", "es": "Carga completada con éxito. El popup se cerrará automáticamente", "pl": "Przeciążenie zakończyło się sukcesem. Pojazd automatycznie się zamyka", "uk": "Завантажити успішно. Закриється автоматично", "zh-cn": "成功完成的载荷。 人口将自动结束"}, + "Upload from Backup File": { "en": "Upload from Backup File", "de": "Upload von Backup Datei", "ru": "Загрузить из Backup File", "pt": "Upload de arquivo de backup", "nl": "Upload van back-up File", "fr": "Télécharger à partir du fichier de sauvegarde", "it": "Carica da Backup File", "es": "Subir desde Archivo de Backup", "pl": "Wykaz gatunków Backup File", "uk": "Завантаження з резервного копіювання", "zh-cn": "Backile File的载荷"}, "Username": { "en": "Username", "de": "Benutzername", "ru": "Имя пользователя", "pt": "nome de usuário", "nl": "Gebruikersnaam", "fr": "nom d'utilisateur", "it": "nome utente", "es": "nombre de usuario", "pl": "nazwa uzytkownika", "uk": "Ім'я користувача", "zh-cn": "用户名"}, "Username of the CCU": { "en": "Username of the CCU", "de": "Benutzername der CCU", "ru": "Имя пользователя", "pt": "Nome de usuário da CCU", "nl": "Gebruikersnaam van de CCU", "fr": "Nom d'utilisateur du CCU", "it": "Nome utente del CCU", "es": "Nombre de usuario de la CCU", "pl": "Nazwa uzytkownika CCU", "uk": "Ім'я користувача ЦКУ", "zh-cn": "CCU 的用户名"}, "Version": { "en": "Version", "de": "Version", "ru": "Версия", "pt": "Versão", "nl": "Versie", "fr": "Version", "it": "Versione", "es": "Versión", "pl": "Wersja", "uk": "Версія", "zh-cn": "版本"}, @@ -290,9 +295,9 @@ var _systemDictionary = { "path": { "en": "Path", "de": "Pfad", "ru": "Путь", "pt": "Caminho NAS", "nl": "Path", "fr": "Chemin", "it": "Percorso", "es": "Ruta", "pl": "Sciezka", "uk": "шлях", "zh-cn": "小路"}, "piece": { "en": "piece", "de": "Stück", "ru": "часть", "pt": "Peça", "nl": "Stuk", "fr": "Pièce", "it": "Pezzo", "es": "Pieza", "pl": "kawałek", "uk": "шматок", "zh-cn": "片"}, "port": { "en": "port", "de": "Port", "ru": "порт", "pt": "Porta", "nl": "poort", "fr": "Port", "it": "Porta", "es": "Puerto", "pl": "Port", "uk": "порт", "zh-cn": "港口"}, - "restore Configuration": { "en": "Restore configuration", "de": "Konfiguration wiederherstellen", "ru": "Восстановление конфигурации", "pt": "Restaurar a configuração", "nl": "Configuratie herstellen", "fr": "Restaurer la configuration", "it": "Ripristino della configurazione", "es": "Restaurar configuración", "pl": "Przywracanie konfiguracji", "uk": "Відновлення конфігурації", "zh-cn": "恢复配置"}, + "restore Backitup settings": { "en": "restore Backitup settings", "de": "Backitup-Einstellungen wiederherstellen", "ru": "восстановить настройки Backitup", "pt": "restaurar configurações de backup", "nl": "herstellende backitup setting", "fr": "restaurer les paramètres de sauvegarde", "it": "ripristino delle impostazioni di backup", "es": "restaurar configuración de Backitup", "pl": "przywracanie zapasów", "uk": "відновлення параметрів резервного копіювання", "zh-cn": "b. 恢复包装环境"}, "restore type": { "en": "restore type", "de": "Wiederherstellungstyp", "ru": "тип восстановления", "pt": "restaurar tipo", "nl": "herstel type", "fr": "type de restauration", "it": "ripristinare il tipo", "es": "tipo de restauración", "pl": "typ przywracania", "uk": "тип відновлення", "zh-cn": "还原类型"}, - "save Configuration": { "en": "save Configuration", "de": "Konfiguration sichern", "ru": "сохранить конфигурацию", "pt": "salvar configuração", "nl": "configuratie opslaan", "fr": "enregistrer la configuration", "it": "salva configurazione", "es": "guardar configuración", "pl": "zapisz konfigurację", "uk": "зберегти конфігурацію", "zh-cn": "保存配置"}, + "save Backitup settings": { "en": "save Backitup settings", "de": "Backitup-Einstellungen sichern", "ru": "сохранить настройки Backitup", "pt": "salvar configurações de backup", "nl": "red backitup setting", "fr": "sauvegarder les paramètres de sauvegarde", "it": "salvare le impostazioni di backup", "es": "guardar configuración de Backitup", "pl": "rekord Backitup", "uk": "зберегти налаштування резервного копіювання", "zh-cn": "d. 挽救包装环境"}, "seconds": { "en": "seconds", "de": "Sekunden", "ru": "секунд", "pt": "segundos", "nl": "seconden", "fr": "secondes", "it": "secondi", "es": "segundos", "pl": "sekundy", "uk": "секунд", "zh-cn": "秒"}, "send analysis data": { "en": "send analysis data", "de": "Analysedaten senden", "ru": "отправлять данные для анализа", "pt": "enviar dados de análise", "nl": "verzend analysegegevens", "fr": "envoyer des données d'analyse", "it": "inviare dati di analisi", "es": "enviar datos de análisis", "pl": "przesłać dane analityczne", "uk": "відправити дані аналізу", "zh-cn": "发送分析数据"}, "slave instances": { "en": "slave instances", "de": "Slave-Instanzen", "ru": "ведомые экземпляры", "pt": "instâncias escravas", "nl": "slave-instanties", "fr": "instances esclaves", "it": "istanze slave", "es": "instancias esclavas", "pl": "instancje podrzędne", "uk": "підлеглі екземпляри", "zh-cn": "从实例"}, diff --git a/main.js b/main.js index 0ac5a245..2979cbd1 100644 --- a/main.js +++ b/main.js @@ -24,6 +24,7 @@ let slaveTimeOut; let waitToSlaveBackup; let stopServer; let dlServer; +let ulServer; let systemLang = 'de'; // system language const backupConfig = {}; @@ -263,6 +264,36 @@ function startAdapter(options) { } break; + case 'uploadFile': + if (obj.message && obj.message.protocol) { + if (obj.message.protocol === 'https:') { + await getCerts(obj.from); + } + + if (ulServer && ulServer._connectionKey) { + try { + ulServer.close(); + ulServer = null; + } catch (e) { + adapter.log.debug('Upload server could not be closed'); + } + } + + try { + ulFileServer(obj.message.protocol); + } catch (e) { + adapter.log.debug('Uploadserver cannot started'); + } + + try { + adapter.sendTo(obj.from, obj.command, { listenPort: ulServer.address().port }, obj.callback); + } catch (e) { + adapter.sendTo(obj.from, obj.command, { e }, obj.callback); + } + } else if (obj.callback) { + obj.callback({ error: 'Invalid parameters' }); + } + break; case 'getFile': if (obj.message && obj.message.type && obj.message.fileName && obj.message.protocol) { if (obj.message.protocol === 'https:') { @@ -277,7 +308,7 @@ function startAdapter(options) { } } try { - fileServer(obj.message.protocol); + dlFileServer(obj.message.protocol); } catch (e) { adapter.log.debug('Downloadserver cannot started'); } @@ -316,12 +347,20 @@ function startAdapter(options) { break; case 'serverClose': - if (obj.message && obj.message.downloadFinish) { + if (obj.message && obj.message.downloadFinish && !obj.message.uploadFinish) { stopServer = setTimeout(() => { dlServer.close(); + dlServer = null; adapter.log.debug('Downloadserver closed ...'); adapter.sendTo(obj.from, obj.command, { serverClose: true }, obj.callback); }, 2000); + } else if (obj.message && obj.message.uploadFinish && !obj.message.downloadFinish) { + stopServer = setTimeout(() => { + ulServer.close(); + ulServer = null; + adapter.log.debug('Uploadserver closed ...'); + adapter.sendTo(obj.from, obj.command, { serverClose: true }, obj.callback); + }, 2000); } else if (obj.callback) { obj.callback({ error: 'Invalid parameters' }); } @@ -1607,7 +1646,7 @@ async function getCerts(instance) { } } -function fileServer(protocol) { +function dlFileServer(protocol) { const express = require('express'); const downloadServer = express(); const https = require('https'); @@ -1652,6 +1691,74 @@ function fileServer(protocol) { } } +function ulFileServer(protocol) { + const express = require('express'); + const multer = require('multer'); + const cors = require('cors'); + const https = require('https'); + + let httpsServer; + + const backupDir = path.join(tools.getIobDir(), 'backups'); + + const uploadServer = express(); + uploadServer.use(cors()); + + const storage = multer.diskStorage({ + destination: function (req, file, callback) { + callback(null, backupDir); + }, + filename: function (req, file, callback) { + callback(null, file.originalname); + adapter.log.debug(`Upload from ${file.originalname} started...`); + } + }) + + const upload = multer({ storage: storage }) + + uploadServer.post('/', upload.single('files'), (req, res) => { + adapter.log.debug(req.body); + adapter.log.debug(req.files); + res.json({ message: "File(s) uploaded successfully" }); + + }); + + if (protocol === 'https:') { + let privateKey = ''; + let certificate = ''; + + if (fs.existsSync(path.join(bashDir, 'iob.key')) && fs.existsSync(path.join(bashDir, 'iob.crt'))) { + try { + privateKey = fs.readFileSync(path.join(bashDir, 'iob.key'), 'utf8'); + certificate = fs.readFileSync(path.join(bashDir, 'iob.crt'), 'utf8'); + } catch (e) { + adapter.log.debug('no certificates found'); + } + } + const credentials = { key: privateKey, cert: certificate }; + + try { + httpsServer = https.createServer(credentials, uploadServer); + } catch (e) { + adapter.log.debug(`The https Uploadserver cannot be created: ${e}`); + } + + try { + ulServer = httpsServer.listen(0); + adapter.log.debug(`Uploadserver on port ${ulServer.address().port} started`); + } catch (e) { + adapter.log.debug('Uploadserver cannot started'); + } + } else { + try { + ulServer = uploadServer.listen(0); + adapter.log.debug(`Uploadserver on port ${ulServer.address().port} started`); + } catch (e) { + adapter.log.debug('Uploadserver cannot started'); + } + } +} + async function renewOnedriveToken() { const Onedrive = require('./lib/oneDriveLib'); const onedrive = new Onedrive(); diff --git a/package-lock.json b/package-lock.json index 5593a3e3..caf6a255 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,12 +11,14 @@ "dependencies": { "@googleapis/drive": "^8.4.0", "@iobroker/adapter-core": "^3.0.4", - "axios": "^1.6.0", + "axios": "^1.6.1", + "cors": "^2.8.5", "dropbox-v2-api": "^2.5.10", "express": "^4.18.2", "fs-extra": "^11.1.1", "ftp": "^0.3.10", "google-auth-library": "^9.2.0", + "multer": "^1.4.5-lts.1", "node-schedule": "^2.1.1", "node-wol": "^0.1.1", "onedrive-api": "^1.1.1", @@ -654,6 +656,11 @@ "node": ">=0.10.0" } }, + "node_modules/append-field": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" + }, "node_modules/archy": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", @@ -913,9 +920,9 @@ "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" }, "node_modules/axios": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.0.tgz", - "integrity": "sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.1.tgz", + "integrity": "sha512-vfBmhDpKafglh0EldBEbVuoe7DyAavGSLWhuSm5ZSEKQnHhBf0xAAwybbNH1IkrJNGnS/VG4I5yxig1pCEXE4g==", "dependencies": { "follow-redirects": "^1.15.0", "form-data": "^4.0.0", @@ -1173,8 +1180,18 @@ "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } }, "node_modules/byte-length": { "version": "1.0.2", @@ -1572,7 +1589,6 @@ "version": "1.6.2", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, "engines": [ "node >= 0.8" ], @@ -1586,14 +1602,12 @@ "node_modules/concat-stream/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "node_modules/concat-stream/node_modules/readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -1607,14 +1621,12 @@ "node_modules/concat-stream/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/concat-stream/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -1699,6 +1711,18 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/cron-parser": { "version": "4.7.1", "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-4.7.1.tgz", @@ -4887,6 +4911,14 @@ "node": "*" } }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/mixin-deep": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", @@ -4912,6 +4944,17 @@ "node": ">=0.10.0" } }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, "node_modules/mkdirp-classic": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", @@ -5016,6 +5059,23 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "node_modules/multer": { + "version": "1.4.5-lts.1", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz", + "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==", + "dependencies": { + "append-field": "^1.0.0", + "busboy": "^1.0.0", + "concat-stream": "^1.5.2", + "mkdirp": "^0.5.4", + "object-assign": "^4.1.1", + "type-is": "^1.6.4", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/mute-stdout": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", @@ -5245,6 +5305,14 @@ "node": "*" } }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-copy": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", @@ -5750,8 +5818,7 @@ "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "node_modules/proxy-addr": { "version": "2.0.7", @@ -6771,6 +6838,14 @@ "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", "dev": true }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/streamx": { "version": "2.15.0", "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.0.tgz", @@ -7128,8 +7203,7 @@ "node_modules/typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, "node_modules/unc-path-regex": { "version": "0.1.2", @@ -7324,8 +7398,7 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "node_modules/utils-merge": { "version": "1.0.1", @@ -7635,7 +7708,6 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, "engines": { "node": ">=0.4" } @@ -8218,6 +8290,11 @@ "buffer-equal": "^1.0.0" } }, + "append-field": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" + }, "archy": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", @@ -8417,9 +8494,9 @@ "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" }, "axios": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.0.tgz", - "integrity": "sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.1.tgz", + "integrity": "sha512-vfBmhDpKafglh0EldBEbVuoe7DyAavGSLWhuSm5ZSEKQnHhBf0xAAwybbNH1IkrJNGnS/VG4I5yxig1pCEXE4g==", "requires": { "follow-redirects": "^1.15.0", "form-data": "^4.0.0", @@ -8632,8 +8709,15 @@ "buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "requires": { + "streamsearch": "^1.1.0" + } }, "byte-length": { "version": "1.0.2", @@ -8954,7 +9038,6 @@ "version": "1.6.2", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, "requires": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", @@ -8965,14 +9048,12 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -8986,14 +9067,12 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "requires": { "safe-buffer": "~5.1.0" } @@ -9069,6 +9148,15 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, "cron-parser": { "version": "4.7.1", "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-4.7.1.tgz", @@ -11620,6 +11708,11 @@ "brace-expansion": "^1.1.7" } }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" + }, "mixin-deep": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", @@ -11641,6 +11734,14 @@ } } }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "requires": { + "minimist": "^1.2.6" + } + }, "mkdirp-classic": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", @@ -11727,6 +11828,20 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "multer": { + "version": "1.4.5-lts.1", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz", + "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==", + "requires": { + "append-field": "^1.0.0", + "busboy": "^1.0.0", + "concat-stream": "^1.5.2", + "mkdirp": "^0.5.4", + "object-assign": "^4.1.1", + "type-is": "^1.6.4", + "xtend": "^4.0.0" + } + }, "mute-stdout": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", @@ -11894,6 +12009,11 @@ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + }, "object-copy": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", @@ -12280,8 +12400,7 @@ "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "proxy-addr": { "version": "2.0.7", @@ -13106,6 +13225,11 @@ "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", "dev": true }, + "streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==" + }, "streamx": { "version": "2.15.0", "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.0.tgz", @@ -13401,8 +13525,7 @@ "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, "unc-path-regex": { "version": "0.1.2", @@ -13560,8 +13683,7 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "utils-merge": { "version": "1.0.1", @@ -13819,8 +13941,7 @@ "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, "y18n": { "version": "5.0.8", diff --git a/package.json b/package.json index fb1c7ef4..1cd2d576 100644 --- a/package.json +++ b/package.json @@ -35,9 +35,11 @@ "dependencies": { "@googleapis/drive": "^8.4.0", "@iobroker/adapter-core": "^3.0.4", - "axios": "^1.6.0", + "axios": "^1.6.1", "dropbox-v2-api": "^2.5.10", "express": "^4.18.2", + "multer": "^1.4.5-lts.1", + "cors": "^2.8.5", "fs-extra": "^11.1.1", "ftp": "^0.3.10", "google-auth-library": "^9.2.0",