#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>
// 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,
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,