Skip to content

Commit 51f0ae8

Browse files
committed
Use Faraday instead of RestClient
1 parent fcf8bef commit 51f0ae8

File tree

2 files changed

+94
-55
lines changed

2 files changed

+94
-55
lines changed

app/controllers/password_reset_keys_controller.rb

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -39,18 +39,29 @@ def destroy
3939
return render action: :show, status: :forbidden
4040
end
4141

42-
@user.password = params[:password]
43-
if @user.save
44-
@key.destroy
45-
flash[:success] = 'Your password has been reset.'
46-
redirect_to root_path
42+
if @user.password_managed_by_courses_mooc_fi
43+
success = @user.update_password_via_courses_mooc_fi(nil, params[:password])
44+
if success
45+
@key.destroy
46+
flash[:success] = 'Your password has been reset.'
47+
redirect_to root_path
48+
else
49+
'Failed to reset password.'
50+
end
4751
else
48-
flash.now[:alert] = if @user.errors[:password]
49-
'Password ' + @user.errors[:password].join(', ')
52+
@user.password = params[:password]
53+
if @user.save
54+
@key.destroy
55+
flash[:success] = 'Your password has been reset.'
56+
redirect_to root_path
5057
else
51-
'Failed to set password'
58+
flash.now[:alert] = if @user.errors[:password]
59+
'Password ' + @user.errors[:password].join(', ')
60+
else
61+
'Failed to set password'
62+
end
63+
render action: :show, status: :forbidden
5264
end
53-
render action: :show, status: :forbidden
5465
end
5566
end
5667

app/models/user.rb

Lines changed: 74 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -148,71 +148,99 @@ def self.authenticate(login, submitted_password)
148148
user = find_by(login: login)
149149
user ||= find_by('lower(email) = ?', login.downcase)
150150
return nil if user.nil?
151-
user if user.password_managed_by_courses_mooc_fi && user.courses_mooc_fi_user_id.present? && authenticate_via_courses_mooc_fi(user.courses_mooc_fi_user_id, submitted_password)
151+
152+
if user.password_managed_by_courses_mooc_fi && user.courses_mooc_fi_user_id.present?
153+
return user if user.authenticate_via_courses_mooc_fi(submitted_password)
154+
return nil
155+
end
156+
152157
user if user.has_password?(submitted_password)
153158
end
154159

155-
def authenticate_via_courses_mooc_fi(courses_mooc_fi_user_id, submitted_password)
160+
161+
def authenticate_via_courses_mooc_fi(submitted_password)
156162
auth_url = SiteSetting.value('courses_mooc_fi_auth_url')
157-
response = RestClient.post(
158-
auth_url,
159-
{
163+
164+
conn = Faraday.new do |f|
165+
f.request :json
166+
f.response :json
167+
end
168+
169+
response = conn.post(auth_url) do |req|
170+
req.headers["Content-Type"] = "application/json"
171+
req.headers["Accept"] = "application/json"
172+
req.headers["Authorization"] = Base64.decode64(
173+
Rails.application.secrets.tmc_server_secret_for_communicating_to_secret_project
174+
)
175+
176+
req.body = {
160177
user_id: courses_mooc_fi_user_id,
161-
password: submitted_password,
162-
}.to_json,
163-
{
164-
content_type: :json,
165-
accept: :json,
166-
Authorization: Rails.application.secrets.tmc_server_secret_for_communicating_to_secret_project,
178+
password: submitted_password
167179
}
168-
)
180+
end
181+
182+
response.body == true
183+
184+
rescue Faraday::ClientError => e
185+
status = e.response&.dig(:status)
169186

170-
data = JSON.parse(response.body)
171-
unless data['authenticated'] == true
172-
raise "Authentication via courses.mooc.fi failed for #{email}"
187+
if status == 401 || status == 403
188+
return false
173189
end
174190

175-
true
176-
rescue RestClient::Unauthorized, RestClient::Forbidden
177-
raise "Authentication rejected by courses.mooc.fi for #{email}"
178-
rescue RestClient::ExceptionWithResponse => e
179191
Rails.logger.error("Authentication via courses.mooc.fi error: #{e.response}")
180-
raise "Authentication via courses.mooc.fi failed: #{e.message}"
192+
raise
193+
181194
rescue => e
182195
Rails.logger.error("Unexpected error during authentication via courses.mooc.fi: #{e.message}")
183-
raise "Unexpected error while authenticating via courses.mooc.fi: #{e.message}"
196+
raise
184197
end
185198

186-
def update_password_via_courses_mooc_fi(courses_mooc_fi_user_id, old_password, new_password)
187-
update_url = SiteSetting.value('courses_mooc_fi_update_password_url')
188199

189-
response = RestClient.put(
190-
update_url,
191-
{
192-
user_id: courses_mooc_fi_user_id,
193-
old_password: old_password,
194-
new_password: new_password,
195-
}.to_json,
196-
{
197-
content_type: :json,
198-
accept: :json,
199-
Authorization: Rails.application.secrets.tmc_server_secret_for_communicating_to_secret_project,
200-
}
201-
)
202200

203-
data = JSON.parse(response.body)
201+
def update_password_via_courses_mooc_fi(old_password, new_password)
202+
update_url = SiteSetting.value('courses_mooc_fi_update_password_url')
204203

205-
unless data['updated'] == true
206-
raise "Updating password via courses.mooc.fi failed for user with courses.mooc.fi-user-id #{courses_mooc_fi_user_id}"
204+
conn = Faraday.new do |f|
205+
f.request :json
206+
f.response :json
207207
end
208208

209-
true
210-
rescue RestClient::ExceptionWithResponse => e
211-
Rails.logger.error("Updating password via courses.mooc.fi failed for user with courses.mooc.fi-user-id #{courses_mooc_fi_user_id}: #{e.response}")
212-
false
213-
rescue => e
214-
Rails.logger.error("Unexpected error updating password via courses.mooc.fi for user with courses.mooc.fi-user-id #{courses_mooc_fi_user_id}: #{e.message}")
215-
false
209+
begin
210+
response = conn.post(update_url) do |req|
211+
req.headers["Content-Type"] = "application/json"
212+
req.headers["Accept"] = "application/json"
213+
req.headers["Authorization"] = Base64.decode64(
214+
Rails.application.secrets.tmc_server_secret_for_communicating_to_secret_project
215+
)
216+
217+
req.body = {
218+
user_id: self.courses_mooc_fi_user_id,
219+
old_password: old_password,
220+
new_password: new_password
221+
}
222+
end
223+
224+
data = response.body
225+
226+
unless data == true
227+
raise "Updating password via courses.mooc.fi failed for user with courses.mooc.fi-user-id #{self.courses_mooc_fi_user_id}"
228+
end
229+
230+
true
231+
232+
rescue Faraday::ClientError => e
233+
Rails.logger.error(
234+
"Updating password via courses.mooc.fi failed for user with courses.mooc.fi-user-id #{self.courses_mooc_fi_user_id}: #{e.response}"
235+
)
236+
false
237+
238+
rescue => e
239+
Rails.logger.error(
240+
"Unexpected error updating password via courses.mooc.fi for user with courses.mooc.fi-user-id #{self.courses_mooc_fi_user_id}: #{e.message}"
241+
)
242+
false
243+
end
216244
end
217245

218246
def password_reset_key

0 commit comments

Comments
 (0)