Commit Diff


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);