pubnub 5.2.2 → 5.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/.github/CODEOWNERS +2 -2
  3. data/.pubnub.yml +11 -4
  4. data/.tool-versions +1 -1
  5. data/CHANGELOG.md +9 -0
  6. data/Gemfile +1 -1
  7. data/Gemfile.lock +6 -6
  8. data/LICENSE +29 -0
  9. data/VERSION +1 -1
  10. data/features/step_definitions/access_steps.rb +0 -2
  11. data/features/step_definitions/crypto_steps.rb +99 -0
  12. data/features/support/cryptor.rb +58 -0
  13. data/features/support/hooks.rb +0 -1
  14. data/lib/pubnub/client.rb +30 -1
  15. data/lib/pubnub/error.rb +3 -0
  16. data/lib/pubnub/event.rb +13 -5
  17. data/lib/pubnub/events/add_message_action.rb +2 -2
  18. data/lib/pubnub/events/grant_token.rb +1 -1
  19. data/lib/pubnub/events/history.rb +18 -6
  20. data/lib/pubnub/events/publish.rb +7 -3
  21. data/lib/pubnub/events/remove_channel_members.rb +3 -3
  22. data/lib/pubnub/events/remove_channel_metadata.rb +1 -1
  23. data/lib/pubnub/events/remove_memberships.rb +3 -3
  24. data/lib/pubnub/events/remove_uuid_metadata.rb +1 -1
  25. data/lib/pubnub/events/set_channel_members.rb +3 -3
  26. data/lib/pubnub/events/set_channel_metadata.rb +2 -2
  27. data/lib/pubnub/events/set_memberships.rb +3 -3
  28. data/lib/pubnub/events/set_uuid_metadata.rb +2 -2
  29. data/lib/pubnub/events/signal.rb +1 -1
  30. data/lib/pubnub/events/subscribe.rb +5 -0
  31. data/lib/pubnub/formatter.rb +22 -11
  32. data/lib/pubnub/modules/crypto/crypto_module.rb +159 -0
  33. data/lib/pubnub/modules/crypto/crypto_provider.rb +31 -0
  34. data/lib/pubnub/modules/crypto/cryptor.rb +73 -0
  35. data/lib/pubnub/modules/crypto/cryptor_header.rb +251 -0
  36. data/lib/pubnub/modules/crypto/cryptors/aes_cbc_cryptor.rb +67 -0
  37. data/lib/pubnub/modules/crypto/cryptors/legacy_cryptor.rb +84 -0
  38. data/lib/pubnub/modules/crypto/module.rb +8 -0
  39. data/lib/pubnub/subscribe_event/formatter.rb +8 -8
  40. data/lib/pubnub/version.rb +1 -1
  41. data/pubnub.gemspec +2 -2
  42. metadata +16 -5
  43. data/LICENSE.txt +0 -30
  44. data/lib/pubnub/crypto.rb +0 -70
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f32d00b144dc8b386aaf9fcccc75c2d65a781068120e248b1d00d72ecd09b717
4
- data.tar.gz: 50543ea5dc212a93d4e468a33e2462e962a673e0241126a0ddf03cef277f2d61
3
+ metadata.gz: 462fba219738d96faf8a4984d3f53b310ff31fbeef92425ad0899684332defcb
4
+ data.tar.gz: 0bafd18ad8f8e25cae5adb1ed928c05deaf0169843b52f69d157a6aa025c3bba
5
5
  SHA512:
