]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - server/helpers/custom-validators/activitypub/actor.ts
Fix http token interceptor
[github/Chocobozzz/PeerTube.git] / server / helpers / custom-validators / activitypub / actor.ts
CommitLineData
fadf619a
C
1import * as validator from 'validator'
2import { CONSTRAINTS_FIELDS } from '../../../initializers'
e12a0092 3import { exists } from '../misc'
50d6de9c 4import { isActivityPubUrlValid, isBaseActivityValid, setValidAttributedTo } from './misc'
fadf619a
C
5
6function isActorEndpointsObjectValid (endpointObject: any) {
7 return isActivityPubUrlValid(endpointObject.sharedInbox)
8}
9
10function isActorPublicKeyObjectValid (publicKeyObject: any) {
11 return isActivityPubUrlValid(publicKeyObject.id) &&
12 isActivityPubUrlValid(publicKeyObject.owner) &&
13 isActorPublicKeyValid(publicKeyObject.publicKeyPem)
14}
15
16function isActorTypeValid (type: string) {
17 return type === 'Person' || type === 'Application' || type === 'Group'
18}
19
20function isActorPublicKeyValid (publicKey: string) {
21 return exists(publicKey) &&
22 typeof publicKey === 'string' &&
23 publicKey.startsWith('-----BEGIN PUBLIC KEY-----') &&
e12a0092 24 publicKey.indexOf('-----END PUBLIC KEY-----') !== -1 &&
01de67b9 25 validator.isLength(publicKey, CONSTRAINTS_FIELDS.ACTORS.PUBLIC_KEY)
fadf619a
C
26}
27
e12a0092 28const actorNameRegExp = new RegExp('[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_]+')
fadf619a 29function isActorPreferredUsernameValid (preferredUsername: string) {
e12a0092 30 return exists(preferredUsername) && validator.matches(preferredUsername, actorNameRegExp)
50d6de9c
C
31}
32
fadf619a
C
33function isActorPrivateKeyValid (privateKey: string) {
34 return exists(privateKey) &&
35 typeof privateKey === 'string' &&
36 privateKey.startsWith('-----BEGIN RSA PRIVATE KEY-----') &&
e12a0092
C
37 // Sometimes there is a \n at the end, so just assert the string contains the end mark
38 privateKey.indexOf('-----END RSA PRIVATE KEY-----') !== -1 &&
01de67b9 39 validator.isLength(privateKey, CONSTRAINTS_FIELDS.ACTORS.PRIVATE_KEY)
fadf619a
C
40}
41
265ba139
C
42function isActorObjectValid (actor: any) {
43 return exists(actor) &&
44 isActivityPubUrlValid(actor.id) &&
45 isActorTypeValid(actor.type) &&
46 isActivityPubUrlValid(actor.following) &&
47 isActivityPubUrlValid(actor.followers) &&
48 isActivityPubUrlValid(actor.inbox) &&
49 isActivityPubUrlValid(actor.outbox) &&
50 isActorPreferredUsernameValid(actor.preferredUsername) &&
51 isActivityPubUrlValid(actor.url) &&
52 isActorPublicKeyObjectValid(actor.publicKey) &&
53 isActorEndpointsObjectValid(actor.endpoints) &&
54 setValidAttributedTo(actor) &&
50d6de9c
C
55 // If this is not an account, it should be attributed to an account
56 // In PeerTube we use this to attach a video channel to a specific account
265ba139 57 (actor.type === 'Person' || actor.attributedTo.length !== 0)
fadf619a
C
58}
59
60function isActorFollowingCountValid (value: string) {
61 return exists(value) && validator.isInt('' + value, { min: 0 })
62}
63
64function isActorFollowersCountValid (value: string) {
65 return exists(value) && validator.isInt('' + value, { min: 0 })
66}
67
68function isActorDeleteActivityValid (activity: any) {
69 return isBaseActivityValid(activity, 'Delete')
70}
71
72function isActorFollowActivityValid (activity: any) {
73 return isBaseActivityValid(activity, 'Follow') &&
74 isActivityPubUrlValid(activity.object)
75}
76
77function isActorAcceptActivityValid (activity: any) {
78 return isBaseActivityValid(activity, 'Accept')
79}
80
265ba139
C
81function isActorUpdateActivityValid (activity: any) {
82 return isBaseActivityValid(activity, 'Update') &&
83 isActorObjectValid(activity.object)
84}
85
fadf619a
C
86// ---------------------------------------------------------------------------
87
88export {
89 isActorEndpointsObjectValid,
90 isActorPublicKeyObjectValid,
91 isActorTypeValid,
92 isActorPublicKeyValid,
93 isActorPreferredUsernameValid,
94 isActorPrivateKeyValid,
265ba139 95 isActorObjectValid,
fadf619a
C
96 isActorFollowingCountValid,
97 isActorFollowersCountValid,
98 isActorFollowActivityValid,
99 isActorAcceptActivityValid,
50d6de9c 100 isActorDeleteActivityValid,
265ba139 101 isActorUpdateActivityValid
fadf619a 102}