facade

package
v0.0.0-...-ee57881 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 20, 2024 License: Apache-2.0 Imports: 35 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

Functions

This section is empty.

Types

type AuditLogFacade

type AuditLogFacade struct {
	AuditLogQuery         AuditLogQuery
	Clock                 clock.Clock
	AuditDatabase         *auditdb.ReadHandle
	AuditLogFeatureConfig *config.AuditLogFeatureConfig
}

func (*AuditLogFacade) QueryPage

type AuditLogQuery

type AuditLogQuery interface {
	Count(ctx context.Context, opts audit.QueryPageOptions) (uint64, error)
	QueryPage(ctx context.Context, opts audit.QueryPageOptions, pageArgs graphqlutil.PageArgs) ([]model.PageItemRef, error)
}

type AuthenticatorFacade

type AuthenticatorFacade struct {
	Authenticators AuthenticatorService
	Interaction    InteractionService
}

func (*AuthenticatorFacade) CreateBySpec

func (f *AuthenticatorFacade) CreateBySpec(ctx context.Context, spec *authenticator.Spec) (*authenticator.Info, error)

func (*AuthenticatorFacade) Get

func (*AuthenticatorFacade) List

func (f *AuthenticatorFacade) List(ctx context.Context, userID string, authenticatorType *apimodel.AuthenticatorType, authenticatorKind *authenticator.Kind) ([]*authenticator.Ref, error)

func (*AuthenticatorFacade) Remove

func (f *AuthenticatorFacade) Remove(ctx context.Context, authenticatorInfo *authenticator.Info) error

type AuthenticatorService

type AuthenticatorService interface {
	New(ctx context.Context, spec *authenticator.Spec) (*authenticator.Info, error)
	UpdatePassword(ctx context.Context, ai *authenticator.Info, options *service.UpdatePasswordOptions) (bool, *authenticator.Info, error)

	Create(ctx context.Context, info *authenticator.Info) error
	Update(ctx context.Context, info *authenticator.Info) error
	Get(ctx context.Context, id string) (*authenticator.Info, error)
	Count(ctx context.Context, userID string) (uint64, error)
	ListRefsByUsers(ctx context.Context, userIDs []string, authenticatorType *apimodel.AuthenticatorType, authenticatorKind *authenticator.Kind) ([]*authenticator.Ref, error)
}

type AuthorizationFacade

type AuthorizationFacade struct {
	Authorizations AuthorizationService
}

func (*AuthorizationFacade) Delete

func (*AuthorizationFacade) Get

func (*AuthorizationFacade) List

type AuthorizationService

type AuthorizationService interface {
	GetByID(ctx context.Context, id string) (*oauth.Authorization, error)
	ListByUser(ctx context.Context, userID string, filters ...oauth.AuthorizationFilter) ([]*oauth.Authorization, error)
	Delete(ctx context.Context, a *oauth.Authorization) error
}

type CustomAttributesService

type CustomAttributesService interface {
	ReadCustomAttributesInStorageForm(ctx context.Context, role accesscontrol.Role, userID string, storageForm map[string]interface{}) (map[string]interface{}, error)
	UpdateAllCustomAttributes(ctx context.Context, role accesscontrol.Role, userID string, customAttrs map[string]interface{}) error
}

type EventService

type EventService interface {
	DispatchEventOnCommit(ctx context.Context, payload event.Payload) error
}

type IdentityFacade

type IdentityFacade struct {
	LoginIDConfig *config.LoginIDConfig
	Identities    IdentityService
	Interaction   InteractionService
}

func (*IdentityFacade) Create

func (f *IdentityFacade) Create(ctx context.Context, userID string, identityDef model.IdentityDef, password string) (*apimodel.IdentityRef, error)

func (*IdentityFacade) Get

func (f *IdentityFacade) Get(ctx context.Context, id string) (*identity.Info, error)

func (*IdentityFacade) List

func (f *IdentityFacade) List(ctx context.Context, userID string, identityType *apimodel.IdentityType) ([]*apimodel.IdentityRef, error)

func (*IdentityFacade) Remove

func (f *IdentityFacade) Remove(ctx context.Context, identityInfo *identity.Info) error

func (*IdentityFacade) Update

