summaryrefslogtreecommitdiff
path: root/internal/configuration/validator/access_control_test.go
diff options
context:
space:
mode:
authorAmir Zarrinkafsh <nightah@me.com>2021-01-16 21:05:41 +1100
committerGitHub <noreply@github.com>2021-01-16 21:05:41 +1100
commit81e34d84de55b34e2734731b8aab6ad7dd188e57 (patch)
tree109e25edeb296bb38123188486820dd932f0c626 /internal/configuration/validator/access_control_test.go
parent57c339bb963d59a347a1de9c51af51ad7e906eaf (diff)
[MISC] Validate all sections of ACLs on startup (#1595)
* [MISC] Validate all sections of ACLs on startup This change ensure that all sections of the `access_control` key are validated on startup. * Change error format to clearly identify values
Diffstat (limited to 'internal/configuration/validator/access_control_test.go')
-rw-r--r--internal/configuration/validator/access_control_test.go139
1 files changed, 139 insertions, 0 deletions
diff --git a/internal/configuration/validator/access_control_test.go b/internal/configuration/validator/access_control_test.go
new file mode 100644
index 000000000..34bf057ac
--- /dev/null
+++ b/internal/configuration/validator/access_control_test.go
@@ -0,0 +1,139 @@
+package validator
+
+import (
+ "testing"
+
+ "github.com/stretchr/testify/suite"
+
+ "github.com/authelia/authelia/internal/configuration/schema"
+)
+
+type AccessControl struct {
+ suite.Suite
+ configuration schema.AccessControlConfiguration
+ validator *schema.StructValidator
+}
+
+func (suite *AccessControl) SetupTest() {
+ suite.validator = schema.NewStructValidator()
+ suite.configuration.DefaultPolicy = denyPolicy
+ suite.configuration.Networks = schema.DefaultACLNetwork
+ suite.configuration.Rules = schema.DefaultACLRule
+}
+
+func (suite *AccessControl) TestShouldValidateCompleteConfiguration() {
+ ValidateAccessControl(suite.configuration, suite.validator)
+
+ suite.Assert().False(suite.validator.HasWarnings())
+ suite.Assert().False(suite.validator.HasErrors())
+}
+
+func (suite *AccessControl) TestShouldRaiseErrorInvalidDefaultPolicy() {
+ suite.configuration.DefaultPolicy = "invalid"
+
+ ValidateAccessControl(suite.configuration, suite.validator)
+
+ suite.Assert().False(suite.validator.HasWarnings())
+ suite.Require().Len(suite.validator.Errors(), 1)
+
+ suite.Assert().EqualError(suite.validator.Errors()[0], "'default_policy' must either be 'deny', 'two_factor', 'one_factor' or 'bypass'")
+}
+
+func (suite *AccessControl) TestShouldRaiseErrorInvalidNetworkGroupNetwork() {
+ suite.configuration.Networks = []schema.ACLNetwork{
+ {
+ Name: []string{"internal"},
+ Networks: []string{"abc.def.ghi.jkl"},
+ },
+ }
+
+ ValidateAccessControl(suite.configuration, suite.validator)
+
+ suite.Assert().False(suite.validator.HasWarnings())
+ suite.Require().Len(suite.validator.Errors(), 1)
+
+ suite.Assert().EqualError(suite.validator.Errors()[0], "Network [abc.def.ghi.jkl] from network group: [internal] must be a valid IP or CIDR")
+}
+
+func (suite *AccessControl) TestShouldRaiseErrorNoRulesDefined() {
+ suite.configuration.Rules = []schema.ACLRule{{}}
+
+ ValidateRules(suite.configuration, suite.validator)
+
+ suite.Assert().False(suite.validator.HasWarnings())
+ suite.Require().Len(suite.validator.Errors(), 2)
+
+ suite.Assert().EqualError(suite.validator.Errors()[0], "No access control rules have been defined")
+ suite.Assert().EqualError(suite.validator.Errors()[1], "Policy [] for domain: [] is invalid, a policy must either be 'deny', 'two_factor', 'one_factor' or 'bypass'")
+}
+
+func (suite *AccessControl) TestShouldRaiseErrorInvalidPolicy() {
+ suite.configuration.Rules = []schema.ACLRule{
+ {
+ Domains: []string{"public.example.com"},
+ Policy: "invalid",
+ },
+ }
+
+ ValidateRules(suite.configuration, suite.validator)
+
+ suite.Assert().False(suite.validator.HasWarnings())
+ suite.Require().Len(suite.validator.Errors(), 1)
+
+ suite.Assert().EqualError(suite.validator.Errors()[0], "Policy [invalid] for domain: [public.example.com] is invalid, a policy must either be 'deny', 'two_factor', 'one_factor' or 'bypass'")
+}
+
+func (suite *AccessControl) TestShouldRaiseErrorInvalidNetwork() {
+ suite.configuration.Rules = []schema.ACLRule{
+ {
+ Domains: []string{"public.example.com"},
+ Policy: "bypass",
+ Networks: []string{"abc.def.ghi.jkl/32"},
+ },
+ }
+
+ ValidateRules(suite.configuration, suite.validator)
+
+ suite.Assert().False(suite.validator.HasWarnings())
+ suite.Require().Len(suite.validator.Errors(), 1)
+
+ suite.Assert().EqualError(suite.validator.Errors()[0], "Network [abc.def.ghi.jkl/32] for domain: [public.example.com] is not a valid network or network group")
+}
+
+func (suite *AccessControl) TestShouldRaiseErrorInvalidResource() {
+ suite.configuration.Rules = []schema.ACLRule{
+ {
+ Domains: []string{"public.example.com"},
+ Policy: "bypass",
+ Resources: []string{"^/(api.*"},
+ },
+ }
+
+ ValidateRules(suite.configuration, suite.validator)
+
+ suite.Assert().False(suite.validator.HasWarnings())
+ suite.Require().Len(suite.validator.Errors(), 1)
+
+ suite.Assert().EqualError(suite.validator.Errors()[0], "Resource [^/(api.*] for domain: [public.example.com] is invalid, error parsing regexp: missing closing ): `^/(api.*`")
+}
+
+func (suite *AccessControl) TestShouldRaiseErrorInvalidSubject() {
+ suite.configuration.Rules = []schema.ACLRule{
+ {
+ Domains: []string{"public.example.com"},
+ Policy: "bypass",
+ Subjects: [][]string{{"invalid"}},
+ },
+ }
+
+ ValidateRules(suite.configuration, suite.validator)
+
+ suite.Assert().False(suite.validator.HasWarnings())
+ suite.Require().Len(suite.validator.Errors(), 1)
+
+ suite.Assert().EqualError(suite.validator.Errors()[0], "Subject [invalid] for domain: [public.example.com] must start with 'user:' or 'group:'")
+}
+
+func TestAccessControl(t *testing.T) {
+ suite.Run(t, new(AccessControl))
+}