Browse Source

Add support for IDN (internationalized domain name) email addresses in user accounts (#29208).

Patch by Go MAEDA (@maeda).


git-svn-id: https://svn.redmine.org/redmine/trunk@22667 e93f8b46-1217-0410-a6f0-8f06a7374b81
pull/145/merge
Go MAEDA 3 months ago
parent
commit
4517a4684e
2 changed files with 17 additions and 1 deletions
  1. 11
    1
      app/models/email_address.rb
  2. 6
    0
      test/unit/email_address_test.rb

+ 11
- 1
app/models/email_address.rb View File

@@ -39,7 +39,17 @@ class EmailAddress < ApplicationRecord
safe_attributes 'address'

def address=(arg)
write_attribute(:address, arg.to_s.strip)
normalized_address = arg.to_s.strip

# Convert internationalized domain name (IDN) to Punycode
# e.g. 'marie@société.example' => 'marie@xn--socit-esab.example'
local_part, _at, domain = normalized_address.partition('@')
if domain.present?
ascii_domain = Addressable::IDNA.to_ascii(domain)
normalized_address = "#{local_part}@#{ascii_domain}"
end

write_attribute(:address, normalized_address)
end

def destroy

+ 6
- 0
test/unit/email_address_test.rb View File

@@ -68,4 +68,10 @@ class EmailAddressTest < ActiveSupport::TestCase
def test_should_reject_invalid_email
assert_not EmailAddress.new(address: 'invalid,email@example.com').valid?
end

def test_should_normalize_idn_email_address
email = EmailAddress.new(address: 'marie@société.example')
assert_equal 'marie@xn--socit-esab.example', email.address
assert email.valid?
end
end

Loading…
Cancel
Save