]> jfr.im git - irc/quakenet/newserv.git/blobdiff - chanserv/chanserv_relay.c
CHANSERV: add missing error statements.
[irc/quakenet/newserv.git] / chanserv / chanserv_relay.c
index d8f491579655ebe2c36663a9a947f45d5d50a985..16b9a9a7af08edaace37bdacb0094d4edefd0b3e 100644 (file)
@@ -22,6 +22,7 @@ int csa_dosettempemail(void *source, int cargc, char **cargv);
 int csa_dosetemail(void *source, int cargc, char **cargv);
 int csa_doresendemail(void *source, int cargc, char **cargv);
 int csa_doactivateuser(void *source, int cargc, char **cargv);
+int csa_doaddchan(void *source, int argc, char **argv);
 static int decrypt_password(unsigned char *secret, int keybits, char *buf, int bufsize, char *encrypted);
 static int hex_to_int(char *input, unsigned char *buf, int buflen);
 
@@ -57,14 +58,19 @@ static unsigned char hexlookup[256] = {
                        0xff, 0xff, 0xff, 0xff, 0xff, 0xff
                                   };
 
-void _init(void) {
+static void relayfinishinit(int, void *);
+
+void relayfinishinit(int hooknum, void *arg) {
   sstring *s;
 
+  deregisterhook(HOOK_CHANSERV_DBLOADED, relayfinishinit);
+
   registercontrolhelpcmd("checkhashpass", NO_RELAY, 3, csa_docheckhashpass, "Usage: checkhashpass <username> <digest> ?junk?");
   registercontrolhelpcmd("settempemail", NO_RELAY, 2, csa_dosettempemail, "Usage: settempemail <userid> <email address>");
   registercontrolhelpcmd("setemail", NO_RELAY, 3, csa_dosetemail, "Usage: setmail <userid> <timestamp> <email address>");
   registercontrolhelpcmd("resendemail", NO_RELAY, 1, csa_doresendemail, "Usage: resendemail <userid>");
   registercontrolhelpcmd("activateuser", NO_RELAY, 1, csa_doactivateuser, "Usage: activateuser <userid>");
+  registercontrolhelpcmd("addchan", NO_RELAY, 3, csa_doaddchan, "Usage: addchan <channel> <userid> <channel type>");
 
   s=getcopyconfigitem("chanserv","createaccountsecret","",128);
   if(!s || !s->content || !s->content[0]) {
@@ -79,15 +85,25 @@ void _init(void) {
   freesstring(s);
 }
 
+void _init(void) {
+  registerhook(HOOK_CHANSERV_DBLOADED, relayfinishinit);
+
+  if(chanservdb_ready)
+    relayfinishinit(HOOK_CHANSERV_DBLOADED, NULL);
+}
+
 void _fini(void) {
   deregistercontrolcmd("checkhashpass", csa_docheckhashpass);
   deregistercontrolcmd("settempemail", csa_dosettempemail);
   deregistercontrolcmd("setemail", csa_dosetemail);
   deregistercontrolcmd("resendemail", csa_doresendemail);
   deregistercontrolcmd("activateuser", csa_doactivateuser);
+  deregistercontrolcmd("addchan", csa_doaddchan);
 
   if(createaccountsecret_ok)
     deregistercontrolcmd("createaccount", csa_docreateaccount);
+
+  deregisterhook(HOOK_CHANSERV_DBLOADED, relayfinishinit);
 }
 
 int csa_docheckhashpass(void *source, int cargc, char **cargv) {
@@ -182,6 +198,8 @@ static char *email_to_error(char *email) {
     }
   }
 
+  free(dupemail);
+
   return NULL;
 }
 
@@ -239,6 +257,8 @@ int csa_docreateaccount(void *source, int cargc, char **cargv) {
       error_password = "passwordlong";
     } else if(r == QM_PWTOWEAK) {
       error_password = "passwordweak";
+    } else if(r == QM_PWINVALID) {
+      error_password = "passwordinvalid";
     } else if(r != -1) {
       error_password = "passwordunknown";
     }
@@ -257,7 +277,8 @@ int csa_docreateaccount(void *source, int cargc, char **cargv) {
     csdb_createuser(rup);
     snprintf(account_info, sizeof(account_info), " %u %lu", rup->ID, (unsigned long)rup->lastpasschange);
 
-    sendemail(rup);
+    if(!activate)
+      sendemail(rup);
   } else {
     account_info[0] = '\0';
     do_create = 0;
@@ -348,6 +369,13 @@ int csa_dosetemail(void *source, int cargc, char **cargv) {
   }
 
   email = cargv[2];
+
+  if(!strcmp(email, rup->email->content)) {
+    /* setting to the same thing? fine! */
+    controlreply(sender, "SETEMAIL TRUE");
+    return CMD_OK;
+  }
+
   error = email_to_error(email);
   if(error) {
     controlreply(sender, "SETEMAIL FALSE %s", error);
@@ -422,6 +450,59 @@ int csa_doactivateuser(void *source, int cargc, char **cargv) {
   return CMD_OK;
 }
 
+int csa_doaddchan(void *source, int cargc, char **cargv) {
+  nick *sender=(nick *)source;
+  reguser *rup = getreguserfromnick(sender), *founder;
+  chanindex *cip;
+  short type;
+  regchan *rcp;
+
+  if(cargc<3) {
+    controlreply(sender, "ADDCHAN FALSE args");
+    return CMD_ERROR;
+  }
+
+  if (*cargv[0] != '#' || strlen(cargv[0]) > CHANNELLEN) {
+    controlreply(sender, "ADDCHAN FALSE invalidchannel");
+    return CMD_ERROR;
+  }
+
+  if (!(cip=findorcreatechanindex(cargv[0]))) {
+    controlreply(sender, "ADDCHAN FALSE invalidchannel");
+    return CMD_ERROR;
+  }
+
+  founder = findreguserbyID(atoi(cargv[1]));
+  if(founder == NULL) {
+    controlreply(sender, "ADDCHAN FALSE useridnotexist");
+    return CMD_ERROR;
+  }
+
+  if(UIsInactive(founder)) {
+    controlreply(sender, "ADDCHAN FALSE accountinactive");
+    return CMD_ERROR;
+  }
+
+  for(type=CHANTYPES-1;type;type--)
+    if(!ircd_strcmp(chantypes[type]->content, cargv[2]))
+      break;
+
+  if(!type) {
+    controlreply(sender, "ADDCHAN FALSE invalidchantype");
+    return CMD_ERROR;
+  }
+
+  rcp = cs_addchan(cip, sender, rup, founder, QCFLAG_JOINED | QCFLAG_AUTOOP | QCFLAG_BITCH | QCFLAG_FORCETOPIC | QCFLAG_PROTECT | QCFLAG_TOPICSAVE, CHANMODE_NOCTCP | CHANMODE_DELJOINS | CHANMODE_MODNOAUTH | CHANMODE_NONOTICE | CHANMODE_NOEXTMSG | CHANMODE_SINGLETARG | CHANMODE_TOPICLIMIT | CHANMODE_NOQUITMSG, 0, type);
+  if(!rcp) {
+    controlreply(sender, "ADDCHAN FALSE alreadyregistered");
+    return CMD_ERROR;
+  }
+
+  cs_log(sender, "ADDCHAN %s #%s %s %s", cip->name->content, founder->username, printflags(rcp->flags, rcflags), chantypes[type]->content);
+  controlreply(sender, "ADDCHAN TRUE %u", rcp->ID);
+  return CMD_OK;
+}
+
 static int hex_to_int(char *input, unsigned char *buf, int buflen) {
   int i;
   for(i=0;i<buflen;i++) {