1 #include "config.h"
2 
3 #include "ntpd.h"
4 #include "ntp_lists.h"
5 
6 #include "unity.h"
7 
8 /* Helper functions */
9 
10 sockaddr_u
create_sockaddr_u(short sin_family,unsigned short sin_port,char * ip_addr)11 create_sockaddr_u(short sin_family, unsigned short sin_port, char* ip_addr) {
12 	sockaddr_u sockaddr;
13 
14 	sockaddr.sa4.sin_family = AF_INET;
15 	sockaddr.sa4.sin_port = htons(sin_port);
16 	memset(sockaddr.sa4.sin_zero, 0, 8);
17 	sockaddr.sa4.sin_addr.s_addr = inet_addr(ip_addr);
18 
19 	return sockaddr;
20 }
21 
22 
23 void
setUp(void)24 setUp(void) {
25 	init_restrict();
26 }
27 
28 
29 void
tearDown(void)30 tearDown(void) {
31 	restrict_u *empty_restrict = malloc(sizeof(restrict_u));
32 	memset(empty_restrict, 0, sizeof(restrict_u));
33 
34 	restrict_u *current;
35 
36 	do {
37 		UNLINK_HEAD_SLIST(current, restrictlist4, link);
38 		if (current != NULL)
39 		{
40 			*current = *empty_restrict;
41 		}
42 	} while (current != NULL);
43 
44 	do {
45 		UNLINK_HEAD_SLIST(current, restrictlist6, link);
46 		if (current != NULL)
47 		{
48 			*current = *empty_restrict;
49 		}
50 	} while (current != NULL);
51 
52 	free(empty_restrict);
53 }
54 
55 
56 /* Tests */
57 
58 
59 void
test_RestrictionsAreEmptyAfterInit(void)60 test_RestrictionsAreEmptyAfterInit(void) {
61 
62 	restrict_u *rl4 = malloc(sizeof(restrict_u));
63 	restrict_u *rl6 = malloc(sizeof(restrict_u));
64 
65 	memset(rl4, 0, sizeof(restrict_u));
66 	memset(rl6, 0, sizeof(restrict_u));
67 
68 	TEST_ASSERT_EQUAL(rl4->count, restrictlist4->count);
69 	TEST_ASSERT_EQUAL(rl4->flags, restrictlist4->flags);
70 	TEST_ASSERT_EQUAL(rl4->mflags, restrictlist4->mflags);
71 	TEST_ASSERT_EQUAL(rl4->expire, restrictlist4->expire);
72 	TEST_ASSERT_EQUAL(rl4->u.v4.addr, restrictlist4->u.v4.addr);
73 	TEST_ASSERT_EQUAL(rl4->u.v4.mask, restrictlist4->u.v4.mask);
74 
75 	TEST_ASSERT_EQUAL(rl6->count, restrictlist6->count);
76 	TEST_ASSERT_EQUAL(rl6->flags, restrictlist6->flags);
77 	TEST_ASSERT_EQUAL(rl6->mflags, restrictlist6->mflags);
78 	TEST_ASSERT_EQUAL(rl6->expire, restrictlist6->expire);
79 
80 	free(rl4);
81 	free(rl6);
82 }
83 
84 
85 void
test_ReturnsCorrectDefaultRestrictions(void)86 test_ReturnsCorrectDefaultRestrictions(void) {
87 	sockaddr_u sockaddr = create_sockaddr_u(AF_INET,
88 		54321, "63.161.169.137");
89 
90 	u_short retval = restrictions(&sockaddr);
91 
92 	TEST_ASSERT_EQUAL(0, retval);
93 }
94 
95 
96 void
test_HackingDefaultRestriction(void)97 test_HackingDefaultRestriction(void) {
98 	/*
99 	*	We change the flag of the default restriction,
100 	*	and check if restriction() returns that flag
101 	*/
102 
103 	const u_short flags = 42;
104 
105 	sockaddr_u resaddr = create_sockaddr_u(AF_INET,
106 		54321, "0.0.0.0");
107 	sockaddr_u resmask = create_sockaddr_u(AF_INET,
108 		54321, "0.0.0.0");
109 
110 	hack_restrict(RESTRICT_FLAGS, &resaddr, &resmask, 0, flags, 0);
111 
112 	sockaddr_u sockaddr = create_sockaddr_u(AF_INET,
113 		54321, "111.123.251.124");
114 
115 	TEST_ASSERT_EQUAL(flags, restrictions(&sockaddr));
116 }
117 
118 
119 void
test_CantRemoveDefaultEntry(void)120 test_CantRemoveDefaultEntry(void) {
121 	sockaddr_u resaddr = create_sockaddr_u(AF_INET, 54321, "0.0.0.0");
122 	sockaddr_u resmask = create_sockaddr_u(AF_INET, 54321, "0.0.0.0");
123 
124 	hack_restrict(RESTRICT_REMOVE, &resaddr, &resmask, 0, 0, 0);
125 
126 	TEST_ASSERT_EQUAL(0, restrictions(&resaddr));
127 }
128 
129 
130 void
test_AddingNewRestriction(void)131 test_AddingNewRestriction(void) {
132 	sockaddr_u resaddr = create_sockaddr_u(AF_INET, 54321, "11.22.33.44");
133 	sockaddr_u resmask = create_sockaddr_u(AF_INET, 54321, "128.0.0.0");
134 
135 	const u_short flags = 42;
136 
137 	hack_restrict(RESTRICT_FLAGS, &resaddr, &resmask, 0, flags, 0);
138 
139 	TEST_ASSERT_EQUAL(flags, restrictions(&resaddr));
140 }
141 
142 
143 void
test_TheMostFittingRestrictionIsMatched(void)144 test_TheMostFittingRestrictionIsMatched(void) {
145 	sockaddr_u resaddr_target = create_sockaddr_u(AF_INET, 54321, "11.22.33.44");
146 
147 	sockaddr_u resaddr_not_matching = create_sockaddr_u(AF_INET, 54321, "11.99.33.44");
148 	sockaddr_u resmask_not_matching = create_sockaddr_u(AF_INET, 54321, "255.255.0.0");
149 
150 	sockaddr_u resaddr_best_match = create_sockaddr_u(AF_INET, 54321, "11.22.30.20");
151 	sockaddr_u resmask_best_match = create_sockaddr_u(AF_INET, 54321, "255.255.0.0");
152 
153 	/* it also matches, but we prefer the one above, as it's more specific */
154 	sockaddr_u resaddr_second_match = create_sockaddr_u(AF_INET, 54321, "11.99.33.44");
155 	sockaddr_u resmask_second_match = create_sockaddr_u(AF_INET, 54321, "255.0.0.0");
156 
157 	hack_restrict(RESTRICT_FLAGS, &resaddr_not_matching, &resmask_not_matching, 0, 11, 0);
158 	hack_restrict(RESTRICT_FLAGS, &resaddr_best_match, &resmask_best_match, 0, 22, 0);
159 	hack_restrict(RESTRICT_FLAGS, &resaddr_second_match, &resmask_second_match, 0, 128, 0);
160 
161 	TEST_ASSERT_EQUAL(22, restrictions(&resaddr_target));
162 }
163 
164 
165 void
test_DeletedRestrictionIsNotMatched(void)166 test_DeletedRestrictionIsNotMatched(void) {
167 	sockaddr_u resaddr_target = create_sockaddr_u(AF_INET, 54321, "11.22.33.44");
168 
169 	sockaddr_u resaddr_not_matching = create_sockaddr_u(AF_INET, 54321, "11.99.33.44");
170 	sockaddr_u resmask_not_matching = create_sockaddr_u(AF_INET, 54321, "255.255.0.0");
171 
172 	sockaddr_u resaddr_best_match = create_sockaddr_u(AF_INET, 54321, "11.22.30.20");
173 	sockaddr_u resmask_best_match = create_sockaddr_u(AF_INET, 54321, "255.255.0.0");
174 
175 	sockaddr_u resaddr_second_match = create_sockaddr_u(AF_INET, 54321, "11.99.33.44");
176 	sockaddr_u resmask_second_match = create_sockaddr_u(AF_INET, 54321, "255.0.0.0");
177 
178 	hack_restrict(RESTRICT_FLAGS, &resaddr_not_matching, &resmask_not_matching, 0, 11, 0);
179 	hack_restrict(RESTRICT_FLAGS, &resaddr_best_match, &resmask_best_match, 0, 22, 0);
180 	hack_restrict(RESTRICT_FLAGS, &resaddr_second_match, &resmask_second_match, 0, 128, 0);
181 
182 	/* deleting the best match*/
183 	hack_restrict(RESTRICT_REMOVE, &resaddr_best_match, &resmask_best_match, 0, 22, 0);
184 
185 	TEST_ASSERT_EQUAL(128, restrictions(&resaddr_target));
186 }
187 
188 
189 void
test_RestrictUnflagWorks(void)190 test_RestrictUnflagWorks(void) {
191 	sockaddr_u resaddr = create_sockaddr_u(AF_INET, 54321, "11.22.30.20");
192 	sockaddr_u resmask = create_sockaddr_u(AF_INET, 54321, "255.255.0.0");
193 
194 	hack_restrict(RESTRICT_FLAGS, &resaddr, &resmask, 0, 11, 0);
195 
196 	hack_restrict(RESTRICT_UNFLAG, &resaddr, &resmask, 0, 10, 0);
197 
198 	TEST_ASSERT_EQUAL(1, restrictions(&resaddr));
199 }
200