security:
    password_hashers:
        App\Entity\User: auto

    providers:
        chain_provider:
            chain:
                providers: [kimai_internal,kimai_ldap]
        kimai_internal:
            entity:
                class: App\Entity\User
        kimai_ldap:
            id: App\Ldap\LdapUserProvider

    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false

        api:
            access_token:
                token_handler: App\API\Authentication\AccessTokenHandler
                success_handler: App\API\Authentication\AccessTokenSuccessHandler
                remember_me: false
            request_matcher: App\API\Authentication\ApiRequestMatcher
            user_checker: App\Security\UserChecker
            stateless: true
            remember_me: false
            provider: chain_provider
            custom_authenticators:
                - App\API\Authentication\TokenAuthenticator

        secured_area:
            kimai_ldap: ~
            pattern: ^/
            user_checker: App\Security\UserChecker
            stateless: false

            entry_point: form_login

            custom_authenticators:
                - App\Saml\SamlAuthenticator

            remember_me:
                secret: '%kernel.secret%'
                lifetime: 604800
                path: /
                always_remember_me: true

            # activate all configured user provider
            provider: chain_provider

            form_login:
                check_path: security_check
                login_path: login
                enable_csrf: true

            two_factor:
                auth_form_path: 2fa_login
                check_path: 2fa_login_check
                remember_me_sets_trusted: true

            logout:
                path: logout
                target: homepage
                enable_csrf: false

            login_throttling:
                max_attempts: 5
                interval: '5 minutes'

            login_link:
                check_route: link_login_check
                signature_properties: ['id']
                lifetime: 900
                max_uses: 3

    access_decision_manager:
        # only grants access if there is no voter denying access
        strategy: unanimous
        allow_if_all_abstain: false

    role_hierarchy:
        ROLE_USER:        ~
        ROLE_TEAMLEAD:    ROLE_USER
        ROLE_ADMIN:       ROLE_TEAMLEAD
        ROLE_SUPER_ADMIN: ROLE_ADMIN

    access_control:
        - { path: '^/auth/2fa', role: IS_AUTHENTICATED_2FA_IN_PROGRESS }
        - { path: '^/auth', roles: PUBLIC_ACCESS }
        - { path: '^/{_locale}$', role: PUBLIC_ACCESS }
        - { path: '^/{_locale}/auth', role: PUBLIC_ACCESS }
        - { path: '^/{_locale}/login', role: PUBLIC_ACCESS }
        - { path: '^/{_locale}/register', role: PUBLIC_ACCESS }
        - { path: '^/{_locale}/resetting', role: PUBLIC_ACCESS }
        - { path: '^/{_locale}/', roles: ROLE_USER }
        - { path: '^/api', roles: IS_AUTHENTICATED }

when@test:
    # this configuration simplifies testing URLs protected by the security mechanism
    # See https://symfony.com/doc/current/cookbook/testing/http_authentication.html
    security:
        password_hashers:
            App\Entity\User:
                algorithm: auto
                # see https://github.com/symfony/recipes/pull/1026
                cost: 4 # Lowest possible value for bcrypt
                time_cost: 3 # Lowest possible value for argon
                memory_cost: 10 # Lowest possible value for argon
