Package: prayer Version: 1.3.5-dfsg1-4 Severity: wishlist Tags: patch When running prayer behind a reverse-proxy, it's useful to override prayer's internally generated guess as to its outward-facing URL. For example, maybe the proxy terminates TLS, so prayer looks externally as if it's behind an `https://...' URL, but it sees only plain HTTP.
Here's a patch which adds a new `url_prefix' option for this purpose. diff --git a/man/prayer.cf.5 b/man/prayer.cf.5 index c559dd3..79c6889 100644 --- a/man/prayer.cf.5 +++ b/man/prayer.cf.5 @@ -344,6 +344,13 @@ Search timeout. . .Bl -tag -width Ds . +.It Cd url_prefix +Prayer will generate HTML output under the assumption that +this is the outward-facing URL of its top-level page, +rather than attempting to guess. +Useful if Prayer is running behind a reverse proxy +or similar. +. .It Cd use_http_port , use_https_port Define a single HTTP[S] port to bind to. You can define an arbitary list of ports of both kinds by using a series of separate diff --git a/servers/prayer.c b/servers/prayer.c index 52e0695..6dfbd37 100644 --- a/servers/prayer.c +++ b/servers/prayer.c @@ -69,6 +69,9 @@ char *prayer_url_prefix(struct prayer *prayer, struct pool *tpool) { struct config *config = prayer->config; + if (config->url_prefix) + return (pool_strdup(tpool, config->url_prefix)); + if (prayer->use_ssl) { if (prayer->port == 443) return (pool_printf(tpool, "https://%s", config->hostname)); diff --git a/session/session.c b/session/session.c index c6f9d45..7500687 100644 --- a/session/session.c +++ b/session/session.c @@ -529,7 +529,9 @@ void session_setup_urls(struct session *session) /* Time to define some URLs for this session */ /* Base URL: route back to the login screen */ - if (session->use_ssl) { + if (config->url_prefix) + session->url_prefix = pool_strdup(p, config->url_prefix); + else if (session->use_ssl) { if (session->frontend_port == 443) session->url_prefix = pool_printf(p, "https://%s", config->hostname); @@ -553,7 +555,11 @@ void session_setup_urls(struct session *session) quoted_user = string_url_encode(p, session->username); /* url_prefix_asession: root for session URLs */ - if (session->use_ssl) { + if (config->url_prefix) { + session->url_prefix_asession + = pool_printf(p, "%s/session/%s:%lu", + config->url_prefix, quoted_user, pid); + } else if (session->use_ssl) { if (session->session_port == 443) session->url_prefix_asession = pool_printf(p, "https://%s/session/%s:%lu", diff --git a/shared/config.c b/shared/config.c index 479a3d0..4329acf 100644 --- a/shared/config.c +++ b/shared/config.c @@ -181,6 +181,7 @@ struct config *config_create(void) config->hostname = NIL; config->hostname_service = NIL; config->hostname_canonical = NIL; + config->url_prefix = NIL; config->referer_log_invalid = T; config->referer_block_invalid = NIL; config->fix_client_ipaddr = NIL; @@ -724,6 +725,8 @@ static struct { , { "tmp_dir", config_path, OFFSET(tmp_dir)} , { + "url_prefix", config_string, OFFSET(url_prefix)} + , { "use_agg_unmark", config_bool, OFFSET(use_agg_unmark)} , { "use_cookie", config_bool, OFFSET(use_cookie)} diff --git a/shared/config.h b/shared/config.h index 6ac09a1..20d3977 100644 --- a/shared/config.h +++ b/shared/config.h @@ -105,6 +105,7 @@ struct config { char *hostname_canonical; /* Overrides gethostbyname */ char *hostname; /* Overrides gethostbyname */ char *hostname_service; /* Login screen, overrides hostname */ + char *url_prefix; /* URL prefix, overrides hostname, port */ BOOL referer_block_invalid;/* Block logins from unknown referers */ BOOL referer_log_invalid; /* Log invalid referrer headers */ BOOL fix_client_ipaddr; /* Client must login from single addr */ -- System Information: Debian Release: 9.0 APT prefers stable APT policy: (990, 'stable') Architecture: i386 (i686) Kernel: Linux 4.9.0-3-686-pae (SMP w/3 CPU cores) Locale: LANG=en_GB.UTF-8, LC_CTYPE=en_GB.UTF-8 (charmap=UTF-8), LANGUAGE=en_GB.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/dash Init: sysvinit (via /sbin/init)