diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -1,8 +1,9 @@ -require 'pony' +require 'tmail' +require 'net/smtp' class UsersController < ApplicationController - before_filter :authenticate, :except => [:new, :register] + before_filter :authenticate, :except => [:new, :register, :confirm] verify :method => :post, :only => [:chg_passwd], :redirect_to => { :action => :index } @@ -40,17 +41,76 @@ @user.password_confirmation = @user.password = User.random_password @user.activated = false if (@user.valid?) and (@user.save) - send_confirmation_email(@user) - render :action => 'new_splash', :layout => 'empty' + if send_confirmation_email(@user) + render :action => 'new_splash', :layout => 'empty' + else + render :action => 'email_error', :layout => 'empty' + end else @user.errors.add_to_base("Email cannot be blank") if @user.email=='' render :action => 'new', :layout => 'empty' end end + def confirm + login = params[:login] + key = params[:activation] + user = User.find_by_login(login) + if (user) and (user.verify_activation_key(key)) + if user.valid? # check uniquenss of email + user.activated = true + user.save + @result = :successful + else + @result = :email_used + end + else + @result = :failed + end + render :action => 'confirm', :layout => 'empty' + end + protected def send_confirmation_email(user) + contest_name = Configuration['contest.name'] + activation_url = url_for(:action => 'confirm', + :login => user.login, + :activation => user.activation_key) + home_url = url_for(:controller => 'main', :action => 'index') + mail = TMail::Mail.new + mail.to = user.email + mail.from = Configuration['system.online_registration.from'] + mail.subject = "[#{contest_name}] Confirmation" + mail.body = <<-EOF +Hello #{user.full_name}, + +You have registered for #{contest_name} (#{home_url}). + +Your login is: #{user.login} +Your password is: #{user.password} + +Please follow the link: +#{activation_url} +to activate your user account. + +If you did not register, please ignore this e-mail. + +Thanks! +EOF + + smtp_server = Configuration['system.online_registration.smtp'] + + begin + Net::SMTP.start(smtp_server) do |smtp| + smtp.send_message(mail.to_s, mail.from, mail.to) + end + result = true + rescue + result = false + end + + return result end end