From 05bb8f8f9c4424ca065a36161e52ed004a28bdd4 Mon Sep 17 00:00:00 2001 From: Ryan Cohen Date: Wed, 14 Sep 2022 20:00:54 +0900 Subject: [PATCH] feat: disable plex login if owner doesnt have plex linked --- server/interfaces/api/settingsInterfaces.ts | 1 + server/lib/settings.ts | 4 +- server/routes/index.ts | 22 ++++--- src/components/Login/index.tsx | 62 +++++++++---------- .../UserGeneralSettings/index.tsx | 7 ++- src/context/SettingsContext.tsx | 1 + src/hooks/useUser.ts | 2 +- src/pages/_app.tsx | 1 + 8 files changed, 59 insertions(+), 41 deletions(-) diff --git a/server/interfaces/api/settingsInterfaces.ts b/server/interfaces/api/settingsInterfaces.ts index 0cd2f171a..5e4d91259 100644 --- a/server/interfaces/api/settingsInterfaces.ts +++ b/server/interfaces/api/settingsInterfaces.ts @@ -37,6 +37,7 @@ export interface PublicSettingsResponse { locale: string; emailEnabled: boolean; newPlexLogin: boolean; + plexLoginEnabled: boolean; } export interface CacheItem { diff --git a/server/lib/settings.ts b/server/lib/settings.ts index 63daf17f3..bce2f836d 100644 --- a/server/lib/settings.ts +++ b/server/lib/settings.ts @@ -110,7 +110,7 @@ interface PublicSettings { initialized: boolean; } -interface FullPublicSettings extends PublicSettings { +export interface FullPublicSettings extends PublicSettings { applicationTitle: string; applicationUrl: string; hideAvailable: boolean; @@ -126,6 +126,7 @@ interface FullPublicSettings extends PublicSettings { locale: string; emailEnabled: boolean; newPlexLogin: boolean; + plexLoginEnabled: boolean; } export interface NotificationAgentConfig { @@ -512,6 +513,7 @@ class Settings { locale: this.data.main.locale, emailEnabled: this.data.notifications.agents.email.enabled, newPlexLogin: this.data.main.newPlexLogin, + plexLoginEnabled: false, }; } diff --git a/server/routes/index.ts b/server/routes/index.ts index 4ce2507cf..68f2908b0 100644 --- a/server/routes/index.ts +++ b/server/routes/index.ts @@ -7,9 +7,10 @@ import type { } from '@server/api/themoviedb/interfaces'; import { getRepository } from '@server/datasource'; import DiscoverSlider from '@server/entity/DiscoverSlider'; +import { User } from '@server/entity/User'; import type { StatusResponse } from '@server/interfaces/api/settingsInterfaces'; import { Permission } from '@server/lib/permissions'; -import { getSettings } from '@server/lib/settings'; +import { getSettings, type FullPublicSettings } from '@server/lib/settings'; import logger from '@server/logger'; import { checkUser, isAuthenticated } from '@server/middleware/auth'; import { mapWatchProviderDetails } from '@server/models/common'; @@ -95,16 +96,23 @@ router.get('/status/appdata', (_req, res) => { }); router.use('/user', isAuthenticated(), user); -router.get('/settings/public', async (req, res) => { +router.get('/settings/public', async (req, res) => { const settings = getSettings(); + const userRepository = getRepository(User); + + const fullPublicSettings: FullPublicSettings = settings.fullPublicSettings; if (!(req.user?.settings?.notificationTypes.webpush ?? true)) { - return res - .status(200) - .json({ ...settings.fullPublicSettings, enablePushRegistration: false }); - } else { - return res.status(200).json(settings.fullPublicSettings); + fullPublicSettings.enablePushRegistration = false; } + + const admin = await userRepository.findOneBy({ id: 1 }); + + if (admin && admin.plexId) { + fullPublicSettings.plexLoginEnabled = true; + } + + return res.status(200).json(fullPublicSettings); }); router.get('/settings/discover', isAuthenticated(), async (_req, res) => { const sliderRepository = getRepository(DiscoverSlider); diff --git a/src/components/Login/index.tsx b/src/components/Login/index.tsx index fe92629a6..7ffcc2582 100644 --- a/src/components/Login/index.tsx +++ b/src/components/Login/index.tsx @@ -26,7 +26,7 @@ const Login = () => { const [error, setError] = useState(''); const [isProcessing, setProcessing] = useState(false); const [authToken, setAuthToken] = useState(undefined); - const { user, revalidate } = useUser(); + const { revalidate } = useUser(); const router = useRouter(); const settings = useSettings(); @@ -40,7 +40,11 @@ const Login = () => { const response = await axios.post('/api/v1/auth/plex', { authToken }); if (response.data?.id) { - revalidate(); + const user = await revalidate(); + + if (user) { + router.push('/'); + } } } catch (e) { setError(e.response.data.message); @@ -51,15 +55,7 @@ const Login = () => { if (authToken) { login(); } - }, [authToken, revalidate]); - - // Effect that is triggered whenever `useUser`'s user changes. If we get a new - // valid user, we redirect the user to the home page as the login was successful. - useEffect(() => { - if (user) { - router.push('/'); - } - }, [user, router]); + }, [authToken, revalidate, router]); const { data: backdrops } = useSWR('/api/v1/backdrops', { refreshInterval: 0, @@ -118,26 +114,30 @@ const Login = () => { {({ openIndexes, handleClick, AccordionContent }) => ( <> - - -
- setAuthToken(authToken)} - /> -
-
+ {settings.currentSettings.plexLoginEnabled && ( + <> + + +
+ setAuthToken(authToken)} + /> +
+
+ + )} {settings.currentSettings.localLogin && (