shopify_app 14.4.4 → 17.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 +38 -0
- data/.github/workflows/rubocop.yml +1 -7
- data/.gitignore +0 -2
- data/CHANGELOG.md +24 -0
- data/Gemfile.lock +256 -0
- data/README.md +34 -15
- data/app/assets/images/storage_access.svg +1 -2
- data/app/controllers/concerns/shopify_app/ensure_authenticated_links.rb +22 -0
- data/app/controllers/shopify_app/callback_controller.rb +0 -6
- data/app/controllers/shopify_app/sessions_controller.rb +1 -15
- data/app/views/shopify_app/partials/_button_styles.html.erb +41 -36
- data/app/views/shopify_app/partials/_card_styles.html.erb +3 -3
- data/app/views/shopify_app/partials/_empty_state_styles.html.erb +28 -59
- data/app/views/shopify_app/partials/_form_styles.html.erb +56 -0
- data/app/views/shopify_app/partials/_layout_styles.html.erb +16 -1
- data/app/views/shopify_app/partials/_typography_styles.html.erb +6 -6
- data/app/views/shopify_app/sessions/enable_cookies.html.erb +1 -1
- data/app/views/shopify_app/sessions/new.html.erb +38 -110
- data/app/views/shopify_app/sessions/request_storage_access.html.erb +1 -1
- data/app/views/shopify_app/sessions/top_level_interaction.html.erb +20 -15
- data/config/locales/de.yml +11 -11
- data/config/locales/vi.yml +22 -0
- data/config/locales/zh-CN.yml +1 -1
- data/docs/Releasing.md +5 -3
- data/lib/generators/shopify_app/home_controller/home_controller_generator.rb +16 -7
- data/lib/generators/shopify_app/home_controller/templates/index.html.erb +10 -10
- data/lib/generators/shopify_app/install/install_generator.rb +6 -1
- data/lib/generators/shopify_app/install/templates/shopify_app.rb.tt +4 -3
- data/lib/shopify_app/configuration.rb +3 -0
- data/lib/shopify_app/controller_concerns/itp.rb +0 -2
- data/lib/shopify_app/controller_concerns/login_protection.rb +4 -14
- data/lib/shopify_app/session/jwt.rb +3 -1
- data/lib/shopify_app/version.rb +1 -1
- data/package.json +1 -1
- data/shopify_app.gemspec +1 -1
- data/translation.yml +1 -1
- metadata +13 -3
- data/.travis.yml +0 -27
| @@ -11,6 +11,7 @@ module ShopifyApp | |
| 11 11 | 
             
                  class_option :scope, type: :array, default: ['read_products']
         | 
| 12 12 | 
             
                  class_option :embedded, type: :string, default: 'true'
         | 
| 13 13 | 
             
                  class_option :api_version, type: :string, default: nil
         | 
| 14 | 
            +
                  class_option :with_cookie_authentication, type: :boolean, default: false
         | 
| 14 15 |  | 
| 15 16 | 
             
                  def create_shopify_app_initializer
         | 
| 16 17 | 
             
                    @application_name = format_array_argument(options['application_name'])
         | 
| @@ -64,7 +65,7 @@ module ShopifyApp | |
| 64 65 | 
             
                  def insert_hosts_into_development_config
         | 
| 65 66 | 
             
                    inject_into_file(
         | 
| 66 67 | 
             
                      'config/environments/development.rb',
         | 
| 67 | 
            -
                      "  config.hosts = (config.hosts rescue []) << /\\ | 
| 68 | 
            +
                      "  config.hosts = (config.hosts rescue []) << /\\w+\\.ngrok\\.io/\n",
         | 
| 68 69 | 
             
                      after: "Rails.application.configure do\n"
         | 
| 69 70 | 
             
                    )
         | 
| 70 71 | 
             
                  end
         | 
| @@ -78,6 +79,10 @@ module ShopifyApp | |
| 78 79 | 
             
                  def format_array_argument(array)
         | 
| 79 80 | 
             
                    array.join(' ').tr('"', '')
         | 
| 80 81 | 
             
                  end
         | 
| 82 | 
            +
             | 
| 83 | 
            +
                  def with_cookie_authentication?
         | 
| 84 | 
            +
                    options['with_cookie_authentication'] || !embedded_app?
         | 
| 85 | 
            +
                  end
         | 
| 81 86 | 
             
                end
         | 
| 82 87 | 
             
              end
         | 
| 83 88 | 
             
            end
         | 
