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