@vlayer/sdk 0.1.0-nightly-20250127-96fc5df → 0.1.0-nightly-20250128-0a32cfc
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/lib/client.d.ts.map +1 -1
- package/dist/api/lib/client.js.map +1 -1
- package/dist/api/prover.d.ts.map +1 -1
- package/dist/api/prover.js +1 -2
- package/dist/api/prover.js.map +1 -1
- package/dist/api/v_call.d.ts +1 -1
- package/dist/api/v_call.d.ts.map +1 -1
- package/dist/api/v_call.js +8 -2
- package/dist/api/v_call.js.map +1 -1
- package/dist/api/v_getProofReceipt.d.ts.map +1 -1
- package/dist/api/v_getProofReceipt.js.map +1 -1
- package/dist/api/webProof/createWebProofRequest.d.ts.map +1 -1
- package/dist/api/webProof/createWebProofRequest.js.map +1 -1
- package/package.json +20 -7
- package/src/api/email/dnsResolver.test.ts +19 -0
- package/src/api/email/dnsResolver.ts +87 -0
- package/src/api/email/parseEmail.test.ts +133 -0
- package/src/api/email/parseEmail.ts +55 -0
- package/src/api/email/preverify.test.ts +201 -0
- package/src/api/email/preverify.ts +70 -0
- package/src/api/email/testdata/test_email.txt +21 -0
- package/src/api/email/testdata/test_email_multiple_dkims.txt +28 -0
- package/src/api/email/testdata/test_email_subdomain.txt +21 -0
- package/src/api/email/testdata/test_email_unknown_domain.txt +21 -0
- package/src/api/lib/client.test.ts +261 -0
- package/src/api/lib/client.ts +191 -0
- package/src/api/lib/errors.ts +19 -0
- package/src/api/lib/types/ethereum.ts +45 -0
- package/src/api/lib/types/index.ts +3 -0
- package/src/api/lib/types/viem.ts +26 -0
- package/src/api/lib/types/vlayer.ts +156 -0
- package/src/api/lib/types/webProofProvider.ts +68 -0
- package/src/api/prover.ts +120 -0
- package/src/api/utils/prefixAllButNthSubstring.test.ts +24 -0
- package/src/api/utils/prefixAllButNthSubstring.ts +13 -0
- package/src/api/utils/versions.test.ts +52 -0
- package/src/api/utils/versions.ts +31 -0
- package/src/api/v_call.ts +58 -0
- package/src/api/v_getProofReceipt.ts +48 -0
- package/src/api/v_versions.ts +68 -0
- package/src/api/webProof/createWebProofRequest.ts +15 -0
- package/src/api/webProof/index.ts +3 -0
- package/src/api/webProof/providers/extension.test.ts +122 -0
- package/src/api/webProof/providers/extension.ts +197 -0
- package/src/api/webProof/providers/index.ts +1 -0
- package/src/api/webProof/steps/expectUrl.ts +12 -0
- package/src/api/webProof/steps/index.ts +11 -0
- package/src/api/webProof/steps/notarize.ts +20 -0
- package/src/api/webProof/steps/startPage.ts +12 -0
- package/src/config/createContext.ts +69 -0
- package/src/config/deploy.ts +108 -0
- package/src/config/getChainConfirmations.ts +6 -0
- package/src/config/getConfig.ts +71 -0
- package/src/config/index.ts +5 -0
- package/src/config/types.ts +26 -0
- package/src/config/writeEnvVariables.ts +28 -0
- package/src/index.ts +7 -0
- package/src/testHelpers/readFile.ts +3 -0
- package/src/web-proof-commons/index.ts +3 -0
- package/src/web-proof-commons/types/message.ts +176 -0
- package/src/web-proof-commons/types/redaction.test.ts +97 -0
- package/src/web-proof-commons/types/redaction.ts +201 -0
- package/src/web-proof-commons/utils.ts +11 -0
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/api/lib/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAoB,MAAM,
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/api/lib/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAoB,MAAM,gBAAgB,CAAC;AACrE,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AA0BjE,eAAO,MAAM,kBAAkB,gCAI1B;IACD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CACrC,KAIA,YAwJF,CAAC"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/api/lib/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuC,MAAM,
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/api/lib/client.ts"],"names":[],"mappings":"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"}
|
package/dist/api/prover.d.ts.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"prover.d.ts","sourceRoot":"","sources":["../../src/api/prover.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,GAAG,EACR,KAAK,kBAAkB,EACvB,KAAK,OAAO,EACZ,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EAG1B,MAAM,MAAM,CAAC;AACd,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,oBAAoB,EACzB,KAAK,YAAY,EAIlB,MAAM,
|
1
|
+
{"version":3,"file":"prover.d.ts","sourceRoot":"","sources":["../../src/api/prover.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,GAAG,EACR,KAAK,kBAAkB,EACvB,KAAK,OAAO,EACZ,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EAG1B,MAAM,MAAM,CAAC;AACd,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,oBAAoB,EACzB,KAAK,YAAY,EAIlB,MAAM,oBAAoB,CAAC;AAU5B,MAAM,WAAW,YAAY;IAC3B,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AASD,wBAAsB,KAAK,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,SAAS,oBAAoB,CAAC,CAAC,CAAC,EAC1E,MAAM,EAAE,OAAO,EACf,GAAG,EAAE,CAAC,EACN,YAAY,EAAE,CAAC,EACf,IAAI,EAAE,oBAAoB,CAAC,CAAC,EAAE,kBAAkB,EAAE,CAAC,CAAC,EACpD,OAAO,GAAE,MAAmB,EAC5B,GAAG,GAAE,MAAgC,EACrC,QAAQ,GAAE,MAAmB,EAC7B,KAAK,CAAC,EAAE,MAAM,EACd,OAAO,GAAE,YAA2C,GACnD,OAAO,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAa5B;AAED,wBAAsB,eAAe,CACnC,CAAC,SAAS,GAAG,EACb,CAAC,SAAS,oBAAoB,CAAC,CAAC,CAAC,EAEjC,IAAI,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,EACvB,GAAG,GAAE,MAAgC,GACpC,OAAO,CAAC,YAAY,CAAC,CAOvB;AAmBD,wBAAsB,YAAY,CAChC,CAAC,SAAS,GAAG,EACb,CAAC,SAAS,oBAAoB,CAAC,CAAC,CAAC,EAEjC,IAAI,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,EACvB,GAAG,EAAE,MAAM,EACX,eAAe,GAAE,MAAY,EAC7B,aAAa,GAAE,MAAa,GAC3B,OAAO,CAAC,oBAAoB,CAAC,CAW/B"}
|
package/dist/api/prover.js
CHANGED
@@ -25,8 +25,7 @@ export async function prove(prover, abi, functionName, args, chainId = foundry.i
|
|
25
25
|
const context = {
|
26
26
|
chain_id: chainId,
|
27
27
|
};
|
28
|
-
const
|
29
|
-
const resp = await v_call(call, context, fullUrl);
|
28
|
+
const resp = await v_call(call, context, url, token);
|
30
29
|
return { hash: resp.result };
|
31
30
|
}
|
32
31
|
export async function getProofReceipt(hash, url = "http://127.0.0.1:3000") {
|
package/dist/api/prover.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"prover.js","sourceRoot":"","sources":["../../src/api/prover.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,kBAAkB,GAEnB,MAAM,MAAM,CAAC;AACd,OAAO,EAML,UAAU,GAGX,MAAM,
|
1
|
+
{"version":3,"file":"prover.js","sourceRoot":"","sources":["../../src/api/prover.ts"],"names":[],"mappings":"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"}
|
package/dist/api/v_call.d.ts
CHANGED
@@ -1,3 +1,3 @@
|
|
1
1
|
import { type CallContext, type CallParams, type VCallResponse } from "./lib/types/vlayer.js";
|
2
|
-
export declare function v_call(call: CallParams, context: CallContext, url?: string): Promise<VCallResponse>;
|
2
|
+
export declare function v_call(call: CallParams, context: CallContext, url?: string, token?: string): Promise<VCallResponse>;
|
3
3
|
//# sourceMappingURL=v_call.d.ts.map
|
package/dist/api/v_call.d.ts.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"v_call.d.ts","sourceRoot":"","sources":["../../src/api/v_call.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,aAAa,EACnB,MAAM,
|
1
|
+
{"version":3,"file":"v_call.d.ts","sourceRoot":"","sources":["../../src/api/v_call.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,aAAa,EACnB,MAAM,oBAAoB,CAAC;AAiB5B,wBAAsB,MAAM,CAC1B,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,WAAW,EACpB,GAAG,GAAE,MAAgC,EACrC,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,aAAa,CAAC,CAyBxB"}
|
package/dist/api/v_call.js
CHANGED
@@ -12,11 +12,17 @@ function v_callBody(call, context) {
|
|
12
12
|
jsonrpc: "2.0",
|
13
13
|
};
|
14
14
|
}
|
15
|
-
export async function v_call(call, context, url = "http://127.0.0.1:3000") {
|
15
|
+
export async function v_call(call, context, url = "http://127.0.0.1:3000", token) {
|
16
|
+
const headers = {
|
17
|
+
"Content-Type": "application/json",
|
18
|
+
};
|
19
|
+
if (token !== undefined) {
|
20
|
+
headers["Authorization"] = "Bearer " + token;
|
21
|
+
}
|
16
22
|
const response = await fetch(url, {
|
17
23
|
method: "POST",
|
18
24
|
body: JSON.stringify(v_callBody(call, context)),
|
19
|
-
headers
|
25
|
+
headers,
|
20
26
|
});
|
21
27
|
log("response", response);
|
22
28
|
if (!response.ok) {
|
package/dist/api/v_call.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"v_call.js","sourceRoot":"","sources":["../../src/api/v_call.ts"],"names":[],"mappings":"AAAA,OAAO,EAIN,MAAM,
|
1
|
+
{"version":3,"file":"v_call.js","sourceRoot":"","sources":["../../src/api/v_call.ts"],"names":[],"mappings":"AAAA,OAAO,EAIN,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,GAAG,GAAG,KAAK,CAAC,eAAe,CAAC,CAAC;AAEnC,SAAS,UAAU,CAAC,IAAgB,EAAE,OAAoB;IACxD,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC1B,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAChC,OAAO;QACL,MAAM,EAAE,QAAQ;QAChB,MAAM,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC;QACvB,EAAE,EAAE,CAAC;QACL,OAAO,EAAE,KAAK;KACf,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,IAAgB,EAChB,OAAoB,EACpB,MAAc,uBAAuB,EACrC,KAAc;IAEd,MAAM,OAAO,GAA2B;QACtC,cAAc,EAAE,kBAAkB;KACnC,CAAC;IACF,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,CAAC,eAAe,CAAC,GAAG,SAAS,GAAG,KAAK,CAAC;IAC/C,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC/C,OAAO;KACR,CAAC,CAAC;IACH,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAC1B,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,uBAAuB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD,MAAM,aAAa,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC5C,GAAG,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;IACpC,YAAY,CAAC,aAAa,CAAC,CAAC;IAC5B,IAAI,OAAO,IAAI,aAAa,EAAE,CAAC;QAC7B,MAAM,uBAAuB,CAC3B,aAAa,CAAC,KAAwC,CACvD,CAAC;IACJ,CAAC;IACD,OAAO,aAAuC,CAAC;AACjD,CAAC;AAED,SAAS,YAAY,CAAC,CAAU;IAC9B,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACrC,CAAC;AACH,CAAC"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"v_getProofReceipt.d.ts","sourceRoot":"","sources":["../../src/api/v_getProofReceipt.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,sBAAsB,EAC3B,KAAK,wBAAwB,EAC9B,MAAM,
|
1
|
+
{"version":3,"file":"v_getProofReceipt.d.ts","sourceRoot":"","sources":["../../src/api/v_getProofReceipt.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,sBAAsB,EAC3B,KAAK,wBAAwB,EAC9B,MAAM,oBAAoB,CAAC;AAgB5B,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,sBAAsB,EAC9B,GAAG,GAAE,MAAgC,GACpC,OAAO,CAAC,wBAAwB,CAAC,CAmBnC"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"v_getProofReceipt.js","sourceRoot":"","sources":["../../src/api/v_getProofReceipt.ts"],"names":[],"mappings":"AAAA,OAAO,EAGN,MAAM,
|
1
|
+
{"version":3,"file":"v_getProofReceipt.js","sourceRoot":"","sources":["../../src/api/v_getProofReceipt.ts"],"names":[],"mappings":"AAAA,OAAO,EAGN,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,GAAG,GAAG,KAAK,CAAC,0BAA0B,CAAC,CAAC;AAE9C,SAAS,qBAAqB,CAAC,MAA8B;IAC3D,OAAO;QACL,MAAM,EAAE,mBAAmB;QAC3B,MAAM,EAAE,MAAM;QACd,EAAE,EAAE,CAAC;QACL,OAAO,EAAE,KAAK;KACf,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAA8B,EAC9B,MAAc,uBAAuB;IAErC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;QACnD,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;KAChD,CAAC,CAAC;IACH,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAC1B,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,uBAAuB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD,MAAM,aAAa,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC5C,GAAG,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;IACpC,YAAY,CAAC,aAAa,CAAC,CAAC;IAC5B,IAAI,OAAO,IAAI,aAAa,EAAE,CAAC;QAC7B,MAAM,uBAAuB,CAC3B,aAAa,CAAC,KAAwC,CACvD,CAAC;IACJ,CAAC;IACD,OAAO,sBAAsB,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,YAAY,CAAC,CAAU;IAC9B,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACrC,CAAC;AACH,CAAC"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"createWebProofRequest.d.ts","sourceRoot":"","sources":["../../../src/api/webProof/createWebProofRequest.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,oBAAoB,EAC1B,MAAM,
|
1
|
+
{"version":3,"file":"createWebProofRequest.d.ts","sourceRoot":"","sources":["../../../src/api/webProof/createWebProofRequest.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,oBAAoB,EAC1B,MAAM,+BAA+B,CAAC;AAEvC,eAAO,MAAM,qBAAqB,wBAG/B,oBAAoB,KAKhB,eACN,CAAC"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"createWebProofRequest.js","sourceRoot":"","sources":["../../../src/api/webProof/createWebProofRequest.ts"],"names":[],"mappings":"AAAA,OAAO,EAGN,MAAM,
|
1
|
+
{"version":3,"file":"createWebProofRequest.js","sourceRoot":"","sources":["../../../src/api/webProof/createWebProofRequest.ts"],"names":[],"mappings":"AAAA,OAAO,EAGN,MAAM,+BAA+B,CAAC;AAEvC,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,EACpC,OAAO,EACP,KAAK,GACgB,EAAE,EAAE;IACzB,OAAO;QACL,OAAO;QACP,KAAK;QACL,UAAU,EAAE,IAAI;KACE,CAAC;AACvB,CAAC,CAAC"}
|
package/package.json
CHANGED
@@ -3,19 +3,31 @@
|
|
3
3
|
"type": "module",
|
4
4
|
"exports": {
|
5
5
|
".": {
|
6
|
-
"import":
|
7
|
-
|
6
|
+
"import": {
|
7
|
+
"development": "./src/index.ts",
|
8
|
+
"default": "./dist/index.js"
|
9
|
+
},
|
10
|
+
"types": "./dist/index.d.ts",
|
11
|
+
"default": "./dist/index.js"
|
8
12
|
},
|
9
13
|
"./web_proof": {
|
10
|
-
"import":
|
11
|
-
|
14
|
+
"import": {
|
15
|
+
"development": "./src/api/webProof/index.ts",
|
16
|
+
"default": "./dist/api/webProof/index.js"
|
17
|
+
},
|
18
|
+
"types": "./dist/api/webProof/index.d.ts",
|
19
|
+
"default": "./dist/api/webProof/index.js"
|
12
20
|
},
|
13
21
|
"./config": {
|
14
|
-
"import":
|
15
|
-
|
22
|
+
"import": {
|
23
|
+
"development": "./src/config/index.ts",
|
24
|
+
"default": "./dist/config/index.js"
|
25
|
+
},
|
26
|
+
"types": "./dist/config/index.d.ts",
|
27
|
+
"default": "./dist/config/index.js"
|
16
28
|
}
|
17
29
|
},
|
18
|
-
"version": "0.1.0-nightly-
|
30
|
+
"version": "0.1.0-nightly-20250128-0a32cfc",
|
19
31
|
"scripts": {
|
20
32
|
"build": "bun tsc --project tsconfig.build.json && bun tsc-alias",
|
21
33
|
"test:unit": "vitest --run",
|
@@ -50,6 +62,7 @@
|
|
50
62
|
},
|
51
63
|
"files": [
|
52
64
|
"dist/",
|
65
|
+
"src/",
|
53
66
|
"package.json",
|
54
67
|
"README.md"
|
55
68
|
]
|
@@ -0,0 +1,19 @@
|
|
1
|
+
import { describe, expect, test } from "vitest";
|
2
|
+
import { DnsResolver } from "./dnsResolver";
|
3
|
+
|
4
|
+
const resolver = new DnsResolver("https://dns.google/resolve");
|
5
|
+
|
6
|
+
describe("resolveDkimDns Integration", () => {
|
7
|
+
test("resolves vlayer DNS", async () => {
|
8
|
+
const resolved = await resolver.resolveDkimDns("google", "vlayer.xyz");
|
9
|
+
const expected =
|
10
|
+
"v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoDLLSKLb3eyflXzeHwBz8qqg9mfpmMY+f1tp+HpwlEOeN5iHO0s4sCd2QbG2i/DJRzryritRnjnc4i2NJ/IJfU8XZdjthotcFUY6rrlFld20a13q8RYBBsETSJhYnBu+DMdIF9q3YxDtXRFNpFCpI1uIeA/x+4qQJm3KTZQWdqi/BVnbsBA6ZryQCOOJC3Ae0oodvz80yfEJUAi9hAGZWqRn+Mprlyu749uQ91pTOYCDCbAn+cqhw8/mY5WMXFqrw9AdfWrk+MwXHPVDWBs8/Hm8xkWxHOqYs9W51oZ/Je3WWeeggyYCZI9V+Czv7eF8BD/yF9UxU/3ZWZPM8EWKKQIDAQAB";
|
11
|
+
expect(resolved.dnsRecord.data).toBe(expected);
|
12
|
+
});
|
13
|
+
|
14
|
+
test("throws error if dns not found", async () => {
|
15
|
+
await expect(
|
16
|
+
resolver.resolveDkimDns("abcd", "not-a-domain.com"),
|
17
|
+
).rejects.toThrow();
|
18
|
+
});
|
19
|
+
});
|
@@ -0,0 +1,87 @@
|
|
1
|
+
import { toByteArray } from "base64-js";
|
2
|
+
import { toHex } from "viem";
|
3
|
+
|
4
|
+
interface DnsResponse {
|
5
|
+
Status: number;
|
6
|
+
TC: boolean;
|
7
|
+
RD: boolean;
|
8
|
+
RA: boolean;
|
9
|
+
AD: boolean;
|
10
|
+
CD: boolean;
|
11
|
+
Question: {
|
12
|
+
name: string;
|
13
|
+
type: number;
|
14
|
+
}[];
|
15
|
+
Answer:
|
16
|
+
| {
|
17
|
+
name: string;
|
18
|
+
type: number;
|
19
|
+
TTL: number;
|
20
|
+
data: string;
|
21
|
+
}[]
|
22
|
+
| undefined;
|
23
|
+
VerificationData:
|
24
|
+
| {
|
25
|
+
valid_until: number;
|
26
|
+
signature: string;
|
27
|
+
pub_key: string;
|
28
|
+
}
|
29
|
+
| undefined;
|
30
|
+
}
|
31
|
+
|
32
|
+
function parseBase64(data: string): `0x${string}` {
|
33
|
+
return toHex(toByteArray(data));
|
34
|
+
}
|
35
|
+
|
36
|
+
function parseVerificationData(response: DnsResponse) {
|
37
|
+
if (!response.VerificationData) {
|
38
|
+
console.warn(`No verification data in DNS response`);
|
39
|
+
return {
|
40
|
+
validUntil: 0n,
|
41
|
+
signature: "0x" as const,
|
42
|
+
pubKey: "0x" as const,
|
43
|
+
};
|
44
|
+
}
|
45
|
+
return {
|
46
|
+
validUntil: BigInt(response.VerificationData.valid_until),
|
47
|
+
signature: parseBase64(response.VerificationData.signature),
|
48
|
+
pubKey: parseBase64(response.VerificationData.pub_key),
|
49
|
+
};
|
50
|
+
}
|
51
|
+
|
52
|
+
function takeLastAnswer(response: DnsResponse) {
|
53
|
+
const answer = response.Answer;
|
54
|
+
if (!answer || answer?.length == 0) {
|
55
|
+
throw new Error(
|
56
|
+
`No DNS answer found\n${JSON.stringify(response, null, 2)}`,
|
57
|
+
);
|
58
|
+
}
|
59
|
+
const record = answer.flat().at(-1)!;
|
60
|
+
return {
|
61
|
+
recordType: record.type,
|
62
|
+
ttl: BigInt(record.TTL),
|
63
|
+
...record,
|
64
|
+
};
|
65
|
+
}
|
66
|
+
|
67
|
+
export class DnsResolver {
|
68
|
+
constructor(private host: string) {}
|
69
|
+
|
70
|
+
async resolveDkimDns(selector: string, domain: string) {
|
71
|
+
const response = (await (
|
72
|
+
await fetch(
|
73
|
+
`${this.host}?name=${selector}._domainkey.${domain}&type=TXT`,
|
74
|
+
{
|
75
|
+
headers: {
|
76
|
+
accept: "application/dns-json",
|
77
|
+
},
|
78
|
+
},
|
79
|
+
)
|
80
|
+
).json()) as DnsResponse;
|
81
|
+
|
82
|
+
return {
|
83
|
+
dnsRecord: takeLastAnswer(response),
|
84
|
+
verificationData: parseVerificationData(response),
|
85
|
+
};
|
86
|
+
}
|
87
|
+
}
|
@@ -0,0 +1,133 @@
|
|
1
|
+
import { describe, expect, test } from "vitest";
|
2
|
+
import { getDkimSigners, parseEmail, parseParams } from "./parseEmail";
|
3
|
+
|
4
|
+
const emailHeaders = `From: "John Doe" <john@d.oe>
|
5
|
+
To: "Jane Doe" <jane@d.oe>
|
6
|
+
Subject: Hello World
|
7
|
+
Date: Thu, 1 Jan 1970 00:00:00 +0000
|
8
|
+
`;
|
9
|
+
|
10
|
+
const dkimHeader =
|
11
|
+
"DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=example.com; h=from:to:subject; s=selector1; b=abcdef;";
|
12
|
+
|
13
|
+
const body = "Hello, World!";
|
14
|
+
|
15
|
+
const emailFixture = `${emailHeaders}${dkimHeader}\n\n${body}`;
|
16
|
+
|
17
|
+
describe("parseEmail", () => {
|
18
|
+
test("should get dkim header from email", async () => {});
|
19
|
+
|
20
|
+
test("correctly parses untrimmed email", async () => {
|
21
|
+
const untrimmed = `\n ${emailFixture} \n`;
|
22
|
+
const email = await parseEmail(untrimmed);
|
23
|
+
expect(email.headers.find((h) => h.key === "dkim-signature")).toBeDefined();
|
24
|
+
});
|
25
|
+
|
26
|
+
test("works well with multiple dkim headers", async () => {
|
27
|
+
const dkimHeader2 =
|
28
|
+
"DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=second.signer; h=from:to:subject; s=selector2; b=abcdef;";
|
29
|
+
|
30
|
+
const email = await parseEmail(
|
31
|
+
`${emailHeaders}${dkimHeader}\n${dkimHeader2}\n\n${body}`,
|
32
|
+
);
|
33
|
+
const dkim = email.headers.filter((h) => h.key === "dkim-signature");
|
34
|
+
|
35
|
+
expect(dkim).toHaveLength(2);
|
36
|
+
expect(parseParams(dkim[0].value).s).toBe("selector1");
|
37
|
+
expect(parseParams(dkim[1].value).s).toBe("selector2");
|
38
|
+
});
|
39
|
+
});
|
40
|
+
|
41
|
+
describe("getDkimSigners", () => {
|
42
|
+
test("should get dkim signers from email", async () => {
|
43
|
+
const email = await parseEmail(emailFixture);
|
44
|
+
const dkim = getDkimSigners(email);
|
45
|
+
expect(dkim).toHaveLength(1);
|
46
|
+
expect(dkim[0].domain).toBe("example.com");
|
47
|
+
expect(dkim[0].selector).toBe("selector1");
|
48
|
+
});
|
49
|
+
|
50
|
+
test("should get multiple dkim signers from email", async () => {
|
51
|
+
const dkimHeader2 =
|
52
|
+
"DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=second.signer; h=from:to:subject; s=selector2; b=abcdef;";
|
53
|
+
const email = await parseEmail(
|
54
|
+
`${emailHeaders}${dkimHeader}\n${dkimHeader2}\n\n${body}`,
|
55
|
+
);
|
56
|
+
|
57
|
+
const dkim = getDkimSigners(email);
|
58
|
+
expect(dkim).toHaveLength(2);
|
59
|
+
expect(dkim[0].domain).toBe("example.com");
|
60
|
+
expect(dkim[0].selector).toBe("selector1");
|
61
|
+
expect(dkim[1].domain).toBe("second.signer");
|
62
|
+
expect(dkim[1].selector).toBe("selector2");
|
63
|
+
});
|
64
|
+
|
65
|
+
test("should throw if no dkim header found", async () => {
|
66
|
+
const email = await parseEmail(emailHeaders);
|
67
|
+
expect(() => getDkimSigners(email)).toThrowError("No DKIM header found");
|
68
|
+
});
|
69
|
+
|
70
|
+
test("should throw if dkim header is invalid", async () => {
|
71
|
+
const email = await parseEmail(
|
72
|
+
`${emailHeaders}DKIM-Signature: invalid\n\n${body}`,
|
73
|
+
);
|
74
|
+
expect(() => getDkimSigners(email)).toThrowError(
|
75
|
+
"DKIM header missing domain",
|
76
|
+
);
|
77
|
+
});
|
78
|
+
|
79
|
+
test("should throw if dkim header is missing domain", async () => {
|
80
|
+
const email = await parseEmail(
|
81
|
+
`${emailHeaders}DKIM-Signature: v=1; s=selector\n\n${body}`,
|
82
|
+
);
|
83
|
+
expect(() => getDkimSigners(email)).toThrowError(
|
84
|
+
"DKIM header missing domain",
|
85
|
+
);
|
86
|
+
});
|
87
|
+
|
88
|
+
test("should throw if dkim header is missing selector", async () => {
|
89
|
+
const email = await parseEmail(
|
90
|
+
`${emailHeaders}DKIM-Signature: v=1; d=example.com\n\n${body}`,
|
91
|
+
);
|
92
|
+
expect(() => getDkimSigners(email)).toThrowError(
|
93
|
+
"DKIM header missing selector",
|
94
|
+
);
|
95
|
+
});
|
96
|
+
});
|
97
|
+
|
98
|
+
describe("parseParams", () => {
|
99
|
+
test("should parse single parameter", () => {
|
100
|
+
const params = parseParams("a=b");
|
101
|
+
expect(params).toEqual({ a: "b" });
|
102
|
+
});
|
103
|
+
|
104
|
+
test("should parse multiple parameters", () => {
|
105
|
+
const params = parseParams("a=b; c=d; e=f");
|
106
|
+
expect(params).toEqual({ a: "b", c: "d", e: "f" });
|
107
|
+
});
|
108
|
+
|
109
|
+
test("should trim spaces around parameters", () => {
|
110
|
+
const params = parseParams(" a = b ; c = d ; e = f ");
|
111
|
+
expect(params).toEqual({ a: "b", c: "d", e: "f" });
|
112
|
+
});
|
113
|
+
|
114
|
+
test("should handle empty values", () => {
|
115
|
+
const params = parseParams("a=; b=c");
|
116
|
+
expect(params).toEqual({ a: "", b: "c" });
|
117
|
+
});
|
118
|
+
|
119
|
+
test("should handle missing values", () => {
|
120
|
+
const params = parseParams("a; b=c");
|
121
|
+
expect(params).toEqual({ a: undefined, b: "c" });
|
122
|
+
});
|
123
|
+
|
124
|
+
test("should handle empty string", () => {
|
125
|
+
const params = parseParams("");
|
126
|
+
expect(params).toEqual({});
|
127
|
+
});
|
128
|
+
|
129
|
+
test("should handle parameters with extra semicolons", () => {
|
130
|
+
const params = parseParams("a=b;; c=d;");
|
131
|
+
expect(params).toEqual({ a: "b", c: "d" });
|
132
|
+
});
|
133
|
+
});
|
@@ -0,0 +1,55 @@
|
|
1
|
+
import PostalMime, { type Email, type Header } from "postal-mime";
|
2
|
+
|
3
|
+
export class DkimParsingError extends Error {
|
4
|
+
constructor(message: string) {
|
5
|
+
super(message);
|
6
|
+
this.name = "DkimParsingError";
|
7
|
+
}
|
8
|
+
}
|
9
|
+
|
10
|
+
export interface DkimDomainSelector {
|
11
|
+
domain: string;
|
12
|
+
selector: string;
|
13
|
+
}
|
14
|
+
|
15
|
+
export async function parseEmail(mime: string) {
|
16
|
+
return await PostalMime.parse(mime.trim());
|
17
|
+
}
|
18
|
+
|
19
|
+
export function getDkimSigners(mail: Email): DkimDomainSelector[] {
|
20
|
+
const dkimHeader = mail.headers.filter((h) => h.key === "dkim-signature");
|
21
|
+
if (dkimHeader.length === 0) {
|
22
|
+
throw new DkimParsingError("No DKIM header found");
|
23
|
+
}
|
24
|
+
return dkimHeader.map(parseHeader);
|
25
|
+
}
|
26
|
+
|
27
|
+
export function parseParams(str: string) {
|
28
|
+
return Object.fromEntries(
|
29
|
+
str.split(";").map((s) =>
|
30
|
+
s
|
31
|
+
.trim()
|
32
|
+
.split("=")
|
33
|
+
.map((v) => v && v.trim()),
|
34
|
+
),
|
35
|
+
) as Record<string, string>;
|
36
|
+
}
|
37
|
+
|
38
|
+
function parseHeader(header: Header): DkimDomainSelector {
|
39
|
+
const params = parseParams(header.value);
|
40
|
+
if (!params) {
|
41
|
+
throw new DkimParsingError(`Invalid DKIM header ${header.value}`);
|
42
|
+
}
|
43
|
+
|
44
|
+
if (!params.d) {
|
45
|
+
throw new DkimParsingError("DKIM header missing domain");
|
46
|
+
}
|
47
|
+
|
48
|
+
if (!params.s) {
|
49
|
+
throw new DkimParsingError("DKIM header missing selector");
|
50
|
+
}
|
51
|
+
return {
|
52
|
+
domain: params.d,
|
53
|
+
selector: params.s,
|
54
|
+
};
|
55
|
+
}
|