2 * ngIRCd -- The Next Generation IRC Daemon
3 * Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 * Please read the file COPYING, README and AUTHORS for more information.
11 * IRC operator commands
17 static char UNUSED id[] = "$Id: irc-oper.c,v 1.25 2006/04/23 10:37:27 fw Exp $";
30 #include "irc-write.h"
41 Bad_OperPass(CLIENT *Client, char *errtoken, char *errmsg)
43 Log( LOG_WARNING, "Got invalid OPER from \"%s\": \"%s\" -- %s", Client_Mask( Client ),
45 IRC_SetPenalty(Client, 3);
46 return IRC_WriteStrClient( Client, ERR_PASSWDMISMATCH_MSG, Client_ID( Client ));
51 IRC_OPER( CLIENT *Client, REQUEST *Req )
55 assert( Client != NULL );
56 assert( Req != NULL );
58 /* Falsche Anzahl Parameter? */
59 if( Req->argc != 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
62 for( i = 0; i < Conf_Oper_Count; i++)
64 if( Conf_Oper[i].name[0] && Conf_Oper[i].pwd[0] && ( strcmp( Conf_Oper[i].name, Req->argv[0] ) == 0 )) break;
66 if( i >= Conf_Oper_Count )
67 return Bad_OperPass(Client, Req->argv[0], "not configured");
69 /* Stimmt das Passwort? */
70 if( strcmp( Conf_Oper[i].pwd, Req->argv[1] ) != 0 )
71 return Bad_OperPass(Client, Conf_Oper[i].name, "Bad password");
73 /* Authorized Mask? */
74 if( Conf_Oper[i].mask && (! Match( Conf_Oper[i].mask, Client_Mask( Client ) )))
75 return Bad_OperPass(Client, Conf_Oper[i].mask, "hostmask check failed" );
77 if( ! Client_HasMode( Client, 'o' ))
79 /* noch kein o-Mode gesetzt */
80 Client_ModeAdd( Client, 'o' );
81 if( ! IRC_WriteStrClient( Client, "MODE %s :+o", Client_ID( Client ))) return DISCONNECTED;
82 IRC_WriteStrServersPrefix( NULL, Client, "MODE %s :+o", Client_ID( Client ));
85 if( ! Client_OperByMe( Client )) Log( LOG_NOTICE|LOG_snotice, "Got valid OPER from \"%s\", user is an IRC operator now.", Client_Mask( Client ));
87 Client_SetOperByMe( Client, true);
88 return IRC_WriteStrClient( Client, RPL_YOUREOPER_MSG, Client_ID( Client ));
93 IRC_DIE( CLIENT *Client, REQUEST *Req )
95 /* Shut down server */
97 assert( Client != NULL );
98 assert( Req != NULL );
100 /* Not a local IRC operator? */
101 if(( ! Client_HasMode( Client, 'o' )) || ( ! Client_OperByMe( Client ))) return IRC_WriteStrClient( Client, ERR_NOPRIVILEGES_MSG, Client_ID( Client ));
103 /* Bad number of parameters? */
104 if( Req->argc != 0 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
106 Log( LOG_NOTICE|LOG_snotice, "Got DIE command from \"%s\" ...", Client_Mask( Client ));
107 NGIRCd_SignalQuit = true;
113 IRC_REHASH( CLIENT *Client, REQUEST *Req )
115 /* Reload configuration file */
117 assert( Client != NULL );
118 assert( Req != NULL );
120 /* Not a local IRC operator? */
121 if(( ! Client_HasMode( Client, 'o' )) || ( ! Client_OperByMe( Client ))) return IRC_WriteStrClient( Client, ERR_NOPRIVILEGES_MSG, Client_ID( Client ));
123 /* Bad number of parameters? */
124 if( Req->argc != 0 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
126 Log( LOG_NOTICE|LOG_snotice, "Got REHASH command from \"%s\" ...", Client_Mask( Client ));
127 NGIRCd_SignalRehash = true;
134 IRC_RESTART( CLIENT *Client, REQUEST *Req )
136 /* Restart IRC server (fork a new process) */
138 assert( Client != NULL );
139 assert( Req != NULL );
141 /* Not a local IRC operator? */
142 if(( ! Client_HasMode( Client, 'o' )) || ( ! Client_OperByMe( Client ))) return IRC_WriteStrClient( Client, ERR_NOPRIVILEGES_MSG, Client_ID( Client ));
144 /* Bad number of parameters? */
145 if( Req->argc != 0 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
147 Log( LOG_NOTICE|LOG_snotice, "Got RESTART command from \"%s\" ...", Client_Mask( Client ));
148 NGIRCd_SignalRestart = true;
154 IRC_CONNECT(CLIENT *Client, REQUEST *Req )
156 /* Connect configured or new server */
158 assert( Client != NULL );
159 assert( Req != NULL );
161 /* Not a local IRC operator? */
162 if(( ! Client_HasMode( Client, 'o' )) || ( ! Client_OperByMe( Client ))) return IRC_WriteStrClient( Client, ERR_NOPRIVILEGES_MSG, Client_ID( Client ));
164 /* Bad number of parameters? */
165 if(( Req->argc != 2 ) && ( Req->argc != 5 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
167 /* Invalid port number? */
168 if( atoi( Req->argv[1] ) < 1 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
170 Log( LOG_NOTICE|LOG_snotice, "Got CONNECT command from \"%s\" for \"%s\".", Client_Mask( Client ), Req->argv[0]);
174 /* Connect configured server */
175 if( ! Conf_EnableServer( Req->argv[0], atoi( Req->argv[1] ))) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[0] );
180 if( ! Conf_AddServer( Req->argv[0], atoi( Req->argv[1] ), Req->argv[2], Req->argv[3], Req->argv[4] )) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[0] );
187 IRC_DISCONNECT(CLIENT *Client, REQUEST *Req )
189 /* Disconnect and disable configured server */
193 assert( Client != NULL );
194 assert( Req != NULL );
196 /* Not a local IRC operator? */
197 if(( ! Client_HasMode( Client, 'o' )) || ( ! Client_OperByMe( Client ))) return IRC_WriteStrClient( Client, ERR_NOPRIVILEGES_MSG, Client_ID( Client ));
199 /* Bad number of parameters? */
200 if( Req->argc != 1 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
202 Log( LOG_NOTICE|LOG_snotice, "Got DISCONNECT command from \"%s\" for0 \"%s\".", Client_Mask( Client ), Req->argv[0]);
204 /* Save ID of this connection */
205 my_conn = Client_Conn( Client );
207 /* Connect configured server */
208 if( ! Conf_DisableServer( Req->argv[0] )) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[0] );
210 /* Are we still connected or were we killed, too? */
211 if( Conn_GetClient( my_conn )) return CONNECTED;
212 else return DISCONNECTED;