updated validation routines

This commit is contained in:
2026-05-06 12:05:03 +00:00
parent 44cd64a1db
commit ce6631359b
4 changed files with 58 additions and 8 deletions

2
.continueignore Normal file
View File

@@ -0,0 +1,2 @@
/data
docker-compose.*.yml

View File

@@ -34,6 +34,7 @@ export async function loadConfig() {
}
if (process.env.PDP_TYPE) config.pdpType = process.env.PDP_TYPE;
if (process.env.PDP_URL) config.pdpUrl = process.env.PDP_URL;
if (process.env.INSTANT_QUEUE) config.instantQueue = process.env.INSTANT_QUEUE;
}
export function getConfig() {

View File

@@ -1,3 +1,4 @@
import { getConfig } from "../common/config.js";
import { getPool } from "../db/index.js";
import { sleep } from "./sleep.js";
import axios from 'axios';
@@ -67,6 +68,10 @@ export async function putQueue(client, type, url, headers, data) {
headers,
data
]);
const config = getConfig();
if (config.instantQueue) {
await processBatch(client, type);
}
}
async function updateQueue(client, item, lastFail) {
@@ -165,18 +170,28 @@ async function processBatch(client, type) {
return queueList.length;
}
async function watchQueue(client, type) {
const repeat = 30 * 1000; // seconds
async function processQueue(client, type) {
while (true) {
const count = await processBatch(client, type);
if (count === 0) {
await sleep(repeat);
break;
}
}
}
async function watchQueue(client, type) {
const repeat = 30 * 1000; // seconds
while (true) {
await processQueue(client, type);
await sleep(repeat);
}
}
export async function watchAudits() {
const client = await getPool();
const config = getConfig();
if (!config.instantQueue) {
await watchQueue(client, 'audit');
await client.release();
}
}

View File

@@ -73,6 +73,23 @@ function validateSignatures(item, signatures, didDocs) {
return res;
}
function validateDidsMatch(auditSigs, targetSigs) {
let match = true;
for (const asig of auditSigs) {
let found = false;
for (const tsig of targetSigs) {
if (tsig.id === asig.id) {
found = true;
break;
}
}
if (!found) {
match = false;
}
}
return match;
}
function generateDigest(content, length) {
if (typeof content === 'object') {
content = stringify(content);
@@ -128,7 +145,7 @@ async function verify(input, userId) {
const existingSignatures = item.eventId
? await event.getSignatures(client, userId, item.eventId)
: await agreement.getSignatures(client, userId, item.agreementId)
// Does the agreement signature verify?
// Does the agreement/event signature verify?
let validSignature = false;
if (validateSignatures(existingItem, existingSignatures, input.didDocs)) {
validSignature = true;
@@ -143,12 +160,14 @@ async function verify(input, userId) {
validAuditSignature: false,
}
}
// Do the agreement IDs match?
// Do the agreement/event IDs match?
if (
(item.agreementId !== null && auditRecord.audit.agreementId === item.agreementId) ||
(item.eventId !== null && auditRecord.audit.eventId === item.eventId)
)
res.results.validId = true;
// Do DID IDs match between audit and target object?
res.results.validMatchingDids = validateDidsMatch(auditRecord.signatures, existingSignatures);
// Does the audit hash match?
// The digest was created from whichever signatures this audit record has
const signatures = [];
@@ -184,6 +203,19 @@ async function verify(input, userId) {
} else {
data.invalid.push(res);
}
// If an event, has the DID signed the agreement and is that signature valid?
if (existingItem.eventId !== null && existingItem.agreementId !== '00000000-0000-0000-0000-000000000000') {
const existingAgreement = await agreement.getAgreement(client, userId, existingItem.agreementId);
const existingAgreementSignatures = await agreement.getSignatures(client, userId, existingItem.agreementId);
res.results.validAgreement = validateDidsMatch(auditRecord.signatures, existingAgreementSignatures);
res.results.validAgreementSignature = false;
if (validateSignatures(existingAgreement, existingAgreementSignatures, input.didDocs)) {
res.results.validAgreementSignature = true;
}
} else {
res.results.validAgreement = true;
res.results.validAgreementSignature = true;
}
}
}
response = {