1
import { useEnv } from '@directus/env';
2
import { randIp, randUrl } from '@ngneat/falso';
3
import os from 'node:os';
4
import type { Logger } from 'pino';
5
import { afterEach, beforeEach, expect, test, vi } from 'vitest';
6
import { useLogger } from '../logger.js';
7
import { ipInNetworks } from '../utils/ip-in-networks.js';
8
import { isDeniedIp } from './is-denied-ip.js';
11
vi.mock('@directus/env');
12
vi.mock('../logger.js');
13
vi.mock('../utils/ip-in-networks.js');
31
test(`Returns false if deny list is empty`, async () => {
32
vi.mocked(useEnv).mockReturnValue({ IMPORT_IP_DENY_LIST: [] });
34
const result = isDeniedIp(sample.ip);
36
expect(result).toBe(false);
39
test(`Returns false if IP is not in deny list`, async () => {
40
vi.mocked(useEnv).mockReturnValue({ IMPORT_IP_DENY_LIST: [sample.ip] });
41
vi.mocked(ipInNetworks).mockReturnValue(false);
43
const result = isDeniedIp(sample.ip);
45
expect(result).toBe(false);
48
test(`Returns true if IP is in deny list`, async () => {
49
vi.mocked(useEnv).mockReturnValue({ IMPORT_IP_DENY_LIST: [sample.ip] });
50
vi.mocked(ipInNetworks).mockReturnValue(true);
52
const result = isDeniedIp(sample.ip);
54
expect(result).toBe(true);
57
test(`Returns true and logs error if deny list is invalid`, async () => {
58
vi.mocked(useEnv).mockReturnValue({ IMPORT_IP_DENY_LIST: ['invalid'] });
62
} as unknown as Logger;
64
vi.mocked(useLogger).mockReturnValue(mockLogger);
66
const error = new Error();
68
vi.mocked(ipInNetworks).mockImplementation(() => {
72
const result = isDeniedIp(sample.ip);
74
expect(result).toBe(true);
75
expect(mockLogger.warn).toHaveBeenCalledWith(`Cannot verify IP address due to invalid "IMPORT_IP_DENY_LIST" config`);
76
expect(mockLogger.warn).toHaveBeenCalledWith(error);
79
test(`Checks against IPs of local network interfaces if deny list contains 0.0.0.0`, async () => {
80
vi.mocked(useEnv).mockReturnValue({ IMPORT_IP_DENY_LIST: ['0.0.0.0'] });
82
vi.mocked(os.networkInterfaces).mockReturnValue({});
84
const result = isDeniedIp(sample.ip);
86
expect(result).toBe(false);
87
expect(os.networkInterfaces).toHaveBeenCalledOnce();
90
test(`Returns true if IP matches resolved local network interface address`, async () => {
91
vi.mocked(useEnv).mockReturnValue({ IMPORT_IP_DENY_LIST: ['0.0.0.0'] });
93
vi.mocked(os.networkInterfaces).mockReturnValue({
100
mac: '00:00:00:00:00:00',
108
netmask: '255.0.0.0',
110
mac: '00:00:00:00:00:00',
117
const result = isDeniedIp(sample.ip);
119
expect(result).toBe(true);