diff --git a/help/logout b/help/logout index f37e466..31c7945 100644 --- a/help/logout +++ b/help/logout @@ -1,16 +1,15 @@ Help for LOGOUT: LOGOUT logs you out of services so that you -can log into another username or whatever else -melts your butter. Note that you are automatically -logged out when you sign off. +can log into another username, etc. Note that +you are automatically logged out when you sign off. -If the last two parameters are present it will -logout whomever is currently logged in as the -supplied username. +If the last parameter is present it will log out the +indicated nickname from the username you're currently +logged in as. -Syntax: LOGOUT [username] [password] +Syntax: LOGOUT [nickname] Examples: /msg &nick& LOGOUT - /msg &nick& LOGOUT foo bar + /msg &nick& LOGOUT foo diff --git a/inc/extern.h b/inc/extern.h index 931e28c..f4be38f 100644 --- a/inc/extern.h +++ b/inc/extern.h @@ -82,7 +82,6 @@ E void *scalloc(size_t elsize, size_t els); E void *srealloc(void *oldptr, size_t newsize); E char *sstrdup(const char *s); E void strip(char *line); -E char *make_hostmask(char *nick, char *user, char *host); E void slog(uint32_t level, const char *fmt, ...); E uint32_t time_msec(void); E uint8_t regex_match(regex_t * preg, char *pattern, char *string, diff --git a/src/cmode.c b/src/cmode.c index 42b5997..7796821 100644 --- a/src/cmode.c +++ b/src/cmode.c @@ -189,8 +189,10 @@ void channel_mode(channel_t *chan, uint8_t parc, char *parv[]) if ((MC_SECURE & mc->flags) && (status_mode_list[i].mode == 'o')) { - char *hostbuf = make_hostmask(cu->user->nick, cu->user->user, - cu->user->host); + char hostbuf[BUFSIZE]; + + snprintf(hostbuf, BUFSIZE, "%s!%s@%s", + cu->user->nick, cu->user->user, cu->user->host); if ((!is_founder(mc, mu)) && (cu->user != svs.svs) && (!is_xop(mc, mu, (CA_AOP | CA_SOP))) && diff --git a/src/function.c b/src/function.c index 80d2180..7d0cc6f 100644 --- a/src/function.c +++ b/src/function.c @@ -177,21 +177,6 @@ void strip(char *line) } } -/* creates a hostmask based on params */ -char *make_hostmask(char *nick, char *user, char *host) -{ - static char buf[BUFSIZE]; - buf[0] = '\0'; - - strlcat(buf, nick, BUFSIZE); - strlcat(buf, "!", BUFSIZE); - strlcat(buf, user, BUFSIZE); - strlcat(buf, "@", BUFSIZE); - strlcat(buf, host, BUFSIZE); - - return buf; -} - /* logs something to shrike.log */ void slog(uint32_t level, const char *fmt, ...) { @@ -682,13 +667,13 @@ boolean_t is_successor(mychan_t *mychan, myuser_t *myuser) boolean_t is_xop(mychan_t *mychan, myuser_t *myuser, uint8_t level) { - char *hostbuf; + char hostbuf[BUFSIZE]; if (!myuser) return FALSE; - hostbuf = make_hostmask(myuser->user->nick, myuser->user->user, - myuser->user->host); + snprintf(hostbuf, BUFSIZE, "%s!%s@%s", + myuser->user->nick, myuser->user->user, myuser->user->host); if (chanacs_find(mychan, myuser, level)) return TRUE; @@ -736,7 +721,9 @@ boolean_t should_op(mychan_t *mychan, myuser_t *myuser) boolean_t should_op_host(mychan_t *mychan, char *host) { - char *hostbuf = make_hostmask(svs.nick, svs.user, svs.host); + char hostbuf[BUFSIZE]; + + snprintf(hostbuf, BUFSIZE, "%s!%s@%s", svs.nick, svs.user, svs.host); if (!match(host, hostbuf)) return FALSE; @@ -772,7 +759,9 @@ boolean_t should_voice(mychan_t *mychan, myuser_t *myuser) boolean_t should_voice_host(mychan_t *mychan, char *host) { - char *hostbuf = make_hostmask(svs.nick, svs.user, svs.host); + char hostbuf[BUFSIZE]; + + snprintf(hostbuf, BUFSIZE, "%s!%s@%s", svs.nick, svs.user, svs.host); if (!match(host, hostbuf)) return FALSE; diff --git a/src/node.c b/src/node.c index c5c1772..ec8ef9f 100644 --- a/src/node.c +++ b/src/node.c @@ -768,7 +768,7 @@ chanuser_t *chanuser_add(channel_t *chan, char *nick) chanuser_t *cu, *tcu; mychan_t *mc; uint32_t flags = 0; - char *hostbuf; + char hostbuf[BUFSIZE]; if (*chan->name != '#') { @@ -794,7 +794,7 @@ chanuser_t *chanuser_add(channel_t *chan, char *nick) return NULL; } - hostbuf = make_hostmask(u->nick, u->user, u->host); + snprintf(hostbuf, BUFSIZE, "%s!%s@%s", u->nick, u->user, u->host); /* see if we need to deop them */ if ((mc = mychan_find(chan->name))) @@ -888,16 +888,9 @@ chanuser_t *chanuser_add(channel_t *chan, char *nick) if (mc) { - /* XXX - for some reason make_hostmask doesn't work here */ char newhostbuf[BUFSIZE]; - newhostbuf[0] = '\0'; - - strlcat(newhostbuf, u->nick, BUFSIZE); - strlcat(newhostbuf, "!", BUFSIZE); - strlcat(newhostbuf, u->user, BUFSIZE); - strlcat(newhostbuf, "@", BUFSIZE); - strlcat(newhostbuf, u->host, BUFSIZE); + snprintf(newhostbuf, BUFSIZE, "%s!%s@%s", u->nick, u->user, u->host); if (should_voice_host(mc, newhostbuf)) { diff --git a/src/services.c b/src/services.c index d9b6b3c..423e46b 100644 --- a/src/services.c +++ b/src/services.c @@ -1,4 +1,4 @@ -/* +/* * Copyright (c) 2003-2011 Eric Will * Rights to this code are documented in doc/LICENSE. * @@ -176,9 +176,10 @@ void part(char *chan, char *nick) void expire_check(void *arg) { uint32_t i, j, w, tcnt; + user_t *tu; myuser_t *mu; mychan_t *mc, *tmc; - node_t *n1, *n2, *tn, *n3; + node_t *n1, *n2, *tn, *n3, *n4; for (i = 0; i < HASHSIZE; i++) { @@ -226,9 +227,14 @@ void expire_check(void *arg) mc->founder = mc->successor; mc->successor = NULL; - if (mc->founder->user) - notice(mc->founder->user->nick, - "You are now founder on \2%s\2.", mc->name); + /*if (mc->founder->user) XXX multiuser */ + + /* let them know */ + LIST_FOREACH(n4, mc->founder->users.head) + { + tu = (user_t *)n4->data; + notice(tu->nick, "You are now founder on \2%s\2.", mc->name); + } return; } @@ -340,13 +346,15 @@ void services(char *origin, uint8_t parc, char *parv[]) static void do_login(char *origin) { user_t *u = user_find(origin); + user_t *tu; myuser_t *mu; chanuser_t *cu; chanacs_t *ca; node_t *n; char *username = strtok(NULL, " "); char *password = strtok(NULL, " "); - char buf[BUFSIZE], strfbuf[32]; + char strfbuf[32]; + char hostbuf[BUFSIZE]; struct tm tm; if (!username || !password) @@ -370,12 +378,13 @@ static void do_login(char *origin) return; } + /* XXX - multiuser if (mu->user) { notice(origin, "\2%s\2 is already logged in as \2%s\2.", mu->user->nick, mu->name); return; - } + }*/ if (!strcmp(password, mu->pass)) { @@ -388,13 +397,25 @@ static void do_login(char *origin) } u->myuser = mu; - mu->user = u; + mu->user = u; /* XXX - multiuser */ + add_to_users(u, mu); mu->identified = TRUE; notice(origin, "Authentication successful. You are now logged in as \2%s\2.", u->myuser->name); + /* let others logged into this username know */ + LIST_FOREACH(n, mu->users.head) + { + tu = (user_t *)n->data; + + if (u == tu) + continue; + + notice(tu->nick, "\2%s\2 has logged into \2%s\2.", u->nick, mu->name); + } + /* check for failed attempts and let them know */ if (u->myuser->failnum != 0) { @@ -454,12 +475,9 @@ static void do_login(char *origin) mu->lastfail = NULL; } - strlcpy(buf, u->nick, BUFSIZE); - strlcat(buf, "!", BUFSIZE); - strlcat(buf, u->user, BUFSIZE); - strlcat(buf, "@", BUFSIZE); - strlcat(buf, u->host, BUFSIZE); - mu->lastfail = sstrdup(buf); + snprintf(hostbuf, BUFSIZE, "%s!%s@%s", u->nick, u->user, u->host); + + mu->lastfail = sstrdup(hostbuf); mu->failnum++; mu->lastfailon = CURRTIME; @@ -477,49 +495,57 @@ static void do_login(char *origin) static void do_logout(char *origin) { user_t *u = user_find(origin); - char *user = strtok(NULL, " "); - char *pass = strtok(NULL, " "); + char *nick = strtok(NULL, " "); - if ((!u->myuser) && (!user || !pass)) + if (!u->myuser) { notice(origin, "You are not logged in."); return; } - if (user && pass) + if (nick) { - myuser_t *mu = myuser_find(user); + user_t *ou = user_find(nick); - if (!mu) + if (!ou) { - notice(origin, "No such username: \2%s\2.", user); + notice(origin, "No such nickname: \2%s\2.", nick); return; } - if ((!strcmp(mu->pass, pass)) && (mu->user)) + if (!ou->myuser) { - u = mu->user; - notice(u->nick, "You were logged out by \2%s\2.", origin); + notice(origin, "\2%s\2 is not logged in.", ou->nick); + return; } - else + + if (u->myuser != ou->myuser) { - notice(origin, "Authentication failed. Invalid password for \2%s\2.", - mu->name); + notice(origin, "\2%s\2 is not logged in as \2%s\2.", + ou->nick, u->myuser->name); return; } + + notice(ou->nick, "You have been logged out by \2%s\2.", u->nick); + + snoop("LOGOUT: \2%s\2 from \2%s\2 by \2%s\2", + ou->nick, ou->myuser->name, u->nick); + + u = ou; /* the rest of the function acts on this user instead of origin */ } + else + snoop("LOGOUT: \2%s\2 from \2%s\2", u->nick, u->myuser->name); if (is_sra(u->myuser)) snoop("DESRA: \2%s\2 as \2%s\2", u->nick, u->myuser->name); - snoop("LOGOUT: \2%s\2 from \2%s\2", u->nick, u->myuser->name); - if (irccasecmp(origin, u->nick)) notice(origin, "\2%s\2 has been logged out.", u->nick); else notice(origin, "You have been logged out."); - u->myuser->user = NULL; + remove_from_users(u, u->myuser); + u->myuser->user = NULL; /* XXX - multiuser */ u->myuser->identified = FALSE; u->myuser->lastlogin = CURRTIME; u->myuser = NULL; @@ -537,7 +563,7 @@ static void do_xop(char *origin, uint8_t level) char *chan = strtok(NULL, " "); char *cmd = strtok(NULL, " "); char *uname = strtok(NULL, " "); - char *hostbuf; + char hostbuf[BUFSIZE]; if (!cmd || !chan) { @@ -617,14 +643,17 @@ static void do_xop(char *origin, uint8_t level) if (cu->modes & CMODE_VOICE) return; - hostbuf = make_hostmask(cu->user->nick, cu->user->user, - cu->user->host); + snprintf(hostbuf, BUFSIZE, "%s!%s@%s", + cu->user->nick, cu->user->user, cu->user->host); + + slog(LG_DEBUG, "do_xop(): trying to voice host %s", hostbuf); if (should_voice_host(mc, hostbuf)) { cmode(svs.nick, mc->name, "+v", cu->user->nick); cu->modes |= CMODE_VOICE; } + slog(LG_DEBUG, "do_xop: tried to do should_voice_host(%s, %s)", mc->name, hostbuf); } return; @@ -726,8 +755,8 @@ static void do_xop(char *origin, uint8_t level) if (cu->modes & CMODE_OP) return; - hostbuf = make_hostmask(cu->user->nick, cu->user->user, - cu->user->host); + snprintf(hostbuf, BUFSIZE, "%s!%s@%s", + cu->user->nick, cu->user->user, cu->user->host); if (should_op_host(mc, hostbuf)) { @@ -1116,7 +1145,7 @@ static void do_op(char *origin) mychan_t *mc; user_t *u; chanuser_t *cu; - char *hostbuf; + char hostbuf[BUFSIZE]; if (!chan) { @@ -1157,7 +1186,7 @@ static void do_op(char *origin) return; } - hostbuf = make_hostmask(u->nick, u->user, u->host); + snprintf(hostbuf, BUFSIZE, "%s!%s@%s", u->nick, u->user, u->host); if (!chanacs_find_host(mc, hostbuf, CA_AOP)) { @@ -1624,7 +1653,7 @@ static void do_recover(char *origin) mychan_t *mc; node_t *n; char *name = strtok(NULL, " "); - char *hostbuf; + char hostbuf[BUFSIZE]; boolean_t in_chan; if (!name) @@ -1709,7 +1738,7 @@ static void do_recover(char *origin) if (!in_chan) { /* set an exempt on the user calling this */ - hostbuf = make_hostmask(u->nick, u->user, u->host); + snprintf(hostbuf, BUFSIZE, "%s!%s@%s", u->nick, u->user, u->host); sts(":%s MODE %s +e %s", svs.nick, mc->chan->name, hostbuf); @@ -2063,7 +2092,7 @@ static void do_unbanme(char *origin) user_t *u = user_find(origin); mychan_t *mc; char *name = strtok(NULL, " "); - char *hostbuf; + char hostbuf[BUFSIZE]; if (!name) { @@ -2095,7 +2124,7 @@ static void do_unbanme(char *origin) } /* set an exempt on the user calling this */ - hostbuf = make_hostmask(u->nick, u->user, u->host); + snprintf(hostbuf, BUFSIZE, "%s!%s@%s", u->nick, u->user, u->host); sts(":%s MODE %s +e %s", svs.nick, mc->chan->name, hostbuf);