freeclimb 4.1.4 → 4.3.0

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
  SHA256:
3
- metadata.gz: f77b3a7bc85c35b3ecb49de7da3c9f4a931270e83b8b69b88e2c2c060e4c14e6
4
- data.tar.gz: 6b77f343b068a63cedf2ac8683b6b7d289f77b4d4aab08905c64162a2143bd0f
3
+ metadata.gz: 3fe5bf8c6790b57956fa74c9c4ca271e6647335b530451e5a0df169ca04ab698
4
+ data.tar.gz: e88e5d809bdc9a229a617a197bc2abf162540ed41d14382c4ff92f38a50bdfde
5
5
  SHA512:
6
- metadata.gz: e010f34f66a2f845c498171084b8be76fa3b19639c5a80f565290c992b2768edeb55f3b647243627a3fc14688d4906d76f489b61a36bcc68bd6c1990feae0ca2
7
- data.tar.gz: f587c50c621c047f405e09203bf8ba447fccc2e4b6c2c492e66211fedc457c2e624babd24ce0622058fbf1bbb814566ff9fdd1958c8554fc6b75fd32036994fd
6
+ metadata.gz: 1bc204e826ee90288418715a41d73fa3b5dd6913918758e3f7e81cf53f7a8c720eda653e0749e0be62c6687d7c57a63581693ba789d66817c062a4dab61fa0bd
7
+ data.tar.gz: 026c172225aa3d1345397ab4fbb909ff37a5fc533aee95e986f44b99a72ec3a8bc029adc225199353a67df462ffafd51d84847f8a245def11c8deb19b0bbbd3e
data/CHANGELOG.md CHANGED
@@ -9,11 +9,28 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
9
9
 
10
10
  None
11
11
 
12
+ <a name="4.3.0"></a>
13
+
14
+ ## [4.3.0] - 2023-04-27
15
+
16
+ ### Changed
17
+
18
+ - Introduce application ID filtering for list calls method
19
+
20
+ <a name="4.2.0"></a>
21
+
22
+ ## [4.2.0] - 2023-04-03
23
+
24
+ ### Added
25
+
26
+ - Introduce signing secret verification class (RequestVerifier) - https://docs.freeclimb.com/docs/validating-requests-from-freeclimb#how-to-verify-requests-manually
27
+
12
28
  <a name="4.1.4"></a>
13
29
 
14
30
  ## [4.1.4] - 2023-03-31
15
31
 
16
32
  ### Changed
33
+
17
34
  - PerclScript.to_json serialization fixed
18
35
 
19
36
  <a name="4.1.3"></a>
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- freeclimb (4.1.4)
4
+ freeclimb (4.3.0)
5
5
  typhoeus (~> 1.0, >= 1.0.1)
6
6
 
7
7
  GEM
data/README.md CHANGED
@@ -7,7 +7,7 @@ FreeClimb is a cloud-based application programming interface (API) that puts the
7
7
  This SDK is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project:
8
8
 
9
9
  - API version: 1.0.0
10
- - Package version: 4.1.4
10
+ - Package version: 4.3.0
11
11
  - Build package: org.openapitools.codegen.languages.RubyClientCodegen
12
12
  For more information, please visit [https://www.freeclimb.com/support/](https://www.freeclimb.com/support/)
13
13
 
@@ -15,7 +15,7 @@ For more information, please visit [https://www.freeclimb.com/support/](https://
15
15
 
16
16
  Add this to the Gemfile:
17
17
 
18
- gem 'freeclimb', '~> 4.1.4'
18
+ gem 'freeclimb', '~> 4.3.0'
19
19
 
20
20
  and run from your terminal
21
21
 
@@ -44,9 +44,9 @@ gem build freeclimb.gemspec
44
44
  Then either install the gem locally:
45
45
 
46
46
  ```shell
47
- gem install ./freeclimb-4.1.4.gem
47
+ gem install ./freeclimb-4.3.0.gem
48
48
  ```
49
- (for development, run `gem install --dev ./freeclimb-4.1.4.gem` to install the development dependencies)
49
+ (for development, run `gem install --dev ./freeclimb-4.3.0.gem` to install the development dependencies)
50
50
 
51
51
  ## Getting Started
52
52
 
@@ -286,6 +286,31 @@ Class | Method | HTTP request | Description
286
286
  - **Type**: HTTP basic authentication
287
287
 
288
288
 
289
+ <a name="documentation-for-verify-request-signature"></a>
290
+
291
+ ## Documentation for verifying request signature
292
+
293
+ - To verify the signature request, we will need to use the verifySignatureRequest method within the Request Verifier class
294
+
295
+ Freeclimb::RequestVerifier.verify_request_signature(requestBody, requestHeader, signingSecret, tolerance)
296
+
297
+ This is a method that you can call directly from the request verifier class, it will throw exceptions depending on whether all parts of the request signature is valid otherwise it will throw a specific error message depending on which request signature part is causing issues
298
+
299
+ This method requires a requestBody of type string, a requestHeader of type string, a signingSecret of type string, and a tolerance value of type int
300
+
301
+ Example code down below
302
+
303
+ ```ruby
304
+ class RequestVerifier
305
+ def verify_request_signature_example()
306
+ request_header = "t=1679944186,v1=c3957749baf61df4b1506802579cc69a74c77a1ae21447b930e5a704f9ec4120,v1=1ba18712726898fbbe48cd862dd096a709f7ad761a5bab14bda9ac24d963a6a8"
307
+ signing_secret = "sigsec_ead6d3b6904196c60835d039e91b3341c77a7793"
308
+ tolerance = (5 * 60)
309
+ request_body = "{\"accountId\":\"AC1334ffb694cd8d969f51cddf5f7c9b478546d50c\",\"callId\":\"CAccb0b00506553cda09b51c5477f672a49e0b2213\",\"callStatus\":\"ringing\",\"conferenceId\":null,\"direction\":\"inbound\",\"from\":\"+13121000109\",\"parentCallId\":null,\"queueId\":null,\"requestType\":\"inboundCall\",\"to\":\"+13121000096\"}"
310
+ Freeclimb::RequestVerifier.verify_request_signature(request_body, request_header, signing_secret, tolerance)
311
+ ```
312
+
313
+
289
314
  ## Getting Help
290
315
 
291
316
  If you are experiencing difficulties, [contact support](https://freeclimb.com/support).
data/docs/DefaultApi.md CHANGED
@@ -2104,7 +2104,8 @@ opts = {
2104
2104
  status: Freeclimb::CallStatus::QUEUED, # CallStatus | Only show Calls currently in this status. May be `queued`, `ringing`, `inProgress`, `canceled`, `completed`, `failed`, `busy`, or `noAnswer`.
2105
2105
  start_time: 'start_time_example', # String | Only show Calls that started at or after this time, given as YYYY-MM-DD hh:mm:ss.
2106
2106
  end_time: 'end_time_example', # String | Only show Calls that ended at or before this time, given as YYYY-MM- DD hh:mm:ss.
2107
- parent_call_id: 'parent_call_id_example' # String | Only show Calls spawned by the call with this ID.
2107
+ parent_call_id: 'parent_call_id_example', # String | Only show Calls spawned by the call with this ID.
2108
+ application_id: ['inner_example'] # Array<String> | Only show calls belonging to the given applicationId. This parameter can be repeated to return calls from multiple Applications.
2108
2109
  }
2109
2110
 
2110
2111
  begin
@@ -2154,6 +2155,8 @@ end
2154
2155
 
2155
2156
  | **parent_call_id** | **String** | Only show Calls spawned by the call with this ID. | [optional] |
2156
2157
 
2158
+ | **application_id** | [**Array&lt;String&gt;**](String.md) | Only show calls belonging to the given applicationId. This parameter can be repeated to return calls from multiple Applications. | [optional] |
2159
+
2157
2160
 
2158
2161
  ### Return type
2159
2162
 
@@ -1798,6 +1798,7 @@ module Freeclimb
1798
1798
  # @option opts [String] :start_time Only show Calls that started at or after this time, given as YYYY-MM-DD hh:mm:ss.
1799
1799
  # @option opts [String] :end_time Only show Calls that ended at or before this time, given as YYYY-MM- DD hh:mm:ss.
1800
1800
  # @option opts [String] :parent_call_id Only show Calls spawned by the call with this ID.
1801
+ # @option opts [Array<String>] :application_id Only show calls belonging to the given applicationId. This parameter can be repeated to return calls from multiple Applications.
1801
1802
  # @return [CallList]
1802
1803
  def list_calls(opts = {})
1803
1804
  data, _status_code, _headers = list_calls_with_http_info(opts)
@@ -1813,11 +1814,16 @@ module Freeclimb
1813
1814
  # @option opts [String] :start_time Only show Calls that started at or after this time, given as YYYY-MM-DD hh:mm:ss.
1814
1815
  # @option opts [String] :end_time Only show Calls that ended at or before this time, given as YYYY-MM- DD hh:mm:ss.
1815
1816
  # @option opts [String] :parent_call_id Only show Calls spawned by the call with this ID.
1817
+ # @option opts [Array<String>] :application_id Only show calls belonging to the given applicationId. This parameter can be repeated to return calls from multiple Applications.
1816
1818
  # @return [Array<(CallList, Integer, Hash)>] CallList data, response status code and response headers
1817
1819
  def list_calls_with_http_info(opts = {})
1818
1820
  if @api_client.config.debugging
1819
1821
  @api_client.config.logger.debug 'Calling API: DefaultApi.list_calls ...'
1820
1822
  end
1823
+ if @api_client.config.client_side_validation && !opts[:'application_id'].nil? && opts[:'application_id'].length > 16
1824
+ fail ArgumentError, 'invalid value for "opts[:"application_id"]" when calling DefaultApi.list_calls, number of items must be less than or equal to 16.'
1825
+ end
1826
+
1821
1827
  # resource path
1822
1828
  local_var_path = '/Accounts/{accountId}/Calls'.sub('{' + 'accountId' + '}', CGI.escape(account_id.to_s))
1823
1829
 
@@ -1830,6 +1836,7 @@ module Freeclimb
1830
1836
  query_params[:'startTime'] = opts[:'start_time'] if !opts[:'start_time'].nil?
1831
1837
  query_params[:'endTime'] = opts[:'end_time'] if !opts[:'end_time'].nil?
1832
1838
  query_params[:'parentCallId'] = opts[:'parent_call_id'] if !opts[:'parent_call_id'].nil?
1839
+ query_params[:'applicationId'] = @api_client.build_collection_param(opts[:'application_id'], :multi) if !opts[:'application_id'].nil?
1833
1840
 
1834
1841
  # header parameters
1835
1842
  header_params = opts[:header_params] || {}
@@ -92,6 +92,8 @@ module Freeclimb
92
92
  :'api_key',
93
93
  :'_alias',
94
94
  :'label',
95
+ :'type',
96
+ :'status',
95
97
  :'subresource_uris'
96
98
  ])
97
99
  end
@@ -72,6 +72,8 @@ module Freeclimb
72
72
  :'api_key',
73
73
  :'_alias',
74
74
  :'label',
75
+ :'type',
76
+ :'status',
75
77
  :'subresource_uris'
76
78
  ])
77
79
  end
@@ -133,11 +133,14 @@ module Freeclimb
133
133
  :'from',
134
134
  :'to',
135
135
  :'phone_number_id',
136
+ :'call_status',
136
137
  :'start_time',
137
138
  :'connect_time',
138
139
  :'end_time',
139
140
  :'duration',
140
141
  :'connect_duration',
142
+ :'direction',
143
+ :'answered_by',
141
144
  :'subresource_uris'
142
145
  ])
143
146
  end
@@ -113,11 +113,14 @@ module Freeclimb
113
113
  :'from',
114
114
  :'to',
115
115
  :'phone_number_id',
116
+ :'call_status',
116
117
  :'start_time',
117
118
  :'connect_time',
118
119
  :'end_time',
119
120
  :'duration',
120
121
  :'connect_duration',
122
+ :'direction',
123
+ :'answered_by',
121
124
  :'subresource_uris'
122
125
  ])
123
126
  end
@@ -106,7 +106,9 @@ module Freeclimb
106
106
  :'conference_id',
107
107
  :'account_id',
108
108
  :'_alias',
109
+ :'play_beep',
109
110
  :'record',
111
+ :'status',
110
112
  :'wait_url',
111
113
  :'action_url',
112
114
  :'status_callback_url',
@@ -86,7 +86,9 @@ module Freeclimb
86
86
  :'conference_id',
87
87
  :'account_id',
88
88
  :'_alias',
89
+ :'play_beep',
89
90
  :'record',
91
+ :'status',
90
92
  :'wait_url',
91
93
  :'action_url',
92
94
  :'status_callback_url',
@@ -65,6 +65,7 @@ module Freeclimb
65
65
  # List of attributes with nullable: true
66
66
  def self.openapi_nullable
67
67
  Set.new([
68
+ :'play_beep',
68
69
  ])
69
70
  end
70
71
 
@@ -64,6 +64,7 @@ module Freeclimb
64
64
  # List of attributes with nullable: true
65
65
  def self.openapi_nullable
66
66
  Set.new([
67
+ :'play_beep',
67
68
  ])
68
69
  end
69
70
 
@@ -59,6 +59,7 @@ module Freeclimb
59
59
  # List of attributes with nullable: true
60
60
  def self.openapi_nullable
61
61
  Set.new([
62
+ :'play_beep',
62
63
  ])
63
64
  end
64
65
 
@@ -100,6 +100,7 @@ module Freeclimb
100
100
  # List of attributes with nullable: true
101
101
  def self.openapi_nullable
102
102
  Set.new([
103
+ :'grammar_type',
103
104
  ])
104
105
  end
105
106
 
@@ -99,6 +99,7 @@ module Freeclimb
99
99
  # List of attributes with nullable: true
100
100
  def self.openapi_nullable
101
101
  Set.new([
102
+ :'grammar_type',
102
103
  ])
103
104
  end
104
105
 
@@ -70,6 +70,7 @@ module Freeclimb
70
70
  def self.openapi_nullable
71
71
  Set.new([
72
72
  :'timestamp',
73
+ :'level',
73
74
  :'request_id',
74
75
  :'account_id',
75
76
  :'call_id',
@@ -96,6 +96,7 @@ module Freeclimb
96
96
  Set.new([
97
97
  :'account_id',
98
98
  :'message_id',
99
+ :'status',
99
100
  :'from',
100
101
  :'to',
101
102
  :'text',
@@ -76,6 +76,7 @@ module Freeclimb
76
76
  Set.new([
77
77
  :'account_id',
78
78
  :'message_id',
79
+ :'status',
79
80
  :'from',
80
81
  :'to',
81
82
  :'text',
@@ -48,6 +48,7 @@ module Freeclimb
48
48
  # List of attributes with nullable: true
49
49
  def self.openapi_nullable
50
50
  Set.new([
51
+ :'play_beep',
51
52
  ])
52
53
  end
53
54
 
@@ -0,0 +1,61 @@
1
+ module Freeclimb
2
+ class RequestVerifier
3
+ class << self
4
+ @@DEFAULT_TOLERANCE = 5 * 60 * 1000
5
+
6
+ def verify_request_signature(request_body, request_header, signing_secret, tolerance=DEFAULT_TOLERANCE)
7
+ request_verifier_object = Freeclimb::RequestVerifier.new()
8
+ request_verifier_object.instance_eval{ check_request_body(request_body) }
9
+ request_verifier_object.instance_eval{ check_request_header(request_header) }
10
+ request_verifier_object.instance_eval{ check_signing_secret(signing_secret) }
11
+ request_verifier_object.instance_eval{ check_tolerance(tolerance) }
12
+ info = Freeclimb::SignatureInformation.new(request_header)
13
+ request_verifier_object.instance_eval{ verify_tolerance(info, tolerance) }
14
+ request_verifier_object.instance_eval{ verify_signature(info, request_body, signing_secret)}
15
+ end
16
+ end
17
+
18
+ private
19
+
20
+ def check_request_body(request_body)
21
+ if request_body == "" || request_body == nil
22
+ raise 'Request Body cannot be empty or null'
23
+ end
24
+ end
25
+
26
+ def check_request_header(request_header)
27
+ if request_header == "" || request_header == nil
28
+ raise 'Error with request header, Request header is empty'
29
+ elsif !(request_header.include? "t")
30
+ raise 'Error with request header, timestamp is not present'
31
+ elsif !(request_header.include? "v1")
32
+ raise 'Error with request header, signatures are not present'
33
+ end
34
+ end
35
+
36
+ def check_signing_secret(signing_secret)
37
+ if signing_secret == "" || signing_secret == nil
38
+ raise 'Signing secret cannot be empty or null'
39
+ end
40
+ end
41
+
42
+ def check_tolerance(tolerance)
43
+ if tolerance <= 0 || !(tolerance.is_a? Integer)
44
+ raise 'Tolerance value must be a positive integer'
45
+ end
46
+ end
47
+
48
+ def verify_tolerance(info, tolerance)
49
+ currentTime = info.get_current_unix_time()
50
+ if !info.is_request_time_valid(tolerance)
51
+ raise "Request time exceeded tolerance threshold. Request: " + info.request_timestamp.to_s + ", CurrentTime: " + currentTime.to_s + ", tolerance: " + tolerance.to_s
52
+ end
53
+ end
54
+
55
+ def verify_signature(info, request_body, signing_secret)
56
+ if !info.is_signature_safe(request_body, signing_secret)
57
+ raise "Unverified signature request, If this request was unexpected, it may be from a bad actor. Please proceed with caution. If the request was exepected, please check any typos or issues with the signingSecret"
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,45 @@
1
+ require 'date'
2
+ require 'openssl'
3
+
4
+ module Freeclimb
5
+ class SignatureInformation
6
+ attr_accessor :request_timestamp
7
+ attr_accessor :signatures
8
+
9
+ def initialize(request_header)
10
+ @request_timestamp = 0
11
+ @signatures = []
12
+ signatureHeader = request_header.try(:split, ",")
13
+ signatureHeader.each { |signature|
14
+ header, value = signature.try(:split, "=")
15
+ if header == "t"
16
+ @request_timestamp = value.to_i
17
+ elsif header == "v1"
18
+ @signatures.append(value)
19
+ end
20
+ }
21
+ end
22
+
23
+ def is_request_time_valid(tolerance)
24
+ currentTime = self.get_current_unix_time()
25
+ timeCalculation = @request_timestamp + tolerance
26
+ return (timeCalculation) < currentTime
27
+ end
28
+
29
+ def is_signature_safe(request_body, signing_secret)
30
+ hashValue = self.compute_hash(request_body, signing_secret)
31
+ return @signatures.include? hashValue
32
+ end
33
+
34
+ def compute_hash(request_body, signing_secret)
35
+ data = @request_timestamp.to_s + "." + request_body
36
+ return OpenSSL::HMAC.hexdigest('sha256', signing_secret, data)
37
+ end
38
+
39
+ def get_current_unix_time()
40
+ return DateTime.now.strftime('%s').to_i
41
+ end
42
+
43
+ private :compute_hash
44
+ end
45
+ end
@@ -11,5 +11,5 @@ OpenAPI Generator version: 5.4.0
11
11
  =end
12
12
 
13
13
  module Freeclimb
14
- VERSION = '4.1.4'
14
+ VERSION = '4.3.0'
15
15
  end
data/lib/freeclimb.rb CHANGED
@@ -148,6 +148,10 @@ require 'freeclimb/models/unpark'
148
148
  # APIs
149
149
  require 'freeclimb/api/default_api'
150
150
 
151
+ #Utils
152
+ require 'freeclimb/utils/signature_information'
153
+ require 'freeclimb/utils/request_verifier'
154
+
151
155
  module Freeclimb
152
156
  class << self
153
157
  # Customize default settings for the SDK using block.
data/openapi.json CHANGED
@@ -85,28 +85,33 @@
85
85
  "type": "string",
86
86
  "enum": ["closed", "suspended", "active"],
87
87
  "x-enum-varnames": ["CLOSED", "SUSPENDED", "ACTIVE"],
88
- "description": "The status of this account. It is one of: active, suspended, or closed."
88
+ "description": "The status of this account. It is one of: active, suspended, or closed.",
89
+ "nullable": true
89
90
  },
90
91
  "AccountType": {
91
92
  "type": "string",
92
93
  "description": "The type of this account. It is one of: trial or full.",
93
94
  "enum": ["trial", "full"],
94
- "x-enum-varnames": ["TRIAL", "FULL"]
95
+ "x-enum-varnames": ["TRIAL", "FULL"],
96
+ "nullable": true
95
97
  },
96
98
  "AnsweredBy": {
97
99
  "type": "string",
100
+ "nullable": true,
98
101
  "enum": ["human", "machine"],
99
102
  "x-enum-varnames": ["HUMAN", "MACHINE"],
100
103
  "description": "If this Call was initiated with answering machine detection, either `human` or `machine`. Empty otherwise."
101
104
  },
102
105
  "CallDirection": {
103
106
  "type": "string",
107
+ "nullable": true,
104
108
  "enum": ["inbound", "outboundAPI", "outboundDial"],
105
109
  "x-enum-varnames": ["INBOUND", "OUTBOUND_API", "OUTBOUND_DIAL"],
106
110
  "description": "Direction of the Call. `inbound` for Calls into FreeClimb, `outboundAPI` for Calls initiated via the REST API, `outboundDial` for Calls initiated by the `OutDial` PerCL command."
107
111
  },
108
112
  "CallStatus": {
109
113
  "type": "string",
114
+ "nullable": true,
110
115
  "enum": [
111
116
  "queued",
112
117
  "ringing",
@@ -131,6 +136,7 @@
131
136
  },
132
137
  "ConferenceStatus": {
133
138
  "type": "string",
139
+ "nullable": true,
134
140
  "enum": ["empty", "populated", "inProgress", "terminated"],
135
141
  "x-enum-varnames": ["EMPTY", "POPULATED", "IN_PROGRESS", "TERMINATED"],
136
142
  "description": "The status of the Conference. One of: creating, empty, populated, inProgress, or terminated."
@@ -194,6 +200,7 @@
194
200
  "GrammarType": {
195
201
  "type": "string",
196
202
  "enum": ["URL", "BUILTIN"],
203
+ "nullable": true,
197
204
  "x-enum-varnames": ["URL", "BUILT_IN"],
198
205
  "description": "The grammar file type to use for speech recognition. A value of 'URL' indicates the grammarFile attribute specifies a URL that points to the grammar file. A value of `BUILTIN` indicates the grammarFile attribute specifies the name of one of the platform built-in grammar files."
199
206
  },
@@ -265,6 +272,7 @@
265
272
  "LogLevel": {
266
273
  "type": "string",
267
274
  "enum": ["info", "warning", "error"],
275
+ "nullable": true,
268
276
  "x-enum-varnames": ["INFO", "WARNING", "ERROR"],
269
277
  "description": "Level of the log. Possible values are info, warning, and error."
270
278
  },
@@ -280,6 +288,7 @@
280
288
  },
281
289
  "MessageStatus": {
282
290
  "type": "string",
291
+ "nullable": true,
283
292
  "description": "Indicates the state of the message through the message lifecycle including: new, queued, rejected, sending, sent, failed, received, undelivered, expired, deleted, and unknown",
284
293
  "enum": [
285
294
  "new",
@@ -310,9 +319,10 @@
310
319
  },
311
320
  "PlayBeep": {
312
321
  "type": "string",
322
+ "nullable": true,
313
323
  "enum": ["always", "never", "entryOnly", "exitOnly"],
314
324
  "x-enum-varnames": ["ALWAYS", "NEVER", "ENTRY_ONLY", "EXIT_ONLY"],
315
- "description": "Controls when a beep is played. Valid values: `always`, `never`, `entryOnly`, `exitOnly`.",
325
+ "description": "Indicates whether to play a beep when a Participant enters or leaves the Conference. either `always`, `never`, `entryOnly`, or `exitOnly`. Leaving this unset will make conference default to `always` ",
316
326
  "default": "always",
317
327
  "x-enum-default-attr": "ALWAYS"
318
328
  },
@@ -520,7 +530,6 @@
520
530
  "type": "boolean"
521
531
  },
522
532
  "playBeep": {
523
- "description": "Indicates whether to play a beep when a Participant enters or leaves the Conference. either `always`, `never`, `entryOnly`, or `exitOnly`. Leaving this unset will make conference default to `always` ",
524
533
  "$ref": "#/components/schemas/PlayBeep"
525
534
  },
526
535
  "record": {
@@ -653,8 +662,7 @@
653
662
  "format": "uri"
654
663
  },
655
664
  "grammarType": {
656
- "$ref": "#/components/schemas/GrammarType",
657
- "nullable": true
665
+ "$ref": "#/components/schemas/GrammarType"
658
666
  },
659
667
  "grammarFile": {
660
668
  "description": "The grammar file to use for speech recognition. If grammarType is set to URL, this attribute is specified as a download URL.",
@@ -1297,12 +1305,10 @@
1297
1305
  "nullable": true
1298
1306
  },
1299
1307
  "type": {
1300
- "$ref": "#/components/schemas/AccountType",
1301
- "nullable": true
1308
+ "$ref": "#/components/schemas/AccountType"
1302
1309
  },
1303
1310
  "status": {
1304
- "$ref": "#/components/schemas/AccountStatus",
1305
- "nullable": true
1311
+ "$ref": "#/components/schemas/AccountStatus"
1306
1312
  },
1307
1313
  "subresourceUris": {
1308
1314
  "type": "object",
@@ -1648,8 +1654,7 @@
1648
1654
  "nullable": true
1649
1655
  },
1650
1656
  "callStatus": {
1651
- "$ref": "#/components/schemas/CallStatus",
1652
- "nullable": true
1657
+ "$ref": "#/components/schemas/CallStatus"
1653
1658
  },
1654
1659
  "startTime": {
1655
1660
  "type": "string",
@@ -1677,12 +1682,10 @@
1677
1682
  "nullable": true
1678
1683
  },
1679
1684
  "direction": {
1680
- "$ref": "#/components/schemas/CallDirection",
1681
- "nullable": true
1685
+ "$ref": "#/components/schemas/CallDirection"
1682
1686
  },
1683
1687
  "answeredBy": {
1684
- "$ref": "#/components/schemas/AnsweredBy",
1685
- "nullable": true
1688
+ "$ref": "#/components/schemas/AnsweredBy"
1686
1689
  },
1687
1690
  "subresourceUris": {
1688
1691
  "type": "object",
@@ -1834,9 +1837,7 @@
1834
1837
  "nullable": true
1835
1838
  },
1836
1839
  "level": {
1837
- "$ref": "#/components/schemas/LogLevel",
1838
-
1839
- "nullable": true
1840
+ "$ref": "#/components/schemas/LogLevel"
1840
1841
  },
1841
1842
  "requestId": {
1842
1843
  "type": "string",
@@ -1909,8 +1910,7 @@
1909
1910
  },
1910
1911
  "playBeep": {
1911
1912
  "$ref": "#/components/schemas/PlayBeep",
1912
- "description": "Setting that controls when a beep is played. One of: always, never, entryOnly, exitOnly. Defaults to always.",
1913
- "nullable": true
1913
+ "description": "Setting that controls when a beep is played. One of: always, never, entryOnly, exitOnly. Defaults to always."
1914
1914
  },
1915
1915
  "record": {
1916
1916
  "type": "boolean",
@@ -1918,8 +1918,7 @@
1918
1918
  "nullable": true
1919
1919
  },
1920
1920
  "status": {
1921
- "$ref": "#/components/schemas/ConferenceStatus",
1922
- "nullable": true
1921
+ "$ref": "#/components/schemas/ConferenceStatus"
1923
1922
  },
1924
1923
  "waitUrl": {
1925
1924
  "type": "string",
@@ -2036,8 +2035,7 @@
2036
2035
  "nullable": true
2037
2036
  },
2038
2037
  "status": {
2039
- "$ref": "#/components/schemas/MessageStatus",
2040
- "nullable": true
2038
+ "$ref": "#/components/schemas/MessageStatus"
2041
2039
  },
2042
2040
  "from": {
2043
2041
  "type": "string",
@@ -3066,6 +3064,21 @@
3066
3064
  "type": "string"
3067
3065
  }
3068
3066
  },
3067
+ {
3068
+ "name": "applicationId",
3069
+ "in": "query",
3070
+ "description": "Only show calls belonging to the given applicationId. This parameter can be repeated to return calls from multiple Applications.",
3071
+ "explode": true,
3072
+ "required": false,
3073
+ "schema": {
3074
+ "type": "array",
3075
+ "maxItems": 16,
3076
+ "items": {
3077
+ "type": "string",
3078
+ "pattern": "^AP[0-9a-fA-F]{40}$"
3079
+ }
3080
+ }
3081
+ },
3069
3082
  {
3070
3083
  "$ref": "#/components/parameters/AccountId"
3071
3084
  }
@@ -128,6 +128,8 @@ describe 'DefaultApi' do
128
128
 
129
129
  @parent_call_id_list_calls_test_value = 'parentCallId_example'
130
130
 
131
+ @application_id_list_calls_test_value = ['AP0123456789ABCDEFabcedf000000000000000001', 'AP0123456789ABCDEFabcedf000000000000000002', 'AP0123456789ABCDEFabcedf000000000000000002']
132
+
131
133
  @status_list_conferences_test_value = 'status_example'
132
134
 
133
135
  @alias_list_conferences_test_value = 'alias_example'
@@ -914,6 +916,7 @@ describe 'DefaultApi' do
914
916
  # @option opts [String] :start_time Only show Calls that started at or after this time, given as YYYY-MM-DD hh:mm:ss.
915
917
  # @option opts [String] :end_time Only show Calls that ended at or before this time, given as YYYY-MM- DD hh:mm:ss.
916
918
  # @option opts [String] :parent_call_id Only show Calls spawned by the call with this ID.
919
+ # @option opts [Array<String>] :application_id Only show calls belonging to the given applicationId. This parameter can be repeated to return calls from multiple Applications.
917
920
  # @return [CallList]
918
921
  describe 'list_calls test' do
919
922
  it 'should work' do
@@ -925,11 +928,12 @@ describe 'DefaultApi' do
925
928
  start_time = @start_time_list_calls_test_value
926
929
  end_time = @end_time_list_calls_test_value
927
930
  parent_call_id = @parent_call_id_list_calls_test_value
931
+ application_id = @application_id_list_calls_test_value
928
932
 
929
933
  result = @api_instance.list_calls(
930
934
 
931
935
  {
932
- :active => active,:to => to,:from => from,:status => status,:start_time => start_time,:end_time => end_time,:parent_call_id => parent_call_id,
936
+ :active => active,:to => to,:from => from,:status => status,:start_time => start_time,:end_time => end_time,:parent_call_id => parent_call_id,:application_id => application_id,
933
937
  }
934
938
  )
935
939
 
@@ -0,0 +1,148 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'RequestVerifier' do
4
+ before do
5
+ @request_verifier_object = Freeclimb::RequestVerifier.new()
6
+ end
7
+
8
+ describe '#check_request_body' do
9
+ context 'Request Body is empty' do
10
+ it 'throws "Request Body cannot be empty or null"' do
11
+ request_header = "t=1679944186,v1=c3957749baf61df4b1506802579cc69a74c77a1ae21447b930e5a704f9ec4120,v1=1ba18712726898fbbe48cd862dd096a709f7ad761a5bab14bda9ac24d963a6a8"
12
+ signing_secret = "sigsec_ead6d3b6904196c60835d039e91b3341c77a7793"
13
+ tolerance = 5 * 60
14
+ request_body = ""
15
+ expect { Freeclimb::RequestVerifier.verify_request_signature(request_body, request_header, signing_secret, tolerance) }.to raise_error("Request Body cannot be empty or null")
16
+ end
17
+ end
18
+ context 'Request Body is nil' do
19
+ it 'throws "Request Body cannot be empty or null"' do
20
+ request_header = "t=1679944186,v1=c3957749baf61df4b1506802579cc69a74c77a1ae21447b930e5a704f9ec4120,v1=1ba18712726898fbbe48cd862dd096a709f7ad761a5bab14bda9ac24d963a6a8"
21
+ signing_secret = "sigsec_ead6d3b6904196c60835d039e91b3341c77a7793"
22
+ tolerance = 5 * 60
23
+ request_body = nil
24
+ expect { Freeclimb::RequestVerifier.verify_request_signature(request_body, request_header, signing_secret, tolerance) }.to raise_error("Request Body cannot be empty or null")
25
+ end
26
+ end
27
+ end
28
+
29
+ describe '#check_request_header' do
30
+ context 'signatures are not present' do
31
+ it 'throws "Error with request header, signatures are not present"' do
32
+ request_header = "t=1679944186,"
33
+ signing_secret = "sigsec_ead6d3b6904196c60835d039e91b3341c77a7793"
34
+ tolerance = 5 * 60
35
+ request_body = "{\"accountId\":\"AC1334ffb694cd8d969f51cddf5f7c9b478546d50c\",\"callId\":\"CAccb0b00506553cda09b51c5477f672a49e0b2213\",\"callStatus\":\"ringing\",\"conferenceId\":null,\"direction\":\"inbound\",\"from\":\"+13121000109\",\"parentCallId\":null,\"queueId\":null,\"requestType\":\"inboundCall\",\"to\":\"+13121000096\"}"
36
+ expect { Freeclimb::RequestVerifier.verify_request_signature(request_body, request_header, signing_secret, tolerance) }.to raise_error("Error with request header, signatures are not present")
37
+ end
38
+ end
39
+ context 'timestamp is not present' do
40
+ it 'throws "Error with request header, timestamp is not present"' do
41
+ request_header = "v1=c3957749baf61df4b1506802579cc69a74c77a1ae21447b930e5a704f9ec4120,v1=1ba18712726898fbbe48cd862dd096a709f7ad761a5bab14bda9ac24d963a6a8"
42
+ signing_secret = "sigsec_ead6d3b6904196c60835d039e91b3341c77a7793"
43
+ tolerance = 5 * 60
44
+ request_body = "{\"accountId\":\"AC1334ffb694cd8d969f51cddf5f7c9b478546d50c\",\"callId\":\"CAccb0b00506553cda09b51c5477f672a49e0b2213\",\"callStatus\":\"ringing\",\"conferenceId\":null,\"direction\":\"inbound\",\"from\":\"+13121000109\",\"parentCallId\":null,\"queueId\":null,\"requestType\":\"inboundCall\",\"to\":\"+13121000096\"}"
45
+ expect { Freeclimb::RequestVerifier.verify_request_signature(request_body, request_header, signing_secret, tolerance) }.to raise_error("Error with request header, timestamp is not present")
46
+ end
47
+ end
48
+ context 'Request header is empty' do
49
+ it 'throws "Error with request header, Request header is empty"' do
50
+ request_header = ""
51
+ signing_secret = "sigsec_ead6d3b6904196c60835d039e91b3341c77a7793"
52
+ tolerance = 5 * 60
53
+ request_body = "{\"accountId\":\"AC1334ffb694cd8d969f51cddf5f7c9b478546d50c\",\"callId\":\"CAccb0b00506553cda09b51c5477f672a49e0b2213\",\"callStatus\":\"ringing\",\"conferenceId\":null,\"direction\":\"inbound\",\"from\":\"+13121000109\",\"parentCallId\":null,\"queueId\":null,\"requestType\":\"inboundCall\",\"to\":\"+13121000096\"}"
54
+ expect { Freeclimb::RequestVerifier.verify_request_signature(request_body, request_header, signing_secret, tolerance) }.to raise_error("Error with request header, Request header is empty")
55
+ end
56
+ end
57
+ end
58
+
59
+ describe '#check_signing_secret' do
60
+ context 'Signing secret is empty' do
61
+ it 'throws "Signing secret cannot be empty or null"' do
62
+ request_header = "t=1679944186,v1=c3957749baf61df4b1506802579cc69a74c77a1ae21447b930e5a704f9ec4120,v1=1ba18712726898fbbe48cd862dd096a709f7ad761a5bab14bda9ac24d963a6a8"
63
+ signing_secret = ""
64
+ tolerance = 5 * 60
65
+ request_body = "{\"accountId\":\"AC1334ffb694cd8d969f51cddf5f7c9b478546d50c\",\"callId\":\"CAccb0b00506553cda09b51c5477f672a49e0b2213\",\"callStatus\":\"ringing\",\"conferenceId\":null,\"direction\":\"inbound\",\"from\":\"+13121000109\",\"parentCallId\":null,\"queueId\":null,\"requestType\":\"inboundCall\",\"to\":\"+13121000096\"}"
66
+ expect { Freeclimb::RequestVerifier.verify_request_signature(request_body, request_header, signing_secret, tolerance) }.to raise_error("Signing secret cannot be empty or null")
67
+ end
68
+ end
69
+ context 'Signing secret is nil' do
70
+ it 'throws "Signing secret cannot be empty or null"' do
71
+ request_header = "t=1679944186,v1=c3957749baf61df4b1506802579cc69a74c77a1ae21447b930e5a704f9ec4120,v1=1ba18712726898fbbe48cd862dd096a709f7ad761a5bab14bda9ac24d963a6a8"
72
+ signing_secret = nil
73
+ tolerance = 5 * 60
74
+ request_body = "{\"accountId\":\"AC1334ffb694cd8d969f51cddf5f7c9b478546d50c\",\"callId\":\"CAccb0b00506553cda09b51c5477f672a49e0b2213\",\"callStatus\":\"ringing\",\"conferenceId\":null,\"direction\":\"inbound\",\"from\":\"+13121000109\",\"parentCallId\":null,\"queueId\":null,\"requestType\":\"inboundCall\",\"to\":\"+13121000096\"}"
75
+ expect { Freeclimb::RequestVerifier.verify_request_signature(request_body, request_header, signing_secret, tolerance) }.to raise_error("Signing secret cannot be empty or null")
76
+ end
77
+ end
78
+ end
79
+
80
+ describe '#check_tolerance' do
81
+ context 'Tolerance value is a negative value' do
82
+ it 'throws "Tolerance value must be a positive integer"' do
83
+ request_header = "t=1679944186,v1=c3957749baf61df4b1506802579cc69a74c77a1ae21447b930e5a704f9ec4120,v1=1ba18712726898fbbe48cd862dd096a709f7ad761a5bab14bda9ac24d963a6a8"
84
+ signing_secret = "sigsec_ead6d3b6904196c60835d039e91b3341c77a7793"
85
+ tolerance = -5
86
+ request_body = "{\"accountId\":\"AC1334ffb694cd8d969f51cddf5f7c9b478546d50c\",\"callId\":\"CAccb0b00506553cda09b51c5477f672a49e0b2213\",\"callStatus\":\"ringing\",\"conferenceId\":null,\"direction\":\"inbound\",\"from\":\"+13121000109\",\"parentCallId\":null,\"queueId\":null,\"requestType\":\"inboundCall\",\"to\":\"+13121000096\"}"
87
+ expect { Freeclimb::RequestVerifier.verify_request_signature(request_body, request_header, signing_secret, tolerance) }.to raise_error("Tolerance value must be a positive integer")
88
+ end
89
+ end
90
+ context 'Tolerance value is 0' do
91
+ it 'throws "Tolerance value must be a positive integer"' do
92
+ request_header = "t=1679944186,v1=c3957749baf61df4b1506802579cc69a74c77a1ae21447b930e5a704f9ec4120,v1=1ba18712726898fbbe48cd862dd096a709f7ad761a5bab14bda9ac24d963a6a8"
93
+ signing_secret = "sigsec_ead6d3b6904196c60835d039e91b3341c77a7793"
94
+ tolerance = 0
95
+ request_body = "{\"accountId\":\"AC1334ffb694cd8d969f51cddf5f7c9b478546d50c\",\"callId\":\"CAccb0b00506553cda09b51c5477f672a49e0b2213\",\"callStatus\":\"ringing\",\"conferenceId\":null,\"direction\":\"inbound\",\"from\":\"+13121000109\",\"parentCallId\":null,\"queueId\":null,\"requestType\":\"inboundCall\",\"to\":\"+13121000096\"}"
96
+ expect { Freeclimb::RequestVerifier.verify_request_signature(request_body, request_header, signing_secret, tolerance) }.to raise_error("Tolerance value must be a positive integer")
97
+ end
98
+ end
99
+ context 'Tolerance value is NaN' do
100
+ it 'throws "Tolerance value must be a positive integer"' do
101
+ request_header = "t=1679944186,v1=c3957749baf61df4b1506802579cc69a74c77a1ae21447b930e5a704f9ec4120,v1=1ba18712726898fbbe48cd862dd096a709f7ad761a5bab14bda9ac24d963a6a8"
102
+ signing_secret = "sigsec_ead6d3b6904196c60835d039e91b3341c77a7793"
103
+ tolerance = Float::NAN
104
+ request_body = "{\"accountId\":\"AC1334ffb694cd8d969f51cddf5f7c9b478546d50c\",\"callId\":\"CAccb0b00506553cda09b51c5477f672a49e0b2213\",\"callStatus\":\"ringing\",\"conferenceId\":null,\"direction\":\"inbound\",\"from\":\"+13121000109\",\"parentCallId\":null,\"queueId\":null,\"requestType\":\"inboundCall\",\"to\":\"+13121000096\"}"
105
+ expect { Freeclimb::RequestVerifier.verify_request_signature(request_body, request_header, signing_secret, tolerance) }.to raise_error("Tolerance value must be a positive integer")
106
+ end
107
+ end
108
+ end
109
+
110
+ describe '#verify_tolerance' do
111
+ context 'Request plus tolerance is not less than the current datetime' do
112
+ it 'throws "Request time exceeded tolerance threshold. Request: 1900871395, CurrentTime: currentTimeValue, tolerance, toleranceValue"' do
113
+ currentTime = DateTime.now.strftime('%s').to_i
114
+ request_header = "t=1900871395,v1=1d798c86e977ff734dec3a8b8d67fe8621dcc1df46ef4212e0bfe2e122b01bfd,v1=1ba18712726898fbbe48cd862dd096a709f7ad761a5bab14bda9ac24d963a6a8"
115
+ signing_secret = "sigsec_ead6d3b6904196c60835d039e91b3341c77a7793"
116
+ tolerance = (5 * 60)
117
+ request_body = "{\"accountId\":\"AC1334ffb694cd8d969f51cddf5f7c9b478546d50c\",\"callId\":\"CAccb0b00506553cda09b51c5477f672a49e0b2213\",\"callStatus\":\"ringing\",\"conferenceId\":null,\"direction\":\"inbound\",\"from\":\"+13121000109\",\"parentCallId\":null,\"queueId\":null,\"requestType\":\"inboundCall\",\"to\":\"+13121000096\"}"
118
+ expect { Freeclimb::RequestVerifier.verify_request_signature(request_body, request_header, signing_secret, tolerance) }.to raise_error("Request time exceeded tolerance threshold. Request: 1900871395" + ", CurrentTime: " + currentTime.to_s + ", tolerance: " + tolerance.to_s)
119
+ end
120
+ end
121
+ end
122
+
123
+ describe '#verify_signature' do
124
+ context 'Signature request is unverified, signing secret does not exist in signatures, potential typo' do
125
+ it 'throws "Unverified signature request, If this request was unexpected, it may be from a bad actor. Please proceed with caution. If the request was exepected, please check any typos or issues with the signingSecret"' do
126
+ currentTime = DateTime.now.strftime('%s').to_i
127
+ request_header = "t=1679944186,v1=c3957749baf61df4b1506802579cc69a74c77a1ae21447b930e5a704f9ec4120,v1=1ba18712726898fbbe48cd862dd096a709f7ad761a5bab14bda9ac24d963a6a8"
128
+ signing_secret = "sigsec_ead6d3b6904196c60835d039e91b3341c77a7794"
129
+ tolerance = (5 * 60)
130
+ request_body = "{\"accountId\":\"AC1334ffb694cd8d969f51cddf5f7c9b478546d50c\",\"callId\":\"CAccb0b00506553cda09b51c5477f672a49e0b2213\",\"callStatus\":\"ringing\",\"conferenceId\":null,\"direction\":\"inbound\",\"from\":\"+13121000109\",\"parentCallId\":null,\"queueId\":null,\"requestType\":\"inboundCall\",\"to\":\"+13121000096\"}"
131
+ expect { Freeclimb::RequestVerifier.verify_request_signature(request_body, request_header, signing_secret, tolerance) }.to raise_error("Unverified signature request, If this request was unexpected, it may be from a bad actor. Please proceed with caution. If the request was exepected, please check any typos or issues with the signingSecret")
132
+ end
133
+ end
134
+ end
135
+
136
+ describe '#verify_request_signature' do
137
+ context 'Request is valid' do
138
+ it 'No errors are thrown' do
139
+ request_header = "t=1679944186,v1=c3957749baf61df4b1506802579cc69a74c77a1ae21447b930e5a704f9ec4120,v1=1ba18712726898fbbe48cd862dd096a709f7ad761a5bab14bda9ac24d963a6a8"
140
+ signing_secret = "sigsec_ead6d3b6904196c60835d039e91b3341c77a7793"
141
+ tolerance = (5 * 60)
142
+ request_body = "{\"accountId\":\"AC1334ffb694cd8d969f51cddf5f7c9b478546d50c\",\"callId\":\"CAccb0b00506553cda09b51c5477f672a49e0b2213\",\"callStatus\":\"ringing\",\"conferenceId\":null,\"direction\":\"inbound\",\"from\":\"+13121000109\",\"parentCallId\":null,\"queueId\":null,\"requestType\":\"inboundCall\",\"to\":\"+13121000096\"}"
143
+ expect { Freeclimb::RequestVerifier.verify_request_signature(request_body, request_header, signing_secret, tolerance) }.not_to raise_error
144
+ end
145
+ end
146
+ end
147
+
148
+ end
@@ -0,0 +1,39 @@
1
+ require 'spec_helper'
2
+ $time_stamp = 1679944186
3
+ $FIXNUM_MAX = (2**(0.size * 8 -2) -1)
4
+ describe 'SignatureInformation' do
5
+ before do
6
+ @request_header = "t=#{$time_stamp},v1=c3957749baf61df4b1506802579cc69a74c77a1ae21447b930e5a704f9ec4120,v1=1ba18712726898fbbe48cd862dd096a709f7ad761a5bab14bda9ac24d963a6a8"
7
+ @signature_information_object = Freeclimb::SignatureInformation.new(@request_header)
8
+ end
9
+ describe '#is_request_time_valid' do
10
+ context 'request time is within tolerance threshold' do
11
+ it 'returns true' do
12
+ tolerance = 5 * 60
13
+ expect(@signature_information_object.is_request_time_valid(tolerance)).to be true
14
+ end
15
+ end
16
+ context 'request time is not within tolerance threshold' do
17
+ it 'returns false since it does not match condition of request time being within tolerance threshold' do
18
+ tolerance = $FIXNUM_MAX - $time_stamp
19
+ expect(@signature_information_object.is_request_time_valid(tolerance)).to be false
20
+ end
21
+ end
22
+ end
23
+ describe '#is_signature_safe' do
24
+ context 'signingSecret exists in signature array' do
25
+ it 'returns true' do
26
+ request_body = "{\"accountId\":\"AC1334ffb694cd8d969f51cddf5f7c9b478546d50c\",\"callId\":\"CAccb0b00506553cda09b51c5477f672a49e0b2213\",\"callStatus\":\"ringing\",\"conferenceId\":null,\"direction\":\"inbound\",\"from\":\"+13121000109\",\"parentCallId\":null,\"queueId\":null,\"requestType\":\"inboundCall\",\"to\":\"+13121000096\"}"
27
+ signing_secret = "sigsec_ead6d3b6904196c60835d039e91b3341c77a7793"
28
+ expect(@signature_information_object.is_signature_safe(request_body, signing_secret)).to be true
29
+ end
30
+ end
31
+ context 'signingSecret does not exists in signature array' do
32
+ it 'returns false since it does not match condition of signingSecret being within signature array' do
33
+ request_body = "{\"accountId\":\"AC1334ffb694cd8d969f51cddf5f7c9b478546d50c\",\"callId\":\"CAccb0b00506553cda09b51c5477f672a49e0b2213\",\"callStatus\":\"ringing\",\"conferenceId\":null,\"direction\":\"inbound\",\"from\":\"+13121000109\",\"parentCallId\":null,\"queueId\":null,\"requestType\":\"inboundCall\",\"to\":\"+13121000096\"}"
34
+ signing_secret = "sigsec_ead6d3b6904196c60835d039e91b3341c77a7794"
35
+ expect(@signature_information_object.is_signature_safe(request_body, signing_secret)).to be false
36
+ end
37
+ end
38
+ end
39
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: freeclimb
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.1.4
4
+ version: 4.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - OpenAPI-Generator
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-04-03 00:00:00.000000000 Z
11
+ date: 2023-05-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: typhoeus
@@ -330,6 +330,8 @@ files:
330
330
  - lib/freeclimb/models/update_conference_participant_request.rb
331
331
  - lib/freeclimb/models/update_conference_request.rb
332
332
  - lib/freeclimb/models/update_conference_request_status.rb
333
+ - lib/freeclimb/utils/request_verifier.rb
334
+ - lib/freeclimb/utils/signature_information.rb
333
335
  - lib/freeclimb/version.rb
334
336
  - openapi.json
335
337
  - spec/api/default_api_spec.rb
@@ -423,6 +425,8 @@ files:
423
425
  - spec/models/update_conference_request_status_spec.rb
424
426
  - spec/quickstart_spec.rb
425
427
  - spec/spec_helper.rb
428
+ - spec/utils/request_verifier_spec.rb
429
+ - spec/utils/signature_information_spec.rb
426
430
  homepage: https://freeclimb.com
427
431
  licenses:
428
432
  - Unlicense
@@ -451,90 +455,92 @@ test_files:
451
455
  - spec/api_client_spec.rb
452
456
  - spec/configuration_spec.rb
453
457
  - spec/factories.rb
454
- - spec/models/recording_result_spec.rb
455
- - spec/models/pagination_model_spec.rb
456
- - spec/models/redirect_spec.rb
457
- - spec/models/percl_script_spec.rb
458
- - spec/models/get_digits_spec.rb
459
- - spec/models/dequeue_spec.rb
460
- - spec/models/update_conference_participant_request_spec.rb
461
- - spec/models/log_result_spec.rb
458
+ - spec/models/account_status_spec.rb
459
+ - spec/models/add_to_conference_spec.rb
460
+ - spec/models/incoming_number_list_spec.rb
461
+ - spec/models/call_list_spec.rb
462
+ - spec/models/queue_result_status_spec.rb
463
+ - spec/models/capabilities_spec.rb
464
+ - spec/models/queue_request_spec.rb
465
+ - spec/models/conference_status_spec.rb
466
+ - spec/models/queue_member_spec.rb
467
+ - spec/models/get_speech_reason_spec.rb
468
+ - spec/models/message_result_spec.rb
469
+ - spec/models/park_spec.rb
462
470
  - spec/models/answered_by_spec.rb
471
+ - spec/models/log_result_spec.rb
472
+ - spec/models/message_direction_spec.rb
473
+ - spec/models/record_utterance_term_reason_spec.rb
474
+ - spec/models/conference_participant_result_spec.rb
475
+ - spec/models/remove_from_conference_spec.rb
476
+ - spec/models/redirect_spec.rb
477
+ - spec/models/conference_participant_list_spec.rb
478
+ - spec/models/percl_command_spec.rb
463
479
  - spec/models/grammar_type_spec.rb
480
+ - spec/models/call_direction_spec.rb
481
+ - spec/models/log_list_spec.rb
482
+ - spec/models/available_number_spec.rb
483
+ - spec/models/set_listen_spec.rb
484
+ - spec/models/unpark_spec.rb
485
+ - spec/models/play_beep_spec.rb
486
+ - spec/models/available_number_list_spec.rb
487
+ - spec/models/create_conference_spec.rb
464
488
  - spec/models/account_result_spec.rb
489
+ - spec/models/message_request_spec.rb
490
+ - spec/models/update_conference_request_status_spec.rb
491
+ - spec/models/get_speech_spec.rb
465
492
  - spec/models/incoming_number_request_spec.rb
466
- - spec/models/filter_logs_request_spec.rb
467
- - spec/models/message_status_spec.rb
493
+ - spec/models/grammar_file_built_in_spec.rb
494
+ - spec/models/update_conference_participant_request_spec.rb
495
+ - spec/models/hangup_spec.rb
496
+ - spec/models/call_result_spec.rb
497
+ - spec/models/queue_member_list_spec.rb
498
+ - spec/models/make_call_request_spec.rb
499
+ - spec/models/account_type_spec.rb
500
+ - spec/models/log_level_spec.rb
501
+ - spec/models/set_talk_spec.rb
502
+ - spec/models/get_digits_spec.rb
468
503
  - spec/models/start_record_call_spec.rb
469
- - spec/models/conference_participant_result_spec.rb
470
- - spec/models/message_result_spec.rb
471
- - spec/models/record_utterance_term_reason_spec.rb
472
- - spec/models/sms_spec.rb
473
- - spec/models/get_speech_reason_spec.rb
474
- - spec/models/message_request_spec.rb
475
- - spec/models/account_status_spec.rb
476
- - spec/models/out_dial_spec.rb
477
- - spec/models/call_direction_spec.rb
478
- - spec/models/language_spec.rb
479
- - spec/models/play_beep_spec.rb
480
- - spec/models/conference_status_spec.rb
481
- - spec/models/request_type_spec.rb
482
- - spec/models/terminate_conference_spec.rb
483
- - spec/models/conference_result_spec.rb
484
- - spec/models/create_conference_request_spec.rb
485
- - spec/models/buy_incoming_number_request_spec.rb
486
- - spec/models/reject_spec.rb
487
504
  - spec/models/messages_list_spec.rb
488
- - spec/models/hangup_spec.rb
489
- - spec/models/queue_member_spec.rb
490
- - spec/models/percl_command_spec.rb
505
+ - spec/models/if_machine_spec.rb
506
+ - spec/models/reject_spec.rb
507
+ - spec/models/conference_result_spec.rb
508
+ - spec/models/recording_list_spec.rb
491
509
  - spec/models/machine_type_spec.rb
492
- - spec/models/unpark_spec.rb
493
- - spec/models/application_request_spec.rb
494
- - spec/models/account_request_spec.rb
495
- - spec/models/incoming_number_result_spec.rb
496
- - spec/models/queue_result_spec.rb
497
- - spec/models/record_utterance_spec.rb
498
- - spec/models/available_number_spec.rb
510
+ - spec/models/request_type_spec.rb
511
+ - spec/models/message_status_spec.rb
512
+ - spec/models/play_spec.rb
513
+ - spec/models/terminate_conference_spec.rb
499
514
  - spec/models/pause_spec.rb
500
- - spec/models/conference_participant_list_spec.rb
501
- - spec/models/set_listen_spec.rb
502
- - spec/models/available_number_list_spec.rb
503
- - spec/models/add_to_conference_spec.rb
504
- - spec/models/enqueue_spec.rb
505
515
  - spec/models/application_result_spec.rb
506
- - spec/models/call_result_spec.rb
507
- - spec/models/update_call_request_spec.rb
508
- - spec/models/call_status_spec.rb
509
- - spec/models/grammar_file_built_in_spec.rb
510
- - spec/models/capabilities_spec.rb
511
- - spec/models/park_spec.rb
512
- - spec/models/queue_request_spec.rb
513
- - spec/models/message_direction_spec.rb
514
- - spec/models/mutable_resource_model_spec.rb
515
516
  - spec/models/update_conference_request_spec.rb
516
- - spec/models/recording_list_spec.rb
517
- - spec/models/application_list_spec.rb
517
+ - spec/models/language_spec.rb
518
+ - spec/models/percl_script_spec.rb
518
519
  - spec/models/play_early_media_spec.rb
519
- - spec/models/remove_from_conference_spec.rb
520
- - spec/models/account_type_spec.rb
521
- - spec/models/queue_result_status_spec.rb
522
- - spec/models/send_digits_spec.rb
523
520
  - spec/models/say_spec.rb
524
- - spec/models/log_level_spec.rb
525
- - spec/models/update_conference_request_status_spec.rb
526
- - spec/models/make_call_request_spec.rb
527
- - spec/models/create_conference_spec.rb
528
- - spec/models/play_spec.rb
529
- - spec/models/get_speech_spec.rb
530
- - spec/models/log_list_spec.rb
531
- - spec/models/queue_member_list_spec.rb
532
- - spec/models/conference_list_spec.rb
521
+ - spec/models/mutable_resource_model_spec.rb
522
+ - spec/models/out_dial_spec.rb
523
+ - spec/models/record_utterance_spec.rb
524
+ - spec/models/call_status_spec.rb
525
+ - spec/models/account_request_spec.rb
526
+ - spec/models/enqueue_spec.rb
527
+ - spec/models/create_conference_request_spec.rb
528
+ - spec/models/incoming_number_result_spec.rb
529
+ - spec/models/sms_spec.rb
530
+ - spec/models/filter_logs_request_spec.rb
533
531
  - spec/models/update_call_request_status_spec.rb
532
+ - spec/models/dequeue_spec.rb
533
+ - spec/models/recording_result_spec.rb
534
+ - spec/models/queue_result_spec.rb
535
+ - spec/models/buy_incoming_number_request_spec.rb
536
+ - spec/models/pagination_model_spec.rb
537
+ - spec/models/update_call_request_spec.rb
534
538
  - spec/models/queue_list_spec.rb
535
- - spec/models/call_list_spec.rb
536
- - spec/models/set_talk_spec.rb
537
- - spec/models/incoming_number_list_spec.rb
538
- - spec/models/if_machine_spec.rb
539
+ - spec/models/application_request_spec.rb
540
+ - spec/models/conference_list_spec.rb
541
+ - spec/models/send_digits_spec.rb
542
+ - spec/models/application_list_spec.rb
539
543
  - spec/quickstart_spec.rb
540
544
  - spec/spec_helper.rb
545
+ - spec/utils/request_verifier_spec.rb
546
+ - spec/utils/signature_information_spec.rb