feat: storage template file move hardening (#5917)

* fix: pgvecto.rs extension breaks typeorm schema:drop command

* fix: parse postgres bigints to javascript number types when selecting data

* feat: verify file size is the same as original asset after copying file for storage template job

* feat: allow disabling of storage template job, defaults to disabled for new instances

* fix: don't allow setting concurrency for storage template migration, can cause race conditions above 1

* feat: add checksum verification when file is copied for storage template job

* fix: extract metadata for assets that aren't visible on timeline
This commit is contained in:
Zack Pollard
2023-12-29 18:41:33 +00:00
committed by GitHub
parent 5f6bd4ae7e
commit 2e38fa73bf
36 changed files with 686 additions and 225 deletions
@@ -7,6 +7,7 @@ import {
faceStub,
newAccessRepositoryMock,
newAssetRepositoryMock,
newCryptoRepositoryMock,
newJobRepositoryMock,
newMachineLearningRepositoryMock,
newMediaRepositoryMock,
@@ -22,6 +23,7 @@ import { CacheControl, ImmichFileResponse } from '../domain.util';
import { JobName } from '../job';
import {
IAssetRepository,
ICryptoRepository,
IJobRepository,
IMachineLearningRepository,
IMediaRepository,
@@ -73,6 +75,7 @@ describe(PersonService.name, () => {
let personMock: jest.Mocked<IPersonRepository>;
let storageMock: jest.Mocked<IStorageRepository>;
let smartInfoMock: jest.Mocked<ISmartInfoRepository>;
let cryptoMock: jest.Mocked<ICryptoRepository>;
let sut: PersonService;
beforeEach(async () => {
@@ -86,6 +89,7 @@ describe(PersonService.name, () => {
personMock = newPersonRepositoryMock();
storageMock = newStorageRepositoryMock();
smartInfoMock = newSmartInfoRepositoryMock();
cryptoMock = newCryptoRepositoryMock();
sut = new PersonService(
accessMock,
assetMock,
@@ -97,6 +101,7 @@ describe(PersonService.name, () => {
storageMock,
jobMock,
smartInfoMock,
cryptoMock,
);
mediaMock.crop.mockResolvedValue(croppedFace);
+10 -1
View File
@@ -13,6 +13,7 @@ import {
CropOptions,
IAccessRepository,
IAssetRepository,
ICryptoRepository,
IJobRepository,
IMachineLearningRepository,
IMediaRepository,
@@ -59,10 +60,18 @@ export class PersonService {
@Inject(IStorageRepository) private storageRepository: IStorageRepository,
@Inject(IJobRepository) private jobRepository: IJobRepository,
@Inject(ISmartInfoRepository) private smartInfoRepository: ISmartInfoRepository,
@Inject(ICryptoRepository) private cryptoRepository: ICryptoRepository,
) {
this.access = AccessCore.create(accessRepository);
this.configCore = SystemConfigCore.create(configRepository);
this.storageCore = StorageCore.create(assetRepository, moveRepository, repository, storageRepository);
this.storageCore = StorageCore.create(
assetRepository,
moveRepository,
repository,
cryptoRepository,
configRepository,
storageRepository,
);
}
async getAll(auth: AuthDto, dto: PersonSearchDto): Promise<PeopleResponseDto> {