| @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ShopifyApp.configure do |config|
         | 
| 2 2 | 
             
              config.application_name = "<%= @application_name %>"
         | 
| 3 | 
            -
              config.api_key = ENV | 
| 4 | 
            -
              config.secret = ENV | 
| 3 | 
            +
              config.api_key = ENV.fetch('SHOPIFY_API_KEY', '').presence || raise('Missing SHOPIFY_API_KEY')
         | 
| 4 | 
            +
              config.secret = ENV.fetch('SHOPIFY_API_SECRET', '').presence || raise('Missing SHOPIFY_API_SECRET')
         | 
| 5 5 | 
             
              config.old_secret = "<%= @old_secret %>"
         | 
| 6 6 | 
             
              config.scope = "<%= @scope %>" # Consult this page for more scope options:
         | 
| 7 7 | 
             
                                             # https://help.shopify.com/en/api/getting-started/authentication/oauth/scopes
         | 
| @@ -9,7 +9,8 @@ ShopifyApp.configure do |config| | |
| 9 9 | 
             
              config.after_authenticate_job = false
         | 
| 10 10 | 
             
              config.api_version = "<%= @api_version %>"
         | 
| 11 11 | 
             
              config.shop_session_repository = 'Shop'
         | 
| 12 | 
            -
              config.allow_jwt_authentication =  | 
| 12 | 
            +
              config.allow_jwt_authentication = <%= !with_cookie_authentication? %>
         | 
| 13 | 
            +
              config.allow_cookie_authentication = <%= with_cookie_authentication? %>
         | 
| 13 14 | 
             
            end
         | 
| 14 15 |  | 
| 15 16 | 
             
            # ShopifyApp::Utils.fetch_known_api_versions                        # Uncomment to fetch known api versions from shopify servers on boot
         | 
| @@ -39,12 +39,15 @@ module ShopifyApp | |
| 39 39 | 
             
                # allow enabling jwt headers for authentication
         | 
| 40 40 | 
             
                attr_accessor :allow_jwt_authentication
         | 
| 41 41 |  | 
| 42 | 
            +
                attr_accessor :allow_cookie_authentication
         | 
| 43 | 
            +
             | 
| 42 44 | 
             
                def initialize
         | 
| 43 45 | 
             
                  @root_url = '/'
         | 
| 44 46 | 
             
                  @myshopify_domain = 'myshopify.com'
         | 
| 45 47 | 
             
                  @scripttags_manager_queue_name = Rails.application.config.active_job.queue_name
         | 
| 46 48 | 
             
                  @webhooks_manager_queue_name = Rails.application.config.active_job.queue_name
         | 
| 47 49 | 
             
                  @disable_webpacker = ENV['SHOPIFY_APP_DISABLE_WEBPACKER'].present?
         | 
| 50 | 
            +
                  @allow_cookie_authentication = true
         | 
| 48 51 | 
             
                end
         | 
| 49 52 |  | 
| 50 53 | 
             
                def login_url
         | 
| @@ -13,12 +13,10 @@ module ShopifyApp | |
| 13 13 | 
             
                end
         | 
| 14 14 |  | 
| 15 15 | 
             
                def set_top_level_oauth_cookie
         | 
| 16 | 
            -
                  Rails.logger.debug("[ShopifyApp::Itp] Setting top level oauth cookie...")
         | 
| 17 16 | 
             
                  session['shopify.top_level_oauth'] = true
         | 
| 18 17 | 
             
                end
         | 
| 19 18 |  | 
| 20 19 | 
             
                def clear_top_level_oauth_cookie
         | 
| 21 | 
            -
                  Rails.logger.debug("[ShopifyApp::Itp] Clearing top level oauth cookie...")
         | 
| 22 20 | 
             
                  session.delete('shopify.top_level_oauth')
         | 
| 23 21 | 
             
                end
         | 
| 24 22 |  | 
| @@ -18,24 +18,18 @@ module ShopifyApp | |
| 18 18 |  | 
| 19 19 | 
             
                def activate_shopify_session
         | 
| 20 20 | 
             
                  if user_session_expected? && user_session.blank?
         | 
| 21 | 
            -
                    Rails.logger.debug("[ShopifyApp::LoginProtection] User session required. Redirecting to login...")
         | 
| 22 21 | 
             
                    signal_access_token_required
         | 
| 23 22 | 
             
                    return redirect_to_login
         | 
| 24 23 | 
             
                  end
         | 
