bunq-client 0.1.1 → 0.1.2

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
  SHA1:
3
- metadata.gz: 86efef959814c2a9cffd67b0f7be584824f3a9c2
4
- data.tar.gz: ab09a13ff2ea0c56c06b6c97ca654ef81603df69
3
+ metadata.gz: 22487972e1aebeb56b45b8781968b99da449bc9a
4
+ data.tar.gz: 2f1b2e7500ae78bf18a066d45b751e38cf56fbc8
5
5
  SHA512:
6
- metadata.gz: 48c4c7a30ad2597e9248c26a6acf2db12935464611c104e0a91831580d4c9c902aba7b20fd24d11691bdee2de89e3b920fd8bdafc86080ce0ad35ad108b13162
7
- data.tar.gz: 6e4bc14013bdaebaa01c4fc0c1db459ad09ed598ae63ecb1e4b4d667f6532a7d0311af0e83015f7c8eff4d7720f16287632481c38f1e98595582fbb14a956570
6
+ metadata.gz: 00f65e325aa9b546c8f1124c6debf626b07d21a546be70f8af5f901bcb8d74bcdff85b067775ed17c2dd103502d422499201904d5f2fc1673780a363f42546e4
7
+ data.tar.gz: 29544093b45a56c096c45599263fcd29fccfd124a5e2a52515bc4d3eb8434ed0b59f5bba687d1f45ff63f88c68cae2768f8c727057a1ecc66f56df2f1503fb86
@@ -1,19 +1,4 @@
1
1
  require 'rest-client'
2
2
  require_relative './client'
3
3
  require_relative './signature'
4
- require_relative 'paginated'
5
-
6
- RestClient.add_before_execution_proc do |req, params|
7
- next unless params[:url].include?('bunq.com')
8
- req['X-Bunq-Client-Request-Id'] = params[:headers][:'X-Bunq-Client-Request-Id'] = SecureRandom.uuid
9
-
10
- # can't sign the creation of an installation
11
- # see https://doc.bunq.com/api/1/call/installation/method/post
12
- next if params[:url].end_with?('/installation') && req.method == 'POST'
13
- req['X-Bunq-Client-Signature'] = Bunq.signature.create(
14
- params[:method].upcase,
15
- req.path,
16
- params[:headers],
17
- params[:payload]
18
- )
19
- end
4
+ require_relative './paginated'
@@ -6,6 +6,7 @@ require 'json'
6
6
  module Bunq
7
7
  class Resource
8
8
  attr_reader :resource
9
+ NO_PARAMS = {}
9
10
 
10
11
  def initialize(client, path)
11
12
  @client = client
@@ -24,25 +25,28 @@ module Bunq
24
25
  end
25
26
 
26
27
  def get(params = {}, &block)
27
- @resource.get(params: params) do |response, request, result|
28
+ @resource.get({params: params}.merge(bunq_request_headers('GET', params))) do |response, request, result|
28
29
  verify_and_handle_response(response, request, result, &block)
29
30
  end
30
31
  end
31
32
 
33
+
32
34
  def post(payload, skip_verify = false, &block)
35
+ json = JSON.generate(payload)
33
36
  if skip_verify
34
- @resource.post(JSON.generate(payload)) do |response, request, result|
37
+ @resource.post(json, bunq_request_headers('POST', NO_PARAMS, json)) do |response, request, result|
35
38
  handle_response(response, request, result, &block)
36
39
  end
37
40
  else
38
- @resource.post(JSON.generate(payload)) do |response, request, result|
41
+ @resource.post(json, bunq_request_headers('POST', NO_PARAMS, json)) do |response, request, result|
39
42
  verify_and_handle_response(response, request, result, &block)
40
43
  end
41
44
  end
42
45
  end
43
46
 
44
47
  def put(payload, &block)
45
- @resource.put(JSON.generate(payload)) do |response, request, result|
48
+ json = JSON.generate(payload)
49
+ @resource.put(json, bunq_request_headers('PUT', NO_PARAMS, json)) do |response, request, result|
46
50
  verify_and_handle_response(response, request, result, &block)
47
51
  end
48
52
  end
@@ -63,6 +67,27 @@ module Bunq
63
67
 
64
68
  attr_reader :client
65
69
 
70
+ def bunq_request_headers(verb, params, payload = nil)
71
+ request_id_header = {'X-Bunq-Client-Request-Id' => SecureRandom.uuid}
72
+
73
+ return request_id_header if @path.end_with?('/installation') && verb == 'POST'
74
+ request_id_header.merge('X-Bunq-Client-Signature' => sign_request(verb, params, request_id_header, payload))
75
+ end
76
+
77
+ def sign_request(verb, params, request_id_header, payload = nil)
78
+ Bunq.signature.create(
79
+ verb,
80
+ encode_params(@path, params),
81
+ @resource.headers.merge(request_id_header),
82
+ payload
83
+ )
84
+ end
85
+
86
+ def encode_params(path, params)
87
+ return path if params.empty?
88
+ "#{path}?#{URI.escape(params.collect { |k, v| "#{k}=#{v}" }.join('&'))}"
89
+ end
90
+
66
91
  def verify_and_handle_response(response, request, result, &block)
67
92
  Bunq.signature.verify!(response) unless client.configuration.disable_response_signature_verification
68
93
  handle_response(response, request, result, &block)
@@ -1,7 +1,6 @@
1
1
  require_relative 'unexpected_response'
2
2
 
3
3
  module Bunq
4
-
5
4
  class Signature
6
5
  # headers in raw_headers hash in rest client are all lower case
7
6
  BUNQ_HEADER_PREFIX = 'X-Bunq-'.downcase
@@ -19,7 +18,11 @@ module Bunq
19
18
  end
20
19
 
21
20
  def create(verb, path, headers, body)
22
- signature = private_key.sign(digest, signable_input(verb, path, headers.select { |header_name, _| signable_header?(header_name) }, body))
21
+ signature = private_key.sign(
22
+ digest,
23
+ signable_input(verb, path, headers.select { |header_name, _| signable_header?(header_name) }, body)
24
+ )
25
+
23
26
  Base64.strict_encode64(signature)
24
27
  end
25
28
 
@@ -43,9 +46,10 @@ module Bunq
43
46
  end
44
47
 
45
48
  def signable_input(verb, path, headers, body)
49
+ sortable_headers = Hash[headers.collect{ |k,v| [k.to_s, v] }]
46
50
  head = [
47
51
  [verb, path].join(' '),
48
- headers.sort.to_h.map { |k,v| "#{k}: #{v}" }.join("\n")
52
+ sortable_headers.sort.to_h.map { |k,v| "#{k}: #{v}" }.join("\n")
49
53
  ].join("\n")
50
54
  "#{head}\n\n#{body}"
51
55
  end
@@ -1,3 +1,3 @@
1
1
  module Bunq
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.2"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bunq-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lars Vonk
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: exe
12
12
  cert_chain: []
13
- date: 2017-04-28 00:00:00.000000000 Z
13
+ date: 2017-05-19 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rest-client