Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@
"@tradetrust-tt/token-registry-v4": "npm:@tradetrust-tt/token-registry@^4.16.0",
"@tradetrust-tt/token-registry-v5": "npm:@tradetrust-tt/token-registry@^5.3.0",
"@tradetrust-tt/tradetrust": "^6.10.1",
"@tradetrust-tt/tradetrust-utils": "^2.3.1",
"@tradetrust-tt/tradetrust-utils": "^2.3.2",
"@tradetrust-tt/tt-verify": "^9.4.0",
"@trustvc/w3c-context": "^1.2.13",
"@trustvc/w3c-credential-status": "^1.2.12",
Expand Down
55 changes: 54 additions & 1 deletion src/utils/fragment/index.ts
Original file line number Diff line number Diff line change
@@ -1 +1,54 @@
export { errorMessageHandling, interpretFragments } from '@tradetrust-tt/tradetrust-utils';
import {
errorMessageHandling as OAErrorMessageHandling,
CONSTANTS,
interpretFragments,
} from '@tradetrust-tt/tradetrust-utils';
import { InvalidVerificationFragment, utils, VerificationFragment } from '@tradetrust-tt/tt-verify';
import { W3CCredentialStatusCode } from '../../verify/fragments/document-status/w3cCredentialStatus';
import { CredentialStatusResult } from '@trustvc/w3c-vc';

const getW3CCredentialStatusFragment =
utils.getFragmentByName<InvalidVerificationFragment<CredentialStatusResult>>(
'W3CCredentialStatus',
);

const w3cCredentialStatusRevoked = (fragments: VerificationFragment[]): boolean => {
const issuedFragment = getW3CCredentialStatusFragment(fragments);
return (
issuedFragment?.reason?.code === W3CCredentialStatusCode.DOCUMENT_REVOKED ||
issuedFragment?.reason?.code === W3CCredentialStatusCode.DOCUMENT_REVOKED_AND_SUSPENDED
);
};

const w3cCredentialStatusSuspended = (fragments: VerificationFragment[]): boolean => {
const issuedFragment = getW3CCredentialStatusFragment(fragments);
//checking for both revoked and suspended
return (
issuedFragment?.reason?.code === W3CCredentialStatusCode.DOCUMENT_SUSPENDED ||
issuedFragment?.reason?.code === W3CCredentialStatusCode.DOCUMENT_REVOKED_AND_SUSPENDED
);
};

const errorMessageHandling = (fragments: VerificationFragment[]): string[] => {
const errors = [];
const isW3cFragments = fragments.some(
(f) => f.name.startsWith('W3C') || f.name === 'TransferableRecords',
);
if (isW3cFragments) {
if (w3cCredentialStatusRevoked(fragments)) {
errors.push(CONSTANTS.TYPES.REVOKED);
}
if (w3cCredentialStatusSuspended(fragments)) {
errors.push(CONSTANTS.TYPES.SUSPENDED);
}

return errors;
} else return OAErrorMessageHandling(fragments);
};
Comment thread
nghaninn marked this conversation as resolved.

export {
interpretFragments,
errorMessageHandling,
w3cCredentialStatusRevoked,
w3cCredentialStatusSuspended,
};
37 changes: 36 additions & 1 deletion src/verify/fragments/document-status/w3cCredentialStatus.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,23 @@ import {
} from '@trustvc/w3c-credential-status';
import { CredentialStatus, isSignedDocument, verifyCredentialStatus } from '@trustvc/w3c-vc';
import { SignedVerifiableCredential } from '../../..';

//w3cCredentialStatus enums
export enum W3CCredentialStatusCode {
UNEXPECTED_ERROR = 0,
DOCUMENT_NOT_ISSUED = 1,
CONTRACT_ADDRESS_INVALID = 2,
ETHERS_UNHANDLED_ERROR = 3,
SKIPPED = 4,
DOCUMENT_REVOKED = 5,
DOCUMENT_SUSPENDED = 10,
DOCUMENT_REVOKED_AND_SUSPENDED = 11,
INVALID_ARGUMENT = 6,
CONTRACT_NOT_FOUND = 404,
INVALID_ISSUERS = 7,
INVALID_VALIDATION_METHOD = 8,
UNRECOGNIZED_DOCUMENT = 9,
SERVER_ERROR = 500,
}
export const w3cCredentialStatus: Verifier<VerificationFragment> = {
skip: async () => {
return {
Expand Down Expand Up @@ -47,12 +63,18 @@ export const w3cCredentialStatus: Verifier<VerificationFragment> = {
verifyCredentialStatus(cs, cs?.type as CredentialStatusType, verifierOptions),
),
);
const purposes = verificationResult.map((item) => item.purpose);
const hasRevocation = purposes.includes('revocation');
const hasSuspension = purposes.includes('suspension');
const hasRevocationAndSuspension = hasRevocation && hasSuspension;

if (verificationResult.some((r) => r.error)) {
return {
type: 'DOCUMENT_STATUS',
name: 'W3CCredentialStatus',
reason: {
code: W3CCredentialStatusCode.ETHERS_UNHANDLED_ERROR,
codeString: 'ERROR',
message: verificationResult.map((r) => r.error).join(', '),
},
data: verificationResult,
Expand All @@ -71,6 +93,19 @@ export const w3cCredentialStatus: Verifier<VerificationFragment> = {
name: 'W3CCredentialStatus',
data: verificationResult,
status: 'INVALID',
reason: {
code: hasRevocationAndSuspension
? W3CCredentialStatusCode.DOCUMENT_REVOKED_AND_SUSPENDED
: hasRevocation
? W3CCredentialStatusCode.DOCUMENT_REVOKED
: W3CCredentialStatusCode.DOCUMENT_SUSPENDED,
codeString: hasRevocationAndSuspension
? 'REVOKED_AND_SUSPENDED'
: hasRevocation
? 'REVOKED'
: 'SUSPENDED',
message: 'Document has been revoked or suspended.',
},
};
}
},
Expand Down
Loading