func (f *IdentityFacade) Update(ctx context.Context, identityID string, userID string, identityDef model.IdentityDef) (*apimodel.IdentityRef, error)

type IdentityService

type IdentityService interface {
	Get(ctx context.Context, id string) (*identity.Info, error)
	ListRefsByUsers(ctx context.Context, userIDs []string, identityType *apimodel.IdentityType) ([]*apimodel.IdentityRef, error)
	CreateByAdmin(ctx context.Context, userID string, spec *identity.Spec, password string) (*identity.Info, error)
}

type InteractionService

type InteractionService interface {
	Perform(ctx context.Context, intent interaction.Intent, input interface{}) (*interaction.Graph, error)
}

type OAuthAuthorizationService

type OAuthAuthorizationService interface {
	CheckAndGrant(
		ctx context.Context,
		clientID string,
		userID string,
		scopes []string,
	) (*oauth.Authorization, error)
}

type OAuthClientResolver

type OAuthClientResolver interface {
	ResolveClient(clientID string) *config.OAuthClientConfig
}

type OAuthFacade

type OAuthFacade struct {
	Config              *config.OAuthConfig
	Users               UserService
	Authorizations      OAuthAuthorizationService
	Tokens              OAuthTokenService
	Clock               clock.Clock
	OAuthClientResolver OAuthClientResolver
}

func (*OAuthFacade) CreateSession

func (f *OAuthFacade) CreateSession(ctx context.Context, clientID string, userID string) (session.ListableSession, protocol.TokenResponse, error)

type OAuthTokenService

type OAuthTokenService interface {
	IssueOfflineGrant(
		ctx context.Context,
		client *config.OAuthClientConfig,
		opts handler.IssueOfflineGrantOptions,
		resp protocol.TokenResponse,
	) (offlineGrant *oauth.OfflineGrant, tokenHash string, err error)
	IssueAccessGrant(
		ctx context.Context,
		client *config.OAuthClientConfig,
		scopes []string,
		authzID string,
		userID string,
		sessionID string,
		sessionKind oauth.GrantSessionKind,
		refreshTokenHash string,
		resp protocol.TokenResponse,
	) error
}

type RolesGroupsCommands

type RolesGroupsCommands interface {
	CreateRole(ctx context.Context, options *rolesgroups.NewRoleOptions) (*model.Role, error)
	UpdateRole(ctx context.Context, options *rolesgroups.UpdateRoleOptions) (*model.Role, error)
	DeleteRole(ctx context.Context, id string) error

	CreateGroup(ctx context.Context, options *rolesgroups.NewGroupOptions) (*model.Group, error)
	UpdateGroup(ctx context.Context, options *rolesgroups.UpdateGroupOptions) (*model.Group, error)
	DeleteGroup(ctx context.Context, id string) error

	AddRoleToGroups(ctx context.Context, options *rolesgroups.AddRoleToGroupsOptions) (*model.Role, error)
	RemoveRoleFromGroups(ctx context.Context, options *rolesgroups.RemoveRoleFromGroupsOptions) (*model.Role, error)

	AddRoleToUsers(ctx context.Context, options *rolesgroups.AddRoleToUsersOptions) (*model.Role, error)
	RemoveRoleFromUsers(ctx context.Context, options *rolesgroups.RemoveRoleFromUsersOptions) (*model.Role, error)

	AddGroupToUsers(ctx context.Context, options *rolesgroups.AddGroupToUsersOptions) (*model.Group, error)
	RemoveGroupFromUsers(ctx context.Context, options *rolesgroups.RemoveGroupFromUsersOptions) (*model.Group, error)

	AddGroupToRoles(ctx context.Context, options *rolesgroups.AddGroupToRolesOptions) (*model.Group, error)
	RemoveGroupFromRoles(ctx context.Context, options *rolesgroups.RemoveGroupFromRolesOptions) (*model.Group, error)

	AddUserToRoles(ctx context.Context, options *rolesgroups.AddUserToRolesOptions) error
	RemoveUserFromRoles(ctx context.Context, options *rolesgroups.RemoveUserFromRolesOptions) error

	AddUserToGroups(ctx context.Context, options *rolesgroups.AddUserToGroupsOptions) error
	RemoveUserFromGroups(ctx context.Context, options *rolesgroups.RemoveUserFromGroupsOptions) error
}

type RolesGroupsFacade

