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