fix: force local login to be enabled if there is no plex server

pull/3015/head
sct 4 weeks ago
parent 1bc4d4a560
commit bd984badc0
No known key found for this signature in database

@ -227,8 +227,9 @@ authRoutes.post('/local', async (req, res, next) => {
const settings = getSettings();
const userRepository = getRepository(User);
const body = req.body as { email?: string; password?: string };
const admin = await userRepository.findOneBy({ id: 1 });
if (!settings.main.localLogin) {
if (!settings.main.localLogin && admin?.plexId) {
return res.status(500).json({ error: 'Password sign-in is disabled.' });
} else if (!body.email || !body.password) {
return res.status(500).json({

@ -96,6 +96,7 @@ router.get('/status/appdata', (_req, res) => {
});
router.use('/user', isAuthenticated(), user);
router.get<never, FullPublicSettings>('/settings/public', async (req, res) => {
const settings = getSettings();
const userRepository = getRepository(User);
@ -110,10 +111,13 @@ router.get<never, FullPublicSettings>('/settings/public', async (req, res) => {
if (admin && admin.plexId) {
fullPublicSettings.plexLoginEnabled = true;
} else if (admin && !admin.plexId) {
fullPublicSettings.localLogin = true;
}
return res.status(200).json(fullPublicSettings);
});
router.get('/settings/discover', isAuthenticated(), async (_req, res) => {
const sliderRepository = getRepository(DiscoverSlider);
@ -121,6 +125,7 @@ router.get('/settings/discover', isAuthenticated(), async (_req, res) => {
return res.json(sliders);
});
router.get(
'/settings/notifications/pushover/sounds',
isAuthenticated(),
@ -146,6 +151,7 @@ router.get(
}
}
);
router.use('/settings', isAuthenticated(Permission.ADMIN), settingsRoutes);
router.use('/search', isAuthenticated(), searchRoutes);
router.use('/discover', isAuthenticated(), discoverRoutes);

@ -3,6 +3,7 @@ import LoadingSpinner from '@app/components/Common/LoadingSpinner';
import PageTitle from '@app/components/Common/PageTitle';
import PermissionEdit from '@app/components/PermissionEdit';
import QuotaSelector from '@app/components/QuotaSelector';
import useSettings from '@app/hooks/useSettings';
import globalMessages from '@app/i18n/globalMessages';
import { ArrowDownOnSquareIcon } from '@heroicons/react/24/outline';
import type { MainSettings } from '@server/lib/settings';
@ -20,7 +21,7 @@ const messages = defineMessages({
toastSettingsFailure: 'Something went wrong while saving settings.',
localLogin: 'Enable Local Sign-In',
localLoginTip:
'Allow users to sign in using their email address and password, instead of Plex OAuth',
'Allow users to sign in using their email address and password, instead of Plex OAuth. If Plex is not setup, this will be enabled by default.',
newPlexLogin: 'Enable New Plex Sign-In',
newPlexLoginTip: 'Allow Plex users to sign in without first being imported',
movieRequestLimitLabel: 'Global Movie Request Limit',
@ -37,6 +38,7 @@ const SettingsUsers = () => {
error,
mutate: revalidate,
} = useSWR<MainSettings>('/api/v1/settings/main');
const { currentSettings } = useSettings();
if (!data && !error) {
return <LoadingSpinner />;
@ -59,7 +61,9 @@ const SettingsUsers = () => {
<div className="section">
<Formik
initialValues={{
localLogin: data?.localLogin,
localLogin: !currentSettings.plexLoginEnabled
? true
: data?.localLogin,
newPlexLogin: data?.newPlexLogin,
movieQuotaLimit: data?.defaultQuotas.movie.quotaLimit ?? 0,
movieQuotaDays: data?.defaultQuotas.movie.quotaDays ?? 7,
@ -116,9 +120,13 @@ const SettingsUsers = () => {
type="checkbox"
id="localLogin"
name="localLogin"
disabled={!currentSettings.plexLoginEnabled}
onChange={() => {
setFieldValue('localLogin', !values.localLogin);
}}
style={{
opacity: currentSettings.plexLoginEnabled ? 1 : 0.5,
}}
/>
</div>
</div>

@ -12,6 +12,12 @@ const messages = defineMessages({
tip: 'Tip',
scanbackground:
'Scanning will run in the background. You can continue the setup process in the meantime.',
configuremediaservers: 'Configure Media Servers',
configuremediaserversdescription:
'Select the media servers you would like to configure below.',
configured: 'Configured',
configureplex: 'Configure Plex',
continuewithoutmediaserver: 'Continue without a Media Server',
});
type ConfigureMediaServersProps = {
@ -60,9 +66,11 @@ const ConfigureMediaServers = ({ onComplete }: ConfigureMediaServersProps) => {
)}
{!configureStatus?.configuring && (
<>
<h3 className="heading">Configure Media Servers</h3>
<h3 className="heading">
{intl.formatMessage(messages.configuremediaservers)}
</h3>
<p className="description">
Select the media servers you would like to configure below.
{intl.formatMessage(messages.configuremediaserversdescription)}
</p>
<div className="mt-8 flex justify-center">
<div className="w-52 divide-y divide-gray-700 rounded border border-gray-700 bg-gray-800 bg-opacity-20">
@ -73,14 +81,14 @@ const ConfigureMediaServers = ({ onComplete }: ConfigureMediaServersProps) => {
{plexConfigured ? (
<>
<CheckCircleIcon className="w-6 text-green-500" />
<span>Configured</span>
<span>{intl.formatMessage(messages.configured)}</span>
</>
) : (
<Button
className="w-full"
onClick={() => setConfigureStatus({ configuring: 'plex' })}
>
Configure Plex
{intl.formatMessage(messages.configureplex)}
</Button>
)}
</div>
@ -90,8 +98,8 @@ const ConfigureMediaServers = ({ onComplete }: ConfigureMediaServersProps) => {
<div className="flex justify-end">
<Button buttonType="primary" onClick={() => onComplete()}>
{plexConfigured
? 'Continue'
: 'Continue without a Media Server'}
? intl.formatMessage(messages.continue)
: intl.formatMessage(messages.continuewithoutmediaserver)}
</Button>
</div>
</div>

@ -16,6 +16,12 @@ const messages = defineMessages({
validationEmail: 'You must provide a valid email address',
validationpasswordminchars:
'Password is too short; should be a minimum of 8 characters',
createlocalaccount: 'Create Local Account',
createaccount: 'Create Account',
creatingaccount: 'Creating Account...',
goback: 'Go Back',
email: 'Email',
password: 'Password',
});
type StepOneProps = {
@ -63,7 +69,7 @@ const StepOne = ({ onComplete }: StepOneProps) => {
revalidate();
onComplete();
} catch (e) {
console.log(e.message);
console.error(e.message);
}
}}
validationSchema={CreateUserSchema}
@ -72,7 +78,7 @@ const StepOne = ({ onComplete }: StepOneProps) => {
<Form>
<div>
<label htmlFor="email" className="text-label">
Email
{intl.formatMessage(messages.email)}
</label>
<div className="mt-1 mb-2 sm:col-span-2 sm:mt-0">
<div className="form-input-field">
@ -91,7 +97,7 @@ const StepOne = ({ onComplete }: StepOneProps) => {
)}
</div>
<label htmlFor="password" className="text-label">
Password
{intl.formatMessage(messages.password)}
</label>
<div className="mt-1 mb-2 sm:col-span-2 sm:mt-0">
<div className="form-input-field">
@ -122,13 +128,13 @@ const StepOne = ({ onComplete }: StepOneProps) => {
<UserIcon />
<span>
{isSubmitting
? 'Creating Account...'
: 'Create Account'}
? intl.formatMessage(messages.creatingaccount)
: intl.formatMessage(messages.createaccount)}
</span>
</Button>
<Button onClick={() => setShowLocalCreateForm(false)}>
<ArrowLeftIcon />
<span>Go Back</span>
<span>{intl.formatMessage(messages.goback)}</span>
</Button>
</div>
</div>
@ -143,7 +149,7 @@ const StepOne = ({ onComplete }: StepOneProps) => {
onClick={() => setShowLocalCreateForm(true)}
>
<UserIcon />
<span>Create Local Account</span>
<span>{intl.formatMessage(messages.createlocalaccount)}</span>
</Button>
</div>
)}

@ -821,7 +821,7 @@
"components.Settings.SettingsUsers.defaultPermissions": "Default Permissions",
"components.Settings.SettingsUsers.defaultPermissionsTip": "Initial permissions assigned to new users",
"components.Settings.SettingsUsers.localLogin": "Enable Local Sign-In",
"components.Settings.SettingsUsers.localLoginTip": "Allow users to sign in using their email address and password, instead of Plex OAuth",
"components.Settings.SettingsUsers.localLoginTip": "Allow users to sign in using their email address and password, instead of Plex OAuth. If Plex is not setup, this will be enabled by default.",
"components.Settings.SettingsUsers.movieRequestLimitLabel": "Global Movie Request Limit",
"components.Settings.SettingsUsers.newPlexLogin": "Enable New Plex Sign-In",
"components.Settings.SettingsUsers.newPlexLoginTip": "Allow Plex users to sign in without first being imported",
@ -971,11 +971,22 @@
"components.Settings.webAppUrlTip": "Optionally direct users to the web app on your server instead of the \"hosted\" web app",
"components.Settings.webhook": "Webhook",
"components.Settings.webpush": "Web Push",
"components.Setup.ConfigureMediaServers.configured": "Configured",
"components.Setup.ConfigureMediaServers.configuremediaservers": "Configure Media Servers",
"components.Setup.ConfigureMediaServers.configuremediaserversdescription": "Select the media servers you would like to configure below.",
"components.Setup.ConfigureMediaServers.configureplex": "Configure Plex",
"components.Setup.ConfigureMediaServers.continue": "Continue",
"components.Setup.ConfigureMediaServers.continuewithoutmediaserver": "Continue without a Media Server",
"components.Setup.ConfigureMediaServers.goback": "Go Back",
"components.Setup.ConfigureMediaServers.scanbackground": "Scanning will run in the background. You can continue the setup process in the meantime.",
"components.Setup.ConfigureMediaServers.tip": "Tip",
"components.Setup.CreateAccount.createaccount": "Create Account",
"components.Setup.CreateAccount.createlocalaccount": "Create Local Account",
"components.Setup.CreateAccount.creatingaccount": "Creating Account...",
"components.Setup.CreateAccount.email": "Email",
"components.Setup.CreateAccount.getstarted": "Let's get started! To begin, we will need to create your administrator account. You can either do this by logging in with your Plex account, or creating a local user.",
"components.Setup.CreateAccount.goback": "Go Back",
"components.Setup.CreateAccount.password": "Password",
"components.Setup.CreateAccount.validationEmail": "You must provide a valid email address",
"components.Setup.CreateAccount.validationpasswordminchars": "Password is too short; should be a minimum of 8 characters",
"components.Setup.CreateAccount.welcometooverseerr": "Welcome to Overseerr!",
@ -1084,9 +1095,25 @@
"components.UserProfile.ProfileHeader.profile": "View Profile",
"components.UserProfile.ProfileHeader.settings": "Edit Settings",
"components.UserProfile.ProfileHeader.userid": "User ID: {userid}",
"components.UserProfile.UserSettings.UserEmailChange.confirmemail": "Confirm Email",
"components.UserProfile.UserSettings.UserEmailChange.currentpassword": "Current Password",
"components.UserProfile.UserSettings.UserEmailChange.email": "Email",
"components.UserProfile.UserSettings.UserEmailChange.newemail": "New Email",
"components.UserProfile.UserSettings.UserEmailChange.noPasswordSet": "This user account currently does not have a password set. Configure a password for this account first before trying to change the email address.",
"components.UserProfile.UserSettings.UserEmailChange.noPasswordSetOwnAccount": "Your account currently does not have a password set. Configure a password first before trying to change the email.",
"components.UserProfile.UserSettings.UserEmailChange.nopermissionDescription": "You do not have permission to modify this user's email.",
"components.UserProfile.UserSettings.UserEmailChange.toastSettingsFailure": "Something went wrong while changing the email.",
"components.UserProfile.UserSettings.UserEmailChange.toastSettingsFailureVerifyCurrent": "Something went wrong while changing the email. Was your current password entered correctly?",
"components.UserProfile.UserSettings.UserEmailChange.toastSettingsSuccess": "Email changed successfully!",
"components.UserProfile.UserSettings.UserEmailChange.validationConfirmEmail": "You must confirm the new email",
"components.UserProfile.UserSettings.UserEmailChange.validationConfirmEmailSame": "Emails must match",
"components.UserProfile.UserSettings.UserEmailChange.validationCurrentPassword": "You must provide your current password",
"components.UserProfile.UserSettings.UserEmailChange.validationEmail": "You must provide a valid email address",
"components.UserProfile.UserSettings.UserGeneralSettings.admin": "Admin",
"components.UserProfile.UserSettings.UserGeneralSettings.applanguage": "Display Language",
"components.UserProfile.UserSettings.UserGeneralSettings.connectedaccounts": "Connected Accounts",
"components.UserProfile.UserSettings.UserGeneralSettings.connectplexaccount": "Connect Plex Account",
"components.UserProfile.UserSettings.UserGeneralSettings.disconnectPlex": "Disconnect Plex",
"components.UserProfile.UserSettings.UserGeneralSettings.discordId": "Discord User ID",
"components.UserProfile.UserSettings.UserGeneralSettings.discordIdTip": "The <FindDiscordIdLink>multi-digit ID number</FindDiscordIdLink> associated with your Discord user account",
"components.UserProfile.UserSettings.UserGeneralSettings.displayName": "Display Name",
@ -1096,14 +1123,21 @@
"components.UserProfile.UserSettings.UserGeneralSettings.languageDefault": "Default ({language})",
"components.UserProfile.UserSettings.UserGeneralSettings.localuser": "Local User",
"components.UserProfile.UserSettings.UserGeneralSettings.movierequestlimit": "Movie Request Limit",
"components.UserProfile.UserSettings.UserGeneralSettings.mustsetpasswordplex": "You must set a password before disconnecting Plex.",
"components.UserProfile.UserSettings.UserGeneralSettings.noconnectedavailable": "No connected services available.",
"components.UserProfile.UserSettings.UserGeneralSettings.onlyloggedinuseredit": "Only the logged in user can edit their own connected accounts.",
"components.UserProfile.UserSettings.UserGeneralSettings.originallanguage": "Discover Language",
"components.UserProfile.UserSettings.UserGeneralSettings.originallanguageTip": "Filter content by original language",
"components.UserProfile.UserSettings.UserGeneralSettings.owner": "Owner",
"components.UserProfile.UserSettings.UserGeneralSettings.plexdisconnectedfailure": "Failed to disconnect Plex account.",
"components.UserProfile.UserSettings.UserGeneralSettings.plexdisconnectedsuccess": "Plex account disconnected.",
"components.UserProfile.UserSettings.UserGeneralSettings.plexuser": "Plex User",
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncmovies": "Auto-Request Movies",
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncmoviestip": "Automatically request movies on your <PlexWatchlistSupportLink>Plex Watchlist</PlexWatchlistSupportLink>",
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncseries": "Auto-Request Series",
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncseriestip": "Automatically request series on your <PlexWatchlistSupportLink>Plex Watchlist</PlexWatchlistSupportLink>",
"components.UserProfile.UserSettings.UserGeneralSettings.refreshedtoken": "Refreshed Plex Token.",
"components.UserProfile.UserSettings.UserGeneralSettings.refreshtoken": "Refresh Token",
"components.UserProfile.UserSettings.UserGeneralSettings.region": "Discover Region",
"components.UserProfile.UserSettings.UserGeneralSettings.regionTip": "Filter content by regional availability",
"components.UserProfile.UserSettings.UserGeneralSettings.role": "Role",
@ -1187,6 +1221,7 @@
"components.UserProfile.UserSettings.UserPermissions.toastSettingsFailure": "Something went wrong while saving settings.",
"components.UserProfile.UserSettings.UserPermissions.toastSettingsSuccess": "Permissions saved successfully!",
"components.UserProfile.UserSettings.UserPermissions.unauthorizedDescription": "You cannot modify your own permissions.",
"components.UserProfile.UserSettings.menuChangeEmail": "Email",
"components.UserProfile.UserSettings.menuChangePass": "Password",
"components.UserProfile.UserSettings.menuGeneralSettings": "General",
"components.UserProfile.UserSettings.menuNotifications": "Notifications",

Loading…
Cancel
Save