summaryrefslogtreecommitdiff
path: root/server/server.js
diff options
context:
space:
mode:
Diffstat (limited to 'server/server.js')
-rwxr-xr-xserver/server.js102
1 files changed, 92 insertions, 10 deletions
diff --git a/server/server.js b/server/server.js
index 48368a3..40f9736 100755
--- a/server/server.js
+++ b/server/server.js
@@ -7,6 +7,8 @@ const fs = require('fs');
const crypto = require('crypto');
const zlib = require("zlib");
const os = require("os");
+const http = require("http");
+const url = require("url");
let localchatDataRoot = (os.platform() === "win32" ? os.homedir() + "/AppData/Roaming" : (os.platform() === "darwin" ? os.homedir() + "/Library/Application Support" : os.homedir())) + (os.platform() === "darwin" ? "/Chatroom" : "/.chatroom");
@@ -24,8 +26,8 @@ if (!fs.existsSync(localchatDataRoot + "/server/logs")) fs.mkdirSync(localchatDa
if (!fs.existsSync(localchatDataRoot + "/server/data")) fs.mkdirSync(localchatDataRoot + "/server/data");
process.chdir(localchatDataRoot + "/server");
-const version = "2.2";
-const port = 27342;
+const version = "2.3";
+const ports = [27342, 27343];
function mergeRecursive(obj1, obj2) {
for (const p in obj2) {
@@ -43,8 +45,8 @@ function mergeRecursive(obj1, obj2) {
return obj1;
}
-function loadLang(lang) {
- let language = lang ?? "en";
+function loadLang() {
+ let language = "en";
try {
return mergeRecursive(require('../shared/lang/en.json'), require('../shared/lang/' + language.replaceAll("/", "-") + ".json"));
@@ -61,9 +63,10 @@ function loadLang(lang) {
}
}
+let langData = loadLang();
+
function l(path, lang) {
let line = 'langData["' + path.split("/").map(i => i.replaceAll('"', "'")).join('"]["') + '"]';
- let langData = loadLang(lang);
try {
if (eval(line)) {
@@ -112,18 +115,20 @@ readline.question("Enter the IP address users would use to connect to the server
log("Loading encryption keys...");
const verify = JSON.parse(fs.readFileSync("./data/verify.json").toString());
const keys = crypt.generateKeys();
- const wss = new WebSocketServer({ port });
+ const wss = new WebSocketServer({ port: ports[0] });
const motd = fs.readFileSync("./config/motd.md").toString();
log("Loaded encryption keys");
log("Generating local server configuration...");
fs.writeFileSync("./exports/local.lctsc", zlib.brotliCompressSync(JSON.stringify({
- address: "ws://127.0.0.1:" + port,
+ address: "ws://127.0.0.1:" + ports[0],
+ screenSharing: "ws://127.0.0.1:" + ports[1],
key: verify.publicKey
})));
log("Generating remote server configuration...");
fs.writeFileSync("./exports/remote.lctsc", zlib.brotliCompressSync(JSON.stringify({
- address: "ws://" + serverConnectAddress + ":" + port,
+ address: "ws://" + serverConnectAddress + ":" + ports[0],
+ screenSharing: "ws://127.0.0.1:" + ports[1],
key: verify.publicKey
})));
log("Generated server configuration files to local.lctsc and remote.lctsc");
@@ -442,7 +447,6 @@ readline.question("Enter the IP address users would use to connect to the server
date: new Date().getTime(),
text: `${l("commands/lookup/username", ws.lang)} ${selected.userName}\n` +
`${l("commands/lookup/ip", ws.lang)} ${selected.ipAddress}\n` +
- `${l("commands/lookup/language", ws.lang)} ${l("_locale", selected.lang)}\n` +
`${l("commands/lookup/session", ws.lang)} ${selected.id}\n` +
`${l("commands/lookup/op", ws.lang)} ${operators.includes(selected.userName) ? l("commands/lookup/yes", ws.lang) : l("commands/lookup/no", ws.lang)}`
}), ws.publicKey)
@@ -808,5 +812,83 @@ readline.question("Enter the IP address users would use to connect to the server
});
});
- log("Started server on port " + port);
+ log("Starting screen sharing server...");
+ const sss = new WebSocketServer({ noServer: true });
+ let ssClients = [];
+ let screenShares = {};
+ sss.on('connection', function connection(ws, req, id) {
+ log("Screen sharing from " + req.socket.remoteAddress);
+ ws.id = uuid();
+ ws.ipAddress = ws.address = parseAddress(req.socket.remoteAddress);
+ ws.userName = ws.address = null;
+ ws.sharingID = require('crypto').randomBytes(128).toString("base64");
+ ws.watchers = [];
+
+ ws.on('error', (error) => {
+ log("Error occurred with SS socket, dumping below:", ws.address ?? null);
+ console.error(error);
+ });
+
+ ws.on('message', function message(_data) {
+ try {
+ for (let watcher of ws.watchers) {
+ try {
+ watcher.send(_data);
+ } catch (e) {}
+ }
+ } catch (e) {
+ console.error(e);
+ try { ws.close(); } catch (e) {}
+ }
+ });
+
+ ws.on('close', () => {
+ let address = ws.address;
+
+ log("Screen sharing closed", address);
+ ssClients = ssClients.filter(i => i.id !== ws.id);
+ delete screenShares[ws.sharingID];
+
+ for (let watcher of ws.watchers) {
+ watcher.close();
+ }
+
+ for (let id of Object.keys(screenShares)) {
+ screenShares[id].watchers = screenShares[id].watchers.filter(i => i.id !== ws.id);
+ }
+ });
+
+ if (id) {
+ if (screenShares[id]) {
+ log("Viewing screen for " + id, ws.address ?? null);
+ screenShares[id].watchers.push(ws);
+ } else {
+ ws.close();
+ }
+ } else {
+ ssClients.push(ws);
+ screenShares[ws.sharingID] = ws;
+ ws.send(ws.sharingID);
+ }
+ });
+
+ const server = http.createServer();
+
+ server.on('upgrade', function upgrade(request, socket, head) {
+ if (request.url.trim() === '/' || request.url.trim() === '') {
+ sss.handleUpgrade(request, socket, head, function done(ws) {
+ sss.emit('connection', ws, request, null);
+ });
+ } else {
+ sss.handleUpgrade(request, socket, head, function done(ws) {
+ sss.emit('connection', ws, request, request.url.substring(1));
+ });
+ }
+ });
+
+ server.listen(ports[1]);
+
+ log("Started screen sharing server");
+
+ log("Started server on ports " + ports[0] + " (Chatroom) and " + ports[1] + " (screen sharing)");
}); \ No newline at end of file