ibanity 2.2 → 2.3.1

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: 566ef8be5eb38fe424c373b242d9599a780bc9f7acb52e1106002969d87dce6f
4
- data.tar.gz: 96370ccdebf5f1cca9da24543826b068f43f9db4217899b48ce9380c20741258
3
+ metadata.gz: 319589bf55ec8cd48ca771266da34bc5374f8ebfa9ec4894c6b9b6ef7c8ca1bf
4
+ data.tar.gz: 5f7c0cc44590541555d51dfc96e1f1e70eabd54b19dbb14b66ffdb40f967a87d
5
5
  SHA512:
6
- metadata.gz: 684c30e120f52414fb02b63613efef9e304a0369761ab0c2db6dc69e9aa78380ee0c7a0cad516a2451c02a65aac7abd9dd2d89c986fda8cb1d9d1e1ed8512b56
7
- data.tar.gz: 1fb66ae09cbf094012640875cc24e17f604225c3d60de7af36f59d5de8b4d07702539b9a088d7893359b97302566d9944943add5176e89239d483d5d73880813
6
+ metadata.gz: 31ec94ee483bc7926d7a66dbb59a34d8bfcdec5e27daedcd7599a53b54c80611ff4d829a1f634b6d6c3c033592e321ab1faf9638c2e52fa00a7664aeac996250
7
+ data.tar.gz: 6f8bd1c3ff75e41c7e32178e9f060896de45245ec6fb8261cd406432eae62653071b4babbf5dd93d976978d63d3dab70e51f4bd3ade1afbcfbd22c753a567179
@@ -12,7 +12,7 @@ jobs:
12
12
  steps:
13
13
  - uses: actions/checkout@v2
14
14
  - name: Set up Ruby 2.6
15
- uses: actions/setup-ruby@v1
15
+ uses: ruby/setup-ruby@v1
16
16
  with:
17
17
  ruby-version: 2.6
18
18
 
data/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # Changelog
2
2
 
3
+ ## 2.3.1
4
+
5
+ * Migrate from Jose to JWT gem following incompatibly with OpenSSL 3. Only used in webhooks signature validation.
6
+
7
+ ## 2.3
8
+
9
+ * [Ponto Connect] Add IntegrationAccount
10
+ * [XS2A] Add PendingTransaction
11
+ * [XS2A] Add additional webhooks event
12
+
13
+ * `Ibanity::Webhooks::Xs2a::Account::PendingTransactionsCreated`
14
+ * `Ibanity::Webhooks::Xs2a::Account::PendingTransactionsUpdated`
15
+
3
16
  ## 2.2
4
17
 
5
18
  * [Ponto Connect] Add additional webhook events
data/ibanity.gemspec CHANGED
@@ -19,6 +19,6 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ["lib"]
20
20
 
21
21
  spec.add_dependency "rest-client", ">= 1.8.0"
22
- spec.add_dependency "jose", ">= 1.1.3"
22
+ spec.add_dependency "jwt", ">= 2.0.0"
23
23
  spec.add_development_dependency "rspec", "3.9.0"
24
24
  end
@@ -114,32 +114,40 @@ module Ibanity
114
114
  if relationship["data"]
115
115
  resource = relationship.dig("data", "type") || key
116
116
  klass = relationship_klass(resource)
117
- method_name = Ibanity::Util.underscore(key)
118
- define_singleton_method(method_name) do |headers: nil|
119
- klass.find_by_uri(uri: url, headers: headers, customer_access_token: customer_access_token)
117
+ unless klass.nil?
118
+ method_name = Ibanity::Util.underscore(key)
119
+ define_singleton_method(method_name) do |headers: nil|
120
+ klass.find_by_uri(uri: url, headers: headers, customer_access_token: customer_access_token)
121
+ end
122
+ self[Ibanity::Util.underscore("#{key}_id")] = relationship.dig("data", "id")
120
123
  end
121
- self[Ibanity::Util.underscore("#{key}_id")] = relationship.dig("data", "id")
122
124
  elsif relationship["meta"]
