2019-09-21 21:20:14 +00:00
|
|
|
const crypto = require('crypto')
|
2019-09-22 05:20:37 +00:00
|
|
|
const { promisify } = require('util')
|
2019-09-21 21:20:14 +00:00
|
|
|
|
2019-09-22 05:05:30 +00:00
|
|
|
const store = require('../store')
|
2019-09-21 21:20:14 +00:00
|
|
|
const pubUtils = require('./utils')
|
|
|
|
const config = require('../config.json')
|
|
|
|
|
|
|
|
const generateKeyPairPromise = promisify(crypto.generateKeyPair)
|
|
|
|
|
|
|
|
module.exports = {
|
2019-09-22 05:20:37 +00:00
|
|
|
createLocalActor,
|
|
|
|
getOrCreateActor
|
2019-09-21 21:20:14 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function createLocalActor (name, type) {
|
2019-09-22 05:20:37 +00:00
|
|
|
return generateKeyPairPromise('rsa', {
|
|
|
|
modulusLength: 4096,
|
|
|
|
publicKeyEncoding: {
|
|
|
|
type: 'spki',
|
|
|
|
format: 'pem'
|
|
|
|
},
|
|
|
|
privateKeyEncoding: {
|
|
|
|
type: 'pkcs8',
|
|
|
|
format: 'pem'
|
|
|
|
}
|
|
|
|
}).then(pair => {
|
|
|
|
const actorBase = pubUtils.usernameToIRI(name)
|
|
|
|
return {
|
|
|
|
_meta: {
|
|
|
|
privateKey: pair.privateKey
|
|
|
|
},
|
|
|
|
id: `${actorBase}`,
|
|
|
|
type: type,
|
|
|
|
following: `${actorBase}/following`,
|
|
|
|
followers: `${actorBase}/followers`,
|
|
|
|
liked: `${actorBase}/liked`,
|
|
|
|
inbox: `${actorBase}/inbox`,
|
|
|
|
outbox: `${actorBase}/outbox`,
|
|
|
|
preferredUsername: name,
|
|
|
|
name: 'Dummy Person',
|
|
|
|
summary: 'Gotta have someone in the db',
|
|
|
|
icon: `https://${config.DOMAIN}/f/${name}.png`,
|
|
|
|
publicKey: {
|
|
|
|
id: `${actorBase}#main-key`,
|
|
|
|
owner: `${actorBase}`,
|
|
|
|
publicKeyPem: pair.publicKey
|
|
|
|
}
|
|
|
|
}
|
|
|
|
})
|
2019-09-21 21:20:14 +00:00
|
|
|
}
|
2019-09-22 05:05:30 +00:00
|
|
|
|
|
|
|
async function getOrCreateActor (preferredUsername, db, includeMeta) {
|
2019-09-22 05:20:37 +00:00
|
|
|
const id = pubUtils.usernameToIRI(preferredUsername)
|
|
|
|
let user = await store.actor.getActor(id, db, includeMeta)
|
|
|
|
if (user) {
|
2019-09-22 05:05:30 +00:00
|
|
|
return user
|
2019-09-22 05:20:37 +00:00
|
|
|
}
|
|
|
|
// auto create groups whenever an unknown actor is referenced
|
|
|
|
user = await createLocalActor(preferredUsername, 'Group')
|
|
|
|
await db.collection('objects').insertOne(user)
|
|
|
|
// only executed on success
|
|
|
|
delete user._id
|
|
|
|
if (includeMeta !== true) {
|
|
|
|
delete user._meta
|
|
|
|
}
|
|
|
|
return user
|
|
|
|
}
|