enigma-bbs/core/login_server_module.js

108 lines
3.2 KiB
JavaScript

/* jslint node: true */
'use strict';
// ENiGMA½
const Config = require('./config').get;
const logger = require('./logger.js');
const ServerModule = require('./server_module.js').ServerModule;
const clientConns = require('./client_connections.js');
const UserProps = require('./user_property.js');
// deps
const _ = require('lodash');
const moment = require('moment');
module.exports = class LoginServerModule extends ServerModule {
constructor() {
super();
}
// :TODO: we need to max connections -- e.g. from config 'maxConnections'
prepareClient(client, cb) {
if (client.user.isAuthenticated()) {
return cb(null);
}
const theme = require('./theme.js');
//
// Choose initial theme before we have user context
//
const preLoginTheme = _.get(Config(), 'theme.preLogin');
if ('*' === preLoginTheme) {
client.user.properties[UserProps.ThemeId] = theme.getRandomTheme() || '';
} else {
client.user.properties[UserProps.ThemeId] = preLoginTheme;
}
theme.setClientTheme(client, client.user.properties[UserProps.ThemeId]);
return cb(null);
}
handleNewClient(client, clientSock, modInfo) {
clientSock.on('error', err => {
logger.log.warn({ modInfo, error: err.message }, 'Client socket error');
});
//
// Start tracking the client. A session ID aka client ID
// will be established in addNewClient() below.
//
if (_.isUndefined(client.session)) {
client.session = {};
}
client.rawSocket = clientSock;
client.session.serverName = modInfo.name;
client.session.isSecure = _.isBoolean(client.isSecure)
? client.isSecure
: modInfo.isSecure || false;
clientConns.addNewClient(client, clientSock);
client.on('ready', readyOptions => {
client.startIdleMonitor();
// Go to module -- use default error handler
this.prepareClient(client, () => {
require('./connect.js').connectEntry(client, readyOptions.firstMenu);
});
});
client.on('end', () => {
clientConns.removeClient(client);
});
client.on('error', err => {
logger.log.info(
{ nodeId: client.node, error: err.message },
'Connection error'
);
});
client.on('close', err => {
const logFunc = err ? logger.log.info : logger.log.debug;
logFunc({ nodeId: client.node }, 'Connection closed');
clientConns.removeClient(client);
});
client.on('idle timeout', idleLogoutSeconds => {
client.log.info(
`Node ${client.node} idle timeout of ${moment
.duration(idleLogoutSeconds, 'seconds')
.humanize()} expired; Kicking`
);
client.menuStack.goto('idleLogoff', err => {
if (err) {
// likely just doesn't exist
client.term.write('\nIdle timeout expired. Goodbye!\n');
client.end();
}
});
});
}
};