From 6343c43f628db9d366890dd2b002d42e32bd3d8e Mon Sep 17 00:00:00 2001 From: farhadh Date: Mon, 11 May 2026 21:10:46 +0200 Subject: [PATCH] feat(nodes): add allow-private-address toggle per node Adds AllowPrivateAddress to the Node model (DB default false). When enabled it bypasses the SSRF private-range check for that node's probe URL, allowing nodes hosted on RFC-1918 or loopback addresses (e.g. a private VPN or LAN setup). --- database/model/model.go | 19 ++++++++++--------- frontend/src/pages/nodes/NodeFormModal.vue | 7 +++++++ 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/database/model/model.go b/database/model/model.go index 56a76b6e..b3764e5e 100644 --- a/database/model/model.go +++ b/database/model/model.go @@ -128,15 +128,16 @@ type Setting struct { // endpoint over HTTP using the per-node ApiToken to populate the runtime // status fields below. type Node struct { - Id int `json:"id" form:"id" gorm:"primaryKey;autoIncrement"` - Name string `json:"name" form:"name" gorm:"uniqueIndex"` - Remark string `json:"remark" form:"remark"` - Scheme string `json:"scheme" form:"scheme"` - Address string `json:"address" form:"address"` - Port int `json:"port" form:"port"` - BasePath string `json:"basePath" form:"basePath"` - ApiToken string `json:"apiToken" form:"apiToken"` - Enable bool `json:"enable" form:"enable" gorm:"default:true"` + Id int `json:"id" form:"id" gorm:"primaryKey;autoIncrement"` + Name string `json:"name" form:"name" gorm:"uniqueIndex"` + Remark string `json:"remark" form:"remark"` + Scheme string `json:"scheme" form:"scheme"` + Address string `json:"address" form:"address"` + Port int `json:"port" form:"port"` + BasePath string `json:"basePath" form:"basePath"` + ApiToken string `json:"apiToken" form:"apiToken"` + Enable bool `json:"enable" form:"enable" gorm:"default:true"` + AllowPrivateAddress bool `json:"allowPrivateAddress" form:"allowPrivateAddress" gorm:"default:false"` // Heartbeat-updated fields. UpdatedAt advances on every probe even when // the row is otherwise unchanged so the UI's "last seen" tooltip is diff --git a/frontend/src/pages/nodes/NodeFormModal.vue b/frontend/src/pages/nodes/NodeFormModal.vue index 2a585e19..720f4e8b 100644 --- a/frontend/src/pages/nodes/NodeFormModal.vue +++ b/frontend/src/pages/nodes/NodeFormModal.vue @@ -28,6 +28,7 @@ function defaultForm() { basePath: '/', apiToken: '', enable: true, + allowPrivateAddress: false, }; } @@ -69,6 +70,7 @@ function buildPayload() { basePath: form.basePath?.trim() || '/', apiToken: form.apiToken?.trim() || '', enable: !!form.enable, + allowPrivateAddress: !!form.allowPrivateAddress, }; } @@ -161,6 +163,11 @@ async function onSave() { + + +
Enable only for nodes on a private network or VPN.
+
+
{{ t('pages.nodes.apiTokenHint') }}