Description:
fix pop3 authen
Commit status:
[Not Reviewed]
References:
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r395:52cd3037bb5e - - 1 file changed: 2 inserted, 1 deleted

@@ -1,163 +1,164
1 1 require 'digest/sha1'
2 2 require 'net/pop'
3 3
4 4 class User < ActiveRecord::Base
5 5
6 6 has_and_belongs_to_many :roles
7 7
8 8 has_many :test_requests, :order => "submitted_at DESC"
9 9
10 10 has_many :messages,
11 11 :class_name => "Message",
12 12 :foreign_key => "sender_id",
13 13 :order => 'created_at DESC'
14 14
15 15 has_many :replied_messages,
16 16 :class_name => "Message",
17 17 :foreign_key => "receiver_id",
18 18 :order => 'created_at DESC'
19 19
20 20 has_one :contest_stat, :class_name => "UserContestStat", :dependent => :destroy
21 21
22 22 belongs_to :site
23 23 belongs_to :country
24 24
25 25 has_and_belongs_to_many :contests, :uniq => true, :order => 'name'
26 26
27 27 scope :activated_users, :conditions => {:activated => true}
28 28
29 29 validates_presence_of :login
30 30 validates_uniqueness_of :login
31 31 validates_format_of :login, :with => /^[\_A-Za-z0-9]+$/
32 32 validates_length_of :login, :within => 3..30
33 33
34 34 validates_presence_of :full_name
35 35 validates_length_of :full_name, :minimum => 1
36 36
37 37 validates_presence_of :password, :if => :password_required?
38 38 validates_length_of :password, :within => 4..20, :if => :password_required?
39 39 validates_confirmation_of :password, :if => :password_required?
40 40
41 41 validates_format_of :email,
42 42 :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i,
43 43 :if => :email_validation?
44 44 validate :uniqueness_of_email_from_activated_users,
45 45 :if => :email_validation?
46 46 validate :enough_time_interval_between_same_email_registrations,
47 47 :if => :email_validation?
48 48
49 49 # these are for ytopc
50 50 # disable for now
51 51 #validates_presence_of :province
52 52
53 53 attr_accessor :password
54 54
55 55 before_save :encrypt_new_password
56 56 before_save :assign_default_site
57 57 before_save :assign_default_contest
58 58
59 59 # this is for will_paginate
60 60 cattr_reader :per_page
61 61 @@per_page = 50
62 62
63 63 def self.authenticate(login, password)
64 64 user = find_by_login(login)
65 65 return user if user && user.authenticated?(password)
66 - if user.authenticated_by_pop3?(password)
66 + if user && user.authenticated_by_pop3?(password)
67 67 user.password = password
68 + user.save
68 69 return user
69 70 end
70 71 end
71 72
72 73 def authenticated?(password)
73 74 if self.activated
74 75 hashed_password == User.encrypt(password,self.salt)
75 76 else
76 77 false
77 78 end
78 79 end
79 80
80 81 def authenticated_by_pop3?(password)
81 82 Net::POP3.enable_ssl
82 83 pop = Net::POP3.new('pops.it.chula.ac.th')
83 84 authen = true
84 85 begin
85 86 pop.start(login, password) # (1)
86 87 pop.finish
87 88 return true
88 89 rescue
89 90 return false
90 91 end
91 92 end
92 93
93 94 def admin?
94 95 self.roles.detect {|r| r.name == 'admin' }
95 96 end
96 97
97 98 def email_for_editing
98 99 if self.email==nil
99 100 "(unknown)"
100 101 elsif self.email==''
101 102 "(blank)"
102 103 else
103 104 self.email
104 105 end
105 106 end
106 107
107 108 def email_for_editing=(e)
108 109 self.email=e
109 110 end
110 111
111 112 def alias_for_editing
112 113 if self.alias==nil
113 114 "(unknown)"
114 115 elsif self.alias==''
115 116 "(blank)"
116 117 else
117 118 self.alias
118 119 end
119 120 end
120 121
121 122 def alias_for_editing=(e)
122 123 self.alias=e
123 124 end
124 125
125 126 def activation_key
126 127 if self.hashed_password==nil
127 128 encrypt_new_password
128 129 end
129 130 Digest::SHA1.hexdigest(self.hashed_password)[0..7]
130 131 end
131 132
132 133 def verify_activation_key(key)
133 134 key == activation_key
134 135 end
135 136
136 137 def self.random_password(length=5)
137 138 chars = 'abcdefghjkmnopqrstuvwxyz'
138 139 password = ''
139 140 length.times { password << chars[rand(chars.length - 1)] }
140 141 password
141 142 end
142 143
143 144 def self.find_non_admin_with_prefix(prefix='')
144 145 users = User.find(:all)
145 146 return users.find_all { |u| !(u.admin?) and u.login.index(prefix)==0 }
146 147 end
147 148
148 149 # Contest information
149 150
150 151 def self.find_users_with_no_contest()
151 152 users = User.find(:all)
152 153 return users.find_all { |u| u.contests.length == 0 }
153 154 end
154 155
155 156
156 157 def contest_time_left
157 158 if GraderConfiguration.contest_mode?
158 159 return nil if site==nil
159 160 return site.time_left
160 161 elsif GraderConfiguration.indv_contest_mode?
161 162 time_limit = GraderConfiguration.contest_time_limit
162 163 if time_limit == nil
163 164 return nil
You need to be logged in to leave comments. Login now