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