Новая регистрация с old email, включающим +, не работает в REST API

Похоже, что в одном из последних обновлений отключена возможность регистрации с тем же адресом электронной почты, включающим символ «+» для обозначения нового адреса. Моя система сильно зависит от этой функции. Как её снова включить?

Например, если я уже зарегистрировался с адресом email@gmail.com, я не могу зарегистрироваться с адресом email+1@gmail.com.

Кстати, я тестирую это через REST API.

Также у меня не отмечена эта опция:

Полагаю, это настройка администратора нормализация адресов электронной почты: :+1:

Редактирование: Я не увидел это редактирование до публикации. :slight_smile:

Да, у меня она уже отключена.

У меня не получается воспроизвести это на try.discourse.org.

Можете ли вы зарегистрироваться через обычный интерфейс с этим адресом электронной почты?

Также проверьте, не использовался ли уже адрес электронной почты с +1 для регистрации.

Да, обычный интерфейс подходит. REST API не подходит.

Я сделал точно так же, но не смог воспроизвести проблему на актуальном коде, работающем в продакшене — всё работало как ожидалось при отключённой настройке normalize emails:

Можете показать вывод этих команд из консоли Rails:

[1] pry(main)> SiteSetting.normalize_emails

[2] pry(main)> User.find_by_email('YOURUSERNAME@gmail.com').username

[3] pry(main)> User.find_by_email('YOURUSERNAME+1@gmail.com').username

Также, какая у вас версия Discourse?

Возможно, стоит ещё раз проверить, что вы обращаетесь к продакшн-сайту, а не к тестовому (или наоборот).

Я только что обновился.

Вот он.

Как переводятся эти слова?

(и можно ли их скопировать и вставить сюда)

Надо было спросить об этом сначала :man_facepalming:

«Основная электронная почта не разрешена».

Это перевод для user.email.blocked

хм

похоже, что нормализованный адрес электронной почты заблокирован. :thinking:

Я имею в виду, что если email@gmail.com заблокирован, то и email+1@gmail.com тоже заблокирован. Это странно для меня, когда у меня не выбрана опция нормализации электронной почты.

Вот почему мне стоило сначала спросить, а не предполагать, что это «уже занято» :rofl:

Какие у вас переопределённые настройки в категориях «Электронная почта» и «Пользователи»?

Вы заблокировали этот адрес электронной почты или, например, домен Gmail?

Я не понял этого. Где мне это проверить?

Да, я вижу, что нормализованный адрес электронной почты заблокирован.

В данном случае мы почти наверняка блокируем подадреса заблокированных адресов, независимо от настройки, в качестве меры против вредительства, поскольку опция нормализации не является настройкой по умолчанию.

«Показывать только переопределённые» в настройках. Но теперь я подозреваю, что нам не стоит об этом беспокоиться.

Вернувшись к своему рабочему столу, я изучил фактический код, отвечающий за этот отказ:

Сразу в начале мы проверяем канонический адрес электронной почты на соответствие чёрному списку:

  def self.canonical(email)
    name, domain = email.split("@", 2)
    name = name.gsub(/\+.*/, "")
    name = name.gsub(".", "") if %w[gmail.com googlemail.com].include?(domain.downcase)
    "#{name}@#{domain}".downcase
  end

И даже если это не сработает, проверка будет выполнена с помощью алгоритма расстояния Левенштейна Levenshtein distance здесь:

[1] pry(main)> ScreenedEmail.levenshtein('fakezabanshenas@gmail.com', 'fakezabanshenas+1@gmail.com')
=> 2

поскольку значение по умолчанию для SiteSetting.levenshtein_distance_spammer_emails равно 2.