/* 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
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;
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
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
return 0;
if (!*text)
return 0;
- while (*text && (isalnum((char)*text) || strchr(".-?*", *text)))
+ while (*text && (isalnum((char)*text) || strchr(".-?*:", *text)))
text++;
return !*text;
}
*ident = start;
start = ++text;
- while (*text && (isalnum((char)*text) || strchr(".-?*", *text)))
+ while (*text && (isalnum((char)*text) || strchr(".-?*:", *text)))
text++;
if (host)
*host = start;
return(retstr);
}
+char *time2str(time_t thetime)
+{
+ char *buf, *tmp;
+
+ buf = ctime(&thetime);
+ tmp = (char *)strchr(buf, '\n');
+ *tmp = '\0';
+ return(buf);
+}
+