Improved user device management.

This commit is contained in:
Martin Edenhofer 2016-04-11 09:35:27 +02:00
parent 6b219b724b
commit 2a295e78ab
4 changed files with 62 additions and 13 deletions

View file

@ -123,12 +123,16 @@ class ApplicationController < ActionController::Base
return if session[:user_device_update_at] && session[:user_device_update_at] > diff
session[:user_device_update_at] = Time.zone.now
UserDevice.action(
user_device = UserDevice.action(
session[:user_device_id],
session[:user_agent],
session[:remote_ip],
session[:user_id],
)
# remember if location has changed
return if !user_device
session[:user_device_id] = user_device.id
end
def user_device_log(user, type)

View file

@ -93,6 +93,7 @@ store new device for user if device not already known
os: browser[:plattform],
browser: browser[:name],
location: location,
fingerprint: fingerprint,
)
if user_device
@ -141,11 +142,10 @@ log user device action
=end
def self.action(user_device_id, _user_agent, ip, _user_id)
def self.action(user_device_id, user_agent, ip, user_id)
user_device = UserDevice.find(user_device_id)
# update location if needed
notify = false
if user_device.ip != ip
user_device.ip = ip
location_details = Service::GeoIp.location(ip)
@ -155,19 +155,19 @@ log user device action
# notify if country has changed
if user_device.location != location
notify = true
user_device.location = location
return UserDevice.add(
user_agent,
ip,
user_id,
user_device.fingerprint,
'session',
)
end
end
# update attributes
user_device.updated_at = Time.zone.now # force update, also if no other attribute has changed
user_device.save
if notify
user_device.notification_send('user_device_new_location')
end
user_device
end

View file

@ -7,7 +7,7 @@ class Service::GeoIp::Zammad
# check cache
cache_key = "zammadgeoip::#{address}"
cache = Cache.get( cache_key )
cache = Cache.get(cache_key)
return cache if cache
# do lookup
@ -36,10 +36,10 @@ class Service::GeoIp::Zammad
data['country_code'] = data['country_code2']
end
Cache.write( cache_key, data, { expires_in: 90.days } )
Cache.write(cache_key, data, { expires_in: 90.days })
rescue => e
Rails.logger.error "#{host}#{url}: #{e.inspect}"
Cache.write( cache_key, data, { expires_in: 60.minutes } )
Cache.write(cache_key, data, { expires_in: 60.minutes })
end
data
end

View file

@ -197,4 +197,49 @@ class UserDeviceTest < ActiveSupport::TestCase
end
test 'ddd - api test' do
# signin with fingerprint A from country A via session -> new device #1
user_device1 = UserDevice.add(
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.107 Safari/537.36',
'91.115.248.231',
@agent.id,
'fingerprint1234',
'session',
)
user_device1_1 = UserDevice.action(
user_device1.id,
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.107 Safari/537.36',
'91.115.248.231',
@agent.id,
)
assert_equal(user_device1.id, user_device1_1.id)
user_device1_2 = UserDevice.add(
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.107 Safari/537.36',
'91.115.248.231',
@agent.id,
'fingerprint1234',
'session',
)
assert_equal(user_device1.id, user_device1_2.id)
user_device1_3 = UserDevice.add(
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.107 Safari/537.36',
'91.115.248.231',
@agent.id,
'fingerprintABC',
'session',
)
assert_not_equal(user_device1.id, user_device1_3.id)
# log with fingerprint A from country B via session -> new device #2
user_device2 = UserDevice.action(
user_device1.id,
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.107 Safari/537.36',
'176.198.137.254',
@agent.id,
)
assert_not_equal(user_device1.id, user_device2.id)
end
end