noresponse 2.0.18 → 2.1.0
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/no_response/integrations.rb +1 -1
- data/lib/no_response/late_results.rb +23 -17
- data/lib/no_response/models/operations/createwebhookendpoint_response.rb +34 -0
- data/lib/no_response/models/operations/createwebhookendpoint_response.rbi +20 -0
- data/lib/no_response/models/operations/deletewebhookendpoint_request.rb +29 -0
- data/lib/no_response/models/operations/deletewebhookendpoint_request.rbi +14 -0
- data/lib/no_response/models/operations/deletewebhookendpoint_response.rb +28 -0
- data/lib/no_response/models/operations/deletewebhookendpoint_response.rbi +14 -0
- data/lib/no_response/models/operations/listwebhookendpoints_response.rb +32 -0
- data/lib/no_response/models/operations/listwebhookendpoints_response.rbi +20 -0
- data/lib/no_response/models/operations/rotatewebhooksigningkey_request.rb +33 -0
- data/lib/no_response/models/operations/rotatewebhooksigningkey_request.rbi +20 -0
- data/lib/no_response/models/operations/rotatewebhooksigningkey_response.rb +32 -0
- data/lib/no_response/models/operations/rotatewebhooksigningkey_response.rbi +20 -0
- data/lib/no_response/models/operations/sendwebhooktestevent_request.rb +33 -0
- data/lib/no_response/models/operations/sendwebhooktestevent_request.rbi +20 -0
- data/lib/no_response/models/operations/sendwebhooktestevent_response.rb +32 -0
- data/lib/no_response/models/operations/sendwebhooktestevent_response.rbi +20 -0
- data/lib/no_response/models/operations.rb +8 -0
- data/lib/no_response/models/shared/assessment.rb +12 -2
- data/lib/no_response/models/shared/assessment.rbi +6 -0
- data/lib/no_response/models/shared/assessmentauthcontext.rb +121 -0
- data/lib/no_response/models/shared/assessmentauthcontext.rbi +56 -0
- data/lib/no_response/models/shared/assessmentquery.rb +1 -1
- data/lib/no_response/models/shared/assessmentrequest.rb +1 -1
- data/lib/no_response/models/shared/authcontext.rb +4 -4
- data/lib/no_response/models/shared/badrequesterrorcode.rb +1 -0
- data/lib/no_response/models/shared/conflicterrorcode.rb +2 -0
- data/lib/no_response/models/shared/hookpoint.rb +5 -2
- data/lib/no_response/models/shared/responsemode.rb +4 -1
- data/lib/no_response/models/shared/security.rb +3 -3
- data/lib/no_response/models/shared/signingkey.rb +49 -0
- data/lib/no_response/models/shared/signingkey.rbi +26 -0
- data/lib/no_response/models/shared/signingsecret.rb +49 -0
- data/lib/no_response/models/shared/signingsecret.rbi +26 -0
- data/lib/no_response/models/shared/transport.rb +5 -2
- data/lib/no_response/models/shared/webhookendpoint.rb +100 -0
- data/lib/no_response/models/shared/webhookendpoint.rbi +50 -0
- data/lib/no_response/models/shared/webhookendpointcreated.rb +41 -0
- data/lib/no_response/models/shared/webhookendpointcreated.rbi +20 -0
- data/lib/no_response/models/shared/webhookendpointlist.rb +32 -0
- data/lib/no_response/models/shared/webhookendpointlist.rbi +14 -0
- data/lib/no_response/models/shared/webhookendpointrequest.rb +42 -0
- data/lib/no_response/models/shared/webhookendpointrequest.rbi +20 -0
- data/lib/no_response/models/shared/webhookendpointstate.rb +20 -0
- data/lib/no_response/models/shared/webhookendpointstate.rbi +9 -0
- data/lib/no_response/models/shared/webhookkeyrotation.rb +65 -0
- data/lib/no_response/models/shared/webhookkeyrotation.rbi +32 -0
- data/lib/no_response/models/shared/webhookkeyrotationrequest.rb +23 -0
- data/lib/no_response/models/shared/webhookkeyrotationrequest.rbi +9 -0
- data/lib/no_response/models/shared/webhooktest.rb +86 -0
- data/lib/no_response/models/shared/webhooktest.rbi +38 -0
- data/lib/no_response/models/shared/webhooktestrequest.rb +39 -0
- data/lib/no_response/models/shared/webhooktestrequest.rbi +14 -0
- data/lib/no_response/models/shared/webhooktestrequestevent.rb +19 -0
- data/lib/no_response/models/shared/webhooktestrequestevent.rbi +9 -0
- data/lib/no_response/models/shared.rb +13 -0
- data/lib/no_response/noresponseclient.rb +2 -1
- data/lib/no_response/sdkconfiguration.rb +5 -2
- data/lib/no_response/webhookendpoints.rb +1444 -0
- data/lib/no_response/webhooks.rb +7 -2
- data/lib/noresponse.rb +1 -0
- metadata +45 -2
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
module NoResponse
|
|
5
|
+
module Models
|
|
6
|
+
module Shared
|
|
7
|
+
# The identity fields of the auth context the assessment was made with, echoed for the tenant's own correlation: the request's auth_context, or the one a hosted provider hook (POST /hooks/{integration_id}) built, with transport provider_hook and its hook_point. Present exactly when the request carried an auth_context, and the same on every revision of the assessment. Values are as the request or the hook sent them; tokens, timestamps, roles and scopes are not echoed, and the echo does not change the score.
|
|
8
|
+
class AssessmentAuthContext
|
|
9
|
+
extend T::Sig
|
|
10
|
+
include Crystalline::MetadataFields
|
|
11
|
+
|
|
12
|
+
# The provider slug the context named.
|
|
13
|
+
field(
|
|
14
|
+
:provider,
|
|
15
|
+
::String,
|
|
16
|
+
{'format_json': {'letter_case': ::NoResponse::Utils.field_name("provider"), required: true}}
|
|
17
|
+
)
|
|
18
|
+
# The issuer the context named.
|
|
19
|
+
field(
|
|
20
|
+
:issuer,
|
|
21
|
+
::String,
|
|
22
|
+
{'format_json': {'letter_case': ::NoResponse::Utils.field_name("issuer"), required: true}}
|
|
23
|
+
)
|
|
24
|
+
# The verified flag the context carried. A provider_hook context is always false.
|
|
25
|
+
field(
|
|
26
|
+
:verified,
|
|
27
|
+
Crystalline::Boolean.new,
|
|
28
|
+
{'format_json': {'letter_case': ::NoResponse::Utils.field_name("verified"), required: true}}
|
|
29
|
+
)
|
|
30
|
+
# Where the context was derived: backend (also when the request named no transport), browser, or provider_hook for a hosted provider hook.
|
|
31
|
+
field(
|
|
32
|
+
:transport,
|
|
33
|
+
Models::Shared::Transport,
|
|
34
|
+
{
|
|
35
|
+
'format_json': {
|
|
36
|
+
'letter_case': ::NoResponse::Utils.field_name("transport"),
|
|
37
|
+
required: true,
|
|
38
|
+
'decoder': ::NoResponse::Utils.open_enum_from_string(Models::Shared::Transport, false)
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
)
|
|
42
|
+
# The subject the context named; absent when it named none (a pre_registration hook).
|
|
43
|
+
field(
|
|
44
|
+
:subject,
|
|
45
|
+
Crystalline::Nilable.new(::String),
|
|
46
|
+
{'format_json': {'letter_case': ::NoResponse::Utils.field_name("subject")}}
|
|
47
|
+
)
|
|
48
|
+
# The session identifier the context named, when it named one.
|
|
49
|
+
field(
|
|
50
|
+
:session_id,
|
|
51
|
+
Crystalline::Nilable.new(::String),
|
|
52
|
+
{'format_json': {'letter_case': ::NoResponse::Utils.field_name("session_id")}}
|
|
53
|
+
)
|
|
54
|
+
# The organization identifier the context named, when it named one.
|
|
55
|
+
field(
|
|
56
|
+
:organization_id,
|
|
57
|
+
Crystalline::Nilable.new(::String),
|
|
58
|
+
{'format_json': {'letter_case': ::NoResponse::Utils.field_name("organization_id")}}
|
|
59
|
+
)
|
|
60
|
+
# The provider event a provider_hook context was sent for; absent for any other transport.
|
|
61
|
+
field(
|
|
62
|
+
:hook_point,
|
|
63
|
+
Crystalline::Nilable.new(Models::Shared::HookPoint),
|
|
64
|
+
{
|
|
65
|
+
'format_json': {
|
|
66
|
+
'letter_case': ::NoResponse::Utils.field_name("hook_point"),
|
|
67
|
+
'decoder': ::NoResponse::Utils.open_enum_from_string(Models::Shared::HookPoint, true)
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
sig {
|
|
73
|
+
params(
|
|
74
|
+
provider: ::String,
|
|
75
|
+
issuer: ::String,
|
|
76
|
+
verified: T::Boolean,
|
|
77
|
+
transport: Models::Shared::Transport,
|
|
78
|
+
subject: T.nilable(::String),
|
|
79
|
+
session_id: T.nilable(::String),
|
|
80
|
+
organization_id: T.nilable(::String),
|
|
81
|
+
hook_point: T.nilable(Models::Shared::HookPoint)
|
|
82
|
+
)
|
|
83
|
+
.void
|
|
84
|
+
}
|
|
85
|
+
def initialize(
|
|
86
|
+
provider:,
|
|
87
|
+
issuer:,
|
|
88
|
+
verified:,
|
|
89
|
+
transport:,
|
|
90
|
+
subject: nil,
|
|
91
|
+
session_id: nil,
|
|
92
|
+
organization_id: nil,
|
|
93
|
+
hook_point: nil
|
|
94
|
+
)
|
|
95
|
+
@provider = provider
|
|
96
|
+
@issuer = issuer
|
|
97
|
+
@verified = verified
|
|
98
|
+
@transport = transport
|
|
99
|
+
@subject = subject
|
|
100
|
+
@session_id = session_id
|
|
101
|
+
@organization_id = organization_id
|
|
102
|
+
@hook_point = hook_point
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
sig { params(other: T.untyped).returns(T::Boolean) }
|
|
106
|
+
def ==(other)
|
|
107
|
+
return false unless other.is_a?(self.class)
|
|
108
|
+
return false unless @provider == other.provider
|
|
109
|
+
return false unless @issuer == other.issuer
|
|
110
|
+
return false unless @verified == other.verified
|
|
111
|
+
return false unless @transport == other.transport
|
|
112
|
+
return false unless @subject == other.subject
|
|
113
|
+
return false unless @session_id == other.session_id
|
|
114
|
+
return false unless @organization_id == other.organization_id
|
|
115
|
+
return false unless @hook_point == other.hook_point
|
|
116
|
+
true
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
end
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
class NoResponse::Models::Shared::AssessmentAuthContext
|
|
5
|
+
extend ::Crystalline::MetadataFields::ClassMethods
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
class NoResponse::Models::Shared::AssessmentAuthContext
|
|
9
|
+
def provider
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def provider=(str_)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def issuer
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def issuer=(str_)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def verified
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def verified=(str_)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def transport
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def transport=(str_)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def subject
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def subject=(str_)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def session_id
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def session_id=(str_)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def organization_id
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def organization_id=(str_)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def hook_point
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def hook_point=(str_)
|
|
55
|
+
end
|
|
56
|
+
end
|
|
@@ -28,7 +28,7 @@ module NoResponse
|
|
|
28
28
|
{
|
|
29
29
|
'format_json': {
|
|
30
30
|
'letter_case': ::NoResponse::Utils.field_name("response_mode"),
|
|
31
|
-
'decoder': ::NoResponse::Utils.
|
|
31
|
+
'decoder': ::NoResponse::Utils.open_enum_from_string(Models::Shared::ResponseMode, true)
|
|
32
32
|
}
|
|
33
33
|
}
|
|
34
34
|
)
|
|
@@ -46,7 +46,7 @@ module NoResponse
|
|
|
46
46
|
{
|
|
47
47
|
'format_json': {
|
|
48
48
|
'letter_case': ::NoResponse::Utils.field_name("response_mode"),
|
|
49
|
-
'decoder': ::NoResponse::Utils.
|
|
49
|
+
'decoder': ::NoResponse::Utils.open_enum_from_string(Models::Shared::ResponseMode, true)
|
|
50
50
|
}
|
|
51
51
|
}
|
|
52
52
|
)
|
|
@@ -128,25 +128,25 @@ module NoResponse
|
|
|
128
128
|
Crystalline::Nilable.new(Crystalline::Boolean.new),
|
|
129
129
|
{'format_json': {'letter_case': ::NoResponse::Utils.field_name("impersonated")}}
|
|
130
130
|
)
|
|
131
|
-
# Where
|
|
131
|
+
# Where the context was derived: backend (also when the request named no transport), browser, or provider_hook for a hosted provider hook.
|
|
132
132
|
field(
|
|
133
133
|
:transport,
|
|
134
134
|
Crystalline::Nilable.new(Models::Shared::Transport),
|
|
135
135
|
{
|
|
136
136
|
'format_json': {
|
|
137
137
|
'letter_case': ::NoResponse::Utils.field_name("transport"),
|
|
138
|
-
'decoder': ::NoResponse::Utils.
|
|
138
|
+
'decoder': ::NoResponse::Utils.open_enum_from_string(Models::Shared::Transport, true)
|
|
139
139
|
}
|
|
140
140
|
}
|
|
141
141
|
)
|
|
142
|
-
# The provider event a provider_hook context was sent for
|
|
142
|
+
# The provider event a provider_hook context was sent for; absent for any other transport.
|
|
143
143
|
field(
|
|
144
144
|
:hook_point,
|
|
145
145
|
Crystalline::Nilable.new(Models::Shared::HookPoint),
|
|
146
146
|
{
|
|
147
147
|
'format_json': {
|
|
148
148
|
'letter_case': ::NoResponse::Utils.field_name("hook_point"),
|
|
149
|
-
'decoder': ::NoResponse::Utils.
|
|
149
|
+
'decoder': ::NoResponse::Utils.open_enum_from_string(Models::Shared::HookPoint, true)
|
|
150
150
|
}
|
|
151
151
|
}
|
|
152
152
|
)
|
|
@@ -10,6 +10,8 @@ module NoResponse
|
|
|
10
10
|
enums do
|
|
11
11
|
IDEMPOTENCY_KEY_REUSED = new("idempotency_key_reused")
|
|
12
12
|
KEY_ROTATION_IN_PROGRESS = new("key_rotation_in_progress")
|
|
13
|
+
WEBHOOK_ENDPOINT_LIMIT_REACHED = new("webhook_endpoint_limit_reached")
|
|
14
|
+
WEBHOOK_ENDPOINT_UNVERIFIED = new("webhook_endpoint_unverified")
|
|
13
15
|
TOO_MANY_INTEGRATIONS = new("too_many_integrations")
|
|
14
16
|
end
|
|
15
17
|
|
|
@@ -4,8 +4,9 @@
|
|
|
4
4
|
module NoResponse
|
|
5
5
|
module Models
|
|
6
6
|
module Shared
|
|
7
|
-
# HookPoint - The provider event a provider_hook context was sent for
|
|
8
|
-
class HookPoint
|
|
7
|
+
# HookPoint - The provider event a provider_hook context was sent for; absent for any other transport.
|
|
8
|
+
class HookPoint
|
|
9
|
+
include ::Crystalline::Enum
|
|
9
10
|
enums do
|
|
10
11
|
PRE_REGISTRATION = new("pre_registration")
|
|
11
12
|
POST_REGISTRATION = new("post_registration")
|
|
@@ -13,6 +14,8 @@ module NoResponse
|
|
|
13
14
|
POST_LOGIN = new("post_login")
|
|
14
15
|
TOKEN_ISSUANCE = new("token_issuance")
|
|
15
16
|
end
|
|
17
|
+
|
|
18
|
+
open!
|
|
16
19
|
end
|
|
17
20
|
end
|
|
18
21
|
end
|
|
@@ -5,11 +5,14 @@ module NoResponse
|
|
|
5
5
|
module Models
|
|
6
6
|
module Shared
|
|
7
7
|
# ResponseMode - standard returns the consolidated risk response; detailed adds merged provider-neutral facts when the key has detailed scope. There is no raw mode.
|
|
8
|
-
class ResponseMode
|
|
8
|
+
class ResponseMode
|
|
9
|
+
include ::Crystalline::Enum
|
|
9
10
|
enums do
|
|
10
11
|
STANDARD = new("standard")
|
|
11
12
|
DETAILED = new("detailed")
|
|
12
13
|
end
|
|
14
|
+
|
|
15
|
+
open!
|
|
13
16
|
end
|
|
14
17
|
end
|
|
15
18
|
end
|
|
@@ -11,12 +11,12 @@ module NoResponse
|
|
|
11
11
|
|
|
12
12
|
field(
|
|
13
13
|
:api_key,
|
|
14
|
-
::String,
|
|
14
|
+
Crystalline::Nilable.new(::String),
|
|
15
15
|
{'security': {'scheme': true, 'type': "http", 'sub_type': "bearer", 'field_name': "Authorization"}}
|
|
16
16
|
)
|
|
17
17
|
|
|
18
|
-
sig { params(api_key: ::String).void }
|
|
19
|
-
def initialize(api_key:)
|
|
18
|
+
sig { params(api_key: T.nilable(::String)).void }
|
|
19
|
+
def initialize(api_key: nil)
|
|
20
20
|
@api_key = api_key
|
|
21
21
|
end
|
|
22
22
|
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
module NoResponse
|
|
5
|
+
module Models
|
|
6
|
+
module Shared
|
|
7
|
+
# One signing key, by id. The secret is not included.
|
|
8
|
+
class SigningKey
|
|
9
|
+
extend T::Sig
|
|
10
|
+
include Crystalline::MetadataFields
|
|
11
|
+
|
|
12
|
+
# The signing key id, sent as NR-Webhook-Key-Id on every delivery it signs.
|
|
13
|
+
field(
|
|
14
|
+
:key_id,
|
|
15
|
+
::String,
|
|
16
|
+
{'format_json': {'letter_case': ::NoResponse::Utils.field_name("key_id"), required: true}}
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
field(
|
|
20
|
+
:created_at,
|
|
21
|
+
::String,
|
|
22
|
+
{'format_json': {'letter_case': ::NoResponse::Utils.field_name("created_at"), required: true}}
|
|
23
|
+
)
|
|
24
|
+
# Present on a key a rotation replaced: it stops verifying at this instant, 7 days after the rotation. Absent on the key that signs.
|
|
25
|
+
field(
|
|
26
|
+
:expires_at,
|
|
27
|
+
Crystalline::Nilable.new(::String),
|
|
28
|
+
{'format_json': {'letter_case': ::NoResponse::Utils.field_name("expires_at")}}
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
sig { params(key_id: ::String, created_at: ::String, expires_at: T.nilable(::String)).void }
|
|
32
|
+
def initialize(key_id:, created_at:, expires_at: nil)
|
|
33
|
+
@key_id = key_id
|
|
34
|
+
@created_at = created_at
|
|
35
|
+
@expires_at = expires_at
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
sig { params(other: T.untyped).returns(T::Boolean) }
|
|
39
|
+
def ==(other)
|
|
40
|
+
return false unless other.is_a?(self.class)
|
|
41
|
+
return false unless @key_id == other.key_id
|
|
42
|
+
return false unless @created_at == other.created_at
|
|
43
|
+
return false unless @expires_at == other.expires_at
|
|
44
|
+
true
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
class NoResponse::Models::Shared::SigningKey
|
|
5
|
+
extend ::Crystalline::MetadataFields::ClassMethods
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
class NoResponse::Models::Shared::SigningKey
|
|
9
|
+
def key_id
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def key_id=(str_)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def created_at
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def created_at=(str_)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def expires_at
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def expires_at=(str_)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
module NoResponse
|
|
5
|
+
module Models
|
|
6
|
+
module Shared
|
|
7
|
+
# A newly issued signing key with its secret, shown only in this answer. A receiver verifies NR-Webhook-Signature with the secret's UTF-8 bytes as the HMAC-SHA256 key.
|
|
8
|
+
class SigningSecret
|
|
9
|
+
extend T::Sig
|
|
10
|
+
include Crystalline::MetadataFields
|
|
11
|
+
|
|
12
|
+
# The signing key id, sent as NR-Webhook-Key-Id on every delivery it signs.
|
|
13
|
+
field(
|
|
14
|
+
:key_id,
|
|
15
|
+
::String,
|
|
16
|
+
{'format_json': {'letter_case': ::NoResponse::Utils.field_name("key_id"), required: true}}
|
|
17
|
+
)
|
|
18
|
+
# The signing secret: 32 random bytes as 43 characters of unpadded base64url. It is not stored in readable form or returned again.
|
|
19
|
+
field(
|
|
20
|
+
:secret,
|
|
21
|
+
::String,
|
|
22
|
+
{'format_json': {'letter_case': ::NoResponse::Utils.field_name("secret"), required: true}}
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
field(
|
|
26
|
+
:created_at,
|
|
27
|
+
::String,
|
|
28
|
+
{'format_json': {'letter_case': ::NoResponse::Utils.field_name("created_at"), required: true}}
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
sig { params(key_id: ::String, secret: ::String, created_at: ::String).void }
|
|
32
|
+
def initialize(key_id:, secret:, created_at:)
|
|
33
|
+
@key_id = key_id
|
|
34
|
+
@secret = secret
|
|
35
|
+
@created_at = created_at
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
sig { params(other: T.untyped).returns(T::Boolean) }
|
|
39
|
+
def ==(other)
|
|
40
|
+
return false unless other.is_a?(self.class)
|
|
41
|
+
return false unless @key_id == other.key_id
|
|
42
|
+
return false unless @secret == other.secret
|
|
43
|
+
return false unless @created_at == other.created_at
|
|
44
|
+
true
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
class NoResponse::Models::Shared::SigningSecret
|
|
5
|
+
extend ::Crystalline::MetadataFields::ClassMethods
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
class NoResponse::Models::Shared::SigningSecret
|
|
9
|
+
def key_id
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def key_id=(str_)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def secret
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def secret=(str_)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def created_at
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def created_at=(str_)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -4,13 +4,16 @@
|
|
|
4
4
|
module NoResponse
|
|
5
5
|
module Models
|
|
6
6
|
module Shared
|
|
7
|
-
# Transport - Where
|
|
8
|
-
class Transport
|
|
7
|
+
# Transport - Where the context was derived: backend (also when the request named no transport), browser, or provider_hook for a hosted provider hook.
|
|
8
|
+
class Transport
|
|
9
|
+
include ::Crystalline::Enum
|
|
9
10
|
enums do
|
|
10
11
|
BACKEND = new("backend")
|
|
11
12
|
BROWSER = new("browser")
|
|
12
13
|
PROVIDER_HOOK = new("provider_hook")
|
|
13
14
|
end
|
|
15
|
+
|
|
16
|
+
open!
|
|
14
17
|
end
|
|
15
18
|
end
|
|
16
19
|
end
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
module NoResponse
|
|
5
|
+
module Models
|
|
6
|
+
module Shared
|
|
7
|
+
# One of the tenant's registered webhook endpoints. Signing secrets are not part of it: a secret is shown once, when it is issued (POST /v1/webhooks and POST /v1/webhooks/{endpoint_id}/rotate).
|
|
8
|
+
class WebhookEndpoint
|
|
9
|
+
extend T::Sig
|
|
10
|
+
include Crystalline::MetadataFields
|
|
11
|
+
|
|
12
|
+
# Opaque id of the endpoint registration.
|
|
13
|
+
field(
|
|
14
|
+
:endpoint_id,
|
|
15
|
+
::String,
|
|
16
|
+
{'format_json': {'letter_case': ::NoResponse::Utils.field_name("endpoint_id"), required: true}}
|
|
17
|
+
)
|
|
18
|
+
# The destination URL, as registered.
|
|
19
|
+
field :url, ::String, {'format_json': {'letter_case': ::NoResponse::Utils.field_name("url"), required: true}}
|
|
20
|
+
# unverified until the endpoint echoes an endpoint.verification challenge (send one with POST /v1/webhooks/{endpoint_id}/test); verified receives assessment.updated events; disabled after 72 hours of continuous delivery failure, and verified again by the same challenge.
|
|
21
|
+
field(
|
|
22
|
+
:state,
|
|
23
|
+
Models::Shared::WebhookEndpointState,
|
|
24
|
+
{
|
|
25
|
+
'format_json': {
|
|
26
|
+
'letter_case': ::NoResponse::Utils.field_name("state"),
|
|
27
|
+
required: true,
|
|
28
|
+
'decoder': ::NoResponse::Utils.open_enum_from_string(Models::Shared::WebhookEndpointState, false)
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
)
|
|
32
|
+
# standard returns the consolidated risk response; detailed adds merged provider-neutral facts when the key has detailed scope. There is no raw mode.
|
|
33
|
+
field(
|
|
34
|
+
:response_mode,
|
|
35
|
+
Models::Shared::ResponseMode,
|
|
36
|
+
{
|
|
37
|
+
'format_json': {
|
|
38
|
+
'letter_case': ::NoResponse::Utils.field_name("response_mode"),
|
|
39
|
+
required: true,
|
|
40
|
+
'decoder': ::NoResponse::Utils.open_enum_from_string(Models::Shared::ResponseMode, false)
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
field(
|
|
46
|
+
:created_at,
|
|
47
|
+
::String,
|
|
48
|
+
{'format_json': {'letter_case': ::NoResponse::Utils.field_name("created_at"), required: true}}
|
|
49
|
+
)
|
|
50
|
+
# The keys a receiver may see in NR-Webhook-Key-Id, oldest first. The last one signs every new delivery; an older one keeps verifying until its expires_at.
|
|
51
|
+
field(
|
|
52
|
+
:signing_keys,
|
|
53
|
+
Crystalline::Array.new(Models::Shared::SigningKey),
|
|
54
|
+
{'format_json': {'letter_case': ::NoResponse::Utils.field_name("signing_keys"), required: true}}
|
|
55
|
+
)
|
|
56
|
+
# When the endpoint last echoed a challenge. Absent until it first does.
|
|
57
|
+
field(
|
|
58
|
+
:verified_at,
|
|
59
|
+
Crystalline::Nilable.new(::String),
|
|
60
|
+
{'format_json': {'letter_case': ::NoResponse::Utils.field_name("verified_at")}}
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
sig {
|
|
64
|
+
params(
|
|
65
|
+
endpoint_id: ::String,
|
|
66
|
+
url: ::String,
|
|
67
|
+
state: Models::Shared::WebhookEndpointState,
|
|
68
|
+
response_mode: Models::Shared::ResponseMode,
|
|
69
|
+
created_at: ::String,
|
|
70
|
+
signing_keys: T::Array[Models::Shared::SigningKey],
|
|
71
|
+
verified_at: T.nilable(::String)
|
|
72
|
+
)
|
|
73
|
+
.void
|
|
74
|
+
}
|
|
75
|
+
def initialize(endpoint_id:, url:, state:, response_mode:, created_at:, signing_keys:, verified_at: nil)
|
|
76
|
+
@endpoint_id = endpoint_id
|
|
77
|
+
@url = url
|
|
78
|
+
@state = state
|
|
79
|
+
@response_mode = response_mode
|
|
80
|
+
@created_at = created_at
|
|
81
|
+
@signing_keys = signing_keys
|
|
82
|
+
@verified_at = verified_at
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
sig { params(other: T.untyped).returns(T::Boolean) }
|
|
86
|
+
def ==(other)
|
|
87
|
+
return false unless other.is_a?(self.class)
|
|
88
|
+
return false unless @endpoint_id == other.endpoint_id
|
|
89
|
+
return false unless @url == other.url
|
|
90
|
+
return false unless @state == other.state
|
|
91
|
+
return false unless @response_mode == other.response_mode
|
|
92
|
+
return false unless @created_at == other.created_at
|
|
93
|
+
return false unless @signing_keys == other.signing_keys
|
|
94
|
+
return false unless @verified_at == other.verified_at
|
|
95
|
+
true
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
class NoResponse::Models::Shared::WebhookEndpoint
|
|
5
|
+
extend ::Crystalline::MetadataFields::ClassMethods
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
class NoResponse::Models::Shared::WebhookEndpoint
|
|
9
|
+
def endpoint_id
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def endpoint_id=(str_)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def url
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def url=(str_)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def state
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def state=(str_)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def response_mode
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def response_mode=(str_)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def created_at
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def created_at=(str_)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def signing_keys
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def signing_keys=(str_)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def verified_at
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def verified_at=(str_)
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
module NoResponse
|
|
5
|
+
module Models
|
|
6
|
+
module Shared
|
|
7
|
+
# The 201 answer of POST /v1/webhooks: the new endpoint, unverified, and its first signing secret, shown once. Store the secret where the receiver reads it, then send endpoint.verification with POST /v1/webhooks/{endpoint_id}/test.
|
|
8
|
+
class WebhookEndpointCreated
|
|
9
|
+
extend T::Sig
|
|
10
|
+
include Crystalline::MetadataFields
|
|
11
|
+
|
|
12
|
+
# One of the tenant's registered webhook endpoints. Signing secrets are not part of it: a secret is shown once, when it is issued (POST /v1/webhooks and POST /v1/webhooks/{endpoint_id}/rotate).
|
|
13
|
+
field(
|
|
14
|
+
:endpoint,
|
|
15
|
+
Models::Shared::WebhookEndpoint,
|
|
16
|
+
{'format_json': {'letter_case': ::NoResponse::Utils.field_name("endpoint"), required: true}}
|
|
17
|
+
)
|
|
18
|
+
# A newly issued signing key with its secret, shown only in this answer. A receiver verifies NR-Webhook-Signature with the secret's UTF-8 bytes as the HMAC-SHA256 key.
|
|
19
|
+
field(
|
|
20
|
+
:signing_secret,
|
|
21
|
+
Models::Shared::SigningSecret,
|
|
22
|
+
{'format_json': {'letter_case': ::NoResponse::Utils.field_name("signing_secret"), required: true}}
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
sig { params(endpoint: Models::Shared::WebhookEndpoint, signing_secret: Models::Shared::SigningSecret).void }
|
|
26
|
+
def initialize(endpoint:, signing_secret:)
|
|
27
|
+
@endpoint = endpoint
|
|
28
|
+
@signing_secret = signing_secret
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
sig { params(other: T.untyped).returns(T::Boolean) }
|
|
32
|
+
def ==(other)
|
|
33
|
+
return false unless other.is_a?(self.class)
|
|
34
|
+
return false unless @endpoint == other.endpoint
|
|
35
|
+
return false unless @signing_secret == other.signing_secret
|
|
36
|
+
true
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|