2017-09-02 23:25:43 +00:00
|
|
|
import Cucumber = require("cucumber");
|
|
|
|
import fs = require("fs");
|
|
|
|
import BluebirdPromise = require("bluebird");
|
|
|
|
import ChildProcess = require("child_process");
|
2017-10-06 22:09:42 +00:00
|
|
|
import { UserDataStore } from "../../../server/src/lib/storage/UserDataStore";
|
|
|
|
import { CollectionFactoryFactory } from "../../../server/src/lib/storage/CollectionFactoryFactory";
|
|
|
|
import { MongoConnector } from "../../../server/src/lib/connectors/mongo/MongoConnector";
|
|
|
|
import { IMongoClient } from "../../../server/src/lib/connectors/mongo/IMongoClient";
|
2017-10-16 22:38:10 +00:00
|
|
|
import { TotpHandler } from "../../../server/src/lib/authentication/totp/TotpHandler";
|
2017-09-21 20:07:34 +00:00
|
|
|
import Speakeasy = require("speakeasy");
|
2017-09-02 23:25:43 +00:00
|
|
|
|
2017-09-21 20:07:34 +00:00
|
|
|
Cucumber.defineSupportCode(function ({ setDefaultTimeout }) {
|
2017-09-08 21:18:20 +00:00
|
|
|
setDefaultTimeout(20 * 1000);
|
|
|
|
});
|
|
|
|
|
2017-09-21 20:07:34 +00:00
|
|
|
Cucumber.defineSupportCode(function ({ After, Before }) {
|
2017-10-16 22:38:10 +00:00
|
|
|
const exec = BluebirdPromise.promisify<any, any>(ChildProcess.exec);
|
2017-09-02 23:25:43 +00:00
|
|
|
|
2017-09-21 20:07:34 +00:00
|
|
|
After(function () {
|
2017-09-02 23:25:43 +00:00
|
|
|
return this.driver.quit();
|
|
|
|
});
|
|
|
|
|
2017-10-16 22:38:10 +00:00
|
|
|
function createRegulationConfiguration(): BluebirdPromise<void> {
|
|
|
|
return exec("\
|
|
|
|
cat config.template.yml | \
|
|
|
|
sed 's/find_time: [0-9]\\+/find_time: 15/' | \
|
|
|
|
sed 's/ban_time: [0-9]\\+/ban_time: 4/' > config.test.yml \
|
|
|
|
");
|
|
|
|
}
|
2017-09-02 23:25:43 +00:00
|
|
|
|
2017-10-16 22:38:10 +00:00
|
|
|
function createInactivityConfiguration(): BluebirdPromise<void> {
|
|
|
|
return exec("\
|
|
|
|
cat config.template.yml | \
|
|
|
|
sed 's/expiration: [0-9]\\+/expiration: 10000/' | \
|
|
|
|
sed 's/inactivity: [0-9]\\+/inactivity: 5000/' > config.test.yml \
|
|
|
|
");
|
|
|
|
}
|
|
|
|
|
2017-10-22 15:42:05 +00:00
|
|
|
function createSingleFactorConfiguration(): BluebirdPromise<void> {
|
|
|
|
return exec("\
|
|
|
|
cat config.template.yml | \
|
|
|
|
sed 's/default_method: two_factor/default_method: single_factor/' > config.test.yml \
|
|
|
|
");
|
|
|
|
}
|
|
|
|
|
2017-10-16 22:38:10 +00:00
|
|
|
function declareNeedsConfiguration(tag: string, cb: () => BluebirdPromise<void>) {
|
|
|
|
Before({ tags: "@needs-" + tag + "-config", timeout: 20 * 1000 }, function () {
|
|
|
|
return cb()
|
|
|
|
.then(function () {
|
|
|
|
return exec("./scripts/example-commit/dc-example.sh -f docker-compose.test.yml up -d authelia && sleep 1");
|
|
|
|
})
|
|
|
|
});
|
|
|
|
|
|
|
|
After({ tags: "@needs-" + tag + "-config", timeout: 20 * 1000 }, function () {
|
|
|
|
return exec("rm config.test.yml")
|
|
|
|
.then(function () {
|
|
|
|
return exec("./scripts/example-commit/dc-example.sh up -d authelia && sleep 1");
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
declareNeedsConfiguration("regulation", createRegulationConfiguration);
|
|
|
|
declareNeedsConfiguration("inactivity", createInactivityConfiguration);
|
2017-10-22 15:42:05 +00:00
|
|
|
declareNeedsConfiguration("single_factor", createSingleFactorConfiguration);
|
2017-09-21 20:07:34 +00:00
|
|
|
|
|
|
|
function registerUser(context: any, username: string) {
|
|
|
|
let secret: Speakeasy.Key;
|
|
|
|
const mongoConnector = new MongoConnector("mongodb://localhost:27017/authelia");
|
|
|
|
return mongoConnector.connect()
|
|
|
|
.then(function (mongoClient: IMongoClient) {
|
|
|
|
const collectionFactory = CollectionFactoryFactory.createMongo(mongoClient);
|
|
|
|
const userDataStore = new UserDataStore(collectionFactory);
|
|
|
|
|
2017-10-16 22:38:10 +00:00
|
|
|
const generator = new TotpHandler(Speakeasy);
|
2017-09-21 20:07:34 +00:00
|
|
|
secret = generator.generate();
|
|
|
|
return userDataStore.saveTOTPSecret(username, secret);
|
|
|
|
})
|
|
|
|
.then(function () {
|
|
|
|
context.totpSecrets["REGISTERED"] = secret.base32;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
function declareNeedRegisteredUserHooks(username: string) {
|
|
|
|
Before({ tags: "@need-registered-user-" + username, timeout: 15 * 1000 }, function () {
|
|
|
|
return registerUser(this, username);
|
|
|
|
});
|
|
|
|
|
|
|
|
After({ tags: "@need-registered-user-" + username, timeout: 15 * 1000 }, function () {
|
|
|
|
this.totpSecrets["REGISTERED"] = undefined;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
function needAuthenticatedUser(context: any, username: string): BluebirdPromise<void> {
|
2017-10-16 22:38:10 +00:00
|
|
|
return context.visit("https://auth.test.local:8080/logout")
|
|
|
|
.then(function () {
|
|
|
|
return context.visit("https://auth.test.local:8080/");
|
|
|
|
})
|
2017-09-21 20:07:34 +00:00
|
|
|
.then(function () {
|
|
|
|
return registerUser(context, username);
|
|
|
|
})
|
|
|
|
.then(function () {
|
|
|
|
return context.loginWithUserPassword(username, "password");
|
|
|
|
})
|
|
|
|
.then(function () {
|
|
|
|
return context.useTotpTokenHandle("REGISTERED");
|
|
|
|
})
|
2017-10-16 22:38:10 +00:00
|
|
|
.then(function () {
|
2017-10-21 23:23:26 +00:00
|
|
|
return context.clickOnButton("Sign in");
|
2017-09-21 20:07:34 +00:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
function declareNeedAuthenticatedUserHooks(username: string) {
|
|
|
|
Before({ tags: "@need-authenticated-user-" + username, timeout: 15 * 1000 }, function () {
|
|
|
|
return needAuthenticatedUser(this, username);
|
|
|
|
});
|
|
|
|
|
|
|
|
After({ tags: "@need-authenticated-user-" + username, timeout: 15 * 1000 }, function () {
|
|
|
|
this.totpSecrets["REGISTERED"] = undefined;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
function declareHooksForUser(username: string) {
|
|
|
|
declareNeedRegisteredUserHooks(username);
|
|
|
|
declareNeedAuthenticatedUserHooks(username);
|
|
|
|
}
|
|
|
|
|
|
|
|
const users = ["harry", "john", "bob", "blackhat"];
|
|
|
|
users.forEach(declareHooksForUser);
|
2017-09-02 23:25:43 +00:00
|
|
|
});
|