]> jfr.im git - irc/evilnet/x3.git/blobdiff - src/hosthiding.c
Minor typo in previous commit where returning 0 when it should have been 1 from opser...
[irc/evilnet/x3.git] / src / hosthiding.c
index 943e23079fdfac14f94f5a2ba972ecf579487821..850cdaa8be401b2aab99c323882b9639af0f1883 100644 (file)
@@ -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,
   /*                                                                        */
   /*  --------------------------------------------------------------------  */
 
+/* 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;
 
@@ -197,10 +227,16 @@ make_virthost (char *curr, char *host, char *virt)
       snprintf(mask, HOSTLEN, "%x.%x.%s.%s.%s",
               hash[0], hash[1], parv2[parc2 - 3], parv2[parc2 - 2],
               parv2[parc2 - 1]);
-    } else {
+    } else if (parc2 >= 3) {
        snprintf(mask, HOSTLEN, "%x.%x.%s.%s",
                hash[0], hash[1], parv2[parc2 - 2],
                parv2[parc2 - 1]);
+    } else if (parc2 >= 2) {
+       snprintf(mask, HOSTLEN, "%x.%x.%s",
+               hash[0], hash[1], parv2[parc2 - 1]);
+    } else {
+       snprintf(mask, HOSTLEN, "%x.%x",
+               hash[0], hash[1]);
     }
   }
   safestrncpy (virt, mask, HOSTLEN);
@@ -224,6 +260,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;
 
@@ -271,6 +309,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;