"GOT", but the "O" is a cute, smiling pufferfish. Index | Thread | Search

From:
Tracey Emery <tracey@traceyemery.net>
Subject:
Fix gotweb to work in subdirs
To:
gameoftrees@openbsd.org
Date:
Thu, 24 Sep 2020 15:52:40 -0600

Download raw body.

Thread
Hello,

The gotweb.conf variable got_www_path was removed in commit
b5f0780096f443734de8fc503ca92bf737e2a7b2 because it wasn't used. The
right thing to do would have been finish that code path. The diff below
backs that commit out and finishes the code so gotweb will work in
subdirectories.

This was pointed out by uwerler in IRC.

Ok?

-- 

Tracey Emery

diff e03cc83491255ff69034ff6c824f9ba6062fcddd 9cf491dab010c4b79950d4d251ba55c1db037e55
blob - e0c4b29b1bbf16ca75bef799ffca5591edb2048a
blob + 6ea20ef0a924a94c08ae5889e41d840e289d9de3
--- gotweb/gotweb.c
+++ gotweb/gotweb.c
@@ -2192,8 +2192,32 @@ gw_template(size_t key, void *arg)
 	const struct got_error *error = NULL;
 	enum kcgi_err kerr = KCGI_OK;
 	struct gw_trans *gw_trans = arg;
-	char *img_src = NULL;
+	char *ati = NULL, *fic32 = NULL, *fic16 = NULL;
+	char *swm = NULL, *spt = NULL, *css = NULL, *logo = NULL;
 
+	if (asprintf(&ati, "%s%s", gw_trans->gw_conf->got_www_path,
+	    "/apple-touch-icon.png") == -1)
+		goto err;
+	if (asprintf(&fic32, "%s%s", gw_trans->gw_conf->got_www_path,
+	     "/favicon-32x32.png") == -1)
+		goto err;
+	if (asprintf(&fic16, "%s%s", gw_trans->gw_conf->got_www_path,
+	    "/favicon-16x16.png") == -1)
+		goto err;
+	if (asprintf(&swm, "%s%s", gw_trans->gw_conf->got_www_path,
+	    "/site.webmanifest") == -1)
+		goto err;
+	if (asprintf(&spt, "%s%s", gw_trans->gw_conf->got_www_path,
+	    "/safari-pinned-tab.svg") == -1)
+		goto err;
+	if (asprintf(&css, "%s%s", gw_trans->gw_conf->got_www_path,
+	    "/gotweb.css") == -1)
+		goto err;
+	if (asprintf(&logo, "%s%s%s", gw_trans->gw_conf->got_www_path,
+	    gw_trans->gw_conf->got_www_path ? "/" : "",
+	    gw_trans->gw_conf->got_logo) == -1)
+		goto err;
+
 	switch (key) {
 	case (TEMPL_HEAD):
 		kerr = khtml_attr(gw_trans->gw_html_req, KELEM_META,
@@ -2231,7 +2255,7 @@ gw_template(size_t key, void *arg)
 			return 0;
 		kerr = khtml_attr(gw_trans->gw_html_req, KELEM_LINK,
 		    KATTR_REL, "apple-touch-icon", KATTR_SIZES, "180x180",
-		    KATTR_HREF, "/apple-touch-icon.png", KATTR__MAX);
+		    KATTR_HREF, ati, KATTR__MAX);
 		if (kerr != KCGI_OK)
 			return 0;
 		kerr = khtml_closeelem(gw_trans->gw_html_req, 1);
@@ -2239,7 +2263,7 @@ gw_template(size_t key, void *arg)
 			return 0;
 		kerr = khtml_attr(gw_trans->gw_html_req, KELEM_LINK,
 		    KATTR_REL, "icon", KATTR_TYPE, "image/png", KATTR_SIZES,
-		    "32x32", KATTR_HREF, "/favicon-32x32.png", KATTR__MAX);
+		    "32x32", KATTR_HREF, fic32, KATTR__MAX);
 		if (kerr != KCGI_OK)
 			return 0;
 		kerr = khtml_closeelem(gw_trans->gw_html_req, 1);
