ntp_restrict.c revision 293896
1#include "config.h"
2
3#include "ntpd.h"
4#include "ntp_lists.h"
5
6#include "unity.h"
7
8/* Helper functions */
9
10sockaddr_u
11create_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
23void
24setUp(void) {
25	init_restrict();
26}
27
28
29void
30tearDown(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
59void
60test_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
85void
86test_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
96void
97test_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
119void
120test_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
130void
131test_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
143void
144test_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
165void
166test_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
189void
190test_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