ibanity 0.2 → 0.3

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
  SHA1:
3
- metadata.gz: e32773346575665a0b8b54c650eddb72e0448f80
4
- data.tar.gz: c27f2f93e9f1969af0d0db65bf9c1928b7f8e152
3
+ metadata.gz: ea50bc85fd8e0a6468ce7369b94cb836f3fd19cf
4
+ data.tar.gz: 422de41be223dcbe8287eafa314156c659415fb5
5
5
  SHA512:
6
- metadata.gz: 0db1bf0c979f0d4f5ed3f9dea9908e7ebae9c4cfbe10f7abb82d7a9f76a1d107f382fe3ddc25a496df28536a08d4c25ba905cd2a9d16d800c4a14c72f157ad71
7
- data.tar.gz: ae0dbe155738dc14795854a334cfd480208cc9fc417d1ddced1678ac3c1a345d0603c4b7fbcdfd25773f2ab22a05f335ec5f04c4f24e533aaee377c8db64d80c
6
+ metadata.gz: 6570feb168015383055418c0d1541e56ca3c50369c29568a993c2ceb6fe45eb8eee6611c61a29b52ec5e9177f4245a3283c70c6eb7220643a9ae6bef4203f136
7
+ data.tar.gz: 90204fd366835b3a137059f9be08b8c951fde12e56ee521b9cf92121c713056b0cd7f8a7fad03b3676e0c0cdcc1fd3df2ef2acd44497ed12c9c1e9eae3f3e0ba
data/LICENSE.txt CHANGED
@@ -1,5 +1,4 @@
1
- he MIT License (MIT)
2
- Copyright (c) 2017 Lockey SPRL
1
+ Copyright (c) 2018 Isabel NV
3
2
 
4
3
  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
5
4
 
data/README.md CHANGED
@@ -16,21 +16,3 @@ gem install "ibanity"
16
16
 
17
17
  * Ruby 2.0+.
18
18
 
