Skip to content

Add password validation for email auth - #265

Open
Georgon wants to merge 1 commit into
mainfrom
email-password-fix
Open

Add password validation for email auth#265
Georgon wants to merge 1 commit into
mainfrom
email-password-fix

Conversation

@Georgon

@Georgon Georgon commented Aug 13, 2026

Copy link
Copy Markdown

Введена новая политика пароля:

  • 8–32 символов

Разрешены:

  • A-Z, a-z, 0-9 и стандартные ASCII-спецсимволы, например: ! @ # $ % ^ & * ( ) _ + - = [ ] { } ; : , . / ? и т. д.

Запрещены пробелы, \n, \t, кириллица, буквы с диакритикой и вообще символы вне ASCII.

При этом я специально не применял новые ограничения к паролю при логине и к полю старого пароля при смене. Это важно для обратной совместимости: пользователь, зарегистрированный раньше с паролем вроде пароль123, по-прежнему сможет войти. Но установить такой пароль заново уже нельзя.

Основные изменения хранятся в auth_backend/schemas/types/password.py - новый файл, где централизовано хранятся условия на пароль: PASSWORD_MIN_LENGTH = 8, PASSWORD_MAX_LENGTH = 128, набор разрешённых символов, validate_password() и Pydantic-тип Password. В OpenAPI добавлены minLength, maxLength, pattern, format=password и текстовое описание требований.
Создание пользователя через CLI теперь тоже не позволяет обойти политику пароля.
Добавлены новые тесты: tests/test_unit/test_password.py - проверяются длина, Unicode, пробел, \n, \t, все ASCII-спецсимволы и данные, которые попадут в OpenAPI; tests/test_routes/test_registration.py и test_change_password.py - добавлены проверки, что короткие и недопустимые пароли дают 422.

Также изменен README и Makefile под новые правила пароля.

Closes #246

@Georgon Georgon self-assigned this Aug 13, 2026
@Georgon
Georgon requested a review from petrCher August 13, 2026 18:23
@github-actions

Copy link
Copy Markdown

Code Coverage

Coverage Report
FileStmtsMissCoverMissing
auth_backend
   __main__.py330%1–4
   base.py12467%6–9
   exceptions.py45687%32, 50–52, 57, 78
auth_backend/admin
   admin.py973762%17, 38, 41, 44–48, 51–55, 58–60, 91, 94, 97–102, 105–113, 116–117, 147, 150, 153–156
   auth.py412929%14–24, 27–31, 34–35, 39–49
   filter.py171135%13–24
auth_backend/auth_method
   base.py63494%51, 53, 60, 142
   method_mixins.py32294%27, 50
   oauth.py561770%37, 43, 48–53, 57–68, 94–99
   outer.py1142975%26, 33, 40, 47, 98, 104, 113, 167–172, 185–193, 205–211
   userdata_mixin.py19574%32, 37–40
auth_backend/auth_plugins
   airflow.py331652%25–36, 41–64
   authentic.py19010346%52–64, 69–82, 86–101, 105–111, 115–121, 128–130, 140–196, 203–253, 258, 263–264, 274–281, 310–316, 325, 330–340, 345–358
   coder.py321650%24–33, 38–51
   email.py2561495%91, 248, 333, 335, 340, 351–357, 404, 445, 496, 506
   github.py1046339%56–115, 129–173, 183, 188, 194–206
   google.py1126443%64–123, 137–165, 175, 181–185, 189–194, 198–207
   keycloak.py1046240%52–114, 124–174, 184, 189, 195–200
   lkmsu.py16411232%59–112, 130–168, 178–200, 205, 210, 216–226, 230–244, 248–277, 281–290
   mailu.py341847%24–33, 38–53
   postgres.py432053%28–34, 39–45, 50–62
   telegram.py1035448%57–84, 99–117, 130, 138, 146–166, 171–185
   vk.py1288236%70–122, 136–174, 184, 189, 195–212, 219–245
   yandex.py1278335%57–127, 140–178, 189, 195, 201–227
auth_backend/cli
   group.py13130%1–17
   process.py56560%1–71
   scope.py11110%1–20
   user.py22220%1–42
   user_group.py12120%1–25
auth_backend/kafka
   kafka.py502060%29–32, 41–43, 55–58, 71–81, 84, 92, 102
   kafkameta.py9278%8, 12
auth_backend/models
   base.py83594%79, 100–102, 106
   db.py152895%46, 55, 59, 120, 214, 223, 227, 240
   dynamic_settings.py27774%24–31
auth_backend/routes
   base.py37295%25–26
   exc_handlers.py43686%31, 56, 69, 95, 117, 125
   groups.py92397%81, 148, 150
   oidc.py34197%93
   scopes.py39392%16, 55–56
   user.py972772%52, 54, 56–65, 71–77, 89–109, 162, 172
   user_session.py84693%79–88, 118, 120, 181, 188
auth_backend/schemas
   models.py100397%150–152
auth_backend/schemas/types
   scopes.py24675%30–32, 37, 40, 42
auth_backend/utils
   jwt.py57788%34–41
   oidc_token.py37878%26, 39–43, 48, 74
   security.py46296%40, 65
   smtp.py781976%75–78, 100–120
   string.py7186%12
   user_session_control.py41295%32, 40
TOTAL3336110667% 

Summary

Tests Skipped Failures Errors Time
82 6 💤 0 ❌ 0 🔥 25.330s ⏱️

@petrCher petrCher removed this from Viribus Team Aug 14, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Поле пароль при регистрации не имеет требований

2 participants