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

r391:ea41c9c1ace4 - - 1 file changed: 1 inserted, 0 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 66 if user.authenticated_by_pop3?(password)
67 67 user.password = password
68 + return user
68 69 end
69 70 end
70 71
71 72 def authenticated?(password)
72 73 if self.activated
73 74 hashed_password == User.encrypt(password,self.salt)
74 75 else
75 76 false
76 77 end
77 78 end
78 79
79 80 def authenticated_by_pop3?(password)
80 81 Net::POP3.enable_ssl
81 82 pop = Net::POP3.new('pops.it.chula.ac.th')
82 83 authen = true
83 84 begin
84 85 pop.start(login, password) # (1)
85 86 pop.finish
86 87 return true
87 88 rescue
88 89 return false
89 90 end
90 91 end
91 92
92 93 def admin?
93 94 self.roles.detect {|r| r.name == 'admin' }
94 95 end
95 96
96 97 def email_for_editing
97 98 if self.email==nil
98 99 "(unknown)"
99 100 elsif self.email==''
100 101 "(blank)"
101 102 else
102 103 self.email
103 104 end
104 105 end
105 106
106 107 def email_for_editing=(e)
107 108 self.email=e
108 109 end
109 110
110 111 def alias_for_editing
111 112 if self.alias==nil
112 113 "(unknown)"
113 114 elsif self.alias==''
114 115 "(blank)"
115 116 else
116 117 self.alias
117 118 end
118 119 end
119 120
120 121 def alias_for_editing=(e)
121 122 self.alias=e
122 123 end
123 124
124 125 def activation_key
125 126 if self.hashed_password==nil
126 127 encrypt_new_password
127 128 end
128 129 Digest::SHA1.hexdigest(self.hashed_password)[0..7]
129 130 end
130 131
131 132 def verify_activation_key(key)
132 133 key == activation_key
133 134 end
134 135
135 136 def self.random_password(length=5)
136 137 chars = 'abcdefghjkmnopqrstuvwxyz'
137 138 password = ''
138 139 length.times { password << chars[rand(chars.length - 1)] }
139 140 password
140 141 end
141 142
142 143 def self.find_non_admin_with_prefix(prefix='')
143 144 users = User.find(:all)
144 145 return users.find_all { |u| !(u.admin?) and u.login.index(prefix)==0 }
145 146 end
146 147
147 148 # Contest information
148 149
149 150 def self.find_users_with_no_contest()
150 151 users = User.find(:all)
151 152 return users.find_all { |u| u.contests.length == 0 }
152 153 end
153 154
154 155
155 156 def contest_time_left
156 157 if GraderConfiguration.contest_mode?
157 158 return nil if site==nil
158 159 return site.time_left
159 160 elsif GraderConfiguration.indv_contest_mode?
160 161 time_limit = GraderConfiguration.contest_time_limit
161 162 if time_limit == nil
162 163 return nil
163 164 end
You need to be logged in to leave comments. Login now