X-Git-Url: https://jfr.im/git/irc/quakenet/newserv.git/blobdiff_plain/86aaca686d5463413c406877c3398c4e27d8363e..056e1ea46d3a0707ca0bb46af4abd429e55c4196:/chanserv/chanserv_relay.c diff --git a/chanserv/chanserv_relay.c b/chanserv/chanserv_relay.c index f3c082bf..16b9a9a7 100644 --- a/chanserv/chanserv_relay.c +++ b/chanserv/chanserv_relay.c @@ -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 ?junk?"); registercontrolhelpcmd("settempemail", NO_RELAY, 2, csa_dosettempemail, "Usage: settempemail "); registercontrolhelpcmd("setemail", NO_RELAY, 3, csa_dosetemail, "Usage: setmail "); registercontrolhelpcmd("resendemail", NO_RELAY, 1, csa_doresendemail, "Usage: resendemail "); registercontrolhelpcmd("activateuser", NO_RELAY, 1, csa_doactivateuser, "Usage: activateuser "); + registercontrolhelpcmd("addchan", NO_RELAY, 3, csa_doaddchan, "Usage: addchan "); 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) { @@ -241,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"; } @@ -259,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; @@ -350,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); @@ -424,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