]> jfr.im git - irc/evilnet/x3.git/blobdiff - src/tools.c
found out from Kyle what b flag is.
[irc/evilnet/x3.git] / src / tools.c
index b7e45a9ea5470d906ae0d555f799f71eb69e6302..946f27a5175b297c4527781d9420ec5a4ddbc770 100644 (file)
@@ -1,7 +1,7 @@
 /* tools.c - miscellaneous utility functions
  * Copyright 2000-2004 srvx Development Team
  *
- * This file is part of srvx.
+ * This file is part of x3.
  *
  * srvx is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -309,18 +309,16 @@ extern const char *hidden_host_suffix;
 
 int user_matches_glob(struct userNode *user, const char *orig_glob, int include_nick)
 {
-    /* based on IsSetHost(user) and include_nick, build a nick!user@host string
+    /* A new glob function, the old one had many false positives.
+     * look at IsSetHost(user) etc and include_nick, build a nick!user@host string
      * from user and save it in a variable. Compare with match_ircglob() and 
-     * return the results
+     * return the results. Match any of the possible user@host combos (ugh) -Rubin
      */
-    char *matchstr_nick;
     char *matchstr_user;
     char *matchstr_host;
-    char *matchstr_full;
+    char *matchstr_full = NULL;
 
-    matchstr_nick = user->nick;
-
-    if(IsSetHost(user))
+    if(IsSetHost(user))   /* S: line sethosts */
     {
         /* Grab host and user from sethost instead of real host */
         char *buff;
@@ -328,26 +326,60 @@ int user_matches_glob(struct userNode *user, const char *orig_glob, int include_
         strcpy(buff, user->sethost);
         matchstr_user = mysep(&buff, "@");
         matchstr_host = mysep(&buff, "@");
+
+        matchstr_full = alloca(strlen(user->nick) + strlen(matchstr_user) + strlen(matchstr_host) + 4);
+        if(include_nick)
+            sprintf(matchstr_full, "%s!%s@%s", user->nick, matchstr_user, matchstr_host);
+        else
+            sprintf(matchstr_full, "%s@%s", matchstr_user, matchstr_host);
+        if(match_ircglob(matchstr_full, orig_glob))
+            return(1);
     }
-    else if(IsFakeHost(user))
+    else if(IsFakeHost(user))  /* Fakehost */
     {
-        matchstr_user = user->ident;
-        matchstr_host = user->fakehost;
+        matchstr_full = alloca(strlen(user->nick) + strlen(user->ident) + strlen(user->fakehost) + 4);
+        if(include_nick)
+            sprintf(matchstr_full, "%s!%s@%s", user->nick, user->ident, user->fakehost);
+        else
+            sprintf(matchstr_full, "%s@%s", user->ident, user->fakehost);
+        if(match_ircglob(matchstr_full, orig_glob))
+            return(1);
     }
-    else if(hidden_host_suffix && user->handle_info) 
+    else if(hidden_host_suffix && user->handle_info)  /* name.users.network.org  host */
     {
         matchstr_host = alloca(strlen(user->handle_info->handle) + strlen(hidden_host_suffix) + 2);
         sprintf(matchstr_host, "%s.%s", user->handle_info->handle, hidden_host_suffix);
         matchstr_user = user->ident;
+
+        matchstr_full = alloca(strlen(user->nick) + strlen(user->ident) + strlen(matchstr_host) + 4);
+        if(include_nick)
+            sprintf(matchstr_full, "%s!%s@%s", user->nick, user->ident, matchstr_host);
+        else
+            sprintf(matchstr_full, "%s@%s", user->ident, matchstr_host);
+        if(match_ircglob(matchstr_full, orig_glob))
+            return(1);
     }
+
+    /* Check normal hostname */
+    matchstr_full = alloca(strlen(user->nick) + strlen(user->ident) + strlen(user->hostname) + 4);
+    if(include_nick)
+        sprintf(matchstr_full, "%s!%s@%s", user->nick, user->ident, user->hostname);
     else
-    {
-        matchstr_user = user->ident;
-        matchstr_host = user->hostname;
-    }
-    matchstr_full = alloca(strlen(matchstr_nick) + strlen(matchstr_user) + strlen(matchstr_host) + 4);
-    sprintf(matchstr_full, "%s!%s@%s", matchstr_nick, matchstr_user, matchstr_host);
-    return match_ircglob(matchstr_full, orig_glob);
+        sprintf(matchstr_full, "%s@%s", user->ident, user->hostname);
+    if(match_ircglob(matchstr_full, orig_glob))
+            return(1);
+
+    /* Check IP hostname (could skip this if same as above?)*/
+    matchstr_host = inet_ntoa(user->ip);
+    matchstr_full = alloca(strlen(user->nick) + strlen(user->ident) + strlen(matchstr_host) + 4);
+    if(include_nick)
+        sprintf(matchstr_full, "%s!%s@%s", user->nick, user->ident, matchstr_host);
+    else
+        sprintf(matchstr_full, "%s@%s", user->ident, matchstr_host);
+    if(match_ircglob(matchstr_full, orig_glob))
+            return(1);
+
+    return(0); /* Didnt match anything */
 }
 
 int
