]> jfr.im git - irc/quakenet/newserv.git/blobdiff - chanserv/chanserv_relay.c
LUA: port luadb to dbapi2 to drop postgres dependency
[irc/quakenet/newserv.git] / chanserv / chanserv_relay.c
index ccf43c864f1d8b0e75d2edd8b1b0dec014cfdedf..15d47635e0d24fad34df4e70eb8365abaa103d7e 100644 (file)
@@ -23,6 +23,8 @@ 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);
+int csa_doremoteauth(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);
 
@@ -58,15 +60,20 @@ 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>");
+  registercontrolhelpcmd("remoteauth", NO_RELAY, 6, csa_doremoteauth, "Usage: remoteauth <username> <digest> <junk> <nick> <ident> <host>");
 
   s=getcopyconfigitem("chanserv","createaccountsecret","",128);
   if(!s || !s->content || !s->content[0]) {
@@ -81,6 +88,13 @@ 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);
@@ -91,6 +105,8 @@ void _fini(void) {
 
   if(createaccountsecret_ok)
     deregistercontrolcmd("createaccount", csa_docreateaccount);
+
+  deregisterhook(HOOK_CHANSERV_DBLOADED, relayfinishinit);
 }
 
 int csa_docheckhashpass(void *source, int cargc, char **cargv) {
@@ -122,6 +138,56 @@ int csa_docheckhashpass(void *source, int cargc, char **cargv) {
   return CMD_OK;
 }
 
+static void controlremotereply(nick *target, char *message) {
+  controlreply(target, "REMOTEAUTH FAILTEXT %s", message);
+}
+
+static void remote_reply(nick *sender, int message_id, ...) {
+  va_list va;
+  va_start(va, message_id);
+  chanservstdvmessage(sender, NULL, message_id, -1 * (int)(strlen("REMOTEAUTH FAILTEXT ")), controlremotereply, va);
+  va_end(va);
+}
+
+int csa_doremoteauth(void *source, int cargc, char **cargv) {
+  nick *sender=(nick *)source;
+  reguser *rup;
+
+  if(cargc<6) {
+    controlreply(sender, "REMOTEAUTH FAILREASON args");
+    return CMD_ERROR;
+  }
+
+  char *account = cargv[0];
+  char *digest = cargv[1];
+  char *junk = cargv[2];
+  char *nick = cargv[3];
+  char *ident = cargv[4];
+  char *hostname = cargv[5];
+
+  if (!(rup=findreguserbynick(account))) {
+    controlreply(sender, "REMOTEAUTH FAILREASON user");
+    return CMD_ERROR;
+  }
+
+  if(!checkhashpass(rup, junk, digest)) {
+    controlreply(sender, "REMOTEAUTH FAILREASON digest");
+    return CMD_ERROR;
+  }
+
+  if (!csa_completeauth2(rup, nick, ident, hostname, "REMOTEAUTH", remote_reply, sender)) {
+    controlreply(sender, "REMOTEAUTH END");
+    return CMD_ERROR;
+  }
+
+  /* username:ts:authid */
+  controlreply(sender, "REMOTEAUTH OK %s %ld %ld", rup->username, rup->lastauth ? rup->lastauth : getnettime(), rup->ID);
+
+  /* note: NO HOOK_CHANSERV_AUTH */
+
+  return CMD_OK;
+}
+
 static char *email_to_error(char *email) {
   maildomain *mdp, *smdp;
   char *local;
@@ -244,6 +310,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";
     }
@@ -372,7 +440,6 @@ int csa_dosetemail(void *source, int cargc, char **cargv) {
   cs_log(sender,"SETEMAIL OK username %s email %s",rup->username, rup->email->content);
 
   csdb_updateuser(rup);
-  sendemail(rup);
 
   controlreply(sender, "SETEMAIL TRUE");
 
@@ -477,7 +544,7 @@ int csa_doaddchan(void *source, int cargc, char **cargv) {
     return CMD_ERROR;
   }
 
-  rcp = cs_addchan(cip, sender, rup, founder, QCFLAG_JOINED, type);
+  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;