Started POST "/u/create_second_factor_totp.json" for 209.249.35.130 at 2020-02-19 14:21:20 +0000
Processing by UsersController#create_second_factor_totp as JSON
Completed 500 Internal Server Error in 5ms (ActiveRecord: 0.0ms | Allocations: 1781)
Addressable::URI::InvalidURIError (Invalid scheme format: Our Great Forum)
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/addressable-2.7.0/lib/addressable/uri.rb:901:in `scheme='
Rendering text template
Rendered text template (Duration: 0.0ms | Allocations: 1)
«Our Great Forum» — это почти заголовок форума в настройках системы. Фактическое значение выглядит примерно так: «Our Great Forum: Our fine tagline», поэтому в логе отображается только часть до двоеточия. Я не вижу «Our Great Forum» больше нигде в настройках системы, поэтому меня смущает, почему она там появилась без части : tagline в логе.
Вздох. Это версия 2.4.0.beta10 (6301477b4c). Я обновлю систему и попрошу их попробовать снова. Если удастся заставить пользователя повторить попытку на последней версии, я отредактирую это сообщение.
В логах я вижу только это. Стек вызовов не отображается. Однако ошибка возникает сразу после нажатия на «Новый аутентификатор» в разделе «Аутентификаторы на основе токенов».
И после последнего обновления ситуация осталась прежней.
Можешь скопировать запрос как curl и опубликовать его (удалив любые PII и токены/nonce), чтобы мы могли понять, проблема на стороне клиента или сервера?
diff --git a/spec/components/concern/second_factor_manager_spec.rb b/spec/components/concern/second_factor_manager_spec.rb
index 36e4f066ce..a657a0fdc8 100644
--- a/spec/components/concern/second_factor_manager_spec.rb
+++ b/spec/components/concern/second_factor_manager_spec.rb
@@ -47,6 +47,18 @@ RSpec.describe SecondFactorManager do
"otpauth://totp/#{SiteSetting.title}:#{user.email}?secret=#{user_second_factor_totp.data}&issuer=#{SiteSetting.title}"
)
end
+ it 'должен обрабатывать двоеточие в названии сайта' do
+ SiteSetting.title = 'Spaceballs: The Discourse'
+ expect(user.user_second_factors.totps.first.totp_provisioning_uri).to eq(
+ "otpauth://totp/#{URI::escape SiteSetting.title}:#{user.email}?secret=#{user_second_factor_totp.data}&issuer=#{CGI::escape SiteSetting.title}"
+ )
+ end
+ it 'должен обрабатывать пробел перед двоеточием в названии сайта' do
+ SiteSetting.title = 'Our Spaceballs: The Discourse'
+ expect(user.user_second_factors.totps.first.totp_provisioning_uri).to eq(
+ "otpauth://totp/#{URI::escape SiteSetting.title}:#{user.email}?secret=#{user_second_factor_totp.data}&issuer=#{CGI::escape SiteSetting.title}"
+ )
+ end
end
describe '#authenticate_totp' do
→ RAILS_ENV=test rspec ./spec/components/concern/second_factor_manager_spec.rb
Рандомизировано с сидом 47333
...................F......................
Ошибки:
1) SecondFactorManager#totp_provisioning_uri должен обрабатывать пробел перед двоеточием в названии сайта
Failure/Error: totp_object.provisioning_uri(user.email)
Addressable::URI::InvalidURIError:
Неверный формат схемы: Our Spaceballs
# /home/michael/.rvm/gems/ruby-2.6.3/gems/addressable-2.7.0/lib/addressable/uri.rb:901:in `scheme='
# /home/michael/.rvm/gems/ruby-2.6.3/gems/addressable-2.7.0/lib/addressable/uri.rb:826:in `block in initialize'
# /home/michael/.rvm/gems/ruby-2.6.3/gems/addressable-2.7.0/lib/addressable/uri.rb:2392:in `defer_validation'
# /home/michael/.rvm/gems/ruby-2.6.3/gems/addressable-2.7.0/lib/addressable/uri.rb:823:in `initialize'
# /home/michael/.rvm/gems/ruby-2.6.3/gems/addressable-2.7.0/lib/addressable/uri.rb:138:in `new'
# /home/michael/.rvm/gems/ruby-2.6.3/gems/addressable-2.7.0/lib/addressable/uri.rb:138:in `parse'
# /home/michael/.rvm/gems/ruby-2.6.3/gems/addressable-2.7.0/lib/addressable/uri.rb:607:in `encode'
# /home/michael/.rvm/gems/ruby-2.6.3/gems/rotp-5.1.0/lib/rotp/totp.rb:61:in `provisioning_uri'
# ./app/models/user_second_factor.rb:32:in `totp_provisioning_uri'
# ./spec/components/concern/second_factor_manager_spec.rb:58:in `block (3 levels) in <top (required)>'
Завершено за 0.75471 секунды (файлы загружены за 2.18 секунды)
42 примера, 1 ошибка
Неудачные примеры:
rspec ./spec/components/concern/second_factor_manager_spec.rb:56 # SecondFactorManager#totp_provisioning_uri должен обрабатывать пробел перед двоеточием в названии сайта
Рандомизировано с сидом 47333
Смена издателя изменяет значения токенов, но ранее система полностью ломалась при наличии двоеточия, так что это не должно нарушать работу для новых пользователей.
Обратите внимание, что ранее это работало для заголовков с двоеточием, например Spaceballs: The Discourse (у меня всё работало отлично, и я мог добавить его на телефон), но давало сбой, если перед двоеточием было два слова.
(извините, если в моём отчёте это было не совсем ясно)
У меня нет подтверждения, что это сработало для пользователя, который жаловался, но у меня всё работает.
Однако я не понимаю следующее:
Это всегда было нерабочим для заголовков, содержащих :.
Если заголовок сайта меняется, аутентификатор перестаёт работать, так как он привязан к заголовку сайта.
SiteSettings.title давно не менялся.
UserSecondFactor.where(method: 1) возвращает множество записей за прошлый август.
Как всё это может быть правдой одновременно? Неужели изменение заголовка сайта сломало все существующие аутентификаторы UserSecondFactor? РЕДАКТИРОВАНО: Нет, это не так. Я только что изменил заголовок, и аутентификатор 2FA, который я создал вчера, всё ещё работает.
Что ж, я почти уверен, что заголовок уже давно состоял из нескольких слов и двоеточия (в логах изменений не было как минимум с мая 2019 года), и что он работал ещё в прошлом августе (поскольку тогда были сгенерированы токены аутентификации), но что есть, то есть. Похоже, сейчас всё работает, и изменение заголовка не ломает существующие токены, так что это можно считать победой.