| 25 24 |  | 
| 26 | 
            -
                  if current_shopify_session.blank?
         | 
| 27 | 
            -
                    Rails.logger.debug("[ShopifyApp::LoginProtection] Current shopify session is blank. Redirecting to login...")
         | 
| 28 | 
            -
                    return redirect_to_login
         | 
| 29 | 
            -
                  end
         | 
| 25 | 
            +
                  return redirect_to_login if current_shopify_session.blank?
         | 
| 30 26 |  | 
| 31 27 | 
             
                  clear_top_level_oauth_cookie
         | 
| 32 28 |  | 
| 33 29 | 
             
                  begin
         | 
| 34 | 
            -
                    Rails.logger.debug("[ShopifyApp::LoginProtection] Activating session...")
         | 
| 35 30 | 
             
                    ShopifyAPI::Base.activate_session(current_shopify_session)
         | 
| 36 31 | 
             
                    yield
         | 
| 37 32 | 
             
                  ensure
         | 
| 38 | 
            -
                    Rails.logger.debug("[ShopifyApp::LoginProtection] Clearing session...")
         | 
| 39 33 | 
             
                    ShopifyAPI::Base.clear_session
         | 
| 40 34 | 
             
                  end
         | 
| 41 35 | 
             
                end
         | 
| @@ -57,6 +51,7 @@ module ShopifyApp | |
| 57 51 | 
             
                end
         | 
| 58 52 |  | 
| 59 53 | 
             
                def user_session_by_cookie
         | 
| 54 | 
            +
                  return unless ShopifyApp.configuration.allow_cookie_authentication
         | 
| 60 55 | 
             
                  return unless session[:user_id].present?
         | 
| 61 56 | 
             
                  ShopifyApp::SessionRepository.retrieve_user_session(session[:user_id])
         | 
| 62 57 | 
             
                end
         | 
| @@ -72,18 +67,14 @@ module ShopifyApp | |
| 72 67 | 
             
                end
         | 
| 73 68 |  | 
| 74 69 | 
             
                def shop_session_by_cookie
         | 
| 70 | 
            +
                  return unless ShopifyApp.configuration.allow_cookie_authentication
         | 
| 75 71 | 
             
                  return unless session[:shop_id].present?
         | 
| 76 72 | 
             
                  ShopifyApp::SessionRepository.retrieve_shop_session(session[:shop_id])
         | 
| 77 73 | 
             
                end
         | 
| 78 74 |  | 
| 79 75 | 
             
                def login_again_if_different_user_or_shop
         | 
| 80 76 | 
             
                  if session[:user_session].present? && params[:session].present? # session data was sent/stored correctly
         | 
| 81 | 
            -
                    Rails.logger.debug("[ShopifyApp::LoginProtection] Session data was sent/stored correctly.")
         | 
| 82 77 | 
             
                    clear_session = session[:user_session] != params[:session] # current user is different from stored user
         | 
| 83 | 
            -
                    if clear_session
         | 
| 84 | 
            -
                      Rails.logger.debug("[ShopifyApp::LoginProtection] Current user is different from stored user.")
         | 
| 85 | 
            -
                    end
         | 
| 86 | 
            -
                    clear_session
         | 
| 87 78 | 
             
                  end
         | 
| 88 79 |  | 
| 89 80 | 
             
                  if current_shopify_session &&
         | 
| @@ -93,14 +84,13 @@ module ShopifyApp | |
| 93 84 | 
             
                  end
         | 
| 94 85 |  | 
| 95 86 | 
             
                  if clear_session
         | 
| 96 | 
            -
                    Rails.logger.debug("[ShopifyApp::LoginProtection] Clearing shopify session and redirecting to login...")
         | 
| 97 87 | 
             
                    clear_shopify_session
         | 
| 98 88 | 
             
                    redirect_to_login
         | 
| 99 89 | 
             
                  end
         | 
| 100 90 | 
             
                end
         | 
| 101 91 |  | 
| 102 92 | 
             
                def signal_access_token_required
         | 
| 103 | 
            -
                  response.set_header(ACCESS_TOKEN_REQUIRED_HEADER, true)
         | 
| 93 | 
            +
                  response.set_header(ACCESS_TOKEN_REQUIRED_HEADER, "true")
         | 
| 104 94 | 
             
                end
         | 
| 105 95 |  | 
| 106 96 | 
             
                protected
         | 
| @@ -2,7 +2,9 @@ | |
| 2 2 | 
             
            module ShopifyApp
         | 
