Commit 5187e888aefd23255e4eec996b9ea44c24f64ee8
Committed by
Rodrigo Souto
1 parent
131516d4
Exists in
master
and in
29 other branches
Avoid infinite loop on username suggestion
Showing
2 changed files
with
22 additions
and
2 deletions
Show diff stats
app/helpers/account_helper.rb
| @@ -15,12 +15,17 @@ module AccountHelper | @@ -15,12 +15,17 @@ module AccountHelper | ||
| 15 | 15 | ||
| 16 | def suggestion_based_on_username(requested_username='') | 16 | def suggestion_based_on_username(requested_username='') |
| 17 | return "" if requested_username.empty? | 17 | return "" if requested_username.empty? |
| 18 | + | ||
| 19 | + requested_username = requested_username.downcase.tr("^#{Profile::IDENTIFIER_FORMAT}", '') | ||
| 18 | usernames = [] | 20 | usernames = [] |
| 21 | + tries = 0 | ||
| 19 | 3.times do | 22 | 3.times do |
| 20 | begin | 23 | begin |
| 21 | valid_name = requested_username + rand(1000).to_s | 24 | valid_name = requested_username + rand(1000).to_s |
| 22 | - end while (usernames.include?(valid_name) || !Person.is_available?(valid_name, environment)) | ||
| 23 | - usernames << valid_name | 25 | + tries += 1 |
| 26 | + invalid = usernames.include?(valid_name) || !Person.is_available?(valid_name, environment) | ||
| 27 | + end while tries <= 10 && invalid | ||
| 28 | + usernames << valid_name unless invalid | ||
| 24 | end | 29 | end |
| 25 | usernames | 30 | usernames |
| 26 | end | 31 | end |
test/unit/account_helper_test.rb
| @@ -18,4 +18,19 @@ class AccountHelperTest < ActiveSupport::TestCase | @@ -18,4 +18,19 @@ class AccountHelperTest < ActiveSupport::TestCase | ||
| 18 | end | 18 | end |
| 19 | end | 19 | end |
| 20 | 20 | ||
| 21 | + should 'remove chars which are not allowed' do | ||
| 22 | + stubs(:environment).returns(Environment.default) | ||
| 23 | + suggestions = suggestion_based_on_username('z/%&#e') | ||
| 24 | + suggestions.each do |suggestion| | ||
| 25 | + assert_no_match /.*%&#.*/, suggestion | ||
| 26 | + end | ||
| 27 | + end | ||
| 28 | + | ||
| 29 | + should 'return empty suggestions if do not find any identifier available' do | ||
| 30 | + stubs(:environment).returns(Environment.default) | ||
| 31 | + Person.stubs(:is_available?).returns(false) | ||
| 32 | + suggestions = suggestion_based_on_username('z/%&#e') | ||
| 33 | + assert_equal [], suggestions | ||
| 34 | + end | ||
| 35 | + | ||
| 21 | end | 36 | end |