<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>config/example/database.yml</filename>
    </added>
    <added>
      <filename>db/migrate/20090820151620_add_remember_token_to_users.rb</filename>
    </added>
    <added>
      <filename>db/schema.example.rb</filename>
    </added>
    <added>
      <filename>script/setup</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -26,8 +26,8 @@ Plus the following which are *optional*:
 
 The following configuration files need to be present:
 
-* `config/database.yml` (example at `config/database.yml.template`)
-* `config/app_keys.yml` (example at `config/app_keys.yml.template`)
+* `config/database.yml` (example at `config/examples/database.yml.template`)
+* `config/app_keys.yml` (generated by setup script)
 
 ## Deployment
 
@@ -42,9 +42,9 @@ An example VirtualHost for Phusion Passenger deployment would be:
 	   DocumentRoot /path/to/railscollab/public
     &lt;/VirtualHost&gt;
 
-In order to facilitate deployment, a rake task called db:railscollab:install
+In order to facilitate deployment, a script located at `script/setup` 
 has been provided, which will create an initial database.
-The rake task accepts the following environment variables:
+It accepts the following environment variables:
 
 	RAILSCOLLAB_INITIAL_USER
 		The username of the administrative user
@@ -67,7 +67,7 @@ The rake task accepts the following environment variables:
 
 So from scratch, you'd likely do something like to following to install:
 1. Create a 'railscollab' database
-2. Create a config/database.yml file based on config/database.yml.template, using either the development or production environments as your basis.
+2. Create a config/database.yml file based on config/example/database.yml
 3. Run the snippit below
 4. Insert the previously mentioned VirtualHost configuration into your Phusion Passenger installation.
 5. Go to http://servername and login using your supplied credentials
@@ -80,7 +80,7 @@ The snippit:
 	RAILSCOLLAB_INITIAL_EMAIL=&quot;billg@microsoft.com&quot; \
 	RAILSCOLLAB_INITIAL_COMPANY=&quot;Microsoft&quot; \
 	RAILSCOLLAB_SITE_URL=&quot;projects.microsoft.com&quot; \
-	rake db:railscollab:install
+	script/setup 
 
 
 For more advanced deployment (e.g. using FastCGI or load balancing proxies), refer to the Ruby on Rails documentation.</diff>
      <filename>INSTALL.markdown</filename>
    </modified>
    <modified>
      <diff>@@ -22,7 +22,13 @@ whose access can be restricted to certain elements of the project.
 
 ## How can i install / upgrade?
 
-Refer to the [INSTALL.markdown] [3] and [UPGRADE.markdown] [4] files
+Simply run the following:
+
+    script/setup
+
+And login using the username `admin`, with the password `password`.
+
+For more advanced setup options, refer to the [INSTALL.markdown] [3] and [UPGRADE.markdown] [4] files
 
 ## I do i do [x]?
 </diff>
      <filename>README.markdown</filename>
    </modified>
    <modified>
      <diff>@@ -24,20 +24,20 @@ class SessionsController &lt; ApplicationController
   filter_parameter_logging :password
 
   def new
-    redirect_to :controller =&gt; 'dashboard' unless @logged_user.nil?
+    redirect_to :controller =&gt; 'dashboard' unless logged_user.nil?
   end
 
   def create
-    remember = params['remember']
     if params[:openid_url]
       openid_login
     else
       username_login
     end
+    remember(logged_user) if params['remember']
   end
 
   def destroy
-    session['user_id'] = nil
+    forget(logged_user)
     redirect_to login_path
   end
 </diff>
      <filename>app/controllers/sessions_controller.rb</filename>
    </modified>
    <modified>
      <diff>@@ -153,6 +153,22 @@ class User &lt; ActiveRecord::Base
     result == self.token
   end
 
+  def remember?
+    remember_expires_at &amp;&amp; Time.now.utc &lt; remember_expires_at
+  end
+
+  def remember_me!
+    self.remember_expires_at = 2.weeks.from_now.utc
+    self.remember = Digest::SHA1.hexdigest(salt + remember_expires_at.to_s + token)
+    save(false)
+  end
+
+  def forget_me!
+    self.remember = nil
+    self.remember_expires_at = nil
+    save(false)
+  end
+
   def self.openid_login(identity_url)
     user = first(:conditions =&gt; ['identity_url = ?', identity_url])
     return nil if user.nil?
@@ -340,8 +356,6 @@ class User &lt; ActiveRecord::Base
     self.ar_to_xml(options.merge(default_options), &amp;block)
   end
 
-  protected
-
   before_create :process_params
   before_update :process_update_params
 </diff>
      <filename>app/models/user.rb</filename>
    </modified>
    <modified>
      <diff>@@ -8,6 +8,9 @@
     &lt;label for=&quot;loginPassword&quot;&gt;&lt;%= :password.l %&gt;&lt;/label&gt;
     &lt;%= password_field &quot;login&quot;, &quot;password&quot;, :size =&gt; 30, :id =&gt; 'loginPassword', :class =&gt; 'medium' %&gt;
   &lt;/div&gt;
