@pkcprotocol/pkc-js 0.0.35 → 0.0.36
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/README.md +18 -0
- package/dist/browser/community/remote-community.d.ts +3 -3
- package/dist/browser/community/remote-community.js.map +1 -1
- package/dist/browser/generated-version.d.ts +1 -1
- package/dist/browser/generated-version.js +1 -1
- package/dist/browser/pkc/pkc.js +3 -3
- package/dist/browser/pkc/pkc.js.map +1 -1
- package/dist/browser/runtime/browser/community/local-community.d.ts +2 -0
- package/dist/browser/runtime/browser/community/local-community.js +6 -0
- package/dist/browser/runtime/browser/community/local-community.js.map +1 -1
- package/dist/browser/runtime/node/community/db-handler.js +6 -4
- package/dist/browser/runtime/node/community/db-handler.js.map +1 -1
- package/dist/browser/runtime/node/community/local-community/challenges.d.ts +26 -0
- package/dist/browser/runtime/node/community/local-community/challenges.js +519 -0
- package/dist/browser/runtime/node/community/local-community/challenges.js.map +1 -0
- package/dist/browser/runtime/node/community/local-community/cleanup.d.ts +9 -0
- package/dist/browser/runtime/node/community/local-community/cleanup.js +165 -0
- package/dist/browser/runtime/node/community/local-community/cleanup.js.map +1 -0
- package/dist/browser/runtime/node/community/local-community/comment-updates.d.ts +11 -0
- package/dist/browser/runtime/node/community/local-community/comment-updates.js +218 -0
- package/dist/browser/runtime/node/community/local-community/comment-updates.js.map +1 -0
- package/dist/browser/runtime/node/community/local-community/db-state.d.ts +15 -0
- package/dist/browser/runtime/node/community/local-community/db-state.js +323 -0
- package/dist/browser/runtime/node/community/local-community/db-state.js.map +1 -0
- package/dist/browser/runtime/node/community/local-community/defaults.d.ts +12 -0
- package/dist/browser/runtime/node/community/local-community/defaults.js +29 -0
- package/dist/browser/runtime/node/community/local-community/defaults.js.map +1 -0
- package/dist/browser/runtime/node/community/local-community/editing.d.ts +10 -0
- package/dist/browser/runtime/node/community/local-community/editing.js +188 -0
- package/dist/browser/runtime/node/community/local-community/editing.js.map +1 -0
- package/dist/browser/runtime/node/community/local-community/ipns-publishing.d.ts +12 -0
- package/dist/browser/runtime/node/community/local-community/ipns-publishing.js +340 -0
- package/dist/browser/runtime/node/community/local-community/ipns-publishing.js.map +1 -0
- package/dist/browser/runtime/node/community/local-community/lifecycle.d.ts +11 -0
- package/dist/browser/runtime/node/community/local-community/lifecycle.js +428 -0
- package/dist/browser/runtime/node/community/local-community/lifecycle.js.map +1 -0
- package/dist/browser/runtime/node/community/local-community/publication-store.d.ts +100 -0
- package/dist/browser/runtime/node/community/local-community/publication-store.js +395 -0
- package/dist/browser/runtime/node/community/local-community/publication-store.js.map +1 -0
- package/dist/browser/runtime/node/community/local-community/publication-validation.d.ts +9 -0
- package/dist/browser/runtime/node/community/local-community/publication-validation.js +493 -0
- package/dist/browser/runtime/node/community/local-community/publication-validation.js.map +1 -0
- package/dist/browser/runtime/node/community/local-community/pubsub.d.ts +3 -0
- package/dist/browser/runtime/node/community/local-community/pubsub.js +43 -0
- package/dist/browser/runtime/node/community/local-community/pubsub.js.map +1 -0
- package/dist/browser/runtime/node/community/local-community/registry.d.ts +3 -0
- package/dist/browser/runtime/node/community/local-community/registry.js +4 -0
- package/dist/browser/runtime/node/community/local-community/registry.js.map +1 -0
- package/dist/browser/runtime/node/community/local-community.d.ts +68 -105
- package/dist/browser/runtime/node/community/local-community.js +127 -2927
- package/dist/browser/runtime/node/community/local-community.js.map +1 -1
- package/dist/browser/test/test-util.js +0 -1
- package/dist/browser/test/test-util.js.map +1 -1
- package/dist/node/community/remote-community.d.ts +3 -3
- package/dist/node/community/remote-community.js.map +1 -1
- package/dist/node/generated-version.d.ts +1 -1
- package/dist/node/generated-version.js +1 -1
- package/dist/node/pkc/pkc.js +3 -3
- package/dist/node/pkc/pkc.js.map +1 -1
- package/dist/node/runtime/browser/community/local-community.d.ts +2 -0
- package/dist/node/runtime/browser/community/local-community.js +6 -0
- package/dist/node/runtime/browser/community/local-community.js.map +1 -1
- package/dist/node/runtime/node/community/db-handler.js +6 -4
- package/dist/node/runtime/node/community/db-handler.js.map +1 -1
- package/dist/node/runtime/node/community/local-community/challenges.d.ts +26 -0
- package/dist/node/runtime/node/community/local-community/challenges.js +519 -0
- package/dist/node/runtime/node/community/local-community/challenges.js.map +1 -0
- package/dist/node/runtime/node/community/local-community/cleanup.d.ts +9 -0
- package/dist/node/runtime/node/community/local-community/cleanup.js +165 -0
- package/dist/node/runtime/node/community/local-community/cleanup.js.map +1 -0
- package/dist/node/runtime/node/community/local-community/comment-updates.d.ts +11 -0
- package/dist/node/runtime/node/community/local-community/comment-updates.js +218 -0
- package/dist/node/runtime/node/community/local-community/comment-updates.js.map +1 -0
- package/dist/node/runtime/node/community/local-community/db-state.d.ts +15 -0
- package/dist/node/runtime/node/community/local-community/db-state.js +323 -0
- package/dist/node/runtime/node/community/local-community/db-state.js.map +1 -0
- package/dist/node/runtime/node/community/local-community/defaults.d.ts +12 -0
- package/dist/node/runtime/node/community/local-community/defaults.js +29 -0
- package/dist/node/runtime/node/community/local-community/defaults.js.map +1 -0
- package/dist/node/runtime/node/community/local-community/editing.d.ts +10 -0
- package/dist/node/runtime/node/community/local-community/editing.js +188 -0
- package/dist/node/runtime/node/community/local-community/editing.js.map +1 -0
- package/dist/node/runtime/node/community/local-community/ipns-publishing.d.ts +12 -0
- package/dist/node/runtime/node/community/local-community/ipns-publishing.js +340 -0
- package/dist/node/runtime/node/community/local-community/ipns-publishing.js.map +1 -0
- package/dist/node/runtime/node/community/local-community/lifecycle.d.ts +11 -0
- package/dist/node/runtime/node/community/local-community/lifecycle.js +428 -0
- package/dist/node/runtime/node/community/local-community/lifecycle.js.map +1 -0
- package/dist/node/runtime/node/community/local-community/publication-store.d.ts +100 -0
- package/dist/node/runtime/node/community/local-community/publication-store.js +395 -0
- package/dist/node/runtime/node/community/local-community/publication-store.js.map +1 -0
- package/dist/node/runtime/node/community/local-community/publication-validation.d.ts +9 -0
- package/dist/node/runtime/node/community/local-community/publication-validation.js +493 -0
- package/dist/node/runtime/node/community/local-community/publication-validation.js.map +1 -0
- package/dist/node/runtime/node/community/local-community/pubsub.d.ts +3 -0
- package/dist/node/runtime/node/community/local-community/pubsub.js +43 -0
- package/dist/node/runtime/node/community/local-community/pubsub.js.map +1 -0
- package/dist/node/runtime/node/community/local-community/registry.d.ts +3 -0
- package/dist/node/runtime/node/community/local-community/registry.js +4 -0
- package/dist/node/runtime/node/community/local-community/registry.js.map +1 -0
- package/dist/node/runtime/node/community/local-community.d.ts +68 -105
- package/dist/node/runtime/node/community/local-community.js +127 -2927
- package/dist/node/runtime/node/community/local-community.js.map +1 -1
- package/dist/node/test/test-util.js +0 -1
- package/dist/node/test/test-util.js.map +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,519 @@
|
|
|
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) {
|
|
158
|
+
const commentAfterAddingToIpfs = await storePublication(community, request, pendingApproval);
|
|
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
|
+
const commentUpdateOfVerificationNoSignature = (cleanUpBeforePublishing({
|
|
168
|
+
author: { community: authorCommunity },
|
|
169
|
+
cid: commentAfterAddingToIpfs.cid,
|
|
170
|
+
protocolVersion: env.PROTOCOL_VERSION,
|
|
171
|
+
pendingApproval,
|
|
172
|
+
...commentNumberPostNumber
|
|
173
|
+
}));
|
|
174
|
+
const commentUpdate = {
|
|
175
|
+
...commentUpdateOfVerificationNoSignature,
|
|
176
|
+
signature: await signCommentUpdateForChallengeVerification({
|
|
177
|
+
update: commentUpdateOfVerificationNoSignature,
|
|
178
|
+
signer: community.signer
|
|
179
|
+
})
|
|
180
|
+
};
|
|
181
|
+
const toEncrypt = { comment: commentAfterAddingToIpfs.comment, commentUpdate };
|
|
182
|
+
const encrypted = await encryptEd25519AesGcmPublicKeyBuffer(deterministicStringify(toEncrypt), community.signer.privateKey, request.signature.publicKey);
|
|
183
|
+
return { ...toEncrypt, encrypted };
|
|
184
|
+
}
|
|
185
|
+
export async function publishChallengeVerification(community, challengeResult, request, pendingApproval) {
|
|
186
|
+
const log = Logger("pkc-js:local-community:_publishChallengeVerification");
|
|
187
|
+
if (!challengeResult.challengeSuccess)
|
|
188
|
+
return publishFailedChallengeVerification(community, challengeResult, request.challengeRequestId);
|
|
189
|
+
else {
|
|
190
|
+
// Challenge has passed, we store the publication (except if there's an issue with the publication)
|
|
191
|
+
// call below could fail if the comment is duplicated
|
|
192
|
+
let failureReason;
|
|
193
|
+
let toEncrypt;
|
|
194
|
+
try {
|
|
195
|
+
toEncrypt = await storePublicationAndEncryptForChallengeVerification(community, request, pendingApproval);
|
|
196
|
+
}
|
|
197
|
+
catch (e) {
|
|
198
|
+
failureReason = e.message;
|
|
199
|
+
log.error("Failed to store store Publication And Encrypt For ChallengeVerification", e);
|
|
200
|
+
}
|
|
201
|
+
const toSignMsg = cleanUpBeforePublishing({
|
|
202
|
+
type: "CHALLENGEVERIFICATION",
|
|
203
|
+
challengeRequestId: request.challengeRequestId,
|
|
204
|
+
encrypted: toEncrypt?.encrypted, // could be undefined
|
|
205
|
+
challengeErrors: challengeResult.challengeErrors,
|
|
206
|
+
userAgent: community._pkc.userAgent,
|
|
207
|
+
protocolVersion: env.PROTOCOL_VERSION,
|
|
208
|
+
timestamp: timestamp(),
|
|
209
|
+
...(failureReason ? { reason: failureReason, challengeSuccess: false } : { challengeSuccess: true, reason: undefined })
|
|
210
|
+
});
|
|
211
|
+
const challengeVerification = {
|
|
212
|
+
...toSignMsg,
|
|
213
|
+
signature: await signChallengeVerification({ challengeVerification: toSignMsg, signer: community.signer })
|
|
214
|
+
};
|
|
215
|
+
const pubsubClient = community._clientsManager.getDefaultKuboPubsubClient();
|
|
216
|
+
community._clientsManager.updateKuboRpcPubsubState("publishing-challenge-verification", pubsubClient.url);
|
|
217
|
+
if (!community._challengeExchangesFromLocalPublishers[request.challengeRequestId.toString()])
|
|
218
|
+
await community._clientsManager.pubsubPublish(pubsubTopicWithfallback(community), challengeVerification);
|
|
219
|
+
community._clientsManager.updateKuboRpcPubsubState("waiting-challenge-requests", pubsubClient.url);
|
|
220
|
+
const objectToEmit = { ...challengeVerification, ...toEncrypt };
|
|
221
|
+
community.emit("challengeverification", objectToEmit);
|
|
222
|
+
community._ongoingChallengeExchanges.delete(request.challengeRequestId.toString());
|
|
223
|
+
delete community._challengeExchangesFromLocalPublishers[request.challengeRequestId.toString()];
|
|
224
|
+
cleanUpChallengeAnswerPromise(community, request.challengeRequestId.toString());
|
|
225
|
+
log.trace(`Published ${challengeVerification.type} over pubsub topic ${pubsubTopicWithfallback(community)}:`, remeda.omit(objectToEmit, ["signature", "encrypted", "challengeRequestId"]));
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
export async function parseChallengeRequestPublicationOrRespondWithFailure(community, request, decryptedRawString) {
|
|
229
|
+
let decryptedJson;
|
|
230
|
+
try {
|
|
231
|
+
decryptedJson = parseJsonWithPKCErrorIfFails(decryptedRawString);
|
|
232
|
+
}
|
|
233
|
+
catch (e) {
|
|
234
|
+
await publishFailedChallengeVerification(community, { reason: messages.ERR_REQUEST_ENCRYPTED_IS_INVALID_JSON_AFTER_DECRYPTION }, request.challengeRequestId);
|
|
235
|
+
throw e;
|
|
236
|
+
}
|
|
237
|
+
const parseRes = DecryptedChallengeRequestSchema.loose().safeParse(decryptedJson);
|
|
238
|
+
if (!parseRes.success) {
|
|
239
|
+
await publishFailedChallengeVerification(community, { reason: messages.ERR_REQUEST_ENCRYPTED_HAS_INVALID_SCHEMA_AFTER_DECRYPTING }, request.challengeRequestId);
|
|
240
|
+
throw new PKCError("ERR_REQUEST_ENCRYPTED_HAS_INVALID_SCHEMA_AFTER_DECRYPTING", {
|
|
241
|
+
decryptedJson,
|
|
242
|
+
schemaError: parseRes.error
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
return decryptedJson;
|
|
246
|
+
}
|
|
247
|
+
export function buildRuntimeChallengeRequestPublication({ publication, authorCommunity }) {
|
|
248
|
+
return {
|
|
249
|
+
...publication,
|
|
250
|
+
author: buildRuntimeAuthor({
|
|
251
|
+
author: publication.author,
|
|
252
|
+
signaturePublicKey: publication.signature.publicKey,
|
|
253
|
+
community: authorCommunity
|
|
254
|
+
})
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
export function buildRuntimeChallengeRequest({ request, authorCommunity }) {
|
|
258
|
+
// This function needs to be updated everytime we add a new publication type
|
|
259
|
+
const runtimeRequest = remeda.clone(request);
|
|
260
|
+
if (request.comment)
|
|
261
|
+
runtimeRequest.comment = buildRuntimeChallengeRequestPublication({
|
|
262
|
+
publication: request.comment,
|
|
263
|
+
authorCommunity
|
|
264
|
+
});
|
|
265
|
+
if (request.vote)
|
|
266
|
+
runtimeRequest.vote = buildRuntimeChallengeRequestPublication({
|
|
267
|
+
publication: request.vote,
|
|
268
|
+
authorCommunity
|
|
269
|
+
});
|
|
270
|
+
if (request.commentEdit)
|
|
271
|
+
runtimeRequest.commentEdit = buildRuntimeChallengeRequestPublication({
|
|
272
|
+
publication: request.commentEdit,
|
|
273
|
+
authorCommunity
|
|
274
|
+
});
|
|
275
|
+
if (request.commentModeration)
|
|
276
|
+
runtimeRequest.commentModeration = buildRuntimeChallengeRequestPublication({
|
|
277
|
+
publication: request.commentModeration,
|
|
278
|
+
authorCommunity
|
|
279
|
+
});
|
|
280
|
+
if (request.communityEdit)
|
|
281
|
+
runtimeRequest.communityEdit = buildRuntimeChallengeRequestPublication({
|
|
282
|
+
publication: request.communityEdit,
|
|
283
|
+
authorCommunity
|
|
284
|
+
});
|
|
285
|
+
return runtimeRequest;
|
|
286
|
+
}
|
|
287
|
+
// Decrypt, parse, derive the publication, and validate signatures/duplicate fields.
|
|
288
|
+
// Returns the parsed structures, or `undefined` if a failure verification was published and processing should stop.
|
|
289
|
+
async function parseAndValidateChallengeRequest(community, request, log) {
|
|
290
|
+
const decryptedRawString = await decryptOrRespondWithFailure(community, request);
|
|
291
|
+
const decryptedRequest = await parseChallengeRequestPublicationOrRespondWithFailure(community, request, decryptedRawString);
|
|
292
|
+
const publicationFieldNames = remeda.keys.strict(DecryptedChallengeRequestPublicationSchema.shape);
|
|
293
|
+
let publication;
|
|
294
|
+
try {
|
|
295
|
+
publication = derivePublicationFromChallengeRequest(decryptedRequest);
|
|
296
|
+
}
|
|
297
|
+
catch {
|
|
298
|
+
await publishFailedChallengeVerification(community, { reason: messages.ERR_CHALLENGE_REQUEST_ENCRYPTED_HAS_NO_PUBLICATION_AFTER_DECRYPTING }, request.challengeRequestId);
|
|
299
|
+
return undefined;
|
|
300
|
+
}
|
|
301
|
+
let publicationCount = 0;
|
|
302
|
+
publicationFieldNames.forEach((pubField) => {
|
|
303
|
+
if (pubField in decryptedRequest)
|
|
304
|
+
publicationCount++;
|
|
305
|
+
});
|
|
306
|
+
if (publicationCount > 1) {
|
|
307
|
+
await publishFailedChallengeVerification(community, { reason: messages.ERR_CHALLENGE_REQUEST_ENCRYPTED_HAS_MULTIPLE_PUBLICATIONS_AFTER_DECRYPTING }, request.challengeRequestId);
|
|
308
|
+
return undefined;
|
|
309
|
+
}
|
|
310
|
+
// Reject deprecated wire format fields early, before signature verification
|
|
311
|
+
// (these fields are never in signedPropertyNames and would otherwise fail with a generic error)
|
|
312
|
+
if ("subplebbitAddress" in publication) {
|
|
313
|
+
await publishFailedChallengeVerification(community, { reason: messages.ERR_PUBLICATION_USES_DEPRECATED_SUBPLEBBIT_ADDRESS }, request.challengeRequestId);
|
|
314
|
+
return undefined;
|
|
315
|
+
}
|
|
316
|
+
if ("communityAddress" in publication) {
|
|
317
|
+
await publishFailedChallengeVerification(community, { reason: messages.ERR_PUBLICATION_USES_DEPRECATED_COMMUNITY_ADDRESS }, request.challengeRequestId);
|
|
318
|
+
return undefined;
|
|
319
|
+
}
|
|
320
|
+
const authorSignerAddress = await getPKCAddressFromPublicKey(publication.signature.publicKey);
|
|
321
|
+
const authorDomain = getAuthorNameFromWire(publication.author);
|
|
322
|
+
// Check publication props validity
|
|
323
|
+
const communityAuthor = community._dbHandler.queryCommunityAuthor(authorSignerAddress, authorDomain);
|
|
324
|
+
const decryptedRequestMsg = { ...request, ...decryptedRequest };
|
|
325
|
+
const decryptedRequestWithCommunityAuthor = buildRuntimeChallengeRequest({
|
|
326
|
+
request: decryptedRequestMsg,
|
|
327
|
+
authorCommunity: communityAuthor
|
|
328
|
+
});
|
|
329
|
+
try {
|
|
330
|
+
await respondWithErrorIfSignatureOfPublicationIsInvalid(community, decryptedRequestMsg); // This function will throw an error if signature is invalid
|
|
331
|
+
}
|
|
332
|
+
catch (e) {
|
|
333
|
+
log.error("Signature of challengerequest.publication is invalid, emitting an error event and aborting the challenge exchange", e);
|
|
334
|
+
community.emit("challengerequest", decryptedRequestWithCommunityAuthor);
|
|
335
|
+
return undefined;
|
|
336
|
+
}
|
|
337
|
+
log.trace("Received a valid challenge request", decryptedRequestWithCommunityAuthor);
|
|
338
|
+
community.emit("challengerequest", decryptedRequestWithCommunityAuthor);
|
|
339
|
+
const publicationInvalidityReason = await checkPublicationValidity(community, decryptedRequestMsg, publication, communityAuthor);
|
|
340
|
+
if (publicationInvalidityReason) {
|
|
341
|
+
if (DUPLICATE_PUBLICATION_ERRORS.has(publicationInvalidityReason)) {
|
|
342
|
+
const sig = publication.signature.signature;
|
|
343
|
+
const attempts = (community._duplicatePublicationAttempts.get(sig) || 0) + 1;
|
|
344
|
+
community._duplicatePublicationAttempts.set(sig, attempts);
|
|
345
|
+
if (attempts <= 1) {
|
|
346
|
+
await publishIdempotentDuplicateVerification(community, decryptedRequestMsg, request.challengeRequestId, publicationInvalidityReason);
|
|
347
|
+
return undefined;
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
await publishFailedChallengeVerification(community, { reason: publicationInvalidityReason }, request.challengeRequestId);
|
|
351
|
+
return undefined;
|
|
352
|
+
}
|
|
353
|
+
return { decryptedRequestMsg, decryptedRequestWithCommunityAuthor, publication, communityAuthor };
|
|
354
|
+
}
|
|
355
|
+
// Runs the challenge exchange (challenges -> answers) for the request, returning the verification result.
|
|
356
|
+
async function runChallengeExchangeIfNeeded(community, parsed, log) {
|
|
357
|
+
const { decryptedRequestWithCommunityAuthor } = parsed;
|
|
358
|
+
const answerPromiseKey = decryptedRequestWithCommunityAuthor.challengeRequestId.toString();
|
|
359
|
+
const getChallengeAnswers = async (challenges) => {
|
|
360
|
+
// ...get challenge answers from user. e.g.:
|
|
361
|
+
// step 1. community publishes challenge pubsub message with `challenges` provided in argument of `getChallengeAnswers`
|
|
362
|
+
// step 2. community waits for challenge answer pubsub message with `challengeAnswers` and then returns `challengeAnswers`
|
|
363
|
+
await publishChallenges(community, challenges, decryptedRequestWithCommunityAuthor);
|
|
364
|
+
const challengeAnswerPromise = new Promise((resolve, reject) => community._challengeAnswerResolveReject.set(answerPromiseKey, { resolve, reject }));
|
|
365
|
+
community._challengeAnswerPromises.set(answerPromiseKey, challengeAnswerPromise);
|
|
366
|
+
const challengeAnswers = await community._challengeAnswerPromises.get(answerPromiseKey);
|
|
367
|
+
if (!challengeAnswers)
|
|
368
|
+
throw Error("Failed to retrieve challenge answers from promise. This is a critical error");
|
|
369
|
+
cleanUpChallengeAnswerPromise(community, answerPromiseKey);
|
|
370
|
+
return challengeAnswers;
|
|
371
|
+
};
|
|
372
|
+
// NOTE: we try to get challenge verification immediately after receiving challenge request
|
|
373
|
+
// because some challenges are automatic and skip the challenge message
|
|
374
|
+
let challengeVerification;
|
|
375
|
+
try {
|
|
376
|
+
challengeVerification = await getChallengeVerification({
|
|
377
|
+
challengeRequestMessage: decryptedRequestWithCommunityAuthor,
|
|
378
|
+
community,
|
|
379
|
+
getChallengeAnswers
|
|
380
|
+
});
|
|
381
|
+
}
|
|
382
|
+
catch (e) {
|
|
383
|
+
// getChallengeVerification will throw if one of the getChallenge function throws, which indicates a bug with the challenge script
|
|
384
|
+
// notify the community owner that that one of his challenge is misconfigured via an error event
|
|
385
|
+
log.error("getChallenge failed, the community owner needs to check the challenge code. The error is: ", e);
|
|
386
|
+
community.emit("error", e);
|
|
387
|
+
// notify the author that his publication wasn't published because the community is misconfigured
|
|
388
|
+
challengeVerification = {
|
|
389
|
+
challengeSuccess: false,
|
|
390
|
+
reason: `One of the community challenges is misconfigured: ${e.message}`
|
|
391
|
+
};
|
|
392
|
+
}
|
|
393
|
+
return challengeVerification;
|
|
394
|
+
}
|
|
395
|
+
// Publishes the final challenge verification (success or failure) including storing the publication on success.
|
|
396
|
+
async function runVerificationAndStorePublication(community, parsed, challengeVerification) {
|
|
397
|
+
await publishChallengeVerification(community, challengeVerification, parsed.decryptedRequestMsg, challengeVerification.pendingApproval);
|
|
398
|
+
}
|
|
399
|
+
export async function handleChallengeRequest(community, request, isLocalPublisher) {
|
|
400
|
+
const log = Logger("pkc-js:local-community:handleChallengeRequest");
|
|
401
|
+
if (community._ongoingChallengeExchanges.has(request.challengeRequestId.toString())) {
|
|
402
|
+
log("Received a duplicate challenge request", request.challengeRequestId.toString());
|
|
403
|
+
return; // This is a duplicate challenge request
|
|
404
|
+
}
|
|
405
|
+
if (isLocalPublisher) {
|
|
406
|
+
// we need to mark the challenge exchange as ongoing for local publishers and skip publishing it over pubsub
|
|
407
|
+
log("Marking challenge exchange as ongoing for local publisher");
|
|
408
|
+
community._challengeExchangesFromLocalPublishers[request.challengeRequestId.toString()] = true;
|
|
409
|
+
}
|
|
410
|
+
community._ongoingChallengeExchanges.set(request.challengeRequestId.toString(), true);
|
|
411
|
+
const requestSignatureValidation = await verifyChallengeRequest({ request, validateTimestampRange: true });
|
|
412
|
+
if (!requestSignatureValidation.valid)
|
|
413
|
+
throw new PKCError(getErrorCodeFromMessage(requestSignatureValidation.reason), {
|
|
414
|
+
challengeRequest: remeda.omit(request, ["encrypted"])
|
|
415
|
+
});
|
|
416
|
+
const parsed = await parseAndValidateChallengeRequest(community, request, log);
|
|
417
|
+
if (!parsed)
|
|
418
|
+
return;
|
|
419
|
+
const challengeVerification = await runChallengeExchangeIfNeeded(community, parsed, log);
|
|
420
|
+
if (!challengeVerification)
|
|
421
|
+
return;
|
|
422
|
+
await runVerificationAndStorePublication(community, parsed, challengeVerification);
|
|
423
|
+
}
|
|
424
|
+
export async function parseChallengeAnswerOrRespondWithFailure(community, challengeAnswer, decryptedRawString) {
|
|
425
|
+
let parsedJson;
|
|
426
|
+
try {
|
|
427
|
+
parsedJson = parseJsonWithPKCErrorIfFails(decryptedRawString);
|
|
428
|
+
}
|
|
429
|
+
catch (e) {
|
|
430
|
+
await publishFailedChallengeVerification(community, { reason: messages.ERR_CHALLENGE_ANSWER_IS_INVALID_JSON }, challengeAnswer.challengeRequestId);
|
|
431
|
+
throw e;
|
|
432
|
+
}
|
|
433
|
+
try {
|
|
434
|
+
return parseDecryptedChallengeAnswerWithPKCErrorIfItFails(parsedJson);
|
|
435
|
+
}
|
|
436
|
+
catch (e) {
|
|
437
|
+
await publishFailedChallengeVerification(community, { reason: messages.ERR_CHALLENGE_ANSWER_IS_INVALID_SCHEMA }, challengeAnswer.challengeRequestId);
|
|
438
|
+
throw e;
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
export async function handleChallengeAnswer(community, challengeAnswer) {
|
|
442
|
+
const log = Logger("pkc-js:local-community:handleChallengeAnswer");
|
|
443
|
+
if (!community._ongoingChallengeExchanges.has(challengeAnswer.challengeRequestId.toString()))
|
|
444
|
+
// Respond with error to answers without challenge request
|
|
445
|
+
return publishFailedChallengeVerification(community, { reason: messages.ERR_CHALLENGE_ANSWER_WITH_NO_CHALLENGE_REQUEST }, challengeAnswer.challengeRequestId);
|
|
446
|
+
const answerSignatureValidation = await verifyChallengeAnswer({ answer: challengeAnswer, validateTimestampRange: true });
|
|
447
|
+
if (!answerSignatureValidation.valid) {
|
|
448
|
+
cleanUpChallengeAnswerPromise(community, challengeAnswer.challengeRequestId.toString());
|
|
449
|
+
community._ongoingChallengeExchanges.delete(challengeAnswer.challengeRequestId.toString());
|
|
450
|
+
delete community._challengeExchangesFromLocalPublishers[challengeAnswer.challengeRequestId.toString()];
|
|
451
|
+
throw new PKCError(getErrorCodeFromMessage(answerSignatureValidation.reason), { challengeAnswer });
|
|
452
|
+
}
|
|
453
|
+
const decryptedRawString = await decryptOrRespondWithFailure(community, challengeAnswer);
|
|
454
|
+
const decryptedAnswers = await parseChallengeAnswerOrRespondWithFailure(community, challengeAnswer, decryptedRawString);
|
|
455
|
+
const decryptedChallengeAnswerPubsubMessage = { ...challengeAnswer, ...decryptedAnswers };
|
|
456
|
+
community.emit("challengeanswer", decryptedChallengeAnswerPubsubMessage);
|
|
457
|
+
const challengeAnswerPromise = community._challengeAnswerResolveReject.get(challengeAnswer.challengeRequestId.toString());
|
|
458
|
+
if (!challengeAnswerPromise)
|
|
459
|
+
throw Error("The challenge answer promise is undefined, there is an issue with challenge. This is a critical error");
|
|
460
|
+
challengeAnswerPromise.resolve(decryptedChallengeAnswerPubsubMessage.challengeAnswers);
|
|
461
|
+
}
|
|
462
|
+
export async function handleChallengeExchange(community, pubsubMsg) {
|
|
463
|
+
const log = Logger("pkc-js:local-community:handleChallengeExchange");
|
|
464
|
+
const timeReceived = timestamp();
|
|
465
|
+
const pubsubKilobyteSize = Buffer.byteLength(pubsubMsg.data) / 1000;
|
|
466
|
+
if (pubsubKilobyteSize > 80) {
|
|
467
|
+
log.error(`Received a pubsub message at (${timeReceived}) with size of ${pubsubKilobyteSize}. Silently dropping it`);
|
|
468
|
+
return;
|
|
469
|
+
}
|
|
470
|
+
let decodedMsg;
|
|
471
|
+
try {
|
|
472
|
+
decodedMsg = cborg.decode(pubsubMsg.data);
|
|
473
|
+
}
|
|
474
|
+
catch (e) {
|
|
475
|
+
log.error(`Failed to decode pubsub message received at (${timeReceived})`, e.toString());
|
|
476
|
+
return;
|
|
477
|
+
}
|
|
478
|
+
const pubsubSchemas = [
|
|
479
|
+
ChallengeRequestMessageSchema.loose(),
|
|
480
|
+
ChallengeMessageSchema.loose(),
|
|
481
|
+
ChallengeAnswerMessageSchema.loose(),
|
|
482
|
+
ChallengeVerificationMessageSchema.loose()
|
|
483
|
+
];
|
|
484
|
+
let parsedPubsubMsg;
|
|
485
|
+
for (const pubsubSchema of pubsubSchemas) {
|
|
486
|
+
const parseRes = pubsubSchema.safeParse(decodedMsg);
|
|
487
|
+
if (parseRes.success) {
|
|
488
|
+
parsedPubsubMsg = parseRes.data;
|
|
489
|
+
break;
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
if (!parsedPubsubMsg) {
|
|
493
|
+
log.error(`Failed to parse the schema of pubsub message received at (${timeReceived})`, decodedMsg);
|
|
494
|
+
return;
|
|
495
|
+
}
|
|
496
|
+
if (parsedPubsubMsg.type === "CHALLENGE" || parsedPubsubMsg.type === "CHALLENGEVERIFICATION") {
|
|
497
|
+
log.trace(`Received a pubsub message that is not meant to by processed by the community - ${parsedPubsubMsg.type}. Will ignore it`);
|
|
498
|
+
return;
|
|
499
|
+
}
|
|
500
|
+
else if (parsedPubsubMsg.type === "CHALLENGEREQUEST") {
|
|
501
|
+
try {
|
|
502
|
+
await handleChallengeRequest(community, parsedPubsubMsg, false);
|
|
503
|
+
}
|
|
504
|
+
catch (e) {
|
|
505
|
+
log.error(`Failed to process challenge request message received at (${timeReceived})`, e);
|
|
506
|
+
community._dbHandler.rollbackTransaction();
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
else if (parsedPubsubMsg.type === "CHALLENGEANSWER") {
|
|
510
|
+
try {
|
|
511
|
+
await handleChallengeAnswer(community, parsedPubsubMsg);
|
|
512
|
+
}
|
|
513
|
+
catch (e) {
|
|
514
|
+
log.error(`Failed to process challenge answer message received at (${timeReceived})`, e);
|
|
515
|
+
community._dbHandler.rollbackTransaction();
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
//# 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>;
|