arcadex 1.0.4 → 1.1.0
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/app/assets/javascripts/arcadex/tokens.js +2 -0
- data/app/assets/stylesheets/arcadex/tokens.css +4 -0
- data/app/assets/stylesheets/scaffold.css +56 -0
- data/app/controllers/arcadex/tokens_controller.rb +3 -3
- data/app/helpers/arcadex/tokens_helper.rb +4 -0
- data/app/models/arcadex/token.rb +1 -1
- data/app/views/arcadex/tokens/_form.html.erb +19 -3
- data/app/views/arcadex/tokens/index.html.erb +12 -6
- data/app/views/arcadex/tokens/show.html.erb +23 -3
- data/config/routes.rb +2 -4
- data/db/migrate/20140910215044_add_first_ip_address_to_arcadex_tokens.rb +5 -0
- data/db/migrate/20140910215118_add_current_ip_address_to_arcadex_tokens.rb +5 -0
- data/db/migrate/20140910215136_add_times_used_to_arcadex_tokens.rb +5 -0
- data/db/migrate/20140910215147_add_expiration_minutes_to_arcadex_tokens.rb +5 -0
- data/lib/arcadex.rb +5 -163
- data/lib/arcadex/authentication.rb +70 -0
- data/lib/arcadex/create.rb +24 -0
- data/lib/arcadex/destroy.rb +39 -0
- data/lib/arcadex/find.rb +39 -0
- data/lib/arcadex/header.rb +29 -0
- data/lib/arcadex/version.rb +1 -1
- data/test/controllers/arcadex/tokens_controller_test.rb +51 -0
- data/test/dummy/db/development.sqlite3 +0 -0
- data/test/dummy/db/schema.rb +5 -1
- data/test/dummy/log/development.log +30 -0
- data/test/fixtures/arcadex/tokens.yml +8 -0
- data/test/helpers/arcadex/tokens_helper_test.rb +6 -0
- metadata +19 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fde8998af5dc3ef8826484cbe4816ed4fafe18d5
|
4
|
+
data.tar.gz: 0c62bb5bdbc74436a0a12fc2a887a03faef3df90
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 14c9ff35b7efea9e0bb45e7b613f70e00f52828ec1c3332bef3a6823c2aff418d38daa80969d9a08dd91260b06904e89a2f2f6229ceac015a73b28676bf6f884
|
7
|
+
data.tar.gz: aee13593e96f145daa19114b8c975ece82d22bc32d8036dbe0857eb8de243834580f512d0379b78f5940d543fa8e43d59d3dbd640e1a652b27d4301acee60712
|
@@ -0,0 +1,56 @@
|
|
1
|
+
body { background-color: #fff; color: #333; }
|
2
|
+
|
3
|
+
body, p, ol, ul, td {
|
4
|
+
font-family: verdana, arial, helvetica, sans-serif;
|
5
|
+
font-size: 13px;
|
6
|
+
line-height: 18px;
|
7
|
+
}
|
8
|
+
|
9
|
+
pre {
|
10
|
+
background-color: #eee;
|
11
|
+
padding: 10px;
|
12
|
+
font-size: 11px;
|
13
|
+
}
|
14
|
+
|
15
|
+
a { color: #000; }
|
16
|
+
a:visited { color: #666; }
|
17
|
+
a:hover { color: #fff; background-color:#000; }
|
18
|
+
|
19
|
+
div.field, div.actions {
|
20
|
+
margin-bottom: 10px;
|
21
|
+
}
|
22
|
+
|
23
|
+
#notice {
|
24
|
+
color: green;
|
25
|
+
}
|
26
|
+
|
27
|
+
.field_with_errors {
|
28
|
+
padding: 2px;
|
29
|
+
background-color: red;
|
30
|
+
display: table;
|
31
|
+
}
|
32
|
+
|
33
|
+
#error_explanation {
|
34
|
+
width: 450px;
|
35
|
+
border: 2px solid red;
|
36
|
+
padding: 7px;
|
37
|
+
padding-bottom: 0;
|
38
|
+
margin-bottom: 20px;
|
39
|
+
background-color: #f0f0f0;
|
40
|
+
}
|
41
|
+
|
42
|
+
#error_explanation h2 {
|
43
|
+
text-align: left;
|
44
|
+
font-weight: bold;
|
45
|
+
padding: 5px 5px 5px 15px;
|
46
|
+
font-size: 12px;
|
47
|
+
margin: -7px;
|
48
|
+
margin-bottom: 0px;
|
49
|
+
background-color: #c00;
|
50
|
+
color: #fff;
|
51
|
+
}
|
52
|
+
|
53
|
+
#error_explanation ul li {
|
54
|
+
font-size: 12px;
|
55
|
+
list-style: square;
|
56
|
+
}
|
@@ -29,7 +29,7 @@ module Arcadex
|
|
29
29
|
if @token.save
|
30
30
|
redirect_to @token, notice: 'Token was successfully created.'
|
31
31
|
else
|
32
|
-
render
|
32
|
+
render :new
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
@@ -38,7 +38,7 @@ module Arcadex
|
|
38
38
|
if @token.update(token_params)
|
39
39
|
redirect_to @token, notice: 'Token was successfully updated.'
|
40
40
|
else
|
41
|
-
render
|
41
|
+
render :edit
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
@@ -56,7 +56,7 @@ module Arcadex
|
|
56
56
|
|
57
57
|
# Only allow a trusted parameter "white list" through.
|
58
58
|
def token_params
|
59
|
-
params.require(:token).permit(:imageable_id, :imageable_type, :auth_token)
|
59
|
+
params.require(:token).permit(:imageable_id, :imageable_type, :auth_token, :first_ip_address, :current_ip_address, :times_used, :expiration_minutes)
|
60
60
|
end
|
61
61
|
end
|
62
62
|
end
|
data/app/models/arcadex/token.rb
CHANGED
@@ -4,8 +4,8 @@
|
|
4
4
|
<h2><%= pluralize(@token.errors.count, "error") %> prohibited this token from being saved:</h2>
|
5
5
|
|
6
6
|
<ul>
|
7
|
-
<% @token.errors.full_messages.each do |
|
8
|
-
<li><%=
|
7
|
+
<% @token.errors.full_messages.each do |message| %>
|
8
|
+
<li><%= message %></li>
|
9
9
|
<% end %>
|
10
10
|
</ul>
|
11
11
|
</div>
|
@@ -13,7 +13,7 @@
|
|
13
13
|
|
14
14
|
<div class="field">
|
15
15
|
<%= f.label :imageable_id %><br>
|
16
|
-
<%= f.
|
16
|
+
<%= f.number_field :imageable_id %>
|
17
17
|
</div>
|
18
18
|
<div class="field">
|
19
19
|
<%= f.label :imageable_type %><br>
|
@@ -23,6 +23,22 @@
|
|
23
23
|
<%= f.label :auth_token %><br>
|
24
24
|
<%= f.text_field :auth_token %>
|
25
25
|
</div>
|
26
|
+
<div class="field">
|
27
|
+
<%= f.label :first_ip_address %><br>
|
28
|
+
<%= f.text_field :first_ip_address %>
|
29
|
+
</div>
|
30
|
+
<div class="field">
|
31
|
+
<%= f.label :current_ip_address %><br>
|
32
|
+
<%= f.text_field :current_ip_address %>
|
33
|
+
</div>
|
34
|
+
<div class="field">
|
35
|
+
<%= f.label :times_used %><br>
|
36
|
+
<%= f.number_field :times_used %>
|
37
|
+
</div>
|
38
|
+
<div class="field">
|
39
|
+
<%= f.label :expiration_minutes %><br>
|
40
|
+
<%= f.number_field :expiration_minutes %>
|
41
|
+
</div>
|
26
42
|
<div class="actions">
|
27
43
|
<%= f.submit %>
|
28
44
|
</div>
|
@@ -3,12 +3,14 @@
|
|
3
3
|
<table>
|
4
4
|
<thead>
|
5
5
|
<tr>
|
6
|
-
<th>
|
7
|
-
<th>
|
8
|
-
<th>
|
9
|
-
<th
|
10
|
-
<th
|
11
|
-
<th
|
6
|
+
<th>Imageable</th>
|
7
|
+
<th>Imageable type</th>
|
8
|
+
<th>Auth token</th>
|
9
|
+
<th>First ip address</th>
|
10
|
+
<th>Current ip address</th>
|
11
|
+
<th>Times used</th>
|
12
|
+
<th>Expiration minutes</th>
|
13
|
+
<th colspan="3"></th>
|
12
14
|
</tr>
|
13
15
|
</thead>
|
14
16
|
|
@@ -18,6 +20,10 @@
|
|
18
20
|
<td><%= token.imageable_id %></td>
|
19
21
|
<td><%= token.imageable_type %></td>
|
20
22
|
<td><%= token.auth_token %></td>
|
23
|
+
<td><%= token.first_ip_address %></td>
|
24
|
+
<td><%= token.current_ip_address %></td>
|
25
|
+
<td><%= token.times_used %></td>
|
26
|
+
<td><%= token.expiration_minutes %></td>
|
21
27
|
<td><%= link_to 'Show', token %></td>
|
22
28
|
<td><%= link_to 'Edit', edit_token_path(token) %></td>
|
23
29
|
<td><%= link_to 'Destroy', token, method: :delete, data: { confirm: 'Are you sure?' } %></td>
|
@@ -1,19 +1,39 @@
|
|
1
1
|
<p id="notice"><%= notice %></p>
|
2
2
|
|
3
3
|
<p>
|
4
|
-
<strong>
|
4
|
+
<strong>Imageable:</strong>
|
5
5
|
<%= @token.imageable_id %>
|
6
6
|
</p>
|
7
7
|
|
8
8
|
<p>
|
9
|
-
<strong>
|
9
|
+
<strong>Imageable type:</strong>
|
10
10
|
<%= @token.imageable_type %>
|
11
11
|
</p>
|
12
12
|
|
13
13
|
<p>
|
14
|
-
<strong>
|
14
|
+
<strong>Auth token:</strong>
|
15
15
|
<%= @token.auth_token %>
|
16
16
|
</p>
|
17
17
|
|
18
|
+
<p>
|
19
|
+
<strong>First ip address:</strong>
|
20
|
+
<%= @token.first_ip_address %>
|
21
|
+
</p>
|
22
|
+
|
23
|
+
<p>
|
24
|
+
<strong>Current ip address:</strong>
|
25
|
+
<%= @token.current_ip_address %>
|
26
|
+
</p>
|
27
|
+
|
28
|
+
<p>
|
29
|
+
<strong>Times used:</strong>
|
30
|
+
<%= @token.times_used %>
|
31
|
+
</p>
|
32
|
+
|
33
|
+
<p>
|
34
|
+
<strong>Expiration minutes:</strong>
|
35
|
+
<%= @token.expiration_minutes %>
|
36
|
+
</p>
|
37
|
+
|
18
38
|
<%= link_to 'Edit', edit_token_path(@token) %> |
|
19
39
|
<%= link_to 'Back', tokens_path %>
|
data/config/routes.rb
CHANGED
data/lib/arcadex.rb
CHANGED
@@ -1,168 +1,10 @@
|
|
1
1
|
require "arcadex/engine"
|
2
|
+
require "arcadex/authentication"
|
3
|
+
require "arcadex/header"
|
4
|
+
require "arcadex/find"
|
5
|
+
require "arcadex/destroy"
|
6
|
+
require "arcadex/create"
|
2
7
|
|
3
8
|
module Arcadex
|
4
9
|
|
5
|
-
################Below are authentication methods###########################
|
6
|
-
############This should be called by the user##############################
|
7
|
-
def self.full_authentication(params,request,should_use_email)
|
8
|
-
auth_token = grab_token(params,request)
|
9
|
-
email = grab_email(params,request)
|
10
|
-
if should_use_email
|
11
|
-
return authenticate_with_email_token(auth_token,email)
|
12
|
-
else
|
13
|
-
return authenticate_with_only_token(auth_token)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
##########Below are authentication helper methods##########################
|
18
|
-
#########These dont normally need to be called by the user#################
|
19
|
-
#authenticate_with methods return nil if not authenticated and make a hash
|
20
|
-
#if things go fine.
|
21
|
-
#current_owner = @instance_hash["current_user"]
|
22
|
-
#current_token = @instance_hash["current_token"]
|
23
|
-
|
24
|
-
#Gets the auth_token from either the url or header
|
25
|
-
def self.grab_token(params,request)
|
26
|
-
#Header token has preference
|
27
|
-
if !params["auth_token"].blank?
|
28
|
-
auth_token = params["auth_token"]
|
29
|
-
end
|
30
|
-
if !request.headers["Auth-Token"].blank?
|
31
|
-
auth_token = request.headers["Auth-Token"]
|
32
|
-
end
|
33
|
-
return auth_token
|
34
|
-
end
|
35
|
-
#Gets the email from either the url or header
|
36
|
-
def self.grab_email(params,request)
|
37
|
-
#Header email has preference
|
38
|
-
if !params["email"].blank?
|
39
|
-
email = params["email"]
|
40
|
-
end
|
41
|
-
if !request.headers["Email"].blank?
|
42
|
-
email = request.headers["Email"]
|
43
|
-
end
|
44
|
-
return email
|
45
|
-
end
|
46
|
-
#This should be used in the application_controller before all actions
|
47
|
-
def self.authenticate_with_email_token(auth_token,email)
|
48
|
-
#Find token from auth_token and owner from token
|
49
|
-
token = ::Arcadex.find_token_by_auth_token(auth_token)
|
50
|
-
owner = ::Arcadex.find_owner_by_token(token)
|
51
|
-
#This assumes that the owner of the token is indeed a user
|
52
|
-
if !token.nil?
|
53
|
-
user = Object.const_get(token.imageable_type).find_by(email: email)
|
54
|
-
#user = ::People::User.find_by(email: email)
|
55
|
-
end
|
56
|
-
#This is to mitigate timing attacks
|
57
|
-
::Devise.secure_compare(auth_token,auth_token)
|
58
|
-
if owner.nil? || user.nil? || user.id != owner.id
|
59
|
-
return nil
|
60
|
-
else
|
61
|
-
#These are the variables available to every controller that inherits
|
62
|
-
instance_hash = {"current_user" => owner, "current_token" => token}
|
63
|
-
return instance_hash
|
64
|
-
end
|
65
|
-
end
|
66
|
-
#This should be used in the application_controller before all actions
|
67
|
-
def self.authenticate_with_only_token(auth_token)
|
68
|
-
#Find token from auth_token and owner from token
|
69
|
-
token = ::Arcadex.find_token_by_auth_token(auth_token)
|
70
|
-
owner = ::Arcadex.find_owner_by_token(token)
|
71
|
-
#This is to mitigate timing attacks
|
72
|
-
::Devise.secure_compare(auth_token,auth_token)
|
73
|
-
if owner.nil?
|
74
|
-
return nil
|
75
|
-
else
|
76
|
-
#These are the variables available to every controller that inherits
|
77
|
-
instance_hash = {"current_user" => owner, "current_token" => token}
|
78
|
-
return instance_hash
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
####################Below are helper methods###############################
|
83
|
-
############These dont need to be called by the user#######################
|
84
|
-
|
85
|
-
#This is now called by the token when it's first saved
|
86
|
-
#token = instance.tokens.new
|
87
|
-
#token.auth_token = Arcadex.generate_auth_token
|
88
|
-
#token.save
|
89
|
-
def self.generate_auth_token
|
90
|
-
token = ::Devise.friendly_token
|
91
|
-
while Token.exists?(token)
|
92
|
-
token = ::Devise.friendly_token
|
93
|
-
end
|
94
|
-
return token
|
95
|
-
end
|
96
|
-
#Arcadex.create_token(instance.id,instance.class.to_s)
|
97
|
-
def self.create_token(id,type)
|
98
|
-
token = Token.new
|
99
|
-
token.imageable_id = id
|
100
|
-
token.imageable_type = type
|
101
|
-
#token.auth_token = generate_auth_token
|
102
|
-
token.save
|
103
|
-
return token
|
104
|
-
end
|
105
|
-
|
106
|
-
|
107
|
-
#Arcadex.find_token_by_auth_token(token.auth_token)
|
108
|
-
def self.find_token_by_auth_token(auth_token_string)
|
109
|
-
token = Token.find_by(auth_token: auth_token_string)
|
110
|
-
if token.nil?
|
111
|
-
return nil
|
112
|
-
end
|
113
|
-
if token_expired?(token)
|
114
|
-
destroy_token(token)
|
115
|
-
return nil
|
116
|
-
else
|
117
|
-
return token
|
118
|
-
end
|
119
|
-
end
|
120
|
-
|
121
|
-
|
122
|
-
#Arcadex.destroy_token(token.auth_token)
|
123
|
-
def self.destroy_auth_token(auth_token)
|
124
|
-
token = find_token_by_auth_token(auth_token)
|
125
|
-
destroy_token(token)
|
126
|
-
end
|
127
|
-
def self.destroy_token(token)
|
128
|
-
if token.nil?
|
129
|
-
return nil
|
130
|
-
end
|
131
|
-
token.destroy
|
132
|
-
end
|
133
|
-
#Arcadex.destroy_all_tokens(instance.id,instance.class.to_s)
|
134
|
-
def self.destroy_all_tokens(id,type)
|
135
|
-
if Object.const_get(type).exists?(id)
|
136
|
-
instance = Object.const_get(type).find(id)
|
137
|
-
instance.tokens.destroy_all
|
138
|
-
end
|
139
|
-
end
|
140
|
-
|
141
|
-
|
142
|
-
#Arcadex.find_owner_by_auth_token(auth_token)
|
143
|
-
def self.find_owner_by_auth_token(auth_token)
|
144
|
-
token = Arcadex.find_token_by_auth_token(auth_token)
|
145
|
-
return Arcadex.find_owner_by_token(token)
|
146
|
-
end
|
147
|
-
#Arcadex.find_owner_by_token(token)
|
148
|
-
def self.find_owner_by_token(token)
|
149
|
-
if token.nil?
|
150
|
-
return nil
|
151
|
-
end
|
152
|
-
if token_expired?(token)
|
153
|
-
destroy_token(token)
|
154
|
-
return nil
|
155
|
-
else
|
156
|
-
instance = Object.const_get(token.imageable_type).find(token.imageable_id)
|
157
|
-
return instance
|
158
|
-
end
|
159
|
-
end
|
160
|
-
|
161
|
-
|
162
|
-
#Arcadex.token_expired?(token)
|
163
|
-
#How long should tokens last? A day if not rememberable
|
164
|
-
#And a month if you are?
|
165
|
-
def self.token_expired?(token)
|
166
|
-
return false
|
167
|
-
end
|
168
10
|
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
module Arcadex
|
2
|
+
module Authentication
|
3
|
+
|
4
|
+
################Below are authentication methods###########################
|
5
|
+
############This should be called by the user##############################
|
6
|
+
def self.full_authentication(params,request,should_use_email)
|
7
|
+
auth_token = ::Arcadex::Header.grab_token(params,request)
|
8
|
+
email = ::Arcadex::Header.grab_email(params,request)
|
9
|
+
instance_hash = nil;
|
10
|
+
if should_use_email
|
11
|
+
instance_hash = ::Arcadex::Authentication.authenticate_with_email_token(auth_token,email)
|
12
|
+
else
|
13
|
+
instance_hash = ::Arcadex::Authentication.authenticate_with_only_token(auth_token)
|
14
|
+
end
|
15
|
+
if instance_hash.nil?
|
16
|
+
return nil
|
17
|
+
else
|
18
|
+
token = instance_hash["current_token"]
|
19
|
+
if token.first_ip_address.nil?
|
20
|
+
token.first_ip_address = request.remote_ip
|
21
|
+
end
|
22
|
+
token.current_ip_address = request.remote_ip
|
23
|
+
if token.times_used.nil?
|
24
|
+
token.times_used = 0;
|
25
|
+
end
|
26
|
+
token.times_used = token.times_used + 1
|
27
|
+
token.save
|
28
|
+
return instance_hash
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
#This should be used in the application_controller before all actions
|
33
|
+
def self.authenticate_with_email_token(auth_token,email)
|
34
|
+
#Find token from auth_token and owner from token
|
35
|
+
token = ::Arcadex::Find.find_token_by_auth_token(auth_token)
|
36
|
+
owner = ::Arcadex::Find.find_owner_by_token(token)
|
37
|
+
#This assumes that the owner of the token is indeed a user
|
38
|
+
if !token.nil?
|
39
|
+
user = ::Object.const_get(token.imageable_type).find_by(email: email)
|
40
|
+
#user = ::People::User.find_by(email: email)
|
41
|
+
end
|
42
|
+
#This is to mitigate timing attacks
|
43
|
+
::Devise.secure_compare(auth_token,auth_token)
|
44
|
+
if owner.nil? || user.nil? || user.id != owner.id
|
45
|
+
return nil
|
46
|
+
else
|
47
|
+
#These are the variables available to every controller that inherits
|
48
|
+
instance_hash = {"current_user" => owner, "current_token" => token}
|
49
|
+
return instance_hash
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
#This should be used in the application_controller before all actions
|
54
|
+
def self.authenticate_with_only_token(auth_token)
|
55
|
+
#Find token from auth_token and owner from token
|
56
|
+
token = ::Arcadex::Find.find_token_by_auth_token(auth_token)
|
57
|
+
owner = ::Arcadex::Find.find_owner_by_token(token)
|
58
|
+
#This is to mitigate timing attacks
|
59
|
+
::Devise.secure_compare(auth_token,auth_token)
|
60
|
+
if owner.nil?
|
61
|
+
return nil
|
62
|
+
else
|
63
|
+
#These are the variables available to every controller that inherits
|
64
|
+
instance_hash = {"current_user" => owner, "current_token" => token}
|
65
|
+
return instance_hash
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Arcadex
|
2
|
+
module Create
|
3
|
+
#This is now called by the token when it's first saved
|
4
|
+
def self.generate_auth_token
|
5
|
+
token = ::Devise.friendly_token
|
6
|
+
while ::Arcadex::Token.exists?(token)
|
7
|
+
token = ::Devise.friendly_token
|
8
|
+
end
|
9
|
+
return token
|
10
|
+
end
|
11
|
+
|
12
|
+
#Arcadex.create_token(instance.tokens.new,exp_minutes,request)
|
13
|
+
#Put any token in here to set it's values. Usually when its first created
|
14
|
+
def self.set_token(token,exp_minutes,request)
|
15
|
+
token.first_ip_address = request.remote_ip
|
16
|
+
token.current_ip_address = request.remote_ip
|
17
|
+
token.times_used = 0
|
18
|
+
token.expiration_minutes = exp_minutes
|
19
|
+
token.save
|
20
|
+
return token
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Arcadex
|
2
|
+
module Destroy
|
3
|
+
|
4
|
+
#Arcadex.destroy_token(token.auth_token)
|
5
|
+
def self.destroy_auth_token(auth_token)
|
6
|
+
token = ::Arcadex::Find.find_token_by_auth_token(auth_token)
|
7
|
+
::Arcadex::Destroy.destroy_token(token)
|
8
|
+
end
|
9
|
+
def self.destroy_token(token)
|
10
|
+
if token.nil?
|
11
|
+
return nil
|
12
|
+
end
|
13
|
+
token.destroy
|
14
|
+
end
|
15
|
+
#Arcadex.destroy_all_tokens(instance.id,instance.class.to_s)
|
16
|
+
def self.destroy_all_tokens(id,type)
|
17
|
+
if ::Object.const_get(type).exists?(id)
|
18
|
+
instance = ::Object.const_get(type).find(id)
|
19
|
+
instance.tokens.destroy_all
|
20
|
+
end
|
21
|
+
end
|
22
|
+
#Arcadex.token_expired?(token)
|
23
|
+
#How long should tokens last? A day if not rememberable
|
24
|
+
#And a month if you are?
|
25
|
+
def self.token_expired?(token)
|
26
|
+
if !token.expiration_minutes.nil?
|
27
|
+
date = token.expiration_minutes.minutes + token.created_at
|
28
|
+
if date > DateTime.now
|
29
|
+
return true
|
30
|
+
else
|
31
|
+
return false
|
32
|
+
end
|
33
|
+
else
|
34
|
+
return false
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
data/lib/arcadex/find.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
module Arcadex
|
2
|
+
module Find
|
3
|
+
|
4
|
+
#Arcadex.find_owner_by_auth_token(auth_token)
|
5
|
+
def self.find_owner_by_auth_token(auth_token)
|
6
|
+
token = ::Arcadex::Find.find_token_by_auth_token(auth_token)
|
7
|
+
return ::Arcadex::Find.find_owner_by_token(token)
|
8
|
+
end
|
9
|
+
|
10
|
+
#Arcadex.find_owner_by_token(token)
|
11
|
+
def self.find_owner_by_token(token)
|
12
|
+
if token.nil?
|
13
|
+
return nil
|
14
|
+
end
|
15
|
+
if ::Arcadex::Destroy.token_expired?(token)
|
16
|
+
::Arcadex::Destroy.destroy_token(token)
|
17
|
+
return nil
|
18
|
+
else
|
19
|
+
instance = ::Object.const_get(token.imageable_type).find(token.imageable_id)
|
20
|
+
return instance
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
#Arcadex.find_token_by_auth_token(token.auth_token)
|
25
|
+
def self.find_token_by_auth_token(auth_token_string)
|
26
|
+
token = ::Arcadex::Token.find_by(auth_token: auth_token_string)
|
27
|
+
if token.nil?
|
28
|
+
return nil
|
29
|
+
end
|
30
|
+
if ::Arcadex::Destroy.token_expired?(token)
|
31
|
+
::Arcardex::Destroy.destroy_token(token)
|
32
|
+
return nil
|
33
|
+
else
|
34
|
+
return token
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Arcadex
|
2
|
+
module Header
|
3
|
+
|
4
|
+
#Gets the auth_token from either the url or header
|
5
|
+
def self.grab_token(params,request)
|
6
|
+
#Header token has preference
|
7
|
+
if !params["auth_token"].blank?
|
8
|
+
auth_token = params["auth_token"]
|
9
|
+
end
|
10
|
+
if !request.headers["Auth-Token"].blank?
|
11
|
+
auth_token = request.headers["Auth-Token"]
|
12
|
+
end
|
13
|
+
return auth_token
|
14
|
+
end
|
15
|
+
|
16
|
+
#Gets the email from either the url or header
|
17
|
+
def self.grab_email(params,request)
|
18
|
+
#Header email has preference
|
19
|
+
if !params["email"].blank?
|
20
|
+
email = params["email"]
|
21
|
+
end
|
22
|
+
if !request.headers["Email"].blank?
|
23
|
+
email = request.headers["Email"]
|
24
|
+
end
|
25
|
+
return email
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
data/lib/arcadex/version.rb
CHANGED
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Arcadex
|
4
|
+
class TokensControllerTest < ActionController::TestCase
|
5
|
+
setup do
|
6
|
+
@token = tokens(:one)
|
7
|
+
end
|
8
|
+
|
9
|
+
test "should get index" do
|
10
|
+
get :index
|
11
|
+
assert_response :success
|
12
|
+
assert_not_nil assigns(:tokens)
|
13
|
+
end
|
14
|
+
|
15
|
+
test "should get new" do
|
16
|
+
get :new
|
17
|
+
assert_response :success
|
18
|
+
end
|
19
|
+
|
20
|
+
test "should create token" do
|
21
|
+
assert_difference('Token.count') do
|
22
|
+
post :create, token: { auth_token: @token.auth_token, current_ip_address: @token.current_ip_address, expiration_minutes: @token.expiration_minutes, first_ip_address: @token.first_ip_address, imageable_id: @token.imageable_id, imageable_type: @token.imageable_type, times_used: @token.times_used }
|
23
|
+
end
|
24
|
+
|
25
|
+
assert_redirected_to token_path(assigns(:token))
|
26
|
+
end
|
27
|
+
|
28
|
+
test "should show token" do
|
29
|
+
get :show, id: @token
|
30
|
+
assert_response :success
|
31
|
+
end
|
32
|
+
|
33
|
+
test "should get edit" do
|
34
|
+
get :edit, id: @token
|
35
|
+
assert_response :success
|
36
|
+
end
|
37
|
+
|
38
|
+
test "should update token" do
|
39
|
+
patch :update, id: @token, token: { auth_token: @token.auth_token, current_ip_address: @token.current_ip_address, expiration_minutes: @token.expiration_minutes, first_ip_address: @token.first_ip_address, imageable_id: @token.imageable_id, imageable_type: @token.imageable_type, times_used: @token.times_used }
|
40
|
+
assert_redirected_to token_path(assigns(:token))
|
41
|
+
end
|
42
|
+
|
43
|
+
test "should destroy token" do
|
44
|
+
assert_difference('Token.count', -1) do
|
45
|
+
delete :destroy, id: @token
|
46
|
+
end
|
47
|
+
|
48
|
+
assert_redirected_to tokens_path
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
Binary file
|
data/test/dummy/db/schema.rb
CHANGED
@@ -11,7 +11,7 @@
|
|
11
11
|
#
|
12
12
|
# It's strongly recommended that you check this file into your version control system.
|
13
13
|
|
14
|
-
ActiveRecord::Schema.define(version:
|
14
|
+
ActiveRecord::Schema.define(version: 20140910215147) do
|
15
15
|
|
16
16
|
create_table "arcadex_tokens", force: true do |t|
|
17
17
|
t.integer "imageable_id"
|
@@ -19,6 +19,10 @@ ActiveRecord::Schema.define(version: 20140806202340) do
|
|
19
19
|
t.string "auth_token"
|
20
20
|
t.datetime "created_at"
|
21
21
|
t.datetime "updated_at"
|
22
|
+
t.string "first_ip_address"
|
23
|
+
t.string "current_ip_address"
|
24
|
+
t.integer "times_used"
|
25
|
+
t.integer "expiration_minutes"
|
22
26
|
end
|
23
27
|
|
24
28
|
add_index "arcadex_tokens", ["auth_token"], name: "index_arcadex_tokens_on_auth_token", unique: true
|
@@ -14,3 +14,33 @@ Migrating to AddIndexToToken (20140806202340)
|
|
14
14
|
[1m[35mSQL (0.6ms)[0m INSERT INTO "schema_migrations" ("version") VALUES (?) [["version", "20140806202340"]]
|
15
15
|
[1m[36m (100.2ms)[0m [1mcommit transaction[0m
|
16
16
|
[1m[35mActiveRecord::SchemaMigration Load (0.3ms)[0m SELECT "schema_migrations".* FROM "schema_migrations"
|
17
|
+
[1m[36mActiveRecord::SchemaMigration Load (0.1ms)[0m [1mSELECT "schema_migrations".* FROM "schema_migrations"[0m
|
18
|
+
Migrating to AddFirstIpAddressToArcadexTokens (20140910215044)
|
19
|
+
[1m[35m (0.1ms)[0m begin transaction
|
20
|
+
[1m[36m (0.6ms)[0m [1mALTER TABLE "arcadex_tokens" ADD "first_ip_address" varchar(255)[0m
|
21
|
+
[1m[35mSQL (0.5ms)[0m INSERT INTO "schema_migrations" ("version") VALUES (?) [["version", "20140910215044"]]
|
22
|
+
[1m[36m (226.8ms)[0m [1mcommit transaction[0m
|
23
|
+
Migrating to AddCurrentIpAddressToArcadexTokens (20140910215118)
|
24
|
+
[1m[35m (0.1ms)[0m begin transaction
|
25
|
+
[1m[36m (1.7ms)[0m [1mALTER TABLE "arcadex_tokens" ADD "current_ip_address" varchar(255)[0m
|
26
|
+
[1m[35mSQL (1.1ms)[0m INSERT INTO "schema_migrations" ("version") VALUES (?) [["version", "20140910215118"]]
|
27
|
+
[1m[36m (146.8ms)[0m [1mcommit transaction[0m
|
28
|
+
Migrating to AddTimesUsedToArcadexTokens (20140910215136)
|
29
|
+
[1m[35m (0.1ms)[0m begin transaction
|
30
|
+
[1m[36m (0.6ms)[0m [1mALTER TABLE "arcadex_tokens" ADD "times_used" integer[0m
|
31
|
+
[1m[35mSQL (0.3ms)[0m INSERT INTO "schema_migrations" ("version") VALUES (?) [["version", "20140910215136"]]
|
32
|
+
[1m[36m (141.6ms)[0m [1mcommit transaction[0m
|
33
|
+
Migrating to AddExpirationMinutesToArcadexTokens (20140910215147)
|
34
|
+
[1m[35m (0.2ms)[0m begin transaction
|
35
|
+
[1m[36m (1.5ms)[0m [1mALTER TABLE "arcadex_tokens" ADD "expiration_minutes" integer[0m
|
36
|
+
[1m[35mSQL (1.1ms)[0m INSERT INTO "schema_migrations" ("version") VALUES (?) [["version", "20140910215147"]]
|
37
|
+
[1m[36m (169.5ms)[0m [1mcommit transaction[0m
|
38
|
+
[1m[35mActiveRecord::SchemaMigration Load (0.3ms)[0m SELECT "schema_migrations".* FROM "schema_migrations"
|
39
|
+
[1m[36m (0.1ms)[0m [1m SELECT sql
|
40
|
+
FROM sqlite_master
|
41
|
+
WHERE name='index_arcadex_tokens_on_auth_token' AND type='index'
|
42
|
+
UNION ALL
|
43
|
+
SELECT sql
|
44
|
+
FROM sqlite_temp_master
|
45
|
+
WHERE name='index_arcadex_tokens_on_auth_token' AND type='index'
|
46
|
+
[0m
|
@@ -4,8 +4,16 @@ one:
|
|
4
4
|
imageable_id: 1
|
5
5
|
imageable_type: MyString
|
6
6
|
auth_token: MyString
|
7
|
+
first_ip_address: MyString
|
8
|
+
current_ip_address: MyString
|
9
|
+
times_used: 1
|
10
|
+
expiration_minutes: 1
|
7
11
|
|
8
12
|
two:
|
9
13
|
imageable_id: 1
|
10
14
|
imageable_type: MyString
|
11
15
|
auth_token: MyString
|
16
|
+
first_ip_address: MyString
|
17
|
+
current_ip_address: MyString
|
18
|
+
times_used: 1
|
19
|
+
expiration_minutes: 1
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: arcadex
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Cleophus Robinson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-09-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -65,10 +65,14 @@ files:
|
|
65
65
|
- MIT-LICENSE
|
66
66
|
- Rakefile
|
67
67
|
- app/assets/javascripts/arcadex/application.js
|
68
|
+
- app/assets/javascripts/arcadex/tokens.js
|
68
69
|
- app/assets/stylesheets/arcadex/application.css
|
70
|
+
- app/assets/stylesheets/arcadex/tokens.css
|
71
|
+
- app/assets/stylesheets/scaffold.css
|
69
72
|
- app/controllers/arcadex/application_controller.rb
|
70
73
|
- app/controllers/arcadex/tokens_controller.rb
|
71
74
|
- app/helpers/arcadex/application_helper.rb
|
75
|
+
- app/helpers/arcadex/tokens_helper.rb
|
72
76
|
- app/models/arcadex/token.rb
|
73
77
|
- app/views/arcadex/tokens/_form.html.erb
|
74
78
|
- app/views/arcadex/tokens/edit.html.erb
|
@@ -79,11 +83,21 @@ files:
|
|
79
83
|
- config/routes.rb
|
80
84
|
- db/migrate/20140806194834_create_arcadex_tokens.rb
|
81
85
|
- db/migrate/20140806202340_add_index_to_token.rb
|
86
|
+
- db/migrate/20140910215044_add_first_ip_address_to_arcadex_tokens.rb
|
87
|
+
- db/migrate/20140910215118_add_current_ip_address_to_arcadex_tokens.rb
|
88
|
+
- db/migrate/20140910215136_add_times_used_to_arcadex_tokens.rb
|
89
|
+
- db/migrate/20140910215147_add_expiration_minutes_to_arcadex_tokens.rb
|
82
90
|
- lib/arcadex.rb
|
91
|
+
- lib/arcadex/authentication.rb
|
92
|
+
- lib/arcadex/create.rb
|
93
|
+
- lib/arcadex/destroy.rb
|
83
94
|
- lib/arcadex/engine.rb
|
95
|
+
- lib/arcadex/find.rb
|
96
|
+
- lib/arcadex/header.rb
|
84
97
|
- lib/arcadex/version.rb
|
85
98
|
- lib/tasks/arcadex_tasks.rake
|
86
99
|
- test/arcadex_test.rb
|
100
|
+
- test/controllers/arcadex/tokens_controller_test.rb
|
87
101
|
- test/dummy/README.rdoc
|
88
102
|
- test/dummy/Rakefile
|
89
103
|
- test/dummy/app/assets/javascripts/application.js
|
@@ -121,6 +135,7 @@ files:
|
|
121
135
|
- test/dummy/public/500.html
|
122
136
|
- test/dummy/public/favicon.ico
|
123
137
|
- test/fixtures/arcadex/tokens.yml
|
138
|
+
- test/helpers/arcadex/tokens_helper_test.rb
|
124
139
|
- test/integration/navigation_test.rb
|
125
140
|
- test/models/arcadex/token_test.rb
|
126
141
|
- test/test_helper.rb
|
@@ -151,6 +166,7 @@ test_files:
|
|
151
166
|
- test/fixtures/arcadex/tokens.yml
|
152
167
|
- test/integration/navigation_test.rb
|
153
168
|
- test/models/arcadex/token_test.rb
|
169
|
+
- test/controllers/arcadex/tokens_controller_test.rb
|
154
170
|
- test/dummy/bin/rake
|
155
171
|
- test/dummy/bin/rails
|
156
172
|
- test/dummy/bin/bundle
|
@@ -188,4 +204,5 @@ test_files:
|
|
188
204
|
- test/dummy/log/development.log
|
189
205
|
- test/dummy/log/test.log
|
190
206
|
- test/test_helper.rb
|
207
|
+
- test/helpers/arcadex/tokens_helper_test.rb
|
191
208
|
- test/arcadex_test.rb
|