Skip to content

Commit 93e6753

Browse files
socket-io middleware authentication
expression session dependency was removed and simple socket.io middleware hash-challenge was used for authentication, modified the client and server for the changes the passphrase can be supplied to serverstart already as hash or as plaintext: the configuration files used for testing server.js were: { "hash": true, "passphrase":"9f735e0df9a1ddc702bf0a1a7b83033f9f7153a00c29de82cedadc9957289b05", "port": 8000 , "directory": "/usr/share/bone101" } and { "hash": false, "passphrase":"testpassword", "port": 8000 , "directory": "/usr/share/bone101" } also other unnecessary dependencies were removed, need to add test cases
1 parent dc9f1e9 commit 93e6753

File tree

6 files changed

+45
-77
lines changed

6 files changed

+45
-77
lines changed

package.json

-2
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,6 @@
2929
"dependencies": {
3030
"chokidar": "2.0.3",
3131
"express": "4.13.4",
32-
"express-session": "1.15.6",
33-
"basic-auth": "2.0.0",
3432
"socket.io": "1.4.5",
3533
"systemd": "0.3.1",
3634
"winston": "2.1.1",

server.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ fs.readFile(configFile, {
1212
} else {
1313
data = JSON.parse(data); //start server with saved config
1414
server = b.serverStart(data.port, data.directory, {
15-
username: data.username,
16-
password: data.password
15+
data: data.passphrase,
16+
hash: data.hash
1717
});
1818
}
1919
onServerStart();

src/bonescript.js

+8-19
Original file line numberDiff line numberDiff line change
@@ -18,24 +18,14 @@ _bonescript.on.initialized = function () {};
1818
(function () {
1919
if (typeof document == 'undefined') {
2020
var io = require('socket.io-client');
21-
var request = require('request');
22-
var jar = request.jar();
21+
var crypto = require('crypto');
2322
module.exports.startClient = function (host, callback) {
24-
//get the cookie string to be send with the socket connection
25-
var authUrl = 'http://' + host.address + ':' + host.port;
26-
request.get({
27-
url: authUrl,
28-
jar: jar
29-
}, function () {
30-
const cookies = jar.getCookieString(authUrl);
31-
_bonescript.on.initialized = callback;
32-
var socket = _onSocketIOLoaded(host.address, host.port, io, {
33-
cookies: cookies,
34-
credentials: 'Basic ' + new Buffer(host.username + ':' + host.password).toString('base64')
35-
});
36-
});
23+
var passphrase_hash;
24+
if (host.password)
25+
passphrase_hash = crypto.createHash('sha256').update(host.password).digest("hex"); //generate sha256 hash for supplied password
26+
_bonescript.on.initialized = callback;
27+
var socket = _onSocketIOLoaded(host.address, host.port, io, passphrase_hash);
3728
}
38-
3929
return;
4030
}
4131
require = myrequire;
@@ -48,7 +38,7 @@ _bonescript.on.initialized = function () {};
4838
scriptObj.onload = _onSocketIOLoaded;
4939
}());
5040

51-
function _onSocketIOLoaded(host, port, socketio, headers) {
41+
function _onSocketIOLoaded(host, port, socketio, passphrase_hash) {
5242
//console.log("socket.io loaded");
5343
if (typeof host == 'undefined') host = '___INSERT_HOST___';
5444
if (typeof port == 'undefined') port = 80;
@@ -57,8 +47,7 @@ function _onSocketIOLoaded(host, port, socketio, headers) {
5747
if (typeof host == 'string')
5848
socket = socketio('http://' + host + ':' + port, {
5949
extraHeaders: {
60-
'Cookie': headers.cookies,
61-
'Authorization': headers.credentials
50+
'Authorization': typeof passphrase_hash != 'undefined' ? passphrase_hash : null //send passphrase_has as Authorization extraheader
6251
}
6352
});
6453
else

src/server.js

+12-4
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ var http = require('http');
66
var winston = require('winston');
77
var express = require('express');
88
var events = require('events');
9+
var crypto = require('crypto');
910
var socketHandlers = require('./socket_handlers');
1011

1112
var serverEmitter = new events.EventEmitter();
@@ -16,14 +17,21 @@ myrequire('systemd', function () {
1617
if (debug) winston.debug("Startup as socket-activated service under systemd not enabled");
1718
});
1819

19-
var serverStart = function (port, directory, credentials, callback) {
20+
var serverStart = function (port, directory, passphrase, callback) {
2021
if (port === undefined) {
2122
port = (process.env.LISTEN_PID > 0) ? 'systemd' : ((process.env.PORT) ? process.env.PORT : 80);
2223
}
2324
if (directory === undefined) {
2425
directory = (process.env.SERVER_DIR) ? process.env.SERVER_DIR : '/usr/share/bone101';
2526
}
26-
var server = mylisten(port, directory, credentials);
27+
var passphrase_hash;
28+
if (passphrase) {
29+
if (passphrase.hash) //whether passphrase supplied as hash/text
30+
passphrase_hash = passphrase.data;
31+
else
32+
passphrase_hash = crypto.createHash('sha256').update(passphrase.data).digest("hex"); //generate hash
33+
}
34+
var server = mylisten(port, directory, passphrase_hash);
2735
serverEmitter.on('newListner', addServerListener);
2836

2937
function addServerListener(event, listener) {
@@ -46,15 +54,15 @@ var serverStart = function (port, directory, credentials, callback) {
4654
return (serverEmitter);
4755
};
4856

49-
function mylisten(port, directory, credentials) {
57+
function mylisten(port, directory, passphrase_hash) {
5058
winston.info("Opening port " + port + " to serve up " + directory);
5159
var app = express();
5260
app.get('/bonescript.js', socketHandlers.socketJSReqHandler);
5361
app.use('/bone101', express.static(directory));
5462
app.use('/bone101/static', express.static(directory + "/static"));
5563
app.use(express.static(directory));
5664
var server = http.createServer(app);
57-
socketHandlers.addSocketListeners(server, serverEmitter, credentials);
65+
socketHandlers.addSocketListeners(server, serverEmitter, passphrase_hash);
5866
server.listen(port);
5967
return (server);
6068
}

src/socket_handlers.js

+18-45
Original file line numberDiff line numberDiff line change
@@ -9,21 +9,6 @@ var winston = require('winston');
99
var socketio = require('socket.io');
1010
var debug = process.env.DEBUG ? true : false;
1111

12-
var expressSession = require('express-session');
13-
var auth = require('basic-auth');
14-
var sessionStore = new expressSession.MemoryStore();
15-
16-
var session = expressSession({
17-
name: "connect.sid",
18-
secret: "secretkey",
19-
cookie: {
20-
httpOnly: true
21-
},
22-
saveUninitialized: true,
23-
resave: true,
24-
store: sessionStore
25-
});
26-
2712
var socketJSReqHandler = function (req, res) {
2813
function sendFile(err, file) {
2914
if (err) {
@@ -47,44 +32,32 @@ var socketJSReqHandler = function (req, res) {
4732
}
4833
}
4934

50-
var addSocketListeners = function (server, serverEmitter, credentials) {
35+
var addSocketListeners = function (server, serverEmitter, passphrase_hash) {
5136
var io = socketio(server);
52-
io.use(function (socket, next) { //use the session middleware
53-
session(socket.request, socket.request.res, function () {
54-
var user = auth(socket.request);
55-
if (socket.request.sessionID) {
56-
if (credentials) {
57-
if (user)
58-
socket.request.session.isLoggedIn = (user.name == credentials.username && user.pass == credentials.password);
59-
socket.request.session.isSecure = true;
37+
if (passphrase_hash) { //attach middleware to handle authentication
38+
io.use(function (socket, next) {
39+
socket.auth = false; //consider the all sockets initially as unauthorized
40+
if (socket.handshake.headers.authorization) {
41+
if (socket.handshake.headers.authorization == passphrase_hash) {
42+
socket.auth = true; //authorize the socket
43+
next();
6044
} else
61-
socket.request.session.isSecure = false;
62-
sessionStore.get(socket.request.sessionID, function (err, session) {
63-
if (!session)
64-
socket.request.session.save(); //store the session only if not already existing
65-
authenticateSession();
66-
});
67-
} else
68-
next(new Error('no cookie data sent!!'));
69-
70-
function authenticateSession() {
71-
sessionStore.get(socket.request.sessionID, function (err, session) {
72-
if (!session)
73-
next(new Error('session not found!!'));
74-
else if (session.isLoggedIn || !session.isSecure)
75-
next();
76-
else
77-
next(new Error('user not logged in!!check username or password'));
78-
});
45+
next(new Error("Authentication Failed : incorrect passphrase !!"));
46+
} else {
47+
next(new Error("Authentication data not send !!"));
7948
}
8049
});
81-
});
50+
}
8251
if (debug) winston.debug('Listening for new socket.io clients');
83-
io.on('connection', onconnect);
52+
io.on('connection', function (socket) {
53+
if (socket.auth || !passphrase_hash)
54+
onconnect(socket);
55+
else
56+
socket.disconnect('unauthorized');
57+
});
8458

8559
function onconnect(socket) {
8660
winston.debug('Client connected');
87-
8861
serverEmitter.emit('socket$connect', socket);
8962

9063
// on disconnect

test/test-rpc_secure.js

+5-5
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ var myserver = null;
44

55
exports.setUp = function (callback) {
66
server.serverStart(8000, process.cwd(), { // create a secure server by supplying credentials
7-
username: 'testuser',
8-
password: 'testpass'
7+
data: 'testpass',
8+
hash: false
99
}, mycb);
1010

1111
function mycb(serverobj) {
@@ -18,11 +18,12 @@ exports.testRPC_secure1 = function (test) {
1818
test.expect(1);
1919
bonescript.startClient({ // this should throw an authentication error
2020
address: '127.0.0.1',
21-
port: 8000
21+
port: 8000,
22+
password: 'tdestpass'
2223
}, function () {});
2324
process.on('uncaughtException', function (err) {
2425
console.log(err.toString());
25-
test.equals(err.toString(), 'Error: user not logged in!!check username or password');
26+
test.equals(err.toString(), 'Error: Authentication Failed : incorrect passphrase !!');
2627
myserver.close();
2728
test.done();
2829
});
@@ -33,7 +34,6 @@ exports.testRPC_secure2 = function (test) {
3334
bonescript.startClient({
3435
address: '127.0.0.1',
3536
port: 8000,
36-
username: 'testuser',
3737
password: 'testpass' // will not throw any error
3838
}, function () {
3939
var b = bonescript.require('bonescript');

0 commit comments

Comments
 (0)