123
125
  resource = relationship.dig("meta", "type")
124
126
  klass = relationship_klass(resource)
125
- method_name = Ibanity::Util.underscore(key)
126
- define_singleton_method(method_name) do |headers: nil|
127
- klass.find_by_uri(uri: url, headers: headers, customer_access_token: customer_access_token)
127
+ unless klass.nil?
128
+ method_name = Ibanity::Util.underscore(key)
129
+ define_singleton_method(method_name) do |headers: nil|
130
+ klass.find_by_uri(uri: url, headers: headers, customer_access_token: customer_access_token)
131
+ end
128
132
  end
129
133
  elsif relationship.dig("links", "meta", "type")
130
134
  resource = relationship.dig("links", "meta", "type")
131
135
  klass = relationship_klass(resource)
132
- method_name = Ibanity::Util.underscore(key)
133
- define_singleton_method(method_name) do |headers: nil, **query_params|
134
- klass.list_by_uri(uri: url, headers: headers, query_params: query_params, customer_access_token: customer_access_token)
136
+ unless klass.nil?
137
+ method_name = Ibanity::Util.underscore(key)
138
+ define_singleton_method(method_name) do |headers: nil, **query_params|
139
+ klass.list_by_uri(uri: url, headers: headers, query_params: query_params, customer_access_token: customer_access_token)
140
+ end
135
141
  end
136
142
  else
137
143
  resource = key
138
144
  singular_resource = resource[0..-2]
139
145
  klass = relationship_klass(singular_resource)
140
- method_name = Ibanity::Util.underscore(resource)
141
- define_singleton_method(method_name) do |headers: nil, **query_params|
142
- klass.list_by_uri(uri: url, headers: headers, query_params: query_params, customer_access_token: customer_access_token)
146
+ unless klass.nil?
147
+ method_name = Ibanity::Util.underscore(resource)
148
+ define_singleton_method(method_name) do |headers: nil, **query_params|
149
+ klass.list_by_uri(uri: url, headers: headers, query_params: query_params, customer_access_token: customer_access_token)
150
+ end
143
151
  end
144
152
  end
145
153
  end
@@ -159,7 +167,11 @@ module Ibanity
159
167
  Object.const_get(self.class.to_s.split("::")[0...-1].join("::"))
160
168
  end
161
169
 
162
- enclosing_module.const_get(camelized_name)
170
+ begin
171
+ enclosing_module.const_get(camelized_name)
172
+ rescue => e
173
+ nil
174
+ end
163
175
  end
164
176
  end
165
177
  end
@@ -0,0 +1,10 @@
1
+ module Ibanity
2
+ module PontoConnect
3
+ class IntegrationAccount < Ibanity::BaseResource
4
+ def self.list(client_access_token:, **query_params)
5
+ uri = Ibanity.ponto_connect_api_schema["integrationAccounts"].sub("{integrationAccountId}", "")
6
+ list_by_uri(uri: uri, query_params: query_params, customer_access_token: client_access_token)
7
+ end
8
+ end
9
+ end
10
+ end
@@ -18,6 +18,12 @@ module Ibanity
18
18
 
19
19
  class TransactionsUpdated < Ibanity::BaseResource
20
20
  end
21
+
22
+ class PendingTransactionsCreated < Ibanity::BaseResource
23
+ end
24
+
25
+ class PendingTransactionsUpdated < Ibanity::BaseResource
26
+ end
21
27
  end
22
28
  end
23
29
  end
