Skip to content

Added email verification - #267

Open
ArtemBratyashin wants to merge 9 commits into
mainfrom
email_validation_fix
Open

ArtemBratyashin wants to merge 9 commits into
mainfrom
email_validation_fix

Conversation

@ArtemBratyashin

Copy link
Copy Markdown
Contributor

Изменения

Добавил проверку email.

Детали реализации

Функция расширена и в ней добавлено больше условий

Check-List

  • Вы проверили свой код перед отправкой запроса?
  • Вы написали тесты к реализованным функциям?
  • Вы не забыли применить форматирование black и isort для Back-End или Prettier для Front-End?

@github-actions

github-actions Bot commented Sep 16, 2026 •

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.py2772292%36, 47, 49, 51, 54, 58, 62–63, 95, 252, 337, 339, 344, 355–361, 408, 449, 500, 510
   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.py20200%1–40
   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.py100397%92, 163, 165
   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
TOTAL3336111267% 

Summary

Tests Skipped Failures Errors Time
73 6 💤 0 ❌ 0 🔥 13.492s ⏱️

@ArtemBratyashin ArtemBratyashin self-assigned this Sep 16, 2026
@ArtemBratyashin ArtemBratyashin linked an issue Sep 16, 2026 that may be closed by this pull request
@petrCher

Copy link
Copy Markdown
Member
Снимок экрана — 2026-09-23 в 16 08 49 держи ревью клода, переделай что он говорит, он правильно отревьюил)

@petrCher petrCher left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ArtemBratyashin отредачь эти правки и сделаю мердж

assert reset_token_1 != reset_token_2


def test_legacy_email_case_insensitive_lookup(client_auth: TestClient, dbsession: Session, user_id: int):

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

обьявлен дважды

assert response.status_code == status.HTTP_200_OK


def test_legacy_email_case_insensitive_lookup(client_auth: TestClient, dbsession: Session, user_id: int):

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

объявлен дважды


class EmailChange(Base):
email: Annotated[str, MinLen(1)]

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ты снял с EmailChange проверку на валидатор почты, то есть при смене можно что угодно задать

json={"email": "legacy@localhost"},
headers={"Authorization": login["token"]},
)
assert response.status_code == status.HTTP_200_OK

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

в тесте же у домена нет доменной зоны например .com
поэтому 200 при правильном сценарии нельзя получить; сейчас тест пройден, так как отключена проверка в EmailChange
если ее включить тест должен 422 отдавать

if set(v) & restricted:
raise ValueError()
return v
def check_email(v, validate: bool):

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

коммент от клода (согласен с ним)

check_email: ручные проверки дублируют validate_email — он сам режет все кейсы из issue (@gmail.com, user@, @, пробелы, кириллицу). Параметр validate не нужен: с False функцию никто не вызывает, и лямбда есть только ради него. Оставь так:

def check_email(v: str) -> str:
    try:
        return validate_email(v, check_deliverability=False, allow_smtputf8=False).normalized
    except EmailNotValidError as exc:
        raise ValueError("Invalid email address") from exc

Подключай без лямбды, через email_validator = field_validator("email")(check_email), в двух схемах:

  • EmailRegister — регистрация
  • EmailChange — смена почты (новый адрес)

В EmailLogin и RequestResetForgottenPassword валидатор не нужен: там ищем уже существующую почту, и старые адреса должны проходить.

@petrCher

petrCher commented Oct 31, 2026 •

Copy link
Copy Markdown
Member

проблема с тестами:

Тесты падают не из-за PR: SQLAlchemy без версии в requirements подтянулась 2.1 (последняя), а там greenlet больше не ставится по умолчанию — sqladmin падает на импорте.

Временный фикс для этого пр: в requirements.txt заменить SQLAlchemy на SQLAlchemy[asyncio]. psycopg[binary] правильно что добавил, но это только часть проблемы чинит)

This branch has not been deployed

No deployments
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.

Проблемы с Email

2 participants