device-tracker 0.2.2 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -1
  3. data/.rspec +2 -0
  4. data/Readme.md +1 -0
  5. data/bin/console +1 -1
  6. data/device-tracker.gemspec +8 -2
  7. data/exe/device-tracker +48 -9
  8. data/lib/device_tracker/app.rb +21 -0
  9. data/lib/{device/tracker → device_tracker}/config-schema.json +0 -0
  10. data/lib/{device/tracker → device_tracker}/config.ru +0 -0
  11. data/lib/device_tracker/controllers/application_controller.rb +220 -0
  12. data/lib/device_tracker/controllers/devices_controller.rb +313 -0
  13. data/lib/device_tracker/controllers/heartbeat_controller.rb +54 -0
  14. data/lib/device_tracker/controllers/os_controller.rb +41 -0
  15. data/lib/device_tracker/controllers/transactions_controller.rb +19 -0
  16. data/lib/device_tracker/controllers/users_controller.rb +191 -0
  17. data/lib/{device/tracker → device_tracker}/db/migrate/20150521071815_create_users.rb +0 -0
  18. data/lib/{device/tracker → device_tracker}/db/migrate/20150521082155_create_devices.rb +0 -0
  19. data/lib/{device/tracker → device_tracker}/db/migrate/20150521120335_create_operating_systems.rb +0 -0
  20. data/lib/{device/tracker → device_tracker}/db/migrate/20150527162242_create_transactions.rb +0 -0
  21. data/lib/{device/tracker → device_tracker}/db/migrate/20151027073050_create_heartbeat.rb +0 -0
  22. data/lib/{device/tracker → device_tracker}/db/migrate/20151028132946_add_user_verification.rb +0 -0
  23. data/lib/{device/tracker → device_tracker}/db/migrate/20151028141328_remove_is_active_from_users.rb +0 -0
  24. data/lib/{device/tracker → device_tracker}/db/migrate/20151029085629_add_password_reset_code_to_users.rb +0 -0
  25. data/lib/{device/tracker → device_tracker}/db/migrate/20151030130341_add_missing_column_to_devices.rb +0 -0
  26. data/lib/{device/tracker → device_tracker}/db/migrate/20151102141601_add_serial_number_to_devices.rb +0 -0
  27. data/lib/{device/tracker → device_tracker}/db/schema.rb +0 -0
  28. data/lib/device_tracker/db/seeds.rb +46 -0
  29. data/lib/{device/tracker → device_tracker}/dependencies.rb +0 -1
  30. data/lib/device_tracker/device_tracker.rb +17 -0
  31. data/lib/device_tracker/helpers/application_helper.rb +82 -0
  32. data/lib/device_tracker/models/device.rb +35 -0
  33. data/lib/device_tracker/models/heartbeat.rb +7 -0
  34. data/lib/device_tracker/models/operating_system.rb +6 -0
  35. data/lib/device_tracker/models/transaction.rb +54 -0
  36. data/lib/device_tracker/models/user.rb +20 -0
  37. data/lib/{device/tracker → device_tracker}/public/css/bootstrap-sortable.css +0 -0
  38. data/lib/{device/tracker → device_tracker}/public/css/bootstrap.min.css +0 -0
  39. data/lib/{device/tracker → device_tracker}/public/css/custom.css +0 -0
  40. data/lib/{device/tracker → device_tracker}/public/favicon.png +0 -0
  41. data/lib/{device/tracker → device_tracker}/public/favicon/android-chrome-144x144.png +0 -0
  42. data/lib/{device/tracker → device_tracker}/public/favicon/android-chrome-192x192.png +0 -0
  43. data/lib/{device/tracker → device_tracker}/public/favicon/android-chrome-36x36.png +0 -0
  44. data/lib/{device/tracker → device_tracker}/public/favicon/android-chrome-48x48.png +0 -0
  45. data/lib/{device/tracker → device_tracker}/public/favicon/android-chrome-72x72.png +0 -0
  46. data/lib/{device/tracker → device_tracker}/public/favicon/android-chrome-96x96.png +0 -0
  47. data/lib/{device/tracker → device_tracker}/public/favicon/apple-touch-icon-114x114.png +0 -0
  48. data/lib/{device/tracker → device_tracker}/public/favicon/apple-touch-icon-120x120.png +0 -0
  49. data/lib/{device/tracker → device_tracker}/public/favicon/apple-touch-icon-144x144.png +0 -0
  50. data/lib/{device/tracker → device_tracker}/public/favicon/apple-touch-icon-152x152.png +0 -0
  51. data/lib/{device/tracker → device_tracker}/public/favicon/apple-touch-icon-180x180.png +0 -0
  52. data/lib/{device/tracker → device_tracker}/public/favicon/apple-touch-icon-57x57.png +0 -0
  53. data/lib/{device/tracker → device_tracker}/public/favicon/apple-touch-icon-60x60.png +0 -0
  54. data/lib/{device/tracker → device_tracker}/public/favicon/apple-touch-icon-72x72.png +0 -0
  55. data/lib/{device/tracker → device_tracker}/public/favicon/apple-touch-icon-76x76.png +0 -0
  56. data/lib/{device/tracker → device_tracker}/public/favicon/apple-touch-icon-precomposed.png +0 -0
  57. data/lib/{device/tracker → device_tracker}/public/favicon/apple-touch-icon.png +0 -0
  58. data/lib/{device/tracker → device_tracker}/public/favicon/browserconfig.xml +0 -0
  59. data/lib/{device/tracker → device_tracker}/public/favicon/favicon-16x16.png +0 -0
  60. data/lib/{device/tracker → device_tracker}/public/favicon/favicon-32x32.png +0 -0
  61. data/lib/{device/tracker → device_tracker}/public/favicon/favicon-96x96.png +0 -0
  62. data/lib/{device/tracker → device_tracker}/public/favicon/favicon.ico +0 -0
  63. data/lib/{device/tracker → device_tracker}/public/favicon/manifest.json +0 -0
  64. data/lib/{device/tracker → device_tracker}/public/favicon/mstile-144x144.png +0 -0
  65. data/lib/{device/tracker → device_tracker}/public/favicon/mstile-150x150.png +0 -0
  66. data/lib/{device/tracker → device_tracker}/public/favicon/mstile-310x150.png +0 -0
  67. data/lib/{device/tracker → device_tracker}/public/favicon/mstile-310x310.png +0 -0
  68. data/lib/{device/tracker → device_tracker}/public/favicon/mstile-70x70.png +0 -0
  69. data/lib/{device/tracker → device_tracker}/public/favicon/safari-pinned-tab.svg +0 -0
  70. data/lib/{device/tracker → device_tracker}/public/fonts/glyphicons-halflings-regular.eot +0 -0
  71. data/lib/{device/tracker → device_tracker}/public/fonts/glyphicons-halflings-regular.svg +0 -0
  72. data/lib/{device/tracker → device_tracker}/public/fonts/glyphicons-halflings-regular.ttf +0 -0
  73. data/lib/{device/tracker → device_tracker}/public/fonts/glyphicons-halflings-regular.woff +0 -0
  74. data/lib/{device/tracker → device_tracker}/public/fonts/glyphicons-halflings-regular.woff2 +0 -0
  75. data/lib/{device/tracker → device_tracker}/public/js/bootstrap-sortable.js +0 -0
  76. data/lib/{device/tracker → device_tracker}/public/js/bootstrap.min.js +0 -0
  77. data/lib/{device/tracker → device_tracker}/public/js/jquery-2.1.4.min.js +0 -0
  78. data/lib/device_tracker/version.rb +3 -0
  79. data/lib/{device/tracker → device_tracker}/views/404.erb +0 -0
  80. data/lib/{device/tracker → device_tracker}/views/_alert.erb +0 -0
  81. data/lib/{device/tracker → device_tracker}/views/_device_form.erb +0 -0
  82. data/lib/{device/tracker → device_tracker}/views/_device_list.erb +0 -0
  83. data/lib/{device/tracker → device_tracker}/views/_footer.erb +0 -0
  84. data/lib/{device/tracker → device_tracker}/views/_header.erb +0 -0
  85. data/lib/{device/tracker → device_tracker}/views/_heartbeat_list.erb +0 -0
  86. data/lib/{device/tracker → device_tracker}/views/_user_form.erb +0 -0
  87. data/lib/{device/tracker → device_tracker}/views/devices/edit.erb +0 -0
  88. data/lib/{device/tracker → device_tracker}/views/devices/index.erb +0 -0
  89. data/lib/{device/tracker → device_tracker}/views/devices/new.erb +0 -0
  90. data/lib/{device/tracker → device_tracker}/views/devices/show.erb +0 -0
  91. data/lib/{device/tracker → device_tracker}/views/devices/users.erb +0 -0
  92. data/lib/{device/tracker → device_tracker}/views/emails/new_password.erb +0 -0
  93. data/lib/{device/tracker → device_tracker}/views/emails/password_reset.erb +0 -0
  94. data/lib/{device/tracker → device_tracker}/views/emails/registration.erb +0 -0
  95. data/lib/{device/tracker → device_tracker}/views/emails/reminder.erb +0 -0
  96. data/lib/{device/tracker → device_tracker}/views/emails/verification.erb +0 -0
  97. data/lib/{device/tracker → device_tracker}/views/forgot_password.erb +0 -0
  98. data/lib/{device/tracker → device_tracker}/views/index.erb +0 -0
  99. data/lib/{device/tracker → device_tracker}/views/layout.erb +0 -0
  100. data/lib/{device/tracker → device_tracker}/views/login.erb +0 -0
  101. data/lib/{device/tracker → device_tracker}/views/operating_system/operating_systems.json.jbuilder +0 -0
  102. data/lib/{device/tracker → device_tracker}/views/os/manage.erb +0 -0
  103. data/lib/{device/tracker → device_tracker}/views/transactions/_transactions_list.erb +0 -0
  104. data/lib/{device/tracker → device_tracker}/views/transactions/index.erb +0 -0
  105. data/lib/{device/tracker → device_tracker}/views/users/edit.erb +0 -0
  106. data/lib/{device/tracker → device_tracker}/views/users/manage.erb +0 -0
  107. data/lib/{device/tracker → device_tracker}/views/users/new.erb +0 -0
  108. metadata +187 -103
  109. data/lib/device/tracker.rb +0 -19
  110. data/lib/device/tracker/app.rb +0 -25
  111. data/lib/device/tracker/controllers/application_controller.rb +0 -215
  112. data/lib/device/tracker/controllers/devices_controller.rb +0 -315
  113. data/lib/device/tracker/controllers/heartbeat_controller.rb +0 -55
  114. data/lib/device/tracker/controllers/os_controller.rb +0 -43
  115. data/lib/device/tracker/controllers/transactions_controller.rb +0 -21
  116. data/lib/device/tracker/controllers/users_controller.rb +0 -193
  117. data/lib/device/tracker/db/data/devices.xlsx +0 -0
  118. data/lib/device/tracker/db/seeds.rb +0 -25
  119. data/lib/device/tracker/helpers/application_helper.rb +0 -84
  120. data/lib/device/tracker/models/device.rb +0 -39
  121. data/lib/device/tracker/models/heartbeat.rb +0 -9
  122. data/lib/device/tracker/models/operating_system.rb +0 -8
  123. data/lib/device/tracker/models/transaction.rb +0 -56
  124. data/lib/device/tracker/models/user.rb +0 -22
  125. data/lib/device/tracker/version.rb +0 -5
