From 0c7a89a70a88fd779d68e1262b7fbbc44e71b63e Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Mon, 16 Jun 2025 11:00:47 +0200 Subject: [PATCH] Put ap:public in cc for unlisted data --- server/core/controllers/activitypub/client.ts | 20 +++----- server/core/controllers/activitypub/outbox.ts | 6 +-- server/core/helpers/activity-pub-utils.ts | 4 +- .../activitypub/video-comments.ts | 2 +- server/core/lib/activitypub/audience.ts | 51 +++++++++++++++---- .../lib/activitypub/send/send-announce.ts | 4 +- .../core/lib/activitypub/send/send-create.ts | 18 +++---- .../core/lib/activitypub/send/send-dislike.ts | 4 +- server/core/lib/activitypub/send/send-flag.ts | 4 +- server/core/lib/activitypub/send/send-like.ts | 4 +- server/core/lib/activitypub/send/send-undo.ts | 6 +-- .../core/lib/activitypub/send/send-update.ts | 12 ++--- server/core/lib/activitypub/send/send-view.ts | 4 +- .../exporters/comments-exporter.ts | 16 +++--- .../exporters/videos-exporter.ts | 4 +- 15 files changed, 90 insertions(+), 69 deletions(-) diff --git a/server/core/controllers/activitypub/client.ts b/server/core/controllers/activitypub/client.ts index fe3657cb2..a83c0a911 100644 --- a/server/core/controllers/activitypub/client.ts +++ b/server/core/controllers/activitypub/client.ts @@ -1,11 +1,4 @@ -import { - HttpStatusCode, - VideoChaptersObject, - VideoCommentObject, - VideoPlaylistPrivacy, - VideoPrivacy, - VideoRateType -} from '@peertube/peertube-models' +import { HttpStatusCode, VideoChaptersObject, VideoCommentObject, VideoRateType } from '@peertube/peertube-models' import { activityPubCollectionPagination } from '@server/lib/activitypub/collection.js' import { getContextFilter } from '@server/lib/activitypub/context.js' import { buildChaptersAPHasPart } from '@server/lib/activitypub/video-chapters.js' @@ -17,7 +10,7 @@ import cors from 'cors' import express from 'express' import { activityPubContextify } from '../../helpers/activity-pub-utils.js' import { ROUTE_CACHE_LIFETIME, WEBSERVER } from '../../initializers/constants.js' -import { audiencify, getAudience } from '../../lib/activitypub/audience.js' +import { audiencify, getPlaylistAudience, getPublicAudience, getVideoAudience } from '../../lib/activitypub/audience.js' import { buildAnnounceWithVideoAudience, buildApprovalActivity, buildLikeActivity } from '../../lib/activitypub/send/index.js' import { buildCreateActivity } from '../../lib/activitypub/send/send-create.js' import { buildDislikeActivity } from '../../lib/activitypub/send/send-dislike.js' @@ -330,7 +323,7 @@ async function videoController (req: express.Request, res: express.Response) { // We need captions to render AP object const videoAP = await video.lightAPToFullAP(undefined) - const audience = getAudience(videoAP.VideoChannel.Account.Actor, videoAP.privacy === VideoPrivacy.PUBLIC) + const audience = getVideoAudience(videoAP.VideoChannel.Account.Actor, videoAP.privacy) const videoObject = audiencify(await videoAP.toActivityPubObject(), audience) if (req.path.endsWith('/activity')) { @@ -434,11 +427,10 @@ async function videoCommentController (req: express.Request, res: express.Respon const threadParentComments = await VideoCommentModel.listThreadParentComments({ comment: videoComment }) - const isPublic = true // Comments are always public let videoCommentObject = videoComment.toActivityPubObject(threadParentComments) if (videoComment.Account) { - const audience = getAudience(videoComment.Account.Actor, isPublic) + const audience = getPublicAudience(videoComment.Account.Actor) videoCommentObject = audiencify(videoCommentObject, audience) if (req.path.endsWith('/activity')) { @@ -482,7 +474,7 @@ async function videoRedundancyController (req: express.Request, res: express.Res const serverActor = await getServerActor() - const audience = getAudience(serverActor) + const audience = getPublicAudience(serverActor) const object = audiencify(videoRedundancy.toActivityPubObject(), audience) if (req.path.endsWith('/activity')) { @@ -502,7 +494,7 @@ async function videoPlaylistController (req: express.Request, res: express.Respo playlist.OwnerAccount = await AccountModel.load(playlist.ownerAccountId) const json = await playlist.toActivityPubObject(req.query.page, null) - const audience = getAudience(playlist.OwnerAccount.Actor, playlist.privacy === VideoPlaylistPrivacy.PUBLIC) + const audience = getPlaylistAudience(playlist.OwnerAccount.Actor, playlist.privacy) const object = audiencify(json, audience) return activityPubResponse(activityPubContextify(object, 'Playlist', getContextFilter()), res) diff --git a/server/core/controllers/activitypub/outbox.ts b/server/core/controllers/activitypub/outbox.ts index d3ecd848a..40f36151d 100644 --- a/server/core/controllers/activitypub/outbox.ts +++ b/server/core/controllers/activitypub/outbox.ts @@ -1,11 +1,11 @@ -import { Activity, VideoPrivacy } from '@peertube/peertube-models' +import { Activity } from '@peertube/peertube-models' import { activityPubContextify } from '@server/helpers/activity-pub-utils.js' import { activityPubCollectionPagination } from '@server/lib/activitypub/collection.js' import { getContextFilter } from '@server/lib/activitypub/context.js' import { MActorLight } from '@server/types/models/index.js' import express from 'express' import { logger } from '../../helpers/logger.js' -import { buildAudience } from '../../lib/activitypub/audience.js' +import { getVideoAudience } from '../../lib/activitypub/audience.js' import { buildAnnounceActivity, buildCreateActivity } from '../../lib/activitypub/send/index.js' import { accountHandleGetValidatorFactory, @@ -62,7 +62,7 @@ async function buildActivities (actor: MActorLight, start: number, count: number for (const video of data.data) { const byActor = video.VideoChannel.Account.Actor - const createActivityAudience = buildAudience([ byActor.followersUrl ], video.privacy === VideoPrivacy.PUBLIC) + const createActivityAudience = getVideoAudience(byActor, video.privacy) // This is a shared video if (video.VideoShares !== undefined && video.VideoShares.length !== 0) { diff --git a/server/core/helpers/activity-pub-utils.ts b/server/core/helpers/activity-pub-utils.ts index e94ca91ec..cff756ea1 100644 --- a/server/core/helpers/activity-pub-utils.ts +++ b/server/core/helpers/activity-pub-utils.ts @@ -54,10 +54,10 @@ export function getAPPublicValue (): 'https://www.w3.org/ns/activitystreams#Publ return 'https://www.w3.org/ns/activitystreams#Public' } -export function hasAPPublic (toOrCC: string[] | string) { +export function hasAPPublic (collection: string[] | string) { const publicValue = getAPPublicValue() - return arrayify(toOrCC).some(f => f === 'as:Public' || publicValue) + return arrayify(collection).some(f => f === 'as:Public' || publicValue) } // --------------------------------------------------------------------------- diff --git a/server/core/helpers/custom-validators/activitypub/video-comments.ts b/server/core/helpers/custom-validators/activitypub/video-comments.ts index a5eeff671..91bce4c31 100644 --- a/server/core/helpers/custom-validators/activitypub/video-comments.ts +++ b/server/core/helpers/custom-validators/activitypub/video-comments.ts @@ -24,7 +24,7 @@ function sanitizeAndCheckVideoCommentObject (comment: VideoCommentObject | Activ isDateValid(comment.published) && isActivityPubUrlValid(comment.url) && (!exists(comment.replyApproval) || isActivityPubUrlValid(comment.replyApproval)) && - (hasAPPublic(comment.to) || hasAPPublic(comment.cc)) // Only accept public comments + (hasAPPublic(comment.to) || hasAPPublic(comment.cc)) // Only accept public or unlisted comments } // --------------------------------------------------------------------------- diff --git a/server/core/lib/activitypub/audience.ts b/server/core/lib/activitypub/audience.ts index 6bbc56cdd..0aba9f36d 100644 --- a/server/core/lib/activitypub/audience.ts +++ b/server/core/lib/activitypub/audience.ts @@ -1,26 +1,57 @@ -import { ActivityAudience } from '@peertube/peertube-models' +import { ActivityAudience, VideoPlaylistPrivacy, VideoPlaylistPrivacyType, VideoPrivacy, VideoPrivacyType } from '@peertube/peertube-models' import { getAPPublicValue } from '@server/helpers/activity-pub-utils.js' import { MActorFollowersUrl } from '../../types/models/index.js' -export function getAudience (actorSender: MActorFollowersUrl, isPublic = true) { - return buildAudience([ actorSender.followersUrl ], isPublic) +export function getPublicAudience (actorSender: MActorFollowersUrl) { + return buildAudience([ actorSender.followersUrl ], 'public') } -export function buildAudience (followerUrls: string[], isPublic = true) { +export function getVideoAudience (actorSender: MActorFollowersUrl, privacy: VideoPrivacyType, options: { + skipPrivacyCheck?: boolean // default false +} = {}) { + const { skipPrivacyCheck = false } = options + + const followerUrls = [ actorSender.followersUrl ] + + if (privacy === VideoPrivacy.PUBLIC) return buildAudience(followerUrls, 'public') + else if (privacy === VideoPrivacy.UNLISTED) return buildAudience(followerUrls, 'unlisted') + + if (skipPrivacyCheck) return buildAudience(followerUrls, 'private') + + throw new Error(`Cannot get audience of non public/unlisted video privacy type (${privacy})`) +} + +export function getPlaylistAudience (actorSender: MActorFollowersUrl, privacy: VideoPlaylistPrivacyType) { + const followerUrls = [ actorSender.followersUrl ] + + if (privacy === VideoPlaylistPrivacy.PUBLIC) return buildAudience(followerUrls, 'public') + else if (privacy === VideoPlaylistPrivacy.UNLISTED) return buildAudience(followerUrls, 'unlisted') + + throw new Error(`Cannot get audience of non public/unlisted playlist privacy type (${privacy})`) +} + +export function audiencify (object: T, audience: ActivityAudience) { + return { ...audience, ...object } +} + +// --------------------------------------------------------------------------- +// Private +// --------------------------------------------------------------------------- + +function buildAudience (followerUrls: string[], type: 'public' | 'unlisted' | 'private') { let to: string[] = [] let cc: string[] = [] - if (isPublic) { + if (type === 'public') { to = [ getAPPublicValue() ] cc = followerUrls - } else { // Unlisted + } else if (type === 'unlisted') { + to = [] + cc = [ getAPPublicValue() ] + } else { to = [] cc = [] } return { to, cc } } - -export function audiencify (object: T, audience: ActivityAudience) { - return { ...audience, ...object } -} diff --git a/server/core/lib/activitypub/send/send-announce.ts b/server/core/lib/activitypub/send/send-announce.ts index ab7da2c86..923a91d38 100644 --- a/server/core/lib/activitypub/send/send-announce.ts +++ b/server/core/lib/activitypub/send/send-announce.ts @@ -3,7 +3,7 @@ import { ActivityAnnounce, ActivityAudience } from '@peertube/peertube-models' import { logger } from '../../../helpers/logger.js' import { MActorLight, MVideo } from '../../../types/models/index.js' import { MVideoShare } from '../../../types/models/video/index.js' -import { audiencify, getAudience } from '../audience.js' +import { audiencify, getPublicAudience } from '../audience.js' import { getActorsInvolvedInVideo, getAudienceFromFollowersOf } from './shared/index.js' import { broadcastToFollowers } from './shared/send-utils.js' @@ -39,7 +39,7 @@ async function sendVideoAnnounce (byActor: MActorLight, videoShare: MVideoShare, } function buildAnnounceActivity (url: string, byActor: MActorLight, object: string, audience?: ActivityAudience): ActivityAnnounce { - if (!audience) audience = getAudience(byActor) + if (!audience) audience = getPublicAudience(byActor) return audiencify({ type: 'Announce' as 'Announce', diff --git a/server/core/lib/activitypub/send/send-create.ts b/server/core/lib/activitypub/send/send-create.ts index b99d023de..381d20336 100644 --- a/server/core/lib/activitypub/send/send-create.ts +++ b/server/core/lib/activitypub/send/send-create.ts @@ -4,8 +4,7 @@ import { ActivityCreateObject, ContextType, VideoCommentObject, - VideoPlaylistPrivacy, - VideoPrivacy + VideoPlaylistPrivacy } from '@peertube/peertube-models' import { AccountModel } from '@server/models/account/account.js' import { getServerActor } from '@server/models/application/application.js' @@ -17,11 +16,12 @@ import { MActorLight, MCommentOwnerVideoReply, MLocalVideoViewerWithWatchSections, - MVideoAP, MVideoAccountLight, + MVideoAP, + MVideoAccountLight, MVideoPlaylistFull, MVideoRedundancyStreamingPlaylistVideo } from '../../../types/models/index.js' -import { audiencify, getAudience } from '../audience.js' +import { audiencify, getPlaylistAudience, getPublicAudience, getVideoAudience } from '../audience.js' import { canVideoBeFederated } from '../videos/federate.js' import { broadcastToActors, @@ -44,7 +44,7 @@ export async function sendCreateVideo (video: MVideoAP, transaction: Transaction const byActor = video.VideoChannel.Account.Actor const videoObject = await video.toActivityPubObject() - const audience = getAudience(byActor, video.privacy === VideoPrivacy.PUBLIC) + const audience = getVideoAudience(byActor, video.privacy) const createActivity = buildCreateActivity(video.url, byActor, videoObject, audience) return broadcastToFollowers({ @@ -90,7 +90,7 @@ export async function sendCreateVideoPlaylist (playlist: MVideoPlaylistFull, tra logger.info('Creating job to send create video playlist of %s.', playlist.url, lTags(playlist.uuid)) const byActor = playlist.OwnerAccount.Actor - const audience = getAudience(byActor, playlist.privacy === VideoPlaylistPrivacy.PUBLIC) + const audience = getPlaylistAudience(byActor, playlist.privacy) const object = await playlist.toActivityPubObject(null, transaction) const createActivity = buildCreateActivity(playlist.url, byActor, object, audience) @@ -139,7 +139,7 @@ export async function sendCreateVideoCommentIfNeeded (comment: MCommentOwnerVide actorsInvolvedInComment.push(byActor) const parentsCommentActors = threadParentComments.filter(c => !c.isDeleted() && !c.heldForReview) - .map(c => c.Account.Actor) + .map(c => c.Account.Actor) let audience: ActivityAudience if (isOrigin) { @@ -193,13 +193,13 @@ export async function sendCreateVideoCommentIfNeeded (comment: MCommentOwnerVide }) } -export function buildCreateActivity ( +export function buildCreateActivity ( url: string, byActor: MActorLight, object: T, audience?: ActivityAudience ): ActivityCreate { - if (!audience) audience = getAudience(byActor) + if (!audience) audience = getPublicAudience(byActor) return audiencify( { diff --git a/server/core/lib/activitypub/send/send-dislike.ts b/server/core/lib/activitypub/send/send-dislike.ts index 0c4dcca5f..ea414885d 100644 --- a/server/core/lib/activitypub/send/send-dislike.ts +++ b/server/core/lib/activitypub/send/send-dislike.ts @@ -2,7 +2,7 @@ import { Transaction } from 'sequelize' import { ActivityAudience, ActivityDislike } from '@peertube/peertube-models' import { logger } from '../../../helpers/logger.js' import { MActor, MActorAudience, MVideoAccountLight, MVideoUrl } from '../../../types/models/index.js' -import { audiencify, getAudience } from '../audience.js' +import { audiencify, getPublicAudience } from '../audience.js' import { getVideoDislikeActivityPubUrlByLocalActor } from '../url.js' import { sendVideoActivityToOrigin } from './shared/send-utils.js' @@ -19,7 +19,7 @@ function sendDislike (byActor: MActor, video: MVideoAccountLight, transaction: T } function buildDislikeActivity (url: string, byActor: MActorAudience, video: MVideoUrl, audience?: ActivityAudience): ActivityDislike { - if (!audience) audience = getAudience(byActor) + if (!audience) audience = getPublicAudience(byActor) return audiencify( { diff --git a/server/core/lib/activitypub/send/send-flag.ts b/server/core/lib/activitypub/send/send-flag.ts index bc9ba91e0..2776e56f5 100644 --- a/server/core/lib/activitypub/send/send-flag.ts +++ b/server/core/lib/activitypub/send/send-flag.ts @@ -2,7 +2,7 @@ import { Transaction } from 'sequelize' import { ActivityAudience, ActivityFlag } from '@peertube/peertube-models' import { logger } from '../../../helpers/logger.js' import { MAbuseAP, MAccountLight, MActor } from '../../../types/models/index.js' -import { audiencify, getAudience } from '../audience.js' +import { audiencify, getPublicAudience } from '../audience.js' import { getLocalAbuseActivityPubUrl } from '../url.js' import { unicastTo } from './shared/send-utils.js' @@ -28,7 +28,7 @@ function sendAbuse (byActor: MActor, abuse: MAbuseAP, flaggedAccount: MAccountLi } function buildFlagActivity (url: string, byActor: MActor, abuse: MAbuseAP, audience: ActivityAudience): ActivityFlag { - if (!audience) audience = getAudience(byActor) + if (!audience) audience = getPublicAudience(byActor) const activity = { id: url, actor: byActor.url, ...abuse.toActivityPubObject() } diff --git a/server/core/lib/activitypub/send/send-like.ts b/server/core/lib/activitypub/send/send-like.ts index 701c9325d..682a56896 100644 --- a/server/core/lib/activitypub/send/send-like.ts +++ b/server/core/lib/activitypub/send/send-like.ts @@ -2,7 +2,7 @@ import { Transaction } from 'sequelize' import { ActivityAudience, ActivityLike } from '@peertube/peertube-models' import { logger } from '../../../helpers/logger.js' import { MActor, MActorAudience, MVideoAccountLight, MVideoUrl } from '../../../types/models/index.js' -import { audiencify, getAudience } from '../audience.js' +import { audiencify, getPublicAudience } from '../audience.js' import { getVideoLikeActivityPubUrlByLocalActor } from '../url.js' import { sendVideoActivityToOrigin } from './shared/send-utils.js' @@ -19,7 +19,7 @@ function sendLike (byActor: MActor, video: MVideoAccountLight, transaction: Tran } function buildLikeActivity (url: string, byActor: MActorAudience, video: MVideoUrl, audience?: ActivityAudience): ActivityLike { - if (!audience) audience = getAudience(byActor) + if (!audience) audience = getPublicAudience(byActor) return audiencify( { diff --git a/server/core/lib/activitypub/send/send-undo.ts b/server/core/lib/activitypub/send/send-undo.ts index 6db165734..9c93530dd 100644 --- a/server/core/lib/activitypub/send/send-undo.ts +++ b/server/core/lib/activitypub/send/send-undo.ts @@ -12,7 +12,7 @@ import { MVideoRedundancyVideo, MVideoShare } from '../../../types/models/index.js' -import { audiencify, getAudience } from '../audience.js' +import { audiencify, getPublicAudience } from '../audience.js' import { getUndoActivityPubUrl, getVideoDislikeActivityPubUrlByLocalActor, getVideoLikeActivityPubUrlByLocalActor } from '../url.js' import { buildAnnounceWithVideoAudience } from './send-announce.js' import { buildCreateActivity } from './send-create.js' @@ -119,13 +119,13 @@ export { // --------------------------------------------------------------------------- -function undoActivityData ( +function undoActivityData ( url: string, byActor: MActorAudience, object: T, audience?: ActivityAudience ): ActivityUndo { - if (!audience) audience = getAudience(byActor) + if (!audience) audience = getPublicAudience(byActor) return audiencify( { diff --git a/server/core/lib/activitypub/send/send-update.ts b/server/core/lib/activitypub/send/send-update.ts index 0320afb4c..f87eba01b 100644 --- a/server/core/lib/activitypub/send/send-update.ts +++ b/server/core/lib/activitypub/send/send-update.ts @@ -1,4 +1,4 @@ -import { ActivityAudience, ActivityUpdate, ActivityUpdateObject, VideoPlaylistPrivacy, VideoPrivacy } from '@peertube/peertube-models' +import { ActivityAudience, ActivityUpdate, ActivityUpdateObject, VideoPlaylistPrivacy } from '@peertube/peertube-models' import { getServerActor } from '@server/models/application/application.js' import { Transaction } from 'sequelize' import { logger } from '../../../helpers/logger.js' @@ -14,7 +14,7 @@ import { MVideoPlaylistFull, MVideoRedundancyVideo } from '../../../types/models/index.js' -import { audiencify, getAudience } from '../audience.js' +import { audiencify, getPlaylistAudience, getPublicAudience, getVideoAudience } from '../audience.js' import { getUpdateActivityPubUrl } from '../url.js' import { canVideoBeFederated } from '../videos/federate.js' import { getActorsInvolvedInVideo } from './shared/index.js' @@ -32,7 +32,7 @@ export async function sendUpdateVideo (videoArg: MVideoAPLight, transaction: Tra const url = getUpdateActivityPubUrl(video.url, video.updatedAt.toISOString()) const videoObject = await video.toActivityPubObject() - const audience = getAudience(byActor, video.privacy === VideoPrivacy.PUBLIC) + const audience = getVideoAudience(byActor, video.privacy) const updateActivity = buildUpdateActivity(url, byActor, videoObject, audience) @@ -55,7 +55,7 @@ export async function sendUpdateActor (accountOrChannel: MChannelDefault | MAcco const url = getUpdateActivityPubUrl(byActor.url, byActor.updatedAt.toISOString()) const accountOrChannelObject = await (accountOrChannel as any).toActivityPubObject() // FIXME: typescript bug? - const audience = getAudience(byActor) + const audience = getPublicAudience(byActor) const updateActivity = buildUpdateActivity(url, byActor, accountOrChannelObject, audience) let actorsInvolved: MActor[] @@ -109,7 +109,7 @@ export async function sendUpdateVideoPlaylist (videoPlaylist: MVideoPlaylistFull const url = getUpdateActivityPubUrl(videoPlaylist.url, videoPlaylist.updatedAt.toISOString()) const object = await videoPlaylist.toActivityPubObject(null, transaction) - const audience = getAudience(byActor, videoPlaylist.privacy === VideoPlaylistPrivacy.PUBLIC) + const audience = getPlaylistAudience(byActor, videoPlaylist.privacy) const updateActivity = buildUpdateActivity(url, byActor, object, audience) @@ -137,7 +137,7 @@ function buildUpdateActivity ( object: ActivityUpdateObject, audience?: ActivityAudience ): ActivityUpdate { - if (!audience) audience = getAudience(byActor) + if (!audience) audience = getPublicAudience(byActor) return audiencify( { diff --git a/server/core/lib/activitypub/send/send-view.ts b/server/core/lib/activitypub/send/send-view.ts index d97ec9dd4..59659837d 100644 --- a/server/core/lib/activitypub/send/send-view.ts +++ b/server/core/lib/activitypub/send/send-view.ts @@ -3,7 +3,7 @@ import { VideoViewsManager } from '@server/lib/views/video-views-manager.js' import { MActorAudience, MActorLight, MVideoImmutable, MVideoUrl } from '@server/types/models/index.js' import { Transaction } from 'sequelize' import { logger } from '../../../helpers/logger.js' -import { audiencify, getAudience } from '../audience.js' +import { audiencify, getPublicAudience } from '../audience.js' import { getLocalVideoViewActivityPubUrl } from '../url.js' import { sendVideoRelatedActivity } from './shared/send-utils.js' @@ -42,7 +42,7 @@ function buildViewActivity (options: { viewersCount?: number audience?: ActivityAudience }): ActivityView { - const { url, byActor, viewersCount, video, audience = getAudience(byActor) } = options + const { url, byActor, viewersCount, video, audience = getPublicAudience(byActor) } = options const base = { id: url, diff --git a/server/core/lib/user-import-export/exporters/comments-exporter.ts b/server/core/lib/user-import-export/exporters/comments-exporter.ts index a2a57e07c..975384b48 100644 --- a/server/core/lib/user-import-export/exporters/comments-exporter.ts +++ b/server/core/lib/user-import-export/exporters/comments-exporter.ts @@ -1,13 +1,12 @@ -import { AbstractUserExporter } from './abstract-user-exporter.js' -import { MCommentExport } from '@server/types/models/index.js' import { CommentsExportJSON, VideoCommentObject } from '@peertube/peertube-models' -import { VideoCommentModel } from '@server/models/video/video-comment.js' -import Bluebird from 'bluebird' -import { audiencify, getAudience } from '@server/lib/activitypub/audience.js' +import { audiencify, getPublicAudience } from '@server/lib/activitypub/audience.js' import { buildCreateActivity } from '@server/lib/activitypub/send/send-create.js' +import { VideoCommentModel } from '@server/models/video/video-comment.js' +import { MCommentExport } from '@server/types/models/index.js' +import Bluebird from 'bluebird' +import { AbstractUserExporter } from './abstract-user-exporter.js' -export class CommentsExporter extends AbstractUserExporter { - +export class CommentsExporter extends AbstractUserExporter { async export () { const comments = await VideoCommentModel.listForExport(this.user.Account.id) @@ -39,8 +38,7 @@ export class CommentsExporter extends AbstractUserExporter const threadParentComments = await VideoCommentModel.listThreadParentComments({ comment }) let commentObject = comment.toActivityPubObject(threadParentComments) as VideoCommentObject - const isPublic = true // Comments are always public - const audience = getAudience(comment.Account.Actor, isPublic) + const audience = getPublicAudience(comment.Account.Actor) commentObject = audiencify(commentObject, audience) diff --git a/server/core/lib/user-import-export/exporters/videos-exporter.ts b/server/core/lib/user-import-export/exporters/videos-exporter.ts index 9aaaf12da..ce9ca493d 100644 --- a/server/core/lib/user-import-export/exporters/videos-exporter.ts +++ b/server/core/lib/user-import-export/exporters/videos-exporter.ts @@ -2,7 +2,7 @@ import { pick } from '@peertube/peertube-core-utils' import { ActivityCreate, FileStorage, VideoCommentPolicy, VideoExportJSON, VideoObject, VideoPrivacy } from '@peertube/peertube-models' import { logger } from '@server/helpers/logger.js' import { USER_EXPORT_MAX_ITEMS } from '@server/initializers/constants.js' -import { audiencify, getAudience } from '@server/lib/activitypub/audience.js' +import { audiencify, getVideoAudience } from '@server/lib/activitypub/audience.js' import { buildCreateActivity } from '@server/lib/activitypub/send/send-create.js' import { buildChaptersAPHasPart } from '@server/lib/activitypub/video-chapters.js' import { @@ -266,7 +266,7 @@ export class VideosExporter extends AbstractUserExporter { ): Promise> { const icon = video.getPreview() - const audience = getAudience(video.VideoChannel.Account.Actor, video.privacy === VideoPrivacy.PUBLIC) + const audience = getVideoAudience(video.VideoChannel.Account.Actor, video.privacy, { skipPrivacyCheck: true }) const videoObject = { ...audiencify(await video.toActivityPubObject(), audience),