chore: prepare GoodBuddy 0.8.2
Cross-platform packages / Validate source (push) Waiting to run
Cross-platform packages / ${{ matrix.platform }} ${{ matrix.arch }} (arm64, macos, macos-15) (push) Blocked by required conditions
Cross-platform packages / ${{ matrix.platform }} ${{ matrix.arch }} (arm64, windows, windows-2025) (push) Blocked by required conditions
Cross-platform packages / ${{ matrix.platform }} ${{ matrix.arch }} (x64, linux, ubuntu-24.04) (push) Blocked by required conditions
Cross-platform packages / ${{ matrix.platform }} ${{ matrix.arch }} (x64, macos, macos-15-intel) (push) Blocked by required conditions
Cross-platform packages / ${{ matrix.platform }} ${{ matrix.arch }} (x64, windows, windows-2025) (push) Blocked by required conditions
Cross-platform packages / Publish GitHub Release (push) Blocked by required conditions
Cross-platform packages / ${{ matrix.platform }} ${{ matrix.arch }} (arm64, linux, ubuntu-24.04-arm) (push) Blocked by required conditions
Cross-platform packages / Validate source (push) Waiting to run
Cross-platform packages / ${{ matrix.platform }} ${{ matrix.arch }} (arm64, macos, macos-15) (push) Blocked by required conditions
Cross-platform packages / ${{ matrix.platform }} ${{ matrix.arch }} (arm64, windows, windows-2025) (push) Blocked by required conditions
Cross-platform packages / ${{ matrix.platform }} ${{ matrix.arch }} (x64, linux, ubuntu-24.04) (push) Blocked by required conditions
Cross-platform packages / ${{ matrix.platform }} ${{ matrix.arch }} (x64, macos, macos-15-intel) (push) Blocked by required conditions
Cross-platform packages / ${{ matrix.platform }} ${{ matrix.arch }} (x64, windows, windows-2025) (push) Blocked by required conditions
Cross-platform packages / Publish GitHub Release (push) Blocked by required conditions
Cross-platform packages / ${{ matrix.platform }} ${{ matrix.arch }} (arm64, linux, ubuntu-24.04-arm) (push) Blocked by required conditions
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
import { describe, expect, it, vi } from 'vitest'
|
||||
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
|
||||
import { setIntranetCompatibilityReader } from '../intranet-compatibility-policy'
|
||||
import {
|
||||
BrowserUrlPolicy,
|
||||
canonicalizeBrowserUrl,
|
||||
@@ -7,6 +8,14 @@ import {
|
||||
|
||||
const signal = new AbortController().signal
|
||||
|
||||
beforeEach(() => {
|
||||
setIntranetCompatibilityReader(() => false)
|
||||
})
|
||||
|
||||
afterEach(() => {
|
||||
setIntranetCompatibilityReader(() => true)
|
||||
})
|
||||
|
||||
describe('BrowserUrlPolicy', () => {
|
||||
it.each([
|
||||
'file:///etc/passwd',
|
||||
@@ -83,6 +92,55 @@ describe('BrowserUrlPolicy', () => {
|
||||
}
|
||||
})
|
||||
|
||||
it('allows intranet names and private addresses only in compatibility mode', async () => {
|
||||
setIntranetCompatibilityReader(() => true)
|
||||
expect(() => canonicalizeBrowserUrl('http://printer/status')).not.toThrow()
|
||||
expect(() =>
|
||||
canonicalizeBrowserUrl('https://service.internal/health')
|
||||
).not.toThrow()
|
||||
expect(() =>
|
||||
canonicalizeBrowserUrl('http://192.168.1.20/status')
|
||||
).not.toThrow()
|
||||
|
||||
const policy = new BrowserUrlPolicy(async () => [
|
||||
{ address: '10.20.30.40', family: 4 }
|
||||
])
|
||||
await expect(
|
||||
policy.validate('http://printer/status', signal)
|
||||
).resolves.toMatchObject({
|
||||
origin: 'http://printer',
|
||||
addresses: [{ address: '10.20.30.40', family: 4 }]
|
||||
})
|
||||
})
|
||||
|
||||
it('keeps metadata, link-local and mixed DNS answers blocked in compatibility mode', async () => {
|
||||
setIntranetCompatibilityReader(() => true)
|
||||
expect(() =>
|
||||
canonicalizeBrowserUrl('http://metadata.google.internal/latest')
|
||||
).toThrow()
|
||||
expect(() =>
|
||||
canonicalizeBrowserUrl('http://169.254.169.254/latest/meta-data')
|
||||
).toThrow()
|
||||
expect(() =>
|
||||
canonicalizeBrowserUrl('http://user:secret@printer/status')
|
||||
).toThrow()
|
||||
|
||||
const mixedPolicy = new BrowserUrlPolicy(async () => [
|
||||
{ address: '10.20.30.40', family: 4 },
|
||||
{ address: '93.184.216.34', family: 4 }
|
||||
])
|
||||
await expect(
|
||||
mixedPolicy.validate('http://printer/status', signal)
|
||||
).rejects.toThrow('混合地址')
|
||||
|
||||
const linkLocalPolicy = new BrowserUrlPolicy(async () => [
|
||||
{ address: '169.254.10.20', family: 4 }
|
||||
])
|
||||
await expect(
|
||||
linkLocalPolicy.validate('http://printer/status', signal)
|
||||
).rejects.toThrow('混合地址')
|
||||
})
|
||||
|
||||
it('validates redirects and keeps them on the approved origin', async () => {
|
||||
const policy = new BrowserUrlPolicy(async () => [
|
||||
{ address: '93.184.216.34', family: 4 }
|
||||
|
||||
Reference in New Issue
Block a user