@@ -1,55 +0,0 @@
1
- require_relative 'application_controller'
2
-
3
- module Device
4
- module Tracker
5
-
6
- class HeartbeatController < ApplicationController
7
-
8
- post "/" do
9
- begin
10
- heartbeat = JSON.parse(request.body.read)
11
- rescue Exception => e
12
- halt 412, {
13
- error: true,
14
- message: "#{e.message}"
15
- }.to_json
16
- end
17
-
18
- # {"heartbeat": {"device_id": "BBCFM003", "longitude": 53.470096, "latitude": -2.281457}}
19
- if valid_heartbeat?(heartbeat)
20
-
21
- heartbeat = heartbeat["heartbeat"]
22
-
23
- unid = heartbeat["device_id"].upcase
24
-
25
- if Device.exists?(unid: unid)
26
- device = Device.find_by_unid(unid)
27
-
28
- Heartbeat.create({
29
- longitude: heartbeat["longitude"],
30
- latitude: heartbeat["latitude"],
31
- device_id: device.id
32
- })
33
-
34
- halt 201, {
35
- error: false,
36
- message: "Heartbeat for device: #{unid} received."
37
- }.to_json
38
- else
39
- halt 404, {
40
- error: true,
41
- message: "The device with id: #{unid} doesn't exist."
42
- }.to_json
43
- end
44
-
45
- else
46
- halt 412, {
47
- error: true,
48
- message: "Manformed heartbeat received, so will not be processed."
49
- }.to_json
50
- end
51
-
52
- end
53
- end
54
- end
55
- end
@@ -1,43 +0,0 @@
1
- require_relative 'application_controller'
2
- module Device
3
- module Tracker
4
- class OSController < ApplicationController
5
-
6
- before do
7
- perform_admin_check
8
- end
9
-
10
- get "/manage" do
11
- @os = OperatingSystem.all.order(:name)
12
- erb :"os/manage"
13
- end
14
-
15
- post "/create" do
16
-
17
- @os = OperatingSystem.create(params[:os])
18
-
19
- if @os.valid?
20
- @os.save
21
- create_flash "success", ["Successfully added #{@os.name}"]
22
- redirect back
23
- else
24
- create_flash "warning", @os.errors.full_messages
25
- redirect back
26
- end
27
- end
28
-
29
- delete "/:os_id/delete" do |os_id|
30
-
31
- if OperatingSystem.exists?(os_id)
32
- OperatingSystem.destroy(os_id)
33
- create_flash "success", ["Operating system deleted."]
34
- redirect back
35
- else
36
- create_flash "warning", ["Operating system not found."]
37
- redirect back
38
- end
39
- end
40
-
41
- end
42
- end
43
- end
@@ -1,21 +0,0 @@
1
- require_relative 'application_controller'
2
-
3
- module Device
4
- module Tracker
5
- class TransactionsController < ApplicationController
6
-
7
- get "/" do
8
-
9
- @transactions = Transaction.limit(100).order(created_at: :desc).all
10
-
11
- erb :"transactions/index"
12
- end
13
-
14
- get "/:device_id" do |device_id|
15
- @transactions = Transaction.where(device_id: device_id).limit(100).order(created_at: :desc).all
16
- erb :"transactions/index"
17
- end
18
-
19
- end
20
- end
21
- end
@@ -1,193 +0,0 @@
1
- require_relative 'application_controller'
2
-
3
- module Device
4
- module Tracker
5
- class UsersController < ApplicationController
6
-
7
- before do
8
-
9
- if ! %w[new create].include? request.path_info.split('/')[1]
10
- protected!
11
- end
12
-
13
- if %w[manage].include? request.path_info.split('/')[1]
14
- perform_admin_check
15
- end
16
- end
17
-
18
- get "/manage" do
19
-
20
- @users = User.all
21
-
22
- erb :"users/manage", users: @users
23
- end
24
-
25
- get "/new" do
26
- erb :"users/new"
27
- end
28
-
29
- get "/:user_id/edit" do |user_id|
30
- # TODO Move this out into its own function
31
- user = get_logged_in_user
32
-
33
- if user[:is_admin] != true and user[:id] != user_id.to_i
34
- create_flash "warning", ["You don't have permission to view this page."]
35
- redirect back
36
- end
37
-
38
- if User.exists?(user_id)
39
- @user = User.find(user_id)
40
- @is_admin = user[:is_admin]
41
- erb :"users/edit"
42
- else
43
- create_flash "warning", ["Sorry, but that user doesn't exist"]
44
- redirect back
45
- end
46
- end
47
-
48
- put "/:user_id" do |user_id|
49
-
50
- if get_logged_in_user[:is_admin] != true and get_logged_in_user[:id] != user_id.to_i
51
- create_flash "warning", ["You don't have permission to view this page."]
52
- redirect back
53
- end
54
-
55
- if User.exists?(user_id)
56
-
57
- attributes = {
58
- username: params[:user][:username],
59
- email: params[:user][:email],
60
- name: params[:user][:name]
61
- }
62
-
63
- # Only admins have access to these attributes
64
- if is_admin?
65
- attributes[:is_admin] = (!params[:user][:is_admin].nil? and params[:user][:is_admin] == "on")
66
- attributes[:is_verified] = (!params[:user][:is_verified].nil? and params[:user][:is_verified] == "on")
67
- end
68
-
69
- # Should we change the password?
70
-
71
- if change_password?(params)
72
- attributes[:password] = params[:user][:password]
73
- attributes[:password_confirmation] = params[:user][:password_confirmation]
74
- end
75
-
76
- user = User.find(user_id)
77
- users_previous_verification = user.is_verified
78
-
79
- if user.update(attributes)
80
- if user.is_verified && users_previous_verification == false
81
- verification_email(user)
82
- end
83
- create_flash "success", ["The account was successfully updated."]
84
- redirect back
85
- else
86
- create_flash "warning", user.errors.full_messages
87
- redirect back
88
- end
89
- end
90
-
91
- create_flash "warning", ["I'm sorry but that user does not exist!"]
92
- redirect back
93
-
94
- end
95
-
96
- post "/create" do
97
-
98
- user = User.new
99
-
100
- attributes = {
101
- username: params[:user][:username],
102
- password: params[:user][:password],
103
- password_confirmation: params[:user][:password_confirmation],
104
- name: params[:user][:name],
105
- email: params[:user][:email]
106
- }
107
-
108
- user.username = attributes[:username]
109
- user.password = attributes[:password]
110
- user.email = attributes[:email]
111
- user.name = attributes[:name]
112
- user.password_confirmation = attributes[:password_confirmation]
113
-
114
- attributes.each do |key, value|
115
- flash[key] = value if key != :password
116
- end
117
-
118
- if user.valid? and user.save
119
-
120
- report_transaction("#{user.email} registered a new account.", Transaction.registration)
121
-
122
- # Account is awaiting activation
123
- admin_email_registration(request, user)
124
- create_flash "info", ["Registration successful, please wait for your account to be activated."]
125
- redirect "/"
126
- else
127
- create_flash "warning", [user.errors.full_messages.first]
128
- redirect back
129
- end
130
- end
131
-
132
- delete "/:user_id/delete" do |user_id|
133
- if User.exists?(user_id)
134
- user = User.find(user_id)
135
-
136
- email = user.email
137
-
138
- if user.devices.count > 0
139
- Device.where(user_id: user.id).update_all(available: true, checked_out_since: nil, user_id: nil)
140
- end
141
-
142
- if user.destroy
143
- report_transaction("#{email} was deleted by #{get_logged_in_user[:email]}.", Transaction.deletion)
144
- end
145
-
146
- create_flash "success", ["The user account has been successfully removed!"]
147
- else
148
- create_flash "warning", ["Unable to remove the user account, try again."]
149
- end
150
-
151
- redirect back
152
- end
153
-
154
- def verification_email(user)
155
-
156
- @user = user
157
- @get_started_link = request.base_url + '/devices'
158
- body = ERB.new(File.read(EMAILS_PATH + "/verification.erb")).result(binding)
159
-
160
- begin
161
- Pony.mail(
162
- :to => [@user.email],
163
- :from => 'no-reply@device-tracker',
164
- :subject => 'Account Verified | Device Tracker',
165
- :html_body => body
166
- )
167
- rescue Net::OpenTimeout => e
168
- puts "ERROR: Error sending email"
169
- end
170
-
171
- end
172
-
173
- def admin_email_registration(request, user)
174
- @user = user
175
- @verification_link = request.base_url + '/users/' + user.id.to_s + '/edit'
176
-
177
- body = ERB.new(File.read(EMAILS_PATH + "/registration.erb")).result(binding)
178
-
179
- begin
180
- Pony.mail(
181
- :to => [User.where(is_admin: true).map {|u| u.email }],
182
- :from => 'no-reply@device-tracker',
183
- :subject => 'New Registration | Device Tracker',
184
- :html_body => body
185
- )
186
- rescue Net::OpenTimeout => e
187
- puts "ERROR: Error sending email"
188
- end
189
- end
190
-
191
- end
192
- end
193
- end
@@ -1,25 +0,0 @@
1
- module Device
2
- module Tracker
3
- class Seed
4
- def self.seed(name: name, password: password, email: email)
5
-
6
- user = User.where(email: email)
7
-
8
- if user.exists?
9
- return
10
- end
11
-
12
- user = User.find_or_create_by({
13
- name: name,
14
- username: 'admin',
15
- email: email,
16
- is_admin: true,
17
- is_verified: true
18
- })
19
- user.password = password
20
- user.save
21
- puts "Added #{user.username} to the database."
22
- end
23
- end
24
- end
25
- end
@@ -1,84 +0,0 @@
1
- module Device
2
- module Tracker
3
- module ApplicationHelper
4
-
5
- SECRET = 'mYR4nd0mAr$eS3cr3t/fuGg1wugGl3'
6
-
7
- def is_admin?
8
- user = get_logged_in_user
9
- return if user.nil?
10
- user[:is_admin]
11
- end
12
-
13
- def value_for(name, object)
14
- if flash[name]
15
- flash[name]
16
- elsif object
17
- object.send name
18
- end
19
- end
20
-
21
- def get_logged_in_user
22
- session[:user] unless session[:user].nil?
23
- end
24
-
25
- def generate_activation_code(size = 6)
26
- charset = %w{0 1 2 3 4 6 7 8 9 A C D E F G H J K M N P Q R T V W X Y Z}
27
- (0...size).map{ charset.to_a[rand(charset.size)] }.join
28
- end
29
-
30
- def change_password?(params)
31
- if params[:user][:password].empty? or params[:user][:password_confirmation].empty?
32
- false
33
- else
34
- true
35
- end
36
- end
37
-
38
- def protected!
39
- if session[:user].nil?
40
- create_flash "info", ["You must be logged in to see this page."]
41
- redirect "/login"
42
- elsif !session[:user][:is_verified]
43
- create_flash "info", ["You account is awaiting verification by an admin."]
44
- redirect "/login"
45
- end
46
- end
47
-
48
- def report_transaction(message, type, device = nil)
49
- transaction = Transaction.new
50
-
51
- if session[:user]
52
- transaction.user_id = get_logged_in_user[:id]
53
- end
54
-
55
- transaction.description = message
56
- transaction.transaction_type = type
57
- transaction.device_id = device.id unless device.nil?
58
-
59
- transaction.save!
60
- end
61
-
62
- def perform_admin_check
63
- user = get_logged_in_user
64
- if user.nil? or user[:is_admin] == false
65
- create_flash "warning", ["#{user[:name]} does not have permissions to access this page."]
66
- redirect back
67
- end
68
- end
69
-
70
- def create_flash(type, message)
71
- flash[:message] = {css_class: type, message: message }
72
- end
73
-
74
- def valid_heartbeat?(data)
75
- if !data["heartbeat"].nil? and !data["heartbeat"]["longitude"].nil? and
76
- !data["heartbeat"]["latitude"].nil? and !data["heartbeat"]["device_id"].nil?
77
- return true
78
- end
79
- false
80
- end
81
-
82
- end
83
- end
84
- end
@@ -1,39 +0,0 @@
1
- require 'date'
2
-
3
- module Device
4
- module Tracker
5
- class Device < ActiveRecord::Base
6
-
7
- belongs_to :operating_system
8
- belongs_to :user
9
-
10
- has_many :transactions
11
- has_many :heartbeats
12
-
13
- validates :unid, :manufacturer, :device, :description, :operating_system, presence: true
14
-
15
- validates :unid, uniqueness: true
16
-
17
- def unid=(unid)
18
- self[:unid] = unid.upcase
19
- end
20
-
21
- def full_name
22
- self[:manufacturer] + " " + self[:device]
23
- end
24
-
25
- def passed_use_by_date?
26
- (! self[:available] and (Time.now - self[:checked_out_since]).to_i / 1.day >= 3)
27
- end
28
-
29
- def checked_out_since_formatted
30
- self[:checked_out_since].strftime("%A, %d %B %Y at %I:%M%p")
31
- end
32
-
33
- def days_checked_out
34
- (Time.now.to_date - self[:checked_out_since].to_date).floor
35
- end
36
-
37
- end
38
- end
39
- end