From ec25006fa2f44d4de652fdad40ef6074216c1582 Mon Sep 17 00:00:00 2001 From: HynoR <20227709+HynoR@users.noreply.github.com> Date: Tue, 21 Oct 2025 00:39:00 +0800 Subject: [PATCH 1/3] feat: add firewall rule import/export with JSON validation and alerts --- frontend/src/lang/modules/en.ts | 13 + frontend/src/lang/modules/es-es.ts | 13 + frontend/src/lang/modules/ja.ts | 13 + frontend/src/lang/modules/ko.ts | 13 + frontend/src/lang/modules/ms.ts | 13 + frontend/src/lang/modules/pt-br.ts | 13 + frontend/src/lang/modules/ru.ts | 13 + frontend/src/lang/modules/tr.ts | 13 + frontend/src/lang/modules/zh-Hant.ts | 12 + frontend/src/lang/modules/zh.ts | 12 + .../host/firewall/forward/import/index.vue | 305 +++++++++++++++++ .../src/views/host/firewall/forward/index.vue | 30 ++ .../views/host/firewall/ip/import/index.vue | 312 +++++++++++++++++ frontend/src/views/host/firewall/ip/index.vue | 28 ++ .../views/host/firewall/port/import/index.vue | 320 ++++++++++++++++++ .../src/views/host/firewall/port/index.vue | 30 ++ 16 files changed, 1153 insertions(+) create mode 100644 frontend/src/views/host/firewall/forward/import/index.vue create mode 100644 frontend/src/views/host/firewall/ip/import/index.vue create mode 100644 frontend/src/views/host/firewall/port/import/index.vue diff --git a/frontend/src/lang/modules/en.ts b/frontend/src/lang/modules/en.ts index a9efeaa45eaf..f12985bd5c8a 100644 --- a/frontend/src/lang/modules/en.ts +++ b/frontend/src/lang/modules/en.ts @@ -2868,6 +2868,19 @@ const message = { forwardHelper2: 'Leave the destination IP blank to forward to the local port.', forwardHelper3: 'Only support IPv4 port forwarding.', forwardInboundInterface: 'Forward Inbound Network Interface', + importHelper: + 'Upload a JSON file to import firewall rules. The system will automatically compare and show differences', + importNew: 'New rules', + importConflict: 'Conflicting rules', + importDuplicate: 'Duplicate rules', + new: 'New', + conflict: 'Conflict', + duplicate: 'Duplicate', + errImportFormat: 'Import file format error, please check the JSON file format', + errImport: 'Import failed: ', + selectImportRules: 'Please select rules to import', + importSuccess: 'Successfully imported {0} rules', + importPartialSuccess: 'Import completed: {0} succeeded, {1} failed', }, runtime: { runtime: 'Runtime', diff --git a/frontend/src/lang/modules/es-es.ts b/frontend/src/lang/modules/es-es.ts index 190cc537dc82..04d14b572f6f 100644 --- a/frontend/src/lang/modules/es-es.ts +++ b/frontend/src/lang/modules/es-es.ts @@ -2837,6 +2837,19 @@ const message = { forwardHelper2: 'Deja en blanco la IP de destino para reenviar al puerto local.', forwardHelper3: 'Solo se admite redirección de puertos IPv4.', forwardInboundInterface: 'Interfaz de Red de Entrada para Reenvío', + importHelper: + 'Sube un archivo JSON para importar reglas del firewall. El sistema comparará automáticamente y mostrará las diferencias', + importNew: 'Reglas nuevas', + importConflict: 'Reglas en conflicto', + importDuplicate: 'Reglas duplicadas', + new: 'Nueva', + conflict: 'Conflicto', + duplicate: 'Duplicada', + errImportFormat: 'Error en el formato del archivo importado, comprueba el formato del archivo JSON', + errImport: 'Error al importar: ', + selectImportRules: 'Selecciona las reglas que deseas importar', + importSuccess: 'Se importaron correctamente {0} reglas', + importPartialSuccess: 'Importación completada: {0} correctas, {1} fallidas', }, runtime: { runtime: 'Runtime', diff --git a/frontend/src/lang/modules/ja.ts b/frontend/src/lang/modules/ja.ts index b29f9aaf69e1..7b1554e0ef77 100644 --- a/frontend/src/lang/modules/ja.ts +++ b/frontend/src/lang/modules/ja.ts @@ -2781,6 +2781,19 @@ const message = { forwardHelper2: '宛先IPを空白のままにして、ローカルポートに転送します。', forwardHelper3: 'IPv4ポート転送のみをサポートします。', forwardInboundInterface: '転送入站ネットワークインターフェース', + importHelper: + 'JSON ファイルをアップロードしてファイアウォールルールをインポートします。システムが自動で比較し、差分を表示します', + importNew: '新規ルール', + importConflict: '競合ルール', + importDuplicate: '重複ルール', + new: '新規', + conflict: '競合', + duplicate: '重複', + errImportFormat: 'インポートファイルの形式エラーです。JSON ファイルの形式を確認してください', + errImport: 'インポートに失敗しました: ', + selectImportRules: 'インポートするルールを選択してください', + importSuccess: '{0} 件のルールを正常にインポートしました', + importPartialSuccess: 'インポート完了: {0} 件成功、{1} 件失敗', }, runtime: { runtime: 'ランタイム', diff --git a/frontend/src/lang/modules/ko.ts b/frontend/src/lang/modules/ko.ts index d9b5019d1e0e..00bb8b7ad3be 100644 --- a/frontend/src/lang/modules/ko.ts +++ b/frontend/src/lang/modules/ko.ts @@ -2731,6 +2731,19 @@ const message = { forwardHelper2: '대상 IP 를 비워두면 로컬 포트로 전달됩니다.', forwardHelper3: 'IPv4 포트 전달만 지원됩니다.', forwardInboundInterface: '포워딩 인바운드 네트워크 인터페이스', + importHelper: + 'JSON 파일을 업로드하여 방화벽 규칙을 가져옵니다. 시스템이 자동으로 비교하고 차이를 표시합니다', + importNew: '새 규칙', + importConflict: '충돌 규칙', + importDuplicate: '중복 규칙', + new: '신규', + conflict: '충돌', + duplicate: '중복', + errImportFormat: '가져오기 파일 형식 오류입니다. JSON 파일 형식을 확인하세요', + errImport: '가져오기에 실패했습니다: ', + selectImportRules: '가져올 규칙을 선택하세요', + importSuccess: '{0}개의 규칙을 성공적으로 가져왔습니다', + importPartialSuccess: '가져오기 완료: 성공 {0}건, 실패 {1}건', }, runtime: { runtime: '실행 환경', diff --git a/frontend/src/lang/modules/ms.ts b/frontend/src/lang/modules/ms.ts index d0edcf6a8f7f..556acccfc82b 100644 --- a/frontend/src/lang/modules/ms.ts +++ b/frontend/src/lang/modules/ms.ts @@ -2845,6 +2845,19 @@ const message = { forwardHelper2: 'Biarkan IP sasaran kosong untuk memajukan ke port tempatan.', forwardHelper3: 'Hanya menyokong pemajuan port IPv4.', forwardInboundInterface: 'Antara Muka Rangkaian Masukan Penerusan', + importHelper: + 'Muat naik fail JSON untuk mengimport peraturan firewall. Sistem akan membanding dan memaparkan perbezaan secara automatik', + importNew: 'Peraturan baharu', + importConflict: 'Peraturan konflik', + importDuplicate: 'Peraturan duplikat', + new: 'Baharu', + conflict: 'Konflik', + duplicate: 'Duplikat', + errImportFormat: 'Ralat format fail import, sila semak format fail JSON', + errImport: 'Import gagal: ', + selectImportRules: 'Sila pilih peraturan untuk diimport', + importSuccess: '{0} peraturan berjaya diimport', + importPartialSuccess: 'Import selesai: {0} berjaya, {1} gagal', }, runtime: { runtime: 'Runtime', diff --git a/frontend/src/lang/modules/pt-br.ts b/frontend/src/lang/modules/pt-br.ts index 393b9f8d0a7a..a29fe40da27a 100644 --- a/frontend/src/lang/modules/pt-br.ts +++ b/frontend/src/lang/modules/pt-br.ts @@ -2851,6 +2851,19 @@ const message = { forwardHelper2: 'Deixe o IP de destino em branco para redirecionar para a porta local.', forwardHelper3: 'Somente suporta redirecionamento de porta IPv4.', forwardInboundInterface: 'Interface de Rede de Entrada para Encaminhamento', + importHelper: + 'Envie um arquivo JSON para importar as regras do firewall. O sistema irá comparar e mostrar as diferenças automaticamente', + importNew: 'Novas regras', + importConflict: 'Regras em conflito', + importDuplicate: 'Regras duplicadas', + new: 'Nova', + conflict: 'Conflito', + duplicate: 'Duplicada', + errImportFormat: 'Erro no formato do arquivo de importação, verifique o formato do arquivo JSON', + errImport: 'Falha na importação: ', + selectImportRules: 'Selecione as regras que deseja importar', + importSuccess: '{0} regras importadas com sucesso', + importPartialSuccess: 'Importação concluída: {0} sucesso, {1} falha', }, runtime: { runtime: 'Runtime', diff --git a/frontend/src/lang/modules/ru.ts b/frontend/src/lang/modules/ru.ts index 8fc3676b2f5a..9431ebcf9504 100644 --- a/frontend/src/lang/modules/ru.ts +++ b/frontend/src/lang/modules/ru.ts @@ -2847,6 +2847,19 @@ const message = { forwardHelper2: 'Оставьте целевой IP пустым для перенаправления на локальный порт.', forwardHelper3: 'Поддерживается только переадресация портов IPv4.', forwardInboundInterface: '转发入站Сетевой интерфейс для пересылки входящего трафика网卡', + importHelper: + 'Загрузите JSON-файл, чтобы импортировать правила брандмауэра. Система автоматически сравнит их и покажет различия', + importNew: 'Новые правила', + importConflict: 'Конфликтующие правила', + importDuplicate: 'Дублирующиеся правила', + new: 'Новое', + conflict: 'Конфликт', + duplicate: 'Дубликат', + errImportFormat: 'Ошибка формата импортируемого файла, проверьте формат JSON', + errImport: 'Не удалось импортировать: ', + selectImportRules: 'Выберите правила для импорта', + importSuccess: 'Успешно импортировано {0} правил', + importPartialSuccess: 'Импорт завершён: {0} успешно, {1} с ошибкой', }, runtime: { runtime: 'Среда выполнения', diff --git a/frontend/src/lang/modules/tr.ts b/frontend/src/lang/modules/tr.ts index 960697bc5f66..38edbbae94f0 100644 --- a/frontend/src/lang/modules/tr.ts +++ b/frontend/src/lang/modules/tr.ts @@ -2908,6 +2908,19 @@ const message = { forwardHelper2: 'Yerel porta yönlendirmek için hedef IP’yi boş bırakın.', forwardHelper3: 'Yalnızca IPv4 port yönlendirmesini destekler.', forwardInboundInterface: 'İletme Gelen Ağ Arayüzü', + importHelper: + 'Güvenlik duvarı kurallarını içe aktarmak için bir JSON dosyası yükleyin. Sistem otomatik olarak karşılaştırıp farkları gösterecektir', + importNew: 'Yeni kurallar', + importConflict: 'Çakışan kurallar', + importDuplicate: 'Yinelenen kurallar', + new: 'Yeni', + conflict: 'Çakışma', + duplicate: 'Yinelenen', + errImportFormat: 'İçe aktarma dosya biçimi hatalı, lütfen JSON dosya biçimini kontrol edin', + errImport: 'İçe aktarma başarısız: ', + selectImportRules: 'Lütfen içe aktarılacak kuralları seçin', + importSuccess: '{0} kural başarıyla içe aktarıldı', + importPartialSuccess: 'İçe aktarma tamamlandı: {0} başarılı, {1} başarısız', }, runtime: { runtime: 'Çalışma Zamanı', diff --git a/frontend/src/lang/modules/zh-Hant.ts b/frontend/src/lang/modules/zh-Hant.ts index 101004486b19..ce6116ec1121 100644 --- a/frontend/src/lang/modules/zh-Hant.ts +++ b/frontend/src/lang/modules/zh-Hant.ts @@ -2667,6 +2667,18 @@ const message = { forwardHelper2: '如果目標 IP 不填寫,預設為本機埠轉發', forwardHelper3: '目前僅支援 IPv4 的埠轉發', forwardInboundInterface: '轉發入站網路介面', + importHelper: '上傳 JSON 檔案以匯入防火牆規則,系統會自動比對並顯示差異', + importNew: '新增規則', + importConflict: '衝突規則', + importDuplicate: '重複規則', + new: '新增', + conflict: '衝突', + duplicate: '重複', + errImportFormat: '匯入檔案格式錯誤,請檢查 JSON 檔案格式', + errImport: '匯入失敗:', + selectImportRules: '請選擇要匯入的規則', + importSuccess: '成功匯入 {0} 條規則', + importPartialSuccess: '匯入完成:成功 {0} 條,失敗 {1} 條', }, runtime: { runtime: '執行環境', diff --git a/frontend/src/lang/modules/zh.ts b/frontend/src/lang/modules/zh.ts index 2fefea965cf0..124dc414bb14 100644 --- a/frontend/src/lang/modules/zh.ts +++ b/frontend/src/lang/modules/zh.ts @@ -2659,6 +2659,18 @@ const message = { forwardHelper2: '如果目标IP不填写,则默认为本机端口转发', forwardHelper3: '当前仅支持 IPv4 的端口转发', forwardInboundInterface: '转发入站网卡', + importHelper: '上传 JSON 文件以导入防火墙规则,系统会自动比对并显示差异', + importNew: '新增规则', + importConflict: '冲突规则', + importDuplicate: '重复规则', + new: '新规则', + conflict: '冲突', + duplicate: '重复', + errImportFormat: '导入文件格式错误,请检查 JSON 文件格式', + errImport: '导入失败:', + selectImportRules: '请选择要导入的规则', + importSuccess: '成功导入 {0} 条规则', + importPartialSuccess: '导入完成:成功 {0} 条,失败 {1} 条', }, runtime: { runtime: '运行环境', diff --git a/frontend/src/views/host/firewall/forward/import/index.vue b/frontend/src/views/host/firewall/forward/import/index.vue new file mode 100644 index 000000000000..dc4bde5f4eb7 --- /dev/null +++ b/frontend/src/views/host/firewall/forward/import/index.vue @@ -0,0 +1,305 @@ + + + diff --git a/frontend/src/views/host/firewall/forward/index.vue b/frontend/src/views/host/firewall/forward/index.vue index a5bdca3847f7..02917ec980ed 100644 --- a/frontend/src/views/host/firewall/forward/index.vue +++ b/frontend/src/views/host/firewall/forward/index.vue @@ -24,6 +24,14 @@ {{ $t('commons.button.delete') }} + + + {{ $t('commons.button.import') }} + + + {{ $t('commons.button.export') }} + + + diff --git a/frontend/src/views/host/firewall/ip/index.vue b/frontend/src/views/host/firewall/ip/index.vue index ec62e80190e6..99fc13477d43 100644 --- a/frontend/src/views/host/firewall/ip/index.vue +++ b/frontend/src/views/host/firewall/ip/index.vue @@ -25,6 +25,14 @@ {{ $t('commons.button.delete') }} + + + {{ $t('commons.button.import') }} + + + {{ $t('commons.button.export') }} + + diff --git a/frontend/src/views/host/firewall/port/index.vue b/frontend/src/views/host/firewall/port/index.vue index 2e57261ac211..fcf26ba3bf36 100644 --- a/frontend/src/views/host/firewall/port/index.vue +++ b/frontend/src/views/host/firewall/port/index.vue @@ -41,6 +41,14 @@ {{ $t('commons.button.delete') }} + + + {{ $t('commons.button.import') }} + + + {{ $t('commons.button.export') }} + +