2019-04-25 04:52:08 +07:00
package validator
import (
feat(session): add redis sentinel provider (#1768)
* feat(session): add redis sentinel provider
* refactor(session): use int for ports as per go standards
* refactor(configuration): adjust tests and validation
* refactor(configuration): add err format consts
* refactor(configuration): explicitly map redis structs
* refactor(session): merge redis/redis sentinel providers
* refactor(session): add additional checks to redis providers
* feat(session): add redis cluster provider
* fix: update config for new values
* fix: provide nil certpool to affected tests/mocks
* test: add additional tests to cover uncovered code
* docs: expand explanation of host and nodes relation for redis
* ci: add redis-sentinel to suite highavailability, add redis-sentinel quorum
* fix(session): sentinel password
* test: use redis alpine library image for redis sentinel, use expose instead of ports, use redis ip, adjust redis ip range, adjust redis config
* test: make entrypoint.sh executable, fix entrypoint.sh if/elif
* test: add redis failover tests
* test: defer docker start, adjust sleep, attempt logout before login, attempt visit before login and tune timeouts, add additional logging
* test: add sentinel integration test
* test: add secondary node failure to tests, fix password usage, bump test timeout, add sleep
* feat: use sentinel failover cluster
* fix: renamed addrs to sentineladdrs upstream
* test(session): sentinel failover
* test: add redis standard back into testing
* test: move redis standalone test to traefik2
* fix/docs: apply suggestions from code review
2021-03-10 06:03:05 +07:00
"fmt"
2019-04-25 04:52:08 +07:00
"testing"
"github.com/stretchr/testify/assert"
feat(session): add redis sentinel provider (#1768)
* feat(session): add redis sentinel provider
* refactor(session): use int for ports as per go standards
* refactor(configuration): adjust tests and validation
* refactor(configuration): add err format consts
* refactor(configuration): explicitly map redis structs
* refactor(session): merge redis/redis sentinel providers
* refactor(session): add additional checks to redis providers
* feat(session): add redis cluster provider
* fix: update config for new values
* fix: provide nil certpool to affected tests/mocks
* test: add additional tests to cover uncovered code
* docs: expand explanation of host and nodes relation for redis
* ci: add redis-sentinel to suite highavailability, add redis-sentinel quorum
* fix(session): sentinel password
* test: use redis alpine library image for redis sentinel, use expose instead of ports, use redis ip, adjust redis ip range, adjust redis config
* test: make entrypoint.sh executable, fix entrypoint.sh if/elif
* test: add redis failover tests
* test: defer docker start, adjust sleep, attempt logout before login, attempt visit before login and tune timeouts, add additional logging
* test: add sentinel integration test
* test: add secondary node failure to tests, fix password usage, bump test timeout, add sleep
* feat: use sentinel failover cluster
* fix: renamed addrs to sentineladdrs upstream
* test(session): sentinel failover
* test: add redis standard back into testing
* test: move redis standalone test to traefik2
* fix/docs: apply suggestions from code review
2021-03-10 06:03:05 +07:00
"github.com/stretchr/testify/require"
2020-04-05 19:37:21 +07:00
2021-08-11 08:04:35 +07:00
"github.com/authelia/authelia/v4/internal/configuration/schema"
2019-04-25 04:52:08 +07:00
)
func newDefaultSessionConfig ( ) schema . SessionConfiguration {
config := schema . SessionConfiguration { }
2020-05-02 23:20:40 +07:00
config . Secret = testJWTSecret
2019-04-25 04:52:08 +07:00
config . Domain = "example.com"
2020-05-06 02:35:32 +07:00
2019-04-25 04:52:08 +07:00
return config
}
func TestShouldSetDefaultSessionName ( t * testing . T ) {
validator := schema . NewStructValidator ( )
config := newDefaultSessionConfig ( )
ValidateSession ( & config , validator )
feat(session): add redis sentinel provider (#1768)
* feat(session): add redis sentinel provider
* refactor(session): use int for ports as per go standards
* refactor(configuration): adjust tests and validation
* refactor(configuration): add err format consts
* refactor(configuration): explicitly map redis structs
* refactor(session): merge redis/redis sentinel providers
* refactor(session): add additional checks to redis providers
* feat(session): add redis cluster provider
* fix: update config for new values
* fix: provide nil certpool to affected tests/mocks
* test: add additional tests to cover uncovered code
* docs: expand explanation of host and nodes relation for redis
* ci: add redis-sentinel to suite highavailability, add redis-sentinel quorum
* fix(session): sentinel password
* test: use redis alpine library image for redis sentinel, use expose instead of ports, use redis ip, adjust redis ip range, adjust redis config
* test: make entrypoint.sh executable, fix entrypoint.sh if/elif
* test: add redis failover tests
* test: defer docker start, adjust sleep, attempt logout before login, attempt visit before login and tune timeouts, add additional logging
* test: add sentinel integration test
* test: add secondary node failure to tests, fix password usage, bump test timeout, add sleep
* feat: use sentinel failover cluster
* fix: renamed addrs to sentineladdrs upstream
* test(session): sentinel failover
* test: add redis standard back into testing
* test: move redis standalone test to traefik2
* fix/docs: apply suggestions from code review
2021-03-10 06:03:05 +07:00
assert . False ( t , validator . HasWarnings ( ) )
assert . False ( t , validator . HasErrors ( ) )
2020-04-05 19:37:21 +07:00
assert . Equal ( t , schema . DefaultSessionConfiguration . Name , config . Name )
}
func TestShouldSetDefaultSessionInactivity ( t * testing . T ) {
validator := schema . NewStructValidator ( )
config := newDefaultSessionConfig ( )
ValidateSession ( & config , validator )
feat(session): add redis sentinel provider (#1768)
* feat(session): add redis sentinel provider
* refactor(session): use int for ports as per go standards
* refactor(configuration): adjust tests and validation
* refactor(configuration): add err format consts
* refactor(configuration): explicitly map redis structs
* refactor(session): merge redis/redis sentinel providers
* refactor(session): add additional checks to redis providers
* feat(session): add redis cluster provider
* fix: update config for new values
* fix: provide nil certpool to affected tests/mocks
* test: add additional tests to cover uncovered code
* docs: expand explanation of host and nodes relation for redis
* ci: add redis-sentinel to suite highavailability, add redis-sentinel quorum
* fix(session): sentinel password
* test: use redis alpine library image for redis sentinel, use expose instead of ports, use redis ip, adjust redis ip range, adjust redis config
* test: make entrypoint.sh executable, fix entrypoint.sh if/elif
* test: add redis failover tests
* test: defer docker start, adjust sleep, attempt logout before login, attempt visit before login and tune timeouts, add additional logging
* test: add sentinel integration test
* test: add secondary node failure to tests, fix password usage, bump test timeout, add sleep
* feat: use sentinel failover cluster
* fix: renamed addrs to sentineladdrs upstream
* test(session): sentinel failover
* test: add redis standard back into testing
* test: move redis standalone test to traefik2
* fix/docs: apply suggestions from code review
2021-03-10 06:03:05 +07:00
assert . False ( t , validator . HasWarnings ( ) )
assert . False ( t , validator . HasErrors ( ) )
2020-04-05 19:37:21 +07:00
assert . Equal ( t , schema . DefaultSessionConfiguration . Inactivity , config . Inactivity )
}
func TestShouldSetDefaultSessionExpiration ( t * testing . T ) {
validator := schema . NewStructValidator ( )
config := newDefaultSessionConfig ( )
ValidateSession ( & config , validator )
feat(session): add redis sentinel provider (#1768)
* feat(session): add redis sentinel provider
* refactor(session): use int for ports as per go standards
* refactor(configuration): adjust tests and validation
* refactor(configuration): add err format consts
* refactor(configuration): explicitly map redis structs
* refactor(session): merge redis/redis sentinel providers
* refactor(session): add additional checks to redis providers
* feat(session): add redis cluster provider
* fix: update config for new values
* fix: provide nil certpool to affected tests/mocks
* test: add additional tests to cover uncovered code
* docs: expand explanation of host and nodes relation for redis
* ci: add redis-sentinel to suite highavailability, add redis-sentinel quorum
* fix(session): sentinel password
* test: use redis alpine library image for redis sentinel, use expose instead of ports, use redis ip, adjust redis ip range, adjust redis config
* test: make entrypoint.sh executable, fix entrypoint.sh if/elif
* test: add redis failover tests
* test: defer docker start, adjust sleep, attempt logout before login, attempt visit before login and tune timeouts, add additional logging
* test: add sentinel integration test
* test: add secondary node failure to tests, fix password usage, bump test timeout, add sleep
* feat: use sentinel failover cluster
* fix: renamed addrs to sentineladdrs upstream
* test(session): sentinel failover
* test: add redis standard back into testing
* test: move redis standalone test to traefik2
* fix/docs: apply suggestions from code review
2021-03-10 06:03:05 +07:00
assert . False ( t , validator . HasWarnings ( ) )
assert . False ( t , validator . HasErrors ( ) )
2020-04-05 19:37:21 +07:00
assert . Equal ( t , schema . DefaultSessionConfiguration . Expiration , config . Expiration )
2019-04-25 04:52:08 +07:00
}
2021-04-18 07:02:04 +07:00
func TestShouldSetDefaultSessionSameSite ( t * testing . T ) {
validator := schema . NewStructValidator ( )
config := newDefaultSessionConfig ( )
ValidateSession ( & config , validator )
assert . False ( t , validator . HasWarnings ( ) )
assert . False ( t , validator . HasErrors ( ) )
assert . Equal ( t , schema . DefaultSessionConfiguration . SameSite , config . SameSite )
}
2020-05-18 09:45:47 +07:00
func TestShouldHandleRedisConfigSuccessfully ( t * testing . T ) {
validator := schema . NewStructValidator ( )
config := newDefaultSessionConfig ( )
ValidateSession ( & config , validator )
assert . Len ( t , validator . Errors ( ) , 0 )
validator . Clear ( )
// Set redis config because password must be set only when redis is used.
config . Redis = & schema . RedisSessionConfiguration {
Host : "redis.localhost" ,
Port : 6379 ,
Password : "password" ,
}
ValidateSession ( & config , validator )
feat(session): add redis sentinel provider (#1768)
* feat(session): add redis sentinel provider
* refactor(session): use int for ports as per go standards
* refactor(configuration): adjust tests and validation
* refactor(configuration): add err format consts
* refactor(configuration): explicitly map redis structs
* refactor(session): merge redis/redis sentinel providers
* refactor(session): add additional checks to redis providers
* feat(session): add redis cluster provider
* fix: update config for new values
* fix: provide nil certpool to affected tests/mocks
* test: add additional tests to cover uncovered code
* docs: expand explanation of host and nodes relation for redis
* ci: add redis-sentinel to suite highavailability, add redis-sentinel quorum
* fix(session): sentinel password
* test: use redis alpine library image for redis sentinel, use expose instead of ports, use redis ip, adjust redis ip range, adjust redis config
* test: make entrypoint.sh executable, fix entrypoint.sh if/elif
* test: add redis failover tests
* test: defer docker start, adjust sleep, attempt logout before login, attempt visit before login and tune timeouts, add additional logging
* test: add sentinel integration test
* test: add secondary node failure to tests, fix password usage, bump test timeout, add sleep
* feat: use sentinel failover cluster
* fix: renamed addrs to sentineladdrs upstream
* test(session): sentinel failover
* test: add redis standard back into testing
* test: move redis standalone test to traefik2
* fix/docs: apply suggestions from code review
2021-03-10 06:03:05 +07:00
assert . False ( t , validator . HasWarnings ( ) )
assert . False ( t , validator . HasErrors ( ) )
assert . Equal ( t , 8 , config . Redis . MaximumActiveConnections )
}
func TestShouldRaiseErrorWithInvalidRedisPortLow ( t * testing . T ) {
validator := schema . NewStructValidator ( )
config := newDefaultSessionConfig ( )
config . Redis = & schema . RedisSessionConfiguration {
Host : "authelia-port-1" ,
Port : - 1 ,
}
ValidateSession ( & config , validator )
assert . False ( t , validator . HasWarnings ( ) )
require . Len ( t , validator . Errors ( ) , 1 )
2022-02-28 10:15:01 +07:00
assert . EqualError ( t , validator . Errors ( ) [ 0 ] , fmt . Sprintf ( errFmtSessionRedisPortRange , - 1 ) )
2020-05-18 09:45:47 +07:00
}
feat(session): add redis sentinel provider (#1768)
* feat(session): add redis sentinel provider
* refactor(session): use int for ports as per go standards
* refactor(configuration): adjust tests and validation
* refactor(configuration): add err format consts
* refactor(configuration): explicitly map redis structs
* refactor(session): merge redis/redis sentinel providers
* refactor(session): add additional checks to redis providers
* feat(session): add redis cluster provider
* fix: update config for new values
* fix: provide nil certpool to affected tests/mocks
* test: add additional tests to cover uncovered code
* docs: expand explanation of host and nodes relation for redis
* ci: add redis-sentinel to suite highavailability, add redis-sentinel quorum
* fix(session): sentinel password
* test: use redis alpine library image for redis sentinel, use expose instead of ports, use redis ip, adjust redis ip range, adjust redis config
* test: make entrypoint.sh executable, fix entrypoint.sh if/elif
* test: add redis failover tests
* test: defer docker start, adjust sleep, attempt logout before login, attempt visit before login and tune timeouts, add additional logging
* test: add sentinel integration test
* test: add secondary node failure to tests, fix password usage, bump test timeout, add sleep
* feat: use sentinel failover cluster
* fix: renamed addrs to sentineladdrs upstream
* test(session): sentinel failover
* test: add redis standard back into testing
* test: move redis standalone test to traefik2
* fix/docs: apply suggestions from code review
2021-03-10 06:03:05 +07:00
func TestShouldRaiseErrorWithInvalidRedisPortHigh ( t * testing . T ) {
validator := schema . NewStructValidator ( )
config := newDefaultSessionConfig ( )
config . Redis = & schema . RedisSessionConfiguration {
Host : "authelia-port-1" ,
Port : 65536 ,
}
ValidateSession ( & config , validator )
assert . False ( t , validator . HasWarnings ( ) )
require . Len ( t , validator . Errors ( ) , 1 )
2022-02-28 10:15:01 +07:00
assert . EqualError ( t , validator . Errors ( ) [ 0 ] , fmt . Sprintf ( errFmtSessionRedisPortRange , 65536 ) )
feat(session): add redis sentinel provider (#1768)
* feat(session): add redis sentinel provider
* refactor(session): use int for ports as per go standards
* refactor(configuration): adjust tests and validation
* refactor(configuration): add err format consts
* refactor(configuration): explicitly map redis structs
* refactor(session): merge redis/redis sentinel providers
* refactor(session): add additional checks to redis providers
* feat(session): add redis cluster provider
* fix: update config for new values
* fix: provide nil certpool to affected tests/mocks
* test: add additional tests to cover uncovered code
* docs: expand explanation of host and nodes relation for redis
* ci: add redis-sentinel to suite highavailability, add redis-sentinel quorum
* fix(session): sentinel password
* test: use redis alpine library image for redis sentinel, use expose instead of ports, use redis ip, adjust redis ip range, adjust redis config
* test: make entrypoint.sh executable, fix entrypoint.sh if/elif
* test: add redis failover tests
* test: defer docker start, adjust sleep, attempt logout before login, attempt visit before login and tune timeouts, add additional logging
* test: add sentinel integration test
* test: add secondary node failure to tests, fix password usage, bump test timeout, add sleep
* feat: use sentinel failover cluster
* fix: renamed addrs to sentineladdrs upstream
* test(session): sentinel failover
* test: add redis standard back into testing
* test: move redis standalone test to traefik2
* fix/docs: apply suggestions from code review
2021-03-10 06:03:05 +07:00
}
func TestShouldRaiseErrorWhenRedisIsUsedAndSecretNotSet ( t * testing . T ) {
2019-04-25 04:52:08 +07:00
validator := schema . NewStructValidator ( )
config := newDefaultSessionConfig ( )
config . Secret = ""
ValidateSession ( & config , validator )
2020-03-28 13:10:39 +07:00
assert . Len ( t , validator . Errors ( ) , 0 )
validator . Clear ( )
// Set redis config because password must be set only when redis is used.
2020-05-18 09:45:47 +07:00
config . Redis = & schema . RedisSessionConfiguration {
Host : "redis.localhost" ,
Port : 6379 ,
}
2020-03-28 13:10:39 +07:00
ValidateSession ( & config , validator )
feat(session): add redis sentinel provider (#1768)
* feat(session): add redis sentinel provider
* refactor(session): use int for ports as per go standards
* refactor(configuration): adjust tests and validation
* refactor(configuration): add err format consts
* refactor(configuration): explicitly map redis structs
* refactor(session): merge redis/redis sentinel providers
* refactor(session): add additional checks to redis providers
* feat(session): add redis cluster provider
* fix: update config for new values
* fix: provide nil certpool to affected tests/mocks
* test: add additional tests to cover uncovered code
* docs: expand explanation of host and nodes relation for redis
* ci: add redis-sentinel to suite highavailability, add redis-sentinel quorum
* fix(session): sentinel password
* test: use redis alpine library image for redis sentinel, use expose instead of ports, use redis ip, adjust redis ip range, adjust redis config
* test: make entrypoint.sh executable, fix entrypoint.sh if/elif
* test: add redis failover tests
* test: defer docker start, adjust sleep, attempt logout before login, attempt visit before login and tune timeouts, add additional logging
* test: add sentinel integration test
* test: add secondary node failure to tests, fix password usage, bump test timeout, add sleep
* feat: use sentinel failover cluster
* fix: renamed addrs to sentineladdrs upstream
* test(session): sentinel failover
* test: add redis standard back into testing
* test: move redis standalone test to traefik2
* fix/docs: apply suggestions from code review
2021-03-10 06:03:05 +07:00
assert . False ( t , validator . HasWarnings ( ) )
2019-04-25 04:52:08 +07:00
assert . Len ( t , validator . Errors ( ) , 1 )
2022-02-28 10:15:01 +07:00
assert . EqualError ( t , validator . Errors ( ) [ 0 ] , fmt . Sprintf ( errFmtSessionSecretRequired , "redis" ) )
2019-04-25 04:52:08 +07:00
}
2020-05-18 09:45:47 +07:00
func TestShouldRaiseErrorWhenRedisHasHostnameButNoPort ( t * testing . T ) {
validator := schema . NewStructValidator ( )
config := newDefaultSessionConfig ( )
ValidateSession ( & config , validator )
assert . Len ( t , validator . Errors ( ) , 0 )
validator . Clear ( )
// Set redis config because password must be set only when redis is used.
config . Redis = & schema . RedisSessionConfiguration {
Host : "redis.localhost" ,
Port : 0 ,
}
ValidateSession ( & config , validator )
feat(session): add redis sentinel provider (#1768)
* feat(session): add redis sentinel provider
* refactor(session): use int for ports as per go standards
* refactor(configuration): adjust tests and validation
* refactor(configuration): add err format consts
* refactor(configuration): explicitly map redis structs
* refactor(session): merge redis/redis sentinel providers
* refactor(session): add additional checks to redis providers
* feat(session): add redis cluster provider
* fix: update config for new values
* fix: provide nil certpool to affected tests/mocks
* test: add additional tests to cover uncovered code
* docs: expand explanation of host and nodes relation for redis
* ci: add redis-sentinel to suite highavailability, add redis-sentinel quorum
* fix(session): sentinel password
* test: use redis alpine library image for redis sentinel, use expose instead of ports, use redis ip, adjust redis ip range, adjust redis config
* test: make entrypoint.sh executable, fix entrypoint.sh if/elif
* test: add redis failover tests
* test: defer docker start, adjust sleep, attempt logout before login, attempt visit before login and tune timeouts, add additional logging
* test: add sentinel integration test
* test: add secondary node failure to tests, fix password usage, bump test timeout, add sleep
* feat: use sentinel failover cluster
* fix: renamed addrs to sentineladdrs upstream
* test(session): sentinel failover
* test: add redis standard back into testing
* test: move redis standalone test to traefik2
* fix/docs: apply suggestions from code review
2021-03-10 06:03:05 +07:00
assert . False ( t , validator . HasWarnings ( ) )
2020-05-18 09:45:47 +07:00
assert . Len ( t , validator . Errors ( ) , 1 )
assert . EqualError ( t , validator . Errors ( ) [ 0 ] , "A redis port different than 0 must be provided" )
}
feat(session): add redis sentinel provider (#1768)
* feat(session): add redis sentinel provider
* refactor(session): use int for ports as per go standards
* refactor(configuration): adjust tests and validation
* refactor(configuration): add err format consts
* refactor(configuration): explicitly map redis structs
* refactor(session): merge redis/redis sentinel providers
* refactor(session): add additional checks to redis providers
* feat(session): add redis cluster provider
* fix: update config for new values
* fix: provide nil certpool to affected tests/mocks
* test: add additional tests to cover uncovered code
* docs: expand explanation of host and nodes relation for redis
* ci: add redis-sentinel to suite highavailability, add redis-sentinel quorum
* fix(session): sentinel password
* test: use redis alpine library image for redis sentinel, use expose instead of ports, use redis ip, adjust redis ip range, adjust redis config
* test: make entrypoint.sh executable, fix entrypoint.sh if/elif
* test: add redis failover tests
* test: defer docker start, adjust sleep, attempt logout before login, attempt visit before login and tune timeouts, add additional logging
* test: add sentinel integration test
* test: add secondary node failure to tests, fix password usage, bump test timeout, add sleep
* feat: use sentinel failover cluster
* fix: renamed addrs to sentineladdrs upstream
* test(session): sentinel failover
* test: add redis standard back into testing
* test: move redis standalone test to traefik2
* fix/docs: apply suggestions from code review
2021-03-10 06:03:05 +07:00
func TestShouldRaiseOneErrorWhenRedisHighAvailabilityHasNodesWithNoHost ( t * testing . T ) {
validator := schema . NewStructValidator ( )
config := newDefaultSessionConfig ( )
config . Redis = & schema . RedisSessionConfiguration {
Host : "redis" ,
Port : 6379 ,
HighAvailability : & schema . RedisHighAvailabilityConfiguration {
SentinelName : "authelia-sentinel" ,
SentinelPassword : "abc123" ,
Nodes : [ ] schema . RedisNode {
{
Port : 26379 ,
} ,
{
Port : 26379 ,
} ,
} ,
} ,
}
ValidateSession ( & config , validator )
errors := validator . Errors ( )
assert . False ( t , validator . HasWarnings ( ) )
require . Len ( t , errors , 1 )
2022-02-28 10:15:01 +07:00
assert . EqualError ( t , errors [ 0 ] , "session: redis: high_availability: option 'nodes': option 'host' is required for each node but one or more nodes are missing this" )
feat(session): add redis sentinel provider (#1768)
* feat(session): add redis sentinel provider
* refactor(session): use int for ports as per go standards
* refactor(configuration): adjust tests and validation
* refactor(configuration): add err format consts
* refactor(configuration): explicitly map redis structs
* refactor(session): merge redis/redis sentinel providers
* refactor(session): add additional checks to redis providers
* feat(session): add redis cluster provider
* fix: update config for new values
* fix: provide nil certpool to affected tests/mocks
* test: add additional tests to cover uncovered code
* docs: expand explanation of host and nodes relation for redis
* ci: add redis-sentinel to suite highavailability, add redis-sentinel quorum
* fix(session): sentinel password
* test: use redis alpine library image for redis sentinel, use expose instead of ports, use redis ip, adjust redis ip range, adjust redis config
* test: make entrypoint.sh executable, fix entrypoint.sh if/elif
* test: add redis failover tests
* test: defer docker start, adjust sleep, attempt logout before login, attempt visit before login and tune timeouts, add additional logging
* test: add sentinel integration test
* test: add secondary node failure to tests, fix password usage, bump test timeout, add sleep
* feat: use sentinel failover cluster
* fix: renamed addrs to sentineladdrs upstream
* test(session): sentinel failover
* test: add redis standard back into testing
* test: move redis standalone test to traefik2
* fix/docs: apply suggestions from code review
2021-03-10 06:03:05 +07:00
}
func TestShouldRaiseOneErrorWhenRedisHighAvailabilityDoesNotHaveSentinelName ( t * testing . T ) {
validator := schema . NewStructValidator ( )
config := newDefaultSessionConfig ( )
config . Redis = & schema . RedisSessionConfiguration {
Host : "redis" ,
Port : 6379 ,
HighAvailability : & schema . RedisHighAvailabilityConfiguration {
SentinelPassword : "abc123" ,
} ,
}
ValidateSession ( & config , validator )
errors := validator . Errors ( )
assert . False ( t , validator . HasWarnings ( ) )
require . Len ( t , errors , 1 )
2022-02-28 10:15:01 +07:00
assert . EqualError ( t , errors [ 0 ] , "session: redis: high_availability: option 'sentinel_name' is required" )
feat(session): add redis sentinel provider (#1768)
* feat(session): add redis sentinel provider
* refactor(session): use int for ports as per go standards
* refactor(configuration): adjust tests and validation
* refactor(configuration): add err format consts
* refactor(configuration): explicitly map redis structs
* refactor(session): merge redis/redis sentinel providers
* refactor(session): add additional checks to redis providers
* feat(session): add redis cluster provider
* fix: update config for new values
* fix: provide nil certpool to affected tests/mocks
* test: add additional tests to cover uncovered code
* docs: expand explanation of host and nodes relation for redis
* ci: add redis-sentinel to suite highavailability, add redis-sentinel quorum
* fix(session): sentinel password
* test: use redis alpine library image for redis sentinel, use expose instead of ports, use redis ip, adjust redis ip range, adjust redis config
* test: make entrypoint.sh executable, fix entrypoint.sh if/elif
* test: add redis failover tests
* test: defer docker start, adjust sleep, attempt logout before login, attempt visit before login and tune timeouts, add additional logging
* test: add sentinel integration test
* test: add secondary node failure to tests, fix password usage, bump test timeout, add sleep
* feat: use sentinel failover cluster
* fix: renamed addrs to sentineladdrs upstream
* test(session): sentinel failover
* test: add redis standard back into testing
* test: move redis standalone test to traefik2
* fix/docs: apply suggestions from code review
2021-03-10 06:03:05 +07:00
}
func TestShouldUpdateDefaultPortWhenRedisSentinelHasNodes ( t * testing . T ) {
validator := schema . NewStructValidator ( )
config := newDefaultSessionConfig ( )
config . Redis = & schema . RedisSessionConfiguration {
Host : "redis" ,
Port : 6379 ,
HighAvailability : & schema . RedisHighAvailabilityConfiguration {
SentinelName : "authelia-sentinel" ,
SentinelPassword : "abc123" ,
Nodes : [ ] schema . RedisNode {
{
Host : "node-1" ,
Port : 333 ,
} ,
{
Host : "node-2" ,
} ,
{
Host : "node-3" ,
} ,
} ,
} ,
}
ValidateSession ( & config , validator )
assert . False ( t , validator . HasWarnings ( ) )
assert . False ( t , validator . HasErrors ( ) )
assert . Equal ( t , 333 , config . Redis . HighAvailability . Nodes [ 0 ] . Port )
assert . Equal ( t , 26379 , config . Redis . HighAvailability . Nodes [ 1 ] . Port )
assert . Equal ( t , 26379 , config . Redis . HighAvailability . Nodes [ 2 ] . Port )
}
func TestShouldRaiseErrorsWhenRedisSentinelOptionsIncorrectlyConfigured ( t * testing . T ) {
validator := schema . NewStructValidator ( )
config := newDefaultSessionConfig ( )
config . Secret = ""
config . Redis = & schema . RedisSessionConfiguration {
Port : 65536 ,
HighAvailability : & schema . RedisHighAvailabilityConfiguration {
SentinelName : "sentinel" ,
SentinelPassword : "abc123" ,
Nodes : [ ] schema . RedisNode {
{
Host : "node1" ,
Port : 26379 ,
} ,
} ,
RouteByLatency : true ,
RouteRandomly : true ,
} ,
}
ValidateSession ( & config , validator )
errors := validator . Errors ( )
assert . False ( t , validator . HasWarnings ( ) )
require . Len ( t , errors , 2 )
2022-02-28 10:15:01 +07:00
assert . EqualError ( t , errors [ 0 ] , fmt . Sprintf ( errFmtSessionRedisPortRange , 65536 ) )
assert . EqualError ( t , errors [ 1 ] , fmt . Sprintf ( errFmtSessionSecretRequired , "redis" ) )
feat(session): add redis sentinel provider (#1768)
* feat(session): add redis sentinel provider
* refactor(session): use int for ports as per go standards
* refactor(configuration): adjust tests and validation
* refactor(configuration): add err format consts
* refactor(configuration): explicitly map redis structs
* refactor(session): merge redis/redis sentinel providers
* refactor(session): add additional checks to redis providers
* feat(session): add redis cluster provider
* fix: update config for new values
* fix: provide nil certpool to affected tests/mocks
* test: add additional tests to cover uncovered code
* docs: expand explanation of host and nodes relation for redis
* ci: add redis-sentinel to suite highavailability, add redis-sentinel quorum
* fix(session): sentinel password
* test: use redis alpine library image for redis sentinel, use expose instead of ports, use redis ip, adjust redis ip range, adjust redis config
* test: make entrypoint.sh executable, fix entrypoint.sh if/elif
* test: add redis failover tests
* test: defer docker start, adjust sleep, attempt logout before login, attempt visit before login and tune timeouts, add additional logging
* test: add sentinel integration test
* test: add secondary node failure to tests, fix password usage, bump test timeout, add sleep
* feat: use sentinel failover cluster
* fix: renamed addrs to sentineladdrs upstream
* test(session): sentinel failover
* test: add redis standard back into testing
* test: move redis standalone test to traefik2
* fix/docs: apply suggestions from code review
2021-03-10 06:03:05 +07:00
validator . Clear ( )
config . Redis . Port = - 1
ValidateSession ( & config , validator )
errors = validator . Errors ( )
assert . False ( t , validator . HasWarnings ( ) )
require . Len ( t , errors , 2 )
2022-02-28 10:15:01 +07:00
assert . EqualError ( t , errors [ 0 ] , fmt . Sprintf ( errFmtSessionRedisPortRange , - 1 ) )
assert . EqualError ( t , errors [ 1 ] , fmt . Sprintf ( errFmtSessionSecretRequired , "redis" ) )
feat(session): add redis sentinel provider (#1768)
* feat(session): add redis sentinel provider
* refactor(session): use int for ports as per go standards
* refactor(configuration): adjust tests and validation
* refactor(configuration): add err format consts
* refactor(configuration): explicitly map redis structs
* refactor(session): merge redis/redis sentinel providers
* refactor(session): add additional checks to redis providers
* feat(session): add redis cluster provider
* fix: update config for new values
* fix: provide nil certpool to affected tests/mocks
* test: add additional tests to cover uncovered code
* docs: expand explanation of host and nodes relation for redis
* ci: add redis-sentinel to suite highavailability, add redis-sentinel quorum
* fix(session): sentinel password
* test: use redis alpine library image for redis sentinel, use expose instead of ports, use redis ip, adjust redis ip range, adjust redis config
* test: make entrypoint.sh executable, fix entrypoint.sh if/elif
* test: add redis failover tests
* test: defer docker start, adjust sleep, attempt logout before login, attempt visit before login and tune timeouts, add additional logging
* test: add sentinel integration test
* test: add secondary node failure to tests, fix password usage, bump test timeout, add sleep
* feat: use sentinel failover cluster
* fix: renamed addrs to sentineladdrs upstream
* test(session): sentinel failover
* test: add redis standard back into testing
* test: move redis standalone test to traefik2
* fix/docs: apply suggestions from code review
2021-03-10 06:03:05 +07:00
}
func TestShouldNotRaiseErrorsAndSetDefaultPortWhenRedisSentinelPortBlank ( t * testing . T ) {
validator := schema . NewStructValidator ( )
config := newDefaultSessionConfig ( )
config . Redis = & schema . RedisSessionConfiguration {
Host : "mysentinelHost" ,
Port : 0 ,
HighAvailability : & schema . RedisHighAvailabilityConfiguration {
SentinelName : "sentinel" ,
SentinelPassword : "abc123" ,
Nodes : [ ] schema . RedisNode {
{
Host : "node1" ,
Port : 26379 ,
} ,
} ,
RouteByLatency : true ,
RouteRandomly : true ,
} ,
}
ValidateSession ( & config , validator )
assert . False ( t , validator . HasWarnings ( ) )
assert . False ( t , validator . HasErrors ( ) )
assert . Equal ( t , 26379 , config . Redis . Port )
}
func TestShouldRaiseErrorWhenRedisHostAndHighAvailabilityNodesEmpty ( t * testing . T ) {
validator := schema . NewStructValidator ( )
config := newDefaultSessionConfig ( )
config . Redis = & schema . RedisSessionConfiguration {
Port : 26379 ,
HighAvailability : & schema . RedisHighAvailabilityConfiguration {
SentinelName : "sentinel" ,
SentinelPassword : "abc123" ,
RouteByLatency : true ,
RouteRandomly : true ,
} ,
}
ValidateSession ( & config , validator )
assert . False ( t , validator . HasWarnings ( ) )
require . Len ( t , validator . Errors ( ) , 1 )
2022-02-28 10:15:01 +07:00
assert . EqualError ( t , validator . Errors ( ) [ 0 ] , errFmtSessionRedisHostOrNodesRequired )
feat(session): add redis sentinel provider (#1768)
* feat(session): add redis sentinel provider
* refactor(session): use int for ports as per go standards
* refactor(configuration): adjust tests and validation
* refactor(configuration): add err format consts
* refactor(configuration): explicitly map redis structs
* refactor(session): merge redis/redis sentinel providers
* refactor(session): add additional checks to redis providers
* feat(session): add redis cluster provider
* fix: update config for new values
* fix: provide nil certpool to affected tests/mocks
* test: add additional tests to cover uncovered code
* docs: expand explanation of host and nodes relation for redis
* ci: add redis-sentinel to suite highavailability, add redis-sentinel quorum
* fix(session): sentinel password
* test: use redis alpine library image for redis sentinel, use expose instead of ports, use redis ip, adjust redis ip range, adjust redis config
* test: make entrypoint.sh executable, fix entrypoint.sh if/elif
* test: add redis failover tests
* test: defer docker start, adjust sleep, attempt logout before login, attempt visit before login and tune timeouts, add additional logging
* test: add sentinel integration test
* test: add secondary node failure to tests, fix password usage, bump test timeout, add sleep
* feat: use sentinel failover cluster
* fix: renamed addrs to sentineladdrs upstream
* test(session): sentinel failover
* test: add redis standard back into testing
* test: move redis standalone test to traefik2
* fix/docs: apply suggestions from code review
2021-03-10 06:03:05 +07:00
}
func TestShouldRaiseErrorsWhenRedisHostNotSet ( t * testing . T ) {
validator := schema . NewStructValidator ( )
config := newDefaultSessionConfig ( )
config . Redis = & schema . RedisSessionConfiguration {
Port : 6379 ,
}
ValidateSession ( & config , validator )
errors := validator . Errors ( )
assert . False ( t , validator . HasWarnings ( ) )
require . Len ( t , errors , 1 )
2022-02-28 10:15:01 +07:00
assert . EqualError ( t , errors [ 0 ] , errFmtSessionRedisHostRequired )
feat(session): add redis sentinel provider (#1768)
* feat(session): add redis sentinel provider
* refactor(session): use int for ports as per go standards
* refactor(configuration): adjust tests and validation
* refactor(configuration): add err format consts
* refactor(configuration): explicitly map redis structs
* refactor(session): merge redis/redis sentinel providers
* refactor(session): add additional checks to redis providers
* feat(session): add redis cluster provider
* fix: update config for new values
* fix: provide nil certpool to affected tests/mocks
* test: add additional tests to cover uncovered code
* docs: expand explanation of host and nodes relation for redis
* ci: add redis-sentinel to suite highavailability, add redis-sentinel quorum
* fix(session): sentinel password
* test: use redis alpine library image for redis sentinel, use expose instead of ports, use redis ip, adjust redis ip range, adjust redis config
* test: make entrypoint.sh executable, fix entrypoint.sh if/elif
* test: add redis failover tests
* test: defer docker start, adjust sleep, attempt logout before login, attempt visit before login and tune timeouts, add additional logging
* test: add sentinel integration test
* test: add secondary node failure to tests, fix password usage, bump test timeout, add sleep
* feat: use sentinel failover cluster
* fix: renamed addrs to sentineladdrs upstream
* test(session): sentinel failover
* test: add redis standard back into testing
* test: move redis standalone test to traefik2
* fix/docs: apply suggestions from code review
2021-03-10 06:03:05 +07:00
}
2019-04-25 04:52:08 +07:00
func TestShouldRaiseErrorWhenDomainNotSet ( t * testing . T ) {
validator := schema . NewStructValidator ( )
config := newDefaultSessionConfig ( )
config . Domain = ""
ValidateSession ( & config , validator )
feat(session): add redis sentinel provider (#1768)
* feat(session): add redis sentinel provider
* refactor(session): use int for ports as per go standards
* refactor(configuration): adjust tests and validation
* refactor(configuration): add err format consts
* refactor(configuration): explicitly map redis structs
* refactor(session): merge redis/redis sentinel providers
* refactor(session): add additional checks to redis providers
* feat(session): add redis cluster provider
* fix: update config for new values
* fix: provide nil certpool to affected tests/mocks
* test: add additional tests to cover uncovered code
* docs: expand explanation of host and nodes relation for redis
* ci: add redis-sentinel to suite highavailability, add redis-sentinel quorum
* fix(session): sentinel password
* test: use redis alpine library image for redis sentinel, use expose instead of ports, use redis ip, adjust redis ip range, adjust redis config
* test: make entrypoint.sh executable, fix entrypoint.sh if/elif
* test: add redis failover tests
* test: defer docker start, adjust sleep, attempt logout before login, attempt visit before login and tune timeouts, add additional logging
* test: add sentinel integration test
* test: add secondary node failure to tests, fix password usage, bump test timeout, add sleep
* feat: use sentinel failover cluster
* fix: renamed addrs to sentineladdrs upstream
* test(session): sentinel failover
* test: add redis standard back into testing
* test: move redis standalone test to traefik2
* fix/docs: apply suggestions from code review
2021-03-10 06:03:05 +07:00
assert . False ( t , validator . HasWarnings ( ) )
2019-04-25 04:52:08 +07:00
assert . Len ( t , validator . Errors ( ) , 1 )
2022-02-28 10:15:01 +07:00
assert . EqualError ( t , validator . Errors ( ) [ 0 ] , "session: option 'domain' is required" )
2019-04-25 04:52:08 +07:00
}
2020-04-04 06:11:33 +07:00
2020-06-07 22:47:02 +07:00
func TestShouldRaiseErrorWhenDomainIsWildcard ( t * testing . T ) {
validator := schema . NewStructValidator ( )
config := newDefaultSessionConfig ( )
config . Domain = "*.example.com"
ValidateSession ( & config , validator )
feat(session): add redis sentinel provider (#1768)
* feat(session): add redis sentinel provider
* refactor(session): use int for ports as per go standards
* refactor(configuration): adjust tests and validation
* refactor(configuration): add err format consts
* refactor(configuration): explicitly map redis structs
* refactor(session): merge redis/redis sentinel providers
* refactor(session): add additional checks to redis providers
* feat(session): add redis cluster provider
* fix: update config for new values
* fix: provide nil certpool to affected tests/mocks
* test: add additional tests to cover uncovered code
* docs: expand explanation of host and nodes relation for redis
* ci: add redis-sentinel to suite highavailability, add redis-sentinel quorum
* fix(session): sentinel password
* test: use redis alpine library image for redis sentinel, use expose instead of ports, use redis ip, adjust redis ip range, adjust redis config
* test: make entrypoint.sh executable, fix entrypoint.sh if/elif
* test: add redis failover tests
* test: defer docker start, adjust sleep, attempt logout before login, attempt visit before login and tune timeouts, add additional logging
* test: add sentinel integration test
* test: add secondary node failure to tests, fix password usage, bump test timeout, add sleep
* feat: use sentinel failover cluster
* fix: renamed addrs to sentineladdrs upstream
* test(session): sentinel failover
* test: add redis standard back into testing
* test: move redis standalone test to traefik2
* fix/docs: apply suggestions from code review
2021-03-10 06:03:05 +07:00
assert . False ( t , validator . HasWarnings ( ) )
2020-06-07 22:47:02 +07:00
assert . Len ( t , validator . Errors ( ) , 1 )
2022-02-28 10:15:01 +07:00
assert . EqualError ( t , validator . Errors ( ) [ 0 ] , "session: option 'domain' must be the domain you wish to protect not a wildcard domain but it is configured as '*.example.com'" )
2020-06-07 22:47:02 +07:00
}
2021-04-18 07:02:04 +07:00
func TestShouldRaiseErrorWhenSameSiteSetIncorrectly ( t * testing . T ) {
validator := schema . NewStructValidator ( )
config := newDefaultSessionConfig ( )
config . SameSite = "NOne"
ValidateSession ( & config , validator )
assert . False ( t , validator . HasWarnings ( ) )
assert . Len ( t , validator . Errors ( ) , 1 )
2022-02-28 10:15:01 +07:00
assert . EqualError ( t , validator . Errors ( ) [ 0 ] , "session: option 'same_site' must be one of 'none', 'lax', 'strict' but is configured as 'NOne'" )
2021-04-18 07:02:04 +07:00
}
func TestShouldNotRaiseErrorWhenSameSiteSetCorrectly ( t * testing . T ) {
validator := schema . NewStructValidator ( )
config := newDefaultSessionConfig ( )
validOptions := [ ] string { "none" , "lax" , "strict" }
for _ , opt := range validOptions {
config . SameSite = opt
ValidateSession ( & config , validator )
assert . False ( t , validator . HasWarnings ( ) )
assert . Len ( t , validator . Errors ( ) , 0 )
}
}
2020-04-04 06:11:33 +07:00
func TestShouldRaiseErrorWhenBadInactivityAndExpirationSet ( t * testing . T ) {
validator := schema . NewStructValidator ( )
config := newDefaultSessionConfig ( )
2020-05-02 23:20:40 +07:00
config . Inactivity = testBadTimer
config . Expiration = testBadTimer
2020-04-04 06:11:33 +07:00
ValidateSession ( & config , validator )
feat(session): add redis sentinel provider (#1768)
* feat(session): add redis sentinel provider
* refactor(session): use int for ports as per go standards
* refactor(configuration): adjust tests and validation
* refactor(configuration): add err format consts
* refactor(configuration): explicitly map redis structs
* refactor(session): merge redis/redis sentinel providers
* refactor(session): add additional checks to redis providers
* feat(session): add redis cluster provider
* fix: update config for new values
* fix: provide nil certpool to affected tests/mocks
* test: add additional tests to cover uncovered code
* docs: expand explanation of host and nodes relation for redis
* ci: add redis-sentinel to suite highavailability, add redis-sentinel quorum
* fix(session): sentinel password
* test: use redis alpine library image for redis sentinel, use expose instead of ports, use redis ip, adjust redis ip range, adjust redis config
* test: make entrypoint.sh executable, fix entrypoint.sh if/elif
* test: add redis failover tests
* test: defer docker start, adjust sleep, attempt logout before login, attempt visit before login and tune timeouts, add additional logging
* test: add sentinel integration test
* test: add secondary node failure to tests, fix password usage, bump test timeout, add sleep
* feat: use sentinel failover cluster
* fix: renamed addrs to sentineladdrs upstream
* test(session): sentinel failover
* test: add redis standard back into testing
* test: move redis standalone test to traefik2
* fix/docs: apply suggestions from code review
2021-03-10 06:03:05 +07:00
assert . False ( t , validator . HasWarnings ( ) )
2020-04-04 06:11:33 +07:00
assert . Len ( t , validator . Errors ( ) , 2 )
2022-02-28 10:15:01 +07:00
assert . EqualError ( t , validator . Errors ( ) [ 0 ] , "session: option 'expiriation' could not be parsed: could not parse '-1' as a duration" )
assert . EqualError ( t , validator . Errors ( ) [ 1 ] , "session: option 'inactivity' could not be parsed: could not parse '-1' as a duration" )
2020-04-04 06:11:33 +07:00
}
func TestShouldRaiseErrorWhenBadRememberMeDurationSet ( t * testing . T ) {
validator := schema . NewStructValidator ( )
config := newDefaultSessionConfig ( )
config . RememberMeDuration = "1 year"
ValidateSession ( & config , validator )
feat(session): add redis sentinel provider (#1768)
* feat(session): add redis sentinel provider
* refactor(session): use int for ports as per go standards
* refactor(configuration): adjust tests and validation
* refactor(configuration): add err format consts
* refactor(configuration): explicitly map redis structs
* refactor(session): merge redis/redis sentinel providers
* refactor(session): add additional checks to redis providers
* feat(session): add redis cluster provider
* fix: update config for new values
* fix: provide nil certpool to affected tests/mocks
* test: add additional tests to cover uncovered code
* docs: expand explanation of host and nodes relation for redis
* ci: add redis-sentinel to suite highavailability, add redis-sentinel quorum
* fix(session): sentinel password
* test: use redis alpine library image for redis sentinel, use expose instead of ports, use redis ip, adjust redis ip range, adjust redis config
* test: make entrypoint.sh executable, fix entrypoint.sh if/elif
* test: add redis failover tests
* test: defer docker start, adjust sleep, attempt logout before login, attempt visit before login and tune timeouts, add additional logging
* test: add sentinel integration test
* test: add secondary node failure to tests, fix password usage, bump test timeout, add sleep
* feat: use sentinel failover cluster
* fix: renamed addrs to sentineladdrs upstream
* test(session): sentinel failover
* test: add redis standard back into testing
* test: move redis standalone test to traefik2
* fix/docs: apply suggestions from code review
2021-03-10 06:03:05 +07:00
assert . False ( t , validator . HasWarnings ( ) )
2020-04-04 06:11:33 +07:00
assert . Len ( t , validator . Errors ( ) , 1 )
2022-02-28 10:15:01 +07:00
assert . EqualError ( t , validator . Errors ( ) [ 0 ] , "session: option 'remember_me_duration' could not be parsed: could not parse '1 year' as a duration" )
2020-04-04 06:11:33 +07:00
}
func TestShouldSetDefaultRememberMeDuration ( t * testing . T ) {
validator := schema . NewStructValidator ( )
config := newDefaultSessionConfig ( )
ValidateSession ( & config , validator )
feat(session): add redis sentinel provider (#1768)
* feat(session): add redis sentinel provider
* refactor(session): use int for ports as per go standards
* refactor(configuration): adjust tests and validation
* refactor(configuration): add err format consts
* refactor(configuration): explicitly map redis structs
* refactor(session): merge redis/redis sentinel providers
* refactor(session): add additional checks to redis providers
* feat(session): add redis cluster provider
* fix: update config for new values
* fix: provide nil certpool to affected tests/mocks
* test: add additional tests to cover uncovered code
* docs: expand explanation of host and nodes relation for redis
* ci: add redis-sentinel to suite highavailability, add redis-sentinel quorum
* fix(session): sentinel password
* test: use redis alpine library image for redis sentinel, use expose instead of ports, use redis ip, adjust redis ip range, adjust redis config
* test: make entrypoint.sh executable, fix entrypoint.sh if/elif
* test: add redis failover tests
* test: defer docker start, adjust sleep, attempt logout before login, attempt visit before login and tune timeouts, add additional logging
* test: add sentinel integration test
* test: add secondary node failure to tests, fix password usage, bump test timeout, add sleep
* feat: use sentinel failover cluster
* fix: renamed addrs to sentineladdrs upstream
* test(session): sentinel failover
* test: add redis standard back into testing
* test: move redis standalone test to traefik2
* fix/docs: apply suggestions from code review
2021-03-10 06:03:05 +07:00
assert . False ( t , validator . HasWarnings ( ) )
assert . False ( t , validator . HasErrors ( ) )
2020-04-04 06:11:33 +07:00
assert . Equal ( t , config . RememberMeDuration , schema . DefaultSessionConfiguration . RememberMeDuration )
}