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);
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]) {
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) {
}
}
+ free(dupemail);
+
return NULL;
}
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";
}
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;
}
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);
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++) {