zuora_connect 3.1.0 → 3.1.1.pre.c

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
  SHA256:
3
- metadata.gz: 689c9d74cda46ebd41a5d98dba982700dd365fa3746378276ceb0da4f5d0c493
4
- data.tar.gz: 719e7beb03b156986160f8fa881960a7b7231b706c9a6bcd50af1788d622a125
3
+ metadata.gz: ef73a28bd87609cedef16023f75320765d7b38b3e3417be5b5000be410596127
4
+ data.tar.gz: 62440f4e6e5ae219f40d9dc5b927b896cd26214cb9693191629929594c9f349a
5
5
  SHA512:
6
- metadata.gz: 4f905b5518a0b7e556d3cf4a45e73e86b149a4b95d111a315e46a2f91e9a07b43b2e9b77f0bd1c34e6fbf5848d321b64615ec612fc907b7f3fb9fd2f56944be3
7
- data.tar.gz: a61a9c662b80a4d8af8a98f6eeef2be56b79cc9bc0853ae36a57ce22a59dde8bae5a7ab1b175aedec703743b6ccae8e81f2e565b028a23cdda9b7dce7544eb1a
6
+ metadata.gz: fe0dc6bf317c0ff0e76d069db2abd158175527cd5b971065b6c84d79412971c4fbab8ad5141bd4525497d41e38ca2b99c0760f662791a920955770692e278ef5
7
+ data.tar.gz: f15d374ed1aaa037ca1764d71f468eac6019b6515ac0a41f20835e732adc0dc9651b893f8f5f18b2a494e2e54f083be7dda77b9a6863dbd53a1d39f13e7cb221
@@ -187,7 +187,7 @@ module ZuoraConnect
187
187
  raise ZuoraConnect::Exceptions::HoldingPattern if holding_pattern && !self.mark_for_refresh
188
188
  self.refresh(session: session)
189
189
 
190
- elsif session["#{self.id}::task_data"].blank?
190
+ elsif session["#{self.id}::task_data"].blank? && !ZuoraConnect.configuration.local_task_data
191
191
  self.new_session_message = "REFRESHING - Task Data Blank"
192
192
  ZuoraConnect.logger.debug(self.new_session_message)
193
193
  raise ZuoraConnect::Exceptions::HoldingPattern if holding_pattern && !self.mark_for_refresh
@@ -353,8 +353,10 @@ module ZuoraConnect
353
353
  end
354
354
 
355
355
  def fetch_connect_data(session: {})
356
+ refresh_count ||= 0
356
357
  self.check_oauth_state
357
- response = HTTParty.get(ZuoraConnect.configuration.url + "/api/#{self.api_version}/tools/tasks/#{self.id}.json",:body => {:access_token => self.access_token})
358
+ request_url = ZuoraConnect.configuration.url + "/api/#{self.api_version}/tools/tasks/#{self.id}.json"
359
+ response = HTTParty.get(request_url,:body => {:access_token => self.access_token})
358
360
 
359
361
  if response.code == 200
360
362
  begin
@@ -367,45 +369,43 @@ module ZuoraConnect
367
369
  self.set_backup_creds
368
370
  self.save(validate: false) if self.changed?
369
371
  else
370
- raise ZuoraConnect::Exceptions::ConnectCommunicationError.new("Error Communicating with Connect", response.body, response.code)
372
+ raise ZuoraConnect::Exceptions::ConnectCommunicationError.new("Error communicating with Connect for '#{request_url}' with #{response.code}", response.body, response.code)
373
+ end
374
+ rescue *(ZuoraAPI::Login::CONNECTION_EXCEPTIONS + ZuoraAPI::Login::CONNECTION_READ_EXCEPTIONS) => ex
375
+ refresh_count += 1
376
+ if refresh_count < 3
377
+ sleep(10)
378
+ ZuoraConnect.logger.debug("REFRESH TASK - Connection Failure Retrying(#{refresh_count})", ex, self.default_ougai_items)
379
+ retry
380
+ else
381
+ ZuoraConnect.logger.fatal("REFRESH TASK - Connection Failed", ex)
382
+ raise
383
+ end
384
+ rescue ZuoraConnect::Exceptions::ConnectCommunicationError => ex
385
+ refresh_count += 1
386
+ if refresh_count < 3
387
+ ZuoraConnect.logger.debug("REFRESH TASK - Communication Failure Retrying(#{refresh_count})", ex, self.default_ougai_items)
388
+ self.refresh_oauth if ex.code == 401
389
+ retry
390
+ else
391
+ ZuoraConnect.logger.fatal("REFRESH TASK - Communication Failed #{ex.code}", ex, self.default_ougai_items)
392
+ raise
371
393
  end