@@ -0,0 +1,27 @@
1
+ module Ibanity
2
+ module Xs2a
3
+ class PendingTransaction < Ibanity::BaseResource
4
+ def self.list(financial_institution_id: nil, account_id: nil, synchronization_id: nil, customer_access_token:, headers: nil, **query_params)
5
+ uri = if synchronization_id
6
+ Ibanity.xs2a_api_schema["customer"]["synchronization"]["updatedPendingTransactions"]
7
+ .sub("{synchronizationId}", synchronization_id)
8
+ else
9
+ Ibanity.xs2a_api_schema["customer"]["financialInstitution"]["pendingTransactions"]
10
+ .sub("{financialInstitutionId}", financial_institution_id)
11
+ .sub("{accountId}", account_id)
12
+ .sub("{pendingTransactionId}", "")
13
+ end
14
+
15
+ list_by_uri(uri: uri, query_params: query_params, customer_access_token: customer_access_token, headers: headers)
16
+ end
17
+
18
+ def self.find(id:, financial_institution_id:, account_id:, customer_access_token:)
19
+ uri = Ibanity.xs2a_api_schema["customer"]["financialInstitution"]["pendingTransactions"]
20
+ .sub("{financialInstitutionId}", financial_institution_id)
21
+ .sub("{accountId}", account_id)
22
+ .sub("{pendingTransactionId}", id)
23
+ find_by_uri(uri: uri, customer_access_token: customer_access_token)
24
+ end
25
+ end
26
+ end
27
+ end
@@ -1,3 +1,3 @@
1
1
  module Ibanity
2
- VERSION = "2.2"
2
+ VERSION = "2.3.1"
3
3
  end
@@ -26,66 +26,56 @@ module Ibanity
26
26
  #
27
27
  # Returns true otherwise
28
28
  def self.verify!(payload, signature_header, tolerance)
29
- begin
30
- key_details = JOSE::JWT.peek_protected(signature_header).to_hash
31
- raise unless key_details["alg"] == SIGNING_ALGORITHM && key_details["kid"]
32
- rescue
33
- raise Ibanity::Error.new("Key details could not be parsed from the header", nil)
34
- end
35
-
36
- key = Ibanity.webhook_keys.find { |key| key.kid == key_details["kid"] }
29
+ jwks_loader = ->(options) do
30
+ raise Ibanity::Error.new("The key id from the header didn't match an available signing key", nil) if options[:kid_not_found]
37
31
 
38
- if key.nil?
39
- raise Ibanity::Error.new("The key id from the header didn't match an available signing key", nil)
32
+ keys = Ibanity.webhook_keys.select { |key| key.use == "sig" }
33
+ .map { |key| JWT::JWK.new(key.to_h {|key, value| [key.to_s, value] }) }
34
+ JWT::JWK::Set.new(keys)
40
35
  end
41
- signer = JOSE::JWK.from(key.to_h {|key, value| [key.to_s, value] })
42
- verified, claims_string, _jws = JOSE::JWT.verify_strict(signer, [SIGNING_ALGORITHM], signature_header)
43
-
44
- raise Ibanity::Error.new("The signature verification failed", nil) unless verified
45
36
 
46
- jwt = JOSE::JWT.from(claims_string)
37
+ options = {
38
+ aud: Ibanity.client.application_id,
39
+ algorithm: SIGNING_ALGORITHM,
40
+ exp_leeway: tolerance,
41
+ iss: Ibanity.client.base_uri,
42
+ jwks: jwks_loader,
43
+ verify_aud: true,
44
+ verify_iss: true
45
+ }
46
+ jwts = JWT.decode(signature_header, nil, true, options)
47
+ jwt = jwts.first
47
48
 
48
49
  validate_digest!(jwt, payload)
49
50
  validate_issued_at!(jwt, tolerance)
50
- validate_expiration!(jwt, tolerance)
51
- validate_issuer!(jwt)
52
- validate_audience!(jwt)
53
51
 
54
52
  true
53
+ rescue JWT::ExpiredSignature
54
+ raise_invalid_signature_error!("exp")
55
+ rescue JWT::IncorrectAlgorithm
56
+ raise Ibanity::Error.new("Incorrect algorithm for signature", nil)
57
+ rescue JWT::InvalidAudError
58
+ raise_invalid_signature_error!("aud")
59
+ rescue JWT::InvalidIssuerError
60
+ raise_invalid_signature_error!("iss")
61
+ rescue JWT::DecodeError
62
+ raise Ibanity::Error.new("The signature verification failed", nil)
55
63
  end
56
64
 
57
65
  private
