@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.
- 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/community/schema.d.ts +24 -0
- package/dist/browser/community/schema.js +14 -1
- package/dist/browser/community/schema.js.map +1 -1
- package/dist/browser/errors.d.ts +5 -1
- package/dist/browser/errors.js +4 -0
- package/dist/browser/errors.js.map +1 -1
- package/dist/browser/generated-version.d.ts +1 -1
- package/dist/browser/generated-version.js +1 -1
- package/dist/browser/index.d.ts +12 -0
- package/dist/browser/pkc/pkc.js +3 -3
- package/dist/browser/pkc/pkc.js.map +1 -1
- package/dist/browser/pkc-error.d.ts +1 -1
- package/dist/browser/publications/comment/schema.d.ts +2 -0
- package/dist/browser/publications/comment/schema.js +32 -0
- package/dist/browser/publications/comment/schema.js.map +1 -1
- package/dist/browser/rpc/src/lib/pkc-js/index.d.ts +6 -0
- package/dist/browser/rpc/src/schema.d.ts +36 -0
- 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/challenges/index.d.ts +11 -5
- package/dist/browser/runtime/node/community/challenges/index.js +40 -5
- package/dist/browser/runtime/node/community/challenges/index.js.map +1 -1
- package/dist/browser/runtime/node/community/challenges/validate-challenge-result.d.ts +5 -0
- package/dist/browser/runtime/node/community/challenges/validate-challenge-result.js +70 -0
- package/dist/browser/runtime/node/community/challenges/validate-challenge-result.js.map +1 -0
- package/dist/browser/runtime/node/community/db-handler.d.ts +3 -1
- package/dist/browser/runtime/node/community/db-handler.js +24 -9
- package/dist/browser/runtime/node/community/db-handler.js.map +1 -1
- package/dist/browser/runtime/node/community/local-community/challenges.d.ts +27 -0
- package/dist/browser/runtime/node/community/local-community/challenges.js +534 -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 +102 -0
- package/dist/browser/runtime/node/community/local-community/publication-store.js +403 -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/schema/schema.d.ts +1 -0
- package/dist/browser/schema/schema.js +17 -0
- package/dist/browser/schema/schema.js.map +1 -1
- package/dist/browser/schema.d.ts +48 -0
- package/dist/browser/signer/signatures.d.ts +1 -1
- package/dist/browser/signer/signatures.js +9 -2
- package/dist/browser/signer/signatures.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/browser/version.js +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/community/schema.d.ts +24 -0
- package/dist/node/community/schema.js +14 -1
- package/dist/node/community/schema.js.map +1 -1
- package/dist/node/errors.d.ts +5 -1
- package/dist/node/errors.js +4 -0
- package/dist/node/errors.js.map +1 -1
- package/dist/node/generated-version.d.ts +1 -1
- package/dist/node/generated-version.js +1 -1
- package/dist/node/index.d.ts +12 -0
- package/dist/node/pkc/pkc.js +3 -3
- package/dist/node/pkc/pkc.js.map +1 -1
- package/dist/node/pkc-error.d.ts +1 -1
- package/dist/node/publications/comment/schema.d.ts +2 -0
- package/dist/node/publications/comment/schema.js +32 -0
- package/dist/node/publications/comment/schema.js.map +1 -1
- package/dist/node/rpc/src/lib/pkc-js/index.d.ts +6 -0
- package/dist/node/rpc/src/schema.d.ts +36 -0
- 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/challenges/index.d.ts +11 -5
- package/dist/node/runtime/node/community/challenges/index.js +40 -5
- package/dist/node/runtime/node/community/challenges/index.js.map +1 -1
- package/dist/node/runtime/node/community/challenges/validate-challenge-result.d.ts +5 -0
- package/dist/node/runtime/node/community/challenges/validate-challenge-result.js +70 -0
- package/dist/node/runtime/node/community/challenges/validate-challenge-result.js.map +1 -0
- package/dist/node/runtime/node/community/db-handler.d.ts +3 -1
- package/dist/node/runtime/node/community/db-handler.js +24 -9
- package/dist/node/runtime/node/community/db-handler.js.map +1 -1
- package/dist/node/runtime/node/community/local-community/challenges.d.ts +27 -0
- package/dist/node/runtime/node/community/local-community/challenges.js +534 -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 +102 -0
- package/dist/node/runtime/node/community/local-community/publication-store.js +403 -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/schema/schema.d.ts +1 -0
- package/dist/node/schema/schema.js +17 -0
- package/dist/node/schema/schema.js.map +1 -1
- package/dist/node/schema.d.ts +48 -0
- package/dist/node/signer/signatures.d.ts +1 -1
- package/dist/node/signer/signatures.js +9 -2
- package/dist/node/signer/signatures.js.map +1 -1
- package/dist/node/test/test-util.js +0 -1
- package/dist/node/test/test-util.js.map +1 -1
- package/dist/node/version.js +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,493 @@
|
|
|
1
|
+
import Logger from "../../../../logger.js";
|
|
2
|
+
import * as remeda from "remeda";
|
|
3
|
+
import { contentContainsMarkdownAudio, contentContainsMarkdownImages, contentContainsMarkdownVideos, getErrorCodeFromMessage, isLinkOfAnimatedImage, isLinkOfAudio, isLinkOfImage, isLinkOfMedia, isLinkOfVideo, isLinkValid, isStringDomain, timestamp } from "../../../../util.js";
|
|
4
|
+
import { PKCError } from "../../../../pkc-error.js";
|
|
5
|
+
import { messages } from "../../../../errors.js";
|
|
6
|
+
import { AuthorReservedFields } from "../../../../schema/schema.js";
|
|
7
|
+
import { verifyCommentEdit, verifyCommentModeration, verifyCommentPubsubMessage, verifyCommunityEdit, verifyVote } from "../../../../signer/signatures.js";
|
|
8
|
+
import { getPKCAddressFromPublicKey } from "../../../../signer/util.js";
|
|
9
|
+
import { getAuthorNameFromWire } from "../../../../publications/publication-author.js";
|
|
10
|
+
import { getCommunityNameFromWire, getCommunityPublicKeyFromWire } from "../../../../publications/publication-community.js";
|
|
11
|
+
import { CommentEditReservedFields } from "../../../../publications/comment-edit/schema.js";
|
|
12
|
+
import { CommentPubsubMessageReservedFields } from "../../../../publications/comment/schema.js";
|
|
13
|
+
import { CommentModerationReservedFields } from "../../../../publications/comment-moderation/schema.js";
|
|
14
|
+
import { CommunityEditPublicationPubsubReservedFields } from "../../../../publications/community-edit/schema.js";
|
|
15
|
+
import { CommunityIpfsSchema } from "../../../../community/schema.js";
|
|
16
|
+
import { VotePubsubReservedFields } from "../../../../publications/vote/schema.js";
|
|
17
|
+
import { publishFailedChallengeVerification } from "./challenges.js";
|
|
18
|
+
export function isFlairInAllowedList(flair, allowedFlairs) {
|
|
19
|
+
return allowedFlairs.some((allowed) => remeda.isDeepEqual(allowed, flair));
|
|
20
|
+
}
|
|
21
|
+
export async function isPublicationAuthorPartOfRoles(community, publication, rolesToCheckAgainst) {
|
|
22
|
+
if (!community.roles)
|
|
23
|
+
return false;
|
|
24
|
+
// is the author of publication a moderator?
|
|
25
|
+
const signerAddress = await getPKCAddressFromPublicKey(publication.signature.publicKey);
|
|
26
|
+
if (rolesToCheckAgainst.includes(community.roles[signerAddress]?.role))
|
|
27
|
+
return true;
|
|
28
|
+
const authorName = getAuthorNameFromWire(publication.author);
|
|
29
|
+
if (typeof authorName === "string") {
|
|
30
|
+
if (rolesToCheckAgainst.includes(community.roles[authorName]?.role))
|
|
31
|
+
return true;
|
|
32
|
+
if (community._pkc.resolveAuthorNames && isStringDomain(authorName)) {
|
|
33
|
+
const { resolvedAuthorName: resolvedSignerAddress } = await community._clientsManager.resolveAuthorNameIfNeeded({
|
|
34
|
+
authorName,
|
|
35
|
+
abortSignal: AbortSignal.timeout(community._pkc._timeouts["resolve-author-name"]),
|
|
36
|
+
// Mod authority must reflect current state — bypass cache.
|
|
37
|
+
cache: { maxAge: 0 }
|
|
38
|
+
});
|
|
39
|
+
if (resolvedSignerAddress !== signerAddress)
|
|
40
|
+
return false;
|
|
41
|
+
if (rolesToCheckAgainst.includes(community.roles[resolvedSignerAddress]?.role))
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
export async function respondWithErrorIfSignatureOfPublicationIsInvalid(community, request) {
|
|
48
|
+
let validity;
|
|
49
|
+
if (request.comment)
|
|
50
|
+
validity = await verifyCommentPubsubMessage({
|
|
51
|
+
comment: request.comment,
|
|
52
|
+
resolveAuthorNames: community._pkc.resolveAuthorNames,
|
|
53
|
+
clientsManager: community._clientsManager
|
|
54
|
+
});
|
|
55
|
+
else if (request.commentEdit)
|
|
56
|
+
validity = await verifyCommentEdit({
|
|
57
|
+
edit: request.commentEdit,
|
|
58
|
+
resolveAuthorNames: community._pkc.resolveAuthorNames,
|
|
59
|
+
clientsManager: community._clientsManager
|
|
60
|
+
});
|
|
61
|
+
else if (request.vote)
|
|
62
|
+
validity = await verifyVote({
|
|
63
|
+
vote: request.vote,
|
|
64
|
+
resolveAuthorNames: community._pkc.resolveAuthorNames,
|
|
65
|
+
clientsManager: community._clientsManager
|
|
66
|
+
});
|
|
67
|
+
else if (request.commentModeration)
|
|
68
|
+
validity = await verifyCommentModeration({
|
|
69
|
+
moderation: request.commentModeration,
|
|
70
|
+
resolveAuthorNames: community._pkc.resolveAuthorNames,
|
|
71
|
+
clientsManager: community._clientsManager
|
|
72
|
+
});
|
|
73
|
+
else if (request.communityEdit)
|
|
74
|
+
validity = await verifyCommunityEdit({
|
|
75
|
+
communityEdit: request.communityEdit,
|
|
76
|
+
resolveAuthorNames: community._pkc.resolveAuthorNames,
|
|
77
|
+
clientsManager: community._clientsManager
|
|
78
|
+
});
|
|
79
|
+
else
|
|
80
|
+
throw Error("Can't detect the type of publication");
|
|
81
|
+
if (!validity.valid) {
|
|
82
|
+
await publishFailedChallengeVerification(community, { reason: validity.reason }, request.challengeRequestId);
|
|
83
|
+
throw new PKCError(getErrorCodeFromMessage(validity.reason), { request, validity });
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// Validates wire-format fields (rejecting deprecated names, ensuring community keys/name match, timestamp range, ban status).
|
|
87
|
+
async function checkWireFormatAndCommunityAuthor(community, publication, authorCommunity) {
|
|
88
|
+
// Reject deprecated old wire format fields
|
|
89
|
+
if ("subplebbitAddress" in publication)
|
|
90
|
+
return messages.ERR_PUBLICATION_USES_DEPRECATED_SUBPLEBBIT_ADDRESS;
|
|
91
|
+
// reject run time field
|
|
92
|
+
if ("communityAddress" in publication)
|
|
93
|
+
return messages.ERR_PUBLICATION_USES_DEPRECATED_COMMUNITY_ADDRESS;
|
|
94
|
+
// communityPublicKey must be present and match this community's IPNS key
|
|
95
|
+
const pubCommunityPublicKey = getCommunityPublicKeyFromWire(publication);
|
|
96
|
+
if (!pubCommunityPublicKey || pubCommunityPublicKey !== community.signer.address)
|
|
97
|
+
return messages.ERR_PUBLICATION_INVALID_COMMUNITY_PUBLIC_KEY;
|
|
98
|
+
// communityName, if present, must match this community's address
|
|
99
|
+
const pubCommunityName = getCommunityNameFromWire(publication);
|
|
100
|
+
if (pubCommunityName && pubCommunityName !== community.address)
|
|
101
|
+
return messages.ERR_PUBLICATION_INVALID_COMMUNITY_NAME;
|
|
102
|
+
if (publication.timestamp <= timestamp() - 5 * 60 || publication.timestamp >= timestamp() + 5 * 60)
|
|
103
|
+
return messages.ERR_PUBLICATION_TIMESTAMP_IS_NOT_IN_PROPER_RANGE;
|
|
104
|
+
if (typeof authorCommunity?.banExpiresAt === "number" && authorCommunity.banExpiresAt > timestamp())
|
|
105
|
+
return messages.ERR_AUTHOR_IS_BANNED;
|
|
106
|
+
return undefined;
|
|
107
|
+
}
|
|
108
|
+
// Author identity checks: reserved fields, name-must-be-domain, name-resolution-matches-signer.
|
|
109
|
+
async function checkAuthorIdentity(community, publication, log) {
|
|
110
|
+
if (publication.author && remeda.intersection(remeda.keys.strict(publication.author), AuthorReservedFields).length > 0)
|
|
111
|
+
return messages.ERR_PUBLICATION_AUTHOR_HAS_RESERVED_FIELD;
|
|
112
|
+
// Reject publications with non-domain author.name — author.name must be a domain or absent
|
|
113
|
+
const authorName = getAuthorNameFromWire(publication.author);
|
|
114
|
+
if (authorName && !isStringDomain(authorName)) {
|
|
115
|
+
log("Rejecting publication: author.name is not a domain", authorName);
|
|
116
|
+
return messages.ERR_AUTHOR_NAME_MUST_BE_A_DOMAIN;
|
|
117
|
+
}
|
|
118
|
+
// Reject publications with author domains that can't be resolved or don't match the signer
|
|
119
|
+
// Use community._clientsManager (not community._pkc) so nameResolver state changes emit on the community's clients
|
|
120
|
+
if (authorName && isStringDomain(authorName) && community._pkc.resolveAuthorNames) {
|
|
121
|
+
let resolvedAddress;
|
|
122
|
+
try {
|
|
123
|
+
({ resolvedAuthorName: resolvedAddress } = await community._clientsManager.resolveAuthorNameIfNeeded({
|
|
124
|
+
authorName,
|
|
125
|
+
abortSignal: AbortSignal.timeout(community._pkc._timeouts["resolve-author-name"]),
|
|
126
|
+
// Incoming pub validation: 30m staleness window is acceptable; domain transfers are rare.
|
|
127
|
+
cache: { maxAge: 1800 }
|
|
128
|
+
}));
|
|
129
|
+
}
|
|
130
|
+
catch (e) {
|
|
131
|
+
log("Rejecting publication with unresolvable author domain", authorName, e);
|
|
132
|
+
return messages.ERR_FAILED_TO_RESOLVE_AUTHOR_DOMAIN;
|
|
133
|
+
}
|
|
134
|
+
if (resolvedAddress === null) {
|
|
135
|
+
log("Rejecting publication: author domain could not be resolved", authorName);
|
|
136
|
+
return messages.ERR_FAILED_TO_RESOLVE_AUTHOR_DOMAIN;
|
|
137
|
+
}
|
|
138
|
+
const signerAddress = await getPKCAddressFromPublicKey(publication.signature.publicKey);
|
|
139
|
+
if (resolvedAddress !== signerAddress) {
|
|
140
|
+
log("Rejecting publication: author domain resolves to different signer", authorName, resolvedAddress, signerAddress);
|
|
141
|
+
return messages.ERR_AUTHOR_DOMAIN_RESOLVES_TO_DIFFERENT_SIGNER;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return undefined;
|
|
145
|
+
}
|
|
146
|
+
// Parent/post lifecycle checks: comment/parent existence, mod flags (removed/deleted/locked/archived/pending/disapproved), and timestamp ordering.
|
|
147
|
+
async function checkParentAndPostState(community, request, publication) {
|
|
148
|
+
if ("commentCid" in publication || "parentCid" in publication) {
|
|
149
|
+
// vote or reply or commentEdit or commentModeration
|
|
150
|
+
// not post though
|
|
151
|
+
//@ts-expect-error
|
|
152
|
+
const parentCid = publication.parentCid || publication.commentCid;
|
|
153
|
+
if (typeof parentCid !== "string")
|
|
154
|
+
return messages.ERR_COMMUNITY_PUBLICATION_PARENT_CID_NOT_DEFINED;
|
|
155
|
+
const parent = community._dbHandler.queryComment(parentCid);
|
|
156
|
+
if (!parent)
|
|
157
|
+
return messages.ERR_PUBLICATION_PARENT_DOES_NOT_EXIST_IN_COMMUNITY;
|
|
158
|
+
const parentFlags = community._dbHandler.queryCommentFlagsSetByMod(parentCid);
|
|
159
|
+
if (parentFlags.removed && !request.commentModeration)
|
|
160
|
+
// not allowed to vote or reply under removed comments
|
|
161
|
+
return messages.ERR_COMMUNITY_PUBLICATION_PARENT_HAS_BEEN_REMOVED;
|
|
162
|
+
const isParentDeletedQueryRes = community._dbHandler.queryAuthorEditDeleted(parentCid);
|
|
163
|
+
if (isParentDeletedQueryRes?.deleted && !request.commentModeration)
|
|
164
|
+
return messages.ERR_COMMUNITY_PUBLICATION_PARENT_HAS_BEEN_DELETED; // not allowed to vote or reply under deleted comments
|
|
165
|
+
const postFlags = community._dbHandler.queryCommentFlagsSetByMod(parent.postCid);
|
|
166
|
+
if (postFlags.removed && !request.commentModeration)
|
|
167
|
+
return messages.ERR_COMMUNITY_PUBLICATION_POST_HAS_BEEN_REMOVED;
|
|
168
|
+
const isPostDeletedQueryRes = community._dbHandler.queryAuthorEditDeleted(parent.postCid);
|
|
169
|
+
if (isPostDeletedQueryRes?.deleted && !request.commentModeration)
|
|
170
|
+
return messages.ERR_COMMUNITY_PUBLICATION_POST_HAS_BEEN_DELETED;
|
|
171
|
+
if (postFlags.locked && !request.commentModeration)
|
|
172
|
+
return messages.ERR_COMMUNITY_PUBLICATION_POST_IS_LOCKED;
|
|
173
|
+
if (postFlags.archived && !request.commentModeration)
|
|
174
|
+
return messages.ERR_COMMUNITY_PUBLICATION_POST_IS_ARCHIVED;
|
|
175
|
+
if (parent.timestamp > publication.timestamp)
|
|
176
|
+
return messages.ERR_COMMUNITY_COMMENT_TIMESTAMP_IS_EARLIER_THAN_PARENT;
|
|
177
|
+
// if user publishes vote/reply/commentEdit under pending comment, it should fail
|
|
178
|
+
if (parent.pendingApproval && !("commentModeration" in request) && !(request.commentEdit?.deleted === true))
|
|
179
|
+
return messages.ERR_USER_PUBLISHED_UNDER_PENDING_COMMENT;
|
|
180
|
+
const isCommentDisapproved = community._dbHandler._queryIsCommentApproved(parent);
|
|
181
|
+
if (isCommentDisapproved &&
|
|
182
|
+
!isCommentDisapproved.approved &&
|
|
183
|
+
!("commentModeration" in request) &&
|
|
184
|
+
!(request.commentEdit?.deleted === true))
|
|
185
|
+
return messages.ERR_USER_PUBLISHED_UNDER_DISAPPROVED_COMMENT;
|
|
186
|
+
}
|
|
187
|
+
return undefined;
|
|
188
|
+
}
|
|
189
|
+
// Comment-only validation: feature toggles (links, markdown, spoilers, nesting), flair allowlist, postCid integrity, quotedCid checks, duplicate signature.
|
|
190
|
+
async function checkCommentPublication(community, request) {
|
|
191
|
+
if (!request.comment)
|
|
192
|
+
return undefined;
|
|
193
|
+
const commentPublication = request.comment;
|
|
194
|
+
if (remeda.intersection(remeda.keys.strict(commentPublication), CommentPubsubMessageReservedFields).length > 0)
|
|
195
|
+
return messages.ERR_COMMENT_HAS_RESERVED_FIELD;
|
|
196
|
+
if (community.features?.requirePostLink &&
|
|
197
|
+
!commentPublication.parentCid &&
|
|
198
|
+
(!commentPublication.link || (!community.features?.requirePostLinkIsMedia && !isLinkValid(commentPublication.link))))
|
|
199
|
+
return messages.ERR_COMMENT_HAS_INVALID_LINK_FIELD;
|
|
200
|
+
if (community.features?.requirePostLinkIsMedia &&
|
|
201
|
+
commentPublication.link &&
|
|
202
|
+
(!isLinkValid(commentPublication.link) || !isLinkOfMedia(commentPublication.link)))
|
|
203
|
+
return messages.ERR_POST_LINK_IS_NOT_OF_MEDIA;
|
|
204
|
+
if (community.features?.requireReplyLink &&
|
|
205
|
+
commentPublication.parentCid &&
|
|
206
|
+
(!commentPublication.link || (!community.features?.requireReplyLinkIsMedia && !isLinkValid(commentPublication.link))))
|
|
207
|
+
return messages.ERR_REPLY_HAS_INVALID_LINK_FIELD;
|
|
208
|
+
if (community.features?.requireReplyLinkIsMedia &&
|
|
209
|
+
commentPublication.parentCid &&
|
|
210
|
+
commentPublication.link &&
|
|
211
|
+
(!isLinkValid(commentPublication.link) || !isLinkOfMedia(commentPublication.link)))
|
|
212
|
+
return messages.ERR_REPLY_LINK_IS_NOT_OF_MEDIA;
|
|
213
|
+
if (community.features?.noMarkdownImages && commentPublication.content && contentContainsMarkdownImages(commentPublication.content))
|
|
214
|
+
return messages.ERR_COMMENT_CONTENT_CONTAINS_MARKDOWN_IMAGE;
|
|
215
|
+
if (community.features?.noMarkdownVideos && commentPublication.content && contentContainsMarkdownVideos(commentPublication.content))
|
|
216
|
+
return messages.ERR_COMMENT_CONTENT_CONTAINS_MARKDOWN_VIDEO;
|
|
217
|
+
if (community.features?.noMarkdownAudio && commentPublication.content && contentContainsMarkdownAudio(commentPublication.content))
|
|
218
|
+
return messages.ERR_COMMENT_CONTENT_CONTAINS_MARKDOWN_AUDIO;
|
|
219
|
+
// noImages - block ALL comments with image links
|
|
220
|
+
if (community.features?.noImages && commentPublication.link && isLinkOfImage(commentPublication.link))
|
|
221
|
+
return messages.ERR_COMMENT_HAS_LINK_THAT_IS_IMAGE;
|
|
222
|
+
// noVideos - block ALL comments with video links (including animated images like GIF/APNG)
|
|
223
|
+
if (community.features?.noVideos &&
|
|
224
|
+
commentPublication.link &&
|
|
225
|
+
(isLinkOfVideo(commentPublication.link) || isLinkOfAnimatedImage(commentPublication.link)))
|
|
226
|
+
return messages.ERR_COMMENT_HAS_LINK_THAT_IS_VIDEO;
|
|
227
|
+
// noSpoilers - block ALL comments with spoiler=true
|
|
228
|
+
if (community.features?.noSpoilers && commentPublication.spoiler === true)
|
|
229
|
+
return messages.ERR_COMMENT_HAS_SPOILER_ENABLED;
|
|
230
|
+
// noImageReplies - block only replies with image links
|
|
231
|
+
if (community.features?.noImageReplies &&
|
|
232
|
+
commentPublication.parentCid &&
|
|
233
|
+
commentPublication.link &&
|
|
234
|
+
isLinkOfImage(commentPublication.link))
|
|
235
|
+
return messages.ERR_REPLY_HAS_LINK_THAT_IS_IMAGE;
|
|
236
|
+
// noVideoReplies - block only replies with video links (including animated images like GIF/APNG)
|
|
237
|
+
if (community.features?.noVideoReplies &&
|
|
238
|
+
commentPublication.parentCid &&
|
|
239
|
+
commentPublication.link &&
|
|
240
|
+
(isLinkOfVideo(commentPublication.link) || isLinkOfAnimatedImage(commentPublication.link)))
|
|
241
|
+
return messages.ERR_REPLY_HAS_LINK_THAT_IS_VIDEO;
|
|
242
|
+
// noAudio - block ALL comments with audio links
|
|
243
|
+
if (community.features?.noAudio && commentPublication.link && isLinkOfAudio(commentPublication.link))
|
|
244
|
+
return messages.ERR_COMMENT_HAS_LINK_THAT_IS_AUDIO;
|
|
245
|
+
// noAudioReplies - block only replies with audio links
|
|
246
|
+
if (community.features?.noAudioReplies &&
|
|
247
|
+
commentPublication.parentCid &&
|
|
248
|
+
commentPublication.link &&
|
|
249
|
+
isLinkOfAudio(commentPublication.link))
|
|
250
|
+
return messages.ERR_REPLY_HAS_LINK_THAT_IS_AUDIO;
|
|
251
|
+
// noSpoilerReplies - block only replies with spoiler=true
|
|
252
|
+
if (community.features?.noSpoilerReplies && commentPublication.parentCid && commentPublication.spoiler === true)
|
|
253
|
+
return messages.ERR_REPLY_HAS_SPOILER_ENABLED;
|
|
254
|
+
// noNestedReplies - block replies with depth > 1 (replies to replies)
|
|
255
|
+
if (community.features?.noNestedReplies && commentPublication.parentCid) {
|
|
256
|
+
const parent = community._dbHandler.queryComment(commentPublication.parentCid);
|
|
257
|
+
if (parent && parent.depth > 0) {
|
|
258
|
+
return messages.ERR_NESTED_REPLIES_NOT_ALLOWED;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
// Post flairs validation (comment.flairs)
|
|
262
|
+
if (commentPublication.flairs && commentPublication.flairs.length > 0) {
|
|
263
|
+
if (!community.features?.postFlairs) {
|
|
264
|
+
return messages.ERR_POST_FLAIRS_NOT_ALLOWED;
|
|
265
|
+
}
|
|
266
|
+
const allowedPostFlairs = community.flairs?.["post"] || [];
|
|
267
|
+
for (const flair of commentPublication.flairs) {
|
|
268
|
+
if (!isFlairInAllowedList(flair, allowedPostFlairs)) {
|
|
269
|
+
return messages.ERR_POST_FLAIR_NOT_IN_ALLOWED_FLAIRS;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
// requirePostFlairs - only for posts (depth=0)
|
|
274
|
+
if (community.features?.requirePostFlairs && !commentPublication.parentCid) {
|
|
275
|
+
if (!commentPublication.flairs || commentPublication.flairs.length === 0) {
|
|
276
|
+
return messages.ERR_POST_FLAIRS_REQUIRED;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
// Author flairs validation (comment.author.flairs)
|
|
280
|
+
if (commentPublication.author?.flairs && commentPublication.author.flairs.length > 0 && !community.features?.pseudonymityMode) {
|
|
281
|
+
if (!community.features?.authorFlairs) {
|
|
282
|
+
return messages.ERR_AUTHOR_FLAIRS_NOT_ALLOWED;
|
|
283
|
+
}
|
|
284
|
+
const allowedAuthorFlairs = community.flairs?.["author"] || [];
|
|
285
|
+
for (const flair of commentPublication.author.flairs) {
|
|
286
|
+
if (!isFlairInAllowedList(flair, allowedAuthorFlairs)) {
|
|
287
|
+
return messages.ERR_AUTHOR_FLAIR_NOT_IN_ALLOWED_FLAIRS;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
// requireAuthorFlairs - for all comments (posts and replies)
|
|
292
|
+
if (community.features?.requireAuthorFlairs && !community.features?.pseudonymityMode) {
|
|
293
|
+
if (!commentPublication.author?.flairs || commentPublication.author.flairs.length === 0) {
|
|
294
|
+
return messages.ERR_AUTHOR_FLAIRS_REQUIRED;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
if (commentPublication.parentCid && !commentPublication.postCid)
|
|
298
|
+
return messages.ERR_REPLY_HAS_NOT_DEFINED_POST_CID;
|
|
299
|
+
if (commentPublication.parentCid) {
|
|
300
|
+
// query parents, and make sure commentPublication.postCid is the final parent
|
|
301
|
+
const parentsOfComment = community._dbHandler.queryParentsCids({ parentCid: commentPublication.parentCid });
|
|
302
|
+
if (parentsOfComment[parentsOfComment.length - 1].cid !== commentPublication.postCid)
|
|
303
|
+
return messages.ERR_REPLY_POST_CID_IS_NOT_PARENT_OF_REPLY;
|
|
304
|
+
}
|
|
305
|
+
// Validate quotedCids
|
|
306
|
+
if (commentPublication.quotedCids && commentPublication.quotedCids.length > 0) {
|
|
307
|
+
// Only replies can have quotedCids
|
|
308
|
+
if (!commentPublication.parentCid) {
|
|
309
|
+
return messages.ERR_POST_CANNOT_HAVE_QUOTED_CIDS;
|
|
310
|
+
}
|
|
311
|
+
const threadPostCid = commentPublication.postCid; // postCid is always defined for replies
|
|
312
|
+
for (const quotedCid of commentPublication.quotedCids) {
|
|
313
|
+
// 1. Check existence
|
|
314
|
+
const quotedComment = community._dbHandler.queryComment(quotedCid);
|
|
315
|
+
if (!quotedComment) {
|
|
316
|
+
return messages.ERR_QUOTED_CID_DOES_NOT_EXIST;
|
|
317
|
+
}
|
|
318
|
+
// 2. Check quoted comment is under the same post
|
|
319
|
+
const quotedPostCid = quotedComment.depth === 0 ? quotedComment.cid : quotedComment.postCid;
|
|
320
|
+
if (quotedPostCid !== threadPostCid) {
|
|
321
|
+
return messages.ERR_QUOTED_CID_NOT_UNDER_POST;
|
|
322
|
+
}
|
|
323
|
+
// 3. Check not pending approval
|
|
324
|
+
if (quotedComment.pendingApproval) {
|
|
325
|
+
return messages.ERR_QUOTED_CID_IS_PENDING_APPROVAL;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
const isCommentDuplicate = community._dbHandler.hasCommentWithSignatureEncoded(commentPublication.signature.signature);
|
|
330
|
+
if (isCommentDuplicate)
|
|
331
|
+
return messages.ERR_DUPLICATE_COMMENT;
|
|
332
|
+
return undefined;
|
|
333
|
+
}
|
|
334
|
+
async function checkVotePublication(community, request) {
|
|
335
|
+
if (!request.vote)
|
|
336
|
+
return undefined;
|
|
337
|
+
const votePublication = request.vote;
|
|
338
|
+
if (remeda.intersection(VotePubsubReservedFields, remeda.keys.strict(votePublication)).length > 0)
|
|
339
|
+
return messages.ERR_VOTE_HAS_RESERVED_FIELD;
|
|
340
|
+
if (community.features?.noUpvotes && votePublication.vote === 1)
|
|
341
|
+
return messages.ERR_NOT_ALLOWED_TO_PUBLISH_UPVOTES;
|
|
342
|
+
if (community.features?.noDownvotes && votePublication.vote === -1)
|
|
343
|
+
return messages.ERR_NOT_ALLOWED_TO_PUBLISH_DOWNVOTES;
|
|
344
|
+
const commentToVoteOn = community._dbHandler.queryComment(request.vote.commentCid);
|
|
345
|
+
if (community.features?.noPostDownvotes && commentToVoteOn.depth === 0 && votePublication.vote === -1)
|
|
346
|
+
return messages.ERR_NOT_ALLOWED_TO_PUBLISH_POST_DOWNVOTES;
|
|
347
|
+
if (community.features?.noPostUpvotes && commentToVoteOn.depth === 0 && votePublication.vote === 1)
|
|
348
|
+
return messages.ERR_NOT_ALLOWED_TO_PUBLISH_POST_UPVOTES;
|
|
349
|
+
if (community.features?.noReplyDownvotes && commentToVoteOn.depth > 0 && votePublication.vote === -1)
|
|
350
|
+
return messages.ERR_NOT_ALLOWED_TO_PUBLISH_REPLY_DOWNVOTES;
|
|
351
|
+
if (community.features?.noReplyUpvotes && commentToVoteOn.depth > 0 && votePublication.vote === 1)
|
|
352
|
+
return messages.ERR_NOT_ALLOWED_TO_PUBLISH_REPLY_UPVOTES;
|
|
353
|
+
const voteAuthorSignerAddress = await getPKCAddressFromPublicKey(votePublication.signature.publicKey);
|
|
354
|
+
const previousVote = community._dbHandler.queryVote(commentToVoteOn.cid, voteAuthorSignerAddress);
|
|
355
|
+
if (!previousVote && votePublication.vote === 0)
|
|
356
|
+
return messages.ERR_THERE_IS_NO_PREVIOUS_VOTE_TO_CANCEL;
|
|
357
|
+
return undefined;
|
|
358
|
+
}
|
|
359
|
+
async function checkCommentModerationPublication(community, request) {
|
|
360
|
+
if (!request.commentModeration)
|
|
361
|
+
return undefined;
|
|
362
|
+
const commentModerationPublication = request.commentModeration;
|
|
363
|
+
if (remeda.intersection(CommentModerationReservedFields, remeda.keys.strict(commentModerationPublication)).length > 0)
|
|
364
|
+
return messages.ERR_COMMENT_MODERATION_HAS_RESERVED_FIELD;
|
|
365
|
+
const isAuthorMod = await isPublicationAuthorPartOfRoles(community, commentModerationPublication, ["owner", "moderator", "admin"]);
|
|
366
|
+
if (!isAuthorMod)
|
|
367
|
+
return messages.ERR_COMMENT_MODERATION_ATTEMPTED_WITHOUT_BEING_MODERATOR;
|
|
368
|
+
const commentToBeEdited = community._dbHandler.queryComment(commentModerationPublication.commentCid); // We assume commentToBeEdited to be defined because we already tested for its existence above
|
|
369
|
+
if (!commentToBeEdited)
|
|
370
|
+
return messages.ERR_COMMENT_MODERATION_NO_COMMENT_TO_EDIT;
|
|
371
|
+
if (isAuthorMod && commentModerationPublication.commentModeration.locked && commentToBeEdited.depth !== 0)
|
|
372
|
+
return messages.ERR_COMMUNITY_COMMENT_MOD_CAN_NOT_LOCK_REPLY;
|
|
373
|
+
if (isAuthorMod && commentModerationPublication.commentModeration.archived && commentToBeEdited.depth !== 0)
|
|
374
|
+
return messages.ERR_COMMUNITY_COMMENT_MOD_CAN_NOT_ARCHIVE_REPLY;
|
|
375
|
+
const commentModInDb = community._dbHandler.hasCommentModerationWithSignatureEncoded(commentModerationPublication.signature.signature);
|
|
376
|
+
if (commentModInDb)
|
|
377
|
+
return messages.ERR_DUPLICATE_COMMENT_MODERATION;
|
|
378
|
+
if ("approved" in commentModerationPublication.commentModeration && !commentToBeEdited.pendingApproval)
|
|
379
|
+
return messages.ERR_MOD_ATTEMPTING_TO_APPROVE_OR_DISAPPROVE_COMMENT_THAT_IS_NOT_PENDING;
|
|
380
|
+
return undefined;
|
|
381
|
+
}
|
|
382
|
+
async function checkCommunityEditPublication(community, request) {
|
|
383
|
+
if (!request.communityEdit)
|
|
384
|
+
return undefined;
|
|
385
|
+
const communityEdit = request.communityEdit;
|
|
386
|
+
if (remeda.intersection(CommunityEditPublicationPubsubReservedFields, remeda.keys.strict(communityEdit)).length > 0)
|
|
387
|
+
return messages.ERR_COMMUNITY_EDIT_HAS_RESERVED_FIELD;
|
|
388
|
+
if (communityEdit.communityEdit.roles || communityEdit.communityEdit.address) {
|
|
389
|
+
const isAuthorOwner = await isPublicationAuthorPartOfRoles(community, communityEdit, ["owner"]);
|
|
390
|
+
if (!isAuthorOwner)
|
|
391
|
+
return messages.ERR_COMMUNITY_EDIT_ATTEMPTED_TO_MODIFY_OWNER_EXCLUSIVE_PROPS;
|
|
392
|
+
}
|
|
393
|
+
const isAuthorOwnerOrAdmin = await isPublicationAuthorPartOfRoles(community, communityEdit, ["owner", "admin"]);
|
|
394
|
+
if (!isAuthorOwnerOrAdmin) {
|
|
395
|
+
return messages.ERR_COMMUNITY_EDIT_ATTEMPTED_TO_MODIFY_COMMUNITY_WITHOUT_BEING_OWNER_OR_ADMIN;
|
|
396
|
+
}
|
|
397
|
+
const allowedCommunityEditKeys = [...remeda.keys.strict(CommunityIpfsSchema.shape), "address"];
|
|
398
|
+
if (remeda.difference(remeda.keys.strict(communityEdit.communityEdit), allowedCommunityEditKeys).length > 0) {
|
|
399
|
+
// should only be allowed to modify public props from CommunityIpfs
|
|
400
|
+
// shouldn't be able to modify settings for example
|
|
401
|
+
return messages.ERR_COMMUNITY_EDIT_ATTEMPTED_TO_NON_PUBLIC_PROPS;
|
|
402
|
+
}
|
|
403
|
+
return undefined;
|
|
404
|
+
}
|
|
405
|
+
async function checkCommentEditPublication(community, request) {
|
|
406
|
+
if (!request.commentEdit)
|
|
407
|
+
return undefined;
|
|
408
|
+
const commentEditPublication = request.commentEdit;
|
|
409
|
+
if (remeda.intersection(CommentEditReservedFields, remeda.keys.strict(commentEditPublication)).length > 0)
|
|
410
|
+
return messages.ERR_COMMENT_EDIT_HAS_RESERVED_FIELD;
|
|
411
|
+
const commentToBeEdited = community._dbHandler.queryComment(commentEditPublication.commentCid); // We assume commentToBeEdited to be defined because we already tested for its existence above
|
|
412
|
+
if (!commentToBeEdited)
|
|
413
|
+
return messages.ERR_COMMENT_EDIT_NO_COMMENT_TO_EDIT;
|
|
414
|
+
const commentEditInDb = community._dbHandler.hasCommentEditWithSignatureEncoded(commentEditPublication.signature.signature);
|
|
415
|
+
if (commentEditInDb)
|
|
416
|
+
return messages.ERR_DUPLICATE_COMMENT_EDIT;
|
|
417
|
+
const aliasSignerOfComment = community._dbHandler.queryPseudonymityAliasByCommentCid(commentToBeEdited.cid);
|
|
418
|
+
if (aliasSignerOfComment) {
|
|
419
|
+
const editSignedByOriginalAuthor = commentEditPublication.signature.publicKey === aliasSignerOfComment.originalAuthorPublicKey;
|
|
420
|
+
if (!editSignedByOriginalAuthor)
|
|
421
|
+
return messages.ERR_COMMENT_EDIT_CAN_NOT_EDIT_COMMENT_IF_NOT_ORIGINAL_AUTHOR;
|
|
422
|
+
}
|
|
423
|
+
else {
|
|
424
|
+
const editSignedByOriginalAuthor = commentEditPublication.signature.publicKey === commentToBeEdited.signature.publicKey;
|
|
425
|
+
if (!editSignedByOriginalAuthor)
|
|
426
|
+
return messages.ERR_COMMENT_EDIT_CAN_NOT_EDIT_COMMENT_IF_NOT_ORIGINAL_AUTHOR;
|
|
427
|
+
}
|
|
428
|
+
// Validate markdown content restrictions for comment edits
|
|
429
|
+
if (community.features?.noMarkdownImages &&
|
|
430
|
+
commentEditPublication.content &&
|
|
431
|
+
contentContainsMarkdownImages(commentEditPublication.content))
|
|
432
|
+
return messages.ERR_COMMENT_CONTENT_CONTAINS_MARKDOWN_IMAGE;
|
|
433
|
+
if (community.features?.noMarkdownVideos &&
|
|
434
|
+
commentEditPublication.content &&
|
|
435
|
+
contentContainsMarkdownVideos(commentEditPublication.content))
|
|
436
|
+
return messages.ERR_COMMENT_CONTENT_CONTAINS_MARKDOWN_VIDEO;
|
|
437
|
+
if (community.features?.noMarkdownAudio &&
|
|
438
|
+
commentEditPublication.content &&
|
|
439
|
+
contentContainsMarkdownAudio(commentEditPublication.content))
|
|
440
|
+
return messages.ERR_COMMENT_CONTENT_CONTAINS_MARKDOWN_AUDIO;
|
|
441
|
+
// noSpoilers - block ALL comment edits that set spoiler=true
|
|
442
|
+
if (community.features?.noSpoilers && commentEditPublication.spoiler === true)
|
|
443
|
+
return messages.ERR_COMMENT_HAS_SPOILER_ENABLED;
|
|
444
|
+
// noSpoilerReplies - block only reply edits that set spoiler=true
|
|
445
|
+
if (community.features?.noSpoilerReplies && commentToBeEdited.depth > 0 && commentEditPublication.spoiler === true)
|
|
446
|
+
return messages.ERR_REPLY_HAS_SPOILER_ENABLED;
|
|
447
|
+
// Post flairs validation for comment edits
|
|
448
|
+
if (commentEditPublication.flairs && commentEditPublication.flairs.length > 0) {
|
|
449
|
+
if (!community.features?.postFlairs) {
|
|
450
|
+
return messages.ERR_POST_FLAIRS_NOT_ALLOWED;
|
|
451
|
+
}
|
|
452
|
+
const allowedPostFlairs = community.flairs?.["post"] || [];
|
|
453
|
+
for (const flair of commentEditPublication.flairs) {
|
|
454
|
+
if (!isFlairInAllowedList(flair, allowedPostFlairs)) {
|
|
455
|
+
return messages.ERR_POST_FLAIR_NOT_IN_ALLOWED_FLAIRS;
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
return undefined;
|
|
460
|
+
}
|
|
461
|
+
export async function checkPublicationValidity(community, request, publication, authorCommunity) {
|
|
462
|
+
const log = Logger("pkc-js:local-community:handleChallengeRequest:checkPublicationValidity");
|
|
463
|
+
const wireResult = await checkWireFormatAndCommunityAuthor(community, publication, authorCommunity);
|
|
464
|
+
if (wireResult)
|
|
465
|
+
return wireResult;
|
|
466
|
+
const authorResult = await checkAuthorIdentity(community, publication, log);
|
|
467
|
+
if (authorResult)
|
|
468
|
+
return authorResult;
|
|
469
|
+
const parentResult = await checkParentAndPostState(community, request, publication);
|
|
470
|
+
if (parentResult)
|
|
471
|
+
return parentResult;
|
|
472
|
+
// Reject publications if their size is over 40kb
|
|
473
|
+
const publicationKilobyteSize = Buffer.byteLength(JSON.stringify(publication)) / 1000;
|
|
474
|
+
if (publicationKilobyteSize > 40)
|
|
475
|
+
return messages.ERR_REQUEST_PUBLICATION_OVER_ALLOWED_SIZE;
|
|
476
|
+
const commentResult = await checkCommentPublication(community, request);
|
|
477
|
+
if (commentResult)
|
|
478
|
+
return commentResult;
|
|
479
|
+
const voteResult = await checkVotePublication(community, request);
|
|
480
|
+
if (voteResult)
|
|
481
|
+
return voteResult;
|
|
482
|
+
const modResult = await checkCommentModerationPublication(community, request);
|
|
483
|
+
if (modResult)
|
|
484
|
+
return modResult;
|
|
485
|
+
const communityEditResult = await checkCommunityEditPublication(community, request);
|
|
486
|
+
if (communityEditResult)
|
|
487
|
+
return communityEditResult;
|
|
488
|
+
const commentEditResult = await checkCommentEditPublication(community, request);
|
|
489
|
+
if (commentEditResult)
|
|
490
|
+
return commentEditResult;
|
|
491
|
+
return undefined;
|
|
492
|
+
}
|
|
493
|
+
//# sourceMappingURL=publication-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publication-validation.js","sourceRoot":"","sources":["../../../../../../src/runtime/browser/community/local-community/publication-validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { LocalCommunity } from "../local-community.js";
|
|
2
|
+
export declare function listenToIncomingRequests(community: LocalCommunity): Promise<void>;
|
|
3
|
+
export declare function providePubsubTopicRoutingCidsIfNeeded(community: LocalCommunity, force?: boolean): Promise<void>;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import Logger from "../../../../logger.js";
|
|
2
|
+
import { retryKuboBlockPutPinAndProvidePubsubTopic } from "../../../../util.js";
|
|
3
|
+
import { pubsubTopicWithfallback } from "./comment-updates.js";
|
|
4
|
+
export async function listenToIncomingRequests(community) {
|
|
5
|
+
const log = Logger("pkc-js:local-community:sync:_listenToIncomingRequests");
|
|
6
|
+
// Make sure community listens to pubsub topic
|
|
7
|
+
// Code below is to handle in case the ipfs node restarted and the subscription got lost or something
|
|
8
|
+
const pubsubClient = community._clientsManager.getDefaultKuboPubsubClient();
|
|
9
|
+
const subscribedTopics = await pubsubClient._client.pubsub.ls();
|
|
10
|
+
const topic = pubsubTopicWithfallback(community);
|
|
11
|
+
if (!subscribedTopics.includes(topic)) {
|
|
12
|
+
await community._clientsManager.pubsubUnsubscribe(topic, community.handleChallengeExchange); // Make sure it's not hanging
|
|
13
|
+
await community._clientsManager.pubsubSubscribe(topic, community.handleChallengeExchange);
|
|
14
|
+
community._clientsManager.updateKuboRpcPubsubState("waiting-challenge-requests", pubsubClient.url);
|
|
15
|
+
log(`Waiting for publications on pubsub topic (${topic})`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export async function providePubsubTopicRoutingCidsIfNeeded(community, force = false) {
|
|
19
|
+
const log = Logger("pkc-js:local-community:_providePubsubTopicRoutingCidsIfNeeded");
|
|
20
|
+
const reprovideIntervalMs = 6 * 60 * 60 * 1000;
|
|
21
|
+
const now = Date.now();
|
|
22
|
+
if (!force && community._lastPubsubTopicRoutingProvideAt && now - community._lastPubsubTopicRoutingProvideAt < reprovideIntervalMs)
|
|
23
|
+
return;
|
|
24
|
+
const pubsubTopic = pubsubTopicWithfallback(community);
|
|
25
|
+
const topics = [pubsubTopic, community.ipnsPubsubTopic].filter((topic) => typeof topic === "string");
|
|
26
|
+
if (topics.length === 0)
|
|
27
|
+
return;
|
|
28
|
+
community._lastPubsubTopicRoutingProvideAt = now;
|
|
29
|
+
const kuboRpcClient = community._clientsManager.getDefaultKuboRpcClient()._client;
|
|
30
|
+
for (const topic of topics) {
|
|
31
|
+
try {
|
|
32
|
+
await retryKuboBlockPutPinAndProvidePubsubTopic({
|
|
33
|
+
ipfsClient: kuboRpcClient,
|
|
34
|
+
log,
|
|
35
|
+
pubsubTopic: topic
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
log.error("Failed to reprovide pubsub topic routing block", { topic, error });
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=pubsub.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pubsub.js","sourceRoot":"","sources":["../../../../../../src/runtime/browser/community/local-community/pubsub.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,uBAAuB,CAAC;AAC3C,OAAO,EAAE,yCAAyC,EAAE,MAAM,qBAAqB,CAAC;AAEhF,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,SAAyB;IACpE,MAAM,GAAG,GAAG,MAAM,CAAC,uDAAuD,CAAC,CAAC;IAC5E,8CAA8C;IAC9C,qGAAqG;IACrG,MAAM,YAAY,GAAG,SAAS,CAAC,eAAe,CAAC,0BAA0B,EAAE,CAAC;IAC5E,MAAM,gBAAgB,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;IAChE,MAAM,KAAK,GAAG,uBAAuB,CAAC,SAAS,CAAC,CAAC;IACjD,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACpC,MAAM,SAAS,CAAC,eAAe,CAAC,iBAAiB,CAAC,KAAK,EAAE,SAAS,CAAC,uBAAuB,CAAC,CAAC,CAAC,6BAA6B;QAC1H,MAAM,SAAS,CAAC,eAAe,CAAC,eAAe,CAAC,KAAK,EAAE,SAAS,CAAC,uBAAuB,CAAC,CAAC;QAC1F,SAAS,CAAC,eAAe,CAAC,wBAAwB,CAAC,4BAA4B,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC;QACnG,GAAG,CAAC,6CAA6C,KAAK,GAAG,CAAC,CAAC;IAC/D,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qCAAqC,CAAC,SAAyB,EAAE,KAAK,GAAG,KAAK;IAChG,MAAM,GAAG,GAAG,MAAM,CAAC,+DAA+D,CAAC,CAAC;IACpF,MAAM,mBAAmB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,IAAI,CAAC,KAAK,IAAI,SAAS,CAAC,gCAAgC,IAAI,GAAG,GAAG,SAAS,CAAC,gCAAgC,GAAG,mBAAmB;QAC9H,OAAO;IAEX,MAAM,WAAW,GAAG,uBAAuB,CAAC,SAAS,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC;IACtH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAEhC,SAAS,CAAC,gCAAgC,GAAG,GAAG,CAAC;IACjD,MAAM,aAAa,GAAG,SAAS,CAAC,eAAe,CAAC,uBAAuB,EAAE,CAAC,OAAO,CAAC;IAClF,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACzB,IAAI,CAAC;YACD,MAAM,yCAAyC,CAAC;gBAC5C,UAAU,EAAE,aAAa;gBACzB,GAAG;gBACH,WAAW,EAAE,KAAK;aACrB,CAAC,CAAC;QACP,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,GAAG,CAAC,KAAK,CAAC,gDAAgD,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAClF,CAAC;IACL,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../../../../src/runtime/browser/community/local-community/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,8CAA8C,CAAC;AAGvF,kEAAkE;AAClE,MAAM,CAAC,MAAM,yBAAyB,GAAG,IAAI,uBAAuB,EAAkB,CAAC"}
|