Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | 30x 30x 30x 977x 977x 5x 3x 27x 71x 24x 27x 54x 27x 27x 27x 1x 26x | import jsonld from 'jsonld';
import VerifierError from '../models/verifierError';
import { sha256 } from '@noble/hashes/sha2.js';
import { Buffer } from 'buffer';
import { preloadedContexts } from '../constants';
import { toUTF8Data } from '../helpers/data';
import { getText } from '../domain/i18n/useCases';
import type { Blockcerts, UnsignedBlockcerts } from '../models/Blockcerts';
import retrieveUnsignedBlockcerts from '../parsers/helpers/retrieveUnsignedBlockcerts';
import { isObject } from '../helpers/object';
export function getUnmappedFields (normalized: string): string[] | null {
const normalizedArray = normalized.split('\n');
const myRegexp = /<http:\/\/fallback\.org\/(.*)>/;
const matches = normalizedArray
.map(normalizedString => myRegexp.exec(normalizedString))
.filter(match => match != null);
if (matches.length > 0) {
const unmappedFields = matches.map(match => match[1]).sort(); // only return name of unmapped key
return Array.from(new Set(unmappedFields)); // dedup
}
return null;
}
export default async function computeLocalHash (document: Blockcerts): Promise<string> {
// the previous implementation was using a reference of @context, thus always adding @vocab to @context,
// thus passing the information down to jsonld regardless of the configuration option. We explicitly do that now,
// since we want to make sure unmapped fields are detected.
if (!document['@context'].find((context: any) => isObject(context) && '@vocab' in context)) {
document['@context'].push({ '@vocab': 'http://fallback.org/' });
}
const theDocument: UnsignedBlockcerts = retrieveUnsignedBlockcerts(document);
const customLoader = function (url): any {
if (url in preloadedContexts) {
return {
contextUrl: null,
document: preloadedContexts[url],
documentUrl: url
};
}
return jsonld.documentLoader(url);
};
const normalizeArgs: any = {
algorithm: 'URDNA2015',
format: 'application/nquads',
documentLoader: customLoader
};
let normalizedDocument;
try {
normalizedDocument = await jsonld.normalize(theDocument, normalizeArgs);
} catch (e) {
console.error(e);
throw new VerifierError('computeLocalHash', getText('errors', 'failedJsonLdNormalization'));
}
const unmappedFields: string[] = getUnmappedFields(normalizedDocument);
if (unmappedFields) {
throw new VerifierError(
'computeLocalHash',
`${getText('errors', 'foundUnmappedFields')}: ${unmappedFields.join(', ')}`
);
} else {
return Buffer.from(sha256(Uint8Array.from(toUTF8Data(normalizedDocument)))).toString('hex');
}
}
|