X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Fhelpers%2Fcustom-validators%2Factivitypub%2Factor.ts;h=070632a20cbd77ab6d3c7e169460a4608b930b6f;hb=44b9c0ba31c4a97e3d874f33226ad935c3a90dd5;hp=e1a4b5b8f8a40d880b281ebaa1757e2708aeea72;hpb=cf117aaafc1e9ae1ab4c388fc5d2e5ba9349efee;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/helpers/custom-validators/activitypub/actor.ts b/server/helpers/custom-validators/activitypub/actor.ts index e1a4b5b8f..070632a20 100644 --- a/server/helpers/custom-validators/activitypub/actor.ts +++ b/server/helpers/custom-validators/activitypub/actor.ts @@ -1,7 +1,9 @@ import * as validator from 'validator' import { CONSTRAINTS_FIELDS } from '../../../initializers' -import { exists } from '../misc' +import { exists, isArray } from '../misc' +import { truncate } from 'lodash' import { isActivityPubUrlValid, isBaseActivityValid, setValidAttributedTo } from './misc' +import { isHostValid } from '../servers' function isActorEndpointsObjectValid (endpointObject: any) { return isActivityPubUrlValid(endpointObject.sharedInbox) @@ -25,7 +27,8 @@ function isActorPublicKeyValid (publicKey: string) { validator.isLength(publicKey, CONSTRAINTS_FIELDS.ACTORS.PUBLIC_KEY) } -const actorNameRegExp = new RegExp('[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_]+') +const actorNameAlphabet = '[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\\-_.]' +const actorNameRegExp = new RegExp(`^${actorNameAlphabet}+$`) function isActorPreferredUsernameValid (preferredUsername: string) { return exists(preferredUsername) && validator.matches(preferredUsername, actorNameRegExp) } @@ -52,6 +55,7 @@ function isActorObjectValid (actor: any) { isActorPublicKeyObjectValid(actor.publicKey) && isActorEndpointsObjectValid(actor.endpoints) && setValidAttributedTo(actor) && + // If this is not an account, it should be attributed to an account // In PeerTube we use this to attach a video channel to a specific account (actor.type === 'Person' || actor.attributedTo.length !== 0) @@ -78,14 +82,54 @@ function isActorAcceptActivityValid (activity: any) { return isBaseActivityValid(activity, 'Accept') } +function isActorRejectActivityValid (activity: any) { + return isBaseActivityValid(activity, 'Reject') +} + function isActorUpdateActivityValid (activity: any) { + normalizeActor(activity.object) + return isBaseActivityValid(activity, 'Update') && isActorObjectValid(activity.object) } +function normalizeActor (actor: any) { + if (!actor || !actor.url) return + + if (typeof actor.url !== 'string') { + actor.url = actor.url.href || actor.url.url + } + + if (actor.summary && typeof actor.summary === 'string') { + actor.summary = truncate(actor.summary, { length: CONSTRAINTS_FIELDS.USERS.DESCRIPTION.max }) + + if (actor.summary.length < CONSTRAINTS_FIELDS.USERS.DESCRIPTION.min) { + actor.summary = null + } + } + + return +} + +function isValidActorHandle (handle: string) { + if (!exists(handle)) return false + + const parts = handle.split('@') + if (parts.length !== 2) return false + + return isHostValid(parts[1]) +} + +function areValidActorHandles (handles: string[]) { + return isArray(handles) && handles.every(h => isValidActorHandle(h)) +} + // --------------------------------------------------------------------------- export { + normalizeActor, + actorNameAlphabet, + areValidActorHandles, isActorEndpointsObjectValid, isActorPublicKeyObjectValid, isActorTypeValid, @@ -97,6 +141,8 @@ export { isActorFollowersCountValid, isActorFollowActivityValid, isActorAcceptActivityValid, + isActorRejectActivityValid, isActorDeleteActivityValid, - isActorUpdateActivityValid + isActorUpdateActivityValid, + isValidActorHandle }