intercom-rails 0.3.5 → 0.3.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 90db5a172849d4e46208b7e4945becc12bda59a0
4
- data.tar.gz: 5f6a61ef04bb2a4a55c21aee3959f79453b5b1ab
3
+ metadata.gz: 2c8c86341c15d5e3d7620a1a737c2a2eb62744b3
4
+ data.tar.gz: bccf57bc964ba2aa3daa7dee8b7e569e21d28d4f
5
5
  SHA512:
6
- metadata.gz: 29c9e1b05d138b9d666948e9209fe049758abe7244147605c31d6d644c615d5b96c74b6ea6a5d6fd7d2efc9484dce4dae481251470b8d5af28437b2e0fdc6328
7
- data.tar.gz: b7ecd91c086b837ebdf2c3bbd3264f7fdfd4de5a8ecb59af7c3010bfe2a0f55c185b7b788eae1e9c19aadcd9e9d5cb559fac6f43990ebc175d7a2095efbbfda0
6
+ metadata.gz: 923ca98ea86eee4d13dbfc68691f706883fe08929e6d147888522e2aa1f93f95f6720e5ce033671e29531d4811fff9e13a73ec6bc7c26f23f805b085d3617f63
7
+ data.tar.gz: 396f0c39720971cd3afc59869e015c076cc4ba5e608b41069a0406902ad70e9b70c784a7f41ee7983739e04feaca4d619a832d8f1b2c9d704c5fb5ee7b14a747
data/README.md CHANGED
@@ -4,6 +4,8 @@ The easiest way to install Intercom in a rails app.
4
4
 