+  
+  &lt;%= check_box_tag :remember, '1', false, :class =&gt; 'checkbox' %&gt;
+  &lt;label class=&quot;checkbox&quot; for=&quot;remember&quot;&gt;&lt;%= :remember_me.l %&gt;&lt;/label&gt;
   &lt;div class=&quot;clean&quot;&gt;&lt;/div&gt;
   
   &lt;span&gt;&lt;%= link_to :forgot_password_q.l , new_password_path %&gt;</diff>
      <filename>app/views/sessions/new.html.erb</filename>
    </modified>
    <modified>
      <diff>@@ -32,7 +32,6 @@ Rails::Initializer.run do |config|
   config.gem 'ferret',       :version =&gt; '&gt;=0.11.6'
   config.gem 'icalendar',    :version =&gt; '&gt;=1.0.2'
   config.gem 'ruby-openid',  :version =&gt; '&gt;=2.1.2', :lib =&gt; 'openid'
-  require 'acts_as_ferret'
   config.gem 'acts_as_ferret',    :version =&gt; '&gt;=0.4.4'
 
   # optional gems</diff>
      <filename>config/environment.rb</filename>
    </modified>
    <modified>
      <diff>@@ -37,6 +37,9 @@
   sort_by_hours: Sortieren nach Stunden
   report_by_task: Aufschl&#252;sseln nach Aufgaben
   
+  as_list: View List
+  as_summary: View Summary
+  
   # Page titles &amp; actions
   add_project: Projekt hinzuf&#252;gen
   add_user: Mitarbeiter hinzuf&#252;gen
@@ -53,6 +56,7 @@
   add_folder: Ordner hinzuf&#252;gen
   edit_folder: Ordner bearbeiten
   forgot_password: Passwort vergessen
+  remember_me: Remember me
   login: Anmelden
   update_permissions: Rechte aktualisieren
   update_people: Personen aktualisieren
@@ -433,9 +437,9 @@
   phone_numbers: Phone numbers
   office: Office
   fax: Fax
+  fax_number: Fax number
   mobile: Mobile
   home: Home
-  fax_number: Fax number
   homepage: Homepage
   address: Address
   address_2: Address 2</diff>
      <filename>config/locales/de.yml</filename>
    </modified>
    <modified>
      <diff>@@ -39,6 +39,9 @@ en-US:
   sort_by_hours: Sort by hours
   report_by_task: Report by task
   
+  as_list: View List
+  as_summary: View Summary
+  
   # Page titles &amp; actions
   add_project: Add project
   add_user: Add user
@@ -55,6 +58,7 @@ en-US:
   add_folder: Add folder
   edit_folder: Edit folder
   forgot_password: Forgot password
+  remember_me: Remember me
   login: Login
   update_permissions: Update permissions
   update_people: Update people
@@ -447,6 +451,7 @@ en-US:
   office: Office
   office_ext: Office extension
   fax: Fax
+  fax_number: Fax number
   mobile: Mobile
   home: Home
   homepage: Homepage</diff>
      <filename>config/locales/en-US.yml</filename>
    </modified>
    <modified>
      <diff>@@ -57,6 +57,7 @@ en:
   add_folder: Add folder
   edit_folder: Edit folder
   forgot_password: Forgot password
+  remember_me: Remember me
   login: Login
   update_permissions: Update permissions
   update_people: Update people</diff>
      <filename>config/locales/en.yml</filename>
    </modified>
    <modified>
      <diff>@@ -38,6 +38,9 @@ es:
   sort_by_hours: Ordenar por horas
   report_by_task: Informe por tarea
   
+  as_list: Ver lista
+  as_summary: Ver resumen
+  
   # Page titles &amp; actions
   add_project: A&#241;adir proyecto
   add_user: A&#241;adir usuario
@@ -54,6 +57,7 @@ es:
   add_folder: A&#241;adir carpeta
   edit_folder: Editar carpeta
   forgot_password: Olvid&#233; mi contrase&#241;a
+  remember_me: Recu&#233;rdame
   login: Iniciar sesi&#243;n
   update_permissions: Actualizar permisos
   update_people: Actualizar gente
@@ -458,6 +462,7 @@ es:
   office: Oficina
   office_ext: Extensi&#243;n de oficina
   fax: Fax
+  fax_number: N&#250;mero de fax
   mobile: M&#243;vil
   home: Casa
   homepage: P&#225;gina web</diff>
      <filename>config/locales/es.yml</filename>
    </modified>
    <modified>
      <diff>@@ -37,6 +37,9 @@ zh-CN:
   sort_by_hours: &#25353;&#24037;&#26102;&#25490;&#24207;
   report_by_task: &#20219;&#21153;&#25253;&#21578;
   
