]> git.ipfire.org Git - people/ms/pakfire.git/commitdiff
buildservice: Add a function to authenticate a user against the API
authorMichael Tremer <michael.tremer@ipfire.org>
Sat, 21 Jun 2025 11:47:29 +0000 (11:47 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Sat, 21 Jun 2025 11:47:29 +0000 (11:47 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/pakfire/buildservice.c
src/pakfire/buildservice.h

index 8b3ec5c707ed0cd6d50a904b4563b85b17b22b7e..ab020db526306c5892cea21a8bda4e2037e86d9e 100644 (file)
@@ -29,6 +29,7 @@
 #include <pakfire/ctx.h>
 #include <pakfire/hasher.h>
 #include <pakfire/hashes.h>
+#include <pakfire/json.h>
 #include <pakfire/logging.h>
 #include <pakfire/os.h>
 #include <pakfire/path.h>
@@ -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,
index d39381fb187d80a2a8e97d870dfc448e6e07a573..7761900b23da53924186c565adc35c101195ce1c 100644 (file)
@@ -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 {