MCPcopy Create free account
hub / github.com/PrismarineJS/node-minecraft-protocol / validateLastMessages

Function validateLastMessages

src/server/chat.js:9–38  ·  view source on GitHub ↗
(pending, lastSeen, lastRejected)

Source from the content-addressed store, hash-verified

7
8class VerificationError extends Error {}
9function validateLastMessages (pending, lastSeen, lastRejected) {
10 if (lastRejected) {
11 const rejectedTime = pending.get(lastRejected.sender, lastRejected.signature)
12 if (rejectedTime) pending.acknowledge(lastRejected.sender, lastRejected.signature)
13 else throw new VerificationError(`Client rejected a message we never sent from '${lastRejected.sender}'`)
14 }
15
16 let lastTimestamp
17 const seenSenders = new Set()
18
19 for (const { messageSender, messageSignature } of lastSeen) {
20 if (pending.previouslyAcknowledged(messageSender, messageSignature)) continue
21
22 const ts = pending.get(messageSender)(messageSignature)
23 if (!ts) {
24 throw new VerificationError(`Client saw a message that we never sent from '${messageSender}'`)
25 } else if (lastTimestamp && (ts < lastTimestamp)) {
26 throw new VerificationError(`Received messages out of order: Last acknowledged timestamp was at ${lastTimestamp}, now reading older message at ${ts}`)
27 } else if (seenSenders.has(messageSender)) {
28 // in the lastSeen array, last 5 messages from different players are stored, not just last 5 messages
29 throw new VerificationError(`Two last seen entries from same player not allowed: ${messageSender}`)
30 } else {
31 lastTimestamp = ts
32 seenSenders.add(messageSender)
33 pending.acknowledgePrior(messageSender, messageSignature)
34 }
35 }
36
37 pending.setPreviouslyAcknowledged(lastSeen, lastRejected)
38}
39
40module.exports = function (client, server, options) {
41 const mojangPubKey = crypto.createPublicKey(mojangPublicKeyPem)

Callers 1

validateMessageChainFunction · 0.85

Calls 6

getMethod · 0.80
acknowledgeMethod · 0.80
acknowledgePriorMethod · 0.80
addMethod · 0.45

Tested by

no test coverage detected