6
- metadata.gz: e74dff21f6979c2329a030205ed1aae0255ce5e1ef9392d0462fbca753ddee9348a55bccec40ab0049889ed171a297f96feedfb82c5e15b0e938a80c810cb9f7
7
- data.tar.gz: a70f58b2998364701e2d2db3ce91b5ed73b52e9c37b3e6e5edd00b8d5f6ea3ae93471bbd3ca5d14ceaf8d5d9a4475e216044ef1de47136c534e58827b55f877f
6
+ metadata.gz: 13555fb9e8a66671c1ecf1695c0574d5d3f358fb9f49231b4576129b9066e6bdbf525d3b544e7e41df16aa4636702fc09c0f938b10022282a6ae69e022f2b19a
7
+ data.tar.gz: 3ac98cfaa05a5394eec25e60cf83fffe6d441e7cb8bc964bd4c6ffaea29080ef05191c5a98bbee015a0f84a5ae0bc0001670feb3d6a5a26df776f62557a555b6
data/.github/CODEOWNERS CHANGED
@@ -1,3 +1,3 @@
1
- * @parfeon @CraigLn @kleewho @seba-aln
2
- .github/* @parfeon @CraigLn @kleewho @seba-aln
1
+ * @parfeon @MikeDobrzan @kleewho @seba-aln
2
+ .github/* @parfeon @MikeDobrzan @kleewho @seba-aln
3
3
  README.md @techwritermat @kazydek
data/.pubnub.yml CHANGED
@@ -1,6 +1,13 @@
1
1
  ---
2
- version: "5.2.2"
2
+ version: "5.3.0"
3
3
  changelog:
4
+ - date: 2023-10-16
5
+ version: v5.3.0
6
+ changes:
7
+ - type: feature
8
+ text: "Add crypto module that allows to configure SDK to encrypt and decrypt messages."
9
+ - type: bug
10
+ text: "Improved security of crypto implementation by adding enhanced AES-CBC cryptor."
4
11
  - date: 2023-03-14
5
12
  version: v5.2.2
6
13
  changes:
@@ -663,7 +670,7 @@ sdks:
663
670
  - x86-64
664
671
  - distribution-type: package
665
672
  distribution-repository: RubyGems
666
- package-name: pubnub-5.2.2.gem
673
+ package-name: pubnub-5.3.0.gem
667
674
  location: https://rubygems.org/gems/pubnub
668
675
  requires:
669
676
  - name: addressable
@@ -768,8 +775,8 @@ sdks:
768
775
  - x86-64
769
776
  - distribution-type: library
770
777
  distribution-repository: GitHub release
771
- package-name: pubnub-5.2.2.gem
772
- location: https://github.com/pubnub/ruby/releases/download/v5.2.2/pubnub-5.2.2.gem
778
+ package-name: pubnub-5.3.0.gem
779
+ location: https://github.com/pubnub/ruby/releases/download/v5.3.0/pubnub-5.3.0.gem
773
780
  requires:
774
781
  - name: addressable
775
782
  min-version: 2.0.0
data/.tool-versions CHANGED
@@ -1 +1 @@
1
- ruby jruby-9.3.8.0
1
+ ruby 3.2.2
data/CHANGELOG.md CHANGED
@@ -1,3 +1,12 @@
1
+ ## v5.3.0
2
+ October 16 2023
3
+
4
+ #### Added
5
+ - Add crypto module that allows to configure SDK to encrypt and decrypt messages.
6
+
7
+ #### Fixed
8
+ - Improved security of crypto implementation by adding enhanced AES-CBC cryptor.
9
+
1
10
  ## v5.2.2
2
11
  March 14 2023
3
12
 
data/Gemfile CHANGED
@@ -17,7 +17,7 @@ end
17
17
 
18
18
  group :development, :test do
19
19
  gem 'awesome_print'
20
- gem 'pry'
20
+ gem 'pry', '>= 0.14.2'
21
21
  gem 'pry-rescue'
22
22
  gem 'pry-stack_explorer'
23
23
  end
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- pubnub (5.2.2)
4
+ pubnub (5.3.0)
5
5
  addressable (>= 2.0.0)
6
6
  concurrent-ruby (~> 1.1.5)
7
7
  concurrent-ruby-edge (~> 0.5.0)
@@ -100,8 +100,8 @@ GEM
100
100
  dry-equalizer (~> 0.2)
101
101
  dry-initializer (~> 3.0)
102
102
  dry-schema (~> 1.5)
103
- ffi (1.13.1)
104
- ffi (1.13.1-java)
103
+ ffi (1.16.2)
104
+ ffi (1.16.2-java)
105
105
  hashdiff (1.0.1)
106
106
  httpclient (2.8.3)
107
107
  interception (0.5)
@@ -115,10 +115,10 @@ GEM
115
115
  parallel (1.19.2)
116
116
  parser (2.7.1.4)
117
117
  ast (~> 2.4.1)
118
- pry (0.13.1)
118
+ pry (0.14.2)
119
119
  coderay (~> 1.1)
120
120
  method_source (~> 1.0)
121
- pry (0.13.1-java)
121
+ pry (0.14.2-java)
122
122
  coderay (~> 1.1)
123
123
  method_source (~> 1.0)
124
124
  spoon (~> 0.0)
@@ -187,7 +187,7 @@ DEPENDENCIES
187
187
  awesome_print
188
188
  codacy-coverage
189
189
  cucumber
190
- pry
190
+ pry (>= 0.14.2)
191
191
  pry-rescue
192
192
  pry-stack_explorer
193
193
  pubnub!
data/LICENSE ADDED
@@ -0,0 +1,29 @@
1
+ PubNub Software Development Kit License Agreement
2
+ Copyright © 2023 PubNub Inc. All rights reserved.
3
+
4
+ Subject to the terms and conditions of the license, you are hereby granted
5
+ a non-exclusive, worldwide, royalty-free license to (a) copy and modify
6
+ the software in source code or binary form for use with the software services
7
+ and interfaces provided by PubNub, and (b) redistribute unmodified copies
8
+ of the software to third parties. The software may not be incorporated in
9
+ or used to provide any product or service competitive with the products
10
+ and services of PubNub.
11
+
12
+ The above copyright notice and this license shall be included
13
+ in or with all copies or substantial portions of the software.
14
+
15
+ This license does not grant you permission to use the trade names, trademarks,
16
+ service marks, or product names of PubNub, except as required for reasonable
17
+ and customary use in describing the origin of the software and reproducing
18
+ the content of this license.
19
+
20
+ THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF
21
+ ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO
23
+ EVENT SHALL PUBNUB OR THE AUTHORS OR COPYRIGHT HOLDERS OF THE SOFTWARE BE
24
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
25
+ CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
26
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27
+
28
+ https://www.pubnub.com/
29
+ https://www.pubnub.com/terms
data/VERSION CHANGED
@@ -1 +1 @@
1
- 5.2.2
1
+ 5.3.0
@@ -254,5 +254,3 @@ end
254
254
  Then('the error detail message is not empty') do
255
255
  expect(parse_error_body(@global_state[:last_call_res])["error"]["message"].empty?).to eq false
256
256
  end
257
-
258
-
@@ -0,0 +1,99 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ require 'pubnub'
4
+
5
+ Given(/^Crypto module with '([^']*)' cryptor$/) do |cryptor_id|
6
+ @cryptor_ids = [cryptor_id]
7
+ end
8
+
9
+ Given(/^Crypto module with default '([^']*)' and additional '([^']*)' cryptors$/) do |cryptor_id1, cryptor_id2|
10
+ @cryptor_ids = [cryptor_id1, cryptor_id2]
11
+ end
12
+
13
+ Given(/^Legacy code with '([^']*)' cipher key and '(random|constant|-)' vector$/) do |cipher_key, use_random_iv|
14
+ use_random_iv = use_random_iv != 'constant'
15
+ @legacy_cryptor = Cryptor.new cipher_key, use_random_iv
16
+ end
17
+
18
+ Then(/^with '([^']*)' cipher key$/) do |cipher_key|
19
+ @cipher_key = cipher_key
20
+ end
21
+
22
+ Then(/^with '(random|constant|-)' vector$/) do |use_random_iv|
23
+ @use_random_iv = use_random_iv != 'constant'
24
+ end
25
+
26
+ When(/^I encrypt '([^']*)' file as '([^']*)'$/) do |file_name, _|
27
+ @source_file_name = file_name
28
+ @source_file_content = File.binread "sdk-specifications/features/encryption/assets/#{file_name}"
29
+ @encrypted_content = crypto_module.encrypt @source_file_content
30
+ if file_name.include? 'empty'
31
+ @encrypt_status = 'encryption error' if @encrypted_content.nil? && @encrypt_status.nil?
32
+ @encrypt_status = 'success' if !@encrypted_content.nil? && @encrypt_status.nil?
33
+ else
34
+ expect(@encrypted_content).not_to eq nil
35
+ end
36
+ end
37
+
38
+ When(/^I decrypt '([^']*)' file$/) do |file_name|
39
+ file_content = File.binread "sdk-specifications/features/encryption/assets/#{file_name}"
40
+
41
+ begin
42
+ @decrypted_content = crypto_module.decrypt file_content
43
+ rescue Pubnub::UnknownCryptorError
44
+ @decrypt_status = 'unknown cryptor error'
45
+ end
46
+ @decrypt_status = 'decryption error' if @decrypted_content.nil? && @decrypt_status.nil?
47
+ @decrypt_status = 'success' if !@decrypted_content.nil? && @decrypt_status.nil?
48
+ end
49
+
50
+ When(/^I decrypt '([^']*)' file as '([^']*)'$/) do |file_name, _|
51
+ file_content = File.binread "sdk-specifications/features/encryption/assets/#{file_name}"
52
+
53
+ begin
54
+ @decrypted_content = crypto_module.decrypt file_content
55
+ rescue Pubnub::UnknownCryptorError
56
+ @decrypt_status = 'unknown cryptor error'
57
+ end
58
+ @decrypt_status = 'decryption error' if @decrypted_content.nil? && @decrypt_status.nil?
59
+ @decrypt_status = 'success' if !@decrypted_content.nil? && @decrypt_status.nil?
60
+ end
61
+
62
+ Then(/^Decrypted file content equal to the '([^']*)' file content$/) do |file_name|
63
+ file_content = File.binread "sdk-specifications/features/encryption/assets/#{file_name}"
64
+ expect(@decrypted_content).not_to eq nil
65
+ expect(@decrypted_content).to eq file_content
66
+ end
67
+
68
+ Then('Successfully decrypt an encrypted file with legacy code') do
69
+ expect(@legacy_cryptor).not_to eq nil
70
+ base64_encoded = Base64.strict_encode64(@encrypted_content)
71
+ decrypted_content = @legacy_cryptor.decrypt(base64_encoded)
72
+ expect(decrypted_content).not_to eq nil
73
+ expect(decrypted_content).to eq @source_file_content
74
+ end
75
+
76
+ Then(/^I receive '([^']*)'$/) do |outcome|
77
+ expect(@encrypt_status || @decrypt_status).not_to eq nil
78
+ expect(@encrypt_status || @decrypt_status).to eq outcome
79
+ end
80
+
81
+ # Crypto module
82
+ #
83
+ # @return [Pubnub::Crypto::CryptoModule] Crypto module instance.
84
+ def crypto_module
85
+ cryptors = []
86
+ @cryptor_ids.each do |cryptor_id|
87
+ cryptor = if cryptor_id == 'acrh'
88
+ Pubnub::Crypto::AesCbcCryptor.new @cipher_key
89
+ elsif cryptor_id == 'legacy'
90
+ Pubnub::Crypto::LegacyCryptor.new @cipher_key, @use_random_iv
91
+ end
92
+ cryptors.push(cryptor) unless cryptor.nil?
93
+ end
94
+
95
+ raise ArgumentError, "No crypto identifiers specified: #{@cryptor_ids}" if cryptors.empty?
96
+
97
+ default_cryptor = cryptors.shift
98
+ Pubnub::Crypto::CryptoModule.new default_cryptor, cryptors unless default_cryptor.nil?
99
+ end
@@ -0,0 +1,58 @@
1
+ # Internal Crypto class used for message encryption and decryption
2
+ class Cryptor
3
+ def initialize(cipher_key, use_random_iv)
4
+ @alg = 'AES-256-CBC'
5
+ sha256_key = Digest::SHA256.hexdigest(cipher_key.to_s)
6
+ @key = sha256_key.slice(0, 32)
7
+ @using_random_iv = use_random_iv
8
+ @iv = @using_random_iv == true ? random_iv : '0123456789012345'
9
+ end
10
+
11
+ def encrypt(message)
12
+ aes = OpenSSL::Cipher.new(@alg)
13
+ aes.encrypt
14
+ aes.key = @key
15
+ aes.iv = @iv
16
+
17
+ json_message = message.to_json
18
+ cipher = @using_random_iv == true ? @iv : ''
19
+ cipher << aes.update(json_message)
20
+ cipher << aes.final
21
+
22
+ Base64.strict_encode64(cipher)
23
+ end
24
+
25
+ def decrypt(cipher_text)
26
+ undecoded_text = Base64.decode64(cipher_text)
27
+ iv = @iv
28
+
29
+ if cipher_text.length > 16 && @using_random_iv == true
30
+ iv = undecoded_text.slice!(0..15)
31
+ end
32
+
33
+ decode_cipher = OpenSSL::Cipher.new(@alg).decrypt
34
+ decode_cipher.key = @key
35
+ decode_cipher.iv = iv
36
+
37
+ plain_text = decryption(undecoded_text, decode_cipher)
38
+
39
+ plain_text
40
+ end
41
+
42
+ private
43
+
44
+ def decryption(cipher_text, decode_cipher)
45
+ plain_text = decode_cipher.update(cipher_text)
46
+ plain_text << decode_cipher.final
47
+ rescue StandardError => e
48
+ puts "Pubnub :: DECRYPTION ERROR: #{e}"
49
+ '"DECRYPTION ERROR"'
50
+ end
51
+
52
+ private
53
+
54
+ def random_iv
55
+ random_bytes = Random.new.bytes(16).unpack('NnnnnN')
56
+ format('%08x%04x%04x', *random_bytes)
57
+ end
58
+ end
@@ -8,7 +8,6 @@ Before do |scenario|
8
8
  @pn_configuration = {}
9
9
 
10
10
  when_mock_server_used {
11
- puts "Using mock"
12
11
  expect(ENV['SERVER_HOST']).not_to be_nil
13
12
  expect(ENV['SERVER_PORT']).not_to be_nil
14
13
  @pn_configuration = {
data/lib/pubnub/client.rb CHANGED
@@ -1,13 +1,16 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'base64'
2
4
 
3
5
  require 'pubnub/error'
4
6
  require 'pubnub/uuid'
5
7
  require 'pubnub/formatter'
6
- require 'pubnub/crypto'
7
8
  require 'pubnub/constants'
8
9
  require 'pubnub/configuration'
9
10
  require 'pubnub/subscribe_callback'
10
11
 
12
+ require 'pubnub/modules/crypto/module'
13
+
11
14
  require 'pubnub/schemas/envelope_schema'
12
15
 
13
16
  require 'pubnub/event'
@@ -183,6 +186,7 @@ module Pubnub
183
186
  clean_env
184
187
  prepare_env
185
188
  validate! @env
189
+ setup_crypto_module
186
190
  @telemetry = Telemetry.new
187
191
  Pubnub.logger.debug('Pubnub::Client') do
188
192
  "Created new Pubnub::Client instance. Version: #{Pubnub::VERSION}"
@@ -339,6 +343,14 @@ module Pubnub
339
343
  @env[:token] = token
340
344
  end
341
345
 
346
+ # Data processing crypto module.
347
+ #
348
+ # @return [Pubnub::Crypto::CryptoProvider, nil] Crypto module for data encryption and
349
+ # decryption.
350
+ def crypto_module
351
+ @env[:crypto_module]
352
+ end
353
+
342
354
  private
343
355
 
344
356
  def create_state_pools(event)
@@ -386,9 +398,26 @@ module Pubnub
386
398
  Concurrent.global_logger = Pubnub.logger
387
399
  @subscriber = Subscriber.new(self)
388
400
  options[:user_id] = options[:uuid] if options[:user_id].nil?
401
+
402
+ if options[:cipher_key] && options[:crypto_module]
403
+ puts 'It is expected that only cipherKey or cryptoModule will be configured ' \
404
+ 'at once. PubNub client will use the configured cryptoModule.'
405
+ end
406
+
389
407
  @env = options
390
408
  end
391
409
 
410
+ # Complete crypto module configuration
411
+ # Create crypto module if it is required by user (specified
412
+ # <i>cipher_key</i> and not <i>crypto_module</i>).
413
+ def setup_crypto_module
414
+ random_iv = @env[:random_iv]
415
+ key = @env[:cipher_key]
416
+
417
+ # Create crypto module if it is not specified
418
+ @env[:crypto_module] = Crypto::CryptoModule.new_legacy(key, random_iv) if key && @env[:crypto_module].nil?
419
+ end
420
+
392
421
  def prepare_env
393
422
  assign_defaults
394
423
  setup_pools
data/lib/pubnub/error.rb CHANGED
@@ -51,4 +51,7 @@ module Pubnub
51
51
 
52
52
  class ResponseError < Error
53
53
  end
54
+
55
+ class UnknownCryptorError < Error
56
+ end
54
57
  end
data/lib/pubnub/event.rb CHANGED
@@ -113,12 +113,12 @@ module Pubnub
113
113
  def operation_http_method
114
114
  case @event
115
115
  when Pubnub::Constants::OPERATION_DELETE, Pubnub::Constants::OPERATION_REMOVE_MESSAGE_ACTION,
116
- Pubnub::Constants::OPERATION_REMOVE_CHANNEL_METADATA, Pubnub::Constants::OPERATION_REMOVE_UUID_METADATA,
117
- Pubnub::Constants::OPERATION_REVOKE_TOKEN
116
+ Pubnub::Constants::OPERATION_REMOVE_CHANNEL_METADATA, Pubnub::Constants::OPERATION_REMOVE_UUID_METADATA,
117
+ Pubnub::Constants::OPERATION_REVOKE_TOKEN
118
118
  'delete'
119
119
  when Pubnub::Constants::OPERATION_SET_UUID_METADATA, Pubnub::Constants::OPERATION_SET_CHANNEL_METADATA,
120
- Pubnub::Constants::OPERATION_SET_CHANNEL_MEMBERS, Pubnub::Constants::OPERATION_SET_MEMBERSHIPS,
121
- Pubnub::Constants::OPERATION_REMOVE_CHANNEL_MEMBERS, Pubnub::Constants::OPERATION_REMOVE_MEMBERSHIPS
120
+ Pubnub::Constants::OPERATION_SET_CHANNEL_MEMBERS, Pubnub::Constants::OPERATION_SET_MEMBERSHIPS,
121
+ Pubnub::Constants::OPERATION_REMOVE_CHANNEL_MEMBERS, Pubnub::Constants::OPERATION_REMOVE_MEMBERSHIPS
122
122
  'patch'
123
123
  when Pubnub::Constants::OPERATION_ADD_MESSAGE_ACTION
124
124
  'post'
@@ -170,7 +170,7 @@ module Pubnub
170
170
 
171
171
  def create_variables_from_options(options)
172
172
  variables = %w[channel channels message http_sync callback
173
- ssl cipher_key random_iv secret_key auth_key
173
+ ssl cipher_key random_iv crypto_module secret_key auth_key
174
174
  publish_key subscribe_key timetoken action_timetoken message_timetoken
175
175
  open_timeout read_timeout idle_timeout heartbeat
176
176
  group action read write delete manage ttl presence start
@@ -217,6 +217,14 @@ module Pubnub
217
217
  ck.call(data)
218
218
  end
219
219
 
220
+ # Data processing crypto module.
221
+ #
222
+ # @return [Pubnub::Crypto::CryptoProvider, nil] Crypto module for data encryption and
223
+ # decryption.
224
+ def crypto_module
225
+ @crypto_module
226
+ end
227
+
220
228
  def error_message(parsed_response)
221
229
  parsed_response['message']
222
230
  rescue StandardError
@@ -13,8 +13,8 @@ module Pubnub
13
13
 
14
14
  def fire
15
15
  Pubnub.logger.debug('Pubnub::Add Message Action') { "Fired event #{self.class}" }
16
- type_payload = { type: @type, value: @value}
17
- body = Formatter.format_message(type_payload, '', false, false)
16
+ type_payload = { type: @type, value: @value }
17
+ body = Formatter.format_message(type_payload, nil, false)
18
18
 
19
19
  response = send_request(body, { "Content-Type": 'application/json' })
20
20
 
@@ -34,7 +34,7 @@ module Pubnub
34
34
  patterns: prepare_permissions(:pattern, @channels, @channel_groups, @uuids, @spaces_permissions, @users_permissions)
35
35
  }.select { |_, v| v }
36
36
  }
37
- body = Formatter.format_message(raw_body, "", false, false)
37
+ body = Formatter.format_message(raw_body, nil, false)
38
38
  response = send_request(body, { "Content-Type": "application/json" })
39
39
 
40
40
  envelopes = fire_callbacks(handle(response, uri))
@@ -8,6 +8,11 @@ module Pubnub
8
8
  def initialize(options, app)
9
9
  @event = :history
10
10
  @telemetry_name = :l_hist
11
+
12
+ # Override crypto module if custom cipher key has been used.
13
+ random_iv = options.key?(:random_iv) ? options[:random_iv] : true
14
+ options[:crypto_module] = Crypto::CryptoModule.new_legacy(options[:cipher_key], random_iv) if options[:cipher_key]
15
+
11
16
  super
12
17
  end
13
18
 
@@ -63,23 +68,30 @@ module Pubnub
63
68
 
64
69
  def decrypt_history(message, crypto)
65
70
  if @include_token || @include_meta
66
- message['message'] = JSON.parse(crypto.decrypt(message['message']), quirks_mode: true)
71
+ encrypted_message = Base64.decode64(message['message'])
72
+ message['message'] = JSON.parse(crypto.decrypt(encrypted_message), quirks_mode: true)
67
73
 
68
74
  message
69
75
  else
70
- JSON.parse(crypto.decrypt(message), quirks_mode: true)
76
+ encrypted_message = Base64.decode64(message)
77
+ JSON.parse(crypto.decrypt(encrypted_message), quirks_mode: true)
71
78
  end
72
79
  end
73
80
 
74
81
  def valid_envelope(parsed_response, req_res_objects)
75
82
  messages = parsed_response[0]
76
83
 
77
- if (@cipher_key || @app.env[:cipher_key] || @cipher_key_selector || @app.env[:cipher_key_selector]) && messages
78
- cipher_key = compute_cipher_key(parsed_response)
79
- random_iv = compute_random_iv(parsed_response)
80
- crypto = Crypto.new(cipher_key, random_iv)
84
+ # TODO: Uncomment code below when cryptor implementations will be added.
85
+ if crypto_module && messages
86
+ crypto = crypto_module
81
87
  messages = messages.map { |message| decrypt_history(message, crypto) }
82
88
  end
89
+ # if (@cipher_key || @app.env[:cipher_key] || @cipher_key_selector || @app.env[:cipher_key_selector]) && messages
90
+ # cipher_key = compute_cipher_key(parsed_response)
91
+ # random_iv = compute_random_iv(parsed_response)
92
+ # crypto = Crypto.new(cipher_key, random_iv)
93
+ # messages = messages.map { |message| decrypt_history(message, crypto) }
94
+ # end
83
95
 
84
96
  start = parsed_response[1]
85
97
  finish = parsed_response[2]
@@ -10,6 +10,11 @@ module Pubnub
10
10
  def initialize(options, app)
11
11
  @event = :publish
12
12
  @telemetry_name = :l_pub
13
+
14
+ # Override crypto module if custom cipher key has been used.
15
+ random_iv = options.key?(:random_iv) ? options[:random_iv] : true
16
+ options[:crypto_module] = Crypto::CryptoModule.new_legacy(options[:cipher_key], random_iv) if options[:cipher_key]
17
+
13
18
  super
14
19
  @sequence_number = sequence_number!
15
20
  @origination_time_token = @app.generate_ortt
@@ -25,9 +30,8 @@ module Pubnub
25
30
 
26
31
  def fire
27
32
  Pubnub.logger.debug('Pubnub::Publish') { "Fired event #{self.class}" }
28
-
29
33
  if @compressed
30
- compressed_body = Formatter.format_message(@message, @cipher_key, @random_iv, false)
34
+ compressed_body = Formatter.format_message(@message, @crypto_module, false)
31
35
  response = send_request(compressed_body)
32
36
  else
33
37
  response = send_request
@@ -72,7 +76,7 @@ module Pubnub
72
76
  '0',
73
77
  Formatter.format_channel(@channel, true),
74
78
  '0',
75
- Formatter.format_message(@message, @cipher_key, @random_iv)
79
+ Formatter.format_message(@message, @crypto_module)
76
80
  ]
77
81
 
78
82
  rpath.pop if @compressed
@@ -42,7 +42,7 @@ module Pubnub
42
42
  { uuid: { id: member } }
43
43
  end
44
44
 
45
- body = Formatter.format_message({ delete: members }, "", @random_iv, false)
45
+ body = Formatter.format_message({ delete: members }, nil, false)
46
46
  response = send_request(body)
47
47
 
48
48
  envelopes = fire_callbacks(handle(response, uri))
@@ -83,11 +83,11 @@ module Pubnub
83
83
  def valid_envelope(parsed_response, req_res_objects)
84
84
  members = parsed_response['data'].map { |channel_member|
85
85
  member = Hash.new
86
- channel_member.each{ |k,v| member[k.to_sym] = v }
86
+ channel_member.each { |k, v| member[k.to_sym] = v }
87
87
 
88
88
  unless member[:uuid].nil?
89
89
  uuid_metadata = Hash.new
90
- member[:uuid].each{ |k,v| uuid_metadata[k.to_sym] = v }
90
+ member[:uuid].each { |k, v| uuid_metadata[k.to_sym] = v }
91
91
  uuid_metadata[:updated] = Date._parse(uuid_metadata[:updated]) unless uuid_metadata[:updated].nil?
92
92
  member[:uuid] = uuid_metadata
93
93
  end
@@ -17,7 +17,7 @@ module Pubnub
17
17
  def fire
18
18
  Pubnub.logger.debug('Pubnub::RemoveChannelMetadata') { "Fired event #{self.class}" }
19
19
 
20
- body = Formatter.format_message(@data, "", @random_iv, false)
20
+ body = Formatter.format_message(@data, nil, false)
21
21
  response = send_request(body)
22
22
 
23
23
  envelopes = fire_callbacks(handle(response, uri))
@@ -42,7 +42,7 @@ module Pubnub
42
42
  { channel: { id: membership } }
43
43
  end
44
44
 
45
- body = Formatter.format_message({ delete: memberships }, "", @random_iv, false)
45
+ body = Formatter.format_message({ delete: memberships }, nil, false)
46
46
  response = send_request(body)
47
47
 
48
48
  envelopes = fire_callbacks(handle(response, uri))
@@ -83,11 +83,11 @@ module Pubnub
83
83
  def valid_envelope(parsed_response, req_res_objects)
84
84
  memberships = parsed_response['data'].map { |uuid_membership|
85
85
  membership = Hash.new
86
- uuid_membership.each{ |k,v| membership[k.to_sym] = v }
86
+ uuid_membership.each { |k, v| membership[k.to_sym] = v }
87
87
 
88
88
  unless membership[:channel].nil?
89
89
  channel_metadata = Hash.new
90
- membership[:channel].each{ |k,v| channel_metadata[k.to_sym] = v }
90
+ membership[:channel].each { |k, v| channel_metadata[k.to_sym] = v }
91
91
  channel_metadata[:updated] = Date._parse(channel_metadata[:updated]) unless channel_metadata[:updated].nil?
92
92
  membership[:channel] = channel_metadata
93
93
  end
@@ -17,7 +17,7 @@ module Pubnub
17
17
  def fire
18
18
  Pubnub.logger.debug('Pubnub::RemoveUuidMetadata') { "Fired event #{self.class}" }
19
19
 
20
- body = Formatter.format_message(@data, "", @random_iv, false)
20
+ body = Formatter.format_message(@data, nil, false)
21
21
  response = send_request(body)
22
22
 
23
23
  envelopes = fire_callbacks(handle(response, uri))
@@ -45,7 +45,7 @@ module Pubnub
45
45
  member_object
46
46
  end
47
47
 
48
- body = Formatter.format_message({ set: members }, "", @random_iv, false)
48
+ body = Formatter.format_message({ set: members }, nil, false)
49
49
  response = send_request(body)
50
50
 
51
51
  envelopes = fire_callbacks(handle(response, uri))
@@ -86,11 +86,11 @@ module Pubnub
86
86
  def valid_envelope(parsed_response, req_res_objects)
87
87
  members = parsed_response['data'].map { |channel_member|
88
88
  member = Hash.new
89
- channel_member.each{ |k,v| member[k.to_sym] = v }
89
+ channel_member.each { |k, v| member[k.to_sym] = v }
90
90
 
91
91
  unless member[:uuid].nil?
92
92
  uuid_metadata = Hash.new
93
- member[:uuid].each{ |k,v| uuid_metadata[k.to_sym] = v }
93
+ member[:uuid].each { |k, v| uuid_metadata[k.to_sym] = v }
94
94
  uuid_metadata[:updated] = Date._parse(uuid_metadata[:updated]) unless uuid_metadata[:updated].nil?
95
95
  member[:uuid] = uuid_metadata
96
96
  end
@@ -27,7 +27,7 @@ module Pubnub
27
27
  def fire
28
28
  Pubnub.logger.debug('Pubnub::SetChannelMetadata') { "Fired event #{self.class}" }
29
29
 
30
- body = Formatter.format_message(@metadata, "", @random_iv, false)
30
+ body = Formatter.format_message(@metadata, nil, false)
31
31
  response = send_request(body)
32
32
 
33
33
  envelopes = fire_callbacks(handle(response, uri))
@@ -60,7 +60,7 @@ module Pubnub
60
60
  def valid_envelope(parsed_response, req_res_objects)
61
61
  data = parsed_response['data']
62
62
  metadata = Hash.new
63
- data.each{ |k,v| metadata[k.to_sym] = v }
63
+ data.each { |k, v| metadata[k.to_sym] = v }
64
64
  metadata[:updated] = Date._parse(metadata[:updated]) unless metadata[:updated].nil?
65
65
 
66
66
  Pubnub::Envelope.new(