mirror of
https://github.com/0rangebananaspy/authelia.git
synced 2024-09-14 22:47:21 +07:00
56fdc40290
Now, /verify can return 401 or 403 depending on the user authentication. Every public API endpoints and pages return 200 with error message in JSON body or 401 if the user is not authorized. This policy makes it complicated for an attacker to know what is the source of the failure and hide server-side bugs (not returning 500), bugs being potential threats.
147 lines
5.1 KiB
TypeScript
147 lines
5.1 KiB
TypeScript
|
||
import sinon = require("sinon");
|
||
import BluebirdPromise = require("bluebird");
|
||
import Assert = require("assert");
|
||
import winston = require("winston");
|
||
|
||
import FirstFactorPost = require("../../../src/lib/routes/firstfactor/post");
|
||
import exceptions = require("../../../src/lib/Exceptions");
|
||
import AuthenticationSession = require("../../../src/lib/AuthenticationSession");
|
||
import Endpoints = require("../../../../shared/api");
|
||
|
||
import AuthenticationRegulatorMock = require("../../mocks/AuthenticationRegulator");
|
||
import { AccessControllerStub } from "../../mocks/AccessControllerStub";
|
||
import ExpressMock = require("../../mocks/express");
|
||
import ServerVariablesMock = require("../../mocks/ServerVariablesMock");
|
||
import { ServerVariables } from "../../../src/lib/ServerVariables";
|
||
|
||
describe("test the first factor validation route", function () {
|
||
let req: ExpressMock.RequestMock;
|
||
let res: ExpressMock.ResponseMock;
|
||
let emails: string[];
|
||
let groups: string[];
|
||
let configuration;
|
||
let regulator: AuthenticationRegulatorMock.AuthenticationRegulatorMock;
|
||
let accessController: AccessControllerStub;
|
||
let serverVariables: ServerVariables;
|
||
|
||
beforeEach(function () {
|
||
configuration = {
|
||
ldap: {
|
||
base_dn: "ou=users,dc=example,dc=com",
|
||
user_name_attribute: "uid"
|
||
}
|
||
};
|
||
|
||
emails = ["test_ok@example.com"];
|
||
groups = ["group1", "group2" ];
|
||
|
||
accessController = new AccessControllerStub();
|
||
accessController.isAccessAllowedMock.returns(true);
|
||
|
||
regulator = AuthenticationRegulatorMock.AuthenticationRegulatorMock();
|
||
regulator.regulate.returns(BluebirdPromise.resolve());
|
||
regulator.mark.returns(BluebirdPromise.resolve());
|
||
|
||
req = {
|
||
app: {
|
||
get: sinon.stub().returns({ logger: winston })
|
||
},
|
||
body: {
|
||
username: "username",
|
||
password: "password"
|
||
},
|
||
query: {
|
||
redirect: "http://redirect.url"
|
||
},
|
||
session: {
|
||
},
|
||
headers: {
|
||
host: "home.example.com"
|
||
}
|
||
};
|
||
|
||
AuthenticationSession.reset(req as any);
|
||
|
||
serverVariables = ServerVariablesMock.mock(req.app);
|
||
serverVariables.ldapAuthenticator = {
|
||
authenticate: sinon.stub()
|
||
} as any;
|
||
serverVariables.config = configuration as any;
|
||
serverVariables.regulator = regulator as any;
|
||
serverVariables.accessController = accessController as any;
|
||
|
||
res = ExpressMock.ResponseMock();
|
||
});
|
||
|
||
it("should reply with 204 if success", function () {
|
||
(serverVariables.ldapAuthenticator as any).authenticate.withArgs("username", "password")
|
||
.returns(BluebirdPromise.resolve({
|
||
emails: emails,
|
||
groups: groups
|
||
}));
|
||
let authSession: AuthenticationSession.AuthenticationSession;
|
||
return AuthenticationSession.get(req as any)
|
||
.then(function (_authSession: AuthenticationSession.AuthenticationSession) {
|
||
authSession = _authSession;
|
||
return FirstFactorPost.default(req as any, res as any);
|
||
})
|
||
.then(function () {
|
||
Assert.equal("username", authSession.userid);
|
||
Assert(res.send.calledOnce);
|
||
});
|
||
});
|
||
|
||
it("should retrieve email from LDAP", function () {
|
||
(serverVariables.ldapAuthenticator as any).authenticate.withArgs("username", "password")
|
||
.returns(BluebirdPromise.resolve([{ mail: ["test@example.com"] }]));
|
||
return FirstFactorPost.default(req as any, res as any);
|
||
});
|
||
|
||
it("should set first email address as user session variable", function () {
|
||
const emails = ["test_ok@example.com"];
|
||
let authSession: AuthenticationSession.AuthenticationSession;
|
||
(serverVariables.ldapAuthenticator as any).authenticate.withArgs("username", "password")
|
||
.returns(BluebirdPromise.resolve({
|
||
emails: emails,
|
||
groups: groups
|
||
}));
|
||
|
||
return AuthenticationSession.get(req as any)
|
||
.then(function (_authSession: AuthenticationSession.AuthenticationSession) {
|
||
authSession = _authSession;
|
||
return FirstFactorPost.default(req as any, res as any);
|
||
})
|
||
.then(function () {
|
||
Assert.equal("test_ok@example.com", authSession.email);
|
||
});
|
||
});
|
||
|
||
it("should return error message when LDAP authenticator throws", function () {
|
||
(serverVariables.ldapAuthenticator as any).authenticate.withArgs("username", "password")
|
||
.returns(BluebirdPromise.reject(new exceptions.LdapBindError("Bad credentials")));
|
||
return FirstFactorPost.default(req as any, res as any)
|
||
.then(function () {
|
||
Assert.equal(res.status.getCall(0).args[0], 200);
|
||
Assert.equal(regulator.mark.getCall(0).args[0], "username");
|
||
Assert.deepEqual(res.send.getCall(0).args[0], {
|
||
error: "Operation failed."
|
||
});
|
||
});
|
||
});
|
||
|
||
it("should return error message when regulator rejects authentication", function () {
|
||
const err = new exceptions.AuthenticationRegulationError("Authentication regulation...");
|
||
regulator.regulate.returns(BluebirdPromise.reject(err));
|
||
return FirstFactorPost.default(req as any, res as any)
|
||
.then(function () {
|
||
Assert.equal(res.status.getCall(0).args[0], 200);
|
||
Assert.deepEqual(res.send.getCall(0).args[0], {
|
||
error: "Operation failed."
|
||
});
|
||
});
|
||
});
|
||
});
|
||
|
||
|