58
66
 
59
67
  def self.validate_digest!(jwt, payload)
60
- unless Digest::SHA512.base64digest(payload) == jwt.fields["digest"]
68
+ unless Digest::SHA512.base64digest(payload) == jwt["digest"]
61
69
  raise_invalid_signature_error!("digest")
62
70
  end
63
71
  end
64
72
 
65
73
  def self.validate_issued_at!(jwt, tolerance)
66
- unless jwt.fields["iat"] <= Time.now.to_i + tolerance
74
+ unless jwt["iat"] <= Time.now.to_i + tolerance
67
75
  raise_invalid_signature_error!("iat")
68
76
  end
69
77
  end
70
78
 
71
- def self.validate_expiration!(jwt, tolerance)
72
- unless jwt.fields["exp"] >= Time.now.to_i - tolerance
73
- raise_invalid_signature_error!("exp")
74
- end
75
- end
76
-
77
- def self.validate_issuer!(jwt)
78
- unless jwt.fields["iss"] == Ibanity.client.base_uri
79
- raise_invalid_signature_error!("iss")
80
- end
81
- end
82
-
83
- def self.validate_audience!(jwt)
84
- unless jwt.fields["aud"] == Ibanity.client.application_id
85
- raise_invalid_signature_error!("aud")
86
- end
87
- end
88
-
89
79
  def self.raise_invalid_signature_error!(field)
90
80
  raise Ibanity::Error.new("The signature #{field} is invalid", nil)
91
81
  end
data/lib/ibanity.rb CHANGED
@@ -4,7 +4,7 @@ require "uri"
4
4
  require "rest_client"
5
5
  require "json"
6
6
  require "securerandom"
7
- require "jose"
7
+ require "jwt"
8
8
 
9
9
  require_relative "ibanity/util"
10
10
  require_relative "ibanity/error"
@@ -15,6 +15,7 @@ require_relative "ibanity/api/base_resource"
15
15
  require_relative "ibanity/api/flat_resource"
16
16
  require_relative "ibanity/webhook"
17
17
  require_relative "ibanity/api/xs2a/account"
18
+ require_relative "ibanity/api/xs2a/pending_transaction"
18
19
  require_relative "ibanity/api/xs2a/transaction"
19
20
  require_relative "ibanity/api/xs2a/holding"
20
21
  require_relative "ibanity/api/xs2a/batch_synchronization"
@@ -62,6 +63,7 @@ require_relative "ibanity/api/ponto_connect/sandbox/financial_institution_transa
62
63
  require_relative "ibanity/api/ponto_connect/onboarding_details"
63
64
  require_relative "ibanity/api/ponto_connect/reauthorization_request"
64
65
  require_relative "ibanity/api/ponto_connect/payment_activation_request"
66
+ require_relative "ibanity/api/ponto_connect/integration_account"
65
67
  require_relative "ibanity/api/webhooks/key"
66
68
  require_relative "ibanity/api/webhooks/xs2a"
67
69
  require_relative "ibanity/api/webhooks/ponto_connect"
