]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
auth: mech-oauth2 - Properly handle PASSDB_RESULT_USER_UNKNOWN result from token...
authorStephan Bosch <stephan.bosch@open-xchange.com>
Fri, 28 Feb 2025 01:11:31 +0000 (02:11 +0100)
committertimo.sirainen <timo.sirainen@open-xchange.com>
Thu, 9 Oct 2025 08:41:22 +0000 (08:41 +0000)
src/auth/mech-oauth2.c

index 75ff5f0c96ddcbed367729c3e366accd0a4b57f6..b9c6608b41e2acc93a6f242c01d6ace524793520 100644 (file)
@@ -68,9 +68,7 @@ static void oauth2_fail_invalid_token(struct oauth2_auth_request *oauth2_req)
 }
 
 static void
-oauth2_verify_callback(enum passdb_result result,
-                      const unsigned char *credentials ATTR_UNUSED,
-                      size_t size ATTR_UNUSED, struct auth_request *request)
+oauth2_verify_finish(enum passdb_result result, struct auth_request *request)
 {
        struct oauth2_auth_request *oauth2_req =
                container_of(request, struct oauth2_auth_request, auth);
@@ -84,12 +82,12 @@ oauth2_verify_callback(enum passdb_result result,
                /* user is explicitly disabled, don't allow it to log in */
                oauth2_fail(oauth2_req, "insufficient_scope");
                break;
+       case PASSDB_RESULT_USER_UNKNOWN:
        case PASSDB_RESULT_PASSWORD_MISMATCH:
                oauth2_fail(oauth2_req, "invalid_token");
                break;
        case PASSDB_RESULT_NEXT:
        case PASSDB_RESULT_SCHEME_NOT_AVAILABLE:
-       case PASSDB_RESULT_USER_UNKNOWN:
        case PASSDB_RESULT_OK:
                /* sending success */
                auth_request_success(request, "", 0);
@@ -99,6 +97,16 @@ oauth2_verify_callback(enum passdb_result result,
        }
 }
 
+static void
+oauth2_verify_callback(enum passdb_result result,
+                      const unsigned char *credentials ATTR_UNUSED,
+                      size_t size ATTR_UNUSED, struct auth_request *request)
+{
+       if (result == PASSDB_RESULT_USER_UNKNOWN)
+               result = PASSDB_RESULT_OK;
+       oauth2_verify_finish(result, request);
+}
+
 static void
 mech_oauth2_verify_token_continue(struct oauth2_auth_request *oauth2_req,
                                  const char *const *args)
@@ -136,7 +144,7 @@ mech_oauth2_verify_token_continue(struct oauth2_auth_request *oauth2_req,
                return;
        }
 
-       oauth2_verify_callback(result, uchar_empty_ptr, 0, request);
+       oauth2_verify_finish(result, request);
        auth_request_unref(&request);
 }
 
@@ -172,7 +180,7 @@ mech_oauth2_verify_token_local_continue(struct db_oauth2_request *db_req,
        } else {
                e_info(request->mech_event, "oauth2 failed: %s", error);
        }
-       oauth2_verify_callback(result, uchar_empty_ptr, 0, request);
+       oauth2_verify_finish(result, request);
        auth_request_unref(&request);
        pool_unref(&db_req->pool);
 }