]> jfr.im git - irc/evilnet/x3.git/commitdiff
nickserv: support auto_admin and auto_oper for login-on-connect
authorhstuart <redacted>
Tue, 5 May 2009 20:46:51 +0000 (20:46 +0000)
committerhstuart <redacted>
Tue, 5 May 2009 20:46:51 +0000 (20:46 +0000)
ChangeLog
src/nickserv.c
src/proto-p10.c
src/proto.h

index 50840ed91038abd03ac4daa8c45c9a899cd50381..104334b6c29f1f341cd762e7698473f5f5d86425 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,16 @@
 /***********************************************************************
 X3 ChangeLog
 
+2009-05-05  Henrik Stuart  <evilnet@hstuart.dk>
+
+       * src/proto-p10.c: introduced irc_sno for SNO messages. Removed broken
+       auto_oper on LOC support.
+
+       * src/proto.h: introduced irc_sno for SNO messages.
+
+       * src/nickserv.c: added registered authentication function to handle
+       auto_oper on LOC.
+
 2009-05-04  Alex Schumann  <rubin@afternet.org>
 
         * src/chanserv.c: julien and polo noticed a crash during channel register. Fixed
index cd5ecdccaf6c6f480b0b76621a9e6385e3787c47..7939a3d2b0011f05b11d3d324543ad3ced587159 100644 (file)
@@ -4998,6 +4998,23 @@ nickserv_db_cleanup(void)
         regfree(&nickserv_conf.valid_nick_regex);
 }
 
+void handle_loc_auth_oper(struct userNode *user, UNUSED_ARG(struct handle_info *old_handle)) {
+    if (!*nickserv_conf.auto_oper || !user->handle_info)
+        return;
+
+    if (!IsOper(user)) {
+        if (*nickserv_conf.auto_admin && user->handle_info->opserv_level >= opserv_conf_admin_level()) {
+            irc_umode(user, nickserv_conf.auto_admin);
+            irc_sno(0x1, "%s (%s@%s) is now an IRC Administrator",
+                    user->nick, user->ident, user->hostname);
+        } else if (*nickserv_conf.auto_oper && user->handle_info->opserv_level) {
+            irc_umode(user, nickserv_conf.auto_oper);
+            irc_sno(0x1, "%s (%s@%s) is now an IRC Operator",
+                    user->nick, user->ident, user->hostname);
+        }
+    }
+}
+
 void
 init_nickserv(const char *nick)
 {
@@ -5008,6 +5025,7 @@ init_nickserv(const char *nick)
     reg_nick_change_func(handle_nick_change);
     reg_del_user_func(nickserv_remove_user);
     reg_account_func(handle_account);
+    reg_auth_func(handle_loc_auth_oper);
 
     /* set up handle_inverse_flags */
     memset(handle_inverse_flags, 0, sizeof(handle_inverse_flags));
index 04a528fab952ccf85f6e95c2f9d215981a9a48d3..d7236f97a0bb2413b35ec8c97c16c268d9393772 100644 (file)
@@ -1196,6 +1196,15 @@ irc_mark(struct userNode *user, char *mark)
     }
 }
 
+void irc_sno(unsigned int mask, char const* format, ...) {
+    va_list arg_list;
+    char buffer[MAXLEN];
+    va_start(arg_list, format);
+    vsnprintf(buffer, MAXLEN-2, format, arg_list);
+    buffer[MAXLEN-1] = 0;
+    putsock("%s " CMD_SNO " %d :%s", self->numeric, mask, buffer);
+}
+
 static void send_burst(void);
 
 static void
@@ -1502,7 +1511,6 @@ static CMD_FUNC(cmd_account)
     struct userNode *user;
     struct server *server;
     struct handle_info *hi;
-       extern struct nickserv_config nickserv_conf;
 
     if ((argc < 3) || !origin || !(server = GetServerH(origin)))
         return 0; /* Origin must be server. */
@@ -1523,9 +1531,6 @@ static CMD_FUNC(cmd_account)
             putsock("%s " P10_ACCOUNT " %s A %s "FMT_TIME_T, self->numeric, server->numeric , argv[3], hi->registered);
 
                        log_module(MAIN_LOG, LOG_DEBUG, "loc_auth: %s\n", user->nick);
-
-                       if (nickserv_conf.auto_oper[0] && hi->opserv_level > 0)
-                               putsock("%s " P10_MODE " %s %s ", self->numeric, argv[4], nickserv_conf.auto_oper);
          }
         else
         {
@@ -1540,9 +1545,6 @@ static CMD_FUNC(cmd_account)
         {
             /* Return a AC A */
             putsock("%s " P10_ACCOUNT " %s A %s "FMT_TIME_T, self->numeric, server->numeric , argv[3], hi->registered);
-
-                       if (nickserv_conf.auto_oper[0] && hi->opserv_level > 0)
-                               putsock("%s " P10_MODE " %s %s ", self->numeric, argv[5], nickserv_conf.auto_oper);
         }
         else
         {
index a421616ac3d3a00453e90e496cb054ed19813f28..7cf7d66e67fa405f052ba7bbca1ffd3b4c174ef7 100644 (file)
@@ -171,6 +171,7 @@ void irc_account(struct userNode *user, const char *stamp, time_t timestamp);
 void irc_regnick(struct userNode *user);
 void irc_fakehost(struct userNode *user, const char *host);
 void irc_mark(struct userNode *user, char *mark);
+void irc_sno(unsigned int mask, char const* format, ...);
 
 /* numeric messages */
 void irc_numeric(struct userNode *user, unsigned int num, const char *format, ...);