@@ -2247,14 +2271,14 @@ gw_template(size_t key, void *arg)
 			return 0;
 		kerr = khtml_attr(gw_trans->gw_html_req, KELEM_LINK,
 		    KATTR_REL, "icon", KATTR_TYPE, "image/png", KATTR_SIZES,
-		    "16x16", KATTR_HREF, "/favicon-16x16.png", KATTR__MAX);
+		    "16x16", KATTR_HREF, fic16, KATTR__MAX);
 		if (kerr != KCGI_OK)
 			return 0;
 		kerr = khtml_closeelem(gw_trans->gw_html_req, 1);
 		if (kerr != KCGI_OK)
 			return 0;
 		kerr = khtml_attr(gw_trans->gw_html_req, KELEM_LINK,
-		    KATTR_REL, "manifest", KATTR_HREF, "/site.webmanifest",
+		    KATTR_REL, "manifest", KATTR_HREF, swm,
 		    KATTR__MAX);
 		if (kerr != KCGI_OK)
 			return 0;
@@ -2263,7 +2287,7 @@ gw_template(size_t key, void *arg)
 			return 0;
 		kerr = khtml_attr(gw_trans->gw_html_req, KELEM_LINK,
 		    KATTR_REL, "mask-icon", KATTR_HREF,
-		    "/safari-pinned-tab.svg", KATTR__MAX);
+		    spt, KATTR__MAX);
 		if (kerr != KCGI_OK)
 			return 0;
 		kerr = khtml_closeelem(gw_trans->gw_html_req, 1);
@@ -2271,7 +2295,7 @@ gw_template(size_t key, void *arg)
 			return 0;
 		kerr = khtml_attr(gw_trans->gw_html_req, KELEM_LINK,
 		    KATTR_REL, "stylesheet", KATTR_TYPE, "text/css",
-		    KATTR_HREF, "/gotweb.css", KATTR__MAX);
+		    KATTR_HREF, css, KATTR__MAX);
 		if (kerr != KCGI_OK)
 			return 0;
 		kerr = khtml_closeelem(gw_trans->gw_html_req, 1);
@@ -2288,20 +2312,13 @@ gw_template(size_t key, void *arg)
 		    KATTR_TARGET, "_sotd", KATTR__MAX);
 		if (kerr != KCGI_OK)
 			return 0;
-		if (asprintf(&img_src, "/%s",
-		    gw_trans->gw_conf->got_logo) == -1)
-			return 0;
 		kerr = khtml_attr(gw_trans->gw_html_req, KELEM_IMG,
-		    KATTR_SRC, img_src, KATTR__MAX);
-		if (kerr != KCGI_OK) {
-			free(img_src);
+		    KATTR_SRC, logo, KATTR__MAX);
+		if (kerr != KCGI_OK)
 			return 0;
-		}
 		kerr = khtml_closeelem(gw_trans->gw_html_req, 3);
-		if (kerr != KCGI_OK) {
-			free(img_src);
+		if (kerr != KCGI_OK)
 			return 0;
-		}
 		break;
 	case (TEMPL_SITEPATH):
 		error = gw_output_site_link(gw_trans);
@@ -2379,7 +2396,23 @@ gw_template(size_t key, void *arg)
 	default:
 		return 0;
 	}
+	free(ati);
+	free(fic32);
+	free(fic16);
+	free(swm);
+	free(spt);
+	free(css);
+	free(logo);
 	return 1;
+err:
+	free(ati);
+	free(fic32);
+	free(fic16);
+	free(swm);
+	free(spt);
+	free(css);
+	free(logo);
+	return 0;
 }
 
 static const struct got_error *
