summaryrefslogtreecommitdiff
path: root/packages/backend/src/core
diff options
context:
space:
mode:
authorKagami Sascha Rosylight <saschanaz@outlook.com>2023-07-09 01:59:44 +0200
committerGitHub <noreply@github.com>2023-07-09 08:59:44 +0900
commit5059d4d7e1fc98c5a86ebe73997e21b8c9bda0f7 (patch)
tree31d5270480b25f1c19d5a21d1cf45a14672b2ef3 /packages/backend/src/core
parentfix(frontend): fix storybook build (#11203) (diff)
downloadmisskey-5059d4d7e1fc98c5a86ebe73997e21b8c9bda0f7.tar.gz
misskey-5059d4d7e1fc98c5a86ebe73997e21b8c9bda0f7.tar.bz2
misskey-5059d4d7e1fc98c5a86ebe73997e21b8c9bda0f7.zip
refactor(backend): skip fetching notes when the data is same-origin (#11200)
* refactor(backend): skip fetching notes when the data is same-origin * Update CHANGELOG.md * sentFrom
Diffstat (limited to 'packages/backend/src/core')
-rw-r--r--packages/backend/src/core/activitypub/models/ApNoteService.ts10
-rw-r--r--packages/backend/src/core/activitypub/models/ApPersonService.ts11
2 files changed, 12 insertions, 9 deletions
diff --git a/packages/backend/src/core/activitypub/models/ApNoteService.ts b/packages/backend/src/core/activitypub/models/ApNoteService.ts
index 35865a819d..d3359ef900 100644
--- a/packages/backend/src/core/activitypub/models/ApNoteService.ts
+++ b/packages/backend/src/core/activitypub/models/ApNoteService.ts
@@ -177,7 +177,7 @@ export class ApNoteService {
// リプライ
const reply: Note | null = note.inReplyTo
- ? await this.resolveNote(note.inReplyTo, resolver)
+ ? await this.resolveNote(note.inReplyTo, { resolver })
.then(x => {
if (x == null) {
this.logger.warn('Specified inReplyTo, but not found');
@@ -293,9 +293,8 @@ export class ApNoteService {
* リモートサーバーからフェッチしてMisskeyに登録しそれを返します。
*/
@bindThis
- public async resolveNote(value: string | IObject, resolver?: Resolver): Promise<Note | null> {
- const uri = typeof value === 'string' ? value : value.id;
- if (uri == null) throw new Error('missing uri');
+ public async resolveNote(value: string | IObject, options: { sentFrom?: URL, resolver?: Resolver } = {}): Promise<Note | null> {
+ const uri = getApId(value);
// ブロックしていたら中断
const meta = await this.metaService.fetch();
@@ -318,7 +317,8 @@ export class ApNoteService {
// リモートサーバーからフェッチしてきて登録
// ここでuriの代わりに添付されてきたNote Objectが指定されていると、サーバーフェッチを経ずにノートが生成されるが
// 添付されてきたNote Objectは偽装されている可能性があるため、常にuriを指定してサーバーフェッチを行う。
- return await this.createNote(uri, resolver, true);
+ const createFrom = options.sentFrom?.origin === new URL(uri).origin ? value : uri;
+ return await this.createNote(createFrom, options.resolver, true);
} finally {
unlock();
}
diff --git a/packages/backend/src/core/activitypub/models/ApPersonService.ts b/packages/backend/src/core/activitypub/models/ApPersonService.ts
index e8b65b3d42..e89ee4632c 100644
--- a/packages/backend/src/core/activitypub/models/ApPersonService.ts
+++ b/packages/backend/src/core/activitypub/models/ApPersonService.ts
@@ -260,7 +260,7 @@ export class ApPersonService implements OnModuleInit {
// Create user
let user: RemoteUser | null = null;
try {
- // Start transaction
+ // Start transaction
await this.db.transaction(async transactionalEntityManager => {
user = await transactionalEntityManager.save(new User({
id: this.idService.genId(),
@@ -306,9 +306,9 @@ export class ApPersonService implements OnModuleInit {
}
});
} catch (e) {
- // duplicate key error
+ // duplicate key error
if (isDuplicateKeyValueError(e)) {
- // /users/@a => /users/:id のように入力がaliasなときにエラーになることがあるのを対応
+ // /users/@a => /users/:id のように入力がaliasなときにエラーになることがあるのを対応
const u = await this.usersRepository.findOneBy({ uri: person.id });
if (u == null) throw new Error('already registered');
@@ -604,7 +604,10 @@ export class ApPersonService implements OnModuleInit {
const featuredNotes = await Promise.all(items
.filter(item => getApType(item) === 'Note') // TODO: Noteでなくてもいいかも
.slice(0, 5)
- .map(item => limit(() => this.apNoteService.resolveNote(item, _resolver))));
+ .map(item => limit(() => this.apNoteService.resolveNote(item, {
+ resolver: _resolver,
+ sentFrom: new URL(user.uri),
+ }))));
await this.db.transaction(async transactionalEntityManager => {
await transactionalEntityManager.delete(UserNotePining, { userId: user.id });