First half of a password reset function
authorSteve Coast <steve@asklater.com>
Fri, 17 Nov 2006 13:31:15 +0000 (13:31 +0000)
committerSteve Coast <steve@asklater.com>
Fri, 17 Nov 2006 13:31:15 +0000 (13:31 +0000)
app/controllers/user_controller.rb
app/models/notifier.rb
app/models/user.rb
app/views/layouts/site.rhtml
app/views/notifier/lost_password.rhtml [new file with mode: 0644]
app/views/user/login.rhtml
app/views/user/lost_password.rhtml [new file with mode: 0644]
app/views/user/new.rhtml
config/routes.rb
public/stylesheets/site.css

index d61455bf1671ad2a2de88da1ca76554a840f5cf3..659307460f57872cce1fabf267f0c1b14a11d39e 100644 (file)
@@ -1,11 +1,12 @@
 class UserController < ApplicationController
 class UserController < ApplicationController
-
+  layout 'site'
+  
   def save
     @user = User.new(params[:user])
     @user.set_defaults
 
     if @user.save
   def save
     @user = User.new(params[:user])
     @user.set_defaults
 
     if @user.save
-      flash[:notice] = 'Users was successfully created.'
+      flash[:notice] = 'User was successfully created. Check your email for a confirmation note, and you\'ll be mapping in no time :-)'
       Notifier::deliver_signup_confirm(@user)
       redirect_to :action => 'login'
     else
       Notifier::deliver_signup_confirm(@user)
       redirect_to :action => 'login'
     else
@@ -13,8 +14,21 @@ class UserController < ApplicationController
     end
   end
 
     end
   end
 
+  def lost_password
+    if params['user']['email']
+      user = User.find_by_email(params['user']['email'])
+      if user
+        user.token = User.make_token
+        user.save
+        Notifier::deliver_lost_password(user)
+        flash[:notice] = "Sorry you lost it :-( but an email is on it's way so you can reset it soon."
+      else
+        flash[:notice] = "Couldn't find that email address, sorry."
+      end
+    end
+  end
+
   def new
   def new
-    render :layout => 'site'
   end
 
   def login
   end
 
   def login
@@ -29,10 +43,10 @@ class UserController < ApplicationController
         session[:token] = u.token
         redirect_to :controller => 'site', :action => 'index'
         return
         session[:token] = u.token
         redirect_to :controller => 'site', :action => 'index'
         return
+      else
+        flash[:notice] = "Couldn't log in with those details"
       end
     end
       end
     end
-
-    render :layout => 'site'
   end
 
   def logout
   end
 
   def logout
@@ -53,7 +67,7 @@ class UserController < ApplicationController
     if @user && @user.active == 0
       @user.active = true
       @user.save
     if @user && @user.active == 0
       @user.active = true
       @user.save
-      flash[:notice] = 'Confirmed your account'
+      flash[:notice] = 'Confirmed your account, thanks for signing up!'
 
       #FIXME: login the person magically
 
 
       #FIXME: login the person magically
 
index 484cb702f42e3f686a50dd6e337f79969b461c27..fcc039b1f6dbc058ddcc0468eea04d040724e6db 100644 (file)
@@ -1,12 +1,17 @@
 class Notifier < ActionMailer::Base
 
   def signup_confirm( user )
 class Notifier < ActionMailer::Base
 
   def signup_confirm( user )
-    # Email header info MUST be added here
     @recipients = user.email
     @from = 'abuse@openstreetmap.org'
     @subject = '[OpenStreetMap] Confirm your email address'
     @recipients = user.email
     @from = 'abuse@openstreetmap.org'
     @subject = '[OpenStreetMap] Confirm your email address'
-
     @body['url'] = 'http://www.openstreetmap.org/user/confirm?confirm_string=' + user.token
   end
     @body['url'] = 'http://www.openstreetmap.org/user/confirm?confirm_string=' + user.token
   end
-  
+
+  def lost_password( user )
+    @recipients = user.email
+    @from = 'abuse@openstreetmap.org'
+    @subject = '[OpenStreetMap] Passwors reset request'
+    @body['url'] = "http://www.openstreetmap.org/user/reset_password?email=#{user.email}&token=#{user.token}"
+  end
+
 end
 end