372
394
  end
373
395
 
374
-
375
396
  def refresh(session: {})
376
397
  refresh_count ||= 0
377
398
  skip_connect ||= ZuoraConnect.configuration.skip_connect
378
- begin
379
- #Check how app was deployed
380
- if !self.auto_deployed? && (!skip_connect || self['zuora_logins'].blank?)
381
- self.fetch_connect_data(session: session)
382
- else
383
- self.build_task(task_data: self.zuora_logins, session: session)
384
- end
385
- self.last_refresh = Time.now.to_i
386
- self.cache_app_instance
387
- self.reset_mark_for_refresh
388
- rescue *(ZuoraAPI::Login::CONNECTION_EXCEPTIONS + ZuoraAPI::Login::CONNECTION_READ_EXCEPTIONS) => ex
389
- refresh_count += 1
390
- if refresh_count < 3
391
- sleep(10)
392
- ZuoraConnect.logger.debug("REFRESH TASK - Connection Failure Retrying(#{refresh_count})", ex, self.default_ougai_items)
393
- retry
394
- else
395
- ZuoraConnect.logger.fatal("REFRESH TASK - Connection Failed", ex)
396
- raise
397
- end
398
- rescue ZuoraConnect::Exceptions::ConnectCommunicationError => ex
399
- refresh_count += 1
400
- if refresh_count < 3
401
- ZuoraConnect.logger.debug("REFRESH TASK - Communication Failure Retrying(#{refresh_count})", ex, self.default_ougai_items)
402
- self.refresh_oauth if ex.code == 401
403
- retry
404
- else
405
- ZuoraConnect.logger.fatal("REFRESH TASK - Communication Failed #{ex.code}", ex, self.default_ougai_items)
406
- raise
407
- end
399
+ #Check how app was deployed
400
+ if !self.auto_deployed? && (!skip_connect || self['zuora_logins'].blank?)
401
+ self.fetch_connect_data(session: session)
402
+ else
403
+ self.build_task(task_data: self.zuora_logins, session: session)
408
404
  end
405
+ self.last_refresh = Time.now.to_i
406
+ self.cache_app_instance
407
+ self.reset_mark_for_refresh
408
+
409
409
  rescue => ex
410
410
  refresh_count += 1
411
411
  if self['zuora_logins'].present? && refresh_count < 3
@@ -416,10 +416,6 @@ module ZuoraConnect
416
416
  raise
417
417
  end
418
418
 
419
- def aws_secrets
420
- (Rails.application.secrets.aws || {}).transform_keys { |key| key.to_s }
421
- end
422
-
423
419
  #### START KMS ENCRYPTION Methods ####
424
420
  def set_backup_creds
425
421
  if self.kms_key.present? && self.kms_key.match(/^arn:aws:.*/) && self.task_data.present?
@@ -435,14 +431,105 @@ module ZuoraConnect
435
431
 
436
432
  def zuora_logins
437
433
  raise ZuoraConnect::Exceptions::ConnectCommunicationError.new("Zuora Logins is blank, cannot decrypt.") if super.blank?
438
- return JSON.parse(kms_decrypt(super))
434
+ return JSON.parse(kms_decrypt(super, field_name: :zuora_logins))
435
+ end
436
+
437
+ def kms_client
438
+ @kms_client ||= Aws::KMS::Client.new({region: aws_secrets['AWS_REGION'], credentials: self.aws_auth_client}.delete_if { |k, v| v.blank? })
439
+ return @kms_client
440
+ end
441
+
442
+ def decrypted_data_key
443
+ $cleartextkey ||= kms_client.decrypt(ciphertext_blob: Base64.strict_decode64(encrypted_data_key)).plaintext
444
+ return $cleartextkey
445
+ end
446
+
447
+ def aws_secrets
448
+ (Rails.application.secrets.aws || {}).transform_keys { |key| key.to_s }
449
+ end
450
+
451
+ def connect_secrets
452
+ (Rails.application.secrets.connect || {}).transform_keys { |key| key.to_s }
453
+ end
454
+
455
+ def kms_key(raise_on_blank: false)
456
+ kms_value = ENV['AWS_KMS_ARN'] || aws_secrets['AWS_KMS_ARN']
457
+ raise ZuoraConnect::Exceptions::Error.new("Missing KMS key") if raise_on_blank && kms_value.blank?
458
+ return kms_value
439
459
  end
