File size: 2,023 Bytes
4e23b01
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
import { describe, expect, it } from 'vitest';

import { classify } from '../src/security/bindClassify';

describe('classify', () => {
  describe('loopback', () => {
    it.each([['127.0.0.1'], ['127.255.255.255'], ['::1'], ['localhost']])(
      '%s β†’ loopback',
      (host) => {
        expect(classify(host)).toBe('loopback');
      },
    );
  });

  describe('lan', () => {
    it.each([
      ['192.168.1.5'],
      ['10.0.0.1'],
      ['172.16.0.1'],
      ['172.31.255.255'],
      ['169.254.1.1'],
      ['fe80::1'],
      ['fe80:0000:0000:0000:0000:0000:0000:0001'],
      ['febf:ffff:ffff:ffff:ffff:ffff:ffff:ffff'],
    ])('%s β†’ lan', (host) => {
      expect(classify(host)).toBe('lan');
    });
  });

  describe('public', () => {
    it.each([
      ['8.8.8.8'],
      ['172.32.0.1'],
      ['203.0.113.5'],
      ['2001:4860:4860::8888'],
      ['fec0::1'],
      ['example.com'],
    ])('%s β†’ public', (host) => {
      expect(classify(host)).toBe('public');
    });
  });

  describe('wildcard binds default to public unless relaxed', () => {
    it('0.0.0.0 β†’ public by default', () => {
      expect(classify('0.0.0.0')).toBe('public');
    });

    it('0.0.0.0 β†’ lan when bindClass=lan', () => {
      expect(classify('0.0.0.0', { bindClass: 'lan' })).toBe('lan');
    });

    it('0.0.0.0 β†’ public when bindClass=public', () => {
      expect(classify('0.0.0.0', { bindClass: 'public' })).toBe('public');
    });

    it(':: β†’ public by default', () => {
      expect(classify('::')).toBe('public');
    });

    it(':: β†’ lan when bindClass=lan', () => {
      expect(classify('::', { bindClass: 'lan' })).toBe('lan');
    });

    it('empty string β†’ public by default', () => {
      expect(classify('')).toBe('public');
    });
  });

  it('bindClass override does not reclassify a concrete loopback/lan host', () => {
    expect(classify('127.0.0.1', { bindClass: 'public' })).toBe('loopback');
    expect(classify('192.168.1.5', { bindClass: 'public' })).toBe('lan');
  });
});