X-Git-Url: https://jfr.im/git/irc/evilnet/x3.git/blobdiff_plain/37ef8ee393f2316d81465f1632e0787ecfac1148..1ccb8f6e37ca3c53da7ab48b3ded3ae332702e0b:/src/hosthiding.c diff --git a/src/hosthiding.c b/src/hosthiding.c index f44640b..d900040 100644 --- a/src/hosthiding.c +++ b/src/hosthiding.c @@ -5,7 +5,7 @@ * * x3 is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or + * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, @@ -67,6 +67,11 @@ /* */ /* -------------------------------------------------------------------- */ +/* Set only once */ +static int KEY; +static int KEY2; +static int KEY3; + static unsigned long crc32_tab[] = { 0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L, 0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L, @@ -123,7 +128,6 @@ static unsigned long crc32_tab[] = { }; /* Return a 32-bit CRC of the contents of the buffer. */ - unsigned long crc32 (const unsigned char *s, unsigned int len) { @@ -132,7 +136,7 @@ crc32 (const unsigned char *s, unsigned int len) crc32val = 0; for (i = 0; i < len; i++) { - crc32val = crc32_tab[(crc32val ^ s[i]) & 0xff] ^ (crc32val >> 8); + crc32val = crc32_tab[(crc32val ^ s[i]) & 0xff] ^ (crc32val >> 8); } return crc32val; } @@ -146,14 +150,36 @@ str2arr (char **pparv, char *string, char *delim) tok = (char *) strtok (string, delim); while (tok != NULL) { - pparv[pparc++] = tok; - tok = (char *) strtok (NULL, delim); + pparv[pparc++] = tok; + tok = (char *) strtok (NULL, delim); } return pparc; } -/* Regular user host */ +int +check_keys() +{ + char *data; + + if (!KEY) { + data = conf_get_data("server/key1", RECDB_QSTRING); + KEY = data ? atoi(data) : 45432; + } + + if (!KEY2) { + data = conf_get_data("server/key2", RECDB_QSTRING); + KEY2 = data ? atoi(data) : 76934; + } + + if (!KEY3) { + data = conf_get_data("server/key3", RECDB_QSTRING); + KEY3 = data ? atoi(data) : 98336; + } + + return 0; +} + void make_virthost (char *curr, char *host, char *virt) { @@ -171,6 +197,8 @@ make_virthost (char *curr, char *host, char *virt) parc = str2arr (parv, s, "."); parc2 = str2arr (parv2, s2, "."); + check_keys(); + hash[0] = ((crc32 ((unsigned char *)parv[3], strlen (parv[3])) + KEY2) ^ KEY) ^ KEY3; hash[1] = ((crc32 ((unsigned char *)parv[2], strlen (parv[2])) + KEY2) ^ KEY) ^ KEY3; @@ -226,6 +254,8 @@ make_virtip (char *curr, char *host, char *virt) parc = str2arr (parv, s, "."); parc2 = str2arr (parv2, s2, "."); + check_keys(); + hash[0] = ((crc32 ((unsigned char *)parv[3], strlen (parv[3])) + KEY2) ^ KEY) ^ KEY3; hash[1] = ((crc32 ((unsigned char *)parv[2], strlen (parv[2])) + KEY2) ^ KEY) ^ KEY3; @@ -253,3 +283,121 @@ make_virtip (char *curr, char *host, char *virt) return; } +void +make_ipv6virthost (char *curr, char *host, char *new) +{ + static char mask[HOSTLEN + 1]; + char *parv[HOSTLEN + 1], *parv2[HOSTLEN + 1], s[HOSTLEN + 1], + s2[HOSTLEN + 2], s3[HOSTLEN + 2]; + int parc = 0, parc2 = 0; + unsigned int hash[8]; + + if ((strlen(host) < 3) || (strlen(curr) < 3)) + return; + + strncpy (s, curr, HOSTLEN); + strncpy (s2, host, HOSTLEN); + + ip62arr (s, s3); + + parc = str2arr (parv, s3, ":"); + parc2 = str2arr (parv2, s2, "."); + + check_keys(); + + hash[0] = ((crc32 ((unsigned char *)parv[0], strlen (parv[0])) + KEY2) ^ KEY) ^ KEY3; + hash[1] = ((crc32 ((unsigned char *)parv[1], strlen (parv[1])) + KEY2) ^ KEY) ^ KEY3; + + hash[0] <<= 2; + hash[0] >>= 2; + + hash[1] <<= 2; + hash[1] >>= 2; + + if (parc2 >= 2) { + snprintf(mask, HOSTLEN, "%x.%x.%s.%s.%s", + hash[0], hash[1], parv2[parc2 - 3], parv2[parc2 - 2], + parv2[parc2 - 1]); + } else { + hash[2] = ((crc32 ((unsigned char *)parv[2], strlen (parv[2])) + KEY2) ^ KEY) ^ KEY3; + hash[3] = ((crc32 ((unsigned char *)parv[3], strlen (parv[3])) + KEY2) ^ KEY) ^ KEY3; + hash[4] = ((crc32 ((unsigned char *)parv[4], strlen (parv[4])) + KEY2) ^ KEY) ^ KEY3; + hash[5] = ((crc32 ((unsigned char *)parv[5], strlen (parv[5])) + KEY2) ^ KEY) ^ KEY3; + hash[6] = ((crc32 ((unsigned char *)parv[6], strlen (parv[6])) + KEY2) ^ KEY) ^ KEY3; + hash[7] = ((crc32 ((unsigned char *)parv[7], strlen (parv[7])) + KEY2) ^ KEY) ^ KEY3; + + hash[2] <<= 2; + hash[2] >>= 2; + + hash[3] <<= 2; + hash[3] >>= 2; + + hash[4] <<= 2; + hash[4] >>= 2; + + hash[5] <<= 2; + hash[5] >>= 2; + + hash[6] <<= 2; + hash[6] >>= 2; + + hash[7] <<= 2; + hash[7] >>= 2; + + snprintf(mask, HOSTLEN, "%x:%x:%x:%x:%x:%x:%x:%x", + hash[0] / 10000, hash[1] / 10000, hash[2] / 10000, + hash[3] / 10000, hash[4] / 10000, hash[5] / 10000, + hash[6] / 10000, hash[7] / 10000); + } + + strncpy (new, mask, HOSTLEN); + return; +} + +void +ip62arr (char *string, char *dest) +{ + char fields[8][5], temp[HOSTLEN + 1]; + char *pointer = string; + int numberOfColons = 0, i = 0, j = 0, k = 0; + int length = strlen (string), missing = 8; + + while ((*pointer++)) { + if ((*pointer) == ':') + numberOfColons++; + } + + memset (fields, 0, sizeof (fields)); + + for (i = 0; i < length + 1; i++) { + if (string[i] == ':') { + k = 0; + j++; + if (string[i + 1] == ':') { + if (string[i + 2] == '\0') { + missing = 9 - numberOfColons; + } else { + missing = 8 - numberOfColons; + } + + while (missing > 0) { + fields[j][0] = '0'; + j++; + missing--; + } + j--; + } + } else { + fields[j][k++] = string[i]; + } + } + + strcpy (temp, fields[0]); + strcat (temp, ":"); + for (i = 1; i < 8; i++) { + strcat (temp, fields[i]); + if (i != 7) + strcat (temp, ":"); + } + strcpy (dest, temp); +}