440
460
 
441
- def kms_decrypt(value)
461
+ def iv_key
462
+ iv_key_value = ENV['IV_KEY'] || connect_secrets['IV_KEY']
463
+ #Create new one 'Base64.strict_encode64(OpenSSL::Cipher.new('AES-256-CBC').random_iv)'
464
+ raise ZuoraConnect::Exceptions::Error.new("Missing IV cipher key") if iv_key_value.blank?
465
+ return iv_key_value
466
+ end
467
+
468
+ def encrypted_data_key
469
+ #Base64.strict_encode64(kms_client.generate_data_key(key_id: kms_key, key_spec: 'AES_256').ciphertext_blob)
470
+ encrypted_data_key_value = ENV['ENCRYPTED_DATA_KEY'] || connect_secrets['ENCRYPTED_DATA_KEY']
471
+ raise ZuoraConnect::Exceptions::Error.new("Missing encrypted data key 'ENCRYPTED_DATA_KEY'.") if encrypted_data_key_value.blank?
472
+ return encrypted_data_key_value
473
+ end
474
+
475
+ def aws_auth_client
476
+ if Rails.env.to_s == 'development'
477
+ return Aws::Credentials.new(aws_secrets['AWS_ACCESS_KEY_ID'], aws_secrets['AWS_SECRET_ACCESS_KEY'])
478
+ else
479
+ return nil
480
+ end
481
+ end
482
+
483
+ def fetch_cipher(type)
484
+ raise "Type must be set to 'encrypt' or 'decrypt'" if !['decrypt','encrypt'].include?(type)
485
+ cipher = OpenSSL::Cipher.new('AES-256-CBC')
486
+ cipher.send(type)
487
+ cipher.key = self.decrypted_data_key
488
+ cipher.iv = Base64.strict_decode64(self.iv_key)
489
+ return cipher
490
+ end
491
+
492
+ def kms_decrypt(value, field_name: nil, encryption_type: ZuoraConnect.configuration.encryption_type)
442
493
  kms_tries ||= 0
443
- kms_client = Aws::KMS::Client.new({region: aws_secrets['AWS_REGION'], credentials: self.aws_auth_client}.delete_if { |k, v| v.blank? })
444
- resp = kms_client.decrypt({ciphertext_blob: [value].pack("H*") })
445
- return resp.plaintext
494
+ original_encryption_type ||= encryption_type.dup
495
+
496
+ case encryption_type
497
+ when :direct
498
+ result = kms_client.decrypt(ciphertext_blob: [value].pack("H*") ).plaintext
499
+ #Update original encryption
500
+ if original_encryption_type != encryption_type && field_name.present?
501
+ ZuoraConnect.logger.debug("Updating encryption to '#{original_encryption_type}', from '#{encryption_type}' for field '#{field_name}'", self.default_ougai_items)
502
+ self.update_column(field_name, self.kms_encrypt(result, encryption_type: original_encryption_type))
503
+ end
504
+
505
+ return result
506
+ when :envelope
507
+ cipher = fetch_cipher('decrypt')
508
+ result = cipher.update(Base64.strict_decode64(value)) + cipher.final
509
+
510
+ #Update original encryption
511
+ if original_encryption_type != encryption_type && field_name.present?
512
+ ZuoraConnect.logger.debug("Updating encryption to '#{original_encryption_type}', from '#{encryption_type}' for field '#{field_name}'", self.default_ougai_items)
513
+ self.update_column(field_name, self.kms_encrypt(result, encryption_type: original_encryption_type))
514
+ end
515
+ return result
516
+ else
517
+ ZuoraConnect::Exceptions::Error.new("Invalid encryption method '#{encryption_type}'.")
518
+ end
519
+ rescue ArgumentError => ex
520
+ if ex.message == 'invalid base64' && encryption_type == :envelope && (kms_tries += 1) < 3
521
+ ZuoraConnect.logger.warn("Fallback to encryption 'direct', from '#{encryption_type}'", ex, self.default_ougai_items)
522
+ encryption_type = :direct
523
+ retry
524
+ end
525
+ raise#Add protection when decrypting
526
+ rescue Aws::KMS::Errors::InvalidCiphertextException => ex
527
+ if encryption_type == :direct && (kms_tries += 1) < 3
528
+ ZuoraConnect.logger.warn("Fallback to encryption 'envelope', from '#{encryption_type}'", ex, self.default_ougai_items)
529
+ encryption_type = :envelope
530
+ retry
531
+ end
532
+ raise
446
533
  rescue *AWS_AUTH_ERRORS => ex
