]>
Commit | Line | Data |
---|---|---|
1 | import { isActivityPubUrlValid } from '@server/helpers/custom-validators/activitypub/misc' | |
2 | import { MIMETYPES } from '@server/initializers/constants' | |
3 | import { ActorModel } from '@server/models/actor/actor' | |
4 | import { FilteredModelAttributes } from '@server/types' | |
5 | import { getLowercaseExtension } from '@shared/core-utils' | |
6 | import { buildUUID } from '@shared/extra-utils' | |
7 | import { ActivityIconObject, ActivityPubActor, ActorImageType } from '@shared/models' | |
8 | ||
9 | function getActorAttributesFromObject ( | |
10 | actorObject: ActivityPubActor, | |
11 | followersCount: number, | |
12 | followingCount: number | |
13 | ): FilteredModelAttributes<ActorModel> { | |
14 | return { | |
15 | type: actorObject.type, | |
16 | preferredUsername: actorObject.preferredUsername, | |
17 | url: actorObject.id, | |
18 | publicKey: actorObject.publicKey.publicKeyPem, | |
19 | privateKey: null, | |
20 | followersCount, | |
21 | followingCount, | |
22 | inboxUrl: actorObject.inbox, | |
23 | outboxUrl: actorObject.outbox, | |
24 | followersUrl: actorObject.followers, | |
25 | followingUrl: actorObject.following, | |
26 | ||
27 | sharedInboxUrl: actorObject.endpoints?.sharedInbox | |
28 | ? actorObject.endpoints.sharedInbox | |
29 | : null | |
30 | } | |
31 | } | |
32 | ||
33 | function getImagesInfoFromObject (actorObject: ActivityPubActor, type: ActorImageType) { | |
34 | const iconsOrImages = type === ActorImageType.AVATAR | |
35 | ? actorObject.icons || actorObject.icon | |
36 | : actorObject.image | |
37 | ||
38 | return normalizeIconOrImage(iconsOrImages).map(iconOrImage => { | |
39 | const mimetypes = MIMETYPES.IMAGE | |
40 | ||
41 | if (iconOrImage.type !== 'Image' || !isActivityPubUrlValid(iconOrImage.url)) return undefined | |
42 | ||
43 | let extension: string | |
44 | ||
45 | if (iconOrImage.mediaType) { | |
46 | extension = mimetypes.MIMETYPE_EXT[iconOrImage.mediaType] | |
47 | } else { | |
48 | const tmp = getLowercaseExtension(iconOrImage.url) | |
49 | ||
50 | if (mimetypes.EXT_MIMETYPE[tmp] !== undefined) extension = tmp | |
51 | } | |
52 | ||
53 | if (!extension) return undefined | |
54 | ||
55 | return { | |
56 | name: buildUUID() + extension, | |
57 | fileUrl: iconOrImage.url, | |
58 | height: iconOrImage.height, | |
59 | width: iconOrImage.width, | |
60 | type | |
61 | } | |
62 | }) | |
63 | } | |
64 | ||
65 | function getActorDisplayNameFromObject (actorObject: ActivityPubActor) { | |
66 | return actorObject.name || actorObject.preferredUsername | |
67 | } | |
68 | ||
69 | export { | |
70 | getActorAttributesFromObject, | |
71 | getImagesInfoFromObject, | |
72 | getActorDisplayNameFromObject | |
73 | } | |
74 | ||
75 | // --------------------------------------------------------------------------- | |
76 | ||
77 | function normalizeIconOrImage (icon: ActivityIconObject | ActivityIconObject[]): ActivityIconObject[] { | |
78 | if (Array.isArray(icon)) return icon | |
79 | if (icon) return [ icon ] | |
80 | ||
81 | return [] | |
82 | } |