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;
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)
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);
free(credentials.username);
if (credentials.password)
free(credentials.password);
- if (response)
- json_object_put(response);
return r;
}