X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=ngircd-alex.git;a=blobdiff_plain;f=src%2Fngircd%2Firc-login.c;h=846b10d6e8aa2f08951c393f545aba0deb8ae331;hp=f3226011890655711a4781b8e716e531d7244016;hb=c8162a80beba80f3b1d04fdba8e74bf5366c47f7;hpb=f64cb901efe2f303413816b725520dfd4caee7bf diff --git a/src/ngircd/irc-login.c b/src/ngircd/irc-login.c index f3226011..846b10d6 100644 --- a/src/ngircd/irc-login.c +++ b/src/ngircd/irc-login.c @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors. + * Copyright (c)2001-2018 Alexander Barton (alex@barton.de) and Contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -89,7 +89,7 @@ IRC_PASS( CLIENT *Client, REQUEST *Req ) /* Protocol version */ if (Req->argc >= 2 && strlen(Req->argv[1]) >= 4) { - int c2, c4; + char c2, c4; c2 = Req->argv[1][2]; c4 = Req->argv[1][4]; @@ -196,6 +196,7 @@ IRC_NICK( CLIENT *Client, REQUEST *Req ) /* Search "target" client */ if (Client_Type(Client) == CLIENT_SERVER) { + _IRC_REQUIRE_PREFIX_OR_RETURN_(Client, Req) target = Client_Search(Req->prefix); if (!target) return IRC_WriteErrClient(Client, @@ -262,16 +263,18 @@ IRC_NICK( CLIENT *Client, REQUEST *Req ) /* Nickname change */ /* Check that the user isn't on any channels set +N */ - chan = Channel_First(); - while (chan) { - if(Channel_IsMemberOf(chan, Client) && - Channel_HasMode(chan, 'N') && - !Client_HasMode(Client, 'o')) - return IRC_WriteErrClient(Client, - ERR_UNAVAILRESOURCE_MSG, - Client_ID(Client), - Channel_Name(chan)); - chan = Channel_Next(chan); + if(Client_Type(Client) == CLIENT_USER && + !Client_HasMode(Client, 'o')) { + chan = Channel_First(); + while (chan) { + if(Channel_HasMode(chan, 'N') && + Channel_IsMemberOf(chan, Client)) + return IRC_WriteErrClient(Client, + ERR_NONICKCHANGE_MSG, + Client_ID(Client), + Channel_Name(chan)); + chan = Channel_Next(chan); + } } Change_Nick(Client, target, Req->argv[0], @@ -377,6 +380,8 @@ IRC_SVSNICK(CLIENT *Client, REQUEST *Req) assert(Client != NULL); assert(Req != NULL); + _IRC_REQUIRE_PREFIX_OR_RETURN_(Client, Req) + /* Search the originator */ from = Client_Search(Req->prefix); if (!from) @@ -479,6 +484,7 @@ IRC_USER(CLIENT * Client, REQUEST * Req) Client_Type(Client) == CLIENT_SERVICE) { /* Server/service updating an user */ _IRC_ARGC_EQ_OR_RETURN_(Client, Req, 4) + _IRC_REQUIRE_PREFIX_OR_RETURN_(Client, Req) c = Client_Search(Req->prefix); if (!c) @@ -651,6 +657,8 @@ IRC_QUIT( CLIENT *Client, REQUEST *Req ) if (Client_Type(Client) == CLIENT_SERVER) { /* Server */ + _IRC_REQUIRE_PREFIX_OR_RETURN_(Client, Req) + target = Client_Search(Req->prefix); if (!target) { Log(LOG_WARNING, @@ -739,9 +747,10 @@ IRC_PING(CLIENT *Client, REQUEST *Req) if (target != Client_ThisServer()) { /* Ok, we have to forward the PING */ - if (Client_Type(Client) == CLIENT_SERVER) + if (Client_Type(Client) == CLIENT_SERVER) { + _IRC_REQUIRE_PREFIX_OR_RETURN_(Client, Req) from = Client_Search(Req->prefix); - else + } else from = Client; if (!from) return IRC_WriteErrClient(Client, @@ -813,6 +822,8 @@ IRC_PONG(CLIENT *Client, REQUEST *Req) /* Forward? */ if (Req->argc == 2 && Client_Type(Client) == CLIENT_SERVER) { + _IRC_REQUIRE_PREFIX_OR_RETURN_(Client, Req) + target = Client_Search(Req->argv[0]); if (!target) return IRC_WriteErrClient(Client, ERR_NOSUCHSERVER_MSG, @@ -862,13 +873,14 @@ IRC_PONG(CLIENT *Client, REQUEST *Req) if (Client_Type(Client) == CLIENT_SERVER && Conn_LastPing(conn) == 0) { Log(LOG_INFO, "Synchronization with \"%s\" done (connection %d): %ld second%s [%ld users, %ld channels].", - Client_ID(Client), conn, time(NULL) - Conn_GetSignon(conn), + Client_ID(Client), conn, + (long)(time(NULL) - Conn_GetSignon(conn)), time(NULL) - Conn_GetSignon(conn) == 1 ? "" : "s", Client_UserCount(), Channel_CountVisible(NULL)); Conn_UpdatePing(conn); } else LogDebug("Connection %d: received PONG. Lag: %ld seconds.", - conn, time(NULL) - Conn_LastPing(conn)); + conn, (long)(time(NULL) - Conn_LastPing(conn))); return CONNECTED; } /* IRC_PONG */