From: Michael Tremer Date: Sat, 21 Jun 2025 11:47:29 +0000 (+0000) Subject: buildservice: Add a function to authenticate a user against the API X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9fa39d950d6740566353beafcdb112f5dffabac9;p=pakfire.git buildservice: Add a function to authenticate a user against the API Signed-off-by: Michael Tremer --- diff --git a/src/pakfire/buildservice.c b/src/pakfire/buildservice.c index 8b3ec5c7..ab020db5 100644 --- a/src/pakfire/buildservice.c +++ b/src/pakfire/buildservice.c @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -51,6 +52,10 @@ struct pakfire_buildservice { // Kerberos Context krb5_context krb5_ctx; + + // Tokens + char access_token[1024]; + char refresh_token[1024]; }; static int pakfire_buildservice_xfer_create(struct pakfire_xfer** xfer, @@ -172,6 +177,93 @@ const char* pakfire_buildservice_get_url(struct pakfire_buildservice* service) { return service->url; } +// Authenticate + +int pakfire_buildservice_auth_user(struct pakfire_buildservice* self, + const char* username, const char* password) { + struct json_object* response = NULL; + struct pakfire_xfer* xfer = NULL; + struct { + char* username; + char* password; + } credentials = {}; + char payload[2048]; + int r; + + const char* access_token = NULL; + const char* refresh_token = NULL; + + // Create a new xfer + r = pakfire_buildservice_xfer_create(&xfer, self, "/api/v1/auth/user"); + if (r < 0) + goto ERROR; + + // Set the header + r = pakfire_xfer_add_header(xfer, "Content-Type: application/x-www-form-urlencoded"); + if (r < 0) + goto ERROR; + + // Escape the credentials + credentials.username = pakfire_xfer_escape(xfer, username); + credentials.password = pakfire_xfer_escape(xfer, password); + + // Format the payload + r = pakfire_string_format(payload, "username=%s&password=%s", + credentials.username, credentials.password); + if (r < 0) + goto ERROR; + + // Set the payload + r = pakfire_xfer_set_payload(xfer, payload); + if (r < 0) + goto ERROR; + + // Send the request + r = pakfire_xfer_run_api_request(xfer, &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_string_set(self->access_token, access_token); + if (r < 0) + goto ERROR; + + // Store the refresh token + r = pakfire_string_set(self->refresh_token, refresh_token); + if (r < 0) + goto ERROR; + + DEBUG(self->ctx, "Successfully authenticated %s\n", username); + DEBUG(self->ctx, " Access Token : %s\n", access_token); + DEBUG(self->ctx, " Refresh Token: %s\n", refresh_token); + +ERROR: + if (xfer) + pakfire_xfer_unref(xfer); + if (credentials.username) + free(credentials.username); + if (credentials.password) + free(credentials.password); + if (response) + json_object_put(response); + + return r; +} + // Build int pakfire_buildservice_build(struct pakfire_buildservice* service, const char* upload, diff --git a/src/pakfire/buildservice.h b/src/pakfire/buildservice.h index d39381fb..7761900b 100644 --- a/src/pakfire/buildservice.h +++ b/src/pakfire/buildservice.h @@ -35,6 +35,11 @@ struct pakfire_buildservice* pakfire_buildservice_unref(struct pakfire_buildserv const char* pakfire_buildservice_get_url(struct pakfire_buildservice* service); +// Authentication + +int pakfire_buildservice_auth_user(struct pakfire_buildservice* service, + const char* username, const char* password); + // Builds typedef enum pakfire_buildservice_build_flags {