disco_app 0.6.9 → 0.7.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/disco_app/components/shopify_admin_link.js.jsx +1 -1
- data/app/controllers/disco_app/app_proxy_controller.rb +1 -1
- data/app/controllers/disco_app/carrier_request_controller.rb +1 -1
- data/app/jobs/disco_app/concerns/app_uninstalled_job.rb +3 -0
- data/app/models/disco_app/concerns/shop.rb +3 -0
- data/db/migrate/20160112233706_create_disco_app_sessions.rb +12 -0
- data/db/migrate/20160113194418_add_shop_id_to_disco_app_sessions.rb +6 -0
- data/lib/disco_app/engine.rb +3 -1
- data/lib/disco_app/session.rb +12 -0
- data/lib/disco_app/version.rb +1 -1
- data/lib/generators/disco_app/disco_app_generator.rb +8 -1
- data/lib/generators/disco_app/rollbarify/rollbarify_generator.rb +2 -2
- data/lib/generators/disco_app/templates/initializers/session_store.rb +2 -0
- data/lib/tasks/sessions.rake +9 -0
- data/test/dummy/config/application.rb +4 -0
- data/test/dummy/config/initializers/session_store.rb +2 -3
- data/test/dummy/db/schema.rb +12 -1
- data/test/models/disco_app/session_test.rb +31 -0
- metadata +24 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 68caa1ce47b61667169703ebd83a0cd91959e663bcfabc1993ec060892139e81
|
4
|
+
data.tar.gz: 1f4b759c70b234668f9691a628acd56e0dbee57dfc7fe9542ebbc15d25d6862d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f3c6c70e1e0c8c7e7eea4d729afe768830b6caeecac921a1b2ac0b6b9d224ff686a6a5b7f8312ff8fa66b7a47f8a79261fe645a552e0786afcba2bd7355287c9
|
7
|
+
data.tar.gz: c957d6a3eafb4214f7fd548dc145b9f301b1d4ac70ec7f36a328c96f7c5c20aeab24ef97fde384c8973acdcf6e7cda948f4dd5781237d72a3693338b80f7bc7f
|
@@ -18,7 +18,7 @@ var ShopifyAdminLink = React.createClass({
|
|
18
18
|
},
|
19
19
|
|
20
20
|
render: function() {
|
21
|
-
var href = '/admin' + this.props.href;
|
21
|
+
var href = ShopifyApp.shopOrigin + '/admin' + this.props.href;
|
22
22
|
return (
|
23
23
|
<a className={this.props.className} href={href} onClick={this.handleClick}>
|
24
24
|
{this.props.label}
|
@@ -24,7 +24,7 @@ module DiscoApp
|
|
24
24
|
query_hash = Rack::Utils.parse_query(request.query_string)
|
25
25
|
signature = query_hash.delete("signature")
|
26
26
|
sorted_params = query_hash.collect{ |k, v| "#{k}=#{Array(v).join(',')}" }.sort.join
|
27
|
-
calculated_signature = OpenSSL::HMAC.hexdigest(OpenSSL::Digest
|
27
|
+
calculated_signature = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha256'), ShopifyApp.configuration.secret, sorted_params)
|
28
28
|
signature == calculated_signature
|
29
29
|
end
|
30
30
|
|
@@ -18,7 +18,7 @@ module DiscoApp
|
|
18
18
|
return true unless Rails.env.production?
|
19
19
|
data = request.body.read.to_s
|
20
20
|
hmac_header = request.headers['HTTP_X_SHOPIFY_HMAC_SHA256']
|
21
|
-
digest = OpenSSL::Digest
|
21
|
+
digest = OpenSSL::Digest.new('sha256')
|
22
22
|
calculated_hmac = Base64.encode64(OpenSSL::HMAC.digest(digest, ShopifyApp.configuration.secret, data)).strip
|
23
23
|
request.body.rewind
|
24
24
|
calculated_hmac == hmac_header
|
@@ -10,11 +10,14 @@ module DiscoApp::Concerns::AppUninstalledJob
|
|
10
10
|
# Perform application uninstallation.
|
11
11
|
#
|
12
12
|
# - Mark charge status as "cancelled" unless charges have been waived.
|
13
|
+
# - Remove any stored sessions for the shop.
|
13
14
|
#
|
14
15
|
def perform(domain, shop_data)
|
15
16
|
unless @shop.charge_waived?
|
16
17
|
@shop.charge_cancelled!
|
17
18
|
end
|
19
|
+
|
20
|
+
@shop.sessions.delete_all
|
18
21
|
end
|
19
22
|
|
20
23
|
end
|
@@ -8,6 +8,9 @@ module DiscoApp::Concerns::Shop
|
|
8
8
|
has_many :subscriptions
|
9
9
|
has_many :plans, through: :subscriptions
|
10
10
|
|
11
|
+
# Define relationship to sessions.
|
12
|
+
has_many :sessions, class_name: 'DiscoApp::Session', dependent: :destroy
|
13
|
+
|
11
14
|
# Define possible installation statuses as an enum.
|
12
15
|
enum status: [:never_installed, :awaiting_install, :installing, :installed, :awaiting_uninstall, :uninstalling, :uninstalled]
|
13
16
|
|
@@ -0,0 +1,12 @@
|
|
1
|
+
class CreateDiscoAppSessions < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :disco_app_sessions do |t|
|
4
|
+
t.string :session_id, :null => false
|
5
|
+
t.text :data
|
6
|
+
t.timestamps
|
7
|
+
end
|
8
|
+
|
9
|
+
add_index :disco_app_sessions, :session_id, :unique => true
|
10
|
+
add_index :disco_app_sessions, :updated_at
|
11
|
+
end
|
12
|
+
end
|
data/lib/disco_app/engine.rb
CHANGED
@@ -2,6 +2,8 @@ require 'shopify_app'
|
|
2
2
|
require 'bootstrap-sass'
|
3
3
|
require 'jquery-rails'
|
4
4
|
require 'turbolinks'
|
5
|
+
require 'activerecord/session_store'
|
6
|
+
require 'disco_app/session'
|
5
7
|
|
6
8
|
module DiscoApp
|
7
9
|
class Engine < ::Rails::Engine
|
@@ -16,7 +18,7 @@ module DiscoApp
|
|
16
18
|
|
17
19
|
# Ensure our frame assets are included for precompilation.
|
18
20
|
initializer 'disco_app.assets.precompile' do |app|
|
19
|
-
app.config.assets.precompile += %w(disco_app/frame.css disco_app/frame.js)
|
21
|
+
app.config.assets.precompile += %w(disco_app/icon.svg disco_app/frame.css disco_app/frame.js)
|
20
22
|
end
|
21
23
|
|
22
24
|
end
|
data/lib/disco_app/version.rb
CHANGED
@@ -27,10 +27,11 @@ class DiscoAppGenerator < Rails::Generators::Base
|
|
27
27
|
gsub_file 'Gemfile', /^# Use sqlite3 as the database for Active Record\ngem 'sqlite3'/m, ''
|
28
28
|
|
29
29
|
# Add gems common to all environments.
|
30
|
-
gem 'shopify_app', '~> 6.
|
30
|
+
gem 'shopify_app', '~> 6.4.1'
|
31
31
|
gem 'sidekiq', '~> 3.5.1'
|
32
32
|
gem 'puma', '~> 2.14.0'
|
33
33
|
gem 'bootstrap-sass', '~> 3.3.5.1'
|
34
|
+
gem 'activerecord-session_store', '~> 0.1.2'
|
34
35
|
|
35
36
|
# Add gems for development and testing only.
|
36
37
|
gem_group :development, :test do
|
@@ -68,6 +69,11 @@ class DiscoAppGenerator < Rails::Generators::Base
|
|
68
69
|
application "config.x.shopify_charges_real = ENV['SHOPIFY_CHARGES_REAL'] == 'true'\n", env: :production
|
69
70
|
application "# Allow real charges in production with an ENV variable", env: :production
|
70
71
|
|
72
|
+
# Configure session storage.
|
73
|
+
application "ActiveRecord::SessionStore::Session.table_name = 'disco_app_sessions'"
|
74
|
+
application "ActionDispatch::Session::ActiveRecordStore.session_class = DiscoApp::Session"
|
75
|
+
application "# Configure custom session storage"
|
76
|
+
|
71
77
|
# Set Sidekiq as the queue adapter in production.
|
72
78
|
application "config.active_job.queue_adapter = :sidekiq\n", env: :production
|
73
79
|
application "# Use Sidekiq as the active job backend", env: :production
|
@@ -108,6 +114,7 @@ class DiscoAppGenerator < Rails::Generators::Base
|
|
108
114
|
copy_file 'initializers/shopify_app.rb', 'config/initializers/shopify_app.rb'
|
109
115
|
copy_file 'initializers/disco_app.rb', 'config/initializers/disco_app.rb'
|
110
116
|
copy_file 'initializers/shopify_session_repository.rb', 'config/initializers/shopify_session_repository.rb'
|
117
|
+
copy_file 'initializers/session_store.rb', 'config/initializers/session_store.rb'
|
111
118
|
|
112
119
|
# Copy default home controller and view
|
113
120
|
copy_file 'controllers/home_controller.rb', 'app/controllers/home_controller.rb'
|
@@ -0,0 +1,9 @@
|
|
1
|
+
namespace :sessions do
|
2
|
+
|
3
|
+
desc 'Clean out any stale sessions.'
|
4
|
+
task clean: [:environment, 'db:load_config'] do
|
5
|
+
threshold = (ENV['SESSIONS_CLEAN_THRESHOLD_DAYS'] || 30).to_i.days.ago
|
6
|
+
ActiveRecord::Base.connection.execute("DELETE FROM #{ActiveRecord::SessionStore::Session.table_name} WHERE updated_at < '#{threshold}'")
|
7
|
+
end
|
8
|
+
|
9
|
+
end
|
@@ -27,6 +27,10 @@ module Dummy
|
|
27
27
|
# Set the default host for absolute URL routing purposes
|
28
28
|
routes.default_url_options[:host] = ENV['DEFAULT_HOST']
|
29
29
|
|
30
|
+
# Configure custom session storage
|
31
|
+
ActionDispatch::Session::ActiveRecordStore.session_class = DiscoApp::Session
|
32
|
+
ActiveRecord::SessionStore::Session.table_name = 'disco_app_sessions'
|
33
|
+
|
30
34
|
# Explicitly prevent real charges being created by default
|
31
35
|
config.x.shopify_charges_real = false
|
32
36
|
|
@@ -1,3 +1,2 @@
|
|
1
|
-
#
|
2
|
-
|
3
|
-
Rails.application.config.session_store :cookie_store, key: '_dummy_session'
|
1
|
+
# Use an ActiveRecord-based session store.
|
2
|
+
Rails.application.config.session_store :active_record_store, :key => '_disco_app_session'
|
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: 20160113194418) do
|
15
15
|
|
16
16
|
create_table "disco_app_plans", force: :cascade do |t|
|
17
17
|
t.integer "status"
|
@@ -23,6 +23,17 @@ ActiveRecord::Schema.define(version: 20151017234409) do
|
|
23
23
|
t.datetime "updated_at", null: false
|
24
24
|
end
|
25
25
|
|
26
|
+
create_table "disco_app_sessions", force: :cascade do |t|
|
27
|
+
t.string "session_id", null: false
|
28
|
+
t.text "data"
|
29
|
+
t.datetime "created_at"
|
30
|
+
t.datetime "updated_at"
|
31
|
+
t.integer "shop_id"
|
32
|
+
end
|
33
|
+
|
34
|
+
add_index "disco_app_sessions", ["session_id"], name: "index_disco_app_sessions_on_session_id", unique: true
|
35
|
+
add_index "disco_app_sessions", ["updated_at"], name: "index_disco_app_sessions_on_updated_at"
|
36
|
+
|
26
37
|
create_table "disco_app_shops", force: :cascade do |t|
|
27
38
|
t.string "shopify_domain", null: false
|
28
39
|
t.string "shopify_token", null: false
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class DiscoApp::SessionTest < ActiveSupport::TestCase
|
4
|
+
|
5
|
+
def setup
|
6
|
+
@shop = disco_app_shops(:widget_store)
|
7
|
+
@session = DiscoApp::Session.create(
|
8
|
+
session_id: 'a91bfc51fa79c9d09d43e2615d9345d4',
|
9
|
+
data: {
|
10
|
+
:shopify => @shop.id,
|
11
|
+
:shopify_domain => @shop.shopify_domain
|
12
|
+
}
|
13
|
+
)
|
14
|
+
end
|
15
|
+
|
16
|
+
test 'logged in sessions are linked to their shop' do
|
17
|
+
assert_equal @shop.id, @session.shop_id
|
18
|
+
end
|
19
|
+
|
20
|
+
test 'can fetch sessions for a particular shop through association' do
|
21
|
+
assert_equal 1, @shop.sessions.size
|
22
|
+
end
|
23
|
+
|
24
|
+
test 'sessions can be deleted by shop' do
|
25
|
+
DiscoApp::Session.create(session_id: 'a91bfc51fa79c9d09d43e2615d9345d5', data: {})
|
26
|
+
assert_equal 2, DiscoApp::Session.count
|
27
|
+
@shop.sessions.delete_all
|
28
|
+
assert_equal 1, DiscoApp::Session.count
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: disco_app
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gavin Ballard
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 6.
|
33
|
+
version: 6.4.1
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 6.
|
40
|
+
version: 6.4.1
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: puma
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -150,6 +150,20 @@ dependencies:
|
|
150
150
|
- - "~>"
|
151
151
|
- !ruby/object:Gem::Version
|
152
152
|
version: 3.2.0
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: activerecord-session_store
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - "~>"
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: 0.1.2
|
160
|
+
type: :runtime
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - "~>"
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: 0.1.2
|
153
167
|
- !ruby/object:Gem::Dependency
|
154
168
|
name: sqlite3
|
155
169
|
requirement: !ruby/object:Gem::Requirement
|
@@ -316,8 +330,11 @@ files:
|
|
316
330
|
- db/migrate/20151017231302_create_disco_app_plans.rb
|
317
331
|
- db/migrate/20151017232027_create_disco_app_subscriptions.rb
|
318
332
|
- db/migrate/20151017234409_move_shop_to_disco_app_engine.rb
|
333
|
+
- db/migrate/20160112233706_create_disco_app_sessions.rb
|
334
|
+
- db/migrate/20160113194418_add_shop_id_to_disco_app_sessions.rb
|
319
335
|
- lib/disco_app.rb
|
320
336
|
- lib/disco_app/engine.rb
|
337
|
+
- lib/disco_app/session.rb
|
321
338
|
- lib/disco_app/support/file_fixtures.rb
|
322
339
|
- lib/disco_app/test_help.rb
|
323
340
|
- lib/disco_app/version.rb
|
@@ -332,11 +349,13 @@ files:
|
|
332
349
|
- lib/generators/disco_app/templates/config/puma.rb
|
333
350
|
- lib/generators/disco_app/templates/controllers/home_controller.rb
|
334
351
|
- lib/generators/disco_app/templates/initializers/disco_app.rb
|
352
|
+
- lib/generators/disco_app/templates/initializers/session_store.rb
|
335
353
|
- lib/generators/disco_app/templates/initializers/shopify_app.rb
|
336
354
|
- lib/generators/disco_app/templates/initializers/shopify_session_repository.rb
|
337
355
|
- lib/generators/disco_app/templates/root/Procfile
|
338
356
|
- lib/generators/disco_app/templates/views/home/index.html.erb
|
339
357
|
- lib/tasks/carrier_service.rake
|
358
|
+
- lib/tasks/sessions.rake
|
340
359
|
- lib/tasks/start.rake
|
341
360
|
- lib/tasks/webhooks.rake
|
342
361
|
- test/controllers/disco_app/install_controller_test.rb
|
@@ -394,6 +413,7 @@ files:
|
|
394
413
|
- test/jobs/disco_app/app_installed_job_test.rb
|
395
414
|
- test/jobs/disco_app/app_uninstalled_job_test.rb
|
396
415
|
- test/models/disco_app/plan_test.rb
|
416
|
+
- test/models/disco_app/session_test.rb
|
397
417
|
- test/models/disco_app/shop_test.rb
|
398
418
|
- test/models/disco_app/subscription_test.rb
|
399
419
|
- test/services/disco_app/subscription_service_test.rb
|
@@ -482,5 +502,6 @@ test_files:
|
|
482
502
|
- test/integration/navigation_test.rb
|
483
503
|
- test/models/disco_app/plan_test.rb
|
484
504
|
- test/models/disco_app/shop_test.rb
|
505
|
+
- test/models/disco_app/session_test.rb
|
485
506
|
- test/models/disco_app/subscription_test.rb
|
486
507
|
- test/services/disco_app/subscription_service_test.rb
|