447
534
  if (kms_tries += 1) < 3
448
535
  Rails.logger.warn(AWS_AUTH_ERRORS_MSG, ex)
@@ -453,12 +540,20 @@ module ZuoraConnect
453
540
  end
454
541
  end
455
542
 
456
- def kms_encrypt(value)
543
+ def kms_encrypt(value, encryption_type: ZuoraConnect.configuration.encryption_type)
457
544
  kms_tries ||= 0
458
- kms_client = Aws::KMS::Client.new({region: aws_secrets['AWS_REGION'], credentials: self.aws_auth_client}.delete_if {|k,v| v.blank? })
459
-
460
- resp = kms_client.encrypt({key_id: kms_key, plaintext: value})
461
- return resp.ciphertext_blob.unpack('H*').first
545
+ case encryption_type
546
+ when :direct
547
+ resp = kms_client.encrypt({key_id: kms_key(raise_on_blank: true), plaintext: value})
548
+ return resp.ciphertext_blob.unpack('H*').first
549
+ when :envelope
550
+ cipher = fetch_cipher('encrypt')
551
+ value = cipher.update(value.to_s)
552
+ value << cipher.final
553
+ return Base64.strict_encode64(value)
554
+ else
555
+ ZuoraConnect::Exceptions::Error.new("Invalid encryption method '#{encryption_type}'.")
556
+ end
462
557
  rescue *AWS_AUTH_ERRORS => ex
463
558
  if (kms_tries += 1) < 3
464
559
  Rails.logger.warn(AWS_AUTH_ERRORS_MSG, ex)
@@ -468,18 +563,6 @@ module ZuoraConnect
468
563
  raise
469
564
  end
470
565
  end
471
-
472
- def kms_key
473
- return ENV['AWS_KMS_ARN'] || aws_secrets['AWS_KMS_ARN']
474
- end
475
-
476
- def aws_auth_client
477
- if Rails.env.to_s == 'development'
478
- return Aws::Credentials.new(aws_secrets['AWS_ACCESS_KEY_ID'], aws_secrets['AWS_SECRET_ACCESS_KEY'])
479
- else
480
- return nil
481
- end
482
- end
483
566
  #### END KMS ENCRYPTION Methods ####
484
567
 
485
568
  #### START Metrics Methods ####
@@ -505,9 +588,13 @@ module ZuoraConnect
505
588
  def build_task(task_data: {}, session: {})
506
589
  session = {} if session.blank?
507
590
  self.task_data = task_data
591
+ if self.task_data.blank? && ZuoraConnect.configuration.local_task_data
592
+ self.task_data = self.zuora_logins
593
+ end
594
+
508
595
  self.mode = self.task_data["mode"]
509
596
 
510
- if task_data['id'].to_s != self.id.to_s
597
+ if self.task_data['id'].to_s != self.id.to_s
511
598
  raise ZuoraConnect::Exceptions::MissMatch.new("Wrong Instance Identifier/Lookup")
512
599
  end
513
600
 
@@ -545,7 +632,7 @@ module ZuoraConnect
545
632
  raise
546
633
  rescue => ex
547
634
  ZuoraConnect.logger.error("Build Task Error", ex)
548
- ZuoraConnect.logger.error("Task Data: #{task_data}") if task_data.present?
635
+ ZuoraConnect.logger.error("Task Data: #{self.task_data}") if self.task_data.present?
549
636
  if session.present?
550
637
  ZuoraConnect.logger.error("Task Session: #{session.to_h}") if session.methods.include?(:to_h)
551
638
  ZuoraConnect.logger.error("Task Session: #{session.to_hash}") if session.methods.include?(:to_hash)
@@ -796,19 +883,19 @@ module ZuoraConnect
796
883
  if login.tenant_type == "Zuora"
