# /etc/freeradius/3.0/sites-enabled/default
server default {
    listen {
        type = auth
        ipaddr = *
        port = 1812
    }

    authorize {
        ldap
        
        if (fail) {
            reject
        }
        
        if (noop) {
            reject
        }
        
        # Сохраняем группы
        update control {
            &Class := "%{control:LDAP-Group[*]}"
        }
        
        # Определяем Auth-Type в зависимости от наличия State
        if (State) {
            # Если есть State, значит это второй запрос - проверяем OTP
            update control {
                Auth-Type := OTP
            }
        } else {
            # Если нет State, значит это первый запрос - проверяем LDAP
            update control {
                Auth-Type := LDAP
            }
        }
    }

    authenticate {
        # Первый фактор: проверка пароля через LDAP
        Auth-Type LDAP {
            ldap
            if (!ok) {
                reject
            }
            
            # После успешной LDAP-аутентификации отправляем challenge для OTP
            update reply {
                State := "0x%{randstr:aaaaaaaaaaaaaaa}"
                Reply-Message := "Please enter TOTP code"
            }
            challenge
        }
        
        # Второй фактор: проверка OTP
        Auth-Type OTP {
            validate_otp
            if (!ok) {
                reject
            }

            # Возвращаем все группы
            update reply {
                &Class := "%{control:Class[*]}"
            }

            ok
        }
    }

    post-auth {
        # Дополнительные действия можно здесь, например логирование
    }
}
