#include "conf.h"
#include "channel.h"
#include "class.h"
+#include "parse.h"
+#include "irc.h"
#include "irc-macros.h"
#include "irc-write.h"
+#include "lists.h"
#include "log.h"
#include "match.h"
#include "messages.h"
-#include "parse.h"
#include "op.h"
#include <exp.h>
{
Log(LOG_WARNING, "Got invalid OPER from \"%s\": \"%s\" -- %s",
Client_Mask(Client), errtoken, errmsg);
- return IRC_WriteErrClient(Client, ERR_PASSWDMISMATCH_MSG,
+ IRC_SetPenalty(Client, 10);
+ return IRC_WriteStrClient(Client, ERR_PASSWDMISMATCH_MSG,
Client_ID(Client));
} /* Bad_OperPass */
assert( Client != NULL );
assert( Req != NULL );
- _IRC_ARGC_EQ_OR_RETURN_(Client, Req, 2)
-
len = array_length(&Conf_Opers, sizeof(*op));
op = array_start(&Conf_Opers);
for (i = 0; i < len && strcmp(op[i].name, Req->argv[0]); i++)
Client_ID(Client));
}
- if (!Client_OperByMe(Client))
- Log(LOG_NOTICE|LOG_snotice,
- "Got valid OPER for \"%s\" from \"%s\", user is an IRC operator now.",
- Req->argv[0], Client_Mask(Client));
+ Log(LOG_NOTICE|LOG_snotice,
+ "Got valid OPER for \"%s\" from \"%s\", user is an IRC operator now.",
+ Req->argv[0], Client_Mask(Client));
- Client_SetOperByMe(Client, true);
return IRC_WriteStrClient(Client, RPL_YOUREOPER_MSG, Client_ID(Client));
} /* IRC_OPER */
if (!Op_Check(Client, Req))
return Op_NoPrivileges(Client, Req);
-#ifdef STRICT_RFC
- _IRC_ARGC_EQ_OR_RETURN_(Client, Req, 0)
-#else
- _IRC_ARGC_LE_OR_RETURN_(Client, Req, 1)
-#endif
-
/* Is a message given? */
if (Req->argc > 0) {
c = Conn_First();
if (!Op_Check(Client, Req))
return Op_NoPrivileges(Client, Req);
- _IRC_ARGC_EQ_OR_RETURN_(Client, Req, 0)
-
Log(LOG_NOTICE|LOG_snotice, "Got REHASH command from \"%s\" ...",
Client_Mask(Client));
IRC_WriteStrClient(Client, RPL_REHASHING_MSG, Client_ID(Client));
if (!Op_Check(Client, Req))
return Op_NoPrivileges(Client, Req);
- /* Bad number of parameters? */
- if (Req->argc != 0)
- return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG,
- Client_ID(Client), Req->command);
-
Log(LOG_NOTICE|LOG_snotice, "Got RESTART command from \"%s\" ...",
Client_Mask(Client));
NGIRCd_SignalRestart = true;
assert(Client != NULL);
assert(Req != NULL);
- if (Client_Type(Client) != CLIENT_SERVER
- && !Client_HasMode(Client, 'o'))
- return Op_NoPrivileges(Client, Req);
-
/* Bad number of parameters? */
if (Req->argc != 1 && Req->argc != 2 && Req->argc != 3 &&
Req->argc != 5 && Req->argc != 6)
return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG,
Client_ID(Client), Req->command);
+ if (Client_Type(Client) != CLIENT_SERVER
+ && !Client_HasMode(Client, 'o'))
+ return Op_NoPrivileges(Client, Req);
+
from = Client;
target = Client_ThisServer();
if (!Op_Check(Client, Req))
return Op_NoPrivileges(Client, Req);
- /* Bad number of parameters? */
- if (Req->argc != 1)
- return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG,
- Client_ID(Client), Req->command);
-
IRC_SendWallops(Client_ThisServer(), Client_ThisServer(),
"Received DISCONNECT %s from %s",
Req->argv[0], Client_ID(Client));
assert( Client != NULL );
assert( Req != NULL );
- _IRC_ARGC_EQ_OR_RETURN_(Client, Req, 1)
-
switch (Client_Type(Client)) {
case CLIENT_USER:
- if (!Client_OperByMe(Client))
- return IRC_WriteErrClient(Client, ERR_NOPRIVILEGES_MSG,
- Client_ID(Client));
+ if (!Op_Check(Client, Req))
+ return Op_NoPrivileges(Client, Req);
from = Client;
break;
case CLIENT_SERVER:
GLOBAL bool
IRC_xLINE(CLIENT *Client, REQUEST *Req)
{
- CLIENT *from;
+ CLIENT *from, *c, *c_next;
+ char reason[COMMAND_LEN], class_c;
+ struct list_head *list;
int class;
- char class_c;
assert(Client != NULL);
assert(Req != NULL);
- from = Op_Check(Client, Req);
- if (!from)
- return Op_NoPrivileges(Client, Req);
-
/* Bad number of parameters? */
if (Req->argc != 1 && Req->argc != 3)
return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG,
Client_ID(Client), Req->command);
+ from = Op_Check(Client, Req);
+ if (!from)
+ return Op_NoPrivileges(Client, Req);
+
switch(Req->command[0]) {
case 'g':
case 'G':
Req->argv[0], Req->argv[1],
Req->argv[2]);
}
+
+ /* Check currently connected clients */
+ snprintf(reason, sizeof(reason), "%c-Line by \"%s\": \"%s\"",
+ class_c, Client_ID(from), Req->argv[2]);
+ list = Class_GetList(class);
+ c = Client_First();
+ while (c) {
+ c_next = Client_Next(c);
+ if ((class == CLASS_GLINE || Client_Conn(c) > NONE)
+ && Lists_Check(list, c))
+ IRC_KillClient(Client, NULL,
+ Client_ID(c), reason);
+ c = c_next;
+ }
}
}