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

91 lines
2.9 KiB
TypeScript
Raw Normal View History

2021-08-27 14:32:44 +02:00
import AsyncLRU from 'async-lru'
import jsonld from 'jsonld'
import { logger } from './logger.js'
2021-08-27 14:32:44 +02:00
2019-04-15 10:49:46 +02:00
const CACHE = {
'https://w3id.org/security/v1': {
'@context': {
2020-01-31 16:56:52 +01:00
id: '@id',
type: '@type',
2019-04-15 10:49:46 +02:00
2020-01-31 16:56:52 +01:00
dc: 'http://purl.org/dc/terms/',
sec: 'https://w3id.org/security#',
xsd: 'http://www.w3.org/2001/XMLSchema#',
2019-04-15 10:49:46 +02:00
2020-01-31 16:56:52 +01:00
EcdsaKoblitzSignature2016: 'sec:EcdsaKoblitzSignature2016',
Ed25519Signature2018: 'sec:Ed25519Signature2018',
EncryptedMessage: 'sec:EncryptedMessage',
GraphSignature2012: 'sec:GraphSignature2012',
LinkedDataSignature2015: 'sec:LinkedDataSignature2015',
LinkedDataSignature2016: 'sec:LinkedDataSignature2016',
CryptographicKey: 'sec:Key',
2019-04-15 10:49:46 +02:00
2020-01-31 16:56:52 +01:00
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'
2019-04-15 10:49:46 +02:00
}
}
}
2017-11-17 15:20:42 +01:00
const nodeDocumentLoader = (jsonld as any).documentLoaders.node()
2017-11-17 15:20:42 +01:00
const lru = new AsyncLRU({
max: 10,
2019-04-15 10:49:46 +02:00
load: (url, cb) => {
2020-01-31 16:56:52 +01:00
if (CACHE[url] !== undefined) {
2019-04-15 10:49:46 +02:00
logger.debug('Using cache for JSON-LD %s.', url)
return cb(null, {
contextUrl: null,
2020-01-31 16:56:52 +01:00
document: CACHE[url],
2019-04-15 10:49:46 +02:00
documentUrl: url
})
}
2020-01-07 15:24:27 +01:00
nodeDocumentLoader(url)
.then(value => cb(null, value))
.catch(err => cb(err))
2017-11-17 15:20:42 +01:00
}
});
2017-11-17 15:20:42 +01:00
2021-02-03 09:33:05 +01:00
/* eslint-disable no-import-assign */
(jsonld as any).documentLoader = (url) => {
2020-01-07 15:24:27 +01:00
return new Promise((res, rej) => {
lru.get(url, (err, value) => {
if (err) return rej(err)
return res(value)
})
})
2017-11-17 15:20:42 +01:00
}
export { jsonld }