diff --git a/src/cscli/main.ts b/src/class/CSCLI.ts similarity index 92% rename from src/cscli/main.ts rename to src/class/CSCLI.ts index a5bc05b..7bcd5eb 100644 --- a/src/cscli/main.ts +++ b/src/class/CSCLI.ts @@ -1,85 +1,85 @@ -/* eslint-disable max-classes-per-file */ -/* eslint-disable no-case-declarations */ -/* eslint-disable consistent-return */ -import net from 'net'; -import crypto from 'crypto'; -import { promises as fs } from 'fs'; -import { Client, Collection, Context, TCPHandler } from '../class'; - -import * as handlerFiles from './handlers'; - -export default class CSCLI { - public client: Client; - - public server: net.Server; - - public handlers: Collection; - - #hmac: string; - - constructor(client: Client) { - this.client = client; - this.loadKeys(); - this.server = net.createServer((socket) => { - socket.on('data', async (data) => { - try { - await this.handle(socket, data); - } catch (err) { - await this.client.util.handleError(err); - socket.destroy(); - } - }); - }); - this.init(); - } - - public load() { - const hdFiles = Object.values(handlerFiles); - for (const Handler of hdFiles) { - const handler = new Handler(); - this.handlers.add(handler.endpoint, handler); - this.client.signale.success(`Successfully loaded TCP endpoint '${handler.endpoint}'.`); - } - } - - public async handle(socket: net.Socket, data: Buffer) { - const args = data.toString().trim().split('$'); - const verification = this.verifyConnection(args[1], args[0]); - if (!verification) { - socket.write('UNAUTHORIZED TO EXECUTE ON THIS SERVER\n'); - return socket.destroy(); - } - const parsed: { Username: string, Type: string, Message?: string, Data?: any, HMAC: string } = JSON.parse(args[0]); - // FINISH VERIFICATION CHECKS - const handler: TCPHandler = this.handlers.get(parsed.Type); - if (!handler) return socket.destroy(); - - const context = new Context(socket, args[0], this.client); - await handler.handle(context); - if (!context.socket.destroyed) { - socket.destroy(); - } - } - - public verifyConnection(key: string, data: any): boolean { - const hmac = crypto.createHmac('sha256', this.#hmac); - hmac.update(data); - const computed = hmac.digest('hex'); - if (computed === key) return true; - return false; - } - - public async loadKeys() { - const key = await fs.readFile('/etc/cscli.conf', { encoding: 'utf8' }); - this.#hmac = key.toString().trim(); - } - - public init() { - this.server.on('error', (err) => { - this.client.util.handleError(err); - }); - this.server.listen(8124, () => { - this.client.signale.success('TCP socket is now listening for connections.'); - }); - } -} +/* eslint-disable max-classes-per-file */ +/* eslint-disable no-case-declarations */ +/* eslint-disable consistent-return */ +import net from 'net'; +import crypto from 'crypto'; +import { promises as fs } from 'fs'; +import { Client, Collection, Context, TCPHandler } from '.'; + +import * as handlerFiles from '../cscli/handlers'; + +export default class CSCLI { + public client: Client; + + public server: net.Server; + + public handlers: Collection; + + #hmac: string; + + constructor(client: Client) { + this.client = client; + this.loadKeys(); + this.server = net.createServer((socket) => { + socket.on('data', async (data) => { + try { + await this.handle(socket, data); + } catch (err) { + await this.client.util.handleError(err); + socket.destroy(); + } + }); + }); + this.init(); + } + + public load() { + const hdFiles = Object.values(handlerFiles); + for (const Handler of hdFiles) { + const handler = new Handler(); + this.handlers.add(handler.endpoint, handler); + this.client.signale.success(`Successfully loaded TCP endpoint '${handler.endpoint}'.`); + } + } + + public async handle(socket: net.Socket, data: Buffer) { + const args = data.toString().trim().split('$'); + const verification = this.verifyConnection(args[1], args[0]); + if (!verification) { + socket.write('UNAUTHORIZED TO EXECUTE ON THIS SERVER\n'); + return socket.destroy(); + } + const parsed: { Username: string, Type: string, Message?: string, Data?: any, HMAC: string } = JSON.parse(args[0]); + // FINISH VERIFICATION CHECKS + const handler: TCPHandler = this.handlers.get(parsed.Type); + if (!handler) return socket.destroy(); + + const context = new Context(socket, args[0], this.client); + await handler.handle(context); + if (!context.socket.destroyed) { + socket.destroy(); + } + } + + public verifyConnection(key: string, data: any): boolean { + const hmac = crypto.createHmac('sha256', this.#hmac); + hmac.update(data); + const computed = hmac.digest('hex'); + if (computed === key) return true; + return false; + } + + public async loadKeys() { + const key = await fs.readFile('/etc/cscli.conf', { encoding: 'utf8' }); + this.#hmac = key.toString().trim(); + } + + public init() { + this.server.on('error', (err) => { + this.client.util.handleError(err); + }); + this.server.listen(8124, () => { + this.client.signale.success('TCP socket is now listening for connections.'); + }); + } +} diff --git a/src/class/Client.ts b/src/class/Client.ts index 0dd7b76..0d08dd3 100644 --- a/src/class/Client.ts +++ b/src/class/Client.ts @@ -4,10 +4,9 @@ import mongoose from 'mongoose'; import signale from 'signale'; import fs from 'fs-extra'; import config from '../config.json'; -import CSCLI from '../cscli/main'; import { Account, AccountInterface, Moderation, ModerationInterface, Domain, DomainInterface, Tier, TierInterface } from '../models'; import { emojis } from '../stores'; -import { Command, Util, Collection, Server, Event } from '.'; +import { Command, CSCLI, Util, Collection, Server, Event } from '.'; export default class Client extends Eris.Client { diff --git a/src/class/index.ts b/src/class/index.ts index c1d02e5..1fe357c 100644 --- a/src/class/index.ts +++ b/src/class/index.ts @@ -3,6 +3,7 @@ export { default as Client } from './Client'; export { default as Collection } from './Collection'; export { default as Command } from './Command'; export { default as Context } from './Context'; +export { default as CSCLI } from './CSCLI'; export { default as Event } from './Event'; export { default as LocalStorage } from './LocalStorage'; export { default as Report } from './Report'; diff --git a/src/cscli/index.ts b/src/cscli/index.ts deleted file mode 100644 index ab883d0..0000000 --- a/src/cscli/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default as CSCLI } from './main';