@pkcprotocol/pkc-js 0.0.35 → 0.0.37

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.
Files changed (162) hide show
  1. package/README.md +18 -0
  2. package/dist/browser/community/remote-community.d.ts +3 -3
  3. package/dist/browser/community/remote-community.js.map +1 -1
  4. package/dist/browser/community/schema.d.ts +24 -0
  5. package/dist/browser/community/schema.js +14 -1
  6. package/dist/browser/community/schema.js.map +1 -1
  7. package/dist/browser/errors.d.ts +5 -1
  8. package/dist/browser/errors.js +4 -0
  9. package/dist/browser/errors.js.map +1 -1
  10. package/dist/browser/generated-version.d.ts +1 -1
  11. package/dist/browser/generated-version.js +1 -1
  12. package/dist/browser/index.d.ts +12 -0
  13. package/dist/browser/pkc/pkc.js +3 -3
  14. package/dist/browser/pkc/pkc.js.map +1 -1
  15. package/dist/browser/pkc-error.d.ts +1 -1
  16. package/dist/browser/publications/comment/schema.d.ts +2 -0
  17. package/dist/browser/publications/comment/schema.js +32 -0
  18. package/dist/browser/publications/comment/schema.js.map +1 -1
  19. package/dist/browser/rpc/src/lib/pkc-js/index.d.ts +6 -0
  20. package/dist/browser/rpc/src/schema.d.ts +36 -0
  21. package/dist/browser/runtime/browser/community/local-community.d.ts +2 -0
  22. package/dist/browser/runtime/browser/community/local-community.js +6 -0
  23. package/dist/browser/runtime/browser/community/local-community.js.map +1 -1
  24. package/dist/browser/runtime/node/community/challenges/index.d.ts +11 -5
  25. package/dist/browser/runtime/node/community/challenges/index.js +40 -5
  26. package/dist/browser/runtime/node/community/challenges/index.js.map +1 -1
  27. package/dist/browser/runtime/node/community/challenges/validate-challenge-result.d.ts +5 -0
  28. package/dist/browser/runtime/node/community/challenges/validate-challenge-result.js +70 -0
  29. package/dist/browser/runtime/node/community/challenges/validate-challenge-result.js.map +1 -0
  30. package/dist/browser/runtime/node/community/db-handler.d.ts +3 -1
  31. package/dist/browser/runtime/node/community/db-handler.js +24 -9
  32. package/dist/browser/runtime/node/community/db-handler.js.map +1 -1
  33. package/dist/browser/runtime/node/community/local-community/challenges.d.ts +27 -0
  34. package/dist/browser/runtime/node/community/local-community/challenges.js +534 -0
  35. package/dist/browser/runtime/node/community/local-community/challenges.js.map +1 -0
  36. package/dist/browser/runtime/node/community/local-community/cleanup.d.ts +9 -0
  37. package/dist/browser/runtime/node/community/local-community/cleanup.js +165 -0
  38. package/dist/browser/runtime/node/community/local-community/cleanup.js.map +1 -0
  39. package/dist/browser/runtime/node/community/local-community/comment-updates.d.ts +11 -0
  40. package/dist/browser/runtime/node/community/local-community/comment-updates.js +218 -0
  41. package/dist/browser/runtime/node/community/local-community/comment-updates.js.map +1 -0
  42. package/dist/browser/runtime/node/community/local-community/db-state.d.ts +15 -0
  43. package/dist/browser/runtime/node/community/local-community/db-state.js +323 -0
  44. package/dist/browser/runtime/node/community/local-community/db-state.js.map +1 -0
  45. package/dist/browser/runtime/node/community/local-community/defaults.d.ts +12 -0
  46. package/dist/browser/runtime/node/community/local-community/defaults.js +29 -0
  47. package/dist/browser/runtime/node/community/local-community/defaults.js.map +1 -0
  48. package/dist/browser/runtime/node/community/local-community/editing.d.ts +10 -0
  49. package/dist/browser/runtime/node/community/local-community/editing.js +188 -0
  50. package/dist/browser/runtime/node/community/local-community/editing.js.map +1 -0
  51. package/dist/browser/runtime/node/community/local-community/ipns-publishing.d.ts +12 -0
  52. package/dist/browser/runtime/node/community/local-community/ipns-publishing.js +340 -0
  53. package/dist/browser/runtime/node/community/local-community/ipns-publishing.js.map +1 -0
  54. package/dist/browser/runtime/node/community/local-community/lifecycle.d.ts +11 -0
  55. package/dist/browser/runtime/node/community/local-community/lifecycle.js +428 -0
  56. package/dist/browser/runtime/node/community/local-community/lifecycle.js.map +1 -0
  57. package/dist/browser/runtime/node/community/local-community/publication-store.d.ts +102 -0
  58. package/dist/browser/runtime/node/community/local-community/publication-store.js +403 -0
  59. package/dist/browser/runtime/node/community/local-community/publication-store.js.map +1 -0
  60. package/dist/browser/runtime/node/community/local-community/publication-validation.d.ts +9 -0
  61. package/dist/browser/runtime/node/community/local-community/publication-validation.js +493 -0
  62. package/dist/browser/runtime/node/community/local-community/publication-validation.js.map +1 -0
  63. package/dist/browser/runtime/node/community/local-community/pubsub.d.ts +3 -0
  64. package/dist/browser/runtime/node/community/local-community/pubsub.js +43 -0
  65. package/dist/browser/runtime/node/community/local-community/pubsub.js.map +1 -0
  66. package/dist/browser/runtime/node/community/local-community/registry.d.ts +3 -0
  67. package/dist/browser/runtime/node/community/local-community/registry.js +4 -0
  68. package/dist/browser/runtime/node/community/local-community/registry.js.map +1 -0
  69. package/dist/browser/runtime/node/community/local-community.d.ts +68 -105
  70. package/dist/browser/runtime/node/community/local-community.js +127 -2927
  71. package/dist/browser/runtime/node/community/local-community.js.map +1 -1
  72. package/dist/browser/schema/schema.d.ts +1 -0
  73. package/dist/browser/schema/schema.js +17 -0
  74. package/dist/browser/schema/schema.js.map +1 -1
  75. package/dist/browser/schema.d.ts +48 -0
  76. package/dist/browser/signer/signatures.d.ts +1 -1
  77. package/dist/browser/signer/signatures.js +9 -2
  78. package/dist/browser/signer/signatures.js.map +1 -1
  79. package/dist/browser/test/test-util.js +0 -1
  80. package/dist/browser/test/test-util.js.map +1 -1
  81. package/dist/browser/version.js +1 -1
  82. package/dist/node/community/remote-community.d.ts +3 -3
  83. package/dist/node/community/remote-community.js.map +1 -1
  84. package/dist/node/community/schema.d.ts +24 -0
  85. package/dist/node/community/schema.js +14 -1
  86. package/dist/node/community/schema.js.map +1 -1
  87. package/dist/node/errors.d.ts +5 -1
  88. package/dist/node/errors.js +4 -0
  89. package/dist/node/errors.js.map +1 -1
  90. package/dist/node/generated-version.d.ts +1 -1
  91. package/dist/node/generated-version.js +1 -1
  92. package/dist/node/index.d.ts +12 -0
  93. package/dist/node/pkc/pkc.js +3 -3
  94. package/dist/node/pkc/pkc.js.map +1 -1
  95. package/dist/node/pkc-error.d.ts +1 -1
  96. package/dist/node/publications/comment/schema.d.ts +2 -0
  97. package/dist/node/publications/comment/schema.js +32 -0
  98. package/dist/node/publications/comment/schema.js.map +1 -1
  99. package/dist/node/rpc/src/lib/pkc-js/index.d.ts +6 -0
  100. package/dist/node/rpc/src/schema.d.ts +36 -0
  101. package/dist/node/runtime/browser/community/local-community.d.ts +2 -0
  102. package/dist/node/runtime/browser/community/local-community.js +6 -0
  103. package/dist/node/runtime/browser/community/local-community.js.map +1 -1
  104. package/dist/node/runtime/node/community/challenges/index.d.ts +11 -5
  105. package/dist/node/runtime/node/community/challenges/index.js +40 -5
  106. package/dist/node/runtime/node/community/challenges/index.js.map +1 -1
  107. package/dist/node/runtime/node/community/challenges/validate-challenge-result.d.ts +5 -0
  108. package/dist/node/runtime/node/community/challenges/validate-challenge-result.js +70 -0
  109. package/dist/node/runtime/node/community/challenges/validate-challenge-result.js.map +1 -0
  110. package/dist/node/runtime/node/community/db-handler.d.ts +3 -1
  111. package/dist/node/runtime/node/community/db-handler.js +24 -9
  112. package/dist/node/runtime/node/community/db-handler.js.map +1 -1
  113. package/dist/node/runtime/node/community/local-community/challenges.d.ts +27 -0
  114. package/dist/node/runtime/node/community/local-community/challenges.js +534 -0
  115. package/dist/node/runtime/node/community/local-community/challenges.js.map +1 -0
  116. package/dist/node/runtime/node/community/local-community/cleanup.d.ts +9 -0
  117. package/dist/node/runtime/node/community/local-community/cleanup.js +165 -0
  118. package/dist/node/runtime/node/community/local-community/cleanup.js.map +1 -0
  119. package/dist/node/runtime/node/community/local-community/comment-updates.d.ts +11 -0
  120. package/dist/node/runtime/node/community/local-community/comment-updates.js +218 -0
  121. package/dist/node/runtime/node/community/local-community/comment-updates.js.map +1 -0
  122. package/dist/node/runtime/node/community/local-community/db-state.d.ts +15 -0
  123. package/dist/node/runtime/node/community/local-community/db-state.js +323 -0
  124. package/dist/node/runtime/node/community/local-community/db-state.js.map +1 -0
  125. package/dist/node/runtime/node/community/local-community/defaults.d.ts +12 -0
  126. package/dist/node/runtime/node/community/local-community/defaults.js +29 -0
  127. package/dist/node/runtime/node/community/local-community/defaults.js.map +1 -0
  128. package/dist/node/runtime/node/community/local-community/editing.d.ts +10 -0
  129. package/dist/node/runtime/node/community/local-community/editing.js +188 -0
  130. package/dist/node/runtime/node/community/local-community/editing.js.map +1 -0
  131. package/dist/node/runtime/node/community/local-community/ipns-publishing.d.ts +12 -0
  132. package/dist/node/runtime/node/community/local-community/ipns-publishing.js +340 -0
  133. package/dist/node/runtime/node/community/local-community/ipns-publishing.js.map +1 -0
  134. package/dist/node/runtime/node/community/local-community/lifecycle.d.ts +11 -0
  135. package/dist/node/runtime/node/community/local-community/lifecycle.js +428 -0
  136. package/dist/node/runtime/node/community/local-community/lifecycle.js.map +1 -0
  137. package/dist/node/runtime/node/community/local-community/publication-store.d.ts +102 -0
  138. package/dist/node/runtime/node/community/local-community/publication-store.js +403 -0
  139. package/dist/node/runtime/node/community/local-community/publication-store.js.map +1 -0
  140. package/dist/node/runtime/node/community/local-community/publication-validation.d.ts +9 -0
  141. package/dist/node/runtime/node/community/local-community/publication-validation.js +493 -0
  142. package/dist/node/runtime/node/community/local-community/publication-validation.js.map +1 -0
  143. package/dist/node/runtime/node/community/local-community/pubsub.d.ts +3 -0
  144. package/dist/node/runtime/node/community/local-community/pubsub.js +43 -0
  145. package/dist/node/runtime/node/community/local-community/pubsub.js.map +1 -0
  146. package/dist/node/runtime/node/community/local-community/registry.d.ts +3 -0
  147. package/dist/node/runtime/node/community/local-community/registry.js +4 -0
  148. package/dist/node/runtime/node/community/local-community/registry.js.map +1 -0
  149. package/dist/node/runtime/node/community/local-community.d.ts +68 -105
  150. package/dist/node/runtime/node/community/local-community.js +127 -2927
  151. package/dist/node/runtime/node/community/local-community.js.map +1 -1
  152. package/dist/node/schema/schema.d.ts +1 -0
  153. package/dist/node/schema/schema.js +17 -0
  154. package/dist/node/schema/schema.js.map +1 -1
  155. package/dist/node/schema.d.ts +48 -0
  156. package/dist/node/signer/signatures.d.ts +1 -1
  157. package/dist/node/signer/signatures.js +9 -2
  158. package/dist/node/signer/signatures.js.map +1 -1
  159. package/dist/node/test/test-util.js +0 -1
  160. package/dist/node/test/test-util.js.map +1 -1
  161. package/dist/node/version.js +1 -1
  162. package/package.json +3 -2
