xref: /netbsd-src/external/bsd/ntp/dist/tests/ntpd/ntp_restrict.c (revision cdfa2a7ef92791ba9db70a584a1d904730e6fb46)
1*cdfa2a7eSchristos /*	$NetBSD: ntp_restrict.c,v 1.3 2020/05/25 20:47:36 christos Exp $	*/
248f8ae19Schristos 
3a6f3f22fSchristos #include "config.h"
4a6f3f22fSchristos 
5a6f3f22fSchristos #include "ntpd.h"
6a6f3f22fSchristos #include "ntp_lists.h"
7a6f3f22fSchristos 
8a6f3f22fSchristos #include "unity.h"
9a6f3f22fSchristos 
1056f2724eSchristos extern void setUp(void);
1156f2724eSchristos extern void tearDown(void);
1256f2724eSchristos 
13a6f3f22fSchristos /* Helper functions */
14a6f3f22fSchristos 
1556f2724eSchristos static sockaddr_u
create_sockaddr_u(short sin_family,unsigned short sin_port,char * ip_addr)1656f2724eSchristos create_sockaddr_u(short sin_family, unsigned short sin_port, char* ip_addr)
1756f2724eSchristos {
18a6f3f22fSchristos 	sockaddr_u sockaddr;
19a6f3f22fSchristos 
20a6f3f22fSchristos 	sockaddr.sa4.sin_family = AF_INET;
21a6f3f22fSchristos 	sockaddr.sa4.sin_port = htons(sin_port);
22a6f3f22fSchristos 	memset(sockaddr.sa4.sin_zero, 0, 8);
23a6f3f22fSchristos 	sockaddr.sa4.sin_addr.s_addr = inet_addr(ip_addr);
24a6f3f22fSchristos 
25a6f3f22fSchristos 	return sockaddr;
26a6f3f22fSchristos }
27a6f3f22fSchristos 
28a6f3f22fSchristos 
setUp(void)2956f2724eSchristos void setUp(void)
3056f2724eSchristos {
31a6f3f22fSchristos 	init_restrict();
32a6f3f22fSchristos }
33a6f3f22fSchristos 
34a6f3f22fSchristos 
tearDown(void)3556f2724eSchristos void tearDown(void)
3656f2724eSchristos {
37a6f3f22fSchristos 	restrict_u *empty_restrict = malloc(sizeof(restrict_u));
38a6f3f22fSchristos 	memset(empty_restrict, 0, sizeof(restrict_u));
39a6f3f22fSchristos 
40a6f3f22fSchristos 	restrict_u *current;
41a6f3f22fSchristos 
42a6f3f22fSchristos 	do {
43a6f3f22fSchristos 		UNLINK_HEAD_SLIST(current, restrictlist4, link);
44a6f3f22fSchristos 		if (current != NULL)
45a6f3f22fSchristos 		{
46a6f3f22fSchristos 			*current = *empty_restrict;
47a6f3f22fSchristos 		}
48a6f3f22fSchristos 	} while (current != NULL);
49a6f3f22fSchristos 
50a6f3f22fSchristos 	do {
51a6f3f22fSchristos 		UNLINK_HEAD_SLIST(current, restrictlist6, link);
52a6f3f22fSchristos 		if (current != NULL)
53a6f3f22fSchristos 		{
54a6f3f22fSchristos 			*current = *empty_restrict;
55a6f3f22fSchristos 		}
56a6f3f22fSchristos 	} while (current != NULL);
57a6f3f22fSchristos 
58a6f3f22fSchristos 	free(empty_restrict);
59a6f3f22fSchristos }
60a6f3f22fSchristos 
61a6f3f22fSchristos 
62a6f3f22fSchristos /* Tests */
63a6f3f22fSchristos 
64a6f3f22fSchristos 
6556f2724eSchristos extern void test_RestrictionsAreEmptyAfterInit(void);
test_RestrictionsAreEmptyAfterInit(void)6656f2724eSchristos void test_RestrictionsAreEmptyAfterInit(void)
6756f2724eSchristos {
68a6f3f22fSchristos 
69a6f3f22fSchristos 	restrict_u *rl4 = malloc(sizeof(restrict_u));
70a6f3f22fSchristos 	restrict_u *rl6 = malloc(sizeof(restrict_u));
71a6f3f22fSchristos 
72a6f3f22fSchristos 	memset(rl4, 0, sizeof(restrict_u));
73a6f3f22fSchristos 	memset(rl6, 0, sizeof(restrict_u));
74a6f3f22fSchristos 
75a6f3f22fSchristos 	TEST_ASSERT_EQUAL(rl4->count, restrictlist4->count);
7656f2724eSchristos 	TEST_ASSERT_EQUAL(rl4->rflags, restrictlist4->rflags);
77a6f3f22fSchristos 	TEST_ASSERT_EQUAL(rl4->mflags, restrictlist4->mflags);
78a6f3f22fSchristos 	TEST_ASSERT_EQUAL(rl4->expire, restrictlist4->expire);
79a6f3f22fSchristos 	TEST_ASSERT_EQUAL(rl4->u.v4.addr, restrictlist4->u.v4.addr);
80a6f3f22fSchristos 	TEST_ASSERT_EQUAL(rl4->u.v4.mask, restrictlist4->u.v4.mask);
81a6f3f22fSchristos 
82a6f3f22fSchristos 	TEST_ASSERT_EQUAL(rl6->count, restrictlist6->count);
8356f2724eSchristos 	TEST_ASSERT_EQUAL(rl6->rflags, restrictlist6->rflags);
84a6f3f22fSchristos 	TEST_ASSERT_EQUAL(rl6->mflags, restrictlist6->mflags);
85a6f3f22fSchristos 	TEST_ASSERT_EQUAL(rl6->expire, restrictlist6->expire);
86a6f3f22fSchristos 
87a6f3f22fSchristos 	free(rl4);
88a6f3f22fSchristos 	free(rl6);
89a6f3f22fSchristos }
90a6f3f22fSchristos 
91a6f3f22fSchristos 
9256f2724eSchristos extern void test_ReturnsCorrectDefaultRestrictions(void);
test_ReturnsCorrectDefaultRestrictions(void)9356f2724eSchristos void test_ReturnsCorrectDefaultRestrictions(void)
9456f2724eSchristos {
95a6f3f22fSchristos 	sockaddr_u sockaddr = create_sockaddr_u(AF_INET,
96a6f3f22fSchristos 		54321, "63.161.169.137");
9756f2724eSchristos 	r4addr	r4a;
98a6f3f22fSchristos 
9956f2724eSchristos 	restrictions(&sockaddr, &r4a);
100a6f3f22fSchristos 
10156f2724eSchristos 	TEST_ASSERT_EQUAL(0, r4a.rflags);
102a6f3f22fSchristos }
103a6f3f22fSchristos 
104a6f3f22fSchristos 
10556f2724eSchristos extern void test_HackingDefaultRestriction(void);
test_HackingDefaultRestriction(void)10656f2724eSchristos void test_HackingDefaultRestriction(void)
10756f2724eSchristos {
108a6f3f22fSchristos 	/*
109a6f3f22fSchristos 	*	We change the flag of the default restriction,
110a6f3f22fSchristos 	*	and check if restriction() returns that flag
111a6f3f22fSchristos 	*/
112a6f3f22fSchristos 
11356f2724eSchristos 	const u_short rflags = 42;
11456f2724eSchristos 	r4addr r4a;
115a6f3f22fSchristos 
116a6f3f22fSchristos 	sockaddr_u resaddr = create_sockaddr_u(AF_INET,
117a6f3f22fSchristos 		54321, "0.0.0.0");
118a6f3f22fSchristos 	sockaddr_u resmask = create_sockaddr_u(AF_INET,
119a6f3f22fSchristos 		54321, "0.0.0.0");
120a6f3f22fSchristos 
12156f2724eSchristos 	hack_restrict(RESTRICT_FLAGS, &resaddr, &resmask, -1, 0, rflags, 0);
122a6f3f22fSchristos 
123a6f3f22fSchristos 	sockaddr_u sockaddr = create_sockaddr_u(AF_INET,
124a6f3f22fSchristos 		54321, "111.123.251.124");
125a6f3f22fSchristos 
12656f2724eSchristos 	restrictions(&sockaddr, &r4a);
12756f2724eSchristos 	TEST_ASSERT_EQUAL(rflags, r4a.rflags);
128a6f3f22fSchristos }
129a6f3f22fSchristos 
130a6f3f22fSchristos 
13156f2724eSchristos extern void test_CantRemoveDefaultEntry(void);
test_CantRemoveDefaultEntry(void)13256f2724eSchristos void test_CantRemoveDefaultEntry(void)
13356f2724eSchristos {
134a6f3f22fSchristos 	sockaddr_u resaddr = create_sockaddr_u(AF_INET, 54321, "0.0.0.0");
135a6f3f22fSchristos 	sockaddr_u resmask = create_sockaddr_u(AF_INET, 54321, "0.0.0.0");
13656f2724eSchristos 	r4addr r4a;
137a6f3f22fSchristos 
13856f2724eSchristos 	hack_restrict(RESTRICT_REMOVE, &resaddr, &resmask, -1, 0, 0, 0);
139a6f3f22fSchristos 
14056f2724eSchristos 	restrictions(&resaddr, &r4a);
14156f2724eSchristos 	TEST_ASSERT_EQUAL(0, r4a.rflags);
142a6f3f22fSchristos }
143a6f3f22fSchristos 
144a6f3f22fSchristos 
14556f2724eSchristos extern void test_AddingNewRestriction(void);
test_AddingNewRestriction(void)14656f2724eSchristos void test_AddingNewRestriction(void)
14756f2724eSchristos {
148a6f3f22fSchristos 	sockaddr_u resaddr = create_sockaddr_u(AF_INET, 54321, "11.22.33.44");
149a6f3f22fSchristos 	sockaddr_u resmask = create_sockaddr_u(AF_INET, 54321, "128.0.0.0");
15056f2724eSchristos 	r4addr r4a;
151a6f3f22fSchristos 
15256f2724eSchristos 	const u_short rflags = 42;
153a6f3f22fSchristos 
15456f2724eSchristos 	hack_restrict(RESTRICT_FLAGS, &resaddr, &resmask, -1, 0, rflags, 0);
155a6f3f22fSchristos 
15656f2724eSchristos 	restrictions(&resaddr, &r4a);
15756f2724eSchristos 	TEST_ASSERT_EQUAL(rflags, r4a.rflags);
158a6f3f22fSchristos }
159a6f3f22fSchristos 
160a6f3f22fSchristos 
16156f2724eSchristos extern void test_TheMostFittingRestrictionIsMatched(void);
test_TheMostFittingRestrictionIsMatched(void)16256f2724eSchristos void test_TheMostFittingRestrictionIsMatched(void)
16356f2724eSchristos {
164a6f3f22fSchristos 	sockaddr_u resaddr_target = create_sockaddr_u(AF_INET, 54321, "11.22.33.44");
165a6f3f22fSchristos 
166a6f3f22fSchristos 	sockaddr_u resaddr_not_matching = create_sockaddr_u(AF_INET, 54321, "11.99.33.44");
167a6f3f22fSchristos 	sockaddr_u resmask_not_matching = create_sockaddr_u(AF_INET, 54321, "255.255.0.0");
168a6f3f22fSchristos 
169a6f3f22fSchristos 	sockaddr_u resaddr_best_match = create_sockaddr_u(AF_INET, 54321, "11.22.30.20");
170a6f3f22fSchristos 	sockaddr_u resmask_best_match = create_sockaddr_u(AF_INET, 54321, "255.255.0.0");
171a6f3f22fSchristos 
172a6f3f22fSchristos 	/* it also matches, but we prefer the one above, as it's more specific */
173a6f3f22fSchristos 	sockaddr_u resaddr_second_match = create_sockaddr_u(AF_INET, 54321, "11.99.33.44");
174a6f3f22fSchristos 	sockaddr_u resmask_second_match = create_sockaddr_u(AF_INET, 54321, "255.0.0.0");
17556f2724eSchristos 	r4addr r4a;
176a6f3f22fSchristos 
17756f2724eSchristos 	hack_restrict(RESTRICT_FLAGS, &resaddr_not_matching, &resmask_not_matching, -1, 0, 11, 0);
17856f2724eSchristos 	hack_restrict(RESTRICT_FLAGS, &resaddr_best_match, &resmask_best_match, -1, 0, 22, 0);
17956f2724eSchristos 	hack_restrict(RESTRICT_FLAGS, &resaddr_second_match, &resmask_second_match, -1, 0, 128, 0);
180a6f3f22fSchristos 
18156f2724eSchristos 	restrictions(&resaddr_target, &r4a);
18256f2724eSchristos 	TEST_ASSERT_EQUAL(22, r4a.rflags);
183a6f3f22fSchristos }
184a6f3f22fSchristos 
185a6f3f22fSchristos 
18656f2724eSchristos extern void test_DeletedRestrictionIsNotMatched(void);
test_DeletedRestrictionIsNotMatched(void)18756f2724eSchristos void test_DeletedRestrictionIsNotMatched(void)
18856f2724eSchristos {
189a6f3f22fSchristos 	sockaddr_u resaddr_target = create_sockaddr_u(AF_INET, 54321, "11.22.33.44");
190a6f3f22fSchristos 
191a6f3f22fSchristos 	sockaddr_u resaddr_not_matching = create_sockaddr_u(AF_INET, 54321, "11.99.33.44");
192a6f3f22fSchristos 	sockaddr_u resmask_not_matching = create_sockaddr_u(AF_INET, 54321, "255.255.0.0");
193a6f3f22fSchristos 
194a6f3f22fSchristos 	sockaddr_u resaddr_best_match = create_sockaddr_u(AF_INET, 54321, "11.22.30.20");
195a6f3f22fSchristos 	sockaddr_u resmask_best_match = create_sockaddr_u(AF_INET, 54321, "255.255.0.0");
196a6f3f22fSchristos 
197a6f3f22fSchristos 	sockaddr_u resaddr_second_match = create_sockaddr_u(AF_INET, 54321, "11.99.33.44");
198a6f3f22fSchristos 	sockaddr_u resmask_second_match = create_sockaddr_u(AF_INET, 54321, "255.0.0.0");
19956f2724eSchristos 	r4addr r4a;
200a6f3f22fSchristos 
20156f2724eSchristos 	hack_restrict(RESTRICT_FLAGS, &resaddr_not_matching, &resmask_not_matching, -1, 0, 11, 0);
20256f2724eSchristos 	hack_restrict(RESTRICT_FLAGS, &resaddr_best_match, &resmask_best_match, -1, 0, 22, 0);
20356f2724eSchristos 	hack_restrict(RESTRICT_FLAGS, &resaddr_second_match, &resmask_second_match, -1, 0, 128, 0);
204a6f3f22fSchristos 
205a6f3f22fSchristos 	/* deleting the best match*/
20656f2724eSchristos 	hack_restrict(RESTRICT_REMOVE, &resaddr_best_match, &resmask_best_match, -1, 0, 22, 0);
207a6f3f22fSchristos 
20856f2724eSchristos 	restrictions(&resaddr_target, &r4a);
20956f2724eSchristos 	TEST_ASSERT_EQUAL(128, r4a.rflags);
210a6f3f22fSchristos }
211a6f3f22fSchristos 
212a6f3f22fSchristos 
21356f2724eSchristos extern void test_RestrictUnflagWorks(void);
test_RestrictUnflagWorks(void)21456f2724eSchristos void test_RestrictUnflagWorks(void)
21556f2724eSchristos {
216a6f3f22fSchristos 	sockaddr_u resaddr = create_sockaddr_u(AF_INET, 54321, "11.22.30.20");
217a6f3f22fSchristos 	sockaddr_u resmask = create_sockaddr_u(AF_INET, 54321, "255.255.0.0");
21856f2724eSchristos 	r4addr r4a;
219a6f3f22fSchristos 
22056f2724eSchristos 	hack_restrict(RESTRICT_FLAGS, &resaddr, &resmask, -1, 0, 11, 0);
221a6f3f22fSchristos 
22256f2724eSchristos 	hack_restrict(RESTRICT_UNFLAG, &resaddr, &resmask, -1, 0, 10, 0);
223a6f3f22fSchristos 
22456f2724eSchristos 	restrictions(&resaddr, &r4a);
22556f2724eSchristos 	TEST_ASSERT_EQUAL(1, r4a.rflags);
226a6f3f22fSchristos }
227