diff --git a/server/api/server-info.js b/server/api/server-info.js index 5542406..c9b39a3 100644 --- a/server/api/server-info.js +++ b/server/api/server-info.js @@ -1,3 +1,7 @@ +const fs = require('fs'); +const path = require('path'); +const mime = require('mime-types'); + const authModes = [ "free", "confirmation", @@ -5,9 +9,24 @@ const authModes = [ "password", ]; +function getBGMain () { + let bgMain = global.config.source.bgmain; + if (typeof bgMain === "string") { + if (!path.isAbsolute(bgMain)) + bgMain = path.join(__dirname, "..", bgMain); + const mimetype = mime.lookup(bgMain); + const base64content = fs.readFileSync(bgMain, { encoding: 'base64' }); + return `data:${mimetype};base64,${base64content}`; + } + return null; +} + module.exports = { name: global.config.server.info.name, tag: global.config.server.info.tag, authMode: authModes[global.config.server["auth-mode"] ?? 1], secureMode: global.config.server.secureMode ?? false, -}; \ No newline at end of file + extSource: { + bgmain: getBGMain(), + } +}; diff --git a/server/config.json b/server/config.json index 69727c8..8ed91ac 100644 --- a/server/config.json +++ b/server/config.json @@ -22,5 +22,13 @@ }, "ai": { "apiType": "kobold" + }, + "source": { + "bgmain": "/home/fullgream/Загрузки/21380429c504a974479d31c96a9c3c3f.jpg" + }, + "rootuser": { + "login": "admin", + "password": "admin", + "activated": true } } diff --git a/server/frontend/public/css/connect/main.css b/server/frontend/public/css/connect/main.css index 56b1153..31dab91 100644 --- a/server/frontend/public/css/connect/main.css +++ b/server/frontend/public/css/connect/main.css @@ -106,7 +106,7 @@ height: 650px; margin-left: calc(50% - 250px); - margin-top: calc(50vh - 325px); + margin-top: calc(5%); padding: 5px; } diff --git a/server/frontend/public/js/connect/api.js b/server/frontend/public/js/connect/api.js index 8c2b360..5dd0e8a 100644 --- a/server/frontend/public/js/connect/api.js +++ b/server/frontend/public/js/connect/api.js @@ -66,12 +66,39 @@ class ApiHTML { this.api = api; } - async renderAuth (authMode) { - document.body.style.backgroundImage = "url('assets/hello/1.png')"; + async renderAuth (authMode, bgUrl = null) { + bgUrl = bgUrl ?? "assets/hello/1.png"; + + document.body.style.backgroundImage = `url(${ + JSON.stringify(bgUrl) + })`; + document.body.style.backgroundSize = `${screen.width}px ${screen.height}px`; document.getElementById("server.area").innerHTML = ''; $(document.getElementById("server.area")).append(ServerAuth.authForm); - //switch (authMode) {} + + [...$.find(".auth-act-item")].forEach(authEl => { + const authElJQ = $(authEl); + const isHidden = authEl.hidden; + authEl.hidden = false; + const buttonBlock = authElJQ.find(".btn-auth-block")[0]; + const paramsBlock = authElJQ.find(".params-auth")[0]; + + buttonBlock.style.marginTop = `calc(100% - ${paramsBlock.offsetHeight}px)`; + authEl.hidden = isHidden; + }); + + $.find("#menu-log-in")[0].onclick = function () { + $.find("#log-in")[0].hidden = false; + $.find("#register")[0].hidden = true; + } + + $.find("#menu-register")[0].onclick = function () { + $.find("#log-in")[0].hidden = true; + $.find("#register")[0].hidden = false; + } + + $.find("#server-code-form")[0].hidden = authMode !== "password"; } } @@ -97,4 +124,4 @@ export class ApiSocket { }); return await promise; } -} \ No newline at end of file +} diff --git a/server/frontend/public/js/connect/auth.js b/server/frontend/public/js/connect/auth.js index e0e2b35..13d94bd 100644 --- a/server/frontend/public/js/connect/auth.js +++ b/server/frontend/public/js/connect/auth.js @@ -17,4 +17,75 @@ export class ServerAuth { ServerAuth.authForm = document.createElement("div"); ["auth-window"].forEach(c => ServerAuth.authForm.classList.add(c)); -ServerAuth.authForm.innerHTML = `

Log-In


`; \ No newline at end of file +ServerAuth.authForm.innerHTML = ` +

Authorization

+
+ +
+
+
+
+ + +
+ + +
+ + +
Your username into server.
+
+ + +
+ + +
Your password into server.
+
+ +
+ + +
Retry password for you don't forget password.
+
+ + + +
+ +
+
+
+
+ + +`; diff --git a/server/frontend/public/js/connect/main.js b/server/frontend/public/js/connect/main.js index 554b154..9ba6fa4 100644 --- a/server/frontend/public/js/connect/main.js +++ b/server/frontend/public/js/connect/main.js @@ -49,7 +49,7 @@ socket.run() console.log("socket sends:", data); document.title = data.name; document.getElementById("server-name").innerText = data.name; - await socket.html.renderAuth(data.authMode); + await socket.html.renderAuth(data.authMode, data.extSource?.bgmain ?? null); }) .catch(err => { console.error(err); diff --git a/server/server.js b/server/server.js index 3d63dcb..3d1ac09 100644 --- a/server/server.js +++ b/server/server.js @@ -4,173 +4,196 @@ const parser = require("./packet-parser"); const frontend = require("./frontend"); const websocket = require("./ws-handler"); const crypt = require("./crypt"); -const EventEmitter = require('events'); -const net = require('net'); -const fs = require('fs'); -const path = require('path'); +const EventEmitter = require("events"); +const net = require("net"); +const fs = require("fs"); +const path = require("path"); -const { API } = require('./api'); +const { API } = require("./api"); class Server extends EventEmitter { - constructor () { - super(); - this.on("config.update", ({ - oldConfig, newConfig - }) => { + constructor() { + super(); + this.on("config.update", ({ oldConfig, newConfig }) => {}); + } - }); - } + run(address, port) { + this.address = address; + this.port = port; - run (address, port) { - this.address = address; - this.port = port; + const wsPort = global.config.server?.staticInfo?.wsPort ?? 57891; + const httpPort = global.config.server?.staticInfo?.httpPort ?? 49901; - const wsPort = global.config.server?.staticInfo?.wsPort ?? 57891; - const httpPort = global.config.server?.staticInfo?.httpPort ?? 49901; + logger.log({ + wsPort, + httpPort, + }); - logger.log({ - wsPort, httpPort - }); + this.api = new API(); - this.api = new API(); + if (global.config.server.useFrontend) + this.frontend = frontend("127.0.0.1", httpPort); + if (global.config.server.useWebSocketAPI) + this.websocket = websocket("127.0.0.1", wsPort, this.api); - if (global.config.server.useFrontend) - this.frontend = frontend("127.0.0.1", httpPort); - if (global.config.server.useWebSocketAPI) - this.websocket = websocket("127.0.0.1", wsPort, this.api); + this.server = net.createServer((srvSocket) => { + srvSocket.on("error", (err) => { + logger.log("Caught server socket error: "); + logger.log(err.stack); + }); + }); - this.server = net.createServer((srvSocket) => { - srvSocket.on("error", (err) => { - logger.log("Caught server socket error: "); - logger.log(err.stack); - }); - }); + function socketErrHanler(err) { + if (err) { + logger.log("Caught server socket error: "); + logger.log(err.stack); + } + } - function socketErrHanler (err) { - if (err) { - logger.log("Caught server socket error: "); - logger.log(err.stack); - } - } - - function socketDataHandler (data, socket) { - socket.write(data, function(err) { - if (err) { - logger.log(`error: ${socket.remoteAddress} (remote) throwed: ${err.name}\n${err.stack}`); + function socketDataHandler(data, socket) { + socket.write(data, function (err) { + if (err) { + logger.log( + `error: ${socket.remoteAddress} (remote) throwed: ${err.name}\n${err.stack}`, + ); } - }); - } + }); + } - this.server.on("connection", (socket) => { - logger.log(`${socket.remoteAddress}${socket.remotePort} is connected`); - socket.mainconnect = null; + this.server.on("connection", (socket) => { + logger.log(`${socket.remoteAddress}${socket.remotePort} is connected`); + socket.mainconnect = null; - if (global.config.server.useWebSocketAPI) { - socket.wsReverse = net.createConnection(wsPort, "127.0.0.1"); - socket.wsReverse.on("error", socketErrHanler); - socket.wsReverse.on("data", (data) => socketDataHandler(data, socket)); - } - if (global.config.server.useFrontend) { - socket.httpReverse = net.createConnection(httpPort, "127.0.0.1"); - socket.httpReverse.on("error", socketErrHanler); - socket.httpReverse.on("data", (data) => socketDataHandler(data, socket)); - } + if (global.config.server.useWebSocketAPI) { + socket.wsReverse = net.createConnection(wsPort, "127.0.0.1"); + socket.wsReverse.on("error", socketErrHanler); + socket.wsReverse.on("data", (data) => socketDataHandler(data, socket)); + } + if (global.config.server.useFrontend) { + socket.httpReverse = net.createConnection(httpPort, "127.0.0.1"); + socket.httpReverse.on("error", socketErrHanler); + socket.httpReverse.on("data", (data) => + socketDataHandler(data, socket), + ); + } - socket.on("error", (err) => { - logger.log( - `socket.on(${socket.remoteAddress}) error:` - ); - logger.log(err.stack); - try { socket.end(); } catch (_) {} - // socket.end(); - }); + socket.on("error", (err) => { + logger.log(`socket.on(${socket.remoteAddress}) error:`); + logger.log(err.stack); + try { + socket.end(); + } catch (_) {} + // socket.end(); + }); - socket.on('data', async (data) => { - const parserResult = await parser(data); + socket.on("data", async (data) => { + const parserResult = await parser(data); // if (global.config.server.secureMode && data.toString().includes("http/1.1")) { - // logger.log("Encrypted WS!"); - // parserResult.result.isWebSocket = true; + // logger.log("Encrypted WS!"); + // parserResult.result.isWebSocket = true; // } - - // const parserDecryptedResult = await parser(global.openSSH.decrypt(data)); + + // const parserDecryptedResult = await parser(global.openSSH.decrypt(data)); const peerAddress = `${socket.remoteAddress}:${socket.remotePort}`; - //logger.log("Parser result is", parserResult); + //logger.log("Parser result is", parserResult); - if (!socket.mainconnect) { - // if (parserResult.result.isWebSocket || parserDecryptedResult.result.isWebSocket) { - if (parserResult.result.isWebSocket) { - socket.mainconnect = "ws"; - if (global.config.server.useFrontend) - socket.httpReverse.end(); - if (global.config.server.useWebSocketAPI) { - return socket.wsReverse.write(data, socketErrHanler); - } - return; - } - else if (parserResult.result.isHTTP) { - socket.mainconnect = "http"; + if (!socket.mainconnect) { + // if (parserResult.result.isWebSocket || parserDecryptedResult.result.isWebSocket) { + if (parserResult.result.isWebSocket) { + socket.mainconnect = "ws"; + if (global.config.server.useFrontend) socket.httpReverse.end(); + if (global.config.server.useWebSocketAPI) { + return socket.wsReverse.write(data, socketErrHanler); + } + return; + } else if (parserResult.result.isHTTP) { + socket.mainconnect = "http"; socket.wsReverse.end(); - if (global.config.server.useFrontend) { - return socket.httpReverse.write(data, socketErrHanler); - } - return; - } - else { - if (global.config.server.useFrontend) - socket.httpReverse.end(); - if (global.config.server.useWebSocketAPI) - socket.wsReverse.end(); - socket.mainconnect = "tcp"; - return await this.api.exec(peerAddress, data, () => {}); - } - } - else { - switch (socket.mainconnect) { - case "ws": - if (global.config.server.useWebSocketAPI) { - return socket.wsReverse.write(data, socketErrHanler); - } - case "http": - if (global.config.server.useFrontend) { - return socket.httpReverse.write(data, socketErrHanler); - } - case "tcp": - return await this.api.exec(peerAddress, data); - default: - return; - } - } - }); - }); + if (global.config.server.useFrontend) { + return socket.httpReverse.write(data, socketErrHanler); + } + return; + } else { + if (global.config.server.useFrontend) socket.httpReverse.end(); + if (global.config.server.useWebSocketAPI) socket.wsReverse.end(); + socket.mainconnect = "tcp"; + return await this.api.exec(peerAddress, data, () => {}); + } + } else { + switch (socket.mainconnect) { + case "ws": + if (global.config.server.useWebSocketAPI) { + if (!socket.wsReverse.destroyed) { + return socket.wsReverse.write(data, socketErrHanler); + } else { + socket.wsReverse = net.createConnection(wsPort, "127.0.0.1"); + socket.wsReverse.on("error", socketErrHanler); + socket.wsReverse.on("data", (data) => + socketDataHandler(data, socket), + ); + return socket.wsReverse.write(data, socketErrHanler); + } + } + case "http": + if (global.config.server.useFrontend) { + if (!socket.httpReverse.destroyed) { + return socket.httpReverse.write(data, socketErrHanler); + } else { + socket.httpReverse = net.createConnection( + httpPort, + "127.0.0.1", + ); + socket.httpReverse.on("error", socketErrHanler); + socket.httpReverse.on("data", (data) => + socketDataHandler(data, socket), + ); + return socket.httpReverse.write(data, socketErrHanler); + } + } + case "tcp": + return await this.api.exec(peerAddress, data, () => {}); + default: + return; + } + } + }); + }); - this.server.on('error', (err) => { - logger.log("Error of server"); - logger.log(err.stack); - }); + this.server.on("error", (err) => { + logger.log("Error of server"); + logger.log(err.stack); + }); - this.server.listen(this.port, this.address, (err) => { - if (err) throw err; - logger.log(`TCP server for ai-adventure labs connected on ${this.address}:${this.port}`); - }); - } + this.server.listen(this.port, this.address, (err) => { + if (err) throw err; + logger.log( + `TCP server for ai-adventure labs connected on ${this.address}:${this.port}`, + ); + }); + } } const defaultConfigData = { - server: { - address: "0.0.0.0", - port: 8841, - useWebSocketAPI: true, - useFrontend: true, - staticInfo: { - wsPort: 57891, - httpPort: 49901 - } - }, - database: { - dialect: "sqlite", - path: "./data" - }, - ai: { - apiType: "kobold" + server: { + address: "0.0.0.0", + port: 8841, + useWebSocketAPI: true, + useFrontend: true, + staticInfo: { + wsPort: 57891, + httpPort: 49901, + }, + }, + database: { + dialect: "sqlite", + path: "./data", + }, + ai: { + apiType: "kobold", + }, + rootuser: { + "login": "admin", + "password": "admin", + "activated": true } }; @@ -235,4 +258,4 @@ if (global.config.server.secureMode) { } else server.run(global.config.server.address, global.config.server.port); -*/ \ No newline at end of file +*/