19
- ## Usage
20
-
21
- * Usage
22
-
23
- Ibanity must be configured using the details of your application on the [Ibanity developer portal](https://developer.ibanity.com).
24
-
25
- ```ruby
26
- require "ibanity"
27
-
28
- Ibanity.configure do |config|
29
- config.certificate = ENV["IBANITY_CERTIFICATE"]
30
- config.key = ENV["IBANITY_KEY"]
31
- config.key_passphrase = ENV["IBANITY_PASSPHRASE"]
32
- end
33
-
34
- puts Ibanity::FinancialInstitution.list.first
35
- puts Ibanity::SandboxUser.list
36
- ```
data/lib/ibanity.rb CHANGED
@@ -3,10 +3,12 @@ require "openssl"
3
3
  require "uri"
4
4
  require "rest_client"
5
5
  require "json"
6
+ require "securerandom"
6
7
 
7
8
  require_relative "ibanity/util"
8
9
  require_relative "ibanity/error"
9
10
  require_relative "ibanity/client"
11
+ require_relative "ibanity/http_signature"
10
12
  require_relative "ibanity/api/base_resource"
11
13
  require_relative "ibanity/api/account"
12
14
  require_relative "ibanity/api/transaction"
@@ -27,6 +29,9 @@ module Ibanity
27
29
  end
28
30
 
29
31
  def configure
32
+ @client = nil
33
+ @api_schema = nil
34
+ @configuration = nil
30
35
  yield configuration
31
36
  end
32
37
 
@@ -35,6 +40,10 @@ module Ibanity
35
40
  :certificate,
36
41
  :key,
37
42
  :key_passphrase,
43
+ :signature_certificate,
44
+ :signature_certificate_id,
45
+ :signature_key,
46
+ :signature_key_passphrase,
38
47
  :api_scheme,
39
48
  :api_host,
40
49
  :api_port,
@@ -43,7 +52,7 @@ module Ibanity
43
52
  end
44
53
 
45
54
  def api_schema
46
- @api_schema ||= client.get(client.base_uri)["links"]
55
+ @api_schema ||= client.get(uri: client.base_uri)["links"]
47
56
  end
48
57
 
49
58
  def respond_to_missing?(method_name, include_private = false)
@@ -7,14 +7,14 @@ module Ibanity
7
7
  Ibanity.api_schema["customer"]["accounts"].sub("{accountId}", "")
8
8
  end
9
9
 
10
- list_by_uri(uri, query_params, customer_access_token)
10
+ list_by_uri(uri: uri, query_params: query_params, customer_access_token: customer_access_token)
11
11
  end
12
12
 
13
13
  def self.find(id:, financial_institution_id:, customer_access_token:)
14
14
  uri = Ibanity.api_schema["customer"]["financialInstitution"]["accounts"]
15
15
  .sub("{financialInstitutionId}", financial_institution_id)
16
16
  .sub("{accountId}", id)
17
- find_by_uri(uri, customer_access_token)
17
+ find_by_uri(uri: uri, customer_access_token: customer_access_token)
18
18
  end
19
19
  end
20
20
  end
@@ -1,11 +1,17 @@
1
1
  module Ibanity
2
2
  class AccountInformationAccessRequest < Ibanity::BaseResource
3
- def self.create_for_financial_institution(financial_institution_id:, customer_access_token:, **attributes)
3
+ def self.create_for_financial_institution(financial_institution_id:, customer_access_token:, idempotency_key: nil, **attributes)
4
4
  path = Ibanity.api_schema["customer"]["financialInstitution"]["accountInformationAccessRequests"]
5
5
  .gsub("{financialInstitutionId}", financial_institution_id)
6
6
  .gsub("{accountInformationAccessRequestId}", "")
7
7
  uri = Ibanity.client.build_uri(path)
8
- create_by_uri(uri, "accountInformationAccessRequest", attributes, customer_access_token)
8
+ create_by_uri(
9
+ uri: uri,
10
+ resource_type: "accountInformationAccessRequest",
11
+ attributes: attributes,
12
+ customer_access_token: customer_access_token,
13
+ idempotency_key: idempotency_key
14
+ )
9
15
  end
10
16
  end
11
17
  end
@@ -1,45 +1,45 @@
1
1
  module Ibanity
2
2
  class BaseResource < OpenStruct
3
- def self.create_by_uri(uri, resource_type, attributes, customer_access_token = nil)
3
+ def self.create_by_uri(uri:, resource_type:, attributes:, customer_access_token: nil, idempotency_key: nil)
4
4
  payload = {
5
5
  data: {
6
6
  type: resource_type,
7
7
  attributes: attributes
8
8
  }
9
9
  }
10
- raw_item = Ibanity.client.post(uri, payload, {}, customer_access_token)
10
+ raw_item = Ibanity.client.post(uri: uri, payload: payload, customer_access_token: customer_access_token, idempotency_key: idempotency_key)
11
11
  new(raw_item["data"], customer_access_token)
12
12
  end
13
13
 
14
- def self.list_by_uri(uri, query_params = {}, customer_access_token = nil)
15
- raw_items = Ibanity.client.get(uri, query_params, customer_access_token)
14
+ def self.list_by_uri(uri:, query_params: {}, customer_access_token: nil)
15
+ raw_items = Ibanity.client.get(uri: uri, query_params: query_params, customer_access_token: customer_access_token)
16
16
  raw_items["data"].map do |raw_item|
17
17
  new(raw_item, customer_access_token)
18
18
  end
19
19
  end
20
20
 
21
- def self.find_by_uri(uri, customer_access_token = nil)
22
- new(find_raw_by_uri(uri, customer_access_token), customer_access_token)
21
+ def self.find_by_uri(uri:, customer_access_token: nil)
22
+ new(find_raw_by_uri(uri: uri, customer_access_token: customer_access_token), customer_access_token)
23
23
  end
24
24
 
25
- def self.find_raw_by_uri(uri, customer_access_token = nil)
26
- raw_item = Ibanity.client.get(uri, {}, customer_access_token)
25
+ def self.find_raw_by_uri(uri:, customer_access_token: nil)
26
+ raw_item = Ibanity.client.get(uri: uri, customer_access_token: customer_access_token)
27
27
  raw_item["data"]
28
28
  end
29
29
 
30
- def self.destroy_by_uri(uri, customer_access_token = nil)
31
- raw_item = Ibanity.client.delete(uri, {}, customer_access_token)
32
- new(raw_item["data"])
30
+ def self.destroy_by_uri(uri:, customer_access_token: nil)
31
+ raw_item = Ibanity.client.delete(uri: uri, customer_access_token: customer_access_token)
32
+ new(raw_item["data"], customer_access_token)
33
33
  end
34
34
 
35
- def self.update_by_uri(uri, resource_type, attributes, customer_access_token = nil)
35
+ def self.update_by_uri(uri:, resource_type:, attributes:, customer_access_token: nil, idempotency_key: nil)
36
36
  payload = {
37
37
  data: {
38
38
  type: resource_type,
39
39
  attributes: attributes
40
40
  }
41
41
  }
42
- raw_item = Ibanity.client.patch(uri, payload, {}, customer_access_token)
42
+ raw_item = Ibanity.client.patch(uri: uri, payload: payload, customer_access_token: customer_access_token, idempotency_key: idempotency_key)
43
43
  new(raw_item["data"])
44
44
  end
45
45
 
@@ -81,7 +81,7 @@ module Ibanity
81
81
  klass = Ibanity.const_get(Ibanity::Util.camelize(key))
82
82
  method_name = Ibanity::Util.underscore(key)
83
83
  define_singleton_method(method_name) do
84
- klass.find_by_uri(relationship["links"]["related"], customer_access_token)
84
+ klass.find_by_uri(uri: relationship["links"]["related"], customer_access_token: customer_access_token)
85
85
  end
86
86
  self[Ibanity::Util.underscore("#{key}_id")] = relationship["data"]["id"]
87
87
  else
@@ -90,7 +90,7 @@ module Ibanity
90
90
  method_name = Ibanity::Util.underscore(key)
91
91
  define_singleton_method(method_name) do
92
92
  uri = relationship["links"]["related"]
93
- klass.list_by_uri(uri, customer_access_token)
93
+ klass.list_by_uri(uri: uri, customer_access_token: customer_access_token)
94
94
  end
95
95
  end
96
96
  end
@@ -1,9 +1,9 @@
1
1
  module Ibanity
2
2
  class CustomerAccessToken < ::Ibanity::BaseResource
3
- def self.create(attributes)
3
+ def self.create(idempotency_key: nil, **attributes)
4
4
  path = ::Ibanity.api_schema["customerAccessTokens"]
5
5
  uri = ::Ibanity.client.build_uri(path)
6
- create_by_uri(uri, "customerAccessToken", attributes)
6
+ create_by_uri(uri: uri, resource_type: "customerAccessToken", attributes: attributes, idempotency_key: idempotency_key)
7
7
  end
8
8
  end
9
9
  end
@@ -2,12 +2,12 @@ module Ibanity
2
2
  class FinancialInstitution < Ibanity::BaseResource
3
3
  def self.list(**query_params)
4
4
  uri = Ibanity.api_schema["financialInstitutions"].sub("{financialInstitutionId}", "")
5
- list_by_uri(uri, query_params)
5
+ list_by_uri(uri: uri, query_params: query_params)
6
6
  end
7
7
 
8
8
  def self.find(id:)
9
9
  uri = Ibanity.api_schema["financialInstitutions"].sub("{financialInstitutionId}", id)
10
- find_by_uri(uri)
10
+ find_by_uri(uri: uri)
11
11
  end
12
12
  end
13
13
  end
@@ -1,18 +1,24 @@
1
1
  module Ibanity
2
2
  class PaymentInitiationRequest < Ibanity::BaseResource
3
- def self.create_for_financial_institution(financial_institution_id:, customer_access_token:, **attributes)
3
+ def self.create_for_financial_institution(financial_institution_id:, customer_access_token:, idempotency_key: nil, **attributes)
4
4
  path = Ibanity.api_schema["customer"]["financialInstitution"]["paymentInitiationRequests"]
5
5
  .gsub("{financialInstitutionId}", financial_institution_id)
6
6
  .sub("{paymentInitiationRequestId}", "")
7
7
  uri = Ibanity.client.build_uri(path)
8
- create_by_uri(uri, "accountInformationAccessRequest", attributes, customer_access_token)
8
+ create_by_uri(
9
+ uri: uri,
10
+ resource_type: "accountInformationAccessRequest",
11
+ attributes: attributes,
12
+ customer_access_token: customer_access_token,
13
+ idempotency_key: idempotency_key
14
+ )
9
15
  end
10
16
 
11
17
  def self.find(id:, financial_institution_id:, customer_access_token:)
12
18
  uri = Ibanity.api_schema["customer"]["financialInstitution"]["paymentInitiationRequests"]
13
19
  .gsub("{financialInstitutionId}", financial_institution_id)
14
20
  .sub("{paymentInitiationRequestId}", id)
15
- find_by_uri(uri, customer_access_token)
21
+ find_by_uri(uri: uri, customer_access_token: customer_access_token)
16
22
  end
17
23
  end
18
24
  end
@@ -1,12 +1,12 @@
1
1
  module Ibanity
2
2
  class SandboxAccount < Ibanity::BaseResource
3
- def self.create(sandbox_user_id:, financial_institution_id:, **attributes)
3
+ def self.create(sandbox_user_id:, financial_institution_id:, idempotency_key: nil, **attributes)
4
4
  path = Ibanity.api_schema["sandbox"]["accounts"]
5
5
  .gsub("{financialInstitutionId}", financial_institution_id)
6
6
  .gsub("{sandboxUserId}", sandbox_user_id)
7
7
  .gsub("{sandboxAccountId}", "")
8
8
  uri = Ibanity.client.build_uri(path)
9
- create_by_uri(uri, "sandboxAccount", attributes)
9
+ create_by_uri(uri: uri, resource_type: "sandboxAccount", attributes: attributes, idempotency_key: idempotency_key)
10
10
  end
11
11
 
12
12
  def self.list(financial_institution_id:, sandbox_user_id:, **query_params)
@@ -15,7 +15,7 @@ module Ibanity
15
15
  .gsub("{sandboxUserId}", sandbox_user_id)
16
16
  .gsub("{sandboxAccountId}", "")
17
17
  uri = Ibanity.client.build_uri(path)
18
- list_by_uri(uri, query_params)
18
+ list_by_uri(uri: uri, query_params: query_params)
19
19
  end
20
20
 
21
21
  def self.find(id:, sandbox_user_id:, financial_institution_id:)
@@ -24,7 +24,7 @@ module Ibanity
24
24
  .gsub("{sandboxUserId}", sandbox_user_id)
25
25
  .gsub("{sandboxAccountId}", id)
26
26
  uri = Ibanity.client.build_uri(path)
27
- find_by_uri(uri)
27
+ find_by_uri(uri: uri)
28
28
  end
29
29
 
30
30
  def self.delete(id:, sandbox_user_id:, financial_institution_id:)
@@ -33,7 +33,7 @@ module Ibanity
33
33
  .gsub("{sandboxUserId}", sandbox_user_id)
34
34
  .gsub("{sandboxAccountId}", id)
35
35
  uri = Ibanity.client.build_uri(path)
36
- destroy_by_uri(uri)
36
+ destroy_by_uri(uri: uri)
37
37
  end
38
38
  end
39
39
  end
@@ -1,20 +1,20 @@
1
1
  module Ibanity
2
2
  class SandboxFinancialInstitution < Ibanity::BaseResource
3
- def self.create(attributes)
3
+ def self.create(idempotency_key: nil, **attributes)
4
4
  path = Ibanity.api_schema["sandbox"]["financialInstitutions"].gsub("{financialInstitutionId}", "")
5
5
  uri = Ibanity.client.build_uri(path)
6
- create_by_uri(uri, "financialInstitution", attributes)
6
+ create_by_uri(uri: uri, resource_type: "financialInstitution", attributes: attributes, idempotency_key: idempotency_key)
7
7
  end
8
8
 
9
- def self.update(id:, **attributes)
9
+ def self.update(id:, idempotency_key: nil, **attributes)
10
10
  path = Ibanity.api_schema["sandbox"]["financialInstitutions"].gsub("{financialInstitutionId}", id)
11
11
  uri = Ibanity.client.build_uri(path)
12
- update_by_uri(uri, "financialInstitution", attributes)
12
+ update_by_uri(uri: uri, resource_type: "financialInstitution", attributes: attributes, idempotency_key: idempotency_key)
13
13
  end
14
14
 
15
15
  def self.delete(id:)
16
16
  uri = Ibanity.api_schema["sandbox"]["financialInstitutions"].gsub("{financialInstitutionId}", id)
17
- destroy_by_uri(uri)
17
+ destroy_by_uri(uri: uri)
18
18
  end
19
19
  end
20
20
  end
@@ -1,13 +1,13 @@
1
1
  module Ibanity
2
2
  class SandboxTransaction < Ibanity::BaseResource
3
- def self.create(sandbox_user_id:, financial_institution_id:, sandbox_account_id:, **attributes)
3
+ def self.create(sandbox_user_id:, financial_institution_id:, sandbox_account_id:, idempotency_key: nil, **attributes)
4
4
  path = Ibanity.api_schema["sandbox"]["transactions"]
5
5
  .gsub("{financialInstitutionId}", financial_institution_id)
6
6
  .gsub("{sandboxUserId}", sandbox_user_id)
7
7
  .gsub("{sandboxAccountId}", sandbox_account_id)
8
8
  .gsub("{sandboxTransactionId}", "")
9
9
  uri = Ibanity.client.build_uri(path)
10
- create_by_uri(uri, "sandboxTransaction", attributes)
10
+ create_by_uri(uri: uri, resource_type: "sandboxTransaction", attributes: attributes, idempotency_key: idempotency_key)
11
11
  end
12
12
 
13
13
  def self.list(sandbox_user_id:, financial_institution_id:, sandbox_account_id:, **query_params)
@@ -17,7 +17,7 @@ module Ibanity
17
17
  .gsub("{sandboxAccountId}", sandbox_account_id)
18
18
  .gsub("{sandboxTransactionId}", "")
19
19
  uri = Ibanity.client.build_uri(path)
20
- list_by_uri(uri, query_params)
20
+ list_by_uri(uri: uri, query_params: query_params)
21
21
  end
22
22
 
23
23
  def self.find(id:, sandbox_user_id:, financial_institution_id:, sandbox_account_id:)
@@ -27,7 +27,7 @@ module Ibanity
27
27
  .gsub("{sandboxAccountId}", sandbox_account_id)
28
28
  .gsub("{sandboxTransactionId}", id)
29
29
  uri = Ibanity.client.build_uri(path)
30
- find_by_uri(uri)
30
+ find_by_uri(uri: uri)
31
31
  end
32
32
 
33
33
  def self.delete(id:, sandbox_user_id:, financial_institution_id:, sandbox_account_id:)
@@ -37,7 +37,7 @@ module Ibanity
37
37
  .gsub("{sandboxAccountId}", sandbox_account_id)
38
38
  .gsub("{sandboxTransactionId}", id)
39
39
  uri = Ibanity.client.build_uri(path)
40
- destroy_by_uri(uri)
40
+ destroy_by_uri(uri: uri)
41
41
  end
42
42
  end
43
43
  end
@@ -1,30 +1,30 @@
1
1
  module Ibanity
2
2
  class SandboxUser < Ibanity::BaseResource
3
- def self.create(attributes)
3
+ def self.create(idempotency_key: nil, **attributes)
4
4
  path = Ibanity.api_schema["sandbox"]["users"].gsub("{sandboxUserId}", "")
5
5
  uri = Ibanity.client.build_uri(path)
6
- create_by_uri(uri, "sandboxUser", attributes)
6
+ create_by_uri(uri: uri, resource_type: "sandboxUser", attributes: attributes, idempotency_key: idempotency_key)
7
7
  end
8
8
 
9
9
  def self.list(**query_params)
10
10
  uri = Ibanity.api_schema["sandbox"]["users"].sub("{sandboxUserId}", "")
11
- list_by_uri(uri, query_params)
11
+ list_by_uri(uri: uri, query_params: query_params)
12
12
  end
13
13
 
14
14
  def self.find(id:)
15
15
  uri = Ibanity.api_schema["sandbox"]["users"].sub("{sandboxUserId}", id)
16
- find_by_uri(uri)
16
+ find_by_uri(uri: uri)
17
17
  end
18
18
 
19
- def self.update(id:, **attributes)
19
+ def self.update(id:, idempotency_key: nil, **attributes)
20
20
  path = Ibanity.api_schema["sandbox"]["users"].sub("{sandboxUserId}", id)
21
21
  uri = Ibanity.client.build_uri(path)
22
- update_by_uri(uri, "sandboxUser", attributes)
22
+ update_by_uri(uri: uri, resource_type: "sandboxUser", attributes: attributes, idempotency_key: idempotency_key)
23
23
  end
24
24
 
25
25
  def self.delete(id:)
26
26
  uri = Ibanity.api_schema["sandbox"]["users"].sub("{sandboxUserId}", id)
27
- destroy_by_uri(uri)
27
+ destroy_by_uri(uri: uri)
28
28
  end
29
29
  end
30
30
  end
@@ -5,7 +5,7 @@ module Ibanity
5
5
  .sub("{financialInstitutionId}", financial_institution_id)
6
6
  .sub("{accountId}", account_id)
7
7
  .sub("{transactionId}", "")
8
- list_by_uri(uri, query_params, customer_access_token)
8
+ list_by_uri(uri: uri, query_params: query_params, customer_access_token: customer_access_token)
9
9
  end
10
10
 
11
11
  def self.find(id:, financial_institution_id:, account_id:, customer_access_token:)
@@ -13,7 +13,7 @@ module Ibanity
13
13
  .sub("{financialInstitutionId}", financial_institution_id)
14
14
  .sub("{accountId}", account_id)
15
15
  .sub("{transactionId}", id)
16
- find_by_uri(uri, customer_access_token)
16
+ find_by_uri(uri: uri, customer_access_token: customer_access_token)
17
17
  end
18
18
  end
19
19
  end
@@ -1,29 +1,38 @@
1
1
  module Ibanity
2
2
  class Client
3
3
 
4
- attr_reader :base_uri
4
+ attr_reader :base_uri, :signature_certificate, :signature_key
5
5
 
6
- def initialize(certificate:, key:, key_passphrase:, api_scheme: "https", api_host: "api.ibanity.com", api_port: "443", ssl_ca_file: nil)
7
- @certificate = OpenSSL::X509::Certificate.new(certificate)
8
- @key = OpenSSL::PKey::RSA.new(key, key_passphrase)
9
- @base_uri = "#{api_scheme}://#{api_host}:#{api_port}"
10
- @ssl_ca_file = ssl_ca_file
6
+ def initialize(certificate:, key:, key_passphrase:, signature_certificate: nil, signature_certificate_id: nil, signature_key: nil, signature_key_passphrase: nil, api_scheme: "https", api_host: "api.ibanity.com", api_port: "443", ssl_ca_file: nil)
7
+ @certificate = OpenSSL::X509::Certificate.new(certificate)
8
+ @key = OpenSSL::PKey::RSA.new(key, key_passphrase)
9
+ if signature_certificate
10
+ @signature_certificate = OpenSSL::X509::Certificate.new(signature_certificate)
11
+ @signature_certificate_id = signature_certificate_id
12
+ @signature_key = OpenSSL::PKey::RSA.new(signature_key, signature_key_passphrase)
13
+ end
14
+ @base_uri = "#{api_scheme}://#{api_host}:#{api_port}"
15
+ @ssl_ca_file = ssl_ca_file
11
16
  end
12
17
 
13
- def get(uri, query_params = {}, customer_access_token = nil)
14
- execute(:get, uri, build_headers(customer_access_token), query_params, nil)
18
+ def get(uri:, query_params: {}, customer_access_token: nil)
19
+ headers = build_headers(customer_access_token)
20
+ execute(method: :get, uri: uri, headers: headers, query_params: query_params)
15
21
  end
16
22
 
17
- def post(uri, payload, query_params = {}, customer_access_token = nil)
18
- execute(:post, uri, build_headers(customer_access_token), query_params, payload)
23
+ def post(uri:, payload:, query_params: {}, customer_access_token: nil, idempotency_key: nil)
24
+ headers = build_headers(customer_access_token, idempotency_key)
25
+ execute(method: :post, uri: uri, headers: headers, query_params: query_params, payload: payload)
19
26
  end
20
27
 
21
- def patch(uri, payload, query_params = {}, customer_access_token = nil)
22
- execute(:patch, uri, build_headers(customer_access_token), query_params, payload)
28
+ def patch(uri:, payload:, query_params: {}, customer_access_token: nil, idempotency_key: nil)
29
+ headers = build_headers(customer_access_token, idempotency_key)
30
+ execute(method: :patch, uri: uri, headers: headers, query_params: query_params, payload: payload)
23
31
  end
24
32
 
25
- def delete(uri, query_params = {}, customer_access_token = nil)
26
- execute(:delete, uri, build_headers(customer_access_token), query_params)
33
+ def delete(uri:, query_params: {}, customer_access_token: nil)
34
+ headers = build_headers(customer_access_token)
35
+ execute(method: :delete, uri: uri, headers: headers, query_params: query_params)
27
36
  end
28
37
 
29
38
  def build_uri(path)
@@ -32,7 +41,20 @@ module Ibanity
32
41
 
33
42
  private
34
43
 
35
- def execute(method, uri, headers, query_params = {}, payload = nil)
44
+ def execute(method:, uri:, headers:, query_params: {}, payload: nil, idempotency_key: nil)
45
+ if @signature_certificate
46
+ signature = Ibanity::HttpSignature.new(
47
+ certificate: @signature_certificate,
48
+ certificate_id: @signature_certificate_id,
49
+ key: @signature_key,
50
+ method: method,
51
+ uri: uri,
52
+ query_params: query_params,
53
+ headers: headers,
54
+ payload: payload
55
+ )
56
+ headers.merge!(signature.signature_headers)
57
+ end
36
58
  query = {
37
59
  method: method,
38
60
  url: uri,
@@ -53,12 +75,14 @@ module Ibanity
53
75
  JSON.parse(raw_response)
54
76
  end
55
77
 
56
- def build_headers(customer_access_token = nil)
57
- {
78
+ def build_headers(customer_access_token = nil, idempotency_key = nil)
79
+ headers = {
58
80
  content_type: :json,
59
81
  accept: :json,
60
- authorization: customer_access_token.nil? ? nil : "Bearer #{customer_access_token}"
61
82
  }
83
+ headers["Authorization"] = "Bearer #{customer_access_token}" unless customer_access_token.nil?
84
+ headers["Ibanity-Idempotency-Key"] = idempotency_key unless idempotency_key.nil?
85
+ headers
62
86
  end
63
87
  end
64
88
  end
data/lib/ibanity/error.rb CHANGED
@@ -7,13 +7,17 @@ module Ibanity
7
7
  end
8
8
 
9
9
  def to_s
10
- @errors.map do |error|
11
- if error["attribute"]
12
- "* #{error["code"]}: '#{error["attribute"]}' #{error["message"]}"
13
- else
14
- "* #{error["code"]}: #{error["message"]}"
15
- end
16
- end.join("\n")
10
+ if @errors && @errors.size > 0
11
+ @errors.map do |error|
12
+ if error["attribute"]
13
+ "* #{error["code"]}: '#{error["attribute"]}' #{error["message"]}"
14
+ else
15
+ "* #{error["code"]}: #{error["message"]}"
16
+ end
17
+ end.join("\n")
18
+ else
19
+ super
20
+ end
17
21
  end
18
22
  end
19
23
  end
@@ -0,0 +1,87 @@
1
+ module Ibanity
2
+ class HttpSignature
3
+ def initialize(certificate:, certificate_id:, key:, method:, uri:, query_params:, headers:, payload:)
4
+ @certificate = certificate
5
+ @certificate_id = certificate_id
6
+ @key = key
7
+ @method = method
8
+ @uri = URI(uri)
9
+ @headers = headers
10
+ @payload = payload
11
+ @query_params = query_params
12
+ end
13
+
14
+ def payload_digest
15
+ digest = OpenSSL::Digest::SHA512.new
16
+ string_payload = @payload.nil? ? "" : @payload.to_json
17
+ digest.update(string_payload)
18
+ base64 = Base64.urlsafe_encode64(digest.digest)
19
+ "SHA-512=#{base64}"
20
+ end
21
+
22
+ def signature_algorithm
23
+ @certificate.signature_algorithm.match("sha256") ? "rsa-sha256" : "rsa-sha512"
24
+ end
25
+
26
+ def headers_to_sign
27
+ result = ["(request-target)", "host", "digest", "date"]
28
+ result << "authorization" unless @headers["Authorization"].nil?
29
+ @headers.keys.each do |header|
30
+ result << header.to_s.downcase if header.to_s.match(/ibanity/i)
31
+ end
32
+ result
33
+ end
34
+
35
+ def request_target
36
+ @uri.query = URI.encode_www_form(URI.decode_www_form(@uri.query.to_s).concat(@query_params.to_a)) if @query_params&.keys&.any?
37
+ "#{@method} #{@uri.request_uri}"
38
+ end
39
+
40
+ def base64_signature
41
+ digest = signature_algorithm == "rsa-sha256" ? OpenSSL::Digest::SHA256.new : OpenSSL::Digest::SHA512.new
42
+ signature = @key.sign(digest, signing_string)
43
+ Base64.urlsafe_encode64(signature)
44
+ end
45
+
46
+ def host
47
+ @uri.host
48
+ end
49
+
50
+ def date
51
+ @date ||= Time.now.utc.iso8601
52
+ end
53
+
54
+ def signing_string
55
+ result = []
56
+ headers_to_sign.each do |header_to_sign|
57
+ value = header_value(header_to_sign)
58
+ result << "#{header_to_sign}: #{value}"
59
+ end
60
+ result.join("\n")
61
+ end
62
+
63
+ def header_value(header)
64
+ case header
65
+ when "(request-target)"
66
+ request_target
67
+ when "host"
68
+ host
69
+ when "digest"
70
+ payload_digest
71
+ when "date"
72
+ date
73
+ else
74
+ camelized_header = header.split("-").collect(&:capitalize).join("-")
75
+ @headers[camelized_header]
76
+ end
77
+ end
78
+
79
+ def signature_headers
80
+ {
81
+ "Date" => date,
82
+ "Digest" => payload_digest,
83
+ "Signature" => "keyId=\"#{@certificate_id}\" algorithm=\"#{signature_algorithm}\" headers=\"#{headers_to_sign.join(" ")}\" signature=\"#{base64_signature}\""
84
+ }
85
+ end
86
+ end
87
+ end
@@ -1,3 +1,3 @@
1
1
  module Ibanity
2
- VERSION = "0.2"
2
+ VERSION = "0.3"
3
3
  end
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: '0.2'
4
+ version: '0.3'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ibanity
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-03-12 00:00:00.000000000 Z
11
+ date: 2018-03-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rest-client
@@ -80,6 +80,7 @@ files:
80
80
  - lib/ibanity/api/transaction.rb
81
81
  - lib/ibanity/client.rb
82
82
  - lib/ibanity/error.rb
83
+ - lib/ibanity/http_signature.rb
83
84
  - lib/ibanity/util.rb
84
85
  - lib/ibanity/version.rb
85
86
  homepage: https://documentation.ibanity.com/api/ruby