Support actors with array url field
This commit is contained in:
parent
1870626af5
commit
a86252b399
2 changed files with 31 additions and 36 deletions
|
@ -15,6 +15,16 @@ export function arrayify <T> (element: T | T[]) {
|
|||
return [ element ]
|
||||
}
|
||||
|
||||
export function unarray <T> (element: T | T[]) {
|
||||
if (Array.isArray(element)) {
|
||||
if (element.length === 0) return undefined
|
||||
|
||||
return element[0]
|
||||
}
|
||||
|
||||
return element
|
||||
}
|
||||
|
||||
// Avoid conflict with other uniq() functions
|
||||
export function uniqify <T> (elements: T[]) {
|
||||
return Array.from(new Set(elements))
|
||||
|
|
|
@ -1,11 +1,12 @@
|
|||
import { unarray } from '@peertube/peertube-core-utils'
|
||||
import { peertubeTruncate } from '@server/helpers/core-utils.js'
|
||||
import validator from 'validator'
|
||||
import { CONSTRAINTS_FIELDS } from '../../../initializers/constants.js'
|
||||
import { exists, isArray, isDateValid } from '../misc.js'
|
||||
import { isActivityPubUrlValid, isBaseActivityValid, setValidAttributedTo } from './misc.js'
|
||||
import { isHostValid } from '../servers.js'
|
||||
import { peertubeTruncate } from '@server/helpers/core-utils.js'
|
||||
import { isActivityPubUrlValid, isBaseActivityValid, setValidAttributedTo } from './misc.js'
|
||||
|
||||
function isActorEndpointsObjectValid (endpointObject: any) {
|
||||
export function isActorEndpointsObjectValid (endpointObject: any) {
|
||||
if (endpointObject?.sharedInbox) {
|
||||
return isActivityPubUrlValid(endpointObject.sharedInbox)
|
||||
}
|
||||
|
@ -14,18 +15,18 @@ function isActorEndpointsObjectValid (endpointObject: any) {
|
|||
return true
|
||||
}
|
||||
|
||||
function isActorPublicKeyObjectValid (publicKeyObject: any) {
|
||||
export function isActorPublicKeyObjectValid (publicKeyObject: any) {
|
||||
return isActivityPubUrlValid(publicKeyObject.id) &&
|
||||
isActivityPubUrlValid(publicKeyObject.owner) &&
|
||||
isActorPublicKeyValid(publicKeyObject.publicKeyPem)
|
||||
}
|
||||
|
||||
const actorTypes = new Set([ 'Person', 'Application', 'Group', 'Service', 'Organization' ])
|
||||
function isActorTypeValid (type: string) {
|
||||
export function isActorTypeValid (type: string) {
|
||||
return actorTypes.has(type)
|
||||
}
|
||||
|
||||
function isActorPublicKeyValid (publicKey: string) {
|
||||
export function isActorPublicKeyValid (publicKey: string) {
|
||||
return exists(publicKey) &&
|
||||
typeof publicKey === 'string' &&
|
||||
publicKey.startsWith('-----BEGIN PUBLIC KEY-----') &&
|
||||
|
@ -33,13 +34,14 @@ function isActorPublicKeyValid (publicKey: string) {
|
|||
validator.default.isLength(publicKey, CONSTRAINTS_FIELDS.ACTORS.PUBLIC_KEY)
|
||||
}
|
||||
|
||||
const actorNameAlphabet = '[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\\-_.:]'
|
||||
export const actorNameAlphabet = '[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\\-_.:]'
|
||||
|
||||
const actorNameRegExp = new RegExp(`^${actorNameAlphabet}+$`)
|
||||
function isActorPreferredUsernameValid (preferredUsername: string) {
|
||||
export function isActorPreferredUsernameValid (preferredUsername: string) {
|
||||
return exists(preferredUsername) && validator.default.matches(preferredUsername, actorNameRegExp)
|
||||
}
|
||||
|
||||
function isActorPrivateKeyValid (privateKey: string) {
|
||||
export function isActorPrivateKeyValid (privateKey: string) {
|
||||
return exists(privateKey) &&
|
||||
typeof privateKey === 'string' &&
|
||||
(privateKey.startsWith('-----BEGIN RSA PRIVATE KEY-----') || privateKey.startsWith('-----BEGIN PRIVATE KEY-----')) &&
|
||||
|
@ -48,19 +50,19 @@ function isActorPrivateKeyValid (privateKey: string) {
|
|||
validator.default.isLength(privateKey, CONSTRAINTS_FIELDS.ACTORS.PRIVATE_KEY)
|
||||
}
|
||||
|
||||
function isActorFollowingCountValid (value: string) {
|
||||
export function isActorFollowingCountValid (value: string) {
|
||||
return exists(value) && validator.default.isInt('' + value, { min: 0 })
|
||||
}
|
||||
|
||||
function isActorFollowersCountValid (value: string) {
|
||||
export function isActorFollowersCountValid (value: string) {
|
||||
return exists(value) && validator.default.isInt('' + value, { min: 0 })
|
||||
}
|
||||
|
||||
function isActorDeleteActivityValid (activity: any) {
|
||||
export function isActorDeleteActivityValid (activity: any) {
|
||||
return isBaseActivityValid(activity, 'Delete')
|
||||
}
|
||||
|
||||
function sanitizeAndCheckActorObject (actor: any) {
|
||||
export function sanitizeAndCheckActorObject (actor: any) {
|
||||
if (!isActorTypeValid(actor.type)) return false
|
||||
|
||||
normalizeActor(actor)
|
||||
|
@ -84,11 +86,13 @@ function sanitizeAndCheckActorObject (actor: any) {
|
|||
(actor.type !== 'Group' || actor.attributedTo.length !== 0)
|
||||
}
|
||||
|
||||
function normalizeActor (actor: any) {
|
||||
export function normalizeActor (actor: any) {
|
||||
if (!actor) return
|
||||
|
||||
if (!actor.url) {
|
||||
actor.url = actor.id
|
||||
} else if (isArray(actor.url)) {
|
||||
actor.url = unarray(actor.url)
|
||||
} else if (typeof actor.url !== 'string') {
|
||||
actor.url = actor.url.href || actor.url.url
|
||||
}
|
||||
|
@ -104,7 +108,7 @@ function normalizeActor (actor: any) {
|
|||
}
|
||||
}
|
||||
|
||||
function isValidActorHandle (handle: string) {
|
||||
export function isValidActorHandle (handle: string) {
|
||||
if (!exists(handle)) return false
|
||||
|
||||
const parts = handle.split('@')
|
||||
|
@ -113,31 +117,12 @@ function isValidActorHandle (handle: string) {
|
|||
return isHostValid(parts[1])
|
||||
}
|
||||
|
||||
function areValidActorHandles (handles: string[]) {
|
||||
export function areValidActorHandles (handles: string[]) {
|
||||
return isArray(handles) && handles.every(h => isValidActorHandle(h))
|
||||
}
|
||||
|
||||
function setValidDescription (obj: any) {
|
||||
export function setValidDescription (obj: any) {
|
||||
if (!obj.summary) obj.summary = null
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
export {
|
||||
normalizeActor,
|
||||
actorNameAlphabet,
|
||||
areValidActorHandles,
|
||||
isActorEndpointsObjectValid,
|
||||
isActorPublicKeyObjectValid,
|
||||
isActorTypeValid,
|
||||
isActorPublicKeyValid,
|
||||
isActorPreferredUsernameValid,
|
||||
isActorPrivateKeyValid,
|
||||
isActorFollowingCountValid,
|
||||
isActorFollowersCountValid,
|
||||
isActorDeleteActivityValid,
|
||||
sanitizeAndCheckActorObject,
|
||||
isValidActorHandle
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue