]> 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 f44640b1c1b2cdb793d228f26f2b32b6f3dcac16..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,
@@ -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;
 
@@ -199,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);
@@ -226,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;
 
@@ -253,3 +289,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);
+}