From 95696912ed24faae0ab02b5691e5f9d89433932a Mon Sep 17 00:00:00 2001 From: Bryan Ashby Date: Sun, 30 Jul 2017 11:07:02 -0600 Subject: [PATCH 1/2] Fix image, update README.md slightly --- README.md | 6 +++--- docs/images/enigma-bbs.png | Bin 0 -> 6814 bytes 2 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 docs/images/enigma-bbs.png diff --git a/README.md b/README.md index 1fe19081..076c660f 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # ENiGMA½ BBS Software -![alt text](http://i325.photobucket.com/albums/k361/request4spam/enigma.ans_zps05w2ey4s.png "ENiGMA½ BBS") +![alt text](docs/images/enigma-bbs.png "ENiGMA½ BBS") ENiGMA½ is a modern BBS software with a nostalgic flair! @@ -9,7 +9,7 @@ ENiGMA½ is a modern BBS software with a nostalgic flair! * Multi platform: Anywhere [Node.js](https://nodejs.org/) runs likely works (known to work under Linux, FreeBSD, OpenBSD, OS X and Windows) * Unlimited multi node support (for all those BBS "callers"!) * **Highly** customizable via [HJSON](http://hjson.org/) based configuration, menus, and themes in addition to JavaScript based mods - * MCI support for lightbars, toggles, input areas, and so on plus many other other bells and whistles + * [MCI support](docs/mci.md) for lightbars, toggles, input areas, and so on plus many other other bells and whistles * Telnet & **SSH** access built in. Additional servers are easy to implement * [CP437](http://www.ascii-codes.com/) and UTF-8 output * [SyncTerm](http://syncterm.bbsdev.net/) style font and baud emulation support. Display PC/DOS and Amiga style artwork as it's intended! In general, ANSI-BBS / [cterm.txt](http://cvs.synchro.net/cgi-bin/viewcvs.cgi/*checkout*/src/conio/cterm.txt?content-type=text%2Fplain&revision=HEAD) / [bansi.txt](http://www.bbsdocumentary.com/library/PROGRAMS/GRAPHICS/ANSI/bansi.txt) are followed for expected BBS behavior @@ -17,7 +17,7 @@ ENiGMA½ is a modern BBS software with a nostalgic flair! * Renegade style pipe color codes * [SQLite](http://sqlite.org/) storage of users, message areas, and so on * Strong [PBKDF2](https://en.wikipedia.org/wiki/PBKDF2) backed password encryption - * [Door support](docs/doors.md) including common dropfile formats for legacy DOS doors. Built in [BBSLink](http://bbslink.net/), and [DoorParty](http://forums.throwbackbbs.com/) support! + * [Door support](docs/doors.md) including common dropfile formats for legacy DOS doors. Built in [BBSLink](http://bbslink.net/), [DoorParty](http://forums.throwbackbbs.com/), and [Exodus](https://oddnetwork.org/exodus/) support! * [Bunyan](https://github.com/trentm/node-bunyan) logging * [Message networks](docs/msg_networks.md) with FidoNet Type Network (FTN) + BinkleyTerm Style Outbound (BSO) message import/export * [Gazelle](https://github.com/WhatCD/Gazelle) inspirted File Bases including fast fully indexed full text search (FTS), #tags, and HTTP(S) temporary download URLs using a built in [web server](docs/web_server.md). Legacy X/Y/Z modem also supported! diff --git a/docs/images/enigma-bbs.png b/docs/images/enigma-bbs.png new file mode 100644 index 0000000000000000000000000000000000000000..85e30f695a34d61fa8f21d4dc7474fb34d1d0f49 GIT binary patch literal 6814 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 QzB_@AAGJ0sJ%YLXU)mj~lmGw# literal 0 HcmV?d00001 From d5954f81981193208f0f23b8438f01f2617a4711 Mon Sep 17 00:00:00 2001 From: Bryan Ashby Date: Sun, 6 Aug 2017 10:20:55 -0600 Subject: [PATCH 2/2] #118: Crash on STDIO doors when logged in via WebSocket --- core/servers/login/websocket.js | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/core/servers/login/websocket.js b/core/servers/login/websocket.js index 6f826cc9..3e018370 100644 --- a/core/servers/login/websocket.js +++ b/core/servers/login/websocket.js @@ -13,7 +13,7 @@ const WebSocketServer = require('ws').Server; const http = require('http'); const https = require('https'); const fs = require('graceful-fs'); -const EventEmitter = require('events'); +const Writable = require('stream'); const ModuleInfo = exports.moduleInfo = { name : 'WebSocket', @@ -34,7 +34,7 @@ function WebSocketClient(ws, req, serverType) { // This bridge makes accessible various calls that client sub classes // want to access on I/O socket // - this.socketBridge = new class SocketBridge extends EventEmitter { + this.socketBridge = new class SocketBridge extends Writable { constructor(ws) { super(); this.ws = ws; @@ -48,6 +48,15 @@ function WebSocketClient(ws, req, serverType) { return this.ws.send(data, { binary : true }, cb); } + // we need to fake some streaming work + unpipe() { + Log.trace('WebSocket SocketBridge unpipe()'); + } + + resume() { + Log.trace('WebSocket SocketBridge resume()'); + } + get remoteAddress() { // Support X-Forwarded-For and X-Real-IP headers for proxied connections return (self.proxied && (req.headers['x-forwarded-for'] || req.headers['x-real-ip'])) || req.connection.remoteAddress;