Skip to content

Commit

Permalink
feat: #72 - add getIssuerAddress helper
Browse files Browse the repository at this point in the history
  • Loading branch information
Nebulis committed Feb 18, 2020
1 parent c0c6403 commit 2a5297e
Show file tree
Hide file tree
Showing 7 changed files with 146 additions and 10 deletions.
3 changes: 2 additions & 1 deletion src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -64,10 +64,11 @@ export const validateSchema = (document: WrappedDocument): boolean => {
};

export { digestDocument } from "./digest";
export { getData, obfuscateDocument } from "./privacy";
export { obfuscateDocument } from "./privacy";
export { checkProof, MerkleTree, wrap, verify as verifySignature } from "./signature";
export { utils, isSchemaValidationError };
export * from "./@types/document";
export * from "./schema/3.0/w3c";
export { getData } from "./utils"; // keep it to avoid breaking change, moved from privacy to utils
export { v2 };
export { v3 };
3 changes: 2 additions & 1 deletion src/privacy/privacy.test.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { getData, obfuscateData, obfuscateDocument, setData } from "./privacy";
import { obfuscateData, obfuscateDocument, setData } from "./privacy";
import { WrappedDocument } from "../@types/document";
import { getData } from "../utils";

describe("privacy", () => {
describe("obfuscateData", () => {
Expand Down
6 changes: 0 additions & 6 deletions src/privacy/privacy.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,8 @@
import { cloneDeep, pick, unset } from "lodash";
import { flatten } from "../serialize/flatten";
import { toBuffer } from "../utils";
import { unsaltData } from "./salt";
import { DeepStringify, SchematisedDocument, WrappedDocument } from "../@types/document";

type Extract<P> = P extends WrappedDocument<infer T> ? T : never;
export const getData = <T extends { data: any }>(document: T): Extract<T> => {
return unsaltData(document.data);
};

/**
* Takes a partial originating document, possibly only with a schema.id and returns a document with the given data and obfuscated data
* @param document the metadata container
Expand Down
2 changes: 1 addition & 1 deletion src/schema/3.0/w3c.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { WrappedDocument } from "../../@types/document";
import { getData } from "../../privacy/privacy";
import { getData } from "../../utils";
import { OpenAttestationDocument } from "../../__generated__/schemaV3";

interface Salt {
Expand Down
2 changes: 1 addition & 1 deletion src/schema/schema.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import Ajv from "ajv";
import { getData } from "../privacy";
import { getLogger } from "../logger";
import openAttestationSchemav2 from "./2.0/schema.json";
import openAttestationSchemav3 from "./3.0/schema.json";
import { getData } from "../utils";

const logger = getLogger("validate");

Expand Down
112 changes: 112 additions & 0 deletions src/utils/utils.test.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,14 @@
import * as utils from "./utils";
import { wrapDocument } from "..";
import { WrappedDocument } from "../@types/document";
import { OpenAttestationDocument as v2OpenAttestationDocument } from "../__generated__/schemaV2";
import {
IdentityProofType,
Method,
OpenAttestationDocument as v3OpenAttestationDocument,
ProofType,
TemplateType
} from "../__generated__/schemaV3";

describe("Util Functions", () => {
describe("hashArray", () => {
Expand Down Expand Up @@ -96,4 +106,106 @@ describe("Util Functions", () => {
).toBe("660c9a8d0051d07b1abd38e8a6f68076d98fdf948abd2a13e2870fe08a1343cc");
});
});

describe("getIssuerAddress", () => {
test("should return all issuers address for v2 document using certificate store", () => {
const document: WrappedDocument<v2OpenAttestationDocument> = wrapDocument({
issuers: [
{
certificateStore: "0xabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd",
name: "nameA"
},
{
certificateStore: "0x1234123412341234123412341234123412341234",
name: "nameA"
}
]
});
expect(utils.getIssuerAddress(document)).toStrictEqual([
"0xabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd",
"0x1234123412341234123412341234123412341234"
]);
});
test("should return all issuers address for v2 document using document store", () => {
const document: WrappedDocument<v2OpenAttestationDocument> = wrapDocument({
issuers: [
{
documentStore: "0xabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd",
identityProof: {
type: IdentityProofType.DNSTxt,
location: ""
},
name: "nameA"
},
{
documentStore: "0x1234123412341234123412341234123412341234",
identityProof: {
type: IdentityProofType.DNSTxt,
location: ""
},
name: "nameA"
}
]
});
expect(utils.getIssuerAddress(document)).toStrictEqual([
"0xabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd",
"0x1234123412341234123412341234123412341234"
]);
});
test("should return all issuers address for v2 document using token registry", () => {
const document: WrappedDocument<v2OpenAttestationDocument> = wrapDocument({
issuers: [
{
tokenRegistry: "0xabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd",
identityProof: {
type: IdentityProofType.DNSTxt,
location: ""
},
name: "nameA"
},
{
tokenRegistry: "0x1234123412341234123412341234123412341234",
identityProof: {
type: IdentityProofType.DNSTxt,
location: ""
},
name: "nameA"
}
]
});
expect(utils.getIssuerAddress(document)).toStrictEqual([
"0xabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd",
"0x1234123412341234123412341234123412341234"
]);
});
test("should return all issuers address for v3 document", () => {
const document: WrappedDocument<v3OpenAttestationDocument> = wrapDocument(
{
issuer: {
name: "name",
identityProof: {
location: "whatever",
type: IdentityProofType.DNSTxt
},
id: "https://example.com"
},
proof: {
value: "0xabcf",
type: ProofType.OpenAttestationSignature2018,
method: Method.DocumentStore
},
name: "",
reference: "",
template: {
url: "https://",
name: "",
type: TemplateType.EmbeddedRenderer
},
validFrom: "2010-01-01T19:23:24Z"
},
{ version: "open-attestation/3.0" }
);
expect(utils.getIssuerAddress(document)).toStrictEqual("0xabcf");
});
});
});
28 changes: 28 additions & 0 deletions src/utils/utils.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,14 @@
import { keccak256 } from "js-sha3";
import { OpenAttestationDocument as v2OpenAttestationDocument } from "../__generated__/schemaV2";
import { OpenAttestationDocument as v3OpenAttestationDocument } from "../__generated__/schemaV3";
import { WrappedDocument } from "../@types/document";
import { unsaltData } from "../privacy/salt";

export type Hash = string | Buffer;
type Extract<P> = P extends WrappedDocument<infer T> ? T : never;
export const getData = <T extends { data: any }>(document: T): Extract<T> => {
return unsaltData(document.data);
};

/**
* Sorts the given Buffers lexicographically and then concatenates them to form one continuous Buffer
Expand Down Expand Up @@ -56,5 +64,25 @@ export function combineHashString(first?: string, second?: string): string {
(first || second)!; // this should always return a value right ? :)
}

export const isWrappedV3Document = (document: any): document is WrappedDocument<v3OpenAttestationDocument> => {
return document && document.version === "open-attestation/3.0";
};
export const isWrappedV2Document = (document: any): document is WrappedDocument<v2OpenAttestationDocument> => {
return !isWrappedV3Document(document);
};

export function getIssuerAddress(param: WrappedDocument<v2OpenAttestationDocument>): string[];
export function getIssuerAddress(param: WrappedDocument<v3OpenAttestationDocument>): string;
export function getIssuerAddress(document: any): any {
if (isWrappedV2Document(document)) {
const data = getData(document);
return data.issuers.map(issuer => issuer.certificateStore || issuer.documentStore || issuer.tokenRegistry);
} else if (isWrappedV3Document(document)) {
const data = getData(document);
return data.proof.value;
}
throw new Error("");
}

// make it available for consumers
export { keccak256 } from "js-sha3";

0 comments on commit 2a5297e

Please sign in to comment.