From fbdd91fbfd3c4a4df75cd63ea2b5e78e25572112 Mon Sep 17 00:00:00 2001 From: deuce <> Date: Thu, 26 Sep 2019 10:00:07 +0000 Subject: [PATCH] Support encrypted .REC files. --- xtrn/lord2/lord2.js | 61 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 58 insertions(+), 3 deletions(-) diff --git a/xtrn/lord2/lord2.js b/xtrn/lord2/lord2.js index da2383b763..b58931970b 100644 --- a/xtrn/lord2/lord2.js +++ b/xtrn/lord2/lord2.js @@ -2144,6 +2144,10 @@ function run_ref(sec, fname) player.lastsaved = savetime(); player.put(); update_rec = ufile.get(player.Record); + while(update_rec === null) { + ufile.new(); + update_rec = ufile.get(player.Record); + } }, 'offmap':function(args) { // TODO: Disappear to other players... this toggles busy because @@ -2809,15 +2813,62 @@ rescan: function load_ref(fname) { var obj = {section:{}}; fname = fname.toLowerCase(); - var f = new File(getfname(fname)); + var f; var cs; var i; + var enc = false; + + function decrypt(o) { + o.forEach(function(l, i) { + var off; + var odd; + var con; + var ret = ''; + var ch; + var ct = 1; + + con = ascii(l.substr(4, 1)); + odd = ascii(l.substr(2, 1)); + for (off = 5; off < l.length; off++) { + ch = ascii(l.substr(off, 1)); + ch -= ct; + ct++; + if (ct == 10) + ct = 0; + ch -= con; + if (ct & 1) + ch -= odd; + ret += ascii(ch); + } +log('ret: '+ret); + o[i] = ret; + }); + } + f = new File(getfname(fname)); + if (!file_exists(f.name)) { + f = new File(getfname(fname.replace(/\.ref$/, '.rec'))); + if (file_exists(f.name)) + enc = true; + } if (!f.open('r')) throw('Unable to open '+f.name); - obj.lines = f.readAll(4096); - obj.lines.unshift(';secret line zero... shhhhh'); + if (enc) { + obj.lines = []; + while(1) { + i = f.read(2); + if (i === '') + break; + i += f.read(ascii(i.substr(1,1))-3); + f.readln(); + obj.lines.push(i); + } + decrypt(obj.lines); + } + else + obj.lines = f.readAll(4096); f.close(); + obj.lines.unshift(';secret line zero... shhhhh'); obj.lines.forEach(function(l, n) { var m; var sc; @@ -2900,6 +2951,10 @@ function load_player() if (p.realname === dk.user.full_name) { player = p; update_rec = ufile.get(p.Record); + while(update_rec === null) { + ufile.new(); + update_rec = ufile.get(player.Record); + } return; } } -- GitLab