index 350ea2c3a83e74a49833c897fa6f51aa23e201ac..c0468f8b075f6cbae5ed43209f91738a027268fe 100644 (file)
@@ -32,11 +32,11 @@ class User < ActiveRecord::Base
     find_first([ "token = ? ", token])
   end 
   
     find_first([ "token = ? ", token])
   end 
   
-  def self.make_token
+  def self.make_token(length=30)
     chars = 'abcdefghijklmnopqrtuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
     confirmstring = ''
 
     chars = 'abcdefghijklmnopqrtuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
     confirmstring = ''
 
-    30.times do
+    length.times do
       confirmstring += chars[(rand * chars.length).to_i].chr
     end
 
       confirmstring += chars[(rand * chars.length).to_i].chr
     end
 
index 5f0e848ac39fe986835c8f71807f777f86196d97..70752f5e1f35323f31e69ab18837396ab17c63f8 100644 (file)
 
   <span id="greeting">
     <% if @user %>
 
   <span id="greeting">
     <% if @user %>
-      Welcome, <%= @user.email %> |
-      <%= link_to 'Logout', {:controller => 'user', :action => 'logout'}, {:id => 'loginanchor'}%>
+      Welcome, <%= @user.display_name %> |
+      <%= link_to 'logout', {:controller => 'user', :action => 'logout'}, {:id => 'loginanchor'}%>
     <% else %>
     <% else %>
-      <%= link_to 'Login', {:controller => 'user', :action => 'login'}, {:id => 'loginanchor'}%> |
-      <%= link_to 'Sign up', {:controller => 'user', :action => 'new'}, {:id => 'registeranchor'} %>
+      <%= link_to 'log in', {:controller => 'user', :action => 'login'}, {:id => 'loginanchor'}%> |
+      <%= link_to 'sign up', {:controller => 'user', :action => 'new'}, {:id => 'registeranchor'} %>
     <% end %>
   </span>
   
     <% end %>
   </span>
   
diff --git a/app/views/notifier/lost_password.rhtml b/app/views/notifier/lost_password.rhtml
new file mode 100644 (file)
index 0000000..78d3a51
--- /dev/null
@@ -0,0 +1,8 @@
+Hi,
+
+Someone (possibly you) has asked for the password to be reset on this
+email addresses openstreetmap.org account.
+
+If this is you, please click the link below to reset your password.
+
+<%= @url %>
index 88d207a14a0c4ee75634921572ed57a202dd0d6c..31fe7e4159a39b674e5e36fffc86c9530989dd08 100644 (file)
@@ -3,11 +3,11 @@ Please login or <%= link_to 'create an account', :controller => 'user', :action
 
 <%= start_form_tag :action => 'login' %>
 <table>
 
 <%= start_form_tag :action => 'login' %>
 <table>
-  <tr><td>Login name</td><td><%= text_field('user', 'email',{:size => 50, :maxlength => 255}) %></td></tr>
+  <tr><td>email address:</td><td><%= text_field('user', 'email',{:size => 50, :maxlength => 255}) %></td></tr>
   <tr><td>password:</td><td><%= password_field('user', 'password',{:size => 50, :maxlength => 255}) %></td></tr>
 </table>
 
 <br>
 <input type="submit" value="Login">
 
   <tr><td>password:</td><td><%= password_field('user', 'password',{:size => 50, :maxlength => 255}) %></td></tr>
 </table>
 
 <br>
 <input type="submit" value="Login">
 
-<%= end_form_tag %> (<%= link_to 'Forgotten your password?', :controller => 'user', :action => 'lost_password' %>)
+<%= end_form_tag %> (<%= link_to 'Lost your password?', :controller => 'user', :action => 'lost_password' %>)
diff --git a/app/views/user/lost_password.rhtml b/app/views/user/lost_password.rhtml
new file mode 100644 (file)
index 0000000..ab60cd8
--- /dev/null
@@ -0,0 +1,8 @@
+<h1>Forgotten Password?</h1><br>
+
+<%= start_form_tag :action => 'lost_password' %>
+<table>
+  <tr><td>email address:</td><td><%= text_field('user', 'email', {:size => 50, :maxlength => 255} ) %></td></tr>
+</table>
+<br>
+<input type="submit" value="Send me a new password">
index bc237f0a96a1153fbc0506cf5f4d8b1d761b2db0..681182321fbadb9d8bcad7d78b97b656f2f2c9be 100644 (file)
@@ -1,14 +1,14 @@
 <h1>Create a user account</h1><br>
 Fill in the form and we'll send you a quick email to activate your account.<br><br>
 
 <h1>Create a user account</h1><br>
 Fill in the form and we'll send you a quick email to activate your account.<br><br>
 
