]> arthur.barton.de Git - ngircd-alex.git/blobdiff - src/ngircd/irc-oper.c
G-LINES: Forbid remote modifications if "AllowRemoteOper" is not set
[ngircd-alex.git] / src / ngircd / irc-oper.c
index 260346c7ce6aec547731b8a0b36440f004270e8d..cf3b9d0485436e03e1d1d63d74be85a4d7f901e8 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * ngIRCd -- The Next Generation IRC Daemon
- * Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors.
+ * Copyright (c)2001-2015 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
  * IRC operator commands
  */
 
-#include "imp.h"
 #include <assert.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <signal.h>
+#include <time.h>
 
 #include "ngircd.h"
 #include "conn-func.h"
@@ -38,7 +38,6 @@
 #include "messages.h"
 #include "op.h"
 
-#include <exp.h>
 #include "irc-oper.h"
 
 /**
 static bool
 Bad_OperPass(CLIENT *Client, char *errtoken, char *errmsg)
 {
-       Log(LOG_WARNING, "Got invalid OPER from \"%s\": \"%s\" -- %s",
+       Log(LOG_WARNING, "Got invalid OPER from \"%s\": \"%s\" -- %s!",
            Client_Mask(Client), errtoken, errmsg);
-       return IRC_WriteErrClient(Client, ERR_PASSWDMISMATCH_MSG,
+       /* Increase penalty to slow down possible brute force attacks */
+       IRC_SetPenalty(Client, 10);
+       return IRC_WriteStrClient(Client, ERR_PASSWDMISMATCH_MSG,
                                  Client_ID(Client));
 } /* Bad_OperPass */
 
@@ -358,6 +359,7 @@ IRC_WALLOPS( CLIENT *Client, REQUEST *Req )
                from = Client;
                break;
        case CLIENT_SERVER:
+               _IRC_REQUIRE_PREFIX_OR_RETURN_(Client, Req)
                from = Client_Search(Req->prefix);
                break;
        default:
@@ -385,6 +387,7 @@ IRC_xLINE(CLIENT *Client, REQUEST *Req)
        CLIENT *from, *c, *c_next;
        char reason[COMMAND_LEN], class_c;
        struct list_head *list;
+       time_t timeout;
        int class;
 
        assert(Client != NULL);
@@ -395,7 +398,16 @@ IRC_xLINE(CLIENT *Client, REQUEST *Req)
                return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG,
                                          Client_ID(Client), Req->command);
 
-       from = Op_Check(Client, Req);
+       if (!Conf_AllowRemoteOper && Client_Type(Client) == CLIENT_SERVER) {
+               /* Explicitely forbid remote servers to modify "x-lines" when
+                * the "AllowRemoteOper" configuration option isn't set, even
+                * when the command seems to originate from the remote server
+                * itself: this prevents GLINE's to become set during server
+                * handshake in this case (what wouldn't be possible during
+                * regular runtime when a remote IRC Op sends the command). */
+               from = NULL;
+       } else
+               from = Op_Check(Client, Req);
        if (!from)
                return Op_NoPrivileges(Client, Req);
 
@@ -429,8 +441,11 @@ IRC_xLINE(CLIENT *Client, REQUEST *Req)
                }
        } else {
                /* Add new mask to list */
+               timeout = atol(Req->argv[1]);
+               if (timeout > 0)
+                       timeout += time(NULL);
                if (Class_AddMask(class, Req->argv[0],
-                                 time(NULL) + atol(Req->argv[1]),
+                                 timeout,
                                  Req->argv[2])) {
                        Log(LOG_NOTICE|LOG_snotice,
                            "\"%s\" added \"%s\" to %c-Line list: \"%s\" (%ld seconds).",