From: Michael Tremer Date: Tue, 24 Jun 2025 15:27:53 +0000 (+0000) Subject: client: Make user authentication asynchronous X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7ca850fd22637ebdec749f2c71b5c39caad583a0;p=pakfire.git client: Make user authentication asynchronous Signed-off-by: Michael Tremer --- diff --git a/src/pakfire/client.c b/src/pakfire/client.c index 2b06da9c..16c6db1d 100644 --- a/src/pakfire/client.c +++ b/src/pakfire/client.c @@ -332,9 +332,64 @@ int pakfire_client_set_auth_callback(struct pakfire_client* self, return 0; } +static int pakfire_client_auth_successful( + struct pakfire_client* self, struct json_object* response) { + const char* refresh_token = NULL; + const char* access_token = NULL; + int r; + + // Log action + DEBUG(self->ctx, "Authentication successful\n"); + + // Fetch the access token + r = pakfire_json_get_string(response, "access_token", &access_token); + if (r < 0) { + ERROR(self->ctx, "Failed to fetch the access token: %s\n", strerror(-r)); + return r; + } + + // Fetch the refresh token + r = pakfire_json_get_string(response, "refresh_token", &refresh_token); + if (r < 0) { + ERROR(self->ctx, "Failed to fetch the refresh token: %s\n", strerror(-r)); + return r; + } + + // Store the access token + r = pakfire_client_set_access_token(self, access_token); + if (r < 0) + return r; + + // Store the refresh token + r = pakfire_client_set_refresh_token(self, refresh_token); + if (r < 0) + return r; + + return 0; +} + +/* + Called if the authentication failed +*/ +static int pakfire_client_auth_failed(struct pakfire_client* self) { + return 0; // XXX TODO +} + +static int pakfire_client_auth_response(struct pakfire_xfer* xfer, + pakfire_xfer_error_code_t code, json_object* response, void* data) { + struct pakfire_client* client = data; + + switch (code) { + case PAKFIRE_XFER_OK: + return pakfire_client_auth_successful(client, response); + + default: + return pakfire_client_auth_failed(client); + } +} + int pakfire_client_auth_user(struct pakfire_client* self, const char* username, const char* password) { - struct json_object* response = NULL; struct pakfire_xfer* xfer = NULL; struct { char* username; @@ -343,9 +398,6 @@ int pakfire_client_auth_user(struct pakfire_client* self, char payload[2048]; int r; - const char* access_token = NULL; - const char* refresh_token = NULL; - // Create a new xfer r = pakfire_client_xfer_create(&xfer, self, "/api/v1/auth/user"); if (r < 0) @@ -371,37 +423,16 @@ int pakfire_client_auth_user(struct pakfire_client* self, if (r < 0) goto ERROR; - // Send the request - r = pakfire_xfer_run_api_request(xfer, NULL, &response); - if (r) - goto ERROR; - - // Fetch the access token - r = pakfire_json_get_string(response, "access_token", &access_token); - if (r < 0) { - ERROR(self->ctx, "Failed to fetch the access token: %s\n", strerror(-r)); - goto ERROR; - } - - // Fetch the refresh token - r = pakfire_json_get_string(response, "refresh_token", &refresh_token); - if (r < 0) { - ERROR(self->ctx, "Failed to fetch the refresh token: %s\n", strerror(-r)); - goto ERROR; - } - - // Store the access token - r = pakfire_client_set_access_token(self, access_token); + // Register the callback + r = pakfire_xfer_set_response_callback(xfer, pakfire_client_auth_response, self); if (r < 0) goto ERROR; - // Store the refresh token - r = pakfire_client_set_refresh_token(self, refresh_token); + // Enqueue the transfer + r = pakfire_httpclient_enqueue(self->httpclient, xfer); if (r < 0) goto ERROR; - DEBUG(self->ctx, "Successfully authenticated %s\n", username); - ERROR: if (xfer) pakfire_xfer_unref(xfer); @@ -409,8 +440,6 @@ ERROR: free(credentials.username); if (credentials.password) free(credentials.password); - if (response) - json_object_put(response); return r; }