summaryrefslogtreecommitdiff
path: root/src/remote/activitypub/models
diff options
context:
space:
mode:
authorAcid Chicken (硫酸鶏) <root@acid-chicken.com>2019-01-24 17:33:39 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2019-01-24 17:33:39 +0900
commite2f7e82cac65938b6d494aceb5c1c1fc3fbe865e (patch)
tree2cee13e18daea375e463fda2ae950f1a48b3a4b9 /src/remote/activitypub/models
parentBack to the #3813 (#3949) (diff)
downloadsharkey-e2f7e82cac65938b6d494aceb5c1c1fc3fbe865e.tar.gz
sharkey-e2f7e82cac65938b6d494aceb5c1c1fc3fbe865e.tar.bz2
sharkey-e2f7e82cac65938b6d494aceb5c1c1fc3fbe865e.zip
外部サービス認証情報の配信 (#3975)
* Update person.ts * Update person.ts * Update person.ts * Update person.ts * Create original model * Make type formal * Update person.ts * Follow @mei23's review refs: https://github.com/syuilo/misskey/pull/3975#pullrequestreview-195770172
Diffstat (limited to 'src/remote/activitypub/models')
-rw-r--r--src/remote/activitypub/models/identifier.ts5
-rw-r--r--src/remote/activitypub/models/person.ts76
-rw-r--r--src/remote/activitypub/models/tag.ts2
3 files changed, 67 insertions, 16 deletions
diff --git a/src/remote/activitypub/models/identifier.ts b/src/remote/activitypub/models/identifier.ts
new file mode 100644
index 0000000000..f6c3bb8c88
--- /dev/null
+++ b/src/remote/activitypub/models/identifier.ts
@@ -0,0 +1,5 @@
+export type IIdentifier = {
+ type: string;
+ name: string;
+ value: string;
+};
diff --git a/src/remote/activitypub/models/person.ts b/src/remote/activitypub/models/person.ts
index cbde5dc698..c7a76b4bd6 100644
--- a/src/remote/activitypub/models/person.ts
+++ b/src/remote/activitypub/models/person.ts
@@ -19,6 +19,7 @@ import getDriveFileUrl from '../../../misc/get-drive-file-url';
import { IEmoji } from '../../../models/emoji';
import { ITag } from './tag';
import Following from '../../../models/following';
+import { IIdentifier } from './identifier';
const log = debug('misskey:activitypub');
@@ -137,9 +138,7 @@ export async function createPerson(uri: string, resolver?: Resolver): Promise<IU
const host = toUnicode(new URL(object.id).hostname.toLowerCase());
- const fields = await extractFields(person.attachment).catch(e => {
- console.log(`cat not extract fields: ${e}`);
- });
+ const { fields, services } = analyzeAttachments(person.attachment);
const isBot = object.type == 'Service';
@@ -171,7 +170,8 @@ export async function createPerson(uri: string, resolver?: Resolver): Promise<IU
uri: person.id,
url: person.url,
fields,
- isBot: isBot,
+ ...services,
+ isBot,
isCat: (person as any).isCat === true
}) as IRemoteUser;
} catch (e) {
@@ -332,9 +332,7 @@ export async function updatePerson(uri: string, resolver?: Resolver, hint?: obje
const emojiNames = emojis.map(emoji => emoji.name);
- const fields = await extractFields(person.attachment).catch(e => {
- console.log(`cat not extract fields: ${e}`);
- });
+ const { fields, services } = analyzeAttachments(person.attachment);
const updates = {
lastFetchedAt: new Date(),
@@ -350,6 +348,7 @@ export async function updatePerson(uri: string, resolver?: Resolver, hint?: obje
url: person.url,
endpoints: person.endpoints,
fields,
+ ...services,
isBot: object.type == 'Service',
isCat: (person as any).isCat === true,
isLocked: person.manuallyApprovesFollowers,
@@ -413,16 +412,61 @@ export async function resolvePerson(uri: string, verifier?: string, resolver?: R
return await createPerson(uri, resolver);
}
-export async function extractFields(attachments: ITag[]) {
- if (!attachments) return [];
+const isPropertyValue = (x: {
+ type: string,
+ name?: string,
+ value?: string
+ }) =>
+ x &&
+ x.type === 'PropertyValue' &&
+ typeof x.name === 'string' &&
+ typeof x.value === 'string';
- return attachments.filter(a => a.type === 'PropertyValue' && a.name && a.value)
- .map(a => {
- return {
- name: a.name,
- value: htmlToMFM(a.value)
- };
- });
+const services: {
+ [x: string]: (id: string, username: string) => any
+ } = {
+ 'misskey:authentication:twitter': (userId, screenName) => ({ userId, screenName }),
+ 'misskey:authentication:github': (id, login) => ({ id, login }),
+ 'misskey:authentication:discord': (id, name) => $discord(id, name)
+};
+
+const $discord = (id: string, name: string) => {
+ if (typeof name !== 'string')
+ name = 'unknown#0000';
+ const [username, discriminator] = name.split('#');
+ return { id, username, discriminator };
+};
+
+function addService(target: { [x: string]: any }, source: IIdentifier) {
+ const service = services[source.name];
+
+ if (typeof source.value !== 'string')
+ source.value = 'unknown';
+
+ const [id, username] = source.value.split('@');
+
+ if (service)
+ target[source.name.split(':')[2]] = service(id, username);
+}
+
+export function analyzeAttachments(attachments: ITag[]) {
+ const fields: {
+ name: string,
+ value: string
+ }[] = [];
+ const services: { [x: string]: any } = {};
+
+ if (Array.isArray(attachments))
+ for (const attachment of attachments.filter(isPropertyValue))
+ if (isPropertyValue(attachment.identifier))
+ addService(services, attachment.identifier);
+ else
+ fields.push({
+ name: attachment.name,
+ value: htmlToMFM(attachment.value)
+ });
+
+ return { fields, services };
}
export async function updateFeatured(userId: mongo.ObjectID) {
diff --git a/src/remote/activitypub/models/tag.ts b/src/remote/activitypub/models/tag.ts
index 347e001aec..b64d6bd4a7 100644
--- a/src/remote/activitypub/models/tag.ts
+++ b/src/remote/activitypub/models/tag.ts
@@ -1,4 +1,5 @@
import { IIcon } from './icon';
+import { IIdentifier } from './identifier';
/***
* tag (ActivityPub)
@@ -10,4 +11,5 @@ export type ITag = {
value?: string;
updated?: Date;
icon?: IIcon;
+ identifier?: IIdentifier;
};