Skip to content

Commit f5c8a46

Browse files
feat(settings): expose image proxy private ranges (#479)
1 parent ff3b5b4 commit f5c8a46

4 files changed

Lines changed: 76 additions & 0 deletions

File tree

src/locales/en-US.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1704,6 +1704,11 @@ export default {
17041704
securityImageDomainsHint: 'Allowed image domains whitelist for caching, used to control trusted image sources',
17051705
noSecurityImageDomains: 'No security domains',
17061706
securityImageDomainAdd: 'Add domain, e.g.: image.tmdb.org',
1707+
imageProxyAllowedPrivateRanges: 'Image Proxy Allowed Private Ranges',
1708+
imageProxyAllowedPrivateRangesHint:
1709+
'Only applies after a URL matches a security image domain. Use for TUN mappings or internal CDNs; broad ranges weaken SSRF protection',
1710+
noImageProxyAllowedPrivateRanges: 'No allowed ranges',
1711+
imageProxyAllowedPrivateRangeAdd: 'Add CIDR, e.g.: 198.18.0.0/15',
17071712
proxyHost: 'Proxy Server',
17081713
proxyHostHint: 'Set proxy server address, support: http(s), socks5, socks5h, etc.',
17091714
moviePilotAutoUpdate: 'Auto Update MoviePilot',

src/locales/zh-CN.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1677,6 +1677,11 @@ export default {
16771677
securityImageDomainsHint: '允许缓存的图片域名白名单,用于控制可信任的图片来源',
16781678
noSecurityImageDomains: '暂无安全域名',
16791679
securityImageDomainAdd: '添加域名,如:image.tmdb.org',
1680+
imageProxyAllowedPrivateRanges: '图片代理允许非公网网段',
1681+
imageProxyAllowedPrivateRangesHint:
1682+
'仅对已命中安全图片域名的地址生效,用于 TUN 映射、内网 CDN 等特殊场景;配置过宽会降低 SSRF 防护强度',
1683+
noImageProxyAllowedPrivateRanges: '暂无允许网段',
1684+
imageProxyAllowedPrivateRangeAdd: '添加 CIDR,如:198.18.0.0/15',
16801685
proxyHost: '代理服务器',
16811686
proxyHostHint: '设置代理服务器地址,支持:http(s)、socks5、socks5h 等协议',
16821687
moviePilotAutoUpdate: '自动更新MoviePilot',

src/locales/zh-TW.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1678,6 +1678,11 @@ export default {
16781678
securityImageDomainsHint: '允許緩存的圖片域名白名單,用於控制可信任的圖片來源',
16791679
noSecurityImageDomains: '暫無安全域名',
16801680
securityImageDomainAdd: '添加域名,如:image.tmdb.org',
1681+
imageProxyAllowedPrivateRanges: '圖片代理允許非公網網段',
1682+
imageProxyAllowedPrivateRangesHint:
1683+
'僅對已命中安全圖片域名的地址生效,用於 TUN 映射、內網 CDN 等特殊場景;配置過寬會降低 SSRF 防護強度',
1684+
noImageProxyAllowedPrivateRanges: '暫無允許網段',
1685+
imageProxyAllowedPrivateRangeAdd: '添加 CIDR,如:198.18.0.0/15',
16811686
proxyHost: '代理服務器',
16821687
proxyHostHint: '設置代理服務器地址,支持:http(s)、socks5、socks5h 等協議',
16831688
moviePilotAutoUpdate: '自動更新MoviePilot',

src/views/setting/AccountSettingSystem.vue

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ const SystemSettings = ref<any>({
112112
DOH_RESOLVERS: null,
113113
DOH_DOMAINS: null,
114114
SECURITY_IMAGE_DOMAINS: [],
115+
IMAGE_PROXY_ALLOWED_PRIVATE_RANGES: [],
115116
// 日志
116117
DEBUG: false,
117118
LOG_LEVEL: 'INFO',
@@ -494,6 +495,8 @@ const dataCleanupFieldRules = [
494495
495496
// 安全域名添加变量
496497
const newSecurityDomain = ref('')
498+
// 图片代理允许非公网网段添加变量
499+
const newImageProxyAllowedPrivateRange = ref('')
497500
498501
// 加载 LLM 模型列表与 provider 目录
499502
async function refreshLlmModels(forceRefresh = true) {
@@ -544,6 +547,19 @@ function addSecurityDomain() {
544547
}
545548
}
546549
550+
// 添加图片代理允许访问的非公网网段
551+
function addImageProxyAllowedPrivateRange() {
552+
if (
553+
newImageProxyAllowedPrivateRange.value &&
554+
!SystemSettings.value.Advanced.IMAGE_PROXY_ALLOWED_PRIVATE_RANGES.includes(
555+
newImageProxyAllowedPrivateRange.value,
556+
)
557+
) {
558+
SystemSettings.value.Advanced.IMAGE_PROXY_ALLOWED_PRIVATE_RANGES.push(newImageProxyAllowedPrivateRange.value)
559+
newImageProxyAllowedPrivateRange.value = ''
560+
}
561+
}
562+
547563
// 调用API查询下载器设置
548564
async function loadDownloaderSetting() {
549565
try {
@@ -2103,6 +2119,51 @@ watch(currentLlmSnapshotKey, (snapshotKey, previousSnapshotKey) => {
21032119
</template>
21042120
</VTextField>
21052121
</div>
2122+
<VDivider class="my-4" />
2123+
<div class="text-subtitle-2 mb-1">
2124+
{{ t('setting.system.imageProxyAllowedPrivateRanges') }}
2125+
</div>
2126+
<div class="text-caption text-medium-emphasis mb-3">
2127+
{{ t('setting.system.imageProxyAllowedPrivateRangesHint') }}
2128+
</div>
2129+
<div class="d-flex flex-wrap gap-2 mb-3">
2130+
<VChip
2131+
v-for="(range, index) in SystemSettings.Advanced.IMAGE_PROXY_ALLOWED_PRIVATE_RANGES"
2132+
:key="index"
2133+
closable
2134+
@click:close="
2135+
SystemSettings.Advanced.IMAGE_PROXY_ALLOWED_PRIVATE_RANGES.splice(index, 1)
2136+
"
2137+
>
2138+
{{ range }}
2139+
</VChip>
2140+
<VChip
2141+
v-if="SystemSettings.Advanced.IMAGE_PROXY_ALLOWED_PRIVATE_RANGES.length === 0"
2142+
color="warning"
2143+
>
2144+
{{ t('setting.system.noImageProxyAllowedPrivateRanges') }}
2145+
</VChip>
2146+
</div>
2147+
<div class="d-flex align-center gap-2">
2148+
<VTextField
2149+
v-model="newImageProxyAllowedPrivateRange"
2150+
:placeholder="t('setting.system.imageProxyAllowedPrivateRangeAdd')"
2151+
hide-details
2152+
density="compact"
2153+
prepend-inner-icon="mdi-ip-network"
2154+
>
2155+
<template #append>
2156+
<VBtn
2157+
icon
2158+
color="primary"
2159+
@click="addImageProxyAllowedPrivateRange"
2160+
:disabled="!newImageProxyAllowedPrivateRange"
2161+
>
2162+
<VIcon icon="mdi-plus" />
2163+
</VBtn>
2164+
</template>
2165+
</VTextField>
2166+
</div>
21062167
</VExpansionPanelText>
21072168
</VExpansionPanel>
21082169
</VExpansionPanels>

0 commit comments

Comments
 (0)