PeerTube/server/helpers/custom-jsonld-signature.ts

85 lines
2.8 KiB
TypeScript

import * as AsyncLRU from 'async-lru'
import * as jsonld from 'jsonld'
import * as jsig from 'jsonld-signatures'
import { logger } from './logger'
const CACHE = {
'https://w3id.org/security/v1': {
'@context': {
'id': '@id',
'type': '@type',
'dc': 'http://purl.org/dc/terms/',
'sec': 'https://w3id.org/security#',
'xsd': 'http://www.w3.org/2001/XMLSchema#',
'EcdsaKoblitzSignature2016': 'sec:EcdsaKoblitzSignature2016',
'Ed25519Signature2018': 'sec:Ed25519Signature2018',
'EncryptedMessage': 'sec:EncryptedMessage',
'GraphSignature2012': 'sec:GraphSignature2012',
'LinkedDataSignature2015': 'sec:LinkedDataSignature2015',
'LinkedDataSignature2016': 'sec:LinkedDataSignature2016',
'CryptographicKey': 'sec:Key',
'authenticationTag': 'sec:authenticationTag',
'canonicalizationAlgorithm': 'sec:canonicalizationAlgorithm',
'cipherAlgorithm': 'sec:cipherAlgorithm',
'cipherData': 'sec:cipherData',
'cipherKey': 'sec:cipherKey',
'created': { '@id': 'dc:created', '@type': 'xsd:dateTime' },
'creator': { '@id': 'dc:creator', '@type': '@id' },
'digestAlgorithm': 'sec:digestAlgorithm',
'digestValue': 'sec:digestValue',
'domain': 'sec:domain',
'encryptionKey': 'sec:encryptionKey',
'expiration': { '@id': 'sec:expiration', '@type': 'xsd:dateTime' },
'expires': { '@id': 'sec:expiration', '@type': 'xsd:dateTime' },
'initializationVector': 'sec:initializationVector',
'iterationCount': 'sec:iterationCount',
'nonce': 'sec:nonce',
'normalizationAlgorithm': 'sec:normalizationAlgorithm',
'owner': { '@id': 'sec:owner', '@type': '@id' },
'password': 'sec:password',
'privateKey': { '@id': 'sec:privateKey', '@type': '@id' },
'privateKeyPem': 'sec:privateKeyPem',
'publicKey': { '@id': 'sec:publicKey', '@type': '@id' },
'publicKeyBase58': 'sec:publicKeyBase58',
'publicKeyPem': 'sec:publicKeyPem',
'publicKeyWif': 'sec:publicKeyWif',
'publicKeyService': { '@id': 'sec:publicKeyService', '@type': '@id' },
'revoked': { '@id': 'sec:revoked', '@type': 'xsd:dateTime' },
'salt': 'sec:salt',
'signature': 'sec:signature',
'signatureAlgorithm': 'sec:signingAlgorithm',
'signatureValue': 'sec:signatureValue'
}
}
}
const nodeDocumentLoader = jsonld.documentLoaders.node()
const lru = new AsyncLRU({
max: 10,
load: (url, cb) => {
if (CACHE[ url ] !== undefined) {
logger.debug('Using cache for JSON-LD %s.', url)
return cb(null, {
contextUrl: null,
document: CACHE[ url ],
documentUrl: url
})
}
nodeDocumentLoader(url, cb)
}
})
jsonld.documentLoader = (url, cb) => {
lru.get(url, cb)
}
jsig.use('jsonld', jsonld)
export { jsig, jsonld }