Fix search with bad webfinger handles
[oweals/peertube.git] / server / helpers / custom-jsonld-signature.ts
1 import * as AsyncLRU from 'async-lru'
2 import * as jsonld from 'jsonld'
3 import * as jsig from 'jsonld-signatures'
4 import { logger } from './logger'
5
6 const CACHE = {
7   'https://w3id.org/security/v1': {
8     '@context': {
9       'id': '@id',
10       'type': '@type',
11
12       'dc': 'http://purl.org/dc/terms/',
13       'sec': 'https://w3id.org/security#',
14       'xsd': 'http://www.w3.org/2001/XMLSchema#',
15
16       'EcdsaKoblitzSignature2016': 'sec:EcdsaKoblitzSignature2016',
17       'Ed25519Signature2018': 'sec:Ed25519Signature2018',
18       'EncryptedMessage': 'sec:EncryptedMessage',
19       'GraphSignature2012': 'sec:GraphSignature2012',
20       'LinkedDataSignature2015': 'sec:LinkedDataSignature2015',
21       'LinkedDataSignature2016': 'sec:LinkedDataSignature2016',
22       'CryptographicKey': 'sec:Key',
23
24       'authenticationTag': 'sec:authenticationTag',
25       'canonicalizationAlgorithm': 'sec:canonicalizationAlgorithm',
26       'cipherAlgorithm': 'sec:cipherAlgorithm',
27       'cipherData': 'sec:cipherData',
28       'cipherKey': 'sec:cipherKey',
29       'created': { '@id': 'dc:created', '@type': 'xsd:dateTime' },
30       'creator': { '@id': 'dc:creator', '@type': '@id' },
31       'digestAlgorithm': 'sec:digestAlgorithm',
32       'digestValue': 'sec:digestValue',
33       'domain': 'sec:domain',
34       'encryptionKey': 'sec:encryptionKey',
35       'expiration': { '@id': 'sec:expiration', '@type': 'xsd:dateTime' },
36       'expires': { '@id': 'sec:expiration', '@type': 'xsd:dateTime' },
37       'initializationVector': 'sec:initializationVector',
38       'iterationCount': 'sec:iterationCount',
39       'nonce': 'sec:nonce',
40       'normalizationAlgorithm': 'sec:normalizationAlgorithm',
41       'owner': { '@id': 'sec:owner', '@type': '@id' },
42       'password': 'sec:password',
43       'privateKey': { '@id': 'sec:privateKey', '@type': '@id' },
44       'privateKeyPem': 'sec:privateKeyPem',
45       'publicKey': { '@id': 'sec:publicKey', '@type': '@id' },
46       'publicKeyBase58': 'sec:publicKeyBase58',
47       'publicKeyPem': 'sec:publicKeyPem',
48       'publicKeyWif': 'sec:publicKeyWif',
49       'publicKeyService': { '@id': 'sec:publicKeyService', '@type': '@id' },
50       'revoked': { '@id': 'sec:revoked', '@type': 'xsd:dateTime' },
51       'salt': 'sec:salt',
52       'signature': 'sec:signature',
53       'signatureAlgorithm': 'sec:signingAlgorithm',
54       'signatureValue': 'sec:signatureValue'
55     }
56   }
57 }
58
59 const nodeDocumentLoader = jsonld.documentLoaders.node()
60
61 const lru = new AsyncLRU({
62   max: 10,
63   load: (url, cb) => {
64     if (CACHE[ url ] !== undefined) {
65       logger.debug('Using cache for JSON-LD %s.', url)
66
67       return cb(null, {
68         contextUrl: null,
69         document: CACHE[ url ],
70         documentUrl: url
71       })
72     }
73
74     nodeDocumentLoader(url, cb)
75   }
76 })
77
78 jsonld.documentLoader = (url, cb) => {
79   lru.get(url, cb)
80 }
81
82 jsig.use('jsonld', jsonld)
83
84 export { jsig, jsonld }