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