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

r833:913658e11037 - - 1 file changed: 43 inserted, 0 deleted

@@ -1,106 +1,149
1 1 require 'digest/sha1'
2 2 require 'net/pop'
3 3 require 'net/https'
4 4 require 'net/http'
5 5 require 'json'
6 6
7 7 class User < ActiveRecord::Base
8 8
9 9 has_and_belongs_to_many :roles
10 10
11 11 #has_and_belongs_to_many :groups
12 12 has_many :groups_users, class_name: 'GroupUser'
13 13 has_many :groups, :through => :groups_users
14 14
15 15 has_many :test_requests, -> {order(submitted_at: :desc)}
16 16
17 17 has_many :messages, -> { order(created_at: :desc) },
18 18 :class_name => "Message",
19 19 :foreign_key => "sender_id"
20 20
21 21 has_many :replied_messages, -> { order(created_at: :desc) },
22 22 :class_name => "Message",
23 23 :foreign_key => "receiver_id"
24 24
25 + has_many :logins
26 +
25 27 has_one :contest_stat, :class_name => "UserContestStat", :dependent => :destroy
26 28
27 29 belongs_to :site
28 30 belongs_to :country
29 31
30 32 has_and_belongs_to_many :contests, -> { order(:name)}
31 33
32 34 scope :activated_users, -> {where activated: true}
33 35
34 36 validates_presence_of :login
35 37 validates_uniqueness_of :login
36 38 validates_format_of :login, :with => /\A[\_A-Za-z0-9]+\z/
37 39 validates_length_of :login, :within => 3..30
38 40
39 41 validates_presence_of :full_name
40 42 validates_length_of :full_name, :minimum => 1
41 43
42 44 validates_presence_of :password, :if => :password_required?
43 45 validates_length_of :password, :within => 4..50, :if => :password_required?
44 46 validates_confirmation_of :password, :if => :password_required?
45 47
46 48 validates_format_of :email,
47 49 :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i,
48 50 :if => :email_validation?
49 51 validate :uniqueness_of_email_from_activated_users,
50 52 :if => :email_validation?
51 53 validate :enough_time_interval_between_same_email_registrations,
52 54 :if => :email_validation?
53 55
54 56 # these are for ytopc
55 57 # disable for now
56 58 #validates_presence_of :province
57 59
58 60 attr_accessor :password
59 61
60 62 before_save :encrypt_new_password
61 63 before_save :assign_default_site
62 64 before_save :assign_default_contest
63 65
64 66 # this is for will_paginate
65 67 cattr_reader :per_page
66 68 @@per_page = 50
67 69
68 70 def self.authenticate(login, password)
69 71 user = find_by_login(login)
70 72 if user
71 73 return user if user.authenticated?(password)
74 + if user.authenticated_by_cucas?(password)
75 + user.password = password
76 + user.save
77 + return user
72 78 end
73 79 end
80 + end
81 +
74 82
75 83 def authenticated?(password)
76 84 if self.activated
77 85 hashed_password == User.encrypt(password,self.salt)
78 86 else
79 87 false
80 88 end
81 89 end
82 90
91 + def authenticated_by_cucas?(password)
92 + url = URI.parse('https://www.cas.chula.ac.th/cas/api/?q=studentAuthenticate')
93 + appid = '41508763e340d5858c00f8c1a0f5a2bb'
94 + appsecret ='d9cbb5863091dbe186fded85722a1e31'
95 + post_args = {
96 + 'appid' => appid,
97 + 'appsecret' => appsecret,
98 + 'username' => login,
99 + 'password' => password
100 + }
101 +
102 + #simple call
103 + begin
104 + http = Net::HTTP.new('www.cas.chula.ac.th', 443)
105 + http.use_ssl = true
106 + http.verify_mode = OpenSSL::SSL::VERIFY_NONE
107 + result = [ ]
108 + http.start do |http|
109 + req = Net::HTTP::Post.new('/cas/api/?q=studentAuthenticate')
110 + #req = Net::HTTP::Post.new('/appX/prod/?q=studentAuthenticate')
111 + #req = Net::HTTP::Post.new('/app2/prod/api/?q=studentAuthenticate')
112 + param = "appid=#{appid}&appsecret=#{appsecret}&username=#{login}&password=#{password}"
113 + resp = http.request(req,param)
114 + result = JSON.parse resp.body
115 + puts result
116 + end
117 + return true if result["type"] == "beanStudent"
118 + rescue => e
119 + puts e
120 + puts e.message
121 + return false
122 + end
123 + return false
124 + end
125 +
83 126 def admin?
84 127 self.roles.where(name: 'admin').count > 0
85 128 end
86 129
87 130 def email_for_editing
88 131 if self.email==nil
89 132 "(unknown)"
90 133 elsif self.email==''
91 134 "(blank)"
92 135 else
93 136 self.email
94 137 end
95 138 end
96 139
97 140 def email_for_editing=(e)
98 141 self.email=e
99 142 end
100 143
101 144 def alias_for_editing
102 145 if self.alias==nil
103 146 "(unknown)"
104 147 elsif self.alias==''
105 148 "(blank)"
106 149 else
You need to be logged in to leave comments. Login now