summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/channels.c30
-rw-r--r--src/chanserv.c13
-rw-r--r--src/nickserv.c20
-rw-r--r--src/proxy.c2
-rw-r--r--src/servers.c4
-rw-r--r--src/sessions.c2
-rw-r--r--src/timeout.c11
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;
}