]> git.ipfire.org Git - pakfire.git/commitdiff
client: Make user authentication asynchronous
authorMichael Tremer <michael.tremer@ipfire.org>
Tue, 24 Jun 2025 15:27:53 +0000 (15:27 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Tue, 24 Jun 2025 15:27:53 +0000 (15:27 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/pakfire/client.c

index 2b06da9cbefef08f07927df992bb775e0a499bf7..16c6db1dc40f177e79bbd8d7dfb947fed49cfc6f 100644 (file)
@@ -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;
 }