square.rb 31.0.0.20230816 → 32.0.0.20230925
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/lib/square/api/base_api.rb +1 -1
- data/lib/square/api/bookings_api.rb +22 -0
- data/lib/square/api/checkout_api.rb +0 -3
- data/lib/square/api/devices_api.rb +56 -0
- data/lib/square/api/o_auth_api.rb +1 -4
- data/lib/square/client.rb +2 -2
- data/lib/square/configuration.rb +1 -1
- data/lib/square/utilities/webhooks_helper.rb +23 -0
- data/lib/square.rb +1 -0
- data/test/webhooks/test_webhooks_helper.rb +136 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6c7adca646aa24aa7a9afa7c6acd8d49e534a854fd134f6442f315015a500d77
|
4
|
+
data.tar.gz: 2ea27cf68b466c3987d01685efd65c4343c7b77c3297d5b4fc113fbe39b84cf0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 550f0b2966ced843d9300cb3bb2a9fc65d033297aa1e5f04fd3777da04703641580c6f361419477ae97c32e487bf825d4480612cf52d6a88e58056bd8fc7186b
|
7
|
+
data.tar.gz: c4f0bdfe70c66d1853a92d3eef3d314ecd2246519035039f57b44ce44e184d6fe03f8aebdb3f4a7274d337f14f2e7d8c95590a1edecefca81f7b6411b925219c
|
data/lib/square/api/base_api.rb
CHANGED
@@ -4,7 +4,7 @@ module Square
|
|
4
4
|
attr_accessor :config, :http_call_back
|
5
5
|
|
6
6
|
def self.user_agent
|
7
|
-
'Square-Ruby-SDK/
|
7
|
+
'Square-Ruby-SDK/32.0.0.20230925 ({api-version}) {engine}/{engine-version} ({os-info}) {detail}'
|
8
8
|
end
|
9
9
|
|
10
10
|
def self.user_agent_parameters
|
@@ -191,6 +191,28 @@ module Square
|
|
191
191
|
.execute
|
192
192
|
end
|
193
193
|
|
194
|
+
# Retrieves one or more team members' booking profiles.
|
195
|
+
# @param [BulkRetrieveTeamMemberBookingProfilesRequest] body Required
|
196
|
+
# parameter: An object containing the fields to POST for the request. See
|
197
|
+
# the corresponding object definition for field details.
|
198
|
+
# @return [BulkRetrieveTeamMemberBookingProfilesResponse Hash] response from the API call
|
199
|
+
def bulk_retrieve_team_member_booking_profiles(body:)
|
200
|
+
new_api_call_builder
|
201
|
+
.request(new_request_builder(HttpMethodEnum::POST,
|
202
|
+
'/v2/bookings/team-member-booking-profiles/bulk-retrieve',
|
203
|
+
'default')
|
204
|
+
.header_param(new_parameter('application/json', key: 'Content-Type'))
|
205
|
+
.body_param(new_parameter(body))
|
206
|
+
.header_param(new_parameter('application/json', key: 'accept'))
|
207
|
+
.body_serializer(proc do |param| param.to_json unless param.nil? end)
|
208
|
+
.auth(Single.new('global')))
|
209
|
+
.response(new_response_handler
|
210
|
+
.deserializer(APIHelper.method(:json_deserialize))
|
211
|
+
.is_api_response(true)
|
212
|
+
.convertor(ApiResponse.method(:create)))
|
213
|
+
.execute
|
214
|
+
end
|
215
|
+
|
194
216
|
# Retrieves a team member's booking profile.
|
195
217
|
# @param [String] team_member_id Required parameter: The ID of the team
|
196
218
|
# member to retrieve.
|
@@ -8,9 +8,6 @@ module Square
|
|
8
8
|
# For more information, see [Checkout API
|
9
9
|
# highlights](https://developer.squareup.com/docs/checkout-api#checkout-api-
|
10
10
|
# highlights).
|
11
|
-
# We recommend that you use the
|
12
|
-
# new [CreatePaymentLink](api-endpoint:Checkout-CreatePaymentLink)
|
13
|
-
# endpoint in place of this previously released endpoint.
|
14
11
|
# @param [String] location_id Required parameter: The ID of the business
|
15
12
|
# location to associate the checkout with.
|
16
13
|
# @param [CreateCheckoutRequest] body Required parameter: An object
|
@@ -1,6 +1,42 @@
|
|
1
1
|
module Square
|
2
2
|
# DevicesApi
|
3
3
|
class DevicesApi < BaseApi
|
4
|
+
# List devices associated with the merchant. Currently, only Terminal API
|
5
|
+
# devices are supported.
|
6
|
+
# @param [String] cursor Optional parameter: A pagination cursor returned by
|
7
|
+
# a previous call to this endpoint. Provide this cursor to retrieve the next
|
8
|
+
# set of results for the original query. See
|
9
|
+
# [Pagination](https://developer.squareup.com/docs/build-basics/common-api-p
|
10
|
+
# atterns/pagination) for more information.
|
11
|
+
# @param [SortOrder] sort_order Optional parameter: The order in which
|
12
|
+
# results are listed. - `ASC` - Oldest to newest. - `DESC` - Newest to
|
13
|
+
# oldest (default).
|
14
|
+
# @param [Integer] limit Optional parameter: The number of results to return
|
15
|
+
# in a single page.
|
16
|
+
# @param [String] location_id Optional parameter: If present, only returns
|
17
|
+
# devices at the target location.
|
18
|
+
# @return [ListDevicesResponse Hash] response from the API call
|
19
|
+
def list_devices(cursor: nil,
|
20
|
+
sort_order: nil,
|
21
|
+
limit: nil,
|
22
|
+
location_id: nil)
|
23
|
+
new_api_call_builder
|
24
|
+
.request(new_request_builder(HttpMethodEnum::GET,
|
25
|
+
'/v2/devices',
|
26
|
+
'default')
|
27
|
+
.query_param(new_parameter(cursor, key: 'cursor'))
|
28
|
+
.query_param(new_parameter(sort_order, key: 'sort_order'))
|
29
|
+
.query_param(new_parameter(limit, key: 'limit'))
|
30
|
+
.query_param(new_parameter(location_id, key: 'location_id'))
|
31
|
+
.header_param(new_parameter('application/json', key: 'accept'))
|
32
|
+
.auth(Single.new('global')))
|
33
|
+
.response(new_response_handler
|
34
|
+
.deserializer(APIHelper.method(:json_deserialize))
|
35
|
+
.is_api_response(true)
|
36
|
+
.convertor(ApiResponse.method(:create)))
|
37
|
+
.execute
|
38
|
+
end
|
39
|
+
|
4
40
|
# Lists all DeviceCodes associated with the merchant.
|
5
41
|
# @param [String] cursor Optional parameter: A pagination cursor returned by
|
6
42
|
# a previous call to this endpoint. Provide this to retrieve the next set of
|
@@ -81,5 +117,25 @@ module Square
|
|
81
117
|
.convertor(ApiResponse.method(:create)))
|
82
118
|
.execute
|
83
119
|
end
|
120
|
+
|
121
|
+
# Retrieves Device with the associated `device_id`.
|
122
|
+
# @param [String] device_id Required parameter: The unique ID for the
|
123
|
+
# desired `Device`.
|
124
|
+
# @return [GetDeviceResponse Hash] response from the API call
|
125
|
+
def get_device(device_id:)
|
126
|
+
new_api_call_builder
|
127
|
+
.request(new_request_builder(HttpMethodEnum::GET,
|
128
|
+
'/v2/devices/{device_id}',
|
129
|
+
'default')
|
130
|
+
.template_param(new_parameter(device_id, key: 'device_id')
|
131
|
+
.should_encode(true))
|
132
|
+
.header_param(new_parameter('application/json', key: 'accept'))
|
133
|
+
.auth(Single.new('global')))
|
134
|
+
.response(new_response_handler
|
135
|
+
.deserializer(APIHelper.method(:json_deserialize))
|
136
|
+
.is_api_response(true)
|
137
|
+
.convertor(ApiResponse.method(:create)))
|
138
|
+
.execute
|
139
|
+
end
|
84
140
|
end
|
85
141
|
end
|
@@ -56,10 +56,7 @@ module Square
|
|
56
56
|
# Revokes an access token generated with the OAuth flow.
|
57
57
|
# If an account has more than one OAuth access token for your application,
|
58
58
|
# this
|
59
|
-
# endpoint revokes all of them, regardless of which token you specify.
|
60
|
-
# an
|
61
|
-
# OAuth access token is revoked, all of the active subscriptions associated
|
62
|
-
# with that OAuth token are canceled immediately.
|
59
|
+
# endpoint revokes all of them, regardless of which token you specify.
|
63
60
|
# __Important:__ The `Authorization` header for this endpoint must have the
|
64
61
|
# following format:
|
65
62
|
# ```
|
data/lib/square/client.rb
CHANGED
@@ -4,7 +4,7 @@ module Square
|
|
4
4
|
attr_reader :config, :auth_managers
|
5
5
|
|
6
6
|
def sdk_version
|
7
|
-
'
|
7
|
+
'32.0.0.20230925'
|
8
8
|
end
|
9
9
|
|
10
10
|
def square_version
|
@@ -267,7 +267,7 @@ module Square
|
|
267
267
|
retry_methods: %i[get put], http_callback: nil,
|
268
268
|
environment: 'production',
|
269
269
|
custom_url: 'https://connect.squareup.com', access_token: '',
|
270
|
-
square_version: '2023-
|
270
|
+
square_version: '2023-09-25', user_agent_detail: '',
|
271
271
|
additional_headers: {}, config: nil)
|
272
272
|
@config = if config.nil?
|
273
273
|
Configuration.new(connection: connection, adapter: adapter,
|
data/lib/square/configuration.rb
CHANGED
@@ -19,7 +19,7 @@ module Square
|
|
19
19
|
retry_methods: %i[get put], http_callback: nil,
|
20
20
|
environment: 'production',
|
21
21
|
custom_url: 'https://connect.squareup.com', access_token: '',
|
22
|
-
square_version: '2023-
|
22
|
+
square_version: '2023-09-25', user_agent_detail: '',
|
23
23
|
additional_headers: {})
|
24
24
|
|
25
25
|
super connection: connection, adapter: adapter, timeout: timeout,
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'openssl'
|
2
|
+
require 'base64'
|
3
|
+
|
4
|
+
module Square
|
5
|
+
class WebhooksHelper
|
6
|
+
def self.is_valid_webhook_event_signature(request_body, signature_header, signature_key, notification_url)
|
7
|
+
return false if request_body.nil?
|
8
|
+
raise 'signature_key is null or empty' if signature_key.nil? || signature_key.empty?
|
9
|
+
raise 'notification_url is null or empty' if notification_url.nil? || notification_url.empty?
|
10
|
+
|
11
|
+
# Perform UTF-8 encoding to bytes
|
12
|
+
payload_bytes = "#{notification_url}#{request_body}".force_encoding('utf-8')
|
13
|
+
signature_key_bytes = signature_key.force_encoding('utf-8')
|
14
|
+
|
15
|
+
# Compute the hash value
|
16
|
+
hmac = OpenSSL::HMAC.digest('sha256', signature_key_bytes, payload_bytes)
|
17
|
+
|
18
|
+
# Compare the computed hash vs the value in the signature header
|
19
|
+
hash_base64 = Base64.strict_encode64(hmac)
|
20
|
+
hash_base64 == signature_header
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/square.rb
CHANGED
@@ -0,0 +1,136 @@
|
|
1
|
+
require_relative '../../lib/square/utilities/webhooks_helper.rb'
|
2
|
+
require 'minitest/autorun'
|
3
|
+
require 'minitest/hell'
|
4
|
+
require 'minitest/pride'
|
5
|
+
require 'minitest/proveit'
|
6
|
+
require 'logger'
|
7
|
+
|
8
|
+
class WebhooksHelperTest < Minitest::Test
|
9
|
+
# Called only once for the class before any test has executed
|
10
|
+
def setup
|
11
|
+
@logger = Logger.new(STDOUT) # Create a Logger instance for logging
|
12
|
+
@logger.level = Logger::INFO # Set the log level to INFO or any desired level
|
13
|
+
@request_body = '{"merchant_id":"MLEFBHHSJGVHD","type":"webhooks.test_notification","event_id":"ac3ac95b-f97d-458c-a6e6-18981597e05f","created_at":"2022-07-13T20:30:59.037339943Z","data":{"type":"webhooks","id":"bc368e64-01aa-407e-b46e-3231809b1129"}}'
|
14
|
+
@signature_header = 'GF4YkrJgGBDZ9NIYbNXBnMzqb2HoL4RW/S6vkZ9/2N4='
|
15
|
+
@signature_key = 'Ibxx_5AKakO-3qeNVR61Dw'
|
16
|
+
@notification_url = 'https://webhook.site/679a4f3a-dcfa-49ee-bac5-9d0edad886b9'
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_signature_validation_pass
|
20
|
+
@logger.info('Running test_signature_validation_pass') # Log a message
|
21
|
+
is_valid = Square::WebhooksHelper.is_valid_webhook_event_signature(
|
22
|
+
@request_body,
|
23
|
+
@signature_header,
|
24
|
+
@signature_key,
|
25
|
+
@notification_url
|
26
|
+
)
|
27
|
+
assert_equal true, is_valid
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_signature_validation_fails_on_notification_url_mismatch
|
31
|
+
@logger.info('Running test_signature_validation_fails_on_notification_url_mismatch') # Log a message
|
32
|
+
is_valid = Square::WebhooksHelper.is_valid_webhook_event_signature(
|
33
|
+
@request_body,
|
34
|
+
@signature_header,
|
35
|
+
@signature_key,
|
36
|
+
'https://webhook.site/79a4f3a-dcfa-49ee-bac5-9d0edad886b9'
|
37
|
+
)
|
38
|
+
assert_equal false, is_valid
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_signature_validation_fails_on_invalid_signature_key
|
42
|
+
@logger.info('Running test_signature_validation_fails_on_invalid_signature_key') # Log a message
|
43
|
+
is_valid = Square::WebhooksHelper.is_valid_webhook_event_signature(
|
44
|
+
@request_body,
|
45
|
+
@signature_header,
|
46
|
+
'MCmhFRxGX82xMwg5FsaoQA',
|
47
|
+
@notification_url
|
48
|
+
)
|
49
|
+
assert_equal false, is_valid
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_signature_validation_fails_on_invalid_signature_header
|
53
|
+
is_valid = Square::WebhooksHelper.is_valid_webhook_event_signature(
|
54
|
+
@request_body,
|
55
|
+
'1z2n3DEJJiUPKcPzQo1ftvbxGdw=',
|
56
|
+
@signature_key,
|
57
|
+
@notification_url
|
58
|
+
)
|
59
|
+
assert_equal false, is_valid
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_signature_validation_fails_on_request_body_mismatch
|
63
|
+
request_body = '{"merchant_id":"MLEFBHHSJGVHD","type":"webhooks.test_notification","event_id":"ac3ac95b-f97d-458c-a6e6-18981597e05f","created_at":"2022-06-13T20:30:59.037339943Z","data":{"type":"webhooks","id":"bc368e64-01aa-407e-b46e-3231809b1129"}}'
|
64
|
+
is_valid = Square::WebhooksHelper.is_valid_webhook_event_signature(
|
65
|
+
request_body,
|
66
|
+
@signature_header,
|
67
|
+
@signature_key,
|
68
|
+
@notification_url
|
69
|
+
)
|
70
|
+
assert_equal false, is_valid
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_signature_validation_fails_on_request_body_formatted
|
74
|
+
request_body = '{
|
75
|
+
"merchant_id": "MLEFBHHSJGVHD",
|
76
|
+
"type": "webhooks.test_notification",
|
77
|
+
"event_id": "ac3ac95b-f97d-458c-a6e6-18981597e05f",
|
78
|
+
"created_at": "2022-07-13T20:30:59.037339943Z",
|
79
|
+
"data": {
|
80
|
+
"type": "webhooks",
|
81
|
+
"id": "bc368e64-01aa-407e-b46e-3231809b1129"
|
82
|
+
}
|
83
|
+
}'
|
84
|
+
is_valid = Square::WebhooksHelper.is_valid_webhook_event_signature(
|
85
|
+
request_body,
|
86
|
+
@signature_header,
|
87
|
+
@signature_key,
|
88
|
+
@notification_url
|
89
|
+
)
|
90
|
+
assert_equal false, is_valid
|
91
|
+
end
|
92
|
+
|
93
|
+
def test_throws_error_on_empty_signature_key
|
94
|
+
assert_raises(RuntimeError, 'signature_key is null or empty') do
|
95
|
+
Square::WebhooksHelper.is_valid_webhook_event_signature(
|
96
|
+
@request_body,
|
97
|
+
@signature_header,
|
98
|
+
'',
|
99
|
+
@notification_url
|
100
|
+
)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def test_throws_error_on_signature_key_not_configured
|
105
|
+
assert_raises(RuntimeError) do
|
106
|
+
Square::WebhooksHelper.is_valid_webhook_event_signature(
|
107
|
+
@request_body,
|
108
|
+
@signature_header,
|
109
|
+
nil,
|
110
|
+
@notification_url
|
111
|
+
)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def test_throws_error_on_empty_notification_url
|
116
|
+
assert_raises(RuntimeError, 'notification_url is null or empty') do
|
117
|
+
Square::WebhooksHelper.is_valid_webhook_event_signature(
|
118
|
+
@request_body,
|
119
|
+
@signature_header,
|
120
|
+
@signature_key,
|
121
|
+
''
|
122
|
+
)
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
def test_throws_error_on_notification_url_not_configured
|
127
|
+
assert_raises(RuntimeError) do
|
128
|
+
Square::WebhooksHelper.is_valid_webhook_event_signature(
|
129
|
+
@request_body,
|
130
|
+
@signature_header,
|
131
|
+
@signature_key,
|
132
|
+
nil
|
133
|
+
)
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: square.rb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 32.0.0.20230925
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Square Developer Platform
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-09-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: apimatic_core_interfaces
|
@@ -150,6 +150,7 @@ files:
|
|
150
150
|
- lib/square/http/http_response.rb
|
151
151
|
- lib/square/utilities/date_time_helper.rb
|
152
152
|
- lib/square/utilities/file_wrapper.rb
|
153
|
+
- lib/square/utilities/webhooks_helper.rb
|
153
154
|
- spec/user_journey_spec.rb
|
154
155
|
- test/api/api_test_base.rb
|
155
156
|
- test/api/test_catalog_api.rb
|
@@ -161,6 +162,7 @@ files:
|
|
161
162
|
- test/api/test_payments_api.rb
|
162
163
|
- test/api/test_refunds_api.rb
|
163
164
|
- test/http_response_catcher.rb
|
165
|
+
- test/webhooks/test_webhooks_helper.rb
|
164
166
|
homepage: ''
|
165
167
|
licenses:
|
166
168
|
- Apache-2.0
|