File tree 6 files changed +33
-17
lines changed
generators/blazer/templates
6 files changed +33
-17
lines changed Original file line number Diff line number Diff line change @@ -79,11 +79,12 @@ def edit
79
79
end
80
80
81
81
def share
82
- if params [ :token ] && params [ :query_id ] && params [ :token ] == Blazer . sharing . query_token ( params [ :query_id ] )
83
- run
84
- else
85
- render_forbidden
86
- end
82
+ return render_forbidden unless params [ :token ] && params [ :query_id ]
83
+
84
+ @query = Query . find_by ( id : params [ :query_id ] ) if params [ :query_id ]
85
+ return render_forbidden unless @query . correct_token? ( params [ :token ] )
86
+
87
+ run
87
88
end
88
89
89
90
def run
Original file line number Diff line number Diff line change 1
1
module Blazer
2
2
class Query < Record
3
+ has_secure_token :secret_token , length : 36
4
+
3
5
belongs_to :creator , optional : true , class_name : Blazer . user_class . to_s if Blazer . user_class
4
6
has_many :checks , dependent : :destroy
5
7
has_many :dashboard_queries , dependent : :destroy
@@ -15,6 +17,10 @@ def to_param
15
17
[ id , name ] . compact . join ( "-" ) . gsub ( "'" , "" ) . parameterize
16
18
end
17
19
20
+ def correct_token? ( token )
21
+ ActiveSupport ::SecurityUtils . secure_compare ( secret_token , token )
22
+ end
23
+
18
24
def friendly_name
19
25
name . to_s . sub ( /\A [#\* ]/ , "" ) . gsub ( /\[ .+\] / , "" ) . strip
20
26
end
Original file line number Diff line number Diff line change 1
1
module Blazer
2
2
class Sharing
3
- attr_accessor :api_key , :path
3
+ attr_accessor :path , :enabled
4
4
5
- def initialize ( api_key : ENV . fetch ( 'BLAZER_DOWNLOAD_API_KEY' , nil ) , path : '/blazer_share' )
6
- @api_key = api_key
5
+ def initialize ( enabled : false , path : '/blazer_share' )
7
6
@path = path . sub ( /\/ $/ , '' ) # Strip trailing /
7
+ @enabled = enabled
8
8
end
9
9
10
10
def route_path
@@ -15,16 +15,13 @@ def to_controller
15
15
'blazer/queries#share'
16
16
end
17
17
18
- def query_token ( query_id )
19
- Digest ::SHA1 . hexdigest ( "#{ query_id } -#{ api_key } " )
20
- end
21
-
22
18
def enabled?
23
- api_key . present?
19
+ enabled
24
20
end
25
21
26
22
def share_path ( query_id , format : nil )
27
- "#{ path } /#{ query_token ( query_id ) } /#{ query_id } #{ ".#{ format } " if format } "
23
+ query = Query . find ( query_id )
24
+ "#{ path } /#{ query . secret_token } /#{ query_id } #{ ".#{ format } " if format } "
28
25
end
29
26
30
27
def url_for ( query_id , current_url , format : 'csv' )
Original file line number Diff line number Diff line change @@ -5,6 +5,7 @@ class <%= migration_class_name %> < ActiveRecord::Migration<%= migration_version
5
5
t.string :name
6
6
t.text :description
7
7
t.text :statement
8
+ t.text :secret_token
8
9
t.string :data_source
9
10
t.string :status
10
11
t.timestamps null: false
Original file line number Diff line number Diff line change 4
4
t . string :name
5
5
t . text :description
6
6
t . text :statement
7
+ t . text :secret_token
7
8
t . string :data_source
8
9
t . string :status
9
10
t . timestamps null : false
Original file line number Diff line number Diff line change @@ -76,6 +76,15 @@ def test_variables_time_range
76
76
assert_match "daterangepicker" , response . body
77
77
end
78
78
79
+ def test_correct_token
80
+ query = create_query ( statement : "SELECT 1" )
81
+ get blazer . query_path ( query , token : query . secret_token )
82
+ assert_response :success
83
+
84
+ get blazer . query_path ( query , token : "x" )
85
+ assert_response :redirect
86
+ end
87
+
79
88
def test_variable_defaults
80
89
query = create_query ( statement : "SELECT {default_var}" )
81
90
get blazer . query_path ( query )
@@ -108,12 +117,13 @@ def test_csv
108
117
end
109
118
110
119
def test_share
111
- Blazer . sharing . api_key = "123"
112
120
query = create_query
113
- get blazer . query_share_path ( query_id : query . id , token : Digest ::SHA1 . hexdigest ( "#{ query . id } -123" ) , format : 'csv' )
121
+ assert query . secret_token
122
+
123
+ get blazer . query_share_path ( query_id : query . id , token : query . secret_token , format : 'csv' )
124
+
114
125
assert_response :success
115
126
assert_match query . name , response . body
116
- Blazer . sharing . api_key = nil
117
127
end
118
128
119
129
def test_url
You can’t perform that action at this time.
0 commit comments