else
return nullptr;
}
-const char *db_read_rhs(const char *key, const char *fn) {
- if (fn == "certfp"sv)
- return db_read_internal(key, db::disk("SELECT account FROM certfp WHERE fingerprint = ?;"));
- else if (fn == "nicks"sv)
- return db_read_internal(key, db::disk("SELECT account FROM nicks WHERE nick = ?;"));
- else if (fn == "irccloud"sv)
- return db_read_internal(key, db::disk("SELECT account FROM irccloud WHERE irccloudid = ?;"));
- else
- return nullptr;
-}
client->saslbufLen = q-(unsigned char *)client->saslbuf - parity;
}
client->saslbuf[client->saslbufLen] = '\0';
- const char *username;
- int res;
- res = -1;
if (!client->saslexternal) {
+ const char *username;
char *p = strchr(client->saslbuf, '\0')+1;
username = p;
if (username > client->saslbuf + client->saslbufLen)
} else {
#ifdef HAVE_LIBTLS
if (client->cctx && tls_peer_cert_provided(client->cctx)) {
- username = db_read_rhs(tls_peer_cert_hash(client->cctx), "certfp");
- res = -!username;
+ std::string_view username;
+ auto stmt = db::disk("SELECT account FROM certfp WHERE fingerprint = ?;");
+ stmt.bind(1, tls_peer_cert_hash(client->cctx));
+ if (stmt.step())
+ username = stmt.text(0);
+ if (username.data()) {
+ rpl_saslsuccess(), sendbuf(client);
+ client_chghost(client, username.data(), 0);
+ goto saslcleanup;
+ }
}
#endif
}
- if (res != -1) {
- rpl_saslsuccess(), sendbuf(client);
- client_chghost(client, username, 0);
- } else {
saslerr:
- err_saslfail(), sendbuf(client);
- }
+ err_saslfail(), sendbuf(client);
saslcleanup:
memset(client->saslbuf, 0, 1024);
free(client->saslbuf);
stringlower(args[0]);
desired_nick = args[0];
if (strcmp(desired_nick, client->username) != 0) {
- const char *username = db_read_rhs(desired_nick, "nicks");
- if (!username || strcmp(username, client->username) != 0)
+ std::string_view username;
+ auto stmt = db::disk("SELECT account FROM nicks WHERE nick = ?;");
+ stmt.bind(1, desired_nick);
+ if (stmt.step())
+ username = stmt.text(0);
+ if (!username.data() || username != client->username)
return err_nicknameinuse(client, desired_nick), sendbuf(client), 0;
}
}