| 3 3 | 
             
              class JWT
         | 
| 4 4 | 
             
                class InvalidDestinationError < StandardError; end
         | 
| 5 | 
            +
             | 
| 5 6 | 
             
                class MismatchedHostsError < StandardError; end
         | 
| 7 | 
            +
             | 
| 6 8 | 
             
                class InvalidAudienceError < StandardError; end
         | 
| 7 9 |  | 
| 8 10 | 
             
                WARN_EXCEPTIONS = [
         | 
| @@ -25,7 +27,7 @@ module ShopifyApp | |
| 25 27 | 
             
                end
         | 
| 26 28 |  | 
| 27 29 | 
             
                def shopify_user_id
         | 
| 28 | 
            -
                  @payload && @payload['sub']
         | 
| 30 | 
            +
                  @payload['sub'].to_i if @payload && @payload['sub']
         | 
| 29 31 | 
             
                end
         | 
| 30 32 |  | 
| 31 33 | 
             
                private
         | 
    
        data/lib/shopify_app/version.rb
    CHANGED
    
    
    
        data/package.json
    CHANGED
    
    
    
        data/shopify_app.gemspec
    CHANGED
    
    | @@ -14,7 +14,7 @@ Gem::Specification.new do |s| | |
| 14 14 | 
             
              s.metadata['allowed_push_host'] = 'https://rubygems.org'
         | 
| 15 15 |  | 
| 16 16 | 
             
              s.add_runtime_dependency('browser_sniffer', '~> 1.2.2')
         | 
| 17 | 
            -
              s.add_runtime_dependency('rails', '> 5.2.1')
         | 
| 17 | 
            +
              s.add_runtime_dependency('rails', '> 5.2.1', '< 6.1')
         | 
| 18 18 | 
             
              s.add_runtime_dependency('shopify_api', '~> 9.1')
         | 
| 19 19 | 
             
              s.add_runtime_dependency('omniauth-shopify-oauth2', '~> 2.2.2')
         | 
| 20 20 | 
             
              s.add_runtime_dependency('jwt', '~> 2.2.1')
         | 
    
        data/translation.yml
    CHANGED
    
    | @@ -1,5 +1,5 @@ | |
| 1 1 | 
             
            source_language: en
         | 
| 2 | 
            -
            target_languages: [cs, da, de, es, fi, fr, hi, it, ja, ko, ms, nb, nl, pl, pt-BR, pt-PT, sv, th, tr, zh-CN, zh-TW]
         | 
| 2 | 
            +
            target_languages: [cs, da, de, es, fi, fr, hi, it, ja, ko, ms, nb, nl, pl, pt-BR, pt-PT, sv, th, tr, vi, zh-CN, zh-TW]
         | 
| 3 3 | 
             
            components:
         | 
| 4 4 | 
             
              - name: 'merchant'
         | 
| 5 5 | 
             
                paths:
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: shopify_app
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version:  | 
| 4 | 
            +
              version: 17.0.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Shopify
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date:  | 
| 11 | 
            +
            date: 2021-01-14 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: browser_sniffer
         | 
| @@ -31,6 +31,9 @@ dependencies: | |
| 31 31 | 
             
                - - ">"
         | 
| 32 32 | 
             
                  - !ruby/object:Gem::Version
         | 
| 33 33 | 
             
                    version: 5.2.1
         | 
| 34 | 
            +
                - - "<"
         | 
| 35 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 36 | 
            +
                    version: '6.1'
         | 
| 34 37 | 
             
              type: :runtime
         | 
| 35 38 | 
             
              prerelease: false
         | 
| 36 39 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| @@ -38,6 +41,9 @@ dependencies: | |
| 38 41 | 
             
                - - ">"
         | 
| 39 42 | 
             
                  - !ruby/object:Gem::Version
         | 
| 40 43 | 
             
                    version: 5.2.1
         | 
| 44 | 
            +
                - - "<"
         | 
| 45 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 46 | 
            +
                    version: '6.1'
         | 
| 41 47 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 42 48 | 
             
              name: shopify_api
         | 
| 43 49 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -245,14 +251,15 @@ files: | |
| 245 251 | 
             
            - ".github/ISSUE_TEMPLATE.md"
         | 
| 246 252 | 
             
            - ".github/PULL_REQUEST_TEMPLATE.md"
         | 
| 247 253 | 
             
            - ".github/probots.yml"
         | 
| 254 | 
            +
            - ".github/workflows/build.yml"
         | 
| 248 255 | 
             
            - ".github/workflows/rubocop.yml"
         | 
| 249 256 | 
             
            - ".gitignore"
         | 
| 250 257 | 
             
            - ".nvmrc"
         | 
| 251 258 | 
             
            - ".rubocop.yml"
         | 
| 252 259 | 
             
            - ".ruby-version"
         | 
| 253 | 
            -
            - ".travis.yml"
         | 
| 254 260 | 
             
            - CHANGELOG.md
         | 
| 255 261 | 
             
            - Gemfile
         | 
| 262 | 
            +
            - Gemfile.lock
         | 
| 256 263 | 
             
            - LICENSE
         | 
| 257 264 | 
             
            - README.md
         | 
| 258 265 | 
             
            - Rakefile
         | 
| @@ -268,6 +275,7 @@ files: | |
| 268 275 | 
             
            - app/assets/javascripts/shopify_app/top_level.js
         | 
| 269 276 | 
             
            - app/assets/javascripts/shopify_app/top_level_interaction.js
         | 
| 270 277 | 
             
            - app/controllers/concerns/shopify_app/authenticated.rb
         | 
| 278 | 
            +
            - app/controllers/concerns/shopify_app/ensure_authenticated_links.rb
         | 
| 271 279 | 
             
            - app/controllers/concerns/shopify_app/require_known_shop.rb
         | 
| 272 280 | 
             
            - app/controllers/shopify_app/authenticated_controller.rb
         | 
| 273 281 | 
             
            - app/controllers/shopify_app/callback_controller.rb
         | 
| @@ -277,6 +285,7 @@ files: | |
| 277 285 | 
             
            - app/views/shopify_app/partials/_button_styles.html.erb
         | 
| 278 286 | 
             
            - app/views/shopify_app/partials/_card_styles.html.erb
         | 
| 279 287 | 
             
            - app/views/shopify_app/partials/_empty_state_styles.html.erb
         | 
| 288 | 
            +
            - app/views/shopify_app/partials/_form_styles.html.erb
         | 
| 280 289 | 
             
            - app/views/shopify_app/partials/_layout_styles.html.erb
         | 
| 281 290 | 
             
            - app/views/shopify_app/partials/_typography_styles.html.erb
         | 
| 282 291 | 
             
            - app/views/shopify_app/sessions/enable_cookies.html.erb
         | 
| @@ -304,6 +313,7 @@ files: | |
| 304 313 | 
             
            - config/locales/sv.yml
         | 
| 305 314 | 
             
            - config/locales/th.yml
         | 
| 306 315 | 
             
            - config/locales/tr.yml
         | 
| 316 | 
            +
            - config/locales/vi.yml
         | 
| 307 317 | 
             
            - config/locales/zh-CN.yml
         | 
| 308 318 | 
             
            - config/locales/zh-TW.yml
         | 
| 309 319 | 
             
            - config/routes.rb
         | 
    
        data/.travis.yml
    DELETED
    
    | @@ -1,27 +0,0 @@ | |
| 1 | 
            -
            sudo: required
         | 
| 2 | 
            -
            dist: trusty
         | 
| 3 | 
            -
            addons:
         | 
| 4 | 
            -
                chrome: stable
         | 
| 5 | 
            -
            before_script:
         | 
| 6 | 
            -
                - "sudo chown root /opt/google/chrome/chrome-sandbox"
         | 
| 7 | 
            -
                - "sudo chmod 4755 /opt/google/chrome/chrome-sandbox"
         | 
| 8 | 
            -
            language: ruby
         | 
| 9 | 
            -
            cache:
         | 
| 10 | 
            -
              bundler: true
         | 
| 11 | 
            -
              directories:
         | 
| 12 | 
            -
                - node_modules
         | 
| 13 | 
            -
              yarn: true
         | 
| 14 | 
            -
             | 
| 15 | 
            -
            rvm:
         | 
| 16 | 
            -
              - 2.5
         | 
| 17 | 
            -
              - 2.6
         | 
| 18 | 
            -
              - 2.7
         | 
| 19 | 
            -
             | 
| 20 | 
            -
            install:
         | 
| 21 | 
            -
              - bundle install
         | 
| 22 | 
            -
              - nvm install node
         | 
| 23 | 
            -
              - yarn
         | 
| 24 | 
            -
             | 
| 25 | 
            -
            script:
         | 
| 26 | 
            -
              - yarn test
         | 
| 27 | 
            -
              - bundle exec rake test
         |