@@ -4701,6 +4734,7 @@ main(int argc, char *argv[])
 done:
 	if (gw_malloc) {
 		free(gw_trans->gw_conf->got_repos_path);
+		free(gw_trans->gw_conf->got_www_path);
 		free(gw_trans->gw_conf->got_site_name);
 		free(gw_trans->gw_conf->got_site_owner);
 		free(gw_trans->gw_conf->got_site_link);
blob - 62d2057c8f471e7dfccf179ea8bd7c98fd0d8de1
blob + d1056ee45db9e7d5294040b6585e57797ed9ffcf
--- gotweb/gotweb.conf.5
+++ gotweb/gotweb.conf.5
@@ -88,6 +88,8 @@ Set the displayed site name title.
 Set the displayed site owner.
 .It Ic got_show_site_owner Ar on | off
 Toggle display of the site owner.
+.It Ic got_www_path Ar string
+Set the public gotweb httpd path.
 .El
 .Sh EXAMPLES
 These are the currently configurable items for
@@ -101,6 +103,7 @@ with their default values.
 #
 
 got_repos_path			"/got/public"
+got_www_path			"/gotweb"
 
 #got_max_repos			100
 #got_max_repos_display		25
blob - c2c8f7043eff68f8b9dfc3de1baa9d8d8fef8de5
blob + 0f7fca003fcd9433a1c8592954cba83f34534467
--- gotweb/gotweb.h
+++ gotweb/gotweb.h
@@ -27,6 +27,7 @@
 #define GOTWEB_GOT_DIR	 ".got"
 #define GOTWEB_GIT_DIR	 ".git"
 
+#define D_GOTWWW	 ""
 #define D_GOTPATH	 "/got/public"
 #define D_SITENAME	 "Gotweb"
 #define D_SITEOWNER	 "Got Owner"
@@ -48,6 +49,7 @@
 
 struct gotweb_config {
 	char		*got_repos_path;
+	char		*got_www_path;
 	char		*got_site_name;
 	char		*got_site_owner;
 	char		*got_site_link;
blob - 93c6e03f94ed0176787d92976b2a68085ae10de3
blob + c662466befc147e80fcf92724f47490bd4b4c45e
--- gotweb/parse.y
+++ gotweb/parse.y
@@ -130,13 +130,22 @@ boolean		: STRING {
 		;
 main		: GOT_REPOS_PATH STRING {
 			gw_conf->got_repos_path = strdup($2);
-			if (gw_conf->got_repos_path== NULL) {
+			if (gw_conf->got_repos_path == NULL) {
 				free($2);
 				yyerror("strdup");
 				YYERROR;
 			}
 			free($2);
 		}
+		| GOT_WWW_PATH STRING {
+			gw_conf->got_www_path = strdup($2);
+			if (gw_conf->got_www_path == NULL) {
+				free($2);
+				yyerror("strdup");
+				YYERROR;
+			}
+			free($2);
+		}
 		| GOT_MAX_REPOS NUMBER {
 			if ($2 > 0)
 				gw_conf->got_max_repos = $2;
@@ -265,6 +274,7 @@ lookup(char *s)
 		{ "got_site_link",		GOT_SITE_LINK },
 		{ "got_site_name",		GOT_SITE_NAME },
 		{ "got_site_owner",		GOT_SITE_OWNER },
+		{ "got_www_path",		GOT_WWW_PATH },
 	};
 	const struct keywords	*p;
 
@@ -594,6 +604,11 @@ parse_gotweb_config(struct gotweb_config **gconf, cons
 	}
 	gw_conf->got_repos_path = strdup(D_GOTPATH);
 	if (gw_conf->got_repos_path == NULL) {
+		gerror = got_error_from_errno("strdup");
+		goto done;
+	}
+	gw_conf->got_www_path = strdup(D_GOTWWW);
+	if (gw_conf->got_www_path == NULL) {
 		gerror = got_error_from_errno("strdup");
 		goto done;
 	}