diff --git a/package-lock.json b/package-lock.json index 813819b..d816fbc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "satyr", - "version": "0.10.1", + "version": "0.10.2", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -1110,9 +1110,9 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, "ipaddr.js": { "version": "1.9.0", diff --git a/package.json b/package.json index d33fe2c..a97c46d 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "setup": "sh install/setup.sh", "migrate": "ts-node src/migrate.ts", "invite": "ts-node src/cli.ts --invite", + "v3-manual": "ts-node src/v3manual.ts", "make-templates": "nunjucks-precompile -i [\"\\.html$\",\"\\.njk$\"] templates > site/templates.js" }, "repository": { diff --git a/src/database.ts b/src/database.ts index 0d733e7..7a95310 100644 --- a/src/database.ts +++ b/src/database.ts @@ -27,7 +27,7 @@ async function addUser(name: string, password: string){ let dupe = await query('select * from users where username='+raw.escape(name)); if(dupe[0]) return false; await query('INSERT INTO users (username, password_hash, stream_key, record_flag) VALUES ('+raw.escape(name)+', '+raw.escape(hash)+', '+raw.escape(key)+', 0)'); - await query('INSERT INTO user_meta (username, title, about, live) VALUES ('+raw.escape(name)+',\'\',\'\',false)'); + await query('INSERT INTO user_meta (username, title, about, live) VALUES ('+raw.escape(name)+',\' \',\' \',false)'); await query('INSERT INTO chat_integration (username, irc, xmpp, twitch, discord) VALUES ('+raw.escape(name)+',\'\',\'\',\'\',\'\')'); await query('INSERT INTO twitch_mirror (username) VALUES ('+raw.escape(name)+')'); return true; @@ -40,6 +40,7 @@ async function rmUser(name: string){ await query('delete from user_meta where username='+raw.escape(name)+' limit 1'); await query('delete from chat_integration where username='+raw.escape(name)+' limit 1'); await query('delete from twitch_mirror where username='+raw.escape(name)+' limit 1'); + await query('delete from ch_bans where channel='+raw.escape(name)); return true; } diff --git a/src/db/3.ts b/src/db/3.ts new file mode 100644 index 0000000..1606c57 --- /dev/null +++ b/src/db/3.ts @@ -0,0 +1,21 @@ +import * as db from "../database"; +import * as dirty from "dirty"; + +async function run () { + await db.query('CREATE TABLE IF NOT EXISTS ch_bans(channel VARCHAR(25), target VARCHAR(45), time BIGINT, length INT DEFAULT 30)'); + console.log('!!! This migration has a race condition when run from the `npm run migrate` command. If thats how this was called, please re-run this migration manually.\n!!! Run `npm run v3-manual` to do so'); + var bansdb = new dirty('./config/bans.db') + bansdb.on('load', async () => { + bansdb.forEach(async (key, val) => { + let ips = Object.keys(val); + for(var i=0;i {initChat()}); + await initChat(); server.listen(config['http']['port']); } @@ -254,6 +253,7 @@ async function initAPI() { api.register(req.body.username, req.body.password, req.body.confirm, true).then((result) => { if(result[0]) return genToken(req.body.username).then((t) => { res.cookie('Authorization', t, {maxAge: 604800000, httpOnly: true, sameSite: 'Lax'}); + res.cookie('X-Auth-As', req.body.username, {maxAge: 604800000, httpOnly: false, sameSite: 'Lax'}) res.json(result); api.useInvite(req.body.invite); return; @@ -268,6 +268,7 @@ async function initAPI() { api.register(req.body.username, req.body.password, req.body.confirm).then( (result) => { if(result[0]) return genToken(req.body.username).then((t) => { res.cookie('Authorization', t, {maxAge: 604800000, httpOnly: true, sameSite: 'Lax'}); + res.cookie('X-Auth-As', req.body.username, {maxAge: 604800000, httpOnly: false, sameSite: 'Lax'}) res.json(result); return; }); @@ -589,9 +590,10 @@ async function initChat() { socket.on('JOINROOM', async (data) => { let t: any = await db.query('select username from users where username='+db.raw.escape(data)); if(t[0]){ - if(banlist.get(data) && banlist.get(data)[socket['handshake']['address']]){ - if(Math.floor(banlist.get(data)[socket['handshake']['address']]['time'] + (banlist.get(data)[socket['handshake']['address']]['length'] * 60)) < Math.floor(Date.now() / 1000)){ - banlist.set(data, Object.assign({}, banlist.get(data), {[socket['handshake']['address']]: null})); + let b = await db.query('select * from ch_bans where target='+db.raw.escape(socket['handshake']['address'])+' and channel='+db.raw.escape(data)); + if(b[0]){ + if(Math.floor(b[0].time + (b[0].length * 60)) < Math.floor(Date.now() / 1000)){ + await db.query('delete from ch_bans where target='+db.raw.escape(b[0].target)+'and channel='+db.raw.escape(b[0].channel)+' and time='+db.raw.escape(b[0].time)+' and length='+db.raw.escape(b[0].length)); } else { socket.emit('ALERT', 'You are banned from that room'); @@ -680,23 +682,27 @@ async function initChat() { } else socket.emit('ALERT', 'Not authorized to do that.'); }); - socket.on('BAN', (data: Object) => { + socket.on('BAN', async (data: Object) => { if(socket.nick === data['room']){ let id: string = store.get(data['nick']); if(id){ if(Array.isArray(id)) { for(let i=0;i { + socket.on('UNBAN', async (data: Object) => { if(socket.nick === data['room']){ - if(banlist.get(data['room']) && banlist.get(data['room'])[data['ip']]){ - banlist.set(data['room'], Object.assign({}, banlist.get(data['room']), {[data['ip']]: null})); + let b = await db.query('select * from ch_bans where channel='+db.raw.escape(data['room'])+' and target='+db.raw.escape(data['ip'])); + if(b[0]){ + await db.query('delete from ch_bans where channel='+db.raw.escape(data['room'])+' and target='+db.raw.escape(data['ip'])); socket.emit('ALERT', data['ip']+' was unbanned.'); } else @@ -715,13 +722,13 @@ async function initChat() { } else socket.emit('ALERT', 'Not authorized to do that.'); }); - socket.on('LISTBAN', (data: Object) => { + socket.on('LISTBAN', async (data: Object) => { if(socket.nick === data['room']){ - if(banlist.get(data['room'])) { - let bans = Object.keys(banlist.get(data['room'])); + let b = await db.query('select target from ch_bans where channel='+db.raw.escape(data['room'])); + if(b[0]) { let str = ''; - for(let i=0;i