2017-07-20 02:06:12 +07:00
|
|
|
|
|
|
|
import winston = require("winston");
|
|
|
|
import BluebirdPromise = require("bluebird");
|
2017-10-07 18:46:19 +07:00
|
|
|
import U2F = require("u2f");
|
2017-10-08 05:46:57 +07:00
|
|
|
import Nodemailer = require("nodemailer");
|
|
|
|
|
|
|
|
import { IRequestLogger } from "./logging/IRequestLogger";
|
|
|
|
import { RequestLogger } from "./logging/RequestLogger";
|
2017-10-07 18:46:19 +07:00
|
|
|
|
2017-10-17 05:35:34 +07:00
|
|
|
import { TotpHandler } from "./authentication/totp/TotpHandler";
|
|
|
|
import { ITotpHandler } from "./authentication/totp/ITotpHandler";
|
2017-10-08 05:46:57 +07:00
|
|
|
import { NotifierFactory } from "./notifiers/NotifierFactory";
|
|
|
|
import { MailSenderBuilder } from "./notifiers/MailSenderBuilder";
|
2018-08-26 15:30:43 +07:00
|
|
|
import { LdapUsersDatabase } from "./authentication/backends/ldap/LdapUsersDatabase";
|
|
|
|
import { ConnectorFactory } from "./authentication/backends/ldap/connector/ConnectorFactory";
|
2017-10-08 05:46:57 +07:00
|
|
|
|
2017-07-20 02:06:12 +07:00
|
|
|
import { IUserDataStore } from "./storage/IUserDataStore";
|
|
|
|
import { UserDataStore } from "./storage/UserDataStore";
|
|
|
|
import { INotifier } from "./notifiers/INotifier";
|
2017-10-17 05:35:34 +07:00
|
|
|
import { Regulator } from "./regulation/Regulator";
|
|
|
|
import { IRegulator } from "./regulation/IRegulator";
|
2018-07-08 22:02:28 +07:00
|
|
|
import Configuration = require("./configuration/schema/Configuration");
|
2017-07-20 02:06:12 +07:00
|
|
|
import { CollectionFactoryFactory } from "./storage/CollectionFactoryFactory";
|
|
|
|
import { ICollectionFactory } from "./storage/ICollectionFactory";
|
|
|
|
import { MongoCollectionFactory } from "./storage/mongo/MongoCollectionFactory";
|
|
|
|
import { IMongoClient } from "./connectors/mongo/IMongoClient";
|
2017-10-07 23:37:08 +07:00
|
|
|
|
2017-07-20 02:06:12 +07:00
|
|
|
import { GlobalDependencies } from "../../types/Dependencies";
|
2017-10-08 05:46:57 +07:00
|
|
|
import { ServerVariables } from "./ServerVariables";
|
2018-08-19 21:51:36 +07:00
|
|
|
import { MongoClient } from "./connectors/mongo/MongoClient";
|
|
|
|
import { IGlobalLogger } from "./logging/IGlobalLogger";
|
2018-08-26 15:30:43 +07:00
|
|
|
import { SessionFactory } from "./authentication/backends/ldap/SessionFactory";
|
|
|
|
import { IUsersDatabase } from "./authentication/backends/IUsersDatabase";
|
|
|
|
import { FileUsersDatabase } from "./authentication/backends/file/FileUsersDatabase";
|
2018-10-23 04:21:17 +07:00
|
|
|
import { Authorizer } from "./authorization/Authorizer";
|
2017-10-07 23:37:08 +07:00
|
|
|
|
2017-07-20 02:06:12 +07:00
|
|
|
class UserDataStoreFactory {
|
2018-08-19 21:51:36 +07:00
|
|
|
static create(config: Configuration.Configuration, globalLogger: IGlobalLogger): BluebirdPromise<UserDataStore> {
|
2017-07-20 02:06:12 +07:00
|
|
|
if (config.storage.local) {
|
2017-09-22 03:17:55 +07:00
|
|
|
const nedbOptions: Nedb.DataStoreOptions = {
|
|
|
|
filename: config.storage.local.path,
|
|
|
|
inMemoryOnly: config.storage.local.in_memory
|
2017-07-20 02:06:12 +07:00
|
|
|
};
|
|
|
|
const collectionFactory = CollectionFactoryFactory.createNedb(nedbOptions);
|
|
|
|
return BluebirdPromise.resolve(new UserDataStore(collectionFactory));
|
|
|
|
}
|
|
|
|
else if (config.storage.mongo) {
|
2018-08-19 21:51:36 +07:00
|
|
|
const mongoClient = new MongoClient(
|
2018-08-26 18:10:23 +07:00
|
|
|
config.storage.mongo,
|
2018-08-19 21:51:36 +07:00
|
|
|
globalLogger);
|
|
|
|
const collectionFactory = CollectionFactoryFactory.createMongo(mongoClient);
|
|
|
|
return BluebirdPromise.resolve(new UserDataStore(collectionFactory));
|
2017-07-20 02:06:12 +07:00
|
|
|
}
|
|
|
|
|
|
|
|
return BluebirdPromise.reject(new Error("Storage backend incorrectly configured."));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-10-17 05:35:34 +07:00
|
|
|
export class ServerVariablesInitializer {
|
2018-08-26 15:30:43 +07:00
|
|
|
static createUsersDatabase(
|
|
|
|
config: Configuration.Configuration,
|
|
|
|
deps: GlobalDependencies)
|
|
|
|
: IUsersDatabase {
|
|
|
|
|
|
|
|
if (config.authentication_backend.ldap) {
|
|
|
|
const ldapConfig = config.authentication_backend.ldap;
|
|
|
|
return new LdapUsersDatabase(
|
|
|
|
new SessionFactory(
|
|
|
|
ldapConfig,
|
|
|
|
new ConnectorFactory(ldapConfig, deps.ldapjs),
|
|
|
|
deps.winston
|
|
|
|
),
|
|
|
|
ldapConfig
|
|
|
|
);
|
|
|
|
}
|
|
|
|
else if (config.authentication_backend.file) {
|
|
|
|
return new FileUsersDatabase(config.authentication_backend.file);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-08-19 21:51:36 +07:00
|
|
|
static initialize(
|
|
|
|
config: Configuration.Configuration,
|
|
|
|
globalLogger: IGlobalLogger,
|
|
|
|
requestLogger: IRequestLogger,
|
2018-08-26 15:30:43 +07:00
|
|
|
deps: GlobalDependencies)
|
|
|
|
: BluebirdPromise<ServerVariables> {
|
2018-08-19 21:51:36 +07:00
|
|
|
|
2018-08-26 15:30:43 +07:00
|
|
|
const mailSenderBuilder =
|
|
|
|
new MailSenderBuilder(Nodemailer);
|
|
|
|
const notifier = NotifierFactory.build(
|
|
|
|
config.notifier, mailSenderBuilder);
|
2018-10-23 04:21:17 +07:00
|
|
|
const authorizer = new Authorizer(config.access_control, deps.winston);
|
|
|
|
const totpHandler = new TotpHandler(deps.speakeasy);
|
2018-08-26 15:30:43 +07:00
|
|
|
const usersDatabase = this.createUsersDatabase(
|
|
|
|
config, deps);
|
2017-07-20 02:06:12 +07:00
|
|
|
|
2018-08-19 21:51:36 +07:00
|
|
|
return UserDataStoreFactory.create(config, globalLogger)
|
2017-07-20 02:06:12 +07:00
|
|
|
.then(function (userDataStore: UserDataStore) {
|
2017-10-17 05:35:34 +07:00
|
|
|
const regulator = new Regulator(userDataStore, config.regulation.max_retries,
|
2017-09-03 06:25:43 +07:00
|
|
|
config.regulation.find_time, config.regulation.ban_time);
|
2017-07-20 02:06:12 +07:00
|
|
|
|
|
|
|
const variables: ServerVariables = {
|
2018-10-23 04:21:17 +07:00
|
|
|
authorizer: authorizer,
|
2017-07-20 02:06:12 +07:00
|
|
|
config: config,
|
2018-08-26 15:30:43 +07:00
|
|
|
usersDatabase: usersDatabase,
|
2017-10-08 05:46:57 +07:00
|
|
|
logger: requestLogger,
|
2017-07-20 02:06:12 +07:00
|
|
|
notifier: notifier,
|
|
|
|
regulator: regulator,
|
2017-10-17 05:35:34 +07:00
|
|
|
totpHandler: totpHandler,
|
2017-07-20 02:06:12 +07:00
|
|
|
u2f: deps.u2f,
|
2017-10-17 05:35:34 +07:00
|
|
|
userDataStore: userDataStore
|
2017-07-20 02:06:12 +07:00
|
|
|
};
|
2017-10-17 05:35:34 +07:00
|
|
|
return BluebirdPromise.resolve(variables);
|
2017-07-20 02:06:12 +07:00
|
|
|
});
|
2017-10-20 05:42:33 +07:00
|
|
|
}
|
2017-10-17 05:35:34 +07:00
|
|
|
}
|