summaryrefslogtreecommitdiff
path: root/clients/client.c
diff options
context:
space:
mode:
authorAnders Betts <anders.betts@gmail.com>2026-09-17 21:48:00 +0200
committerAnders Betts <anders.betts@gmail.com>2026-09-17 21:48:00 +0200
commit071b7e9b01e41d4048b1bbb3d9caaac4c8a526de (patch)
treeb0af0a71e0d9fff2ca166d6ca69167ff32cc2ccb /clients/client.c
parenta145684f0a556820a183db45d27e9b2dc715f056 (diff)
downloadbokf-5bca19518dc3cbbd303e66b152c70d8c4a7c8f7b.tar.gz
bokf-5bca19518dc3cbbd303e66b152c70d8c4a7c8f7b.zip
Add token login to bokfctl and enforce admin scope for tokensv0.1.3
- bokfctl: --token / BOKFD_TOKEN via client_token_login - tokens must carry the admin scope for admin commands (was bypassed) - docs: token-based snapshot for restic backups
Diffstat (limited to 'clients/client.c')
-rw-r--r--clients/client.c49
1 files changed, 41 insertions, 8 deletions
diff --git a/clients/client.c b/clients/client.c
index 8fb604b..fd119f1 100644
--- a/clients/client.c
+++ b/clients/client.c
@@ -361,18 +361,12 @@ char *client_rpc(struct client_conn *c, const char *cmd, const char *session,
return client_read_line(c);
}
-int client_login(struct client_conn *c, const char *user, const char *password,
- char **session_out, char **err_out)
+static int session_open(struct client_conn *c, const char *args,
+ char **session_out, char **err_out)
{
*session_out = NULL;
*err_out = NULL;
- char *args = client_make_login_args(user, password);
- if (!args) {
- *err_out = xstrdup("could not build login request");
- return -1;
- }
char *resp = client_rpc(c, "session.open", NULL, 0, args);
- free(args);
if (!resp) {
*err_out = xstrdup(client_last_error());
return -1;
@@ -396,6 +390,45 @@ int client_login(struct client_conn *c, const char *user, const char *password,
return 0;
}
+int client_login(struct client_conn *c, const char *user, const char *password,
+ char **session_out, char **err_out)
+{
+ char *args = client_make_login_args(user, password);
+ if (!args) {
+ *session_out = NULL;
+ *err_out = xstrdup("could not build login request");
+ return -1;
+ }
+ int rc = session_open(c, args, session_out, err_out);
+ free(args);
+ return rc;
+}
+
+int client_token_login(struct client_conn *c, const char *token,
+ char **session_out, char **err_out)
+{
+ yyjson_mut_doc *d = yyjson_mut_doc_new(NULL);
+ if (!d) {
+ *session_out = NULL;
+ *err_out = xstrdup("out of memory");
+ return -1;
+ }
+ yyjson_mut_val *o = yyjson_mut_obj(d);
+ yyjson_mut_doc_set_root(d, o);
+ yyjson_mut_obj_add_strcpy(d, o, "method", "token");
+ yyjson_mut_obj_add_strcpy(d, o, "token", token);
+ char *args = yyjson_mut_write(d, 0, NULL);
+ yyjson_mut_doc_free(d);
+ if (!args) {
+ *session_out = NULL;
+ *err_out = xstrdup("could not build token request");
+ return -1;
+ }
+ int rc = session_open(c, args, session_out, err_out);
+ free(args);
+ return rc;
+}
+
int client_ok(const char *response)
{
if (!response)