From c3d5cb2e75cf2179eca3c4aea75fc6b4f1addb59 Mon Sep 17 00:00:00 2001
From: Edward Akoto
Date: Tue, 21 May 2013 10:26:36 -0700
Subject: [PATCH 01/41] added password resets controller and ,migrations
---
app/controllers/password_resets_controller.rb | 5 +++++
app/helpers/password_resets_helper.rb | 2 ++
app/mailers/password_mailer.rb | 14 ++++++++++++++
app/services/active_directory.rb | 3 +++
.../password_mailer/password_reset.text.erb | 3 +++
app/views/password_resets/new.html.erb | 2 ++
config/routes.rb | 2 ++
.../20130521171512_add_auth_token_to_users.rb | 9 +++++++++
...130521171705_add_password_reset_to_users.rb | 11 +++++++++++
db/schema.rb | 3 ++-
.../password_resets_controller_spec.rb | 12 ++++++++++++
spec/fixtures/password_mailer/password_reset | 3 +++
spec/helpers/password_resets_helper_spec.rb | 15 +++++++++++++++
spec/mailers/password_mailer_spec.rb | 18 ++++++++++++++++++
.../views/password_resets/new.html.erb_spec.rb | 5 +++++
15 files changed, 106 insertions(+), 1 deletion(-)
create mode 100644 app/controllers/password_resets_controller.rb
create mode 100644 app/helpers/password_resets_helper.rb
create mode 100644 app/mailers/password_mailer.rb
create mode 100644 app/views/password_mailer/password_reset.text.erb
create mode 100644 app/views/password_resets/new.html.erb
create mode 100644 db/migrate/20130521171512_add_auth_token_to_users.rb
create mode 100644 db/migrate/20130521171705_add_password_reset_to_users.rb
create mode 100644 spec/controllers/password_resets_controller_spec.rb
create mode 100644 spec/fixtures/password_mailer/password_reset
create mode 100644 spec/helpers/password_resets_helper_spec.rb
create mode 100644 spec/mailers/password_mailer_spec.rb
create mode 100644 spec/views/password_resets/new.html.erb_spec.rb
diff --git a/app/controllers/password_resets_controller.rb b/app/controllers/password_resets_controller.rb
new file mode 100644
index 000000000..37f6e2183
--- /dev/null
+++ b/app/controllers/password_resets_controller.rb
@@ -0,0 +1,5 @@
+class PasswordResetsController < ApplicationController
+ def new
+ end
+
+end
diff --git a/app/helpers/password_resets_helper.rb b/app/helpers/password_resets_helper.rb
new file mode 100644
index 000000000..0c9d96ecf
--- /dev/null
+++ b/app/helpers/password_resets_helper.rb
@@ -0,0 +1,2 @@
+module PasswordResetsHelper
+end
diff --git a/app/mailers/password_mailer.rb b/app/mailers/password_mailer.rb
new file mode 100644
index 000000000..51c11ca67
--- /dev/null
+++ b/app/mailers/password_mailer.rb
@@ -0,0 +1,14 @@
+class PasswordMailer < ActionMailer::Base
+ default :from => "from@example.com"
+
+ # Subject can be set in your I18n file at config/locales/en.yml
+ # with the following lookup:
+ #
+ # en.password_mailer.password_reset.subject
+ #
+ def password_reset
+ @greeting = "Hi"
+
+ mail :to => "to@example.org"
+ end
+end
diff --git a/app/services/active_directory.rb b/app/services/active_directory.rb
index daf24cdac..af52f8026 100644
--- a/app/services/active_directory.rb
+++ b/app/services/active_directory.rb
@@ -58,4 +58,7 @@ def password_encode(password)
password.length.times{|i| result+= "#{password[i..i]}\000" }
result
end
+
+ # Reset user password
+
end
diff --git a/app/views/password_mailer/password_reset.text.erb b/app/views/password_mailer/password_reset.text.erb
new file mode 100644
index 000000000..9181ef564
--- /dev/null
+++ b/app/views/password_mailer/password_reset.text.erb
@@ -0,0 +1,3 @@
+PasswordMailer#password_reset
+
+<%= @greeting %>, find me in app/views/app/views/password_mailer/password_reset.text.erb
diff --git a/app/views/password_resets/new.html.erb b/app/views/password_resets/new.html.erb
new file mode 100644
index 000000000..b39009f52
--- /dev/null
+++ b/app/views/password_resets/new.html.erb
@@ -0,0 +1,2 @@
+PasswordResets#new
+Find me in app/views/password_resets/new.html.erb
diff --git a/config/routes.rb b/config/routes.rb
index 12bce69df..b34915323 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -1,5 +1,7 @@
CMUEducation::Application.routes.draw do
+ get "password_resets/new"
+
#temporary for Mel
match 'courses/:course_id/team_deliverables' => 'deliverables#team_index_for_course', :as => :individual_deliverables
match 'courses/:course_id/individual_deliverables' => 'deliverables#individual_index_for_course', :as => :team_deliverables
diff --git a/db/migrate/20130521171512_add_auth_token_to_users.rb b/db/migrate/20130521171512_add_auth_token_to_users.rb
new file mode 100644
index 000000000..a5f994fa8
--- /dev/null
+++ b/db/migrate/20130521171512_add_auth_token_to_users.rb
@@ -0,0 +1,9 @@
+class AddAuthTokenToUsers < ActiveRecord::Migration
+ def self.up
+ add_column :users, :auth_token, :string
+ end
+
+ def self.down
+ remove_column :users, :auth_token
+ end
+end
diff --git a/db/migrate/20130521171705_add_password_reset_to_users.rb b/db/migrate/20130521171705_add_password_reset_to_users.rb
new file mode 100644
index 000000000..c058bb784
--- /dev/null
+++ b/db/migrate/20130521171705_add_password_reset_to_users.rb
@@ -0,0 +1,11 @@
+class AddPasswordResetToUsers < ActiveRecord::Migration
+ def self.up
+ add_column :users, :password_reset_token, :string
+ add_column :users, :password_reset_sent_at, :datetime
+ end
+
+ def self.down
+ remove_column :users, :password_reset_sent_at
+ remove_column :users, :password_reset_token
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 894a0d460..421ac3ba2 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -11,7 +11,7 @@
#
# It's strongly recommended to check this file into your version control system.
-ActiveRecord::Schema.define(:version => 20130516223145) do
+ActiveRecord::Schema.define(:version => 20130521171512) do
create_table "assignments", :force => true do |t|
t.string "name"
@@ -705,6 +705,7 @@
t.datetime "people_search_first_accessed_at"
t.boolean "is_profile_valid"
t.datetime "active_directory_account_created"
+ t.string "auth_token"
end
add_index "users", ["email"], :name => "index_users_on_email"
diff --git a/spec/controllers/password_resets_controller_spec.rb b/spec/controllers/password_resets_controller_spec.rb
new file mode 100644
index 000000000..41ab48528
--- /dev/null
+++ b/spec/controllers/password_resets_controller_spec.rb
@@ -0,0 +1,12 @@
+require 'spec_helper'
+
+describe PasswordResetsController do
+
+ describe "GET 'new'" do
+ it "returns http success" do
+ get 'new'
+ response.should be_success
+ end
+ end
+
+end
diff --git a/spec/fixtures/password_mailer/password_reset b/spec/fixtures/password_mailer/password_reset
new file mode 100644
index 000000000..c8a9afe7f
--- /dev/null
+++ b/spec/fixtures/password_mailer/password_reset
@@ -0,0 +1,3 @@
+PasswordMailer#password_reset
+
+Hi, find me in app/views/password_mailer/password_reset
diff --git a/spec/helpers/password_resets_helper_spec.rb b/spec/helpers/password_resets_helper_spec.rb
new file mode 100644
index 000000000..02d5babc3
--- /dev/null
+++ b/spec/helpers/password_resets_helper_spec.rb
@@ -0,0 +1,15 @@
+require 'spec_helper'
+
+# Specs in this file have access to a helper object that includes
+# the PasswordResetsHelper. For example:
+#
+# describe PasswordResetsHelper do
+# describe "string concat" do
+# it "concats two strings with spaces" do
+# helper.concat_strings("this","that").should == "this that"
+# end
+# end
+# end
+describe PasswordResetsHelper do
+ pending "add some examples to (or delete) #{__FILE__}"
+end
diff --git a/spec/mailers/password_mailer_spec.rb b/spec/mailers/password_mailer_spec.rb
new file mode 100644
index 000000000..06d40d3e8
--- /dev/null
+++ b/spec/mailers/password_mailer_spec.rb
@@ -0,0 +1,18 @@
+require "spec_helper"
+
+describe PasswordMailer do
+ describe "password_reset" do
+ let(:mail) { PasswordMailer.password_reset }
+
+ it "renders the headers" do
+ mail.subject.should eq("Password reset")
+ mail.to.should eq(["to@example.org"])
+ mail.from.should eq(["from@example.com"])
+ end
+
+ it "renders the body" do
+ mail.body.encoded.should match("Hi")
+ end
+ end
+
+end
diff --git a/spec/views/password_resets/new.html.erb_spec.rb b/spec/views/password_resets/new.html.erb_spec.rb
new file mode 100644
index 000000000..38c685343
--- /dev/null
+++ b/spec/views/password_resets/new.html.erb_spec.rb
@@ -0,0 +1,5 @@
+require 'spec_helper'
+
+describe "password_resets/new.html.erb" do
+ pending "add some examples to (or delete) #{__FILE__}"
+end
From b67edf33b7f82ff3ae5e22dea20311faf5259e57 Mon Sep 17 00:00:00 2001
From: Edward Akoto
Date: Tue, 21 May 2013 12:03:07 -0700
Subject: [PATCH 02/41] added password reset services to active_directory
services
---
app/controllers/password_resets_controller.rb | 53 ++++++++++++++++++-
app/models/user.rb | 9 ++++
app/services/active_directory.rb | 14 ++++-
config/routes.rb | 3 +-
db/schema.rb | 4 +-
5 files changed, 79 insertions(+), 4 deletions(-)
diff --git a/app/controllers/password_resets_controller.rb b/app/controllers/password_resets_controller.rb
index 37f6e2183..e6612b08a 100644
--- a/app/controllers/password_resets_controller.rb
+++ b/app/controllers/password_resets_controller.rb
@@ -1,5 +1,56 @@
+
class PasswordResetsController < ApplicationController
- def new
+ layout 'cmu_sv'
+
+ def index
+ redirect_to new_password_reset_path
+ end
+
+ # Create new reset request
+ def create
+ @user = User.find_by_email(params[:primaryEmail])
+ @active_directory_service = ActiveDirectory.new
+
+ if verify_recaptcha(:model=>@user, :attribute=>"verification code")
+ if @user && @user.personal_email == params[:personalEmail]
+ @active_directory_service.send_password_reset_token(@user)
+ else
+ flash[:error] = "Your entries do not match records"
+ redirect_to new_password_reset_path and return
+ end
+ redirect_to root_url, :notice => "Instructions have been sent to your secondary email account."
+ else
+ flash[:error] = "Verification code is wrong"
+ redirect_to new_password_reset_path
+ end
+ end
+
+ # Display edit form with password reset token link
+ def edit
+ @user = User.find_by_password_reset_token!(params[:id])
+ rescue ActiveRecord::RecordNotFound
+ redirect_to new_password_reset_path, :flash => { :error => "Password reset link has expired." }
end
+ # Do actual password reset
+ def update
+ @user = User.find_by_password_reset_token!(params[:id])
+ @active_directory_service = ActiveDirectory.new
+ respond_to do |format|
+ if @user.password_reset_sent_at>2.hours.ago
+ if params[:newPassword]
+ if @active_directory_service.reset_password(@user, params[:newPassword]) == "Success"
+ flash[:notice] = "Password has been reset!"
+ format.html {redirect_to root_url}
+ else
+ flash[:error]="Operation was unsuccessful."
+ redirect_to edit_password_reset_path and return
+ end
+ end
+ else
+ flash[:error] = "Password reset link has expired."
+ format.html {redirect_to new_password_reset_path}
+ end
+ end
+ end
end
diff --git a/app/models/user.rb b/app/models/user.rb
index 50b87b765..730b864f0 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -45,6 +45,8 @@ class User < ActiveRecord::Base
before_save :person_before_save,
:update_is_profile_valid
+ before_create { generate_token(:auth_token) }
+
validates_uniqueness_of :webiso_account, :case_sensitive => false
validates_uniqueness_of :email, :case_sensitive => false
@@ -425,6 +427,13 @@ def self.notify_it_about_expired_accounts
end
end
+ # Generate password reset token
+ def generate_token(column)
+ begin
+ self[column] = SecureRandom.urlsafe_base64
+ end while User.exists?(column => self[column])
+ end
+
protected
def person_before_save
# We populate some reasonable defaults, but this can be overridden in the database
diff --git a/app/services/active_directory.rb b/app/services/active_directory.rb
index af52f8026..d94d18b50 100644
--- a/app/services/active_directory.rb
+++ b/app/services/active_directory.rb
@@ -59,6 +59,18 @@ def password_encode(password)
result
end
- # Reset user password
+ # Send active directory password reset token
+ def send_password_reset_token(user)
+ user.generate_token(:password_reset_token)
+ user.password_reset_sent_at = Time.zone.now
+ user.save!
+ PasswordMailer.password_reset(user).deliver
+ end
+ # Reset active directory password
+ def reset_password(user, new_pass)
+ distinguished_name = ldap_distinguished_name(user)
+ @connection.replace_attribute distinguished_name, :unicodePwd, password_encode(new_pass)
+ return @connection.get_operation_result.message
+ end
end
diff --git a/config/routes.rb b/config/routes.rb
index b34915323..3da372cf4 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -1,6 +1,5 @@
CMUEducation::Application.routes.draw do
- get "password_resets/new"
#temporary for Mel
match 'courses/:course_id/team_deliverables' => 'deliverables#team_index_for_course', :as => :individual_deliverables
@@ -18,6 +17,8 @@
resources :search, :only => [:index]
#get "/deliverables/get_assignments_for_student(.:format)" => "deliverables#get_assignments_for_student"
+ resources :password_resets
+
match '/deliverables/get_assignments_for_student(.:format)'=> 'deliverables#get_assignments_for_student' ,:as=> :get_assignments_for_student
resources :deliverables
diff --git a/db/schema.rb b/db/schema.rb
index 421ac3ba2..e641723bd 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -11,7 +11,7 @@
#
# It's strongly recommended to check this file into your version control system.
-ActiveRecord::Schema.define(:version => 20130521171512) do
+ActiveRecord::Schema.define(:version => 20130521171705) do
create_table "assignments", :force => true do |t|
t.string "name"
@@ -706,6 +706,8 @@
t.boolean "is_profile_valid"
t.datetime "active_directory_account_created"
t.string "auth_token"
+ t.string "password_reset_token"
+ t.datetime "password_reset_sent_at"
end
add_index "users", ["email"], :name => "index_users_on_email"
From 554ce490055c1138b710ed43a3122627867f352f Mon Sep 17 00:00:00 2001
From: Edward Akoto
Date: Tue, 21 May 2013 12:07:40 -0700
Subject: [PATCH 03/41] added password reset views
---
app/views/password_resets/edit.html.erb | 21 ++++++++++++++++
app/views/password_resets/new.html.erb | 33 +++++++++++++++++++++++--
2 files changed, 52 insertions(+), 2 deletions(-)
create mode 100644 app/views/password_resets/edit.html.erb
diff --git a/app/views/password_resets/edit.html.erb b/app/views/password_resets/edit.html.erb
new file mode 100644
index 000000000..57c5423e6
--- /dev/null
+++ b/app/views/password_resets/edit.html.erb
@@ -0,0 +1,21 @@
+<%= javascript_include_tag 'password_reset' %>
+
+<%= form_for @user, { :url => password_reset_path(params[:id]) } do |f| %>
+
+
<%=@user.human_name %>
+
+
+ Instructions
+ Your new password must have a digit character, a capital letter, and a minimum of eight characters.
+
+
+ New password:
+
+
+
+ Confirm password:
+
+
+
+ <%= f.submit "Update Password", :onclick=>"return validateEditForm()" %>
+<% end %>
diff --git a/app/views/password_resets/new.html.erb b/app/views/password_resets/new.html.erb
index b39009f52..15d4464c3 100644
--- a/app/views/password_resets/new.html.erb
+++ b/app/views/password_resets/new.html.erb
@@ -1,2 +1,31 @@
-PasswordResets#new
-Find me in app/views/password_resets/new.html.erb
+
+
+
+<% content_for :title, 'Whiteboard LMS for CMU-SV' %>
+
+<%= javascript_include_tag 'password_reset' %>
+
+Reset account
+
+
+
+
+
From c10b23ca394786e45d9f52902fcc790c9bf565fe Mon Sep 17 00:00:00 2001
From: Edward Akoto
Date: Tue, 21 May 2013 12:24:58 -0700
Subject: [PATCH 04/41] added gem recaptcha
---
Gemfile | 2 ++
Gemfile.lock | 10 ++--------
config/initializers/recaptcha.rb | 4 ++++
3 files changed, 8 insertions(+), 8 deletions(-)
create mode 100644 config/initializers/recaptcha.rb
diff --git a/Gemfile b/Gemfile
index 5930b4e5b..029efb535 100644
--- a/Gemfile
+++ b/Gemfile
@@ -42,6 +42,8 @@ gem 'pg'
gem 'net-ldap'
+gem "recaptcha", :require => "recaptcha/rails"
+
gem 'cancan'
# gem 'smtp_tls' # Used for sending mail to gmail
diff --git a/Gemfile.lock b/Gemfile.lock
index cd54fe20e..47ed7f06b 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -73,14 +73,7 @@ GEM
mime-types (~> 1.16)
orm_adapter (~> 0.0.5)
cocaine (0.2.0)
- columnize (0.3.6)
daemons (1.1.9)
- debugger (1.5.0)
- columnize (>= 0.3.1)
- debugger-linecache (~> 1.2.0)
- debugger-ruby_core_source (~> 1.2.0)
- debugger-linecache (1.2.0)
- debugger-ruby_core_source (1.2.0)
delayed_job (2.1.4)
activesupport (~> 3.0)
daemons
@@ -194,6 +187,7 @@ GEM
rake (0.8.7)
rdoc (3.12.2)
json (~> 1.4)
+ recaptcha (0.3.5)
rest-client (1.6.7)
mime-types (>= 1.16)
rmagick (2.13.2)
@@ -274,7 +268,6 @@ DEPENDENCIES
capybara (= 1.1.1)
ckeditor (= 3.6.3)
daemons (~> 1.1.4)
- debugger
delayed_job (= 2.1.4)
devise
exception_notification
@@ -295,6 +288,7 @@ DEPENDENCIES
rails (= 3.0.20)
rake (= 0.8.7)
rdoc
+ recaptcha
rmagick
rspec-rails
seedbank
diff --git a/config/initializers/recaptcha.rb b/config/initializers/recaptcha.rb
new file mode 100644
index 000000000..6232d90db
--- /dev/null
+++ b/config/initializers/recaptcha.rb
@@ -0,0 +1,4 @@
+Recaptcha.configure do |config|
+ config.public_key = '6LfhP98SAAAAAMnnvCdL3ENLN5gZ1X7CkhW3G90N'
+ config.private_key = '6LfhP98SAAAAAOtg1NcHbREldoWIQdt2WdsVpkVT'
+end
\ No newline at end of file
From d6bbb7e138bb130a466a4fa46ff47e0c1155a684 Mon Sep 17 00:00:00 2001
From: Edward Akoto
Date: Tue, 21 May 2013 12:38:08 -0700
Subject: [PATCH 05/41] added password reset js
---
public/javascripts/password_reset.js | 39 ++++++++++++++++++++++++++++
1 file changed, 39 insertions(+)
create mode 100644 public/javascripts/password_reset.js
diff --git a/public/javascripts/password_reset.js b/public/javascripts/password_reset.js
new file mode 100644
index 000000000..a6f4dcd71
--- /dev/null
+++ b/public/javascripts/password_reset.js
@@ -0,0 +1,39 @@
+/*
+ *This page contains all relevant JS for the password reset pages
+ */
+
+
+// Helper function to validate reset form
+function validateResetForm(){
+ if ( ($("#primaryEmail").val()=="") || ($("#personalEmail").val()=="") ){
+ return warn_blank_fields()
+ } else{
+ return true
+ }
+}
+
+// Helper function to validate edit form
+function validateEditForm(){
+ var newPass = $("#newPassword").val()
+ var oldPass = $("#confirmPassword").val()
+ if ((newPass==oldPass) && newPass!="") {
+ return true
+ }else{
+ return warn_password_mismatch()
+
+ }
+}
+
+// Warn if password mismatches
+function warn_password_mismatch(){
+ $("#password_mismatch_warning").empty()
+ $("#password_mismatch_warning").append($('
').css('color', 'red').text('Password mismatch'));
+ return false
+}
+
+// Warn if email fields are blank
+function warn_blank_fields(){
+ $("#blank_email_warning").empty()
+ $("#blank_email_warning").append($('
').css('color', 'red').text('Blank fields are not allowed'));
+ return false
+}
\ No newline at end of file
From 232bdce072b1efb4ad72fb1f6300a82ed25fa5e8 Mon Sep 17 00:00:00 2001
From: Edward Akoto
Date: Tue, 21 May 2013 12:54:01 -0700
Subject: [PATCH 06/41] added person mailer
---
Gemfile.lock | 8 ++++++++
app/mailers/password_mailer.rb | 11 -----------
db/schema.rb | 5 ++++-
3 files changed, 12 insertions(+), 12 deletions(-)
diff --git a/Gemfile.lock b/Gemfile.lock
index 47ed7f06b..5e35d3cda 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -73,7 +73,14 @@ GEM
mime-types (~> 1.16)
orm_adapter (~> 0.0.5)
cocaine (0.2.0)
+ columnize (0.3.6)
daemons (1.1.9)
+ debugger (1.5.0)
+ columnize (>= 0.3.1)
+ debugger-linecache (~> 1.2.0)
+ debugger-ruby_core_source (~> 1.2.0)
+ debugger-linecache (1.2.0)
+ debugger-ruby_core_source (1.2.0)
delayed_job (2.1.4)
activesupport (~> 3.0)
daemons
@@ -268,6 +275,7 @@ DEPENDENCIES
capybara (= 1.1.1)
ckeditor (= 3.6.3)
daemons (~> 1.1.4)
+ debugger
delayed_job (= 2.1.4)
devise
exception_notification
diff --git a/app/mailers/password_mailer.rb b/app/mailers/password_mailer.rb
index 51c11ca67..40322fe59 100644
--- a/app/mailers/password_mailer.rb
+++ b/app/mailers/password_mailer.rb
@@ -1,14 +1,3 @@
class PasswordMailer < ActionMailer::Base
- default :from => "from@example.com"
- # Subject can be set in your I18n file at config/locales/en.yml
- # with the following lookup:
- #
- # en.password_mailer.password_reset.subject
- #
- def password_reset
- @greeting = "Hi"
-
- mail :to => "to@example.org"
- end
end
diff --git a/db/schema.rb b/db/schema.rb
index e641723bd..05165352e 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -11,7 +11,7 @@
#
# It's strongly recommended to check this file into your version control system.
-ActiveRecord::Schema.define(:version => 20130521171705) do
+ActiveRecord::Schema.define(:version => 20130521194045) do
create_table "assignments", :force => true do |t|
t.string "name"
@@ -626,6 +626,9 @@
t.datetime "people_search_first_accessed_at"
t.boolean "is_profile_valid"
t.datetime "active_directory_account_created"
+ t.string "auth_token"
+ t.string "password_reset_token"
+ t.datetime "password_reset_sent_at"
end
create_table "users", :force => true do |t|
From e013d645e4dc799660efea1e0ebf565f67a30bcb Mon Sep 17 00:00:00 2001
From: Edward Akoto
Date: Tue, 21 May 2013 13:44:28 -0700
Subject: [PATCH 07/41] added crud methods for password reset controller
---
app/controllers/password_resets_controller.rb | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/app/controllers/password_resets_controller.rb b/app/controllers/password_resets_controller.rb
index e6612b08a..00b3e8e3e 100644
--- a/app/controllers/password_resets_controller.rb
+++ b/app/controllers/password_resets_controller.rb
@@ -1,12 +1,12 @@
-
class PasswordResetsController < ApplicationController
layout 'cmu_sv'
+ # Display new password reset page
def index
redirect_to new_password_reset_path
end
- # Create new reset request
+ # Create new password reset request
def create
@user = User.find_by_email(params[:primaryEmail])
@active_directory_service = ActiveDirectory.new
From 147ba53045fd5e525e6ed24cedbde87c329a4930 Mon Sep 17 00:00:00 2001
From: Edward Akoto
Date: Tue, 21 May 2013 13:45:23 -0700
Subject: [PATCH 08/41] added text for password mailer
---
app/mailers/password_mailer.rb | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/app/mailers/password_mailer.rb b/app/mailers/password_mailer.rb
index 40322fe59..a0aa9b8a2 100644
--- a/app/mailers/password_mailer.rb
+++ b/app/mailers/password_mailer.rb
@@ -1,3 +1,8 @@
class PasswordMailer < ActionMailer::Base
+ default :from => "whiteboard-noreply@#{GOOGLE_DOMAIN}"
+ def password_reset(user)
+ @user = user
+ mail :to => user.personal_email, :subject => "Whiteboard Password Reset"
+ end
end
From e125d923f5ab3c7017901f0eeaf891b4c57e464f Mon Sep 17 00:00:00 2001
From: Edward Akoto
Date: Tue, 21 May 2013 13:46:05 -0700
Subject: [PATCH 09/41] modified active directory service methods
---
app/services/active_directory.rb | 32 ++++++++++++++++++++++++++------
1 file changed, 26 insertions(+), 6 deletions(-)
diff --git a/app/services/active_directory.rb b/app/services/active_directory.rb
index d94d18b50..99fdf8cb3 100644
--- a/app/services/active_directory.rb
+++ b/app/services/active_directory.rb
@@ -10,11 +10,27 @@ def self.initialize
@connection.auth LDAPConfig.username, LDAPConfig.password unless LDAPConfig.username.nil? || LDAPConfig.password.nil?
end
+ # Attempt to bind to active directory, time out after N seconds, return true or false
+ def bind
+ return false unless !@connection.nil?
+ begin
+ Timeout::timeout(10) do
+ return (@connection.bind) ? true : false
+ end
+ rescue Timeout::Error
+ return false
+ end
+ end
+
# Create a user account in active directory
# Return message as "Success", "Unwilling to perform", "Entity exists" or "No such object"
def create_account(user)
- @connection.add(:dn=>user.ldap_distinguished_name(user), :attributes=>ldap_attributes(user))
- return @connection.get_operation_result.message
+ if self.bind
+ @connection.add(:dn=>user.ldap_distinguished_name(user), :attributes=>ldap_attributes(user))
+ return @connection.get_operation_result.message
+ else
+ return false
+ end
end
# Build attributes for active directory account
@@ -56,7 +72,7 @@ def password_encode(password)
result = ""
password = "\"" + password + "\""
password.length.times{|i| result+= "#{password[i..i]}\000" }
- result
+ return result
end
# Send active directory password reset token
@@ -69,8 +85,12 @@ def send_password_reset_token(user)
# Reset active directory password
def reset_password(user, new_pass)
- distinguished_name = ldap_distinguished_name(user)
- @connection.replace_attribute distinguished_name, :unicodePwd, password_encode(new_pass)
- return @connection.get_operation_result.message
+ if self.bind
+ distinguished_name = ldap_distinguished_name(user)
+ @connection.replace_attribute distinguished_name, :unicodePwd, password_encode(new_pass)
+ return @connection.get_operation_result.message
+ else
+ return false
+ end
end
end
From 1b02284f414871c5477382bfb58045beda5d34d0 Mon Sep 17 00:00:00 2001
From: Edward Akoto
Date: Tue, 21 May 2013 13:46:45 -0700
Subject: [PATCH 10/41] added forgot passwor link in the cmu_sv layout view
---
app/views/layouts/cmu_sv.html.erb | 1 +
1 file changed, 1 insertion(+)
diff --git a/app/views/layouts/cmu_sv.html.erb b/app/views/layouts/cmu_sv.html.erb
index 4e59bca7d..c80b9f133 100644
--- a/app/views/layouts/cmu_sv.html.erb
+++ b/app/views/layouts/cmu_sv.html.erb
@@ -95,6 +95,7 @@
My Deliverables (Login required)
My Teams (Login required)
<%= link_to "Login ", user_omniauth_authorize_path(:google_apps), :class => "Lv1NavLink" %>
+ <%= link_to "Forgot password", new_password_reset_path%>
<% end %>
From 70bbaca055b81825097b557eeefe94500a1dc04f Mon Sep 17 00:00:00 2001
From: Edward Akoto
Date: Tue, 21 May 2013 13:47:31 -0700
Subject: [PATCH 11/41] added password reset mail text
---
app/views/password_mailer/password_reset.text.erb | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)
diff --git a/app/views/password_mailer/password_reset.text.erb b/app/views/password_mailer/password_reset.text.erb
index 9181ef564..790de4192 100644
--- a/app/views/password_mailer/password_reset.text.erb
+++ b/app/views/password_mailer/password_reset.text.erb
@@ -1,3 +1,13 @@
-PasswordMailer#password_reset
+Hi <%=@user.human_name%>,
-<%= @greeting %>, find me in app/views/app/views/password_mailer/password_reset.text.erb
+A password reset request for your login to Whiteboard has been received at <%=Time.now%>
+
+To reset your password, please follow this link.
+
+<%= edit_password_reset_url(@user.password_reset_token) %>
+
+Access to this link is only valid for 2 hours.
+
+If you did not request a password reset, report this to your administrator immediately.
+
+Thanks.
\ No newline at end of file
From 1c4b6368a7016c15bfa1774519edd03658275f23 Mon Sep 17 00:00:00 2001
From: Edward Akoto
Date: Tue, 21 May 2013 13:48:14 -0700
Subject: [PATCH 12/41] modified title of new password reset view
---
app/views/password_resets/new.html.erb | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/app/views/password_resets/new.html.erb b/app/views/password_resets/new.html.erb
index 15d4464c3..b79072d4a 100644
--- a/app/views/password_resets/new.html.erb
+++ b/app/views/password_resets/new.html.erb
@@ -9,13 +9,13 @@
<%= javascript_include_tag 'password_reset' %>
-Reset account
+Reset account password