teensyweb/
teensyweb/app/models/
teensyweb/app/views/account/
teensyweb/app/views/layouts/
teensyweb/app/views/notifications/
teensyweb/app/views/repository/
teensyweb/config/
teensyweb/config/environments/
teensyweb/db/migrate/
teensyweb/doc/
teensyweb/lib/
teensyweb/public/images/
teensyweb/public/javascripts/
teensyweb/public/stylesheets/
teensyweb/script/
teensyweb/script/performance/
teensyweb/script/process/
teensyweb/test/
teensyweb/test/fixtures/
teensyweb/test/fixtures/notifications/
#
# file::    account_controller.rb
# author::  Jon A. Lambert
# version:: 0.1.0
# date::    1/6/2006
#
# This source code copyright (C) 2006 by Jon A. Lambert
# All rights reserved.
#
# Released under the terms of the TeensyWeb Public License
# See LICENSE file for additional information.
#

class AccountController < ApplicationController
  before_filter :admin_required, :only => [:delete]
  before_filter :login_required, :only => [:edit, :list, :index]

  layout  'layout'

  def random_password
    ("a".."z").to_a.sort_by { rand }[0..5].to_s
  end

  def index
    redirect_to :action => 'list'
  end

  def login
    @title = "Please login"
    if request.post?
      case params['commit']
      when 'Login'
        params['password'] = params['password'].strip
        if session['user'] = User.authenticate(params['login'], params['password'])
          flash['notice']  = "Login successful"
          redirect_back_or_default :controller => "wiki"
        else
          flash.now['notice']  = "Login unsuccessful"
          @login = params['login']
        end
      when 'Forgot Password'
        @user = User.find_by_login(params['login'])
        if !@user
          flash['notice']  = 'No user by that name'
        end
        pw = random_password
        @user.password = pw
        @user.save
        if @user.errors.empty?
          flash['notice']  = "Sent password"
          Notifications.deliver_forgot_password(@user, pw) if TWCONFIG['mail_on']
          session['user'] = nil
          redirect_back_or_default :controller => "wiki"
        else
          flash['notice'] = @user.errors.full_messages.join("<br />")
        end
      end
    end
  end

  def signup
    @title = "Signup for account"
    if request.post?
      pw = random_password
      @user = User.new('login' => params['login'],
                       'email' => params['email'],
                       'password' => pw,
                       'admin' => (User.count == 0 ? 1 : 0)
                       )
      @user.save
      if @user.errors.empty?
        flash['notice']  = "Signup successful"
        Notifications.deliver_signup(@user, pw) if TWCONFIG['mail_on']
        redirect_back_or_default :controller => "wiki"
      else
        flash['notice'] = @user.errors.full_messages.join("<br />")
      end
    end
  end

  def logout
    if !user?
      flash['notice']  = "You aren't logged in"
    else
      session['user'] = nil
      flash['notice']  = "Logged out"
    end
    redirect_back_or_default :controller => "wiki"
  end

  def welcome
  end

  def list
    @title = "User listing"
    @users = User.find_all
  end

  def edit
    if request.get?
      if admin? || session['user'].login == params['id']
        @user = User.find_by_login(params['id'])
        if !@user.errors.empty?
          flash['notice'] = @user.errors.full_messages.join("<br />")
          redirect_back_or_default :controller => "wiki"
        end
        @title = "User preferences for #{@user.login}"
      else
        flash['notice']  = "Can't do user preferences"
        redirect_back_or_default :controller => "wiki"
      end
    else
      @user = User.find_by_login(params['id'])
      @title = "User preferences for #{@user.login}"
      case params['commit']
      when 'Update'
        @user.email = params['email']
        @user.admin = (params['admin'] && params['admin'] == '1') ? 1 : 0
        @user.password = ''
        @user.save_with_validation(false)
        if @user.errors.empty?
          flash['notice']  = "Preferences saved"
          redirect_back_or_default :controller => "wiki"
        else
          flash['notice'] = @user.errors.full_messages.join("<br />")
        end
      when 'Change Password'
        params['password'] = params['password'].strip
        params['password_confirmation'] = params['password_confirmation'].strip
        if params['password'] != params['password_confirmation']
          flash['notice']  = "Password and confirmation don't match"
        else
          @user.password = params['password']
          @user.save
          if @user.errors.empty?
            flash['notice']  = "Password changed"
            session['user'] = nil
            redirect_back_or_default :controller => "wiki"
          else
            flash['notice'] = @user.errors.full_messages.join("<br />")
          end
        end
      end
    end
  end

  def delete
    if params['id']
      @user = User.find_by_login(params['id'])
      @user.destroy
      if !@user.errors.empty?
        flash['notice'] = @user.errors.full_messages.join("<br />")
      end
    end
    redirect_to :action => 'list'
  end

end