mirror of
https://github.com/1Panel-dev/1Panel.git
synced 2026-10-28 16:00:18 +00:00
refactor(firewall): simplify whitelist configuration and rule protection (#13838)
This commit is contained in:
@@ -333,6 +333,7 @@ export namespace Firewall {
|
||||
|
||||
export interface DeleteRequest {
|
||||
uuids: string[];
|
||||
beforeRules?: { scope: Scope; instanceKey: string }[];
|
||||
}
|
||||
|
||||
export interface DeleteResponse {
|
||||
|
||||
@@ -4,13 +4,13 @@ import { Firewall } from '@/api/interface/firewall';
|
||||
import { TimeoutEnum } from '@/enums/http-enum';
|
||||
|
||||
export const createFirewallPortWhitelist = (rule: Firewall.PortWhitelist) =>
|
||||
http.post<Firewall.FilterChainOperationResult>('/hosts/firewall/settings/whitelist', { rule });
|
||||
http.post('/hosts/firewall/settings/whitelist', { rule });
|
||||
|
||||
export const updateFirewallPortWhitelist = (request: Firewall.PortWhitelistUpdate) =>
|
||||
http.post<Firewall.FilterChainOperationResult>('/hosts/firewall/settings/whitelist/update', request);
|
||||
http.post('/hosts/firewall/settings/whitelist/update', request);
|
||||
|
||||
export const deleteFirewallPortWhitelist = (rule: Firewall.PortWhitelist) =>
|
||||
http.post<Firewall.FilterChainOperationResult>('/hosts/firewall/settings/whitelist/delete', { rule });
|
||||
http.post('/hosts/firewall/settings/whitelist/delete', { rule });
|
||||
|
||||
export const loadFireBaseInfo = (tab: string) =>
|
||||
http.post<Firewall.FirewallBase>('/hosts/firewall/base', { name: tab }, TimeoutEnum.T_40S);
|
||||
|
||||
@@ -4102,7 +4102,7 @@ const message = {
|
||||
external: 'External rule',
|
||||
externalHelper: 'Not managed by 1Panel.',
|
||||
protected: 'System-protected',
|
||||
protectedHelper: 'A critical system rule that cannot be edited or deleted.',
|
||||
protectedHelper: 'Built-in rules and rules that exactly match the whitelist cannot be edited or deleted.',
|
||||
stateShort: {
|
||||
managed: 'Panel-created',
|
||||
adopted: 'Externally managed',
|
||||
@@ -4300,6 +4300,10 @@ const message = {
|
||||
unbindHelper:
|
||||
'Unbind - When unbound, all added firewall rules will become invalid. Proceed with caution. Confirm?',
|
||||
portWhiteList: 'Port allowlist',
|
||||
whitelistConfigHelper:
|
||||
'The allowlist only saves configuration and protects matching allow rules. Missing rules are added on start, restart, initialization, or synchronization. Editing or deleting allowlist entries does not remove existing rules.',
|
||||
whitelistDeleteConfirm:
|
||||
'Only this whitelist entry will be deleted. Existing firewall rules will remain. Continue?',
|
||||
portWhiteListHelper:
|
||||
'Enter a single port (e.g. 80) or a port range (e.g. 8000-8100). Port numbers must be between 1 and 65535.',
|
||||
chain: 'Chain',
|
||||
@@ -4312,10 +4316,8 @@ const message = {
|
||||
allPorts: 'All Ports',
|
||||
allProtocolHelper: 'All protocols and ports',
|
||||
sourceAddressPlaceholder: 'e.g. 172.16.10.11, 172.16.0.0/24, 2001:db8::1, or 2001:db8::/64',
|
||||
systemAccessChangeConfirm:
|
||||
'This operation on the {0} allowlist rules may prevent remote access through these services. Continue?',
|
||||
whitelistServicePortsHelper:
|
||||
'Set one port allowed by the firewall. Manage the listening port in the service settings.',
|
||||
'Enter a single port (1-65535). This does not change the service listening port. Changing the port in the service settings also updates this whitelist entry.',
|
||||
whitelistSourcesHelper:
|
||||
'Enter IP addresses or CIDR ranges, separated by commas or new lines. Leave blank to allow all IPv4 and IPv6 sources.',
|
||||
destinationPortPlaceholder: 'e.g. 80, 80,443, or 8080-8089',
|
||||
|
||||
@@ -4149,7 +4149,7 @@ const message = {
|
||||
'Regla existente del sistema que aún no gestiona 1Panel. Se puede adoptar cuando sea necesario.',
|
||||
protected: 'Protegida por el sistema',
|
||||
protectedHelper:
|
||||
'Regla crítica del sistema que no se puede editar ni eliminar para evitar interrumpir el acceso.',
|
||||
'Las reglas integradas y las que coinciden exactamente con la lista blanca no se pueden editar ni eliminar.',
|
||||
stateShort: {
|
||||
managed: 'Panel',
|
||||
adopted: 'Gestionada',
|
||||
@@ -4353,6 +4353,10 @@ const message = {
|
||||
unbindHelper:
|
||||
'Desvincular: al desvincular, todas las reglas de firewall agregadas se volverán inválidas. Proceda con precaución. ¿Confirmar?',
|
||||
portWhiteList: 'Lista blanca de puertos',
|
||||
whitelistConfigHelper:
|
||||
'La lista de permitidos solo guarda la configuración y protege las reglas de acceso coincidentes. Las reglas que falten se añaden al iniciar, reiniciar, inicializar o sincronizar. Editar o eliminar entradas no elimina las reglas existentes.',
|
||||
whitelistDeleteConfirm:
|
||||
'Solo se eliminará esta entrada de la lista blanca. Se conservarán las reglas existentes del firewall. ¿Continuar?',
|
||||
portWhiteListHelper:
|
||||
'Introduzca un puerto (p. ej., 80) o un rango (p. ej., 8000-8100). Los puertos deben estar entre 1 y 65535.',
|
||||
chain: 'Cadena',
|
||||
@@ -4365,10 +4369,8 @@ const message = {
|
||||
allPorts: 'Todos los Puertos',
|
||||
allProtocolHelper: 'Todos los protocolos y puertos',
|
||||
sourceAddressPlaceholder: 'p. ej. 172.16.10.11, 172.16.0.0/24, 2001:db8::1 o 2001:db8::/64',
|
||||
systemAccessChangeConfirm:
|
||||
'Esta operación en las reglas de la lista de permitidos de {0} puede impedir el acceso remoto mediante estos servicios. ¿Continuar?',
|
||||
whitelistServicePortsHelper:
|
||||
'Configure un único puerto permitido por el cortafuegos. El puerto de escucha se gestiona en la configuración del servicio.',
|
||||
'Introduzca un único puerto (1-65535). Esto no cambia el puerto de escucha del servicio. Al cambiar el puerto en los ajustes del servicio, también se actualiza esta entrada de la lista blanca.',
|
||||
whitelistSourcesHelper:
|
||||
'Introduzca direcciones IP o rangos CIDR separados por comas o saltos de línea. Déjelo en blanco para permitir todos los orígenes IPv4 e IPv6.',
|
||||
destinationPortPlaceholder: 'p. ej. 80, 80,443 o 8080-8089',
|
||||
|
||||
@@ -4067,7 +4067,7 @@ const message = {
|
||||
externalHelper:
|
||||
'قانونی موجود در سیستم که هنوز توسط 1Panel مدیریت نمیشود و در صورت نیاز میتوان آن را تحت مدیریت قرار داد.',
|
||||
protected: 'محافظتشده توسط سیستم',
|
||||
protectedHelper: 'قانون حیاتی سیستم که برای جلوگیری از اختلال در دسترسی قابل ویرایش یا حذف نیست.',
|
||||
protectedHelper: 'قوانین داخلی و قوانینی که دقیقاً با فهرست سفید مطابقت دارند قابل ویرایش یا حذف نیستند.',
|
||||
stateShort: { managed: 'پنل', adopted: 'مدیریت', external: 'خارجی', protected: 'محافظت', drifted: 'ناهمگام' },
|
||||
ruleTargetRequired: 'حداقل یک نشانی IP یا درگاه وارد کنید',
|
||||
resolution_adopt: 'واگذاری مدیریت',
|
||||
@@ -4257,6 +4257,10 @@ const message = {
|
||||
unbindHelper:
|
||||
'قطع اتصال - در صورت قطع اتصال، همه قوانین دیواره آتش اضافه شده بیاثر میشوند. با احتیاط ادامه دهید. تأیید میکنید؟',
|
||||
portWhiteList: 'لیست سفید پورت',
|
||||
whitelistConfigHelper:
|
||||
'فهرست مجاز فقط تنظیمات را ذخیره میکند و از قوانین مجاز منطبق محافظت میکند. قوانین مفقود هنگام شروع، راهاندازی مجدد، مقداردهی اولیه یا همگامسازی اضافه میشوند. ویرایش یا حذف موارد فهرست مجاز، قوانین موجود را حذف نمیکند.',
|
||||
whitelistDeleteConfirm:
|
||||
'فقط این ورودی فهرست سفید حذف میشود. قوانین موجود فایروال باقی میمانند. ادامه میدهید؟',
|
||||
portWhiteListHelper:
|
||||
'یک پورت (مانند 80) یا بازهٔ پورت (مانند 8000-8100) وارد کنید. شمارهٔ پورت باید بین 1 و 65535 باشد.',
|
||||
chain: 'زنجیره',
|
||||
@@ -4269,10 +4273,8 @@ const message = {
|
||||
allPorts: 'همه پورتها',
|
||||
allProtocolHelper: 'همه پروتکلها و پورتها',
|
||||
sourceAddressPlaceholder: 'مثلاً: 172.16.10.11، 172.16.0.0/24، 2001:db8::1 یا 2001:db8::/64',
|
||||
systemAccessChangeConfirm:
|
||||
'این عملیات روی قوانین فهرست مجاز {0} ممکن است دسترسی راه دور از طریق این سرویسها را قطع کند. ادامه میدهید؟',
|
||||
whitelistServicePortsHelper:
|
||||
'یک درگاه مجاز برای دیواره آتش تنظیم کنید. درگاه شنود را در تنظیمات سرویس تغییر دهید.',
|
||||
'یک پورت (1-65535) وارد کنید. این کار پورت شنود سرویس را تغییر نمیدهد. تغییر پورت در تنظیمات سرویس، این ورودی فهرست سفید را نیز بهروزرسانی میکند.',
|
||||
whitelistSourcesHelper:
|
||||
'آدرسهای IP یا محدودههای CIDR را با ویرگول یا خط جدید جدا کنید. برای مجاز کردن همه مبدأهای IPv4 و IPv6، این قسمت را خالی بگذارید.',
|
||||
destinationPortPlaceholder: 'مثلاً: 80، 80,443 یا 8080-8089',
|
||||
|
||||
@@ -4092,7 +4092,7 @@ const message = {
|
||||
externalHelper:
|
||||
'システムに存在しますが、まだ 1Panel の管理対象ではありません。必要に応じて管理対象にできます。',
|
||||
protected: 'システム保護',
|
||||
protectedHelper: 'アクセスへの影響を防ぐため、編集や削除ができない重要なシステムルールです。',
|
||||
protectedHelper: '組み込みルールとホワイトリストに完全一致するルールは編集・削除できません。',
|
||||
stateShort: { managed: 'パネル', adopted: '管理済', external: '外部', protected: '保護', drifted: '差異' },
|
||||
ruleTargetRequired: 'IP アドレスまたはポートを1つ以上入力してください',
|
||||
resolution_adopt: '管理対象にする',
|
||||
@@ -4283,6 +4283,10 @@ const message = {
|
||||
unbindHelper:
|
||||
'アンバインド - アンバインドすると、追加されたすべてのファイアウォールルールが無効になります。注意して操作してください。確認しますか?',
|
||||
portWhiteList: 'ポートホワイトリスト',
|
||||
whitelistConfigHelper:
|
||||
'許可リストは設定の保存と一致する許可ルールの保護のみを行います。不足するルールは起動、再起動、初期化、同期時に追加されます。許可リストを編集・削除しても既存のルールは削除されません。',
|
||||
whitelistDeleteConfirm:
|
||||
'このホワイトリスト項目のみを削除します。既存のファイアウォールルールは保持されます。続行しますか?',
|
||||
portWhiteListHelper:
|
||||
'単一ポート(例:80)またはポート範囲(例:8000-8100)を入力してください。ポート番号は 1~65535 です。',
|
||||
chain: 'チェーン',
|
||||
@@ -4295,10 +4299,8 @@ const message = {
|
||||
allPorts: 'すべてのポート',
|
||||
allProtocolHelper: 'すべてのプロトコルとポート',
|
||||
sourceAddressPlaceholder: '例: 172.16.10.11、172.16.0.0/24、2001:db8::1、2001:db8::/64',
|
||||
systemAccessChangeConfirm:
|
||||
'この操作を {0} の許可リストルールに適用すると、これらのサービス経由のリモートアクセスができなくなる可能性があります。続行しますか?',
|
||||
whitelistServicePortsHelper:
|
||||
'ファイアウォールで許可するポートを1つ設定します。待ち受けポートは各サービスの設定で変更してください。',
|
||||
'ポートを1つ入力してください(1-65535)。サービスの待受ポートは変更されません。サービス設定でポートを変更すると、このホワイトリスト項目も更新されます。',
|
||||
whitelistSourcesHelper:
|
||||
'IP アドレスまたは CIDR をカンマか改行で区切って入力してください。 空欄の場合、すべての IPv4 および IPv6 の接続元を許可します。',
|
||||
destinationPortPlaceholder: '例: 80、80,443、8080-8089',
|
||||
|
||||
@@ -4017,7 +4017,7 @@ const message = {
|
||||
externalHelper:
|
||||
'시스템에 존재하지만 아직 1Panel에서 관리하지 않는 규칙이며 필요할 때 관리 대상으로 전환할 수 있습니다.',
|
||||
protected: '시스템 보호',
|
||||
protectedHelper: '접속 장애를 방지하기 위해 편집하거나 삭제할 수 없는 중요한 시스템 규칙입니다.',
|
||||
protectedHelper: '기본 제공 규칙과 화이트리스트에 정확히 일치하는 규칙은 편집하거나 삭제할 수 없습니다.',
|
||||
stateShort: { managed: '패널', adopted: '관리', external: '외부', protected: '보호', drifted: '불일치' },
|
||||
ruleTargetRequired: 'IP 주소 또는 포트를 하나 이상 입력하세요',
|
||||
resolution_adopt: '관리 대상으로 전환',
|
||||
@@ -4204,6 +4204,9 @@ const message = {
|
||||
unbindHelper:
|
||||
'바인딩 해제 - 바인딩 해제 시 추가된 모든 방화벽 규칙이 무효화됩니다. 주의하여 진행하세요. 확인하시겠습니까?',
|
||||
portWhiteList: '포트 화이트리스트',
|
||||
whitelistConfigHelper:
|
||||
'허용 목록은 설정만 저장하고 일치하는 허용 규칙을 보호합니다. 누락된 규칙은 시작, 재시작, 초기화 또는 동기화 시 추가됩니다. 허용 목록을 편집하거나 삭제해도 기존 규칙은 삭제되지 않습니다.',
|
||||
whitelistDeleteConfirm: '이 화이트리스트 항목만 삭제됩니다. 기존 방화벽 규칙은 유지됩니다. 계속하시겠습니까?',
|
||||
portWhiteListHelper:
|
||||
'단일 포트(예: 80) 또는 포트 범위(예: 8000-8100)를 입력하세요. 포트 번호는 1~65535여야 합니다.',
|
||||
chain: '체인',
|
||||
@@ -4216,10 +4219,8 @@ const message = {
|
||||
allPorts: '모든 포트',
|
||||
allProtocolHelper: '모든 프로토콜 및 포트',
|
||||
sourceAddressPlaceholder: '예: 172.16.10.11, 172.16.0.0/24, 2001:db8::1 또는 2001:db8::/64',
|
||||
systemAccessChangeConfirm:
|
||||
'이 작업을 {0} 허용 목록 규칙에 적용하면 해당 서비스를 통한 원격 접속이 불가능해질 수 있습니다. 계속하시겠습니까?',
|
||||
whitelistServicePortsHelper:
|
||||
'방화벽에서 허용할 포트 하나를 설정합니다. 수신 포트는 해당 서비스 설정에서 변경하세요.',
|
||||
'포트 하나를 입력하세요(1-65535). 서비스의 수신 포트는 변경되지 않습니다. 서비스 설정에서 포트를 변경하면 이 화이트리스트 항목도 업데이트됩니다.',
|
||||
whitelistSourcesHelper:
|
||||
'IP 주소 또는 CIDR 대역을 쉼표나 줄바꿈으로 구분하세요. 비워 두면 모든 IPv4 및 IPv6 출발지를 허용합니다.',
|
||||
destinationPortPlaceholder: '예: 80, 80,443 또는 8080-8089',
|
||||
|
||||
@@ -3988,7 +3988,7 @@ const message = {
|
||||
external: 'ກົດພາຍນອກ',
|
||||
externalHelper: 'ກົດທີ່ມີຢູ່ໃນລະບົບແຕ່ 1Panel ຍັງບໍ່ໄດ້ຈັດການ ແລະ ສາມາດຮັບເຂົ້າຈັດການໄດ້ເມື່ອຈຳເປັນ.',
|
||||
protected: 'ລະບົບປົກປ້ອງ',
|
||||
protectedHelper: 'ກົດສຳຄັນຂອງລະບົບທີ່ບໍ່ສາມາດແກ້ໄຂ ຫຼື ລຶບໄດ້ ເພື່ອຫຼີກລ້ຽງການຂັດຂວາງການເຂົ້າເຖິງ.',
|
||||
protectedHelper: 'ກົດທີ່ມີໃນລະບົບ ແລະ ກົດທີ່ກົງກັບບັນຊີຂາວທຸກປະການ ບໍ່ສາມາດແກ້ໄຂ ຫຼື ລຶບໄດ້.',
|
||||
stateShort: { managed: 'ແຜງ', adopted: 'ຈັດການ', external: 'ພາຍນອກ', protected: 'ປົກປ້ອງ', drifted: 'ບໍ່ກົງ' },
|
||||
ruleTargetRequired: 'ກະລຸນາປ້ອນ IP ຫຼື ພອດຢ່າງໜ້ອຍໜຶ່ງລາຍການ',
|
||||
resolution_adopt: 'ຮັບເຂົ້າຈັດການ',
|
||||
@@ -4169,6 +4169,9 @@ const message = {
|
||||
unbindHelper:
|
||||
'ຍົກເລີກການຜູກມັດ - ເມື່ອຍົກເລີກ, ກົດລະບຽບໄຟວໍທັງໝົດຈະບໍ່ມີຜົນ. ກະລຸນາເຮັດດ້ວຍຄວາມລະມັດລະວັງ. ຢືນຢັນ?',
|
||||
portWhiteList: 'ພອດທີ່ອະນຸຍາດ',
|
||||
whitelistConfigHelper:
|
||||
'ລາຍການອະນຸຍາດບັນທຶກສະເພາະການຕັ້ງຄ່າ ແລະ ປົກປ້ອງກົດອະນຸຍາດທີ່ກົງກັນ. ກົດທີ່ຂາດຈະຖືກເພີ່ມເມື່ອເລີ່ມ, ເລີ່ມໃໝ່, ຕັ້ງຄ່າເບື້ອງຕົ້ນ ຫຼື ຊິງຂໍ້ມູນ. ການແກ້ໄຂ ຫຼື ລຶບລາຍການອະນຸຍາດຈະບໍ່ລຶບກົດທີ່ມີຢູ່.',
|
||||
whitelistDeleteConfirm: 'ຈະລຶບສະເພາະລາຍການບັນຊີຂາວນີ້. ກົດໄຟວໍທີ່ມີຢູ່ຈະຖືກເກັບໄວ້. ສືບຕໍ່ບໍ?',
|
||||
portWhiteListHelper: 'ປ້ອນພອດດຽວ (ເຊັ່ນ 80) ຫຼື ຊ່ວງພອດ (ເຊັ່ນ 8000-8100). ໝາຍເລກພອດຕ້ອງຢູ່ລະຫວ່າງ 1 ຫາ 65535.',
|
||||
chain: 'Chain',
|
||||
sourceIP: 'IP ຕົ້ນທາງ',
|
||||
@@ -4180,9 +4183,8 @@ const message = {
|
||||
allPorts: 'ທຸກໆພອດ',
|
||||
allProtocolHelper: 'ໂປຣໂຕຄໍ ແລະ ພອດທັງໝົດ',
|
||||
sourceAddressPlaceholder: 'ຕົວຢ່າງ: 172.16.10.11, 172.16.0.0/24, 2001:db8::1 ຫຼື 2001:db8::/64',
|
||||
systemAccessChangeConfirm:
|
||||
'ການດຳເນີນການນີ້ກັບກົດລາຍຊື່ອະນຸຍາດ {0} ອາດເຮັດໃຫ້ບໍ່ສາມາດເຂົ້າເຖິງທາງໄກຜ່ານບໍລິການເຫຼົ່ານີ້. ສືບຕໍ່ບໍ?',
|
||||
whitelistServicePortsHelper: 'ຕັ້ງຄ່າໜຶ່ງພອດທີ່ໄຟວໍອະນຸຍາດ. ປ່ຽນພອດຮັບຟັງໃນການຕັ້ງຄ່າບໍລິການ.',
|
||||
whitelistServicePortsHelper:
|
||||
'ປ້ອນພອດດຽວ (1-65535). ການຕັ້ງຄ່ານີ້ຈະບໍ່ປ່ຽນພອດຮັບຟັງຂອງບໍລິການ. ເມື່ອປ່ຽນພອດໃນການຕັ້ງຄ່າບໍລິການ, ລາຍການບັນຊີຂາວນີ້ຈະຖືກອັບເດດດ້ວຍ.',
|
||||
whitelistSourcesHelper:
|
||||
'ປ້ອນທີ່ຢູ່ IP ຫຼື CIDR ໂດຍແຍກດ້ວຍຈຸດຈ້ຳ ຫຼື ຂຶ້ນແຖວໃໝ່. ຖ້າປະໄວ້ຫວ່າງ ຈະອະນຸຍາດທຸກແຫຼ່ງທີ່ມາ IPv4 ແລະ IPv6.',
|
||||
destinationPortPlaceholder: 'ຕົວຢ່າງ: 80, 80,443 ຫຼື 8080-8089',
|
||||
|
||||
@@ -4168,7 +4168,7 @@ const message = {
|
||||
'Peraturan sistem sedia ada yang belum diurus oleh 1Panel. Ia boleh diambil alih apabila diperlukan.',
|
||||
protected: 'Dilindungi sistem',
|
||||
protectedHelper:
|
||||
'Peraturan sistem kritikal yang tidak boleh diedit atau dipadam untuk mengelakkan gangguan akses.',
|
||||
'Peraturan terbina dalam dan peraturan yang sepadan tepat dengan senarai putih tidak boleh diedit atau dipadam.',
|
||||
stateShort: {
|
||||
managed: 'Panel',
|
||||
adopted: 'Terurus',
|
||||
@@ -4367,6 +4367,10 @@ const message = {
|
||||
unbindHelper:
|
||||
'Nyahikat - Apabila tidak terikat, semua peraturan firewall yang ditambah akan menjadi tidak sah. Teruskan dengan berhati-hati. Sahkan?',
|
||||
portWhiteList: 'Senarai putih port',
|
||||
whitelistConfigHelper:
|
||||
'Senarai dibenarkan hanya menyimpan konfigurasi dan melindungi peraturan kebenaran yang sepadan. Peraturan yang tiada ditambah semasa mula, mula semula, pemulaan atau penyegerakan. Mengedit atau memadam entri tidak membuang peraturan sedia ada.',
|
||||
whitelistDeleteConfirm:
|
||||
'Hanya entri senarai putih ini akan dipadam. Peraturan tembok api sedia ada akan dikekalkan. Teruskan?',
|
||||
portWhiteListHelper:
|
||||
'Masukkan satu port (cth. 80) atau julat port (cth. 8000-8100). Nombor port mestilah antara 1 hingga 65535.',
|
||||
chain: 'Rantai',
|
||||
@@ -4379,10 +4383,8 @@ const message = {
|
||||
allPorts: 'Semua Port',
|
||||
allProtocolHelper: 'Semua protokol dan port',
|
||||
sourceAddressPlaceholder: 'contoh: 172.16.10.11, 172.16.0.0/24, 2001:db8::1 atau 2001:db8::/64',
|
||||
systemAccessChangeConfirm:
|
||||
'Operasi ini pada peraturan senarai dibenarkan {0} mungkin menghalang akses jauh melalui perkhidmatan tersebut. Teruskan?',
|
||||
whitelistServicePortsHelper:
|
||||
'Tetapkan satu port yang dibenarkan oleh tembok api. Urus port pendengar dalam tetapan perkhidmatan.',
|
||||
'Masukkan satu port (1-65535). Ini tidak mengubah port pendengaran perkhidmatan. Menukar port dalam tetapan perkhidmatan turut mengemas kini entri senarai putih ini.',
|
||||
whitelistSourcesHelper:
|
||||
'Masukkan alamat IP atau julat CIDR, dipisahkan dengan koma atau baris baharu. Biarkan kosong untuk membenarkan semua sumber IPv4 dan IPv6.',
|
||||
destinationPortPlaceholder: 'contoh: 80, 80,443 atau 8080-8089',
|
||||
|
||||
@@ -4187,7 +4187,7 @@ const message = {
|
||||
'Regra existente do sistema que ainda não é gerenciada pelo 1Panel. Pode ser adotada quando necessário.',
|
||||
protected: 'Protegida pelo sistema',
|
||||
protectedHelper:
|
||||
'Regra crítica do sistema que não pode ser editada ou excluída para evitar interrupções de acesso.',
|
||||
'As regras integradas e as que correspondem exatamente à lista de permissões não podem ser editadas nem excluídas.',
|
||||
stateShort: {
|
||||
managed: 'Painel',
|
||||
adopted: 'Gerenciada',
|
||||
@@ -4389,6 +4389,10 @@ const message = {
|
||||
unbindHelper:
|
||||
'Desvincular - Quando desvinculado, todas as regras de firewall adicionadas se tornarão inválidas. Prossiga com cautela. Confirmar?',
|
||||
portWhiteList: 'Lista branca de portas',
|
||||
whitelistConfigHelper:
|
||||
'A lista de permissões apenas salva a configuração e protege as regras de permissão correspondentes. As regras ausentes são adicionadas ao iniciar, reiniciar, inicializar ou sincronizar. Editar ou excluir entradas não remove as regras existentes.',
|
||||
whitelistDeleteConfirm:
|
||||
'Apenas esta entrada da lista de permissões será excluída. As regras existentes do firewall serão mantidas. Continuar?',
|
||||
portWhiteListHelper:
|
||||
'Insira uma porta (ex.: 80) ou um intervalo (ex.: 8000-8100). Os números das portas devem estar entre 1 e 65535.',
|
||||
chain: 'Cadeia',
|
||||
@@ -4401,10 +4405,8 @@ const message = {
|
||||
allPorts: 'Todas as Portas',
|
||||
allProtocolHelper: 'Todos os protocolos e portas',
|
||||
sourceAddressPlaceholder: 'por exemplo: 172.16.10.11, 172.16.0.0/24, 2001:db8::1 ou 2001:db8::/64',
|
||||
systemAccessChangeConfirm:
|
||||
'Esta operação nas regras da lista de permissões de {0} pode impedir o acesso remoto por esses serviços. Continuar?',
|
||||
whitelistServicePortsHelper:
|
||||
'Defina uma única porta permitida pelo firewall. Gerencie a porta de escuta nas configurações do serviço.',
|
||||
'Informe uma única porta (1-65535). Isso não altera a porta de escuta do serviço. Alterar a porta nas configurações do serviço também atualiza esta entrada da lista de permissões.',
|
||||
whitelistSourcesHelper:
|
||||
'Insira endereços IP ou intervalos CIDR separados por vírgulas ou quebras de linha. Deixe em branco para permitir todas as origens IPv4 e IPv6.',
|
||||
destinationPortPlaceholder: 'por exemplo: 80, 80,443 ou 8080-8089',
|
||||
|
||||
@@ -4154,7 +4154,7 @@ const message = {
|
||||
'Существующее системное правило, которое пока не управляется 1Panel. При необходимости его можно принять под управление.',
|
||||
protected: 'Защищено системой',
|
||||
protectedHelper:
|
||||
'Критически важное системное правило, которое нельзя изменить или удалить во избежание потери доступа.',
|
||||
'Встроенные правила и правила, точно совпадающие с белым списком, нельзя изменять или удалять.',
|
||||
stateShort: {
|
||||
managed: 'Панель',
|
||||
adopted: 'Принято',
|
||||
@@ -4355,6 +4355,10 @@ const message = {
|
||||
unbindHelper:
|
||||
'Отвязать - При отвязке все добавленные правила брандмауэра станут недействительными. Действуйте осторожно. Подтвердить?',
|
||||
portWhiteList: 'Белый список портов',
|
||||
whitelistConfigHelper:
|
||||
'Список разрешений только сохраняет настройки и защищает совпадающие разрешающие правила. Недостающие правила добавляются при запуске, перезапуске, инициализации или синхронизации. Изменение или удаление записей списка не удаляет существующие правила.',
|
||||
whitelistDeleteConfirm:
|
||||
'Будет удалена только эта запись белого списка. Существующие правила брандмауэра сохранятся. Продолжить?',
|
||||
portWhiteListHelper:
|
||||
'Введите один порт (например, 80) или диапазон портов (например, 8000-8100). Номера портов должны быть от 1 до 65535.',
|
||||
chain: 'Цепочка',
|
||||
@@ -4367,10 +4371,8 @@ const message = {
|
||||
allPorts: 'Все Порта',
|
||||
allProtocolHelper: 'Все протоколы и порты',
|
||||
sourceAddressPlaceholder: 'например: 172.16.10.11, 172.16.0.0/24, 2001:db8::1 или 2001:db8::/64',
|
||||
systemAccessChangeConfirm:
|
||||
'Эта операция с правилами белого списка {0} может привести к потере удалённого доступа через эти службы. Продолжить?',
|
||||
whitelistServicePortsHelper:
|
||||
'Укажите один порт, разрешённый брандмауэром. Порт прослушивания меняется в настройках службы.',
|
||||
'Введите один порт (1-65535). Порт прослушивания службы не изменится. Изменение порта в настройках службы также обновит эту запись белого списка.',
|
||||
whitelistSourcesHelper:
|
||||
'Введите IP-адреса или подсети CIDR через запятую или с новой строки. Оставьте поле пустым, чтобы разрешить все источники IPv4 и IPv6.',
|
||||
destinationPortPlaceholder: 'например: 80, 80,443 или 8080-8089',
|
||||
|
||||
@@ -4172,8 +4172,7 @@ const message = {
|
||||
externalHelper:
|
||||
'Sistemde bulunan ancak henüz 1Panel tarafından yönetilmeyen bir kuraldır. Gerektiğinde yönetime alınabilir.',
|
||||
protected: 'Sistem korumalı',
|
||||
protectedHelper:
|
||||
'Erişimin kesilmesini önlemek için düzenlenemeyen veya silinemeyen kritik bir sistem kuralıdır.',
|
||||
protectedHelper: 'Yerleşik kurallar ve beyaz listeyle tam olarak eşleşen kurallar düzenlenemez veya silinemez.',
|
||||
stateShort: {
|
||||
managed: 'Panel',
|
||||
adopted: 'Yönetilen',
|
||||
@@ -4371,6 +4370,10 @@ const message = {
|
||||
unbindHelper:
|
||||
'Bağlantıyı Kaldır - Bağlantı kaldırıldığında, eklenen tüm güvenlik duvarı kuralları geçersiz olacaktır. Dikkatli ilerleyin. Onaylıyor musunuz?',
|
||||
portWhiteList: 'Port beyaz listesi',
|
||||
whitelistConfigHelper:
|
||||
'İzin listesi yalnızca yapılandırmayı kaydeder ve eşleşen izin kurallarını korur. Eksik kurallar başlatma, yeniden başlatma, ilk yapılandırma veya eşitleme sırasında eklenir. İzin listesi girdilerini düzenlemek veya silmek mevcut kuralları kaldırmaz.',
|
||||
whitelistDeleteConfirm:
|
||||
'Yalnızca bu beyaz liste kaydı silinecek. Mevcut güvenlik duvarı kuralları korunacak. Devam edilsin mi?',
|
||||
portWhiteListHelper:
|
||||
'Tek bir port (ör. 80) veya port aralığı (ör. 8000-8100) girin. Port numaraları 1 ile 65535 arasında olmalıdır.',
|
||||
chain: 'Zincir',
|
||||
@@ -4383,10 +4386,8 @@ const message = {
|
||||
allPorts: 'Tüm Portlar',
|
||||
allProtocolHelper: 'Tüm protokoller ve portlar',
|
||||
sourceAddressPlaceholder: 'örn. 172.16.10.11, 172.16.0.0/24, 2001:db8::1 veya 2001:db8::/64',
|
||||
systemAccessChangeConfirm:
|
||||
'Bu işlemi {0} izin listesi kurallarına uygulamak, bu hizmetler üzerinden uzaktan erişimi engelleyebilir. Devam edilsin mi?',
|
||||
whitelistServicePortsHelper:
|
||||
'Güvenlik duvarının izin verdiği tek bir port ayarlayın. Dinleme portunu hizmet ayarlarından yönetin.',
|
||||
'Tek bir port girin (1-65535). Bu işlem hizmetin dinleme portunu değiştirmez. Hizmet ayarlarında port değiştirildiğinde bu beyaz liste kaydı da güncellenir.',
|
||||
whitelistSourcesHelper:
|
||||
'IP adreslerini veya CIDR aralıklarını virgül ya da yeni satırla ayırın. Tüm IPv4 ve IPv6 kaynaklarına izin vermek için boş bırakın.',
|
||||
destinationPortPlaceholder: 'örn. 80, 80,443 veya 8080-8089',
|
||||
|
||||
@@ -3830,7 +3830,7 @@ const message = {
|
||||
external: '外部規則',
|
||||
externalHelper: '尚未納入 1Panel 管理。',
|
||||
protected: '系統保護',
|
||||
protectedHelper: '系統關鍵規則,不可編輯或刪除。',
|
||||
protectedHelper: '系統內建或與白名單完全相符的規則,不可編輯或刪除。',
|
||||
stateShort: {
|
||||
managed: '面板建立',
|
||||
adopted: '外部納管',
|
||||
@@ -4008,6 +4008,9 @@ const message = {
|
||||
bindHelper: '綁定 僅當狀態為綁定時,防火牆規則才能生效,是否確認?',
|
||||
unbindHelper: '解除綁定 解除綁定時,已新增的所有防火牆規則將失效,請謹慎操作,是否確認?',
|
||||
portWhiteList: '埠白名單',
|
||||
whitelistConfigHelper:
|
||||
'白名單僅儲存設定並保護相符的放行規則。缺少的規則將於啟動、重新啟動、初始化或同步時補齊;編輯或刪除白名單不會刪除現有規則。',
|
||||
whitelistDeleteConfirm: '僅刪除此白名單設定,現有防火牆規則會保留。是否繼續?',
|
||||
portWhiteListHelper: '支援單一連接埠(如 80)或連接埠範圍(如 8000-8100),連接埠取值為 1-65535。',
|
||||
chain: '鏈',
|
||||
sourceIP: '來源 IP',
|
||||
@@ -4019,8 +4022,8 @@ const message = {
|
||||
allPorts: '所有埠',
|
||||
allProtocolHelper: '所有協定和連接埠',
|
||||
sourceAddressPlaceholder: '例如:172.16.10.11、172.16.0.0/24、2001:db8::1 或 2001:db8::/64',
|
||||
systemAccessChangeConfirm: '對 {0} 白名單規則執行此操作後,可能無法透過該服務遠端存取。是否繼續?',
|
||||
whitelistServicePortsHelper: '設定一個防火牆放行連接埠,服務監聽連接埠請在對應服務設定中修改。',
|
||||
whitelistServicePortsHelper:
|
||||
'手動填寫一個連接埠(1-65535),不會修改服務監聽連接埠。在服務設定中修改連接埠時,會同步更新此白名單設定。',
|
||||
whitelistSourcesHelper: '支援 IP 或 CIDR,多個以逗號或換行分隔。留空預設允許所有 IPv4 和 IPv6 來源。',
|
||||
destinationPortPlaceholder: '例如:80、80,443 或 8080-8089',
|
||||
deleteRuleConfirm: '將刪除 {0} 條規則,是否繼續?',
|
||||
|
||||
@@ -3876,7 +3876,7 @@ const message = {
|
||||
external: '外部规则',
|
||||
externalHelper: '尚未纳入 1Panel 管理。',
|
||||
protected: '系统保护',
|
||||
protectedHelper: '系统关键规则,不可编辑或删除。',
|
||||
protectedHelper: '系统内置或与白名单完全匹配的规则,不可编辑或删除。',
|
||||
stateShort: {
|
||||
managed: '面板创建',
|
||||
adopted: '外部纳管',
|
||||
@@ -3955,7 +3955,7 @@ const message = {
|
||||
alreadyExistsInTarget: '防火墙中已存在相同规则,无需重复添加。',
|
||||
onlyInTarget: '该规则只存在于当前防火墙中。',
|
||||
stale: '检查后防火墙状态已发生变化,请刷新后重试。',
|
||||
protectedRule: '这是保证系统正常运行的必要规则,不能修改。',
|
||||
protectedRule: '该防火墙规则受到保护,不能修改。',
|
||||
dockerAcceptReadOnly:
|
||||
'该 ACCEPT 规则为只读、不可同步;同步其他规则时会保留该规则。如需移除,请在主机上手动删除。',
|
||||
cannotReconcile: '该规则无法自动同步:{0}',
|
||||
@@ -4056,6 +4056,9 @@ const message = {
|
||||
bindHelper: '绑定 仅当状态为绑定时,防火墙规则才能生效,是否确认?',
|
||||
unbindHelper: '解绑 解除绑定时,已添加的所有防火墙规则将失效,请谨慎操作,是否确认?',
|
||||
portWhiteList: '端口白名单',
|
||||
whitelistConfigHelper:
|
||||
'白名单仅保存配置并保护匹配的放行规则。缺失规则将在启动、重启、初始化或同步时补齐;编辑或删除白名单不会删除已有规则。',
|
||||
whitelistDeleteConfirm: '仅删除这条白名单配置,已有防火墙规则会保留。是否继续?',
|
||||
portWhiteListHelper: '支持单个端口(如 80)或端口范围(如 8000-8100),端口取值为 1-65535。',
|
||||
chain: '链',
|
||||
sourceIP: '源 IP',
|
||||
@@ -4067,8 +4070,8 @@ const message = {
|
||||
allPorts: '所有端口',
|
||||
allProtocolHelper: '所有协议和端口',
|
||||
sourceAddressPlaceholder: '例如:172.16.10.11、172.16.0.0/24、2001:db8::1 或 2001:db8::/64',
|
||||
systemAccessChangeConfirm: '对 {0} 白名单规则执行此操作后,可能无法通过该服务远程访问。是否继续?',
|
||||
whitelistServicePortsHelper: '设置一个防火墙放行端口,服务监听端口请在对应服务设置中修改。',
|
||||
whitelistServicePortsHelper:
|
||||
'手动填写一个端口(1-65535),不会修改服务监听端口。在服务设置中修改端口时,会同步更新此白名单配置。',
|
||||
whitelistSourcesHelper: '支持 IP 或 CIDR,多个以逗号或换行分隔。留空默认允许所有 IPv4 和 IPv6 来源。',
|
||||
destinationPortPlaceholder: '例如:80、80,443 或 8080-8089',
|
||||
deleteRuleConfirm: '将删除 {0} 条规则,是否继续?',
|
||||
|
||||
@@ -75,7 +75,10 @@
|
||||
</el-button>
|
||||
<el-button
|
||||
v-permission
|
||||
:disabled="loading || managedTotal === 0"
|
||||
:disabled="
|
||||
loading ||
|
||||
(selects.length > 0 ? !selects.some(isDeletableManagedRule) : managedTotal === 0)
|
||||
"
|
||||
@click="exportRulesBySelection"
|
||||
>
|
||||
{{ $t('commons.button.export') }}
|
||||
@@ -187,7 +190,7 @@
|
||||
row-key="rowKey"
|
||||
@search="searchPage"
|
||||
>
|
||||
<el-table-column type="selection" :selectable="isDeletableManagedRule" width="48" fix />
|
||||
<el-table-column type="selection" :selectable="isDeletableRule" width="48" fix />
|
||||
<el-table-column :label="$t('firewall.action')" width="76">
|
||||
<template #default="{ row }">
|
||||
<span
|
||||
@@ -1047,7 +1050,7 @@ const exportRules = async (rows: RuleRow[]) => {
|
||||
|
||||
const exportRulesBySelection = async () => {
|
||||
const selected = selects.value.filter((row) => isDeletableManagedRule(row));
|
||||
if (selected.length > 0) return exportRules(selected);
|
||||
if (selects.value.length > 0) return exportRules(selected);
|
||||
const allManagedRules = toRuleRows(await loadAllInventoryItems()).filter((row) => isDeletableManagedRule(row));
|
||||
return exportRules(allManagedRules);
|
||||
};
|
||||
@@ -1067,13 +1070,13 @@ const usageOwnersSummary = (owners: string[]) => {
|
||||
};
|
||||
|
||||
const deleteRulesConfirmMessage = (selected: RuleRow[]) => {
|
||||
const count = new Set(selected.map((row) => row.desired?.uuid)).size;
|
||||
const count = new Set(selected.map((row) => row.desired?.uuid || row.observed?.instanceKey)).size;
|
||||
const accepted = selected.filter((row) => row.rule.action === 'accept' && Boolean(row.observed));
|
||||
const risky = accepted.filter((row) => isWildcardDestinationPort(row.rule) || ruleUsageEntries(row).length > 0);
|
||||
if (selected.length > 1 && risky.length > 0) {
|
||||
return i18n.global.t('firewall.deleteRiskRulesConfirm', [
|
||||
count,
|
||||
new Set(risky.map((row) => row.desired?.uuid)).size,
|
||||
new Set(risky.map((row) => row.desired?.uuid || row.observed?.instanceKey)).size,
|
||||
]);
|
||||
}
|
||||
if (selected.length === 1 && accepted.length === 1) {
|
||||
@@ -1108,19 +1111,24 @@ const removeRules = async (selected: RuleRow[]) => {
|
||||
}
|
||||
loading.value = true;
|
||||
const uuids = [...new Set(selected.flatMap((row) => (row.desired?.uuid ? [row.desired.uuid] : [])))];
|
||||
const beforeRules = selected.filter(isDeletableBeforeRule).map((row) => ({
|
||||
scope: row.rule.scope,
|
||||
instanceKey: row.observed.instanceKey,
|
||||
}));
|
||||
const count = uuids.length + beforeRules.length;
|
||||
try {
|
||||
if (uuids.length === 0) return;
|
||||
const { taskID, queued, succeeded, failed } = (await deleteFirewallRules({ uuids })).data;
|
||||
if (count === 0) return;
|
||||
const { taskID, queued, succeeded, failed } = (await deleteFirewallRules({ uuids, beforeRules })).data;
|
||||
if (queued && taskID) {
|
||||
selects.value = [];
|
||||
openRuleTask(taskID);
|
||||
return;
|
||||
}
|
||||
if (succeeded > 0) {
|
||||
MsgSuccess(`${i18n.global.t('commons.msg.operationSuccess')} (${succeeded}/${uuids.length})`);
|
||||
MsgSuccess(`${i18n.global.t('commons.msg.operationSuccess')} (${succeeded}/${count})`);
|
||||
}
|
||||
if (failed > 0) {
|
||||
MsgError(`${i18n.global.t('commons.msg.operationFailed')} (${failed}/${uuids.length})`);
|
||||
MsgError(`${i18n.global.t('commons.msg.operationFailed')} (${failed}/${count})`);
|
||||
}
|
||||
await search();
|
||||
} finally {
|
||||
@@ -1128,7 +1136,7 @@ const removeRules = async (selected: RuleRow[]) => {
|
||||
}
|
||||
};
|
||||
|
||||
const removeSelectedRules = () => removeRules(selects.value.filter((row) => isDeletableManagedRule(row)));
|
||||
const removeSelectedRules = () => removeRules(selects.value.filter((row) => isDeletableRule(row)));
|
||||
|
||||
const resetRules = () => {
|
||||
withDockerRestart.value = false;
|
||||
@@ -1242,6 +1250,19 @@ const isDeletableManagedRule = (row: Firewall.InventoryItem) =>
|
||||
row.state !== 'protected' &&
|
||||
(row.state !== 'drifted' || isMissingManagedRule(row));
|
||||
|
||||
const isDeletableBeforeRule = (
|
||||
row: Firewall.InventoryItem,
|
||||
): row is Firewall.InventoryItem & { observed: Firewall.ObservedRule & { instanceKey: string } } =>
|
||||
(row.rule.scope.provider === 'iptables' || row.rule.scope.provider === 'nftables') &&
|
||||
row.rule.scope.chain === '1PANEL_BASIC_BEFORE' &&
|
||||
!row.desired &&
|
||||
row.state !== 'protected' &&
|
||||
row.observed?.parseStatus === 'supported' &&
|
||||
!row.observed.protected &&
|
||||
Boolean(row.observed.instanceKey);
|
||||
|
||||
const isDeletableRule = (row: Firewall.InventoryItem) => isDeletableManagedRule(row) || isDeletableBeforeRule(row);
|
||||
|
||||
const displayRulePriority = (row: Firewall.InventoryItem) => {
|
||||
if (row.rule.scope.provider === 'firewalld') {
|
||||
if (!supportsFirewalldPriority.value || row.rule.nativeKind !== 'rich_rule') return '-';
|
||||
@@ -1280,7 +1301,10 @@ const operationButtons = [
|
||||
label: i18n.global.t('firewall.resolution_adopt'),
|
||||
permission: true,
|
||||
nodeAdmin: true,
|
||||
show: (row: RuleRow) => row.state === 'external' && row.observed?.parseStatus === 'supported',
|
||||
show: (row: RuleRow) =>
|
||||
row.state === 'external' &&
|
||||
row.observed?.parseStatus === 'supported' &&
|
||||
!isIptablesSystemPresetScope(row.rule.scope),
|
||||
click: adoptRule,
|
||||
},
|
||||
{
|
||||
@@ -1294,7 +1318,7 @@ const operationButtons = [
|
||||
label: i18n.global.t('commons.button.delete'),
|
||||
permission: true,
|
||||
nodeAdmin: true,
|
||||
show: (row: RuleRow) => isDeletableManagedRule(row),
|
||||
show: (row: RuleRow) => isDeletableRule(row),
|
||||
click: removeRule,
|
||||
},
|
||||
];
|
||||
|
||||
@@ -105,9 +105,8 @@
|
||||
:panel-port="settings?.panelPort"
|
||||
:ssh-port="settings?.sshPort"
|
||||
:loading="loading"
|
||||
@created="openWhitelistTask"
|
||||
@saved="load"
|
||||
/>
|
||||
<TaskLog ref="whitelistTaskRef" @close="load" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -117,7 +116,6 @@ import { Firewall } from '@/api/interface/firewall';
|
||||
import { loadFirewallSettings, operateFire, operateFirewallBackend } from '@/api/modules/firewall';
|
||||
import FireRouter from '@/views/host/firewall/index.vue';
|
||||
import WhiteList from '@/views/host/firewall/setting/white-list/index.vue';
|
||||
import TaskLog from '@/components/log/task/index.vue';
|
||||
import { useGlobalStore } from '@/composables/useGlobalStore';
|
||||
import i18n from '@/lang';
|
||||
import { MsgError, MsgSuccess } from '@/utils/message';
|
||||
@@ -135,8 +133,6 @@ const savedBackends = ref<Record<Firewall.BackendSubsystem, string>>({
|
||||
const pingStatus = ref('Disable');
|
||||
const oldPingStatus = ref('Disable');
|
||||
const whiteListRef = ref<InstanceType<typeof WhiteList>>();
|
||||
const whitelistTaskRef = ref<InstanceType<typeof TaskLog>>();
|
||||
const openWhitelistTask = (taskID: string) => whitelistTaskRef.value?.openWithTaskID(taskID, true);
|
||||
const openWhitelist = () => {
|
||||
whiteListRef.value?.acceptParams();
|
||||
load();
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<template>
|
||||
<DrawerPro v-model="drawerVisible" :header="$t('firewall.portWhiteList')" size="large">
|
||||
<template #content>
|
||||
<p class="input-help mb-3">{{ $t('firewall.whitelistConfigHelper') }}</p>
|
||||
<div class="mb-3">
|
||||
<el-button type="primary" :disabled="disabled" @click="openEditor()">
|
||||
{{ $t('commons.button.create') }}
|
||||
@@ -77,7 +78,7 @@
|
||||
<span class="input-help">{{ $t('firewall.portWhiteListHelper') }}</span>
|
||||
</el-form-item>
|
||||
</template>
|
||||
<el-form-item v-else-if="editingRule" :label="$t('commons.table.port')" prop="port">
|
||||
<el-form-item v-else :label="$t('commons.table.port')" prop="port">
|
||||
<el-input v-model.trim="form.port" :placeholder="form.type === 'ssh' ? '2222' : '18443'" clearable />
|
||||
<span class="input-help">{{ $t('firewall.whitelistServicePortsHelper') }}</span>
|
||||
</el-form-item>
|
||||
@@ -108,7 +109,7 @@ import {
|
||||
updateFirewallPortWhitelist,
|
||||
} from '@/api/modules/firewall';
|
||||
import i18n from '@/lang';
|
||||
import { MsgError } from '@/utils/message';
|
||||
import { MsgError, MsgSuccess } from '@/utils/message';
|
||||
import {
|
||||
formatHostAddressList,
|
||||
isValidIPOrCIDR,
|
||||
@@ -124,7 +125,7 @@ const props = defineProps<{
|
||||
sshPort?: string;
|
||||
loading: boolean;
|
||||
}>();
|
||||
const emit = defineEmits<{ (e: 'created', taskID: string): void }>();
|
||||
const emit = defineEmits<{ (e: 'saved'): void }>();
|
||||
const drawerVisible = ref(false);
|
||||
const dialogVisible = ref(false);
|
||||
const saving = ref(false);
|
||||
@@ -207,7 +208,7 @@ const saveRule = async () => {
|
||||
rule = normalizeWhiteListRule({
|
||||
...form.value,
|
||||
type: form.value.type === 'custom' ? undefined : form.value.type,
|
||||
port: form.value.type === 'custom' || editingRule.value ? form.value.port : undefined,
|
||||
port: form.value.port,
|
||||
sources,
|
||||
});
|
||||
} catch {
|
||||
@@ -220,56 +221,33 @@ const saveRule = async () => {
|
||||
return;
|
||||
}
|
||||
const oldRule = editingRule.value;
|
||||
await submit(
|
||||
() => (oldRule ? updateFirewallPortWhitelist({ oldRule, rule }) : createFirewallPortWhitelist(rule)),
|
||||
oldRule ? { operation: 'edit', rule: oldRule } : undefined,
|
||||
);
|
||||
await submit(() => (oldRule ? updateFirewallPortWhitelist({ oldRule, rule }) : createFirewallPortWhitelist(rule)));
|
||||
};
|
||||
|
||||
const removeRule = async (rule: WhiteListRule) => {
|
||||
await submit(() => deleteFirewallPortWhitelist(rule), { operation: 'delete', rule });
|
||||
if (disabled.value) return;
|
||||
const confirmed = await ElMessageBox.confirm(
|
||||
i18n.global.t('firewall.whitelistDeleteConfirm'),
|
||||
i18n.global.t('commons.button.delete'),
|
||||
{
|
||||
confirmButtonText: i18n.global.t('commons.button.confirm'),
|
||||
cancelButtonText: i18n.global.t('commons.button.cancel'),
|
||||
type: 'warning',
|
||||
},
|
||||
)
|
||||
.then(() => true)
|
||||
.catch(() => false);
|
||||
if (confirmed) await submit(() => deleteFirewallPortWhitelist(rule));
|
||||
};
|
||||
|
||||
const submit = async (
|
||||
request: () => ReturnType<typeof createFirewallPortWhitelist>,
|
||||
change?: { operation: 'edit' | 'delete'; rule: WhiteListRule },
|
||||
) => {
|
||||
const submit = async (request: () => ReturnType<typeof createFirewallPortWhitelist>) => {
|
||||
if (disabled.value) return;
|
||||
saving.value = true;
|
||||
try {
|
||||
if (change && (change.operation === 'delete' || change.rule.type)) {
|
||||
const messages: string[] = [];
|
||||
if (change.operation !== 'delete' || !change.rule.type) {
|
||||
messages.push(
|
||||
change.operation === 'delete'
|
||||
? i18n.global.t('commons.msg.delete')
|
||||
: i18n.global.t('firewall.editRuleConfirm'),
|
||||
);
|
||||
}
|
||||
if (change.rule.type) {
|
||||
const service = `${serviceLabel(change.rule.type)} (${change.rule.port || servicePortLabel(change.rule.type)} / ${(change.rule.protocol || 'tcp').toUpperCase()})`;
|
||||
messages.push(i18n.global.t('firewall.systemAccessChangeConfirm', [service]));
|
||||
}
|
||||
const confirmed = await ElMessageBox.confirm(
|
||||
messages.join('\n'),
|
||||
i18n.global.t(`commons.button.${change.operation}`),
|
||||
{
|
||||
confirmButtonText: i18n.global.t('commons.button.confirm'),
|
||||
cancelButtonText: i18n.global.t('commons.button.cancel'),
|
||||
type: 'warning',
|
||||
},
|
||||
)
|
||||
.then(() => true)
|
||||
.catch(() => false);
|
||||
if (!confirmed) return;
|
||||
}
|
||||
const { data: result } = await request();
|
||||
if (!result.taskID || !result.queued) {
|
||||
MsgError(i18n.global.t('commons.msg.operationFailed'));
|
||||
return;
|
||||
}
|
||||
await request();
|
||||
dialogVisible.value = false;
|
||||
emit('created', result.taskID);
|
||||
MsgSuccess(i18n.global.t('commons.msg.operationSuccess'));
|
||||
emit('saved');
|
||||
} catch {
|
||||
} finally {
|
||||
saving.value = false;
|
||||
|
||||
@@ -12,13 +12,13 @@ export const normalizeWhiteListRule = (rule: WhiteListRule): WhiteListRule => {
|
||||
if (!['tcp', 'udp'].includes(protocol)) throw new Error('invalid whitelist rule');
|
||||
if (rule.type) {
|
||||
if (!['panel', 'ssh'].includes(rule.type)) throw new Error('invalid whitelist rule');
|
||||
if (rule.port !== undefined && !/^\d+$/.test(rule.port.trim())) {
|
||||
if (!/^\d+$/.test(rule.port?.trim() || '')) {
|
||||
throw new Error('invalid service port');
|
||||
}
|
||||
return {
|
||||
type: rule.type,
|
||||
protocol,
|
||||
port: rule.port === undefined ? undefined : normalizePortRange(rule.port),
|
||||
port: normalizePortRange(rule.port || ''),
|
||||
sources,
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user