]> jfr.im git - irc/quakenet/newserv.git/commitdiff
Merged revisions 277,282,284 via svnmerge from
authorChris Porter <redacted>
Fri, 25 Nov 2005 23:26:00 +0000 (23:26 +0000)
committerChris Porter <redacted>
Fri, 25 Nov 2005 23:26:00 +0000 (23:26 +0000)
https://svn.quakenet.org/svn/dev-com/N/trunk

........
r277 | cruicky | 2005-11-12 13:52:24 +0000 (Sat, 12 Nov 2005) | 1 line

Fixed S2 not giving any feedback to user when CHANFLAGS or CHANPROFILE successfully updated the channel.
........
r282 | paul | 2005-11-19 19:45:05 +0000 (Sat, 19 Nov 2005) | 3 lines

Add shroud's userlevel support (until noperserv is in trunk), and actually commit loop bug bugfix

........
r284 | paul | 2005-11-20 21:56:01 +0000 (Sun, 20 Nov 2005) | 2 lines

fix a warning, update to give out 's2', fix debugoutput

........

request/Makefile
request/request.c
request/request.h
request/sqrequest.c
request/user.c [new file with mode: 0644]
request/user.h [new file with mode: 0644]

index aea2ee1d7d6f5468e8fe84b794dd9b7d1c96e11b..c8bcc8e10f105fe9e73f099b87252835386e9d6e 100644 (file)
@@ -2,5 +2,5 @@
 .PHONY: all
 all: request.so
 
-request.so: lrequest.o request.o request_block.o sqrequest.o 
+request.so: lrequest.o request.o request_block.o sqrequest.o user.o 
        ld -shared -Bdynamic -o $@ $^
index 30d9a965fcf93e6f2d7795010ed094865131b9c0..2fbfcfcd7ba140cd247c0200a5c6befd312ec774 100644 (file)
@@ -11,6 +11,7 @@
 #include "request_block.h"
 #include "lrequest.h"
 #include "sqrequest.h"
+#include "user.h"
 
 nick *rqnick;
 CommandTree *rqcommands;
@@ -27,6 +28,11 @@ int rqcmd_listblocks(void *user, int cargc, char **cargv);
 int rqcmd_stats(void *user, int cargc, char **cargv);
 int rqcmd_legacyrequest(void *user, int cargc, char **cargv);
 
+int rqcmd_adduser(void *user, int cargc, char **cargv);
+int rqcmd_deluser(void *user, int cargc, char **cargv);
+int rqcmd_changelev(void *user, int cargc, char **cargv);
+int rqcmd_userlist(void *user, int cargc, char **cargv);
+
 #define min(a,b) ((a > b) ? b : a)
 
 /* stats counters */
@@ -41,16 +47,22 @@ void _init(void) {
   addcommandtotree(rqcommands, "showcommands", RQU_ANY, 1, &rqcmd_showcommands);
   addcommandtotree(rqcommands, "requestbot", RQU_ANY, 1, &rqcmd_request);
   addcommandtotree(rqcommands, "requestspamscan", RQU_ANY, 1, &rqcmd_requestspamscan);
-  addcommandtotree(rqcommands, "addblock", RQU_OPER, 3, &rqcmd_addblock);
-  addcommandtotree(rqcommands, "delblock", RQU_OPER, 1, &rqcmd_delblock);
-  addcommandtotree(rqcommands, "listblocks", RQU_OPER, 1, &rqcmd_listblocks);
-  addcommandtotree(rqcommands, "stats", RQU_OPER, 1, &rqcmd_stats);
-
+  addcommandtotree(rqcommands, "addblock", RQU_ACCOUNT, 3, &rqcmd_addblock);
+  addcommandtotree(rqcommands, "delblock", RQU_ACCOUNT, 1, &rqcmd_delblock);
+  addcommandtotree(rqcommands, "listblocks", RQU_ACCOUNT, 1, &rqcmd_listblocks);
+  addcommandtotree(rqcommands, "stats", RQU_ACCOUNT, 1, &rqcmd_stats);
+
+  addcommandtotree(rqcommands, "adduser", RQU_OPER, 2, &rqcmd_adduser);
+  addcommandtotree(rqcommands, "deluser", RQU_OPER, 1, &rqcmd_deluser);
+  addcommandtotree(rqcommands, "changelev", RQU_OPER, 2, &rqcmd_changelev);
+  addcommandtotree(rqcommands, "userlist", RQU_OPER, 1, &rqcmd_userlist);
+  
   /* old legacy stuff */
   addcommandtotree(rqcommands, "requestq", RQU_ANY, 1, &rqcmd_legacyrequest);
 
   rq_initblocks();
   qr_initrequest();
+  ru_load();
 
   scheduleoneshot(time(NULL) + 1, (ScheduleCallback)&rq_registeruser, NULL);
 }
