From 7e67d0dac66784354ba6ef997119b2451b90973e Mon Sep 17 00:00:00 2001 From: Kendall Garner <17521368+kgarner7@users.noreply.github.com> Date: Thu, 8 Jan 2026 07:42:59 -0800 Subject: [PATCH] fix: properly handle server lock and related properties --- Dockerfile | 4 +++- docker-compose.yaml | 4 ++-- settings.js.template | 2 +- .../components/server-required.tsx | 5 ++--- .../routes/action-required-route.tsx | 4 ++-- .../utils/window-properties.tsx | 4 ++++ .../features/login/routes/login-route.tsx | 10 +++++++--- .../search/components/server-commands.tsx | 5 ++--- .../servers/components/add-server-form.tsx | 18 +++++++++++------- .../components/server-selector-items.tsx | 5 ++--- .../features/titlebar/components/app-menu.tsx | 3 ++- src/renderer/global.d.ts | 4 ++-- 12 files changed, 40 insertions(+), 28 deletions(-) create mode 100644 src/renderer/features/action-required/utils/window-properties.tsx diff --git a/Dockerfile b/Dockerfile index 6078084d0..bd1b86940 100644 --- a/Dockerfile +++ b/Dockerfile @@ -20,6 +20,8 @@ COPY --chown=nginx:nginx --from=builder /app/out/web /usr/share/nginx/html COPY ./settings.js.template /etc/nginx/templates/settings.js.template COPY ng.conf.template /etc/nginx/templates/default.conf.template -ENV PUBLIC_PATH="/" +ENV SERVER_LOCK=false SERVER_NAME="" SERVER_TYPE="" SERVER_URL="" +ENV LEGACY_AUTHENTICATION="" ANALYTICS_DISABLED="" PUBLIC_PATH="/" + EXPOSE 9180 CMD ["nginx", "-g", "daemon off;"] diff --git a/docker-compose.yaml b/docker-compose.yaml index 62acb0401..1ffc78d66 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -5,9 +5,9 @@ services: restart: unless-stopped environment: - SERVER_NAME=jellyfin # pre-defined server name - - SERVER_LOCK=true # When true AND name/type/url are set, only username/password can be toggled + - SERVER_LOCK=false # When true AND name/type/url are set, only username/password can be toggled - SERVER_TYPE=jellyfin # the allowed types are: jellyfin, navidrome, subsonic. These values are case insensitive - - SERVER_URL= # http://address:port or https://address:port + - SERVER_URL=http://localhost:8096 # http://address:port or https://address:port - LEGACY_AUTHENTICATION=false # When SERVER_LOCK is true, sets the legacyauth flag for server authentication (true or false) - ANALYTICS_DISABLED=false # Set to true to disable Umami analytics tracking ports: diff --git a/settings.js.template b/settings.js.template index 0654fea0b..8639edff4 100644 --- a/settings.js.template +++ b/settings.js.template @@ -1 +1 @@ -"use strict";window.SERVER_URL="${SERVER_URL}";window.SERVER_NAME="${SERVER_NAME}";window.SERVER_TYPE="${SERVER_TYPE}";window.SERVER_LOCK=${SERVER_LOCK};window.LEGACY_AUTHENTICATION=${LEGACY_AUTHENTICATION};window.ANALYTICS_DISABLED="${ANALYTICS_DISABLED}"; +"use strict";window.SERVER_URL="${SERVER_URL}";window.SERVER_NAME="${SERVER_NAME}";window.SERVER_TYPE="${SERVER_TYPE}";window.SERVER_LOCK="${SERVER_LOCK}";window.LEGACY_AUTHENTICATION="${LEGACY_AUTHENTICATION}";window.ANALYTICS_DISABLED="${ANALYTICS_DISABLED}"; diff --git a/src/renderer/features/action-required/components/server-required.tsx b/src/renderer/features/action-required/components/server-required.tsx index 8ed11ffad..bb5044e3c 100644 --- a/src/renderer/features/action-required/components/server-required.tsx +++ b/src/renderer/features/action-required/components/server-required.tsx @@ -3,6 +3,7 @@ import isElectron from 'is-electron'; import { useTranslation } from 'react-i18next'; import { useNavigate } from 'react-router'; +import { isServerLock } from '/@/renderer/features/action-required/utils/window-properties'; import JellyfinLogo from '/@/renderer/features/servers/assets/jellyfin.png'; import NavidromeLogo from '/@/renderer/features/servers/assets/navidrome.png'; import OpenSubsonicLogo from '/@/renderer/features/servers/assets/opensubsonic.png'; @@ -28,14 +29,12 @@ const localSettings = isElectron() ? window.api.localSettings : null; export const ServerRequired = () => { const serverList = useServerList(); - const isServerLock = Boolean(window.SERVER_LOCK) || false; - if (Object.keys(serverList).length > 0) { return ( - {!isServerLock && ( + {!isServerLock() && ( <> diff --git a/src/renderer/features/action-required/routes/action-required-route.tsx b/src/renderer/features/action-required/routes/action-required-route.tsx index 595c5c24c..b64b615ad 100644 --- a/src/renderer/features/action-required/routes/action-required-route.tsx +++ b/src/renderer/features/action-required/routes/action-required-route.tsx @@ -6,6 +6,7 @@ import { PageHeader } from '/@/renderer/components/page-header/page-header'; import { ActionRequiredContainer } from '/@/renderer/features/action-required/components/action-required-container'; import { ServerCredentialRequired } from '/@/renderer/features/action-required/components/server-credential-required'; import { ServerRequired } from '/@/renderer/features/action-required/components/server-required'; +import { isServerLock } from '/@/renderer/features/action-required/utils/window-properties'; import LoginRoute from '/@/renderer/features/login/routes/login-route'; import { ServerList } from '/@/renderer/features/servers/components/server-list'; import { AnimatedPage } from '/@/renderer/features/shared/components/animated-page'; @@ -25,8 +26,7 @@ const ActionRequiredRoute = () => { const isServerRequired = !currentServer; const isCredentialRequired = currentServer && !currentServer.credential; - const isServerLock = Boolean(window.SERVER_LOCK) || false; - const isLoginRequired = isServerLock && !currentServer; + const isLoginRequired = isServerLock() && !currentServer; const checks = [ { diff --git a/src/renderer/features/action-required/utils/window-properties.tsx b/src/renderer/features/action-required/utils/window-properties.tsx new file mode 100644 index 000000000..a34382084 --- /dev/null +++ b/src/renderer/features/action-required/utils/window-properties.tsx @@ -0,0 +1,4 @@ +export const isLegacyAuth = () => + window.LEGACY_AUTHENTICATION === true || window.LEGACY_AUTHENTICATION === 'true'; + +export const isServerLock = () => window.SERVER_LOCK === true || window.SERVER_LOCK === 'true'; diff --git a/src/renderer/features/login/routes/login-route.tsx b/src/renderer/features/login/routes/login-route.tsx index e6e6a8a23..f59e71acc 100644 --- a/src/renderer/features/login/routes/login-route.tsx +++ b/src/renderer/features/login/routes/login-route.tsx @@ -6,6 +6,10 @@ import { Navigate } from 'react-router'; import { api } from '/@/renderer/api'; import { PageHeader } from '/@/renderer/components/page-header/page-header'; +import { + isLegacyAuth, + isServerLock, +} from '/@/renderer/features/action-required/utils/window-properties'; import JellyfinIcon from '/@/renderer/features/servers/assets/jellyfin.png'; import NavidromeIcon from '/@/renderer/features/servers/assets/navidrome.png'; import SubsonicIcon from '/@/renderer/features/servers/assets/opensubsonic.png'; @@ -48,17 +52,17 @@ const LoginRoute = () => { const currentServer = useCurrentServer(); // Check if server lock is configured - const isServerLock = Boolean(window.SERVER_LOCK) || false; + const serverLock = isServerLock(); const serverType = window.SERVER_TYPE ? toServerType(window.SERVER_TYPE) : null; const serverName = window.SERVER_NAME || ''; const serverUrl = window.SERVER_URL || ''; - const legacyAuth = isServerLock ? Boolean(window.LEGACY_AUTHENTICATION) || false : false; + const legacyAuth = serverLock && isLegacyAuth(); const config = [ { isValid: true, key: 'SERVER_LOCK', - value: isServerLock, + value: serverLock, }, { isValid: serverType !== null, diff --git a/src/renderer/features/search/components/server-commands.tsx b/src/renderer/features/search/components/server-commands.tsx index 6fbd18a54..5c946b2e8 100644 --- a/src/renderer/features/search/components/server-commands.tsx +++ b/src/renderer/features/search/components/server-commands.tsx @@ -3,6 +3,7 @@ import { Dispatch, useCallback } from 'react'; import { useTranslation } from 'react-i18next'; import { useNavigate } from 'react-router'; +import { isServerLock } from '/@/renderer/features/action-required/utils/window-properties'; import { Command, CommandPalettePages } from '/@/renderer/features/search/components/command'; import { ServerList } from '/@/renderer/features/servers/components/server-list'; import { AppRoute } from '/@/renderer/router/routes'; @@ -42,8 +43,6 @@ export const ServerCommands = ({ handleClose, setPages, setQuery }: ServerComman [handleClose, navigate, setCurrentServer, setPages, setQuery], ); - const isServerLock = Boolean(window.SERVER_LOCK) || false; - return ( <> {`${serverList[key].name}...`} ))} - {!isServerLock && ( + {!isServerLock() && ( {t('page.appMenu.manageServers', { postProcess: 'sentenceCase' })}... diff --git a/src/renderer/features/servers/components/add-server-form.tsx b/src/renderer/features/servers/components/add-server-form.tsx index a5d9d4a5d..1eb1f686a 100644 --- a/src/renderer/features/servers/components/add-server-form.tsx +++ b/src/renderer/features/servers/components/add-server-form.tsx @@ -5,6 +5,10 @@ import { useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { api } from '/@/renderer/api'; +import { + isLegacyAuth, + isServerLock, +} from '/@/renderer/features/action-required/utils/window-properties'; import JellyfinIcon from '/@/renderer/features/servers/assets/jellyfin.png'; import NavidromeIcon from '/@/renderer/features/servers/assets/navidrome.png'; import SubsonicIcon from '/@/renderer/features/servers/assets/opensubsonic.png'; @@ -94,8 +98,8 @@ export const AddServerForm = ({ onCancel }: AddServerFormProps) => { const { addServer, setCurrentServer } = useAuthStoreActions(); const { servers: discovered } = useAutodiscovery(); - const isServerLock = Boolean(window.SERVER_LOCK) || false; - const legacyAuthDefault = isServerLock ? Boolean(window.LEGACY_AUTHENTICATION) || false : false; + const serverLock = isServerLock(); + const legacyAuthDefault = serverLock && isLegacyAuth(); const form = useForm({ initialValues: { @@ -231,7 +235,7 @@ export const AddServerForm = ({ onCancel }: AddServerFormProps) => { { { {...form.getInputProps('name')} /> { /> { )} {form.values.type === ServerType.SUBSONIC && ( { }); }; - const isServerLock = Boolean(window.SERVER_LOCK) || false; - return ( <> @@ -123,7 +122,7 @@ export const ServerSelectorItems = () => { ); })} - {!isServerLock && ( + {!isServerLock() && ( } onClick={handleManageServersModal} diff --git a/src/renderer/features/titlebar/components/app-menu.tsx b/src/renderer/features/titlebar/components/app-menu.tsx index 9f1491ad9..a89592a6c 100644 --- a/src/renderer/features/titlebar/components/app-menu.tsx +++ b/src/renderer/features/titlebar/components/app-menu.tsx @@ -6,6 +6,7 @@ import { Link, useNavigate } from 'react-router'; import packageJson from '../../../../../package.json'; +import { isServerLock } from '/@/renderer/features/action-required/utils/window-properties'; import { ServerList } from '/@/renderer/features/servers/components/server-list'; import { openSettingsModal } from '/@/renderer/features/settings/utils/open-settings-modal'; import { useAppStore, useAppStoreActions, useCommandPalette } from '/@/renderer/store'; @@ -175,7 +176,7 @@ export const AppMenu = () => { type: 'divider', }, { - condition: !window.SERVER_LOCK, + condition: !isServerLock(), id: 'manage-servers', item: { label: t('page.appMenu.manageServers', { postProcess: 'sentenceCase' }), diff --git a/src/renderer/global.d.ts b/src/renderer/global.d.ts index 38ba5e0d1..02af53bd7 100644 --- a/src/renderer/global.d.ts +++ b/src/renderer/global.d.ts @@ -1,8 +1,8 @@ declare global { interface Window { ANALYTICS_DISABLED?: boolean | string; - LEGACY_AUTHENTICATION?: boolean; - SERVER_LOCK?: boolean; + LEGACY_AUTHENTICATION?: boolean | string; + SERVER_LOCK?: boolean | string; SERVER_NAME?: string; SERVER_TYPE?: string; SERVER_URL?: string;