-By creating an account, you agree that all work uploaded to openstreetmap.org and all data created by use of any tools on openstreetmap.org is to be licensed under <a href="http://creativecommons.org/licenses/by-sa/2.0/">this</a> Creative Commons license.<br><br>
+By creating an account, you agree that all work uploaded to openstreetmap.org and all data created by use of any tools which connect to openstreetmap.org is to be licensed under this <a href="http://creativecommons.org/licenses/by-sa/2.0/">this Creative Commons license (by-sa)</a>.<br><br>
 
 <%= error_messages_for 'user' %>
 
 <%= start_form_tag :action => 'save' %>
 <table>
 
 <%= error_messages_for 'user' %>
 
 <%= start_form_tag :action => 'save' %>
 <table>
-  <tr><td>email address:</td><td><%= text_field('user', 'email',{:size => 50, :maxlength => 255}) %></td></tr>
-  <tr><td>Login name</td><td><%= text_field('user', 'display_name',{:size => 50, :maxlength => 255}) %></td></tr>
+  <tr><td>email:</td><td><%= text_field('user', 'email',{:size => 50, :maxlength => 255}) %></td></tr>
+  <tr><td>login name</td><td><%= text_field('user', 'display_name',{:size => 50, :maxlength => 255}) %></td></tr>
   <tr><td>password:</td><td><%= password_field('user', 'pass_crypt',{:size => 50, :maxlength => 255}) %></td></tr>
   <tr><td>retype password:</td><td><%= password_field('user', 'pass_crypt_confirmation',{:size => 50, :maxlength => 255}) %></td></tr>
 </table>
   <tr><td>password:</td><td><%= password_field('user', 'pass_crypt',{:size => 50, :maxlength => 255}) %></td></tr>
   <tr><td>retype password:</td><td><%= password_field('user', 'pass_crypt_confirmation',{:size => 50, :maxlength => 255}) %></td></tr>
 </table>
index 5c95e148dea86e04807f59e3c8e4af4f5477e6d5..4f898ea76382e8b17cd4879ab818016ffe34903c 100644 (file)
@@ -20,6 +20,7 @@ ActionController::Routing::Routes.draw do |map|
   map.connect '/login.html', :controller => 'user', :action => 'login'
   map.connect '/logout.html', :controller => 'user', :action => 'logout'
   map.connect '/create-account.html', :controller => 'user', :action => 'new'
   map.connect '/login.html', :controller => 'user', :action => 'login'
   map.connect '/logout.html', :controller => 'user', :action => 'logout'
   map.connect '/create-account.html', :controller => 'user', :action => 'new'
+  map.connect '/forgot-password.html', :controller => 'user', :action => 'lost_password'
 
   map.connect ':controller/:action/:id'
 end
 
   map.connect ':controller/:action/:id'
 end
index 2a38965916320aa83a8c36f6f888a75b3c36559a..2c7e454dbe4899a21c7811c99374f807baf29b67 100644 (file)
@@ -1,4 +1,3 @@
-\r
 a {\r
   color: #0000ff;\r
   text-decoration: none;\r
 a {\r
   color: #0000ff;\r
   text-decoration: none;\r
@@ -373,10 +372,8 @@ hides rule from IE5-Mac \*/
 \r
 #notice {\r
   width: 400px;\r
 \r
 #notice {\r
   width: 400px;\r
-  border: 2px solid green;\r
+  border: 1px solid black;\r
   padding: 7px;\r
   padding: 7px;\r
-  padding-bottom: 12px;\r
-  margin-bottom: 20px;\r
   background-color: #f0f0f0;\r
 }\r
 \r
   background-color: #f0f0f0;\r
 }\r
 \r
@@ -410,3 +407,6 @@ hides rule from IE5-Mac \*/
   list-style: square;\r
 }\r
 \r
   list-style: square;\r
 }\r
 \r
+input {\r
+ border: 1px solid black;\r
+}\r