2017-05-20 14:49:05 +07:00
|
|
|
|
|
|
|
import * as ObjectPath from "object-path";
|
2017-07-20 02:06:12 +07:00
|
|
|
import {
|
|
|
|
AppConfiguration, UserConfiguration, NotifierConfiguration,
|
|
|
|
ACLConfiguration, LdapConfiguration, SessionRedisOptions,
|
2017-09-03 03:38:26 +07:00
|
|
|
MongoStorageConfiguration, LocalStorageConfiguration,
|
|
|
|
UserLdapConfiguration
|
2017-07-20 02:06:12 +07:00
|
|
|
} from "./Configuration";
|
2017-05-20 14:49:05 +07:00
|
|
|
|
2017-06-28 20:57:58 +07:00
|
|
|
const LDAP_URL_ENV_VARIABLE = "LDAP_URL";
|
|
|
|
|
2017-05-20 14:49:05 +07:00
|
|
|
|
|
|
|
function get_optional<T>(config: object, path: string, default_value: T): T {
|
|
|
|
let entry = default_value;
|
|
|
|
if (ObjectPath.has(config, path)) {
|
|
|
|
entry = ObjectPath.get<object, T>(config, path);
|
|
|
|
}
|
|
|
|
return entry;
|
|
|
|
}
|
|
|
|
|
|
|
|
function ensure_key_existence(config: object, path: string): void {
|
|
|
|
if (!ObjectPath.has(config, path)) {
|
|
|
|
throw new Error(`Configuration error: key '${path}' is missing in configuration file`);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-09-03 03:38:26 +07:00
|
|
|
function adaptLdapConfiguration(userConfig: UserLdapConfiguration): LdapConfiguration {
|
|
|
|
const DEFAULT_USERS_FILTER = "cn={0}";
|
|
|
|
const DEFAULT_GROUPS_FILTER = "member={0}";
|
|
|
|
const DEFAULT_GROUP_NAME_ATTRIBUTE = "cn";
|
|
|
|
const DEFAULT_MAIL_ATTRIBUTE = "mail";
|
|
|
|
|
|
|
|
let usersDN = userConfig.base_dn;
|
|
|
|
if (userConfig.additional_users_dn)
|
|
|
|
usersDN = userConfig.additional_users_dn + "," + usersDN;
|
|
|
|
|
|
|
|
let groupsDN = userConfig.base_dn;
|
|
|
|
if (userConfig.additional_groups_dn)
|
|
|
|
groupsDN = userConfig.additional_groups_dn + "," + groupsDN;
|
|
|
|
|
|
|
|
return {
|
|
|
|
url: userConfig.url,
|
|
|
|
users_dn: usersDN,
|
|
|
|
users_filter: userConfig.users_filter || DEFAULT_USERS_FILTER,
|
|
|
|
groups_dn: groupsDN,
|
|
|
|
groups_filter: userConfig.groups_filter || DEFAULT_GROUPS_FILTER,
|
|
|
|
group_name_attribute: userConfig.group_name_attribute || DEFAULT_GROUP_NAME_ATTRIBUTE,
|
|
|
|
mail_attribute: userConfig.mail_attribute || DEFAULT_MAIL_ATTRIBUTE,
|
|
|
|
password: userConfig.password,
|
|
|
|
user: userConfig.user
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2017-06-28 20:57:58 +07:00
|
|
|
function adaptFromUserConfiguration(userConfiguration: UserConfiguration): AppConfiguration {
|
|
|
|
ensure_key_existence(userConfiguration, "ldap");
|
2017-09-03 03:38:26 +07:00
|
|
|
// ensure_key_existence(userConfiguration, "ldap.url");
|
|
|
|
// ensure_key_existence(userConfiguration, "ldap.base_dn");
|
2017-06-28 20:57:58 +07:00
|
|
|
ensure_key_existence(userConfiguration, "session.secret");
|
2017-09-03 06:25:43 +07:00
|
|
|
ensure_key_existence(userConfiguration, "regulation");
|
2017-06-28 20:57:58 +07:00
|
|
|
|
2017-09-03 03:38:26 +07:00
|
|
|
const port = userConfiguration.port || 8080;
|
|
|
|
const ldapConfiguration = adaptLdapConfiguration(userConfiguration.ldap);
|
2017-06-28 20:57:58 +07:00
|
|
|
|
|
|
|
return {
|
|
|
|
port: port,
|
2017-09-03 03:38:26 +07:00
|
|
|
ldap: ldapConfiguration,
|
2017-06-28 20:57:58 +07:00
|
|
|
session: {
|
|
|
|
domain: ObjectPath.get<object, string>(userConfiguration, "session.domain"),
|
|
|
|
secret: ObjectPath.get<object, string>(userConfiguration, "session.secret"),
|
|
|
|
expiration: get_optional<number>(userConfiguration, "session.expiration", 3600000), // in ms
|
2017-07-03 03:24:51 +07:00
|
|
|
redis: ObjectPath.get<object, SessionRedisOptions>(userConfiguration, "session.redis")
|
2017-06-28 20:57:58 +07:00
|
|
|
},
|
2017-07-20 02:06:12 +07:00
|
|
|
storage: {
|
|
|
|
local: get_optional<LocalStorageConfiguration>(userConfiguration, "storage.local", undefined),
|
|
|
|
mongo: get_optional<MongoStorageConfiguration>(userConfiguration, "storage.mongo", undefined)
|
|
|
|
},
|
2017-06-28 20:57:58 +07:00
|
|
|
logs_level: get_optional<string>(userConfiguration, "logs_level", "info"),
|
|
|
|
notifier: ObjectPath.get<object, NotifierConfiguration>(userConfiguration, "notifier"),
|
2017-09-03 06:25:43 +07:00
|
|
|
access_control: ObjectPath.get<object, ACLConfiguration>(userConfiguration, "access_control"),
|
|
|
|
regulation: userConfiguration.regulation
|
2017-06-28 20:57:58 +07:00
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2017-07-20 02:06:12 +07:00
|
|
|
export class ConfigurationAdapter {
|
2017-06-28 20:57:58 +07:00
|
|
|
static adapt(userConfiguration: UserConfiguration): AppConfiguration {
|
|
|
|
const appConfiguration = adaptFromUserConfiguration(userConfiguration);
|
|
|
|
|
|
|
|
const ldapUrl = process.env[LDAP_URL_ENV_VARIABLE];
|
|
|
|
if (ldapUrl)
|
|
|
|
appConfiguration.ldap.url = ldapUrl;
|
|
|
|
|
|
|
|
return appConfiguration;
|
2017-05-20 14:49:05 +07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|