@@ -66,6 +78,12 @@ void _fini(void) {
   deletecommandfromtree(rqcommands, "listblocks", &rqcmd_listblocks);
   deletecommandfromtree(rqcommands, "stats", &rqcmd_stats);
 
+  deletecommandfromtree(rqcommands, "adduser", &rqcmd_adduser);
+  deletecommandfromtree(rqcommands, "deluser", &rqcmd_deluser);
+  deletecommandfromtree(rqcommands, "changelev", &rqcmd_changelev);
+  deletecommandfromtree(rqcommands, "userlist", &rqcmd_userlist);
+
+  
   /* old legacy stuff */
   deletecommandfromtree(rqcommands, "requestq", &rqcmd_legacyrequest);
 
@@ -73,6 +91,7 @@ void _fini(void) {
 
   rq_finiblocks();
   qr_finirequest();
+  ru_persist();
 
   deleteallschedules((ScheduleCallback)&rq_registeruser);
 }
@@ -130,13 +149,20 @@ void rq_handler(nick *target, int type, void **params) {
         return;
       }
 
-      if (cmd->level & RQU_OPER && !IsOper(user)) {
+      if ((cmd->level & RQU_OPER) && !IsOper(user)) {
         sendnoticetouser(rqnick, user, "Sorry, this command is not "
               "available to you.");
 
         return;
       }
 
+      if ((cmd->level & RQU_ACCOUNT) && (!IsAccount(user) || ru_getlevel(user) == 0) && !IsOper(user)) {
+        sendnoticetouser(rqnick, user, "Sorry, this command is not "
+              "available to you.");
+
+       return;
+      }
+
       if (cargc - 1 > cmd->maxparams)
         rejoinline(cargv[cmd->maxparams], cargc - cmd->maxparams);
 
@@ -165,7 +191,8 @@ int rqcmd_showcommands(void *user, int cargc, char **cargv) {
   sendnoticetouser(rqnick, (nick*)user, "-------------------");
 
   for (i = 0; i < n; i++) {
-    if ((cmdlist[i]->level & RQU_OPER) == 0 || IsOper((nick*)user))
+    if (((cmdlist[i]->level & RQU_OPER) == 0 || IsOper((nick*)user)) &&
+        (((cmdlist[i]->level & RQU_ACCOUNT) == 0 || (IsOper((nick*)user) || (IsAccount((nick*)user)) && ru_getlevel((nick*)user) > 0))))
       sendnoticetouser(rqnick, (nick*)user, "%s", cmdlist[i]->command->content);
   }
 
@@ -266,7 +293,7 @@ int rqcmd_request(void *user, int cargc, char **cargv) {
   nick *np = (nick*)user;
   nick *lnick, *qnick;
   unsigned long *lhand, *qhand;
-  channel *cp;
+  channel *cp, *logcp;
   int retval;
 
   if (cargc < 1) {
@@ -307,6 +334,12 @@ int rqcmd_request(void *user, int cargc, char **cargv) {
       /* user 'wants' L */
 
       retval = lr_requestl(rqnick, np, cp, lnick);
+
+      logcp = findchannel(RQ_LOGCHANNEL);
+
+      if (logcp) {
+        sendmessagetochannel(rqnick, logcp, "request (%s) for %s from %s: Request was %s.", RQ_LNICK, cp->index->name->content, np->nick, (retval == RQ_OK) ? "accepted" : "denied");
+      }
     } else {
       /* user 'wants' Q */
 
@@ -396,7 +429,14 @@ int rqcmd_addblock(void *user, int cargc, char **cargv) {
   rq_block *block;
   time_t expires;
   char *account;
+  int level = ru_getlevel(np);
+
+  if (level < 20) {
+    sendnoticetouser(rqnick, np, "You do not have access to this command.");
 
+    return RQ_ERROR;
+  }
+  
   if (cargc < 3) {
     sendnoticetouser(rqnick, np, "Syntax: addblock <mask> <duration> <reason>");
 
@@ -419,6 +459,12 @@ int rqcmd_addblock(void *user, int cargc, char **cargv) {
 
   expires = getnettime() + durationtolong(cargv[1]);
 
+  if (expires > getnettime() + RQU_HELPER_MAXEXPIRE && level < 30) {
+    sendnoticetouser(rqnick, np, "Maximum expiry time is %s.", rq_longtoduration(RQU_HELPER_MAXEXPIRE));
+
+    return RQ_ERROR;
+  }
+  
   rq_addblock(cargv[0], cargv[2], account, 0, expires);
 
   sendnoticetouser(rqnick, np, "Blocked channels/accounts matching '%s' from "
@@ -429,14 +475,33 @@ int rqcmd_addblock(void *user, int cargc, char **cargv) {
 
 int rqcmd_delblock(void *user, int cargc, char **cargv) {
   nick *np = (nick*)user;
-  int result;
+  int result, level;
+  rq_block *block;
+
+  level = ru_getlevel(np);
+  
+  if (level < 20) {
+    sendnoticetouser(rqnick, np, "You do not have access to this command.");
 
+    return RQ_ERROR;
+  }
   if (cargc < 1) {
-    controlreply(np, "Syntax: delblock <mask>");
+    sendnoticetouser(rqnick, np, "Syntax: delblock <mask>");
 
     return RQ_ERROR;
   }
 
+  block = rq_findblock(cargv[0]);
+
+  if (block != NULL && level < 50) {
+    if (ircd_strcmp(block->creator->content, np->authname) != 0) {
+      sendnoticetouser(rqnick, np, "This block was created by someone else. You cannot remove it.");
+      
+      return RQ_ERROR;
+    }
+  }
+
   result = rq_removeblock(cargv[0]);
 
   if (result > 0) {
@@ -453,8 +518,16 @@ int rqcmd_delblock(void *user, int cargc, char **cargv) {
 int rqcmd_listblocks(void *user, int cargc, char **cargv) {
   nick *np = (nick*)user;
   rq_block block;
-  int i;
+  int i, level;
 
+  level = ru_getlevel(np);
+  
+  if (level < 10) {
+    sendnoticetouser(rqnick, np, "You do not have access to this command.");
+
+    return RQ_ERROR;
+  }
+  
   sendnoticetouser(rqnick, np, "Mask        By        Expires"
         "                   Reason");
 
@@ -479,7 +552,14 @@ int rqcmd_listblocks(void *user, int cargc, char **cargv) {
 
 int rqcmd_stats(void *user, int cargc, char **cargv) {
   nick *np = (nick*)user;
+  int level = ru_getlevel(np);
 
+  if (level < 10) {
+    sendnoticetouser(rqnick, np, "You do not have access to this command.");
+
+    return RQ_ERROR;
+  }
+  
   sendnoticetouser(rqnick, np, "Total requests:                   %d", rq_count);
   sendnoticetouser(rqnick, np, "Successful requests:              %d", rq_success);
   sendnoticetouser(rqnick, np, "Failed requests:                  %d", rq_failed);
@@ -499,3 +579,113 @@ int rqcmd_legacyrequest(void *user, int cargc, char **cargv) {
   
   return RQ_OK;
 }
+
+int rqcmd_adduser(void *user, int cargc, char **cargv) {
+  nick *np = (nick*)user;
+  int result, level;
+
+  if (cargc < 2) {
+    sendnoticetouser(rqnick, np, "Syntax: adduser <account> <level>");
+
+    return RQ_ERROR;
+  }
+
+  level = atoi(cargv[1]);
+
+  if (level <= 0) {
+    sendnoticetouser(rqnick, np, "Level must be a positive integer.");
+
+    return RQ_ERROR;
+  }
+
+  result = ru_create(cargv[0], level);
+
+  if (result) {
+    sendnoticetouser(rqnick, np, "User '%s' was added with level '%d'.", cargv[0], level);
+
+    return RQ_OK;
+  } else {
+    sendnoticetouser(rqnick, np, "Something strange happened. Contact shroud.");
+
+    return RQ_ERROR;
+  }
+}
+
+int rqcmd_deluser(void *user, int cargc, char **cargv) {
+  nick *np = (nick*)user;
+  int level;
+
+  if (cargc < 1) {
+    sendnoticetouser(rqnick, np, "Syntax: deluser <account>");
+
+    return RQ_ERROR;
+  }
+
+  level = ru_getlevel_str(cargv[0]);
+
+  if (level <= 0) {
+    sendnoticetouser(rqnick, np, "There is no such user.");
+
+    return RQ_ERROR;
+  }
+
+  ru_destroy(cargv[0]);
+
+  sendnoticetouser(rqnick, np, "Done.");
+
+  return RQ_OK;
+}
+
+int rqcmd_changelev(void *user, int cargc, char **cargv) {
+  nick *np = (nick*)user;
+  int result, level;
+
+  if (cargc < 2) {
+    sendnoticetouser(rqnick, np, "Syntax: changelev <account> <level>");
+
+    return RQ_ERROR;
+  }
+
+  level = atoi(cargv[1]);
+
+  if (level <= 0) {
+    sendnoticetouser(rqnick, np, "Level must be a positive integer.");
+
+    return RQ_ERROR;
+  }
+
+  if (ru_getlevel_str(cargv[0]) <= 0) {
+    sendnoticetouser(rqnick, np, "Unknown user.");
+
+    return RQ_ERROR;
+  }
+  
+  result = ru_setlevel(cargv[0], level);
+  
+  if (result != 0) {
+    sendnoticetouser(rqnick, np, "Done.");
+
+    return RQ_OK;
+  } else {
+    sendnoticetouser(rqnick, np, "Something strange happened. Contact shroud.");
+
+    return RQ_ERROR;
+  }
+}
+
+int rqcmd_userlist(void *user, int cargc, char **cargv) {
+  nick *np = (nick*)user;
+  r_user_t *userp = r_userlist;
+
+  sendnoticetouser(rqnick, np, "User Level");
+
+  while (userp) {
+    sendnoticetouser(rqnick, np, "%s %d", userp->name, userp->level);
+    userp = userp->next;
+  }
+
+  sendnoticetouser(rqnick, np, "--- End of USERS.");
+
+  return RQ_OK;
+}
+
index 664700f8e61e7cfc1f5bfb50158f900483b55f76..7171f63c644027cf7c411f3c46b295a07d37834b 100644 (file)
@@ -6,8 +6,8 @@
 #define RQ_QSERVER "CServe.quakenet.org"
 #define RQ_QNICK "Q"
 
-#define RQ_SSERVER "spamscan.quakenet.org"
-#define RQ_SNICK "S"
+#define RQ_SSERVER "services4.uk.quakenet.org"
+#define RQ_SNICK "S2"
 
 #define RQ_REQUEST_NICK "R"
 #define RQ_REQUEST_USER "request"
 #define RQ_REQUEST_REAL "Service Request v0.23"
 #define RQ_REQUEST_AUTH "R"
 
+#define RQ_LOGCHANNEL "#qnet.request"
+
 #define RQU_ANY 0
 #define RQU_OPER 1
+#define RQU_ACCOUNT 2
+
+/* one week by default */
+#define RQU_HELPER_MAXEXPIRE 604800
+
+#define RQ_USERFILE "rqusers"
 
 #define RQ_OK 0
 #define RQ_ERROR 1
index 051e565c3df76c1a34ea5c98be9331f1c1ab7c64..65ebae504281478e5a96ea733824e0ee55864219 100644 (file)
@@ -87,6 +87,7 @@ void qr_result(requestrec *req, int outcome, char *message, ...) {
   requestrec **rh;
   char msgbuf[512];
   va_list va;
+  channel *cplog;
   nick *lnp, *qnp, *np, *tnp, *snp;
   
   /* Delete the request from the list first.. */
@@ -128,6 +129,12 @@ void qr_result(requestrec *req, int outcome, char *message, ...) {
     return;
   }
 
+  cplog = findchannel(RQ_LOGCHANNEL);
+
+  if (cplog) {
+    sendmessagetochannel(rqnick, cplog, "request (%s) for %s from %s: Request was %s.", (req->what == QR_CSERVE) ? RQ_QNICK : RQ_SNICK, req->cip->name->content, tnp->nick, (outcome == QR_OK) ? "accepted" : "denied");
+  }
+  
   if (outcome==QR_OK) {
     if (req->what == QR_CSERVE) {
       /* Delete L, add Q.  Check that they both exist first, though. */
@@ -396,7 +403,7 @@ void qr_handlenotice(nick *sender, char *message) {
                * the list as it goes, so we can just keep picking off the first
                * entry
                */
-              for(rrp2=nextreq;rrp2;rrp2=nextreq) {
+              for(rrp2=nextreq;rrp2;) {
                 if (rrp2==rrp1)
                   break;
 
@@ -406,6 +413,8 @@ void qr_handlenotice(nick *sender, char *message) {
 
                 qr_result(rrp2, QR_FAILED,
                           "Sorry, an error occurred while processing your request.");
+
+                rrp2 = nextreq = (who == QR_Q) ? nextreqq : nextreql;
               }
 
               if (rrp2) {
diff --git a/request/user.c b/request/user.c
new file mode 100644 (file)
index 0000000..6ab49ca
--- /dev/null
@@ -0,0 +1,188 @@
+#include <stdio.h>
+
+#include "../irc/irc_config.h"
+#include "../lib/irc_string.h"
+#include "../nick/nick.h"
+#include "request.h"
+#include "user.h"
+
+r_user_t *r_userlist = NULL;
+int ru_loading = 0;
+
+r_user_t *ru_find(char *name);
+
+int ru_create(char *name, unsigned int level) {
+       r_user_t *user, *trav;
+
+       if (ru_setlevel(name, level) != 0)
+               return 1;
+
+       user = (r_user_t*)malloc(sizeof(r_user_t));
+
+       if (user == NULL)
+               return 0;
+
+       user->next = NULL;
+       strlcpy(user->name, name, sizeof(user->name));
+       user->level = level;
+
+       if (r_userlist == NULL)
+               r_userlist = user;
+       else {
+               trav = r_userlist;
+
+               while (trav->next)
+                       trav = trav->next;
+
+               trav->next = user;
+       }
+
+       ru_persist();
+       
+       return 1;
+}
+
+void ru_destroy(char *name) {
+       r_user_t *user = r_userlist;
+
+       if (user && ircd_strcmp(user->name, name) == 0) {
+               free(r_userlist);
+
+               r_userlist = NULL;
+
+               ru_persist();
+               
+               return;
+       }
+
+       if (user == NULL)
+               return;
+       
+       while (user->next) {
+               if (ircd_strcmp(user->next->name, name) == 0) {
+                       user->next = user->next->next;
+
+                       free(user->next);
+               }
+
+               user = user->next;
+       }
+
+       ru_persist();
+}
+
+int ru_parseline(char *line) {
+  char name[ACCOUNTLEN];
+  unsigned int level;
+  int result;
+
+  if (sscanf(line, "%s %lu", name, &level) < 2)
+    return 0;
+
+  ru_loading = 1;
+  result = ru_create(name, level);
+  ru_loading = 0;
+
+  return result;
+}
+
+int ru_load(void) {
+  char line[4096];
+  FILE *rudata;
+  int count;
+
+  rudata = fopen(RQ_USERFILE, "r");
+
+  if (rudata == NULL)
+    return 0;
+
+  count = 0;
+
+  while (!feof(rudata)) {
+    if (fgets(line, sizeof(line), rudata) == NULL)
+      break;
+
+    if (line[strlen(line) - 1] == '\n')
+      line[strlen(line) - 1] = '\0';
+
+    if (line[strlen(line) - 1] == '\r')
+      line[strlen(line) - 1] = '\0';
+
+    if (line[0] != '\0') {
+      if (ru_parseline(line))
+        count++;
+    }
+  }
+
+  fclose(rudata);
+
+  return count;
+}
+
+int ru_persist(void) {
+  FILE *rudata;
+  int i, count = 0;
+  r_user_t *user = r_userlist;
+
+  if (ru_loading)
+    return 0;
+
+  rudata = fopen(RQ_USERFILE, "w");
+
+  if (rudata == NULL)
+    return 0;
+
+  while (user) {
+    fprintf(rudata, "%s %lu\n", user->name, user->level);
+
+    user = user->next;
+  }
+
+  fclose(rudata);
+
+  return count;
+}
+
+r_user_t *ru_find(char *name) {
+       r_user_t *user = r_userlist;
+
+       while (user) {
+               if (ircd_strcmp(user->name, name) == 0)
+                       return user;
+
+               user = user->next;
+       }
+
+       return NULL;
+}
+
+unsigned int ru_getlevel(nick *np) {
+       if (IsOper(np))
+               return 999;
+       else if (!IsAccount(np))
+               return 0;
+
+       return ru_getlevel_str(np->authname);
+}
+
+unsigned int ru_getlevel_str(char *name) {
+       r_user_t *user = ru_find(name);
+
+       if (user)
+               return user->level;
+       else
+               return 0;
+}
+
+int ru_setlevel(char *name, unsigned int level) {
+       r_user_t *user = ru_find(name);
+
+       if (user) {
+               user->level = level;
+
+               ru_persist();
+
+               return 1;
+       } else
+               return 0;
+}
diff --git a/request/user.h b/request/user.h
new file mode 100644 (file)
index 0000000..09b0816
--- /dev/null
@@ -0,0 +1,18 @@
+/* R user system */
+
+typedef struct r_user_s {
+       struct r_user_s *next;
+       char name[ACCOUNTLEN];
+       unsigned int level;
+} r_user_t;
+
+extern r_user_t *r_userlist;
+
+int ru_load(void);
+int ru_persist(void);
+
+int ru_create(char *name, unsigned int level);
+void ru_destroy(char *name);
+unsigned int ru_getlevel(nick *np);
+unsigned int ru_getlevel_str(char *name);
+int ru_setlevel(char *name, unsigned int level);