(rawUrl: string)
| 23 | const REMOTE_CONFIG_MAX_BYTES = 1024 * 1024 // 1MB |
| 24 | |
| 25 | function isAllowedRemoteConfigUrl(rawUrl: string): boolean { |
| 26 | let parsed: URL |
| 27 | try { |
| 28 | parsed = new URL(rawUrl) |
| 29 | } catch { |
| 30 | return false |
| 31 | } |
| 32 | |
| 33 | if (parsed.protocol !== 'https:') return false |
| 34 | if (parsed.username || parsed.password) return false |
| 35 | if (parsed.port && parsed.port !== '443') return false |
| 36 | |
| 37 | const hostname = parsed.hostname.toLowerCase() |
| 38 | return REMOTE_CONFIG_ALLOWED_DOMAINS.some((domain) => hostname === domain || hostname.endsWith(`.${domain}`)) |
| 39 | } |
| 40 | |
| 41 | /** |
| 42 | * 注册窗口和文件系统操作 IPC 处理器 |
no outgoing calls
no test coverage detected