summaryrefslogtreecommitdiff
path: root/packages/backend/src/core
diff options
context:
space:
mode:
authordakkar <dakkar@thenautilus.net>2024-05-09 20:28:58 +0000
committerdakkar <dakkar@thenautilus.net>2024-05-09 20:28:58 +0000
commit3d6eb18e2a909be37f2e47fb645edda18d9a889f (patch)
treefc3e7f55467c6f266b8bd6b328d16057600a4851 /packages/backend/src/core
parentmerge: release 2024.3.2 (!485) (diff)
parentpin to node 20 (diff)
downloadsharkey-3d6eb18e2a909be37f2e47fb645edda18d9a889f.tar.gz
sharkey-3d6eb18e2a909be37f2e47fb645edda18d9a889f.tar.bz2
sharkey-3d6eb18e2a909be37f2e47fb645edda18d9a889f.zip
merge: Release 2024.3.3 (!501)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/501 Approved-by: Amelia Yukii <amelia.yukii@shourai.de> Approved-by: Marie <marie@kaifa.ch>
Diffstat (limited to 'packages/backend/src/core')
-rw-r--r--packages/backend/src/core/NoteEditService.ts7
-rw-r--r--packages/backend/src/core/ReactionService.ts4
-rw-r--r--packages/backend/src/core/activitypub/ApRendererService.ts47
-rw-r--r--packages/backend/src/core/activitypub/LdSignatureService.ts12
-rw-r--r--packages/backend/src/core/activitypub/misc/contexts.ts46
-rw-r--r--packages/backend/src/core/chart/charts/users.ts7
6 files changed, 73 insertions, 50 deletions
diff --git a/packages/backend/src/core/NoteEditService.ts b/packages/backend/src/core/NoteEditService.ts
index 72fc01ae3b..a01dfec664 100644
--- a/packages/backend/src/core/NoteEditService.ts
+++ b/packages/backend/src/core/NoteEditService.ts
@@ -430,11 +430,16 @@ export class NoteEditService implements OnApplicationShutdown {
update.hasPoll = !!data.poll;
}
+ // technically we should check if the two sets of files are
+ // different, or if their descriptions have changed. In practice
+ // this is good enough.
+ const filesChanged = oldnote.fileIds?.length || data.files?.length;
+
const poll = await this.pollsRepository.findOneBy({ noteId: oldnote.id });
const oldPoll = poll ? { choices: poll.choices, multiple: poll.multiple, expiresAt: poll.expiresAt } : null;
- if (Object.keys(update).length > 0) {
+ if (Object.keys(update).length > 0 || filesChanged) {
const exists = await this.noteEditRepository.findOneBy({ noteId: oldnote.id });
await this.noteEditRepository.insert({
diff --git a/packages/backend/src/core/ReactionService.ts b/packages/backend/src/core/ReactionService.ts
index 90586b500e..c0b59e635d 100644
--- a/packages/backend/src/core/ReactionService.ts
+++ b/packages/backend/src/core/ReactionService.ts
@@ -64,8 +64,8 @@ type DecodedReaction = {
host?: string | null;
};
-const isCustomEmojiRegexp = /^:([\w+-]+)(?:@\.)?:$/;
-const decodeCustomEmojiRegexp = /^:([\w+-]+)(?:@([\w.-]+))?:$/;
+const isCustomEmojiRegexp = /^:([\p{Letter}\p{Number}\p{Mark}_+-]+)(?:@\.)?:$/u;
+const decodeCustomEmojiRegexp = /^:([\p{Letter}\p{Number}\p{Mark}_+-]+)(?:@([\w.-]+))?:$/u;
@Injectable()
export class ReactionService {
diff --git a/packages/backend/src/core/activitypub/ApRendererService.ts b/packages/backend/src/core/activitypub/ApRendererService.ts
index a84feffac6..38175b2059 100644
--- a/packages/backend/src/core/activitypub/ApRendererService.ts
+++ b/packages/backend/src/core/activitypub/ApRendererService.ts
@@ -31,6 +31,7 @@ import { IdService } from '@/core/IdService.js';
import { MetaService } from '../MetaService.js';
import { LdSignatureService } from './LdSignatureService.js';
import { ApMfmService } from './ApMfmService.js';
+import { CONTEXT } from './misc/contexts.js';
import type { IAccept, IActivity, IAdd, IAnnounce, IApDocument, IApEmoji, IApHashtag, IApImage, IApMention, IBlock, ICreate, IDelete, IFlag, IFollow, IKey, ILike, IMove, IObject, IPost, IQuestion, IReject, IRemove, ITombstone, IUndo, IUpdate } from './type.js';
@Injectable()
@@ -283,9 +284,10 @@ export class ApRendererService {
if (instance && instance.softwareName === 'mastodon') isMastodon = true;
if (instance && instance.softwareName === 'akkoma') isMastodon = true;
if (instance && instance.softwareName === 'pleroma') isMastodon = true;
+ if (instance && instance.softwareName === 'iceshrimp.net') isMastodon = true;
}
}
-
+
const object: ILike = {
type: 'Like',
id: `${this.config.url}/likes/${noteReaction.id}`,
@@ -785,48 +787,7 @@ export class ApRendererService {
x.id = `${this.config.url}/${randomUUID()}`;
}
- return Object.assign({
- '@context': [
- 'https://www.w3.org/ns/activitystreams',
- 'https://w3id.org/security/v1',
- {
- Key: 'sec:Key',
- // as non-standards
- manuallyApprovesFollowers: 'as:manuallyApprovesFollowers',
- sensitive: 'as:sensitive',
- Hashtag: 'as:Hashtag',
- quoteUrl: 'as:quoteUrl',
- fedibird: 'http://fedibird.com/ns#',
- quoteUri: 'fedibird:quoteUri',
- // Mastodon
- toot: 'http://joinmastodon.org/ns#',
- Emoji: 'toot:Emoji',
- featured: 'toot:featured',
- discoverable: 'toot:discoverable',
- // schema
- schema: 'http://schema.org#',
- PropertyValue: 'schema:PropertyValue',
- value: 'schema:value',
- // Misskey
- misskey: 'https://misskey-hub.net/ns#',
- '_misskey_content': 'misskey:_misskey_content',
- '_misskey_quote': 'misskey:_misskey_quote',
- '_misskey_reaction': 'misskey:_misskey_reaction',
- '_misskey_votes': 'misskey:_misskey_votes',
- '_misskey_summary': 'misskey:_misskey_summary',
- 'isCat': 'misskey:isCat',
- // Firefish
- firefish: 'https://joinfirefish.org/ns#',
- speakAsCat: 'firefish:speakAsCat',
- // Sharkey
- sharkey: 'https://joinsharkey.org/ns#',
- backgroundUrl: 'sharkey:backgroundUrl',
- listenbrainz: 'sharkey:listenbrainz',
- // vcard
- vcard: 'http://www.w3.org/2006/vcard/ns#',
- },
- ],
- }, x as T & { id: string });
+ return Object.assign({ '@context': CONTEXT }, x as T & { id: string });
}
@bindThis
diff --git a/packages/backend/src/core/activitypub/LdSignatureService.ts b/packages/backend/src/core/activitypub/LdSignatureService.ts
index 9de184336f..2ec6dc4585 100644
--- a/packages/backend/src/core/activitypub/LdSignatureService.ts
+++ b/packages/backend/src/core/activitypub/LdSignatureService.ts
@@ -7,7 +7,7 @@ import * as crypto from 'node:crypto';
import { Injectable } from '@nestjs/common';
import { HttpRequestService } from '@/core/HttpRequestService.js';
import { bindThis } from '@/decorators.js';
-import { CONTEXTS } from './misc/contexts.js';
+import { CONTEXT, CONTEXTS } from './misc/contexts.js';
import { validateContentTypeSetAsJsonLD } from './misc/validator.js';
import type { JsonLdDocument } from 'jsonld';
import type { JsonLd, RemoteDocument } from 'jsonld/jsonld-spec.js';
@@ -89,6 +89,16 @@ class LdSignature {
}
@bindThis
+ public async compact(data: any, context: any = CONTEXT): Promise<JsonLdDocument> {
+ const customLoader = this.getLoader();
+ // XXX: Importing jsonld dynamically since Jest frequently fails to import it statically
+ // https://github.com/misskey-dev/misskey/pull/9894#discussion_r1103753595
+ return (await import('jsonld')).default.compact(data, context, {
+ documentLoader: customLoader,
+ });
+ }
+
+ @bindThis
public async normalize(data: JsonLdDocument): Promise<string> {
const customLoader = this.getLoader();
// XXX: Importing jsonld dynamically since Jest frequently fails to import it statically
diff --git a/packages/backend/src/core/activitypub/misc/contexts.ts b/packages/backend/src/core/activitypub/misc/contexts.ts
index 88afdefcd3..4ff114bbf5 100644
--- a/packages/backend/src/core/activitypub/misc/contexts.ts
+++ b/packages/backend/src/core/activitypub/misc/contexts.ts
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: AGPL-3.0-only
*/
-import type { JsonLd } from 'jsonld/jsonld-spec.js';
+import type { Context, JsonLd } from 'jsonld/jsonld-spec.js';
/* eslint:disable:quotemark indent */
const id_v1 = {
@@ -526,6 +526,50 @@ const activitystreams = {
},
} satisfies JsonLd;
+const context_iris = [
+ 'https://www.w3.org/ns/activitystreams',
+ 'https://w3id.org/security/v1',
+];
+
+const extension_context_definition = {
+ Key: 'sec:Key',
+ // as non-standards
+ manuallyApprovesFollowers: 'as:manuallyApprovesFollowers',
+ sensitive: 'as:sensitive',
+ Hashtag: 'as:Hashtag',
+ quoteUrl: 'as:quoteUrl',
+ fedibird: 'http://fedibird.com/ns#',
+ quoteUri: 'fedibird:quoteUri',
+ // Mastodon
+ toot: 'http://joinmastodon.org/ns#',
+ Emoji: 'toot:Emoji',
+ featured: 'toot:featured',
+ discoverable: 'toot:discoverable',
+ // schema
+ schema: 'http://schema.org#',
+ PropertyValue: 'schema:PropertyValue',
+ value: 'schema:value',
+ // Misskey
+ misskey: 'https://misskey-hub.net/ns#',
+ '_misskey_content': 'misskey:_misskey_content',
+ '_misskey_quote': 'misskey:_misskey_quote',
+ '_misskey_reaction': 'misskey:_misskey_reaction',
+ '_misskey_votes': 'misskey:_misskey_votes',
+ '_misskey_summary': 'misskey:_misskey_summary',
+ 'isCat': 'misskey:isCat',
+ // Firefish
+ firefish: 'https://joinfirefish.org/ns#',
+ speakAsCat: 'firefish:speakAsCat',
+ // Sharkey
+ sharkey: 'https://joinsharkey.org/ns#',
+ backgroundUrl: 'sharkey:backgroundUrl',
+ listenbrainz: 'sharkey:listenbrainz',
+ // vcard
+ vcard: 'http://www.w3.org/2006/vcard/ns#',
+} satisfies Context;
+
+export const CONTEXT: (string | Context)[] = [...context_iris, extension_context_definition];
+
export const CONTEXTS: Record<string, JsonLd> = {
'https://w3id.org/identity/v1': id_v1,
'https://w3id.org/security/v1': security_v1,
diff --git a/packages/backend/src/core/chart/charts/users.ts b/packages/backend/src/core/chart/charts/users.ts
index d148fc629b..840522ae9b 100644
--- a/packages/backend/src/core/chart/charts/users.ts
+++ b/packages/backend/src/core/chart/charts/users.ts
@@ -4,7 +4,7 @@
*/
import { Injectable, Inject } from '@nestjs/common';
-import { Not, IsNull, DataSource } from 'typeorm';
+import { Not, IsNull, Like, DataSource } from 'typeorm';
import type { MiUser } from '@/models/User.js';
import { AppLockService } from '@/core/AppLockService.js';
import { DI } from '@/di-symbols.js';
@@ -37,7 +37,10 @@ export default class UsersChart extends Chart<typeof schema> { // eslint-disable
protected async tickMajor(): Promise<Partial<KVs<typeof schema>>> {
const [localCount, remoteCount] = await Promise.all([
- this.usersRepository.countBy({ host: IsNull() }),
+ // that Not(Like()) is ugly, but it matches the logic in
+ // packages/backend/src/models/User.ts to not count "system"
+ // accounts
+ this.usersRepository.countBy({ host: IsNull(), username: Not(Like('%.%')) }),
this.usersRepository.countBy({ host: Not(IsNull()) }),
]);