]> code.citadel.org Git - citadel.git/blobdiff - citadel/internet_addressing.c
* Renamed CtdlLocalHost() to CtdlHostAlias() and worked it a little deeper into
[citadel.git] / citadel / internet_addressing.c
index 365a1ec9f57dd6252272072f7cc10bb7a04534b9..ed19a0cc02f8294c33b1d1491e2ca5a1ca746ae6 100644 (file)
@@ -38,15 +38,61 @@ struct trynamebuf {
        char buffer2[256];
 };
 
+char *inetcfg = NULL;
+
+
+
+/*
+ * Return nonzero if the supplied name is an alias for this host.
+ */
+int CtdlHostAlias(char *fqdn) {
+       int config_lines;
+       int i;
+       char buf[256];
+       char host[256], type[256];
+
+       if (!strcasecmp(fqdn, config.c_fqdn)) return(hostalias_localhost);
+       if (inetcfg == NULL) return(hostalias_nomatch);
+
+       config_lines = num_tokens(inetcfg, '\n');
+       for (i=0; i<config_lines; ++i) {
+               extract_token(buf, inetcfg, i, '\n');
+               extract_token(host, buf, 0, '|');
+               extract_token(type, buf, 1, '|');
+
+               if ( (!strcasecmp(type, "localhost"))
+                  && (!strcasecmp(fqdn, host)))
+                       return(hostalias_localhost);
+
+               if ( (!strcasecmp(type, "gatewaydomain"))
+                  && (!strcasecmp(&fqdn[strlen(fqdn)-strlen(host)], host)))
+                       return(hostalias_gatewaydomain);
+
+       }
+
+       return(hostalias_nomatch);
+}
+
+
+
+
+
+
 
 /*
  * Return 0 if a given string fuzzy-matches a Citadel user account
  *
- * FIX ... this needs to be updated to match any and all address syntaxes.
+ * FIX ... this needs to be updated to handle aliases.
  */
 int fuzzy_match(struct usersupp *us, char *matchstring) {
        int a;
 
+       if ( (!strncasecmp(matchstring, "cit", 3)) 
+          && (atol(&matchstring[3]) == us->usernum)) {
+               return 0;
+       }
+
+
        for (a=0; a<strlen(us->fullname); ++a) {
                if (!strncasecmp(&us->fullname[a],
                   matchstring, strlen(matchstring))) {
@@ -250,17 +296,24 @@ int convert_internet_address(char *destuser, char *desthost, char *source)
        char name[256];
        struct quickroom qrbuf;
        int i;
+       int hostalias;
        struct trynamebuf tnb;
+       char buf[256];
 
        /* Split it up */
        process_rfc822_addr(source, user, node, name);
 
        /* Map the FQDN to a Citadel node name
-        * FIX ... we have to check for all known aliases for the local
-        *         system, and also handle gateway domains, etc. etc.
         */
-       if (!strcasecmp(node, config.c_fqdn)) {
-               strcpy(node, config.c_nodename);
+       hostalias =  CtdlHostAlias(node);
+       switch(hostalias) {
+               case hostalias_localhost:
+                       strcpy(node, config.c_nodename);
+                       break;
+
+               case hostalias_gatewaydomain:
+                       extract_token(buf, node, 0, '.');
+                       safestrncpy(node, buf, sizeof buf);
        }
 
        /* Now try to resolve the name