11import PlexTvAPI from '@server/api/plextv' ;
2- import { UserType } from '@server/constants/user' ;
32import { getRepository } from '@server/datasource' ;
43import { User } from '@server/entity/User' ;
54import { Permission } from '@server/lib/permissions' ;
65import { getSettings } from '@server/lib/settings' ;
76import logger from '@server/logger' ;
87import { isAuthenticated } from '@server/middleware/auth' ;
98import { Router } from 'express' ;
9+ import gravatarUrl from 'gravatar-url' ;
1010
1111const authRoutes = Router ( ) ;
1212
@@ -41,14 +41,21 @@ authRoutes.post('/plex', async (req, res, next) => {
4141 const plextv = new PlexTvAPI ( body . authToken ) ;
4242 const account = await plextv . getUser ( ) ;
4343
44- // Next let's see if the user already exists
45- let user = await userRepository
46- . createQueryBuilder ( 'user' )
47- . where ( 'user.plexId = :id' , { id : account . id } )
48- . orWhere ( 'user.email = :email' , {
49- email : account . email . toLowerCase ( ) ,
50- } )
51- . getOne ( ) ;
44+ let user : User | null ;
45+
46+ // If we are already logged in, we should just get the currently logged in user
47+ // otherwise we will try to match to an existing users email or plex ID
48+ if ( req . user ) {
49+ user = await userRepository . findOneBy ( { id : req . user . id } ) ;
50+ } else {
51+ user = await userRepository
52+ . createQueryBuilder ( 'user' )
53+ . where ( 'user.plexId = :id' , { id : account . id } )
54+ . orWhere ( 'user.email = :email' , {
55+ email : account . email . toLowerCase ( ) ,
56+ } )
57+ . getOne ( ) ;
58+ }
5259
5360 if ( ! user && ! ( await userRepository . count ( ) ) ) {
5461 user = new User ( {
@@ -58,7 +65,6 @@ authRoutes.post('/plex', async (req, res, next) => {
5865 plexToken : account . authToken ,
5966 permissions : Permission . ADMIN ,
6067 avatar : account . thumb ,
61- userType : UserType . PLEX ,
6268 } ) ;
6369
6470 await userRepository . save ( user ) ;
@@ -71,12 +77,13 @@ authRoutes.post('/plex', async (req, res, next) => {
7177
7278 if (
7379 account . id === mainUser . plexId ||
80+ ( user && user . id === 1 && ! user . plexId ) ||
7481 ( await mainPlexTv . checkUserAccess ( account . id ) )
7582 ) {
7683 if ( user ) {
7784 if ( ! user . plexId ) {
7885 logger . info (
79- 'Found matching Plex user; updating user with Plex data' ,
86+ 'Found matching Plex user; updating user with Plex data. Notice: Emails are no longer synced. ' ,
8087 {
8188 label : 'API' ,
8289 ip : req . ip ,
@@ -91,9 +98,7 @@ authRoutes.post('/plex', async (req, res, next) => {
9198 user . plexToken = body . authToken ;
9299 user . plexId = account . id ;
93100 user . avatar = account . thumb ;
94- user . email = account . email ;
95101 user . plexUsername = account . username ;
96- user . userType = UserType . PLEX ;
97102
98103 await userRepository . save ( user ) ;
99104 } else if ( ! settings . main . newPlexLogin ) {
@@ -129,7 +134,6 @@ authRoutes.post('/plex', async (req, res, next) => {
129134 plexToken : account . authToken ,
130135 permissions : settings . main . defaultPermissions ,
131136 avatar : account . thumb ,
132- userType : UserType . PLEX ,
133137 } ) ;
134138
135139 await userRepository . save ( user ) ;
@@ -184,13 +188,22 @@ authRoutes.post('/local', async (req, res, next) => {
184188 } ) ;
185189 }
186190 try {
187- const user = await userRepository
191+ let user = await userRepository
188192 . createQueryBuilder ( 'user' )
189193 . select ( [ 'user.id' , 'user.email' , 'user.password' , 'user.plexId' ] )
190194 . where ( 'user.email = :email' , { email : body . email . toLowerCase ( ) } )
191195 . getOne ( ) ;
192196
193- if ( ! user || ! ( await user . passwordMatch ( body . password ) ) ) {
197+ if ( ! user && ! ( await userRepository . count ( ) ) ) {
198+ const avatar = gravatarUrl ( body . email , { default : 'mm' , size : 200 } ) ;
199+ user = new User ( {
200+ email : body . email ,
201+ permissions : Permission . ADMIN ,
202+ avatar,
203+ } ) ;
204+ await user . setPassword ( body . password ) ;
205+ await userRepository . save ( user ) ;
206+ } else if ( ! user || ! ( await user . passwordMatch ( body . password ) ) ) {
194207 logger . warn ( 'Failed sign-in attempt using invalid Overseerr password' , {
195208 label : 'API' ,
196209 ip : req . ip ,
@@ -203,19 +216,19 @@ authRoutes.post('/local', async (req, res, next) => {
203216 } ) ;
204217 }
205218
206- const mainUser = await userRepository . findOneOrFail ( {
219+ const mainUser = await userRepository . findOne ( {
207220 select : { id : true , plexToken : true , plexId : true } ,
208221 where : { id : 1 } ,
209222 } ) ;
210- const mainPlexTv = new PlexTvAPI ( mainUser . plexToken ?? '' ) ;
223+ const mainPlexTv = new PlexTvAPI ( mainUser ? .plexToken ?? '' ) ;
211224
212- if ( ! user . plexId ) {
225+ if ( ! user . plexId && mainUser ?. isPlexUser ) {
213226 try {
214227 const plexUsersResponse = await mainPlexTv . getUsers ( ) ;
215228 const account = plexUsersResponse . MediaContainer . User . find (
216229 ( account ) =>
217230 account . $ . email &&
218- account . $ . email . toLowerCase ( ) === user . email . toLowerCase ( )
231+ account . $ . email . toLowerCase ( ) === user ? .email . toLowerCase ( )
219232 ) ?. $ ;
220233
221234 if (
@@ -238,7 +251,6 @@ authRoutes.post('/local', async (req, res, next) => {
238251 user . avatar = account . thumb ;
239252 user . email = account . email ;
240253 user . plexUsername = account . username ;
241- user . userType = UserType . PLEX ;
242254
243255 await userRepository . save ( user ) ;
244256 }
@@ -251,6 +263,7 @@ authRoutes.post('/local', async (req, res, next) => {
251263 }
252264
253265 if (
266+ mainUser ?. isPlexUser &&
254267 user . plexId &&
255268 user . plexId !== mainUser . plexId &&
256269 ! ( await mainPlexTv . checkUserAccess ( user . plexId ) )
0 commit comments