rubberguppe/pub/actor.js

72 lines
1.9 KiB
JavaScript
Raw Normal View History

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
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: `${name} group`,
summary: `I'm a group about ${name}. Follow me to get all the group posts. Tag me to share with the group. Create other groups by searching for or tagging @yourGroupName@${config.DOMAIN}`,
2019-09-29 16:59:02 +00:00
icon: {
type: 'Image',
mediaType: 'image/jpeg',
url: `https://${config.DOMAIN}/f/guppe.png`
},
2019-09-22 05:20:37 +00:00
publicKey: {
id: `${actorBase}#main-key`,
owner: `${actorBase}`,
publicKeyPem: pair.publicKey
}
}
})
2019-09-21 21:20:14 +00:00
}
async function getOrCreateActor (preferredUsername, includeMeta) {
2019-09-22 05:20:37 +00:00
const id = pubUtils.usernameToIRI(preferredUsername)
let user = await store.actor.getActor(id, includeMeta)
2019-09-22 05:20:37 +00:00
if (user) {
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 store.object.save(user)
2019-09-22 05:20:37 +00:00
// only executed on success
delete user._id
if (includeMeta !== true) {
delete user._meta
}
return user
}