type RolesGroupsFacade struct {
	RolesGroupsCommands RolesGroupsCommands
	RolesGroupsQueries  RolesGroupsQueries
}

func (*RolesGroupsFacade) AddGroupToRoles

func (f *RolesGroupsFacade) AddGroupToRoles(ctx context.Context, options *rolesgroups.AddGroupToRolesOptions) (groupID string, err error)

func (*RolesGroupsFacade) AddGroupToUsers

func (f *RolesGroupsFacade) AddGroupToUsers(ctx context.Context, options *rolesgroups.AddGroupToUsersOptions) (groupID string, err error)

func (*RolesGroupsFacade) AddRoleToGroups

func (f *RolesGroupsFacade) AddRoleToGroups(ctx context.Context, options *rolesgroups.AddRoleToGroupsOptions) (roleID string, err error)

func (*RolesGroupsFacade) AddRoleToUsers

func (f *RolesGroupsFacade) AddRoleToUsers(ctx context.Context, options *rolesgroups.AddRoleToUsersOptions) (roleID string, err error)

func (*RolesGroupsFacade) AddUserToGroups

func (f *RolesGroupsFacade) AddUserToGroups(ctx context.Context, options *rolesgroups.AddUserToGroupsOptions) (err error)

func (*RolesGroupsFacade) AddUserToRoles

func (f *RolesGroupsFacade) AddUserToRoles(ctx context.Context, options *rolesgroups.AddUserToRolesOptions) (err error)

func (*RolesGroupsFacade) CreateGroup

func (f *RolesGroupsFacade) CreateGroup(ctx context.Context, options *rolesgroups.NewGroupOptions) (groupID string, err error)

func (*RolesGroupsFacade) CreateRole

func (f *RolesGroupsFacade) CreateRole(ctx context.Context, options *rolesgroups.NewRoleOptions) (roleID string, err error)

func (*RolesGroupsFacade) DeleteGroup

func (f *RolesGroupsFacade) DeleteGroup(ctx context.Context, id string) (err error)

func (*RolesGroupsFacade) DeleteRole

func (f *RolesGroupsFacade) DeleteRole(ctx context.Context, id string) (err error)

func (*RolesGroupsFacade) GetGroup

func (f *RolesGroupsFacade) GetGroup(ctx context.Context, groupID string) (*model.Group, error)

func (*RolesGroupsFacade) GetRole

func (f *RolesGroupsFacade) GetRole(ctx context.Context, roleID string) (*model.Role, error)

func (*RolesGroupsFacade) ListAllGroupsByKeys

func (f *RolesGroupsFacade) ListAllGroupsByKeys(ctx context.Context, keys []string) ([]*model.Group, error)

func (*RolesGroupsFacade) ListAllRolesByKeys

func (f *RolesGroupsFacade) ListAllRolesByKeys(ctx context.Context, keys []string) ([]*model.Role, error)

func (*RolesGroupsFacade) ListAllUserIDsByEffectiveRoleIDs

func (f *RolesGroupsFacade) ListAllUserIDsByEffectiveRoleIDs(ctx context.Context, roleIDs []string) ([]string, error)

func (*RolesGroupsFacade) ListAllUserIDsByGroupIDs

func (f *RolesGroupsFacade) ListAllUserIDsByGroupIDs(ctx context.Context, groupIDs []string) ([]string, error)

func (*RolesGroupsFacade) ListAllUserIDsByGroupKeys

func (f *RolesGroupsFacade) ListAllUserIDsByGroupKeys(ctx context.Context, groupKeys []string) ([]string, error)

func (*RolesGroupsFacade) ListAllUserIDsByRoleIDs

func (f *RolesGroupsFacade) ListAllUserIDsByRoleIDs(ctx context.Context, roleIDs []string) ([]string, error)

func (*RolesGroupsFacade) ListEffectiveRolesByUserID

func (f *RolesGroupsFacade) ListEffectiveRolesByUserID(ctx context.Context, userID string) ([]*model.Role, error)

func (*RolesGroupsFacade) ListGroups

func (*RolesGroupsFacade) ListGroupsByRoleID

func (f *RolesGroupsFacade) ListGroupsByRoleID(ctx context.Context, roleID string) ([]*model.Group, error)

func (*RolesGroupsFacade) ListGroupsByUserID