@@ -0,0 +1,534 @@
1
+ import Logger from "../../../../logger.js";
2
+ import * as remeda from "remeda";
3
+ import * as cborg from "cborg";
4
+ import { stringify as deterministicStringify } from "safe-stable-stringify";
5
+ import { derivePublicationFromChallengeRequest, getErrorCodeFromMessage, timestamp } from "../../../../util.js";
6
+ import env from "../../../../version.js";
7
+ import { PKCError } from "../../../../pkc-error.js";
8
+ import { messages } from "../../../../errors.js";
9
+ import { cleanUpBeforePublishing, signChallengeMessage, signChallengeVerification, signCommentUpdateForChallengeVerification, verifyChallengeAnswer, verifyChallengeRequest } from "../../../../signer/signatures.js";
10
+ import { decryptEd25519AesGcmPublicKeyBuffer } from "../../../../signer/index.js";
11
+ import { encryptEd25519AesGcmPublicKeyBuffer } from "../../../../signer/encryption.js";
12
+ import { getPKCAddressFromPublicKey } from "../../../../signer/util.js";
13
+ import { buildRuntimeAuthor, getAuthorNameFromWire } from "../../../../publications/publication-author.js";
14
+ import { CommentIpfsSchema } from "../../../../publications/comment/schema.js";
15
+ import { ChallengeAnswerMessageSchema, ChallengeMessageSchema, ChallengeRequestMessageSchema, ChallengeVerificationMessageSchema, DecryptedChallengeRequestPublicationSchema, DecryptedChallengeRequestSchema } from "../../../../pubsub-messages/schema.js";
16
+ import { parseDecryptedChallengeAnswerWithPKCErrorIfItFails, parseJsonWithPKCErrorIfFails } from "../../../../schema/schema-util.js";
17
+ import { getChallengeVerification } from "../challenges/index.js";
18
+ import { DUPLICATE_PUBLICATION_ERRORS } from "./defaults.js";
19
+ import { pubsubTopicWithfallback } from "./comment-updates.js";
20
+ import { storePublication } from "./publication-store.js";
21
+ import { checkPublicationValidity, respondWithErrorIfSignatureOfPublicationIsInvalid } from "./publication-validation.js";
22
+ export function cleanUpChallengeAnswerPromise(community, challengeRequestIdString) {
23
+ community._challengeAnswerPromises.delete(challengeRequestIdString);
24
+ community._challengeAnswerResolveReject.delete(challengeRequestIdString);
25
+ delete community._challengeExchangesFromLocalPublishers[challengeRequestIdString];
26
+ }
27
+ export async function decryptOrRespondWithFailure(community, request) {
28
+ const log = Logger("pkc-js:local-community:_decryptOrRespondWithFailure");
29
+ try {
30
+ return await decryptEd25519AesGcmPublicKeyBuffer(request.encrypted, community.signer.privateKey, request.signature.publicKey);
31
+ }
32
+ catch (e) {
33
+ log.error(`Failed to decrypt request (${request.challengeRequestId.toString()}) due to error`, e);
34
+ await publishFailedChallengeVerification(community, { reason: messages.ERR_COMMUNITY_FAILED_TO_DECRYPT_PUBSUB_MSG }, request.challengeRequestId);
35
+ throw e;
36
+ }
37
+ }
38
+ export async function publishChallenges(community, challenges, request) {
39
+ const log = Logger("pkc-js:local-community:_publishChallenges");
40
+ const toEncryptChallenge = { challenges };
41
+ const toSignChallenge = cleanUpBeforePublishing({
42
+ type: "CHALLENGE",
43
+ protocolVersion: env.PROTOCOL_VERSION,
44
+ userAgent: community._pkc.userAgent,
45
+ challengeRequestId: request.challengeRequestId,
46
+ encrypted: await encryptEd25519AesGcmPublicKeyBuffer(deterministicStringify(toEncryptChallenge), community.signer.privateKey, request.signature.publicKey),
47
+ timestamp: timestamp()
48
+ });
49
+ const challengeMessage = {
50
+ ...toSignChallenge,
51
+ signature: await signChallengeMessage({ challengeMessage: toSignChallenge, signer: community.signer })
52
+ };
53
+ const pubsubClient = community._clientsManager.getDefaultKuboPubsubClient();
54
+ community._clientsManager.updateKuboRpcPubsubState("publishing-challenge", pubsubClient.url);
55
+ // we only publish over pubsub if the challenge exchange is not ongoing for local publishers
56
+ if (!community._challengeExchangesFromLocalPublishers[request.challengeRequestId.toString()])
57
+ await community._clientsManager.pubsubPublish(pubsubTopicWithfallback(community), challengeMessage);
58
+ log(`Community ${community.address} with pubsub topic ${pubsubTopicWithfallback(community)} published ${challengeMessage.type} over pubsub: `, remeda.pick(toSignChallenge, ["timestamp"]), toEncryptChallenge.challenges.map((challenge) => challenge.type));
59
+ community._clientsManager.updateKuboRpcPubsubState("waiting-challenge-answers", pubsubClient.url);
60
+ community.emit("challenge", {
61
+ ...challengeMessage,
62
+ challenges
63
+ });
64
+ }
65
+ export async function publishFailedChallengeVerification(community, result, challengeRequestId) {
66
+ // challengeSucess=false
67
+ const log = Logger("pkc-js:local-community:_publishFailedChallengeVerification");
68
+ const toSignVerification = cleanUpBeforePublishing({
69
+ type: "CHALLENGEVERIFICATION",
70
+ challengeRequestId: challengeRequestId,
71
+ challengeSuccess: false,
72
+ challengeErrors: result.challengeErrors,
73
+ reason: result.reason,
74
+ userAgent: community._pkc.userAgent,
75
+ protocolVersion: env.PROTOCOL_VERSION,
76
+ timestamp: timestamp()
77
+ });
78
+ const challengeVerification = {
79
+ ...toSignVerification,
80
+ signature: await signChallengeVerification({ challengeVerification: toSignVerification, signer: community.signer })
81
+ };
82
+ const pubsubClient = community._clientsManager.getDefaultKuboPubsubClient();
83
+ community._clientsManager.updateKuboRpcPubsubState("publishing-challenge-verification", pubsubClient.url);
84
+ log(`Will publish ${challengeVerification.type} over pubsub topic ${pubsubTopicWithfallback(community)} on community ${community.address}:`, remeda.omit(toSignVerification, ["challengeRequestId"]));
85
+ if (!community._challengeExchangesFromLocalPublishers[challengeRequestId.toString()])
86
+ await community._clientsManager.pubsubPublish(pubsubTopicWithfallback(community), challengeVerification);
87
+ community._clientsManager.updateKuboRpcPubsubState("waiting-challenge-requests", pubsubClient.url);
88
+ community.emit("challengeverification", challengeVerification);
89
+ community._ongoingChallengeExchanges.delete(challengeRequestId.toString());
90
+ delete community._challengeExchangesFromLocalPublishers[challengeRequestId.toString()];
91
+ cleanUpChallengeAnswerPromise(community, challengeRequestId.toString());
92
+ }
93
+ export async function publishIdempotentDuplicateVerification(community, request, challengeRequestId, duplicateReason) {
94
+ const log = Logger("pkc-js:local-community:_publishIdempotentDuplicateVerification");
95
+ let encrypted;
96
+ let toEncryptDecrypted;
97
+ // For comments, include the existing comment data in the encrypted response
98
+ if (duplicateReason === messages.ERR_DUPLICATE_COMMENT && request.comment) {
99
+ const existingComment = community._dbHandler.queryCommentBySignatureEncoded(request.comment.signature.signature);
100
+ if (!existingComment) {
101
+ return publishFailedChallengeVerification(community, { reason: duplicateReason }, challengeRequestId);
102
+ }
103
+ log("Returning idempotent success for duplicate comment", existingComment.cid);
104
+ const authorSignerAddress = await getPKCAddressFromPublicKey(existingComment.signature.publicKey);
105
+ const authorDomain = getAuthorNameFromWire(existingComment.author);
106
+ const authorCommunity = community._dbHandler.queryCommunityAuthor(authorSignerAddress, authorDomain);
107
+ if (!authorCommunity) {
108
+ return publishFailedChallengeVerification(community, { reason: duplicateReason }, challengeRequestId);
109
+ }
110
+ const commentNumberPostNumber = community._dbHandler._assignNumbersForComment(existingComment.cid);
111
+ const commentUpdateNoSig = cleanUpBeforePublishing({
112
+ author: { community: authorCommunity },
113
+ cid: existingComment.cid,
114
+ protocolVersion: env.PROTOCOL_VERSION,
115
+ ...commentNumberPostNumber
116
+ });
117
+ const commentUpdate = {
118
+ ...commentUpdateNoSig,
119
+ signature: await signCommentUpdateForChallengeVerification({
120
+ update: commentUpdateNoSig,
121
+ signer: community.signer
122
+ })
123
+ };
124
+ const commentIpfs = CommentIpfsSchema.strip().parse(existingComment);
125
+ toEncryptDecrypted = { comment: commentIpfs, commentUpdate };
126
+ encrypted = await encryptEd25519AesGcmPublicKeyBuffer(deterministicStringify(toEncryptDecrypted), community.signer.privateKey, request.signature.publicKey);
127
+ }
128
+ else {
129
+ // For edits/moderations: success has no encrypted data (same as normal success)
130
+ log("Returning idempotent success for duplicate", duplicateReason);
131
+ }
132
+ const toSignMsg = cleanUpBeforePublishing({
133
+ type: "CHALLENGEVERIFICATION",
134
+ challengeRequestId,
135
+ encrypted,
136
+ challengeSuccess: true,
137
+ reason: undefined,
138
+ userAgent: community._pkc.userAgent,
139
+ protocolVersion: env.PROTOCOL_VERSION,
140
+ timestamp: timestamp()
141
+ });
142
+ const challengeVerification = {
143
+ ...toSignMsg,
144
+ signature: await signChallengeVerification({ challengeVerification: toSignMsg, signer: community.signer })
145
+ };
146
+ const pubsubClient = community._clientsManager.getDefaultKuboPubsubClient();
147
+ community._clientsManager.updateKuboRpcPubsubState("publishing-challenge-verification", pubsubClient.url);
148
+ if (!community._challengeExchangesFromLocalPublishers[challengeRequestId.toString()])
149
+ await community._clientsManager.pubsubPublish(pubsubTopicWithfallback(community), challengeVerification);
150
+ community._clientsManager.updateKuboRpcPubsubState("waiting-challenge-requests", pubsubClient.url);
151
+ const objectToEmit = { ...challengeVerification, ...toEncryptDecrypted };
152
+ community.emit("challengeverification", objectToEmit);
153
+ community._ongoingChallengeExchanges.delete(challengeRequestId.toString());
154
+ delete community._challengeExchangesFromLocalPublishers[challengeRequestId.toString()];
155
+ cleanUpChallengeAnswerPromise(community, challengeRequestId.toString());
156
+ }
157
+ export async function storePublicationAndEncryptForChallengeVerification(community, request, pendingApproval, challengeAggregate) {
158
+ const commentAfterAddingToIpfs = await storePublication(community, request, pendingApproval, challengeAggregate);
159
+ if (!commentAfterAddingToIpfs)
160
+ return undefined;
161
+ const authorSignerAddress = await getPKCAddressFromPublicKey(commentAfterAddingToIpfs.comment.signature.publicKey);
162
+ const authorDomain = getAuthorNameFromWire(commentAfterAddingToIpfs.comment.author);
163
+ const authorCommunity = community._dbHandler.queryCommunityAuthor(authorSignerAddress, authorDomain);
164
+ if (!authorCommunity)
165
+ throw Error("author.community can never be undefined after adding a comment");
166
+ const commentNumberPostNumber = community._dbHandler._assignNumbersForComment(commentAfterAddingToIpfs.cid);
167
+ // Spread challenge-supplied commentUpdate fields onto the first commentUpdate. The
168
+ // signedPropertyNames computed at sign time is derived from the actual object keys, so any new
169
+ // keys (e.g. `reason`, `countryCode`) land in the signature.
170
+ const commentUpdateOfVerificationNoSignature = (cleanUpBeforePublishing({
171
+ ...(challengeAggregate?.aggregatedCommentUpdate ?? {}),
172
+ author: { community: authorCommunity },
173
+ cid: commentAfterAddingToIpfs.cid,
174
+ protocolVersion: env.PROTOCOL_VERSION,
175
+ pendingApproval,
176
+ ...commentNumberPostNumber
177
+ }));
178
+ const commentUpdate = {
179
+ ...commentUpdateOfVerificationNoSignature,
180
+ signature: await signCommentUpdateForChallengeVerification({
181
+ update: commentUpdateOfVerificationNoSignature,
182
+ signer: community.signer
183
+ })
184
+ };
185
+ const toEncrypt = { comment: commentAfterAddingToIpfs.comment, commentUpdate };
186
+ const encrypted = await encryptEd25519AesGcmPublicKeyBuffer(deterministicStringify(toEncrypt), community.signer.privateKey, request.signature.publicKey);
187
+ return { ...toEncrypt, encrypted };
188
+ }
189
+ export async function publishChallengeVerification(community, challengeResult, request, pendingApproval, challengeAggregate) {
190
+ const log = Logger("pkc-js:local-community:_publishChallengeVerification");
191
+ if (!challengeResult.challengeSuccess)
192
+ return publishFailedChallengeVerification(community, challengeResult, request.challengeRequestId);
193
+ else {
194
+ // Challenge has passed, we store the publication (except if there's an issue with the publication)
195
+ // call below could fail if the comment is duplicated
196
+ let failureReason;
197
+ let toEncrypt;
198
+ try {
199
+ toEncrypt = await storePublicationAndEncryptForChallengeVerification(community, request, pendingApproval, challengeAggregate);
200
+ }
201
+ catch (e) {
202
+ failureReason = e.message;
203
+ log.error("Failed to store store Publication And Encrypt For ChallengeVerification", e);
204
+ }
205
+ const toSignMsg = cleanUpBeforePublishing({
206
+ type: "CHALLENGEVERIFICATION",
207
+ challengeRequestId: request.challengeRequestId,
208
+ encrypted: toEncrypt?.encrypted, // could be undefined
209
+ challengeErrors: challengeResult.challengeErrors,
210
+ userAgent: community._pkc.userAgent,
211
+ protocolVersion: env.PROTOCOL_VERSION,
212
+ timestamp: timestamp(),
213
+ ...(failureReason ? { reason: failureReason, challengeSuccess: false } : { challengeSuccess: true, reason: undefined })
214
+ });
215
+ const challengeVerification = {
216
+ ...toSignMsg,
217
+ signature: await signChallengeVerification({ challengeVerification: toSignMsg, signer: community.signer })
218
+ };
219
+ const pubsubClient = community._clientsManager.getDefaultKuboPubsubClient();
220
+ community._clientsManager.updateKuboRpcPubsubState("publishing-challenge-verification", pubsubClient.url);
221
+ if (!community._challengeExchangesFromLocalPublishers[request.challengeRequestId.toString()])
222
+ await community._clientsManager.pubsubPublish(pubsubTopicWithfallback(community), challengeVerification);
223
+ community._clientsManager.updateKuboRpcPubsubState("waiting-challenge-requests", pubsubClient.url);
224
+ const objectToEmit = { ...challengeVerification, ...toEncrypt };
225
+ community.emit("challengeverification", objectToEmit);
226
+ community._ongoingChallengeExchanges.delete(request.challengeRequestId.toString());
227
+ delete community._challengeExchangesFromLocalPublishers[request.challengeRequestId.toString()];
228
+ cleanUpChallengeAnswerPromise(community, request.challengeRequestId.toString());
229
+ log.trace(`Published ${challengeVerification.type} over pubsub topic ${pubsubTopicWithfallback(community)}:`, remeda.omit(objectToEmit, ["signature", "encrypted", "challengeRequestId"]));
230
+ }
231
+ }
232
+ export async function parseChallengeRequestPublicationOrRespondWithFailure(community, request, decryptedRawString) {
233
+ let decryptedJson;
234
+ try {
235
+ decryptedJson = parseJsonWithPKCErrorIfFails(decryptedRawString);
236
+ }
237
+ catch (e) {
238
+ await publishFailedChallengeVerification(community, { reason: messages.ERR_REQUEST_ENCRYPTED_IS_INVALID_JSON_AFTER_DECRYPTION }, request.challengeRequestId);
239
+ throw e;
240
+ }
241
+ const parseRes = DecryptedChallengeRequestSchema.loose().safeParse(decryptedJson);
242
+ if (!parseRes.success) {
243
+ await publishFailedChallengeVerification(community, { reason: messages.ERR_REQUEST_ENCRYPTED_HAS_INVALID_SCHEMA_AFTER_DECRYPTING }, request.challengeRequestId);
244
+ throw new PKCError("ERR_REQUEST_ENCRYPTED_HAS_INVALID_SCHEMA_AFTER_DECRYPTING", {
245
+ decryptedJson,
246
+ schemaError: parseRes.error
247
+ });
248
+ }
249
+ return decryptedJson;
250
+ }
251
+ export function buildRuntimeChallengeRequestPublication({ publication, authorCommunity }) {
252
+ return {
253
+ ...publication,
254
+ author: buildRuntimeAuthor({
255
+ author: publication.author,
256
+ signaturePublicKey: publication.signature.publicKey,
257
+ community: authorCommunity
258
+ })
259
+ };
260
+ }
261
+ export function buildRuntimeChallengeRequest({ request, authorCommunity }) {
262
+ // This function needs to be updated everytime we add a new publication type
263
+ const runtimeRequest = remeda.clone(request);
264
+ if (request.comment)
265
+ runtimeRequest.comment = buildRuntimeChallengeRequestPublication({
266
+ publication: request.comment,
267
+ authorCommunity
268
+ });
269
+ if (request.vote)
270
+ runtimeRequest.vote = buildRuntimeChallengeRequestPublication({
271
+ publication: request.vote,
272
+ authorCommunity
273
+ });
274
+ if (request.commentEdit)
275
+ runtimeRequest.commentEdit = buildRuntimeChallengeRequestPublication({
276
+ publication: request.commentEdit,
277
+ authorCommunity
278
+ });
279
+ if (request.commentModeration)
280
+ runtimeRequest.commentModeration = buildRuntimeChallengeRequestPublication({
281
+ publication: request.commentModeration,
282
+ authorCommunity
283
+ });
284
+ if (request.communityEdit)
285
+ runtimeRequest.communityEdit = buildRuntimeChallengeRequestPublication({
286
+ publication: request.communityEdit,
287
+ authorCommunity
288
+ });
289
+ return runtimeRequest;
290
+ }
291
+ // Decrypt, parse, derive the publication, and validate signatures/duplicate fields.
292
+ // Returns the parsed structures, or `undefined` if a failure verification was published and processing should stop.
293
+ async function parseAndValidateChallengeRequest(community, request, log) {
294
+ const decryptedRawString = await decryptOrRespondWithFailure(community, request);
295
+ const decryptedRequest = await parseChallengeRequestPublicationOrRespondWithFailure(community, request, decryptedRawString);
296
+ const publicationFieldNames = remeda.keys.strict(DecryptedChallengeRequestPublicationSchema.shape);
297
+ let publication;
298
+ try {
299
+ publication = derivePublicationFromChallengeRequest(decryptedRequest);
300
+ }
301
+ catch {
302
+ await publishFailedChallengeVerification(community, { reason: messages.ERR_CHALLENGE_REQUEST_ENCRYPTED_HAS_NO_PUBLICATION_AFTER_DECRYPTING }, request.challengeRequestId);
303
+ return undefined;
304
+ }
305
+ let publicationCount = 0;
306
+ publicationFieldNames.forEach((pubField) => {
307
+ if (pubField in decryptedRequest)
308
+ publicationCount++;
309
+ });
310
+ if (publicationCount > 1) {
311
+ await publishFailedChallengeVerification(community, { reason: messages.ERR_CHALLENGE_REQUEST_ENCRYPTED_HAS_MULTIPLE_PUBLICATIONS_AFTER_DECRYPTING }, request.challengeRequestId);
312
+ return undefined;
313
+ }
314
+ // Reject deprecated wire format fields early, before signature verification
315
+ // (these fields are never in signedPropertyNames and would otherwise fail with a generic error)
316
+ if ("subplebbitAddress" in publication) {
317
+ await publishFailedChallengeVerification(community, { reason: messages.ERR_PUBLICATION_USES_DEPRECATED_SUBPLEBBIT_ADDRESS }, request.challengeRequestId);
318
+ return undefined;
319
+ }
320
+ if ("communityAddress" in publication) {
321
+ await publishFailedChallengeVerification(community, { reason: messages.ERR_PUBLICATION_USES_DEPRECATED_COMMUNITY_ADDRESS }, request.challengeRequestId);
322
+ return undefined;
323
+ }
324
+ const authorSignerAddress = await getPKCAddressFromPublicKey(publication.signature.publicKey);
325
+ const authorDomain = getAuthorNameFromWire(publication.author);
326
+ // Check publication props validity
327
+ const communityAuthor = community._dbHandler.queryCommunityAuthor(authorSignerAddress, authorDomain);
328
+ const decryptedRequestMsg = { ...request, ...decryptedRequest };
329
+ const decryptedRequestWithCommunityAuthor = buildRuntimeChallengeRequest({
330
+ request: decryptedRequestMsg,
331
+ authorCommunity: communityAuthor
332
+ });
333
+ try {
334
+ await respondWithErrorIfSignatureOfPublicationIsInvalid(community, decryptedRequestMsg); // This function will throw an error if signature is invalid
335
+ }
336
+ catch (e) {
337
+ log.error("Signature of challengerequest.publication is invalid, emitting an error event and aborting the challenge exchange", e);
338
+ community.emit("challengerequest", decryptedRequestWithCommunityAuthor);
339
+ return undefined;
340
+ }
341
+ log.trace("Received a valid challenge request", decryptedRequestWithCommunityAuthor);
342
+ community.emit("challengerequest", decryptedRequestWithCommunityAuthor);
343
+ const publicationInvalidityReason = await checkPublicationValidity(community, decryptedRequestMsg, publication, communityAuthor);
344
+ if (publicationInvalidityReason) {
345
+ if (DUPLICATE_PUBLICATION_ERRORS.has(publicationInvalidityReason)) {
346
+ const sig = publication.signature.signature;
347
+ const attempts = (community._duplicatePublicationAttempts.get(sig) || 0) + 1;
348
+ community._duplicatePublicationAttempts.set(sig, attempts);
349
+ if (attempts <= 1) {
350
+ await publishIdempotentDuplicateVerification(community, decryptedRequestMsg, request.challengeRequestId, publicationInvalidityReason);
351
+ return undefined;
352
+ }
353
+ }
354
+ await publishFailedChallengeVerification(community, { reason: publicationInvalidityReason }, request.challengeRequestId);
355
+ return undefined;
356
+ }
357
+ return { decryptedRequestMsg, decryptedRequestWithCommunityAuthor, publication, communityAuthor };
358
+ }
359
+ // Runs the challenge exchange (challenges -> answers) for the request, returning the verification result.
360
+ async function runChallengeExchangeIfNeeded(community, parsed, log) {
361
+ const { decryptedRequestWithCommunityAuthor } = parsed;
362
+ const answerPromiseKey = decryptedRequestWithCommunityAuthor.challengeRequestId.toString();
363
+ const getChallengeAnswers = async (challenges) => {
364
+ // ...get challenge answers from user. e.g.:
365
+ // step 1. community publishes challenge pubsub message with `challenges` provided in argument of `getChallengeAnswers`
366
+ // step 2. community waits for challenge answer pubsub message with `challengeAnswers` and then returns `challengeAnswers`
367
+ await publishChallenges(community, challenges, decryptedRequestWithCommunityAuthor);
368
+ const challengeAnswerPromise = new Promise((resolve, reject) => community._challengeAnswerResolveReject.set(answerPromiseKey, { resolve, reject }));
369
+ community._challengeAnswerPromises.set(answerPromiseKey, challengeAnswerPromise);
370
+ const challengeAnswers = await community._challengeAnswerPromises.get(answerPromiseKey);
371
+ if (!challengeAnswers)
372
+ throw Error("Failed to retrieve challenge answers from promise. This is a critical error");
373
+ cleanUpChallengeAnswerPromise(community, answerPromiseKey);
374
+ return challengeAnswers;
375
+ };
376
+ // NOTE: we try to get challenge verification immediately after receiving challenge request
377
+ // because some challenges are automatic and skip the challenge message
378
+ let challengeVerification;
379
+ try {
380
+ challengeVerification = await getChallengeVerification({
381
+ challengeRequestMessage: decryptedRequestWithCommunityAuthor,
382
+ community,
383
+ getChallengeAnswers
384
+ });
385
+ }
386
+ catch (e) {
387
+ // getChallengeVerification will throw if one of the getChallenge function throws, which indicates a bug with the challenge script
388
+ // notify the community owner that that one of his challenge is misconfigured via an error event
389
+ log.error("getChallenge failed, the community owner needs to check the challenge code. The error is: ", e);
390
+ community.emit("error", e);
391
+ // notify the author that his publication wasn't published because the community is misconfigured
392
+ challengeVerification = {
393
+ challengeSuccess: false,
394
+ reason: `One of the community challenges is misconfigured: ${e.message}`
395
+ };
396
+ }
397
+ return challengeVerification;
398
+ }
399
+ // Publishes the final challenge verification (success or failure) including storing the publication on success.
400
+ async function runVerificationAndStorePublication(community, parsed, challengeVerification) {
401
+ const aggregate = {
402
+ aggregatedComment: challengeVerification.aggregatedComment,
403
+ aggregatedCommentUpdate: challengeVerification.aggregatedCommentUpdate,
404
+ aggregatedReason: challengeVerification.aggregatedReason
405
+ };
406
+ // Surface the challenge-supplied aggregatedReason as the published verification.reason on failure.
407
+ const challengeResultForPublish = {
408
+ challengeSuccess: challengeVerification.challengeSuccess,
409
+ challengeErrors: challengeVerification.challengeErrors,
410
+ reason: challengeVerification.reason ?? challengeVerification.aggregatedReason
411
+ };
412
+ await publishChallengeVerification(community, challengeResultForPublish, parsed.decryptedRequestMsg, challengeVerification.pendingApproval, aggregate);
413
+ }
414
+ export async function handleChallengeRequest(community, request, isLocalPublisher) {
415
+ const log = Logger("pkc-js:local-community:handleChallengeRequest");
416
+ if (community._ongoingChallengeExchanges.has(request.challengeRequestId.toString())) {
417
+ log("Received a duplicate challenge request", request.challengeRequestId.toString());
418
+ return; // This is a duplicate challenge request
419
+ }
420
+ if (isLocalPublisher) {
421
+ // we need to mark the challenge exchange as ongoing for local publishers and skip publishing it over pubsub
422
+ log("Marking challenge exchange as ongoing for local publisher");
423
+ community._challengeExchangesFromLocalPublishers[request.challengeRequestId.toString()] = true;
424
+ }
425
+ community._ongoingChallengeExchanges.set(request.challengeRequestId.toString(), true);
426
+ const requestSignatureValidation = await verifyChallengeRequest({ request, validateTimestampRange: true });
427
+ if (!requestSignatureValidation.valid)
428
+ throw new PKCError(getErrorCodeFromMessage(requestSignatureValidation.reason), {
429
+ challengeRequest: remeda.omit(request, ["encrypted"])
430
+ });
431
+ const parsed = await parseAndValidateChallengeRequest(community, request, log);
432
+ if (!parsed)
433
+ return;
434
+ const challengeVerification = await runChallengeExchangeIfNeeded(community, parsed, log);
435
+ if (!challengeVerification)
436
+ return;
437
+ await runVerificationAndStorePublication(community, parsed, challengeVerification);
438
+ }
439
+ export async function parseChallengeAnswerOrRespondWithFailure(community, challengeAnswer, decryptedRawString) {
440
+ let parsedJson;
441
+ try {
442
+ parsedJson = parseJsonWithPKCErrorIfFails(decryptedRawString);
443
+ }
444
+ catch (e) {
445
+ await publishFailedChallengeVerification(community, { reason: messages.ERR_CHALLENGE_ANSWER_IS_INVALID_JSON }, challengeAnswer.challengeRequestId);
446
+ throw e;
447
+ }
448
+ try {
449
+ return parseDecryptedChallengeAnswerWithPKCErrorIfItFails(parsedJson);
450
+ }
451
+ catch (e) {
452
+ await publishFailedChallengeVerification(community, { reason: messages.ERR_CHALLENGE_ANSWER_IS_INVALID_SCHEMA }, challengeAnswer.challengeRequestId);
453
+ throw e;
454
+ }
455
+ }
456
+ export async function handleChallengeAnswer(community, challengeAnswer) {
457
+ const log = Logger("pkc-js:local-community:handleChallengeAnswer");
458
+ if (!community._ongoingChallengeExchanges.has(challengeAnswer.challengeRequestId.toString()))
459
+ // Respond with error to answers without challenge request
460
+ return publishFailedChallengeVerification(community, { reason: messages.ERR_CHALLENGE_ANSWER_WITH_NO_CHALLENGE_REQUEST }, challengeAnswer.challengeRequestId);
461
+ const answerSignatureValidation = await verifyChallengeAnswer({ answer: challengeAnswer, validateTimestampRange: true });
462
+ if (!answerSignatureValidation.valid) {
463
+ cleanUpChallengeAnswerPromise(community, challengeAnswer.challengeRequestId.toString());
464
+ community._ongoingChallengeExchanges.delete(challengeAnswer.challengeRequestId.toString());
465
+ delete community._challengeExchangesFromLocalPublishers[challengeAnswer.challengeRequestId.toString()];
466
+ throw new PKCError(getErrorCodeFromMessage(answerSignatureValidation.reason), { challengeAnswer });
467
+ }
468
+ const decryptedRawString = await decryptOrRespondWithFailure(community, challengeAnswer);
469
+ const decryptedAnswers = await parseChallengeAnswerOrRespondWithFailure(community, challengeAnswer, decryptedRawString);
470
+ const decryptedChallengeAnswerPubsubMessage = { ...challengeAnswer, ...decryptedAnswers };
471
+ community.emit("challengeanswer", decryptedChallengeAnswerPubsubMessage);
472
+ const challengeAnswerPromise = community._challengeAnswerResolveReject.get(challengeAnswer.challengeRequestId.toString());
473
+ if (!challengeAnswerPromise)
474
+ throw Error("The challenge answer promise is undefined, there is an issue with challenge. This is a critical error");
475
+ challengeAnswerPromise.resolve(decryptedChallengeAnswerPubsubMessage.challengeAnswers);
476
+ }
477
+ export async function handleChallengeExchange(community, pubsubMsg) {
478
+ const log = Logger("pkc-js:local-community:handleChallengeExchange");
479
+ const timeReceived = timestamp();
480
+ const pubsubKilobyteSize = Buffer.byteLength(pubsubMsg.data) / 1000;
481
+ if (pubsubKilobyteSize > 80) {
482
+ log.error(`Received a pubsub message at (${timeReceived}) with size of ${pubsubKilobyteSize}. Silently dropping it`);
483
+ return;
484
+ }
485
+ let decodedMsg;
486
+ try {
487
+ decodedMsg = cborg.decode(pubsubMsg.data);
488
+ }
489
+ catch (e) {
490
+ log.error(`Failed to decode pubsub message received at (${timeReceived})`, e.toString());
491
+ return;
492
+ }
493
+ const pubsubSchemas = [
494
+ ChallengeRequestMessageSchema.loose(),
495
+ ChallengeMessageSchema.loose(),
496
+ ChallengeAnswerMessageSchema.loose(),
497
+ ChallengeVerificationMessageSchema.loose()
498
+ ];
499
+ let parsedPubsubMsg;
500
+ for (const pubsubSchema of pubsubSchemas) {
501
+ const parseRes = pubsubSchema.safeParse(decodedMsg);
502
+ if (parseRes.success) {
503
+ parsedPubsubMsg = parseRes.data;
504
+ break;
505
+ }
506
+ }
507
+ if (!parsedPubsubMsg) {
508
+ log.error(`Failed to parse the schema of pubsub message received at (${timeReceived})`, decodedMsg);
509
+ return;
510
+ }
511
+ if (parsedPubsubMsg.type === "CHALLENGE" || parsedPubsubMsg.type === "CHALLENGEVERIFICATION") {
512
+ log.trace(`Received a pubsub message that is not meant to by processed by the community - ${parsedPubsubMsg.type}. Will ignore it`);
513
+ return;
514
+ }
515
+ else if (parsedPubsubMsg.type === "CHALLENGEREQUEST") {
516
+ try {
517
+ await handleChallengeRequest(community, parsedPubsubMsg, false);
518
+ }
519
+ catch (e) {
520
+ log.error(`Failed to process challenge request message received at (${timeReceived})`, e);
521
+ community._dbHandler.rollbackTransaction();
522
+ }
523
+ }
524
+ else if (parsedPubsubMsg.type === "CHALLENGEANSWER") {
525
+ try {
526
+ await handleChallengeAnswer(community, parsedPubsubMsg);
527
+ }
528
+ catch (e) {
529
+ log.error(`Failed to process challenge answer message received at (${timeReceived})`, e);
530
+ community._dbHandler.rollbackTransaction();
531
+ }
532
+ }
533
+ }
534
+ //# sourceMappingURL=challenges.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"challenges.js","sourceRoot":"","sources":["../../../../../../src/runtime/browser/community/local-community/challenges.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { PurgedCommentTableRows } from "../db-handler-types.js";
2
+ import type { LocalCommunity } from "../local-community.js";
3
+ export declare function repinCommentsIPFSIfNeeded(community: LocalCommunity): Promise<void>;
4
+ export declare function unpinStaleCids(community: LocalCommunity): Promise<void>;
5
+ export declare function rmUnneededMfsPaths(community: LocalCommunity): Promise<string[]>;
6
+ export declare function repinCommentUpdateIfNeeded(community: LocalCommunity): Promise<void>;
7
+ export declare function cleanUpIpfsRepoRarely(community: LocalCommunity, force?: boolean): Promise<void>;
8
+ export declare function addAllCidsUnderPurgedCommentToBeRemoved(community: LocalCommunity, purgedCommentAndCommentUpdate: PurgedCommentTableRows): Promise<void>;
9
+ export declare function purgeDisapprovedCommentsOlderThan(community: LocalCommunity): Promise<void>;