ibanity 2.2 → 2.3.1

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: 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