enigma-bbs/core/servers/ssh.js

76 lines
1.7 KiB
JavaScript

/* jslint node: true */
'use strict';
// ENiGMA½
var conf = require('../config.js');
var baseClient = require('../client.js');
var user = require('../user.js');
var ssh2 = require('ssh2');
var fs = require('fs');
exports.moduleInfo = {
name : 'SSH',
desc : 'SSH Server',
author : 'NuSkooler'
};
exports.createServer = createServer;
function SSHClient(input, output) {
baseClient.Client.apply(this, arguments);
var self = this;
this.input.on('authentication', function onAuthentication(ctx) {
console.log('auth: ' + ctx.method);
if('password' == ctx.method) {
// :TODO: Log attempts
user.authenticate(ctx.username, ctx.password, self, function onAuthResult(isAuth) {
if(isAuth) {
ctx.accept();
} else {
ctx.reject();
}
});
} else if('publickey' == ctx.method) {
console.log('pub key path');
// :TODO: support this. Allow users to generate a key for use or w/e
} else {
ctx.reject();
}
});
this.input.on('ready', function onReady() {
console.log('Client authenticated');
});
this.input.on('session', function onSession(accept, reject) {
var session = accept();
});
this.input.on('end', function onEnd() {
self.emit('end');
});
}
require('util').inherits(SSHClient, baseClient.Client);
function createServer() {
// :TODO: setup all options here. What should the banner, etc. really be????
var serverConf = {
privateKey : fs.readFileSync(conf.config.servers.ssh.rsaPrivateKey),
banner : 'ENiGMA½ BBS SSH Server',
debug : function onDebug(s) { console.log(s); }
};
var server = ssh2.Server(serverConf);
server.on('connection', function onConnection(conn) {
var client = new SSHClient(conn, conn);
this.emit('client', client);
});
return server;
}