+static void controlremotereply(nick *target, char *message) {
+ controlreply(target, "CHECKHASHPASS FAIL text %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("CHECKHASHPASS FAIL text ")), 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 FAIL args");
+ controlreply(sender, "REMOTEAUTH END");
+ 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 FAIL user");
+ controlreply(sender, "REMOTEAUTH END");
+ return CMD_ERROR;
+ }
+
+ if(!checkhashpass(rup, junk, digest)) {
+ controlreply(sender, "REMOTEAUTH FAIL digest");
+ controlreply(sender, "REMOTEAUTH END");
+ 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;
+}
+