@@ -386,24 +418,24 @@ user_matches_glob_broken(struct userNode *user, const char *orig_glob, int inclu
     if (!match_ircglob(user->ident, glob) && (IsSetHost(user) && !match_ircglob(setident, glob)))
        return 0;
     glob = marker + 1;
-    /* Now check the host part */
-    if (isdigit(*glob) && !glob[strspn(glob, "0123456789./*?")]) {
-        /* Looks like an IP-based mask */
-        return match_ircglob(inet_ntoa(user->ip), glob);
-    } else {
-        /* The host part of the mask isn't IP-based */
-        if (IsSetHost(user) && match_ircglob(sethostname, glob))
+    /* If it might be an IP glob, test that. */
+    if (!glob[strspn(glob, "0123456789./*?")]
+        && match_ircglob(inet_ntoa(user->ip), glob))
+        return 1;
+    /* Check for a fakehost match. */
+    if (IsFakeHost(user) && match_ircglob(user->fakehost, glob))
+        return 1;
+    if (IsSetHost(user) && match_ircglob(sethostname, glob))
+        return 1;
+    /* Check for an account match. */
+    if (hidden_host_suffix && user->handle_info) {
+        char hidden_host[HOSTLEN+1];
+        snprintf(hidden_host, sizeof(hidden_host), "%s.%s", user->handle_info->handle, hidden_host_suffix);
+        if (match_ircglob(hidden_host, glob))
             return 1;
-        if (IsFakeHost(user) && match_ircglob(user->fakehost, glob))
-            return 1;
-        if (hidden_host_suffix && user->handle_info) {
-            char hidden_host[HOSTLEN+1];
-            snprintf(hidden_host, sizeof(hidden_host), "%s.%s", user->handle_info->handle, hidden_host_suffix);
-            if (match_ircglob(hidden_host, glob))
-                return 1;
-        }
-        return match_ircglob(user->hostname, glob);
     }
+    /* None of the above; could only be a hostname match. */
+    return match_ircglob(user->hostname, glob);
 }
 
 int
@@ -432,7 +464,7 @@ is_gline(const char *text)
         return 0;
     if (!*text)
         return 0;
-    while (*text && (isalnum((char)*text) || strchr(".-?*", *text)))
+    while (*text && (isalnum((char)*text) || strchr(".-?*:", *text)))
         text++;
     return !*text;
 }
@@ -461,7 +493,7 @@ split_ircmask(char *text, char **nick, char **ident, char **host)
         *ident = start;
     
     start = ++text;
-    while (*text && (isalnum((char)*text) || strchr(".-?*", *text)))
+    while (*text && (isalnum((char)*text) || strchr(".-?*:", *text)))
         text++;
     if (host)
         *host = start;
@@ -556,7 +588,7 @@ TypeLength(char type)
 {
     switch (type) {
     case 'y': return 365*24*60*60;
-    case 'M': return 31*24*60*60;
+    case 'M': return 30*24*60*60;
     case 'w': return 7*24*60*60;
     case 'd': return 24*60*60;
     case 'h': return 60*60;
@@ -566,6 +598,10 @@ TypeLength(char type)
     }
 }
 
+/* This function is not entirely accurate as it does not take into account leap units
+ * or varying months. TODO: use proper dateadd functions to calculate real seconds
+ * from now for the units (eg 1M should be give us seconds till todays date next month)
+ */
 unsigned long
 ParseInterval(const char *interval)
 {
@@ -735,13 +771,13 @@ intervalString(char *output, time_t interval, struct handle_info *hi)
 
         if (words++ == 1) {
             msg = language_find_message(lang, "MSG_AND");
-            pos += sprintf(output + pos, " %s ", msg);
+            pos += sprintf(output + pos, "%s ", msg);
         }
         if (count == 1)
             msg = language_find_message(lang, unit[type].msg_single);
         else
             msg = language_find_message(lang, unit[type].msg_plural);
-        pos += sprintf(output + pos, "%d %s", count, msg);
+        pos += sprintf(output + pos, "%d%s", count, msg);
     }
 
     output[pos] = 0;
@@ -920,3 +956,13 @@ char *mysep(char **sepstr, char *delim)
   return(retstr);
 }
 
+char *time2str(time_t thetime)
+{
+    char *buf, *tmp;
+
+    buf = ctime(&thetime);
+    tmp = (char *)strchr(buf, '\n');
+    *tmp = '\0';
+    return(buf);
+}
+