diff --git a/server/apps/immich/src/config/asset-upload.config.spec.ts b/server/apps/immich/src/config/asset-upload.config.spec.ts index 715a3a7aca..a2e6b261a4 100644 --- a/server/apps/immich/src/config/asset-upload.config.spec.ts +++ b/server/apps/immich/src/config/asset-upload.config.spec.ts @@ -1,5 +1,6 @@ import { Request } from 'express'; import * as fs from 'fs'; +import { AuthRequest } from '../decorators/auth-user.decorator'; import { multerUtils } from './asset-upload.config'; const { fileFilter, destination, filename } = multerUtils; @@ -14,7 +15,7 @@ const mock = { deviceId: 'test-device', fileExtension: '.jpg', }, - } as Request, + } as AuthRequest, file: { originalname: 'test.jpg' } as Express.Multer.File, }; diff --git a/server/apps/immich/src/config/asset-upload.config.ts b/server/apps/immich/src/config/asset-upload.config.ts index 6568a2dce1..cdf4bd60bf 100644 --- a/server/apps/immich/src/config/asset-upload.config.ts +++ b/server/apps/immich/src/config/asset-upload.config.ts @@ -2,12 +2,11 @@ import { StorageCore, StorageFolder } from '@app/domain/storage'; import { BadRequestException, Logger, UnauthorizedException } from '@nestjs/common'; import { MulterOptions } from '@nestjs/platform-express/multer/interfaces/multer-options.interface'; import { createHash, randomUUID } from 'crypto'; -import { Request } from 'express'; import { existsSync, mkdirSync } from 'fs'; import { diskStorage, StorageEngine } from 'multer'; import { extname } from 'path'; import sanitize from 'sanitize-filename'; -import { AuthUserDto } from '../decorators/auth-user.decorator'; +import { AuthRequest, AuthUserDto } from '../decorators/auth-user.decorator'; import { patchFormData } from '../utils/path-form-data.util'; export interface ImmichFile extends Express.Multer.File { @@ -50,7 +49,7 @@ export const multerUtils = { fileFilter, filename, destination }; const logger = new Logger('AssetUploadConfig'); -function fileFilter(req: Request, file: any, cb: any) { +function fileFilter(req: AuthRequest, file: any, cb: any) { if (!req.user || (req.user.isPublicUser && !req.user.isAllowUpload)) { return cb(new UnauthorizedException()); } @@ -66,7 +65,7 @@ function fileFilter(req: Request, file: any, cb: any) { } } -function destination(req: Request, file: Express.Multer.File, cb: any) { +function destination(req: AuthRequest, file: Express.Multer.File, cb: any) { if (!req.user || (req.user.isPublicUser && !req.user.isAllowUpload)) { return cb(new UnauthorizedException()); } @@ -82,7 +81,7 @@ function destination(req: Request, file: Express.Multer.File, cb: any) { cb(null, uploadFolder); } -function filename(req: Request, file: Express.Multer.File, cb: any) { +function filename(req: AuthRequest, file: Express.Multer.File, cb: any) { if (!req.user || (req.user.isPublicUser && !req.user.isAllowUpload)) { return cb(new UnauthorizedException()); } diff --git a/server/apps/immich/src/config/profile-image-upload.config.spec.ts b/server/apps/immich/src/config/profile-image-upload.config.spec.ts index e2006a1510..4d2a70653c 100644 --- a/server/apps/immich/src/config/profile-image-upload.config.spec.ts +++ b/server/apps/immich/src/config/profile-image-upload.config.spec.ts @@ -1,5 +1,6 @@ import { Request } from 'express'; import * as fs from 'fs'; +import { AuthRequest } from '../decorators/auth-user.decorator'; import { multerUtils } from './profile-image-upload.config'; const { fileFilter, destination, filename } = multerUtils; @@ -10,7 +11,7 @@ const mock = { user: { id: 'test-user', }, - } as Request, + } as AuthRequest, file: { originalname: 'test.jpg' } as Express.Multer.File, }; diff --git a/server/apps/immich/src/config/profile-image-upload.config.ts b/server/apps/immich/src/config/profile-image-upload.config.ts index 8ce14c4ed6..7ca7442254 100644 --- a/server/apps/immich/src/config/profile-image-upload.config.ts +++ b/server/apps/immich/src/config/profile-image-upload.config.ts @@ -1,12 +1,11 @@ import { StorageCore, StorageFolder } from '@app/domain/storage'; import { BadRequestException, UnauthorizedException } from '@nestjs/common'; import { MulterOptions } from '@nestjs/platform-express/multer/interfaces/multer-options.interface'; -import { Request } from 'express'; import { existsSync, mkdirSync } from 'fs'; import { diskStorage } from 'multer'; import { extname } from 'path'; import sanitize from 'sanitize-filename'; -import { AuthUserDto } from '../decorators/auth-user.decorator'; +import { AuthRequest, AuthUserDto } from '../decorators/auth-user.decorator'; import { patchFormData } from '../utils/path-form-data.util'; export const profileImageUploadOption: MulterOptions = { @@ -21,7 +20,7 @@ export const multerUtils = { fileFilter, filename, destination }; const storageCore = new StorageCore(); -function fileFilter(req: Request, file: any, cb: any) { +function fileFilter(req: AuthRequest, file: any, cb: any) { if (!req.user) { return cb(new UnauthorizedException()); } @@ -33,7 +32,7 @@ function fileFilter(req: Request, file: any, cb: any) { } } -function destination(req: Request, file: Express.Multer.File, cb: any) { +function destination(req: AuthRequest, file: Express.Multer.File, cb: any) { if (!req.user) { return cb(new UnauthorizedException()); } @@ -48,7 +47,7 @@ function destination(req: Request, file: Express.Multer.File, cb: any) { cb(null, profileImageLocation); } -function filename(req: Request, file: Express.Multer.File, cb: any) { +function filename(req: AuthRequest, file: Express.Multer.File, cb: any) { if (!req.user) { return cb(new UnauthorizedException()); } diff --git a/server/apps/immich/src/decorators/auth-user.decorator.ts b/server/apps/immich/src/decorators/auth-user.decorator.ts index fd4aefa4c9..610a8536e2 100644 --- a/server/apps/immich/src/decorators/auth-user.decorator.ts +++ b/server/apps/immich/src/decorators/auth-user.decorator.ts @@ -1,8 +1,13 @@ export { AuthUserDto } from '@app/domain'; import { AuthUserDto, LoginDetails } from '@app/domain'; import { createParamDecorator, ExecutionContext } from '@nestjs/common'; +import { Request } from 'express'; import { UAParser } from 'ua-parser-js'; +export interface AuthRequest extends Request { + user?: AuthUserDto; +} + export const GetAuthUser = createParamDecorator((data, ctx: ExecutionContext): AuthUserDto => { return ctx.switchToHttp().getRequest<{ user: AuthUserDto }>().user; }); diff --git a/server/apps/immich/src/global.d.ts b/server/apps/immich/src/global.d.ts deleted file mode 100644 index ff1f5fa03c..0000000000 --- a/server/apps/immich/src/global.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { AuthUserDto } from './decorators/auth-user.decorator'; - -declare global { - namespace Express { - // eslint-disable-next-line @typescript-eslint/no-empty-interface - interface User extends AuthUserDto {} - export interface Request { - user: AuthUserDto; - } - } -} diff --git a/server/apps/immich/src/middlewares/auth.guard.ts b/server/apps/immich/src/middlewares/auth.guard.ts index 37b0f6ba96..7d3204ed4e 100644 --- a/server/apps/immich/src/middlewares/auth.guard.ts +++ b/server/apps/immich/src/middlewares/auth.guard.ts @@ -1,7 +1,7 @@ import { AuthService } from '@app/domain'; import { CanActivate, ExecutionContext, Injectable, Logger } from '@nestjs/common'; import { Reflector } from '@nestjs/core'; -import { Request } from 'express'; +import { AuthRequest } from '../decorators/auth-user.decorator'; import { Metadata } from '../decorators/authenticated.decorator'; @Injectable() @@ -21,7 +21,7 @@ export class AuthGuard implements CanActivate { return true; } - const req = context.switchToHttp().getRequest(); + const req = context.switchToHttp().getRequest(); const authDto = await this.authService.validate(req.headers, req.query as Record); if (!authDto) {