Skip to content

Commit

Permalink
Merge branch 'master' of https://github.com/kai-ramuenke/RapidFTR int…
Browse files Browse the repository at this point in the history
…o kai-ramuenke-master
  • Loading branch information
cgeorge committed Dec 7, 2010
2 parents eff28ed + 89660eb commit e131472
Show file tree
Hide file tree
Showing 10 changed files with 137 additions and 7 deletions.
3 changes: 3 additions & 0 deletions Gemfile.lock
Expand Up @@ -103,3 +103,6 @@ DEPENDENCIES
uuidtools (= 2.1.1)
validatable (= 1.6.7)
webrat (= 0.7.1)

METADATA
version: 1.0.6
12 changes: 11 additions & 1 deletion app/models/login.rb
Expand Up @@ -8,13 +8,23 @@ class Login
def initialize(params)
@user_name = params[:user_name]
@password = params[:password]
@imei = params[:imei]
@mobile_number = params[:mobile_number]
end

def authenticate_user
user = User.find_by_user_name(@user_name)

#Session.new(:user_name => @user_name)
Session.for_user( user ) unless user.nil? or !user.authenticate(@password)
session = Session.for_user( user ) unless user.nil? or !user.authenticate(@password)

if session and @imei
user.add_mobile_login_event(@imei, @mobile_number)
user.save
end


session
end

def errors
Expand Down
12 changes: 12 additions & 0 deletions app/models/mobile_login_event.rb
@@ -0,0 +1,12 @@
class MobileLoginEvent < Hash
include CouchRest::CastedModel

property :imei
property :mobile_number
property :timestamp

def initialize properties
super(properties)
self[:timestamp] ||= Time.now
end
end
16 changes: 14 additions & 2 deletions app/models/user.rb
Expand Up @@ -13,6 +13,7 @@ class User < CouchRestRails::Document
property :position
property :location
property :disabled, :cast_as => :boolean
property :mobile_login_history, :cast_as => ['MobileLoginEvent']
attr_accessor :password_confirmation, :password


Expand Down Expand Up @@ -58,6 +59,12 @@ def self.find_by_user_name(user_name)
User.by_user_name(:key => user_name.downcase).first
end

def initialize args={}
self["mobile_login_history"] = []
super args
end


def is_user_name_unique
user = User.find_by_user_name(user_name)
return true if user.nil? or self.id == user.id
Expand All @@ -78,6 +85,10 @@ def encrypt(password)
def make_admin
self.user_type = "Administrator"
end

def add_mobile_login_event imei, mobile_number
self.mobile_login_history << MobileLoginEvent.new(:imei => imei, :mobile_number => mobile_number)
end

private

Expand All @@ -94,9 +105,10 @@ def self.encrypt(password, salt)
def password_required?
crypted_password.blank? || !password.blank?
end



def make_user_name_lowercase
user_name.downcase!
user_name.downcase!
end

def auto_fill_password_confirmation_if_not_supplied
Expand Down
21 changes: 21 additions & 0 deletions app/views/users/_mobile_login_history.html.erb
@@ -0,0 +1,21 @@
<div class="device-information">
<h3>Device Information</h3>
<table>
<tr>
<th>Timestamp</th>
<th>IMEI</th>
<th>Mobile Number</th>
</tr>


<% @user.mobile_login_history.reverse.each do |event| %>
<tr>
<td><%= event[:timestamp] %></td>
<td><%= event[:imei] %></td>
<td><%= event[:mobile_number] %></td>
</tr>
<% end %>

</table>

</div>
4 changes: 3 additions & 1 deletion app/views/users/edit.html.erb
@@ -1,3 +1,5 @@
<% @page_name = "Editing user: #{@user.full_name}" %>
<%= render :partial => "edittable_user", :object => @user %>
<%= render :partial => "edittable_user", :object => @user %>
<%= render :partial => "mobile_login_history", :object => @user %>
5 changes: 3 additions & 2 deletions app/views/users/show.html.erb
Expand Up @@ -38,6 +38,7 @@
<%=h @user.location %>
</p>

<%= link_to 'Edit', edit_user_path(@user) %> |
<%= link_to 'Back', users_path %>
<%= link_to 'Edit', edit_user_path(@user) %> |
<%= link_to 'Back', users_path %>
<%= render :partial => "mobile_login_history", :object => @user %>
5 changes: 4 additions & 1 deletion public/stylesheets/core.css
Expand Up @@ -36,7 +36,7 @@ tfoot th { font-weight: normal; font-size: 0.75em;}
.default-form label { float: left; text-align: right; width: 150px; margin-right: 10px; font-weight: bold; color: #678; }
.default-form input[type=text],
.default-form select { width: 200px; height: 1.7em; }
.default-form h3 { border-bottom: 1px solid #678; padding-bottom: .5em; margin-bottom: 1em; }
.default-form h3, .device-information h3 { border-bottom: 1px solid #678; padding-bottom: .5em; margin-bottom: 1em; }

/* default: forms > List of radio buttons */
.default-form dl.radioList { overflow: hidden; }
Expand Down Expand Up @@ -65,6 +65,9 @@ tfoot th { font-weight: normal; font-size: 0.75em;}
/* default : forms > field errors */
.default-form .field-error input {background:#ff7373; border: 1px solid #ff0700;}

/*device-information */
.device-information { clear: both; margin-top: 3em; }

/* page-container */
.page-container { margin: 0 auto; width: 960px; }

Expand Down
48 changes: 48 additions & 0 deletions spec/models/login_spec.rb
@@ -0,0 +1,48 @@
require 'spec_helper'

describe Login do
describe "authenticate" do
it "should save imei on successful login" do
imei = "1334"
mobile_number = "555-555"

user = mock(User).as_null_object
User.stub(:find_by_user_name).and_return(user)
user.stub(:authenticate).and_return true

user.should_receive(:add_mobile_login_event).with(imei, mobile_number)
user.should_receive(:save)

params = {:imei => imei, :mobile_number => mobile_number}
login = Login.new(params)
login.authenticate_user
end

it "should not save mobile login event on failed authentication" do
imei = "1334"
mobile_number = "555-555"

user = mock(User).as_null_object
User.stub(:find_by_user_name).and_return(user)
user.stub(:authenticate).and_return false

user.should_not_receive(:add_mobile_login_event).with(imei, mobile_number)

params = {:imei => imei, :mobile_number => mobile_number}
login = Login.new(params)
login.authenticate_user
end

it "should not save mobile login events for non-mobile logins" do
user = mock(User).as_null_object
User.stub(:find_by_user_name).and_return(user)
user.stub(:authenticate).and_return true

user.should_not_receive(:add_mobile_login_event)

params = {}
login = Login.new(params)
login.authenticate_user
end
end
end
18 changes: 18 additions & 0 deletions spec/models/user_spec.rb
Expand Up @@ -98,4 +98,22 @@ def build_and_save_user( options = {} )
user.authenticate("thepass").should be_true
end

it "should be able to store a mobile login event" do
imei = "1337"
mobile_number = "555-555"
now = Time.now
user = build_user
user.create!

Time.stub(:now).and_return(now)

user.add_mobile_login_event(imei, mobile_number)
user.save

event = user.mobile_login_history.first
event[:imei].should == imei
event[:mobile_number].should == mobile_number
event[:timestamp] == now
end

end

0 comments on commit e131472

Please sign in to comment.