|
@ -31,3 +31,5 @@ dist/
|
||||||
/config.yml
|
/config.yml
|
||||||
|
|
||||||
example/ldap/private.ldif
|
example/ldap/private.ldif
|
||||||
|
|
||||||
|
package-lock.json
|
||||||
|
|
|
@ -5,7 +5,8 @@ WORKDIR /usr/src
|
||||||
COPY package.json /usr/src/package.json
|
COPY package.json /usr/src/package.json
|
||||||
RUN npm install --production
|
RUN npm install --production
|
||||||
|
|
||||||
COPY dist/src/server /usr/src
|
COPY dist/server /usr/src/server
|
||||||
|
COPY dist/shared /usr/src/shared
|
||||||
|
|
||||||
ENV PORT=80
|
ENV PORT=80
|
||||||
EXPOSE 80
|
EXPOSE 80
|
||||||
|
@ -13,4 +14,4 @@ EXPOSE 80
|
||||||
VOLUME /etc/authelia
|
VOLUME /etc/authelia
|
||||||
VOLUME /var/lib/authelia
|
VOLUME /var/lib/authelia
|
||||||
|
|
||||||
CMD ["node", "index.js", "/etc/authelia/config.yml"]
|
CMD ["node", "server/src/index.js", "/etc/authelia/config.yml"]
|
||||||
|
|
111
Gruntfile.js
|
@ -2,75 +2,90 @@ module.exports = function (grunt) {
|
||||||
const buildDir = "dist";
|
const buildDir = "dist";
|
||||||
|
|
||||||
grunt.initConfig({
|
grunt.initConfig({
|
||||||
|
env: {
|
||||||
|
"env-test-server-unit": {
|
||||||
|
TS_NODE_PROJECT: "server"
|
||||||
|
},
|
||||||
|
"env-test-client-unit": {
|
||||||
|
TS_NODE_PROJECT: "client"
|
||||||
|
}
|
||||||
|
},
|
||||||
run: {
|
run: {
|
||||||
options: {},
|
"compile-server": {
|
||||||
"build": {
|
|
||||||
cmd: "./node_modules/.bin/tsc",
|
cmd: "./node_modules/.bin/tsc",
|
||||||
args: ['-p', 'tsconfig.json']
|
args: ['-p', 'server/tsconfig.json']
|
||||||
},
|
},
|
||||||
"tslint": {
|
"compile-client": {
|
||||||
|
cmd: "./node_modules/.bin/tsc",
|
||||||
|
args: ['-p', 'client/tsconfig.json']
|
||||||
|
},
|
||||||
|
"lint-server": {
|
||||||
cmd: "./node_modules/.bin/tslint",
|
cmd: "./node_modules/.bin/tslint",
|
||||||
args: ['-c', 'tslint.json', '-p', 'tsconfig.json']
|
args: ['-c', 'server/tslint.json', '-p', 'server/tsconfig.json']
|
||||||
},
|
},
|
||||||
"unit-tests": {
|
"lint-client": {
|
||||||
|
cmd: "./node_modules/.bin/tslint",
|
||||||
|
args: ['-c', 'client/tslint.json', '-p', 'client/tsconfig.json']
|
||||||
|
},
|
||||||
|
"test-server-unit": {
|
||||||
cmd: "./node_modules/.bin/mocha",
|
cmd: "./node_modules/.bin/mocha",
|
||||||
args: ['--compilers', 'ts:ts-node/register', '--recursive', 'test/unit']
|
args: ['--colors', '--compilers', 'ts:ts-node/register', '--recursive', 'server/test']
|
||||||
},
|
},
|
||||||
"integration-tests": {
|
"test-client-unit": {
|
||||||
|
cmd: "./node_modules/.bin/mocha",
|
||||||
|
args: ['--colors', '--compilers', 'ts:ts-node/register', '--recursive', 'client/test']
|
||||||
|
},
|
||||||
|
"test-int": {
|
||||||
cmd: "./node_modules/.bin/cucumber-js",
|
cmd: "./node_modules/.bin/cucumber-js",
|
||||||
args: ["--compiler", "ts:ts-node/register", "./test/features"]
|
args: ["--colors", "--compiler", "ts:ts-node/register", "./test/features"]
|
||||||
},
|
},
|
||||||
"docker-build": {
|
"docker-build": {
|
||||||
cmd: "docker",
|
cmd: "docker",
|
||||||
args: ['build', '-t', 'clems4ever/authelia', '.']
|
args: ['build', '-t', 'clems4ever/authelia', '.']
|
||||||
},
|
},
|
||||||
"docker-restart": {
|
|
||||||
cmd: "./scripts/dc-dev.sh",
|
|
||||||
args: ['restart', 'authelia']
|
|
||||||
},
|
|
||||||
"minify": {
|
"minify": {
|
||||||
cmd: "./node_modules/.bin/uglifyjs",
|
cmd: "./node_modules/.bin/uglifyjs",
|
||||||
args: [`${buildDir}/src/server/public_html/js/authelia.js`, '-o', `${buildDir}/src/server/public_html/js/authelia.min.js`]
|
args: [`${buildDir}/server/src/public_html/js/authelia.js`, '-o', `${buildDir}/server/src/public_html/js/authelia.min.js`]
|
||||||
},
|
},
|
||||||
"apidoc": {
|
"apidoc": {
|
||||||
cmd: "./node_modules/.bin/apidoc",
|
cmd: "./node_modules/.bin/apidoc",
|
||||||
args: ["-i", "src/server", "-o", "doc"]
|
args: ["-i", "src/server", "-o", "doc"]
|
||||||
},
|
},
|
||||||
"make-dev-views": {
|
"include-minified-script": {
|
||||||
cmd: "sed",
|
cmd: "sed",
|
||||||
args: ["-i", "s/authelia\.min/authelia/", `${buildDir}/src/server/views/layout/layout.pug`]
|
args: ["-i", "s/authelia\.min/authelia/", `${buildDir}/server/src/views/layout/layout.pug`]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
copy: {
|
copy: {
|
||||||
resources: {
|
resources: {
|
||||||
expand: true,
|
expand: true,
|
||||||
cwd: 'src/server/resources/',
|
cwd: 'server/src/resources/',
|
||||||
src: '**',
|
src: '**',
|
||||||
dest: `${buildDir}/src/server/resources/`
|
dest: `${buildDir}/server/src/resources/`
|
||||||
},
|
},
|
||||||
views: {
|
views: {
|
||||||
expand: true,
|
expand: true,
|
||||||
cwd: 'src/server/views/',
|
cwd: 'server/src/views/',
|
||||||
src: '**',
|
src: '**',
|
||||||
dest: `${buildDir}/src/server/views/`
|
dest: `${buildDir}/server/src/views/`
|
||||||
},
|
},
|
||||||
images: {
|
images: {
|
||||||
expand: true,
|
expand: true,
|
||||||
cwd: 'src/client/img',
|
cwd: 'client/src/img',
|
||||||
src: '**',
|
src: '**',
|
||||||
dest: `${buildDir}/src/server/public_html/img/`
|
dest: `${buildDir}/server/src/public_html/img/`
|
||||||
},
|
},
|
||||||
thirdparties: {
|
thirdparties: {
|
||||||
expand: true,
|
expand: true,
|
||||||
cwd: 'src/client/thirdparties',
|
cwd: 'client/src/thirdparties',
|
||||||
src: '**',
|
src: '**',
|
||||||
dest: `${buildDir}/src/server/public_html/js/`
|
dest: `${buildDir}/server/src/public_html/js/`
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
browserify: {
|
browserify: {
|
||||||
dist: {
|
dist: {
|
||||||
src: ['dist/src/client/index.js'],
|
src: ['dist/client/src/index.js'],
|
||||||
dest: `${buildDir}/src/server/public_html/js/authelia.js`,
|
dest: `${buildDir}/server/src/public_html/js/authelia.js`,
|
||||||
options: {
|
options: {
|
||||||
browserifyOptions: {
|
browserifyOptions: {
|
||||||
standalone: 'authelia'
|
standalone: 'authelia'
|
||||||
|
@ -80,7 +95,7 @@ module.exports = function (grunt) {
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
views: {
|
views: {
|
||||||
files: ['src/server/views/**/*.pug'],
|
files: ['server/src/views/**/*.pug'],
|
||||||
tasks: ['copy:views'],
|
tasks: ['copy:views'],
|
||||||
options: {
|
options: {
|
||||||
interrupt: false,
|
interrupt: false,
|
||||||
|
@ -88,7 +103,7 @@ module.exports = function (grunt) {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
resources: {
|
resources: {
|
||||||
files: ['src/server/resources/*.ejs'],
|
files: ['server/src/resources/*.ejs'],
|
||||||
tasks: ['copy:resources'],
|
tasks: ['copy:resources'],
|
||||||
options: {
|
options: {
|
||||||
interrupt: false,
|
interrupt: false,
|
||||||
|
@ -96,7 +111,7 @@ module.exports = function (grunt) {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
images: {
|
images: {
|
||||||
files: ['src/client/img/**'],
|
files: ['client/src/img/**'],
|
||||||
tasks: ['copy:images'],
|
tasks: ['copy:images'],
|
||||||
options: {
|
options: {
|
||||||
interrupt: false,
|
interrupt: false,
|
||||||
|
@ -104,7 +119,7 @@ module.exports = function (grunt) {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
css: {
|
css: {
|
||||||
files: ['src/client/**/*.css'],
|
files: ['client/src/**/*.css'],
|
||||||
tasks: ['concat:css', 'cssmin'],
|
tasks: ['concat:css', 'cssmin'],
|
||||||
options: {
|
options: {
|
||||||
interrupt: true,
|
interrupt: true,
|
||||||
|
@ -112,7 +127,7 @@ module.exports = function (grunt) {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
client: {
|
client: {
|
||||||
files: ['src/client/**/*.ts'],
|
files: ['client/src/**/*.ts'],
|
||||||
tasks: ['build-dev'],
|
tasks: ['build-dev'],
|
||||||
options: {
|
options: {
|
||||||
interrupt: true,
|
interrupt: true,
|
||||||
|
@ -120,7 +135,7 @@ module.exports = function (grunt) {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
server: {
|
server: {
|
||||||
files: ['src/server/**/*.ts'],
|
files: ['server/src/**/*.ts'],
|
||||||
tasks: ['build-dev', 'run:docker-restart', 'run:make-dev-views' ],
|
tasks: ['build-dev', 'run:docker-restart', 'run:make-dev-views' ],
|
||||||
options: {
|
options: {
|
||||||
interrupt: true,
|
interrupt: true,
|
||||||
|
@ -130,14 +145,14 @@ module.exports = function (grunt) {
|
||||||
},
|
},
|
||||||
concat: {
|
concat: {
|
||||||
css: {
|
css: {
|
||||||
src: ['src/client/css/*.css'],
|
src: ['client/src/css/*.css'],
|
||||||
dest: `${buildDir}/src/server/public_html/css/authelia.css`
|
dest: `${buildDir}/server/src/public_html/css/authelia.css`
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
cssmin: {
|
cssmin: {
|
||||||
target: {
|
target: {
|
||||||
files: {
|
files: {
|
||||||
[`${buildDir}/src/server/public_html/css/authelia.min.css`]: [`${buildDir}/src/server/public_html/css/authelia.css`]
|
[`${buildDir}/server/src/public_html/css/authelia.min.css`]: [`${buildDir}/server/src/public_html/css/authelia.css`]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -149,20 +164,26 @@ module.exports = function (grunt) {
|
||||||
grunt.loadNpmTasks('grunt-contrib-cssmin');
|
grunt.loadNpmTasks('grunt-contrib-cssmin');
|
||||||
grunt.loadNpmTasks('grunt-contrib-watch');
|
grunt.loadNpmTasks('grunt-contrib-watch');
|
||||||
grunt.loadNpmTasks('grunt-run');
|
grunt.loadNpmTasks('grunt-run');
|
||||||
|
grunt.loadNpmTasks('grunt-env');
|
||||||
|
|
||||||
grunt.registerTask('default', ['build-dist']);
|
|
||||||
|
|
||||||
grunt.registerTask('build-resources', ['copy:resources', 'copy:views', 'copy:images', 'copy:thirdparties', 'concat:css']);
|
grunt.registerTask('compile-server', ['run:lint-server', 'run:compile-server'])
|
||||||
|
grunt.registerTask('compile-client', ['run:lint-client', 'run:compile-client'])
|
||||||
|
|
||||||
grunt.registerTask('build-common', ['run:tslint', 'run:build', 'browserify:dist', 'build-resources']);
|
grunt.registerTask('test-server', ['env:env-test-server-unit', 'run:test-server-unit'])
|
||||||
grunt.registerTask('build-dev', ['build-common', 'run:make-dev-views']);
|
grunt.registerTask('test-client', ['env:env-test-client-unit', 'run:test-client-unit'])
|
||||||
grunt.registerTask('build-dist', ['build-common', 'run:minify', 'cssmin']);
|
grunt.registerTask('test-unit', ['test-server', 'test-client']);
|
||||||
|
grunt.registerTask('test-int', ['run:test-int']);
|
||||||
|
|
||||||
|
grunt.registerTask('copy-resources', ['copy:resources', 'copy:views', 'copy:images', 'copy:thirdparties', 'concat:css']);
|
||||||
|
|
||||||
|
grunt.registerTask('build-client', ['compile-client', 'browserify']);
|
||||||
|
grunt.registerTask('build-server', ['compile-server', 'copy-resources']);
|
||||||
|
|
||||||
|
grunt.registerTask('build', ['build-client', 'build-server']);
|
||||||
|
grunt.registerTask('build-dist', ['build', 'run:minify', 'cssmin', 'run:include-minified-script']);
|
||||||
|
|
||||||
grunt.registerTask('docker-build', ['run:docker-build']);
|
grunt.registerTask('docker-build', ['run:docker-build']);
|
||||||
grunt.registerTask('docker-restart', ['run:docker-restart']);
|
|
||||||
|
|
||||||
grunt.registerTask('unit-tests', ['run:unit-tests']);
|
grunt.registerTask('default', ['build-dist']);
|
||||||
grunt.registerTask('integration-tests', ['run:integration-tests']);
|
|
||||||
|
|
||||||
grunt.registerTask('test', ['unit-tests']);
|
|
||||||
};
|
};
|
||||||
|
|
Before Width: | Height: | Size: 814 B After Width: | Height: | Size: 814 B |
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 3.5 KiB |
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 3.2 KiB |
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 6.6 KiB After Width: | Height: | Size: 6.6 KiB |
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 3.1 KiB |
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 2.9 KiB |
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 3.9 KiB |
|
@ -9,7 +9,7 @@ import ResetPasswordRequest from "./lib/reset-password/reset-password-request";
|
||||||
import ResetPasswordForm from "./lib/reset-password/reset-password-form";
|
import ResetPasswordForm from "./lib/reset-password/reset-password-form";
|
||||||
import jslogger = require("js-logger");
|
import jslogger = require("js-logger");
|
||||||
import jQuery = require("jquery");
|
import jQuery = require("jquery");
|
||||||
import u2fApi = require("u2f-api");
|
import U2fApi = require("u2f-api");
|
||||||
|
|
||||||
jslogger.useDefaults();
|
jslogger.useDefaults();
|
||||||
jslogger.setLevel(jslogger.INFO);
|
jslogger.setLevel(jslogger.INFO);
|
||||||
|
@ -19,7 +19,7 @@ export = {
|
||||||
FirstFactor(window, jQuery, FirstFactorValidator, jslogger);
|
FirstFactor(window, jQuery, FirstFactorValidator, jslogger);
|
||||||
},
|
},
|
||||||
secondfactor: function () {
|
secondfactor: function () {
|
||||||
SecondFactor(window, jQuery, u2fApi);
|
SecondFactor(window, jQuery, U2fApi);
|
||||||
},
|
},
|
||||||
register_totp: function() {
|
register_totp: function() {
|
||||||
TOTPRegister(window, jQuery);
|
TOTPRegister(window, jQuery);
|
|
@ -1,7 +1,7 @@
|
||||||
|
|
||||||
import BluebirdPromise = require("bluebird");
|
import BluebirdPromise = require("bluebird");
|
||||||
import Endpoints = require("../../../server/endpoints");
|
import Endpoints = require("../../../../shared/api");
|
||||||
import Constants = require("../../../server/constants");
|
import Constants = require("../../../../shared/constants");
|
||||||
|
|
||||||
export function validate(username: string, password: string,
|
export function validate(username: string, password: string,
|
||||||
redirectUrl: string, onlyBasicAuth: boolean, $: JQueryStatic): BluebirdPromise<string> {
|
redirectUrl: string, onlyBasicAuth: boolean, $: JQueryStatic): BluebirdPromise<string> {
|
|
@ -3,8 +3,8 @@ import JSLogger = require("js-logger");
|
||||||
import UISelectors = require("./UISelectors");
|
import UISelectors = require("./UISelectors");
|
||||||
import { Notifier } from "../Notifier";
|
import { Notifier } from "../Notifier";
|
||||||
import { QueryParametersRetriever } from "../QueryParametersRetriever";
|
import { QueryParametersRetriever } from "../QueryParametersRetriever";
|
||||||
import Constants = require("../../../server/constants");
|
import Constants = require("../../../../shared/constants");
|
||||||
import Endpoints = require("../../../server/endpoints");
|
import Endpoints = require("../../../../shared/api");
|
||||||
|
|
||||||
export default function (window: Window, $: JQueryStatic,
|
export default function (window: Window, $: JQueryStatic,
|
||||||
firstFactorValidator: typeof FirstFactorValidator, jslogger: typeof JSLogger) {
|
firstFactorValidator: typeof FirstFactorValidator, jslogger: typeof JSLogger) {
|
|
@ -1,6 +1,6 @@
|
||||||
import BluebirdPromise = require("bluebird");
|
import BluebirdPromise = require("bluebird");
|
||||||
|
|
||||||
import Endpoints = require("../../../server/endpoints");
|
import Endpoints = require("../../../../shared/api");
|
||||||
import Constants = require("./constants");
|
import Constants = require("./constants");
|
||||||
import { Notifier } from "../Notifier";
|
import { Notifier } from "../Notifier";
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
|
|
||||||
import BluebirdPromise = require("bluebird");
|
import BluebirdPromise = require("bluebird");
|
||||||
|
|
||||||
import Endpoints = require("../../../server/endpoints");
|
import Endpoints = require("../../../../shared/api");
|
||||||
import Constants = require("./constants");
|
import Constants = require("./constants");
|
||||||
import jslogger = require("js-logger");
|
import jslogger = require("js-logger");
|
||||||
import { Notifier } from "../Notifier";
|
import { Notifier } from "../Notifier";
|
|
@ -1,6 +1,6 @@
|
||||||
|
|
||||||
import BluebirdPromise = require("bluebird");
|
import BluebirdPromise = require("bluebird");
|
||||||
import Endpoints = require("../../../server/endpoints");
|
import Endpoints = require("../../../../shared/api");
|
||||||
|
|
||||||
export function validate(token: string, $: JQueryStatic): BluebirdPromise<string> {
|
export function validate(token: string, $: JQueryStatic): BluebirdPromise<string> {
|
||||||
return new BluebirdPromise<string>(function (resolve, reject) {
|
return new BluebirdPromise<string>(function (resolve, reject) {
|
|
@ -2,8 +2,8 @@
|
||||||
import U2fApi = require("u2f-api");
|
import U2fApi = require("u2f-api");
|
||||||
import U2f = require("u2f");
|
import U2f = require("u2f");
|
||||||
import BluebirdPromise = require("bluebird");
|
import BluebirdPromise = require("bluebird");
|
||||||
import { SignMessage } from "../../../server/lib/routes/secondfactor/u2f/sign_request/SignMessage";
|
import { SignMessage } from "../../../../shared/SignMessage";
|
||||||
import Endpoints = require("../../../server/endpoints");
|
import Endpoints = require("../../../../shared/api");
|
||||||
import { INotifier } from "../INotifier";
|
import { INotifier } from "../INotifier";
|
||||||
|
|
||||||
function finishU2fAuthentication(responseData: U2fApi.SignResponse, $: JQueryStatic): BluebirdPromise<void> {
|
function finishU2fAuthentication(responseData: U2fApi.SignResponse, $: JQueryStatic): BluebirdPromise<void> {
|
|
@ -4,11 +4,11 @@ import jslogger = require("js-logger");
|
||||||
|
|
||||||
import TOTPValidator = require("./TOTPValidator");
|
import TOTPValidator = require("./TOTPValidator");
|
||||||
import U2FValidator = require("./U2FValidator");
|
import U2FValidator = require("./U2FValidator");
|
||||||
import Endpoints = require("../../../server/endpoints");
|
|
||||||
import Constants = require("./constants");
|
import Constants = require("./constants");
|
||||||
import { Notifier } from "../Notifier";
|
import { Notifier } from "../Notifier";
|
||||||
import { QueryParametersRetriever } from "../QueryParametersRetriever";
|
import { QueryParametersRetriever } from "../QueryParametersRetriever";
|
||||||
import ServerConstants = require("../../../server/constants");
|
import Endpoints = require("../../../../shared/api");
|
||||||
|
import ServerConstants = require("../../../../shared/constants");
|
||||||
|
|
||||||
|
|
||||||
export default function (window: Window, $: JQueryStatic, u2fApi: typeof U2fApi) {
|
export default function (window: Window, $: JQueryStatic, u2fApi: typeof U2fApi) {
|
|
@ -2,9 +2,9 @@
|
||||||
import BluebirdPromise = require("bluebird");
|
import BluebirdPromise = require("bluebird");
|
||||||
import U2f = require("u2f");
|
import U2f = require("u2f");
|
||||||
import u2fApi = require("u2f-api");
|
import u2fApi = require("u2f-api");
|
||||||
import Endpoints = require("../../../server/endpoints");
|
|
||||||
import jslogger = require("js-logger");
|
import jslogger = require("js-logger");
|
||||||
import { Notifier } from "../Notifier";
|
import { Notifier } from "../Notifier";
|
||||||
|
import Endpoints = require("../../../../shared/api");
|
||||||
|
|
||||||
export default function (window: Window, $: JQueryStatic) {
|
export default function (window: Window, $: JQueryStatic) {
|
||||||
const notifier = new Notifier(".notification", $);
|
const notifier = new Notifier(".notification", $);
|
|
@ -3,7 +3,7 @@ import Assert = require("assert");
|
||||||
import Sinon = require("sinon");
|
import Sinon = require("sinon");
|
||||||
import JQueryMock = require("./mocks/jquery");
|
import JQueryMock = require("./mocks/jquery");
|
||||||
|
|
||||||
import { Notifier } from "../../../src/client/lib/Notifier";
|
import { Notifier } from "../src/lib/Notifier";
|
||||||
|
|
||||||
describe("test notifier", function() {
|
describe("test notifier", function() {
|
||||||
const SELECTOR = "dummy-selector";
|
const SELECTOR = "dummy-selector";
|
|
@ -1,5 +1,5 @@
|
||||||
|
|
||||||
import FirstFactorValidator = require("../../../../src/client/lib/firstfactor/FirstFactorValidator");
|
import FirstFactorValidator = require("../../src/lib/firstfactor/FirstFactorValidator");
|
||||||
import JQueryMock = require("../mocks/jquery");
|
import JQueryMock = require("../mocks/jquery");
|
||||||
import BluebirdPromise = require("bluebird");
|
import BluebirdPromise = require("bluebird");
|
||||||
import Assert = require("assert");
|
import Assert = require("assert");
|
|
@ -1,6 +1,6 @@
|
||||||
|
|
||||||
import Sinon = require("sinon");
|
import Sinon = require("sinon");
|
||||||
import { INotifier } from "../../../../src/client/lib/INotifier";
|
import { INotifier } from "../../src/lib/INotifier";
|
||||||
|
|
||||||
export class NotifierStub implements INotifier {
|
export class NotifierStub implements INotifier {
|
||||||
successStub: Sinon.SinonStub;
|
successStub: Sinon.SinonStub;
|
|
@ -1,5 +1,5 @@
|
||||||
|
|
||||||
import TOTPValidator = require("../../../../src/client/lib/secondfactor/TOTPValidator");
|
import TOTPValidator = require("../../src/lib/secondfactor/TOTPValidator");
|
||||||
import JQueryMock = require("../mocks/jquery");
|
import JQueryMock = require("../mocks/jquery");
|
||||||
import BluebirdPromise = require("bluebird");
|
import BluebirdPromise = require("bluebird");
|
||||||
import Assert = require("assert");
|
import Assert = require("assert");
|
|
@ -1,9 +1,9 @@
|
||||||
|
|
||||||
import U2FValidator = require("../../../../src/client/lib/secondfactor/U2FValidator");
|
import U2FValidator = require("../../src/lib/secondfactor/U2FValidator");
|
||||||
import { INotifier } from "../../../../src/client/lib/INotifier";
|
import { INotifier } from "../../src/lib/INotifier";
|
||||||
import JQueryMock = require("../mocks/jquery");
|
import JQueryMock = require("../mocks/jquery");
|
||||||
import U2FApiMock = require("../mocks/u2f-api");
|
import U2FApiMock = require("../mocks/u2f-api");
|
||||||
import { SignMessage } from "../../../../src/server/lib/routes/secondfactor/u2f/sign_request/SignMessage";
|
import { SignMessage } from "../../../shared/SignMessage";
|
||||||
import BluebirdPromise = require("bluebird");
|
import BluebirdPromise = require("bluebird");
|
||||||
import Assert = require("assert");
|
import Assert = require("assert");
|
||||||
import { NotifierStub } from "../mocks/NotifierStub";
|
import { NotifierStub } from "../mocks/NotifierStub";
|
|
@ -2,8 +2,8 @@
|
||||||
import sinon = require("sinon");
|
import sinon = require("sinon");
|
||||||
import assert = require("assert");
|
import assert = require("assert");
|
||||||
|
|
||||||
import UISelector = require("../../../../src/client/lib/totp-register/ui-selector");
|
import UISelector = require("../../src/lib/totp-register/ui-selector");
|
||||||
import TOTPRegister = require("../../../../src/client/lib/totp-register/totp-register");
|
import TOTPRegister = require("../../src/lib/totp-register/totp-register");
|
||||||
|
|
||||||
describe("test totp-register", function() {
|
describe("test totp-register", function() {
|
||||||
let jqueryMock: any;
|
let jqueryMock: any;
|
|
@ -6,17 +6,19 @@
|
||||||
"noImplicitAny": true,
|
"noImplicitAny": true,
|
||||||
"sourceMap": true,
|
"sourceMap": true,
|
||||||
"removeComments": true,
|
"removeComments": true,
|
||||||
"outDir": "dist",
|
"outDir": "../dist",
|
||||||
"baseUrl": ".",
|
"baseUrl": ".",
|
||||||
"paths": {
|
"paths": {
|
||||||
"*": [
|
"*": [
|
||||||
"./src/types/*",
|
"./types/*",
|
||||||
"./node_modules/@types/*"
|
"../shared/types/*"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"includes": [
|
"include": [
|
||||||
"src/**/*",
|
"src/**/*"
|
||||||
|
],
|
||||||
|
"exclude": [
|
||||||
"test/**/*"
|
"test/**/*"
|
||||||
]
|
]
|
||||||
}
|
}
|
|
@ -3,7 +3,8 @@ services:
|
||||||
authelia:
|
authelia:
|
||||||
volumes:
|
volumes:
|
||||||
- ./test:/usr/src/test
|
- ./test:/usr/src/test
|
||||||
- ./dist/src/server:/usr/src
|
- ./dist/server:/usr/src/server
|
||||||
|
- ./dist/shared:/usr/src/shared
|
||||||
- ./node_modules:/usr/src/node_modules
|
- ./node_modules:/usr/src/node_modules
|
||||||
- ./config.template.yml:/etc/authelia/config.yml:ro
|
- ./config.template.yml:/etc/authelia/config.yml:ro
|
||||||
networks:
|
networks:
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
"version": "3.4.0",
|
"version": "3.4.0",
|
||||||
"description": "2FA Single Sign-On server for nginx using LDAP, TOTP and U2F",
|
"description": "2FA Single Sign-On server for nginx using LDAP, TOTP and U2F",
|
||||||
"bin": {
|
"bin": {
|
||||||
"authelia": "./dist/src/server/index.js"
|
"authelia": "./dist/server/src/index.js"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "./node_modules/.bin/grunt unit-tests",
|
"test": "./node_modules/.bin/grunt unit-tests",
|
||||||
|
@ -83,6 +83,7 @@
|
||||||
"grunt-contrib-copy": "^1.0.0",
|
"grunt-contrib-copy": "^1.0.0",
|
||||||
"grunt-contrib-cssmin": "^2.2.0",
|
"grunt-contrib-cssmin": "^2.2.0",
|
||||||
"grunt-contrib-watch": "^1.0.0",
|
"grunt-contrib-watch": "^1.0.0",
|
||||||
|
"grunt-env": "^0.4.4",
|
||||||
"grunt-run": "^0.6.0",
|
"grunt-run": "^0.6.0",
|
||||||
"istanbul": "^0.4.5",
|
"istanbul": "^0.4.5",
|
||||||
"jquery": "^3.2.1",
|
"jquery": "^3.2.1",
|
||||||
|
|
|
@ -3,6 +3,10 @@
|
||||||
DC_SCRIPT=./scripts/example-commit/dc-example.sh
|
DC_SCRIPT=./scripts/example-commit/dc-example.sh
|
||||||
EXPECTED_SERVICES_COUNT=6
|
EXPECTED_SERVICES_COUNT=6
|
||||||
|
|
||||||
|
build_services() {
|
||||||
|
$DC_SCRIPT build authelia
|
||||||
|
}
|
||||||
|
|
||||||
start_services() {
|
start_services() {
|
||||||
$DC_SCRIPT up -d mongo redis openldap authelia nginx smtp
|
$DC_SCRIPT up -d mongo redis openldap authelia nginx smtp
|
||||||
sleep 3
|
sleep 3
|
||||||
|
@ -32,7 +36,7 @@ run_integration_tests() {
|
||||||
expect_services_count $EXPECTED_SERVICES_COUNT
|
expect_services_count $EXPECTED_SERVICES_COUNT
|
||||||
|
|
||||||
sleep 5
|
sleep 5
|
||||||
./node_modules/.bin/grunt run:integration-tests
|
./node_modules/.bin/grunt run:test-int
|
||||||
shut_services
|
shut_services
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -59,6 +63,9 @@ set -e
|
||||||
echo "Make sure services are not already running"
|
echo "Make sure services are not already running"
|
||||||
shut_services
|
shut_services
|
||||||
|
|
||||||
|
# Build the container
|
||||||
|
build_services
|
||||||
|
|
||||||
# Prepare & test example from end user perspective
|
# Prepare & test example from end user perspective
|
||||||
run_integration_tests
|
run_integration_tests
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@ docker --version
|
||||||
docker-compose --version
|
docker-compose --version
|
||||||
|
|
||||||
# Run unit tests
|
# Run unit tests
|
||||||
grunt test
|
grunt test-unit
|
||||||
|
|
||||||
# Build the app from Typescript and package
|
# Build the app from Typescript and package
|
||||||
grunt build-dist
|
grunt build-dist
|
||||||
|
|
|
@ -31,7 +31,7 @@ import Error403Get = require("./routes/error/403/get");
|
||||||
import Error404Get = require("./routes/error/404/get");
|
import Error404Get = require("./routes/error/404/get");
|
||||||
import { ServerVariablesHandler } from "./ServerVariablesHandler";
|
import { ServerVariablesHandler } from "./ServerVariablesHandler";
|
||||||
|
|
||||||
import Endpoints = require("../endpoints");
|
import Endpoints = require("../../../shared/api");
|
||||||
|
|
||||||
function withLog(fn: (req: Express.Request, res: Express.Response) => void) {
|
function withLog(fn: (req: Express.Request, res: Express.Response) => void) {
|
||||||
return function(req: Express.Request, res: Express.Response) {
|
return function(req: Express.Request, res: Express.Response) {
|
|
@ -14,6 +14,16 @@ interface SearchEntry {
|
||||||
object: any;
|
object: any;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
declare module "ldapjs" {
|
||||||
|
export interface ClientAsync {
|
||||||
|
on(event: string, callback: (data?: any) => void): void;
|
||||||
|
bindAsync(username: string, password: string): BluebirdPromise<void>;
|
||||||
|
unbindAsync(): BluebirdPromise<void>;
|
||||||
|
searchAsync(base: string, query: Ldapjs.SearchOptions): BluebirdPromise<EventEmitter>;
|
||||||
|
modifyAsync(userdn: string, change: Ldapjs.Change): BluebirdPromise<void>;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export class Client implements IClient {
|
export class Client implements IClient {
|
||||||
private userDN: string;
|
private userDN: string;
|
||||||
private password: string;
|
private password: string;
|
|
@ -2,7 +2,7 @@
|
||||||
import express = require("express");
|
import express = require("express");
|
||||||
import objectPath = require("object-path");
|
import objectPath = require("object-path");
|
||||||
import winston = require("winston");
|
import winston = require("winston");
|
||||||
import Endpoints = require("../../../endpoints");
|
import Endpoints = require("../../../../../shared/api");
|
||||||
import AuthenticationValidator = require("../../AuthenticationValidator");
|
import AuthenticationValidator = require("../../AuthenticationValidator");
|
||||||
import { ServerVariablesHandler } from "../../ServerVariablesHandler";
|
import { ServerVariablesHandler } from "../../ServerVariablesHandler";
|
||||||
import BluebirdPromise = require("bluebird");
|
import BluebirdPromise = require("bluebird");
|
|
@ -6,11 +6,11 @@ import express = require("express");
|
||||||
import { AccessController } from "../../access_control/AccessController";
|
import { AccessController } from "../../access_control/AccessController";
|
||||||
import { AuthenticationRegulator } from "../../AuthenticationRegulator";
|
import { AuthenticationRegulator } from "../../AuthenticationRegulator";
|
||||||
import { GroupsAndEmails } from "../../ldap/IClient";
|
import { GroupsAndEmails } from "../../ldap/IClient";
|
||||||
import Endpoint = require("../../../endpoints");
|
import Endpoint = require("../../../../../shared/api");
|
||||||
import ErrorReplies = require("../../ErrorReplies");
|
import ErrorReplies = require("../../ErrorReplies");
|
||||||
import { ServerVariablesHandler } from "../../ServerVariablesHandler";
|
import { ServerVariablesHandler } from "../../ServerVariablesHandler";
|
||||||
import AuthenticationSession = require("../../AuthenticationSession");
|
import AuthenticationSession = require("../../AuthenticationSession");
|
||||||
import Constants = require("../../../constants");
|
import Constants = require("../../../../../shared/constants");
|
||||||
|
|
||||||
export default function (req: express.Request, res: express.Response): BluebirdPromise<void> {
|
export default function (req: express.Request, res: express.Response): BluebirdPromise<void> {
|
||||||
const username: string = req.body.username;
|
const username: string = req.body.username;
|