func (f *RolesGroupsFacade) ListGroupsByUserID(ctx context.Context, userID string) ([]*model.Group, error)

func (*RolesGroupsFacade) ListRoles

func (*RolesGroupsFacade) ListRolesByGroupID

func (f *RolesGroupsFacade) ListRolesByGroupID(ctx context.Context, groupID string) ([]*model.Role, error)

func (*RolesGroupsFacade) ListRolesByUserID

func (f *RolesGroupsFacade) ListRolesByUserID(ctx context.Context, userID string) ([]*model.Role, error)

func (*RolesGroupsFacade) ListUserIDsByGroupID

func (f *RolesGroupsFacade) ListUserIDsByGroupID(ctx context.Context, groupID string, pageArgs graphqlutil.PageArgs) ([]model.PageItemRef, *graphqlutil.PageResult, error)

func (*RolesGroupsFacade) ListUserIDsByRoleID

func (f *RolesGroupsFacade) ListUserIDsByRoleID(ctx context.Context, roleID string, pageArgs graphqlutil.PageArgs) ([]model.PageItemRef, *graphqlutil.PageResult, error)

func (*RolesGroupsFacade) RemoveGroupFromRoles

func (f *RolesGroupsFacade) RemoveGroupFromRoles(ctx context.Context, options *rolesgroups.RemoveGroupFromRolesOptions) (groupID string, err error)

func (*RolesGroupsFacade) RemoveGroupFromUsers

func (f *RolesGroupsFacade) RemoveGroupFromUsers(ctx context.Context, options *rolesgroups.RemoveGroupFromUsersOptions) (groupID string, err error)

func (*RolesGroupsFacade) RemoveRoleFromGroups

func (f *RolesGroupsFacade) RemoveRoleFromGroups(ctx context.Context, options *rolesgroups.RemoveRoleFromGroupsOptions) (roleID string, err error)

func (*RolesGroupsFacade) RemoveRoleFromUsers

func (f *RolesGroupsFacade) RemoveRoleFromUsers(ctx context.Context, options *rolesgroups.RemoveRoleFromUsersOptions) (roleID string, err error)

func (*RolesGroupsFacade) RemoveUserFromGroups

func (f *RolesGroupsFacade) RemoveUserFromGroups(ctx context.Context, options *rolesgroups.RemoveUserFromGroupsOptions) (err error)

func (*RolesGroupsFacade) RemoveUserFromRoles

func (f *RolesGroupsFacade) RemoveUserFromRoles(ctx context.Context, options *rolesgroups.RemoveUserFromRolesOptions) (err error)

func (*RolesGroupsFacade) UpdateGroup

func (f *RolesGroupsFacade) UpdateGroup(ctx context.Context, options *rolesgroups.UpdateGroupOptions) (err error)

func (*RolesGroupsFacade) UpdateRole

func (f *RolesGroupsFacade) UpdateRole(ctx context.Context, options *rolesgroups.UpdateRoleOptions) (err error)

type RolesGroupsQueries

type RolesGroupsQueries interface {
	GetRole(ctx context.Context, id string) (*model.Role, error)
	GetGroup(ctx context.Context, id string) (*model.Group, error)
	ListRoles(ctx context.Context, options *rolesgroups.ListRolesOptions, pageArgs graphqlutil.PageArgs) ([]model.PageItemRef, error)
	ListGroups(ctx context.Context, options *rolesgroups.ListGroupsOptions, pageArgs graphqlutil.PageArgs) ([]model.PageItemRef, error)
	ListGroupsByRoleID(ctx context.Context, roleID string) ([]*model.Group, error)
	ListRolesByGroupID(ctx context.Context, groupID string) ([]*model.Role, error)
	ListRolesByUserID(ctx context.Context, userID string) ([]*model.Role, error)
	ListGroupsByUserID(ctx context.Context, userID string) ([]*model.Group, error)
	ListUserIDsByRoleID(ctx context.Context, roleID string, pageArgs graphqlutil.PageArgs) ([]model.PageItemRef, error)
	ListUserIDsByGroupID(ctx context.Context, groupID string, pageArgs graphqlutil.PageArgs) ([]model.PageItemRef, error)
	ListEffectiveRolesByUserID(ctx context.Context, userID string) ([]*model.Role, error)
	ListAllUserIDsByGroupIDs(ctx context.Context, groupIDs []string) ([]string, error)
	ListAllUserIDsByGroupKeys(ctx context.Context, groupKeys []string) ([]string, error)
	ListAllUserIDsByRoleIDs(ctx context.Context, roleIDs []string) ([]string, error)
	ListAllUserIDsByEffectiveRoleIDs(ctx context.Context, roleIDs []string) ([]string, error)
	ListAllRolesByKeys(ctx context.Context, keys []string) ([]*model.Role, error)
	ListAllGroupsByKeys(ctx context.Context, keys []string) ([]*model.Group, error)
	CountRoles(ctx context.Context) (uint64, error)
	CountGroups(ctx context.Context) (uint64, error)
}

