diff options
| author | Anders Betts <anders.betts@gmail.com> | 2026-09-17 21:48:00 +0200 |
|---|---|---|
| committer | Anders Betts <anders.betts@gmail.com> | 2026-09-17 21:48:00 +0200 |
| commit | 071b7e9b01e41d4048b1bbb3d9caaac4c8a526de (patch) | |
| tree | b0af0a71e0d9fff2ca166d6ca69167ff32cc2ccb /clients/client.c | |
| parent | a145684f0a556820a183db45d27e9b2dc715f056 (diff) | |
| download | bokf-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.c | 49 |
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) |
