import { Plugin } from "@webiny/plugins/types" ; import { Context } from "@webiny/handler/types" ; import { Authentication , Identity } from "@webiny/api-authentication/types" ; import { Topic } from "@webiny/pubsub/types" ; import { GetTenant } from "~/createSecurity" ; export type SecurityIdentity = Identity ; export type SecurityAuthenticationPlugin = Plugin & { type : "security-authentication" ; authenticate ( context ) : Promise < null > | Promise < SecurityIdentity > ; } ; export interface SecurityAuthorizationPlugin extends Plugin { type : "security-authorization" ; getPermissions ( context ) : Promise < SecurityPermission [ ] > ; } export interface Authorizer { ( ) : Promise < SecurityPermission [ ] > ; } export interface SecurityConfig { getTenant : GetTenant ; storageOperations : SecurityStorageOperations ; } export interface ErrorEvent extends InstallEvent { error : Error ; } export interface InstallEvent { tenant : string ; } export interface LoginEvent < TIdentity > { identity : TIdentity ; } export interface IdentityEvent < TIdentity > { identity : TIdentity ; } export interface GetGroupWhere { id ? : string ; slug ? : string ; tenant ? : string ; } export interface Security < TIdentity = SecurityIdentity > extends Authentication < TIdentity > { onBeforeInstall : Topic < InstallEvent > ; onInstall : Topic < InstallEvent > ; onAfterInstall : Topic < InstallEvent > ; onCleanup : Topic < ErrorEvent > ; onBeforeLogin : Topic < LoginEvent < TIdentity > > ; onLogin : Topic < LoginEvent < TIdentity > > ; onAfterLogin : Topic < LoginEvent < TIdentity > > ; onIdentity : Topic < IdentityEvent < TIdentity > > ; getStorageOperations ( ) : SecurityStorageOperations ; enableAuthorization ( ) : void ; disableAuthorization ( ) : void ; addAuthorizer ( authorizer ) : void ; getAuthorizers ( ) : Authorizer [ ] ; getPermission < TPermission extends SecurityPermission = SecurityPermission > ( permission ) : Promise < TPermission | null > ; getPermissions ( ) : Promise < SecurityPermission [ ] > ; hasFullAccess ( ) : Promise < boolean > ; getApiKey ( id ) : Promise < ApiKey > ; getApiKeyByToken ( token ) : Promise < ApiKey > ; listApiKeys ( ) : Promise < ApiKey [ ] > ; createApiKey ( data ) : Promise < ApiKey > ; updateApiKey ( id , data ) : Promise < ApiKey > ; deleteApiKey ( id ) : Promise < boolean > ; getGroup ( params ) : Promise < Group > ; listGroups ( params ? ) : Promise < Group [ ] > ; createGroup ( input ) : Promise < Group > ; updateGroup ( id , input ) : Promise < Group > ; deleteGroup ( id ) : Promise < void > ; createTenantLinks ( params ) : Promise < void > ; updateTenantLinks ( params ) : Promise < void > ; deleteTenantLinks ( params ) : Promise < void > ; listTenantLinksByType < TLink extends TenantLink = TenantLink > ( params ) : Promise < TLink [ ] > ; listTenantLinksByTenant ( params ) : Promise < TenantLink [ ] > ; listTenantLinksByIdentity ( params ) : Promise < TenantLink [ ] > ; getTenantLinkByIdentity < TLink extends TenantLink = TenantLink > ( params ) : Promise < TLink > ; getVersion ( ) : Promise < string > ; setVersion ( version ) : Promise < System > ; install ( this ) : Promise < void > ; } export interface SecurityStorageOperations { getGroup ( params ) : Promise < Group > ; listGroups ( params ) : Promise < Group [ ] > ; createGroup ( params ) : Promise < Group > ; updateGroup ( params ) : Promise < Group > ; deleteGroup ( params ) : Promise < void > ; getSystemData ( params ) : Promise < System > ; createSystemData ( params ) : Promise < System > ; updateSystemData ( params ) : Promise < System > ; createTenantLinks ( params ) : Promise < void > ; updateTenantLinks ( params ) : Promise < void > ; deleteTenantLinks ( params ) : Promise < void > ; listTenantLinksByType < TLink extends TenantLink = TenantLink > ( params ) : Promise < TLink [ ] > ; listTenantLinksByTenant ( params ) : Promise < TenantLink [ ] > ; listTenantLinksByIdentity ( params ) : Promise < TenantLink [ ] > ; getTenantLinkByIdentity < TLink extends TenantLink = TenantLink > ( params ) : Promise < TLink > ; getApiKey ( params ) : Promise < ApiKey > ; getApiKeyByToken ( params ) : Promise < ApiKey > ; listApiKeys ( params ) : Promise < ApiKey [ ] > ; createApiKey ( params ) : Promise < ApiKey > ; updateApiKey ( params ) : Promise < ApiKey > ; deleteApiKey ( params ) : Promise < void > ; } export interface SecurityPermission { name : string ; [ key ] : any ; } export interface SecurityContext < TIdentity = SecurityIdentity > extends Context { security : Security < TIdentity > ; } export interface FullAccessPermission { name : "*" ; } export interface CreatedBy { id : string ; displayName : string ; type : string ; } export interface Group { tenant : string ; createdOn : string ; createdBy : CreatedBy ; id : string ; name : string ; slug : string ; description : string ; system : boolean ; permissions : SecurityPermission [ ] ; webinyVersion : string ; } export type GroupInput = Pick < Group , "name" | "slug" | "description" | "permissions" | "system" > ; export interface GetGroupParams { where : GetGroupWhere ; } export interface ListGroupsParams { where ? : { id_in ? : string [ ] ; } ; sort ? : string [ ] ; } export interface GroupsCreateParams { group : Group ; } export interface CreateGroupParams { group : Group ; } export interface UpdateGroupParams { original : Group ; group : Group ; } export interface DeleteGroupParams { group : Group ; } export interface System { tenant : string ; version : string ; } export interface GetSystemParams { tenant : string ; } export interface CreateSystemParams { system : System ; } export interface UpdateSystemParams { original : System ; system : System ; } export interface CreateTenantLinkParams < TData = Record < string , any > > { identity : string ; tenant : string ; type : string ; data ? : TData ; } export interface UpdateTenantLinkParams < TData = Record < string , any > > { identity : string ; tenant : string ; type : string ; data ? : TData ; } export interface DeleteTenantLinkParams { identity : string ; tenant : string ; } export interface ListTenantLinksByTypeParams { tenant : string ; type : string ; } export interface ListTenantLinksByIdentityParams { identity : string ; } export interface ListTenantLinksParams { tenant : string ; } export interface GetTenantLinkByIdentityParams { identity : string ; tenant : string ; } export interface TenantLink < TData = any > { createdOn : string ; identity : string ; tenant : string ; type : string ; data ? : TData ; webinyVersion : string ; } export type GroupTenantLink = TenantLink < { group : string ; permissions : SecurityPermission [ ] ; } > ; export interface ApiKey { id : string ; tenant : string ; name : string ; description : string ; token : string ; permissions : SecurityPermission [ ] ; createdBy : CreatedBy ; createdOn : string ; webinyVersion ? : string ; } export interface ApiKeyInput { name : string ; description : string ; permissions : SecurityPermission [ ] ; } export interface ApiKeyPermission extends SecurityPermission { name : "security.apiKey" ; } export interface GetApiKeyParams { tenant : string ; id : string ; } export interface ListApiKeysParams { sort ? : string [ ] ; } export interface GetApiKeyByTokenParams { tenant : string ; token : string ; } export interface CreateApiKeyParams { apiKey : ApiKey ; } export interface UpdateApiKeyParams { original : ApiKey ; apiKey : ApiKey ; } export interface DeleteApiKeyParams { apiKey : ApiKey ; } export interface StorageOperationsListApiKeysParams extends ListApiKeysParams { where : { tenant : string ; } ; } export interface StorageOperationsGetGroupParams extends GetGroupParams { where : GetGroupParams [ "where" ] & { tenant : string ; } ; } export interface StorageOperationsListGroupsParams extends ListGroupsParams { where : ListGroupsParams [ "where" ] & { tenant : string ; } ; } export type StorageOperationsCreateGroupParams = CreateGroupParams ; export type StorageOperationsUpdateGroupParams = UpdateGroupParams ; export type StorageOperationsDeleteGroupParams = DeleteGroupParams ; export type StorageOperationsGetSystemParams = GetSystemParams ; export type StorageOperationsCreateSystemParams = CreateSystemParams ; export type StorageOperationsUpdateSystemParams = UpdateSystemParams ; export interface StorageOperationsCreateTenantLinkParams extends CreateTenantLinkParams { createdOn : string ; webinyVersion : string ; } export type StorageOperationsUpdateTenantLinkParams = UpdateTenantLinkParams ; export type StorageOperationsDeleteTenantLinkParams = DeleteTenantLinkParams ; export type StorageOperationsListTenantLinksParams = ListTenantLinksParams ; export type StorageOperationsListTenantLinksByIdentityParams = ListTenantLinksByIdentityParams ; export type StorageOperationsGetTenantLinkByIdentityParams = GetTenantLinkByIdentityParams ; export type StorageOperationsGetApiKeyParams = GetApiKeyParams ; export type StorageOperationsGetApiKeyByTokenParams = GetApiKeyByTokenParams ; export type StorageOperationsCreateApiKeyParams = CreateApiKeyParams ; export type StorageOperationsUpdateApiKeyParams = UpdateApiKeyParams ; export type StorageOperationsDeleteApiKeyParams = DeleteApiKeyParams ;