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 +4 -4
- data/.github/workflows/gem-push.yml +1 -1
- data/CHANGELOG.md +13 -0
- data/ibanity.gemspec +1 -1
- data/lib/ibanity/api/base_resource.rb +26 -14
- data/lib/ibanity/api/ponto_connect/integration_account.rb +10 -0
- data/lib/ibanity/api/webhooks/xs2a.rb +6 -0
- data/lib/ibanity/api/xs2a/pending_transaction.rb +27 -0
- data/lib/ibanity/version.rb +1 -1
- data/lib/ibanity/webhook.rb +28 -38
- data/lib/ibanity.rb +3 -1
- data/spec/lib/ibanity/webhook_signature_spec.rb +75 -0
- data/spec/support/fixture.rb +10 -0
- data/spec/support/fixtures/json/webhooks/example_payload.json +1 -0
- data/spec/support/fixtures/signature/webhooks/example_signature.sig +1 -0
- metadata +13 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 319589bf55ec8cd48ca771266da34bc5374f8ebfa9ec4894c6b9b6ef7c8ca1bf
|
4
|
+
data.tar.gz: 5f7c0cc44590541555d51dfc96e1f1e70eabd54b19dbb14b66ffdb40f967a87d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 31ec94ee483bc7926d7a66dbb59a34d8bfcdec5e27daedcd7599a53b54c80611ff4d829a1f634b6d6c3c033592e321ab1faf9638c2e52fa00a7664aeac996250
|
7
|
+
data.tar.gz: 6f8bd1c3ff75e41c7e32178e9f060896de45245ec6fb8261cd406432eae62653071b4babbf5dd93d976978d63d3dab70e51f4bd3ade1afbcfbd22c753a567179
|
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
@@ -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
|
-
|
118
|
-
|
119
|
-
|
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
|
-
|
126
|
-
|
127
|
-
|
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
|
-
|
133
|
-
|
134
|
-
|
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
|
-
|
141
|
-
|
142
|
-
|
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
|
-
|
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
|
@@ -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
|
data/lib/ibanity/version.rb
CHANGED
data/lib/ibanity/webhook.rb
CHANGED
@@ -26,66 +26,56 @@ module Ibanity
|
|
26
26
|
#
|
27
27
|
# Returns true otherwise
|
28
28
|
def self.verify!(payload, signature_header, tolerance)
|
29
|
-
|
30
|
-
|
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
|
-
|
39
|
-
|
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
|
-
|
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
|
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
|
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 "
|
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
|
data/spec/support/fixture.rb
CHANGED
@@ -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:
|
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:
|
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:
|
28
|
+
name: jwt
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
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:
|
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
|