commit e112ed1d59eb471c749edac917491dbbcf366784 from: Stefan Sperling date: Fri Aug 29 15:41:39 2025 UTC send repositories and per-repository access rules to login and gotweb procs commit - ba61c78b3aec77e1f1eeb8c70436273d9dad9219 commit + e112ed1d59eb471c749edac917491dbbcf366784 blob - 970773d8d9c33955439e30233a5b829c655dfaad blob + bf4974462c73274329bbad4d3a80a1cc1882fe93 --- gotwebd/config.c +++ gotwebd/config.c @@ -255,3 +255,42 @@ config_get_access_rule(struct gotwebd_access_rule_list STAILQ_INSERT_TAIL(rules, rule, entry); } + +void +config_set_repository(struct imsgev *iev, struct gotwebd_repo *repo) +{ + if (imsg_compose_event(iev, + GOTWEBD_IMSG_CFG_REPO, 0, -1, -1, repo, sizeof(*repo)) == -1) + fatal("imsg_compose_event GOTWEBD_IMSG_CFG_REPO"); +} + +void +config_get_repository(struct gotwebd_repolist *repos, struct imsg *imsg) +{ + struct gotwebd_repo *repo; + size_t len; + + repo = calloc(1, sizeof(*repo)); + if (repo == NULL) + fatal("malloc"); + + if (imsg_get_data(imsg, repo, sizeof(*repo))) + fatalx("%s: invalid CFG_REPO message", __func__); + + switch (repo->auth_config) { + case GOTWEBD_AUTH_DISABLED: + case GOTWEBD_AUTH_SECURE: + case GOTWEBD_AUTH_INSECURE: + break; + default: + fatalx("%s: invalid CFG_REPO message", __func__); + } + + len = strnlen(repo->name, sizeof(repo->name)); + if (len == 0 || len >= sizeof(repo->name)) + fatalx("%s: invalid CFG_REPO message", __func__); + + STAILQ_INIT(&repo->access_rules); + + TAILQ_INSERT_TAIL(repos, repo, entry); +} blob - bf90c2001f8ab845bffc292ddabbd0da93fa3221 blob + 7fa1ab0f5de4526e17c35977ee3c1a068f457846 --- gotwebd/gotweb.c +++ gotwebd/gotweb.c @@ -1576,6 +1576,8 @@ gotweb_dispatch_main(int fd, short event, void *arg) struct imsgbuf *ibuf; struct imsg imsg; struct gotwebd *env = gotwebd_env; + struct server *srv; + struct gotwebd_repo *repo; ssize_t n; int shut = 0; @@ -1605,16 +1607,12 @@ gotweb_dispatch_main(int fd, short event, void *arg) config_get_access_rule(&env->access_rules, &imsg); } else { - struct server *srv; - srv = TAILQ_LAST(&env->servers, serverlist); if (TAILQ_EMPTY(&srv->repos)) { /* per-server access rule */ config_get_access_rule( &srv->access_rules, &imsg); } else { - struct gotwebd_repo *repo; - /* per-repository access rule */ repo = TAILQ_LAST(&srv->repos, gotwebd_repolist); @@ -1626,6 +1624,12 @@ gotweb_dispatch_main(int fd, short event, void *arg) case GOTWEBD_IMSG_CFG_SRV: config_getserver(env, &imsg); break; + case GOTWEBD_IMSG_CFG_REPO: + if (TAILQ_EMPTY(&env->servers)) + fatalx("%s: unexpected CFG_REPO msg", __func__); + srv = TAILQ_LAST(&env->servers, serverlist); + config_get_repository(&srv->repos, &imsg); + break; case GOTWEBD_IMSG_CFG_FD: config_getfd(env, &imsg); break; blob - 69f105491d4a849d9231fe8547d59084d175025b blob + a2bcb51ecdc5ad72372dc40a7d33332c84a54576 --- gotwebd/gotwebd.c +++ gotwebd/gotwebd.c @@ -771,6 +771,7 @@ int gotwebd_configure(struct gotwebd *env, uid_t uid, gid_t gid) { struct server *srv; + struct gotwebd_repo *repo; struct socket *sock; char auth_token_secret[32]; int i; @@ -810,7 +811,31 @@ gotwebd_configure(struct gotwebd *env, uid_t uid, gid_ &srv->access_rules); } - /* TODO: send repositories and per-repo access rules */ + /* send repositories */ + TAILQ_FOREACH(repo, &srv->repos, entry) { + for (i = 0; i < env->nserver; i++) { + config_set_repository(&env->iev_login[i], + repo); + config_set_repository(&env->iev_gotweb[i], + repo); + + /* send per-repository access rules */ + config_set_access_rules(&env->iev_login[i], + &repo->access_rules); + config_set_access_rules(&env->iev_gotweb[i], + &repo->access_rules); + } + } + + for (i = 0; i < env->nserver; i++) { + if (imsgbuf_flush(&env->iev_login[i].ibuf) == -1) + fatal("imsgbuf_flush"); + imsg_event_add(&env->iev_login[i]); + + if (imsgbuf_flush(&env->iev_gotweb[i].ibuf) == -1) + fatal("imsgbuf_flush"); + imsg_event_add(&env->iev_gotweb[i]); + } } /* send our sockets */ blob - f7efb51b844b9b62895cd011fdae0d444d6e8ae4 blob + 81ed267b63329b626454173f2072d58cb1364aa0 --- gotwebd/gotwebd.h +++ gotwebd/gotwebd.h @@ -140,6 +140,7 @@ enum imsg_type { GOTWEBD_IMSG_CFG_SOCK, GOTWEBD_IMSG_CFG_FD, GOTWEBD_IMSG_CFG_ACCESS_RULE, + GOTWEBD_IMSG_CFG_REPO, GOTWEBD_IMSG_CFG_DONE, GOTWEBD_IMSG_CTL_PIPE, GOTWEBD_IMSG_CTL_START, @@ -616,6 +617,8 @@ int config_getcfg(struct gotwebd *, struct imsg *); void config_set_access_rules(struct imsgev *, struct gotwebd_access_rule_list *); void config_get_access_rule(struct gotwebd_access_rule_list *, struct imsg *); +void config_set_repository(struct imsgev *, struct gotwebd_repo *); +void config_get_repository(struct gotwebd_repolist *, struct imsg *); int config_init(struct gotwebd *); /* auth.c */ blob - b91e56a07f7b0fd10a0ca6c989f76d599a26c2d0 blob + 43e4facc484aba4c58ac40ab763f4be719880792 --- gotwebd/login.c +++ gotwebd/login.c @@ -493,6 +493,8 @@ login_dispatch_main(int fd, short event, void *arg) struct imsgbuf *ibuf; struct imsg imsg; struct gotwebd *env = gotwebd_env; + struct server *srv; + struct gotwebd_repo *repo; ssize_t n; int shut = 0; @@ -522,16 +524,12 @@ login_dispatch_main(int fd, short event, void *arg) config_get_access_rule(&env->access_rules, &imsg); } else { - struct server *srv; - srv = TAILQ_LAST(&env->servers, serverlist); if (TAILQ_EMPTY(&srv->repos)) { /* per-server access rule */ config_get_access_rule( &srv->access_rules, &imsg); } else { - struct gotwebd_repo *repo; - /* per-repository access rule */ repo = TAILQ_LAST(&srv->repos, gotwebd_repolist); @@ -543,6 +541,12 @@ login_dispatch_main(int fd, short event, void *arg) case GOTWEBD_IMSG_CFG_SRV: config_getserver(gotwebd_env, &imsg); break; + case GOTWEBD_IMSG_CFG_REPO: + if (TAILQ_EMPTY(&env->servers)) + fatalx("%s: unexpected CFG_REPO msg", __func__); + srv = TAILQ_LAST(&env->servers, serverlist); + config_get_repository(&srv->repos, &imsg); + break; case GOTWEBD_IMSG_CTL_PIPE: if (env->iev_server == NULL) recv_server_pipe(env, &imsg);