797
884
  if login.available_entities.size > 1 && Rails.application.config.session_store != ActionDispatch::Session::CookieStore
798
885
  login.available_entities.each do |entity_key|
799
- session["#{self.id}::#{key}::#{entity_key}:current_session"] = login.client(entity_key).current_session if login.client.respond_to?(:current_session)
800
- session["#{self.id}::#{key}::#{entity_key}:bearer_token"] = login.client(entity_key).bearer_token if login.client.respond_to?(:bearer_token)
801
- session["#{self.id}::#{key}::#{entity_key}:oauth_session_expires_at"] = login.client(entity_key).oauth_session_expires_at if login.client.respond_to?(:oauth_session_expires_at)
886
+ session["#{self.id}::#{key}::#{entity_key}:current_session"] = login.client(entity_key).current_session if login.client.respond_to?(:current_session) && login.client(entity_key).current_session.present?
887
+ session["#{self.id}::#{key}::#{entity_key}:bearer_token"] = login.client(entity_key).bearer_token if login.client.respond_to?(:bearer_token) && login.client(entity_key).bearer_token.present?
888
+ session["#{self.id}::#{key}::#{entity_key}:oauth_session_expires_at"] = login.client(entity_key).oauth_session_expires_at if login.client.respond_to?(:oauth_session_expires_at) && login.client(entity_key).oauth_session_expires_at.present?
802
889
  end
803
890
  else
804
- session["#{self.id}::#{key}:current_session"] = login.client.current_session if login.client.respond_to?(:current_session)
805
- session["#{self.id}::#{key}:bearer_token"] = login.client.bearer_token if login.client.respond_to?(:bearer_token)
806
- session["#{self.id}::#{key}:oauth_session_expires_at"] = login.client.oauth_session_expires_at if login.client.respond_to?(:oauth_session_expires_at)
891
+ session["#{self.id}::#{key}:current_session"] = login.client.current_session if login.client.respond_to?(:current_session) && login.client.current_session.present?
892
+ session["#{self.id}::#{key}:bearer_token"] = login.client.bearer_token if login.client.respond_to?(:bearer_token) && login.client.bearer_token.present?
893
+ session["#{self.id}::#{key}:oauth_session_expires_at"] = login.client.oauth_session_expires_at if login.client.respond_to?(:oauth_session_expires_at) && login.client.oauth_session_expires_at.present?
807
894
  end
808
895
  end
809
896
  end
810
897
 
811
- session["#{self.id}::task_data"] = self.task_data
898
+ session["#{self.id}::task_data"] = self.task_data if !ZuoraConnect.configuration.local_task_data
812
899
 
813
900
  #Redis is not defined strip out old data
814
901
  if !defined?(Redis.current)
@@ -848,6 +935,9 @@ module ZuoraConnect
848
935
  else
849
936
  begin
850
937
  return JSON.parse(encryptor.decrypt_and_verify(CGI::unescape(data)))
938
+ rescue ActiveSupport::MessageEncryptor::InvalidMessage => ex
939
+ Rails.logger.error('Error Decrypting', ex, self.default_ougai_items) if log_fatal && !Rails.env.test?
940
+ return JSON.parse(encryptor.decrypt_and_verify(data))
851
941
  rescue ActiveSupport::MessageVerifier::InvalidSignature => ex
852
942
  ZuoraConnect.logger.error("Error Decrypting", ex, self.default_ougai_items) if log_fatal
853
943
  return rescue_return
@@ -11,6 +11,15 @@ class RedisFlash
11
11
  end
12
12
  end
13
13
 
14
+ class Redis
15
+ def self.current
16
+ @current ||= Redis.new()
17
+ end
18
+ def self.current=(redis)
19
+ @current = redis
20
+ end
21
+ end
22
+
14
23
  if defined?(Redis.current)
15
24
  Redis.current = Redis.new(:id => "#{ZuoraObservability::Env.full_process_name(process_name: 'Redis')}", :url => redis_url, :timeout => 6, :reconnect_attempts => 2)
16
25
  browser_urls['Redis'] = { "url" => redis_url }
@@ -9,5 +9,8 @@ class AddEnvironmentFields < ActiveRecord::Migration[5.0]
9
9
  if column_exists? :zuora_connect_app_instances, :organizations
