aboutsummaryrefslogtreecommitdiffhomepage
path: root/server/lib/activitypub
diff options
context:
space:
mode:
Diffstat (limited to 'server/lib/activitypub')
-rw-r--r--server/lib/activitypub/account.ts69
-rw-r--r--server/lib/activitypub/process/process-add.ts4
-rw-r--r--server/lib/activitypub/process/process-announce.ts4
-rw-r--r--server/lib/activitypub/process/process-create.ts4
-rw-r--r--server/lib/activitypub/process/process-delete.ts4
-rw-r--r--server/lib/activitypub/process/process-follow.ts4
-rw-r--r--server/lib/activitypub/process/process-update.ts4
7 files changed, 60 insertions, 33 deletions
diff --git a/server/lib/activitypub/account.ts b/server/lib/activitypub/account.ts
index 704a92e13..906c8ff29 100644
--- a/server/lib/activitypub/account.ts
+++ b/server/lib/activitypub/account.ts
@@ -1,27 +1,65 @@
1import * as Bluebird from 'bluebird'
1import * as url from 'url' 2import * as url from 'url'
2import { ActivityPubActor } from '../../../shared/models/activitypub/activitypub-actor' 3import { ActivityPubActor } from '../../../shared/models/activitypub/activitypub-actor'
3import { isRemoteAccountValid } from '../../helpers/custom-validators/activitypub/account' 4import { isRemoteAccountValid } from '../../helpers/custom-validators/activitypub/account'
5import { retryTransactionWrapper } from '../../helpers/database-utils'
4import { logger } from '../../helpers/logger' 6import { logger } from '../../helpers/logger'
5import { doRequest } from '../../helpers/requests' 7import { doRequest } from '../../helpers/requests'
6import { ACTIVITY_PUB } from '../../initializers/constants' 8import { ACTIVITY_PUB } from '../../initializers/constants'
7import { database as db } from '../../initializers/database' 9import { database as db } from '../../initializers/database'
10import { AccountInstance } from '../../models/account/account-interface'
11import { Transaction } from 'sequelize'
8 12
9async function getOrCreateAccount (accountUrl: string) { 13async function getOrCreateAccountAndServer (accountUrl: string) {
10 let account = await db.Account.loadByUrl(accountUrl) 14 let account = await db.Account.loadByUrl(accountUrl)
11 15
12 // We don't have this account in our database, fetch it on remote 16 // We don't have this account in our database, fetch it on remote
13 if (!account) { 17 if (!account) {
14 const res = await fetchRemoteAccountAndCreateServer(accountUrl) 18 account = await fetchRemoteAccount(accountUrl)
15 if (res === undefined) throw new Error('Cannot fetch remote account.') 19 if (account === undefined) throw new Error('Cannot fetch remote account.')
16 20
17 // Save our new account in database 21 const options = {
18 account = await res.account.save() 22 arguments: [ account ],
23 errorMessage: 'Cannot save account and server with many retries.'
24 }
25 account = await retryTransactionWrapper(saveAccountAndServerIfNotExist, options)
19 } 26 }
20 27
21 return account 28 return account
22} 29}
23 30
24async function fetchRemoteAccountAndCreateServer (accountUrl: string) { 31function saveAccountAndServerIfNotExist (account: AccountInstance, t?: Transaction): Bluebird<AccountInstance> | Promise<AccountInstance> {
32 if (t !== undefined) {
33 return save(t)
34 } else {
35 return db.sequelize.transaction(t => {
36 return save(t)
37 })
38 }
39
40 async function save (t: Transaction) {
41 const accountHost = url.parse(account.url).host
42
43 const serverOptions = {
44 where: {
45 host: accountHost
46 },
47 defaults: {
48 host: accountHost
49 },
50 transaction: t
51 }
52 const [ server ] = await db.Server.findOrCreate(serverOptions)
53
54 // Save our new account in database
55 account.set('serverId', server.id)
56 account = await account.save({ transaction: t })
57
58 return account
59 }
60}
61
62async function fetchRemoteAccount (accountUrl: string) {
25 const options = { 63 const options = {
26 uri: accountUrl, 64 uri: accountUrl,
27 method: 'GET', 65 method: 'GET',
@@ -64,24 +102,13 @@ async function fetchRemoteAccountAndCreateServer (accountUrl: string) {
64 followingUrl: accountJSON.following 102 followingUrl: accountJSON.following
65 }) 103 })
66 104
67 const accountHost = url.parse(account.url).host 105 return account
68 const serverOptions = {
69 where: {
70 host: accountHost
71 },
72 defaults: {
73 host: accountHost
74 }
75 }
76 const [ server ] = await db.Server.findOrCreate(serverOptions)
77 account.set('serverId', server.id)
78
79 return { account, server }
80} 106}
81 107
82export { 108export {
83 getOrCreateAccount, 109 getOrCreateAccountAndServer,
84 fetchRemoteAccountAndCreateServer 110 fetchRemoteAccount,
111 saveAccountAndServerIfNotExist
85} 112}
86 113
87// --------------------------------------------------------------------------- 114// ---------------------------------------------------------------------------
diff --git a/server/lib/activitypub/process/process-add.ts b/server/lib/activitypub/process/process-add.ts
index 281036228..edc90dee5 100644
--- a/server/lib/activitypub/process/process-add.ts
+++ b/server/lib/activitypub/process/process-add.ts
@@ -6,7 +6,7 @@ import { logger } from '../../../helpers/logger'
6import { database as db } from '../../../initializers' 6import { database as db } from '../../../initializers'
7import { AccountInstance } from '../../../models/account/account-interface' 7import { AccountInstance } from '../../../models/account/account-interface'
8import { VideoChannelInstance } from '../../../models/video/video-channel-interface' 8import { VideoChannelInstance } from '../../../models/video/video-channel-interface'
9import { getOrCreateAccount } from '../account' 9import { getOrCreateAccountAndServer } from '../account'
10import { getOrCreateVideoChannel } from '../video-channels' 10import { getOrCreateVideoChannel } from '../video-channels'
11import { generateThumbnailFromUrl } from '../videos' 11import { generateThumbnailFromUrl } from '../videos'
12import { videoActivityObjectToDBAttributes, videoFileActivityUrlToDBAttributes } from './misc' 12import { videoActivityObjectToDBAttributes, videoFileActivityUrlToDBAttributes } from './misc'
@@ -14,7 +14,7 @@ import { videoActivityObjectToDBAttributes, videoFileActivityUrlToDBAttributes }
14async function processAddActivity (activity: ActivityAdd) { 14async function processAddActivity (activity: ActivityAdd) {
15 const activityObject = activity.object 15 const activityObject = activity.object
16 const activityType = activityObject.type 16 const activityType = activityObject.type
17 const account = await getOrCreateAccount(activity.actor) 17 const account = await getOrCreateAccountAndServer(activity.actor)
18 18
19 if (activityType === 'Video') { 19 if (activityType === 'Video') {
20 const videoChannelUrl = activity.target 20 const videoChannelUrl = activity.target
diff --git a/server/lib/activitypub/process/process-announce.ts b/server/lib/activitypub/process/process-announce.ts
index 40712ef03..d8532d3a1 100644
--- a/server/lib/activitypub/process/process-announce.ts
+++ b/server/lib/activitypub/process/process-announce.ts
@@ -5,11 +5,11 @@ import { VideoInstance } from '../../../models/index'
5import { VideoChannelInstance } from '../../../models/video/video-channel-interface' 5import { VideoChannelInstance } from '../../../models/video/video-channel-interface'
6import { processAddActivity } from './process-add' 6import { processAddActivity } from './process-add'
7import { processCreateActivity } from './process-create' 7import { processCreateActivity } from './process-create'
8import { getOrCreateAccount } from '../account' 8import { getOrCreateAccountAndServer } from '../account'
9 9
10async function processAnnounceActivity (activity: ActivityAnnounce) { 10async function processAnnounceActivity (activity: ActivityAnnounce) {
11 const announcedActivity = activity.object 11 const announcedActivity = activity.object
12 const accountAnnouncer = await getOrCreateAccount(activity.actor) 12 const accountAnnouncer = await getOrCreateAccountAndServer(activity.actor)
13 13
14 if (announcedActivity.type === 'Create' && announcedActivity.object.type === 'VideoChannel') { 14 if (announcedActivity.type === 'Create' && announcedActivity.object.type === 'VideoChannel') {
15 // Add share entry 15 // Add share entry
diff --git a/server/lib/activitypub/process/process-create.ts b/server/lib/activitypub/process/process-create.ts
index fc635eb1f..ddf7c74f6 100644
--- a/server/lib/activitypub/process/process-create.ts
+++ b/server/lib/activitypub/process/process-create.ts
@@ -3,14 +3,14 @@ import { VideoAbuseObject } from '../../../../shared/models/activitypub/objects/
3import { logger, retryTransactionWrapper } from '../../../helpers' 3import { logger, retryTransactionWrapper } from '../../../helpers'
4import { database as db } from '../../../initializers' 4import { database as db } from '../../../initializers'
5import { AccountInstance } from '../../../models/account/account-interface' 5import { AccountInstance } from '../../../models/account/account-interface'
6import { getOrCreateAccount } from '../account' 6import { getOrCreateAccountAndServer } from '../account'
7import { getVideoChannelActivityPubUrl } from '../url' 7import { getVideoChannelActivityPubUrl } from '../url'
8import { videoChannelActivityObjectToDBAttributes } from './misc' 8import { videoChannelActivityObjectToDBAttributes } from './misc'
9 9
10async function processCreateActivity (activity: ActivityCreate) { 10async function processCreateActivity (activity: ActivityCreate) {
11 const activityObject = activity.object 11 const activityObject = activity.object
12 const activityType = activityObject.type 12 const activityType = activityObject.type
13 const account = await getOrCreateAccount(activity.actor) 13 const account = await getOrCreateAccountAndServer(activity.actor)
14 14
15 if (activityType === 'VideoChannel') { 15 if (activityType === 'VideoChannel') {
16 return processCreateVideoChannel(account, activityObject as VideoChannelObject) 16 return processCreateVideoChannel(account, activityObject as VideoChannelObject)
diff --git a/server/lib/activitypub/process/process-delete.ts b/server/lib/activitypub/process/process-delete.ts
index 0328d1a7d..41cdc236d 100644
--- a/server/lib/activitypub/process/process-delete.ts
+++ b/server/lib/activitypub/process/process-delete.ts
@@ -5,10 +5,10 @@ import { database as db } from '../../../initializers'
5import { AccountInstance } from '../../../models/account/account-interface' 5import { AccountInstance } from '../../../models/account/account-interface'
6import { VideoChannelInstance } from '../../../models/video/video-channel-interface' 6import { VideoChannelInstance } from '../../../models/video/video-channel-interface'
7import { VideoInstance } from '../../../models/video/video-interface' 7import { VideoInstance } from '../../../models/video/video-interface'
8import { getOrCreateAccount } from '../account' 8import { getOrCreateAccountAndServer } from '../account'
9 9
10async function processDeleteActivity (activity: ActivityDelete) { 10async function processDeleteActivity (activity: ActivityDelete) {
11 const account = await getOrCreateAccount(activity.actor) 11 const account = await getOrCreateAccountAndServer(activity.actor)
12 12
13 if (account.url === activity.id) { 13 if (account.url === activity.id) {
14 return processDeleteAccount(account) 14 return processDeleteAccount(account)
diff --git a/server/lib/activitypub/process/process-follow.ts b/server/lib/activitypub/process/process-follow.ts
index 41b38828c..248004226 100644
--- a/server/lib/activitypub/process/process-follow.ts
+++ b/server/lib/activitypub/process/process-follow.ts
@@ -4,11 +4,11 @@ import { database as db } from '../../../initializers'
4import { AccountInstance } from '../../../models/account/account-interface' 4import { AccountInstance } from '../../../models/account/account-interface'
5import { logger } from '../../../helpers/logger' 5import { logger } from '../../../helpers/logger'
6import { sendAccept } from '../send/send-accept' 6import { sendAccept } from '../send/send-accept'
7import { getOrCreateAccount } from '../account' 7import { getOrCreateAccountAndServer } from '../account'
8 8
9async function processFollowActivity (activity: ActivityFollow) { 9async function processFollowActivity (activity: ActivityFollow) {
10 const activityObject = activity.object 10 const activityObject = activity.object
11 const account = await getOrCreateAccount(activity.actor) 11 const account = await getOrCreateAccountAndServer(activity.actor)
12 12
13 return processFollow(account, activityObject) 13 return processFollow(account, activityObject)
14} 14}
diff --git a/server/lib/activitypub/process/process-update.ts b/server/lib/activitypub/process/process-update.ts
index 4876735b8..7caf2ca78 100644
--- a/server/lib/activitypub/process/process-update.ts
+++ b/server/lib/activitypub/process/process-update.ts
@@ -8,10 +8,10 @@ import { AccountInstance } from '../../../models/account/account-interface'
8import { VideoInstance } from '../../../models/video/video-interface' 8import { VideoInstance } from '../../../models/video/video-interface'
9import { videoActivityObjectToDBAttributes, videoFileActivityUrlToDBAttributes } from './misc' 9import { videoActivityObjectToDBAttributes, videoFileActivityUrlToDBAttributes } from './misc'
10import Bluebird = require('bluebird') 10import Bluebird = require('bluebird')
11import { getOrCreateAccount } from '../account' 11import { getOrCreateAccountAndServer } from '../account'
12 12
13async function processUpdateActivity (activity: ActivityUpdate) { 13async function processUpdateActivity (activity: ActivityUpdate) {
14 const account = await getOrCreateAccount(activity.actor) 14 const account = await getOrCreateAccountAndServer(activity.actor)
15 15
16 if (activity.object.type === 'Video') { 16 if (activity.object.type === 'Video') {
17 return processUpdateVideo(account, activity.object) 17 return processUpdateVideo(account, activity.object)