From 3de04b27aba3dba8a36f21f1d796adab05050700 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Sun, 24 Aug 2025 13:48:19 -0400 Subject: [PATCH] Redirect to login page if require-login is enabled --- cmd/serve.go | 2 ++ server/config.go | 1 + server/server.go | 6 +++--- server/types.go | 2 +- web/public/static/langs/en.json | 2 -- web/src/components/Navigation.jsx | 8 +------- web/src/components/Notifications.jsx | 9 ++------- web/src/components/Preferences.jsx | 26 ++++++++++---------------- 8 files changed, 20 insertions(+), 36 deletions(-) diff --git a/cmd/serve.go b/cmd/serve.go index 94349f52..d11778b2 100644 --- a/cmd/serve.go +++ b/cmd/serve.go @@ -172,6 +172,7 @@ func execServe(c *cli.Context) error { webRoot := c.String("web-root") enableSignup := c.Bool("enable-signup") enableLogin := c.Bool("enable-login") + requireLogin := c.Bool("require-login") enableReservations := c.Bool("enable-reservations") upstreamBaseURL := c.String("upstream-base-url") upstreamAccessToken := c.String("upstream-access-token") @@ -476,6 +477,7 @@ func execServe(c *cli.Context) error { conf.BillingContact = billingContact conf.EnableSignup = enableSignup conf.EnableLogin = enableLogin + conf.RequireLogin = requireLogin conf.EnableReservations = enableReservations conf.EnableMetrics = enableMetrics conf.MetricsListenHTTP = metricsListenHTTP diff --git a/server/config.go b/server/config.go index e3de1620..8e7dcda2 100644 --- a/server/config.go +++ b/server/config.go @@ -162,6 +162,7 @@ type Config struct { BillingContact string EnableSignup bool // Enable creation of accounts via API and UI EnableLogin bool + RequireLogin bool EnableReservations bool // Allow users with role "user" to own/reserve topics EnableMetrics bool AccessControlAllowOrigin string // CORS header field to restrict access from web clients diff --git a/server/server.go b/server/server.go index a7dd6d85..fc04d50f 100644 --- a/server/server.go +++ b/server/server.go @@ -9,8 +9,6 @@ import ( "encoding/json" "errors" "fmt" - "gopkg.in/yaml.v2" - "heckel.io/ntfy/v2/payments" "io" "net" "net/http" @@ -33,7 +31,9 @@ import ( "github.com/gorilla/websocket" "github.com/prometheus/client_golang/prometheus/promhttp" "golang.org/x/sync/errgroup" + "gopkg.in/yaml.v2" "heckel.io/ntfy/v2/log" + "heckel.io/ntfy/v2/payments" "heckel.io/ntfy/v2/user" "heckel.io/ntfy/v2/util" "heckel.io/ntfy/v2/util/sprig" @@ -600,12 +600,12 @@ func (s *Server) handleWebConfig(w http.ResponseWriter, _ *http.Request, _ *visi BaseURL: "", // Will translate to window.location.origin AppRoot: s.config.WebRoot, EnableLogin: s.config.EnableLogin, + RequireLogin: s.config.RequireLogin, EnableSignup: s.config.EnableSignup, EnablePayments: s.config.StripeSecretKey != "", EnableCalls: s.config.TwilioAccount != "", EnableEmails: s.config.SMTPSenderFrom != "", EnableReservations: s.config.EnableReservations, - ReuqireLogin: s.config.RequireLogin, EnableWebPush: s.config.WebPushPublicKey != "", BillingContact: s.config.BillingContact, WebPushPublicKey: s.config.WebPushPublicKey, diff --git a/server/types.go b/server/types.go index d4aabb40..d9519b94 100644 --- a/server/types.go +++ b/server/types.go @@ -449,13 +449,13 @@ type apiConfigResponse struct { BaseURL string `json:"base_url"` AppRoot string `json:"app_root"` EnableLogin bool `json:"enable_login"` + RequireLogin bool `json:"require_login"` EnableSignup bool `json:"enable_signup"` EnablePayments bool `json:"enable_payments"` EnableCalls bool `json:"enable_calls"` EnableEmails bool `json:"enable_emails"` EnableReservations bool `json:"enable_reservations"` EnableWebPush bool `json:"enable_web_push"` - RequireLogin bool `json:"require_login"` BillingContact string `json:"billing_contact"` WebPushPublicKey string `json:"web_push_public_key"` DisallowedTopics []string `json:"disallowed_topics"` diff --git a/web/public/static/langs/en.json b/web/public/static/langs/en.json index 888a9450..b0d3c545 100644 --- a/web/public/static/langs/en.json +++ b/web/public/static/langs/en.json @@ -97,8 +97,6 @@ "notifications_none_for_any_description": "To send notifications to a topic, simply PUT or POST to the topic URL. Here's an example using one of your topics.", "notifications_no_subscriptions_title": "It looks like you don't have any subscriptions yet.", "notifications_no_subscriptions_description": "Click the \"{{linktext}}\" link to create or subscribe to a topic. After that, you can send messages via PUT or POST and you'll receive notifications here.", - "notifications_no_subscriptions_login_title": "This page requires a Login.", - "notifications_no_subscriptions_login_description": "Click \"{{linktext}}\" to login into your account.", "notifications_example": "Example", "notifications_more_details": "For more information, check out the website or documentation.", "display_name_dialog_title": "Change display name", diff --git a/web/src/components/Navigation.jsx b/web/src/components/Navigation.jsx index 0c4da2e5..7e30931a 100644 --- a/web/src/components/Navigation.jsx +++ b/web/src/components/Navigation.jsx @@ -135,7 +135,7 @@ const NavList = (props) => { {showNotificationContextNotSupportedBox && } {showNotificationIOSInstallRequired && } {alertVisible && } - {!showSubscriptionsList && (session.exists() || !config.require_login) && ( + {!showSubscriptionsList && ( navigate(routes.app)} selected={location.pathname === config.app_root}> @@ -164,36 +164,30 @@ const NavList = (props) => { )} - {session.exists() || !config.require_login && ( navigate(routes.settings)} selected={location.pathname === routes.settings}> - )} openUrl("/docs")}> - {session.exists() || !config.require_login && ( props.onPublishMessageClick()}> - )} - {session.exists() || !config.require_login && ( setSubscribeDialogOpen(true)}> - )} {showUpgradeBanner && ( // The text background gradient didn't seem to do well with switching between light/dark mode, // So adding a `key` forces React to replace the entire component when the theme changes diff --git a/web/src/components/Notifications.jsx b/web/src/components/Notifications.jsx index 1995750e..449b238b 100644 --- a/web/src/components/Notifications.jsx +++ b/web/src/components/Notifications.jsx @@ -46,7 +46,6 @@ import priority5 from "../img/priority-5.svg"; import logoOutline from "../img/ntfy-outline.svg"; import AttachmentIcon from "./AttachmentIcon"; import { useAutoSubscribe } from "./hooks"; -import session from "../app/Session"; const priorityFiles = { 1: priority1, @@ -645,16 +644,12 @@ const NoSubscriptions = () => { {t("action_bar_logo_alt")}
- {!session.exists() && !config.require_login && t("notifications_no_subscriptions_title")} - {!session.exists() && config.require_login && t("notifications_no_subscriptions_login_title")} + {t("notifications_no_subscriptions_title")}
- {!session.exists() && !config.require_login && t("notifications_no_subscriptions_description", { + {t("notifications_no_subscriptions_description", { linktext: t("nav_button_subscribe"), })} - {!session.exists() && config.require_login && t("notifications_no_subscriptions_login_description", { - linktext: t("action_bar_sign_in"), - })} diff --git a/web/src/components/Preferences.jsx b/web/src/components/Preferences.jsx index dcb90bf9..8621a263 100644 --- a/web/src/components/Preferences.jsx +++ b/web/src/components/Preferences.jsx @@ -65,22 +65,16 @@ const maybeUpdateAccountSettings = async (payload) => { } }; -const Preferences = () => { - if (!session.exists() or !config.requireLogin) { - window.location.href = routes.app; - return <>; - } - return ( - - - - - - - - - ); -}; +const Preferences = () => ( + + + + + + + + +); const Notifications = () => { const { t } = useTranslation();