10
10
  change_column :zuora_connect_app_instances, :organizations, :jsonb, default: []
11
11
  end
12
+ unless column_exists? :zuora_connect_app_instances, :zuora_global_tenant_id
13
+ add_column :zuora_connect_app_instances, :zuora_global_tenant_id, :text, default: ""
14
+ end
12
15
  end
13
16
  end
@@ -1,24 +1,16 @@
1
- # desc "Explaining what the task does"
2
- # task :connect do
3
- # # Task goes here
4
- # end
5
-
6
1
  namespace :db do
7
2
  desc 'Also create shared_extensions Schema'
8
3
  task :extensions => :environment do
9
4
  # Create Schema
10
- ActiveRecord::Base.connection.execute 'CREATE SCHEMA IF NOT EXISTS shared_extensions;'
11
- # Enable Hstore
12
- ActiveRecord::Base.connection.execute 'CREATE EXTENSION IF NOT EXISTS HSTORE SCHEMA shared_extensions;'
13
- # Enable UUID-OSSP
14
- ActiveRecord::Base.connection.execute 'CREATE EXTENSION IF NOT EXISTS "uuid-ossp" SCHEMA shared_extensions;'
5
+ at_exit {
6
+ ActiveRecord::Base.connection.execute 'CREATE SCHEMA IF NOT EXISTS shared_extensions;'
7
+ # Enable Hstore
8
+ ActiveRecord::Base.connection.execute 'CREATE EXTENSION IF NOT EXISTS HSTORE SCHEMA shared_extensions;'
9
+ # Enable UUID-OSSP
10
+ ActiveRecord::Base.connection.execute 'CREATE EXTENSION IF NOT EXISTS "uuid-ossp" SCHEMA shared_extensions;'
11
+ }
15
12
  end
16
13
  end
17
14
 
18
- Rake::Task["db:create"].enhance do
19
- Rake::Task["db:extensions"].invoke
20
- end
21
-
22
- Rake::Task["db:test:purge"].enhance do
23
- Rake::Task["db:extensions"].invoke
24
- end
15
+ Rake::Task["db:create"].enhance [:extensions]
16
+ Rake::Task["db:test:purge"].enhance [:extensions]
@@ -7,7 +7,7 @@ module ZuoraConnect
7
7
 
8
8
  attr_accessor :oauth_client_id, :oauth_client_secret, :oauth_client_redirect_uri
9
9
 
10
- attr_accessor :dev_mode_logins, :dev_mode_options, :dev_mode_mode, :dev_mode_appinstance, :dev_mode_user, :dev_mode_pass, :dev_mode_admin, :dev_mode_secret_access_key,:dev_mode_access_key_id,:aws_region, :s3_bucket_name, :s3_folder_name, :insert_migrations, :skip_connect
10
+ attr_accessor :dev_mode_logins, :dev_mode_options, :dev_mode_mode, :dev_mode_appinstance, :dev_mode_user, :dev_mode_pass, :dev_mode_admin, :dev_mode_secret_access_key,:dev_mode_access_key_id,:aws_region, :s3_bucket_name, :s3_folder_name, :insert_migrations, :skip_connect, :encryption_type, :local_task_data
11
11
 
12
12
  def initialize
13
13
  @default_locale = :en
@@ -21,6 +21,8 @@ module ZuoraConnect
21
21
  @blpop_queue = false
22
22
  @insert_migrations = true
23
23
  @skip_connect = false
24
+ @encryption_type = :direct
25
+ @local_task_data = false
24
26
 
25
27
  # Setting the app name for telegraf write
26
28
  @enable_metrics = false
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ZuoraConnect
4
- VERSION = "3.1.0"
4
+ VERSION = "3.1.1-c"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zuora_connect
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.0
4
+ version: 3.1.1.pre.c
5
5
  platform: ruby
6
6
  authors:
7
7
  - Connect Team
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-06-23 00:00:00.000000000 Z
11
+ date: 2022-07-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: apartment
@@ -452,9 +452,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
452
452
  version: '0'
453
453
  required_rubygems_version: !ruby/object:Gem::Requirement
454
454
  requirements:
455
- - - ">="
455
+ - - ">"
456
456
  - !ruby/object:Gem::Version
457
- version: '0'
457
+ version: 1.3.1
458
458
  requirements: []
459
459
  rubygems_version: 3.3.7
460
460
  signing_key: