From 4ef2db41c9989e2c05ad27e9f38303de3e419311 Mon Sep 17 00:00:00 2001 From: Zuxxied Date: Sat, 19 Oct 2024 16:03:38 -0400 Subject: [PATCH] add auth --- game.js | 19 ++++++---- index.js | 27 +++++++++++++- package-lock.json | 91 ++++++++++++++++++++++++++++++++++++++++++++++ package.json | 1 + static/index.html | 3 +- static/js/index.js | 10 ++++- 6 files changed, 141 insertions(+), 10 deletions(-) diff --git a/game.js b/game.js index 875b658..b63c023 100644 --- a/game.js +++ b/game.js @@ -41,16 +41,21 @@ class Game extends GameBasic { let wsEnt = client.ent; if (!wsEnt) continue; - + if (full && wsEnt.health < 1 && !wsEnt.picked) { wsEnt.picked = true; - const hash = createHash('sha256'); - hash.update(client.ip || ''); + let hash = client.username; + + if (!hash) { + hash = createHash('sha256'); + hash.update(client.ip || ''); + hash = hash.digest('hex'); + } await db.run('INSERT INTO stats (username, ip, ko) VALUES (?,?,?)', [ wsEnt.you, - hash.digest('hex'), + hash, wsEnt.headCount ]); } @@ -76,7 +81,7 @@ class Game extends GameBasic { na.push(fi.str) if (fi.entity.isYou) { - let narr = [... fi.basic]; + let narr = [...fi.basic]; narr[fi.entity.serverProps.indexOf('isYou')] = 'true'; na[na.length - 1] = JSON.stringify(narr); } @@ -100,11 +105,11 @@ class Game extends GameBasic { that.entities = []; for (let i = 0; i < 20; i++) { - that.entities.push(new NPC(false,that)) + that.entities.push(new NPC(false, that)) } for (let i = 0; i < 30; i++) { - that.entities.push(new Shooter(false,that)) + that.entities.push(new Shooter(false, that)) } setInterval(function () { that.sync(false) }, 1000 / 10); diff --git a/index.js b/index.js index 45cc831..40aa8dd 100644 --- a/index.js +++ b/index.js @@ -3,6 +3,7 @@ import expressW from "express-ws"; import Game from "./game.js"; import NPC from "./common/npc.js"; import Player from "./common/player.js"; +import fetch from "node-fetch"; import initDb from "./db.js"; @@ -19,7 +20,7 @@ app.use('/crypto.js', express.static('./common/crypto.js')); app.use('/js', express.static('./common')); app.use(express.static('./static')); -app.get('/leaderboard', async function(ws,req) { +app.get('/leaderboard', async function (ws, req) { req.send(JSON.stringify(await db.all('SELECT * from stats'))); }) @@ -45,6 +46,30 @@ app.ws('/', function (ws, req) { data = []; } + let type = data[0]; + + if (type == 'AUTH') { + ws.token = data[1]; + + let f = new FormData(); + f.append('token', ws.token); + + (async function () { + let j = await fetch("https://bg.xuyezo.net/api/form/auth_api/", + { + "method": "post", + "body": f + } + ); + j = await j.json(); + ws.username = j.username; + console.log(`Player ${player.you} uses username ${ws.username}`) + })() + return; + } + + data.splice(0, 1); + let newEnt = game.entities[playerI]; let { you } = newEnt; diff --git a/package-lock.json b/package-lock.json index 93d059c..d0d5c45 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "crypto": "^1.0.1", "express": "^4.21.0", "express-ws": "^5.0.2", + "node-fetch": "^3.3.2", "sqlite": "^5.1.1", "sqlite3": "^5.1.7" } @@ -418,6 +419,15 @@ "integrity": "sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig==", "deprecated": "This package is no longer supported. It's now a built-in Node module. If you've depended on crypto, you should switch to the one that's built-in." }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -664,6 +674,29 @@ "express": "^4.0.0 || ^5.0.0-alpha.1" } }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, "node_modules/file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", @@ -687,6 +720,18 @@ "node": ">= 0.8" } }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "license": "MIT", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -1396,6 +1441,43 @@ "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", "license": "MIT" }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, "node_modules/node-gyp": { "version": "8.4.1", "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", @@ -2180,6 +2262,15 @@ "node": ">= 0.8" } }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/package.json b/package.json index 47b026e..66164b9 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "crypto": "^1.0.1", "express": "^4.21.0", "express-ws": "^5.0.2", + "node-fetch": "^3.3.2", "sqlite": "^5.1.1", "sqlite3": "^5.1.7" }, diff --git a/static/index.html b/static/index.html index b495f12..8d74606 100644 --- a/static/index.html +++ b/static/index.html @@ -11,9 +11,10 @@

UniButton

The left mouse button is the only input. No keyboard, moving the mouse, or anything else.

Click to launch... figure out the rest of the combos yourself.

- Created by Onez + Created by Zux Join our Discord + Log in diff --git a/static/js/index.js b/static/js/index.js index 994bcef..6dbfaf4 100644 --- a/static/js/index.js +++ b/static/js/index.js @@ -155,7 +155,11 @@ class Game extends GameBasic { player.ref = false; } - this.ws.send(JSON.stringify(player.legalProps.map(prop => player[prop]))); + let p = player.legalProps.map(prop => player[prop]); + + p.splice(0,0,'SYNC'); + + this.ws.send(JSON.stringify(p)); } recv({ data }) { let { player } = this; @@ -225,6 +229,7 @@ class Game extends GameBasic { if (this.entities.length == 0) this.entities = [this.player]; } async init() { + let tok = new URL(window.location).searchParams.get('token'); super.init(); let that = this; @@ -235,6 +240,9 @@ class Game extends GameBasic { this.ws.addEventListener('open', function () { that.sync(true); + if (tok) { + that.ws.send(JSON.stringify(["AUTH",tok])); + } setInterval(function () { that.sync() }, 1000 / 5); })