+  as_list: View List
+  as_summary: View Summary
+  
   # Page titles &amp; actions
   add_project: &#21019;&#24314;&#39033;&#30446;
   add_user: &#28155;&#21152;&#29992;&#25143;
@@ -53,6 +56,7 @@ zh-CN:
   add_folder: &#28155;&#21152;&#25991;&#20214;&#22841;
   edit_folder: &#32534;&#36753;&#25991;&#20214;&#22841;
   forgot_password: &#24536;&#35760;&#23494;&#30721;
+  remember_me: Remember me
   login: &#30331;&#24405;
   update_permissions: &#26356;&#26032;&#26435;&#38480;
   update_people: &#26356;&#26032;&#29992;&#25143;&#20449;&#24687;</diff>
      <filename>config/locales/zh-CN.yml</filename>
    </modified>
    <modified>
      <diff>@@ -1,7 +1,7 @@
 class NewTimezone &lt; ActiveRecord::Migration
   def self.up
-    add_column :users, :time_zone, :string, :null =&gt; false
-    add_column :companies, :time_zone, :string, :null =&gt; false
+    add_column :users, :time_zone, :string, :null =&gt; false, :default =&gt; ''
+    add_column :companies, :time_zone, :string, :null =&gt; false, :default =&gt; ''
     
     User.find(:all).each do |user|
         user.time_zone = TimeZone[user.timezone].name</diff>
      <filename>db/migrate/009_new_timezone.rb</filename>
    </modified>
    <modified>
      <diff>@@ -65,6 +65,10 @@ module LoginSystem
     false
   end
 
+  def logged_user
+    @logged_user ||= user_from_session || user_from_cookie
+  end
+
   # login_required filter. add
   #
   #   before_filter :login_required
@@ -81,25 +85,21 @@ module LoginSystem
       return true if token_login_accepted
     end
 
-	do_action = false
+    do_action = false
 
-	if request.accepts.first == Mime::XML
+    if request.accepts.first == Mime::XML
       # HTTP basic authentication for XML / YAML requests
       @logged_user = nil
 
       authenticate_or_request_with_http_basic do |user_name, password|
         @logged_user = User.authenticate(user_name, password)
       end
-	else
-      # Session authentication
-      if session['user_id'].nil?
-        @logged_user = nil
-      else
-        @logged_user = User.first(:conditions =&gt; ['id = ?', session['user_id']])
-      end
+    else
+      # Session or cookie authentication
+      session['user_id'] = logged_user.id unless logged_user.nil?
 
       do_action = true
-	end
+    end
 
     # Don't exist? what a pity!
     if @logged_user.nil?
@@ -144,6 +144,28 @@ module LoginSystem
     true
   end
 
+  def user_from_cookie
+    if token = cookies[:remember_token]
+      return nil unless user = User.find_by_remember(token)
+      return user if user.remember?
+    end
+  end
+
+  def user_from_session
+    User.first(:conditions =&gt; ['id = ?', session['user_id']]) if session['user_id']
+  end
+
+  def remember(user)
+    user.remember_me!
+    cookies[:remember_token] = { :value =&gt; user.remember, :expires =&gt; user.remember_expires_at }
+  end
+
+  def forget(user)
+    user.forget_me! if user
+    cookies.delete(:remember_token)
+    session['user_id'] = nil
+  end
+
   # overwrite if you want to have special behavior in case the user is not authorized
   # to access the current operation.
   # the default action is to redirect to the login screen</diff>
      <filename>lib/login_system.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,6 +1,3 @@
-#content form {
-  position: relative
-}
 #content fieldset {
   border: 0px;
   margin: 0px;</diff>
      <filename>public/themes/default/stylesheets/project/wiki.css</filename>
    </modified>
  </modified>
  <removed type="array">
    <removed>
      <filename>config/app_keys.example.yml</filename>
    </removed>
    <removed>
      <filename>config/database.yml.template</filename>
    </removed>
    <removed>
      <filename>db/schema.rb</filename>
    </removed>
  </removed>
  <parents type="array">
    <parent>
      <id>ecf1961c35188f68c30e4fdffae28d6b5327d82f</id>
    </parent>
    <parent>
      <id>dd0308f564d075d6d83bd7e1c4146e9594a6f90f</id>
    </parent>
  </parents>
  <author>
    <name>Sergio</name>
    <email>sergio@entrecables.com</email>
  </author>
  <url>http://github.com/jamesu/railscollab/commit/2cad7c475609bbc9cd8c747ee429ae38e557a82b</url>
  <id>2cad7c475609bbc9cd8c747ee429ae38e557a82b</id>
  <committed-date>2009-08-31T01:33:43-07:00</committed-date>
  <authored-date>2009-08-31T01:33:43-07:00</authored-date>
  <message>Merge commit 'jamesu/master'</message>
  <tree>bfd086a367a92281b3d1382be54892f1e4a5dfb6</tree>
  <committer>
    <name>Sergio</name>
    <email>sergio@entrecables.com</email>
  </committer>
</commit>
