summaryrefslogtreecommitdiffstats
path: root/app/models/mail_handler.rb
diff options
context:
space:
mode:
authorJean-Philippe Lang <jp_lang@yahoo.fr>2011-11-27 15:27:14 +0000
committerJean-Philippe Lang <jp_lang@yahoo.fr>2011-11-27 15:27:14 +0000
commit6076db74f17967e9b1a4d62d593d6c4b62deca0f (patch)
tree974e30c2b813cd9c095554b3632d458fd4086cc1 /app/models/mail_handler.rb
parentd136672fa37fbd1a6f2b4c06f60e831438ff1392 (diff)
downloadredmine-6076db74f17967e9b1a4d62d593d6c4b62deca0f.tar.gz
redmine-6076db74f17967e9b1a4d62d593d6c4b62deca0f.zip
Improved user creation from incoming email.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@7952 e93f8b46-1217-0410-a6f0-8f06a7374b81
Diffstat (limited to 'app/models/mail_handler.rb')
-rw-r--r--app/models/mail_handler.rb61
1 files changed, 46 insertions, 15 deletions
diff --git a/app/models/mail_handler.rb b/app/models/mail_handler.rb
index 5e8220c96..221b7885e 100644
--- a/app/models/mail_handler.rb
+++ b/app/models/mail_handler.rb
@@ -61,7 +61,7 @@ class MailHandler < ActionMailer::Base
when 'accept'
@user = User.anonymous
when 'create'
- @user = MailHandler.create_user_from_email(email)
+ @user = create_user_from_email(email)
if @user
logger.info "MailHandler: [#{@user.login}] account created" if logger && logger.info
Mailer.deliver_account_information(@user, @user.password)
@@ -322,22 +322,53 @@ class MailHandler < ActionMailer::Base
@full_sanitizer ||= HTML::FullSanitizer.new
end
- # Creates a user account for the +email+ sender
- def self.create_user_from_email(email)
+ def self.assign_string_attribute_with_limit(object, attribute, value)
+ limit = object.class.columns_hash[attribute.to_s].limit || 255
+ value = value.to_s.slice(0, limit)
+ object.send("#{attribute}=", value)
+ end
+
+ # Returns a User from an email address and a full name
+ def self.new_user_from_attributes(email_address, fullname=nil)
+ user = User.new
+
+ # Truncating the email address would result in an invalid format
+ user.mail = email_address
+ assign_string_attribute_with_limit(user, 'login', email_address)
+
+ names = fullname.blank? ? email_address.gsub(/@.*$/, '').split('.') : fullname.split
+ assign_string_attribute_with_limit(user, 'firstname', names.shift)
+ assign_string_attribute_with_limit(user, 'lastname', names.join(' '))
+ user.lastname = '-' if user.lastname.blank?
+
+ password_length = [Setting.password_min_length.to_i, 10].max
+ user.password = ActiveSupport::SecureRandom.hex(password_length / 2 + 1)
+ user.language = Setting.default_language
+
+ unless user.valid?
+ user.login = "user#{ActiveSupport::SecureRandom.hex(6)}" if user.errors.on(:login)
+ user.firstname = "-" if user.errors.on(:firstname)
+ user.lastname = "-" if user.errors.on(:lastname)
+ end
+
+ user
+ end
+
+ # Creates a User for the +email+ sender
+ # Returns the user or nil if it could not be created
+ def create_user_from_email(email)
addr = email.from_addrs.to_a.first
if addr && !addr.spec.blank?
- user = User.new
- user.mail = addr.spec
-
- names = addr.name.blank? ? addr.spec.gsub(/@.*$/, '').split('.') : addr.name.split
- user.firstname = names.shift
- user.lastname = names.join(' ')
- user.lastname = '-' if user.lastname.blank?
-
- user.login = user.mail
- user.password = ActiveSupport::SecureRandom.hex(5)
- user.language = Setting.default_language
- user.save ? user : nil
+ user = self.class.new_user_from_attributes(addr.spec, addr.name)
+ if user.save
+ user
+ else
+ logger.error "MailHandler: failed to create User: #{user.errors.full_messages}" if logger
+ nil
+ end
+ else
+ logger.error "MailHandler: failed to create User: no FROM address found" if logger
+ nil
end
end