@@ -0,0 +1,75 @@
1
+ require 'ibanity'
2
+
3
+ RSpec.describe Ibanity::Webhook::Signature do
4
+ subject(:signature_module) { described_class }
5
+
6
+ let(:client) { instance_double("Ibanity::Client") }
7
+
8
+ before do
9
+ allow(Ibanity).to receive(:client).and_return(client)
10
+ allow(Ibanity).to receive(:webhook_keys).and_return(
11
+ [
12
+ Ibanity::Webhooks::Key.new(
13
+ alg: "RS512",
14
+ e: "AQAB",
15
+ kid: "sandbox_events_signature_1",
16
+ kty: "RSA",
17
+ n: "v9qVZmotpil47Pw2NOmP11bpE5B_GtG6ICfqtm13Uusa4asf4FWedclr-kQTV2Ly5rSItq2f3RGRNyove_4TiTIbx21rwM5HP0iFhlVaqHjkr1iSmKzCFojOnTM4UwKQNROhDVDC6TWIzSafZkBacUrCX5l0PLSh2aEK8aiopu5ajYpOr8Ipjw_mbKXxBfcxtjgskbXPyEcf6xlB_Dygl9-btAvRTKiuie4qAWANTdVAgSnddjZMJxFnndZMCH1h-z4ISwphBYbwG2aZrZ7RfHnoIROxsdmKeostYtHy3gMR4_poufzFRR8lpvODd3m7lzdXKBTCvzlQYBNpmf6gmG9p08laE-h67F1GoqvuqspcvRlVpGZEzEwRIbPMAaS4_omCSj4HFZyo58PLUsAp--AD8GGFfVMyBdFhTEkr2235O5AP4UMdHuvyP-NPFCsqibqKK1GIl_Hy0UXnqg7-MCGqs4jX1k4IZZ3wDwza30f1O6tUtaOT8YXzZ2ZWnVWyMLcNx6gep8t3A7gTzEXcselrJgO6SLFRhYA0QmtIRtTwnl-8OmjEi5AJVzO0e-yiRj7g_JLEmgG3pDwmvbiXzEqkY5mPqJMB9G5qcd0SWgvvZs02_1tRRhvw0D5BTKfcEcLW9PKm8Nts1_BGSXKOhTSeQgxuw4iC63ST3dtpl-0=",
18
+ status: "ACTIVE",
19
+ use: "sig"
20
+ )
21
+ ]
22
+ )
23
+ allow(client).to receive(:application_id).and_return("e643b5be-ccb1-4a38-b7b6-36689853bef5")
24
+ allow(client).to receive(:base_uri).and_return("https://api.ibanity.com")
25
+ end
26
+
27
+ describe ".verify!" do
28
+ let(:payload) { Fixture.load_unparsed_json("webhooks/example_payload.json") }
29
+ let(:signature) { Fixture.load_signature("webhooks/example_signature.sig") }
30
+ let(:tolerance) { Time.now.to_i + 10 - 1691670985 }
31
+
32
+ it "returns true for a correct signature" do
33
+ expect(signature_module.verify!(payload, signature, tolerance)).to be_truthy
34
+ end
35
+
36
+ it "raises an error if the contents are altered" do
37
+ expect do
38
+ signature_module.verify!(payload + "altered", signature, tolerance)
39
+ end.to raise_error(Ibanity::Error, /The signature digest is invalid/)
40
+ end
41
+
42
+ it "raises an error if the signature is expired" do
43
+ expect do
44
+ signature_module.verify!(payload, signature, 0)
45
+ end.to raise_error(Ibanity::Error, /The signature exp is invalid/)
46
+ end
47
+
48
+ it "raises an error if the audience is invalid" do
49
+ allow(client).to receive(:application_id).and_return("invalid")
50
+ expect do
51
+ signature_module.verify!(payload, signature, tolerance)
52
+ end.to raise_error(Ibanity::Error, /The signature aud is invalid/)
53
+ end
54
+
55
+ it "raises an error if the issuer is invalid" do
56
+ allow(client).to receive(:base_uri).and_return("invalid")
57
+ expect do
58
+ signature_module.verify!(payload, signature, tolerance)
59
+ end.to raise_error(Ibanity::Error, /The signature iss is invalid/)
60
+ end
61
+
62
+ it "raises an error if the signing key is unavailable" do
63
+ allow(Ibanity).to receive(:webhook_keys).and_return([])
64
+ expect do
65
+ signature_module.verify!(payload, signature, tolerance)
66
+ end.to raise_error(Ibanity::Error, /The key id from the header didn't match an available signing key/)
67
+ end
68
+
69
+ it "raises an error if the signature is altered" do
70
+ expect do
71
+ signature_module.verify!(payload, signature + "altered", tolerance)
72
+ end.to raise_error(Ibanity::Error, /The signature verification failed/)
73
+ end
74
+ end
75
+ end
@@ -5,4 +5,14 @@ module Fixture
5
5
  path = Pathname([File.dirname(__FILE__ ), "fixtures", "json", filename].join("/"))
6
6
  JSON.parse(File.read(path))
7
7
  end
8
+
9
+ def self.load_unparsed_json(filename)
10
+ path = Pathname([File.dirname(__FILE__ ), "fixtures", "json", filename].join("/"))
11
+ File.read(path)
12
+ end
13
+
14
+ def self.load_signature(filename)
15
+ path = Pathname([File.dirname(__FILE__ ), "fixtures", "signature", filename].join("/"))
16
+ File.read(path)
17
+ end
8
18
  end
@@ -0,0 +1 @@
1
+ {"data":{"attributes":{"createdAt":"2023-08-10T12:24:42.224Z","synchronizationSubtype":"accountTransactions"},"id":"3465fd2f-6c9a-484e-971e-56bf44c9181a","relationships":{"account":{"data":{"id":"1d89d411-e310-4802-bbb7-aad7d98371e7","type":"account"}},"organization":{"data":{"id":"9315d6b3-129a-481a-9604-e2a95e0f967d","type":"organization"}},"synchronization":{"data":{"id":"178b59a6-679f-43d4-b5ad-28caea0bc08b","type":"synchronization"}}},"type":"pontoConnect.synchronization.succeededWithoutChange"}}
@@ -0,0 +1 @@
1
+ eyJhbGciOiJSUzUxMiIsImtpZCI6InNhbmRib3hfZXZlbnRzX3NpZ25hdHVyZV8xIn0.eyJhdWQiOiJlNjQzYjViZS1jY2IxLTRhMzgtYjdiNi0zNjY4OTg1M2JlZjUiLCJkaWdlc3QiOiJDZEJPWGwzMGsyM0lsVVdkM2JPL1FtazhXek5lN1NERjVCV3FUQnIyVzQ0VjlqRnhjZW4wSEFHVGsra0Nka0NjWVZsRW9PYmtZM0JCc2lPRnNFV0hIUT09IiwiZXhwIjoxNjkxNjcwOTg1LCJpYXQiOjE2OTE2NzA5MjUsImlzcyI6Imh0dHBzOi8vYXBpLmliYW5pdHkuY29tIiwianRpIjoiMWMyOTNkNTYtOTk1Yi00NDg5LTlhODMtMDEzZTg2ZTk4NjQ2In0.ooEZQDTfGmfYr5DmD7wVxdIN_0YXDBiwwL1_fFwSlTiIcr8vehAbDtcsyf3XrycySkUbWvtZYbhYXJw1BH4eDKdhCd2MnrxNX8BzxEjbAKzsGTT4l1YnrbBEIfcL_Z3qCzxJOzWErkSAgIi1XbiNFbw1YTU0c_Y0bBwxY6EEZgQVpG0-OXbzxhT7GRnsdSmYCAEkbLUzhRDj37fOz0oTfuimn04ANqVNJbTrOnQ2md_lOIS1XWl_WaDrk8pExUQ5JQii7dIxnzaHLB5J6U8zAOUchNLYJW1tcJmpVE_3baO_W6MvsWfEG9wY5Jud55WsnSHOOA4ak0KQJx3owqXt3uzlKH0MjPe6UeuJagZo1nXPW8IV6QCyvqtJ6TMwXqN67GHzh2YTS-Ct7qFxgHKFutlSfBfV4PaTTRd0ywqgTIVXY9P_hQmTSL_J0WiTg_2Di0ty10ehCau9rF1Bmpf2ZnSMK2Rr4JRPIMnFQsU-W5jZbZNF_tDaECzzkDoZgMDRrQT1TsdfSWU-XWG2f0ytiHKVcFJE9mMd25b2SJ6rx2e-TZaQwb5jO61uL1Q8zjvPWqofWZ5emiby9FWNFS-0fqF0UUJdlb7XU1fo_cQi0q4pYGgN2_2sgNETXr99zcTT2vpCf9x9RZGUzXne_WhZP_gp49m0kTX1W0s8O_2g2Do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ibanity
3
3
  version: !ruby/object:Gem::Version
4
- version: '2.2'
4
+ version: 2.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ibanity
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-10-06 00:00:00.000000000 Z
11
+ date: 2023-08-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rest-client
@@ -25,19 +25,19 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: 1.8.0
27
27
  - !ruby/object:Gem::Dependency
28
- name: jose
28
+ name: jwt
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 1.1.3
33
+ version: 2.0.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: 1.1.3
40
+ version: 2.0.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -89,6 +89,7 @@ files:
89
89
  - lib/ibanity/api/ponto_connect/bulk_payment.rb
90
90
  - lib/ibanity/api/ponto_connect/financial_institution.rb
91
91
  - lib/ibanity/api/ponto_connect/integration.rb
92
+ - lib/ibanity/api/ponto_connect/integration_account.rb
92
93
  - lib/ibanity/api/ponto_connect/onboarding_details.rb
93
94
  - lib/ibanity/api/ponto_connect/payment.rb
94
95
  - lib/ibanity/api/ponto_connect/payment_activation_request.rb
@@ -120,6 +121,7 @@ files:
120
121
  - lib/ibanity/api/xs2a/holding.rb
121
122
  - lib/ibanity/api/xs2a/payment_initiation_request.rb
122
123
  - lib/ibanity/api/xs2a/payment_initiation_request_authorization.rb
124
+ - lib/ibanity/api/xs2a/pending_transaction.rb
123
125
  - lib/ibanity/api/xs2a/periodic_payment_initiation_request.rb
124
126
  - lib/ibanity/api/xs2a/periodic_payment_initiation_request_authorization.rb
125
127
  - lib/ibanity/api/xs2a/synchronization.rb
@@ -134,6 +136,7 @@ files:
134
136
  - spec/lib/ibanity/base_resource_spec.rb
135
137
  - spec/lib/ibanity/http_signature_spec.rb
136
138
  - spec/lib/ibanity/util_spec.rb
139
+ - spec/lib/ibanity/webhook_signature_spec.rb
137
140
  - spec/spec_helper.rb
138
141
  - spec/support/crypto_helper.rb
139
142
  - spec/support/fixture.rb
@@ -141,9 +144,11 @@ files:
141
144
  - spec/support/fixtures/json/relationships/data_without_type.json
142
145
  - spec/support/fixtures/json/relationships/meta_with_type.json
143
146
  - spec/support/fixtures/json/relationships/no_links_related.json
147
+ - spec/support/fixtures/json/webhooks/example_payload.json
144
148
  - spec/support/fixtures/signature/test-certificate.pem
145
149
  - spec/support/fixtures/signature/test-private_key.pem
146
150
  - spec/support/fixtures/signature/test-public_key.pem
151
+ - spec/support/fixtures/signature/webhooks/example_signature.sig
147
152
  homepage: https://documentation.ibanity.com/api/ruby
148
153
  licenses:
149
154
  - MIT
@@ -171,6 +176,7 @@ test_files:
171
176
  - spec/lib/ibanity/base_resource_spec.rb
172
177
  - spec/lib/ibanity/http_signature_spec.rb
173
178
  - spec/lib/ibanity/util_spec.rb
179
+ - spec/lib/ibanity/webhook_signature_spec.rb
174
180
  - spec/spec_helper.rb
175
181
  - spec/support/crypto_helper.rb
176
182
  - spec/support/fixture.rb
@@ -178,6 +184,8 @@ test_files:
178
184
  - spec/support/fixtures/json/relationships/data_without_type.json
179
185
  - spec/support/fixtures/json/relationships/meta_with_type.json
180
186
  - spec/support/fixtures/json/relationships/no_links_related.json
187
+ - spec/support/fixtures/json/webhooks/example_payload.json
181
188
  - spec/support/fixtures/signature/test-certificate.pem
182
189
  - spec/support/fixtures/signature/test-private_key.pem
183
190
  - spec/support/fixtures/signature/test-public_key.pem
191
+ - spec/support/fixtures/signature/webhooks/example_signature.sig