commit 4a3e40bc95e783145855da611fa5944401a9c2c9 from: Alexander Barton date: Wed Sep 30 14:00:05 2009 UTC Check_Oper(): check origin of forwarded messages instead of server. commit - 45b1a45c979d0418591a1c62204d5a607cf86cde commit + 4a3e40bc95e783145855da611fa5944401a9c2c9 blob - e7dfee6c944e48237b25a4d2aa7942aa81c3676b blob + 656e9591f801bd11555a21c3a0ca843cd2d89652 --- src/ngircd/irc-oper.c +++ src/ngircd/irc-oper.c @@ -55,12 +55,23 @@ Bad_OperPass(CLIENT *Client, char *errtoken, char *err * Check that the client is an IRC operator allowed to administer this server. */ static bool -Check_Oper(CLIENT * Client) +Check_Oper(CLIENT * Client, REQUEST * Req) { - if (!Client_HasMode(Client, 'o')) + CLIENT *c; + + assert(Client != NULL); + assert(Req != NULL); + + if (Client_Type(Client) == CLIENT_SERVER && Req->prefix) + c = Client_Search(Req->prefix); + else + c = Client; + if (!c) return false; - if (!Client_OperByMe(Client) && !Conf_AllowRemoteOper) + if (!Client_HasMode(c, 'o')) return false; + if (!Client_OperByMe(c) && !Conf_AllowRemoteOper) + return false; /* The client is an local IRC operator, or this server is configured * to trust remote operators. */ return true; @@ -140,7 +151,7 @@ IRC_DIE(CLIENT * Client, REQUEST * Req) assert(Client != NULL); assert(Req != NULL); - if (!Check_Oper(Client)) + if (!Check_Oper(Client, Req)) return No_Privileges(Client, Req); /* Bad number of parameters? */ @@ -180,7 +191,7 @@ IRC_REHASH( CLIENT *Client, REQUEST *Req ) assert( Client != NULL ); assert( Req != NULL ); - if (!Check_Oper(Client)) + if (!Check_Oper(Client, Req)) return No_Privileges(Client, Req); /* Bad number of parameters? */ @@ -201,7 +212,7 @@ IRC_RESTART( CLIENT *Client, REQUEST *Req ) assert( Client != NULL ); assert( Req != NULL ); - if (!Check_Oper(Client)) + if (!Check_Oper(Client, Req)) return No_Privileges(Client, Req); /* Bad number of parameters? */ @@ -222,7 +233,7 @@ IRC_CONNECT(CLIENT * Client, REQUEST * Req) assert(Client != NULL); assert(Req != NULL); - if (!Check_Oper(Client)) + if (!Check_Oper(Client, Req)) return No_Privileges(Client, Req); /* Bad number of parameters? */ @@ -283,7 +294,7 @@ IRC_DISCONNECT(CLIENT * Client, REQUEST * Req) assert(Client != NULL); assert(Req != NULL); - if (!Check_Oper(Client)) + if (!Check_Oper(Client, Req)) return No_Privileges(Client, Req); /* Bad number of parameters? */