From 2c0cf337989524952e8d3843c320a714cde6e21a Mon Sep 17 00:00:00 2001 From: ThatOneCalculator Date: Thu, 17 Nov 2022 13:54:25 -0800 Subject: [PATCH 01/76] init --- packages/backend/src/remote/activitypub/models/person.ts | 2 ++ packages/backend/src/remote/activitypub/renderer/index.ts | 1 + packages/backend/src/remote/activitypub/renderer/person.ts | 1 + packages/backend/src/remote/activitypub/type.ts | 1 + 4 files changed, 5 insertions(+) diff --git a/packages/backend/src/remote/activitypub/models/person.ts b/packages/backend/src/remote/activitypub/models/person.ts index 6097e3b6e..0b3654489 100644 --- a/packages/backend/src/remote/activitypub/models/person.ts +++ b/packages/backend/src/remote/activitypub/models/person.ts @@ -172,6 +172,7 @@ export async function createPerson(uri: string, resolver?: Resolver): Promise; diff --git a/packages/backend/src/remote/activitypub/renderer/index.ts b/packages/backend/src/remote/activitypub/renderer/index.ts index f100b77ce..893b6fd75 100644 --- a/packages/backend/src/remote/activitypub/renderer/index.ts +++ b/packages/backend/src/remote/activitypub/renderer/index.ts @@ -19,6 +19,7 @@ export const renderActivity = (x: any): IActivity | null => { { // as non-standards manuallyApprovesFollowers: 'as:manuallyApprovesFollowers', + movedTo: 'as:movedTo', sensitive: 'as:sensitive', Hashtag: 'as:Hashtag', quoteUrl: 'as:quoteUrl', diff --git a/packages/backend/src/remote/activitypub/renderer/person.ts b/packages/backend/src/remote/activitypub/renderer/person.ts index cd2fd74d4..dfabd910e 100644 --- a/packages/backend/src/remote/activitypub/renderer/person.ts +++ b/packages/backend/src/remote/activitypub/renderer/person.ts @@ -71,6 +71,7 @@ export async function renderPerson(user: ILocalUser) { image: banner ? renderImage(banner) : null, tag, manuallyApprovesFollowers: user.isLocked, + movedTo: user.moved_to_account_id, discoverable: !!user.isExplorable, publicKey: renderKey(user, keypair, `#main-key`), isCat: user.isCat, diff --git a/packages/backend/src/remote/activitypub/type.ts b/packages/backend/src/remote/activitypub/type.ts index de7eb0ed8..2c4935a87 100644 --- a/packages/backend/src/remote/activitypub/type.ts +++ b/packages/backend/src/remote/activitypub/type.ts @@ -156,6 +156,7 @@ export interface IActor extends IObject { name?: string; preferredUsername?: string; manuallyApprovesFollowers?: boolean; + movedTo?: string; discoverable?: boolean; inbox: string; sharedInbox?: string; // 後方互換性のため From 2c5ba3f11e8deaf539e81e77d5920d865167c082 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator Date: Sat, 19 Nov 2022 00:52:41 -0800 Subject: [PATCH 02/76] perf: :zap: load icons css last --- packages/backend/src/server/web/views/base.pug | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/backend/src/server/web/views/base.pug b/packages/backend/src/server/web/views/base.pug index 547fc34a8..ad6572488 100644 --- a/packages/backend/src/server/web/views/base.pug +++ b/packages/backend/src/server/web/views/base.pug @@ -38,7 +38,6 @@ html link(rel='prefetch' href=`/static-assets/badges/info.png?${ timestamp }`) link(rel='prefetch' href=`/static-assets/badges/not-found.png?${ timestamp }`) link(rel='prefetch' href=`/static-assets/badges/error.png?${ timestamp }`) - link(rel='stylesheet' href='/assets/phosphor/icons.css') link(rel='stylesheet' href=`/static-assets/instance.css?${ timestamp }`) link(rel='modulepreload' href=`/assets/${clientEntry.file}`) @@ -48,6 +47,8 @@ html each href in clientEntry.css link(rel='preload' href=`/assets/${href}` as='style') + link(rel='stylesheet' href='/assets/phosphor/icons.css') + title block title = title || 'Calckey' From ea3e13f1900519538a4f9dbae71b790b8b9f65f5 Mon Sep 17 00:00:00 2001 From: cutestnekoaqua Date: Wed, 23 Nov 2022 21:48:44 +0100 Subject: [PATCH 03/76] Create move type --- packages/backend/.idea/.gitignore | 8 ++++++++ packages/backend/src/queue/processors/inbox.ts | 11 +++++------ packages/backend/src/remote/activitypub/type.ts | 5 +++++ packages/backend/src/server/activitypub.ts | 3 ++- 4 files changed, 20 insertions(+), 7 deletions(-) create mode 100644 packages/backend/.idea/.gitignore diff --git a/packages/backend/.idea/.gitignore b/packages/backend/.idea/.gitignore new file mode 100644 index 000000000..13566b81b --- /dev/null +++ b/packages/backend/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/packages/backend/src/queue/processors/inbox.ts b/packages/backend/src/queue/processors/inbox.ts index 420d74bb0..33949672c 100644 --- a/packages/backend/src/queue/processors/inbox.ts +++ b/packages/backend/src/queue/processors/inbox.ts @@ -20,7 +20,7 @@ import { UserPublickey } from '@/models/entities/user-publickey.js'; const logger = new Logger('inbox'); -// ユーザーのinboxにアクティビティが届いた時の処理 +// Processing when an activity arrives in the user's inbox export default async (job: Bull.Job): Promise => { const signature = job.data.signature; // HTTP-signature const activity = job.data.activity; @@ -30,16 +30,15 @@ export default async (job: Bull.Job): Promise => { delete info['@context']; logger.debug(JSON.stringify(info, null, 2)); //#endregion - const host = toPuny(new URL(signature.keyId).hostname); - // ブロックしてたら中断 + // interrupt if blocked const meta = await fetchMeta(); if (meta.blockedHosts.includes(host)) { return `Blocked request: ${host}`; } - // 非公開モードなら許可なインスタンスのみ + // only whitelisted instances in private mode if (meta.privateMode && !meta.allowedHosts.includes(host)) { return `Blocked request: ${host}`; } @@ -51,7 +50,7 @@ export default async (job: Bull.Job): Promise => { const dbResolver = new DbResolver(); - // HTTP-Signature keyIdを元にDBから取得 + // HTTP-Signature keyId from DB let authUser: { user: CacheableRemoteUser; key: UserPublickey | null; @@ -62,7 +61,7 @@ export default async (job: Bull.Job): Promise => { try { authUser = await dbResolver.getAuthUserFromApId(getApId(activity.actor)); } catch (e) { - // 対象が4xxならスキップ + // Skip if target is 4xx if (e instanceof StatusError) { if (e.isClientError) { return `skip: Ignored deleted actors on both ends ${activity.actor} - ${e.statusCode}`; diff --git a/packages/backend/src/remote/activitypub/type.ts b/packages/backend/src/remote/activitypub/type.ts index 2c4935a87..d04352e4c 100644 --- a/packages/backend/src/remote/activitypub/type.ts +++ b/packages/backend/src/remote/activitypub/type.ts @@ -157,6 +157,7 @@ export interface IActor extends IObject { preferredUsername?: string; manuallyApprovesFollowers?: boolean; movedTo?: string; + alsoKnownAs?: string[]; discoverable?: boolean; inbox: string; sharedInbox?: string; // 後方互換性のため @@ -280,6 +281,10 @@ export interface IFlag extends IActivity { type: 'Flag'; } +export interface IMove extends IActivity { + type: 'Move'; +} + export const isCreate = (object: IObject): object is ICreate => getApType(object) === 'Create'; export const isDelete = (object: IObject): object is IDelete => getApType(object) === 'Delete'; export const isUpdate = (object: IObject): object is IUpdate => getApType(object) === 'Update'; diff --git a/packages/backend/src/server/activitypub.ts b/packages/backend/src/server/activitypub.ts index 250a39bf0..782915756 100644 --- a/packages/backend/src/server/activitypub.ts +++ b/packages/backend/src/server/activitypub.ts @@ -38,6 +38,7 @@ function inbox(ctx: Router.RouterContext) { return; } + // @ts-ignore processInbox(ctx.request.body, signature); ctx.status = 202; @@ -86,7 +87,7 @@ router.get('/notes/:note', async (ctx, next) => { return; } - // リモートだったらリダイレクト + // redirect if remote if (note.userHost != null) { if (note.uri == null || isSelfHost(note.userHost)) { ctx.status = 500; From 9ab2599e0da4d1f9f47a92087b11a2a21a9aa387 Mon Sep 17 00:00:00 2001 From: Cleo John <30842467+CutestNekoAqua@users.noreply.github.com> Date: Thu, 24 Nov 2022 11:32:25 +0000 Subject: [PATCH 04/76] db migration for moved to --- bun.lockb | 3 +++ packages/backend/bun.lockb | 3 +++ .../1669288094000-AddMovedToAndKnownAs.js | 16 ++++++++++++++++ packages/backend/src/models/entities/user.ts | 6 ++++++ packages/sw/bun.lockb | 3 +++ 5 files changed, 31 insertions(+) create mode 100755 bun.lockb create mode 100755 packages/backend/bun.lockb create mode 100644 packages/backend/migration/1669288094000-AddMovedToAndKnownAs.js create mode 100755 packages/sw/bun.lockb diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 000000000..31eaaea1d --- /dev/null +++ b/bun.lockb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f1c38fd62d3a95d883fed6b4eb1ea16126667248f4c03a4ac4c0367d21ac2de1 +size 255080 diff --git a/packages/backend/bun.lockb b/packages/backend/bun.lockb new file mode 100755 index 000000000..e10adde91 --- /dev/null +++ b/packages/backend/bun.lockb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fc69a322b5dd9baec1f8713ed24f27e2f1c396e403a3fa7d358ecad865357ddb +size 399520 diff --git a/packages/backend/migration/1669288094000-AddMovedToAndKnownAs.js b/packages/backend/migration/1669288094000-AddMovedToAndKnownAs.js new file mode 100644 index 000000000..8936c3503 --- /dev/null +++ b/packages/backend/migration/1669288094000-AddMovedToAndKnownAs.js @@ -0,0 +1,16 @@ +export class addMovedToAndKnownAs1669288094000 { + name = 'addMovedToAndKnownAs1669288094000' + + async up(queryRunner) { + await queryRunner.query(`ALTER TABLE "user" ADD "movedToUri" character varying(512)`); + await queryRunner.query(`ALTER TABLE "user" ADD "knownAs" TEXT []`); + await queryRunner.query(`COMMENT ON COLUMN "user"."movedToUri" IS 'The URI of the new account of the User'`); + await queryRunner.query(`COMMENT ON COLUMN "user"."knownAs" IS 'URIs the user is known as too'`); + } + + async down(queryRunner) { + await queryRunner.query(`ALTER TABLE "user" DROP COLUMN "movedToUri"`); + await queryRunner.query(`ALTER TABLE "user" DROP COLUMN "knownAs"`); + } + +} diff --git a/packages/backend/src/models/entities/user.ts b/packages/backend/src/models/entities/user.ts index bc9446be4..9d79c42e6 100644 --- a/packages/backend/src/models/entities/user.ts +++ b/packages/backend/src/models/entities/user.ts @@ -68,6 +68,12 @@ export class User { }) public followingCount: number; + @Column('varchar', { + length: 512, nullable: true, + comment: 'The URI of the new account of the User', + }) + public movedToUri: string | null; + @Column('integer', { default: 0, comment: 'The count of notes.', diff --git a/packages/sw/bun.lockb b/packages/sw/bun.lockb new file mode 100755 index 000000000..2e4e467a7 --- /dev/null +++ b/packages/sw/bun.lockb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:794ad1609465ce05a365b412bdf602993c1f113b4c0af7716aba8fc8c40d7f7f +size 43759 From fe7ac800d76986a5cdc4199a6a47e5b824f41f8e Mon Sep 17 00:00:00 2001 From: Cleo John <30842467+CutestNekoAqua@users.noreply.github.com> Date: Thu, 24 Nov 2022 11:39:40 +0000 Subject: [PATCH 05/76] Add movedToUri and knownAs to DB model user --- packages/backend/src/models/entities/user.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/backend/src/models/entities/user.ts b/packages/backend/src/models/entities/user.ts index 9d79c42e6..1fa46037d 100644 --- a/packages/backend/src/models/entities/user.ts +++ b/packages/backend/src/models/entities/user.ts @@ -74,6 +74,12 @@ export class User { }) public movedToUri: string | null; + @Column('simple-array', { + nullable: true, + comment: 'URIs the user is known as too', + }) + public alsoKnownAs: string[] | null; + @Column('integer', { default: 0, comment: 'The count of notes.', From 1e16aef16de3ca1c54bd3aa0a0f2b209df1d8991 Mon Sep 17 00:00:00 2001 From: cutestnekoaqua Date: Thu, 24 Nov 2022 19:28:38 +0100 Subject: [PATCH 06/76] Add intellij to main .gitignore --- .gitignore | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.gitignore b/.gitignore index a4e031399..d511fa5ad 100644 --- a/.gitignore +++ b/.gitignore @@ -59,3 +59,8 @@ packages/backend/assets/instance.css *.blend3 *.blend4 *.blend5 + +#intelij stuff +packages/backend/.idea/backend.iml +packages/backend/.idea/modules.xml +packages/backend/.idea/vcs.xml From cfab9ff2ad0550467bc3844325252d68d0d79f00 Mon Sep 17 00:00:00 2001 From: Cleo Date: Wed, 30 Nov 2022 20:26:13 +0100 Subject: [PATCH 07/76] Display moved info. It already fetches the moved to info on regular user fetches, now only the notification of a new "moved to" is missing. Signed-off-by: cutestnekoaqua Co-authored-by: Mary Strodl Signed-off-by: cutestnekoaqua --- locales/de-DE.yml | 1 + locales/en-US.yml | 1 + locales/ja-JP.yml | 1 + .../backend/src/models/repositories/user.ts | 63 +++++++++++++++---- packages/backend/src/models/schema/user.ts | 10 +++ packages/client/src/components/MkMoved.vue | 25 ++++++++ packages/client/src/pages/user/home.vue | 2 + 7 files changed, 92 insertions(+), 11 deletions(-) create mode 100644 packages/client/src/components/MkMoved.vue diff --git a/locales/de-DE.yml b/locales/de-DE.yml index d7920b361..ea0fb8846 100644 --- a/locales/de-DE.yml +++ b/locales/de-DE.yml @@ -112,6 +112,7 @@ reactionSettingDescription2: "Ziehe um Anzuordnen, klicke um zu löschen, drück rememberNoteVisibility: "Notizsichtbarkeit merken" attachCancel: "Anhang entfernen" markAsSensitive: "Als NSFW markieren" +accountMoved: "Benutzer hat zu einem anderen Account gewechselt." unmarkAsSensitive: "Als nicht NSFW markieren" enterFileName: "Dateinamen eingeben" mute: "Stummschalten" diff --git a/locales/en-US.yml b/locales/en-US.yml index f5758ed64..1215055d5 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -149,6 +149,7 @@ addAccount: "Add account" loginFailed: "Failed to sign in" showOnRemote: "View on remote instance" general: "General" +accountMoved: "User has moved to a new account." wallpaper: "Wallpaper" setWallpaper: "Set wallpaper" removeWallpaper: "Remove wallpaper" diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index b045f5448..90820d43a 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -149,6 +149,7 @@ addAccount: "アカウントを追加" loginFailed: "ログインに失敗しました" showOnRemote: "リモートで表示" general: "全般" +accountMoved: "このユーザーは新しいアカウントに移行しました" wallpaper: "壁紙" setWallpaper: "壁紙を設定" removeWallpaper: "壁紙を削除" diff --git a/packages/backend/src/models/repositories/user.ts b/packages/backend/src/models/repositories/user.ts index 5c46ae27a..47ab1fc9e 100644 --- a/packages/backend/src/models/repositories/user.ts +++ b/packages/backend/src/models/repositories/user.ts @@ -1,16 +1,38 @@ -import { EntityRepository, Repository, In, Not } from 'typeorm'; +import {In, Not} from 'typeorm'; import Ajv from 'ajv'; -import { User, ILocalUser, IRemoteUser } from '@/models/entities/user.js'; +import {ILocalUser, IRemoteUser, User} from '@/models/entities/user.js'; import config from '@/config/index.js'; -import { Packed } from '@/misc/schema.js'; -import { awaitAll, Promiseable } from '@/prelude/await-all.js'; -import { populateEmojis } from '@/misc/populate-emojis.js'; -import { getAntennas } from '@/misc/antenna-cache.js'; -import { USER_ACTIVE_THRESHOLD, USER_ONLINE_THRESHOLD } from '@/const.js'; -import { Cache } from '@/misc/cache.js'; -import { db } from '@/db/postgre.js'; -import { Instance } from '../entities/instance.js'; -import { Notes, NoteUnreads, FollowRequests, Notifications, MessagingMessages, UserNotePinings, Followings, Blockings, Mutings, UserProfiles, UserSecurityKeys, UserGroupJoinings, Pages, Announcements, AnnouncementReads, Antennas, AntennaNotes, ChannelFollowings, Instances, DriveFiles } from '../index.js'; +import {Packed} from '@/misc/schema.js'; +import {awaitAll, Promiseable} from '@/prelude/await-all.js'; +import {populateEmojis} from '@/misc/populate-emojis.js'; +import {getAntennas} from '@/misc/antenna-cache.js'; +import {USER_ACTIVE_THRESHOLD, USER_ONLINE_THRESHOLD} from '@/const.js'; +import {Cache} from '@/misc/cache.js'; +import {db} from '@/db/postgre.js'; +import {Instance} from '../entities/instance.js'; +import {resolveUser} from "@/remote/resolve-user"; +import {URL} from "url"; +import { + AnnouncementReads, + Announcements, + AntennaNotes, + Blockings, + ChannelFollowings, + DriveFiles, + Followings, + FollowRequests, + Instances, + MessagingMessages, + Mutings, + Notes, + NoteUnreads, + Notifications, + Pages, + UserGroupJoinings, + UserNotePinings, + UserProfiles, + UserSecurityKeys +} from '../index.js'; const userInstanceCache = new Cache(1000 * 60 * 60 * 3); @@ -156,6 +178,23 @@ export const UserRepository = db.getRepository(User).extend({ return count > 0; }, + async userFromURI(uri: string): Promise { + if (uri.startsWith(config.url + '/')) { + const id = uri.split('/').pop(); + if (id == undefined) return null; + return await resolveUser(id, null); + } + + let url = new URL(uri); + let userTag = url.pathname; + + if (userTag.startsWith("@")) { + userTag = userTag.substring(1); + } + + return await resolveUser(userTag, url.host); + }, + async getHasUnreadAntenna(userId: User['id']): Promise { const myAntennas = (await getAntennas()).filter(a => a.userId === userId); @@ -320,6 +359,8 @@ export const UserRepository = db.getRepository(User).extend({ ...(opts.detail ? { url: profile!.url, uri: user.uri, + movedTo: user.movedToUri ? await this.userFromURI(user.movedToUri) : null, + alsoKnownAs: user.alsoKnownAs, createdAt: user.createdAt.toISOString(), updatedAt: user.updatedAt ? user.updatedAt.toISOString() : null, lastFetchedAt: user.lastFetchedAt ? user.lastFetchedAt.toISOString() : null, diff --git a/packages/backend/src/models/schema/user.ts b/packages/backend/src/models/schema/user.ts index 218d861e5..95827272f 100644 --- a/packages/backend/src/models/schema/user.ts +++ b/packages/backend/src/models/schema/user.ts @@ -96,6 +96,16 @@ export const packedUserDetailedNotMeOnlySchema = { format: 'uri', nullable: true, optional: false, }, + movedTo: { + type: 'string', + format: 'uri', + nullable: true, optional: false, + }, + alsoKnownAs: { + type: 'array', + format: 'uri', + nullable: true, optional: false, + }, createdAt: { type: 'string', nullable: false, optional: false, diff --git a/packages/client/src/components/MkMoved.vue b/packages/client/src/components/MkMoved.vue new file mode 100644 index 000000000..f5ec1a567 --- /dev/null +++ b/packages/client/src/components/MkMoved.vue @@ -0,0 +1,25 @@ + + + + + diff --git a/packages/client/src/pages/user/home.vue b/packages/client/src/pages/user/home.vue index b0ff75eef..e8e111cae 100644 --- a/packages/client/src/pages/user/home.vue +++ b/packages/client/src/pages/user/home.vue @@ -8,6 +8,7 @@
+