|
@@ -386,33 +386,49 @@ AuthInfo PostgreSQL::getSSOAuthInfo(const nlohmann::json &member, const std::str
|
|
|
// check if the member exists first.
|
|
|
pqxx::row count = w.exec_params1("SELECT count(id) FROM ztc_member WHERE id = $1 AND network_id = $2 AND deleted = false", memberId, networkId);
|
|
|
if (count[0].as<int>() == 1) {
|
|
|
- // find an unused nonce, if one exists.
|
|
|
+ // get active nonce, if exists.
|
|
|
pqxx::result r = w.exec_params("SELECT nonce FROM ztc_sso_expiry "
|
|
|
"WHERE network_id = $1 AND member_id = $2 "
|
|
|
- "AND authentication_expiry_time IS NULL AND ((NOW() AT TIME ZONE 'UTC') <= nonce_expiration)",
|
|
|
+ "AND ((NOW() AT TIME ZONE 'UTC') <= authentication_expiry_time) AND ((NOW() AT TIME ZONE 'UTC') <= nonce_expiration)",
|
|
|
networkId, memberId);
|
|
|
|
|
|
- if (r.size() == 1) {
|
|
|
- // we have an existing nonce. Use it
|
|
|
+ if (r.size() == 0) {
|
|
|
+ // no active nonce.
|
|
|
+ // find an unused nonce, if one exists.
|
|
|
+ pqxx::result r = w.exec_params("SELECT nonce FROM ztc_sso_expiry "
|
|
|
+ "WHERE network_id = $1 AND member_id = $2 "
|
|
|
+ "AND authentication_expiry_time IS NULL AND ((NOW() AT TIME ZONE 'UTC') <= nonce_expiration)",
|
|
|
+ networkId, memberId);
|
|
|
+
|
|
|
+ if (r.size() == 1) {
|
|
|
+ // we have an existing nonce. Use it
|
|
|
+ nonce = r.at(0)[0].as<std::string>();
|
|
|
+ Utils::unhex(nonce.c_str(), nonceBytes, sizeof(nonceBytes));
|
|
|
+ } else if (r.empty()) {
|
|
|
+ // create a nonce
|
|
|
+ Utils::getSecureRandom(nonceBytes, 16);
|
|
|
+ char nonceBuf[64] = {0};
|
|
|
+ Utils::hex(nonceBytes, sizeof(nonceBytes), nonceBuf);
|
|
|
+ nonce = std::string(nonceBuf);
|
|
|
+
|
|
|
+ pqxx::result ir = w.exec_params0("INSERT INTO ztc_sso_expiry "
|
|
|
+ "(nonce, nonce_expiration, network_id, member_id) VALUES "
|
|
|
+ "($1, TO_TIMESTAMP($2::double precision/1000), $3, $4)",
|
|
|
+ nonce, OSUtils::now() + 300000, networkId, memberId);
|
|
|
+
|
|
|
+ w.commit();
|
|
|
+ } else {
|
|
|
+ // > 1 ?!? Thats an error!
|
|
|
+ fprintf(stderr, "> 1 unused nonce!\n");
|
|
|
+ exit(6);
|
|
|
+ }
|
|
|
+ } else if (r.size() == 1) {
|
|
|
nonce = r.at(0)[0].as<std::string>();
|
|
|
Utils::unhex(nonce.c_str(), nonceBytes, sizeof(nonceBytes));
|
|
|
- } else if (r.empty()) {
|
|
|
- // create a nonce
|
|
|
- Utils::getSecureRandom(nonceBytes, 16);
|
|
|
- char nonceBuf[64] = {0};
|
|
|
- Utils::hex(nonceBytes, sizeof(nonceBytes), nonceBuf);
|
|
|
- nonce = std::string(nonceBuf);
|
|
|
-
|
|
|
- pqxx::result ir = w.exec_params0("INSERT INTO ztc_sso_expiry "
|
|
|
- "(nonce, nonce_expiration, network_id, member_id) VALUES "
|
|
|
- "($1, TO_TIMESTAMP($2::double precision/1000), $3, $4)",
|
|
|
- nonce, OSUtils::now() + 300000, networkId, memberId);
|
|
|
-
|
|
|
- w.commit();
|
|
|
- } else {
|
|
|
- // > 1 ?!? Thats an error!
|
|
|
- fprintf(stderr, "> 1 unused nonce!\n");
|
|
|
- exit(6);
|
|
|
+ } else {
|
|
|
+ // more than 1 nonce in use? Uhhh...
|
|
|
+ fprintf(stderr, "> 1 nonce in use for network member?!?\n");
|
|
|
+ exit(7);
|
|
|
}
|
|
|
|
|
|
r = w.exec_params("SELECT org.client_id, org.authorization_endpoint, org.issuer, org.sso_impl_version "
|