shopify_app 18.1.2 → 19.0.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/.github/workflows/build.yml +2 -2
- data/.gitignore +1 -0
- data/CHANGELOG.md +5 -0
- data/Gemfile +3 -2
- data/Gemfile.lock +120 -134
- data/Rakefile +4 -3
- data/app/controllers/concerns/shopify_app/ensure_authenticated_links.rb +1 -1
- data/app/controllers/shopify_app/authenticated_controller.rb +1 -0
- data/app/controllers/shopify_app/callback_controller.rb +35 -147
- data/app/controllers/shopify_app/sessions_controller.rb +25 -137
- data/app/controllers/shopify_app/webhooks_controller.rb +5 -23
- data/config/routes.rb +6 -12
- data/docs/Troubleshooting.md +0 -3
- data/docs/Upgrading.md +87 -5
- data/docs/shopify_app/webhooks.md +1 -1
- data/lib/generators/shopify_app/add_after_authenticate_job/add_after_authenticate_job_generator.rb +10 -9
- data/lib/generators/shopify_app/add_after_authenticate_job/templates/after_authenticate_job.rb +1 -0
- data/lib/generators/shopify_app/add_marketing_activity_extension/add_marketing_activity_extension_generator.rb +4 -3
- data/lib/generators/shopify_app/add_webhook/add_webhook_generator.rb +13 -12
- data/lib/generators/shopify_app/add_webhook/templates/webhook_job.rb.tt +9 -1
- data/lib/generators/shopify_app/app_proxy_controller/app_proxy_controller_generator.rb +7 -6
- data/lib/generators/shopify_app/app_proxy_controller/templates/app_proxy_controller.rb +2 -1
- data/lib/generators/shopify_app/app_proxy_controller/templates/app_proxy_route.rb +1 -1
- data/lib/generators/shopify_app/authenticated_controller/authenticated_controller_generator.rb +3 -3
- data/lib/generators/shopify_app/controllers/controllers_generator.rb +4 -3
- data/lib/generators/shopify_app/home_controller/home_controller_generator.rb +11 -15
- data/lib/generators/shopify_app/home_controller/templates/home_controller.rb +2 -2
- data/lib/generators/shopify_app/home_controller/templates/index.html.erb +3 -3
- data/lib/generators/shopify_app/install/install_generator.rb +25 -74
- data/lib/generators/shopify_app/install/templates/embedded_app.html.erb +1 -1
- data/lib/generators/shopify_app/install/templates/session_store.rb +2 -1
- data/lib/generators/shopify_app/install/templates/shopify_app.rb.tt +20 -5
- data/lib/generators/shopify_app/products_controller/products_controller_generator.rb +3 -3
- data/lib/generators/shopify_app/products_controller/templates/products_controller.rb +1 -1
- data/lib/generators/shopify_app/rotate_shopify_token_job/rotate_shopify_token_job_generator.rb +4 -4
- data/lib/generators/shopify_app/rotate_shopify_token_job/templates/rotate_shopify_token.rake +1 -0
- data/lib/generators/shopify_app/rotate_shopify_token_job/templates/rotate_shopify_token_job.rb +1 -1
- data/lib/generators/shopify_app/routes/routes_generator.rb +6 -5
- data/lib/generators/shopify_app/routes/templates/routes.rb +5 -5
- data/lib/generators/shopify_app/shop_model/shop_model_generator.rb +11 -10
- data/lib/generators/shopify_app/shop_model/templates/shop.rb +1 -0
- data/lib/generators/shopify_app/shopify_app_generator.rb +4 -3
- data/lib/generators/shopify_app/user_model/templates/user.rb +1 -0
- data/lib/generators/shopify_app/user_model/user_model_generator.rb +11 -10
- data/lib/generators/shopify_app/views/views_generator.rb +4 -3
- data/lib/shopify_app/access_scopes/shop_strategy.rb +2 -2
- data/lib/shopify_app/access_scopes/user_strategy.rb +4 -4
- data/lib/shopify_app/configuration.rb +5 -17
- data/lib/shopify_app/controller_concerns/app_proxy_verification.rb +4 -3
- data/lib/shopify_app/controller_concerns/csrf_protection.rb +2 -1
- data/lib/shopify_app/controller_concerns/embedded_app.rb +4 -3
- data/lib/shopify_app/controller_concerns/itp.rb +3 -3
- data/lib/shopify_app/controller_concerns/localization.rb +1 -0
- data/lib/shopify_app/controller_concerns/login_protection.rb +50 -70
- data/lib/shopify_app/controller_concerns/payload_verification.rb +3 -2
- data/lib/shopify_app/controller_concerns/webhook_verification.rb +2 -1
- data/lib/shopify_app/engine.rb +7 -15
- data/lib/shopify_app/jobs/scripttags_manager_job.rb +2 -2
- data/lib/shopify_app/jobs/webhooks_manager_job.rb +4 -5
- data/lib/shopify_app/managers/scripttags_manager.rb +11 -4
- data/lib/shopify_app/managers/webhooks_manager.rb +42 -44
- data/lib/shopify_app/middleware/jwt_middleware.rb +5 -4
- data/lib/shopify_app/session/in_memory_session_store.rb +1 -0
- data/lib/shopify_app/session/in_memory_shop_session_store.rb +2 -1
- data/lib/shopify_app/session/in_memory_user_session_store.rb +1 -0
- data/lib/shopify_app/session/jwt.rb +9 -8
- data/lib/shopify_app/session/null_user_session_store.rb +2 -1
- data/lib/shopify_app/session/session_repository.rb +37 -0
- data/lib/shopify_app/session/session_storage.rb +4 -6
- data/lib/shopify_app/session/shop_session_storage.rb +6 -6
- data/lib/shopify_app/session/shop_session_storage_with_scopes.rb +7 -8
- data/lib/shopify_app/session/user_session_storage.rb +19 -6
- data/lib/shopify_app/session/user_session_storage_with_scopes.rb +21 -8
- data/lib/shopify_app/test_helpers/all.rb +2 -1
- data/lib/shopify_app/test_helpers/webhook_verification_helper.rb +4 -3
- data/lib/shopify_app/utils.rb +2 -9
- data/lib/shopify_app/version.rb +2 -1
- data/lib/shopify_app.rb +35 -40
- data/package.json +1 -1
- data/shopify_app.gemspec +21 -20
- data/yarn.lock +6 -6
- metadata +43 -48
- data/lib/generators/shopify_app/install/templates/omniauth.rb +0 -4
- data/lib/generators/shopify_app/install/templates/shopify_provider.rb.tt +0 -8
- data/lib/generators/shopify_app/install/templates/user_agent.rb +0 -6
- data/lib/shopify_app/middleware/same_site_cookie_middleware.rb +0 -34
- data/lib/shopify_app/omniauth/omniauth_configuration.rb +0 -64
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 68bc78da7e88e7482f179b4d8ce4cf6734f3595631007e047c59a3a31cfcc7f3
|
|
4
|
+
data.tar.gz: 84e0a185dfc9e34e80749db04c1b1a218fb0aed3499379e532c9a5903da3706a
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: fe5829d4783dcee78ae5141f51b1e177f65fcae58407101b25af7a83b467c9d3586e58a58785d7fb1730e8c7be34861c6f2cfc62e1e36c4527486e529da74910
|
|
7
|
+
data.tar.gz: e125dd848ea4faf473ea39d38dd186114dad9bf7ce1ebe4083bbf121fec18ba165936e28f7be0ee485b92426ed4f0cb76743a7cb014de5edbfdc85a4d8511489
|
data/.github/workflows/build.yml
CHANGED
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
19.0.0 (April 6, 2022)
|
|
2
|
+
----------
|
|
3
|
+
* Use v10 of the Shopify API (https://github.com/Shopify/shopify_api). This update requires changes to an app - please refer to the [migration guide](https://github.com/Shopify/shopify_app/blob/main/docs/Upgrading.md) for details.
|
|
4
|
+
BREAKING, please see migration notes.
|
|
5
|
+
|
|
1
6
|
18.1.2 (Mar 3, 2022)
|
|
2
7
|
----------
|
|
3
8
|
* Use the App Bridge 2.0 redirect when attempting to break out of an iframe. This happens when an app is installed, requires new access scopes, or re-authentication because the login session is expired. [#1376](https://github.com/Shopify/shopify_app/pull/1376)
|
data/Gemfile
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
source "https://rubygems.org"
|
|
3
4
|
|
|
4
5
|
# Specify your gem's dependencies in shopify_app.gemspec
|
|
5
6
|
gemspec
|
|
6
7
|
|
|
7
|
-
gem
|
|
8
|
+
gem "rails-controller-testing", group: :test
|
|
8
9
|
|
|
9
10
|
group :rubocop do
|
|
10
|
-
gem
|
|
11
|
+
gem "rubocop-shopify", require: false
|
|
11
12
|
end
|
data/Gemfile.lock
CHANGED
|
@@ -1,80 +1,80 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
shopify_app (
|
|
4
|
+
shopify_app (19.0.0)
|
|
5
|
+
activeresource
|
|
5
6
|
browser_sniffer (~> 1.4.0)
|
|
6
7
|
jwt (>= 2.2.3)
|
|
7
|
-
omniauth-rails_csrf_protection
|
|
8
|
-
omniauth-shopify-oauth2 (~> 2.3)
|
|
9
8
|
rails (> 5.2.1)
|
|
10
9
|
redirect_safely (~> 1.0)
|
|
11
|
-
shopify_api (~>
|
|
10
|
+
shopify_api (~> 10.0)
|
|
11
|
+
sprockets-rails (>= 2.0.0)
|
|
12
12
|
|
|
13
13
|
GEM
|
|
14
14
|
remote: https://rubygems.org/
|
|
15
15
|
specs:
|
|
16
|
-
actioncable (6.1.
|
|
17
|
-
actionpack (= 6.1.
|
|
18
|
-
activesupport (= 6.1.
|
|
16
|
+
actioncable (6.1.5)
|
|
17
|
+
actionpack (= 6.1.5)
|
|
18
|
+
activesupport (= 6.1.5)
|
|
19
19
|
nio4r (~> 2.0)
|
|
20
20
|
websocket-driver (>= 0.6.1)
|
|
21
|
-
actionmailbox (6.1.
|
|
22
|
-
actionpack (= 6.1.
|
|
23
|
-
activejob (= 6.1.
|
|
24
|
-
activerecord (= 6.1.
|
|
25
|
-
activestorage (= 6.1.
|
|
26
|
-
activesupport (= 6.1.
|
|
21
|
+
actionmailbox (6.1.5)
|
|
22
|
+
actionpack (= 6.1.5)
|
|
23
|
+
activejob (= 6.1.5)
|
|
24
|
+
activerecord (= 6.1.5)
|
|
25
|
+
activestorage (= 6.1.5)
|
|
26
|
+
activesupport (= 6.1.5)
|
|
27
27
|
mail (>= 2.7.1)
|
|
28
|
-
actionmailer (6.1.
|
|
29
|
-
actionpack (= 6.1.
|
|
30
|
-
actionview (= 6.1.
|
|
31
|
-
activejob (= 6.1.
|
|
32
|
-
activesupport (= 6.1.
|
|
28
|
+
actionmailer (6.1.5)
|
|
29
|
+
actionpack (= 6.1.5)
|
|
30
|
+
actionview (= 6.1.5)
|
|
31
|
+
activejob (= 6.1.5)
|
|
32
|
+
activesupport (= 6.1.5)
|
|
33
33
|
mail (~> 2.5, >= 2.5.4)
|
|
34
34
|
rails-dom-testing (~> 2.0)
|
|
35
|
-
actionpack (6.1.
|
|
36
|
-
actionview (= 6.1.
|
|
37
|
-
activesupport (= 6.1.
|
|
35
|
+
actionpack (6.1.5)
|
|
36
|
+
actionview (= 6.1.5)
|
|
37
|
+
activesupport (= 6.1.5)
|
|
38
38
|
rack (~> 2.0, >= 2.0.9)
|
|
39
39
|
rack-test (>= 0.6.3)
|
|
40
40
|
rails-dom-testing (~> 2.0)
|
|
41
41
|
rails-html-sanitizer (~> 1.0, >= 1.2.0)
|
|
42
|
-
actiontext (6.1.
|
|
43
|
-
actionpack (= 6.1.
|
|
44
|
-
activerecord (= 6.1.
|
|
45
|
-
activestorage (= 6.1.
|
|
46
|
-
activesupport (= 6.1.
|
|
42
|
+
actiontext (6.1.5)
|
|
43
|
+
actionpack (= 6.1.5)
|
|
44
|
+
activerecord (= 6.1.5)
|
|
45
|
+
activestorage (= 6.1.5)
|
|
46
|
+
activesupport (= 6.1.5)
|
|
47
47
|
nokogiri (>= 1.8.5)
|
|
48
|
-
actionview (6.1.
|
|
49
|
-
activesupport (= 6.1.
|
|
48
|
+
actionview (6.1.5)
|
|
49
|
+
activesupport (= 6.1.5)
|
|
50
50
|
builder (~> 3.1)
|
|
51
51
|
erubi (~> 1.4)
|
|
52
52
|
rails-dom-testing (~> 2.0)
|
|
53
53
|
rails-html-sanitizer (~> 1.1, >= 1.2.0)
|
|
54
|
-
activejob (6.1.
|
|
55
|
-
activesupport (= 6.1.
|
|
54
|
+
activejob (6.1.5)
|
|
55
|
+
activesupport (= 6.1.5)
|
|
56
56
|
globalid (>= 0.3.6)
|
|
57
|
-
activemodel (6.1.
|
|
58
|
-
activesupport (= 6.1.
|
|
57
|
+
activemodel (6.1.5)
|
|
58
|
+
activesupport (= 6.1.5)
|
|
59
59
|
activemodel-serializers-xml (1.0.2)
|
|
60
60
|
activemodel (> 5.x)
|
|
61
61
|
activesupport (> 5.x)
|
|
62
62
|
builder (~> 3.1)
|
|
63
|
-
activerecord (6.1.
|
|
64
|
-
activemodel (= 6.1.
|
|
65
|
-
activesupport (= 6.1.
|
|
63
|
+
activerecord (6.1.5)
|
|
64
|
+
activemodel (= 6.1.5)
|
|
65
|
+
activesupport (= 6.1.5)
|
|
66
66
|
activeresource (6.0.0)
|
|
67
67
|
activemodel (>= 6.0)
|
|
68
68
|
activemodel-serializers-xml (~> 1.0)
|
|
69
69
|
activesupport (>= 6.0)
|
|
70
|
-
activestorage (6.1.
|
|
71
|
-
actionpack (= 6.1.
|
|
72
|
-
activejob (= 6.1.
|
|
73
|
-
activerecord (= 6.1.
|
|
74
|
-
activesupport (= 6.1.
|
|
75
|
-
marcel (~> 1.0
|
|
70
|
+
activestorage (6.1.5)
|
|
71
|
+
actionpack (= 6.1.5)
|
|
72
|
+
activejob (= 6.1.5)
|
|
73
|
+
activerecord (= 6.1.5)
|
|
74
|
+
activesupport (= 6.1.5)
|
|
75
|
+
marcel (~> 1.0)
|
|
76
76
|
mini_mime (>= 1.1.0)
|
|
77
|
-
activesupport (6.1.
|
|
77
|
+
activesupport (6.1.5)
|
|
78
78
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
|
79
79
|
i18n (>= 1.6, < 2)
|
|
80
80
|
minitest (>= 5.1)
|
|
@@ -82,101 +82,80 @@ GEM
|
|
|
82
82
|
zeitwerk (~> 2.3)
|
|
83
83
|
addressable (2.8.0)
|
|
84
84
|
public_suffix (>= 2.0.2, < 5.0)
|
|
85
|
-
ast (2.4.
|
|
86
|
-
binding_of_caller (0.
|
|
85
|
+
ast (2.4.2)
|
|
86
|
+
binding_of_caller (1.0.0)
|
|
87
87
|
debug_inspector (>= 0.0.1)
|
|
88
88
|
browser_sniffer (1.4.0)
|
|
89
89
|
builder (3.2.4)
|
|
90
90
|
byebug (11.1.3)
|
|
91
91
|
coderay (1.1.3)
|
|
92
|
-
concurrent-ruby (1.1.
|
|
93
|
-
crack (0.4.
|
|
92
|
+
concurrent-ruby (1.1.10)
|
|
93
|
+
crack (0.4.5)
|
|
94
|
+
rexml
|
|
94
95
|
crass (1.0.6)
|
|
95
|
-
debug_inspector (
|
|
96
|
+
debug_inspector (1.1.0)
|
|
96
97
|
erubi (1.10.0)
|
|
97
|
-
faraday (2.2.0)
|
|
98
|
-
faraday-net_http (~> 2.0)
|
|
99
|
-
ruby2_keywords (>= 0.0.4)
|
|
100
|
-
faraday-net_http (2.0.1)
|
|
101
98
|
globalid (1.0.0)
|
|
102
99
|
activesupport (>= 5.0)
|
|
103
|
-
|
|
104
|
-
graphql-client (0.17.0)
|
|
105
|
-
activesupport (>= 3.0)
|
|
106
|
-
graphql (~> 1.10)
|
|
100
|
+
hash_diff (1.0.0)
|
|
107
101
|
hashdiff (1.0.1)
|
|
108
|
-
|
|
109
|
-
|
|
102
|
+
httparty (0.20.0)
|
|
103
|
+
mime-types (~> 3.0)
|
|
104
|
+
multi_xml (>= 0.5.2)
|
|
105
|
+
i18n (1.10.0)
|
|
110
106
|
concurrent-ruby (~> 1.0)
|
|
111
107
|
jwt (2.3.0)
|
|
112
|
-
loofah (2.
|
|
108
|
+
loofah (2.15.0)
|
|
113
109
|
crass (~> 1.0.2)
|
|
114
110
|
nokogiri (>= 1.5.9)
|
|
115
111
|
mail (2.7.1)
|
|
116
112
|
mini_mime (>= 0.1.1)
|
|
117
113
|
marcel (1.0.2)
|
|
118
|
-
method_source (0.
|
|
114
|
+
method_source (1.0.0)
|
|
115
|
+
mime-types (3.4.1)
|
|
116
|
+
mime-types-data (~> 3.2015)
|
|
117
|
+
mime-types-data (3.2022.0105)
|
|
119
118
|
mini_mime (1.1.2)
|
|
120
|
-
mini_portile2 (2.
|
|
121
|
-
minitest (5.
|
|
122
|
-
mocha (1.
|
|
123
|
-
multi_json (1.15.0)
|
|
119
|
+
mini_portile2 (2.8.0)
|
|
120
|
+
minitest (5.15.0)
|
|
121
|
+
mocha (1.13.0)
|
|
124
122
|
multi_xml (0.6.0)
|
|
125
123
|
nio4r (2.5.8)
|
|
126
|
-
nokogiri (1.
|
|
127
|
-
mini_portile2 (~> 2.
|
|
124
|
+
nokogiri (1.13.3)
|
|
125
|
+
mini_portile2 (~> 2.8.0)
|
|
128
126
|
racc (~> 1.4)
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
multi_xml (~> 0.5)
|
|
134
|
-
rack (>= 1.2, < 3)
|
|
135
|
-
omniauth (2.0.4)
|
|
136
|
-
hashie (>= 3.4.6)
|
|
137
|
-
rack (>= 1.6.2, < 3)
|
|
138
|
-
rack-protection
|
|
139
|
-
omniauth-oauth2 (1.7.2)
|
|
140
|
-
oauth2 (~> 1.4)
|
|
141
|
-
omniauth (>= 1.9, < 3)
|
|
142
|
-
omniauth-rails_csrf_protection (1.0.1)
|
|
143
|
-
actionpack (>= 4.2)
|
|
144
|
-
omniauth (~> 2.0)
|
|
145
|
-
omniauth-shopify-oauth2 (2.3.2)
|
|
146
|
-
activesupport
|
|
147
|
-
omniauth-oauth2 (~> 1.5)
|
|
148
|
-
parallel (1.20.1)
|
|
149
|
-
parser (2.7.2.0)
|
|
127
|
+
oj (3.13.11)
|
|
128
|
+
openssl (3.0.0)
|
|
129
|
+
parallel (1.21.0)
|
|
130
|
+
parser (3.1.0.0)
|
|
150
131
|
ast (~> 2.4.1)
|
|
151
|
-
pry (0.
|
|
152
|
-
coderay (~> 1.1
|
|
153
|
-
method_source (~>
|
|
154
|
-
pry-nav (0.
|
|
155
|
-
pry (>= 0.9.10, < 0.
|
|
156
|
-
pry-stack_explorer (0.
|
|
157
|
-
binding_of_caller (
|
|
158
|
-
pry (
|
|
132
|
+
pry (0.14.1)
|
|
133
|
+
coderay (~> 1.1)
|
|
134
|
+
method_source (~> 1.0)
|
|
135
|
+
pry-nav (1.0.0)
|
|
136
|
+
pry (>= 0.9.10, < 0.15)
|
|
137
|
+
pry-stack_explorer (0.6.1)
|
|
138
|
+
binding_of_caller (~> 1.0)
|
|
139
|
+
pry (~> 0.13)
|
|
159
140
|
public_suffix (4.0.6)
|
|
160
141
|
racc (1.6.0)
|
|
161
142
|
rack (2.2.3)
|
|
162
|
-
rack-protection (2.2.0)
|
|
163
|
-
rack
|
|
164
143
|
rack-test (1.1.0)
|
|
165
144
|
rack (>= 1.0, < 3)
|
|
166
|
-
rails (6.1.
|
|
167
|
-
actioncable (= 6.1.
|
|
168
|
-
actionmailbox (= 6.1.
|
|
169
|
-
actionmailer (= 6.1.
|
|
170
|
-
actionpack (= 6.1.
|
|
171
|
-
actiontext (= 6.1.
|
|
172
|
-
actionview (= 6.1.
|
|
173
|
-
activejob (= 6.1.
|
|
174
|
-
activemodel (= 6.1.
|
|
175
|
-
activerecord (= 6.1.
|
|
176
|
-
activestorage (= 6.1.
|
|
177
|
-
activesupport (= 6.1.
|
|
145
|
+
rails (6.1.5)
|
|
146
|
+
actioncable (= 6.1.5)
|
|
147
|
+
actionmailbox (= 6.1.5)
|
|
148
|
+
actionmailer (= 6.1.5)
|
|
149
|
+
actionpack (= 6.1.5)
|
|
150
|
+
actiontext (= 6.1.5)
|
|
151
|
+
actionview (= 6.1.5)
|
|
152
|
+
activejob (= 6.1.5)
|
|
153
|
+
activemodel (= 6.1.5)
|
|
154
|
+
activerecord (= 6.1.5)
|
|
155
|
+
activestorage (= 6.1.5)
|
|
156
|
+
activesupport (= 6.1.5)
|
|
178
157
|
bundler (>= 1.15.0)
|
|
179
|
-
railties (= 6.1.
|
|
158
|
+
railties (= 6.1.5)
|
|
180
159
|
sprockets-rails (>= 2.0.0)
|
|
181
160
|
rails-controller-testing (1.0.5)
|
|
182
161
|
actionpack (>= 5.0.1.rc1)
|
|
@@ -187,39 +166,46 @@ GEM
|
|
|
187
166
|
nokogiri (>= 1.6)
|
|
188
167
|
rails-html-sanitizer (1.4.2)
|
|
189
168
|
loofah (~> 2.3)
|
|
190
|
-
railties (6.1.
|
|
191
|
-
actionpack (= 6.1.
|
|
192
|
-
activesupport (= 6.1.
|
|
169
|
+
railties (6.1.5)
|
|
170
|
+
actionpack (= 6.1.5)
|
|
171
|
+
activesupport (= 6.1.5)
|
|
193
172
|
method_source
|
|
194
|
-
rake (>=
|
|
173
|
+
rake (>= 12.2)
|
|
195
174
|
thor (~> 1.0)
|
|
196
|
-
rainbow (3.
|
|
197
|
-
rake (13.0.
|
|
175
|
+
rainbow (3.1.1)
|
|
176
|
+
rake (13.0.6)
|
|
198
177
|
rb-readline (0.5.5)
|
|
199
178
|
redirect_safely (1.0.0)
|
|
200
179
|
activemodel
|
|
201
|
-
regexp_parser (2.
|
|
180
|
+
regexp_parser (2.2.0)
|
|
202
181
|
rexml (3.2.5)
|
|
203
|
-
rubocop (1.
|
|
182
|
+
rubocop (1.25.1)
|
|
204
183
|
parallel (~> 1.10)
|
|
205
|
-
parser (>=
|
|
184
|
+
parser (>= 3.1.0.0)
|
|
206
185
|
rainbow (>= 2.2.2, < 4.0)
|
|
207
186
|
regexp_parser (>= 1.8, < 3.0)
|
|
208
187
|
rexml
|
|
209
|
-
rubocop-ast (>= 1.
|
|
188
|
+
rubocop-ast (>= 1.15.1, < 2.0)
|
|
210
189
|
ruby-progressbar (~> 1.7)
|
|
211
|
-
unicode-display_width (>= 1.4.0, <
|
|
212
|
-
rubocop-ast (1.
|
|
213
|
-
parser (>=
|
|
214
|
-
rubocop-shopify (
|
|
215
|
-
rubocop (~> 1.
|
|
216
|
-
ruby-progressbar (1.
|
|
217
|
-
|
|
218
|
-
shopify_api (
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
190
|
+
unicode-display_width (>= 1.4.0, < 3.0)
|
|
191
|
+
rubocop-ast (1.15.1)
|
|
192
|
+
parser (>= 3.0.1.1)
|
|
193
|
+
rubocop-shopify (2.4.0)
|
|
194
|
+
rubocop (~> 1.24)
|
|
195
|
+
ruby-progressbar (1.11.0)
|
|
196
|
+
securerandom (0.2.0)
|
|
197
|
+
shopify_api (10.0.0)
|
|
198
|
+
concurrent-ruby
|
|
199
|
+
hash_diff
|
|
200
|
+
httparty
|
|
201
|
+
jwt
|
|
202
|
+
oj
|
|
203
|
+
openssl
|
|
204
|
+
securerandom
|
|
205
|
+
sorbet-runtime
|
|
206
|
+
zeitwerk (~> 2.5)
|
|
207
|
+
sorbet-runtime (0.5.9854)
|
|
208
|
+
sprockets (4.0.3)
|
|
223
209
|
concurrent-ruby (~> 1.0)
|
|
224
210
|
rack (> 1, < 3)
|
|
225
211
|
sprockets-rails (3.4.2)
|
|
@@ -230,9 +216,9 @@ GEM
|
|
|
230
216
|
thor (1.2.1)
|
|
231
217
|
tzinfo (2.0.4)
|
|
232
218
|
concurrent-ruby (~> 1.0)
|
|
233
|
-
unicode-display_width (1.
|
|
234
|
-
webmock (3.
|
|
235
|
-
addressable (>= 2.
|
|
219
|
+
unicode-display_width (2.1.0)
|
|
220
|
+
webmock (3.14.0)
|
|
221
|
+
addressable (>= 2.8.0)
|
|
236
222
|
crack (>= 0.3.2)
|
|
237
223
|
hashdiff (>= 0.4.0, < 2.0.0)
|
|
238
224
|
websocket-driver (0.7.5)
|
data/Rakefile
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
require 'bundler/gem_tasks'
|
|
3
|
-
require 'rake/testtask'
|
|
4
2
|
|
|
5
|
-
require
|
|
3
|
+
require "bundler/gem_tasks"
|
|
4
|
+
require "rake/testtask"
|
|
5
|
+
|
|
6
|
+
require File.expand_path("../test/dummy/config/application", __FILE__)
|
|
6
7
|
|
|
7
8
|
Rails.application.load_tasks
|
|
@@ -28,7 +28,7 @@ module ShopifyApp
|
|
|
28
28
|
redirect_to(splash_page)
|
|
29
29
|
rescue ShopifyApp::LoginProtection::ShopifyDomainNotFound => error
|
|
30
30
|
Rails.logger.warn("[ShopifyApp::EnsureAuthenticatedLinks] Redirecting to login: [#{error.class}] "\
|
|
31
|
-
|
|
31
|
+
"Could not determine current shop domain")
|
|
32
32
|
redirect_to(ShopifyApp.configuration.login_url)
|
|
33
33
|
end
|
|
34
34
|
|
|
@@ -6,15 +6,28 @@ module ShopifyApp
|
|
|
6
6
|
include ShopifyApp::LoginProtection
|
|
7
7
|
|
|
8
8
|
def callback
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
9
|
+
begin
|
|
10
|
+
filtered_params = request.parameters.symbolize_keys.slice(:code, :shop, :timestamp, :state, :host, :hmac)
|
|
11
|
+
|
|
12
|
+
auth_result = ShopifyAPI::Auth::Oauth.validate_auth_callback(
|
|
13
|
+
cookies: {
|
|
14
|
+
ShopifyAPI::Auth::Oauth::SessionCookie::SESSION_COOKIE_NAME =>
|
|
15
|
+
cookies.encrypted[ShopifyAPI::Auth::Oauth::SessionCookie::SESSION_COOKIE_NAME],
|
|
16
|
+
},
|
|
17
|
+
auth_query: ShopifyAPI::Auth::Oauth::AuthQuery.new(**filtered_params)
|
|
18
|
+
)
|
|
19
|
+
rescue
|
|
20
|
+
return respond_with_error
|
|
15
21
|
end
|
|
16
22
|
|
|
17
|
-
|
|
23
|
+
cookies.encrypted[auth_result[:cookie].name] = {
|
|
24
|
+
expires: auth_result[:cookie].expires,
|
|
25
|
+
secure: true,
|
|
26
|
+
http_only: true,
|
|
27
|
+
value: auth_result[:cookie].value,
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
perform_post_authenticate_jobs(auth_result[:session])
|
|
18
31
|
|
|
19
32
|
respond_successfully
|
|
20
33
|
end
|
|
@@ -22,162 +35,37 @@ module ShopifyApp
|
|
|
22
35
|
private
|
|
23
36
|
|
|
24
37
|
def respond_successfully
|
|
25
|
-
|
|
26
|
-
head(:ok)
|
|
27
|
-
else
|
|
28
|
-
redirect_to(return_address)
|
|
29
|
-
end
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
def respond_with_user_token_flow
|
|
33
|
-
redirect_to(login_url_with_optional_shop)
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
def store_access_token_and_build_session
|
|
37
|
-
if native_browser_request?
|
|
38
|
-
reset_session_options
|
|
39
|
-
end
|
|
40
|
-
set_shopify_session
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
def invalid_request?
|
|
44
|
-
return true unless auth_hash
|
|
45
|
-
|
|
46
|
-
jwt_request? && !valid_jwt_auth?
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
def native_browser_request?
|
|
50
|
-
!jwt_request?
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
def perform_post_authenticate_jobs
|
|
54
|
-
install_webhooks
|
|
55
|
-
install_scripttags
|
|
56
|
-
perform_after_authenticate_job
|
|
38
|
+
redirect_to(return_address)
|
|
57
39
|
end
|
|
58
40
|
|
|
59
41
|
def respond_with_error
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
else
|
|
63
|
-
flash[:error] = I18n.t('could_not_log_in')
|
|
64
|
-
redirect_to(login_url_with_optional_shop)
|
|
65
|
-
end
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
# Override user_session_by_cookie from LoginProtection to bypass allow_cookie_authentication
|
|
69
|
-
# setting check because session cookies are justified at top level
|
|
70
|
-
def user_session_by_cookie
|
|
71
|
-
return unless session[:user_id].present?
|
|
72
|
-
ShopifyApp::SessionRepository.retrieve_user_session(session[:user_id])
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
def start_user_token_flow?
|
|
76
|
-
if jwt_request?
|
|
77
|
-
false
|
|
78
|
-
else
|
|
79
|
-
return false unless ShopifyApp::SessionRepository.user_storage.present?
|
|
80
|
-
update_user_access_scopes?
|
|
81
|
-
end
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
def update_user_access_scopes?
|
|
85
|
-
return true if user_session.blank?
|
|
86
|
-
user_access_scopes_strategy.update_access_scopes?(user_id: session[:user_id])
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
def user_access_scopes_strategy
|
|
90
|
-
ShopifyApp.configuration.user_access_scopes_strategy
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
def jwt_request?
|
|
94
|
-
jwt_shopify_domain || jwt_shopify_user_id
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
def valid_jwt_auth?
|
|
98
|
-
auth_hash && jwt_shopify_domain == shop_name && jwt_shopify_user_id == associated_user_id
|
|
99
|
-
end
|
|
100
|
-
|
|
101
|
-
def auth_hash
|
|
102
|
-
request.env['omniauth.auth']
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
def shop_name
|
|
106
|
-
auth_hash.uid
|
|
107
|
-
end
|
|
108
|
-
|
|
109
|
-
def offline_access_token
|
|
110
|
-
ShopifyApp::SessionRepository.retrieve_shop_session_by_shopify_domain(shop_name)&.token
|
|
111
|
-
end
|
|
112
|
-
|
|
113
|
-
def online_access_token
|
|
114
|
-
ShopifyApp::SessionRepository.retrieve_user_session_by_shopify_user_id(associated_user_id)&.token
|
|
115
|
-
end
|
|
116
|
-
|
|
117
|
-
def associated_user
|
|
118
|
-
return unless auth_hash.dig('extra', 'associated_user').present?
|
|
119
|
-
|
|
120
|
-
auth_hash['extra']['associated_user'].merge('scope' => auth_hash['extra']['associated_user_scope'])
|
|
121
|
-
end
|
|
122
|
-
|
|
123
|
-
def associated_user_id
|
|
124
|
-
associated_user && associated_user['id']
|
|
125
|
-
end
|
|
126
|
-
|
|
127
|
-
def token
|
|
128
|
-
auth_hash['credentials']['token']
|
|
129
|
-
end
|
|
130
|
-
|
|
131
|
-
def access_scopes
|
|
132
|
-
auth_hash.dig('extra', 'scope')
|
|
133
|
-
end
|
|
134
|
-
|
|
135
|
-
def reset_session_options
|
|
136
|
-
request.session_options[:renew] = true
|
|
137
|
-
session.delete(:_csrf_token)
|
|
42
|
+
flash[:error] = I18n.t("could_not_log_in")
|
|
43
|
+
redirect_to(login_url_with_optional_shop)
|
|
138
44
|
end
|
|
139
45
|
|
|
140
|
-
def
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
api_version: ShopifyApp.configuration.api_version,
|
|
145
|
-
access_scopes: access_scopes
|
|
146
|
-
)
|
|
147
|
-
|
|
148
|
-
session[:shopify_user] = associated_user
|
|
149
|
-
if session[:shopify_user].present?
|
|
150
|
-
session[:shop_id] = nil if shop_session && shop_session.domain != shop_name
|
|
151
|
-
session[:user_id] = ShopifyApp::SessionRepository.store_user_session(session_store, associated_user)
|
|
152
|
-
else
|
|
153
|
-
session[:shop_id] = ShopifyApp::SessionRepository.store_shop_session(session_store)
|
|
154
|
-
session[:user_id] = nil if user_session && user_session.domain != shop_name
|
|
155
|
-
end
|
|
156
|
-
session[:shopify_domain] = shop_name
|
|
157
|
-
session[:user_session] = auth_hash&.extra&.session
|
|
46
|
+
def perform_post_authenticate_jobs(session)
|
|
47
|
+
install_webhooks(session)
|
|
48
|
+
install_scripttags(session)
|
|
49
|
+
perform_after_authenticate_job(session)
|
|
158
50
|
end
|
|
159
51
|
|
|
160
|
-
def install_webhooks
|
|
52
|
+
def install_webhooks(session)
|
|
161
53
|
return unless ShopifyApp.configuration.has_webhooks?
|
|
162
54
|
|
|
163
|
-
WebhooksManager.queue(
|
|
164
|
-
shop_name,
|
|
165
|
-
offline_access_token || online_access_token,
|
|
166
|
-
ShopifyApp.configuration.webhooks
|
|
167
|
-
)
|
|
55
|
+
WebhooksManager.queue(session.shop, session.access_token)
|
|
168
56
|
end
|
|
169
57
|
|
|
170
|
-
def install_scripttags
|
|
58
|
+
def install_scripttags(session)
|
|
171
59
|
return unless ShopifyApp.configuration.has_scripttags?
|
|
172
60
|
|
|
173
61
|
ScripttagsManager.queue(
|
|
174
|
-
|
|
175
|
-
|
|
62
|
+
session.shop,
|
|
63
|
+
session.access_token,
|
|
176
64
|
ShopifyApp.configuration.scripttags
|
|
177
65
|
)
|
|
178
66
|
end
|
|
179
67
|
|
|
180
|
-
def perform_after_authenticate_job
|
|
68
|
+
def perform_after_authenticate_job(session)
|
|
181
69
|
config = ShopifyApp.configuration.after_authenticate_job
|
|
182
70
|
|
|
183
71
|
return unless config && config[:job].present?
|
|
@@ -186,9 +74,9 @@ module ShopifyApp
|
|
|
186
74
|
job = job.constantize if job.is_a?(String)
|
|
187
75
|
|
|
188
76
|
if config[:inline] == true
|
|
189
|
-
job.perform_now(shop_domain: session
|
|
77
|
+
job.perform_now(shop_domain: session.shop)
|
|
190
78
|
else
|
|
191
|
-
job.perform_later(shop_domain: session
|
|
79
|
+
job.perform_later(shop_domain: session.shop)
|
|
192
80
|
end
|
|
193
81
|
end
|
|
194
82
|
end
|