From d3063bcc7f78098d2bcb157028ea5a775e48ab10 Mon Sep 17 00:00:00 2001 From: Owen Rummage Date: Wed, 29 Jul 2026 10:24:45 -0500 Subject: [PATCH] honor public URL in share links --- conf/lms.conf | 3 +++ src/libs/subsonic/impl/RequestContext.cpp | 8 ++++++++ src/lms/ui/ShareUtils.cpp | 12 ++++++++++-- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/conf/lms.conf b/conf/lms.conf index ac338f8a..1dbd1dfd 100644 --- a/conf/lms.conf +++ b/conf/lms.conf @@ -25,6 +25,9 @@ db-profile-queries = false; # Listen port/addr of the web server listen-port = 5082; listen-addr = "0.0.0.0"; +# Externally visible URL used in generated share links. Leave empty to infer it +# from the request. This is normally set when LMS is behind a reverse proxy. +public-url = ""; behind-reverse-proxy = false; # original-ip-header and trusted-proxies are used only if behind-reverse-proxy is set to true original-ip-header = "X-Forwarded-For"; diff --git a/src/libs/subsonic/impl/RequestContext.cpp b/src/libs/subsonic/impl/RequestContext.cpp index 1c5fe25e..62b7bb5e 100644 --- a/src/libs/subsonic/impl/RequestContext.cpp +++ b/src/libs/subsonic/impl/RequestContext.cpp @@ -24,6 +24,8 @@ #include "SubsonicResponse.hpp" #include "database/objects/MediaLibrary.hpp" #include "database/objects/User.hpp" +#include "core/IConfig.hpp" +#include "core/Service.hpp" namespace lms::api::subsonic { @@ -59,6 +61,12 @@ namespace lms::api::subsonic std::string RequestContext::getPublicBaseUrl() const { + std::string publicUrl{ core::Service::get()->getString("public-url", "") }; + while (publicUrl.ends_with('/')) + publicUrl.pop_back(); + if (!publicUrl.empty()) + return publicUrl; + std::string scheme{ _request.headerValue("X-Forwarded-Proto") }; if (scheme.empty()) scheme = _request.urlScheme(); diff --git a/src/lms/ui/ShareUtils.cpp b/src/lms/ui/ShareUtils.cpp index 297f314a..70be8c3b 100644 --- a/src/lms/ui/ShareUtils.cpp +++ b/src/lms/ui/ShareUtils.cpp @@ -16,6 +16,7 @@ #include "database/objects/User.hpp" #include "services/podcast/IPodcastService.hpp" #include "core/Service.hpp" +#include "core/IConfig.hpp" #include "LmsApplication.hpp" #include "ModalManager.hpp" @@ -36,8 +37,15 @@ namespace lms::ui::shareUtils LmsApp->getDbSession().create(token, mediaId, user); } - const auto& env{ LmsApp->environment() }; - const std::string url{ env.urlScheme() + "://" + env.hostName() + "/share/" + token }; + std::string publicUrl{ core::Service::get()->getString("public-url", "") }; + while (publicUrl.ends_with('/')) + publicUrl.pop_back(); + if (publicUrl.empty()) + { + const auto& env{ LmsApp->environment() }; + publicUrl = env.urlScheme() + "://" + env.hostName(); + } + const std::string url{ publicUrl + "/share/" + token }; auto modal{ std::make_unique(Wt::WString::fromUTF8(R"(