diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/channels.c | 30 | ||||
-rw-r--r-- | src/chanserv.c | 13 | ||||
-rw-r--r-- | src/nickserv.c | 20 | ||||
-rw-r--r-- | src/proxy.c | 2 | ||||
-rw-r--r-- | src/servers.c | 4 | ||||
-rw-r--r-- | src/sessions.c | 2 | ||||
-rw-r--r-- | src/timeout.c | 11 |
7 files changed, 62 insertions, 20 deletions
diff --git a/src/channels.c b/src/channels.c index 94cc880f8..eff7b5f96 100644 --- a/src/channels.c +++ b/src/channels.c @@ -235,10 +235,32 @@ void chan_set_modes(const char *source, Channel * chan, int ac, char **av, mode, chan->name, user->nick); if (add) { - if (check && cum->is_valid - && !cum->is_valid(user, chan, servermode)) - continue; - chan_set_user_status(chan, user, cum->status); + /* Fixes bug #68 + - might be a bit ugly but it works, the idea is that since the + is_valid function strips out all of the modes there is no point + in sending it over and over again + */ + if (check) { + if (check == 2 && cum->is_valid) { + if (debug) { + alog("debug: Modes already removed, calling remove_user_status() to clean up"); + } + chan_remove_user_status(chan, user, cum->status); + continue; + } else if (cum->is_valid + && !cum->is_valid(user, chan, servermode)) { + if (debug) { + alog("debug: Modes already sent calling remove_user_status() to clean up"); + } + chan_remove_user_status(chan, user, cum->status); + check = 2; + continue; + } else { + chan_set_user_status(chan, user, cum->status); + } + } else { + chan_set_user_status(chan, user, cum->status); + } } else { chan_remove_user_status(chan, user, cum->status); } diff --git a/src/chanserv.c b/src/chanserv.c index 46c06b930..8bdfed631 100644 --- a/src/chanserv.c +++ b/src/chanserv.c @@ -1971,7 +1971,8 @@ ChannelInfo *cs_findchan(const char *chan) return NULL; } - for (ci = chanlists[tolower(chan[1])]; ci; ci = ci->next) { + for (ci = chanlists[(unsigned char) tolower(chan[1])]; ci; + ci = ci->next) { if (stricmp(ci->name, chan) == 0) return ci; } @@ -2035,13 +2036,13 @@ void alpha_insert_chan(ChannelInfo * ci) chan = ci->name; - for (prev = NULL, ptr = chanlists[tolower(chan[1])]; + for (prev = NULL, ptr = chanlists[(unsigned char) tolower(chan[1])]; ptr != NULL && stricmp(ptr->name, chan) < 0; prev = ptr, ptr = ptr->next); ci->prev = prev; ci->next = ptr; if (!prev) - chanlists[tolower(chan[1])] = ci; + chanlists[(unsigned char) tolower(chan[1])] = ci; else prev->next = ci; if (ptr) @@ -2126,7 +2127,7 @@ int delchan(ChannelInfo * ci) if (ci->prev) ci->prev->next = ci->next; else - chanlists[tolower(ci->name[1])] = ci->next; + chanlists[(unsigned char) tolower(ci->name[1])] = ci->next; if (ci->desc) free(ci->desc); if (ci->mlock_key) @@ -3700,7 +3701,7 @@ static int do_xop(User * u, char *xname, int xlev, int *xmsgs) ulev = get_access(u, ci); - if (xlev >= ulev || ulev < ACCESS_AOP) { + if ((xlev >= ulev || ulev < ACCESS_AOP) && !is_servadmin) { notice_lang(s_ChanServ, u, PERMISSION_DENIED); return MOD_CONT; } @@ -3721,7 +3722,7 @@ static int do_xop(User * u, char *xname, int xlev, int *xmsgs) /** * Patch provided by PopCorn to prevert AOP's reducing SOP's levels **/ - if ((access->level >= ulev) && (!u->isSuperAdmin)) { + if ((access->level >= ulev) && (!is_servadmin)) { notice_lang(s_ChanServ, u, PERMISSION_DENIED); return MOD_CONT; } diff --git a/src/nickserv.c b/src/nickserv.c index 65ee90489..87a2228dc 100644 --- a/src/nickserv.c +++ b/src/nickserv.c @@ -2044,9 +2044,13 @@ static int do_register(User * u) } } - if (!pass || (NSForceEmail && !email)) { - syntax_error(s_NickServ, u, "REGISTER", - NICK_REGISTER_SYNTAX_EMAIL); + if (!pass) { + if (NSForceEmail && !email) { + syntax_error(s_NickServ, u, "REGISTER", + NICK_REGISTER_SYNTAX_EMAIL); + } else { + syntax_error(s_NickServ, u, "REGISTER", NICK_REGISTER_SYNTAX); + } } else if (time(NULL) < u->lastnickreg + NSRegDelay) { notice_lang(s_NickServ, u, NICK_REG_PLEASE_WAIT, NSRegDelay); } else if (u->na) { /* i.e. there's already such a nick regged */ @@ -3247,6 +3251,11 @@ static int do_access(User * u) if (cmd && stricmp(cmd, "LIST") == 0 && mask && is_services_admin(u) && (na = findnick(mask))) { + if (na->nc->accesscount == 0) { + notice_lang(s_NickServ, u, NICK_ACCESS_LIST_X_EMPTY, na->nick); + return MOD_CONT; + } + if (na->status & NS_VERBOTEN) { notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, na->nick); return MOD_CONT; @@ -3326,6 +3335,11 @@ static int do_access(User * u) na->nc->access = NULL; } } else if (stricmp(cmd, "LIST") == 0) { + if (na->nc->accesscount == 0) { + notice_lang(s_NickServ, u, NICK_ACCESS_LIST_EMPTY, u->nick); + return MOD_CONT; + } + notice_lang(s_NickServ, u, NICK_ACCESS_LIST); for (access = na->nc->access, i = 0; i < na->nc->accesscount; access++, i++) { diff --git a/src/proxy.c b/src/proxy.c index 757bf2bd9..0a6ff0d84 100644 --- a/src/proxy.c +++ b/src/proxy.c @@ -234,7 +234,7 @@ int proxy_check(char *nick, char *host, uint32 ip) for (message = ProxyMessage, i = 0; i < 8 && *message && **message; message++, i++) - notice(s_GlobalNoticer, nick, *message); + notice(s_GlobalNoticer, nick, "%s", *message); hc = proxy_cache_add(host); if (ircd->nickip) { diff --git a/src/servers.c b/src/servers.c index c32aadac0..d77dc4713 100644 --- a/src/servers.c +++ b/src/servers.c @@ -183,6 +183,10 @@ Server *findserver(Server * s, const char *name) { Server *sl; + if (!name || !*name) { + return NULL; + } + if (debug >= 3) alog("debug: findserver(%p)", name); while (s && (stricmp(s->name, name) != 0)) { diff --git a/src/sessions.c b/src/sessions.c index 37744a967..30edad494 100644 --- a/src/sessions.c +++ b/src/sessions.c @@ -240,7 +240,7 @@ int add_session(char *nick, char *host) if (SessionLimitExceeded) notice(s_OperServ, nick, SessionLimitExceeded, host); if (SessionLimitDetailsLoc) - notice(s_OperServ, nick, SessionLimitDetailsLoc); + notice(s_OperServ, nick, "%s", SessionLimitDetailsLoc); /* We don't use kill_user() because a user stucture has not yet * been created. Simply kill the user. -TheShadow diff --git a/src/timeout.c b/src/timeout.c index f71e16cac..bd7af4c8c 100644 --- a/src/timeout.c +++ b/src/timeout.c @@ -27,14 +27,15 @@ int send_timeout_list(User * u) { Timeout *to, *last; - notice(s_OperServ, u->nick, "Now: %ld", time(NULL)); + notice(s_OperServ, u->nick, "Now: %ld", (long int) time(NULL)); for (to = timeouts, last = NULL; to; last = to, to = to->next) { - notice(s_OperServ, u->nick, "%p: %ld: %p (%p)", - to, to->timeout, to->code, to->data); + notice(s_OperServ, u->nick, "0x%p: %ld: 0x%p (0x%p)", + (void *) to, (long int) to->timeout, (void *) to->code, + (void *) to->data); if (to->prev != last) notice(s_OperServ, u->nick, - " to->prev incorrect! expected=%p seen=%p", - last, to->prev); + " to->prev incorrect! expected=0x%p seen=0x%p", + (void *) last, (void *) to->prev); } return MOD_CONT; } |