type SessionFacade

type SessionFacade struct {
	Sessions SessionManager
}

func (*SessionFacade) Get

func (*SessionFacade) List

func (f *SessionFacade) List(ctx context.Context, userID string) ([]session.ListableSession, error)

func (*SessionFacade) Revoke

func (f *SessionFacade) Revoke(ctx context.Context, id string) error

func (*SessionFacade) RevokeAll

func (f *SessionFacade) RevokeAll(ctx context.Context, userID string) error

type SessionManager

type SessionManager interface {
	List(ctx context.Context, userID string) ([]session.ListableSession, error)
	Get(ctx context.Context, id string) (session.ListableSession, error)
	RevokeWithEvent(ctx context.Context, session session.SessionBase, isTermination bool, isAdminAPI bool) error
	TerminateAllExcept(ctx context.Context, userID string, currentSession session.ResolvedSession, isAdminAPI bool) error
}

type StandardAttributesService

type StandardAttributesService interface {
	UpdateStandardAttributes(ctx context.Context, role accesscontrol.Role, userID string, stdAttrs map[string]interface{}) error
	DeriveStandardAttributes(ctx context.Context, role accesscontrol.Role, userID string, updatedAt time.Time, attrs map[string]interface{}) (map[string]interface{}, error)
}

type UserFacade

type UserFacade struct {
	Clock              clock.Clock
	UserSearchService  UserSearchService
	Users              UserService
	LoginIDConfig      *config.LoginIDConfig
	Authenticators     AuthenticatorService
	StandardAttributes StandardAttributesService
	Interaction        InteractionService
}

func (*UserFacade) Anonymize

func (f *UserFacade) Anonymize(ctx context.Context, id string) (err error)

func (*UserFacade) Create

func (f *UserFacade) Create(ctx context.Context, identityDef model.IdentityDef, password string, generatePassword bool, sendPassword bool, setPasswordExpired bool) (userID string, err error)

func (*UserFacade) Delete

func (f *UserFacade) Delete(ctx context.Context, id string) error

func (*UserFacade) GetUserByLoginID

func (f *UserFacade) GetUserByLoginID(ctx context.Context, loginIDKey string, loginIDValue string) (string, error)

func (*UserFacade) GetUserByOAuth

func (f *UserFacade) GetUserByOAuth(ctx context.Context, oauthProviderAlias string, oauthProviderUserID string) (string, error)

func (*UserFacade) GetUsersByStandardAttribute

func (f *UserFacade) GetUsersByStandardAttribute(ctx context.Context, attributeKey string, attributeValue string) ([]string, error)

func (*UserFacade) ListPage

func (*UserFacade) ResetPassword

func (f *UserFacade) ResetPassword(ctx context.Context, id string, password string, generatePassword bool, sendPassword bool, changeOnLogin bool) (err error)

func (*UserFacade) ScheduleAnonymization

func (f *UserFacade) ScheduleAnonymization(ctx context.Context, id string) (err error)

func (*UserFacade) ScheduleDeletion

func (f *UserFacade) ScheduleDeletion(ctx context.Context, id string) error

func (*UserFacade) SearchPage

func (f *UserFacade) SearchPage(
	ctx context.Context,
	searchKeyword string,
	filterOptions user.FilterOptions,
	sortOption user.SortOption,
	pageArgs graphqlutil.PageArgs) ([]apimodel.PageItemRef, *graphqlutil.PageResult, error)

func (*UserFacade) SetDisabled

func (f *UserFacade) SetDisabled(ctx context.Context, id string, isDisabled bool, reason *string) error

func (*UserFacade) SetMFAGracePeriod

func (f *UserFacade) SetMFAGracePeriod(ctx context.Context, id string, endAt *time.Time) error

func (*UserFacade) SetPasswordExpired

func (f *UserFacade) SetPasswordExpired(ctx context.Context, id string, isExpired bool) error

func (*UserFacade) UnscheduleAnonymization

func (f *UserFacade) UnscheduleAnonymization(ctx context.Context, id string) (err error)

func (*UserFacade) UnscheduleDeletion

func (f *UserFacade) UnscheduleDeletion(ctx context.Context, id string) error

type UserProfileFacade

type UserProfileFacade struct {
	User               UserService
	StandardAttributes StandardAttributesService
	CustomAttributes   CustomAttributesService
	Events             EventService
}

func (*UserProfileFacade) DeriveStandardAttributes

func (f *UserProfileFacade) DeriveStandardAttributes(ctx context.Context, role accesscontrol.Role, userID string, updatedAt time.Time, attrs map[string]interface{}) (map[string]interface{}, error)

func (*UserProfileFacade) ReadCustomAttributesInStorageForm

func (f *UserProfileFacade) ReadCustomAttributesInStorageForm(ctx context.Context,
	role accesscontrol.Role,
	userID string,
	storageForm map[string]interface{},
) (map[string]interface{}, error)

func (*UserProfileFacade) UpdateUserProfile

func (f *UserProfileFacade) UpdateUserProfile(ctx context.Context,
	role accesscontrol.Role,
	userID string,
	stdAttrs map[string]interface{},
	customAttrs map[string]interface{},
) (err error)

type UserSearchService

type UserSearchService interface {
	QueryUser(
		ctx context.Context,
		searchKeyword string,
		filterOptions user.FilterOptions,
		sortOption user.SortOption,
		pageArgs graphqlutil.PageArgs) ([]apimodel.PageItemRef, *search.Stats, error)
}

type UserService

type UserService interface {
	CreateByAdmin(ctx context.Context, identitySpec *identity.Spec, password string, generatePassword bool, sendPassword bool, setPasswordExpired bool) (*user.User, error)
	GetRaw(ctx context.Context, id string) (*user.User, error)
	Count(ctx context.Context) (uint64, error)
	QueryPage(ctx context.Context, listOption user.ListOptions, pageArgs graphqlutil.PageArgs) ([]apimodel.PageItemRef, error)
	Delete(ctx context.Context, userID string) error
	Disable(ctx context.Context, userID string, reason *string) error
	Reenable(ctx context.Context, userID string) error
	ScheduleDeletionByAdmin(ctx context.Context, userID string) error
	UnscheduleDeletionByAdmin(ctx context.Context, userID string) error
	Anonymize(ctx context.Context, userID string) error
	ScheduleAnonymizationByAdmin(ctx context.Context, userID string) error
	UnscheduleAnonymizationByAdmin(ctx context.Context, userID string) error
	CheckUserAnonymized(ctx context.Context, userID string) error
	UpdateMFAEnrollment(ctx context.Context, userID string, endAt *time.Time) error
	GetUsersByStandardAttribute(ctx context.Context, attributeName string, attributeValue string) ([]string, error)
	GetUserByLoginID(ctx context.Context, loginIDKey string, loginIDValue string) (string, error)
	GetUserByOAuth(ctx context.Context, oauthProviderAlias string, oauthProviderUserID string) (string, error)
}

type VerificationFacade

type VerificationFacade struct {
	Verification VerificationService
}

func (*VerificationFacade) Get

func (f *VerificationFacade) Get(ctx context.Context, userID string) ([]model.Claim, error)

func (*VerificationFacade) SetVerified

func (f *VerificationFacade) SetVerified(ctx context.Context, userID string, claimName string, claimValue string, isVerified bool) error

type VerificationService

type VerificationService interface {
	NewVerifiedClaim(ctx context.Context, userID string, claimName string, claimValue string) *verification.Claim

	GetClaims(ctx context.Context, userID string) ([]*verification.Claim, error)
	MarkClaimVerified(ctx context.Context, claim *verification.Claim) error
	DeleteClaim(ctx context.Context, claim *verification.Claim) error
}

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL