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