noresponse 2.0.17
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 +7 -0
- data/lib/crystalline/enum.rbi +17 -0
- data/lib/crystalline/metadata_fields.rb +263 -0
- data/lib/crystalline/module.rb +186 -0
- data/lib/crystalline/types.rb +168 -0
- data/lib/crystalline/utils.rb +67 -0
- data/lib/crystalline.rb +11 -0
- data/lib/no_response/assessments.rb +1252 -0
- data/lib/no_response/auth.rb +263 -0
- data/lib/no_response/issued_credential.rb +21 -0
- data/lib/no_response/keys.rb +318 -0
- data/lib/no_response/late_results.rb +301 -0
- data/lib/no_response/models/callbacks.rb +10 -0
- data/lib/no_response/models/errors/apistatuserror.rb +41 -0
- data/lib/no_response/models/errors/apistatuserror.rbi +30 -0
- data/lib/no_response/models/errors/authenticationerror.rb +108 -0
- data/lib/no_response/models/errors/authenticationerror.rbi +56 -0
- data/lib/no_response/models/errors/badrequesterror.rb +108 -0
- data/lib/no_response/models/errors/badrequesterror.rbi +56 -0
- data/lib/no_response/models/errors/conflicterror.rb +108 -0
- data/lib/no_response/models/errors/conflicterror.rbi +56 -0
- data/lib/no_response/models/errors/notfounderror.rb +108 -0
- data/lib/no_response/models/errors/notfounderror.rbi +56 -0
- data/lib/no_response/models/errors/permissiondeniederror.rb +108 -0
- data/lib/no_response/models/errors/permissiondeniederror.rbi +56 -0
- data/lib/no_response/models/errors/ratelimiterror.rb +108 -0
- data/lib/no_response/models/errors/ratelimiterror.rbi +56 -0
- data/lib/no_response/models/errors.rb +16 -0
- data/lib/no_response/models/operations/createassessment_request.rb +36 -0
- data/lib/no_response/models/operations/createassessment_request.rbi +20 -0
- data/lib/no_response/models/operations/createassessment_response.rb +32 -0
- data/lib/no_response/models/operations/createassessment_response.rbi +20 -0
- data/lib/no_response/models/operations/getassessment_request.rb +41 -0
- data/lib/no_response/models/operations/getassessment_request.rbi +20 -0
- data/lib/no_response/models/operations/getassessment_response.rb +32 -0
- data/lib/no_response/models/operations/getassessment_response.rbi +20 -0
- data/lib/no_response/models/operations/queryaccountassessments_response.rb +44 -0
- data/lib/no_response/models/operations/queryaccountassessments_response.rbi +20 -0
- data/lib/no_response/models/operations/recordassessmentoutcome_request.rb +52 -0
- data/lib/no_response/models/operations/recordassessmentoutcome_request.rbi +26 -0
- data/lib/no_response/models/operations/recordassessmentoutcome_response.rb +32 -0
- data/lib/no_response/models/operations/recordassessmentoutcome_response.rbi +20 -0
- data/lib/no_response/models/operations/rotateapikey_response.rb +32 -0
- data/lib/no_response/models/operations/rotateapikey_response.rbi +20 -0
- data/lib/no_response/models/operations.rb +17 -0
- data/lib/no_response/models/shared/alternate_name.rb +23 -0
- data/lib/no_response/models/shared/alternate_name.rbi +9 -0
- data/lib/no_response/models/shared/alternate_name_union.rb +23 -0
- data/lib/no_response/models/shared/alternate_name_union.rbi +9 -0
- data/lib/no_response/models/shared/assessment.rb +235 -0
- data/lib/no_response/models/shared/assessment.rbi +116 -0
- data/lib/no_response/models/shared/assessmentlist.rb +78 -0
- data/lib/no_response/models/shared/assessmentlist.rbi +38 -0
- data/lib/no_response/models/shared/assessmentoutcome.rb +61 -0
- data/lib/no_response/models/shared/assessmentoutcome.rbi +32 -0
- data/lib/no_response/models/shared/assessmentoutcomerequest.rb +71 -0
- data/lib/no_response/models/shared/assessmentoutcomerequest.rbi +32 -0
- data/lib/no_response/models/shared/assessmentquery.rb +70 -0
- data/lib/no_response/models/shared/assessmentquery.rbi +32 -0
- data/lib/no_response/models/shared/assessmentrequest.rb +125 -0
- data/lib/no_response/models/shared/assessmentrequest.rbi +62 -0
- data/lib/no_response/models/shared/assessmentrequestclientcontext.rb +125 -0
- data/lib/no_response/models/shared/assessmentrequestclientcontext.rbi +62 -0
- data/lib/no_response/models/shared/assessmentrequestidentifiers.rb +74 -0
- data/lib/no_response/models/shared/assessmentrequestidentifiers.rbi +38 -0
- data/lib/no_response/models/shared/assessmentrequestissuedcredential.rb +33 -0
- data/lib/no_response/models/shared/assessmentrequestissuedcredential.rbi +14 -0
- data/lib/no_response/models/shared/assessmentrequestpolicycontext.rb +46 -0
- data/lib/no_response/models/shared/assessmentrequestpolicycontext.rbi +20 -0
- data/lib/no_response/models/shared/assessmenttiming.rb +41 -0
- data/lib/no_response/models/shared/assessmenttiming.rbi +20 -0
- data/lib/no_response/models/shared/assurancelevel.rb +18 -0
- data/lib/no_response/models/shared/assurancelevel.rbi +9 -0
- data/lib/no_response/models/shared/authcontext.rb +285 -0
- data/lib/no_response/models/shared/authcontext.rbi +152 -0
- data/lib/no_response/models/shared/authcontextmfa.rb +55 -0
- data/lib/no_response/models/shared/authcontextmfa.rbi +26 -0
- data/lib/no_response/models/shared/authenticationerrorcode.rb +18 -0
- data/lib/no_response/models/shared/authenticationerrorcode.rbi +9 -0
- data/lib/no_response/models/shared/badrequesterrorcode.rb +20 -0
- data/lib/no_response/models/shared/badrequesterrorcode.rbi +9 -0
- data/lib/no_response/models/shared/band.rb +21 -0
- data/lib/no_response/models/shared/band.rbi +9 -0
- data/lib/no_response/models/shared/breach.rb +108 -0
- data/lib/no_response/models/shared/breach.rbi +56 -0
- data/lib/no_response/models/shared/breachexposed.rb +28 -0
- data/lib/no_response/models/shared/breachexposed.rbi +9 -0
- data/lib/no_response/models/shared/breachkind.rb +24 -0
- data/lib/no_response/models/shared/breachkind.rbi +9 -0
- data/lib/no_response/models/shared/breachselector.rb +20 -0
- data/lib/no_response/models/shared/breachselector.rbi +9 -0
- data/lib/no_response/models/shared/breachsummary.rb +109 -0
- data/lib/no_response/models/shared/breachsummary.rbi +56 -0
- data/lib/no_response/models/shared/confidence.rb +21 -0
- data/lib/no_response/models/shared/confidence.rbi +9 -0
- data/lib/no_response/models/shared/conflicterrorcode.rb +19 -0
- data/lib/no_response/models/shared/conflicterrorcode.rbi +9 -0
- data/lib/no_response/models/shared/consistency.rb +85 -0
- data/lib/no_response/models/shared/consistency.rbi +32 -0
- data/lib/no_response/models/shared/consistencyvalue.rb +21 -0
- data/lib/no_response/models/shared/consistencyvalue.rbi +9 -0
- data/lib/no_response/models/shared/country.rb +20 -0
- data/lib/no_response/models/shared/country.rbi +9 -0
- data/lib/no_response/models/shared/email.rb +23 -0
- data/lib/no_response/models/shared/email.rbi +9 -0
- data/lib/no_response/models/shared/email_union.rb +23 -0
- data/lib/no_response/models/shared/email_union.rbi +9 -0
- data/lib/no_response/models/shared/failurereason.rb +24 -0
- data/lib/no_response/models/shared/failurereason.rbi +9 -0
- data/lib/no_response/models/shared/flow.rb +18 -0
- data/lib/no_response/models/shared/flow.rbi +9 -0
- data/lib/no_response/models/shared/freshness.rb +20 -0
- data/lib/no_response/models/shared/freshness.rbi +9 -0
- data/lib/no_response/models/shared/hookpoint.rb +19 -0
- data/lib/no_response/models/shared/hookpoint.rbi +9 -0
- data/lib/no_response/models/shared/identifierkind.rb +21 -0
- data/lib/no_response/models/shared/identifierkind.rbi +9 -0
- data/lib/no_response/models/shared/incompletereason.rb +23 -0
- data/lib/no_response/models/shared/incompletereason.rbi +9 -0
- data/lib/no_response/models/shared/incompletesource.rb +53 -0
- data/lib/no_response/models/shared/incompletesource.rbi +20 -0
- data/lib/no_response/models/shared/ipsummary.rb +61 -0
- data/lib/no_response/models/shared/ipsummary.rbi +26 -0
- data/lib/no_response/models/shared/ipsummarytype.rb +24 -0
- data/lib/no_response/models/shared/ipsummarytype.rbi +9 -0
- data/lib/no_response/models/shared/keyrotation.rb +79 -0
- data/lib/no_response/models/shared/keyrotation.rbi +44 -0
- data/lib/no_response/models/shared/keyrotationrequest.rb +33 -0
- data/lib/no_response/models/shared/keyrotationrequest.rbi +14 -0
- data/lib/no_response/models/shared/lane.rb +21 -0
- data/lib/no_response/models/shared/lane.rbi +9 -0
- data/lib/no_response/models/shared/linetype.rb +22 -0
- data/lib/no_response/models/shared/linetype.rbi +9 -0
- data/lib/no_response/models/shared/location.rb +23 -0
- data/lib/no_response/models/shared/location.rbi +9 -0
- data/lib/no_response/models/shared/location_union.rb +23 -0
- data/lib/no_response/models/shared/location_union.rbi +9 -0
- data/lib/no_response/models/shared/name_candidate.rb +23 -0
- data/lib/no_response/models/shared/name_candidate.rbi +9 -0
- data/lib/no_response/models/shared/name_candidate_union.rb +23 -0
- data/lib/no_response/models/shared/name_candidate_union.rbi +9 -0
- data/lib/no_response/models/shared/notfounderrorcode.rb +18 -0
- data/lib/no_response/models/shared/notfounderrorcode.rbi +9 -0
- data/lib/no_response/models/shared/outcome.rb +23 -0
- data/lib/no_response/models/shared/outcome.rbi +9 -0
- data/lib/no_response/models/shared/permissiondeniederrorcode.rb +18 -0
- data/lib/no_response/models/shared/permissiondeniederrorcode.rbi +9 -0
- data/lib/no_response/models/shared/phoneenrichment.rb +32 -0
- data/lib/no_response/models/shared/phoneenrichment.rbi +14 -0
- data/lib/no_response/models/shared/phoneenrichmentfields.rb +451 -0
- data/lib/no_response/models/shared/phoneenrichmentfields.rbi +212 -0
- data/lib/no_response/models/shared/platform.rb +18 -0
- data/lib/no_response/models/shared/platform.rbi +9 -0
- data/lib/no_response/models/shared/probleminvalidparam.rb +48 -0
- data/lib/no_response/models/shared/probleminvalidparam.rbi +26 -0
- data/lib/no_response/models/shared/ratelimiterrorcode.rb +18 -0
- data/lib/no_response/models/shared/ratelimiterrorcode.rbi +9 -0
- data/lib/no_response/models/shared/reasoncode.rb +52 -0
- data/lib/no_response/models/shared/reasoncode.rbi +9 -0
- data/lib/no_response/models/shared/reasonidentifier.rb +23 -0
- data/lib/no_response/models/shared/reasonidentifier.rbi +9 -0
- data/lib/no_response/models/shared/recommendation.rb +20 -0
- data/lib/no_response/models/shared/recommendation.rbi +9 -0
- data/lib/no_response/models/shared/responsemode.rb +16 -0
- data/lib/no_response/models/shared/responsemode.rbi +9 -0
- data/lib/no_response/models/shared/risk.rb +171 -0
- data/lib/no_response/models/shared/risk.rbi +80 -0
- data/lib/no_response/models/shared/riskconfidence.rb +20 -0
- data/lib/no_response/models/shared/riskconfidence.rbi +9 -0
- data/lib/no_response/models/shared/riskcoverage.rb +49 -0
- data/lib/no_response/models/shared/riskcoverage.rbi +26 -0
- data/lib/no_response/models/shared/riskdetails.rb +55 -0
- data/lib/no_response/models/shared/riskdetails.rbi +26 -0
- data/lib/no_response/models/shared/riskdetailsbreachname.rb +40 -0
- data/lib/no_response/models/shared/riskdetailsbreachname.rbi +20 -0
- data/lib/no_response/models/shared/riskdetailsphonename.rb +40 -0
- data/lib/no_response/models/shared/riskdetailsphonename.rbi +20 -0
- data/lib/no_response/models/shared/riskreason.rb +67 -0
- data/lib/no_response/models/shared/riskreason.rbi +26 -0
- data/lib/no_response/models/shared/risksummary.rb +73 -0
- data/lib/no_response/models/shared/risksummary.rbi +38 -0
- data/lib/no_response/models/shared/risksummaryemail.rb +55 -0
- data/lib/no_response/models/shared/risksummaryemail.rbi +26 -0
- data/lib/no_response/models/shared/risksummaryphone.rb +69 -0
- data/lib/no_response/models/shared/risksummaryphone.rbi +32 -0
- data/lib/no_response/models/shared/risksummaryusername.rb +41 -0
- data/lib/no_response/models/shared/risksummaryusername.rbi +20 -0
- data/lib/no_response/models/shared/scope.rb +21 -0
- data/lib/no_response/models/shared/scope.rbi +9 -0
- data/lib/no_response/models/shared/security.rb +32 -0
- data/lib/no_response/models/shared/security.rbi +14 -0
- data/lib/no_response/models/shared/signal.rb +149 -0
- data/lib/no_response/models/shared/signal.rbi +68 -0
- data/lib/no_response/models/shared/signaloutcome.rb +22 -0
- data/lib/no_response/models/shared/signaloutcome.rbi +9 -0
- data/lib/no_response/models/shared/social_profile.rb +23 -0
- data/lib/no_response/models/shared/social_profile.rbi +9 -0
- data/lib/no_response/models/shared/social_profile_union.rb +23 -0
- data/lib/no_response/models/shared/social_profile_union.rbi +9 -0
- data/lib/no_response/models/shared/status.rb +20 -0
- data/lib/no_response/models/shared/status.rbi +9 -0
- data/lib/no_response/models/shared/timezone.rb +23 -0
- data/lib/no_response/models/shared/timezone.rbi +9 -0
- data/lib/no_response/models/shared/timezone_union.rb +23 -0
- data/lib/no_response/models/shared/timezone_union.rbi +9 -0
- data/lib/no_response/models/shared/transport.rb +17 -0
- data/lib/no_response/models/shared/transport.rbi +9 -0
- data/lib/no_response/models/shared/website.rb +23 -0
- data/lib/no_response/models/shared/website.rbi +9 -0
- data/lib/no_response/models/shared/website_union.rb +23 -0
- data/lib/no_response/models/shared/website_union.rbi +9 -0
- data/lib/no_response/models/shared.rb +92 -0
- data/lib/no_response/noresponseclient.rb +110 -0
- data/lib/no_response/sdk_hooks/hooks.rb +97 -0
- data/lib/no_response/sdk_hooks/idempotency_key_hook.rb +25 -0
- data/lib/no_response/sdk_hooks/registration.rb +43 -0
- data/lib/no_response/sdk_hooks/types.rb +178 -0
- data/lib/no_response/sdkconfiguration.rb +107 -0
- data/lib/no_response/sdkconfiguration.rbi +83 -0
- data/lib/no_response/utils/forms.rb +230 -0
- data/lib/no_response/utils/headers.rb +80 -0
- data/lib/no_response/utils/query_params.rb +165 -0
- data/lib/no_response/utils/request_bodies.rb +77 -0
- data/lib/no_response/utils/retries.rb +137 -0
- data/lib/no_response/utils/security.rb +156 -0
- data/lib/no_response/utils/url.rb +122 -0
- data/lib/no_response/utils/utils.rb +243 -0
- data/lib/no_response/wait.rb +66 -0
- data/lib/no_response/webhooks.rb +177 -0
- data/lib/noresponse.rb +25 -0
- metadata +501 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
module NoResponse
|
|
5
|
+
module Models
|
|
6
|
+
module Shared
|
|
7
|
+
|
|
8
|
+
class ProblemInvalidParam
|
|
9
|
+
extend T::Sig
|
|
10
|
+
include Crystalline::MetadataFields
|
|
11
|
+
|
|
12
|
+
field(
|
|
13
|
+
:field,
|
|
14
|
+
::String,
|
|
15
|
+
{'format_json': {'letter_case': ::NoResponse::Utils.field_name("field"), required: true}}
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
field(
|
|
19
|
+
:reason,
|
|
20
|
+
::String,
|
|
21
|
+
{'format_json': {'letter_case': ::NoResponse::Utils.field_name("reason"), required: true}}
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
field(
|
|
25
|
+
:example,
|
|
26
|
+
Crystalline::Nilable.new(::String),
|
|
27
|
+
{'format_json': {'letter_case': ::NoResponse::Utils.field_name("example")}}
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
sig { params(field: ::String, reason: ::String, example: T.nilable(::String)).void }
|
|
31
|
+
def initialize(field:, reason:, example: nil)
|
|
32
|
+
@field = field
|
|
33
|
+
@reason = reason
|
|
34
|
+
@example = example
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
sig { params(other: T.untyped).returns(T::Boolean) }
|
|
38
|
+
def ==(other)
|
|
39
|
+
return false unless other.is_a?(self.class)
|
|
40
|
+
return false unless @field == other.field
|
|
41
|
+
return false unless @reason == other.reason
|
|
42
|
+
return false unless @example == other.example
|
|
43
|
+
true
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
class NoResponse::Models::Shared::ProblemInvalidParam
|
|
5
|
+
extend ::Crystalline::MetadataFields::ClassMethods
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
class NoResponse::Models::Shared::ProblemInvalidParam
|
|
9
|
+
def field
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def field=(str_)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def reason
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def reason=(str_)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def example
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def example=(str_)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
module NoResponse
|
|
5
|
+
module Models
|
|
6
|
+
module Shared
|
|
7
|
+
# RateLimitErrorCode - Machine codes an HTTP 429 answer can carry.
|
|
8
|
+
class RateLimitErrorCode
|
|
9
|
+
include ::Crystalline::Enum
|
|
10
|
+
enums do
|
|
11
|
+
RATE_LIMITED = new("rate_limited")
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
open!
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
module NoResponse
|
|
5
|
+
module Models
|
|
6
|
+
module Shared
|
|
7
|
+
# ReasonCode - A stable reason code. New codes may appear; ignore any you do not know.
|
|
8
|
+
class ReasonCode
|
|
9
|
+
include ::Crystalline::Enum
|
|
10
|
+
enums do
|
|
11
|
+
NO_DIGITAL_FOOTPRINT = new("no_digital_footprint")
|
|
12
|
+
VOIP_NUMBER = new("voip_number")
|
|
13
|
+
DISPOSABLE_EMAIL = new("disposable_email")
|
|
14
|
+
NEW_EMAIL = new("new_email")
|
|
15
|
+
SPAM_REPORTS = new("spam_reports")
|
|
16
|
+
FRAUD_FLAG = new("fraud_flag")
|
|
17
|
+
IDENTITY_MISMATCH = new("identity_mismatch")
|
|
18
|
+
COUNTRY_MISMATCH = new("country_mismatch")
|
|
19
|
+
PROXY_IP = new("proxy_ip")
|
|
20
|
+
SEEN_BEFORE = new("seen_before")
|
|
21
|
+
SHARED_IP = new("shared_ip")
|
|
22
|
+
MANY_RECENT_SIGNUPS = new("many_recent_signups")
|
|
23
|
+
ESTABLISHED_ACCOUNTS = new("established_accounts")
|
|
24
|
+
AGED_IDENTITY = new("aged_identity")
|
|
25
|
+
BREACH_NAME_MATCH = new("breach_name_match")
|
|
26
|
+
BREACH_COOCCURRENCE = new("breach_cooccurrence")
|
|
27
|
+
BREACH_NAME_MISMATCH = new("breach_name_mismatch")
|
|
28
|
+
BREACH_PHONE_MISMATCH = new("breach_phone_mismatch")
|
|
29
|
+
RECENT_PASSWORD_EXPOSURE = new("recent_password_exposure")
|
|
30
|
+
CREDENTIAL_LIST_EXPOSURE = new("credential_list_exposure")
|
|
31
|
+
ABUSE_ECOSYSTEM_MEMBER = new("abuse_ecosystem_member")
|
|
32
|
+
NO_BREACH_HISTORY = new("no_breach_history")
|
|
33
|
+
AUTOMATION_FAST_SUBMIT = new("automation_fast_submit")
|
|
34
|
+
CLIENT_CLOCK_SKEW = new("client_clock_skew")
|
|
35
|
+
BOT_OR_AUTOMATION = new("bot_or_automation")
|
|
36
|
+
AUTH_EMAIL_VERIFIED = new("auth_email_verified")
|
|
37
|
+
AUTH_PHONE_VERIFIED = new("auth_phone_verified")
|
|
38
|
+
AUTH_MFA_RECENT = new("auth_mfa_recent")
|
|
39
|
+
AUTH_NEW_SESSION = new("auth_new_session")
|
|
40
|
+
AUTH_NEW_ACCOUNT = new("auth_new_account")
|
|
41
|
+
AUTH_IMPERSONATED = new("auth_impersonated")
|
|
42
|
+
CONTEXT_TIMEZONE_MISMATCH = new("context_timezone_mismatch")
|
|
43
|
+
CONTEXT_LOCALE_MISMATCH = new("context_locale_mismatch")
|
|
44
|
+
CONTEXT_LINE_COUNTRY_MISMATCH = new("context_line_country_mismatch")
|
|
45
|
+
PRIOR_ABUSE_LINK = new("prior_abuse_link")
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
open!
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
module NoResponse
|
|
5
|
+
module Models
|
|
6
|
+
module Shared
|
|
7
|
+
# ReasonIdentifier - The submitted identifier or client context field a reason concerns; absent when it concerns the whole assessment. Client context is a claimed hint, not a device fingerprint.
|
|
8
|
+
class ReasonIdentifier
|
|
9
|
+
include ::Crystalline::Enum
|
|
10
|
+
enums do
|
|
11
|
+
EMAIL = new("email")
|
|
12
|
+
USERNAME = new("username")
|
|
13
|
+
PHONE = new("phone")
|
|
14
|
+
NAME = new("name")
|
|
15
|
+
IP = new("ip")
|
|
16
|
+
CONTEXT = new("context")
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
open!
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
module NoResponse
|
|
5
|
+
module Models
|
|
6
|
+
module Shared
|
|
7
|
+
# Recommendation - The recommended action: allow, step_up or review. Your application applies it.
|
|
8
|
+
class Recommendation
|
|
9
|
+
include ::Crystalline::Enum
|
|
10
|
+
enums do
|
|
11
|
+
ALLOW = new("allow")
|
|
12
|
+
STEP_UP = new("step_up")
|
|
13
|
+
REVIEW = new("review")
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
open!
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
module NoResponse
|
|
5
|
+
module Models
|
|
6
|
+
module Shared
|
|
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 < T::Enum
|
|
9
|
+
enums do
|
|
10
|
+
STANDARD = new("standard")
|
|
11
|
+
DETAILED = new("detailed")
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
module NoResponse
|
|
5
|
+
module Models
|
|
6
|
+
module Shared
|
|
7
|
+
# The one risk decision for this event. score is 0 (safe) to 100 (risky): the sum of the weights of the reasons that fired, clamped to 0 to 100, from hand-set versioned weights. Every answer with a recommendation carries it, and the top-level recommendation equals risk.recommendation. It names no source or provider.
|
|
8
|
+
class Risk
|
|
9
|
+
extend T::Sig
|
|
10
|
+
include Crystalline::MetadataFields
|
|
11
|
+
|
|
12
|
+
field(
|
|
13
|
+
:score,
|
|
14
|
+
::Integer,
|
|
15
|
+
{'format_json': {'letter_case': ::NoResponse::Utils.field_name("score"), required: true}}
|
|
16
|
+
)
|
|
17
|
+
# low 0-29, medium 30-59, high 60-84, critical 85-100.
|
|
18
|
+
field(
|
|
19
|
+
:band,
|
|
20
|
+
Models::Shared::Band,
|
|
21
|
+
{
|
|
22
|
+
'format_json': {
|
|
23
|
+
'letter_case': ::NoResponse::Utils.field_name("band"),
|
|
24
|
+
required: true,
|
|
25
|
+
'decoder': ::NoResponse::Utils.open_enum_from_string(Models::Shared::Band, false)
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
)
|
|
29
|
+
# The recommended action: allow, step_up or review. Your application applies it.
|
|
30
|
+
field(
|
|
31
|
+
:recommendation,
|
|
32
|
+
Models::Shared::Recommendation,
|
|
33
|
+
{
|
|
34
|
+
'format_json': {
|
|
35
|
+
'letter_case': ::NoResponse::Utils.field_name("recommendation"),
|
|
36
|
+
required: true,
|
|
37
|
+
'decoder': ::NoResponse::Utils.open_enum_from_string(Models::Shared::Recommendation, false)
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
)
|
|
41
|
+
# How much of the planned evidence answered; it says nothing about risk.
|
|
42
|
+
field(
|
|
43
|
+
:confidence,
|
|
44
|
+
Models::Shared::RiskConfidence,
|
|
45
|
+
{
|
|
46
|
+
'format_json': {
|
|
47
|
+
'letter_case': ::NoResponse::Utils.field_name("confidence"),
|
|
48
|
+
required: true,
|
|
49
|
+
'decoder': ::NoResponse::Utils.open_enum_from_string(Models::Shared::RiskConfidence, false)
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
)
|
|
53
|
+
# Version of the hand-authored heuristic weights that produced the recommendation, for example 'risk-2026-10.7'. A tenant threshold override adds a +t<N> suffix, e.g. 'risk-2026-10.7+t3'.
|
|
54
|
+
field(
|
|
55
|
+
:policy_version,
|
|
56
|
+
::String,
|
|
57
|
+
{'format_json': {'letter_case': ::NoResponse::Utils.field_name("policy_version"), required: true}}
|
|
58
|
+
)
|
|
59
|
+
# Every reason that fired, highest weight first. The weights sum to score before clamping.
|
|
60
|
+
field(
|
|
61
|
+
:reasons,
|
|
62
|
+
Crystalline::Array.new(Models::Shared::RiskReason),
|
|
63
|
+
{'format_json': {'letter_case': ::NoResponse::Utils.field_name("reasons"), required: true}}
|
|
64
|
+
)
|
|
65
|
+
# Sources counted by state, not named.
|
|
66
|
+
field(
|
|
67
|
+
:coverage,
|
|
68
|
+
Models::Shared::RiskCoverage,
|
|
69
|
+
{'format_json': {'letter_case': ::NoResponse::Utils.field_name("coverage"), required: true}}
|
|
70
|
+
)
|
|
71
|
+
# true when the tenant's block threshold is set and score reached it. A provider hook can deny the signup on it; the provider decides and enforces. It does not change recommendation. It is false while blocking is off, the default, and a body from before the flag existed omits it: read absent as false.
|
|
72
|
+
field(
|
|
73
|
+
:block,
|
|
74
|
+
Crystalline::Nilable.new(Crystalline::Boolean.new),
|
|
75
|
+
{'format_json': {'letter_case': ::NoResponse::Utils.field_name("block")}}
|
|
76
|
+
)
|
|
77
|
+
# The block threshold this answer used: block is true exactly when score is at least this value. Absent while blocking is off. NoResponse sets it per tenant on request, at or above the review threshold.
|
|
78
|
+
field(
|
|
79
|
+
:block_threshold,
|
|
80
|
+
Crystalline::Nilable.new(::Integer),
|
|
81
|
+
{'format_json': {'letter_case': ::NoResponse::Utils.field_name("block_threshold")}}
|
|
82
|
+
)
|
|
83
|
+
# Labels the v0 policy as hand-authored and not statistically validated.
|
|
84
|
+
field(
|
|
85
|
+
:policy_basis,
|
|
86
|
+
::String,
|
|
87
|
+
{'format_json': {'letter_case': ::NoResponse::Utils.field_name("policy_basis"), required: true}}
|
|
88
|
+
)
|
|
89
|
+
# A few typed facts per identifier. Every fact is optional: absent means the evidence did not answer and makes no claim, while false or 0 is a definite answer. Lanes that do not exist yet leave their members absent.
|
|
90
|
+
field(
|
|
91
|
+
:summary,
|
|
92
|
+
Crystalline::Nilable.new(Models::Shared::RiskSummary),
|
|
93
|
+
{'format_json': {'letter_case': ::NoResponse::Utils.field_name("summary")}}
|
|
94
|
+
)
|
|
95
|
+
# Detailed view only (response_mode=detailed, which needs the detailed scope); a standard answer leaves it out. Merged observations without provider, source, origin, raw breach record, value or score.
|
|
96
|
+
field(
|
|
97
|
+
:details,
|
|
98
|
+
Crystalline::Nilable.new(Models::Shared::RiskDetails),
|
|
99
|
+
{'format_json': {'letter_case': ::NoResponse::Utils.field_name("details")}}
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
sig {
|
|
103
|
+
params(
|
|
104
|
+
score: ::Integer,
|
|
105
|
+
band: Models::Shared::Band,
|
|
106
|
+
recommendation: Models::Shared::Recommendation,
|
|
107
|
+
confidence: Models::Shared::RiskConfidence,
|
|
108
|
+
policy_version: ::String,
|
|
109
|
+
reasons: T::Array[Models::Shared::RiskReason],
|
|
110
|
+
coverage: Models::Shared::RiskCoverage,
|
|
111
|
+
block: T.nilable(T::Boolean),
|
|
112
|
+
block_threshold: T.nilable(::Integer),
|
|
113
|
+
policy_basis: ::String,
|
|
114
|
+
summary: T.nilable(Models::Shared::RiskSummary),
|
|
115
|
+
details: T.nilable(Models::Shared::RiskDetails)
|
|
116
|
+
)
|
|
117
|
+
.void
|
|
118
|
+
}
|
|
119
|
+
def initialize(
|
|
120
|
+
score:,
|
|
121
|
+
band:,
|
|
122
|
+
recommendation:,
|
|
123
|
+
confidence:,
|
|
124
|
+
policy_version:,
|
|
125
|
+
reasons:,
|
|
126
|
+
coverage:,
|
|
127
|
+
block: nil,
|
|
128
|
+
block_threshold: nil,
|
|
129
|
+
policy_basis: "heuristic_unvalidated",
|
|
130
|
+
summary: nil,
|
|
131
|
+
details: nil
|
|
132
|
+
)
|
|
133
|
+
@score = score
|
|
134
|
+
@band = band
|
|
135
|
+
@recommendation = recommendation
|
|
136
|
+
@confidence = confidence
|
|
137
|
+
@policy_version = policy_version
|
|
138
|
+
@reasons = reasons
|
|
139
|
+
@coverage = coverage
|
|
140
|
+
@block = block
|
|
141
|
+
@block_threshold = block_threshold
|
|
142
|
+
unless policy_basis == "heuristic_unvalidated"
|
|
143
|
+
raise ArgumentError, "Invalid value for policy_basis"
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
@policy_basis = "heuristic_unvalidated"
|
|
147
|
+
@summary = summary
|
|
148
|
+
@details = details
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
sig { params(other: T.untyped).returns(T::Boolean) }
|
|
152
|
+
def ==(other)
|
|
153
|
+
return false unless other.is_a?(self.class)
|
|
154
|
+
return false unless @score == other.score
|
|
155
|
+
return false unless @band == other.band
|
|
156
|
+
return false unless @recommendation == other.recommendation
|
|
157
|
+
return false unless @confidence == other.confidence
|
|
158
|
+
return false unless @policy_version == other.policy_version
|
|
159
|
+
return false unless @reasons == other.reasons
|
|
160
|
+
return false unless @coverage == other.coverage
|
|
161
|
+
return false unless @block == other.block
|
|
162
|
+
return false unless @block_threshold == other.block_threshold
|
|
163
|
+
return false unless @policy_basis == other.policy_basis
|
|
164
|
+
return false unless @summary == other.summary
|
|
165
|
+
return false unless @details == other.details
|
|
166
|
+
true
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
end
|
|
171
|
+
end
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
class NoResponse::Models::Shared::Risk
|
|
5
|
+
extend ::Crystalline::MetadataFields::ClassMethods
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
class NoResponse::Models::Shared::Risk
|
|
9
|
+
def score
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def score=(str_)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def band
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def band=(str_)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def recommendation
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def recommendation=(str_)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def confidence
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def confidence=(str_)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def policy_version
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def policy_version=(str_)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def reasons
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def reasons=(str_)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def coverage
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def coverage=(str_)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def block
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def block=(str_)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def block_threshold
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def block_threshold=(str_)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def policy_basis
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def policy_basis=(str_)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def summary
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def summary=(str_)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def details
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def details=(str_)
|
|
79
|
+
end
|
|
80
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
module NoResponse
|
|
5
|
+
module Models
|
|
6
|
+
module Shared
|
|
7
|
+
# RiskConfidence - How much of the planned evidence answered; it says nothing about risk.
|
|
8
|
+
class RiskConfidence
|
|
9
|
+
include ::Crystalline::Enum
|
|
10
|
+
enums do
|
|
11
|
+
LOW = new("low")
|
|
12
|
+
MEDIUM = new("medium")
|
|
13
|
+
HIGH = new("high")
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
open!
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
module NoResponse
|
|
5
|
+
module Models
|
|
6
|
+
module Shared
|
|
7
|
+
# Sources counted by state, not named.
|
|
8
|
+
class RiskCoverage
|
|
9
|
+
extend T::Sig
|
|
10
|
+
include Crystalline::MetadataFields
|
|
11
|
+
|
|
12
|
+
# Sources that gave a definite answer.
|
|
13
|
+
field(
|
|
14
|
+
:answered,
|
|
15
|
+
::Integer,
|
|
16
|
+
{'format_json': {'letter_case': ::NoResponse::Utils.field_name("answered"), required: true}}
|
|
17
|
+
)
|
|
18
|
+
# Sources that could not answer.
|
|
19
|
+
field(
|
|
20
|
+
:failed,
|
|
21
|
+
::Integer,
|
|
22
|
+
{'format_json': {'letter_case': ::NoResponse::Utils.field_name("failed"), required: true}}
|
|
23
|
+
)
|
|
24
|
+
# Sources still being asked.
|
|
25
|
+
field(
|
|
26
|
+
:pending,
|
|
27
|
+
::Integer,
|
|
28
|
+
{'format_json': {'letter_case': ::NoResponse::Utils.field_name("pending"), required: true}}
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
sig { params(answered: ::Integer, failed: ::Integer, pending: ::Integer).void }
|
|
32
|
+
def initialize(answered:, failed:, pending:)
|
|
33
|
+
@answered = answered
|
|
34
|
+
@failed = failed
|
|
35
|
+
@pending = pending
|
|
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 @answered == other.answered
|
|
42
|
+
return false unless @failed == other.failed
|
|
43
|
+
return false unless @pending == other.pending
|
|
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::RiskCoverage
|
|
5
|
+
extend ::Crystalline::MetadataFields::ClassMethods
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
class NoResponse::Models::Shared::RiskCoverage
|
|
9
|
+
def answered
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def answered=(str_)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def failed
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def failed=(str_)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def pending
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def pending=(str_)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
module NoResponse
|
|
5
|
+
module Models
|
|
6
|
+
module Shared
|
|
7
|
+
# Detailed view only (response_mode=detailed, which needs the detailed scope); a standard answer leaves it out. Merged observations without provider, source, origin, raw breach record, value or score.
|
|
8
|
+
class RiskDetails
|
|
9
|
+
extend T::Sig
|
|
10
|
+
include Crystalline::MetadataFields
|
|
11
|
+
|
|
12
|
+
field(
|
|
13
|
+
:phone_names,
|
|
14
|
+
Crystalline::Nilable.new(Crystalline::Array.new(Models::Shared::RiskDetailsPhoneName)),
|
|
15
|
+
{'format_json': {'letter_case': ::NoResponse::Utils.field_name("phone_names")}}
|
|
16
|
+
)
|
|
17
|
+
# The matching breach tables, newest first, at most 50.
|
|
18
|
+
field(
|
|
19
|
+
:breaches,
|
|
20
|
+
Crystalline::Nilable.new(Crystalline::Array.new(Models::Shared::Breach)),
|
|
21
|
+
{'format_json': {'letter_case': ::NoResponse::Utils.field_name("breaches")}}
|
|
22
|
+
)
|
|
23
|
+
# Names found next to the identifiers in breach records, merged, with the number of distinct tables each was seen in.
|
|
24
|
+
field(
|
|
25
|
+
:breach_names,
|
|
26
|
+
Crystalline::Nilable.new(Crystalline::Array.new(Models::Shared::RiskDetailsBreachName)),
|
|
27
|
+
{'format_json': {'letter_case': ::NoResponse::Utils.field_name("breach_names")}}
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
sig {
|
|
31
|
+
params(
|
|
32
|
+
phone_names: T.nilable(T::Array[Models::Shared::RiskDetailsPhoneName]),
|
|
33
|
+
breaches: T.nilable(T::Array[Models::Shared::Breach]),
|
|
34
|
+
breach_names: T.nilable(T::Array[Models::Shared::RiskDetailsBreachName])
|
|
35
|
+
)
|
|
36
|
+
.void
|
|
37
|
+
}
|
|
38
|
+
def initialize(phone_names: nil, breaches: nil, breach_names: nil)
|
|
39
|
+
@phone_names = phone_names
|
|
40
|
+
@breaches = breaches
|
|
41
|
+
@breach_names = breach_names
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
sig { params(other: T.untyped).returns(T::Boolean) }
|
|
45
|
+
def ==(other)
|
|
46
|
+
return false unless other.is_a?(self.class)
|
|
47
|
+
return false unless @phone_names == other.phone_names
|
|
48
|
+
return false unless @breaches == other.breaches
|
|
49
|
+
return false unless @breach_names == other.breach_names
|
|
50
|
+
true
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|