parent
c27e3bd72c
commit
becfdc2b7f
7 changed files with 3 additions and 126 deletions
|
@ -3,7 +3,6 @@ import { DI } from '@/di-symbols.js';
|
||||||
import type { DriveFilesRepository } from '@/models/index.js';
|
import type { DriveFilesRepository } from '@/models/index.js';
|
||||||
import type { RemoteUser } from '@/models/entities/User.js';
|
import type { RemoteUser } from '@/models/entities/User.js';
|
||||||
import type { DriveFile } from '@/models/entities/DriveFile.js';
|
import type { DriveFile } from '@/models/entities/DriveFile.js';
|
||||||
import { MetaService } from '@/core/MetaService.js';
|
|
||||||
import { truncate } from '@/misc/truncate.js';
|
import { truncate } from '@/misc/truncate.js';
|
||||||
import { DB_MAX_IMAGE_COMMENT_LENGTH } from '@/const.js';
|
import { DB_MAX_IMAGE_COMMENT_LENGTH } from '@/const.js';
|
||||||
import { DriveService } from '@/core/DriveService.js';
|
import { DriveService } from '@/core/DriveService.js';
|
||||||
|
@ -22,7 +21,6 @@ export class ApImageService {
|
||||||
@Inject(DI.driveFilesRepository)
|
@Inject(DI.driveFilesRepository)
|
||||||
private driveFilesRepository: DriveFilesRepository,
|
private driveFilesRepository: DriveFilesRepository,
|
||||||
|
|
||||||
private metaService: MetaService,
|
|
||||||
private apResolverService: ApResolverService,
|
private apResolverService: ApResolverService,
|
||||||
private driveService: DriveService,
|
private driveService: DriveService,
|
||||||
private apLoggerService: ApLoggerService,
|
private apLoggerService: ApLoggerService,
|
||||||
|
@ -56,19 +54,12 @@ export class ApImageService {
|
||||||
|
|
||||||
this.logger.info(`Creating the Image: ${image.url}`);
|
this.logger.info(`Creating the Image: ${image.url}`);
|
||||||
|
|
||||||
const instance = await this.metaService.fetch();
|
|
||||||
|
|
||||||
// Cache if remote file cache is on AND either
|
|
||||||
// 1. remote sensitive file is also on
|
|
||||||
// 2. or the image is not sensitive
|
|
||||||
const shouldBeCached = instance.cacheRemoteFiles && (instance.cacheRemoteSensitiveFiles || !image.sensitive);
|
|
||||||
|
|
||||||
const file = await this.driveService.uploadFromUrl({
|
const file = await this.driveService.uploadFromUrl({
|
||||||
url: image.url,
|
url: image.url,
|
||||||
user: actor,
|
user: actor,
|
||||||
uri: image.url,
|
uri: image.url,
|
||||||
sensitive: image.sensitive,
|
sensitive: image.sensitive,
|
||||||
isLink: !shouldBeCached,
|
isLink: true,
|
||||||
comment: truncate(image.name ?? undefined, DB_MAX_IMAGE_COMMENT_LENGTH),
|
comment: truncate(image.name ?? undefined, DB_MAX_IMAGE_COMMENT_LENGTH),
|
||||||
});
|
});
|
||||||
if (!file.isLink || file.url === image.url) return file;
|
if (!file.isLink || file.url === image.url) return file;
|
||||||
|
|
|
@ -120,16 +120,6 @@ export class Meta {
|
||||||
})
|
})
|
||||||
public infoImageUrl: string | null;
|
public infoImageUrl: string | null;
|
||||||
|
|
||||||
@Column('boolean', {
|
|
||||||
default: true,
|
|
||||||
})
|
|
||||||
public cacheRemoteFiles: boolean;
|
|
||||||
|
|
||||||
@Column('boolean', {
|
|
||||||
default: true,
|
|
||||||
})
|
|
||||||
public cacheRemoteSensitiveFiles: boolean;
|
|
||||||
|
|
||||||
@Column({
|
@Column({
|
||||||
...id(),
|
...id(),
|
||||||
nullable: true,
|
nullable: true,
|
||||||
|
|
|
@ -15,14 +15,6 @@ export const meta = {
|
||||||
type: 'object',
|
type: 'object',
|
||||||
optional: false, nullable: false,
|
optional: false, nullable: false,
|
||||||
properties: {
|
properties: {
|
||||||
cacheRemoteFiles: {
|
|
||||||
type: 'boolean',
|
|
||||||
optional: false, nullable: false,
|
|
||||||
},
|
|
||||||
cacheRemoteSensitiveFiles: {
|
|
||||||
type: 'boolean',
|
|
||||||
optional: false, nullable: false,
|
|
||||||
},
|
|
||||||
emailRequiredForSignup: {
|
emailRequiredForSignup: {
|
||||||
type: 'boolean',
|
type: 'boolean',
|
||||||
optional: false, nullable: false,
|
optional: false, nullable: false,
|
||||||
|
@ -286,8 +278,6 @@ export default class extends Endpoint<typeof meta, typeof paramDef> {
|
||||||
enableEmail: instance.enableEmail,
|
enableEmail: instance.enableEmail,
|
||||||
enableServiceWorker: instance.enableServiceWorker,
|
enableServiceWorker: instance.enableServiceWorker,
|
||||||
translatorAvailable: instance.deeplAuthKey != null,
|
translatorAvailable: instance.deeplAuthKey != null,
|
||||||
cacheRemoteFiles: instance.cacheRemoteFiles,
|
|
||||||
cacheRemoteSensitiveFiles: instance.cacheRemoteSensitiveFiles,
|
|
||||||
pinnedUsers: instance.pinnedUsers,
|
pinnedUsers: instance.pinnedUsers,
|
||||||
hiddenTags: instance.hiddenTags,
|
hiddenTags: instance.hiddenTags,
|
||||||
blockedHosts: instance.blockedHosts,
|
blockedHosts: instance.blockedHosts,
|
||||||
|
|
|
@ -42,8 +42,6 @@ export const paramDef = {
|
||||||
description: { type: 'string', nullable: true },
|
description: { type: 'string', nullable: true },
|
||||||
defaultLightTheme: { type: 'string', nullable: true },
|
defaultLightTheme: { type: 'string', nullable: true },
|
||||||
defaultDarkTheme: { type: 'string', nullable: true },
|
defaultDarkTheme: { type: 'string', nullable: true },
|
||||||
cacheRemoteFiles: { type: 'boolean' },
|
|
||||||
cacheRemoteSensitiveFiles: { type: 'boolean' },
|
|
||||||
emailRequiredForSignup: { type: 'boolean' },
|
emailRequiredForSignup: { type: 'boolean' },
|
||||||
enableHcaptcha: { type: 'boolean' },
|
enableHcaptcha: { type: 'boolean' },
|
||||||
hcaptchaSiteKey: { type: 'string', nullable: true },
|
hcaptchaSiteKey: { type: 'string', nullable: true },
|
||||||
|
@ -177,14 +175,6 @@ export default class extends Endpoint<typeof meta, typeof paramDef> {
|
||||||
set.defaultDarkTheme = ps.defaultDarkTheme;
|
set.defaultDarkTheme = ps.defaultDarkTheme;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ps.cacheRemoteFiles !== undefined) {
|
|
||||||
set.cacheRemoteFiles = ps.cacheRemoteFiles;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ps.cacheRemoteSensitiveFiles !== undefined) {
|
|
||||||
set.cacheRemoteSensitiveFiles = ps.cacheRemoteSensitiveFiles;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ps.emailRequiredForSignup !== undefined) {
|
if (ps.emailRequiredForSignup !== undefined) {
|
||||||
set.emailRequiredForSignup = ps.emailRequiredForSignup;
|
set.emailRequiredForSignup = ps.emailRequiredForSignup;
|
||||||
}
|
}
|
||||||
|
|
|
@ -332,8 +332,8 @@ export default class extends Endpoint<typeof meta, typeof paramDef> {
|
||||||
mediaProxy: this.config.mediaProxy,
|
mediaProxy: this.config.mediaProxy,
|
||||||
|
|
||||||
...(ps.detail ? {
|
...(ps.detail ? {
|
||||||
cacheRemoteFiles: instance.cacheRemoteFiles,
|
cacheRemoteFiles: false,
|
||||||
cacheRemoteSensitiveFiles: instance.cacheRemoteSensitiveFiles,
|
cacheRemoteSensitiveFiles: false,
|
||||||
requireSetup: (await this.usersRepository.countBy({
|
requireSetup: (await this.usersRepository.countBy({
|
||||||
host: IsNull(),
|
host: IsNull(),
|
||||||
})) === 0,
|
})) === 0,
|
||||||
|
|
|
@ -85,8 +85,6 @@ describe('ActivityPub', () => {
|
||||||
let resolver: MockResolver;
|
let resolver: MockResolver;
|
||||||
|
|
||||||
const metaInitial = {
|
const metaInitial = {
|
||||||
cacheRemoteFiles: true,
|
|
||||||
cacheRemoteSensitiveFiles: true,
|
|
||||||
blockedHosts: [] as string[],
|
blockedHosts: [] as string[],
|
||||||
sensitiveWords: [] as string[],
|
sensitiveWords: [] as string[],
|
||||||
} as Meta;
|
} as Meta;
|
||||||
|
@ -258,35 +256,6 @@ describe('ActivityPub', () => {
|
||||||
|
|
||||||
describe('Images', () => {
|
describe('Images', () => {
|
||||||
test('Create images', async () => {
|
test('Create images', async () => {
|
||||||
const imageObject: IApDocument = {
|
|
||||||
type: 'Document',
|
|
||||||
mediaType: 'image/png',
|
|
||||||
url: 'http://host1.test/foo.png',
|
|
||||||
name: '',
|
|
||||||
};
|
|
||||||
const driveFile = await imageService.createImage(
|
|
||||||
await createRandomRemoteUser(resolver, personService),
|
|
||||||
imageObject,
|
|
||||||
);
|
|
||||||
assert.ok(!driveFile.isLink);
|
|
||||||
|
|
||||||
const sensitiveImageObject: IApDocument = {
|
|
||||||
type: 'Document',
|
|
||||||
mediaType: 'image/png',
|
|
||||||
url: 'http://host1.test/bar.png',
|
|
||||||
name: '',
|
|
||||||
sensitive: true,
|
|
||||||
};
|
|
||||||
const sensitiveDriveFile = await imageService.createImage(
|
|
||||||
await createRandomRemoteUser(resolver, personService),
|
|
||||||
sensitiveImageObject,
|
|
||||||
);
|
|
||||||
assert.ok(!sensitiveDriveFile.isLink);
|
|
||||||
});
|
|
||||||
|
|
||||||
test('cacheRemoteFiles=false disables caching', async () => {
|
|
||||||
meta = { ...metaInitial, cacheRemoteFiles: false };
|
|
||||||
|
|
||||||
const imageObject: IApDocument = {
|
const imageObject: IApDocument = {
|
||||||
type: 'Document',
|
type: 'Document',
|
||||||
mediaType: 'image/png',
|
mediaType: 'image/png',
|
||||||
|
@ -312,34 +281,5 @@ describe('ActivityPub', () => {
|
||||||
);
|
);
|
||||||
assert.ok(sensitiveDriveFile.isLink);
|
assert.ok(sensitiveDriveFile.isLink);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('cacheRemoteSensitiveFiles=false only affects sensitive files', async () => {
|
|
||||||
meta = { ...metaInitial, cacheRemoteSensitiveFiles: false };
|
|
||||||
|
|
||||||
const imageObject: IApDocument = {
|
|
||||||
type: 'Document',
|
|
||||||
mediaType: 'image/png',
|
|
||||||
url: 'http://host1.test/foo.png',
|
|
||||||
name: '',
|
|
||||||
};
|
|
||||||
const driveFile = await imageService.createImage(
|
|
||||||
await createRandomRemoteUser(resolver, personService),
|
|
||||||
imageObject,
|
|
||||||
);
|
|
||||||
assert.ok(!driveFile.isLink);
|
|
||||||
|
|
||||||
const sensitiveImageObject: IApDocument = {
|
|
||||||
type: 'Document',
|
|
||||||
mediaType: 'image/png',
|
|
||||||
url: 'http://host1.test/bar.png',
|
|
||||||
name: '',
|
|
||||||
sensitive: true,
|
|
||||||
};
|
|
||||||
const sensitiveDriveFile = await imageService.createImage(
|
|
||||||
await createRandomRemoteUser(resolver, personService),
|
|
||||||
sensitiveImageObject,
|
|
||||||
);
|
|
||||||
assert.ok(sensitiveDriveFile.isLink);
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -29,24 +29,6 @@
|
||||||
<template #caption>{{ i18n.ts.pinnedUsersDescription }}</template>
|
<template #caption>{{ i18n.ts.pinnedUsersDescription }}</template>
|
||||||
</MkTextarea>
|
</MkTextarea>
|
||||||
|
|
||||||
<FormSection>
|
|
||||||
<template #label>{{ i18n.ts.files }}</template>
|
|
||||||
|
|
||||||
<div class="_gaps_m">
|
|
||||||
<MkSwitch v-model="cacheRemoteFiles">
|
|
||||||
<template #label>{{ i18n.ts.cacheRemoteFiles }}</template>
|
|
||||||
<template #caption>{{ i18n.ts.cacheRemoteFilesDescription }}</template>
|
|
||||||
</MkSwitch>
|
|
||||||
|
|
||||||
<template v-if="cacheRemoteFiles">
|
|
||||||
<MkSwitch v-model="cacheRemoteSensitiveFiles">
|
|
||||||
<template #label>{{ i18n.ts.cacheRemoteSensitiveFiles }}</template>
|
|
||||||
<template #caption>{{ i18n.ts.cacheRemoteSensitiveFilesDescription }}</template>
|
|
||||||
</MkSwitch>
|
|
||||||
</template>
|
|
||||||
</div>
|
|
||||||
</FormSection>
|
|
||||||
|
|
||||||
<FormSection>
|
<FormSection>
|
||||||
<template #label>ServiceWorker</template>
|
<template #label>ServiceWorker</template>
|
||||||
|
|
||||||
|
@ -117,8 +99,6 @@ let description: string | null = $ref(null);
|
||||||
let maintainerName: string | null = $ref(null);
|
let maintainerName: string | null = $ref(null);
|
||||||
let maintainerEmail: string | null = $ref(null);
|
let maintainerEmail: string | null = $ref(null);
|
||||||
let pinnedUsers: string = $ref('');
|
let pinnedUsers: string = $ref('');
|
||||||
let cacheRemoteFiles: boolean = $ref(false);
|
|
||||||
let cacheRemoteSensitiveFiles: boolean = $ref(false);
|
|
||||||
let enableServiceWorker: boolean = $ref(false);
|
let enableServiceWorker: boolean = $ref(false);
|
||||||
let swPublicKey: any = $ref(null);
|
let swPublicKey: any = $ref(null);
|
||||||
let swPrivateKey: any = $ref(null);
|
let swPrivateKey: any = $ref(null);
|
||||||
|
@ -132,8 +112,6 @@ async function init(): Promise<void> {
|
||||||
maintainerName = meta.maintainerName;
|
maintainerName = meta.maintainerName;
|
||||||
maintainerEmail = meta.maintainerEmail;
|
maintainerEmail = meta.maintainerEmail;
|
||||||
pinnedUsers = meta.pinnedUsers.join('\n');
|
pinnedUsers = meta.pinnedUsers.join('\n');
|
||||||
cacheRemoteFiles = meta.cacheRemoteFiles;
|
|
||||||
cacheRemoteSensitiveFiles = meta.cacheRemoteSensitiveFiles;
|
|
||||||
enableServiceWorker = meta.enableServiceWorker;
|
enableServiceWorker = meta.enableServiceWorker;
|
||||||
swPublicKey = meta.swPublickey;
|
swPublicKey = meta.swPublickey;
|
||||||
swPrivateKey = meta.swPrivateKey;
|
swPrivateKey = meta.swPrivateKey;
|
||||||
|
@ -148,8 +126,6 @@ function save(): void {
|
||||||
maintainerName,
|
maintainerName,
|
||||||
maintainerEmail,
|
maintainerEmail,
|
||||||
pinnedUsers: pinnedUsers.split('\n'),
|
pinnedUsers: pinnedUsers.split('\n'),
|
||||||
cacheRemoteFiles,
|
|
||||||
cacheRemoteSensitiveFiles,
|
|
||||||
enableServiceWorker,
|
enableServiceWorker,
|
||||||
swPublicKey,
|
swPublicKey,
|
||||||
swPrivateKey,
|
swPrivateKey,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue