pusher 1.4.2 → 2.0.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 81a153328f0e5452bcdd87e9cd09339464a26679566f1d14f087fee9a29a69b2
4
- data.tar.gz: f5e282e3a9f0d60d441da0ef023073cefa1d4ebd2ada5b7fcb82a258a53c402a
3
+ metadata.gz: b567f2d8e33ab63ee101f1d463ee826ef9deb173509724a0df6996b73fac1249
4
+ data.tar.gz: 9e0e443c7769c8520be0f9f72b2db5d95c9a9f221f0221df48b0eee0267f60a1
5
5
  SHA512:
6
- metadata.gz: 87ed04a2e5bd63cfffd67798066dc9d014d119a00f7b6caad6c7d9a0d1a64c0a251c5f5b9706d883025532758e53f9a5d2f34579b555a206bb341182c624f58d
7
- data.tar.gz: 7776a1f8477dc5d7d33efb0cb46edd3dfe0d77d7c40d691eb8cb525d71998216eb4fc7832b546fb7c43f7ec1bb1db5db32e169ed1d4d1c2cdd1291d89e9f8b73
6
+ metadata.gz: 9b9d18e469e431fd495fee4eadb33ed0f982fbc796033d036fb3366853a72634a88be4b77fd21bd4c1387b02f00b6f635fbc766bb783cb36987fb81415717fb4
7
+ data.tar.gz: 762bb0188b7ee29aa1ff87d235383fc0ca1ded17b251171b091d44d621796faf06b176db4580e2cef6c44c44da8bc5296ec7c3867315faa87ff42a200558425f
data/CHANGELOG.md CHANGED
@@ -1,133 +1,129 @@
1
- 1.4.2 / 2020-10-20
1
+ # Changelog
2
+
3
+ ## 2.0.2
4
+
5
+ * [CHANGED] made encryption_master_key_base64 globally configurable
6
+
7
+ ## 2.0.1
8
+
9
+ * [CHANGED] Only include lib and essential docs in gem.
10
+
11
+ ## 2.0.0
12
+
13
+ * [CHANGED] Use TLS by default.
14
+ * [REMOVED] Support for Ruby 2.4 and 2.5.
15
+ * [FIXED] Handle empty or nil configuration.
16
+ * [REMOVED] Legacy Push Notification integration.
17
+ * [ADDED] Stalebot and Github actions.
18
+
19
+ ## 1.4.3
20
+
21
+ * [FIXED] Remove newline from end of base64 encoded strings, some decoders don't like
22
+ them.
23
+
24
+ ## 1.4.2
2
25
  ==================
3
26
 
4
- * Return `shared_secret` to support authenticating encrypted channels. Thanks
27
+ * [FIXED] Return `shared_secret` to support authenticating encrypted channels. Thanks
5
28
  @Benjaminpjacobs
6
29
 
7
- 1.4.1 / 2020-10-05
8
- ==================
30
+ ## 1.4.1
9
31
 
10
- * Remove rbnacl from dependencies so we don't get errors when it isn't
32
+ * [CHANGED] Remove rbnacl from dependencies so we don't get errors when it isn't
11
33
  required. Thanks @y-yagi!
12
34
 
13
- 1.4.0 / 2020-09-29
14
- ==================
35
+ ## 1.4.0
15
36
 
16
- * Support for end-to-end encryption.
37
+ * [ADDED] Support for end-to-end encryption.
17
38
 
18
- 1.3.3 / 2019-07-02
19
- ==================
39
+ ## 1.3.3
20
40
 
21
- * Rewording to clarify "Pusher Channels" or simply "Channels" product name.
41
+ * [CHANGED] Rewording to clarify "Pusher Channels" or simply "Channels" product name.
22
42
 
23
- 1.3.2 / 2018-10-17
24
- ==================
43
+ ## 1.3.2
25
44
 
26
- * Return a specific error for "Request Entity Too Large" (body over 10KB).
27
- * Add a `use_tls` option for SSL (defaults to false).
28
- * Add a `from_url` client method (in addition to existing `from_env` option).
29
- * Improved documentation and fixed typos.
30
- * Add Ruby 2.4 to test matrix.
45
+ * [FIXED] Return a specific error for "Request Entity Too Large" (body over 10KB).
46
+ * [ADDED] Add a `use_tls` option for SSL (defaults to false).
47
+ * [ADDED] Add a `from_url` client method (in addition to existing `from_env` option).
48
+ * [CHANGED] Improved documentation and fixed typos.
49
+ * [ADDED] Add Ruby 2.4 to test matrix.
31
50
 
32
- 1.3.1 / 2017-03-15
33
- ==================
51
+ ## 1.3.1
34
52
 
35
- * Added missing client batch methods to default client delegations
36
- * Document raised exception in the `authenticate` method
37
- * Fixes em-http-request from using v2.5.0 of `addressable` breaking builds.
53
+ * [FIXED] Added missing client batch methods to default client delegations
54
+ * [CHANGED] Document raised exception in the `authenticate` method
55
+ * [FIXED] Fixes em-http-request from using v2.5.0 of `addressable` breaking builds.
38
56
 
39
- 1.3.0 / 2016-08-23
40
- ==================
57
+ ## 1.3.0
41
58
 
42
- * Add support for sending push notifications on up to 10 interests.
59
+ * [ADDED] Add support for sending push notifications on up to 10 interests.
43
60
 
44
- 1.2.1 / 2016-08-22
45
- ==================
61
+ ## 1.2.1
46
62
 
47
- * Fixes Rails 5 compatibility. Use duck-typing to detect request object
63
+ * [FIXED] Fixes Rails 5 compatibility. Use duck-typing to detect request object
48
64
 
49
- 1.2.0 / 2016-08-15
50
- ==================
65
+ ## 1.2.0
51
66
 
52
- * Minor release for Native notifications
67
+ * [CHANGED] Minor release for Native notifications
53
68
 
54
- 1.2.0.rc1 / 2016-07-18
55
- ==================
69
+ ## 1.2.0.rc1
56
70
 
57
- * Add support for Native notifications
71
+ * [ADDED] Add support for Native notifications
58
72
 
59
- 1.1.0 / 2016-05-20
60
- ==================
73
+ ## 1.1.0
61
74
 
62
- * Add support for batch events
75
+ * [ADDED] Add support for batch events
63
76
 
64
- 1.0.0 / 2016-05-19
65
- ==================
77
+ ## 1.0.0
66
78
 
67
- No breaking changes, this release is just to follow semver and show that we
79
+ * [CHANGED] No breaking changes, this release is just to follow semver and show that we
68
80
  are stable.
69
81
 
70
- 0.18.0 / 2016-05-15
71
- ==================
82
+ ## 0.18.0
72
83
 
73
- * Introduce `Pusher::Client.from_env`
74
- * Improve error handling on missing config
84
+ * [ADDED] Introduce `Pusher::Client.from_env`
85
+ * [FIXED] Improve error handling on missing config
75
86
 
76
- 0.17.0 / 2016-02-22
77
- ==================
87
+ ## 0.17.0
78
88
 
79
- * Introduce the `cluster` option.
89
+ * [ADDED] Introduce the `cluster` option.
80
90
 
81
- 0.16.0 / 2016-01-21
82
- ==================
91
+ ## 0.16.0
83
92
 
84
- * Bump httpclient version to 2.7
85
- * Ruby 1.8.7 is not supported anymore.
93
+ * [CHANGED] Bump httpclient version to 2.7
94
+ * [REMOVED] Ruby 1.8.7 is not supported anymore.
86
95
 
87
- 0.15.2 / 2015-12-03
88
- ==================
96
+ ## 0.15.2
89
97
 
90
- * Documented `Pusher.channel_info`, `Pusher.channels`
91
- * Added `Pusher.channel_users`
98
+ * [CHANGED] Documented `Pusher.channel_info`, `Pusher.channels`
99
+ * [ADDED] Added `Pusher.channel_users`
92
100
 
93
- 0.15.1 / 2015-11-03
94
- ==================
101
+ ## 0.15.1
95
102
 
96
- * Fixed a bug where the `authenticate` method added in 0.15.0 wasn't exposed on the Pusher class.
103
+ * [FIXED] Fixed a bug where the `authenticate` method added in 0.15.0 wasn't exposed on the Pusher class.
97
104
 
98
- 0.15.0 / 2015-11-02
99
- ==================
105
+ ## 0.15.0
100
106
 
101
- * Added `Pusher.authenticate` method for authenticating private and presence channels.
107
+ * [ADDED] Added `Pusher.authenticate` method for authenticating private and presence channels.
102
108
  This is prefered over the older `Pusher['a_channel'].authenticate(...)` style.
103
109
 
104
- 0.14.6 / 2015-09-29
105
- ==================
106
- * Updated to use the `pusher-signature` gem instead of `signature`.
107
- This resolves namespace related issues.
108
-
109
- 0.14.5 / 2015-05-11
110
- ==================
111
-
112
- * SECURITY: Prevent auth delegation trough crafted socket IDs
110
+ ## 0.14.6
113
111
 
114
- 0.14.4 / 2015-01-20
115
- ==================
112
+ * [CHANGED] Updated to use the `pusher-signature` gem instead of `signature`.
113
+ This resolves namespace related issues.
116
114
 
117
- * SECURITY: Prevent timing attack, update signature to v0.1.8
118
- * SECURITY: Prevent POODLE. Disable SSLv3, update httpclient to v2.5
119
- * Fix channel name character limit.
120
- * Adds support for listing users on a presence channel
115
+ ## 0.14.5
121
116
 
122
- 0.14.3 / 2015-01-20
123
- ==================
117
+ * [SECURITY] Prevent auth delegation trough crafted socket IDs
124
118
 
125
- Yanked, bad release
119
+ ## 0.14.4
126
120
 
127
- 0.14.2 / 2014-10-16
128
- ==================
121
+ * [SECURITY] Prevent timing attack, update signature to v0.1.8
122
+ * [SECURITY] Prevent POODLE. Disable SSLv3, update httpclient to v2.5
123
+ * [FIXED] Fix channel name character limit.
124
+ * [ADDED] Adds support for listing users on a presence channel
129
125
 
130
- First release with a changelog !
126
+ ## 0.14.2
131
127
 
132
- * Bump httpclient to v2.4. See #62 (POODLE SSL)
133
- * Fix limited channel count at README.md. Thanks @tricknotes
128
+ * [CHANGED] Bump httpclient to v2.4. See #62 (POODLE SSL)
129
+ * [CHANGED] Fix limited channel count at README.md. Thanks @tricknotes
data/README.md CHANGED
@@ -2,7 +2,11 @@
2
2
 
3
3
  This Gem provides a Ruby interface to [the Pusher HTTP API for Pusher Channels](https://pusher.com/docs/channels/library_auth_reference/rest-api).
4
4
 
5
- [![Build Status](https://secure.travis-ci.org/pusher/pusher-http-ruby.svg?branch=master)](http://travis-ci.org/pusher/pusher-http-ruby) [![Gem Version](https://badge.fury.io/rb/pusher.svg)](https://badge.fury.io/rb/pusher)
5
+ [![Build Status](https://github.com/pusher/pusher-http-ruby/workflows/Tests/badge.svg)](https://github.com/pusher/pusher-http-ruby/actions?query=workflow%3ATests+branch%3Amaster) [![Gem](https://img.shields.io/gem/v/pusher)](https://rubygems.org/gems/pusher) [![Gem](https://img.shields.io/gem/dt/pusher)](https://rubygems.org/gems/pusher)
6
+
7
+ ## Supported Platforms
8
+
9
+ * Ruby - supports **Ruby 2.6 or greater**.
6
10
 
7
11
  ## Installation and Configuration
8
12
 
@@ -36,7 +40,7 @@ pusher = Pusher::Client.new(
36
40
  )
37
41
  ```
38
42
 
39
- The `cluster` value will set the `host` to `api-<cluster>.pusher.com`. The `use_tls` value is optional and defaults to `false`. It will set the `scheme` and `port`. Custom `scheme` and `port` values take precendence over `use_tls`.
43
+ The `cluster` value will set the `host` to `api-<cluster>.pusher.com`. The `use_tls` value is optional and defaults to `true`. It will set the `scheme` and `port`. A custom `port` value takes precendence over `use_tls`.
40
44
 
41
45
  If you want to set a custom `host` value for your client then you can do so when instantiating a Pusher Channels client like so:
42
46
 
@@ -79,11 +83,11 @@ If you need to make requests via a HTTP proxy then it can be configured
79
83
  Pusher.http_proxy = 'http://(user):(password)@(host):(port)'
80
84
  ```
81
85
 
82
- By default API requests are made over HTTP. HTTPS can be used by setting `encrypted` to `true`.
86
+ By default API requests are made over HTTPS. HTTP can be used by setting `use_tls` to `false`.
83
87
  Issuing this command is going to reset `port` value if it was previously specified.
84
88
 
85
89
  ``` ruby
86
- Pusher.encrypted = true
90
+ Pusher.use_tls = false
87
91
  ```
88
92
 
89
93
  As of version 0.12, SSL certificates are verified when using the synchronous http client. If you need to disable this behaviour for any reason use:
@@ -295,6 +299,3 @@ pusher.trigger(
295
299
  ```
296
300
 
297
301
  Rationale: the methods in this library map directly to individual Channels HTTP API requests. If we allowed triggering a single event on multiple channels (some encrypted, some unencrypted), then it would require two API requests: one where the event is encrypted to the encrypted channels, and one where the event is unencrypted for unencrypted channels.
298
-
299
- ## Supported Ruby versions
300
- 2.4+
data/lib/pusher/client.rb CHANGED
@@ -1,15 +1,19 @@
1
1
  require 'base64'
2
-
3
2
  require 'pusher-signature'
4
3
 
5
4
  module Pusher
6
5
  class Client
7
- attr_accessor :scheme, :host, :port, :app_id, :key, :secret, :notification_host, :notification_scheme, :encryption_master_key
6
+ attr_accessor :scheme, :host, :port, :app_id, :key, :secret, :encryption_master_key
8
7
  attr_reader :http_proxy, :proxy
9
8
  attr_writer :connect_timeout, :send_timeout, :receive_timeout,
10
9
  :keep_alive_timeout
11
10
 
12
11
  ## CONFIGURATION ##
12
+ DEFAULT_CONNECT_TIMEOUT = 5
13
+ DEFAULT_SEND_TIMEOUT = 5
14
+ DEFAULT_RECEIVE_TIMEOUT = 5
15
+ DEFAULT_KEEP_ALIVE_TIMEOUT = 30
16
+ DEFAULT_CLUSTER = "mt1"
13
17
 
14
18
  # Loads the configuration from an url in the environment
15
19
  def self.from_env(key = 'PUSHER_URL')
@@ -25,51 +29,35 @@ module Pusher
25
29
  end
26
30
 
27
31
  def initialize(options = {})
28
- default_options = {
29
- :scheme => 'http',
30
- :port => 80,
31
- }
32
+ @scheme = "https"
33
+ @port = options[:port] || 443
32
34
 
33
- if options[:use_tls] || options[:encrypted]
34
- default_options[:scheme] = "https"
35
- default_options[:port] = 443
35
+ if options.key?(:encrypted)
36
+ warn "[DEPRECATION] `encrypted` is deprecated and will be removed in the next major version. Use `use_tls` instead."
36
37
  end
37
38
 
38
- merged_options = default_options.merge(options)
39
-
40
- if options.has_key?(:host)
41
- merged_options[:host] = options[:host]
42
- elsif options.has_key?(:cluster)
43
- merged_options[:host] = "api-#{options[:cluster]}.pusher.com"
44
- else
45
- merged_options[:host] = "api.pusherapp.com"
39
+ if options[:use_tls] == false || options[:encrypted] == false
40
+ @scheme = "http"
41
+ @port = options[:port] || 80
46
42
  end
47
43
 
48
- # TODO: Change host name when finalized
49
- merged_options[:notification_host] =
50
- options.fetch(:notification_host, "nativepush-cluster1.pusher.com")
44
+ @app_id = options[:app_id]
45
+ @key = options[:key]
46
+ @secret = options[:secret]
51
47
 
52
- merged_options[:notification_scheme] =
53
- options.fetch(:notification_scheme, "https")
48
+ @host = options[:host]
49
+ @host ||= "api-#{options[:cluster]}.pusher.com" unless options[:cluster].nil? || options[:cluster].empty?
50
+ @host ||= "api-#{DEFAULT_CLUSTER}.pusher.com"
54
51
 
55
- @scheme, @host, @port, @app_id, @key, @secret, @notification_host, @notification_scheme =
56
- merged_options.values_at(
57
- :scheme, :host, :port, :app_id, :key, :secret, :notification_host, :notification_scheme
58
- )
52
+ @encryption_master_key = Base64.strict_decode64(options[:encryption_master_key_base64]) if options[:encryption_master_key_base64]
59
53
 
60
- if options.has_key?(:encryption_master_key_base64)
61
- @encryption_master_key =
62
- Base64.decode64(options[:encryption_master_key_base64])
63
- end
64
-
65
- @http_proxy = nil
66
- self.http_proxy = options[:http_proxy] if options[:http_proxy]
54
+ @http_proxy = options[:http_proxy]
67
55
 
68
56
  # Default timeouts
69
- @connect_timeout = 5
70
- @send_timeout = 5
71
- @receive_timeout = 5
72
- @keep_alive_timeout = 30
57
+ @connect_timeout = DEFAULT_CONNECT_TIMEOUT
58
+ @send_timeout = DEFAULT_SEND_TIMEOUT
59
+ @receive_timeout = DEFAULT_RECEIVE_TIMEOUT
60
+ @keep_alive_timeout = DEFAULT_KEEP_ALIVE_TIMEOUT
73
61
  end
74
62
 
75
63
  # @private Returns the authentication token for the client
@@ -83,10 +71,10 @@ module Pusher
83
71
  def url(path = nil)
84
72
  raise ConfigurationError, :app_id unless @app_id
85
73
  URI::Generic.build({
86
- :scheme => @scheme,
87
- :host => @host,
88
- :port => @port,
89
- :path => "/apps/#{@app_id}#{path}"
74
+ scheme: @scheme,
75
+ host: @host,
76
+ port: @port,
77
+ path: "/apps/#{@app_id}#{path}"
90
78
  })
91
79
  end
92
80
 
@@ -110,13 +98,12 @@ module Pusher
110
98
  @http_proxy = http_proxy
111
99
  uri = URI.parse(http_proxy)
112
100
  @proxy = {
113
- :scheme => uri.scheme,
114
- :host => uri.host,
115
- :port => uri.port,
116
- :user => uri.user,
117
- :password => uri.password
101
+ scheme: uri.scheme,
102
+ host: uri.host,
103
+ port: uri.port,
104
+ user: uri.user,
105
+ password: uri.password
118
106
  }
119
- @http_proxy
120
107
  end
121
108
 
122
109
  # Configure whether Pusher API calls should be made over SSL
@@ -136,6 +123,8 @@ module Pusher
136
123
  end
137
124
 
138
125
  def cluster=(cluster)
126
+ cluster = DEFAULT_CLUSTER if cluster.nil? || cluster.empty?
127
+
139
128
  @host = "api-#{cluster}.pusher.com"
140
129
  end
141
130
 
@@ -148,7 +137,7 @@ module Pusher
148
137
  # Set an encryption_master_key to use with private-encrypted channels from
149
138
  # a base64 encoded string.
150
139
  def encryption_master_key_base64=(s)
151
- @encryption_master_key = s ? Base64.decode64(s) : nil
140
+ @encryption_master_key = s ? Base64.strict_decode64(s) : nil
152
141
  end
153
142
 
154
143
  ## INTERACT WITH THE API ##
@@ -330,24 +319,6 @@ module Pusher
330
319
  post_async('/batch_events', trigger_batch_params(events.flatten))
331
320
  end
332
321
 
333
- def notification_client
334
- @notification_client ||=
335
- NativeNotification::Client.new(@app_id, @notification_host, @notification_scheme, self)
336
- end
337
-
338
-
339
- # Send a push notification
340
- #
341
- # POST /apps/[app_id]/notifications
342
- #
343
- # @param interests [Array] An array of interests
344
- # @param message [String] Message to send
345
- # @param options [Hash] Additional platform specific options
346
- #
347
- # @return [Hash]
348
- def notify(interests, data = {})
349
- notification_client.notify(interests, data)
350
- end
351
322
 
352
323
  # Generate the expected response for an authentication endpoint.
353
324
  # See http://pusher.com/docs/authenticating_users for details.
@@ -386,9 +357,9 @@ module Pusher
386
357
 
387
358
  # @private Construct a net/http http client
388
359
  def sync_http_client
389
- @client ||= begin
390
- require 'httpclient'
360
+ require 'httpclient'
391
361
 
362
+ @client ||= begin
392
363
  HTTPClient.new(@http_proxy).tap do |c|
393
364
  c.connect_timeout = @connect_timeout
394
365
  c.send_timeout = @send_timeout
@@ -407,14 +378,14 @@ module Pusher
407
378
  require 'em-http' unless defined?(EventMachine::HttpRequest)
408
379
 
409
380
  connection_opts = {
410
- :connect_timeout => @connect_timeout,
411
- :inactivity_timeout => @receive_timeout,
381
+ connect_timeout: @connect_timeout,
382
+ inactivity_timeout: @receive_timeout,
412
383
  }
413
384
 
414
385
  if defined?(@proxy)
415
386
  proxy_opts = {
416
- :host => @proxy[:host],
417
- :port => @proxy[:port]
387
+ host: @proxy[:host],
388
+ port: @proxy[:port]
418
389
  }
419
390
  if @proxy[:user]
420
391
  proxy_opts[:authorization] = [@proxy[:user], @proxy[:password]]
@@ -483,8 +454,8 @@ module Pusher
483
454
  ciphertext = secret_box.encrypt(nonce, encoded_data)
484
455
 
485
456
  MultiJson.encode({
486
- "nonce" => Base64::encode64(nonce),
487
- "ciphertext" => Base64::encode64(ciphertext),
457
+ "nonce" => Base64::strict_encode64(nonce),
458
+ "ciphertext" => Base64::strict_encode64(ciphertext),
488
459
  })
489
460
  end
490
461