diff --git a/.travis.yml b/.travis.yml index 27105ca4..16fd4be2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,4 @@ -dist: trusty language: node_js -sudo: required node_js: - "8" services: @@ -24,6 +22,7 @@ addons: - mx2.mail.example.com - public.example.com - authelia.example.com + - admin.example.com before_install: - npm install -g npm@'>=2.13.5' diff --git a/Dockerfile b/Dockerfile index d0dbb23e..6687edd8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,8 +12,7 @@ RUN apk --update add --no-cache --virtual \ COPY dist/server /usr/src/server COPY dist/shared /usr/src/shared -ENV PORT=80 -EXPOSE 80 +EXPOSE 8080 VOLUME /etc/authelia VOLUME /var/lib/authelia diff --git a/Gruntfile.js b/Gruntfile.js index b25a0143..130d0170 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -19,7 +19,7 @@ module.exports = function (grunt) { "generate-config-schema": { cmd: "./node_modules/.bin/typescript-json-schema", args: ["-o", schemaDir, "--strictNullChecks", - "--required", "server/tsconfig.json", "UserConfiguration"] + "--required", "server/tsconfig.json", "Configuration"] }, "compile-client": { cmd: "./node_modules/.bin/tsc", @@ -35,16 +35,20 @@ module.exports = function (grunt) { }, "test-server-unit": { cmd: "./node_modules/.bin/mocha", - args: ['--colors', '--compilers', 'ts:ts-node/register', '--recursive', 'server/test'] + args: ['--colors', '--require', 'ts-node/register', 'server/src/**/*.spec.ts'] }, "test-client-unit": { cmd: "./node_modules/.bin/mocha", - args: ['--colors', '--compilers', 'ts:ts-node/register', '--recursive', 'client/test'] + args: ['--colors', '--require', 'ts-node/register', 'client/test/**/*.test.ts'] }, - "test-int": { + "test-cucumber": { cmd: "./scripts/run-cucumber.sh", args: ["./test/features"] }, + "test-minimal-config": { + cmd: "./node_modules/.bin/mocha", + args: ['--colors', '--require', 'ts-node/register', 'test/minimal-config/**/*.ts'] + }, "docker-build": { cmd: "docker", args: ['build', '-t', 'clems4ever/authelia', '.'] @@ -183,7 +187,7 @@ module.exports = function (grunt) { grunt.registerTask('test-server', ['env:env-test-server-unit', 'run:test-server-unit']) grunt.registerTask('test-client', ['env:env-test-client-unit', 'run:test-client-unit']) grunt.registerTask('test-unit', ['test-server', 'test-client']); - grunt.registerTask('test-int', ['run:test-int']); + grunt.registerTask('test-int', ['run:test-cucumber', 'run:test-minimal-config']); grunt.registerTask('copy-resources', ['copy:resources', 'copy:views', 'copy:images', 'copy:thirdparties', 'concat:css']); grunt.registerTask('generate-config-schema', ['run:generate-config-schema', 'copy:schema']); diff --git a/config.minimal.yml b/config.minimal.yml new file mode 100644 index 00000000..685885f5 --- /dev/null +++ b/config.minimal.yml @@ -0,0 +1,23 @@ +############################################################### +# Authelia minimal configuration # +############################################################### + +ldap: + url: ldap://openldap + base_dn: dc=example,dc=com + + additional_users_dn: ou=users + additional_groups_dn: ou=groups + + groups_filter: (&(member={dn})(objectclass=groupOfNames)) + + user: cn=admin,dc=example,dc=com + password: password + +session: + # The secret to encrypt the session cookies with. + secret: unsecure_session_secret + + # The domain to protect. + # Note: Authelia must also be served by that domain. + domain: example.com diff --git a/config.template.yml b/config.template.yml index 5022d6e3..1ea19a2e 100644 --- a/config.template.yml +++ b/config.template.yml @@ -3,7 +3,7 @@ ############################################################### # The port to listen on -port: 80 +port: 8080 # Log level # @@ -191,10 +191,11 @@ session: # time. regulation: # The number of failed login attempts before user is banned. - # Set it to 0 for disabling regulation. + # Set it to 0 to disable regulation. max_retries: 3 - # The length of time between login attempts before user is banned. + # The time range during which the user can attempt login before being banned. + # The user is banned if the authenticaction failed `max_retries` times in a `find_time` seconds window. find_time: 120 # The length of time before a banned user can login again. diff --git a/doc/api_data.js b/doc/api_data.js deleted file mode 100644 index 7aba8ada..00000000 --- a/doc/api_data.js +++ /dev/null @@ -1,996 +0,0 @@ -define({ "api": [ - { - "type": "get", - "url": "/", - "title": "First factor page", - "name": "Login", - "group": "Authentication", - "version": "1.0.0", - "success": { - "fields": { - "Success 200": [ - { - "group": "Success 200", - "type": "String", - "optional": false, - "field": "Content", - "description": "
The content of the first factor page.
" - } - ] - } - }, - "description": "Serves the login page and create a create a cookie for the client.
", - "filename": "shared/api.ts", - "groupTitle": "Authentication" - }, - { - "type": "get", - "url": "/logout", - "title": "Serves logout page", - "name": "Logout", - "group": "Authentication", - "version": "1.0.0", - "parameter": { - "fields": { - "Parameter": [ - { - "group": "Parameter", - "type": "String", - "optional": false, - "field": "redirect", - "description": "Redirect to this URL when user is deauthenticated.
" - } - ] - } - }, - "success": { - "fields": { - "Success 302": [ - { - "group": "Success 302", - "optional": false, - "field": "redirect", - "description": "Redirect to the URL.
" - } - ] - } - }, - "description": "Log out the user and redirect to the URL.
", - "filename": "shared/api.ts", - "groupTitle": "Authentication" - }, - { - "type": "get", - "url": "/secondfactor", - "title": "Second factor page", - "name": "SecondFactor", - "group": "Authentication", - "version": "1.0.0", - "success": { - "fields": { - "Success 200": [ - { - "group": "Success 200", - "type": "String", - "optional": false, - "field": "Content", - "description": "The content of second factor page.
" - } - ] - } - }, - "description": "Serves the second factor page
", - "filename": "shared/api.ts", - "groupTitle": "Authentication" - }, - { - "type": "post", - "url": "/1stfactor", - "title": "Bind user against LDAP", - "name": "ValidateFirstFactor", - "group": "Authentication", - "version": "1.0.0", - "parameter": { - "fields": { - "Parameter": [ - { - "group": "Parameter", - "type": "String", - "optional": false, - "field": "username", - "description": "User username.
" - }, - { - "group": "Parameter", - "type": "String", - "optional": false, - "field": "password", - "description": "User password.
" - } - ] - } - }, - "success": { - "fields": { - "Success 204": [ - { - "group": "Success 204", - "optional": false, - "field": "status", - "description": "1st factor is validated.
" - } - ] - } - }, - "error": { - "fields": { - "Error 401": [ - { - "group": "Error 401", - "type": "none", - "optional": false, - "field": "error", - "description": "1st factor is not validated.
" - } - ], - "Error 500": [ - { - "group": "Error 500", - "type": "String", - "optional": false, - "field": "error", - "description": "Internal error message.
" - } - ] - } - }, - "description": "Verify credentials against the LDAP.
", - "filename": "shared/api.ts", - "groupTitle": "Authentication", - "header": { - "fields": { - "Header": [ - { - "group": "Header", - "type": "String", - "optional": false, - "field": "Cookie", - "description": "Cookie containing "connect.sid", the user session token.
" - } - ] - } - } - }, - { - "type": "post", - "url": "/reset-password/request", - "title": "Finish password reset request", - "name": "FinishPasswordResetRequest", - "group": "PasswordReset", - "version": "1.0.0", - "description": "Start password reset request.
", - "filename": "shared/api.ts", - "groupTitle": "PasswordReset", - "header": { - "fields": { - "Header": [ - { - "group": "Header", - "type": "String", - "optional": false, - "field": "Cookie", - "description": "Cookie containing "connect.sid", the user session token.
" - } - ] - } - }, - "parameter": { - "fields": { - "Parameter": [ - { - "group": "Parameter", - "type": "String", - "optional": false, - "field": "identity_token", - "description": "The one-time identity validation token provided in the email.
" - } - ] - } - }, - "success": { - "fields": { - "Success 200": [ - { - "group": "Success 200", - "type": "String", - "optional": false, - "field": "content", - "description": "The content of the page.
" - } - ] - } - }, - "error": { - "fields": { - "Error 403": [ - { - "group": "Error 403", - "optional": false, - "field": "AccessDenied", - "description": "Access is denied.
" - } - ], - "Error 500": [ - { - "group": "Error 500", - "type": "String", - "optional": false, - "field": "error", - "description": "Internal error message.
" - } - ] - } - } - }, - { - "type": "get", - "url": "/password-reset/request", - "title": "Request username", - "name": "ServePasswordResetPage", - "group": "PasswordReset", - "version": "1.0.0", - "description": "Serve a page that requires the username.
", - "filename": "shared/api.ts", - "groupTitle": "PasswordReset", - "header": { - "fields": { - "Header": [ - { - "group": "Header", - "type": "String", - "optional": false, - "field": "Cookie", - "description": "Cookie containing "connect.sid", the user session token.
" - } - ] - } - } - }, - { - "type": "post", - "url": "/api/password-reset", - "title": "Set new password", - "name": "SetNewLDAPPassword", - "group": "PasswordReset", - "version": "1.0.0", - "parameter": { - "fields": { - "Parameter": [ - { - "group": "Parameter", - "type": "String", - "optional": false, - "field": "password", - "description": "New password
" - } - ] - } - }, - "description": "Set a new password for the user.
", - "filename": "shared/api.ts", - "groupTitle": "PasswordReset", - "header": { - "fields": { - "Header": [ - { - "group": "Header", - "type": "String", - "optional": false, - "field": "Cookie", - "description": "Cookie containing "connect.sid", the user session token.
" - } - ] - } - } - }, - { - "type": "get", - "url": "/password-reset/identity/start", - "title": "Start password reset request", - "name": "StartPasswordResetRequest", - "group": "PasswordReset", - "version": "1.0.0", - "description": "Start password reset request.
", - "filename": "shared/api.ts", - "groupTitle": "PasswordReset", - "header": { - "fields": { - "Header": [ - { - "group": "Header", - "type": "String", - "optional": false, - "field": "Cookie", - "description": "Cookie containing "connect.sid", the user session token.
" - } - ] - } - }, - "success": { - "fields": { - "Success 204": [ - { - "group": "Success 204", - "optional": false, - "field": "status", - "description": "Identity validation has been initiated.
" - } - ] - } - }, - "error": { - "fields": { - "Error 403": [ - { - "group": "Error 403", - "optional": false, - "field": "AccessDenied", - "description": "Access is denied.
" - } - ], - "Error 400": [ - { - "group": "Error 400", - "optional": false, - "field": "InvalidIdentity", - "description": "User identity is invalid.
" - } - ], - "Error 500": [ - { - "group": "Error 500", - "type": "String", - "optional": false, - "field": "error", - "description": "Internal error message.
" - } - ] - } - } - }, - { - "type": "get", - "url": "/secondfactor/totp/identity/finish", - "title": "Finish TOTP registration identity validation", - "name": "FinishTOTPRegistration", - "group": "TOTP", - "version": "1.0.0", - "description": "Serves the TOTP registration page that displays the secret. The secret is a QRCode and a base32 secret.
", - "filename": "shared/api.ts", - "groupTitle": "TOTP", - "header": { - "fields": { - "Header": [ - { - "group": "Header", - "type": "String", - "optional": false, - "field": "Cookie", - "description": "Cookie containing "connect.sid", the user session token.
" - } - ] - } - }, - "parameter": { - "fields": { - "Parameter": [ - { - "group": "Parameter", - "type": "String", - "optional": false, - "field": "identity_token", - "description": "The one-time identity validation token provided in the email.
" - } - ] - } - }, - "success": { - "fields": { - "Success 200": [ - { - "group": "Success 200", - "type": "String", - "optional": false, - "field": "content", - "description": "The content of the page.
" - } - ] - } - }, - "error": { - "fields": { - "Error 403": [ - { - "group": "Error 403", - "optional": false, - "field": "AccessDenied", - "description": "Access is denied.
" - } - ], - "Error 500": [ - { - "group": "Error 500", - "type": "String", - "optional": false, - "field": "error", - "description": "Internal error message.
" - } - ] - } - } - }, - { - "type": "get", - "url": "/secondfactor/totp/identity/start", - "title": "Start TOTP registration identity validation", - "name": "StartTOTPRegistration", - "group": "TOTP", - "version": "1.0.0", - "description": "Initiates the identity validation
", - "filename": "shared/api.ts", - "groupTitle": "TOTP", - "header": { - "fields": { - "Header": [ - { - "group": "Header", - "type": "String", - "optional": false, - "field": "Cookie", - "description": "Cookie containing "connect.sid", the user session token.
" - } - ] - } - }, - "success": { - "fields": { - "Success 204": [ - { - "group": "Success 204", - "optional": false, - "field": "status", - "description": "Identity validation has been initiated.
" - } - ] - } - }, - "error": { - "fields": { - "Error 403": [ - { - "group": "Error 403", - "optional": false, - "field": "AccessDenied", - "description": "Access is denied.
" - } - ], - "Error 400": [ - { - "group": "Error 400", - "optional": false, - "field": "InvalidIdentity", - "description": "User identity is invalid.
" - } - ], - "Error 500": [ - { - "group": "Error 500", - "type": "String", - "optional": false, - "field": "error", - "description": "Internal error message.
" - } - ] - } - } - }, - { - "type": "post", - "url": "/api/totp", - "title": "Complete TOTP authentication", - "name": "ValidateTOTPSecondFactor", - "group": "TOTP", - "version": "1.0.0", - "parameter": { - "fields": { - "Parameter": [ - { - "group": "Parameter", - "type": "String", - "optional": false, - "field": "token", - "description": "TOTP token.
" - } - ] - } - }, - "success": { - "fields": { - "Success 302": [ - { - "group": "Success 302", - "optional": false, - "field": "Redirect", - "description": "to the URL that has been stored during last call to /api/verify.
" - } - ] - } - }, - "error": { - "fields": { - "Error 401": [ - { - "group": "Error 401", - "type": "none", - "optional": false, - "field": "error", - "description": "TOTP token is invalid.
" - } - ], - "Error 500": [ - { - "group": "Error 500", - "type": "String", - "optional": false, - "field": "error", - "description": "Internal error message.
" - } - ] - } - }, - "description": "Verify TOTP token. The user is authenticated upon success.
", - "filename": "shared/api.ts", - "groupTitle": "TOTP", - "header": { - "fields": { - "Header": [ - { - "group": "Header", - "type": "String", - "optional": false, - "field": "Cookie", - "description": "Cookie containing "connect.sid", the user session token.
" - } - ] - } - } - }, - { - "type": "post", - "url": "/api/u2f/sign", - "title": "Complete U2F authentication", - "name": "CompleteU2FAuthentication", - "group": "U2F", - "version": "1.0.0", - "success": { - "fields": { - "Success 302": [ - { - "group": "Success 302", - "optional": false, - "field": "Redirect", - "description": "to the URL that has been stored during last call to /api/verify.
" - } - ] - } - }, - "error": { - "fields": { - "Error 403": [ - { - "group": "Error 403", - "type": "none", - "optional": false, - "field": "error", - "description": "No authentication request has been provided.
" - } - ], - "Error 500": [ - { - "group": "Error 500", - "type": "String", - "optional": false, - "field": "error", - "description": "Internal error message.
" - } - ] - } - }, - "description": "Complete authentication request of the U2F device.
", - "filename": "shared/api.ts", - "groupTitle": "U2F", - "header": { - "fields": { - "Header": [ - { - "group": "Header", - "type": "String", - "optional": false, - "field": "Cookie", - "description": "Cookie containing "connect.sid", the user session token.
" - } - ] - } - } - }, - { - "type": "post", - "url": "/api/secondfactor/u2f/register", - "title": "Complete U2F registration", - "name": "FinishU2FRegistration", - "group": "U2F", - "version": "1.0.0", - "success": { - "fields": { - "Success 302": [ - { - "group": "Success 302", - "optional": false, - "field": "Redirect", - "description": "to the URL that has been stored during last call to /api/verify.
" - } - ] - } - }, - "description": "Complete U2F registration request.
", - "filename": "shared/api.ts", - "groupTitle": "U2F", - "header": { - "fields": { - "Header": [ - { - "group": "Header", - "type": "String", - "optional": false, - "field": "Cookie", - "description": "Cookie containing "connect.sid", the user session token.
" - } - ] - } - }, - "error": { - "fields": { - "Error 500": [ - { - "group": "Error 500", - "type": "String", - "optional": false, - "field": "error", - "description": "Internal error message.
" - } - ] - } - } - }, - { - "type": "get", - "url": "/secondfactor/u2f/identity/start", - "title": "Start U2F registration identity validation", - "name": "RequestU2FRegistration", - "group": "U2F", - "version": "1.0.0", - "filename": "shared/api.ts", - "groupTitle": "U2F", - "header": { - "fields": { - "Header": [ - { - "group": "Header", - "type": "String", - "optional": false, - "field": "Cookie", - "description": "Cookie containing "connect.sid", the user session token.
" - } - ] - } - }, - "success": { - "fields": { - "Success 204": [ - { - "group": "Success 204", - "optional": false, - "field": "status", - "description": "Identity validation has been initiated.
" - } - ] - } - }, - "error": { - "fields": { - "Error 403": [ - { - "group": "Error 403", - "optional": false, - "field": "AccessDenied", - "description": "Access is denied.
" - } - ], - "Error 400": [ - { - "group": "Error 400", - "optional": false, - "field": "InvalidIdentity", - "description": "User identity is invalid.
" - } - ], - "Error 500": [ - { - "group": "Error 500", - "type": "String", - "optional": false, - "field": "error", - "description": "Internal error message.
" - } - ] - } - }, - "description": "This request issue an identity validation token for the user bound to the session. It sends a challenge to the email address set in the user LDAP entry. The user must visit the sent URL to complete the validation and continue the registration process.
" - }, - { - "type": "get", - "url": "/secondfactor/u2f/identity/finish", - "title": "Finish U2F registration identity validation", - "name": "ServeU2FRegistrationPage", - "group": "U2F", - "version": "1.0.0", - "description": "Serves the U2F registration page that asks the user to touch the token of the U2F device.
", - "filename": "shared/api.ts", - "groupTitle": "U2F", - "header": { - "fields": { - "Header": [ - { - "group": "Header", - "type": "String", - "optional": false, - "field": "Cookie", - "description": "Cookie containing "connect.sid", the user session token.
" - } - ] - } - }, - "parameter": { - "fields": { - "Parameter": [ - { - "group": "Parameter", - "type": "String", - "optional": false, - "field": "identity_token", - "description": "The one-time identity validation token provided in the email.
" - } - ] - } - }, - "success": { - "fields": { - "Success 200": [ - { - "group": "Success 200", - "type": "String", - "optional": false, - "field": "content", - "description": "The content of the page.
" - } - ] - } - }, - "error": { - "fields": { - "Error 403": [ - { - "group": "Error 403", - "optional": false, - "field": "AccessDenied", - "description": "Access is denied.
" - } - ], - "Error 500": [ - { - "group": "Error 500", - "type": "String", - "optional": false, - "field": "error", - "description": "Internal error message.
" - } - ] - } - } - }, - { - "type": "get", - "url": "/api/u2f/sign_request", - "title": "Start U2F authentication", - "name": "StartU2FAuthentication", - "group": "U2F", - "version": "1.0.0", - "success": { - "fields": { - "Success 200": [ - { - "group": "Success 200", - "optional": false, - "field": "authentication_request", - "description": "The U2F authentication request.
" - } - ] - } - }, - "error": { - "fields": { - "Error 401": [ - { - "group": "Error 401", - "type": "none", - "optional": false, - "field": "error", - "description": "There is no key registered for user in session.
" - } - ], - "Error 500": [ - { - "group": "Error 500", - "type": "String", - "optional": false, - "field": "error", - "description": "Internal error message.
" - } - ] - } - }, - "description": "Initiate an authentication request using a U2F device.
", - "filename": "shared/api.ts", - "groupTitle": "U2F", - "header": { - "fields": { - "Header": [ - { - "group": "Header", - "type": "String", - "optional": false, - "field": "Cookie", - "description": "Cookie containing "connect.sid", the user session token.
" - } - ] - } - } - }, - { - "type": "get", - "url": "/api/u2f/register_request", - "title": "Start U2F registration", - "name": "StartU2FRegistration", - "group": "U2F", - "version": "1.0.0", - "success": { - "fields": { - "Success 200": [ - { - "group": "Success 200", - "optional": false, - "field": "authentication_request", - "description": "The U2F registration request.
" - } - ] - } - }, - "error": { - "fields": { - "Error 403": [ - { - "group": "Error 403", - "type": "none", - "optional": false, - "field": "error", - "description": "Unexpected identity validation challenge.
" - } - ], - "Error 500": [ - { - "group": "Error 500", - "type": "String", - "optional": false, - "field": "error", - "description": "Internal error message.
" - } - ] - } - }, - "description": "Initiate a U2F device registration request.
", - "filename": "shared/api.ts", - "groupTitle": "U2F", - "header": { - "fields": { - "Header": [ - { - "group": "Header", - "type": "String", - "optional": false, - "field": "Cookie", - "description": "Cookie containing "connect.sid", the user session token.
" - } - ] - } - } - }, - { - "type": "get", - "url": "/api/verify", - "title": "Verify user authentication", - "name": "VerifyAuthentication", - "group": "Verification", - "version": "1.0.0", - "parameter": { - "fields": { - "Parameter": [ - { - "group": "Parameter", - "type": "String", - "optional": false, - "field": "redirect", - "description": "Optional parameter set to the url where the user is redirected if access is refused. It is mainly used by Traefik that does not control the redirection itself.
" - } - ] - } - }, - "success": { - "fields": { - "Success 204": [ - { - "group": "Success 204", - "optional": false, - "field": "status", - "description": "The user is authenticated.
" - } - ] - } - }, - "error": { - "fields": { - "Error 302": [ - { - "group": "Error 302", - "optional": false, - "field": "redirect", - "description": "The user is redirected if redirect parameter is provided.
" - } - ], - "Error 401": [ - { - "group": "Error 401", - "optional": false, - "field": "status", - "description": "The user get an error if access failed
" - } - ] - } - }, - "description": "Verify that the user is authenticated, i.e., the two factors have been validated. If the user is authenticated the response headers Remote-User and Remote-Groups are set. Remote-User contains the user id of the currently logged in user and Remote-Groups a comma separated list of assigned groups.
", - "filename": "shared/api.ts", - "groupTitle": "Verification", - "header": { - "fields": { - "Header": [ - { - "group": "Header", - "type": "String", - "optional": false, - "field": "Cookie", - "description": "Cookie containing "connect.sid", the user session token.
" - } - ] - } - } - } -] }); diff --git a/doc/api_data.json b/doc/api_data.json deleted file mode 100644 index c6935ffe..00000000 --- a/doc/api_data.json +++ /dev/null @@ -1,996 +0,0 @@ -[ - { - "type": "get", - "url": "/", - "title": "First factor page", - "name": "Login", - "group": "Authentication", - "version": "1.0.0", - "success": { - "fields": { - "Success 200": [ - { - "group": "Success 200", - "type": "String", - "optional": false, - "field": "Content", - "description": "The content of the first factor page.
" - } - ] - } - }, - "description": "Serves the login page and create a create a cookie for the client.
", - "filename": "shared/api.ts", - "groupTitle": "Authentication" - }, - { - "type": "get", - "url": "/logout", - "title": "Serves logout page", - "name": "Logout", - "group": "Authentication", - "version": "1.0.0", - "parameter": { - "fields": { - "Parameter": [ - { - "group": "Parameter", - "type": "String", - "optional": false, - "field": "redirect", - "description": "Redirect to this URL when user is deauthenticated.
" - } - ] - } - }, - "success": { - "fields": { - "Success 302": [ - { - "group": "Success 302", - "optional": false, - "field": "redirect", - "description": "Redirect to the URL.
" - } - ] - } - }, - "description": "Log out the user and redirect to the URL.
", - "filename": "shared/api.ts", - "groupTitle": "Authentication" - }, - { - "type": "get", - "url": "/secondfactor", - "title": "Second factor page", - "name": "SecondFactor", - "group": "Authentication", - "version": "1.0.0", - "success": { - "fields": { - "Success 200": [ - { - "group": "Success 200", - "type": "String", - "optional": false, - "field": "Content", - "description": "The content of second factor page.
" - } - ] - } - }, - "description": "Serves the second factor page
", - "filename": "shared/api.ts", - "groupTitle": "Authentication" - }, - { - "type": "post", - "url": "/1stfactor", - "title": "Bind user against LDAP", - "name": "ValidateFirstFactor", - "group": "Authentication", - "version": "1.0.0", - "parameter": { - "fields": { - "Parameter": [ - { - "group": "Parameter", - "type": "String", - "optional": false, - "field": "username", - "description": "User username.
" - }, - { - "group": "Parameter", - "type": "String", - "optional": false, - "field": "password", - "description": "User password.
" - } - ] - } - }, - "success": { - "fields": { - "Success 204": [ - { - "group": "Success 204", - "optional": false, - "field": "status", - "description": "1st factor is validated.
" - } - ] - } - }, - "error": { - "fields": { - "Error 401": [ - { - "group": "Error 401", - "type": "none", - "optional": false, - "field": "error", - "description": "1st factor is not validated.
" - } - ], - "Error 500": [ - { - "group": "Error 500", - "type": "String", - "optional": false, - "field": "error", - "description": "Internal error message.
" - } - ] - } - }, - "description": "Verify credentials against the LDAP.
", - "filename": "shared/api.ts", - "groupTitle": "Authentication", - "header": { - "fields": { - "Header": [ - { - "group": "Header", - "type": "String", - "optional": false, - "field": "Cookie", - "description": "Cookie containing "connect.sid", the user session token.
" - } - ] - } - } - }, - { - "type": "post", - "url": "/reset-password/request", - "title": "Finish password reset request", - "name": "FinishPasswordResetRequest", - "group": "PasswordReset", - "version": "1.0.0", - "description": "Start password reset request.
", - "filename": "shared/api.ts", - "groupTitle": "PasswordReset", - "header": { - "fields": { - "Header": [ - { - "group": "Header", - "type": "String", - "optional": false, - "field": "Cookie", - "description": "Cookie containing "connect.sid", the user session token.
" - } - ] - } - }, - "parameter": { - "fields": { - "Parameter": [ - { - "group": "Parameter", - "type": "String", - "optional": false, - "field": "identity_token", - "description": "The one-time identity validation token provided in the email.
" - } - ] - } - }, - "success": { - "fields": { - "Success 200": [ - { - "group": "Success 200", - "type": "String", - "optional": false, - "field": "content", - "description": "The content of the page.
" - } - ] - } - }, - "error": { - "fields": { - "Error 403": [ - { - "group": "Error 403", - "optional": false, - "field": "AccessDenied", - "description": "Access is denied.
" - } - ], - "Error 500": [ - { - "group": "Error 500", - "type": "String", - "optional": false, - "field": "error", - "description": "Internal error message.
" - } - ] - } - } - }, - { - "type": "get", - "url": "/password-reset/request", - "title": "Request username", - "name": "ServePasswordResetPage", - "group": "PasswordReset", - "version": "1.0.0", - "description": "Serve a page that requires the username.
", - "filename": "shared/api.ts", - "groupTitle": "PasswordReset", - "header": { - "fields": { - "Header": [ - { - "group": "Header", - "type": "String", - "optional": false, - "field": "Cookie", - "description": "Cookie containing "connect.sid", the user session token.
" - } - ] - } - } - }, - { - "type": "post", - "url": "/api/password-reset", - "title": "Set new password", - "name": "SetNewLDAPPassword", - "group": "PasswordReset", - "version": "1.0.0", - "parameter": { - "fields": { - "Parameter": [ - { - "group": "Parameter", - "type": "String", - "optional": false, - "field": "password", - "description": "New password
" - } - ] - } - }, - "description": "Set a new password for the user.
", - "filename": "shared/api.ts", - "groupTitle": "PasswordReset", - "header": { - "fields": { - "Header": [ - { - "group": "Header", - "type": "String", - "optional": false, - "field": "Cookie", - "description": "Cookie containing "connect.sid", the user session token.
" - } - ] - } - } - }, - { - "type": "get", - "url": "/password-reset/identity/start", - "title": "Start password reset request", - "name": "StartPasswordResetRequest", - "group": "PasswordReset", - "version": "1.0.0", - "description": "Start password reset request.
", - "filename": "shared/api.ts", - "groupTitle": "PasswordReset", - "header": { - "fields": { - "Header": [ - { - "group": "Header", - "type": "String", - "optional": false, - "field": "Cookie", - "description": "Cookie containing "connect.sid", the user session token.
" - } - ] - } - }, - "success": { - "fields": { - "Success 204": [ - { - "group": "Success 204", - "optional": false, - "field": "status", - "description": "Identity validation has been initiated.
" - } - ] - } - }, - "error": { - "fields": { - "Error 403": [ - { - "group": "Error 403", - "optional": false, - "field": "AccessDenied", - "description": "Access is denied.
" - } - ], - "Error 400": [ - { - "group": "Error 400", - "optional": false, - "field": "InvalidIdentity", - "description": "User identity is invalid.
" - } - ], - "Error 500": [ - { - "group": "Error 500", - "type": "String", - "optional": false, - "field": "error", - "description": "Internal error message.
" - } - ] - } - } - }, - { - "type": "get", - "url": "/secondfactor/totp/identity/finish", - "title": "Finish TOTP registration identity validation", - "name": "FinishTOTPRegistration", - "group": "TOTP", - "version": "1.0.0", - "description": "Serves the TOTP registration page that displays the secret. The secret is a QRCode and a base32 secret.
", - "filename": "shared/api.ts", - "groupTitle": "TOTP", - "header": { - "fields": { - "Header": [ - { - "group": "Header", - "type": "String", - "optional": false, - "field": "Cookie", - "description": "Cookie containing "connect.sid", the user session token.
" - } - ] - } - }, - "parameter": { - "fields": { - "Parameter": [ - { - "group": "Parameter", - "type": "String", - "optional": false, - "field": "identity_token", - "description": "The one-time identity validation token provided in the email.
" - } - ] - } - }, - "success": { - "fields": { - "Success 200": [ - { - "group": "Success 200", - "type": "String", - "optional": false, - "field": "content", - "description": "The content of the page.
" - } - ] - } - }, - "error": { - "fields": { - "Error 403": [ - { - "group": "Error 403", - "optional": false, - "field": "AccessDenied", - "description": "Access is denied.
" - } - ], - "Error 500": [ - { - "group": "Error 500", - "type": "String", - "optional": false, - "field": "error", - "description": "Internal error message.
" - } - ] - } - } - }, - { - "type": "get", - "url": "/secondfactor/totp/identity/start", - "title": "Start TOTP registration identity validation", - "name": "StartTOTPRegistration", - "group": "TOTP", - "version": "1.0.0", - "description": "Initiates the identity validation
", - "filename": "shared/api.ts", - "groupTitle": "TOTP", - "header": { - "fields": { - "Header": [ - { - "group": "Header", - "type": "String", - "optional": false, - "field": "Cookie", - "description": "Cookie containing "connect.sid", the user session token.
" - } - ] - } - }, - "success": { - "fields": { - "Success 204": [ - { - "group": "Success 204", - "optional": false, - "field": "status", - "description": "Identity validation has been initiated.
" - } - ] - } - }, - "error": { - "fields": { - "Error 403": [ - { - "group": "Error 403", - "optional": false, - "field": "AccessDenied", - "description": "Access is denied.
" - } - ], - "Error 400": [ - { - "group": "Error 400", - "optional": false, - "field": "InvalidIdentity", - "description": "User identity is invalid.
" - } - ], - "Error 500": [ - { - "group": "Error 500", - "type": "String", - "optional": false, - "field": "error", - "description": "Internal error message.
" - } - ] - } - } - }, - { - "type": "post", - "url": "/api/totp", - "title": "Complete TOTP authentication", - "name": "ValidateTOTPSecondFactor", - "group": "TOTP", - "version": "1.0.0", - "parameter": { - "fields": { - "Parameter": [ - { - "group": "Parameter", - "type": "String", - "optional": false, - "field": "token", - "description": "TOTP token.
" - } - ] - } - }, - "success": { - "fields": { - "Success 302": [ - { - "group": "Success 302", - "optional": false, - "field": "Redirect", - "description": "to the URL that has been stored during last call to /api/verify.
" - } - ] - } - }, - "error": { - "fields": { - "Error 401": [ - { - "group": "Error 401", - "type": "none", - "optional": false, - "field": "error", - "description": "TOTP token is invalid.
" - } - ], - "Error 500": [ - { - "group": "Error 500", - "type": "String", - "optional": false, - "field": "error", - "description": "Internal error message.
" - } - ] - } - }, - "description": "Verify TOTP token. The user is authenticated upon success.
", - "filename": "shared/api.ts", - "groupTitle": "TOTP", - "header": { - "fields": { - "Header": [ - { - "group": "Header", - "type": "String", - "optional": false, - "field": "Cookie", - "description": "Cookie containing "connect.sid", the user session token.
" - } - ] - } - } - }, - { - "type": "post", - "url": "/api/u2f/sign", - "title": "Complete U2F authentication", - "name": "CompleteU2FAuthentication", - "group": "U2F", - "version": "1.0.0", - "success": { - "fields": { - "Success 302": [ - { - "group": "Success 302", - "optional": false, - "field": "Redirect", - "description": "to the URL that has been stored during last call to /api/verify.
" - } - ] - } - }, - "error": { - "fields": { - "Error 403": [ - { - "group": "Error 403", - "type": "none", - "optional": false, - "field": "error", - "description": "No authentication request has been provided.
" - } - ], - "Error 500": [ - { - "group": "Error 500", - "type": "String", - "optional": false, - "field": "error", - "description": "Internal error message.
" - } - ] - } - }, - "description": "Complete authentication request of the U2F device.
", - "filename": "shared/api.ts", - "groupTitle": "U2F", - "header": { - "fields": { - "Header": [ - { - "group": "Header", - "type": "String", - "optional": false, - "field": "Cookie", - "description": "Cookie containing "connect.sid", the user session token.
" - } - ] - } - } - }, - { - "type": "post", - "url": "/api/secondfactor/u2f/register", - "title": "Complete U2F registration", - "name": "FinishU2FRegistration", - "group": "U2F", - "version": "1.0.0", - "success": { - "fields": { - "Success 302": [ - { - "group": "Success 302", - "optional": false, - "field": "Redirect", - "description": "to the URL that has been stored during last call to /api/verify.
" - } - ] - } - }, - "description": "Complete U2F registration request.
", - "filename": "shared/api.ts", - "groupTitle": "U2F", - "header": { - "fields": { - "Header": [ - { - "group": "Header", - "type": "String", - "optional": false, - "field": "Cookie", - "description": "Cookie containing "connect.sid", the user session token.
" - } - ] - } - }, - "error": { - "fields": { - "Error 500": [ - { - "group": "Error 500", - "type": "String", - "optional": false, - "field": "error", - "description": "Internal error message.
" - } - ] - } - } - }, - { - "type": "get", - "url": "/secondfactor/u2f/identity/start", - "title": "Start U2F registration identity validation", - "name": "RequestU2FRegistration", - "group": "U2F", - "version": "1.0.0", - "filename": "shared/api.ts", - "groupTitle": "U2F", - "header": { - "fields": { - "Header": [ - { - "group": "Header", - "type": "String", - "optional": false, - "field": "Cookie", - "description": "Cookie containing "connect.sid", the user session token.
" - } - ] - } - }, - "success": { - "fields": { - "Success 204": [ - { - "group": "Success 204", - "optional": false, - "field": "status", - "description": "Identity validation has been initiated.
" - } - ] - } - }, - "error": { - "fields": { - "Error 403": [ - { - "group": "Error 403", - "optional": false, - "field": "AccessDenied", - "description": "Access is denied.
" - } - ], - "Error 400": [ - { - "group": "Error 400", - "optional": false, - "field": "InvalidIdentity", - "description": "User identity is invalid.
" - } - ], - "Error 500": [ - { - "group": "Error 500", - "type": "String", - "optional": false, - "field": "error", - "description": "Internal error message.
" - } - ] - } - }, - "description": "This request issue an identity validation token for the user bound to the session. It sends a challenge to the email address set in the user LDAP entry. The user must visit the sent URL to complete the validation and continue the registration process.
" - }, - { - "type": "get", - "url": "/secondfactor/u2f/identity/finish", - "title": "Finish U2F registration identity validation", - "name": "ServeU2FRegistrationPage", - "group": "U2F", - "version": "1.0.0", - "description": "Serves the U2F registration page that asks the user to touch the token of the U2F device.
", - "filename": "shared/api.ts", - "groupTitle": "U2F", - "header": { - "fields": { - "Header": [ - { - "group": "Header", - "type": "String", - "optional": false, - "field": "Cookie", - "description": "Cookie containing "connect.sid", the user session token.
" - } - ] - } - }, - "parameter": { - "fields": { - "Parameter": [ - { - "group": "Parameter", - "type": "String", - "optional": false, - "field": "identity_token", - "description": "The one-time identity validation token provided in the email.
" - } - ] - } - }, - "success": { - "fields": { - "Success 200": [ - { - "group": "Success 200", - "type": "String", - "optional": false, - "field": "content", - "description": "The content of the page.
" - } - ] - } - }, - "error": { - "fields": { - "Error 403": [ - { - "group": "Error 403", - "optional": false, - "field": "AccessDenied", - "description": "Access is denied.
" - } - ], - "Error 500": [ - { - "group": "Error 500", - "type": "String", - "optional": false, - "field": "error", - "description": "Internal error message.
" - } - ] - } - } - }, - { - "type": "get", - "url": "/api/u2f/sign_request", - "title": "Start U2F authentication", - "name": "StartU2FAuthentication", - "group": "U2F", - "version": "1.0.0", - "success": { - "fields": { - "Success 200": [ - { - "group": "Success 200", - "optional": false, - "field": "authentication_request", - "description": "The U2F authentication request.
" - } - ] - } - }, - "error": { - "fields": { - "Error 401": [ - { - "group": "Error 401", - "type": "none", - "optional": false, - "field": "error", - "description": "There is no key registered for user in session.
" - } - ], - "Error 500": [ - { - "group": "Error 500", - "type": "String", - "optional": false, - "field": "error", - "description": "Internal error message.
" - } - ] - } - }, - "description": "Initiate an authentication request using a U2F device.
", - "filename": "shared/api.ts", - "groupTitle": "U2F", - "header": { - "fields": { - "Header": [ - { - "group": "Header", - "type": "String", - "optional": false, - "field": "Cookie", - "description": "Cookie containing "connect.sid", the user session token.
" - } - ] - } - } - }, - { - "type": "get", - "url": "/api/u2f/register_request", - "title": "Start U2F registration", - "name": "StartU2FRegistration", - "group": "U2F", - "version": "1.0.0", - "success": { - "fields": { - "Success 200": [ - { - "group": "Success 200", - "optional": false, - "field": "authentication_request", - "description": "The U2F registration request.
" - } - ] - } - }, - "error": { - "fields": { - "Error 403": [ - { - "group": "Error 403", - "type": "none", - "optional": false, - "field": "error", - "description": "Unexpected identity validation challenge.
" - } - ], - "Error 500": [ - { - "group": "Error 500", - "type": "String", - "optional": false, - "field": "error", - "description": "Internal error message.
" - } - ] - } - }, - "description": "Initiate a U2F device registration request.
", - "filename": "shared/api.ts", - "groupTitle": "U2F", - "header": { - "fields": { - "Header": [ - { - "group": "Header", - "type": "String", - "optional": false, - "field": "Cookie", - "description": "Cookie containing "connect.sid", the user session token.
" - } - ] - } - } - }, - { - "type": "get", - "url": "/api/verify", - "title": "Verify user authentication", - "name": "VerifyAuthentication", - "group": "Verification", - "version": "1.0.0", - "parameter": { - "fields": { - "Parameter": [ - { - "group": "Parameter", - "type": "String", - "optional": false, - "field": "redirect", - "description": "Optional parameter set to the url where the user is redirected if access is refused. It is mainly used by Traefik that does not control the redirection itself.
" - } - ] - } - }, - "success": { - "fields": { - "Success 204": [ - { - "group": "Success 204", - "optional": false, - "field": "status", - "description": "The user is authenticated.
" - } - ] - } - }, - "error": { - "fields": { - "Error 302": [ - { - "group": "Error 302", - "optional": false, - "field": "redirect", - "description": "The user is redirected if redirect parameter is provided.
" - } - ], - "Error 401": [ - { - "group": "Error 401", - "optional": false, - "field": "status", - "description": "The user get an error if access failed
" - } - ] - } - }, - "description": "Verify that the user is authenticated, i.e., the two factors have been validated. If the user is authenticated the response headers Remote-User and Remote-Groups are set. Remote-User contains the user id of the currently logged in user and Remote-Groups a comma separated list of assigned groups.
", - "filename": "shared/api.ts", - "groupTitle": "Verification", - "header": { - "fields": { - "Header": [ - { - "group": "Header", - "type": "String", - "optional": false, - "field": "Cookie", - "description": "Cookie containing "connect.sid", the user session token.
" - } - ] - } - } - } -] diff --git a/doc/api_project.js b/doc/api_project.js deleted file mode 100644 index 727258a0..00000000 --- a/doc/api_project.js +++ /dev/null @@ -1,15 +0,0 @@ -define({ - "title": "Authelia API documentation", - "name": "authelia", - "version": "3.7.0", - "description": "2FA Single Sign-On server for nginx using LDAP, TOTP and U2F", - "sampleUrl": false, - "defaultVersion": "0.0.0", - "apidoc": "0.3.0", - "generator": { - "name": "apidoc", - "time": "2017-12-04T21:38:44.927Z", - "url": "http://apidocjs.com", - "version": "0.17.6" - } -}); diff --git a/doc/api_project.json b/doc/api_project.json deleted file mode 100644 index a3017b24..00000000 --- a/doc/api_project.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "Authelia API documentation", - "name": "authelia", - "version": "3.7.0", - "description": "2FA Single Sign-On server for nginx using LDAP, TOTP and U2F", - "sampleUrl": false, - "defaultVersion": "0.0.0", - "apidoc": "0.3.0", - "generator": { - "name": "apidoc", - "time": "2017-12-04T21:38:44.927Z", - "url": "http://apidocjs.com", - "version": "0.17.6" - } -} diff --git a/doc/css/style.css b/doc/css/style.css deleted file mode 100644 index 6468b2b2..00000000 --- a/doc/css/style.css +++ /dev/null @@ -1,569 +0,0 @@ -/* ------------------------------------------------------------------------------------------ - * Content - * ------------------------------------------------------------------------------------------ */ -body { - min-width: 980px; - max-width: 1280px; -} - -body, p, a, div, th, td { - font-family: "Source Sans Pro", sans-serif; - font-weight: 400; - font-size: 16px; -} - -td.code { - font-size: 14px; - font-family: "Source Code Pro", monospace; - font-style: normal; - font-weight: 400; -} - -#content { - padding-top: 16px; - z-Index: -1; - margin-left: 270px; -} - -p { - color: #808080; -} - -h1 { - font-family: "Source Sans Pro Semibold", sans-serif; - font-weight: normal; - font-size: 44px; - line-height: 50px; - margin: 0 0 10px 0; - padding: 0; -} - -h2 { - font-family: "Source Sans Pro", sans-serif; - font-weight: normal; - font-size: 24px; - line-height: 40px; - margin: 0 0 20px 0; - padding: 0; -} - -section { - border-top: 1px solid #ebebeb; - padding: 30px 0; -} - -section h1 { - font-family: "Source Sans Pro", sans-serif; - font-weight: 700; - font-size: 32px; - line-height: 40px; - padding-bottom: 14px; - margin: 0 0 20px 0; - padding: 0; -} - -article { - padding: 14px 0 30px 0; -} - -article h1 { - font-family: "Source Sans Pro Bold", sans-serif; - font-weight: 600; - font-size: 24px; - line-height: 26px; -} - -article h2 { - font-family: "Source Sans Pro", sans-serif; - font-weight: 600; - font-size: 18px; - line-height: 24px; - margin: 0 0 10px 0; -} - -article h3 { - font-family: "Source Sans Pro", sans-serif; - font-weight: 600; - font-size: 16px; - line-height: 18px; - margin: 0 0 10px 0; -} - -article h4 { - font-family: "Source Sans Pro", sans-serif; - font-weight: 600; - font-size: 14px; - line-height: 16px; - margin: 0 0 8px 0; -} - -table { - border-collapse: collapse; - width: 100%; - margin: 0 0 20px 0; -} - -th { - background-color: #f5f5f5; - text-align: left; - font-family: "Source Sans Pro", sans-serif; - font-weight: 700; - padding: 4px 8px; - border: #e0e0e0 1px solid; -} - -td { - vertical-align: top; - padding: 10px 8px 0 8px; - border: #e0e0e0 1px solid; -} - -#generator .content { - color: #b0b0b0; - border-top: 1px solid #ebebeb; - padding: 10px 0; -} - -.label-optional { - float: right; - background-color: grey; - margin-top: 4px; -} - -.open-left { - right: 0; - left: auto; -} - -/* ------------------------------------------------------------------------------------------ - * apidoc - intro - * ------------------------------------------------------------------------------------------ */ - -#apidoc .apidoc { - border-top: 1px solid #ebebeb; - padding: 30px 0; -} - -#apidoc h1 { - font-family: "Source Sans Pro", sans-serif; - font-weight: 700; - font-size: 32px; - line-height: 40px; - padding-bottom: 14px; - margin: 0 0 20px 0; - padding: 0; -} - -#apidoc h2 { - font-family: "Source Sans Pro Bold", sans-serif; - font-weight: 600; - font-size: 22px; - line-height: 26px; - padding-top: 14px; -} - -/* ------------------------------------------------------------------------------------------ - * pre / code - * ------------------------------------------------------------------------------------------ */ -pre { - background-color: #292b36; - color: #ffffff; - padding: 10px; - border-radius: 6px; - position: relative; - margin: 10px 0 20px 0; - overflow-x: auto; -} - -pre.prettyprint { - width: 100%; -} - -code.language-text { - word-wrap: break-word; -} - -pre.language-json { - overflow: auto; -} - -pre.language-html { - margin: 0 0 20px 0; -} - -.type { - font-family: "Source Sans Pro", sans-serif; - font-weight: 600; - font-size: 15px; - display: inline-block; - margin: 0 0 5px 0; - padding: 4px 5px; - border-radius: 6px; - text-transform: uppercase; - background-color: #3387CC; - color: #ffffff; -} - -.type__get { - background-color: green; -} - -.type__put { - background-color: #e5c500; -} - -.type__post { - background-color: #4070ec; -} - -.type__delete { - background-color: #ed0039; -} - -pre.language-api .str { - color: #ffffff; -} - -pre.language-api .pln, -pre.language-api .pun { - color: #65B042; -} - -pre code { - display: block; - font-size: 14px; - font-family: "Source Code Pro", monospace; - font-style: normal; - font-weight: 400; - word-wrap: normal; - white-space: pre; -} - -pre code.sample-request-response-json { - white-space: pre-wrap; - max-height: 500px; - overflow: auto; -} - -/* ------------------------------------------------------------------------------------------ - * Sidenav - * ------------------------------------------------------------------------------------------ */ -.sidenav { - width: 228px; - margin: 0; - padding: 0 20px 20px 20px; - position: fixed; - top: 50px; - left: 0; - bottom: 0; - overflow-x: hidden; - overflow-y: auto; - background-color: #f5f5f5; - z-index: 10; -} - -.sidenav > li > a { - display: block; - width: 192px; - margin: 0; - padding: 2px 11px; - border: 0; - border-left: transparent 4px solid; - border-right: transparent 4px solid; - font-family: "Source Sans Pro", sans-serif; - font-weight: 400; - font-size: 14px; -} - -.sidenav > li.nav-header { - margin-top: 8px; - margin-bottom: 8px; -} - -.sidenav > li.nav-header > a { - padding: 5px 15px; - border: 1px solid #e5e5e5; - width: 190px; - font-family: "Source Sans Pro", sans-serif; - font-weight: 700; - font-size: 16px; - background-color: #ffffff; -} - -.sidenav > li.active > a { - position: relative; - z-index: 2; - background-color: #0088cc; - color: #ffffff; -} - -.sidenav > li.has-modifications a { - border-right: #60d060 4px solid; -} - -.sidenav > li.is-new a { - border-left: #e5e5e5 4px solid; -} - -/* ------------------------------------------------------------------------------------------ - * Side nav search - * ------------------------------------------------------------------------------------------ */ -.sidenav-search { - width: 228px; - left: 0px; - position: fixed; - padding: 16px 20px 10px 20px; - background-color: #F5F5F5; - z-index: 11; -} - -.sidenav-search .search { - height: 26px; -} - -.search-reset { - position: absolute; - display: block; - cursor: pointer; - width: 20px; - height: 20px; - text-align: center; - right: 28px; - top: 17px; - background-color: #fff; -} - -/* ------------------------------------------------------------------------------------------ - * Compare - * ------------------------------------------------------------------------------------------ */ - -ins { - background: #60d060; - text-decoration: none; - color: #000000; -} - -del { - background: #f05050; - color: #000000; -} - -.label-ins { - background-color: #60d060; -} - -.label-del { - background-color: #f05050; - text-decoration: line-through; -} - -pre.ins { - background-color: #60d060; -} - -pre.del { - background-color: #f05050; - text-decoration: line-through; -} - -table.ins th, -table.ins td { - background-color: #60d060; -} - -table.del th, -table.del td { - background-color: #f05050; - text-decoration: line-through; -} - -tr.ins td { - background-color: #60d060; -} - -tr.del td { - background-color: #f05050; - text-decoration: line-through; -} - -/* ------------------------------------------------------------------------------------------ - * Spinner - * ------------------------------------------------------------------------------------------ */ - -#loader { - position: absolute; - width: 100%; -} - -#loader p { - padding-top: 80px; - margin-left: -4px; -} - -.spinner { - margin: 200px auto; - width: 60px; - height: 60px; - position: relative; -} - -.container1 > div, .container2 > div, .container3 > div { - width: 14px; - height: 14px; - background-color: #0088cc; - - border-radius: 100%; - position: absolute; - -webkit-animation: bouncedelay 1.2s infinite ease-in-out; - animation: bouncedelay 1.2s infinite ease-in-out; - /* Prevent first frame from flickering when animation starts */ - -webkit-animation-fill-mode: both; - animation-fill-mode: both; -} - -.spinner .spinner-container { - position: absolute; - width: 100%; - height: 100%; -} - -.container2 { - -webkit-transform: rotateZ(45deg); - transform: rotateZ(45deg); -} - -.container3 { - -webkit-transform: rotateZ(90deg); - transform: rotateZ(90deg); -} - -.circle1 { top: 0; left: 0; } -.circle2 { top: 0; right: 0; } -.circle3 { right: 0; bottom: 0; } -.circle4 { left: 0; bottom: 0; } - -.container2 .circle1 { - -webkit-animation-delay: -1.1s; - animation-delay: -1.1s; -} - -.container3 .circle1 { - -webkit-animation-delay: -1.0s; - animation-delay: -1.0s; -} - -.container1 .circle2 { - -webkit-animation-delay: -0.9s; - animation-delay: -0.9s; -} - -.container2 .circle2 { - -webkit-animation-delay: -0.8s; - animation-delay: -0.8s; -} - -.container3 .circle2 { - -webkit-animation-delay: -0.7s; - animation-delay: -0.7s; -} - -.container1 .circle3 { - -webkit-animation-delay: -0.6s; - animation-delay: -0.6s; -} - -.container2 .circle3 { - -webkit-animation-delay: -0.5s; - animation-delay: -0.5s; -} - -.container3 .circle3 { - -webkit-animation-delay: -0.4s; - animation-delay: -0.4s; -} - -.container1 .circle4 { - -webkit-animation-delay: -0.3s; - animation-delay: -0.3s; -} - -.container2 .circle4 { - -webkit-animation-delay: -0.2s; - animation-delay: -0.2s; -} - -.container3 .circle4 { - -webkit-animation-delay: -0.1s; - animation-delay: -0.1s; -} - -@-webkit-keyframes bouncedelay { - 0%, 80%, 100% { -webkit-transform: scale(0.0) } - 40% { -webkit-transform: scale(1.0) } -} - -@keyframes bouncedelay { - 0%, 80%, 100% { - transform: scale(0.0); - -webkit-transform: scale(0.0); - } 40% { - transform: scale(1.0); - -webkit-transform: scale(1.0); - } -} - -/* ------------------------------------------------------------------------------------------ - * Tabs - * ------------------------------------------------------------------------------------------ */ -ul.nav-tabs { - margin: 0; -} - -p.deprecated span{ - color: #ff0000; - font-weight: bold; - text-decoration: underline; -} - -/* ------------------------------------------------------------------------------------------ - * Print - * ------------------------------------------------------------------------------------------ */ - -@media print { - - #sidenav, - #version, - #versions, - section .version, - section .versions { - display: none; - } - - #content { - margin-left: 0; - } - - a { - text-decoration: none; - color: inherit; - } - - a:after { - content: " [" attr(href) "] "; - } - - p { - color: #000000 - } - - pre { - background-color: #ffffff; - color: #000000; - padding: 10px; - border: #808080 1px solid; - border-radius: 6px; - position: relative; - margin: 10px 0 20px 0; - } - -} /* /@media print */ diff --git a/doc/fonts/glyphicons-halflings-regular.eot b/doc/fonts/glyphicons-halflings-regular.eot deleted file mode 100644 index b93a4953..00000000 Binary files a/doc/fonts/glyphicons-halflings-regular.eot and /dev/null differ diff --git a/doc/fonts/glyphicons-halflings-regular.svg b/doc/fonts/glyphicons-halflings-regular.svg deleted file mode 100644 index 94fb5490..00000000 --- a/doc/fonts/glyphicons-halflings-regular.svg +++ /dev/null @@ -1,288 +0,0 @@ - - - \ No newline at end of file diff --git a/doc/fonts/glyphicons-halflings-regular.ttf b/doc/fonts/glyphicons-halflings-regular.ttf deleted file mode 100644 index 1413fc60..00000000 Binary files a/doc/fonts/glyphicons-halflings-regular.ttf and /dev/null differ diff --git a/doc/fonts/glyphicons-halflings-regular.woff b/doc/fonts/glyphicons-halflings-regular.woff deleted file mode 100644 index 9e612858..00000000 Binary files a/doc/fonts/glyphicons-halflings-regular.woff and /dev/null differ diff --git a/doc/fonts/glyphicons-halflings-regular.woff2 b/doc/fonts/glyphicons-halflings-regular.woff2 deleted file mode 100644 index 64539b54..00000000 Binary files a/doc/fonts/glyphicons-halflings-regular.woff2 and /dev/null differ diff --git a/doc/img/favicon.ico b/doc/img/favicon.ico deleted file mode 100644 index c307a043..00000000 Binary files a/doc/img/favicon.ico and /dev/null differ diff --git a/doc/index.html b/doc/index.html deleted file mode 100644 index 5f04deda..00000000 --- a/doc/index.html +++ /dev/null @@ -1,669 +0,0 @@ - - - - -Loading...
-