bunq-client 0.1.1 → 0.1.2

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