5
5
  For interacting with the Intercom REST API, use the `intercom` gem (https://github.com/intercom/intercom-ruby)
6
6
 
7
+ Requires ruby 2.0 or higher for `intercom-rails >= 4.0`
8
+
7
9
  ## Installation
8
10
  Add this to your Gemfile:
9
11
 
@@ -26,7 +28,7 @@ rails generate intercom:config YOUR-APP-ID
26
28
  To make installing Intercom easy, where possible a `<script>` tag **will be automatically inserted before the closing `</body>` tag**. For most Rails apps, **you won't need to do any extra config**. Having trouble? Check out troubleshooting below.
27
29
 
28
30
 
29
- ### Live Chat
31
+ ### Live Chat
30
32
  With the Intercom Messenger you can [chat](https://www.intercom.com/live-chat) with users and visitors to your web site. Include the Intercom Messenger on every page by setting:
31
33
  ```ruby
32
34
  config.include_for_logged_out_users = true
@@ -60,7 +62,7 @@ Feel free to mail us: team@intercom.io, if you're still having trouble.
60
62
  ## Configuration
61
63
 
62
64
  ### API Secret
63
- If you want to use secure mode, ensure you set your API secret in `config/initializers/intercom.rb`:
65
+ If you want to use Identity Verification, ensure you set your API secret in `config/initializers/intercom.rb`:
64
66
 
65
67
  ```ruby
66
68
  config.api_secret = '123456'
@@ -384,7 +386,8 @@ end
384
386
  class DeleteFromIntercom < ApplicationJob
385
387
  def perform(user)
386
388
  intercom = Intercom::Client.new
387
- intercom.users.find(email: user.email).delete
389
+ user = intercom.users.find(id: user.id)
390
+ deleted_user = intercom.users.delete(user)
388
391
  end
389
392
  end
390
393
  ```
@@ -416,7 +419,7 @@ bundle exec rspec spec/
416
419
  - **Send coherent history**. Make sure each individual commit in your pull
417
420
  request is meaningful. If you had to make multiple intermediate commits while
418
421
  developing, please squash them before sending them to us.
419
-
422
+
420
423
 
421
424
  ## Contributors
422
425
 
@@ -3,6 +3,7 @@ require 'intercom-rails/date_helper'
3
3
  require 'intercom-rails/proxy'
4
4
  require 'intercom-rails/proxy/user'
5
5
  require 'intercom-rails/proxy/company'
6
+ require 'intercom-rails/encrypted_mode'
6
7
  require 'intercom-rails/script_tag'
7
8
  require 'intercom-rails/script_tag_helper'
8
9
  require 'intercom-rails/custom_data_helper'
@@ -108,6 +108,7 @@ module IntercomRails
108
108
  config_accessor :enabled_environments, &ARRAY_VALIDATOR
109
109
  config_accessor :include_for_logged_out_users
110
110
  config_accessor :hide_default_launcher
111
+ config_accessor :encrypted_mode
111
112
 
112
113
  def self.api_key=(*)
113
114
  warn "Setting an Intercom API key is no longer supported; remove the `config.api_key = ...` line from config/initializers/intercom.rb"
@@ -0,0 +1,34 @@
1
+ module IntercomRails
2
+ class EncryptedMode
3
+ attr_reader :secret, :initialization_vector, :enabled
4
+
5
+ ENCRYPTED_MODE_SETTINGS_WHITELIST = [:app_id, :session_duration, :widget, :custom_launcher_selector, :hide_default_launcher, :alignment, :horizontal_padding, :vertical_padding]
6
+
7
+ def initialize(secret, initialization_vector, options)
8
+ @secret = secret
9
+ @initialization_vector = initialization_vector || SecureRandom.random_bytes(12)
10
+ @enabled = options.fetch(:enabled, false)
11
+ end
12
+
13
+ def plaintext_part(settings)
14
+ enabled ? settings.slice(*ENCRYPTED_MODE_SETTINGS_WHITELIST) : settings
15
+ end
16
+
17
+ def encrypted_javascript(payload)
18
+ enabled ? "window.intercomEncryptedPayload = \"#{encrypt(payload)}\";" : ""
19
+ end
20
+
21
+ def encrypt(payload)
22
+ return nil unless enabled
23
+ payload = payload.except(*ENCRYPTED_MODE_SETTINGS_WHITELIST)
24
+ key = Digest::SHA256.digest(secret)
25
+ cipher = OpenSSL::Cipher.new('aes-256-gcm')
26
+ cipher.encrypt
27
+ cipher.key = key
28
+ cipher.iv = initialization_vector
29
+ json = ActiveSupport::JSON.encode(payload).gsub('<', '\u003C')
30
+ encrypted = initialization_vector + cipher.update(json) + cipher.final + cipher.auth_tag
31
+ Base64.encode64(encrypted).gsub("\n", "\\n")
32
+ end
33
+ end
34
+ end
@@ -10,7 +10,7 @@ module IntercomRails
10
10
  include ::ActionView::Helpers::JavaScriptHelper
11
11
 
12
12
  attr_reader :user_details, :company_details, :show_everywhere, :session_duration
13
- attr_accessor :secret, :widget_options, :controller, :nonce
13
+ attr_accessor :secret, :widget_options, :controller, :nonce, :encrypted_mode_enabled, :encrypted_mode
14
14
 
15
15
  def initialize(options = {})
16
16
  self.secret = options[:secret] || Config.api_secret
@@ -20,6 +20,9 @@ module IntercomRails
20
20
  @session_duration = session_duration_from_config
21
21
  self.user_details = options[:find_current_user_details] ? find_current_user_details : options[:user_details]
22
22
 
23
+ self.encrypted_mode_enabled = options[:encrypted_mode] || Config.encrypted_mode
24
+ self.encrypted_mode = IntercomRails::EncryptedMode.new(secret, options[:initialization_vector], {:enabled => encrypted_mode_enabled})
25
+
23
26
  # Request specific custom data for non-signed up users base on lead_attributes
24
27
  self.user_details = self.user_details.merge(find_lead_attributes)
25
28
 
@@ -94,11 +97,21 @@ module IntercomRails
94
97
  custom_data.select {|k, v| lead_attributes.map(&:to_s).include?(k)}
95
98
  end
96
99
 
100
+ def plaintext_settings
101
+ encrypted_mode.plaintext_part(intercom_settings)
102
+ end
103
+
104
+ def encrypted_settings
105
+ encrypted_mode.encrypt(intercom_settings)
106
+ end
107
+
97
108
  private
109
+
98
110
  def intercom_javascript
99
- intercom_settings_json = ActiveSupport::JSON.encode(intercom_settings).gsub('<', '\u003C')
111
+ plaintext_javascript = ActiveSupport::JSON.encode(plaintext_settings).gsub('<', '\u003C')
112
+ intercom_encrypted_payload_javascript = encrypted_mode.encrypted_javascript(intercom_settings)
100
113
 
101
- str = "window.intercomSettings = #{intercom_settings_json};(function(){var w=window;var ic=w.Intercom;if(typeof ic===\"function\"){ic('reattach_activator');ic('update',intercomSettings);}else{var d=document;var i=function(){i.c(arguments)};i.q=[];i.c=function(args){i.q.push(args)};w.Intercom=i;function l(){var s=d.createElement('script');s.type='text/javascript';s.async=true;s.src='#{Config.library_url || "https://widget.intercom.io/widget/#{j app_id}"}';var x=d.getElementsByTagName('script')[0];x.parentNode.insertBefore(s,x);}if(w.attachEvent){w.attachEvent('onload',l);}else{w.addEventListener('load',l,false);}};})()"
114
+ str = "window.intercomSettings = #{plaintext_javascript};#{intercom_encrypted_payload_javascript}(function(){var w=window;var ic=w.Intercom;if(typeof ic===\"function\"){ic('reattach_activator');ic('update',intercomSettings);}else{var d=document;var i=function(){i.c(arguments)};i.q=[];i.c=function(args){i.q.push(args)};w.Intercom=i;function l(){var s=d.createElement('script');s.type='text/javascript';s.async=true;s.src='#{Config.library_url || "https://widget.intercom.io/widget/#{j app_id}"}';var x=d.getElementsByTagName('script')[0];x.parentNode.insertBefore(s,x);}if(w.attachEvent){w.attachEvent('onload',l);}else{w.addEventListener('load',l,false);}};})()"
102
115
 
103
116
  str
104
117
  end
@@ -5,14 +5,14 @@ module IntercomRails
5
5
  # Generate an intercom script tag.
6
6
  #
7
7
  # @param user_details [Hash] a customizable hash of user details
8
- # @param options [Hash] an optional hash for secure mode and widget customisation
8
+ # @param options [Hash] an optional hash for Identity Verification and widget customization
9
9
  # @option user_details [String] :app_id Your application id
10
10
  # @option user_details [String] :user_id unique id of this user within your application
11
11
  # @option user_details [String] :email email address for this user
12
12
  # @option user_details [String] :name the users name, _optional_ but useful for identify people in the Intercom App.
13
13
  # @option user_details [Hash] :custom_data custom attributes you'd like saved for this user on Intercom.
14
14
  # @option options [String] :widget a hash containing a css selector for an element which when clicked should show the Intercom widget
15
- # @option options [String] :secret Your app secret for secure mode
15
+ # @option options [String] :secret Your app secret for Identity Verification
16
16
  # @option options [String] :nonce a nonce generated by your CSP framework to be included inside the javascript tag
17
17
  # @return [String] Intercom script tag
18
18
  # @example basic example
@@ -2,7 +2,6 @@ module IntercomRails
2
2
  module ShutdownHelper
3
3
  # This helper allows to erase cookies when a user log out of an application
4
4
  # It is recommanded to call this function every time a user log out of your application
5
- # specifically if you use both "Acquire" and another Intercom product
6
5
  # Do not use before a redirect_to because it will not clear the cookies on a redirection
7
6
  def self.intercom_shutdown_helper(cookies)
8
7
  if (cookies.is_a?(ActionDispatch::Cookies::CookieJar))
@@ -1,3 +1,3 @@
1
1
  module IntercomRails
2
- VERSION = "0.3.5"
2
+ VERSION = "0.3.8"
3
3
  end
@@ -7,7 +7,7 @@ module Intercom
7
7
  end
8
8
 
9
9
  argument :app_id, :desc => "Your Intercom app-id, which can be found here: https://app.intercom.io/apps/api_keys"
10
- argument :api_secret, :desc => "Your Intercom api-secret, used for secure mode", :optional => true
10
+ argument :api_secret, :desc => "Your Intercom api-secret, used for Identity Verification", :optional => true
11
11
  argument :session_duration, :desc => "user session duration, this should match your app", :optional => true
12
12
 
13
13
  FALSEY_RESPONSES = ['n', 'no']
@@ -11,8 +11,8 @@ IntercomRails.config do |config|
11
11
  # config.session_duration = 300000
12
12
  <%- end -%>
13
13
  # == Intercom secret key
14
- # This is required to enable secure mode, you can find it on your Setup
15
- # guide in the "Secure Mode" step.
14
+ # This is required to enable Identity Verification, you can find it on your Setup
15
+ # guide in the "Identity Verification" step.
16
16
  #
17
17
  <%- if @api_secret -%>
18
18
  config.api_secret = "<%= @api_secret %>"
@@ -38,7 +38,7 @@ IntercomRails.config do |config|
38
38
 
39
39
  # == Include for logged out Users
40
40
  # If set to true, include the Intercom messenger on all pages, regardless of whether
41
- # The user model class (set below) is present. Only available for Apps on the Acquire plan.
41
+ # The user model class (set below) is present.
42
42
  <%- if @include_for_logged_out_users -%>
43
43
  config.include_for_logged_out_users = true
44
44
  <%- else -%>
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: intercom-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.5
4
+ version: 0.3.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben McRedmond
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2017-04-12 00:00:00.000000000 Z
13
+ date: 2018-01-23 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activesupport
@@ -171,6 +171,7 @@ files:
171
171
  - lib/intercom-rails/config.rb
172
172
  - lib/intercom-rails/custom_data_helper.rb
173
173
  - lib/intercom-rails/date_helper.rb
174
+ - lib/intercom-rails/encrypted_mode.rb
174
175
  - lib/intercom-rails/exceptions.rb
175
176
  - lib/intercom-rails/proxy.rb
176
177
  - lib/intercom-rails/proxy/company.rb
@@ -202,9 +203,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
202
203
  version: '0'
203
204
  requirements: []
204
205
  rubyforge_project: intercom-rails
205
- rubygems_version: 2.4.8
206
+ rubygems_version: 2.5.1
206
207
  signing_key:
207
208
  specification_version: 4
208
209
  summary: Rails helper for emitting javascript script tags for Intercom
209
210
  test_files: []
210
- has_rdoc: