clerk-sdk-ruby 7.0.0 → 8.0.1
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/clerk/actortokens.rb +11 -11
- data/lib/clerk/admin_portal_link_tokens.rb +10 -10
- data/lib/clerk/agenttasks.rb +10 -10
- data/lib/clerk/allowlistidentifiers.rb +15 -15
- data/lib/clerk/api_keys.rb +40 -40
- data/lib/clerk/betafeatures.rb +10 -10
- data/lib/clerk/billing.rb +388 -52
- data/lib/clerk/blocklistidentifiers.rb +15 -15
- data/lib/clerk/clients.rb +15 -15
- data/lib/clerk/directories.rb +1534 -0
- data/lib/clerk/domains.rb +27 -24
- data/lib/clerk/emailaddresses.rb +43 -36
- data/lib/clerk/emailandsmstemplates.rb +6 -6
- data/lib/clerk/emailsmstemplates.rb +21 -21
- data/lib/clerk/enterpriseconnections.rb +35 -35
- data/lib/clerk/instancesettings.rb +60 -60
- data/lib/clerk/invitations.rb +20 -20
- data/lib/clerk/jwks.rb +5 -5
- data/lib/clerk/jwttemplates.rb +25 -25
- data/lib/clerk/m2m.rb +20 -20
- data/lib/clerk/machines.rb +45 -45
- data/lib/clerk/miscellaneous.rb +5 -5
- data/lib/clerk/models/components/amount_off.rb +44 -0
- data/lib/clerk/models/components/{schemas_commerceplan_fee.rbi → amount_off.rbi} +2 -2
- data/lib/clerk/models/components/applycommercediscountrequest.rb +32 -0
- data/lib/clerk/models/components/applycommercediscountrequest.rbi +13 -0
- data/lib/clerk/models/components/automation_disposition.rb +21 -0
- data/lib/clerk/models/components/automation_disposition.rbi +11 -0
- data/lib/clerk/models/components/billingpaymentattempt_totals.rb +1 -1
- data/lib/clerk/models/components/billingstatement.rb +1 -1
- data/lib/clerk/models/components/{group.rb → billingstatement_group.rb} +1 -1
- data/lib/clerk/models/components/{group.rbi → billingstatement_group.rbi} +2 -2
- data/lib/clerk/models/components/biometriccredential.rb +72 -0
- data/lib/clerk/models/components/biometriccredential.rbi +33 -0
- data/lib/clerk/models/components/biometriccredential_algorithm.rb +19 -0
- data/lib/clerk/models/components/biometriccredential_algorithm.rbi +11 -0
- data/lib/clerk/models/components/biometriccredential_list.rb +36 -0
- data/lib/clerk/models/components/biometriccredential_list.rbi +15 -0
- data/lib/clerk/models/components/biometriccredential_object.rb +19 -0
- data/lib/clerk/models/components/biometriccredential_object.rbi +11 -0
- data/lib/clerk/models/components/biometriccredential_platform.rb +20 -0
- data/lib/clerk/models/components/biometriccredential_platform.rbi +11 -0
- data/lib/clerk/models/components/biometriccredential_status.rb +20 -0
- data/lib/clerk/models/components/biometriccredential_status.rbi +11 -0
- data/lib/clerk/models/components/clerkerror.rb +1 -1
- data/lib/clerk/models/components/commercecreditledgerresponse.rb +3 -7
- data/lib/clerk/models/components/commercecreditledgerresponse.rbi +0 -2
- data/lib/clerk/models/components/commercediscountredemptionresponse.rb +93 -0
- data/lib/clerk/models/components/commercediscountredemptionresponse.rbi +43 -0
- data/lib/clerk/models/components/commercediscountredemptionresponse_amount.rb +45 -0
- data/lib/clerk/models/components/{schemas_commercesubscriptionitem_amount.rbi → commercediscountredemptionresponse_amount.rbi} +2 -2
- data/lib/clerk/models/components/commercediscountredemptionresponse_object.rb +19 -0
- data/lib/clerk/models/components/commercediscountredemptionresponse_object.rbi +11 -0
- data/lib/clerk/models/components/commercediscountredemptionresponse_status.rb +21 -0
- data/lib/clerk/models/components/commercediscountredemptionresponse_status.rbi +11 -0
- data/lib/clerk/models/components/{schemas_commerceperunittotal.rb → commerceperunittotal_2.rb} +2 -2
- data/lib/clerk/models/components/{schemas_commerceperunittotal.rbi → commerceperunittotal_2.rbi} +2 -2
- data/lib/clerk/models/components/{schemas_commerceperunittotaltier.rb → commerceperunittotaltier_2.rb} +1 -1
- data/lib/clerk/models/components/{schemas_commerceperunittotaltier.rbi → commerceperunittotaltier_2.rbi} +2 -2
- data/lib/clerk/models/components/{schemas_commerceplan.rb → commerceplan_2.rb} +6 -6
- data/lib/clerk/models/components/{schemas_commerceplan.rbi → commerceplan_2.rbi} +2 -2
- data/lib/clerk/models/components/{schemas_commerceplan_fee.rb → commerceplan_2_annual_fee.rb} +1 -1
- data/lib/clerk/models/components/{schemas_commerceplan_annual_fee.rbi → commerceplan_2_annual_fee.rbi} +2 -2
- data/lib/clerk/models/components/{schemas_commercesubscriptionitem_fee.rb → commerceplan_2_annual_monthly_fee.rb} +1 -1
- data/lib/clerk/models/components/{schemas_commerceplan_annual_monthly_fee.rbi → commerceplan_2_annual_monthly_fee.rbi} +2 -2
- data/lib/clerk/models/components/{schemas_commerceplan_annual_fee.rb → commerceplan_2_fee.rb} +1 -1
- data/lib/clerk/models/components/commerceplan_2_fee.rbi +19 -0
- data/lib/clerk/models/components/{schemas_commerceplan_object.rb → commerceplan_2_object.rb} +2 -2
- data/lib/clerk/models/components/commerceplan_2_object.rbi +11 -0
- data/lib/clerk/models/components/commercepricetransitiondetails.rb +1 -1
- data/lib/clerk/models/components/commercepricetransitionresponse.rb +1 -1
- data/lib/clerk/models/components/{schemas_commercesubscriptionitem.rb → commercesubscriptionitem_2.rb} +7 -7
- data/lib/clerk/models/components/{schemas_commercesubscriptionitem.rbi → commercesubscriptionitem_2.rbi} +2 -2
- data/lib/clerk/models/components/{schemas_commercesubscriptionitem_amount.rb → commercesubscriptionitem_2_amount.rb} +1 -1
- data/lib/clerk/models/components/commercesubscriptionitem_2_amount.rbi +19 -0
- data/lib/clerk/models/components/{schemas_commerceplan_annual_monthly_fee.rb → commercesubscriptionitem_2_annual_fee.rb} +1 -1
- data/lib/clerk/models/components/{schemas_commercesubscriptionitem_fee.rbi → commercesubscriptionitem_2_annual_fee.rbi} +2 -2
- data/lib/clerk/models/components/{schemas_commercesubscriptionitem_annual_fee.rb → commercesubscriptionitem_2_annual_monthly_fee.rb} +1 -1
- data/lib/clerk/models/components/commercesubscriptionitem_2_annual_monthly_fee.rbi +19 -0
- data/lib/clerk/models/components/commercesubscriptionitem_2_fee.rb +44 -0
- data/lib/clerk/models/components/commercesubscriptionitem_2_fee.rbi +19 -0
- data/lib/clerk/models/components/{schemas_commercesubscriptionitem_next_payment.rb → commercesubscriptionitem_2_next_payment.rb} +3 -3
- data/lib/clerk/models/components/{schemas_commercesubscriptionitem_next_payment.rbi → commercesubscriptionitem_2_next_payment.rbi} +2 -2
- data/lib/clerk/models/components/{schemas_commercesubscriptionitem_next_payment_amount.rb → commercesubscriptionitem_2_next_payment_amount.rb} +1 -1
- data/lib/clerk/models/components/commercesubscriptionitem_2_next_payment_amount.rbi +19 -0
- data/lib/clerk/models/components/{schemas_commercesubscriptionitem_next_payment_credits.rb → commercesubscriptionitem_2_next_payment_credits.rb} +3 -3
- data/lib/clerk/models/components/{schemas_commercesubscriptionitem_next_payment_credits.rbi → commercesubscriptionitem_2_next_payment_credits.rbi} +2 -2
- data/lib/clerk/models/components/{schemas_commercesubscriptionitem_next_payment_credits_proration.rb → commercesubscriptionitem_2_next_payment_credits_proration.rb} +1 -1
- data/lib/clerk/models/components/{schemas_commercesubscriptionitem_next_payment_credits_proration.rbi → commercesubscriptionitem_2_next_payment_credits_proration.rbi} +2 -2
- data/lib/clerk/models/components/{schemas_commercesubscriptionitem_next_payment_discounts.rb → commercesubscriptionitem_2_next_payment_discounts.rb} +2 -2
- data/lib/clerk/models/components/{schemas_commercesubscriptionitem_next_payment_discounts.rbi → commercesubscriptionitem_2_next_payment_discounts.rbi} +2 -2
- data/lib/clerk/models/components/{schemas_commercesubscriptionitem_next_payment_discounts_proration.rb → commercesubscriptionitem_2_next_payment_discounts_proration.rb} +1 -1
- data/lib/clerk/models/components/{schemas_commercesubscriptionitem_next_payment_discounts_proration.rbi → commercesubscriptionitem_2_next_payment_discounts_proration.rbi} +2 -2
- data/lib/clerk/models/components/{schemas_commercesubscriptionitem_next_payment_payer.rb → commercesubscriptionitem_2_next_payment_payer.rb} +1 -1
- data/lib/clerk/models/components/{schemas_commercesubscriptionitem_next_payment_payer.rbi → commercesubscriptionitem_2_next_payment_payer.rbi} +2 -2
- data/lib/clerk/models/components/{schemas_commercesubscriptionitem_next_payment_totals.rb → commercesubscriptionitem_2_next_payment_totals.rb} +3 -3
- data/lib/clerk/models/components/{schemas_commercesubscriptionitem_next_payment_totals.rbi → commercesubscriptionitem_2_next_payment_totals.rbi} +2 -2
- data/lib/clerk/models/components/{schemas_commercesubscriptionitem_object_commercepayer.rb → commercesubscriptionitem_2_object_commercepayer.rb} +2 -2
- data/lib/clerk/models/components/commercesubscriptionitem_2_object_commercepayer.rbi +11 -0
- data/lib/clerk/models/components/{schemas_commercesubscriptionitem_object_commerceplan.rb → commercesubscriptionitem_2_object_commerceplan.rb} +2 -2
- data/lib/clerk/models/components/commercesubscriptionitem_2_object_commerceplan.rbi +11 -0
- data/lib/clerk/models/components/{schemas_commercesubscriptionitem_object_commercesubscriptionitem.rb → commercesubscriptionitem_2_object_commercesubscriptionitem.rb} +2 -2
- data/lib/clerk/models/components/commercesubscriptionitem_2_object_commercesubscriptionitem.rbi +11 -0
- data/lib/clerk/models/components/{schemas_commercesubscriptionitem_plan.rb → commercesubscriptionitem_2_plan.rb} +6 -6
- data/lib/clerk/models/components/{schemas_commercesubscriptionitem_plan.rbi → commercesubscriptionitem_2_plan.rbi} +2 -2
- data/lib/clerk/models/components/{schemas_commercesubscriptionitem_plan_period.rb → commercesubscriptionitem_2_plan_period.rb} +2 -2
- data/lib/clerk/models/components/commercesubscriptionitem_2_plan_period.rbi +11 -0
- data/lib/clerk/models/components/{schemas_commercesubscriptionitem_status.rb → commercesubscriptionitem_2_status.rb} +2 -2
- data/lib/clerk/models/components/commercesubscriptionitem_2_status.rbi +11 -0
- data/lib/clerk/models/components/commercesubscriptionitem_totals.rb +1 -1
- data/lib/clerk/models/components/commercesubscriptionnextpayment.rb +1 -1
- data/lib/clerk/models/components/commercesubscriptionnextpayment_totals.rb +1 -1
- data/lib/clerk/models/components/createbillingpricerequest.rb +2 -2
- data/lib/clerk/models/components/directory.rb +80 -0
- data/lib/clerk/models/components/directory.rbi +37 -0
- data/lib/clerk/models/components/directory_custom_attribute.rb +52 -0
- data/lib/clerk/models/components/{custom_attribute.rbi → directory_custom_attribute.rbi} +4 -2
- data/lib/clerk/models/components/directory_group.rb +36 -0
- data/lib/clerk/models/components/directory_group.rbi +15 -0
- data/lib/clerk/models/components/directory_list.rb +36 -0
- data/lib/clerk/models/components/directory_list.rbi +15 -0
- data/lib/clerk/models/components/directory_object.rb +19 -0
- data/lib/clerk/models/components/{samlaccount_meta.rbi → directory_object.rbi} +2 -2
- data/lib/clerk/models/components/directorygrouprolemapping.rb +76 -0
- data/lib/clerk/models/components/directorygrouprolemapping.rbi +35 -0
- data/lib/clerk/models/components/directorygrouprolemapping_deleted.rb +43 -0
- data/lib/clerk/models/components/directorygrouprolemapping_deleted.rbi +17 -0
- data/lib/clerk/models/components/directorygrouprolemapping_deleted_object.rb +19 -0
- data/lib/clerk/models/components/directorygrouprolemapping_deleted_object.rbi +11 -0
- data/lib/clerk/models/components/directorygrouprolemapping_list.rb +36 -0
- data/lib/clerk/models/components/directorygrouprolemapping_list.rbi +15 -0
- data/lib/clerk/models/components/directorygrouprolemapping_object.rb +19 -0
- data/lib/clerk/models/components/directorygrouprolemapping_object.rbi +11 -0
- data/lib/clerk/models/components/dnstarget.rb +49 -0
- data/lib/clerk/models/components/dnstarget.rbi +21 -0
- data/lib/clerk/models/components/domain.rb +7 -2
- data/lib/clerk/models/components/domain.rbi +2 -0
- data/lib/clerk/models/components/effect.rb +20 -0
- data/lib/clerk/models/components/{clerkerror_meta.rbi → effect.rbi} +2 -2
- data/lib/clerk/models/components/emailaddress_verification_saml_clerkerror.rb +1 -1
- data/lib/clerk/models/components/enrollment_mode.rb +1 -0
- data/lib/clerk/models/components/enterpriseaccount_verification_oauth_clerkerror.rb +1 -1
- data/lib/clerk/models/components/enterpriseaccount_verification_saml_clerkerror.rb +1 -1
- data/lib/clerk/models/components/enterpriseconnection.rb +6 -2
- data/lib/clerk/models/components/enterpriseconnection.rbi +2 -0
- data/lib/clerk/models/components/{custom_attribute.rb → enterpriseconnection_custom_attribute.rb} +6 -2
- data/lib/clerk/models/components/enterpriseconnection_custom_attribute.rbi +23 -0
- data/lib/clerk/models/components/enterpriseconnection_mode.rb +21 -0
- data/lib/clerk/models/components/enterpriseconnection_mode.rbi +11 -0
- data/lib/clerk/models/components/enterpriseconnection_object.rb +19 -0
- data/lib/clerk/models/components/enterpriseconnection_object.rbi +11 -0
- data/lib/clerk/models/components/enterpriseconnection_saml_connection.rb +5 -1
- data/lib/clerk/models/components/enterpriseconnection_saml_connection.rbi +2 -0
- data/lib/clerk/models/components/externalaccountwithverification_verification_oauth_clerkerror.rb +1 -1
- data/lib/clerk/models/components/{schemas_featureresponse.rb → featureresponse_2.rb} +2 -2
- data/lib/clerk/models/components/{schemas_featureresponse.rbi → featureresponse_2.rbi} +2 -2
- data/lib/clerk/models/components/{schemas_featureresponse_object.rb → featureresponse_2_object.rb} +2 -2
- data/lib/clerk/models/components/featureresponse_2_object.rbi +11 -0
- data/lib/clerk/models/components/instance.rb +13 -1
- data/lib/clerk/models/components/instance.rbi +6 -0
- data/lib/clerk/models/components/instanceprotect.rb +14 -2
- data/lib/clerk/models/components/instanceprotect.rbi +6 -0
- data/lib/clerk/models/components/instancesettings.rb +4 -1
- data/lib/clerk/models/components/level.rb +21 -0
- data/lib/clerk/models/components/{clerkerrors_meta.rbi → level.rbi} +2 -2
- data/lib/clerk/models/components/login_hint.rb +36 -0
- data/lib/clerk/models/components/login_hint.rbi +15 -0
- data/lib/clerk/models/components/oauthapplication.rb +7 -2
- data/lib/clerk/models/components/oauthapplication.rbi +2 -0
- data/lib/clerk/models/components/oauthapplicationsettings.rb +26 -1
- data/lib/clerk/models/components/oauthapplicationsettings.rbi +12 -0
- data/lib/clerk/models/components/oauthapplicationwithsecret.rb +7 -2
- data/lib/clerk/models/components/oauthapplicationwithsecret.rbi +2 -0
- data/lib/clerk/models/components/organization.rb +6 -1
- data/lib/clerk/models/components/organization.rbi +2 -0
- data/lib/clerk/models/components/organizationmembership_organization.rb +6 -1
- data/lib/clerk/models/components/organizationmembership_organization.rbi +2 -0
- data/lib/clerk/models/components/organizationmembershippublicuserdata.rb +5 -1
- data/lib/clerk/models/components/organizationmembershippublicuserdata.rbi +2 -0
- data/lib/clerk/models/components/organizationwithlogo.rb +6 -1
- data/lib/clerk/models/components/organizationwithlogo.rbi +2 -0
- data/lib/clerk/models/components/payer_commercepayer.rb +1 -1
- data/lib/clerk/models/components/payment_type.rb +1 -0
- data/lib/clerk/models/components/record_type.rb +20 -0
- data/lib/clerk/models/components/record_type.rbi +11 -0
- data/lib/clerk/models/components/reverification.rb +74 -0
- data/lib/clerk/models/components/reverification.rbi +31 -0
- data/lib/clerk/models/components/reverification_object.rb +20 -0
- data/lib/clerk/models/components/reverification_object.rbi +11 -0
- data/lib/clerk/models/components/reverification_status.rb +21 -0
- data/lib/clerk/models/components/reverification_status.rbi +11 -0
- data/lib/clerk/models/components/samlaccount_clerkerror.rb +1 -1
- data/lib/clerk/models/components/samlconnection_1.rb +15 -1
- data/lib/clerk/models/components/samlconnection_1.rbi +6 -0
- data/lib/clerk/models/components/samlconnection_2.rb +15 -1
- data/lib/clerk/models/components/samlconnection_2.rbi +6 -0
- data/lib/clerk/models/components/samlconnectionloginhint.rb +36 -0
- data/lib/clerk/models/components/samlconnectionloginhint.rbi +15 -0
- data/lib/clerk/models/components/samlconnectionloginhint_mode.rb +21 -0
- data/lib/clerk/models/components/samlconnectionloginhint_mode.rbi +11 -0
- data/lib/clerk/models/components/scim_group.rb +36 -0
- data/lib/clerk/models/components/scim_group.rbi +15 -0
- data/lib/clerk/models/components/scimdirectory.rb +80 -0
- data/lib/clerk/models/components/scimdirectory.rbi +37 -0
- data/lib/clerk/models/components/scimdirectory_custom_attribute.rb +52 -0
- data/lib/clerk/models/components/scimdirectory_custom_attribute.rbi +23 -0
- data/lib/clerk/models/components/scimdirectory_list.rb +36 -0
- data/lib/clerk/models/components/scimdirectory_list.rbi +15 -0
- data/lib/clerk/models/components/scimdirectory_object.rb +19 -0
- data/lib/clerk/models/components/scimdirectory_object.rbi +11 -0
- data/lib/clerk/models/components/scimgrouprolemapping.rb +76 -0
- data/lib/clerk/models/components/scimgrouprolemapping.rbi +35 -0
- data/lib/clerk/models/components/scimgrouprolemapping_deleted.rb +43 -0
- data/lib/clerk/models/components/scimgrouprolemapping_deleted.rbi +17 -0
- data/lib/clerk/models/components/scimgrouprolemapping_deleted_object.rb +19 -0
- data/lib/clerk/models/components/scimgrouprolemapping_deleted_object.rbi +11 -0
- data/lib/clerk/models/components/scimgrouprolemapping_list.rb +36 -0
- data/lib/clerk/models/components/scimgrouprolemapping_list.rbi +15 -0
- data/lib/clerk/models/components/scimgrouprolemapping_object.rb +19 -0
- data/lib/clerk/models/components/scimgrouprolemapping_object.rbi +11 -0
- data/lib/clerk/models/components/scimusermetadata.rb +64 -0
- data/lib/clerk/models/components/scimusermetadata.rbi +27 -0
- data/lib/clerk/models/components/scimusermetadata_group.rb +36 -0
- data/lib/clerk/models/components/scimusermetadata_group.rbi +15 -0
- data/lib/clerk/models/components/seats.rb +1 -1
- data/lib/clerk/models/components/source.rb +21 -0
- data/lib/clerk/models/components/source.rbi +11 -0
- data/lib/clerk/models/components/trusteddevice.rb +72 -0
- data/lib/clerk/models/components/trusteddevice.rbi +33 -0
- data/lib/clerk/models/components/trusteddevice_algorithm.rb +19 -0
- data/lib/clerk/models/components/trusteddevice_algorithm.rbi +11 -0
- data/lib/clerk/models/components/trusteddevice_list.rb +36 -0
- data/lib/clerk/models/components/trusteddevice_list.rbi +15 -0
- data/lib/clerk/models/components/trusteddevice_object.rb +19 -0
- data/lib/clerk/models/components/trusteddevice_object.rbi +11 -0
- data/lib/clerk/models/components/trusteddevice_platform.rb +20 -0
- data/lib/clerk/models/components/trusteddevice_platform.rbi +11 -0
- data/lib/clerk/models/components/trusteddevice_status.rb +20 -0
- data/lib/clerk/models/components/trusteddevice_status.rbi +11 -0
- data/lib/clerk/models/components/user.rb +16 -3
- data/lib/clerk/models/components/user.rbi +4 -0
- data/lib/clerk/models/components/user_directory.rb +65 -0
- data/lib/clerk/models/components/user_directory.rbi +27 -0
- data/lib/clerk/models/components/user_scim.rb +27 -6
- data/lib/clerk/models/components/user_scim.rbi +10 -0
- data/lib/clerk/models/components/verification_from_oauth_clerkerror.rb +1 -1
- data/lib/clerk/models/components/verification_google_one_tap_clerkerror.rb +1 -1
- data/lib/clerk/models/components.rb +85 -39
- data/lib/clerk/models/errors/clerkerrors.rb +1 -1
- data/lib/clerk/models/operations/adddomain_request.rb +3 -6
- data/lib/clerk/models/operations/applybillingsubscriptionitemdiscount_request.rb +36 -0
- data/lib/clerk/models/operations/applybillingsubscriptionitemdiscount_request.rbi +15 -0
- data/lib/clerk/models/operations/applybillingsubscriptionitemdiscount_response.rb +44 -0
- data/lib/clerk/models/operations/applybillingsubscriptionitemdiscount_response.rbi +19 -0
- data/lib/clerk/models/operations/clerkidpoauthaccesstoken.rb +5 -1
- data/lib/clerk/models/operations/clerkidpoauthaccesstoken.rbi +2 -0
- data/lib/clerk/models/operations/createdirectory_group_role_mapping.rb +52 -0
- data/lib/clerk/models/operations/createdirectory_group_role_mapping.rbi +23 -0
- data/lib/clerk/models/operations/createdirectory_request.rb +44 -0
- data/lib/clerk/models/operations/createdirectory_request.rbi +19 -0
- data/lib/clerk/models/operations/createdirectory_response.rb +44 -0
- data/lib/clerk/models/operations/createdirectory_response.rbi +19 -0
- data/lib/clerk/models/operations/createdirectorygrouprolemapping_request.rb +36 -0
- data/lib/clerk/models/operations/createdirectorygrouprolemapping_request.rbi +15 -0
- data/lib/clerk/models/operations/createdirectorygrouprolemapping_requestbody.rb +46 -0
- data/lib/clerk/models/operations/createdirectorygrouprolemapping_requestbody.rbi +19 -0
- data/lib/clerk/models/operations/createdirectorygrouprolemapping_response.rb +44 -0
- data/lib/clerk/models/operations/createdirectorygrouprolemapping_response.rbi +19 -0
- data/lib/clerk/models/operations/createemailaddress_request.rb +7 -1
- data/lib/clerk/models/operations/createemailaddress_request.rbi +2 -0
- data/lib/clerk/models/operations/createenterpriseconnection_custom_attribute.rb +5 -1
- data/lib/clerk/models/operations/createenterpriseconnection_custom_attribute.rbi +2 -0
- data/lib/clerk/models/operations/createenterpriseconnection_login_hint.rb +36 -0
- data/lib/clerk/models/operations/createenterpriseconnection_login_hint.rbi +15 -0
- data/lib/clerk/models/operations/createenterpriseconnection_mode.rb +21 -0
- data/lib/clerk/models/operations/createenterpriseconnection_mode.rbi +11 -0
- data/lib/clerk/models/operations/createenterpriseconnection_saml.rb +5 -1
- data/lib/clerk/models/operations/createenterpriseconnection_saml.rbi +2 -0
- data/lib/clerk/models/operations/createoauthapplication_request.rb +6 -2
- data/lib/clerk/models/operations/createoauthapplication_request.rbi +2 -0
- data/lib/clerk/models/operations/createorganizationdomain_requestbody.rb +1 -1
- data/lib/clerk/models/operations/createsamlconnection_login_hint_1.rb +36 -0
- data/lib/clerk/models/operations/createsamlconnection_login_hint_1.rbi +15 -0
- data/lib/clerk/models/operations/createsamlconnection_login_hint_2.rb +36 -0
- data/lib/clerk/models/operations/createsamlconnection_login_hint_2.rbi +15 -0
- data/lib/clerk/models/operations/createsamlconnection_mode_1.rb +21 -0
- data/lib/clerk/models/operations/createsamlconnection_mode_1.rbi +11 -0
- data/lib/clerk/models/operations/createsamlconnection_mode_2.rb +21 -0
- data/lib/clerk/models/operations/createsamlconnection_mode_2.rbi +11 -0
- data/lib/clerk/models/operations/createsamlconnection_requestbody_1.rb +5 -1
- data/lib/clerk/models/operations/createsamlconnection_requestbody_1.rbi +2 -0
- data/lib/clerk/models/operations/createsamlconnection_requestbody_2.rb +5 -1
- data/lib/clerk/models/operations/createsamlconnection_requestbody_2.rbi +2 -0
- data/lib/clerk/models/operations/createscimdirectory_group_role_mapping.rb +44 -0
- data/lib/clerk/models/operations/createscimdirectory_group_role_mapping.rbi +19 -0
- data/lib/clerk/models/operations/createscimdirectory_request.rb +44 -0
- data/lib/clerk/models/operations/createscimdirectory_request.rbi +19 -0
- data/lib/clerk/models/operations/createscimdirectory_response.rb +44 -0
- data/lib/clerk/models/operations/createscimdirectory_response.rbi +19 -0
- data/lib/clerk/models/operations/createscimgrouprolemapping_request.rb +36 -0
- data/lib/clerk/models/operations/createscimgrouprolemapping_request.rbi +15 -0
- data/lib/clerk/models/operations/createscimgrouprolemapping_requestbody.rb +42 -0
- data/lib/clerk/models/operations/createscimgrouprolemapping_requestbody.rbi +17 -0
- data/lib/clerk/models/operations/createscimgrouprolemapping_response.rb +44 -0
- data/lib/clerk/models/operations/createscimgrouprolemapping_response.rbi +19 -0
- data/lib/clerk/models/operations/createsignintoken_request.rb +6 -1
- data/lib/clerk/models/operations/createsignintoken_request.rbi +2 -0
- data/lib/clerk/models/operations/createuser_request.rb +8 -2
- data/lib/clerk/models/operations/createuser_request.rbi +2 -0
- data/lib/clerk/models/operations/deletedirectory_request.rb +32 -0
- data/lib/clerk/models/operations/deletedirectory_request.rbi +13 -0
- data/lib/clerk/models/operations/deletedirectory_response.rb +44 -0
- data/lib/clerk/models/operations/deletedirectory_response.rbi +19 -0
- data/lib/clerk/models/operations/deletedirectorygrouprolemapping_request.rb +36 -0
- data/lib/clerk/models/operations/deletedirectorygrouprolemapping_request.rbi +15 -0
- data/lib/clerk/models/operations/deletedirectorygrouprolemapping_response.rb +44 -0
- data/lib/clerk/models/operations/deletedirectorygrouprolemapping_response.rbi +19 -0
- data/lib/clerk/models/operations/deletedomain_request.rb +1 -1
- data/lib/clerk/models/operations/deletescimdirectory_request.rb +32 -0
- data/lib/clerk/models/operations/deletescimdirectory_request.rbi +13 -0
- data/lib/clerk/models/operations/deletescimdirectory_response.rb +44 -0
- data/lib/clerk/models/operations/deletescimdirectory_response.rbi +19 -0
- data/lib/clerk/models/operations/deletescimgrouprolemapping_request.rb +36 -0
- data/lib/clerk/models/operations/deletescimgrouprolemapping_request.rbi +15 -0
- data/lib/clerk/models/operations/deletescimgrouprolemapping_response.rb +44 -0
- data/lib/clerk/models/operations/deletescimgrouprolemapping_response.rbi +19 -0
- data/lib/clerk/models/operations/enrollment_mode.rb +5 -0
- data/lib/clerk/models/operations/extendbillingsubscriptionitemfreetrial_response.rb +4 -4
- data/lib/clerk/models/operations/extendbillingsubscriptionitemfreetrial_response.rbi +2 -2
- data/lib/clerk/models/operations/getdirectory_request.rb +32 -0
- data/lib/clerk/models/operations/getdirectory_request.rbi +13 -0
- data/lib/clerk/models/operations/getdirectory_response.rb +44 -0
- data/lib/clerk/models/operations/getdirectory_response.rbi +19 -0
- data/lib/clerk/models/operations/getreverification_request.rb +36 -0
- data/lib/clerk/models/operations/getreverification_request.rbi +15 -0
- data/lib/clerk/models/operations/getreverification_response.rb +44 -0
- data/lib/clerk/models/operations/getreverification_response.rbi +19 -0
- data/lib/clerk/models/operations/getscimdirectory_request.rb +32 -0
- data/lib/clerk/models/operations/getscimdirectory_request.rbi +13 -0
- data/lib/clerk/models/operations/getscimdirectory_response.rb +44 -0
- data/lib/clerk/models/operations/getscimdirectory_response.rbi +19 -0
- data/lib/clerk/models/operations/getuserlist_request.rb +13 -1
- data/lib/clerk/models/operations/getuserlist_request.rbi +2 -0
- data/lib/clerk/models/operations/listallorganizationdomains_request.rb +2 -1
- data/lib/clerk/models/operations/listdirectories_request.rb +39 -0
- data/lib/clerk/models/operations/listdirectories_request.rbi +15 -0
- data/lib/clerk/models/operations/listdirectories_response.rb +44 -0
- data/lib/clerk/models/operations/listdirectories_response.rbi +19 -0
- data/lib/clerk/models/operations/listdirectorygrouprolemappings_request.rb +32 -0
- data/lib/clerk/models/operations/listdirectorygrouprolemappings_request.rbi +13 -0
- data/lib/clerk/models/operations/listdirectorygrouprolemappings_response.rb +44 -0
- data/lib/clerk/models/operations/listdirectorygrouprolemappings_response.rbi +19 -0
- data/lib/clerk/models/operations/listoauthapplications_request.rb +2 -0
- data/lib/clerk/models/operations/listorganizationdomains_request.rb +2 -1
- data/lib/clerk/models/operations/listscimdirectories_request.rb +39 -0
- data/lib/clerk/models/operations/listscimdirectories_request.rbi +15 -0
- data/lib/clerk/models/operations/listscimdirectories_response.rb +44 -0
- data/lib/clerk/models/operations/listscimdirectories_response.rbi +19 -0
- data/lib/clerk/models/operations/listscimgrouprolemappings_request.rb +32 -0
- data/lib/clerk/models/operations/listscimgrouprolemappings_request.rbi +13 -0
- data/lib/clerk/models/operations/listscimgrouprolemappings_response.rb +44 -0
- data/lib/clerk/models/operations/listscimgrouprolemappings_response.rbi +19 -0
- data/lib/clerk/models/operations/listuserbiometriccredentials_request.rb +32 -0
- data/lib/clerk/models/operations/listuserbiometriccredentials_request.rbi +13 -0
- data/lib/clerk/models/operations/listuserbiometriccredentials_response.rb +44 -0
- data/lib/clerk/models/operations/listuserbiometriccredentials_response.rbi +19 -0
- data/lib/clerk/models/operations/listusertrusteddevices_request.rb +32 -0
- data/lib/clerk/models/operations/listusertrusteddevices_request.rbi +13 -0
- data/lib/clerk/models/operations/listusertrusteddevices_response.rb +44 -0
- data/lib/clerk/models/operations/listusertrusteddevices_response.rbi +19 -0
- data/lib/clerk/models/operations/removebillingsubscriptionitemdiscount_request.rb +36 -0
- data/lib/clerk/models/operations/removebillingsubscriptionitemdiscount_request.rbi +15 -0
- data/lib/clerk/models/operations/removebillingsubscriptionitemdiscount_response.rb +44 -0
- data/lib/clerk/models/operations/removebillingsubscriptionitemdiscount_response.rbi +19 -0
- data/lib/clerk/models/operations/removeuserpassword_request.rb +36 -0
- data/lib/clerk/models/operations/removeuserpassword_request.rbi +15 -0
- data/lib/clerk/models/operations/removeuserpassword_requestbody.rb +32 -0
- data/lib/clerk/models/operations/removeuserpassword_requestbody.rbi +13 -0
- data/lib/clerk/models/operations/removeuserpassword_response.rb +44 -0
- data/lib/clerk/models/operations/removeuserpassword_response.rbi +19 -0
- data/lib/clerk/models/operations/replacedirectorygrouprolemappings_mapping.rb +40 -0
- data/lib/clerk/models/operations/replacedirectorygrouprolemappings_mapping.rbi +17 -0
- data/lib/clerk/models/operations/replacedirectorygrouprolemappings_request.rb +36 -0
- data/lib/clerk/models/operations/replacedirectorygrouprolemappings_request.rbi +15 -0
- data/lib/clerk/models/operations/replacedirectorygrouprolemappings_requestbody.rb +32 -0
- data/lib/clerk/models/operations/replacedirectorygrouprolemappings_requestbody.rbi +13 -0
- data/lib/clerk/models/operations/replacedirectorygrouprolemappings_response.rb +44 -0
- data/lib/clerk/models/operations/replacedirectorygrouprolemappings_response.rbi +19 -0
- data/lib/clerk/models/operations/replacescimgrouprolemappings_mapping.rb +36 -0
- data/lib/clerk/models/operations/replacescimgrouprolemappings_mapping.rbi +15 -0
- data/lib/clerk/models/operations/replacescimgrouprolemappings_request.rb +36 -0
- data/lib/clerk/models/operations/replacescimgrouprolemappings_request.rbi +15 -0
- data/lib/clerk/models/operations/replacescimgrouprolemappings_requestbody.rb +32 -0
- data/lib/clerk/models/operations/replacescimgrouprolemappings_requestbody.rbi +13 -0
- data/lib/clerk/models/operations/replacescimgrouprolemappings_response.rb +44 -0
- data/lib/clerk/models/operations/replacescimgrouprolemappings_response.rbi +19 -0
- data/lib/clerk/models/operations/replaceuseremailaddress_identification_status.rb +10 -2
- data/lib/clerk/models/operations/replaceuseremailaddress_requestbody.rb +16 -3
- data/lib/clerk/models/operations/replaceuseremailaddress_requestbody.rbi +2 -0
- data/lib/clerk/models/operations/replaceuserphonenumber_identification_status.rb +10 -2
- data/lib/clerk/models/operations/replaceuserphonenumber_requestbody.rb +9 -2
- data/lib/clerk/models/operations/revokeoauthapplicationtoken_request.rb +36 -0
- data/lib/clerk/models/operations/revokeoauthapplicationtoken_request.rbi +15 -0
- data/lib/clerk/models/operations/revokeoauthapplicationtoken_requestbody.rb +32 -0
- data/lib/clerk/models/operations/revokeoauthapplicationtoken_requestbody.rbi +13 -0
- data/lib/clerk/models/operations/revokeoauthapplicationtoken_response.rb +40 -0
- data/lib/clerk/models/operations/revokeoauthapplicationtoken_response.rbi +17 -0
- data/lib/clerk/models/operations/revokeuserbiometriccredential_request.rb +36 -0
- data/lib/clerk/models/operations/revokeuserbiometriccredential_request.rbi +15 -0
- data/lib/clerk/models/operations/revokeuserbiometriccredential_response.rb +44 -0
- data/lib/clerk/models/operations/revokeuserbiometriccredential_response.rbi +19 -0
- data/lib/clerk/models/operations/revokeusertrusteddevice_request.rb +36 -0
- data/lib/clerk/models/operations/revokeusertrusteddevice_request.rbi +15 -0
- data/lib/clerk/models/operations/revokeusertrusteddevice_response.rb +44 -0
- data/lib/clerk/models/operations/revokeusertrusteddevice_response.rbi +19 -0
- data/lib/clerk/models/operations/rotatedirectoryapikey_request.rb +32 -0
- data/lib/clerk/models/operations/rotatedirectoryapikey_request.rbi +13 -0
- data/lib/clerk/models/operations/rotatedirectoryapikey_response.rb +44 -0
- data/lib/clerk/models/operations/rotatedirectoryapikey_response.rbi +19 -0
- data/lib/clerk/models/operations/rotatescimdirectoryapikey_request.rb +32 -0
- data/lib/clerk/models/operations/rotatescimdirectoryapikey_request.rbi +13 -0
- data/lib/clerk/models/operations/rotatescimdirectoryapikey_response.rb +44 -0
- data/lib/clerk/models/operations/rotatescimdirectoryapikey_response.rbi +19 -0
- data/lib/clerk/models/operations/updatedirectory_request.rb +36 -0
- data/lib/clerk/models/operations/updatedirectory_request.rbi +15 -0
- data/lib/clerk/models/operations/updatedirectory_requestbody.rb +49 -0
- data/lib/clerk/models/operations/updatedirectory_requestbody.rbi +21 -0
- data/lib/clerk/models/operations/updatedirectory_response.rb +44 -0
- data/lib/clerk/models/operations/updatedirectory_response.rbi +19 -0
- data/lib/clerk/models/operations/updateemailaddress_requestbody.rb +7 -1
- data/lib/clerk/models/operations/updateemailaddress_requestbody.rbi +2 -0
- data/lib/clerk/models/operations/updateenterpriseconnection_custom_attribute.rb +5 -1
- data/lib/clerk/models/operations/updateenterpriseconnection_custom_attribute.rbi +2 -0
- data/lib/clerk/models/operations/updateenterpriseconnection_login_hint.rb +36 -0
- data/lib/clerk/models/operations/updateenterpriseconnection_login_hint.rbi +15 -0
- data/lib/clerk/models/operations/updateenterpriseconnection_mode.rb +21 -0
- data/lib/clerk/models/operations/updateenterpriseconnection_mode.rbi +11 -0
- data/lib/clerk/models/operations/updateenterpriseconnection_saml.rb +5 -1
- data/lib/clerk/models/operations/updateenterpriseconnection_saml.rbi +2 -0
- data/lib/clerk/models/operations/updateinstance_request.rb +15 -5
- data/lib/clerk/models/operations/updateinstance_request.rbi +6 -2
- data/lib/clerk/models/operations/updateinstanceoauthapplicationsettings_request.rb +26 -1
- data/lib/clerk/models/operations/updateinstanceoauthapplicationsettings_request.rbi +12 -0
- data/lib/clerk/models/operations/updateinstanceprotect_request.rb +1 -1
- data/lib/clerk/models/operations/updateoauthapplication_requestbody.rb +9 -5
- data/lib/clerk/models/operations/updateoauthapplication_requestbody.rbi +4 -2
- data/lib/clerk/models/operations/updateorganization_requestbody.rb +6 -1
- data/lib/clerk/models/operations/updateorganization_requestbody.rbi +2 -0
- data/lib/clerk/models/operations/updateorganizationdomain_requestbody.rb +1 -1
- data/lib/clerk/models/operations/updatesamlconnection_login_hint.rb +36 -0
- data/lib/clerk/models/operations/updatesamlconnection_login_hint.rbi +15 -0
- data/lib/clerk/models/operations/updatesamlconnection_mode.rb +21 -0
- data/lib/clerk/models/operations/updatesamlconnection_mode.rbi +11 -0
- data/lib/clerk/models/operations/updatesamlconnection_requestbody.rb +5 -1
- data/lib/clerk/models/operations/updatesamlconnection_requestbody.rbi +2 -0
- data/lib/clerk/models/operations/updatescimdirectory_request.rb +36 -0
- data/lib/clerk/models/operations/updatescimdirectory_request.rbi +15 -0
- data/lib/clerk/models/operations/updatescimdirectory_requestbody.rb +49 -0
- data/lib/clerk/models/operations/updatescimdirectory_requestbody.rbi +21 -0
- data/lib/clerk/models/operations/updatescimdirectory_response.rb +44 -0
- data/lib/clerk/models/operations/updatescimdirectory_response.rbi +19 -0
- data/lib/clerk/models/operations/updateuser_requestbody.rb +1 -1
- data/lib/clerk/models/operations.rb +80 -0
- data/lib/clerk/oauthaccesstokens.rb +5 -5
- data/lib/clerk/oauthapplications.rb +185 -35
- data/lib/clerk/openapiclient.rb +3 -1
- data/lib/clerk/organizationdomains.rb +32 -32
- data/lib/clerk/organizationinvitations.rb +35 -35
- data/lib/clerk/organizationmemberships.rb +25 -25
- data/lib/clerk/organizationpermissions.rb +25 -25
- data/lib/clerk/organizationroles.rb +35 -35
- data/lib/clerk/organizations.rb +60 -60
- data/lib/clerk/phonenumbers.rb +53 -38
- data/lib/clerk/proxy.rb +3 -3
- data/lib/clerk/proxychecks.rb +5 -5
- data/lib/clerk/redirecturls.rb +20 -20
- data/lib/clerk/rolesets.rb +35 -35
- data/lib/clerk/samlconnections.rb +25 -25
- data/lib/clerk/scimdirectories.rb +1534 -0
- data/lib/clerk/sdk.rb +44 -6
- data/lib/clerk/sdkconfiguration.rb +3 -3
- data/lib/clerk/sessions.rb +181 -35
- data/lib/clerk/signintokens.rb +11 -11
- data/lib/clerk/signups.rb +10 -10
- data/lib/clerk/templates.rb +5 -5
- data/lib/clerk/testingtokens.rb +5 -5
- data/lib/clerk/users.rb +1045 -223
- data/lib/clerk/utils/retries.rb +43 -1
- data/lib/clerk/utils/utils.rb +6 -2
- data/lib/clerk/waitlistentries.rb +30 -30
- data/lib/clerk/webhooks.rb +15 -15
- data/lib/clerk_sdk_ruby.rb +2 -0
- data/test/clerk/jwks_cache_scoping_test.rb +83 -0
- data/test/clerk/org_permissions_v2_test.rb +130 -0
- data/test/clerk/proxy_test.rb +108 -0
- metadata +339 -82
- data/lib/clerk/models/components/clerkerror_meta.rb +0 -27
- data/lib/clerk/models/components/clerkerrors_meta.rb +0 -27
- data/lib/clerk/models/components/emailaddress_verification_saml_meta.rb +0 -27
- data/lib/clerk/models/components/emailaddress_verification_saml_meta.rbi +0 -11
- data/lib/clerk/models/components/enterpriseaccount_verification_oauth_meta.rb +0 -27
- data/lib/clerk/models/components/enterpriseaccount_verification_oauth_meta.rbi +0 -11
- data/lib/clerk/models/components/enterpriseaccount_verification_saml_meta.rb +0 -27
- data/lib/clerk/models/components/enterpriseaccount_verification_saml_meta.rbi +0 -11
- data/lib/clerk/models/components/externalaccountwithverification_verification_oauth_meta.rb +0 -27
- data/lib/clerk/models/components/externalaccountwithverification_verification_oauth_meta.rbi +0 -11
- data/lib/clerk/models/components/samlaccount_meta.rb +0 -27
- data/lib/clerk/models/components/schemas_commerceplan_object.rbi +0 -11
- data/lib/clerk/models/components/schemas_commercesubscriptionitem_annual_fee.rbi +0 -19
- data/lib/clerk/models/components/schemas_commercesubscriptionitem_annual_monthly_fee.rb +0 -44
- data/lib/clerk/models/components/schemas_commercesubscriptionitem_annual_monthly_fee.rbi +0 -19
- data/lib/clerk/models/components/schemas_commercesubscriptionitem_next_payment_amount.rbi +0 -19
- data/lib/clerk/models/components/schemas_commercesubscriptionitem_object_commercepayer.rbi +0 -11
- data/lib/clerk/models/components/schemas_commercesubscriptionitem_object_commerceplan.rbi +0 -11
- data/lib/clerk/models/components/schemas_commercesubscriptionitem_object_commercesubscriptionitem.rbi +0 -11
- data/lib/clerk/models/components/schemas_commercesubscriptionitem_plan_period.rbi +0 -11
- data/lib/clerk/models/components/schemas_commercesubscriptionitem_status.rbi +0 -11
- data/lib/clerk/models/components/schemas_featureresponse_object.rbi +0 -11
- data/lib/clerk/models/components/verification_from_oauth_meta.rb +0 -27
- data/lib/clerk/models/components/verification_from_oauth_meta.rbi +0 -11
- data/lib/clerk/models/components/verification_google_one_tap_meta.rb +0 -27
- data/lib/clerk/models/components/verification_google_one_tap_meta.rbi +0 -11
data/lib/clerk/utils/retries.rb
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
# frozen_string_literal: true
|
|
5
5
|
|
|
6
6
|
require 'faraday/retry'
|
|
7
|
+
require 'time'
|
|
7
8
|
|
|
8
9
|
|
|
9
10
|
module Clerk
|
|
@@ -67,16 +68,57 @@ module Clerk
|
|
|
67
68
|
if @strategy == 'backoff' && @backoff
|
|
68
69
|
retry_options[:backoff_factor] = @backoff.exponent unless @backoff.exponent.nil?
|
|
69
70
|
retry_options[:interval] = (@backoff.initial_interval.to_f / 1000) unless @backoff.initial_interval.nil?
|
|
70
|
-
retry_options[:max_interval] = @backoff.max_interval unless @backoff.max_interval.nil?
|
|
71
|
+
retry_options[:max_interval] = (@backoff.max_interval.to_f / 1000) unless @backoff.max_interval.nil?
|
|
71
72
|
|
|
72
73
|
unless @backoff.max_elapsed_time.nil?
|
|
73
74
|
stop_time = initial_time + (@backoff.max_elapsed_time.to_f / 1000)
|
|
74
75
|
retry_options[:retry_if] = ->(_env, _exc) { Time.now < stop_time }
|
|
75
76
|
end
|
|
77
|
+
|
|
76
78
|
end
|
|
77
79
|
|
|
78
80
|
retry_options
|
|
79
81
|
end
|
|
80
82
|
end
|
|
83
|
+
|
|
84
|
+
class RetryMiddleware < Faraday::Retry::Middleware
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def calculate_sleep_amount(retries, env)
|
|
89
|
+
retry_after = [calculate_retry_after(env), calculate_rate_limit_reset(env)].compact.max
|
|
90
|
+
retry_interval = calculate_retry_interval(retries)
|
|
91
|
+
return retry_interval if retry_after.nil?
|
|
92
|
+
|
|
93
|
+
# unlike the stock middleware, cap server delays at max_interval rather
|
|
94
|
+
# than abandoning the retry
|
|
95
|
+
[[retry_after, @options.max_interval].min, retry_interval].max
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
private
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def calculate_retry_after(env)
|
|
102
|
+
response_headers = env[:response_headers]
|
|
103
|
+
return unless response_headers
|
|
104
|
+
|
|
105
|
+
ms_value = response_headers['retry-after-ms']
|
|
106
|
+
return ms_value.to_f / 1000 if ms_value&.match?(/\A\s*\d+\s*\z/)
|
|
107
|
+
|
|
108
|
+
value = response_headers['retry-after']
|
|
109
|
+
return if value.nil? || value.strip.empty?
|
|
110
|
+
return value.to_f if value.match?(/\A\s*\d+\s*\z/)
|
|
111
|
+
|
|
112
|
+
begin
|
|
113
|
+
Time.httpdate(value) - Time.now
|
|
114
|
+
rescue ArgumentError
|
|
115
|
+
begin
|
|
116
|
+
Time.iso8601(value) - Time.now
|
|
117
|
+
rescue ArgumentError
|
|
118
|
+
nil
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
end
|
|
81
123
|
end
|
|
82
124
|
end
|
data/lib/clerk/utils/utils.rb
CHANGED
|
@@ -78,11 +78,15 @@ module Clerk
|
|
|
78
78
|
|
|
79
79
|
|
|
80
80
|
def self.match_content_type(content_type, pattern)
|
|
81
|
-
return true if
|
|
81
|
+
return true if ['*', '*/*'].include?(pattern)
|
|
82
|
+
|
|
83
|
+
# Media types are case-insensitive (RFC 9110 section 8.3.1).
|
|
84
|
+
pattern = pattern.strip.downcase
|
|
85
|
+
return true if content_type.strip.downcase == pattern
|
|
82
86
|
|
|
83
87
|
pieces = content_type.split(';')
|
|
84
88
|
pieces.each do |piece|
|
|
85
|
-
return true if pattern == piece.strip
|
|
89
|
+
return true if pattern == piece.strip.downcase
|
|
86
90
|
end
|
|
87
91
|
|
|
88
92
|
false
|
|
@@ -72,10 +72,10 @@ module Clerk
|
|
|
72
72
|
|
|
73
73
|
timeout = (timeout_ms.to_f / 1000) unless timeout_ms.nil?
|
|
74
74
|
timeout ||= @sdk_configuration.timeout
|
|
75
|
-
|
|
75
|
+
|
|
76
76
|
|
|
77
77
|
connection = @sdk_configuration.client.dup
|
|
78
|
-
connection.
|
|
78
|
+
connection.use Utils::RetryMiddleware, retry_options
|
|
79
79
|
|
|
80
80
|
hook_ctx = SDKHooks::HookContext.new(
|
|
81
81
|
config: @sdk_configuration,
|
|
@@ -88,7 +88,7 @@ module Clerk
|
|
|
88
88
|
error = nil
|
|
89
89
|
http_response = nil
|
|
90
90
|
|
|
91
|
-
|
|
91
|
+
|
|
92
92
|
begin
|
|
93
93
|
http_response = connection.get(url) do |req|
|
|
94
94
|
req.headers.merge!(headers)
|
|
@@ -125,13 +125,13 @@ module Clerk
|
|
|
125
125
|
response: http_response
|
|
126
126
|
)
|
|
127
127
|
end
|
|
128
|
-
|
|
128
|
+
|
|
129
129
|
if http_response.nil?
|
|
130
130
|
raise error if !error.nil?
|
|
131
131
|
raise 'no response'
|
|
132
132
|
end
|
|
133
133
|
end
|
|
134
|
-
|
|
134
|
+
|
|
135
135
|
content_type = http_response.headers.fetch('Content-Type', 'application/octet-stream')
|
|
136
136
|
if Utils.match_status_code(http_response.status, ['200'])
|
|
137
137
|
if Utils.match_content_type(content_type, 'application/json')
|
|
@@ -205,10 +205,10 @@ module Clerk
|
|
|
205
205
|
|
|
206
206
|
timeout = (timeout_ms.to_f / 1000) unless timeout_ms.nil?
|
|
207
207
|
timeout ||= @sdk_configuration.timeout
|
|
208
|
-
|
|
208
|
+
|
|
209
209
|
|
|
210
210
|
connection = @sdk_configuration.client.dup
|
|
211
|
-
connection.
|
|
211
|
+
connection.use Utils::RetryMiddleware, retry_options
|
|
212
212
|
|
|
213
213
|
hook_ctx = SDKHooks::HookContext.new(
|
|
214
214
|
config: @sdk_configuration,
|
|
@@ -221,7 +221,7 @@ module Clerk
|
|
|
221
221
|
error = nil
|
|
222
222
|
http_response = nil
|
|
223
223
|
|
|
224
|
-
|
|
224
|
+
|
|
225
225
|
begin
|
|
226
226
|
http_response = connection.post(url) do |req|
|
|
227
227
|
req.body = body
|
|
@@ -258,13 +258,13 @@ module Clerk
|
|
|
258
258
|
response: http_response
|
|
259
259
|
)
|
|
260
260
|
end
|
|
261
|
-
|
|
261
|
+
|
|
262
262
|
if http_response.nil?
|
|
263
263
|
raise error if !error.nil?
|
|
264
264
|
raise 'no response'
|
|
265
265
|
end
|
|
266
266
|
end
|
|
267
|
-
|
|
267
|
+
|
|
268
268
|
content_type = http_response.headers.fetch('Content-Type', 'application/octet-stream')
|
|
269
269
|
if Utils.match_status_code(http_response.status, ['200'])
|
|
270
270
|
if Utils.match_content_type(content_type, 'application/json')
|
|
@@ -359,10 +359,10 @@ module Clerk
|
|
|
359
359
|
|
|
360
360
|
timeout = (timeout_ms.to_f / 1000) unless timeout_ms.nil?
|
|
361
361
|
timeout ||= @sdk_configuration.timeout
|
|
362
|
-
|
|
362
|
+
|
|
363
363
|
|
|
364
364
|
connection = @sdk_configuration.client.dup
|
|
365
|
-
connection.
|
|
365
|
+
connection.use Utils::RetryMiddleware, retry_options
|
|
366
366
|
|
|
367
367
|
hook_ctx = SDKHooks::HookContext.new(
|
|
368
368
|
config: @sdk_configuration,
|
|
@@ -375,7 +375,7 @@ module Clerk
|
|
|
375
375
|
error = nil
|
|
376
376
|
http_response = nil
|
|
377
377
|
|
|
378
|
-
|
|
378
|
+
|
|
379
379
|
begin
|
|
380
380
|
http_response = connection.post(url) do |req|
|
|
381
381
|
req.body = body
|
|
@@ -412,13 +412,13 @@ module Clerk
|
|
|
412
412
|
response: http_response
|
|
413
413
|
)
|
|
414
414
|
end
|
|
415
|
-
|
|
415
|
+
|
|
416
416
|
if http_response.nil?
|
|
417
417
|
raise error if !error.nil?
|
|
418
418
|
raise 'no response'
|
|
419
419
|
end
|
|
420
420
|
end
|
|
421
|
-
|
|
421
|
+
|
|
422
422
|
content_type = http_response.headers.fetch('Content-Type', 'application/octet-stream')
|
|
423
423
|
if Utils.match_status_code(http_response.status, ['200'])
|
|
424
424
|
if Utils.match_content_type(content_type, 'application/json')
|
|
@@ -504,10 +504,10 @@ module Clerk
|
|
|
504
504
|
|
|
505
505
|
timeout = (timeout_ms.to_f / 1000) unless timeout_ms.nil?
|
|
506
506
|
timeout ||= @sdk_configuration.timeout
|
|
507
|
-
|
|
507
|
+
|
|
508
508
|
|
|
509
509
|
connection = @sdk_configuration.client.dup
|
|
510
|
-
connection.
|
|
510
|
+
connection.use Utils::RetryMiddleware, retry_options
|
|
511
511
|
|
|
512
512
|
hook_ctx = SDKHooks::HookContext.new(
|
|
513
513
|
config: @sdk_configuration,
|
|
@@ -520,7 +520,7 @@ module Clerk
|
|
|
520
520
|
error = nil
|
|
521
521
|
http_response = nil
|
|
522
522
|
|
|
523
|
-
|
|
523
|
+
|
|
524
524
|
begin
|
|
525
525
|
http_response = connection.delete(url) do |req|
|
|
526
526
|
req.headers.merge!(headers)
|
|
@@ -556,13 +556,13 @@ module Clerk
|
|
|
556
556
|
response: http_response
|
|
557
557
|
)
|
|
558
558
|
end
|
|
559
|
-
|
|
559
|
+
|
|
560
560
|
if http_response.nil?
|
|
561
561
|
raise error if !error.nil?
|
|
562
562
|
raise 'no response'
|
|
563
563
|
end
|
|
564
564
|
end
|
|
565
|
-
|
|
565
|
+
|
|
566
566
|
content_type = http_response.headers.fetch('Content-Type', 'application/octet-stream')
|
|
567
567
|
if Utils.match_status_code(http_response.status, ['200'])
|
|
568
568
|
if Utils.match_content_type(content_type, 'application/json')
|
|
@@ -659,10 +659,10 @@ module Clerk
|
|
|
659
659
|
|
|
660
660
|
timeout = (timeout_ms.to_f / 1000) unless timeout_ms.nil?
|
|
661
661
|
timeout ||= @sdk_configuration.timeout
|
|
662
|
-
|
|
662
|
+
|
|
663
663
|
|
|
664
664
|
connection = @sdk_configuration.client.dup
|
|
665
|
-
connection.
|
|
665
|
+
connection.use Utils::RetryMiddleware, retry_options
|
|
666
666
|
|
|
667
667
|
hook_ctx = SDKHooks::HookContext.new(
|
|
668
668
|
config: @sdk_configuration,
|
|
@@ -675,7 +675,7 @@ module Clerk
|
|
|
675
675
|
error = nil
|
|
676
676
|
http_response = nil
|
|
677
677
|
|
|
678
|
-
|
|
678
|
+
|
|
679
679
|
begin
|
|
680
680
|
http_response = connection.post(url) do |req|
|
|
681
681
|
req.body = body
|
|
@@ -712,13 +712,13 @@ module Clerk
|
|
|
712
712
|
response: http_response
|
|
713
713
|
)
|
|
714
714
|
end
|
|
715
|
-
|
|
715
|
+
|
|
716
716
|
if http_response.nil?
|
|
717
717
|
raise error if !error.nil?
|
|
718
718
|
raise 'no response'
|
|
719
719
|
end
|
|
720
720
|
end
|
|
721
|
-
|
|
721
|
+
|
|
722
722
|
content_type = http_response.headers.fetch('Content-Type', 'application/octet-stream')
|
|
723
723
|
if Utils.match_status_code(http_response.status, ['200'])
|
|
724
724
|
if Utils.match_content_type(content_type, 'application/json')
|
|
@@ -804,10 +804,10 @@ module Clerk
|
|
|
804
804
|
|
|
805
805
|
timeout = (timeout_ms.to_f / 1000) unless timeout_ms.nil?
|
|
806
806
|
timeout ||= @sdk_configuration.timeout
|
|
807
|
-
|
|
807
|
+
|
|
808
808
|
|
|
809
809
|
connection = @sdk_configuration.client.dup
|
|
810
|
-
connection.
|
|
810
|
+
connection.use Utils::RetryMiddleware, retry_options
|
|
811
811
|
|
|
812
812
|
hook_ctx = SDKHooks::HookContext.new(
|
|
813
813
|
config: @sdk_configuration,
|
|
@@ -820,7 +820,7 @@ module Clerk
|
|
|
820
820
|
error = nil
|
|
821
821
|
http_response = nil
|
|
822
822
|
|
|
823
|
-
|
|
823
|
+
|
|
824
824
|
begin
|
|
825
825
|
http_response = connection.post(url) do |req|
|
|
826
826
|
req.headers.merge!(headers)
|
|
@@ -856,13 +856,13 @@ module Clerk
|
|
|
856
856
|
response: http_response
|
|
857
857
|
)
|
|
858
858
|
end
|
|
859
|
-
|
|
859
|
+
|
|
860
860
|
if http_response.nil?
|
|
861
861
|
raise error if !error.nil?
|
|
862
862
|
raise 'no response'
|
|
863
863
|
end
|
|
864
864
|
end
|
|
865
|
-
|
|
865
|
+
|
|
866
866
|
content_type = http_response.headers.fetch('Content-Type', 'application/octet-stream')
|
|
867
867
|
if Utils.match_status_code(http_response.status, ['200'])
|
|
868
868
|
if Utils.match_content_type(content_type, 'application/json')
|
data/lib/clerk/webhooks.rb
CHANGED
|
@@ -69,10 +69,10 @@ module Clerk
|
|
|
69
69
|
|
|
70
70
|
timeout = (timeout_ms.to_f / 1000) unless timeout_ms.nil?
|
|
71
71
|
timeout ||= @sdk_configuration.timeout
|
|
72
|
-
|
|
72
|
+
|
|
73
73
|
|
|
74
74
|
connection = @sdk_configuration.client.dup
|
|
75
|
-
connection.
|
|
75
|
+
connection.use Utils::RetryMiddleware, retry_options
|
|
76
76
|
|
|
77
77
|
hook_ctx = SDKHooks::HookContext.new(
|
|
78
78
|
config: @sdk_configuration,
|
|
@@ -85,7 +85,7 @@ module Clerk
|
|
|
85
85
|
error = nil
|
|
86
86
|
http_response = nil
|
|
87
87
|
|
|
88
|
-
|
|
88
|
+
|
|
89
89
|
begin
|
|
90
90
|
http_response = connection.post(url) do |req|
|
|
91
91
|
req.headers.merge!(headers)
|
|
@@ -121,13 +121,13 @@ module Clerk
|
|
|
121
121
|
response: http_response
|
|
122
122
|
)
|
|
123
123
|
end
|
|
124
|
-
|
|
124
|
+
|
|
125
125
|
if http_response.nil?
|
|
126
126
|
raise error if !error.nil?
|
|
127
127
|
raise 'no response'
|
|
128
128
|
end
|
|
129
129
|
end
|
|
130
|
-
|
|
130
|
+
|
|
131
131
|
content_type = http_response.headers.fetch('Content-Type', 'application/octet-stream')
|
|
132
132
|
if Utils.match_status_code(http_response.status, ['200'])
|
|
133
133
|
if Utils.match_content_type(content_type, 'application/json')
|
|
@@ -205,10 +205,10 @@ module Clerk
|
|
|
205
205
|
|
|
206
206
|
timeout = (timeout_ms.to_f / 1000) unless timeout_ms.nil?
|
|
207
207
|
timeout ||= @sdk_configuration.timeout
|
|
208
|
-
|
|
208
|
+
|
|
209
209
|
|
|
210
210
|
connection = @sdk_configuration.client.dup
|
|
211
|
-
connection.
|
|
211
|
+
connection.use Utils::RetryMiddleware, retry_options
|
|
212
212
|
|
|
213
213
|
hook_ctx = SDKHooks::HookContext.new(
|
|
214
214
|
config: @sdk_configuration,
|
|
@@ -221,7 +221,7 @@ module Clerk
|
|
|
221
221
|
error = nil
|
|
222
222
|
http_response = nil
|
|
223
223
|
|
|
224
|
-
|
|
224
|
+
|
|
225
225
|
begin
|
|
226
226
|
http_response = connection.delete(url) do |req|
|
|
227
227
|
req.headers.merge!(headers)
|
|
@@ -257,13 +257,13 @@ module Clerk
|
|
|
257
257
|
response: http_response
|
|
258
258
|
)
|
|
259
259
|
end
|
|
260
|
-
|
|
260
|
+
|
|
261
261
|
if http_response.nil?
|
|
262
262
|
raise error if !error.nil?
|
|
263
263
|
raise 'no response'
|
|
264
264
|
end
|
|
265
265
|
end
|
|
266
|
-
|
|
266
|
+
|
|
267
267
|
content_type = http_response.headers.fetch('Content-Type', 'application/octet-stream')
|
|
268
268
|
if Utils.match_status_code(http_response.status, ['204'])
|
|
269
269
|
http_response = @sdk_configuration.hooks.after_success(
|
|
@@ -332,10 +332,10 @@ module Clerk
|
|
|
332
332
|
|
|
333
333
|
timeout = (timeout_ms.to_f / 1000) unless timeout_ms.nil?
|
|
334
334
|
timeout ||= @sdk_configuration.timeout
|
|
335
|
-
|
|
335
|
+
|
|
336
336
|
|
|
337
337
|
connection = @sdk_configuration.client.dup
|
|
338
|
-
connection.
|
|
338
|
+
connection.use Utils::RetryMiddleware, retry_options
|
|
339
339
|
|
|
340
340
|
hook_ctx = SDKHooks::HookContext.new(
|
|
341
341
|
config: @sdk_configuration,
|
|
@@ -348,7 +348,7 @@ module Clerk
|
|
|
348
348
|
error = nil
|
|
349
349
|
http_response = nil
|
|
350
350
|
|
|
351
|
-
|
|
351
|
+
|
|
352
352
|
begin
|
|
353
353
|
http_response = connection.post(url) do |req|
|
|
354
354
|
req.headers.merge!(headers)
|
|
@@ -384,13 +384,13 @@ module Clerk
|
|
|
384
384
|
response: http_response
|
|
385
385
|
)
|
|
386
386
|
end
|
|
387
|
-
|
|
387
|
+
|
|
388
388
|
if http_response.nil?
|
|
389
389
|
raise error if !error.nil?
|
|
390
390
|
raise 'no response'
|
|
391
391
|
end
|
|
392
392
|
end
|
|
393
|
-
|
|
393
|
+
|
|
394
394
|
content_type = http_response.headers.fetch('Content-Type', 'application/octet-stream')
|
|
395
395
|
if Utils.match_status_code(http_response.status, ['200'])
|
|
396
396
|
if Utils.match_content_type(content_type, 'application/json')
|
data/lib/clerk_sdk_ruby.rb
CHANGED
|
@@ -43,6 +43,8 @@ module Clerk
|
|
|
43
43
|
autoload :Billing, 'clerk/billing'
|
|
44
44
|
autoload :OrganizationPermissions, 'clerk/organizationpermissions'
|
|
45
45
|
autoload :RoleSets, 'clerk/rolesets'
|
|
46
|
+
autoload :ScimDirectories, 'clerk/scimdirectories'
|
|
47
|
+
autoload :Directories, 'clerk/directories'
|
|
46
48
|
autoload :AdminPortalLinkTokens, 'clerk/admin_portal_link_tokens'
|
|
47
49
|
autoload :APIKeys, 'clerk/api_keys'
|
|
48
50
|
autoload :M2m, 'clerk/m2m'
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'base64'
|
|
4
|
+
require 'faraday'
|
|
5
|
+
require 'faraday/adapter/test'
|
|
6
|
+
require 'json'
|
|
7
|
+
require 'jwt'
|
|
8
|
+
require 'minitest/autorun'
|
|
9
|
+
require 'openssl'
|
|
10
|
+
require_relative '../../lib/clerk'
|
|
11
|
+
|
|
12
|
+
# Regression test for AISEC-84. The JWKS cache was a single class variable
|
|
13
|
+
# shared by every Clerk::SDK in the process, and verify_token performs no
|
|
14
|
+
# issuer check. While the cache held one instance's keys, a token minted by
|
|
15
|
+
# that instance verified against any other instance's SDK.
|
|
16
|
+
class JwksCacheScopingTest < Minitest::Test
|
|
17
|
+
Tenant = Struct.new(:sdk, :token, :fetches)
|
|
18
|
+
|
|
19
|
+
def test_cached_keys_are_not_served_to_another_instance
|
|
20
|
+
tenant_a = build_tenant('tenant_a')
|
|
21
|
+
tenant_b = build_tenant('tenant_b')
|
|
22
|
+
|
|
23
|
+
# A legitimate tenant-B verification loads tenant B's keys.
|
|
24
|
+
claims = tenant_b.sdk.verify_token(tenant_b.token)
|
|
25
|
+
assert_equal 'user_tenant_b', claims['sub']
|
|
26
|
+
assert_equal ['tenant_b'], tenant_b.fetches
|
|
27
|
+
|
|
28
|
+
# The same token under tenant A must not resolve against tenant B's keys.
|
|
29
|
+
assert_raises(JWT::DecodeError) do
|
|
30
|
+
tenant_a.sdk.verify_token(tenant_b.token)
|
|
31
|
+
end
|
|
32
|
+
refute_empty tenant_a.fetches, 'tenant A must fetch its own JWKS'
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def test_scope_differs_per_secret_key
|
|
36
|
+
sdk_a = ::Clerk::SDK.new(secret_key: 'sk_test_a', server_url: 'https://api.clerk.com/v1')
|
|
37
|
+
sdk_b = ::Clerk::SDK.new(secret_key: 'sk_test_b', server_url: 'https://api.clerk.com/v1')
|
|
38
|
+
sdk_a_again = ::Clerk::SDK.new(secret_key: 'sk_test_a', server_url: 'https://api.clerk.com/v1')
|
|
39
|
+
|
|
40
|
+
refute_equal sdk_a.jwks_cache_scope, sdk_b.jwks_cache_scope
|
|
41
|
+
# The cache must still be shared across SDKs for the same instance, since
|
|
42
|
+
# authenticate_request builds a fresh SDK per request.
|
|
43
|
+
assert_equal sdk_a.jwks_cache_scope, sdk_a_again.jwks_cache_scope
|
|
44
|
+
assert_same ::Clerk::SDK.jwks_cache(sdk_a.jwks_cache_scope),
|
|
45
|
+
::Clerk::SDK.jwks_cache(sdk_a_again.jwks_cache_scope)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
private
|
|
49
|
+
|
|
50
|
+
def build_tenant(name)
|
|
51
|
+
key = OpenSSL::PKey::RSA.generate(2048)
|
|
52
|
+
kid = "ins_#{name}"
|
|
53
|
+
jwk = {
|
|
54
|
+
kty: 'RSA', use: 'sig', alg: 'RS256', kid: kid,
|
|
55
|
+
n: b64(key.n.to_s(2)),
|
|
56
|
+
e: b64(key.e.to_s(2))
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
fetches = []
|
|
60
|
+
stubs = Faraday::Adapter::Test::Stubs.new
|
|
61
|
+
stubs.get('/v1/jwks') do
|
|
62
|
+
fetches << name
|
|
63
|
+
[200, {'Content-Type' => 'application/json'}, JSON.generate(keys: [jwk])]
|
|
64
|
+
end
|
|
65
|
+
client = Faraday.new { |builder| builder.adapter :test, stubs }
|
|
66
|
+
|
|
67
|
+
sdk = ::Clerk::SDK.new(
|
|
68
|
+
secret_key: "sk_test_#{name}",
|
|
69
|
+
client: client,
|
|
70
|
+
server_url: 'https://api.clerk.com/v1'
|
|
71
|
+
)
|
|
72
|
+
token = JWT.encode(
|
|
73
|
+
{sub: "user_#{name}", exp: Time.now.to_i + 3600},
|
|
74
|
+
key, 'RS256', {kid: kid}
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
Tenant.new(sdk, token, fetches)
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def b64(bytes)
|
|
81
|
+
Base64.urlsafe_encode64(bytes, padding: false)
|
|
82
|
+
end
|
|
83
|
+
end
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'minitest/autorun'
|
|
4
|
+
require_relative '../../lib/clerk'
|
|
5
|
+
|
|
6
|
+
module Clerk
|
|
7
|
+
# Coverage for Clerk::SDK#compute_org_permissions_from_v2_token, which decodes
|
|
8
|
+
# the `fea` / `o.per` / `o.fpm` triple of a v2 session token into
|
|
9
|
+
# `org:<feature>:<action>` strings.
|
|
10
|
+
class OrgPermissionsV2Test < Minitest::Test
|
|
11
|
+
ACTIONS = (0...64).map { |n| "act_#{n}" }.freeze
|
|
12
|
+
|
|
13
|
+
def sdk
|
|
14
|
+
@sdk ||= Clerk::SDK.new(secret_key: 'sk_test_not_used')
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def permissions_for(fea:, per:, fpm:)
|
|
18
|
+
claims = {'fea' => fea, 'o' => {'per' => per, 'fpm' => fpm}}
|
|
19
|
+
sdk.send(:compute_org_permissions_from_v2_token, claims)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# --- happy path (regression guard) ----------------------------------------
|
|
23
|
+
|
|
24
|
+
def test_small_masks_decode_with_bit_zero_least_significant
|
|
25
|
+
result = permissions_for(
|
|
26
|
+
fea: 'o:leads,o:whatsapp',
|
|
27
|
+
per: 'chat_read,chat_send,connect,view_history',
|
|
28
|
+
fpm: '3,10'
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
assert_equal ['org:leads:chat_read', 'org:leads:chat_send',
|
|
32
|
+
'org:whatsapp:chat_send', 'org:whatsapp:view_history'], result
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def test_zero_mask_grants_nothing
|
|
36
|
+
assert_empty permissions_for(fea: 'o:leads', per: 'chat_read,chat_send', fpm: '0')
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def test_non_org_scoped_features_are_skipped
|
|
40
|
+
result = permissions_for(
|
|
41
|
+
fea: 'u:billing,o:leads',
|
|
42
|
+
per: 'chat_read,chat_send',
|
|
43
|
+
fpm: '3,1'
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
assert_equal ['org:leads:chat_read'], result
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# --- wide masks ------------------------------------------------------------
|
|
50
|
+
|
|
51
|
+
def test_mask_with_bit_62_set
|
|
52
|
+
result = permissions_for(fea: 'o:leads', per: ACTIONS.join(','), fpm: (2**62).to_s)
|
|
53
|
+
|
|
54
|
+
assert_equal ['org:leads:act_62'], result
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def test_positive_bignum_mask_with_bit_63_set
|
|
58
|
+
# 2**63 + 1 -- above the signed 64-bit range, but Ruby Integers are
|
|
59
|
+
# arbitrary-precision so this must still decode to indices 0 and 63.
|
|
60
|
+
result = permissions_for(fea: 'o:leads', per: ACTIONS.join(','), fpm: '9223372036854775809')
|
|
61
|
+
|
|
62
|
+
assert_equal ['org:leads:act_0', 'org:leads:act_63'], result
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# --- the security regression: negative masks must fail closed --------------
|
|
66
|
+
|
|
67
|
+
def test_negative_mask_grants_nothing
|
|
68
|
+
# A signed 64-bit overflow on the producing side yields a negative mask.
|
|
69
|
+
# `(-9223372036854775807).to_s(2)` is "-111...1", which -- walked character
|
|
70
|
+
# by character -- would otherwise grant 63 permissions.
|
|
71
|
+
result = permissions_for(fea: 'o:leads', per: ACTIONS.join(','), fpm: '-9223372036854775807')
|
|
72
|
+
|
|
73
|
+
assert_empty result
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def test_negative_mask_does_not_affect_other_features
|
|
77
|
+
result = permissions_for(
|
|
78
|
+
fea: 'o:leads,o:whatsapp',
|
|
79
|
+
per: ACTIONS.join(','),
|
|
80
|
+
fpm: '3,-9223372036854775807'
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
assert_equal ['org:leads:act_0', 'org:leads:act_1'], result
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def test_non_numeric_masks_grant_nothing
|
|
87
|
+
['abc', '1e3', '0x10', ' 3', '3 ', '1.5', '+3', ''].each do |mask|
|
|
88
|
+
assert_empty permissions_for(fea: 'o:leads', per: ACTIONS.join(','), fpm: mask),
|
|
89
|
+
"expected mask #{mask.inspect} to grant nothing"
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
# --- malformed claims must not raise ---------------------------------------
|
|
94
|
+
|
|
95
|
+
def test_more_mappings_than_features_does_not_raise
|
|
96
|
+
result = permissions_for(fea: 'o:leads', per: 'chat_read,chat_send', fpm: '1,3,7')
|
|
97
|
+
|
|
98
|
+
assert_equal ['org:leads:chat_read'], result
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def test_feature_without_a_scope_separator_does_not_raise
|
|
102
|
+
result = permissions_for(fea: 'leads,o:whatsapp', per: 'chat_read', fpm: '1,1')
|
|
103
|
+
|
|
104
|
+
assert_equal ['org:whatsapp:chat_read'], result
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def test_missing_claims_do_not_raise
|
|
108
|
+
assert_empty permissions_for(fea: nil, per: nil, fpm: nil)
|
|
109
|
+
assert_empty permissions_for(fea: 'o:leads', per: nil, fpm: '3')
|
|
110
|
+
assert_empty permissions_for(fea: nil, per: 'chat_read', fpm: '3')
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
# --- masks wider than the permission vocabulary ----------------------------
|
|
114
|
+
|
|
115
|
+
def test_mask_wider_than_permission_list_does_not_emit_empty_permissions
|
|
116
|
+
# 0b1111 against a two-action vocabulary: only the first two bits map.
|
|
117
|
+
result = permissions_for(fea: 'o:leads', per: 'chat_read,chat_send', fpm: '15')
|
|
118
|
+
|
|
119
|
+
assert_equal ['org:leads:chat_read', 'org:leads:chat_send'], result
|
|
120
|
+
refute(result.any? { |permission| permission.end_with?(':') },
|
|
121
|
+
"expected no permissions with an empty action name, got #{result.inspect}")
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def test_high_bit_beyond_permission_list_is_ignored
|
|
125
|
+
result = permissions_for(fea: 'o:leads', per: 'chat_read', fpm: (2**63 | 1).to_s)
|
|
126
|
+
|
|
127
|
+
assert_equal ['org:leads:chat_read'], result
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
end
|