user_device.rb 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. # Copyright (C) 2012-2014 Zammad Foundation, http://zammad-foundation.org/
  2. class UserDevice < ApplicationModel
  3. store :device_details
  4. store :location_details
  5. validates :name, presence: true
  6. =begin
  7. store device for user
  8. user_device = UserDevice.add(
  9. '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',
  10. '172.0.0.1',
  11. user.id,
  12. 'fingerprintABC123',
  13. 'session', # session|basic_auth|token_auth|sso
  14. )
  15. =end
  16. def self.add(user_agent, ip, user_id, fingerprint, type)
  17. # get location info
  18. location_details = Service::GeoIp.location(ip)
  19. location = location_details['country_name']
  20. # find device by fingerprint
  21. if fingerprint
  22. user_device = UserDevice.find_by(
  23. user_id: user_id,
  24. fingerprint: fingerprint,
  25. location: location,
  26. )
  27. return action(user_device.id, user_agent, ip, user_id) if user_device
  28. end
  29. # for basic_auth|token_auth search for user agent
  30. if type == 'basic_auth' || type == 'token_auth'
  31. user_device = UserDevice.find_by(
  32. user_id: user_id,
  33. user_agent: user_agent,
  34. location: location,
  35. )
  36. return action(user_device.id, user_agent, ip, user_id) if user_device
  37. end
  38. # get browser details
  39. browser = Browser.new(:ua => user_agent, :accept_language => 'en-us')
  40. browser = {
  41. plattform: browser.platform.to_s.camelize,
  42. name: browser.name,
  43. version: browser.version,
  44. full_version: browser.full_version,
  45. }
  46. # generate device name
  47. name = browser[:plattform] || ''
  48. if browser[:name]
  49. if name
  50. name += ', '
  51. end
  52. name += browser[:name]
  53. end
  54. # if not identified, use user agent
  55. if name == 'Other, Other'
  56. name = user_agent
  57. browser[:name] = user_agent
  58. end
  59. # check if exists
  60. user_device = self.find_by(
  61. user_id: user_id,
  62. os: browser[:plattform],
  63. browser: browser[:name],
  64. location: location,
  65. )
  66. if user_device
  67. return action(user_device.id, user_agent, ip, user_id) if user_device
  68. end
  69. # create new device
  70. self.create(
  71. user_id: user_id,
  72. name: name,
  73. os: browser[:plattform],
  74. browser: browser[:name],
  75. location: location,
  76. device_details: browser,
  77. location_details: location_details,
  78. user_agent: user_agent,
  79. ip: ip,
  80. fingerprint: fingerprint,
  81. )
  82. end
  83. =begin
  84. log user device action
  85. UserDevice.action(
  86. user_device_id,
  87. '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',
  88. '172.0.0.1',
  89. user.id,
  90. )
  91. =end
  92. def self.action(user_device_id, user_agent, ip, user_id)
  93. user_device = UserDevice.find(user_device_id)
  94. # update location if needed
  95. if user_device.ip != ip
  96. user_device.ip = ip
  97. location_details = Service::GeoIp.location(ip)
  98. user_device.location_details = location_details
  99. location = location_details['country_name']
  100. user_device.location = location
  101. end
  102. # update attributes
  103. user_device.save
  104. user_device
  105. end
  106. end