X-Git-Url: https://jfr.im/git/irc/evilnet/x3.git/blobdiff_plain/68b754827164504609b223470066edfc4aa075dd..26d745b2a04a97f84d065085ab371cdff6f627d9:/src/hosthiding.c diff --git a/src/hosthiding.c b/src/hosthiding.c index 9c46528..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, @@ -152,6 +157,29 @@ str2arr (char **pparv, char *string, char *delim) return pparc; } +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) { @@ -169,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; @@ -224,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; @@ -260,6 +292,9 @@ make_ipv6virthost (char *curr, char *host, char *new) 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); @@ -268,6 +303,8 @@ make_ipv6virthost (char *curr, char *host, char *new) 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;