diff --git a/static/js/modules/interface/main.js b/static/js/modules/interface/main.js index 352c9e5..6369ae9 100644 --- a/static/js/modules/interface/main.js +++ b/static/js/modules/interface/main.js @@ -49,6 +49,14 @@ document.addEventListener("DOMContentLoaded", () => { window.console.error(`Signature invalid! Ignoring packet ${data.id}.`); return; } + + // check if the packet is replayed. + if (data.timestamp <= sender.lastPacket) { + window.console.error(`Replay detected! Ignoring packet ${data.id}.`); + return; + } + + sender.lastPacket = data.timestamp; } switch (data.type) { diff --git a/static/js/modules/interface/packet.js b/static/js/modules/interface/packet.js index 0f355c0..2e37621 100644 --- a/static/js/modules/interface/packet.js +++ b/static/js/modules/interface/packet.js @@ -5,6 +5,7 @@ export class Packet { return { type: name, id: window.crypto.randomUUID(), + timestamp: Date.now(), author: ID, }; } diff --git a/static/js/modules/interface/player.js b/static/js/modules/interface/player.js index 988d489..c19c233 100644 --- a/static/js/modules/interface/player.js +++ b/static/js/modules/interface/player.js @@ -19,6 +19,7 @@ export class Player { this.id = id; this.ready = false; this.rsaPubKey = RsaPubKey.fromJSON(pubkey); + this.lastPacket = 0; // Data which is reset every turn this.isPlaying = false;