@authup/server-core 1.0.0-beta.35 → 1.0.0-beta.36
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.
- package/dist/adapters/http/controllers/entities/client-role/module.d.ts +1 -5
- package/dist/adapters/http/controllers/entities/client-role/module.d.ts.map +1 -1
- package/dist/adapters/http/controllers/entities/identity-provide-role/index.d.ts +0 -1
- package/dist/adapters/http/controllers/entities/identity-provide-role/index.d.ts.map +1 -1
- package/dist/adapters/http/controllers/entities/identity-provide-role/module.d.ts +11 -14
- package/dist/adapters/http/controllers/entities/identity-provide-role/module.d.ts.map +1 -1
- package/dist/adapters/http/controllers/entities/robot-role/module.d.ts +1 -5
- package/dist/adapters/http/controllers/entities/robot-role/module.d.ts.map +1 -1
- package/dist/adapters/http/controllers/entities/user-role/module.d.ts +1 -5
- package/dist/adapters/http/controllers/entities/user-role/module.d.ts.map +1 -1
- package/dist/app/modules/http/modules/controller.d.ts +2 -2
- package/dist/app/modules/http/modules/controller.d.ts.map +1 -1
- package/dist/cli.mjs +1 -1
- package/dist/{commands-C1vz08cL.mjs → commands-D5p6u-xJ.mjs} +338 -260
- package/dist/commands-D5p6u-xJ.mjs.map +1 -0
- package/dist/core/entities/client-permission/service.d.ts +2 -0
- package/dist/core/entities/client-permission/service.d.ts.map +1 -1
- package/dist/core/entities/client-role/service.d.ts +5 -0
- package/dist/core/entities/client-role/service.d.ts.map +1 -1
- package/dist/core/entities/client-scope/service.d.ts +2 -0
- package/dist/core/entities/client-scope/service.d.ts.map +1 -1
- package/dist/core/entities/identity-provider-role-mapping/index.d.ts +1 -0
- package/dist/core/entities/identity-provider-role-mapping/index.d.ts.map +1 -1
- package/dist/core/entities/identity-provider-role-mapping/service.d.ts +23 -0
- package/dist/core/entities/identity-provider-role-mapping/service.d.ts.map +1 -0
- package/dist/core/entities/identity-provider-role-mapping/types.d.ts +9 -1
- package/dist/core/entities/identity-provider-role-mapping/types.d.ts.map +1 -1
- package/dist/core/entities/permission/service.d.ts.map +1 -1
- package/dist/core/entities/permission-policy/service.d.ts +2 -0
- package/dist/core/entities/permission-policy/service.d.ts.map +1 -1
- package/dist/core/entities/robot-permission/service.d.ts +2 -0
- package/dist/core/entities/robot-permission/service.d.ts.map +1 -1
- package/dist/core/entities/robot-role/service.d.ts +5 -0
- package/dist/core/entities/robot-role/service.d.ts.map +1 -1
- package/dist/core/entities/role-permission/service.d.ts +2 -0
- package/dist/core/entities/role-permission/service.d.ts.map +1 -1
- package/dist/core/entities/user-permission/service.d.ts +2 -0
- package/dist/core/entities/user-permission/service.d.ts.map +1 -1
- package/dist/core/entities/user-role/service.d.ts +5 -0
- package/dist/core/entities/user-role/service.d.ts.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/swagger.json +9 -308
- package/package.json +11 -11
- package/dist/adapters/http/controllers/entities/identity-provide-role/utils/index.d.ts +0 -2
- package/dist/adapters/http/controllers/entities/identity-provide-role/utils/index.d.ts.map +0 -1
- package/dist/adapters/http/controllers/entities/identity-provide-role/utils/validator.d.ts +0 -6
- package/dist/adapters/http/controllers/entities/identity-provide-role/utils/validator.d.ts.map +0 -1
- package/dist/commands-C1vz08cL.mjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"commands-C1vz08cL.mjs","names":["TypedToken","AuthenticationInjectionKey","SessionManager","SessionRepository","Column","CreateDateColumn","Entity","PrimaryGeneratedColumn","UpdateDateColumn","RealmEntity","id","name","display_name","description","built_in","created_at","updated_at","type","length","unique","nullable","default","REALM_MASTER_NAME","InstanceChecker","Repository","RealmEntity","RealmRepository","instance","isDataSource","manager","getMaster","repository","getRepository","entity","findOne","where","name","cache","Error","DomainEventPublisher","singa","singleton","name","factory","useDomainEventPublisher","use","setDomainEventPublisher","domainEventPublisher","set","publishDomainEvent","ctx","publish","CachePrefix","EntityDefaultEventName","EntityType","buildEntityChannelName","buildRedisKeyPath","EventSubscriber","publishDomainEvent","RealmEntity","CachePrefix","publishEvent","event","data","content","type","REALM","destinations","channel","id","RealmSubscriber","listenTo","afterInsert","entity","CREATED","afterUpdate","connection","queryResultCache","remove","prefix","key","UPDATED","afterRemove","DELETED","Column","CreateDateColumn","Entity","Index","JoinColumn","ManyToOne","PrimaryGeneratedColumn","UpdateDateColumn","RealmEntity","KeyEntity","id","type","priority","signature_algorithm","decryption_key","encryption_key","created_at","updated_at","realm_id","realm","length","default","unsigned","select","nullable","onDelete","name","BeforeInsert","BeforeUpdate","Column","CreateDateColumn","Entity","JoinColumn","ManyToOne","PrimaryGeneratedColumn","Unique","UpdateDateColumn","RealmEntity","ClientEntity","id","active","built_in","is_confidential","name","display_name","description","secret","secret_hashed","secret_encrypted","redirect_uri","grant_types","scope","base_url","root_url","created_at","updated_at","realm_id","realm","setDisplayName","length","type","default","nullable","select","onDelete","Column","CreateDateColumn","Entity","Index","JoinColumn","ManyToOne","PrimaryGeneratedColumn","Unique","UpdateDateColumn","RealmEntity","ClientEntity","PermissionEntity","id","built_in","name","display_name","description","decision_strategy","client_id","client","realm_id","realm","created_at","updated_at","type","default","length","nullable","onDelete","buildPermissionKey","EntityDefaultEventName","EntityType","buildEntityChannelName","buildRedisKeyPath","EventSubscriber","publishDomainEvent","PermissionEntity","CachePrefix","publishEvent","event","data","content","type","PERMISSION","destinations","channel","id","PermissionSubscriber","listenTo","afterInsert","entity","CREATED","afterUpdate","connection","queryResultCache","remove","prefix","key","name","client_id","realm_id","UPDATED","afterRemove","DELETED","Column","CreateDateColumn","Entity","Index","JoinColumn","ManyToOne","PrimaryGeneratedColumn","Tree","TreeChildren","TreeParent","Unique","UpdateDateColumn","RealmEntity","PolicyEntity","id","built_in","type","name","display_name","description","invert","children","parent_id","parent","realm_id","realm","created_at","updated_at","default","length","nullable","cascade","onDelete","closureTableName","ancestorColumnName","descendantColumnName","hasOwnProperty","In","ExtraAttributesRepositoryAdapter","repository","primaryColumn","attributeRepository","attributeForeignColumn","cachePrefix","extra","ctx","attributeProperties","input","entityPrimaryColumn","findOneWithEA","options","extraOptions","entity","findOne","undefined","extendWithEA","findWithEA","entities","find","extendManyWithEA","saveWithEA","attributes","columns","i","metadata","length","push","propertyName","relations","keys","Object","key_","key","index","indexOf","save","saveEA","extraKeys","extraKey","findOneWithEAByPrimaryColumn","value","attributesByPrimary","findWithEAByPrimaryColumn","attributeKeys","attributeKey","where","name","output","element","entityAttributes","filter","attribute","reduce","acc","curr","attributesByPrimaryKey","getPrimaryKeyValues","parent","foreignColumn","foreignColumnValue","items","findBy","itemsToDelete","itemsToUpdate","keysProcessed","item","keepAll","remove","itemsToAdd","keyIndex","insert","map","InstanceChecker","Repository","ExtraAttributesRepositoryAdapter","EARepository","adapter","instance","options","entity","attributeEntity","ctx","isDataSource","manager","repository","attributeRepository","getRepository","create","entityLike","Array","isArray","map","i","preserveExtraAttributes","source","columns","Set","col","metadata","add","propertyName","rel","relations","key","Object","keys","has","saveOneWithEA","input","attributes","saveWithEA","findOneWithEA","extraOptions","findManyWithEA","findWithEA","findOneWithEAByPrimaryColumn","value","extendOneWithEA","extendWithEA","extendManyWithEA","entities","ExtraAttributesRepositoryAdapter","ExtraAttributesTreeRepositoryAdapter","saveWithEA","input","attributes","options","childColumnName","repository","metadata","treeChildrenRelation","propertyName","parentColumnName","treeParentRelation","children","parent","Array","isArray","child","undefined","extendManyWithEA","entities","extraOptions","flattened","flatten","attributesByPrimaryKey","findWithEAByPrimaryColumn","getPrimaryKeyValues","traverse","entity","value","primaryColumn","keys","Object","key","output","push","fn","data","datum","FindOptionsUtils","InstanceChecker","TreeRepository","TreeRepositoryUtils","ExtraAttributesTreeRepositoryAdapter","EATreeRepository","adapter","options","instance","entity","attributeEntity","ctx","isDataSource","manager","repository","attributeRepository","getRepository","create","entityLike","Array","isArray","map","i","preserveExtraAttributes","source","columns","Set","col","metadata","add","propertyName","rel","relations","key","Object","keys","has","saveOneWithEA","input","attributes","saveWithEA","findOneWithEA","extraOptions","findOneWithEAByPrimaryColumn","value","findManyWithEA","findWithEA","extendOneWithEA","output","extendManyWithEA","entities","findRoots","findDescendantsTree","qb","createDescendantsQueryBuilder","applyOptionsToTreeQueryBuilder","getRawAndEntities","relationMaps","createRelationMaps","raw","buildChildrenEntityTree","depth","findAncestors","findAncestorsTree","createAncestorsQueryBuilder","buildParentEntityTree","updateClosureTable","primaryKeyValue","primaryColumns","getEntityValue","closureTable","closureJunctionTable","executeClosureTableUpdate","connection","transaction","tableName","ancestorColumn","ancestorColumns","descendantColumn","descendantColumns","param","index","driver","createParameter","ancestors","query","databasePath","treeParentRelation","parentId","joinColumns","ancestorIds","filter","ancestor","length","descendants","descendantIds","descendant","placeholders","_","join","ancestorsOfDescendants","acc","reduce","curr","push","ancestorsOfDescendent","ancestorId","indexOf","descendantId","Column","CreateDateColumn","Entity","JoinColumn","ManyToOne","PrimaryGeneratedColumn","Unique","UpdateDateColumn","deserialize","serialize","PolicyEntity","RealmEntity","PolicyAttributeEntity","id","name","value","realm_id","realm","policy_id","policy","created_at","updated_at","type","length","nullable","transformer","to","from","onDelete","EntityDefaultEventName","EntityType","buildEntityChannelName","buildEntityNamespaceName","buildRedisKeyPath","EventSubscriber","publishDomainEvent","PolicyAttributeEntity","CachePrefix","publishEvent","event","data","destinations","channel","id","POLICY_ATTRIBUTE","realm_id","push","namespace","content","type","PolicyAttributeSubscriber","listenTo","afterInsert","entity","connection","queryResultCache","remove","prefix","POLICY_OWNED_ATTRIBUTES","key","policy_id","CREATED","afterUpdate","UPDATED","afterRemove","DELETED","EntityNotFoundError","CachePrefix","EATreeRepository","PolicyAttributeEntity","PolicyEntity","PolicyRepository","instance","attributeProperties","input","parent","policy_id","id","realm_id","entity","entityPrimaryColumn","attributeEntity","attributeForeignColumn","cachePrefix","POLICY_OWNED_ATTRIBUTES","findDescendantsTreeById","create","findDescendantsTree","e","EntityDefaultEventName","EntityType","buildEntityChannelName","buildRedisKeyPath","EventSubscriber","publishDomainEvent","PolicyEntity","CachePrefix","publishEvent","event","data","content","type","POLICY","destinations","channel","id","PolicySubscriber","listenTo","afterInsert","entity","CREATED","afterUpdate","connection","queryResultCache","remove","prefix","REALM","key","UPDATED","afterRemove","DELETED","Column","CreateDateColumn","Entity","Index","JoinColumn","ManyToOne","PrimaryGeneratedColumn","UpdateDateColumn","PermissionEntity","PolicyEntity","ClientEntity","RealmEntity","ClientPermissionEntity","id","policy_id","policy","client_id","client","client_realm_id","client_realm","permission_id","permission","permission_realm_id","permission_realm","created_at","updated_at","nullable","onDelete","name","type","unique","EntityDefaultEventName","EntityType","buildEntityChannelName","buildEntityNamespaceName","buildRedisKeyPath","EventSubscriber","publishDomainEvent","CachePrefix","ClientPermissionEntity","publishEvent","event","data","destinations","channel","id","CLIENT_PERMISSION","client_realm_id","push","namespace","permission_realm_id","content","type","ClientPermissionSubscriber","listenTo","afterInsert","connection","queryResultCache","remove","prefix","CLIENT_OWNED_PERMISSIONS","key","entity","client_id","CREATED","Promise","resolve","undefined","afterUpdate","UPDATED","afterRemove","DELETED","Column","CreateDateColumn","Entity","Index","JoinColumn","ManyToOne","PrimaryGeneratedColumn","Unique","UpdateDateColumn","RealmEntity","RoleEntity","id","built_in","name","display_name","description","target","client_id","client","realm_id","realm","created_at","updated_at","type","default","length","nullable","onDelete","Column","CreateDateColumn","Entity","JoinColumn","ManyToOne","PrimaryGeneratedColumn","Unique","UpdateDateColumn","deserialize","serialize","RealmEntity","RoleEntity","RoleAttributeEntity","id","name","value","realm_id","realm","role_id","role","created_at","updated_at","type","length","nullable","transformer","to","from","onDelete","Column","CreateDateColumn","Entity","Index","JoinColumn","ManyToOne","PrimaryGeneratedColumn","UpdateDateColumn","PolicyEntity","RoleEntity","PermissionEntity","RealmEntity","RolePermissionEntity","id","created_at","updated_at","policy_id","policy","role_id","role","role_realm_id","role_realm","permission_id","permission","permission_realm_id","permission_realm","nullable","onDelete","name","unique","EntityDefaultEventName","EntityType","buildEntityChannelName","buildEntityNamespaceName","buildRedisKeyPath","EventSubscriber","publishDomainEvent","RolePermissionEntity","CachePrefix","publishEvent","event","data","destinations","channel","id","ROLE_PERMISSION","role_realm_id","push","namespace","permission_realm_id","content","type","RolePermissionSubscriber","listenTo","afterInsert","entity","connection","queryResultCache","remove","prefix","ROLE_OWNED_PERMISSIONS","key","role_id","CREATED","afterUpdate","UPDATED","afterRemove","DELETED","buildRedisKeyPath","CachePrefix","EARepository","RoleAttributeEntity","RoleEntity","RolePermissionEntity","PolicyRepository","RoleRepository","instance","attributeProperties","input","parent","role_id","id","realm_id","entity","entityPrimaryColumn","attributeEntity","attributeForeignColumn","cachePrefix","ROLE_OWNED_PERMISSIONS","getBoundPermissionsForMany","ids","promises","push","getBoundPermissions","abilities","Promise","all","flat","clearBoundPermissionsCache","manager","connection","queryResultCache","remove","prefix","key","repository","getRepository","entities","find","where","relations","permission","cache","milliseconds","policyIds","Set","entry","policy_id","add","policyTrees","loadPolicyTrees","map","policies","length","undefined","policyRepository","result","tree","findDescendantsTreeById","EntityDefaultEventName","EntityType","buildEntityChannelName","buildEntityNamespaceName","buildRedisKeyPath","EventSubscriber","publishDomainEvent","RoleEntity","CachePrefix","publishEvent","event","data","destinations","channel","id","ROLE","realm_id","push","namespace","content","type","RoleSubscriber","listenTo","afterInsert","entity","CREATED","afterUpdate","connection","queryResultCache","remove","prefix","key","UPDATED","afterRemove","DELETED","Column","CreateDateColumn","Entity","Index","JoinColumn","ManyToOne","PrimaryGeneratedColumn","UpdateDateColumn","RoleEntity","ClientEntity","RealmEntity","ClientRoleEntity","id","role_id","role","role_realm_id","role_realm","client_id","client","client_realm_id","client_realm","created_at","updated_at","onDelete","name","nullable","unique","EntityDefaultEventName","EntityType","buildEntityChannelName","buildEntityNamespaceName","buildRedisKeyPath","EventSubscriber","publishDomainEvent","CachePrefix","ClientRoleEntity","publishEvent","event","data","destinations","channel","id","CLIENT_ROLE","client_realm_id","push","namespace","role_realm_id","content","type","ClientRoleSubscriber","listenTo","afterInsert","entity","connection","queryResultCache","remove","prefix","CLIENT_OWNED_ROLES","key","client_id","CREATED","afterUpdate","UPDATED","afterRemove","DELETED","buildRedisKeyPath","InstanceChecker","Repository","CachePrefix","ClientPermissionEntity","ClientRoleEntity","PolicyRepository","ClientEntity","ClientRepository","instance","isDataSource","manager","getBoundRoles","entity","id","entities","getRepository","find","where","client_id","relations","role","cache","prefix","CLIENT_OWNED_ROLES","key","milliseconds","map","getBoundPermissions","repository","permission","CLIENT_OWNED_PERMISSIONS","policyIds","Set","entry","policy_id","add","policyTrees","loadPolicyTrees","policies","push","length","undefined","policyRepository","result","tree","findDescendantsTreeById","EntityDefaultEventName","EntityType","buildEntityChannelName","buildEntityNamespaceName","buildRedisKeyPath","EventSubscriber","publishDomainEvent","ClientEntity","CachePrefix","publishEvent","event","data","content","type","CLIENT","destinations","channel","id","namespace","realm_id","ClientSubscriber","listenTo","afterInsert","entity","CREATED","afterUpdate","connection","queryResultCache","remove","prefix","key","UPDATED","afterRemove","DELETED","Column","CreateDateColumn","Entity","Index","JoinColumn","ManyToOne","PrimaryGeneratedColumn","Unique","UpdateDateColumn","RealmEntity","ScopeEntity","id","built_in","name","display_name","description","created_at","updated_at","realm_id","realm","type","default","length","nullable","onDelete","EntityDefaultEventName","EntityType","buildEntityChannelName","buildEntityNamespaceName","buildRedisKeyPath","EventSubscriber","publishDomainEvent","ScopeEntity","CachePrefix","publishEvent","event","data","destinations","channel","id","SCOPE","realm_id","push","namespace","content","type","ScopeSubscriber","listenTo","afterInsert","entity","CREATED","afterUpdate","connection","queryResultCache","remove","prefix","USER","key","UPDATED","afterRemove","DELETED","Column","CreateDateColumn","Entity","JoinColumn","ManyToOne","PrimaryGeneratedColumn","Unique","UpdateDateColumn","ClientEntity","RealmEntity","ScopeEntity","ClientScopeEntity","id","default","created_at","updated_at","client_id","client","client_realm_id","client_realm","scope_id","scope","scope_realm_id","scope_realm","type","onDelete","name","nullable","EntityDefaultEventName","EntityType","buildEntityChannelName","buildRedisKeyPath","EventSubscriber","publishDomainEvent","ClientScopeEntity","CachePrefix","publishEvent","event","data","content","type","CLIENT_SCOPE","destinations","channel","id","ClientScopeSubscriber","listenTo","afterInsert","entity","CREATED","afterUpdate","connection","queryResultCache","remove","prefix","key","UPDATED","afterRemove","DELETED","Column","CreateDateColumn","Entity","Index","JoinColumn","ManyToOne","PrimaryGeneratedColumn","Unique","UpdateDateColumn","RealmEntity","IdentityProviderEntity","id","name","display_name","protocol","preset","enabled","created_at","updated_at","realm_id","realm","type","length","nullable","default","onDelete","Column","CreateDateColumn","Entity","JoinColumn","ManyToOne","PrimaryGeneratedColumn","Unique","UpdateDateColumn","deserialize","serialize","IdentityProviderEntity","RealmEntity","IdentityProviderAttributeEntity","id","name","value","provider_id","provider","realm_id","realm","created_at","updated_at","type","length","nullable","transformer","to","from","onDelete","EntityDefaultEventName","EntityType","buildEntityChannelName","buildRedisKeyPath","EventSubscriber","publishDomainEvent","IdentityProviderAttributeEntity","CachePrefix","publishEvent","event","data","content","type","IDENTITY_PROVIDER_ATTRIBUTE","destinations","channel","id","IdentityProviderAttributeSubscriber","listenTo","afterInsert","entity","CREATED","afterUpdate","connection","queryResultCache","remove","prefix","key","UPDATED","afterRemove","DELETED","InstanceChecker","CachePrefix","EARepository","IdentityProviderEntity","IdentityProviderAttributeEntity","IdentityProviderRepository","instance","isDataSource","manager","attributeProperties","entity","parent","provider_id","id","realm_id","entityPrimaryColumn","attributeEntity","attributeForeignColumn","cachePrefix","IDENTITY_PROVIDER_ATTRIBUTE","EntityDefaultEventName","EntityType","buildEntityChannelName","buildEntityNamespaceName","buildRedisKeyPath","EventSubscriber","publishDomainEvent","IdentityProviderEntity","CachePrefix","publishEvent","event","data","content","type","IDENTITY_PROVIDER","destinations","channel","id","namespace","realm_id","IdentityProviderSubscriber","listenTo","afterInsert","entity","CREATED","afterUpdate","connection","queryResultCache","remove","prefix","key","UPDATED","afterRemove","DELETED","BeforeInsert","BeforeUpdate","Column","CreateDateColumn","Entity","Index","JoinColumn","ManyToOne","PrimaryGeneratedColumn","Unique","UpdateDateColumn","ClientEntity","RealmEntity","UserEntity","id","name","name_locked","first_name","last_name","display_name","email","password","avatar","cover","reset_hash","reset_at","reset_expires","status","status_message","active","activate_hash","created_at","updated_at","realm_id","realm","client_id","client","setDisplayName","length","type","default","nullable","select","onDelete","Column","CreateDateColumn","Entity","JoinColumn","ManyToOne","PrimaryGeneratedColumn","Unique","UpdateDateColumn","deserialize","serialize","RealmEntity","UserEntity","UserAttributeEntity","id","name","value","realm_id","realm","user_id","user","created_at","updated_at","type","length","nullable","transformer","to","from","onDelete","EntityDefaultEventName","EntityType","buildEntityChannelName","buildEntityNamespaceName","buildRedisKeyPath","EventSubscriber","publishDomainEvent","UserAttributeEntity","CachePrefix","publishEvent","event","data","content","type","USER_ATTRIBUTE","destinations","channel","id","namespace","realm_id","UserAttributeSubscriber","listenTo","afterInsert","connection","queryResultCache","remove","prefix","USER_OWNED_ATTRIBUTES","key","entity","user_id","CREATED","Promise","resolve","undefined","afterUpdate","UPDATED","afterRemove","DELETED","Column","CreateDateColumn","Entity","Index","JoinColumn","ManyToOne","PrimaryGeneratedColumn","UpdateDateColumn","PolicyEntity","UserEntity","PermissionEntity","RealmEntity","UserPermissionEntity","id","created_at","updated_at","policy_id","policy","user_id","user","user_realm_id","user_realm","permission_id","permission","permission_realm_id","permission_realm","nullable","onDelete","name","unique","EntityDefaultEventName","EntityType","buildEntityChannelName","buildEntityNamespaceName","buildRedisKeyPath","EventSubscriber","publishDomainEvent","UserPermissionEntity","CachePrefix","publishEvent","event","data","destinations","channel","id","USER_PERMISSION","user_realm_id","push","namespace","permission_realm_id","content","type","UserPermissionSubscriber","listenTo","afterInsert","connection","queryResultCache","remove","prefix","USER_OWNED_PERMISSIONS","key","entity","user_id","CREATED","Promise","resolve","undefined","afterUpdate","UPDATED","afterRemove","DELETED","Column","CreateDateColumn","Entity","Index","JoinColumn","ManyToOne","PrimaryGeneratedColumn","UpdateDateColumn","RoleEntity","UserEntity","RealmEntity","UserRoleEntity","id","role_id","role","role_realm_id","role_realm","user_id","user","user_realm_id","user_realm","created_at","updated_at","onDelete","name","nullable","unique","EntityDefaultEventName","EntityType","buildEntityChannelName","buildEntityNamespaceName","buildRedisKeyPath","EventSubscriber","publishDomainEvent","UserRoleEntity","CachePrefix","publishEvent","event","data","destinations","channel","id","USER_ROLE","user_realm_id","push","namespace","role_realm_id","content","type","UserRoleSubscriber","listenTo","afterInsert","entity","connection","queryResultCache","remove","prefix","USER_OWNED_ROLES","key","user_id","CREATED","afterUpdate","UPDATED","afterRemove","DELETED","buildRedisKeyPath","CachePrefix","EARepository","UserAttributeEntity","UserPermissionEntity","UserRoleEntity","PolicyRepository","UserEntity","UserRepository","instance","attributeProperties","input","parent","user_id","id","realm_id","entity","entityPrimaryColumn","attributeEntity","attributeForeignColumn","cachePrefix","USER_OWNED_ATTRIBUTES","getBoundRoles","items","manager","getRepository","find","where","relations","role","cache","prefix","USER_OWNED_ROLES","key","milliseconds","map","relation","getBoundPermissions","repository","entities","permission","USER_OWNED_PERMISSIONS","policyIds","Set","entry","policy_id","add","policyTrees","loadPolicyTrees","policies","push","length","undefined","policyRepository","result","tree","findDescendantsTreeById","EntityDefaultEventName","EntityType","buildEntityChannelName","buildEntityNamespaceName","buildRedisKeyPath","EventSubscriber","publishDomainEvent","UserEntity","CachePrefix","publishEvent","event","data","content","type","USER","destinations","channel","id","namespace","realm_id","UserSubscriber","listenTo","afterInsert","entity","CREATED","afterUpdate","connection","queryResultCache","remove","prefix","key","UPDATED","afterRemove","DELETED","Column","CreateDateColumn","Entity","Index","JoinColumn","ManyToOne","PrimaryGeneratedColumn","UpdateDateColumn","RealmEntity","UserEntity","IdentityProviderEntity","IdentityProviderAccountEntity","id","access_token","refresh_token","provider_user_id","provider_user_name","provider_user_email","expires_in","expires_at","created_at","updated_at","user_id","user","user_realm_id","user_realm","provider_id","provider","provider_realm_id","provider_realm","type","nullable","default","length","unsigned","onDelete","name","unique","EntityDefaultEventName","EntityType","buildEntityChannelName","buildRedisKeyPath","EventSubscriber","publishDomainEvent","IdentityProviderAccountEntity","CachePrefix","publishEvent","event","data","content","type","IDENTITY_PROVIDER_ACCOUNT","destinations","channel","id","IdentityProviderAccountSubscriber","listenTo","afterInsert","entity","CREATED","afterUpdate","connection","queryResultCache","remove","prefix","key","UPDATED","afterRemove","DELETED","Column","CreateDateColumn","Entity","Index","JoinColumn","ManyToOne","PrimaryGeneratedColumn","UpdateDateColumn","IdentityProviderEntity","RealmEntity","IdentityProviderAttributeMappingEntity","id","synchronization_mode","name","value","value_is_regex","target_name","target_value","created_at","updated_at","provider_id","provider","provider_realm_id","provider_realm","type","length","nullable","default","onDelete","unique","Column","CreateDateColumn","Entity","Index","JoinColumn","ManyToOne","PrimaryGeneratedColumn","UpdateDateColumn","IdentityProviderEntity","PermissionEntity","RealmEntity","IdentityProviderPermissionMappingEntity","id","synchronization_mode","name","value","value_is_regex","created_at","updated_at","permission_id","permission","permission_realm_id","permission_realm","provider_id","provider","provider_realm_id","provider_realm","type","length","nullable","default","onDelete","unique","Column","CreateDateColumn","Entity","Index","JoinColumn","ManyToOne","PrimaryGeneratedColumn","UpdateDateColumn","IdentityProviderEntity","RoleEntity","RealmEntity","IdentityProviderRoleMappingEntity","id","synchronization_mode","name","value","value_is_regex","created_at","updated_at","role_id","role","role_realm_id","role_realm","provider_id","provider","provider_realm_id","provider_realm","type","length","nullable","default","onDelete","unique","EntityDefaultEventName","EntityType","buildEntityChannelName","buildEntityNamespaceName","buildRedisKeyPath","EventSubscriber","publishDomainEvent","IdentityProviderRoleMappingEntity","CachePrefix","publishEvent","event","data","destinations","channel","id","IDENTITY_PROVIDER_ROLE_MAPPING","provider_realm_id","push","namespace","role_realm_id","content","type","IdentityProviderRoleSubscriber","listenTo","afterInsert","entity","CREATED","afterUpdate","connection","queryResultCache","remove","prefix","IDENTITY_PROVIDER_ROLE","key","UPDATED","afterRemove","DELETED","createNanoID","BeforeInsert","BeforeUpdate","Column","CreateDateColumn","Entity","Index","JoinColumn","ManyToOne","PrimaryGeneratedColumn","Unique","UpdateDateColumn","RealmEntity","UserEntity","RobotEntity","id","secret","name","display_name","description","active","created_at","updated_at","user_id","user","client_id","client","realm_id","realm","setName","length","type","select","nullable","default","onDelete","Column","CreateDateColumn","Entity","Index","JoinColumn","ManyToOne","PrimaryGeneratedColumn","UpdateDateColumn","RoleEntity","RobotEntity","RealmEntity","RobotRoleEntity","id","role_id","role","role_realm_id","role_realm","robot_id","robot","robot_realm_id","robot_realm","created_at","updated_at","onDelete","name","nullable","unique","EntityDefaultEventName","EntityType","buildEntityChannelName","buildEntityNamespaceName","buildRedisKeyPath","EventSubscriber","publishDomainEvent","CachePrefix","RobotRoleEntity","publishEvent","event","data","destinations","channel","id","ROBOT_ROLE","robot_realm_id","push","namespace","role_realm_id","content","type","RobotRoleSubscriber","listenTo","afterInsert","entity","connection","queryResultCache","remove","prefix","ROBOT_OWNED_ROLES","key","robot_id","CREATED","afterUpdate","UPDATED","afterRemove","DELETED","Column","CreateDateColumn","Entity","Index","JoinColumn","ManyToOne","PrimaryGeneratedColumn","UpdateDateColumn","PermissionEntity","PolicyEntity","RobotEntity","RealmEntity","RobotPermissionEntity","id","policy_id","policy","robot_id","robot","robot_realm_id","robot_realm","permission_id","permission","permission_realm_id","permission_realm","created_at","updated_at","nullable","onDelete","name","type","unique","EntityDefaultEventName","EntityType","buildEntityChannelName","buildEntityNamespaceName","buildRedisKeyPath","EventSubscriber","publishDomainEvent","RobotPermissionEntity","CachePrefix","publishEvent","event","data","destinations","channel","id","ROBOT_PERMISSION","robot_realm_id","push","namespace","permission_realm_id","content","type","RobotPermissionSubscriber","listenTo","afterInsert","connection","queryResultCache","remove","prefix","ROBOT_OWNED_PERMISSIONS","key","entity","robot_id","CREATED","Promise","resolve","undefined","afterUpdate","UPDATED","afterRemove","DELETED","buildRedisKeyPath","InstanceChecker","Repository","CachePrefix","RobotEntity","RobotRoleEntity","RobotPermissionEntity","PolicyRepository","RobotRepository","instance","isDataSource","manager","getBoundRoles","entity","id","entities","getRepository","find","where","robot_id","relations","role","cache","prefix","ROBOT_OWNED_ROLES","key","milliseconds","map","getBoundPermissions","repository","permission","ROBOT_OWNED_PERMISSIONS","policyIds","Set","entry","policy_id","add","policyTrees","loadPolicyTrees","policies","push","length","undefined","policyRepository","result","tree","findDescendantsTreeById","EntityDefaultEventName","EntityType","buildEntityChannelName","buildEntityNamespaceName","buildRedisKeyPath","EventSubscriber","publishDomainEvent","RobotEntity","CachePrefix","publishEvent","event","data","content","type","ROBOT","destinations","channel","id","namespace","realm_id","RobotSubscriber","listenTo","afterInsert","entity","CREATED","afterUpdate","connection","queryResultCache","remove","prefix","key","UPDATED","afterRemove","DELETED","Column","CreateDateColumn","Entity","Index","JoinColumn","ManyToOne","PrimaryGeneratedColumn","UpdateDateColumn","ClientEntity","RobotEntity","RealmEntity","UserEntity","SessionEntity","id","sub","sub_kind","ip_address","user_agent","expires_at","refreshed_at","seen_at","updated_at","created_at","client_id","client","user_id","user","robot_id","robot","realm_id","realm","type","length","nullable","default","onDelete","name","Column","CreateDateColumn","Entity","Index","JoinColumn","ManyToOne","PrimaryGeneratedColumn","UpdateDateColumn","PermissionEntity","PolicyEntity","RealmEntity","PermissionPolicyEntity","id","created_at","updated_at","permission_id","permission","permission_realm_id","permission_realm","policy_id","policy","policy_realm_id","policy_realm","onDelete","name","nullable","unique","EntityDefaultEventName","EntityType","buildEntityChannelName","buildEntityNamespaceName","buildRedisKeyPath","EventSubscriber","publishDomainEvent","RoleAttributeEntity","CachePrefix","publishEvent","event","data","destinations","channel","id","ROLE_ATTRIBUTE","realm_id","push","namespace","content","type","RoleAttributeSubscriber","listenTo","afterInsert","entity","connection","queryResultCache","remove","prefix","ROLE_OWNED_PERMISSIONS","key","role_id","CREATED","afterUpdate","UPDATED","afterRemove","DELETED","createNanoID","isBCryptHash","compare","hash","ClientCredentialsService","verify","input","entity","secret","is_confidential","secret_hashed","protect","generateSecret","compare","hash","createNanoID","RobotCredentialsService","verify","input","entity","secret","protect","generateSecret","compare","hash","UserCredentialsService","verify","input","entity","password","protect","BaseCredentialsAuthenticator","safeAuthenticate","key","value","realmId","data","authenticate","success","e","error","ClientError","IdentityType","ClientCredentialsService","BaseCredentialsAuthenticator","ClientAuthenticator","identityResolver","credentialsService","authenticate","key","secret","realmId","identity","resolve","CLIENT","type","credentialsInvalid","data","active","inactive","is_confidential","verified","verify","invalid","IdentityType","RobotError","RobotCredentialsService","BaseCredentialsAuthenticator","RobotAuthenticator","identityResolver","credentialsService","authenticate","key","secret","realmId","identity","resolve","ROBOT","type","credentialsInvalid","verified","verify","data","active","inactive","IdentityType","UserError","UserCredentialsService","BaseCredentialsAuthenticator","UserAuthenticator","identityResolver","credentialsService","authenticate","key","secret","realmId","identity","resolve","USER","type","credentialsInvalid","verified","verify","data","active","inactive","BaseCredentialsAuthenticator","CredentialsAuthenticator","strategies","authenticate","key","value","realmId","error","i","length","strategy","output","safeAuthenticate","success","data","Error","IdentityType","JWTError","SessionManager","options","repository","ctx","create","input","ip_address","user_agent","expires_at","Date","now","maxAge","toISOString","sub_kind","CLIENT","client_id","sub","ROBOT","robot_id","USER","user_id","save","ping","session","seen_at","seenAt","getTime","threshold","refresh","refreshed_at","findOneById","id","verify","ms","remove","expired","REALM_MASTER_NAME","isObject","AbstractEntityService","isActorMasterRealmMember","actor","identity","data","realm","name","getActorRealmId","undefined","realm_id","id","BuiltInPolicyType","PolicyData","isUUID","NotFoundError","ClientValidator","PermissionName","ValidatorGroup","AbstractEntityService","ClientCredentialsService","ClientService","repository","realmRepository","validator","ctx","getMany","query","actor","permissionEvaluator","preEvaluateOneOf","name","CLIENT_READ","CLIENT_UPDATE","CLIENT_DELETE","data","entities","meta","findMany","total","entity","secret","secret_encrypted","secret_hashed","evaluateOneOf","input","ATTRIBUTES","push","getOne","idOrName","realmId","findOneByIdOrName","realm","resolve","findOneBy","realm_id","id","findOneByName","create","save","undefined","update","updateOnly","options","group","where","findOneWithSecret","preEvaluate","UPDATE","CLIENT_CREATE","CREATE","validated","run","validateJoinColumns","checkUniqueness","credentialsService","actorRealmId","getActorRealmId","merge","evaluate","is_confidential","generateSecret","protect","created","delete","entityId","remove","BuiltInPolicyType","PolicyData","NotFoundError","PermissionName","AbstractEntityService","ClientPermissionService","repository","identityPermissionProvider","ctx","getMany","query","actor","permissionEvaluator","preEvaluateOneOf","name","CLIENT_PERMISSION_CREATE","CLIENT_PERMISSION_DELETE","findMany","getOne","id","entity","findOneBy","create","data","preEvaluate","validateJoinColumns","permission","permission_realm_id","realm_id","realmId","clientId","client_id","client","client_realm_id","identity","policy_id","junctionPolicy","resolveJunctionPolicy","type","evaluate","input","ATTRIBUTES","save","update","CLIENT_PERMISSION_UPDATE","updateData","Object","prototype","hasOwnProperty","call","merged","merge","delete","entityId","remove","BuiltInPolicyType","PolicyData","NotFoundError","PermissionName","AbstractEntityService","ClientRoleService","repository","ctx","getMany","query","actor","permissionEvaluator","preEvaluateOneOf","name","CLIENT_ROLE_READ","CLIENT_ROLE_UPDATE","CLIENT_ROLE_DELETE","findMany","getOne","id","entity","findOneBy","create","data","preEvaluate","CLIENT_ROLE_CREATE","validateJoinColumns","role","role_realm_id","realm_id","client","client_realm_id","evaluate","input","ATTRIBUTES","save","delete","entityId","remove","BuiltInPolicyType","PolicyData","NotFoundError","PermissionName","AbstractEntityService","ClientScopeService","repository","ctx","getMany","query","actor","permissionEvaluator","preEvaluateOneOf","name","CLIENT_READ","CLIENT_UPDATE","CLIENT_DELETE","findMany","getOne","id","entity","findOneBy","create","data","preEvaluate","CLIENT_SCOPE_CREATE","validateJoinColumns","client","client_realm_id","realm_id","scope","scope_realm_id","evaluate","input","ATTRIBUTES","save","delete","CLIENT_SCOPE_DELETE","entityId","remove","BuiltInPolicyType","PolicyData","SystemPolicyName","isPropertySet","isUUID","AuthupError","BadRequestError","NotFoundError","PermissionName","PermissionValidator","ROLE_ADMIN_NAME","ROLE_REALM_ADMIN_NAME","ValidatorGroup","AbstractEntityService","REALM_ADMIN_EXCLUDED_PERMISSIONS","REALM_CREATE","REALM_UPDATE","REALM_DELETE","REALM_ADMIN_BOUND_PERMISSIONS","CLIENT_CREATE","CLIENT_UPDATE","CLIENT_DELETE","IDENTITY_PROVIDER_CREATE","IDENTITY_PROVIDER_UPDATE","IDENTITY_PROVIDER_DELETE","PERMISSION_CREATE","PERMISSION_UPDATE","PERMISSION_DELETE","ROBOT_CREATE","ROBOT_UPDATE","ROBOT_DELETE","ROLE_CREATE","ROLE_UPDATE","ROLE_DELETE","SCOPE_CREATE","SCOPE_UPDATE","SCOPE_DELETE","USER_CREATE","USER_UPDATE","USER_DELETE","PermissionService","repository","realmRepository","roleRepository","rolePermissionRepository","policyRepository","permissionPolicyRepository","validator","ctx","getMany","query","actor","permissionEvaluator","preEvaluateOneOf","name","PERMISSION_READ","findMany","getOne","idOrName","realm","entity","findOneByIdOrName","create","data","save","undefined","update","updateOnly","options","group","realm_id","resolve","where","id","findOneBy","preEvaluate","UPDATE","CREATE","validated","run","validateJoinColumns","built_in","evaluate","input","ATTRIBUTES","checkUniqueness","merge","created","identity","getActorRealmId","assignDefaultPolicy","assignToAdminRole","assignToRealmAdminRoles","delete","entityId","remove","permission","defaultPolicy","findOneByName","DEFAULT","entry","permission_id","permission_realm_id","policy_id","policy_realm_id","adminRole","role_id","role_realm_id","includes","isBuiltIn","Object","values","policyName","REALM_BOUND","REALM_OR_GLOBAL","policy","realmAdminRoles","findManyBy","role","BuiltInPolicyType","PolicyData","NotFoundError","PermissionName","AbstractEntityService","PermissionPolicyService","repository","ctx","getMany","query","actor","permissionEvaluator","preEvaluateOneOf","name","PERMISSION_READ","PERMISSION_UPDATE","findMany","getOne","id","entity","findOneBy","create","data","preEvaluate","validateJoinColumns","permission","permission_realm_id","realm_id","policy","policy_realm_id","evaluate","input","ATTRIBUTES","save","delete","entityId","remove","AttributeNamesPolicyValidator","AttributesPolicyValidator","BuiltInPolicyType","DatePolicyValidator","TimePolicyValidator","omitRecord","Container","PolicyAttributesValidator","attributeNames","attributesOptionsValidator","attributeNamesOptionsValidator","dateOptionsValidator","timeOptionsValidator","options","run","data","type","ATTRIBUTES","ATTRIBUTE_NAMES","DATE","TIME","BuiltInPolicyType","PolicyData","extendObject","isPropertySet","isUUID","removeObjectProperty","BadRequestError","NotFoundError","PermissionName","PolicyValidator","ValidatorGroup","AbstractEntityService","PolicyAttributesValidator","PolicyService","repository","realmRepository","validator","attributesValidator","ctx","getMany","query","actor","permissionEvaluator","preEvaluateOneOf","name","PERMISSION_READ","PERMISSION_UPDATE","PERMISSION_DELETE","findMany","getOne","idOrName","realm","entity","findOneByIdOrName","create","data","save","undefined","update","updateOnly","options","group","realm_id","resolve","where","id","findOneBy","preEvaluate","UPDATE","PERMISSION_CREATE","CREATE","validated","validate","validateJoinColumns","parent","type","COMPOSITE","built_in","evaluate","input","ATTRIBUTES","checkUniqueness","saveWithEA","created","identity","getActorRealmId","run","attributes","Array","isArray","children","promises","map","child","Promise","all","delete","entityId","deleteFromTree","BuiltInPolicyType","PolicyData","isPropertySet","isUUID","BadRequestError","NotFoundError","PermissionName","REALM_MASTER_NAME","RealmValidator","ValidatorGroup","AbstractEntityService","RealmService","repository","validator","ctx","getMany","query","findMany","getOne","idOrName","entity","findOneByIdOrName","create","data","actor","save","undefined","update","updateOnly","options","group","where","id","name","findOneBy","permissionEvaluator","preEvaluate","REALM_UPDATE","UPDATE","REALM_CREATE","CREATE","validated","run","validateJoinColumns","evaluate","input","ATTRIBUTES","merge","created","delete","REALM_DELETE","built_in","entityId","remove","BuiltInPolicyType","PolicyData","isUUID","NotFoundError","PermissionName","RobotValidator","ValidatorGroup","AbstractEntityService","RobotCredentialsService","RobotService","repository","realmRepository","validator","ctx","getMany","query","actor","permissionEvaluator","preEvaluateOneOf","name","ROBOT_READ","ROBOT_UPDATE","ROBOT_DELETE","data","entities","meta","findMany","total","entity","identity","type","id","push","evaluateOneOf","input","ATTRIBUTES","getOne","idOrName","realmId","findOneById","realm","resolve","findOneBy","realm_id","findOneByName","create","save","undefined","update","updateOnly","options","group","where","preEvaluate","UPDATE","ROBOT_CREATE","CREATE","validated","run","validateJoinColumns","checkUniqueness","credentialsService","evaluate","merge","secret","protect","created","actorRealmId","getActorRealmId","generateSecret","delete","isOwner","user_id","entityId","remove","BuiltInPolicyType","PolicyData","NotFoundError","PermissionName","AbstractEntityService","RobotPermissionService","repository","identityPermissionProvider","ctx","getMany","query","actor","permissionEvaluator","preEvaluateOneOf","name","ROBOT_PERMISSION_CREATE","ROBOT_PERMISSION_DELETE","findMany","getOne","id","entity","findOneBy","create","data","preEvaluate","validateJoinColumns","permission","permission_realm_id","realm_id","realmId","clientId","client_id","robot","robot_realm_id","identity","policy_id","junctionPolicy","resolveJunctionPolicy","type","evaluate","input","ATTRIBUTES","save","update","ROBOT_PERMISSION_UPDATE","updateData","Object","prototype","hasOwnProperty","call","merged","merge","delete","entityId","remove","BuiltInPolicyType","PolicyData","NotFoundError","PermissionName","AbstractEntityService","RobotRoleService","repository","ctx","getMany","query","actor","permissionEvaluator","preEvaluateOneOf","name","ROBOT_ROLE_READ","ROBOT_ROLE_UPDATE","ROBOT_ROLE_DELETE","findMany","getOne","id","entity","findOneBy","create","data","preEvaluate","ROBOT_ROLE_CREATE","validateJoinColumns","role","role_realm_id","realm_id","robot","robot_realm_id","evaluate","input","ATTRIBUTES","save","delete","entityId","remove","BuiltInPolicyType","PolicyData","isPropertySet","isUUID","BadRequestError","NotFoundError","PermissionName","ROLE_ADMIN_NAME","RoleValidator","ValidatorGroup","AbstractEntityService","RoleService","repository","realmRepository","validator","ctx","getMany","query","actor","permissionEvaluator","preEvaluateOneOf","name","ROLE_READ","ROLE_UPDATE","ROLE_DELETE","findMany","getOne","idOrName","entity","findOneByIdOrName","create","data","save","undefined","update","updateOnly","options","group","realm","realm_id","resolve","where","id","findOneBy","preEvaluate","UPDATE","ROLE_CREATE","CREATE","validated","run","validateJoinColumns","evaluate","input","ATTRIBUTES","merge","checkUniqueness","created","identity","getActorRealmId","delete","entityId","remove","BuiltInPolicyType","PolicyData","NotFoundError","PermissionName","AbstractEntityService","RoleAttributeService","repository","ctx","getMany","query","actor","permissionEvaluator","preEvaluateOneOf","name","ROLE_READ","ROLE_UPDATE","ROLE_DELETE","data","entities","meta","findMany","total","entity","evaluateOneOf","input","ATTRIBUTES","push","getOne","id","findOneBy","create","preEvaluate","validateJoinColumns","realm_id","role","evaluate","save","update","merge","delete","entityId","remove","BuiltInPolicyType","PolicyData","NotFoundError","PermissionName","ROLE_ADMIN_NAME","AbstractEntityService","RolePermissionService","repository","identityPermissionProvider","ctx","getMany","query","actor","permissionEvaluator","preEvaluateOneOf","name","ROLE_PERMISSION_DELETE","ROLE_PERMISSION_READ","findMany","getOne","id","entity","findOneBy","create","data","preEvaluate","ROLE_PERMISSION_CREATE","validateJoinColumns","permission","permission_realm_id","realm_id","role","realmId","clientId","client_id","role_realm_id","identity","policy_id","junctionPolicy","resolveJunctionPolicy","type","evaluate","input","ATTRIBUTES","save","update","ROLE_PERMISSION_UPDATE","updateData","Object","prototype","hasOwnProperty","call","merged","merge","delete","entityId","remove","BuiltInPolicyType","PolicyData","isPropertySet","isUUID","NotFoundError","PermissionName","ScopeValidator","ValidatorGroup","AbstractEntityService","ScopeService","repository","realmRepository","validator","ctx","getMany","query","actor","permissionEvaluator","preEvaluateOneOf","name","SCOPE_READ","SCOPE_UPDATE","SCOPE_DELETE","findMany","getOne","idOrName","entity","findOneByIdOrName","create","data","save","undefined","update","updateOnly","options","group","realm","realm_id","resolve","where","id","findOneBy","preEvaluate","UPDATE","SCOPE_CREATE","CREATE","validated","run","validateJoinColumns","evaluate","input","ATTRIBUTES","checkUniqueness","merge","created","identity","getActorRealmId","delete","entityId","remove","BuiltInPolicyType","PolicyData","isUUID","removeObjectProperty","BadRequestError","NotFoundError","PermissionName","UserValidator","ValidatorGroup","AbstractEntityService","UserCredentialsService","UserService","repository","realmRepository","validator","ctx","getMany","query","actor","permissionEvaluator","preEvaluateOneOf","name","USER_READ","USER_UPDATE","USER_DELETE","data","entities","meta","findMany","total","entity","identity","type","id","push","evaluateOneOf","input","ATTRIBUTES","getOne","idOrName","realmId","isMe","resolvedId","findOne","create","save","undefined","update","updateOnly","options","group","realm","realm_id","resolve","where","findOneBy","hasAbility","preEvaluate","e","UPDATE","USER_CREATE","CREATE","validated","run","validateJoinColumns","credentialsService","originalName","originalNameLocked","name_locked","merge","evaluate","password","protect","created","actorRealmId","getActorRealmId","delete","entityId","remove","BuiltInPolicyType","PolicyData","BadRequestError","ForbiddenError","NotFoundError","PermissionName","buildErrorMessageForAttribute","AbstractEntityService","UserAttributeService","repository","ctx","getMany","query","actor","permissionEvaluator","preEvaluateOneOf","name","USER_UPDATE","USER_SELF_MANAGE","data","entities","meta","findMany","total","entity","canManage","canManageUserAttribute","push","getOne","id","findOneBy","create","validateJoinColumns","user","realm_id","identity","type","user_id","save","update","evaluateOneOf","merge","delete","entityId","remove","isMe","evaluate","input","ATTRIBUTES","BuiltInPolicyType","PolicyData","NotFoundError","PermissionName","AbstractEntityService","UserPermissionService","repository","identityPermissionProvider","ctx","getMany","query","actor","permissionEvaluator","preEvaluateOneOf","name","USER_PERMISSION_CREATE","USER_PERMISSION_DELETE","USER_PERMISSION_READ","findMany","getOne","id","entity","findOneBy","create","data","preEvaluate","validateJoinColumns","permission","permission_realm_id","realm_id","realmId","clientId","client_id","user","user_realm_id","identity","policy_id","junctionPolicy","resolveJunctionPolicy","type","evaluate","input","ATTRIBUTES","save","update","USER_PERMISSION_UPDATE","updateData","Object","prototype","hasOwnProperty","call","merged","merge","delete","entityId","remove","BuiltInPolicyType","PolicyData","NotFoundError","PermissionName","AbstractEntityService","UserRoleService","repository","ctx","getMany","query","actor","permissionEvaluator","preEvaluateOneOf","name","USER_ROLE_READ","USER_ROLE_CREATE","USER_ROLE_UPDATE","findMany","getOne","id","entity","findOneBy","create","data","preEvaluate","validateJoinColumns","role","role_realm_id","realm_id","user","user_realm_id","evaluate","input","ATTRIBUTES","save","delete","USER_ROLE_DELETE","entityId","remove","OAuth2AuthorizationCodeIssuer","repository","options","issue","input","identity","entity","redirect_uri","client_id","scope","nonce","code_challenge","code_challenge_method","realm_id","data","realm","id","realm_name","name","sub","sub_kind","type","idToken","id_token","save","maxAge","updateIdToken","subtle","generateOAuth2CodeVerifier","length","charset","codeVerifier","randomValues","Uint8Array","crypto","getRandomValues","i","base64URLEncode","arrayBuffer","charCode","Array","from","btoa","String","fromCharCode","apply","replace","buildOAuth2TokenHash","value","encoder","TextEncoder","data","encode","hashBuffer","digest","halfHash","slice","buildOAuth2CodeChallenge","OAuth2AuthorizationCodeChallengeMethod","OAuth2Error","buildOAuth2CodeChallenge","OAuth2AuthorizationCodeVerifier","repository","verify","code","options","entity","popOneById","grantInvalid","redirect_uri","redirectUri","redirectUriMismatch","code_challenge","code_challenge_method","PLAIN","codeVerifier","codeVerifierHash","ScopeName","isSimpleMatch","OAuth2Error","hasOAuth2Scopes","OAuth2AuthorizationCodeRequestVerifier","clientRepository","scopeRepository","ctx","verify","data","client_id","clientInvalid","client","findOneByIdOrName","realm_id","active","clientInactive","id","scopes","findByClientId","scopeNames","map","scope","name","GLOBAL","scopeInsufficient","join","redirect_uri","redirectUris","split","redirectUriMismatch","OAuth2AuthorizationCodeChallengeMethod","OAuth2AuthorizationResponseType","OAuth2Error","createValidator","Container","z","OAuth2AuthorizationCodeRequestValidator","initialize","mount","string","nonempty","check","ctx","availableResponseTypes","Object","values","responseTypes","value","split","responseType","includes","error","responseTypeUnsupported","issues","push","input","code","message","NEVER","url","min","max","optional","nullable","enum","OAuth2Error","OAuth2AuthorizationStateManager","repository","save","data","insert","verify","state","input","payload","findOneById","stateInvalid","remove","ip","userAgent","ScopeName","OAuth2AuthorizationResponseType","OAuth2Error","hasOAuth2Scopes","buildOAuth2TokenHash","OAuth2Authorization","accessTokenIssuer","openIdTokenIssuer","codeIssuer","identityResolver","ctx","authorize","data","identity","availableResponseTypes","Object","values","responseTypes","response_type","Array","isArray","split","enabledResponseTypes","responseType","includes","responseTypeUnsupported","redirect_uri","redirectUriMismatch","output","redirectUri","state","identityInvalid","payloadBaseNormalized","sub","id","sub_kind","type","realm_id","realm","realm_name","name","client_id","scope","nonce","codeEntity","TOKEN","token","issue","accessToken","CODE","authorizationCode","needsIdToken","ID_TOKEN","OPEN_ID","idTokenPayload","at_hash","c_hash","issueWithIdentity","idToken","updateIdToken","OAuth2BaseGrant","accessTokenIssuer","sessionManager","ctx","resolveExpiresIn","payload","fallbackValue","exp","Math","floor","Date","getTime","buildOAuth2BearerTokenResponse","context","response","access_token","accessToken","expires_in","accessTokenPayload","token_type","scope","refreshToken","refresh_token","refresh_token_expires_in","refreshTokenPayload","idToken","id_token","hasOAuth2Scopes","ScopeName","OAuth2BaseGrant","buildOAuth2BearerTokenResponse","OAuth2AuthorizeGrant","refreshTokenIssuer","ctx","accessTokenIssuer","sessionManager","runWith","authorizationCode","options","session","create","user_agent","userAgent","ip_address","ipAddress","realm_id","client_id","sub_kind","sub","issuePayload","remote_address","session_id","id","undefined","realm_name","scope","accessToken","accessTokenPayload","issue","refreshToken","refreshTokenPayload","buildContext","OPEN_ID","idToken","id_token","OAuth2SubKind","IdentityType","ScopeName","OAuth2BaseGrant","buildOAuth2BearerTokenResponse","ClientCredentialsGrant","runWith","input","options","session","sessionManager","create","user_agent","userAgent","ip_address","ipAddress","realm_id","sub","id","sub_kind","CLIENT","accessToken","accessTokenPayload","accessTokenIssuer","issue","remote_address","session_id","scope","GLOBAL","realm","realm_name","client_id","ScopeName","OAuth2BaseGrant","buildOAuth2BearerTokenResponse","IdentityGrantType","refreshTokenIssuer","ctx","accessTokenIssuer","sessionManager","runWith","identity","options","session","user_agent","userAgent","ip_address","ipAddress","realm_id","data","sub","id","sub_kind","type","sessionId","create","issuePayload","session_id","remote_address","scope","GLOBAL","realm_name","realm","name","accessToken","accessTokenPayload","issue","refreshToken","refreshTokenPayload","OAuth2SubKind","IdentityType","ScopeName","buildOAuth2BearerTokenResponse","OAuth2BaseGrant","PasswordGrantType","refreshTokenIssuer","ctx","accessTokenIssuer","sessionManager","runWith","input","options","session","create","user_agent","userAgent","ip_address","ipAddress","realm_id","client_id","undefined","sub","id","sub_kind","USER","issuePayload","session_id","remote_address","scope","GLOBAL","realm_name","realm","name","accessToken","accessTokenPayload","issue","refreshToken","refreshTokenPayload","JWTError","buildOAuth2BearerTokenResponse","OAuth2BaseGrant","OAuth2RefreshTokenGrant","refreshTokenIssuer","tokenVerifier","tokenRevoker","ctx","accessTokenIssuer","sessionManager","runWith","input","options","payload","verify","revoke","session_id","payloadPropertyInvalid","session","findOneById","userAgent","user_agent","ipAddress","ip_address","refresh","accessToken","accessTokenPayload","issue","remote_address","exp","buildExp","refreshToken","refreshTokenPayload","OAuth2SubKind","IdentityType","ScopeName","OAuth2BaseGrant","buildOAuth2BearerTokenResponse","RobotCredentialsGrant","runWith","input","options","session","sessionManager","create","user_agent","userAgent","ip_address","ipAddress","realm_id","sub","id","sub_kind","ROBOT","accessToken","accessTokenPayload","accessTokenIssuer","issue","session_id","remote_address","scope","GLOBAL","realm","realm_name","client_id","undefined","hasOwnProperty","OAuth2SubKind","OAuth2OpenIDClaimsBuilder","clientMap","name","nickname","preferred_username","updated_at","value","Math","floor","Date","getTime","robotMap","userMap","family_name","given_name","email","email_verified","fromIdentity","identity","type","CLIENT","fromClient","data","ROBOT","fromRobot","fromUser","input","extract","attributeMap","attributes","result","keys","Object","key_","attribute","key","transformer","ScopeName","hasOwnProperty","OAuth2SubKind","unwrapOAuth2Scope","distinctArray","OAuth2ScopeAttributesResolver","clientAttributes","IDENTITY","OPEN_ID","robotAttributes","userAttributes","EMAIL","resolveFor","type","scope","CLIENT","resolveForClient","ROBOT","resolveForRobot","resolveForUser","attributes","scopes","push","GLOBAL","Object","values","flat","OAuth2BaseTokenIssuer","options","buildIss","input","issuer","undefined","realm_name","buildExp","exp","utc","Math","floor","Date","getTime","maxAge","OAuth2TokenKind","OAuth2BaseTokenIssuer","OAuth2AccessTokenIssuer","repository","signer","options","issue","input","iss","buildIss","data","insert","kind","ACCESS","exp","buildExp","token","sign","saveWithSignature","JWTError","OAuth2TokenKind","OAuth2OpenIDClaimsBuilder","OAuth2BaseTokenIssuer","OAuth2OpenIDTokenIssuer","repository","signer","identityResolver","claimsBuilder","ctx","options","issue","input","sub_kind","payloadPropertyInvalid","sub","identity","resolve","payloadInvalid","issueWithIdentity","claims","fromIdentity","utc","Math","floor","Date","getTime","iss","buildIss","data","insert","kind","ID_TOKEN","auth_time","exp","buildExp","updated_at","client_id","aud","token","sign","saveWithSignature","OAuth2TokenKind","OAuth2BaseTokenIssuer","OAuth2RefreshTokenIssuer","repository","signer","options","issue","input","iss","buildIss","data","insert","kind","REFRESH","exp","buildExp","token","sign","saveWithSignature","JWTError","OAuth2TokenRevoker","repository","revoke","input","jti","payloadPropertyInvalid","removeById","signToken","JWKError","JWKType","OAuth2TokenSigner","keyRepository","sign","payload","realm_id","invalidRealm","key","findByRealmId","notFoundForRealm","realm_name","decryption_key","decryptionKeyMissing","token","type","OCT","keyId","id","EC","algorithm","signature_algorithm","extractTokenHeader","verifyToken","JWKError","JWKType","JWTError","OAuth2TokenVerifier","keyRepository","tokenRepository","isInactive","id","verify","token","options","payload","findOneBySignature","jti","payloadPropertyInvalid","skipActiveCheck","notActive","header","kid","headerPropertyInvalid","key","findById","notFound","type","OCT","decryption_key","decryptionKeyMissing","EC","encryption_key","signature_algorithm","algorithms","saveWithSignature","BadRequestError","NotFoundError","createValidationChain","createValidator","randomBytes","Container","UserCredentialsService","PasswordRecoveryService","options","repository","realmRepository","mailClient","ctx","forgotPassword","data","passwordRecoveryEnabled","emailVerificationEnabled","validated","runForgotPasswordValidator","realm","resolve","realm_id","where","name","email","id","entity","findOneByWithEmail","merged","merge","reset_expires","Date","now","toISOString","reset_hash","toString","save","send","to","subject","html","resetPassword","runResetPasswordValidator","validateJoinColumns","token","findOneBy","credentialsService","hashedPassword","protect","password","reset_at","validator","oneOfContainer","oneOf","mount","chain","exists","notEmpty","isEmail","isString","optional","isUUID","values","run","isLength","min","max","isPermissionPolicyBindingEqual","mergePermissionPolicyBindings","isPolicy","IdentityPermissionProvider","clientRepository","userRepository","roleRepository","robotRepository","ctx","isSuperset","parent","child","parentBindings","getFor","childBindings","parentMerged","childMerged","childItem","parentItem","find","p","policies","length","resolveJunctionPolicy","identity","options","bindings","matching","filter","b","permission","name","realmId","realm_id","clientId","client_id","undefined","merged","policy","type","getForClient","getForUser","getForRobot","getForRole","getBoundPermissions","id","roles","getBoundRoles","roleBindings","getBoundPermissionsForMany","then","data","reduceBindingsByIdentityClient","reduceEntitiesByIdentityClient","binding","entities","entity","IdentityProviderIdentityOperation","IdentityProviderMapperOperation","IdentityProviderMappingSyncMode","getJWTClaimByPattern","IdentityProviderIdentityOperation","IdentityProviderMapperOperation","IdentityProviderAccountBaseMapper","resolve","identity","mapping","operation","synchronization_mode","ONCE","UPDATE","NONE","name","value","CREATE","data","value_is_regex","length","DELETE","IdentityProviderAccountBaseMapper","IdentityProviderAttributeMapper","repository","execute","identity","entities","findByProviderId","provider","id","items","entity","operation","value","resolve","push","key","target_name","target_value","realmId","provider_realm_id","IdentityProviderAccountBaseMapper","IdentityProviderRoleMapper","finder","execute","identity","entities","findByProviderId","provider","id","items","entity","operation","resolve","push","value","role_id","realmId","role_realm_id","IdentityProviderAccountBaseMapper","IdentityProviderPermissionMapper","repository","execute","identity","entities","findByProviderId","provider","id","items","entity","operation","resolve","push","value","permission_id","realmId","permission_realm_id","UserValidator","ValidatorGroup","buildUserFakeEmail","isUserFakeEmail","createNanoID","extendObject","isValidupError","stringifyPath","IdentityProviderIdentityOperation","IdentityProviderMapperOperation","IdentityProviderAccountManager","attributesMapper","permissionMapper","roleMapper","repository","userRepository","userValidator","ctx","attributeMapper","save","identity","account","findOneByProviderIdentity","operation","UPDATE","user","saveUser","saveRoles","savePermissions","CREATE","provider_id","provider","id","provider_user_id","provider_user_name","name","provider_realm_id","realm_id","user_id","user_realm_id","attributes","execute","entity","attribute","key","value","active","name_locked","client_id","clientId","attributesSelf","validateAttributes","Error","attributesSelfKeys","Object","keys","attributesExtra","entityKeys","entityKey","index","indexOf","output","attempts","Math","max","attributeCandidates","length","saveOneWithEA","names","shift","run","group","email","e","retry","i","issues","child","pathNormalized","path","Array","isArray","first","rest","push","entities","UserError","template","ldap","BaseCredentialsAuthenticator","IdentityProviderLdapAuthenticator","provider","accountManager","client","ctx","clientFactory","create","url","tls","startTLS","start_tls","baseDn","base_dn","user","password","userNameAttribute","user_name_attribute","authenticate","name","bind","safeBind","success","safeUnbind","credentialsInvalid","entity","findOneByName","identity","id","dn","attributeCandidates","extractCnFromDn","email","user_mail_attribute","data","roles","findUserGroups","account","save","isDn","nameAttribute","resolveDn","user_base_dn","e","error","unbind","input","filter","user_filter","name_attribute","mail_attribute","display_name_attribute","user_display_name_attribute","EqualityFilter","attribute","value","OrFilter","filters","entities","search","scope","length","match","exec","trim","undefined","group_name_attribute","memberAttribute","group_member_attribute","group_filter","member_attribute","AndFilter","group_class","group_member_user_attribute","group_base_dn","attributeKey","names","push","Array","isArray","el","IdentityProviderProtocol","UserError","isLdapIdentityProvider","IdentityProviderLdapAuthenticator","BaseCredentialsAuthenticator","IdentityProviderLdapCollectionAuthenticator","repository","accountManager","clientFactory","ctx","authenticate","name","password","realmId","error","entities","findByProtocol","LDAP","provider","authenticator","response","safeAuthenticate","success","data","credentialsInvalid","buildIdentityProviderAuthorizeCallbackPath","extractTokenPayload","OAuth2Client","IdentityProviderOAuth2Authenticator","client","options","accountManager","provider","ctx","clientId","client_id","clientSecret","client_secret","redirectUri","baseURL","id","scope","authorizationEndpoint","authorize_url","tokenEndpoint","token_url","userinfoEndpoint","user_info_url","undefined","buildRedirectURL","parameters","authorize","buildURL","authenticate","params","token","createWithAuthorizationCode","identity","buildIdentityWithTokenGrantResponse","account","save","user","safeAuthenticate","data","success","e","error","input","payload","access_token","sub","attributeCandidates","name","email","extractTokenPayload","IdentityProviderOAuth2Authenticator","IdentityProviderOpenIDAuthenticator","buildIdentityWithTokenGrantResponse","input","payload","access_token","id","sub","attributeCandidates","name","preferred_username","nickname","email","data","provider","extractTokenPayload","IdentityProviderOAuth2Authenticator","IdentityProviderFacebookAuthenticator","ctx","provider","scope","authorize_url","token_url","user_info_url","buildIdentityWithTokenGrantResponse","input","userInfo","client","get","type","token","access_token","payload","id","attributeCandidates","name","username","email","first_name","last_name","data","extractTokenPayload","IdentityProviderOAuth2Authenticator","IdentityProviderGithubAuthenticator","ctx","provider","scope","authorize_url","token_url","user_info_url","buildIdentityWithTokenGrantResponse","input","userInfo","client","get","type","token","access_token","payload","id","attributeCandidates","name","login","email","data","extractTokenPayload","IdentityProviderOAuth2Authenticator","IdentityProviderGoogleAuthenticator","ctx","provider","scope","authorize_url","token_url","user_info_url","buildIdentityWithTokenGrantResponse","input","payload","access_token","attributeCandidates","id_token","idTokenPayload","name","email","first_name","given_name","last_name","family_name","id","sub","data","extractTokenPayload","IdentityProviderOAuth2Authenticator","IdentityProviderInstagramAuthenticator","ctx","provider","scope","authorize_url","token_url","user_info_url","buildIdentityWithTokenGrantResponse","input","userInfo","client","get","type","token","access_token","payload","id","attributeCandidates","name","username","data","extractTokenPayload","IdentityProviderOAuth2Authenticator","IdentityProviderPaypalAuthenticator","ctx","provider","scope","authorize_url","token_url","user_info_url","buildIdentityWithTokenGrantResponse","input","userInfo","client","get","type","token","access_token","payload","id","user_id","attributeCandidates","name","email","data","TypedToken","IDENTITY_PROVIDER_LDAP_COLLECTION_AUTHENTICATOR_TOKEN","IdentityProviderPreset","IdentityProviderProtocol","IdentityProviderOAuth2Authenticator","IdentityProviderOpenIDAuthenticator","IdentityProviderFacebookAuthenticator","IdentityProviderGithubAuthenticator","IdentityProviderGoogleAuthenticator","IdentityProviderInstagramAuthenticator","IdentityProviderPaypalAuthenticator","createIdentityProviderOAuth2Authenticator","ctx","provider","preset","FACEBOOK","GITHUB","GOOGLE","INSTAGRAM","PAYPAL","protocol","OIDC","UserValidator","createNanoID","BadRequestError","NotFoundError","randomBytes","Container","UserCredentialsService","RegistrationService","options","mailClient","repository","realmRepository","ctx","register","data","registrationEnabled","validator","mount","pathsToInclude","validated","run","group","validateJoinColumns","emailVerificationEnabled","active","activate_hash","toString","entity","create","credentialsService","password","protect","realm","resolve","realm_id","id","save","send","to","email","subject","html","remove","activate","findOneBy","token","merged","merge","IdentityType","isUUID","IdentityResolver","clientRepository","userRepository","robotRepository","ctx","resolve","type","key","realmKey","CLIENT","resolveClient","ROBOT","resolveRobot","USER","resolveUser","data","findOneById","findOneByName","ProvisioningEntityStrategyType","ProvisioningEntityStrategyType","normalizeEntityProvisioningStrategy","input","type","CREATE_ONLY","createValidator","Container","z","ProvisioningStrategyValidator","options","oneOf","initialize","mergeContainer","mount","enum","array","string","optional","altContainer","PermissionValidator","Container","ProvisioningStrategyValidator","PermissionProvisioningValidator","initialize","strategyValidator","mount","optional","attributesValidator","createValidator","Container","z","RoleProvisioningRelationsValidator","initialize","mount","optional","array","string","RoleValidator","Container","ProvisioningStrategyValidator","RoleProvisioningRelationsValidator","RoleProvisioningValidator","initialize","strategyValidator","mount","optional","dataValidator","relationsValidator","createValidator","Container","z","PermissionProvisioningValidator","RoleProvisioningValidator","ClientProvisioningRelationsValidator","initialize","permissionValidator","roleValidator","mount","optional","array","string","ClientValidator","Container","ProvisioningStrategyValidator","ClientProvisioningRelationsValidator","ClientProvisioningValidator","initialize","strategyValidator","mount","optional","attributesValidator","relationsValidator","createValidator","Container","z","RobotProvisioningRelationsValidator","initialize","mount","optional","array","string","RobotValidator","Container","ProvisioningStrategyValidator","RobotProvisioningRelationsValidator","RobotProvisioningValidator","initialize","strategyValidator","mount","optional","attributesValidator","relationsValidator","ScopeValidator","Container","ProvisioningStrategyValidator","ScopeProvisioningValidator","initialize","strategyValidator","mount","optional","attributesValidator","createValidator","Container","z","UserProvisioningRelationsValidator","initialize","mount","optional","record","string","array","UserValidator","Container","ProvisioningStrategyValidator","UserProvisioningRelationsValidator","UserProvisioningValidator","initialize","strategyValidator","mount","optional","attributesValidator","relationsValidator","buildZodIssuesForError","createValidator","Container","isValidupError","z","ClientProvisioningValidator","PermissionProvisioningValidator","RobotProvisioningValidator","RoleProvisioningValidator","ScopeProvisioningValidator","UserProvisioningValidator","RealmProvisioningRelationsValidator","initialize","clientValidator","roleValidator","permissionValidator","robotValidator","scopeValidator","userValidator","mount","optional","array","any","check","ctx","i","value","length","run","e","issues","push","code","message","path","input","undefined","RealmValidator","Container","ProvisioningStrategyValidator","RealmProvisioningRelationsValidator","RealmProvisioningValidator","initialize","strategyValidator","mount","optional","attributesValidator","relationsValidator","buildZodIssuesForError","createValidator","Container","isValidupError","z","ProvisioningStrategyValidator","PermissionProvisioningValidator","RealmProvisioningValidator","RoleProvisioningValidator","ScopeProvisioningValidator","RootProvisioningValidator","initialize","strategyValidator","mount","optional","realmValidator","array","any","check","ctx","i","value","length","run","roleValidator","e","issues","push","scopeValidator","permissionValidator","BaseProvisioningSynchronizer","synchronizeMany","input","output","entity","push","synchronize","ProvisioningEntityResolver","repository","resolveGlobal","names","length","hasWildcard","includes","findManyBy","realm_id","client_id","name","resolveRealm","realmId","resolveClient","clientId","ProvisioningJunctionSynchronizer","ctx","synchronize","owner","targets","targetKey","targetRealmKey","extraAttributes","target","existing","repository","findOneBy","ownerKey","id","entity","create","ownerRealmKey","realm_id","save","pickRecord","ProvisioningEntityStrategyType","normalizeEntityProvisioningStrategy","BaseProvisioningSynchronizer","ProvisioningEntityResolver","ProvisioningJunctionSynchronizer","ClientProvisioningSynchronizer","clientRepository","permissionResolver","roleResolver","permissionJunction","roleJunction","permissionSynchronizer","roleSynchronizer","ctx","permissionRepository","roleRepository","repository","clientPermissionRepository","ownerKey","ownerRealmKey","clientRoleRepository","synchronize","input","strategy","attributes","findOneBy","name","realm_id","type","ABSENT","remove","MERGE","merge","save","REPLACE","id","create","permissions","resolveGlobal","relations","globalPermissions","resolveRealm","realmPermissions","length","roles","globalRoles","realmRoles","children","map","child","client_id","client","synchronizeMany","pickRecord","ProvisioningEntityStrategyType","normalizeEntityProvisioningStrategy","BaseProvisioningSynchronizer","PermissionProvisioningSynchronizer","repository","ctx","synchronize","input","strategy","attributes","findOneBy","name","realm_id","client_id","type","ABSENT","remove","MERGE","merge","save","REPLACE","id","create","BaseProvisioningSynchronizer","PolicyProvisioningSynchronizer","repository","permissionPolicyRepository","ctx","synchronize","input","entity","findOneBy","name","attributes","realm_id","merge","type","built_in","parent_id","parent","saveWithEA","extraAttributes","create","synchronizeChildren","id","children","parentId","declaredNames","map","c","reduce","prev","child","Promise","resolve","cleanupStaleChildren","existingChildren","findManyBy","staleChildren","filter","includes","cleanupStaleChild","referencingJunctions","policy_id","length","deleteFromTree","detached","pickRecord","ProvisioningEntityStrategyType","normalizeEntityProvisioningStrategy","BaseProvisioningSynchronizer","RealmProvisioningSynchronizer","repository","clientSynchronizer","permissionSynchronizer","roleSynchronizer","userSynchronizer","robotSynchronizer","scopeSynchronizer","ctx","synchronize","input","strategy","attributes","findOneBy","name","type","ABSENT","remove","MERGE","merge","save","REPLACE","id","create","relations","clients","map","child","realm_id","realm","synchronizeMany","permissions","roles","users","robots","scopes","pickRecord","ProvisioningEntityStrategyType","normalizeEntityProvisioningStrategy","BaseProvisioningSynchronizer","ProvisioningEntityResolver","ProvisioningJunctionSynchronizer","RoleProvisioningSynchronizer","repository","policyRepository","permissionResolver","permissionJunction","ctx","permissionRepository","rolePermissionRepository","ownerKey","ownerRealmKey","synchronize","input","strategy","attributes","findOneBy","name","realm_id","client_id","type","ABSENT","remove","MERGE","merge","save","REPLACE","id","create","relations","globalPermissions","resolveGlobal","globalPermissionsExclude","length","excludeSet","Set","filter","p","has","realmPermissions","resolveRealm","permissions","policyMap","resolvePolicyMap","permission","policyId","overrides","get","defaultPolicyId","policy_id","undefined","roleName","globalPermissionsPolicyName","defaultPolicy","findOneByName","Error","Map","globalPermissionsPolicyOverrides","policyName","permissionNames","Object","entries","policy","permName","set","BaseProvisioningSynchronizer","GraphProvisioningSynchronizer","policySynchronizer","realmSynchronizer","permissionSynchronizer","roleSynchronizer","scopeSynchronizer","ctx","synchronize","input","output","policies","synchronizeMany","permissions","roles","scopes","realms","pickRecord","ProvisioningEntityStrategyType","normalizeEntityProvisioningStrategy","BaseProvisioningSynchronizer","ProvisioningEntityResolver","ProvisioningJunctionSynchronizer","RobotProvisioningSynchronizer","robotRepository","permissionResolver","roleResolver","permissionJunction","roleJunction","ctx","permissionRepository","roleRepository","repository","robotPermissionRepository","ownerKey","ownerRealmKey","robotRoleRepository","synchronize","input","strategy","attributes","findOneBy","name","realm_id","type","ABSENT","remove","MERGE","merge","save","REPLACE","id","create","permissions","resolveGlobal","relations","globalPermissions","resolveRealm","realmPermissions","length","roles","globalRoles","realmRoles","pickRecord","ProvisioningEntityStrategyType","normalizeEntityProvisioningStrategy","BaseProvisioningSynchronizer","ScopeProvisioningSynchronizer","repository","ctx","synchronize","input","strategy","attributes","findOneBy","name","realm_id","type","ABSENT","remove","MERGE","merge","save","REPLACE","id","create","buildUserFakeEmail","pickRecord","ProvisioningEntityStrategyType","normalizeEntityProvisioningStrategy","BaseProvisioningSynchronizer","ProvisioningEntityResolver","ProvisioningJunctionSynchronizer","UserProvisioningSynchronizer","userRepository","clientRepository","permissionResolver","roleResolver","permissionJunction","roleJunction","ctx","permissionRepository","roleRepository","repository","userPermissionRepository","ownerKey","ownerRealmKey","userRoleRepository","synchronize","input","strategy","attributes","findOneBy","name","realm_id","client_id","type","ABSENT","remove","MERGE","includes","email","merge","save","REPLACE","undefined","id","create","permissions","resolveGlobal","relations","globalPermissions","resolveRealm","realmPermissions","clientPermissions","clientKeys","Object","keys","clientKey","client","entities","resolveClient","push","length","roles","globalRoles","realmRoles","clientRoles","AttributesPolicyEvaluator","BuiltInPolicyType","IdentityPolicyEvaluator","PermissionBindingPolicyValidator","PolicyEngine","PolicyIssueCode","definePolicyIssueItem","maybeInvertPolicyOutcome","mergePermissionPolicyBindings","PermissionBindingPolicyEvaluator","validator","identityEvaluator","attributesEvaluator","identityPermissionProvider","accessData","ctx","data","has","PERMISSION_BINDING","isValidated","get","set","setValidated","evaluate","value","policy","run","identity","success","issues","code","DATA_MISSING","message","path","binding","identityBindings","getFor","then","bindings","filter","item","permission","name","realm_id","client_id","length","invert","bindingsMerged","policies","flatMap","b","evaluators","compositePolicy","children","type","COMPOSITE","engine","outcome","PolicyEngine","BasePolicyEngine","BuiltInPolicyType","PolicyDefaultEvaluators","PermissionBindingPolicyEvaluator","identityPermissionProvider","registerEvaluator","PERMISSION_BINDING","TypedToken","CacheInjectionKey","ModuleName","CONFIG","LOGGER","CACHE","MAIL","RUNTIME","SWAGGER","DATABASE","PROVISIONING","LDAP","AUTHENTICATION","IDENTITY","OAUTH2","COMPONENTS","HTTP","TypedToken","ConfigInjectionKey","ConfigEnvironmentVariableName","toPublicHost","input","isObject","zod","parseConfig","input","schema","object","env","string","optional","rootPath","writableDirectoryPath","logger","boolean","db","custom","value","redis","lazy","union","any","smtp","port","number","nonnegative","host","publicUrl","url","middlewareBody","or","record","middlewareCors","middlewareCookie","middlewareQuery","middlewarePrometheus","middlewareRateLimit","middlewareSwagger","tokenAccessMaxAge","tokenRefreshMaxAge","registrationEnabled","emailVerificationEnabled","passwordRecoveryEnabled","clientAuthBasic","clientSystemEnabled","clientSystemSecret","min","max","clientSystemSecretReset","userAuthBasic","userAdminEnabled","userAdminPassword","userAdminPasswordReset","robotAuthBasic","robotAdminEnabled","robotAdminSecret","robotAdminSecretReset","permissions","array","permissionsDefaultPolicyAssignment","parse","read","path","process","EnvironmentName","toPublicHost","parseConfig","normalizeConfig","input","parsed","writableDirectoryPath","join","cwd","port","host","publicUrl","regex","match","env","DEVELOPMENT","rootPath","logger","redis","smtp","middlewareBody","middlewareCookie","middlewareCors","middlewarePrometheus","middlewareQuery","middlewareRateLimit","middlewareSwagger","tokenRefreshMaxAge","tokenAccessMaxAge","registrationEnabled","emailVerificationEnabled","passwordRecoveryEnabled","clientAuthBasic","clientSystemEnabled","clientSystemSecret","clientSystemSecretReset","userAuthBasic","userAdminEnabled","userAdminPassword","userAdminPasswordReset","robotAuthBasic","robotAdminEnabled","robotAdminSecret","robotAdminSecretReset","permissions","permissionsDefaultPolicyAssignment","oneOf","read","readArray","readBool","readInt","hasEnvDataSourceOptions","readDataSourceOptionsFromEnv","ConfigEnvironmentVariableName","readConfigRawFromEnv","options","env","NODE_ENV","writableDirectoryPath","WRITABLE_DIRECTORY_PATH","db","redis","REDIS","smtp","SMTP","host","HOST","port","PORT","Number","parseInt","publicURL","PUBLIC_URL","publicUrl","tokenAccessMaxAge","TOKEN_ACCESS_MAX_AGE","tokenRefreshMaxAge","TOKEN_REFRESH_MAX_AGE","registrationEnabled","REGISTRATION_ENABLED","emailVerificationEnabled","EMAIL_VERIFICATION_ENABLED","passwordRecoveryEnabled","PASSWORD_RECOVERY_ENABLED","clientBasicAuth","CLIENT_AUTH_BASIC","clientAuthBasic","clientSystemEnabled","CLIENT_SYSTEM_ENABLED","clientAdminSecret","CLIENT_SYSTEM_SECRET","clientSystemSecret","clientAdminSecretReset","CLIENT_SYSTEM_SECRET_RESET","clientSystemSecretReset","userBasicAuth","USER_AUTH_BASIC","userAuthBasic","userAdminEnabled","USER_ADMIN_ENABLED","userAdminPassword","USER_ADMIN_PASSWORD","userAdminPasswordReset","USER_ADMIN_PASSWORD_RESET","robotBasicAuth","ROBOT_AUTH_BASIC","robotAuthBasic","robotAdminEnabled","ROBOT_ADMIN_ENABLED","robotAdminSecret","ROBOT_ADMIN_SECRET","robotAdminSecretReset","ROBOT_ADMIN_SECRET_RESET","permissions","PERMISSIONS","length","permissionsDefaultPolicyAssignment","PERMISSIONS_DEFAULT_POLICY_ASSIGNMENT","Container","readConfigRawFromFS","options","container","prefix","cwd","file","loadFile","load","raw","get","db","redis","smtp","merge","readConfigRawFromEnv","readConfigRawFromFS","readConfigRaw","options","fs","env","fsOptions","boolableToObject","input","ModuleName","ConfigInjectionKey","normalizeConfig","readConfigRaw","ConfigModule","name","instance","config","CONFIG","setup","container","read","register","useValue","options","raw","env","MemoryCache","RedisCache","ModuleName","CacheInjectionKey","ConfigInjectionKey","CacheModule","name","dependencies","CACHE","CONFIG","setup","container","result","tryResolve","success","data","redis","register","useFactory","AuthenticationCachePrefix","buildCacheKey","AuthenticationCachePrefix","SessionRepository","cache","repository","ctx","findOneById","id","session","get","prefix","SESSION","key","findOneBy","save","input","create","set","ttl","Date","expires_at","getTime","now","remove","drop","removeById","SessionEntity","SessionManager","CacheInjectionKey","ConfigInjectionKey","ModuleName","AuthenticationInjectionKey","SessionRepository","AuthenticationModule","name","dependencies","AUTHENTICATION","DATABASE","CACHE","CONFIG","setup","container","register","useFactory","c","cache","resolve","repository","config","options","maxAge","tokenRefreshMaxAge","PermissionEntity","RoleEntity","DatabaseUniqueEntriesComponent","dataSource","start","enforceUniqueRoles","enforceUniquePermissions","repository","getRepository","queryBuilder","createQueryBuilder","orderBy","entities","getMany","aggregated","reduce","prev","curr","key","buildKey","name","client_id","realm_id","Array","isArray","push","keys","Object","rest","length","remove","props","map","join","DatabaseUniqueEntriesComponent","createDatabaseUniqueEntriesComponent","dataSource","cron","LessThan","SessionEntity","createOAuth2CleanerComponent","dataSource","start","sessionRepository","getRepository","execute","isoDate","Date","toISOString","delete","expires_at","schedule","TypedToken","DatabaseInjectionKey","DataSource","escapeRedisKey","DatabaseQueryResultCache","instance","cache","buildKey","id","clear","prefix","connect","Promise","resolve","disconnect","getFromCache","options","output","identifier","get","query","encodeURIComponent","undefined","isExpired","savedCache","time","duration","Date","getTime","remove","identifiers","keys","map","dropMany","storeInCache","set","ttl","synchronize","AuthupError","CodeTransformation","isCodeTransformation","readDataSourceOptionsFromEnv","transformFilePath","ClientEntity","ClientPermissionEntity","ClientPermissionSubscriber","ClientRoleEntity","ClientRoleSubscriber","ClientScopeEntity","ClientScopeSubscriber","ClientSubscriber","IdentityProviderAccountEntity","IdentityProviderAccountSubscriber","IdentityProviderAttributeEntity","IdentityProviderAttributeMappingEntity","IdentityProviderAttributeSubscriber","IdentityProviderEntity","IdentityProviderPermissionMappingEntity","IdentityProviderRoleMappingEntity","IdentityProviderRoleSubscriber","IdentityProviderSubscriber","KeyEntity","PermissionEntity","PermissionPolicyEntity","PermissionSubscriber","PolicyAttributeEntity","PolicyAttributeSubscriber","PolicyEntity","PolicySubscriber","RealmEntity","RealmSubscriber","RobotEntity","RobotPermissionEntity","RobotPermissionSubscriber","RobotRoleEntity","RobotRoleSubscriber","RobotSubscriber","RoleAttributeEntity","RoleAttributeSubscriber","RoleEntity","RolePermissionEntity","RolePermissionSubscriber","RoleSubscriber","ScopeEntity","ScopeSubscriber","SessionEntity","UserAttributeEntity","UserAttributeSubscriber","UserEntity","UserPermissionEntity","UserPermissionSubscriber","UserRoleEntity","UserRoleSubscriber","UserSubscriber","DataSourceOptionsBuilder","buildWithEnv","options","normalize","buildWith","type","logging","entities","migrations","migrationsTransactionMode","subscribers","migrationPath","JUST_IN_TIME","Object","assign","connectorPackage","singa","instance","name","setDataSourceSync","dataSource","setFactory","unsetDataSourceSync","unset","useDataSourceSync","use","ConflictError","DatabaseConflictError","EnvironmentName","isDatabaseTypeSupported","type","isDatabaseTypeSupportedForEnvironment","env","PRODUCTION","TypedToken","LoggerInjectionKey","createLogger","createNoopLogger","setLoggerFactory","ModuleName","ConfigInjectionKey","LoggerInjectionKey","LoggerModule","name","dependencies","LOGGER","CONFIG","setup","container","result","tryResolve","success","data","logger","register","useFactory","env","directory","writableDirectoryPath","DomainEventPublisher","DomainEventRedisPublisher","DomainEventSocketPublisher","createRedisClient","AuthupError","DataSource","InstanceChecker","checkDatabase","createDatabase","setDataSource","synchronizeDatabaseSchema","unsetDataSource","DataSourceOptionsBuilder","DatabaseQueryResultCache","isDatabaseTypeSupported","isDatabaseTypeSupportedForEnvironment","setDataSourceSync","unsetDataSourceSync","setDomainEventPublisher","CacheInjectionKey","ModuleName","DatabaseInjectionKey","ConfigInjectionKey","LoggerInjectionKey","DatabaseModule","name","dependencies","optionsBuilder","options","DATABASE","CONFIG","LOGGER","setup","container","logger","resolve","prepareBuild","dataSourceOptions","buildDataSourceOptions","setupDatabase","dataSource","debug","initialize","migrate","register","useValue","registerRepositories","registerEventPublisher","teardown","tryResolve","success","data","destroy","unregister","check","exists","synchronize","ifNotExist","config","db","buildWith","buildWithEnv","type","env","cacheResult","Object","assign","cache","provider","entities","Array","isArray","entity","isEntitySchema","useFactory","getRepository","publisher","redis","client","mount","In","IsNull","translateWhereConditions","where","result","Object","entries","forEach","key","value","Array","isArray","REALM_MASTER_NAME","isUUID","applyQuery","validateEntityJoinColumns","RealmEntity","translateWhereConditions","RealmRepositoryAdapter","repository","findOneById","id","findOneBy","findOneByName","name","qb","createQueryBuilder","where","getOne","findMany","query","groupBy","pagination","defaultAlias","filters","allowed","maxLimit","fields","sort","entities","total","getManyAndCount","data","meta","findOneByIdOrName","idOrName","findManyBy","findBy","create","merge","entity","save","remove","validateJoinColumns","dataSource","manager","connection","entityTarget","resolve","withFallback","isUUID","applyQuery","isEntityUnique","validateEntityJoinColumns","DatabaseConflictError","translateWhereConditions","ClientEntity","RealmRepositoryAdapter","ClientRepositoryAdapter","repository","realmRepository","ctx","findMany","query","qb","createQueryBuilder","groupBy","pagination","defaultAlias","fields","default","allowed","filters","maxLimit","relations","onJoin","_property","key","q","addGroupBy","sort","entities","total","getManyAndCount","data","meta","findOneById","id","findOneBy","findOneByName","name","realmKey","where","realm","resolve","andWhere","realmId","getOne","findOneByIdOrName","idOrName","findManyBy","findBy","findOneWithSecret","Object","entries","forEach","value","addSelect","create","merge","entity","save","remove","validateJoinColumns","dataSource","manager","connection","entityTarget","checkUniqueness","existing","isUnique","entityExisting","applyQuery","validateEntityJoinColumns","ClientPermissionEntity","translateWhereConditions","ClientPermissionRepositoryAdapter","repository","findMany","query","qb","createQueryBuilder","groupBy","pagination","defaultAlias","filters","allowed","relations","onJoin","_property","key","q","addGroupBy","sort","maxLimit","entities","total","getManyAndCount","data","meta","findOneById","id","findOneBy","findOneByName","_name","Promise","resolve","findOneByIdOrName","idOrName","findManyBy","where","findBy","create","merge","entity","save","remove","validateJoinColumns","dataSource","manager","connection","entityTarget","applyQuery","validateEntityJoinColumns","ClientRoleEntity","translateWhereConditions","ClientRoleRepositoryAdapter","repository","findMany","query","qb","createQueryBuilder","groupBy","pagination","defaultAlias","filters","allowed","relations","onJoin","_property","key","q","addGroupBy","sort","maxLimit","entities","total","getManyAndCount","data","meta","findOneById","id","findOneBy","findOneByName","_name","Promise","resolve","findOneByIdOrName","idOrName","findManyBy","where","findBy","create","merge","entity","save","remove","validateJoinColumns","dataSource","manager","connection","entityTarget","applyQuery","validateEntityJoinColumns","ClientScopeEntity","translateWhereConditions","ClientScopeRepositoryAdapter","repository","findMany","query","qb","createQueryBuilder","groupBy","pagination","defaultAlias","relations","allowed","onJoin","_property","key","q","addGroupBy","filters","maxLimit","entities","total","getManyAndCount","data","meta","findOneById","id","findOneBy","findOneByName","_name","Promise","resolve","findOneByIdOrName","idOrName","findManyBy","where","findBy","create","merge","entity","save","remove","validateJoinColumns","dataSource","manager","connection","entityTarget","isUUID","applyQuery","isEntityUnique","validateEntityJoinColumns","DatabaseConflictError","IdentityProviderEntity","translateWhereConditions","RealmRepositoryAdapter","IdentityProviderRepositoryAdapter","repository","realmRepository","ctx","findMany","query","qb","createQueryBuilder","groupBy","pagination","defaultAlias","relations","allowed","onJoin","_property","key","q","addGroupBy","fields","default","filters","sort","maxLimit","entities","total","getManyAndCount","data","meta","findOneById","id","entity","findOneBy","extendOneWithEA","findOneByName","name","realmKey","where","realm","resolve","andWhere","realmId","getOne","findOneByIdOrName","idOrName","findManyBy","findBy","create","merge","save","saveWithEA","attributes","saveOneWithEA","remove","validateJoinColumns","dataSource","manager","connection","entityTarget","checkUniqueness","existing","isUnique","entityExisting","findByProtocol","protocol","getMany","extendManyWithEA","isUUID","applyQuery","isEntityUnique","validateEntityJoinColumns","DatabaseConflictError","translateWhereConditions","PermissionEntity","RealmRepositoryAdapter","PermissionRepositoryAdapter","repository","realmRepository","ctx","findMany","query","qb","createQueryBuilder","groupBy","pagination","defaultAlias","filters","allowed","maxLimit","relations","sort","entities","total","getManyAndCount","data","meta","findOneById","id","findOneBy","findOneByName","name","realmKey","where","realm","resolve","andWhere","realmId","getOne","findOneByIdOrName","idOrName","result","findManyBy","findBy","create","merge","entity","save","remove","validateJoinColumns","dataSource","manager","connection","entityTarget","checkUniqueness","existing","isUnique","entityExisting","applyQuery","validateEntityJoinColumns","PermissionPolicyEntity","translateWhereConditions","PermissionPolicyRepositoryAdapter","repository","findMany","query","qb","createQueryBuilder","groupBy","pagination","defaultAlias","filters","allowed","relations","onJoin","_property","key","q","addGroupBy","sort","maxLimit","entities","total","getManyAndCount","data","meta","findOneById","id","findOneBy","findOneByName","findOneByIdOrName","idOrName","findManyBy","where","findBy","create","merge","entity","save","remove","validateJoinColumns","dataSource","manager","connection","entityTarget","buildPermissionKey","buildCacheKey","IsNull","CachePrefix","PermissionEntity","PermissionPolicyEntity","PolicyRepository","PermissionDatabaseProvider","dataSource","repository","permissionPolicyRepository","policyRepository","getRepository","findOne","options","where","name","clientId","client_id","realmId","realm_id","entity","cache","id","prefix","PERMISSION","key","milliseconds","junctions","find","permission_id","relations","policies","junction","policy","tree","findDescendantsTree","push","permission","length","undefined","isUUID","applyQuery","isEntityUnique","validateEntityJoinColumns","DatabaseConflictError","PolicyEntity","translateWhereConditions","RealmRepositoryAdapter","PolicyRepositoryAdapter","repository","realmRepository","ctx","findMany","query","qb","createQueryBuilder","groupBy","pagination","defaultAlias","relations","allowed","onJoin","_property","key","q","addGroupBy","fields","default","filters","sort","maxLimit","entities","total","getManyAndCount","extendManyWithEA","data","meta","findOneById","id","entity","findOneBy","extendOneWithEA","findOneByName","name","realmKey","where","realm","resolve","andWhere","realmId","getOne","findOneByIdOrName","idOrName","findManyBy","findBy","create","merge","save","remove","validateJoinColumns","dataSource","manager","connection","entityTarget","checkUniqueness","existing","isUnique","entityExisting","saveWithEA","saveOneWithEA","updateClosureTable","deleteFromTree","treeRepository","getTreeRepository","isUUID","applyQuery","isEntityUnique","validateEntityJoinColumns","DatabaseConflictError","translateWhereConditions","RobotEntity","RealmRepositoryAdapter","RobotRepositoryAdapter","repository","realmRepository","ctx","findMany","query","qb","createQueryBuilder","groupBy","pagination","defaultAlias","fields","allowed","default","filters","maxLimit","relations","onJoin","_property","key","q","addGroupBy","sort","entities","total","getManyAndCount","data","meta","findOneById","id","findOneBy","findOneByName","name","realmKey","where","realm","resolve","andWhere","realmId","getOne","findOneByIdOrName","idOrName","findManyBy","findBy","findOneWithSecret","Object","entries","forEach","value","addSelect","create","merge","entity","save","remove","validateJoinColumns","dataSource","manager","connection","entityTarget","checkUniqueness","existing","isUnique","entityExisting","applyQuery","validateEntityJoinColumns","RobotPermissionEntity","translateWhereConditions","RobotPermissionRepositoryAdapter","repository","findMany","query","qb","createQueryBuilder","groupBy","pagination","defaultAlias","filters","allowed","relations","onJoin","_property","key","q","addGroupBy","sort","maxLimit","entities","total","getManyAndCount","data","meta","findOneById","id","findOneBy","findOneByName","_name","Promise","resolve","findOneByIdOrName","idOrName","findManyBy","where","findBy","create","merge","entity","save","remove","validateJoinColumns","dataSource","manager","connection","entityTarget","applyQuery","validateEntityJoinColumns","RobotRoleEntity","translateWhereConditions","RobotRoleRepositoryAdapter","repository","findMany","query","qb","createQueryBuilder","groupBy","pagination","defaultAlias","filters","allowed","relations","onJoin","_property","key","q","addGroupBy","sort","maxLimit","entities","total","getManyAndCount","data","meta","findOneById","id","findOneBy","findOneByName","_name","Promise","resolve","findOneByIdOrName","idOrName","findManyBy","where","findBy","create","merge","entity","save","remove","validateJoinColumns","dataSource","manager","connection","entityTarget","isUUID","applyQuery","isEntityUnique","validateEntityJoinColumns","DatabaseConflictError","translateWhereConditions","RoleEntity","RealmRepositoryAdapter","RoleRepositoryAdapter","repository","realmRepository","ctx","findMany","query","qb","createQueryBuilder","groupBy","pagination","defaultAlias","fields","allowed","filters","maxLimit","sort","entities","total","getManyAndCount","data","meta","findOneById","id","findOneBy","findOneByName","name","realmKey","where","realm","resolve","andWhere","realmId","getOne","findOneByIdOrName","idOrName","findManyBy","findBy","create","merge","entity","save","remove","validateJoinColumns","dataSource","manager","connection","entityTarget","checkUniqueness","existing","isUnique","entityExisting","applyQuery","validateEntityJoinColumns","RoleAttributeEntity","translateWhereConditions","RoleAttributeRepositoryAdapter","repository","findMany","query","qb","createQueryBuilder","groupBy","pagination","defaultAlias","filters","allowed","sort","maxLimit","entities","total","getManyAndCount","data","meta","findOneById","id","findOneBy","findOneByName","findOneByIdOrName","idOrName","findManyBy","where","findBy","create","merge","entity","save","remove","validateJoinColumns","dataSource","manager","connection","entityTarget","applyQuery","validateEntityJoinColumns","RolePermissionEntity","translateWhereConditions","RolePermissionRepositoryAdapter","repository","findMany","query","qb","createQueryBuilder","groupBy","pagination","defaultAlias","filters","allowed","relations","onJoin","_property","key","q","addGroupBy","sort","maxLimit","entities","total","getManyAndCount","data","meta","findOneById","id","findOneBy","findOneByName","_name","Promise","resolve","findOneByIdOrName","idOrName","findManyBy","where","findBy","create","merge","entity","save","remove","validateJoinColumns","dataSource","manager","connection","entityTarget","isUUID","applyQuery","isEntityUnique","validateEntityJoinColumns","DatabaseConflictError","translateWhereConditions","ScopeEntity","RealmRepositoryAdapter","ScopeRepositoryAdapter","repository","realmRepository","ctx","findMany","query","qb","createQueryBuilder","groupBy","pagination","defaultAlias","fields","allowed","filters","maxLimit","sort","entities","total","getManyAndCount","data","meta","findOneById","id","findOneBy","findOneByName","name","realmKey","where","realm","resolve","andWhere","realmId","getOne","findOneByIdOrName","idOrName","findManyBy","findBy","create","merge","entity","save","remove","validateJoinColumns","dataSource","manager","connection","entityTarget","checkUniqueness","existing","isUnique","entityExisting","isUUID","applyQuery","isEntityUnique","validateEntityJoinColumns","DatabaseConflictError","UserEntity","translateWhereConditions","RealmRepositoryAdapter","UserRepositoryAdapter","repository","realmRepository","ctx","findMany","query","qb","createQueryBuilder","groupBy","pagination","defaultAlias","fields","default","allowed","filters","maxLimit","relations","onJoin","_property","key","q","addGroupBy","sort","entities","total","getManyAndCount","extendManyWithEA","data","meta","findOneById","id","entity","findOneBy","extendOneWithEA","findOneByName","name","realmKey","where","realm","resolve","andWhere","realmId","getOne","findOneByIdOrName","idOrName","findOne","findManyBy","findBy","findOneByWithEmail","addSelect","translated","create","merge","save","remove","validateJoinColumns","dataSource","manager","connection","entityTarget","checkUniqueness","existing","isUnique","entityExisting","applyQuery","validateEntityJoinColumns","UserAttributeEntity","translateWhereConditions","UserAttributeRepositoryAdapter","repository","findMany","query","qb","createQueryBuilder","groupBy","pagination","defaultAlias","filters","allowed","sort","maxLimit","entities","total","getManyAndCount","data","meta","findOneById","id","findOneBy","findOneByName","findOneByIdOrName","idOrName","findManyBy","where","findBy","create","merge","entity","save","remove","validateJoinColumns","dataSource","manager","connection","entityTarget","applyQuery","validateEntityJoinColumns","UserPermissionEntity","translateWhereConditions","UserPermissionRepositoryAdapter","repository","findMany","query","qb","createQueryBuilder","groupBy","pagination","defaultAlias","filters","allowed","relations","onJoin","_property","key","q","addGroupBy","sort","maxLimit","entities","total","getManyAndCount","data","meta","findOneById","id","findOneBy","findOneByName","_name","Promise","resolve","findOneByIdOrName","idOrName","findManyBy","where","findBy","create","merge","entity","save","remove","validateJoinColumns","dataSource","manager","connection","entityTarget","applyQuery","validateEntityJoinColumns","UserRoleEntity","translateWhereConditions","UserRoleRepositoryAdapter","repository","findMany","query","qb","createQueryBuilder","groupBy","pagination","defaultAlias","filters","allowed","relations","onJoin","_property","key","q","addGroupBy","sort","maxLimit","entities","total","getManyAndCount","data","meta","findOneById","id","findOneBy","findOneByName","_name","Promise","resolve","findOneByIdOrName","idOrName","findManyBy","where","findBy","create","merge","entity","save","remove","validateJoinColumns","dataSource","manager","connection","entityTarget","applyQuery","validateEntityJoinColumns","IdentityProviderRoleMappingEntity","translateWhereConditions","IdentityProviderRoleMappingRepositoryAdapter","repository","findMany","query","qb","createQueryBuilder","groupBy","pagination","defaultAlias","filters","allowed","sort","relations","onJoin","_property","key","q","addGroupBy","maxLimit","entities","total","getManyAndCount","data","meta","findOneById","id","findOneBy","findOneByName","findOneByIdOrName","idOrName","findManyBy","where","findBy","create","merge","entity","save","remove","validateJoinColumns","dataSource","manager","connection","entityTarget","createDatabaseUniqueEntriesComponent","createOAuth2CleanerComponent","DatabaseInjectionKey","ModuleName","ComponentsModule","name","dependencies","COMPONENTS","DATABASE","setup","container","dataSource","resolve","DataSource","components","forEach","component","start","TypedToken","HTTPInjectionKey","Server","RequestHandlerOperation","setRequestEnv","useRequestEnv","sym","Symbol","useRequestPermissionEvaluator","req","instance","Error","setRequestPermissionEvaluator","ctx","IdentityType","REALM_MASTER_NAME","UnauthorizedError","setRequestEnv","useRequestEnv","sym","Symbol","RequestIdentity","raw","identity","clientId","type","CLIENT","data","id","client_id","realmId","realm_id","realm","realmName","name","useRequestIdentity","req","setRequestIdentity","input","useRequestIdentityOrFail","isRequestIdentityMasterRealmMember","useRequestPermissionEvaluator","useRequestIdentity","buildActorContext","req","identity","permissionEvaluator","raw","undefined","isUUID","useRequestBody","getRequestBodyRealmID","req","realmId","undefined","isUUID","useRequestParam","ValidupError","buildErrorMessageForAttribute","defineIssueItem","useRequestParamID","req","options","id","getRequestParamID","path","message","getRequestStringParam","undefined","key","value","length","getRequestStringParamOrFail","setRequestEnv","useRequestEnv","sym","Symbol","useRequestScopes","req","scopes","setRequestScopes","setRequestEnv","useRequestEnv","sym","Symbol","useRequestToken","req","setRequestToken","token","ScopeName","BuiltInPolicyType","PolicyData","useRequestIdentity","useRequestScopes","RequestPermissionEvaluator","req","evaluator","evaluate","ctx","extendContext","preEvaluate","preEvaluateOneOf","evaluateOneOf","scopes","includes","GLOBAL","input","set","IDENTITY","RoutupContainerAdapter","OAuth2Authorization","OAuth2AuthorizationCodeRequestValidator","useRequestIdentityOrFail","HTTPOAuth2Authorizer","codeRequestVerifier","requestValidator","ctx","validator","authorizeWithRequest","req","codeRequestValidated","validateWithRequest","data","verify","identity","authorize","raw","run","locations","OAuth2TokenGrant","useRequestBody","useRequestQuery","AuthorizationHeaderType","parseAuthorizationHeader","guessOauth2GrantTypeByRequest","request","grantType","validGrantTypes","Object","values","includes","username","password","PASSWORD","robotId","robotSecret","ROBOT_CREDENTIALS","refreshToken","REFRESH_TOKEN","code","AUTHORIZATION_CODE","clientId","clientSecret","authorization","headerValue","headers","header","type","BASIC","CLIENT_CREDENTIALS","undefined","OAuth2Error","useRequestBody","useRequestQuery","getRequestHeader","getRequestIP","OAuth2AuthorizeGrant","HTTPOAuth2AuthorizeGrant","codeVerifier","ctx","runWithRequest","req","code","extractParam","redirectUri","requestInvalid","entity","verify","runWith","ipAddress","trustProxy","userAgent","key","value","length","undefined","OAuth2Error","useRequestBody","ClientError","AuthorizationHeaderType","parseAuthorizationHeader","getRequestHeader","getRequestIP","ClientCredentialsGrant","HTTPClientCredentialsGrant","authenticator","ctx","runWithRequest","req","clientId","clientSecret","realmId","authorization","headerValue","headers","credentialsInvalid","header","type","BASIC","requestInvalid","username","password","client","authenticate","runWith","ipAddress","trustProxy","userAgent","getRequestHeader","getRequestIP","IdentityGrantType","useRequestIdentityOrFail","HTTPOAuth2IdentityGrantType","runWithRequest","req","identity","runWith","raw","ipAddress","trustProxy","userAgent","useRequestBody","getRequestHeader","getRequestIP","PasswordGrantType","HTTPPasswordGrant","authenticator","ctx","runWithRequest","req","username","password","realm_id","realmId","data","authenticate","runWith","ipAddress","trustProxy","userAgent","useRequestBody","getRequestHeader","getRequestIP","OAuth2RefreshTokenGrant","HTTPOAuth2RefreshTokenGrant","runWithRequest","req","refreshToken","runWith","ipAddress","trustProxy","userAgent","useRequestBody","getRequestHeader","getRequestIP","RobotCredentialsGrant","HTTPRobotCredentialsGrant","authenticator","ctx","runWithRequest","req","id","secret","realm_id","realmId","entity","authenticate","runWith","ipAddress","trustProxy","userAgent","PermissionEvaluator","IdentityType","ScopeName","HTTPError","JWTError","OAuth2TokenKind","deserializeOAuth2Scope","AuthorizationHeaderType","parseAuthorizationHeader","ClientAuthenticator","PolicyEngine","RobotAuthenticator","UserAuthenticator","RequestPermissionEvaluator","setRequestIdentity","setRequestPermissionEvaluator","setRequestScopes","setRequestToken","AuthorizationMiddleware","options","oauth2TokenVerifier","permissionEvaluator","identityResolver","sessionManager","clientAuthenticator","robotAuthenticator","userAuthenticator","ctx","provider","permissionProvider","policyEngine","identityPermissionProvider","realmId","clientId","run","request","response","next","requestAccessContext","authorization","headerValue","headers","header","type","BEARER","verifyBearerAuthorizationHeader","BASIC","verifyBasicAuthorizationHeader","unsupportedHeaderType","e","payload","verify","token","kind","ACCESS","payloadPropertyInvalid","realm_id","scope","session_id","session","findOneById","expired","ping","sub_kind","sub","identity","resolve","clientAuthBasic","authenticator","safeAuthenticate","username","password","success","GLOBAL","CLIENT","data","userAuthBasic","authenticated","USER","robotAuthBasic","ROBOT","coreHandler","AuthorizationMiddleware","createAuthorizationMiddleware","ctx","middleware","request","response","next","run","useRequestIdentityOrFail","ForceLoggedInMiddleware","run","request","response","next","UnauthorizedError","useRequestIdentity","ForceUserLoggedInMiddleware","run","request","response","next","identity","type","path","fileURLToPath","CODE_PATH","dirname","url","PACKAGE_PATH","join","SRC_PATH","DIST_PATH","CLIENT_WEB_SLIM_PACKAGE_PATH","load","CodeTransformation","isCodeTransformation","createHandler","path","coreHandler","setRequestParam","CLIENT_WEB_SLIM_PACKAGE_PATH","DIST_PATH","PACKAGE_PATH","registerAssetsMiddleware","router","JUST_IN_TIME","use","posix","join","fallthrough","scan","vite","server","createServer","root","base","logLevel","middlewareMode","watch","usePolling","interval","appType","req","res","next","middlewares","basic","registerBasicMiddleware","router","input","use","cors","coreHandler","merge","registerCorsMiddleware","router","input","options","origin","_origin","callback","credentials","use","req","res","next","BadRequestErrorOptions","ConflictErrorOptions","HTTPError","InsufficientStorageErrorOptions","InternalServerErrorOptions","AuthupError","EntityRelationLookupError","buildErrorMessageForAttributes","isValidupError","stringifyPath","hasOwnProperty","isObject","sanitizeError","input","statusCode","code","message","stack","paths","issues","map","issue","path","error","push","data","undefined","isSelfToken","id","isObject","errorHandler","send","useLogger","sanitizeError","registerErrorMiddleware","router","use","error","request","response","next","cause","payload","statusCode","code","message","issues","isServerError","data","keys","Object","key","morgan","coreHandler","getRequestIP","useRequestPath","useLogger","EnvironmentName","useRequestIdentity","createLoggerMiddleware","options","request","response","next","tokens","req","res","parts","trustProxy","identity","push","type","id","method","url","status","join","stream","write","message","env","TEST","http","replace","skip","path","length","PRODUCTION","statusCode","prometheus","useRequestPath","registerPrometheusMiddleware","router","input","options","skip","req","path","startsWith","use","rateLimit","merge","useRequestIdentity","registerRateLimitMiddleware","router","input","options","max","req","identity","type","windowMs","use","fs","path","process","swaggerUI","buildFilePath","load","locate","AuthupError","createSwaggerMiddleware","input","documentPath","isAbsolute","join","cwd","locatorInfo","existsSync","document","options","OAuth2SubKind","DBody","DController","DDelete","DGet","DPath","DPost","DPut","DRequest","DResponse","DTags","NotFoundError","send","sendAccepted","sendCreated","useRequestParam","useRequestQuery","OAuth2ScopeAttributesResolver","ForceLoggedInMiddleware","isSelfToken","buildActorContext","useRequestIdentity","useRequestScopes","ClientController","service","repository","ctx","getMany","req","res","actor","data","meta","get","id","identity","isMe","type","attributesResolver","attributes","resolveFor","CLIENT","entity","findOneByIdOrName","attribute","attr","withSecret","findOneWithSecret","secret","getOne","add","create","edit","update","put","created","save","undefined","drop","delete","DBody","DController","DDelete","DGet","DPath","DPost","DRequest","DResponse","DTags","send","sendAccepted","sendCreated","useRequestQuery","ForceLoggedInMiddleware","buildActorContext","ClientPermissionController","service","ctx","getMany","req","res","actor","data","meta","add","entity","create","edit","id","update","getOne","drop","delete","createValidationChain","createValidator","Container","RequestHandlerOperation","ClientPermissionRequestValidator","initialize","mount","group","CREATE","chain","exists","isUUID","optional","values","createValidationChain","createValidator","Container","RequestHandlerOperation","ClientRoleRequestValidator","initialize","mount","group","CREATE","chain","exists","isUUID","DBody","DController","DDelete","DGet","DPath","DPost","DRequest","DResponse","DTags","ForbiddenError","send","sendAccepted","sendCreated","useRequestQuery","ForceLoggedInMiddleware","buildActorContext","useRequestIdentityOrFail","ClientRoleController","service","repository","identityPermissionProvider","ctx","getMany","req","res","actor","data","meta","add","validateJoinColumns","role","identity","hasPermissions","isSuperset","type","id","clientId","client_id","entity","create","getOne","drop","delete","DBody","DController","DDelete","DGet","DPath","DPost","DRequest","DResponse","DTags","send","sendAccepted","sendCreated","useRequestQuery","ForceLoggedInMiddleware","buildActorContext","ClientScopeController","service","ctx","getMany","req","res","actor","data","meta","add","entity","create","getOne","id","drop","delete","createValidationChain","createValidator","Container","RequestHandlerOperation","ClientScopeRequestValidator","initialize","mount","group","CREATE","chain","exists","isUUID","BuiltInPolicyType","PolicyData","base64URLDecode","isUUID","DBody","DController","DDelete","DGet","DPath","DPost","DPut","DRequest","DResponse","DTags","getRequestHeader","getRequestIP","send","sendAccepted","sendCreated","sendRedirect","useRequestParam","IdentityProviderAttributesValidator","IdentityProviderValidator","IdentityType","PermissionName","ValidatorGroup","isOAuth2IdentityProvider","isOpenIDIdentityProvider","BadRequestError","NotFoundError","useRequestQuery","OAuth2Error","URL","RoutupContainerAdapter","OAuth2AuthorizationCodeRequestValidator","createIdentityProviderOAuth2Authenticator","getRequestBodyRealmID","getRequestParamID","useRequestIdentityOrFail","useRequestParamID","useRequestPermissionEvaluator","ForceLoggedInMiddleware","IdentityProviderController","options","repository","realmRepository","accountManager","codeRequestVerifier","codeRequestValidator","stateManager","codeIssuer","ctx","getProviders","req","res","data","meta","findMany","permissionEvaluator","preEvaluate","name","IDENTITY_PROVIDER_READ","datum","evaluate","input","ATTRIBUTES","getProvider","id","paramId","entity","findOneByIdOrName","editProvider","user","write","updateOnly","put","dropProvider","IDENTITY_PROVIDER_DELETE","findOneBy","entityId","remove","addProvider","authorizeOut","_id","resolve","authenticator","provider","baseURL","parameters","codeRequest","query","codeRequestDecoded","JSON","parse","requestInvalid","codeRequestValidated","run","verify","client","realm_id","state","saveAuthorizationState","buildRedirectURL","authorizeIn","Error","protocol","verifyAuthorizationState","code","clientId","client_id","authenticate","realm","authorizationCode","issue","response_type","redirect_uri","scope","type","USER","codeRequestKeys","Object","keys","url","codeRequestKey_","codeRequestKey","searchParams","set","href","group","realmId","where","IDENTITY_PROVIDER_UPDATE","UPDATE","IDENTITY_PROVIDER_CREATE","CREATE","validator","attributesValidator","attributes","validateJoinColumns","identity","checkUniqueness","undefined","merge","saveWithEA","create","findOneById","save","ip","trustProxy","userAgent","stateInvalid","createValidationChain","createValidator","Container","RequestHandlerOperation","IdentityProviderRoleMappingRequestValidator","initialize","mount","group","CREATE","chain","exists","isUUID","optional","isString","values","isBoolean","DBody","DController","DDelete","DGet","DPath","DPost","DRequest","DResponse","DTags","BuiltInPolicyType","PolicyData","BadRequestError","ForbiddenError","NotFoundError","PermissionName","send","sendAccepted","sendCreated","useRequestQuery","RoutupContainerAdapter","ForceLoggedInMiddleware","IdentityProviderRoleMappingRequestValidator","RequestHandlerOperation","useRequestIdentityOrFail","useRequestParamID","useRequestPermissionEvaluator","OAuth2ProviderRoleController","repository","identityPermissionProvider","ctx","getProviders","req","res","permissionEvaluator","preEvaluateOneOf","name","IDENTITY_PROVIDER_READ","IDENTITY_PROVIDER_UPDATE","IDENTITY_PROVIDER_DELETE","data","meta","findMany","getProvider","id","paramId","entity","findOneBy","editProvider","user","preEvaluate","IDENTITY_PROVIDER_ROLE_UPDATE","validator","validatorAdapter","run","group","UPDATE","validateJoinColumns","merge","evaluate","input","ATTRIBUTES","save","dropProvider","IDENTITY_PROVIDER_ROLE_DELETE","entityId","remove","addProvider","IDENTITY_PROVIDER_ROLE_CREATE","CREATE","provider","provider_realm_id","realm_id","role","role_realm_id","identity","hasPermissions","isSuperset","type","role_id","clientId","client_id","create","BuiltInPolicyType","PermissionEvaluator","PolicyData","DBody","DController","DDelete","DGet","DPath","DPost","DPut","DRequest","DResponse","DTags","isUUID","NotFoundError","send","sendAccepted","sendCreated","useRequestParam","useRequestQuery","PolicyEngine","ForceLoggedInMiddleware","buildActorContext","useRequestIdentity","PermissionController","service","repository","realmRepository","identityPermissionProvider","permissionProvider","ctx","getMany","req","res","actor","data","meta","add","entity","create","check","id","criteria","realm","resolve","name","realm_id","findOneBy","IDENTITY","input","permissionEvaluator","provider","policyEngine","output","has","ATTRIBUTES","evaluate","preEvaluate","status","e","get","getOne","edit","update","put","created","save","undefined","drop","delete","DBody","DController","DDelete","DGet","DPath","DPost","DRequest","DResponse","DTags","send","sendAccepted","sendCreated","useRequestQuery","ForceLoggedInMiddleware","buildActorContext","PermissionPolicyController","service","ctx","getMany","req","res","actor","data","meta","add","entity","create","getOne","id","drop","delete","createValidationChain","createValidator","Container","ActivateRequestValidator","initialize","mount","chain","exists","notEmpty","isLength","min","max","DBody","DController","DPost","DRequest","DResponse","sendAccepted","ActivateRequestValidator","ActivateController","service","ctx","execute","data","req","res","validator","validated","run","activate","DController","DGet","DPost","DRequest","DResponse","load","fs","path","URL","send","useRequestParam","RoutupContainerAdapter","CodeTransformation","isCodeTransformation","CLIENT_WEB_SLIM_PACKAGE_PATH","ForceUserLoggedInMiddleware","HTTPOAuth2Authorizer","OAuth2AuthorizationCodeRequestValidator","sanitizeError","AuthorizeController","options","codeRequestVerifier","codeRequestValidator","authorizer","ctx","validator","accessTokenIssuer","openIdTokenIssuer","codeIssuer","identityResolver","confirm","req","res","result","authorizeWithRequest","url","redirectUri","state","searchParams","set","authorizationCode","accessToken","idToken","href","serve","codeRequest","client","scopes","error","data","run","locations","verify","e","normalized","message","isJIT","JUST_IN_TIME","payload","config","baseURL","html","manifest","render","clientWebSlimPackagePath","vite","promises","readFile","join","transformIndexHtml","ssrLoadModule","JSON","parse","appHtml","preloadLinks","replace","AsymmetricKey","JWKType","send","In","BadRequestError","NotFoundError","getRequestStringParam","getRequestStringParamOrFail","getJwksRouteHandler","req","res","repository","realmIdParamKey","realmId","entities","find","where","type","RSA","EC","realm_id","order","priority","promises","filter","entity","encryption_key","map","fromBase64","format","key","options","buildImportOptionsForJWTAlgorithm","signature_algorithm","then","container","toJWK","kid","id","alg","keys","Promise","all","getJwkRouteHandler","idParamKey","findOne","jsonWebKey","JWKType","AsymmetricKey","DController","DGet","DPath","DRequest","DResponse","send","In","BadRequestError","NotFoundError","getRequestStringParam","JwkController","repository","ctx","getManyJwks","req","res","realmId","entities","find","where","type","RSA","EC","realm_id","order","priority","promises","filter","entity","encryption_key","map","fromBase64","format","key","options","buildImportOptionsForJWTAlgorithm","signature_algorithm","then","container","toJWK","kid","id","alg","keys","Promise","all","getOneJwks","findOne","jsonWebKey","OAuth2AuthorizationResponseType","DController","DGet","OpenIDController","options","getOpenIdConfiguration","issuer","baseURL","authorization_endpoint","URL","href","jwks_uri","response_types_supported","CODE","TOKEN","NONE","subject_types_supported","id_token_signing_alg_values_supported","token_endpoint","introspection_endpoint","revocation_endpoint","service_documentation","userinfo_endpoint","DBody","DController","DPost","DRequest","DResponse","sendAccepted","PasswordForgotController","service","ctx","execute","data","req","res","result","forgotPassword","DBody","DController","DPost","DRequest","DResponse","sendAccepted","PasswordResetController","service","ctx","execute","data","req","res","result","resetPassword","DBody","DController","DPost","DRequest","DResponse","sendAccepted","RegisterController","service","ctx","execute","data","req","res","result","register","DController","DGet","load","path","PACKAGE_PATH","StatusController","status","pkgJson","join","isoDate","Date","toISOString","version","date","OAuth2Error","OAuth2ErrorCode","AuthupError","isObject","sanitizeError","toOAuth2Error","err","next","data","error","INVALID_REQUEST","error_description","message","createValidationChain","createValidator","Container","TokenRequestValidator","initialize","mount","chain","exists","notEmpty","isString","isLength","min","max","RoutupContainerAdapter","ValidupError","buildErrorMessageForAttribute","defineIssueItem","useRequestToken","TokenRequestValidator","extractTokenFromRequest","req","token","validator","validatorAdapter","data","run","locations","path","message","OAuth2Error","OAuth2TokenGrant","DController","DGet","DPost","DRequest","DResponse","DTags","sendAccepted","buildPermissionKey","toOAuth2Error","OAuth2OpenIDClaimsBuilder","HTTPClientCredentialsGrant","HTTPOAuth2AuthorizeGrant","HTTPOAuth2RefreshTokenGrant","HTTPPasswordGrant","HTTPRobotCredentialsGrant","guessOauth2GrantTypeByRequest","extractTokenFromRequest","TokenController","refreshTokenIssuer","accessTokenIssuer","tokenVerifier","tokenRevoker","identityResolver","identityPermissionProvider","tokenGrants","ctx","AUTHORIZATION_CODE","codeVerifier","sessionManager","CLIENT_CREDENTIALS","authenticator","clientAuthenticator","ROBOT_CREDENTIALS","robotAuthenticator","PASSWORD","userAuthenticator","REFRESH_TOKEN","getIntrospect","req","postIntrospect","token","payload","verify","skipActiveCheck","sub","sub_kind","identityInvalid","permissions","getFor","id","type","clientId","client_id","realmId","realm_id","identity","resolve","claimsBuilder","claims","fromIdentity","active","jti","isInactive","Object","values","reduce","acc","binding","key","permission","name","e","revokeToken","res","revoke","createToken","grantType","grantInvalid","grant","runWithRequest","DBody","DController","DDelete","DGet","DPath","DPost","DPut","DRequest","DResponse","DTags","OAuth2AuthorizationResponseType","send","sendAccepted","sendCreated","useRequestQuery","getJwkRouteHandler","getJwksRouteHandler","ForceLoggedInMiddleware","buildActorContext","RealmController","options","service","keyRepository","ctx","getMany","req","res","data","meta","add","actor","entity","create","get","id","getOne","getOpenIdConfiguration","issuer","baseURL","authorization_endpoint","URL","href","jwks_uri","response_types_supported","CODE","TOKEN","NONE","subject_types_supported","id_token_signing_alg_values_supported","token_endpoint","introspection_endpoint","revocation_endpoint","service_documentation","userinfo_endpoint","getCerts","getCert","keyId","edit","update","put","created","save","undefined","drop","delete","OAuth2SubKind","DBody","DController","DDelete","DGet","DPath","DPost","DPut","DRequest","DResponse","DTags","isUUID","NotFoundError","send","sendAccepted","sendCreated","useRequestParam","useRequestQuery","OAuth2ScopeAttributesResolver","RobotEntity","ForceLoggedInMiddleware","isSelfToken","buildActorContext","useRequestIdentity","useRequestScopes","RobotController","service","repository","realmRepository","dataSource","ctx","getMany","req","res","actor","data","meta","add","entity","save","undefined","getOne","id","identity","isMe","type","realm","resolve","realmId","name","attributesResolver","attributes","resolveFor","ROBOT","resolvedId","findOneByIdOrName","robotRepository","getRepository","validAttributes","metadata","columns","map","column","databaseName","attribute","isValid","includes","withSecret","findOneWithSecret","secret","edit","updateOnly","put","created","drop","delete","DBody","DController","DDelete","DGet","DPath","DPost","DRequest","DResponse","DTags","send","sendAccepted","sendCreated","useRequestQuery","ForceLoggedInMiddleware","buildActorContext","RobotPermissionController","service","ctx","getMany","req","res","actor","data","meta","add","entity","create","edit","id","update","getOne","drop","delete","createValidationChain","createValidator","Container","RequestHandlerOperation","RobotPermissionRequestValidator","initialize","mount","group","CREATE","chain","exists","isUUID","optional","values","DBody","DController","DDelete","DGet","DPath","DPost","DRequest","DResponse","DTags","ForbiddenError","send","sendAccepted","sendCreated","useRequestQuery","ForceLoggedInMiddleware","buildActorContext","useRequestIdentityOrFail","RobotRoleController","service","repository","identityPermissionProvider","ctx","getMany","req","res","actor","data","meta","add","validateJoinColumns","role","identity","hasPermissions","isSuperset","type","id","role_id","clientId","client_id","entity","create","getOne","drop","delete","createValidationChain","createValidator","Container","RequestHandlerOperation","RobotRoleRequestValidator","initialize","mount","group","CREATE","chain","exists","isUUID","DBody","DController","DDelete","DGet","DPath","DPost","DPut","DRequest","DResponse","DTags","send","sendAccepted","sendCreated","useRequestQuery","ForceLoggedInMiddleware","buildActorContext","RoleController","service","ctx","getMany","req","res","actor","data","meta","add","entity","create","get","id","getOne","edit","update","put","created","save","undefined","drop","delete","DBody","DController","DDelete","DGet","DPath","DPost","DRequest","DResponse","DTags","send","sendAccepted","sendCreated","useRequestQuery","ForceLoggedInMiddleware","buildActorContext","RoleAttributeController","service","ctx","getMany","req","res","actor","data","meta","add","entity","create","get","id","getOne","edit","update","drop","delete","createValidationChain","createValidator","Container","RequestHandlerOperation","RoleAttributeRequestValidator","initialize","mount","group","CREATE","chain","exists","notEmpty","isString","isLength","min","max","isUUID","optional","values","DBody","DController","DDelete","DGet","DPath","DPost","DRequest","DResponse","DTags","send","sendAccepted","sendCreated","useRequestQuery","ForceLoggedInMiddleware","buildActorContext","RolePermissionController","service","ctx","getMany","req","res","actor","data","meta","add","entity","create","edit","id","update","getOne","drop","delete","createValidationChain","createValidator","Container","RequestHandlerOperation","RolePermissionRequestValidator","initialize","mount","group","CREATE","chain","exists","isUUID","optional","values","BuiltInPolicyType","PolicyData","definePolicyEvaluationContext","isUUID","NotFoundError","DBody","DController","DDelete","DGet","DPath","DPost","DPut","DRequest","DResponse","DTags","useRequestQuery","send","sendAccepted","sendCreated","useRequestParam","PolicyEngine","ForceLoggedInMiddleware","buildActorContext","useRequestIdentity","PolicyController","service","repository","realmRepository","identityPermissionProvider","ctx","getMany","req","res","actor","data","meta","getOneExpanded","id","getOne","expanded","options","entity","check","paramId","criteria","realm","resolve","name","realm_id","findOneBy","IDENTITY","policyEngine","output","evaluate","status","e","update","replace","created","save","undefined","drop","delete","create","AttributeNamesPolicyValidator","AttributesPolicyValidator","BuiltInPolicyType","DatePolicyValidator","TimePolicyValidator","omitRecord","Container","PolicyAttributesValidator","attributeNames","attributesOptionsValidator","attributeNamesOptionsValidator","dateOptionsValidator","timeOptionsValidator","options","run","data","attributes","type","ATTRIBUTES","ATTRIBUTE_NAMES","DATE","TIME","BuiltInPolicyType","isPolicyNameValid","isObject","Container","createValidationChain","createValidator","RequestHandlerOperation","PolicyAttributesValidator","PolicyValidator","initialize","nameValidator","chain","exists","notEmpty","isString","isLength","min","max","custom","value","throwOnFailure","mount","group","CREATE","UPDATE","optional","values","isBoolean","isUUID","ctx","Array","isArray","undefined","data","type","COMPOSITE","promises","map","child","run","flat","path","Promise","all","DBody","DController","DDelete","DGet","DPath","DPost","DPut","DRequest","DResponse","DTags","send","sendAccepted","sendCreated","useRequestQuery","ForceLoggedInMiddleware","buildActorContext","ScopeController","service","ctx","getMany","req","res","actor","data","meta","add","entity","create","get","id","getOne","edit","update","put","created","save","undefined","drop","delete","DBody","DController","DDelete","DGet","DPath","DPost","DPut","DRequest","DResponse","DTags","send","sendAccepted","sendCreated","useRequestParam","useRequestQuery","ForceLoggedInMiddleware","isSelfToken","buildActorContext","UserController","service","ctx","getMany","req","res","actor","data","meta","get","id","paramId","identity","type","entity","getOne","add","create","edit","update","put","created","save","undefined","drop","delete","DBody","DController","DDelete","DGet","DPath","DPost","DRequest","DResponse","DTags","send","sendAccepted","sendCreated","useRequestQuery","ForceLoggedInMiddleware","buildActorContext","UserAttributeController","service","ctx","getMany","req","res","actor","data","meta","add","entity","create","get","id","getOne","edit","update","drop","delete","createValidationChain","createValidator","Container","RequestHandlerOperation","UserAttributeRequestValidator","initialize","mount","group","CREATE","chain","exists","notEmpty","isString","isLength","min","max","optional","isUUID","values","nullable","DBody","DController","DDelete","DGet","DPath","DPost","DRequest","DResponse","DTags","send","sendAccepted","sendCreated","useRequestQuery","ForceLoggedInMiddleware","buildActorContext","UserPermissionController","service","ctx","getMany","req","res","actor","data","meta","add","entity","create","edit","id","update","getOne","drop","delete","createValidationChain","createValidator","Container","RequestHandlerOperation","UserPermissionRequestValidator","initialize","mount","group","CREATE","chain","exists","isUUID","optional","values","DBody","DController","DDelete","DGet","DPath","DPost","DRequest","DResponse","DTags","ForbiddenError","send","sendAccepted","sendCreated","useRequestQuery","ForceLoggedInMiddleware","buildActorContext","useRequestIdentityOrFail","UserRoleController","service","repository","identityPermissionProvider","ctx","getMany","req","res","actor","data","meta","add","validateJoinColumns","role","identity","hasPermissions","isSuperset","type","id","role_id","clientId","client_id","entity","create","getOne","drop","delete","createValidationChain","createValidator","Container","RequestHandlerOperation","UserRoleRequestValidator","initialize","mount","group","CREATE","chain","exists","isUUID","http","createNodeDispatcher","createHttpServer","router","Server","Version","generate","fs","path","DIST_PATH","SRC_PATH","Swagger","distPath","srcPath","entrypointPath","options","join","canGenerate","stats","promises","stat","isDirectory","version","V2","metadata","cache","entryPoint","cwd","pattern","ignore","allow","servers","baseURL","name","outputDirectory","securityDefinitions","bearer","type","in","oauth2","flows","password","tokenUrl","URL","href","basicAuth","schema","consumes","produces","exists","access","constants","R_OK","F_OK","TypedToken","OAuth2InjectionToken","ClientRepository","ScopeRepository","AuthorizationCodeIssuer","AuthorizationCodeRepository","AuthorizationCodeVerifier","AuthorizationStateManager","AuthorizationCodeRequestVerifier","AuthorizationStateRepository","KeyRepository","AccessTokenIssuer","OpenIDTokenIssuer","RefreshTokenIssuer","TokenRepository","TokenRevoker","TokenSigner","TokenVerifier","CacheOAuth2Prefix","buildCacheKey","randomBytes","CacheOAuth2Prefix","OAuth2AuthorizationCodeRepository","cache","findOneById","id","entity","get","prefix","AUTHORIZATION_CODE","key","popOneById","pop","save","input","options","ttl","maxAge","toString","set","remove","removeById","drop","createNanoID","buildCacheKey","CacheOAuth2Prefix","OAuth2AuthorizationStateRepository","cache","findOneById","key","id","prefix","AUTHORIZATION_CODE","payload","get","remove","drop","insert","data","state","set","ttl","isUUID","OAuth2ClientRepository","repository","findOneByIdOrName","key","realmKey","query","createQueryBuilder","leftJoinAndSelect","where","id","name","andWhere","realmId","realmName","getOne","OAuth2ScopeRepository","repository","findByClientId","clientId","clientScopes","find","where","client_id","relations","scope","map","clientScope","AsymmetricKey","CryptoAsymmetricAlgorithm","createAsymmetricKeyPair","JWKType","JWTAlgorithm","useDataSource","KeyEntity","OAuth2KeyRepository","findByRealmId","realmId","createOrGet","realm_id","findById","id","where","dataSource","repository","getRepository","entity","findOne","select","type","signature_algorithm","encryption_key","decryption_key","keyPair","name","RSASSA_PKCS1_V1_5","privateKeyContainer","privateKey","publicKeyContainer","publicKey","create","RSA","toBase64","RS256","save","buildCacheKey","randomUUID","CacheOAuth2Prefix","OAuth2TokenRepository","cache","findOneBySignature","signature","get","prefix","TOKEN_CLAIMS","key","findOneById","id","TOKEN","removeById","token","drop","setInactive","exp","insert","payload","jti","set","ttl","buildTTL","save","saveWithSignature","data","normalized","isInactive","cacheKey","TOKEN_INACTIVE","response","utc","Date","now","TypedToken","IdentityInjectionKey","Resolver","ProviderAccountManager","ProviderLdapCollectionAuthenticator","useDataSource","IdentityProviderAccountEntity","IdentityProviderAccountRepository","findOneByProviderIdentity","identity","dataSource","repository","getRepository","findOne","where","provider_user_id","id","provider_id","provider","relations","save","entity","useDataSource","IdentityProviderAttributeMappingEntity","IdentityProviderAttributeMappingRepository","findByProviderId","providerId","dataSource","repository","getRepository","findBy","provider_id","useDataSource","IdentityProviderPermissionMappingEntity","IdentityProviderPermissionMappingRepository","findByProviderId","providerId","dataSource","repository","getRepository","findBy","provider_id","useDataSource","IdentityProviderRoleMappingEntity","IdentityProviderRoleMappingRepository","findByProviderId","providerId","dataSource","repository","getRepository","findBy","provider_id","buildRedisKeyPath","isUUID","CachePrefix","ClientIdentityRepository","repository","findOneById","id","find","findOneByName","realm","findOneByIdOrName","idOrName","findOneBy","where","key","realmKey","query","createQueryBuilder","leftJoinAndSelect","isId","name","andWhere","realmId","realmName","columns","metadata","column","isSelect","addSelect","databaseName","cache","prefix","CLIENT","getOne","buildRedisKeyPath","isUUID","CachePrefix","RobotIdentityRepository","repository","findOneById","id","find","findOneByName","realm","findOneByIdOrName","idOrName","findOneBy","where","key","realmKey","query","createQueryBuilder","leftJoinAndSelect","isId","name","andWhere","realmId","realmName","columns","metadata","column","isSelect","addSelect","databaseName","cache","prefix","ROBOT","getOne","isUUID","buildRedisKeyPath","In","IdentityProviderMapperOperation","CachePrefix","UserIdentityRepository","repository","userPermissionRepository","userRoleRepository","ctx","findOneById","id","find","findOneByName","realm","findOneByIdOrName","idOrName","findOneBy","where","key","realmKey","query","createQueryBuilder","leftJoinAndSelect","isId","name","andWhere","realmId","realmName","columns","metadata","column","isSelect","addSelect","databaseName","cache","prefix","USER","entity","getOne","extendOneWithEA","saveOneWithEA","user","extraAttributes","create","savePermissions","items","ids","map","item","value","idsToDelete","filter","operation","DELETE","entities","findBy","user_id","permission_id","entitiesToDelete","index","indexOf","push","length","remove","entitiesToCreate","CREATE","findIndex","user_realm_id","realm_id","permission_realm_id","save","saveRoles","role_id","role_realm_id","TypedToken","LDAPInjectionKey","ClientFactory","ldap","LdapClient","options","driver","createClient","url","tlsOptions","tls","connectTimeout","connect","Promise","resolve","reject","listener","startTLS","starttls","err","connected","errorListener","error","once","bind","user","password","then","Error","catch","e","unbind","add","name","data","del","modify","change","search","dn","resolveDn","baseDn","scope","res","entries","on","searchEntry","entry","pojo","objectName","i","attributes","length","attribute","type","Array","isArray","values","map","el","trim","filter","Boolean","push","searchResult","status","input","output","parseDN","childOf","equals","SyntaxError","isDn","DN","isDN","fromString","test","LdapClient","LdapClientFactory","create","options","LdapClientFactory","ModuleName","LDAPInjectionKey","LdapModule","name","LDAP","setup","container","register","ClientFactory","useFactory","ClientIdentityRepository","IdentityProviderAccountRepository","IdentityProviderAttributeMappingRepository","IdentityProviderPermissionMappingRepository","IdentityProviderRoleMappingRepository","RobotIdentityRepository","UserIdentityRepository","DatabaseInjectionKey","IdentityProviderRepositoryAdapter","ClientRepository","IdentityProviderRepository","RealmEntity","RobotRepository","UserPermissionEntity","UserRepository","UserRoleEntity","IdentityProviderAccountManager","IdentityProviderAttributeMapper","IdentityProviderLdapCollectionAuthenticator","IdentityProviderPermissionMapper","IdentityProviderRoleMapper","IdentityResolver","LDAPInjectionKey","ModuleName","IdentityInjectionKey","IdentityModule","name","dependencies","IDENTITY","DATABASE","setup","container","dataSource","resolve","DataSource","clientRepository","robotRepository","userRepository","repository","userPermissionRepository","userRoleRepository","register","Resolver","useFactory","attributeMapperRepository","attributeMapper","roleMapperFinder","roleMapper","permissionMapperRepository","permissionMapper","providerAccountRepository","ProviderAccountManager","identityProviderRepository","realmRepository","ProviderLdapCollectionAuthenticator","c","accountManager","clientFactory","ClientFactory","CacheInjectionKey","ModuleName","OAuth2AuthorizationCodeRepository","OAuth2AuthorizationStateRepository","OAuth2ClientRepository","OAuth2KeyRepository","OAuth2ScopeRepository","OAuth2TokenRepository","OAuth2AccessTokenIssuer","OAuth2AuthorizationCodeIssuer","OAuth2AuthorizationCodeRequestVerifier","OAuth2AuthorizationCodeVerifier","OAuth2AuthorizationStateManager","OAuth2OpenIDTokenIssuer","OAuth2RefreshTokenIssuer","OAuth2TokenRevoker","OAuth2TokenSigner","OAuth2TokenVerifier","OAuth2InjectionToken","IdentityInjectionKey","ClientEntity","ClientScopeEntity","ConfigInjectionKey","OAuth2Module","name","dependencies","OAUTH2","DATABASE","CACHE","CONFIG","IDENTITY","setup","container","config","resolve","register","ClientRepository","useFactory","c","repository","ScopeRepository","AuthorizationCodeRepository","cache","AuthorizationStateRepository","TokenRepository","KeyRepository","TokenSigner","keyRepository","AuthorizationCodeIssuer","codeRepository","maxAge","tokenAccessMaxAge","AuthorizationCodeVerifier","AuthorizationCodeRequestVerifier","clientRepository","clientScopeRepository","scopeRepository","AuthorizationStateManager","stateRepository","TokenRevoker","tokenRepository","TokenVerifier","AccessTokenIssuer","tokenSigner","issuer","publicUrl","RefreshTokenIssuer","tokenRefreshMaxAge","OpenIDTokenIssuer","signer","identityResolver","Resolver","options","TypedToken","MailInjectionKey","createTransport","createSMTPClient","options","transport","connectionString","auth","user","password","type","pass","host","port","secure","ssl","opportunisticTLS","starttls","tls","rejectUnauthorized","createSMTPClient","SMTPMailClientAdapter","transporter","input","createDriver","connectionString","send","options","sendMail","VoidMailClientAdapter","send","_options","Promise","resolve","undefined","ModuleName","SMTPMailClientAdapter","VoidMailClientAdapter","MailInjectionKey","ConfigInjectionKey","MailModule","name","dependencies","MAIL","CONFIG","setup","container","result","tryResolve","success","data","smtp","register","useFactory","decorators","useRequestBody","useRequestCookie","useRequestCookies","useRequestQuery","ClientEntity","ClientPermissionEntity","ClientRepository","ClientRoleEntity","ClientScopeEntity","IdentityProviderRepository","IdentityProviderRoleMappingEntity","KeyEntity","PermissionEntity","PermissionPolicyEntity","PolicyRepository","RealmEntity","RobotEntity","RobotPermissionEntity","RobotRepository","RobotRoleEntity","RoleAttributeEntity","RoleEntity","RolePermissionEntity","RoleRepository","ScopeEntity","UserAttributeEntity","UserPermissionEntity","UserRepository","UserRoleEntity","ClientPermissionRepositoryAdapter","ClientRepositoryAdapter","ClientRoleRepositoryAdapter","ClientScopeRepositoryAdapter","DatabaseInjectionKey","IdentityProviderRepositoryAdapter","IdentityProviderRoleMappingRepositoryAdapter","PermissionDatabaseProvider","PermissionPolicyRepositoryAdapter","PermissionRepositoryAdapter","PolicyRepositoryAdapter","RealmRepositoryAdapter","RobotPermissionRepositoryAdapter","RobotRepositoryAdapter","RobotRoleRepositoryAdapter","RoleAttributeRepositoryAdapter","RolePermissionRepositoryAdapter","RoleRepositoryAdapter","ScopeRepositoryAdapter","UserAttributeRepositoryAdapter","UserPermissionRepositoryAdapter","UserRepositoryAdapter","UserRoleRepositoryAdapter","ClientController","ClientPermissionController","ClientRoleController","ClientScopeController","IdentityProviderController","OAuth2ProviderRoleController","PermissionController","PermissionPolicyController","PolicyController","RealmController","RobotController","RobotPermissionController","RobotRoleController","RoleAttributeController","RoleController","RolePermissionController","ScopeController","UserAttributeController","UserController","UserPermissionController","UserRoleController","ActivateController","AuthorizeController","JwkController","OpenIDController","PasswordForgotController","PasswordResetController","RegisterController","StatusController","TokenController","ClientAuthenticator","ClientPermissionService","ClientRoleService","ClientScopeService","ClientService","CredentialsAuthenticator","IdentityPermissionProvider","PasswordRecoveryService","PermissionPolicyService","PermissionService","PolicyService","RealmService","RegistrationService","RobotAuthenticator","RobotPermissionService","RobotRoleService","RobotService","RoleAttributeService","RolePermissionService","RoleService","ScopeService","UserAttributeService","UserAuthenticator","UserPermissionService","UserRoleService","UserService","AuthenticationInjectionKey","OAuth2InjectionToken","IdentityInjectionKey","ConfigInjectionKey","MailInjectionKey","HTTPControllerModule","mount","router","container","realmController","createRealmController","roleController","createRoleController","permissionController","createPermissionController","permissionPolicyController","createPermissionPolicyController","clientController","createClientController","robotController","createRobotController","clientPermissionController","createClientPermissionController","clientRoleController","createClientRoleController","clientScopeController","createClientScopeController","robotPermissionController","createRobotPermissionController","robotRoleController","createRobotRoleController","roleAttributeController","createRoleAttributeController","rolePermissionController","createRolePermissionController","scopeController","createScopeController","userController","createUserController","userAttributeController","createUserAttributeController","userPermissionController","createUserPermissionController","userRoleController","createUserRoleController","policyController","createPolicyController","identityProviderRoleController","createIdentityProviderRoleController","use","controllers","createAuthorize","createToken","createJwkController","createOpenIDController","createActivateController","createPasswordForgotController","createPasswordResetController","createRegisterController","createIdentityProvider","parameter","body","context","name","request","cookie","query","createIdentityPermissionProvider","dataSource","resolve","DataSource","clientRepository","userRepository","robotRepository","roleRepository","config","accessTokenIssuer","AccessTokenIssuer","openIdTokenIssuer","OpenIDTokenIssuer","codeIssuer","AuthorizationCodeIssuer","codeRequestVerifier","AuthorizationCodeRequestVerifier","identityResolver","Resolver","options","baseURL","publicUrl","sessionManager","SessionManager","codeVerifier","AuthorizationCodeVerifier","refreshTokenIssuer","RefreshTokenIssuer","tokenRevoker","TokenRevoker","tokenVerifier","TokenVerifier","identityProviderLdapCollectionAuthenticator","ProviderLdapCollectionAuthenticator","identityPermissionProvider","clientAuthenticator","robotAuthenticator","userAuthenticator","service","createRegistrationService","createPasswordRecoveryService","realmRepository","repository","mailClient","passwordRecoveryEnabled","emailVerificationEnabled","registrationEnabled","accountManager","ProviderAccountManager","stateManager","AuthorizationStateManager","realmRepositoryAdapter","rolePermissionRepository","policyRepository","permissionPolicyRepository","permissionProvider","getRepository","keyRepository","path","IdentityPermissionProvider","createAuthorizationMiddleware","createLoggerMiddleware","createSwaggerMiddleware","registerAssetsMiddleware","registerBasicMiddleware","registerCorsMiddleware","registerErrorMiddleware","registerPrometheusMiddleware","registerRateLimitMiddleware","DIST_PATH","AuthenticationInjectionKey","ConfigInjectionKey","IdentityInjectionKey","OAuth2InjectionToken","DatabaseInjectionKey","PermissionDatabaseProvider","ClientRepository","RobotRepository","RoleRepository","UserRepository","HTTPMiddlewareModule","mountBefore","router","container","mountLogger","mountCors","mountAssets","mountBasic","mountPrometheus","mountRateLimit","mountSwagger","mountAuthorization","mountAfter","_container","config","resolve","isEnabled","middlewareCors","transformBoolToEmptyObject","middleware","env","use","middlewarePrometheus","middlewareRateLimit","middlewareSwagger","documentPath","join","options","baseURL","publicUrl","dataSource","DataSource","identityResolver","Resolver","sessionManager","SessionManager","oauth2TokenVerifier","TokenVerifier","permissionProvider","identityPermissionProvider","clientRepository","userRepository","robotRepository","roleRepository","clientAuthBasic","robotAuthBasic","userAuthBasic","input","Router","createHttpServer","ConfigInjectionKey","ModuleName","HTTPInjectionKey","HTTPControllerModule","HTTPMiddlewareModule","LoggerInjectionKey","HTTPModule","name","dependencies","instance","middleware","controller","HTTP","CONFIG","LOGGER","AUTHENTICATION","IDENTITY","OAUTH2","setup","container","config","resolve","logger","debug","router","mountBefore","mount","mountAfter","server","Promise","reject","errorHandler","err","once","removeListener","listen","port","host","address","register","Server","useValue","teardown","unregister","close","undefined","BuiltInPolicyType","DecisionStrategy","SystemPolicyName","PermissionName","REALM_MASTER_NAME","ROLE_ADMIN_NAME","ROLE_REALM_ADMIN_NAME","ScopeName","buildUserFakeEmail","ClientCredentialsService","RobotCredentialsService","UserCredentialsService","ConfigInjectionKey","ProvisioningEntityStrategyType","DefaultProvisioningSource","buildPolicies","attributes","name","DEFAULT","type","COMPOSITE","built_in","realm_id","extraAttributes","decision_strategy","UNANIMOUS","children","IDENTITY","PERMISSION_BINDING","REALM_MATCH","attribute_name","attribute_name_strict","identity_master_match_all","attribute_null_match_all","REALM_BOUND","REALM_OR_GLOBAL","buildPermissions","Object","values","map","strategy","MERGE","buildScopes","buildRoles","relations","globalPermissions","globalPermissionsExclude","REALM_CREATE","REALM_UPDATE","REALM_DELETE","globalPermissionsPolicyName","globalPermissionsPolicyOverrides","CLIENT_CREATE","CLIENT_UPDATE","CLIENT_DELETE","IDENTITY_PROVIDER_CREATE","IDENTITY_PROVIDER_UPDATE","IDENTITY_PROVIDER_DELETE","PERMISSION_CREATE","PERMISSION_UPDATE","PERMISSION_DELETE","ROBOT_CREATE","ROBOT_UPDATE","ROBOT_DELETE","ROLE_CREATE","ROLE_UPDATE","ROLE_DELETE","SCOPE_CREATE","SCOPE_UPDATE","SCOPE_DELETE","USER_CREATE","USER_UPDATE","USER_DELETE","buildRealms","config","masterRealm","userCredentialsService","userStrategy","userAdminPasswordReset","users","password","protect","userAdminPassword","email","active","userAdminEnabled","globalRoles","clientCredentialsService","clientStrategy","clientSystemSecretReset","clients","is_confidential","secret","clientSystemSecret","secret_hashed","clientSystemEnabled","robotCredentialsService","robotStrategy","robotAdminSecretReset","robots","robotAdminSecret","robotAdminEnabled","load","container","resolve","policies","permissions","scopes","roles","realms","CompositeProvisioningSource","sources","load","container","output","sourcesData","Promise","all","map","source","sourceData","merge","target","policies","mergeEntities","permissions","roles","scopes","realms","buildEntityKey","attributes","name","undefined","realm_id","client_id","result","forEach","item","key","push","idx","findIndex","r","load","locateMany","path","RootProvisioningValidator","CompositeProvisioningSource","FileProvisioningSource","options","rootValidator","cwd","isAbsolute","join","process","locations","compositeSource","output","location","raw","data","run","default","merge","ClientEntity","ClientPermissionEntity","ClientRoleEntity","PermissionEntity","RealmEntity","RobotEntity","RobotPermissionEntity","RobotRoleEntity","RoleEntity","RolePermissionEntity","ScopeEntity","UserPermissionEntity","UserRoleEntity","SystemPolicyName","PermissionPolicyEntity","PolicyRepository","UserRepository","ClientProvisioningSynchronizer","GraphProvisioningSynchronizer","PermissionProvisioningSynchronizer","PolicyProvisioningSynchronizer","RealmProvisioningSynchronizer","RobotProvisioningSynchronizer","RoleProvisioningSynchronizer","ScopeProvisioningSynchronizer","UserProvisioningSynchronizer","ClientPermissionRepositoryAdapter","ClientRepositoryAdapter","ClientRoleRepositoryAdapter","PermissionPolicyRepositoryAdapter","PermissionRepositoryAdapter","PolicyRepositoryAdapter","RealmRepositoryAdapter","RobotPermissionRepositoryAdapter","RobotRepositoryAdapter","RobotRoleRepositoryAdapter","RolePermissionRepositoryAdapter","RoleRepositoryAdapter","ScopeRepositoryAdapter","UserPermissionRepositoryAdapter","UserRepositoryAdapter","UserRoleRepositoryAdapter","DatabaseInjectionKey","ModuleName","fs","path","ConfigInjectionKey","CompositeProvisioningSource","FileProvisioningSource","ProvisionerModule","name","dependencies","sources","PROVISIONING","CONFIG","DATABASE","setup","container","config","resolve","provisioningDir","join","writableDirectoryPath","existsSync","push","cwd","composite","data","load","dataSource","DataSource","realmRepository","permissionRepository","repository","policyRepository","permissionPolicyRepository","policySynchronizer","roleRepository","clientRepository","permissionSynchronizer","roleSynchronizer","rolePermissionRepository","clientSynchronizer","clientRoleRepository","clientPermissionRepository","userSynchronizer","userRepository","userRoleRepository","userPermissionRepository","robotSynchronizer","robotRepository","robotRoleRepository","robotPermissionRepository","scopeSynchronizer","realmSynchronizer","rootSynchronizer","synchronize","permissionsDefaultPolicyAssignment","assignDefaultPolicy","defaultPolicy","findOneByName","DEFAULT","permissionRepo","getRepository","junctionRepo","permissions","find","permission","hasAnyPolicy","findOneBy","permission_id","id","save","create","permission_realm_id","realm_id","policy_id","policy_realm_id","ModuleName","LoggerInjectionKey","ConfigInjectionKey","RuntimeModule","name","dependencies","RUNTIME","CONFIG","LOGGER","setup","container","config","resolve","logger","debug","env","writableDirectoryPath","port","host","publicUrl","URL","href","Swagger","ModuleName","ConfigInjectionKey","LoggerInjectionKey","SwaggerModule","name","dependencies","SWAGGER","CONFIG","LOGGER","setup","container","config","resolve","logger","swagger","baseURL","publicUrl","swaggerCanGenerate","canGenerate","swaggerExists","exists","debug","generate","Application","AuthenticationModule","CacheModule","ComponentsModule","ConfigModule","DatabaseModule","HTTPModule","IdentityModule","LdapModule","LoggerModule","MailModule","ModuleName","OAuth2Module","ProvisionerModule","RuntimeModule","SwaggerModule","defaultFactories","CONFIG","LOGGER","CACHE","MAIL","RUNTIME","SWAGGER","DATABASE","PROVISIONING","LDAP","AUTHENTICATION","IDENTITY","OAUTH2","COMPONENTS","HTTP","ApplicationBuilder","slots","Map","withConfig","instance","set","withLogger","withCache","withMail","withRuntime","withSwagger","withDatabase","withProvisioning","withLdap","withAuthentication","withIdentity","withOAuth2","withComponents","withHTTP","buildModules","modules","forEach","slot","name","push","factory","build","undefined","ApplicationBuilder","DefaultProvisioningSource","ProvisionerModule","createApplication","withConfig","withLogger","withCache","withMail","withRuntime","withSwagger","withDatabase","withProvisioning","withLdap","withAuthentication","withIdentity","withOAuth2","withComponents","withHTTP","build","defineCommand","process","Swagger","ApplicationBuilder","ConfigInjectionKey","defineCLISwaggerCommand","meta","name","args","operation","required","type","options","setup","context","app","withConfig","build","config","container","resolve","swagger","baseURL","publicUrl","generate","exit","defineCommand","http","process","ApplicationBuilder","ConfigInjectionKey","defineCLIHealthCheckCommand","meta","name","setup","app","withConfig","build","config","container","resolve","healthCheck","request","path","host","port","timeout","res","statusCode","exit","on","end","defineCommand","path","process","checkDatabase","createDatabase","dropDatabase","generateMigration","transformFilePath","DataSource","DataSourceOptionsBuilder","ApplicationBuilder","ConfigInjectionKey","LoggerInjectionKey","ModuleName","CODE_PATH","MigrationOperation","runMigrationOperation","container","operation","config","resolve","logger","optionsBuilder","options","db","buildWith","buildWithEnv","debug","type","database","Array","isArray","migrations","i","length","check","exists","synchronize","ifNotExist","dataSource","logging","initialize","undoLastMigration","showMigrations","runMigrations","destroy","generateMigrations","connections","host","port","username","password","baseDirectory","join","timestamp","Date","now","connection","dataSourceOptions","directoryPath","name","prettify","defineCLIMigrationCommand","meta","args","required","Object","values","valueHint","setup","context","app","withConfig","withLogger","build","addModule","DATABASE","dependencies","CONFIG","LOGGER","exit","e","console","error","defineCommand","process","ApplicationBuilder","defineCLIResetCommand","meta","name","setup","app","withConfig","withLogger","withDatabase","build","teardown","exit","defineCommand","createApplication","defineCLIStartCommand","meta","name","setup","app"],"sources":["../src/app/modules/authentication/constants.ts","../src/adapters/database/domains/realm/entity.ts","../src/adapters/database/domains/realm/repository.ts","../src/adapters/database/event-publisher/module.ts","../src/adapters/database/domains/constants.ts","../src/adapters/database/domains/realm/subscriber.ts","../src/adapters/database/domains/key/entity.ts","../src/adapters/database/domains/client/entity.ts","../src/adapters/database/domains/permission/entity.ts","../src/adapters/database/domains/permission/subscriber.ts","../src/adapters/database/domains/policy/entity.ts","../src/adapters/database/extra-attribute-repository/adapter.ts","../src/adapters/database/extra-attribute-repository/repository.ts","../src/adapters/database/extra-attribute-repository/tree/adapter.ts","../src/adapters/database/extra-attribute-repository/tree/repository.ts","../src/adapters/database/domains/policy-attribute/entity.ts","../src/adapters/database/domains/policy-attribute/subscriber.ts","../src/adapters/database/domains/policy/repository.ts","../src/adapters/database/domains/policy/subscriber.ts","../src/adapters/database/domains/client-permission/entity.ts","../src/adapters/database/domains/client-permission/subscriber.ts","../src/adapters/database/domains/role/entity.ts","../src/adapters/database/domains/role-attribute/entity.ts","../src/adapters/database/domains/role-permission/entity.ts","../src/adapters/database/domains/role-permission/subscriber.ts","../src/adapters/database/domains/role/repository.ts","../src/adapters/database/domains/role/subscriber.ts","../src/adapters/database/domains/client-role/entity.ts","../src/adapters/database/domains/client-role/subscriber.ts","../src/adapters/database/domains/client/repository.ts","../src/adapters/database/domains/client/subscriber.ts","../src/adapters/database/domains/scope/entity.ts","../src/adapters/database/domains/scope/subscriber.ts","../src/adapters/database/domains/client-scope/entity.ts","../src/adapters/database/domains/client-scope/subscriber.ts","../src/adapters/database/domains/identity-provider/entity.ts","../src/adapters/database/domains/identity-provider-attribute/entity.ts","../src/adapters/database/domains/identity-provider-attribute/subscriber.ts","../src/adapters/database/domains/identity-provider/repository.ts","../src/adapters/database/domains/identity-provider/subscriber.ts","../src/adapters/database/domains/user/entity.ts","../src/adapters/database/domains/user-attribute/entity.ts","../src/adapters/database/domains/user-attribute/subscriber.ts","../src/adapters/database/domains/user-permission/entity.ts","../src/adapters/database/domains/user-permission/subscriber.ts","../src/adapters/database/domains/user-role/entity.ts","../src/adapters/database/domains/user-role/subscriber.ts","../src/adapters/database/domains/user/repository.ts","../src/adapters/database/domains/user/subscriber.ts","../src/adapters/database/domains/identity-provider-account/entity.ts","../src/adapters/database/domains/identity-provider-account/subscriber.ts","../src/adapters/database/domains/identity-provider-attribute-mapping/entity.ts","../src/adapters/database/domains/identity-provider-permission-mapping/entity.ts","../src/adapters/database/domains/identity-provider-role-mapping/entity.ts","../src/adapters/database/domains/identity-provider-role-mapping/subscriber.ts","../src/adapters/database/domains/robot/entity.ts","../src/adapters/database/domains/robot-role/entity.ts","../src/adapters/database/domains/robot-role/subscriber.ts","../src/adapters/database/domains/robot-permission/entity.ts","../src/adapters/database/domains/robot-permission/subscriber.ts","../src/adapters/database/domains/robot/repository.ts","../src/adapters/database/domains/robot/subscriber.ts","../src/adapters/database/domains/session/entity.ts","../src/adapters/database/domains/permission-policy/entity.ts","../src/adapters/database/domains/role-attribute/subscriber.ts","../src/core/authentication/credential/entities/client/module.ts","../src/core/authentication/credential/entities/robot/module.ts","../src/core/authentication/credential/entities/user/module.ts","../src/core/authentication/base.ts","../src/core/authentication/entities/client/module.ts","../src/core/authentication/entities/robot/module.ts","../src/core/authentication/entities/user/module.ts","../src/core/authentication/module.ts","../src/core/authentication/session/module.ts","../src/core/entities/service.ts","../src/core/entities/client/service.ts","../src/core/entities/client-permission/service.ts","../src/core/entities/client-role/service.ts","../src/core/entities/client-scope/service.ts","../src/core/entities/permission/service.ts","../src/core/entities/permission-policy/service.ts","../src/core/entities/policy/attributes-validator.ts","../src/core/entities/policy/service.ts","../src/core/entities/realm/service.ts","../src/core/entities/robot/service.ts","../src/core/entities/robot-permission/service.ts","../src/core/entities/robot-role/service.ts","../src/core/entities/role/service.ts","../src/core/entities/role-attribute/service.ts","../src/core/entities/role-permission/service.ts","../src/core/entities/scope/service.ts","../src/core/entities/user/service.ts","../src/core/entities/user-attribute/service.ts","../src/core/entities/user-permission/service.ts","../src/core/entities/user-role/service.ts","../src/core/oauth2/authorization/code/issuer/module.ts","../src/core/oauth2/authorization/helpers.ts","../src/core/oauth2/authorization/code/verifier/module.ts","../src/core/oauth2/authorization/code-request/verifier/module.ts","../src/core/oauth2/authorization/code-request/validator.ts","../src/core/oauth2/authorization/state/module.ts","../src/core/oauth2/authorization/module.ts","../src/core/oauth2/grant-types/base.ts","../src/core/oauth2/response/bearer.ts","../src/core/oauth2/grant-types/authorize.ts","../src/core/oauth2/grant-types/client-credentials.ts","../src/core/oauth2/grant-types/identity.ts","../src/core/oauth2/grant-types/password.ts","../src/core/oauth2/grant-types/refresh-token.ts","../src/core/oauth2/grant-types/robot-credentials.ts","../src/core/oauth2/openid/claims.ts","../src/core/oauth2/scope/resolver.ts","../src/core/oauth2/token/issuer/base.ts","../src/core/oauth2/token/issuer/access/module.ts","../src/core/oauth2/token/issuer/open-id/module.ts","../src/core/oauth2/token/issuer/refresh/module.ts","../src/core/oauth2/token/revoker/module.ts","../src/core/oauth2/token/signer/module.ts","../src/core/oauth2/token/verifier/module.ts","../src/core/identity/password-recovery/service.ts","../src/core/identity/permission/module.ts","../src/core/identity/provider/constants.ts","../src/core/identity/provider/mapper/constants.ts","../src/core/identity/provider/mapper/base.ts","../src/core/identity/provider/mapper/attributes/module.ts","../src/core/identity/provider/mapper/role/module.ts","../src/core/identity/provider/mapper/permission/module.ts","../src/core/identity/provider/account/module.ts","../src/core/identity/provider/authentication/protocols/ldap/module.ts","../src/core/identity/provider/authentication/protocols/ldap/collection.ts","../src/core/identity/provider/authentication/protocols/oauth2/module.ts","../src/core/identity/provider/authentication/protocols/open-id/module.ts","../src/core/identity/provider/authentication/presets/facebook.ts","../src/core/identity/provider/authentication/presets/github.ts","../src/core/identity/provider/authentication/presets/google.ts","../src/core/identity/provider/authentication/presets/instagram.ts","../src/core/identity/provider/authentication/presets/paypal.ts","../src/core/identity/provider/authentication/constants.ts","../src/core/identity/provider/authentication/factory.ts","../src/core/identity/registration/service.ts","../src/core/identity/resolver/module.ts","../src/core/provisioning/strategy/constants.ts","../src/core/provisioning/strategy/normalize.ts","../src/core/provisioning/strategy/validator.ts","../src/core/provisioning/entities/permission/validator.ts","../src/core/provisioning/entities/role/relations-validator.ts","../src/core/provisioning/entities/role/validator.ts","../src/core/provisioning/entities/client/relations-validator.ts","../src/core/provisioning/entities/client/validator.ts","../src/core/provisioning/entities/robot/relations-validator.ts","../src/core/provisioning/entities/robot/validator.ts","../src/core/provisioning/entities/scope/validator.ts","../src/core/provisioning/entities/user/relations-validator.ts","../src/core/provisioning/entities/user/validator.ts","../src/core/provisioning/entities/realm/relations-validator.ts","../src/core/provisioning/entities/realm/validator.ts","../src/core/provisioning/entities/root/validator.ts","../src/core/provisioning/synchronizer/base.ts","../src/core/provisioning/synchronizer/entity-resolver.ts","../src/core/provisioning/synchronizer/junction-synchronizer.ts","../src/core/provisioning/synchronizer/client/module.ts","../src/core/provisioning/synchronizer/permission/module.ts","../src/core/provisioning/synchronizer/policy/module.ts","../src/core/provisioning/synchronizer/realm/module.ts","../src/core/provisioning/synchronizer/role/module.ts","../src/core/provisioning/synchronizer/root/module.ts","../src/core/provisioning/synchronizer/robot/module.ts","../src/core/provisioning/synchronizer/scope/module.ts","../src/core/provisioning/synchronizer/user/module.ts","../src/core/security/policy/evaluator.ts","../src/core/security/policy/engine.ts","../src/app/modules/cache/constants.ts","../src/app/modules/constants.ts","../src/app/modules/config/constants.ts","../src/utils/host.ts","../src/app/modules/config/parse.ts","../src/app/modules/config/normalize.ts","../src/app/modules/config/read/env.ts","../src/app/modules/config/read/fs.ts","../src/app/modules/config/read/module.ts","../src/app/modules/config/module.ts","../src/app/modules/cache/module.ts","../src/app/modules/authentication/repositories/constants.ts","../src/app/modules/authentication/repositories/session.ts","../src/app/modules/authentication/module.ts","../src/components/database/unique-entries/module.ts","../src/components/database/unique-entries/factory.ts","../src/components/oauth2-cleaner/module.ts","../src/app/modules/database/constants.ts","../src/adapters/database/cache/module.ts","../src/adapters/database/data-source/options/module.ts","../src/adapters/database/data-source/singleton.ts","../src/adapters/database/errors/conflict.ts","../src/adapters/database/helpers/is-supported.ts","../src/app/modules/logger/constants.ts","../src/app/modules/logger/module.ts","../src/app/modules/database/module.ts","../src/app/modules/database/repositories/helpers.ts","../src/app/modules/database/repositories/realm/repository.ts","../src/app/modules/database/repositories/client/repository.ts","../src/app/modules/database/repositories/client-permission/repository.ts","../src/app/modules/database/repositories/client-role/repository.ts","../src/app/modules/database/repositories/client-scope/repository.ts","../src/app/modules/database/repositories/identity-provider/repository.ts","../src/app/modules/database/repositories/permission/repository.ts","../src/app/modules/database/repositories/permission-policy/repository.ts","../src/app/modules/database/repositories/permission-provider/module.ts","../src/app/modules/database/repositories/policy/repository.ts","../src/app/modules/database/repositories/robot/repository.ts","../src/app/modules/database/repositories/robot-permission/repository.ts","../src/app/modules/database/repositories/robot-role/repository.ts","../src/app/modules/database/repositories/role/repository.ts","../src/app/modules/database/repositories/role-attribute/repository.ts","../src/app/modules/database/repositories/role-permission/repository.ts","../src/app/modules/database/repositories/scope/repository.ts","../src/app/modules/database/repositories/user/repository.ts","../src/app/modules/database/repositories/user-attribute/repository.ts","../src/app/modules/database/repositories/user-permission/repository.ts","../src/app/modules/database/repositories/user-role/repository.ts","../src/app/modules/database/repositories/identity-provider-role-mapping/repository.ts","../src/app/modules/components/module.ts","../src/app/modules/http/constants.ts","../src/adapters/http/request/constants.ts","../src/adapters/http/request/permission/helper.ts","../src/adapters/http/request/helpers/identity.ts","../src/adapters/http/request/helpers/actor.ts","../src/adapters/http/request/helpers/body-realm-id.ts","../src/adapters/http/request/helpers/param-id.ts","../src/adapters/http/request/helpers/scopes.ts","../src/adapters/http/request/helpers/token.ts","../src/adapters/http/request/permission/module.ts","../src/adapters/http/adapters/oauth2/authorization/module.ts","../src/adapters/http/adapters/oauth2/grant-types/utils/guess.ts","../src/adapters/http/adapters/oauth2/grant-types/authorize.ts","../src/adapters/http/adapters/oauth2/grant-types/client-credentials.ts","../src/adapters/http/adapters/oauth2/grant-types/identity.ts","../src/adapters/http/adapters/oauth2/grant-types/password.ts","../src/adapters/http/adapters/oauth2/grant-types/refresh_token.ts","../src/adapters/http/adapters/oauth2/grant-types/robot-credentials.ts","../src/adapters/http/middleware/built-in/authorization/module.ts","../src/adapters/http/middleware/built-in/authorization/factory.ts","../src/adapters/http/middleware/built-in/loggedin/module.ts","../src/adapters/http/middleware/built-in/loggedin/user.ts","../src/path.ts","../src/adapters/http/middleware/built-in/assets.ts","../src/adapters/http/middleware/built-in/basic.ts","../src/adapters/http/middleware/built-in/cors.ts","../src/utils/error.ts","../src/utils/self-id.ts","../src/adapters/http/middleware/built-in/error.ts","../src/adapters/http/middleware/built-in/logger.ts","../src/adapters/http/middleware/built-in/prometheus.ts","../src/adapters/http/middleware/built-in/rate-limit.ts","../src/adapters/http/middleware/built-in/swagger.ts","../src/adapters/http/controllers/entities/client/module.ts","../src/adapters/http/controllers/entities/client-permission/module.ts","../src/adapters/http/controllers/entities/client-permission/utils/validation.ts","../src/adapters/http/controllers/entities/client-role/utils/validation.ts","../src/adapters/http/controllers/entities/client-role/module.ts","../src/adapters/http/controllers/entities/client-scope/module.ts","../src/adapters/http/controllers/entities/client-scope/utils/validator.ts","../src/adapters/http/controllers/entities/identity-provider/module.ts","../src/adapters/http/controllers/entities/identity-provide-role/utils/validator.ts","../src/adapters/http/controllers/entities/identity-provide-role/module.ts","../src/adapters/http/controllers/entities/permission/module.ts","../src/adapters/http/controllers/entities/permission-policy/module.ts","../src/adapters/http/controllers/workflows/activate/validator.ts","../src/adapters/http/controllers/workflows/activate/module.ts","../src/adapters/http/controllers/workflows/authorize/module.ts","../src/adapters/http/controllers/workflows/jwks/handlers/read.ts","../src/adapters/http/controllers/workflows/jwks/module.ts","../src/adapters/http/controllers/workflows/openid/module.ts","../src/adapters/http/controllers/workflows/password-forgot/module.ts","../src/adapters/http/controllers/workflows/password-reset/module.ts","../src/adapters/http/controllers/workflows/register/module.ts","../src/adapters/http/controllers/workflows/status/module.ts","../src/core/oauth2/helpers/erorr.ts","../src/adapters/http/controllers/workflows/token/utils/validator.ts","../src/adapters/http/controllers/workflows/token/utils/extract.ts","../src/adapters/http/controllers/workflows/token/module.ts","../src/adapters/http/controllers/entities/realm/module.ts","../src/adapters/http/controllers/entities/robot/module.ts","../src/adapters/http/controllers/entities/robot-permission/module.ts","../src/adapters/http/controllers/entities/robot-permission/utils/validation.ts","../src/adapters/http/controllers/entities/robot-role/module.ts","../src/adapters/http/controllers/entities/robot-role/utils/validation.ts","../src/adapters/http/controllers/entities/role/module.ts","../src/adapters/http/controllers/entities/role-attribute/module.ts","../src/adapters/http/controllers/entities/role-attribute/utils/validation.ts","../src/adapters/http/controllers/entities/role-permission/module.ts","../src/adapters/http/controllers/entities/role-permission/utils/validation.ts","../src/adapters/http/controllers/entities/policy/module.ts","../src/adapters/http/controllers/entities/policy/utils/attributes-validator.ts","../src/adapters/http/controllers/entities/policy/utils/validation.ts","../src/adapters/http/controllers/entities/scope/module.ts","../src/adapters/http/controllers/entities/user/module.ts","../src/adapters/http/controllers/entities/user-attribute/module.ts","../src/adapters/http/controllers/entities/user-attribute/utils/validation.ts","../src/adapters/http/controllers/entities/user-permission/module.ts","../src/adapters/http/controllers/entities/user-permission/utils/validation.ts","../src/adapters/http/controllers/entities/user-role/module.ts","../src/adapters/http/controllers/entities/user-role/utils/validation.ts","../src/adapters/http/server/module.ts","../src/adapters/http/swagger/module.ts","../src/app/modules/oauth2/constants.ts","../src/app/modules/oauth2/repositories/constants.ts","../src/app/modules/oauth2/repositories/authorize/code/repository.ts","../src/app/modules/oauth2/repositories/authorize/state/repository.ts","../src/app/modules/oauth2/repositories/client/repository.ts","../src/app/modules/oauth2/repositories/scope/repository.ts","../src/app/modules/oauth2/repositories/key/repository.ts","../src/app/modules/oauth2/repositories/token/repository.ts","../src/app/modules/identity/constants.ts","../src/app/modules/identity/repositories/provider/account/module.ts","../src/app/modules/identity/repositories/provider/mapper/attribute.ts","../src/app/modules/identity/repositories/provider/mapper/permission.ts","../src/app/modules/identity/repositories/provider/mapper/role.ts","../src/app/modules/identity/repositories/client.ts","../src/app/modules/identity/repositories/robot.ts","../src/app/modules/identity/repositories/user.ts","../src/app/modules/ldap/constants.ts","../src/adapters/shared/ldap/module.ts","../src/adapters/shared/ldap/factory.ts","../src/app/modules/ldap/module.ts","../src/app/modules/identity/module.ts","../src/app/modules/oauth2/module.ts","../src/app/modules/mail/constants.ts","../src/app/modules/mail/adapter/smtp/module.ts","../src/app/modules/mail/adapter/smtp/smtp.ts","../src/app/modules/mail/adapter/void.ts","../src/app/modules/mail/module.ts","../src/app/modules/http/modules/controller.ts","../src/app/modules/http/modules/middleware.ts","../src/app/modules/http/module.ts","../src/app/modules/provisioning/sources/default/module.ts","../src/app/modules/provisioning/sources/composite/module.ts","../src/app/modules/provisioning/sources/file/module.ts","../src/app/modules/provisioning/module.ts","../src/app/modules/runtime/module.ts","../src/app/modules/swagger/module.ts","../src/app/builder.ts","../src/app/factory.ts","../src/cli/commands/swagger.ts","../src/cli/commands/healthcheck.ts","../src/cli/commands/migration.ts","../src/cli/commands/reset.ts","../src/cli/commands/start.ts"],"sourcesContent":["/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { TypedToken } from 'eldin';\nimport type { ISessionManager, ISessionRepository } from '../../../core/index.ts';\n\nexport const AuthenticationInjectionKey = {\n SessionManager: new TypedToken<ISessionManager>('SessionManager'),\n SessionRepository: new TypedToken<ISessionRepository>('SessionRepository'),\n} as const;\n","/*\n * Copyright (c) 2021-2021.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n Column,\n CreateDateColumn,\n Entity,\n PrimaryGeneratedColumn,\n UpdateDateColumn,\n} from 'typeorm';\nimport type { Realm } from '@authup/core-kit';\n\n@Entity({ name: 'auth_realms' })\nexport class RealmEntity implements Realm {\n @PrimaryGeneratedColumn('uuid')\n id: string;\n\n @Column({\n type: 'varchar',\n length: 128,\n unique: true, \n })\n name: string;\n\n @Column({\n type: 'varchar',\n length: 256,\n nullable: true, \n })\n display_name: string | null;\n\n @Column({\n type: 'text',\n nullable: true,\n default: null, \n })\n description: string | null;\n\n @Column({\n type: 'boolean',\n default: false, \n })\n built_in: boolean;\n\n @CreateDateColumn()\n created_at: string;\n\n @UpdateDateColumn()\n updated_at: string;\n}\n","/*\n * Copyright (c) 2021-2021.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { REALM_MASTER_NAME } from '@authup/core-kit';\nimport type { DataSource, EntityManager } from 'typeorm';\nimport { InstanceChecker, Repository } from 'typeorm';\nimport { RealmEntity } from './entity.ts';\n\nexport class RealmRepository extends Repository<RealmEntity> {\n constructor(instance: DataSource | EntityManager) {\n super(RealmEntity, InstanceChecker.isDataSource(instance) ? instance.manager : instance);\n }\n\n async getMaster() : Promise<RealmEntity> {\n const repository = this.manager.getRepository(RealmEntity);\n\n const entity = await repository.findOne({\n where: { name: REALM_MASTER_NAME },\n cache: true,\n });\n\n if (!entity) {\n throw new Error(`The ${REALM_MASTER_NAME} does not exist.`);\n }\n\n return entity;\n }\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { DomainEventPublishContext } from '@authup/server-kit';\nimport { DomainEventPublisher } from '@authup/server-kit';\nimport { singa } from 'singa';\n\nconst singleton = singa<DomainEventPublisher>({\n name: 'domainEvent',\n factory() {\n return new DomainEventPublisher();\n },\n});\n\nexport function useDomainEventPublisher() {\n return singleton.use();\n}\n\nexport function setDomainEventPublisher(domainEventPublisher: DomainEventPublisher) {\n singleton.set(domainEventPublisher);\n}\n\nexport async function publishDomainEvent(ctx: DomainEventPublishContext) : Promise<void> {\n await useDomainEventPublisher()\n .publish(ctx);\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport enum CachePrefix {\n IDENTITY_PROVIDER = 'identity_provider',\n IDENTITY_PROVIDER_ACCOUNT = 'identity_provider_account',\n IDENTITY_PROVIDER_ATTRIBUTE = 'identity_provider_attribute',\n IDENTITY_PROVIDER_ROLE = 'identity_provider_role',\n\n OAUTH2_AUTHORIZATION_CODE = 'oauth2_authorization_code',\n\n CLIENT = 'client',\n CLIENT_OWNED_PERMISSIONS = 'client_owned_permissions',\n CLIENT_OWNED_ROLES = 'client_owned_roles',\n CLIENT_SCOPE = 'client_scope',\n\n USER = 'user',\n USER_OWNED_ATTRIBUTES = 'user_owned_attributes',\n USER_OWNED_PERMISSIONS = 'user_owned_permissions',\n USER_OWNED_ROLES = 'user_owned_roles',\n\n KEY = 'key',\n\n POLICY = 'policy',\n PERMISSION = 'permission',\n\n REALM = 'realm',\n\n POLICY_OWNED_ATTRIBUTES = 'policy_owned_attributes',\n\n ROBOT = 'robot',\n ROBOT_OWNED_PERMISSIONS = 'robot_owned_permissions',\n ROBOT_OWNED_ROLES = 'robot_owned_roles',\n\n ROLE = 'role',\n ROLE_OWNED_PERMISSIONS = 'role_owned_permissions',\n}\n","/*\n * Copyright (c) 2022-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Realm } from '@authup/core-kit';\nimport {\n EntityDefaultEventName,\n EntityType,\n buildEntityChannelName,\n} from '@authup/core-kit';\nimport { buildRedisKeyPath } from '@authup/server-kit';\nimport type {\n EntitySubscriberInterface, \n InsertEvent,\n RemoveEvent,\n UpdateEvent,\n} from 'typeorm';\nimport { EventSubscriber } from 'typeorm';\nimport { publishDomainEvent } from '../../event-publisher/index.ts';\nimport { RealmEntity } from './entity.ts';\nimport { CachePrefix } from '../constants.ts';\n\nasync function publishEvent(\n event: `${EntityDefaultEventName}`,\n data: Realm,\n) {\n await publishDomainEvent({\n content: {\n type: EntityType.REALM,\n event,\n data,\n },\n destinations: [\n { channel: (id) => buildEntityChannelName(EntityType.REALM, id) },\n ],\n });\n}\n\n@EventSubscriber()\nexport class RealmSubscriber implements EntitySubscriberInterface<Realm> {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n listenTo(): Function | string {\n return RealmEntity;\n }\n\n async afterInsert(event: InsertEvent<Realm>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n await publishEvent(EntityDefaultEventName.CREATED, event.entity);\n }\n\n async afterUpdate(event: UpdateEvent<Realm>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n if (event.connection.queryResultCache) {\n await event.connection.queryResultCache.remove([\n buildRedisKeyPath({\n prefix: CachePrefix.REALM,\n key: event.entity.id,\n }),\n ]);\n }\n\n await publishEvent(EntityDefaultEventName.UPDATED, event.entity as Realm);\n }\n\n async afterRemove(event: RemoveEvent<Realm>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n if (event.connection.queryResultCache) {\n await event.connection.queryResultCache.remove([\n buildRedisKeyPath({\n prefix: CachePrefix.REALM,\n key: event.entity.id,\n }),\n ]);\n }\n\n await publishEvent(EntityDefaultEventName.DELETED, event.entity);\n }\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n Column, \n CreateDateColumn, \n Entity, \n Index, \n JoinColumn, \n ManyToOne, \n PrimaryGeneratedColumn, \n UpdateDateColumn,\n} from 'typeorm';\nimport type { JWKType } from '@authup/specs';\nimport type {\n Key,\n Realm,\n} from '@authup/core-kit';\nimport { RealmEntity } from '../realm/index.ts';\n\n@Index([\n 'priority',\n 'realm_id',\n 'type',\n])\n@Entity({ name: 'auth_keys' })\nexport class KeyEntity implements Key {\n @PrimaryGeneratedColumn('uuid')\n id: string;\n\n @Index()\n @Column({\n type: 'varchar',\n length: 64,\n default: null,\n })\n type: `${JWKType}`;\n\n @Column({\n type: 'int',\n unsigned: true,\n default: 0,\n })\n priority: number;\n\n @Column({\n type: 'varchar',\n length: 64,\n default: null,\n })\n signature_algorithm: Key['signature_algorithm'];\n\n @Column({\n type: 'varchar',\n length: 4096,\n default: null,\n select: false,\n })\n decryption_key?: string | null;\n\n @Column({\n type: 'varchar',\n length: 4096,\n default: null,\n })\n encryption_key: string | null;\n\n // ------------------------------------------------------------------\n\n @CreateDateColumn()\n created_at: Date;\n\n @UpdateDateColumn()\n updated_at: Date;\n\n // ------------------------------------------------------------------\n\n @Index()\n @Column({\n nullable: true,\n default: null, \n })\n realm_id: Realm['id'];\n\n @ManyToOne(() => RealmEntity, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'realm_id' })\n realm: RealmEntity;\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n BeforeInsert, \n BeforeUpdate,\n Column,\n CreateDateColumn,\n Entity,\n JoinColumn,\n ManyToOne,\n PrimaryGeneratedColumn,\n Unique,\n UpdateDateColumn,\n} from 'typeorm';\nimport type { Client, Realm } from '@authup/core-kit';\nimport { RealmEntity } from '../realm/index.ts';\n\n@Entity({ name: 'auth_clients' })\n@Unique(['name', 'realm_id'])\nexport class ClientEntity implements Client {\n @PrimaryGeneratedColumn('uuid')\n id: string;\n\n // ------------------------------------------------------------------\n\n @Column({\n type: 'boolean',\n default: true,\n })\n active: boolean;\n\n @Column({\n type: 'boolean',\n default: false,\n })\n built_in: boolean;\n\n @Column({\n type: 'boolean',\n default: false,\n })\n is_confidential: boolean;\n\n // ------------------------------------------------------------------\n\n @Column({\n type: 'varchar',\n length: 256,\n })\n name: string;\n\n @Column({\n type: 'varchar',\n length: 256,\n nullable: true, \n })\n display_name: string | null;\n\n @Column({\n type: 'text',\n nullable: true,\n })\n description: string | null;\n\n // ------------------------------------------------------------------\n\n @Column({\n type: 'varchar',\n length: 256,\n select: false,\n nullable: true,\n })\n secret: string | null;\n\n @Column({\n type: 'boolean',\n default: false,\n })\n secret_hashed: boolean;\n\n @Column({\n type: 'boolean',\n default: false,\n })\n secret_encrypted: boolean;\n\n // ------------------------------------------------------------------\n\n @Column({\n type: 'text',\n nullable: true,\n })\n redirect_uri: string | null;\n\n @Column({\n type: 'varchar',\n length: 512,\n nullable: true,\n })\n grant_types: string | null;\n\n @Column({\n type: 'varchar',\n length: 512,\n nullable: true,\n default: null,\n })\n scope: string | null;\n\n @Column({\n type: 'varchar',\n length: 2000,\n nullable: true,\n })\n base_url: string | null;\n\n @Column({\n type: 'varchar',\n length: 2000,\n nullable: true,\n })\n root_url: string | null;\n\n // ------------------------------------------------------------------\n\n @CreateDateColumn()\n created_at: string;\n\n @UpdateDateColumn()\n updated_at: string;\n\n // ------------------------------------------------------------------\n\n @Column()\n realm_id: Realm['id'];\n\n @ManyToOne(() => RealmEntity, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'realm_id' })\n realm: RealmEntity;\n\n // ------------------------------------------------------------------\n\n @BeforeInsert()\n @BeforeUpdate()\n setDisplayName() {\n if (\n typeof this.display_name !== 'string' ||\n this.display_name.length === 0\n ) {\n this.display_name = this.name;\n }\n }\n}\n","/*\n * Copyright (c) 2021-2021.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n Column,\n CreateDateColumn,\n Entity,\n Index,\n JoinColumn,\n ManyToOne,\n PrimaryGeneratedColumn, \n Unique,\n UpdateDateColumn,\n} from 'typeorm';\nimport type { DecisionStrategy } from '@authup/kit';\nimport type { Client, Realm } from '@authup/core-kit';\nimport { RealmEntity } from '../realm/index.ts';\nimport { ClientEntity } from '../client/entity.ts';\n\n@Unique(['name', 'client_id', 'realm_id'])\n@Entity({ name: 'auth_permissions' })\nexport class PermissionEntity {\n @PrimaryGeneratedColumn('uuid')\n id: string;\n\n @Column({\n type: 'boolean',\n default: false, \n })\n built_in: boolean;\n\n @Column({\n type: 'varchar',\n length: 128, \n })\n name: string;\n\n @Column({\n type: 'varchar',\n length: 256,\n nullable: true, \n })\n display_name: string | null;\n\n @Column({\n type: 'text',\n nullable: true, \n })\n description: string | null;\n\n @Column({\n type: 'varchar',\n length: 50,\n nullable: true,\n default: null, \n })\n decision_strategy: `${DecisionStrategy}` | null;\n\n // ------------------------------------------------------------------\n\n @Index()\n @Column({ nullable: true })\n client_id: Client['id'] | null;\n\n @ManyToOne(() => ClientEntity, {\n onDelete: 'SET NULL',\n nullable: true, \n })\n @JoinColumn({ name: 'client_id' })\n client: Client | null;\n\n // ------------------------------------------------------------------\n\n @Index()\n @Column({ nullable: true })\n realm_id: Realm['id'] | null;\n\n @ManyToOne(() => RealmEntity, {\n onDelete: 'CASCADE',\n nullable: true, \n })\n @JoinColumn({ name: 'realm_id' })\n realm: Realm | null;\n\n // ------------------------------------------------------------------\n\n @CreateDateColumn()\n created_at: string;\n\n @UpdateDateColumn()\n updated_at: string;\n}\n","/*\n * Copyright (c) 2022-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { buildPermissionKey } from '@authup/access';\nimport {\n EntityDefaultEventName,\n EntityType,\n buildEntityChannelName,\n} from '@authup/core-kit';\nimport type { Permission } from '@authup/core-kit';\nimport { buildRedisKeyPath } from '@authup/server-kit';\nimport type {\n EntitySubscriberInterface,\n InsertEvent,\n RemoveEvent,\n UpdateEvent,\n} from 'typeorm';\nimport { EventSubscriber } from 'typeorm';\nimport { publishDomainEvent } from '../../event-publisher/index.ts';\nimport { PermissionEntity } from './entity.ts';\nimport { CachePrefix } from '../constants.ts';\n\nasync function publishEvent(\n event: `${EntityDefaultEventName}`,\n data: Permission,\n) {\n await publishDomainEvent({\n content: {\n type: EntityType.PERMISSION,\n event,\n data,\n },\n destinations: [\n { channel: (id) => buildEntityChannelName(EntityType.PERMISSION, id) },\n ],\n });\n}\n\n@EventSubscriber()\nexport class PermissionSubscriber implements EntitySubscriberInterface<Permission> {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n listenTo(): Function | string {\n return PermissionEntity;\n }\n\n async afterInsert(event: InsertEvent<Permission>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n await publishEvent(EntityDefaultEventName.CREATED, event.entity);\n }\n\n async afterUpdate(event: UpdateEvent<Permission>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n if (event.connection.queryResultCache) {\n await event.connection.queryResultCache.remove([\n buildRedisKeyPath({\n prefix: CachePrefix.PERMISSION,\n key: event.entity.id,\n }),\n buildRedisKeyPath({\n prefix: CachePrefix.PERMISSION,\n key: buildPermissionKey({\n name: event.entity.name,\n client_id: event.entity.client_id,\n realm_id: event.entity.realm_id,\n }),\n }),\n ]);\n }\n\n await publishEvent(EntityDefaultEventName.UPDATED, event.entity as Permission);\n }\n\n async afterRemove(event: RemoveEvent<Permission>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n if (event.connection.queryResultCache) {\n await event.connection.queryResultCache.remove([\n buildRedisKeyPath({\n prefix: CachePrefix.PERMISSION,\n key: event.entity.id,\n }),\n buildPermissionKey({\n name: event.entity.name,\n client_id: event.entity.client_id,\n realm_id: event.entity.realm_id,\n }),\n ]);\n }\n\n await publishEvent(EntityDefaultEventName.DELETED, event.entity);\n }\n}\n","/*\n * Copyright (c) 2021-2021.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n Column,\n CreateDateColumn,\n Entity, \n Index,\n JoinColumn,\n ManyToOne,\n PrimaryGeneratedColumn, \n Tree, \n TreeChildren,\n TreeParent,\n Unique,\n UpdateDateColumn,\n} from 'typeorm';\nimport type { Policy, Realm } from '@authup/core-kit';\nimport { RealmEntity } from '../realm/index.ts';\n\n@Unique(['name', 'realm_id'])\n@Entity({ name: 'auth_policies' })\n@Tree('closure-table', {\n closureTableName: 'auth_policy_tree',\n ancestorColumnName: () => 'ancestor_id',\n descendantColumnName: () => 'descendant_id',\n})\nexport class PolicyEntity implements Policy {\n @PrimaryGeneratedColumn('uuid')\n id: string;\n\n @Column({\n type: 'boolean',\n default: false, \n })\n built_in: boolean;\n\n @Column({\n type: 'varchar',\n length: 64, \n })\n type: string;\n\n @Column({\n type: 'varchar',\n length: 128, \n })\n name: string;\n\n @Column({\n type: 'varchar',\n length: 256,\n nullable: true, \n })\n display_name: string | null;\n\n @Column({\n type: 'text',\n nullable: true, \n })\n description: string | null;\n\n @Column({\n type: 'boolean',\n default: false, \n })\n invert: boolean;\n\n @TreeChildren({ cascade: true })\n children: PolicyEntity[];\n\n @Column({ nullable: true })\n parent_id: Policy['id'] | null;\n\n @TreeParent({ onDelete: 'CASCADE' })\n @JoinColumn({ name: 'parent_id' })\n parent: Policy | null;\n\n @Index()\n @Column({ nullable: true })\n realm_id: Realm['id'] | null;\n\n @ManyToOne(() => RealmEntity, {\n onDelete: 'CASCADE',\n nullable: true, \n })\n @JoinColumn({ name: 'realm_id' })\n realm: Realm | null;\n\n @CreateDateColumn()\n created_at: string;\n\n @UpdateDateColumn()\n updated_at: string;\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { ObjectLiteral } from '@authup/kit';\nimport { hasOwnProperty } from '@authup/kit';\nimport type {\n FindManyOptions,\n FindOneOptions,\n FindOptionsWhere,\n FindOptionsWhereProperty,\n Repository,\n} from 'typeorm';\nimport { In } from 'typeorm';\nimport type {\n EARepositoryAdapterOptions,\n EARepositoryEntityBase,\n EARepositoryFindOptions,\n EARepositoryPropertiesModifyFn,\n EARepositorySaveOptions,\n} from './types.ts';\n\nexport class ExtraAttributesRepositoryAdapter<\n T extends ObjectLiteral = ObjectLiteral,\n A extends EARepositoryEntityBase = EARepositoryEntityBase,\n> {\n protected repository : Repository<T>;\n\n public primaryColumn : keyof T;\n\n protected attributeRepository : Repository<A>;\n\n public attributeForeignColumn : keyof A;\n\n protected cachePrefix?: string;\n\n protected extra : EARepositoryPropertiesModifyFn<T, A>;\n\n // ------------------------------------------------------------------------------\n\n constructor(ctx: EARepositoryAdapterOptions<T, A>) {\n let extra : EARepositoryPropertiesModifyFn<T, A>;\n if (ctx.attributeProperties) {\n extra = ctx.attributeProperties;\n } else {\n extra = (input) => input;\n }\n this.extra = extra;\n\n this.repository = ctx.repository;\n this.primaryColumn = ctx.entityPrimaryColumn;\n this.attributeRepository = ctx.attributeRepository;\n this.attributeForeignColumn = ctx.attributeForeignColumn;\n this.cachePrefix = ctx.cachePrefix;\n }\n\n // ------------------------------------------------------------------------------\n\n async findOneWithEA(\n options: FindOneOptions<T>,\n extraOptions: EARepositoryFindOptions = {},\n ) : Promise<T | undefined> {\n const entity = await this.repository.findOne(options);\n if (!entity) {\n return undefined;\n }\n\n await this.extendWithEA(entity, extraOptions);\n\n return entity;\n }\n\n async findWithEA<\n E extends Record<string, any>,\n >(\n options: FindManyOptions<T>,\n extraOptions: EARepositoryFindOptions = {},\n ) : Promise<(T & E)[]> {\n const entities = await this.repository.find(options);\n\n return this.extendManyWithEA(entities, extraOptions);\n }\n\n async saveWithEA<E extends Record<string, any>>(\n input: T & E,\n attributes?: E,\n options?: EARepositorySaveOptions<T>,\n ) : Promise<T & E> {\n const columns : string[] = [];\n\n for (let i = 0; i < this.repository.metadata.columns.length; i++) {\n columns.push(this.repository.metadata.columns[i].propertyName);\n }\n for (let i = 0; i < this.repository.metadata.relations.length; i++) {\n columns.push(this.repository.metadata.relations[i].propertyName);\n }\n\n let extra : Record<string, any> = {};\n if (attributes) {\n extra = { ...attributes };\n }\n\n const keys = Object.keys(input) as (keyof T)[];\n for (const key_ of keys) {\n const key = key_ as string;\n const index = columns.indexOf(key);\n if (index === -1) {\n extra[key] = input[key];\n delete input[key];\n }\n }\n\n await this.repository.save(input);\n\n await this.saveEA(\n input,\n extra,\n options,\n );\n\n const extraKeys = Object.keys(extra);\n for (const extraKey of extraKeys) {\n input[extraKey as keyof T] = extra[extraKey];\n }\n\n return input;\n }\n\n async findOneWithEAByPrimaryColumn<E extends Record<string, any>>(\n value: T[keyof T],\n extraOptions: EARepositoryFindOptions = {},\n ) : Promise<E> {\n const attributesByPrimary = await this.findWithEAByPrimaryColumn([value], extraOptions);\n return (attributesByPrimary[value as string] || {}) as E;\n }\n\n async extendWithEA<E extends Record<string, any>>(\n entity: T,\n extraOptions: EARepositoryFindOptions = {},\n ) : Promise<T & E> {\n const attributes = await this.findOneWithEAByPrimaryColumn(entity[this.primaryColumn], extraOptions);\n const attributeKeys = Object.keys(attributes);\n for (const attributeKey of attributeKeys) {\n entity[attributeKey as keyof T] = attributes[attributeKey] as T[keyof T];\n }\n\n return entity as T & E;\n }\n\n async findWithEAByPrimaryColumn<E extends Record<string, any>>(\n value: (T[keyof T])[],\n extraOptions: EARepositoryFindOptions = {},\n ) : Promise<Record<string, E>> {\n const where : FindOptionsWhere<A> = {};\n where[this.attributeForeignColumn as keyof FindOptionsWhere<A>] = In(value) as any;\n if (extraOptions.attributes) {\n where.name = In(extraOptions.attributes) as FindOptionsWhereProperty<A['name']>;\n }\n\n const attributes = await this.attributeRepository.find({ where });\n const output : Record<string, E> = {};\n\n for (const element of value) {\n const entityAttributes = attributes.filter(\n (attribute) => attribute[this.attributeForeignColumn] === element as unknown as A[keyof A],\n );\n\n output[element as string] = entityAttributes\n .reduce((acc, curr) => {\n acc[curr.name as keyof E] = curr.value as E[keyof E];\n\n return acc;\n }, {} as E);\n }\n\n return output;\n }\n\n async extendManyWithEA<E extends Record<string, any>>(\n entities: T[],\n extraOptions: EARepositoryFindOptions = {},\n ) : Promise<(T & E)[]> {\n const attributesByPrimaryKey = await this.findWithEAByPrimaryColumn(\n this.getPrimaryKeyValues(entities),\n extraOptions,\n );\n\n for (const entity of entities) {\n const attributes = attributesByPrimaryKey[entity[this.primaryColumn] as string];\n if (!attributes) {\n continue;\n }\n\n const attributeKeys = Object.keys(attributes);\n for (const attributeKey of attributeKeys) {\n entity[attributeKey as keyof T] = attributes[attributeKey] as T[keyof T];\n }\n }\n\n return entities as (T & E)[];\n }\n\n // ------------------------------------------------------------------------------\n\n private async saveEA(\n parent: T,\n input: Record<string, any>,\n options: EARepositorySaveOptions<T> = {},\n ) {\n const foreignColumn = this.attributeForeignColumn as keyof A;\n const foreignColumnValue = parent[this.primaryColumn] as unknown as A[keyof A];\n\n const where : Partial<A> = {};\n where[foreignColumn] = foreignColumnValue;\n\n const items = await this.attributeRepository.findBy(where);\n\n const itemsToDelete : A[] = [];\n const itemsToUpdate : A[] = [];\n\n const keysProcessed : string[] = [];\n for (const item of items) {\n if (hasOwnProperty(input, item.name)) {\n item.value = input[item.name];\n item[foreignColumn] = foreignColumnValue;\n\n itemsToUpdate.push(this.extra(item, parent));\n\n keysProcessed.push(item.name);\n } else if (!options.keepAll) {\n itemsToDelete.push(item);\n }\n }\n\n if (itemsToUpdate.length > 0) {\n await this.attributeRepository.save(itemsToUpdate);\n }\n\n if (itemsToDelete.length > 0) {\n await this.attributeRepository.remove(itemsToDelete);\n }\n\n const itemsToAdd : A[] = [];\n\n const keys = Object.keys(input);\n let keyIndex : number;\n\n for (const key of keys) {\n keyIndex = keysProcessed.indexOf(key);\n if (keyIndex === -1) {\n itemsToAdd.push(this.extra({\n name: key,\n value: input[key],\n [foreignColumn]: foreignColumnValue,\n } as A, parent));\n }\n }\n\n if (itemsToAdd.length > 0) {\n await this.attributeRepository.insert(itemsToAdd);\n }\n }\n\n getPrimaryKeyValues(entities: T[]) : T[keyof T][] {\n return entities.map((entity) => entity[this.primaryColumn as keyof T]);\n }\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type {\n DataSource, \n DeepPartial, \n EntityManager, \n FindManyOptions, \n FindOneOptions,\n} from 'typeorm';\nimport { InstanceChecker, Repository } from 'typeorm';\nimport type { ObjectLiteral } from '@authup/kit';\nimport { ExtraAttributesRepositoryAdapter } from './adapter.ts';\nimport type {\n EARepositoryEntityBase, \n EARepositoryFindOptions, \n EARepositoryOptions, \n EARepositorySaveOptions, \n IEARepository,\n} from './types.ts';\n\nexport class EARepository<\n T extends ObjectLiteral = ObjectLiteral,\n A extends EARepositoryEntityBase = EARepositoryEntityBase,\n> extends Repository<T> implements IEARepository <T> {\n protected adapter : ExtraAttributesRepositoryAdapter<T, A>;\n\n constructor(\n instance: DataSource | EntityManager,\n options: EARepositoryOptions<T, A>,\n ) {\n const {\n entity,\n attributeEntity,\n ...ctx\n } = options;\n\n super(\n entity,\n InstanceChecker.isDataSource(instance) ? instance.manager : instance,\n );\n\n this.adapter = new ExtraAttributesRepositoryAdapter<T, A>({\n ...ctx,\n repository: this,\n attributeRepository: this.manager.getRepository(attributeEntity),\n });\n }\n // ------------------------------------------------------------------------------\n\n override create(): T;\n\n override create(entityLikeArray: DeepPartial<T>[]): T[];\n\n override create(entityLike: DeepPartial<T>): T;\n\n override create(entityLike?: DeepPartial<T> | DeepPartial<T>[]): T | T[] {\n if (!entityLike) {\n return super.create();\n }\n\n if (Array.isArray(entityLike)) {\n return super.create(entityLike).map((entity, i) => {\n this.preserveExtraAttributes(entity, entityLike[i]);\n return entity;\n });\n }\n\n const entity = super.create(entityLike);\n this.preserveExtraAttributes(entity, entityLike);\n return entity;\n }\n\n private preserveExtraAttributes(entity: T, source: DeepPartial<T>): void {\n const columns = new Set<string>();\n for (const col of this.metadata.columns) {\n columns.add(col.propertyName);\n }\n for (const rel of this.metadata.relations) {\n columns.add(rel.propertyName);\n }\n\n for (const key of Object.keys(source)) {\n if (!columns.has(key) && !(key in entity)) {\n (entity as Record<string, any>)[key] = (source as Record<string, any>)[key];\n }\n }\n }\n\n // ------------------------------------------------------------------------------\n\n async saveOneWithEA<E extends Record<string, any>>(\n input: T & E,\n attributes?: E,\n options?: EARepositorySaveOptions<T>,\n ) : Promise<T & E> {\n return this.adapter.saveWithEA(input, attributes, options);\n }\n\n // ------------------------------------------------------------------------------\n\n async findOneWithEA(\n options: FindOneOptions<T>,\n extraOptions: EARepositoryFindOptions = {},\n ) : Promise<T | undefined> {\n return this.adapter.findOneWithEA(options, extraOptions);\n }\n\n async findManyWithEA<\n E extends Record<string, any>,\n >(\n options: FindManyOptions<T>,\n extraOptions: EARepositoryFindOptions = {},\n ) : Promise<(T & E)[]> {\n return this.adapter.findWithEA(options, extraOptions);\n }\n\n async findOneWithEAByPrimaryColumn<E extends Record<string, any>>(\n value: T[keyof T],\n extraOptions: EARepositoryFindOptions = {},\n ) : Promise<E> {\n return this.adapter.findOneWithEAByPrimaryColumn(value, extraOptions);\n }\n\n async extendOneWithEA<E extends Record<string, any>>(\n entity: T,\n extraOptions: EARepositoryFindOptions = {},\n ) : Promise<T & E> {\n return this.adapter.extendWithEA(entity, extraOptions);\n }\n\n async extendManyWithEA<E extends Record<string, any>>(\n entities: T[],\n extraOptions: EARepositoryFindOptions = {},\n ) : Promise<(T & E)[]> {\n return this.adapter.extendManyWithEA(entities, extraOptions);\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { ObjectLiteral } from '@authup/kit';\nimport { ExtraAttributesRepositoryAdapter } from '../adapter.ts';\nimport type { EARepositoryEntityBase, EARepositoryFindOptions, EARepositorySaveOptions } from '../types.ts';\n\nexport class ExtraAttributesTreeRepositoryAdapter<\n T extends ObjectLiteral = ObjectLiteral,\n A extends EARepositoryEntityBase = EARepositoryEntityBase,\n> extends ExtraAttributesRepositoryAdapter<T, A> {\n async saveWithEA<E extends Record<string, any>>(\n input: T & E,\n attributes?: E,\n options?: EARepositorySaveOptions<T>,\n ) : Promise<T & E> {\n const childColumnName = this.repository.metadata.treeChildrenRelation?.propertyName;\n const parentColumnName = this.repository.metadata.treeParentRelation?.propertyName;\n\n let children : T | T[] | undefined;\n\n if (childColumnName && input[childColumnName]) {\n children = input[childColumnName];\n delete input[childColumnName];\n }\n\n if (\n parentColumnName &&\n options &&\n options.parent\n ) {\n input[parentColumnName as keyof T] = options.parent as (T & E)[keyof T];\n }\n\n await super.saveWithEA(input, attributes, options);\n\n if (\n parentColumnName &&\n options &&\n options.parent\n ) {\n delete input[parentColumnName as keyof T];\n }\n\n if (\n childColumnName &&\n parentColumnName &&\n children\n ) {\n if (Array.isArray(children)) {\n for (const child of children) {\n await this.saveWithEA(child, undefined, {\n ...(options || {}),\n parent: input,\n });\n }\n } else {\n await this.saveWithEA(children, undefined, {\n ...(options || {}),\n parent: input,\n });\n }\n\n input[childColumnName as keyof T] = children as (T & E)[keyof T];\n }\n\n return input;\n }\n\n // ------------------------------------------------------------------------------\n\n async extendManyWithEA<E extends Record<string, any>>(\n entities: T[],\n extraOptions: EARepositoryFindOptions = {},\n ) : Promise<(T & E)[]> {\n const flattened = this.flatten(entities);\n\n const attributesByPrimaryKey = await this.findWithEAByPrimaryColumn(\n this.getPrimaryKeyValues(flattened),\n extraOptions,\n );\n\n this.traverse(entities, (entity) => {\n const value = attributesByPrimaryKey[entity[this.primaryColumn] as string];\n if (!value) {\n return entity;\n }\n\n const keys = Object.keys(value);\n for (const key of keys) {\n entity[key as keyof T] = value[key] as T[keyof T];\n }\n\n return entity;\n });\n\n return entities as (T & E)[];\n }\n\n // ------------------------------------------------------------------------------\n\n protected flatten(entities: T | T[]) : T[] {\n const output : T[] = [];\n\n this.traverse(entities, (entity) => {\n output.push(entity);\n\n return entity;\n });\n\n return output;\n }\n\n protected traverse(entities: T | T[], fn: (entity: T) => T) {\n const data : T[] = Array.isArray(entities) ? entities : [entities];\n\n const childColumnName = this.repository.metadata.treeChildrenRelation?.propertyName;\n for (const datum of data) {\n fn(datum);\n\n if (childColumnName && datum[childColumnName]) {\n if (Array.isArray(datum[childColumnName])) {\n this.traverse(datum[childColumnName], fn);\n } else {\n this.traverse([datum[childColumnName]], fn);\n }\n }\n }\n }\n}\n","/*\n * Copyright (c) 2024-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type {\n DataSource, \n DeepPartial, \n EntityManager, \n FindManyOptions, \n FindOneOptions, \n FindTreeOptions,\n SelectQueryBuilder,\n} from 'typeorm';\nimport {\n FindOptionsUtils,\n InstanceChecker,\n TreeRepository, \n TreeRepositoryUtils,\n} from 'typeorm';\nimport type { ObjectLiteral } from '@authup/kit';\nimport type { ExtraAttributesRepositoryAdapter } from '../adapter.ts';\nimport type {\n EARepositoryEntityBase, \n EARepositoryFindOptions, \n EARepositoryOptions, \n EARepositorySaveOptions, \n IEARepository,\n} from '../types.ts';\nimport { ExtraAttributesTreeRepositoryAdapter } from './adapter.ts';\n\n/**\n * @see https://github.com/typeorm/typeorm/blob/master/src/repository/TreeRepository.ts\n */\nexport class EATreeRepository<\n T extends ObjectLiteral = ObjectLiteral,\n A extends EARepositoryEntityBase = EARepositoryEntityBase,\n> extends TreeRepository<T> implements IEARepository<T> {\n protected adapter: ExtraAttributesRepositoryAdapter<T, A>;\n\n protected options: EARepositoryOptions<T, A>;\n\n constructor(\n instance: DataSource | EntityManager,\n options: EARepositoryOptions<T, A>,\n ) {\n const {\n entity,\n attributeEntity,\n ...ctx\n } = options;\n\n super(\n entity,\n InstanceChecker.isDataSource(instance) ? instance.manager : instance,\n );\n\n this.options = options;\n this.adapter = new ExtraAttributesTreeRepositoryAdapter<T, A>({\n ...ctx,\n repository: this,\n attributeRepository: this.manager.getRepository(attributeEntity),\n });\n }\n\n // ------------------------------------------------------------------------------\n\n override create(): T;\n\n override create(entityLikeArray: DeepPartial<T>[]): T[];\n\n override create(entityLike: DeepPartial<T>): T;\n\n override create(entityLike?: DeepPartial<T> | DeepPartial<T>[]): T | T[] {\n if (!entityLike) {\n return super.create();\n }\n\n if (Array.isArray(entityLike)) {\n return super.create(entityLike).map((entity, i) => {\n this.preserveExtraAttributes(entity, entityLike[i]);\n return entity;\n });\n }\n\n const entity = super.create(entityLike);\n this.preserveExtraAttributes(entity, entityLike);\n return entity;\n }\n\n private preserveExtraAttributes(entity: T, source: DeepPartial<T>): void {\n const columns = new Set<string>();\n for (const col of this.metadata.columns) {\n columns.add(col.propertyName);\n }\n for (const rel of this.metadata.relations) {\n columns.add(rel.propertyName);\n }\n\n for (const key of Object.keys(source)) {\n if (!columns.has(key) && !(key in entity)) {\n (entity as Record<string, any>)[key] = (source as Record<string, any>)[key];\n }\n }\n }\n\n // ------------------------------------------------------------------------------\n\n async saveOneWithEA<E extends Record<string, any>>(\n input: T & E,\n attributes?: E,\n options?: EARepositorySaveOptions<T>,\n ): Promise<T & E> {\n return this.adapter.saveWithEA(input, attributes, options);\n }\n\n // ------------------------------------------------------------------------------\n\n async findOneWithEA(\n options: FindOneOptions<T>,\n extraOptions: EARepositoryFindOptions = {},\n ): Promise<T | undefined> {\n return this.adapter.findOneWithEA(options, extraOptions);\n }\n\n async findOneWithEAByPrimaryColumn<E extends Record<string, any>>(\n value: T[keyof T],\n extraOptions?: EARepositoryFindOptions,\n ): Promise<E> {\n return this.adapter.findOneWithEAByPrimaryColumn(value, extraOptions);\n }\n\n async findManyWithEA<\n E extends Record<string, any>,\n >(\n options: FindManyOptions<T>,\n extraOptions: EARepositoryFindOptions = {},\n ): Promise<(T & E)[]> {\n return this.adapter.findWithEA(options, extraOptions);\n }\n\n // ------------------------------------------------------------------------------\n\n async extendOneWithEA<E extends Record<string, any>>(\n entity: T,\n extraOptions: EARepositoryFindOptions = {},\n ): Promise<T & E> {\n const [output] = await this.extendManyWithEA([entity], extraOptions);\n\n return output as (T & E);\n }\n\n async extendManyWithEA<E extends Record<string, any>>(\n entities: T[],\n extraOptions: EARepositoryFindOptions = {},\n ): Promise<(T & E)[]> {\n return this.adapter.extendManyWithEA(entities, extraOptions);\n }\n\n // -------------------------------------------------------------------------------\n\n async findRoots(options?: FindTreeOptions): Promise<T[]> {\n const entities = await super.findRoots(options);\n\n await this.extendManyWithEA(entities);\n\n return entities;\n }\n\n async findDescendantsTree(\n entity: T,\n options?: FindTreeOptions,\n ): Promise<T> {\n const qb: SelectQueryBuilder<T> = this.createDescendantsQueryBuilder(\n 'treeEntity',\n 'treeClosure',\n entity,\n );\n FindOptionsUtils.applyOptionsToTreeQueryBuilder(qb, options);\n\n const entities = await qb.getRawAndEntities();\n const relationMaps = TreeRepositoryUtils.createRelationMaps(\n this.manager,\n this.metadata,\n 'treeEntity',\n entities.raw,\n );\n\n await this.extendManyWithEA(entities.entities);\n\n TreeRepositoryUtils.buildChildrenEntityTree(\n this.metadata,\n entity,\n entities.entities,\n relationMaps,\n {\n depth: -1,\n ...options,\n },\n );\n\n return entity;\n }\n\n async findAncestors(\n entity: T,\n options?: FindTreeOptions,\n ): Promise<T[]> {\n const entities = await super.findAncestors(entity, options);\n\n await this.extendManyWithEA(entities);\n\n return entities;\n }\n\n // -------------------------------------------------------------------------------\n\n async findAncestorsTree(\n entity: T,\n options?: FindTreeOptions,\n ): Promise<T> {\n const qb = this.createAncestorsQueryBuilder(\n 'treeEntity',\n 'treeClosure',\n entity,\n );\n FindOptionsUtils.applyOptionsToTreeQueryBuilder(qb, options);\n\n const entities = await qb.getRawAndEntities();\n const relationMaps = TreeRepositoryUtils.createRelationMaps(\n this.manager,\n this.metadata,\n 'treeEntity',\n entities.raw,\n );\n\n await this.extendManyWithEA(entities.entities);\n\n TreeRepositoryUtils.buildParentEntityTree(\n this.metadata,\n entity,\n entities.entities,\n relationMaps,\n );\n return entity;\n }\n\n // -------------------------------------------------------------------------------\n\n async updateClosureTable(entity: T, manager?: EntityManager) {\n const primaryKeyValue = this.metadata.primaryColumns[0].getEntityValue(entity);\n if (!primaryKeyValue) {\n return;\n }\n\n const closureTable = this.metadata.closureJunctionTable;\n if (!closureTable) {\n return;\n }\n\n if (manager) {\n await this.executeClosureTableUpdate(entity, manager);\n } else {\n await this.manager.connection.transaction(async (manager) => {\n await this.executeClosureTableUpdate(entity, manager);\n });\n }\n }\n\n private async executeClosureTableUpdate(entity: T, manager: EntityManager) {\n const primaryKeyValue = this.metadata.primaryColumns[0].getEntityValue(entity);\n\n const { tableName } = this.metadata.closureJunctionTable;\n const ancestorColumn = this.metadata.closureJunctionTable.ancestorColumns[0];\n const descendantColumn = this.metadata.closureJunctionTable.descendantColumns[0];\n\n const param = (index: number) => manager.connection.driver.createParameter(`p${index}`, index);\n\n // 1. Get All ancestors of current entity\n const ancestors = await manager.query<Record<string, any>[]>(\n `SELECT *\n FROM ${tableName}\n WHERE ${ancestorColumn.databasePath} != ${descendantColumn.databasePath} AND\n ${descendantColumn.databasePath} = ${param(0)} AND\n ${ancestorColumn.databasePath} != ${param(1)}`,\n [primaryKeyValue, primaryKeyValue],\n );\n\n if (!this.metadata.treeParentRelation) {\n return;\n }\n\n const parentId = this.metadata.treeParentRelation.joinColumns[0].getEntityValue(entity);\n\n let ancestorIds : string[];\n if (parentId) {\n ancestorIds = [\n parentId,\n ...ancestors\n .filter((ancestor) => ancestor[ancestorColumn.databasePath] !== parentId)\n .map((ancestor) => ancestor[ancestorColumn.databasePath]),\n ];\n } else {\n ancestorIds = ancestors.map((ancestor) => ancestor[ancestorColumn.databasePath]);\n }\n\n if (ancestorIds.length === 0) {\n return;\n }\n\n // 2. Get All descendants of current entity.\n const descendants = await manager.query<Record<string, any>[]>(\n `SELECT *\n FROM ${tableName}\n WHERE ${ancestorColumn.databasePath} != ${descendantColumn.databasePath} AND\n ${ancestorColumn.databasePath} = ${param(0)} AND\n ${descendantColumn.databasePath} != ${param(1)}`,\n [primaryKeyValue, primaryKeyValue],\n );\n\n if (parentId) {\n // 3. get all descendant\n const descendantIds = descendants\n .map((descendant) => descendant[descendantColumn.databasePath]);\n\n if (descendantIds.length > 0) {\n // 4. get all ancestors of each descendant\n const placeholders = descendantIds.map((_, i) => param(i + 1)).join(',');\n const ancestorsOfDescendants = await manager.query<Record<string, any>[]>(\n `SELECT *\n FROM ${tableName}\n WHERE\n ${ancestorColumn.databasePath} != ${param(0)} AND\n ${ancestorColumn.databasePath} != ${descendantColumn.databasePath} AND\n ${descendantColumn.databasePath} IN (${placeholders})`,\n [primaryKeyValue, ...descendantIds],\n );\n\n const acc = ancestorsOfDescendants.reduce((acc, curr) => {\n if (!acc[curr[descendantColumn.databasePath]]) {\n acc[curr[descendantColumn.databasePath]] = [];\n }\n\n acc[curr[descendantColumn.databasePath]].push(curr[ancestorColumn.databasePath]);\n return acc;\n }, {} as Record<string, string[]>);\n\n // 5. Check if for each child a relation exists with each ancestor (create if not exist)\n for (const descendant of descendantIds) {\n const ancestorsOfDescendent = acc[descendant] ?? [];\n\n for (const ancestorId of ancestorIds) {\n const index = ancestorsOfDescendent.indexOf(ancestorId);\n if (index === -1) {\n await manager.query(\n `INSERT INTO ${tableName}\n (${ancestorColumn.databasePath}, ${descendantColumn.databasePath})\n VALUES (${param(0)}, ${param(1)})`,\n [ancestorId, descendant],\n );\n }\n }\n }\n }\n } else {\n const descendantIds = [\n primaryKeyValue,\n ...descendants.map((descendant) => descendant[descendantColumn.databasePath]),\n ];\n\n for (const ancestorId of ancestorIds) {\n for (const descendantId of descendantIds) {\n await manager.query(\n `DELETE FROM ${tableName}\n WHERE ${ancestorColumn.databasePath} = ${param(0)}\n AND ${descendantColumn.databasePath} = ${param(1)}`,\n [ancestorId, descendantId],\n );\n }\n }\n }\n }\n}\n","/*\n * Copyright (c) 2021-2021.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n Column,\n CreateDateColumn,\n Entity, \n JoinColumn, \n ManyToOne,\n PrimaryGeneratedColumn, \n Unique,\n UpdateDateColumn,\n} from 'typeorm';\nimport type { Policy, PolicyAttribute, Realm } from '@authup/core-kit';\nimport {\n deserialize,\n serialize,\n} from '@authup/kit';\nimport { PolicyEntity } from '../policy/entity.ts';\nimport { RealmEntity } from '../realm/index.ts';\n\n@Unique(['name', 'policy_id'])\n@Entity({ name: 'auth_policy_attributes' })\nexport class PolicyAttributeEntity implements PolicyAttribute {\n @PrimaryGeneratedColumn('uuid')\n id: string;\n\n @Column({\n type: 'varchar',\n length: 255, \n })\n name: string;\n\n @Column({\n type: 'text',\n nullable: true,\n transformer: {\n to(value: any): any {\n return serialize(value);\n },\n from(value: any): any {\n return deserialize(value);\n },\n },\n })\n value: string | null;\n\n // ------------------------------------------------------------------\n\n @Column({ nullable: true })\n realm_id: Realm['id'] | null;\n\n @ManyToOne(() => RealmEntity, {\n onDelete: 'CASCADE',\n nullable: true, \n })\n @JoinColumn({ name: 'realm_id' })\n realm: RealmEntity | null;\n\n // ------------------------------------------------------------------\n\n @Column()\n policy_id: Policy['id'];\n\n @ManyToOne(() => PolicyEntity, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'policy_id' })\n policy: PolicyEntity;\n\n // ------------------------------------------------------------------\n\n @CreateDateColumn()\n created_at: Date;\n\n @UpdateDateColumn()\n updated_at: Date;\n}\n","/*\n * Copyright (c) 2022-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { PolicyAttribute } from '@authup/core-kit';\nimport {\n EntityDefaultEventName, \n EntityType, \n buildEntityChannelName, \n buildEntityNamespaceName,\n} from '@authup/core-kit';\nimport type { DomainEventDestinations } from '@authup/server-kit';\nimport { buildRedisKeyPath } from '@authup/server-kit';\nimport type {\n EntitySubscriberInterface, \n InsertEvent,\n RemoveEvent,\n UpdateEvent,\n} from 'typeorm';\nimport { EventSubscriber } from 'typeorm';\nimport { publishDomainEvent } from '../../event-publisher/index.ts';\nimport { PolicyAttributeEntity } from './entity.ts';\nimport { CachePrefix } from '../constants.ts';\n\nasync function publishEvent(\n event: `${EntityDefaultEventName}`,\n data: PolicyAttribute,\n) {\n const destinations : DomainEventDestinations = [\n { channel: (id) => buildEntityChannelName(EntityType.POLICY_ATTRIBUTE, id) },\n ];\n if (data.realm_id) {\n destinations.push({\n channel: (id) => buildEntityChannelName(EntityType.POLICY_ATTRIBUTE, id),\n namespace: buildEntityNamespaceName(data.realm_id),\n });\n }\n await publishDomainEvent({\n content: {\n type: EntityType.POLICY_ATTRIBUTE,\n event,\n data,\n },\n destinations,\n });\n}\n\n@EventSubscriber()\nexport class PolicyAttributeSubscriber implements EntitySubscriberInterface<PolicyAttribute> {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n listenTo(): Function | string {\n return PolicyAttributeEntity;\n }\n\n async afterInsert(event: InsertEvent<PolicyAttribute>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n if (event.connection.queryResultCache) {\n await event.connection.queryResultCache.remove([\n buildRedisKeyPath({\n prefix: CachePrefix.POLICY_OWNED_ATTRIBUTES,\n key: event.entity.policy_id,\n }),\n ]);\n }\n\n await publishEvent(EntityDefaultEventName.CREATED, event.entity);\n }\n\n async afterUpdate(event: UpdateEvent<PolicyAttribute>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n if (event.connection.queryResultCache) {\n await event.connection.queryResultCache.remove([\n buildRedisKeyPath({\n prefix: CachePrefix.POLICY_OWNED_ATTRIBUTES,\n key: event.entity.policy_id,\n }),\n ]);\n }\n\n await publishEvent(EntityDefaultEventName.UPDATED, event.entity as PolicyAttribute);\n }\n\n async afterRemove(event: RemoveEvent<PolicyAttribute>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n if (event.connection.queryResultCache) {\n await event.connection.queryResultCache.remove([\n buildRedisKeyPath({\n prefix: CachePrefix.POLICY_OWNED_ATTRIBUTES,\n key: event.entity.policy_id,\n }),\n ]);\n }\n\n await publishEvent(EntityDefaultEventName.DELETED, event.entity);\n }\n}\n","/*\n * Copyright (c) 2021-2021.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { BasePolicy } from '@authup/access';\nimport type { Policy, PolicyAttribute } from '@authup/core-kit';\nimport type { DataSource, EntityManager } from 'typeorm';\nimport { EntityNotFoundError } from 'typeorm';\nimport { CachePrefix } from '../constants.ts';\nimport { EATreeRepository } from '../../extra-attribute-repository/index.ts';\nimport { PolicyAttributeEntity } from '../policy-attribute/index.ts';\nimport { PolicyEntity } from './entity.ts';\n\nexport class PolicyRepository extends EATreeRepository<Policy, PolicyAttribute> {\n constructor(instance: DataSource | EntityManager) {\n super(instance, {\n attributeProperties: (input, parent) => {\n input.policy_id = parent.id;\n input.realm_id = parent.realm_id;\n\n return input;\n },\n entity: PolicyEntity,\n entityPrimaryColumn: 'id',\n attributeEntity: PolicyAttributeEntity,\n attributeForeignColumn: 'policy_id',\n cachePrefix: CachePrefix.POLICY_OWNED_ATTRIBUTES,\n });\n }\n\n async findDescendantsTreeById(id: string): Promise<BasePolicy | null> {\n const entity = this.create();\n entity.id = id;\n\n try {\n return await this.findDescendantsTree(entity);\n } catch (e) {\n if (e instanceof EntityNotFoundError) {\n return null;\n }\n\n throw e;\n }\n }\n}\n","/*\n * Copyright (c) 2022-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Policy } from '@authup/core-kit';\nimport {\n EntityDefaultEventName,\n EntityType,\n buildEntityChannelName,\n} from '@authup/core-kit';\nimport { buildRedisKeyPath } from '@authup/server-kit';\nimport type {\n EntitySubscriberInterface, \n InsertEvent,\n RemoveEvent,\n UpdateEvent,\n} from 'typeorm';\nimport { EventSubscriber } from 'typeorm';\nimport { publishDomainEvent } from '../../event-publisher/index.ts';\nimport { PolicyEntity } from './entity.ts';\nimport { CachePrefix } from '../constants.ts';\n\nasync function publishEvent(\n event: `${EntityDefaultEventName}`,\n data: Policy,\n) {\n await publishDomainEvent({\n content: {\n type: EntityType.POLICY,\n event,\n data,\n },\n destinations: [\n { channel: (id) => buildEntityChannelName(EntityType.POLICY, id) },\n ],\n });\n}\n\n@EventSubscriber()\nexport class PolicySubscriber implements EntitySubscriberInterface<Policy> {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n listenTo(): Function | string {\n return PolicyEntity;\n }\n\n async afterInsert(event: InsertEvent<Policy>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n await publishEvent(EntityDefaultEventName.CREATED, event.entity);\n }\n\n async afterUpdate(event: UpdateEvent<Policy>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n if (event.connection.queryResultCache) {\n await event.connection.queryResultCache.remove([\n buildRedisKeyPath({\n prefix: CachePrefix.REALM,\n key: event.entity.id,\n }),\n ]);\n }\n\n await publishEvent(EntityDefaultEventName.UPDATED, event.entity as Policy);\n }\n\n async afterRemove(event: RemoveEvent<Policy>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n if (event.connection.queryResultCache) {\n await event.connection.queryResultCache.remove([\n buildRedisKeyPath({\n prefix: CachePrefix.POLICY,\n key: event.entity.id,\n }),\n ]);\n }\n\n await publishEvent(EntityDefaultEventName.DELETED, event.entity);\n }\n}\n","/*\n * Copyright (c) 2021-2021.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n Column,\n CreateDateColumn,\n Entity, \n Index,\n JoinColumn,\n ManyToOne,\n PrimaryGeneratedColumn,\n UpdateDateColumn,\n} from 'typeorm';\nimport type {\n Client,\n ClientPermission,\n Permission,\n Policy,\n Realm,\n} from '@authup/core-kit';\nimport { PermissionEntity } from '../permission/index.ts';\nimport { PolicyEntity } from '../policy/index.ts';\nimport { ClientEntity } from '../client/entity.ts';\nimport { RealmEntity } from '../realm/index.ts';\n\n@Entity({ name: 'auth_client_permissions' })\n@Index(['client_id', 'permission_id'], { unique: true })\nexport class ClientPermissionEntity implements ClientPermission {\n @PrimaryGeneratedColumn('uuid')\n id: string;\n\n // ------------------------------------------------------------------\n\n @Column({ nullable: true })\n policy_id: string | null;\n\n @ManyToOne(() => PolicyEntity, {\n onDelete: 'SET NULL',\n nullable: true, \n })\n @JoinColumn({ name: 'policy_id' })\n policy: Policy | null;\n\n @Column()\n client_id: string;\n\n @ManyToOne(() => ClientEntity, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'client_id' })\n client: Client;\n\n @Column({ nullable: true })\n client_realm_id: Client['id'] | null;\n\n @ManyToOne(() => RealmEntity, {\n onDelete: 'CASCADE',\n nullable: true, \n })\n @JoinColumn({ name: 'client_realm_id' })\n client_realm: Realm | null;\n\n @Column({ type: 'varchar' })\n permission_id: string;\n\n @ManyToOne(() => PermissionEntity, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'permission_id' })\n permission: Permission;\n\n @Column({ nullable: true })\n permission_realm_id: Realm['id'] | null;\n\n @ManyToOne(() => RealmEntity, {\n onDelete: 'CASCADE',\n nullable: true, \n })\n @JoinColumn({ name: 'permission_realm_id' })\n permission_realm: Realm | null;\n\n // ------------------------------------------------------------------\n\n @CreateDateColumn()\n created_at: Date;\n\n @UpdateDateColumn()\n updated_at: Date;\n}\n","/*\n * Copyright (c) 2022-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { ClientPermission } from '@authup/core-kit';\nimport {\n EntityDefaultEventName, \n EntityType,\n buildEntityChannelName,\n buildEntityNamespaceName,\n} from '@authup/core-kit';\nimport type { DomainEventDestination } from '@authup/server-kit';\nimport { buildRedisKeyPath } from '@authup/server-kit';\nimport type {\n EntitySubscriberInterface, \n InsertEvent,\n RemoveEvent,\n UpdateEvent,\n} from 'typeorm';\nimport { EventSubscriber } from 'typeorm';\nimport { publishDomainEvent } from '../../event-publisher/index.ts';\nimport { CachePrefix } from '../constants.ts';\nimport { ClientPermissionEntity } from './entity.ts';\n\nasync function publishEvent(\n event: `${EntityDefaultEventName}`,\n data: ClientPermission,\n) {\n const destinations : DomainEventDestination[] = [\n { channel: (id) => buildEntityChannelName(EntityType.CLIENT_PERMISSION, id) },\n ];\n if (data.client_realm_id) {\n destinations.push({\n channel: (id) => buildEntityChannelName(EntityType.CLIENT_PERMISSION, id),\n namespace: buildEntityNamespaceName(data.client_realm_id),\n });\n }\n if (data.permission_realm_id) {\n destinations.push({\n channel: (id) => buildEntityChannelName(EntityType.CLIENT_PERMISSION, id),\n namespace: buildEntityNamespaceName(data.permission_realm_id),\n });\n }\n\n await publishDomainEvent({\n content: {\n type: EntityType.CLIENT_PERMISSION,\n event,\n data,\n },\n destinations,\n });\n}\n\n@EventSubscriber()\nexport class ClientPermissionSubscriber implements EntitySubscriberInterface<ClientPermission> {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n listenTo(): Function | string {\n return ClientPermissionEntity;\n }\n\n async afterInsert(event: InsertEvent<ClientPermission>): Promise<any> {\n if (event.connection.queryResultCache) {\n await event.connection.queryResultCache.remove([\n buildRedisKeyPath({\n prefix: CachePrefix.CLIENT_OWNED_PERMISSIONS,\n key: event.entity.client_id,\n }),\n ]);\n }\n\n await publishEvent(EntityDefaultEventName.CREATED, event.entity);\n\n return Promise.resolve(undefined);\n }\n\n async afterUpdate(event: UpdateEvent<ClientPermission>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n if (event.connection.queryResultCache) {\n await event.connection.queryResultCache.remove([\n buildRedisKeyPath({\n prefix: CachePrefix.CLIENT_OWNED_PERMISSIONS,\n key: event.entity.client_id,\n }),\n ]);\n }\n\n await publishEvent(EntityDefaultEventName.UPDATED, event.entity as ClientPermission);\n }\n\n async afterRemove(event: RemoveEvent<ClientPermission>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n if (event.connection.queryResultCache) {\n await event.connection.queryResultCache.remove([\n buildRedisKeyPath({\n prefix: CachePrefix.CLIENT_OWNED_PERMISSIONS,\n key: event.entity.client_id,\n }),\n ]);\n }\n\n await publishEvent(EntityDefaultEventName.DELETED, event.entity);\n }\n}\n","/*\n * Copyright (c) 2021-2021.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Client, Realm, Role } from '@authup/core-kit';\nimport {\n Column,\n CreateDateColumn,\n Entity,\n Index,\n JoinColumn,\n ManyToOne,\n PrimaryGeneratedColumn,\n Unique,\n UpdateDateColumn,\n} from 'typeorm';\nimport { RealmEntity } from '../realm/index.ts';\n\n@Entity({ name: 'auth_roles' })\n@Unique(['name', 'client_id', 'realm_id'])\nexport class RoleEntity implements Role {\n @PrimaryGeneratedColumn('uuid')\n id: string;\n\n @Column({\n type: 'boolean',\n default: false,\n })\n built_in: boolean;\n\n @Column({\n type: 'varchar',\n length: 128, \n })\n name: string;\n\n @Column({\n type: 'varchar',\n length: 256,\n nullable: true, \n })\n display_name: string | null;\n\n @Column({\n type: 'text',\n nullable: true, \n })\n description: string | null;\n\n @Column({\n type: 'varchar',\n length: 16,\n nullable: true, \n })\n target: string | null;\n\n // ------------------------------------------------------------------\n\n @Index()\n @Column({ nullable: true })\n client_id: Client['id'] | null;\n\n @ManyToOne(() => RealmEntity, {\n onDelete: 'SET NULL',\n nullable: true, \n })\n @JoinColumn({ name: 'client_id' })\n client: Client | null;\n\n // ------------------------------------------------------------------\n\n @Index()\n @Column({ nullable: true })\n realm_id: Realm['id'] | null;\n\n @ManyToOne(() => RealmEntity, {\n onDelete: 'CASCADE',\n nullable: true, \n })\n @JoinColumn({ name: 'realm_id' })\n realm: Realm | null;\n\n // ------------------------------------------------------------------\n\n @CreateDateColumn()\n created_at: string;\n\n @UpdateDateColumn()\n updated_at: string;\n}\n","/*\n * Copyright (c) 2021-2021.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n Column,\n CreateDateColumn,\n Entity, \n JoinColumn, \n ManyToOne,\n PrimaryGeneratedColumn, \n Unique,\n UpdateDateColumn,\n} from 'typeorm';\nimport type { Realm, Role, RoleAttribute } from '@authup/core-kit';\nimport {\n deserialize,\n serialize,\n} from '@authup/kit';\nimport { RealmEntity } from '../realm/index.ts';\nimport { RoleEntity } from '../role/entity.ts';\n\n@Unique(['name', 'role_id'])\n@Entity({ name: 'auth_role_attributes' })\nexport class RoleAttributeEntity implements RoleAttribute {\n @PrimaryGeneratedColumn('uuid')\n id: string;\n\n @Column({\n type: 'varchar',\n length: 255, \n })\n name: string;\n\n @Column({\n type: 'text',\n nullable: true,\n transformer: {\n to(value: any): any {\n return serialize(value);\n },\n from(value: any): any {\n return deserialize(value);\n },\n },\n })\n value: string | null;\n\n // ------------------------------------------------------------------\n\n @Column({ nullable: true })\n realm_id: Realm['id'] | null;\n\n @ManyToOne(() => RealmEntity, {\n onDelete: 'CASCADE',\n nullable: true, \n })\n @JoinColumn({ name: 'realm_id' })\n realm: RealmEntity | null;\n\n @Column()\n role_id: Role['id'];\n\n @ManyToOne(() => RoleEntity, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'role_id' })\n role: RoleEntity;\n\n // ------------------------------------------------------------------\n\n @CreateDateColumn()\n created_at: string;\n\n @UpdateDateColumn()\n updated_at: string;\n}\n","/*\n * Copyright (c) 2021-2021.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n Column,\n CreateDateColumn,\n Entity, \n Index,\n JoinColumn,\n ManyToOne,\n PrimaryGeneratedColumn,\n UpdateDateColumn,\n} from 'typeorm';\nimport type {\n Permission,\n Policy,\n Realm,\n Role,\n RolePermission,\n} from '@authup/core-kit';\nimport { PolicyEntity } from '../policy/index.ts';\nimport { RoleEntity } from '../role/entity.ts';\nimport { PermissionEntity } from '../permission/index.ts';\nimport { RealmEntity } from '../realm/index.ts';\n\n@Entity({ name: 'auth_role_permissions' })\n@Index(['permission_id', 'role_id'], { unique: true })\nexport class RolePermissionEntity implements RolePermission {\n @PrimaryGeneratedColumn('uuid')\n id: string;\n\n // ------------------------------------------------------------------\n\n @CreateDateColumn()\n created_at: Date;\n\n @UpdateDateColumn()\n updated_at: Date;\n\n // ------------------------------------------------------------------\n\n @Column({ nullable: true })\n policy_id: string | null;\n\n @ManyToOne(() => PolicyEntity, {\n onDelete: 'SET NULL',\n nullable: true, \n })\n @JoinColumn({ name: 'policy_id' })\n policy: Policy | null;\n\n @Column()\n role_id: string;\n\n @ManyToOne(() => RoleEntity, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'role_id' })\n role: Role;\n\n @Column({ nullable: true })\n role_realm_id: Realm['id'] | null;\n\n @ManyToOne(() => RealmEntity, {\n onDelete: 'CASCADE',\n nullable: true, \n })\n @JoinColumn({ name: 'role_realm_id' })\n role_realm: Realm | null;\n\n @Column()\n permission_id: string;\n\n @ManyToOne(() => PermissionEntity, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'permission_id' })\n permission: Permission;\n\n @Column({ nullable: true })\n permission_realm_id: Realm['id'] | null;\n\n @ManyToOne(() => RealmEntity, {\n onDelete: 'CASCADE',\n nullable: true, \n })\n @JoinColumn({ name: 'permission_realm_id' })\n permission_realm: Realm | null;\n}\n","/*\n * Copyright (c) 2022-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { RolePermission } from '@authup/core-kit';\nimport {\n EntityDefaultEventName, \n EntityType,\n buildEntityChannelName,\n buildEntityNamespaceName,\n} from '@authup/core-kit';\nimport type { DomainEventDestination } from '@authup/server-kit';\nimport { buildRedisKeyPath } from '@authup/server-kit';\nimport type {\n EntitySubscriberInterface, \n InsertEvent,\n RemoveEvent,\n UpdateEvent,\n} from 'typeorm';\nimport { EventSubscriber } from 'typeorm';\nimport { publishDomainEvent } from '../../event-publisher/index.ts';\nimport { RolePermissionEntity } from './entity.ts';\nimport { CachePrefix } from '../constants.ts';\n\nasync function publishEvent(\n event: `${EntityDefaultEventName}`,\n data: RolePermission,\n) {\n const destinations : DomainEventDestination[] = [\n { channel: (id) => buildEntityChannelName(EntityType.ROLE_PERMISSION, id) },\n ];\n if (data.role_realm_id) {\n destinations.push({\n channel: (id) => buildEntityChannelName(EntityType.ROLE_PERMISSION, id),\n namespace: buildEntityNamespaceName(data.role_realm_id),\n });\n }\n if (data.permission_realm_id) {\n destinations.push({\n channel: (id) => buildEntityChannelName(EntityType.ROLE_PERMISSION, id),\n namespace: buildEntityNamespaceName(data.permission_realm_id),\n });\n }\n\n await publishDomainEvent({\n content: {\n type: EntityType.ROLE_PERMISSION,\n event,\n data,\n },\n destinations,\n });\n}\n\n@EventSubscriber()\nexport class RolePermissionSubscriber implements EntitySubscriberInterface<RolePermission> {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n listenTo(): Function | string {\n return RolePermissionEntity;\n }\n\n async afterInsert(event: InsertEvent<RolePermission>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n if (event.connection.queryResultCache) {\n await event.connection.queryResultCache.remove([\n buildRedisKeyPath({\n prefix: CachePrefix.ROLE_OWNED_PERMISSIONS,\n key: event.entity.role_id,\n }),\n ]);\n }\n\n await publishEvent(EntityDefaultEventName.CREATED, event.entity);\n }\n\n async afterUpdate(event: UpdateEvent<RolePermission>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n if (event.connection.queryResultCache) {\n await event.connection.queryResultCache.remove([\n buildRedisKeyPath({\n prefix: CachePrefix.ROLE_OWNED_PERMISSIONS,\n key: event.entity.role_id,\n }),\n ]);\n }\n\n await publishEvent(EntityDefaultEventName.UPDATED, event.entity as RolePermission);\n }\n\n async afterRemove(event: RemoveEvent<RolePermission>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n if (event.connection.queryResultCache) {\n await event.connection.queryResultCache.remove([\n buildRedisKeyPath({\n prefix: CachePrefix.ROLE_OWNED_PERMISSIONS,\n key: event.entity.role_id,\n }),\n ]);\n }\n\n await publishEvent(EntityDefaultEventName.DELETED, event.entity);\n }\n}\n","/*\n * Copyright (c) 2021-2021.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { buildRedisKeyPath } from '@authup/server-kit';\nimport type { DataSource, EntityManager } from 'typeorm';\nimport type { Role } from '@authup/core-kit';\nimport type { BasePolicy, PermissionPolicyBinding } from '@authup/access';\nimport { CachePrefix } from '../constants.ts';\nimport { EARepository } from '../../extra-attribute-repository/index.ts';\nimport { RoleAttributeEntity } from '../role-attribute/entity.ts';\nimport { RoleEntity } from './entity.ts';\nimport { RolePermissionEntity } from '../role-permission/index.ts';\nimport { PolicyRepository } from '../policy/index.ts';\n\nexport class RoleRepository extends EARepository<RoleEntity, RoleAttributeEntity> {\n constructor(instance: DataSource | EntityManager) {\n super(instance, {\n attributeProperties: (input, parent) => {\n input.role_id = parent.id;\n input.realm_id = parent.realm_id;\n\n return input;\n },\n entity: RoleEntity,\n entityPrimaryColumn: 'id',\n attributeEntity: RoleAttributeEntity,\n attributeForeignColumn: 'role_id',\n cachePrefix: CachePrefix.ROLE_OWNED_PERMISSIONS,\n });\n }\n\n async getBoundPermissionsForMany(\n ids: (string | Role)[],\n ) : Promise<PermissionPolicyBinding[]> {\n const promises : Promise<PermissionPolicyBinding[]>[] = [];\n\n for (const id of ids) {\n promises.push(this.getBoundPermissions(id));\n }\n\n const abilities = await Promise.all(promises);\n\n return abilities.flat();\n }\n\n async clearBoundPermissionsCache(entity: string | Role) {\n let id : string;\n if (typeof entity === 'string') {\n id = entity;\n } else {\n id = entity.id;\n }\n\n if (!this.manager.connection.queryResultCache) {\n return;\n }\n\n await this.manager.connection.queryResultCache.remove([buildRedisKeyPath({\n prefix: CachePrefix.ROLE_OWNED_PERMISSIONS,\n key: id,\n })]);\n }\n\n async getBoundPermissions(\n entity: string | Role,\n ) : Promise<PermissionPolicyBinding[]> {\n let id : string;\n if (typeof entity === 'string') {\n id = entity;\n } else {\n id = entity.id;\n }\n\n const repository = this.manager.getRepository(RolePermissionEntity);\n const entities = await repository.find({\n where: { role_id: id },\n relations: { permission: true },\n cache: {\n id: buildRedisKeyPath({\n prefix: CachePrefix.ROLE_OWNED_PERMISSIONS,\n key: id,\n }),\n milliseconds: 60_000,\n },\n });\n\n const policyIds = new Set<string>();\n for (const entry of entities) {\n if (entry.policy_id) {\n policyIds.add(entry.policy_id);\n }\n }\n\n const policyTrees = await this.loadPolicyTrees([...policyIds]);\n\n return entities.map((entry) => {\n const policies: BasePolicy[] = [];\n if (entry.policy_id && policyTrees[entry.policy_id]) {\n policies.push(policyTrees[entry.policy_id]);\n }\n\n return {\n permission: entry.permission,\n policies: policies.length > 0 ? policies : undefined,\n };\n });\n }\n\n private async loadPolicyTrees(policyIds: string[]): Promise<Record<string, BasePolicy>> {\n if (policyIds.length === 0) {\n return {};\n }\n\n const policyRepository = new PolicyRepository(this.manager);\n const result: Record<string, BasePolicy> = {};\n\n for (const id of policyIds) {\n const tree = await policyRepository.findDescendantsTreeById(id);\n if (tree) {\n result[id] = tree;\n }\n }\n\n return result;\n }\n}\n","/*\n * Copyright (c) 2022-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Role } from '@authup/core-kit';\nimport {\n EntityDefaultEventName, \n EntityType,\n buildEntityChannelName,\n buildEntityNamespaceName,\n} from '@authup/core-kit';\nimport type { DomainEventDestinations } from '@authup/server-kit';\nimport { buildRedisKeyPath } from '@authup/server-kit';\nimport type {\n EntitySubscriberInterface,\n InsertEvent,\n RemoveEvent,\n UpdateEvent,\n} from 'typeorm';\nimport { EventSubscriber } from 'typeorm';\nimport { publishDomainEvent } from '../../event-publisher/index.ts';\nimport { RoleEntity } from './entity.ts';\nimport { CachePrefix } from '../constants.ts';\n\nasync function publishEvent(\n event: `${EntityDefaultEventName}`,\n data: Role,\n) {\n const destinations : DomainEventDestinations = [\n { channel: (id) => buildEntityChannelName(EntityType.ROLE, id) },\n ];\n if (data.realm_id) {\n destinations.push({\n channel: (id) => buildEntityChannelName(EntityType.ROLE, id),\n namespace: buildEntityNamespaceName(data.realm_id),\n });\n }\n await publishDomainEvent({\n content: {\n type: EntityType.ROLE,\n event,\n data,\n },\n destinations,\n });\n}\n\n@EventSubscriber()\nexport class RoleSubscriber implements EntitySubscriberInterface<Role> {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n listenTo(): Function | string {\n return RoleEntity;\n }\n\n async afterInsert(event: InsertEvent<Role>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n await publishEvent(EntityDefaultEventName.CREATED, event.entity);\n }\n\n async afterUpdate(event: UpdateEvent<Role>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n if (event.connection.queryResultCache) {\n await event.connection.queryResultCache.remove([\n buildRedisKeyPath({\n prefix: CachePrefix.ROLE,\n key: event.entity.id,\n }),\n ]);\n }\n\n await publishEvent(EntityDefaultEventName.UPDATED, event.entity as Role);\n }\n\n async afterRemove(event: RemoveEvent<Role>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n if (event.connection.queryResultCache) {\n await event.connection.queryResultCache.remove([\n buildRedisKeyPath({\n prefix: CachePrefix.ROLE,\n key: event.entity.id,\n }),\n ]);\n }\n\n await publishEvent(EntityDefaultEventName.DELETED, event.entity);\n }\n}\n","/*\n * Copyright (c) 2021-2021.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n Column,\n CreateDateColumn,\n Entity,\n Index,\n JoinColumn,\n ManyToOne,\n PrimaryGeneratedColumn,\n UpdateDateColumn,\n} from 'typeorm';\nimport type {\n Client, \n ClientRole, \n Realm, \n Role,\n} from '@authup/core-kit';\nimport { RoleEntity } from '../role/index.ts';\nimport { ClientEntity } from '../client/entity.ts';\nimport { RealmEntity } from '../realm/index.ts';\n\n@Entity({ name: 'auth_client_roles' })\n@Index(['role_id', 'client_id'], { unique: true })\nexport class ClientRoleEntity implements ClientRole {\n @PrimaryGeneratedColumn('uuid')\n id: string;\n\n // ------------------------------------------------------------------\n\n @Column()\n role_id: string;\n\n @ManyToOne(() => RoleEntity, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'role_id' })\n role: Role;\n\n @Column({ nullable: true })\n role_realm_id: Realm['id'] | null;\n\n @ManyToOne(() => RealmEntity, {\n onDelete: 'CASCADE',\n nullable: true, \n })\n @JoinColumn({ name: 'role_realm_id' })\n role_realm: Realm | null;\n\n @Column()\n client_id: string;\n\n @ManyToOne(() => ClientEntity, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'client_id' })\n client: Client;\n\n @Column({ nullable: true })\n client_realm_id: Realm['id'] | null;\n\n @ManyToOne(() => RealmEntity, {\n onDelete: 'CASCADE',\n nullable: true, \n })\n @JoinColumn({ name: 'client_realm_id' })\n client_realm: Realm | null;\n\n // ------------------------------------------------------------------\n\n @CreateDateColumn()\n created_at: string;\n\n @UpdateDateColumn()\n updated_at: string;\n}\n","/*\n * Copyright (c) 2022-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { ClientRole } from '@authup/core-kit';\nimport {\n EntityDefaultEventName, \n EntityType,\n buildEntityChannelName,\n buildEntityNamespaceName,\n} from '@authup/core-kit';\nimport type { DomainEventDestination } from '@authup/server-kit';\nimport { buildRedisKeyPath } from '@authup/server-kit';\nimport type {\n EntitySubscriberInterface, \n InsertEvent,\n RemoveEvent,\n UpdateEvent,\n} from 'typeorm';\nimport { EventSubscriber } from 'typeorm';\nimport { publishDomainEvent } from '../../event-publisher/index.ts';\nimport { CachePrefix } from '../constants.ts';\nimport { ClientRoleEntity } from './entity.ts';\n\nasync function publishEvent(\n event: `${EntityDefaultEventName}`,\n data: ClientRole,\n) {\n const destinations : DomainEventDestination[] = [\n { channel: (id) => buildEntityChannelName(EntityType.CLIENT_ROLE, id) },\n ];\n if (data.client_realm_id) {\n destinations.push({\n channel: (id) => buildEntityChannelName(EntityType.CLIENT_ROLE, id),\n namespace: buildEntityNamespaceName(data.client_realm_id),\n });\n }\n if (data.role_realm_id) {\n destinations.push({\n channel: (id) => buildEntityChannelName(EntityType.CLIENT_ROLE, id),\n namespace: buildEntityNamespaceName(data.role_realm_id),\n });\n }\n\n await publishDomainEvent({\n content: {\n type: EntityType.CLIENT_ROLE,\n event,\n data,\n },\n destinations,\n });\n}\n\n@EventSubscriber()\nexport class ClientRoleSubscriber implements EntitySubscriberInterface<ClientRole> {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n listenTo(): Function | string {\n return ClientRoleEntity;\n }\n\n async afterInsert(event: InsertEvent<ClientRole>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n if (event.connection.queryResultCache) {\n await event.connection.queryResultCache.remove([\n buildRedisKeyPath({\n prefix: CachePrefix.CLIENT_OWNED_ROLES,\n key: event.entity.client_id,\n }),\n ]);\n }\n\n await publishEvent(EntityDefaultEventName.CREATED, event.entity);\n }\n\n async afterUpdate(event: UpdateEvent<ClientRole>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n if (event.connection.queryResultCache) {\n await event.connection.queryResultCache.remove([\n buildRedisKeyPath({\n prefix: CachePrefix.CLIENT_OWNED_ROLES,\n key: event.entity.client_id,\n }),\n ]);\n }\n\n await publishEvent(EntityDefaultEventName.UPDATED, event.entity as ClientRole);\n }\n\n async afterRemove(event: RemoveEvent<ClientRole>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n if (event.connection.queryResultCache) {\n await event.connection.queryResultCache.remove([\n buildRedisKeyPath({\n prefix: CachePrefix.CLIENT_OWNED_ROLES,\n key: event.entity.client_id,\n }),\n ]);\n }\n\n await publishEvent(EntityDefaultEventName.DELETED, event.entity);\n }\n}\n","/*\n * Copyright (c) 2021-2021.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Client, Role } from '@authup/core-kit';\nimport type { BasePolicy, PermissionPolicyBinding } from '@authup/access';\nimport { buildRedisKeyPath } from '@authup/server-kit';\nimport type { DataSource, EntityManager } from 'typeorm';\nimport { InstanceChecker, Repository } from 'typeorm';\nimport { CachePrefix } from '../constants.ts';\nimport { ClientPermissionEntity } from '../client-permission/index.ts';\nimport { ClientRoleEntity } from '../client-role/index.ts';\nimport { PolicyRepository } from '../policy/index.ts';\nimport { ClientEntity } from './entity.ts';\n\nexport class ClientRepository extends Repository<ClientEntity> {\n #manager: EntityManager;\n\n constructor(instance: DataSource | EntityManager) {\n super(ClientEntity, InstanceChecker.isDataSource(instance) ? instance.manager : instance);\n this.#manager = InstanceChecker.isDataSource(instance) ? instance.manager : instance;\n }\n\n async getBoundRoles(\n entity: string | Client,\n ) : Promise<Role[]> {\n let id : string;\n if (typeof entity === 'string') {\n id = entity;\n } else {\n id = entity.id;\n }\n\n const entities = await this.manager\n .getRepository(ClientRoleEntity)\n .find({\n where: { client_id: id },\n relations: { role: true },\n cache: {\n id: buildRedisKeyPath({\n prefix: CachePrefix.CLIENT_OWNED_ROLES,\n key: id,\n }),\n milliseconds: 60_000,\n },\n });\n\n return entities.map((entity) => entity.role);\n }\n\n async getBoundPermissions(\n entity: string | Client,\n ) : Promise<PermissionPolicyBinding[]> {\n let id : string;\n if (typeof entity === 'string') {\n id = entity;\n } else {\n id = entity.id;\n }\n\n const repository = this.manager.getRepository(ClientPermissionEntity);\n\n const entities = await repository.find({\n where: { client_id: id },\n relations: { permission: true },\n cache: {\n id: buildRedisKeyPath({\n prefix: CachePrefix.CLIENT_OWNED_PERMISSIONS,\n key: id,\n }),\n milliseconds: 60_000,\n },\n });\n\n const policyIds = new Set<string>();\n for (const entry of entities) {\n if (entry.policy_id) {\n policyIds.add(entry.policy_id);\n }\n }\n\n const policyTrees = await this.loadPolicyTrees([...policyIds]);\n\n return entities.map((entry) => {\n const policies: BasePolicy[] = [];\n if (entry.policy_id && policyTrees[entry.policy_id]) {\n policies.push(policyTrees[entry.policy_id]);\n }\n\n return {\n permission: entry.permission,\n policies: policies.length > 0 ? policies : undefined,\n };\n });\n }\n\n private async loadPolicyTrees(policyIds: string[]): Promise<Record<string, BasePolicy>> {\n if (policyIds.length === 0) {\n return {};\n }\n\n const policyRepository = new PolicyRepository(this.#manager);\n const result: Record<string, BasePolicy> = {};\n\n for (const id of policyIds) {\n const tree = await policyRepository.findDescendantsTreeById(id);\n if (tree) {\n result[id] = tree;\n }\n }\n\n return result;\n }\n}\n","/*\n * Copyright (c) 2022-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Client } from '@authup/core-kit';\nimport {\n EntityDefaultEventName, \n EntityType, \n buildEntityChannelName, \n buildEntityNamespaceName,\n} from '@authup/core-kit';\nimport { buildRedisKeyPath } from '@authup/server-kit';\nimport type {\n EntitySubscriberInterface, \n InsertEvent,\n RemoveEvent,\n UpdateEvent,\n} from 'typeorm';\nimport { EventSubscriber } from 'typeorm';\nimport { publishDomainEvent } from '../../event-publisher/index.ts';\nimport { ClientEntity } from './entity.ts';\nimport { CachePrefix } from '../constants.ts';\n\nasync function publishEvent(\n event: `${EntityDefaultEventName}`,\n data: Client,\n) {\n await publishDomainEvent({\n content: {\n type: EntityType.CLIENT,\n event,\n data,\n },\n destinations: [\n {\n channel: (id) => buildEntityChannelName(EntityType.CLIENT, id),\n namespace: buildEntityNamespaceName(data.realm_id),\n },\n { channel: (id) => buildEntityChannelName(EntityType.CLIENT, id) },\n ],\n });\n}\n\n@EventSubscriber()\nexport class ClientSubscriber implements EntitySubscriberInterface<Client> {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n listenTo(): Function | string {\n return ClientEntity;\n }\n\n async afterInsert(event: InsertEvent<Client>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n await publishEvent(EntityDefaultEventName.CREATED, event.entity);\n }\n\n async afterUpdate(event: UpdateEvent<Client>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n if (event.connection.queryResultCache) {\n await event.connection.queryResultCache.remove([\n buildRedisKeyPath({\n prefix: CachePrefix.CLIENT,\n key: event.entity.id,\n }),\n ]);\n }\n\n await publishEvent(EntityDefaultEventName.UPDATED, event.entity as Client);\n }\n\n async afterRemove(event: RemoveEvent<Client>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n if (event.connection.queryResultCache) {\n await event.connection.queryResultCache.remove([\n buildRedisKeyPath({\n prefix: CachePrefix.CLIENT,\n key: event.entity.id,\n }),\n ]);\n }\n\n await publishEvent(EntityDefaultEventName.DELETED, event.entity);\n }\n}\n","/*\n * Copyright (c) 2021-2021.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n Column,\n CreateDateColumn,\n Entity, \n Index,\n JoinColumn,\n ManyToOne,\n PrimaryGeneratedColumn,\n Unique,\n UpdateDateColumn,\n} from 'typeorm';\nimport type { Realm, Scope } from '@authup/core-kit';\nimport { RealmEntity } from '../realm/index.ts';\n\n@Entity({ name: 'auth_scopes' })\n@Unique(['name', 'realm_id'])\nexport class ScopeEntity implements Scope {\n @PrimaryGeneratedColumn('uuid')\n id: string;\n\n @Column({\n type: 'boolean',\n default: false, \n })\n built_in: boolean;\n\n @Column({\n type: 'varchar',\n length: 128, \n })\n name: string;\n\n @Column({\n type: 'varchar',\n length: 256,\n nullable: true, \n })\n display_name: string | null;\n\n @Column({\n type: 'text',\n nullable: true, \n })\n description: string | null;\n\n // ------------------------------------------------------------------\n\n @CreateDateColumn()\n created_at: string;\n\n @UpdateDateColumn()\n updated_at: string;\n\n // ------------------------------------------------------------------\n\n @Index()\n @Column({ nullable: true })\n realm_id: Realm['id'] | null;\n\n @ManyToOne(() => RealmEntity, {\n onDelete: 'CASCADE',\n nullable: true, \n })\n @JoinColumn({ name: 'realm_id' })\n realm: Realm | null;\n}\n","/*\n * Copyright (c) 2022-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Scope } from '@authup/core-kit';\nimport {\n EntityDefaultEventName, \n EntityType,\n buildEntityChannelName,\n buildEntityNamespaceName,\n} from '@authup/core-kit';\nimport type { DomainEventDestinations } from '@authup/server-kit';\nimport { buildRedisKeyPath } from '@authup/server-kit';\nimport type {\n EntitySubscriberInterface,\n InsertEvent,\n RemoveEvent,\n UpdateEvent,\n} from 'typeorm';\nimport { EventSubscriber } from 'typeorm';\nimport { publishDomainEvent } from '../../event-publisher/index.ts';\nimport { ScopeEntity } from './entity.ts';\nimport { CachePrefix } from '../constants.ts';\n\nasync function publishEvent(\n event: `${EntityDefaultEventName}`,\n data: Scope,\n) {\n const destinations : DomainEventDestinations = [\n { channel: (id) => buildEntityChannelName(EntityType.SCOPE, id) },\n ];\n if (data.realm_id) {\n destinations.push({\n channel: (id) => buildEntityChannelName(EntityType.SCOPE, id),\n namespace: buildEntityNamespaceName(data.realm_id),\n });\n }\n\n await publishDomainEvent({\n content: {\n type: EntityType.SCOPE,\n event,\n data,\n },\n destinations,\n });\n}\n\n@EventSubscriber()\nexport class ScopeSubscriber implements EntitySubscriberInterface<Scope> {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n listenTo(): Function | string {\n return ScopeEntity;\n }\n\n async afterInsert(event: InsertEvent<Scope>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n await publishEvent(EntityDefaultEventName.CREATED, event.entity);\n }\n\n async afterUpdate(event: UpdateEvent<Scope>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n if (event.connection.queryResultCache) {\n await event.connection.queryResultCache.remove([\n buildRedisKeyPath({\n prefix: CachePrefix.USER,\n key: event.entity.id,\n }),\n ]);\n }\n\n await publishEvent(EntityDefaultEventName.UPDATED, event.entity as Scope);\n }\n\n async afterRemove(event: RemoveEvent<Scope>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n if (event.connection.queryResultCache) {\n await event.connection.queryResultCache.remove([\n buildRedisKeyPath({\n prefix: CachePrefix.USER,\n key: event.entity.id,\n }),\n ]);\n }\n\n await publishEvent(EntityDefaultEventName.DELETED, event.entity);\n }\n}\n","/*\n * Copyright (c) 2021-2021.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n Column,\n CreateDateColumn,\n Entity,\n JoinColumn,\n ManyToOne,\n PrimaryGeneratedColumn,\n Unique,\n UpdateDateColumn,\n} from 'typeorm';\nimport type {\n Client,\n ClientScope,\n Realm,\n Scope,\n} from '@authup/core-kit';\nimport { ClientEntity } from '../client/index.ts';\nimport { RealmEntity } from '../realm/index.ts';\nimport { ScopeEntity } from '../scope/index.ts';\n\n@Entity({ name: 'auth_client_scopes' })\n@Unique(['client_id', 'scope_id'])\nexport class ClientScopeEntity implements ClientScope {\n @PrimaryGeneratedColumn('uuid')\n id: string;\n\n @Column({\n type: 'boolean',\n default: false, \n })\n default: boolean;\n\n // ------------------------------------------------------------------\n\n @CreateDateColumn()\n created_at: Date;\n\n @UpdateDateColumn()\n updated_at: Date;\n\n // ------------------------------------------------------------------\n\n @Column()\n client_id: Client['id'];\n\n @ManyToOne(() => ClientEntity, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'client_id' })\n client: Client;\n\n @Column({ nullable: true })\n client_realm_id: Realm['id'] | null;\n\n @ManyToOne(() => RealmEntity, {\n onDelete: 'CASCADE',\n nullable: true, \n })\n @JoinColumn({ name: 'client_realm_id' })\n client_realm: RealmEntity | null;\n\n // ------------------------------------------------------------------\n\n @Column()\n scope_id: Scope['id'];\n\n @ManyToOne(() => ScopeEntity, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'scope_id' })\n scope: Scope;\n\n @Column({ nullable: true })\n scope_realm_id: Realm['id'] | null;\n\n @ManyToOne(() => RealmEntity, {\n onDelete: 'CASCADE',\n nullable: true, \n })\n @JoinColumn({ name: 'scope_realm_id' })\n scope_realm: RealmEntity | null;\n}\n","/*\n * Copyright (c) 2022-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { ClientScope } from '@authup/core-kit';\nimport { EntityDefaultEventName, EntityType, buildEntityChannelName } from '@authup/core-kit';\nimport { buildRedisKeyPath } from '@authup/server-kit';\nimport type {\n EntitySubscriberInterface, \n InsertEvent,\n RemoveEvent,\n UpdateEvent,\n} from 'typeorm';\nimport { EventSubscriber } from 'typeorm';\nimport { publishDomainEvent } from '../../event-publisher/index.ts';\nimport { ClientScopeEntity } from './entity.ts';\nimport { CachePrefix } from '../constants.ts';\n\nasync function publishEvent(\n event: `${EntityDefaultEventName}`,\n data: ClientScope,\n) {\n await publishDomainEvent({\n content: {\n type: EntityType.CLIENT_SCOPE,\n event,\n data,\n },\n destinations: [\n { channel: (id) => buildEntityChannelName(EntityType.CLIENT_SCOPE, id) },\n\n // todo: realm attribute\n ],\n });\n}\n\n@EventSubscriber()\nexport class ClientScopeSubscriber implements EntitySubscriberInterface<ClientScope> {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n listenTo(): Function | string {\n return ClientScopeEntity;\n }\n\n async afterInsert(event: InsertEvent<ClientScope>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n await publishEvent(EntityDefaultEventName.CREATED, event.entity);\n }\n\n async afterUpdate(event: UpdateEvent<ClientScope>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n if (event.connection.queryResultCache) {\n await event.connection.queryResultCache.remove([\n buildRedisKeyPath({\n prefix: CachePrefix.CLIENT_SCOPE,\n key: event.entity.id,\n }),\n ]);\n }\n\n await publishEvent(EntityDefaultEventName.UPDATED, event.entity as ClientScope);\n }\n\n async afterRemove(event: RemoveEvent<ClientScope>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n if (event.connection.queryResultCache) {\n await event.connection.queryResultCache.remove([\n buildRedisKeyPath({\n prefix: CachePrefix.CLIENT_SCOPE,\n key: event.entity.id,\n }),\n ]);\n }\n\n await publishEvent(EntityDefaultEventName.DELETED, event.entity);\n }\n}\n","/*\n * Copyright (c) 2021-2021.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n Column,\n CreateDateColumn,\n Entity, \n Index,\n JoinColumn,\n ManyToOne,\n PrimaryGeneratedColumn,\n Unique,\n UpdateDateColumn,\n} from 'typeorm';\nimport type {\n IdentityProvider,\n IdentityProviderPreset,\n IdentityProviderProtocol,\n Realm,\n} from '@authup/core-kit';\nimport { RealmEntity } from '../realm/index.ts';\n\n@Unique(['name', 'realm_id'])\n@Entity({ name: 'auth_identity_providers' })\nexport class IdentityProviderEntity implements IdentityProvider {\n @PrimaryGeneratedColumn('uuid')\n id: string;\n\n @Column({\n type: 'varchar',\n length: 128, \n })\n name: string;\n\n @Column({\n type: 'varchar',\n length: 256,\n nullable: true, \n })\n display_name: string | null;\n\n @Column({\n type: 'varchar',\n length: 64,\n nullable: true, \n })\n protocol: `${IdentityProviderProtocol}` | null;\n\n @Column({\n type: 'varchar',\n length: 64,\n nullable: true, \n })\n preset: `${IdentityProviderPreset}` | null;\n\n @Column({\n type: 'boolean',\n default: true, \n })\n enabled: boolean;\n\n @CreateDateColumn()\n created_at: string;\n\n @UpdateDateColumn()\n updated_at: string;\n\n @Index()\n @Column()\n realm_id: string;\n\n @ManyToOne(() => RealmEntity, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'realm_id' })\n realm: Realm;\n}\n","/*\n * Copyright (c) 2021-2021.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n Column,\n CreateDateColumn,\n Entity, \n JoinColumn, \n ManyToOne,\n PrimaryGeneratedColumn, \n Unique,\n UpdateDateColumn,\n} from 'typeorm';\nimport type { IdentityProvider, IdentityProviderAttribute, Realm } from '@authup/core-kit';\nimport {\n deserialize,\n serialize,\n} from '@authup/kit';\nimport { IdentityProviderEntity } from '../identity-provider/entity.ts';\nimport { RealmEntity } from '../realm/index.ts';\n\n@Unique(['name', 'provider_id'])\n@Entity({ name: 'auth_identity_provider_attributes' })\nexport class IdentityProviderAttributeEntity implements IdentityProviderAttribute {\n @PrimaryGeneratedColumn('uuid')\n id: string;\n\n @Column({\n type: 'varchar',\n length: 255, \n })\n name: string;\n\n @Column({\n type: 'text',\n nullable: true,\n transformer: {\n to(value: any): any {\n return serialize(value);\n },\n from(value: any): any {\n return deserialize(value);\n },\n },\n })\n value: string | null;\n\n // ------------------------------------------------------------------\n\n @Column()\n provider_id: IdentityProvider['id'];\n\n @ManyToOne(() => IdentityProviderEntity, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'provider_id' })\n provider: IdentityProviderEntity;\n\n // ------------------------------------------------------------------\n @Column({ nullable: true })\n realm_id: Realm['id'] | null;\n\n @ManyToOne(() => RealmEntity, {\n onDelete: 'CASCADE',\n nullable: true, \n })\n @JoinColumn({ name: 'realm_id' })\n realm: RealmEntity | null;\n\n // ------------------------------------------------------------------\n\n @CreateDateColumn()\n created_at: string;\n\n @UpdateDateColumn()\n updated_at: string;\n}\n","/*\n * Copyright (c) 2022-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { IdentityProviderAttribute } from '@authup/core-kit';\nimport {\n EntityDefaultEventName, \n EntityType,\n buildEntityChannelName,\n} from '@authup/core-kit';\nimport { buildRedisKeyPath } from '@authup/server-kit';\nimport type {\n EntitySubscriberInterface, \n InsertEvent,\n RemoveEvent,\n UpdateEvent,\n} from 'typeorm';\nimport { EventSubscriber } from 'typeorm';\nimport { publishDomainEvent } from '../../event-publisher/index.ts';\nimport { IdentityProviderAttributeEntity } from './entity.ts';\nimport { CachePrefix } from '../constants.ts';\n\nasync function publishEvent(\n event: `${EntityDefaultEventName}`,\n data: IdentityProviderAttribute,\n) {\n await publishDomainEvent({\n content: {\n type: EntityType.IDENTITY_PROVIDER_ATTRIBUTE,\n event,\n data,\n },\n destinations: [\n { channel: (id) => buildEntityChannelName(EntityType.IDENTITY_PROVIDER_ATTRIBUTE, id) },\n\n // todo: realm attribute\n ],\n });\n}\n\n@EventSubscriber()\nexport class IdentityProviderAttributeSubscriber implements EntitySubscriberInterface<IdentityProviderAttribute> {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n listenTo(): Function | string {\n return IdentityProviderAttributeEntity;\n }\n\n async afterInsert(event: InsertEvent<IdentityProviderAttribute>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n await publishEvent(EntityDefaultEventName.CREATED, event.entity);\n }\n\n async afterUpdate(event: UpdateEvent<IdentityProviderAttribute>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n if (event.connection.queryResultCache) {\n await event.connection.queryResultCache.remove([\n buildRedisKeyPath({\n prefix: CachePrefix.IDENTITY_PROVIDER_ATTRIBUTE,\n key: event.entity.id,\n }),\n ]);\n }\n\n await publishEvent(EntityDefaultEventName.UPDATED, event.entity as IdentityProviderAttribute);\n }\n\n async afterRemove(event: RemoveEvent<IdentityProviderAttribute>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n if (event.connection.queryResultCache) {\n await event.connection.queryResultCache.remove([\n buildRedisKeyPath({\n prefix: CachePrefix.IDENTITY_PROVIDER_ATTRIBUTE,\n key: event.entity.id,\n }),\n ]);\n }\n\n await publishEvent(EntityDefaultEventName.DELETED, event.entity);\n }\n}\n","/*\n * Copyright (c) 2021-2021.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { IdentityProvider, IdentityProviderAttribute } from '@authup/core-kit';\nimport type { DataSource, EntityManager } from 'typeorm';\nimport { InstanceChecker } from 'typeorm';\nimport { CachePrefix } from '../constants.ts';\nimport { EARepository } from '../../extra-attribute-repository/index.ts';\nimport { IdentityProviderEntity } from './entity.ts';\nimport { IdentityProviderAttributeEntity } from '../identity-provider-attribute/index.ts';\n\nexport class IdentityProviderRepository extends EARepository<\n IdentityProvider,\n IdentityProviderAttribute\n> {\n constructor(instance: DataSource | EntityManager) {\n super(\n InstanceChecker.isDataSource(instance) ? instance.manager : instance,\n {\n attributeProperties: (entity, parent) => {\n entity.provider_id = parent.id;\n entity.realm_id = parent.realm_id;\n\n return entity;\n },\n entity: IdentityProviderEntity,\n entityPrimaryColumn: 'id',\n attributeEntity: IdentityProviderAttributeEntity,\n attributeForeignColumn: 'provider_id',\n cachePrefix: CachePrefix.IDENTITY_PROVIDER_ATTRIBUTE,\n },\n );\n }\n}\n","/*\n * Copyright (c) 2022-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { IdentityProvider } from '@authup/core-kit';\nimport {\n EntityDefaultEventName, \n EntityType, \n buildEntityChannelName, \n buildEntityNamespaceName,\n} from '@authup/core-kit';\nimport { buildRedisKeyPath } from '@authup/server-kit';\nimport type {\n EntitySubscriberInterface, \n InsertEvent,\n RemoveEvent,\n UpdateEvent,\n} from 'typeorm';\nimport { EventSubscriber } from 'typeorm';\nimport { publishDomainEvent } from '../../event-publisher/index.ts';\nimport { IdentityProviderEntity } from './entity.ts';\nimport { CachePrefix } from '../constants.ts';\n\nasync function publishEvent(\n event: `${EntityDefaultEventName}`,\n data: IdentityProvider,\n) {\n await publishDomainEvent({\n content: {\n type: EntityType.IDENTITY_PROVIDER,\n event,\n data,\n },\n destinations: [\n {\n channel: (id) => buildEntityChannelName(EntityType.IDENTITY_PROVIDER, id),\n namespace: buildEntityNamespaceName(data.realm_id),\n },\n { channel: (id) => buildEntityChannelName(EntityType.IDENTITY_PROVIDER, id) },\n ],\n });\n}\n\n@EventSubscriber()\nexport class IdentityProviderSubscriber implements EntitySubscriberInterface<IdentityProvider> {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n listenTo(): Function | string {\n return IdentityProviderEntity;\n }\n\n async afterInsert(event: InsertEvent<IdentityProvider>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n await publishEvent(EntityDefaultEventName.CREATED, event.entity);\n }\n\n async afterUpdate(event: UpdateEvent<IdentityProvider>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n if (event.connection.queryResultCache) {\n await event.connection.queryResultCache.remove([\n buildRedisKeyPath({\n prefix: CachePrefix.IDENTITY_PROVIDER,\n key: event.entity.id,\n }),\n ]);\n }\n\n await publishEvent(EntityDefaultEventName.UPDATED, event.entity as IdentityProvider);\n }\n\n async afterRemove(event: RemoveEvent<IdentityProvider>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n if (event.connection.queryResultCache) {\n await event.connection.queryResultCache.remove([\n buildRedisKeyPath({\n prefix: CachePrefix.IDENTITY_PROVIDER,\n key: event.entity.id,\n }),\n ]);\n }\n\n await publishEvent(EntityDefaultEventName.DELETED, event.entity);\n }\n}\n","/*\n * Copyright (c) 2021-2021.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n BeforeInsert,\n BeforeUpdate,\n Column,\n CreateDateColumn,\n Entity,\n Index,\n JoinColumn,\n ManyToOne,\n PrimaryGeneratedColumn,\n Unique,\n UpdateDateColumn,\n} from 'typeorm';\nimport type { Client, Realm, User } from '@authup/core-kit';\nimport { ClientEntity } from '../client/index.ts';\nimport { RealmEntity } from '../realm/index.ts';\n\n@Entity({ name: 'auth_users' })\n@Unique(['name', 'realm_id'])\nexport class UserEntity implements User {\n @PrimaryGeneratedColumn('uuid')\n id: string;\n\n @Index()\n @Column({\n type: 'varchar',\n length: 128, \n })\n name: string;\n\n @Column({\n type: 'boolean',\n default: true, \n })\n name_locked: boolean;\n\n @Column({\n type: 'varchar',\n length: 128,\n nullable: true, \n })\n first_name: string | null;\n\n @Column({\n type: 'varchar',\n length: 128,\n nullable: true, \n })\n last_name: string | null;\n\n @Column({\n type: 'varchar',\n length: 256,\n nullable: true, \n })\n display_name: string | null;\n\n @Index()\n @Column({\n type: 'varchar',\n length: 256,\n select: false,\n })\n email: string;\n\n @Column({\n type: 'varchar',\n length: 512,\n default: null,\n nullable: true,\n select: false,\n })\n password: string | null;\n\n // ------------------------------------------------------------------\n\n @Column({\n type: 'varchar',\n length: 255,\n nullable: true, \n })\n avatar: string | null;\n\n @Column({\n type: 'varchar',\n length: 255,\n nullable: true, \n })\n cover: string | null;\n\n // ------------------------------------------------------------------\n\n @Column({\n type: 'varchar',\n length: 256,\n nullable: true,\n default: null,\n select: false,\n })\n reset_hash: string | null;\n\n @Column({\n type: 'varchar',\n length: 28,\n nullable: true,\n default: null,\n select: false,\n })\n reset_at: string | null;\n\n @Column({\n type: 'varchar',\n length: 28,\n nullable: true,\n default: null,\n select: false,\n })\n reset_expires: string | null;\n\n // ------------------------------------------------------------------\n\n @Column({\n type: 'varchar',\n length: 256,\n nullable: true,\n default: null,\n })\n status: string | null;\n\n @Column({\n type: 'varchar',\n length: 256,\n nullable: true,\n default: null,\n })\n status_message: string | null;\n\n // ------------------------------------------------------------------\n\n @Column({\n type: 'boolean',\n default: true,\n })\n active: boolean;\n\n @Column({\n type: 'varchar',\n length: 256,\n nullable: true,\n default: null,\n select: false,\n })\n activate_hash: string | null;\n\n // ------------------------------------------------------------------\n\n @CreateDateColumn()\n created_at: Date;\n\n @UpdateDateColumn()\n updated_at: Date;\n\n // ------------------------------------------------------------------\n\n @Index()\n @Column()\n realm_id: Realm['id'];\n\n @ManyToOne(() => RealmEntity, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'realm_id' })\n realm: Realm;\n\n // ------------------------------------------------------------------\n\n @Index()\n @Column({ nullable: true })\n client_id: Client['id'] | null;\n\n @ManyToOne(() => ClientEntity, {\n onDelete: 'CASCADE',\n nullable: true, \n })\n @JoinColumn({ name: 'client_id' })\n client: Client | null;\n\n // ------------------------------------------------------------------\n\n @BeforeInsert()\n @BeforeUpdate()\n setDisplayName() {\n if (\n typeof this.display_name !== 'string' ||\n this.display_name.length === 0\n ) {\n this.display_name = this.name;\n }\n }\n}\n","/*\n * Copyright (c) 2021-2021.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n Column,\n CreateDateColumn,\n Entity, \n JoinColumn, \n ManyToOne,\n PrimaryGeneratedColumn, \n Unique,\n UpdateDateColumn,\n} from 'typeorm';\nimport type { Realm, User, UserAttribute } from '@authup/core-kit';\nimport { deserialize, serialize } from '@authup/kit';\nimport { RealmEntity } from '../realm/index.ts';\nimport { UserEntity } from '../user/entity.ts';\n\n@Unique(['name', 'user_id'])\n@Entity({ name: 'auth_user_attributes' })\nexport class UserAttributeEntity implements UserAttribute {\n @PrimaryGeneratedColumn('uuid')\n id: string;\n\n @Column({\n type: 'varchar',\n length: 255, \n })\n name: string;\n\n @Column({\n type: 'text',\n nullable: true,\n transformer: {\n to(value: any): any {\n return serialize(value);\n },\n from(value: any): any {\n return deserialize(value);\n },\n },\n })\n value: string | null;\n\n // ------------------------------------------------------------------\n\n @Column()\n realm_id: Realm['id'];\n\n @ManyToOne(() => RealmEntity, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'realm_id' })\n realm: RealmEntity;\n\n @Column()\n user_id: User['id'];\n\n @ManyToOne(() => UserEntity, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'user_id' })\n user: UserEntity;\n\n // ------------------------------------------------------------------\n\n @CreateDateColumn()\n created_at: string;\n\n @UpdateDateColumn()\n updated_at: string;\n}\n","/*\n * Copyright (c) 2022-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { UserAttribute } from '@authup/core-kit';\nimport {\n EntityDefaultEventName, \n EntityType,\n buildEntityChannelName,\n buildEntityNamespaceName,\n} from '@authup/core-kit';\nimport { buildRedisKeyPath } from '@authup/server-kit';\nimport type {\n EntitySubscriberInterface,\n InsertEvent,\n RemoveEvent,\n UpdateEvent,\n} from 'typeorm';\nimport { EventSubscriber } from 'typeorm';\nimport { publishDomainEvent } from '../../event-publisher/index.ts';\nimport { UserAttributeEntity } from './entity.ts';\nimport { CachePrefix } from '../constants.ts';\n\nasync function publishEvent(\n event: `${EntityDefaultEventName}`,\n data: UserAttribute,\n) {\n await publishDomainEvent({\n content: {\n type: EntityType.USER_ATTRIBUTE,\n event,\n data,\n },\n destinations: [\n {\n channel: (id) => buildEntityChannelName(EntityType.USER_ATTRIBUTE, id),\n namespace: buildEntityNamespaceName(data.realm_id),\n },\n { channel: (id) => buildEntityChannelName(EntityType.USER_ATTRIBUTE, id) },\n ],\n });\n}\n\n@EventSubscriber()\nexport class UserAttributeSubscriber implements EntitySubscriberInterface<UserAttribute> {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n listenTo(): Function | string {\n return UserAttributeEntity;\n }\n\n async afterInsert(event: InsertEvent<UserAttribute>): Promise<any> {\n if (event.connection.queryResultCache) {\n await event.connection.queryResultCache.remove([\n buildRedisKeyPath({\n prefix: CachePrefix.USER_OWNED_ATTRIBUTES,\n key: event.entity.user_id,\n }),\n ]);\n }\n\n await publishEvent(EntityDefaultEventName.CREATED, event.entity);\n\n return Promise.resolve(undefined);\n }\n\n async afterUpdate(event: UpdateEvent<UserAttribute>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n if (event.connection.queryResultCache) {\n await event.connection.queryResultCache.remove([\n buildRedisKeyPath({\n prefix: CachePrefix.USER_OWNED_ATTRIBUTES,\n key: event.entity.user_id,\n }),\n ]);\n }\n\n await publishEvent(EntityDefaultEventName.UPDATED, event.entity as UserAttribute);\n }\n\n async afterRemove(event: RemoveEvent<UserAttribute>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n if (event.connection.queryResultCache) {\n await event.connection.queryResultCache.remove([\n buildRedisKeyPath({\n prefix: CachePrefix.USER_OWNED_ATTRIBUTES,\n key: event.entity.user_id,\n }),\n ]);\n }\n\n await publishEvent(EntityDefaultEventName.DELETED, event.entity);\n }\n}\n","/*\n * Copyright (c) 2021-2021.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n Column,\n CreateDateColumn,\n Entity, \n Index,\n JoinColumn,\n ManyToOne,\n PrimaryGeneratedColumn,\n UpdateDateColumn,\n} from 'typeorm';\nimport type {\n Permission,\n Policy,\n Realm,\n User, \n UserPermission,\n} from '@authup/core-kit';\nimport { PolicyEntity } from '../policy/index.ts';\nimport { UserEntity } from '../user/entity.ts';\nimport { PermissionEntity } from '../permission/entity.ts';\nimport { RealmEntity } from '../realm/index.ts';\n\n@Entity({ name: 'auth_user_permissions' })\n@Index(['permission_id', 'user_id'], { unique: true })\nexport class UserPermissionEntity implements UserPermission {\n @PrimaryGeneratedColumn('uuid')\n id: string;\n\n // ------------------------------------------------------------------\n\n @CreateDateColumn()\n created_at: Date;\n\n @UpdateDateColumn()\n updated_at: Date;\n\n // ------------------------------------------------------------------\n\n @Column({ nullable: true })\n policy_id: string | null;\n\n @ManyToOne(() => PolicyEntity, {\n onDelete: 'SET NULL',\n nullable: true, \n })\n @JoinColumn({ name: 'policy_id' })\n policy: Policy | null;\n\n @Column()\n user_id: User['id'];\n\n @ManyToOne(() => UserEntity, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'user_id' })\n user: User;\n\n @Column({ nullable: true })\n user_realm_id: Realm['id'] | null;\n\n @ManyToOne(() => RealmEntity, {\n onDelete: 'CASCADE',\n nullable: true, \n })\n @JoinColumn({ name: 'user_realm_id' })\n user_realm: Realm | null;\n\n @Column()\n permission_id: Permission['id'];\n\n @ManyToOne(() => PermissionEntity, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'permission_id' })\n permission: Permission;\n\n @Column({ nullable: true })\n permission_realm_id: Realm['id'] | null;\n\n @ManyToOne(() => RealmEntity, {\n onDelete: 'CASCADE',\n nullable: true, \n })\n @JoinColumn({ name: 'permission_realm_id' })\n permission_realm: Realm | null;\n}\n","/*\n * Copyright (c) 2022-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { UserPermission } from '@authup/core-kit';\nimport {\n EntityDefaultEventName, \n EntityType,\n buildEntityChannelName,\n buildEntityNamespaceName,\n} from '@authup/core-kit';\nimport type { DomainEventDestination } from '@authup/server-kit';\nimport { buildRedisKeyPath } from '@authup/server-kit';\nimport type {\n EntitySubscriberInterface, \n InsertEvent,\n RemoveEvent,\n UpdateEvent,\n} from 'typeorm';\nimport { EventSubscriber } from 'typeorm';\nimport { publishDomainEvent } from '../../event-publisher/index.ts';\nimport { UserPermissionEntity } from './entity.ts';\nimport { CachePrefix } from '../constants.ts';\n\nasync function publishEvent(\n event: `${EntityDefaultEventName}`,\n data: UserPermission,\n) {\n const destinations : DomainEventDestination[] = [\n { channel: (id) => buildEntityChannelName(EntityType.USER_PERMISSION, id) },\n ];\n if (data.user_realm_id) {\n destinations.push({\n channel: (id) => buildEntityChannelName(EntityType.USER_PERMISSION, id),\n namespace: buildEntityNamespaceName(data.user_realm_id),\n });\n }\n\n if (data.permission_realm_id) {\n destinations.push({\n channel: (id) => buildEntityChannelName(EntityType.USER_PERMISSION, id),\n namespace: buildEntityNamespaceName(data.permission_realm_id),\n });\n }\n\n await publishDomainEvent({\n content: {\n type: EntityType.USER_PERMISSION,\n event,\n data,\n },\n destinations,\n });\n}\n\n@EventSubscriber()\nexport class UserPermissionSubscriber implements EntitySubscriberInterface<UserPermission> {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n listenTo(): Function | string {\n return UserPermissionEntity;\n }\n\n async afterInsert(event: InsertEvent<UserPermission>): Promise<any> {\n if (event.connection.queryResultCache) {\n await event.connection.queryResultCache.remove([\n buildRedisKeyPath({\n prefix: CachePrefix.USER_OWNED_PERMISSIONS,\n key: event.entity.user_id,\n }),\n ]);\n }\n\n await publishEvent(EntityDefaultEventName.CREATED, event.entity);\n\n return Promise.resolve(undefined);\n }\n\n async afterUpdate(event: UpdateEvent<UserPermission>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n if (event.connection.queryResultCache) {\n await event.connection.queryResultCache.remove([\n buildRedisKeyPath({\n prefix: CachePrefix.USER_OWNED_PERMISSIONS,\n key: event.entity.user_id,\n }),\n ]);\n }\n\n await publishEvent(EntityDefaultEventName.UPDATED, event.entity as UserPermission);\n }\n\n async afterRemove(event: RemoveEvent<UserPermission>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n if (event.connection.queryResultCache) {\n await event.connection.queryResultCache.remove([\n buildRedisKeyPath({\n prefix: CachePrefix.USER_OWNED_PERMISSIONS,\n key: event.entity.user_id,\n }),\n ]);\n }\n\n await publishEvent(EntityDefaultEventName.DELETED, event.entity);\n }\n}\n","/*\n * Copyright (c) 2021-2021.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n Column,\n CreateDateColumn,\n Entity,\n Index,\n JoinColumn,\n ManyToOne,\n PrimaryGeneratedColumn,\n UpdateDateColumn,\n} from 'typeorm';\nimport type {\n Realm, \n Role, \n User, \n UserRole,\n} from '@authup/core-kit';\nimport { RoleEntity } from '../role/index.ts';\nimport { UserEntity } from '../user/entity.ts';\nimport { RealmEntity } from '../realm/index.ts';\n\n@Entity({ name: 'auth_user_roles' })\n@Index(['role_id', 'user_id'], { unique: true })\nexport class UserRoleEntity implements UserRole {\n @PrimaryGeneratedColumn('uuid')\n id: string;\n\n // ------------------------------------------------------------------\n\n @Column()\n role_id: string;\n\n @ManyToOne(() => RoleEntity, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'role_id' })\n role: Role;\n\n @Column({ nullable: true })\n role_realm_id: Realm['id'] | null;\n\n @ManyToOne(() => RealmEntity, {\n onDelete: 'CASCADE',\n nullable: true, \n })\n @JoinColumn({ name: 'role_realm_id' })\n role_realm: Realm | null;\n\n @Column()\n user_id: string;\n\n @ManyToOne(() => UserEntity, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'user_id' })\n user: User;\n\n @Column({ nullable: true })\n user_realm_id: Realm['id'] | null;\n\n @ManyToOne(() => RealmEntity, {\n onDelete: 'CASCADE',\n nullable: true, \n })\n @JoinColumn({ name: 'user_realm_id' })\n user_realm: Realm | null;\n\n // ------------------------------------------------------------------\n\n @CreateDateColumn()\n created_at: string;\n\n @UpdateDateColumn()\n updated_at: string;\n}\n","/*\n * Copyright (c) 2022-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { UserRole } from '@authup/core-kit';\nimport {\n EntityDefaultEventName, \n EntityType,\n buildEntityChannelName,\n buildEntityNamespaceName,\n} from '@authup/core-kit';\nimport type { DomainEventDestination } from '@authup/server-kit';\nimport { buildRedisKeyPath } from '@authup/server-kit';\nimport type {\n EntitySubscriberInterface, \n InsertEvent,\n RemoveEvent,\n UpdateEvent,\n} from 'typeorm';\nimport { EventSubscriber } from 'typeorm';\nimport { publishDomainEvent } from '../../event-publisher/index.ts';\nimport { UserRoleEntity } from './entity.ts';\nimport { CachePrefix } from '../constants.ts';\n\nasync function publishEvent(\n event: `${EntityDefaultEventName}`,\n data: UserRole,\n) {\n const destinations : DomainEventDestination[] = [\n { channel: (id) => buildEntityChannelName(EntityType.USER_ROLE, id) },\n ];\n if (data.user_realm_id) {\n destinations.push({\n channel: (id) => buildEntityChannelName(EntityType.USER_ROLE, id),\n namespace: buildEntityNamespaceName(data.user_realm_id),\n });\n }\n if (data.role_realm_id) {\n destinations.push({\n channel: (id) => buildEntityChannelName(EntityType.USER_ROLE, id),\n namespace: buildEntityNamespaceName(data.role_realm_id),\n });\n }\n\n await publishDomainEvent({\n content: {\n type: EntityType.USER_ROLE,\n event,\n data,\n },\n destinations,\n });\n}\n\n@EventSubscriber()\nexport class UserRoleSubscriber implements EntitySubscriberInterface<UserRole> {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n listenTo(): Function | string {\n return UserRoleEntity;\n }\n\n async afterInsert(event: InsertEvent<UserRole>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n if (event.connection.queryResultCache) {\n await event.connection.queryResultCache.remove([\n buildRedisKeyPath({\n prefix: CachePrefix.USER_OWNED_ROLES,\n key: event.entity.user_id,\n }),\n ]);\n }\n\n await publishEvent(EntityDefaultEventName.CREATED, event.entity);\n }\n\n async afterUpdate(event: UpdateEvent<UserRole>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n if (event.connection.queryResultCache) {\n await event.connection.queryResultCache.remove([\n buildRedisKeyPath({\n prefix: CachePrefix.USER_OWNED_ROLES,\n key: event.entity.user_id,\n }),\n ]);\n }\n\n await publishEvent(EntityDefaultEventName.UPDATED, event.entity as UserRole);\n }\n\n async afterRemove(event: RemoveEvent<UserRole>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n if (event.connection.queryResultCache) {\n await event.connection.queryResultCache.remove([\n buildRedisKeyPath({\n prefix: CachePrefix.USER_OWNED_ROLES,\n key: event.entity.user_id,\n }),\n ]);\n }\n\n await publishEvent(EntityDefaultEventName.DELETED, event.entity);\n }\n}\n","/*\n * Copyright (c) 2021-2021.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type {\n Role,\n User,\n UserAttribute,\n} from '@authup/core-kit';\nimport type { BasePolicy, PermissionPolicyBinding } from '@authup/access';\nimport { buildRedisKeyPath } from '@authup/server-kit';\nimport type { DataSource, EntityManager } from 'typeorm';\nimport { CachePrefix } from '../constants.ts';\nimport { EARepository } from '../../extra-attribute-repository/index.ts';\nimport { UserAttributeEntity } from '../user-attribute/index.ts';\nimport { UserPermissionEntity } from '../user-permission/index.ts';\nimport { UserRoleEntity } from '../user-role/index.ts';\nimport { PolicyRepository } from '../policy/index.ts';\nimport { UserEntity } from './entity.ts';\n\nexport class UserRepository extends EARepository<User, UserAttribute> {\n constructor(instance: DataSource | EntityManager) {\n super(instance, {\n attributeProperties: (input, parent) => {\n input.user_id = parent.id;\n input.realm_id = parent.realm_id;\n\n return input;\n },\n entity: UserEntity,\n entityPrimaryColumn: 'id',\n attributeEntity: UserAttributeEntity,\n attributeForeignColumn: 'user_id',\n cachePrefix: CachePrefix.USER_OWNED_ATTRIBUTES,\n });\n }\n\n // ------------------------------------------------------------------\n\n async getBoundRoles(\n entity: string | User,\n ) : Promise<Role[]> {\n let id : string;\n if (typeof entity === 'string') {\n id = entity;\n } else {\n id = entity.id;\n }\n\n const items = await this.manager\n .getRepository(UserRoleEntity)\n .find({\n where: { user_id: id },\n relations: { role: true },\n cache: {\n id: buildRedisKeyPath({\n prefix: CachePrefix.USER_OWNED_ROLES,\n key: id,\n }),\n milliseconds: 60_000,\n },\n });\n\n return items.map((relation) => relation.role);\n }\n\n async getBoundPermissions(\n entity: string | User,\n ) : Promise<PermissionPolicyBinding[]> {\n let id : string;\n if (typeof entity === 'string') {\n id = entity;\n } else {\n id = entity.id;\n }\n\n const repository = this.manager.getRepository(UserPermissionEntity);\n\n const entities = await repository.find({\n where: { user_id: id },\n relations: { permission: true },\n cache: {\n id: buildRedisKeyPath({\n prefix: CachePrefix.USER_OWNED_PERMISSIONS,\n key: id,\n }),\n milliseconds: 60_000,\n },\n });\n\n const policyIds = new Set<string>();\n for (const entry of entities) {\n if (entry.policy_id) {\n policyIds.add(entry.policy_id);\n }\n }\n\n const policyTrees = await this.loadPolicyTrees([...policyIds]);\n\n return entities.map((entry) => {\n const policies: BasePolicy[] = [];\n if (entry.policy_id && policyTrees[entry.policy_id]) {\n policies.push(policyTrees[entry.policy_id]);\n }\n\n return {\n permission: entry.permission,\n policies: policies.length > 0 ? policies : undefined,\n };\n });\n }\n\n private async loadPolicyTrees(policyIds: string[]): Promise<Record<string, BasePolicy>> {\n if (policyIds.length === 0) {\n return {};\n }\n\n const policyRepository = new PolicyRepository(this.manager);\n const result: Record<string, BasePolicy> = {};\n\n for (const id of policyIds) {\n const tree = await policyRepository.findDescendantsTreeById(id);\n if (tree) {\n result[id] = tree;\n }\n }\n\n return result;\n }\n}\n","/*\n * Copyright (c) 2022-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { User } from '@authup/core-kit';\nimport {\n EntityDefaultEventName, \n EntityType,\n buildEntityChannelName,\n buildEntityNamespaceName,\n} from '@authup/core-kit';\nimport { buildRedisKeyPath } from '@authup/server-kit';\nimport type {\n EntitySubscriberInterface,\n InsertEvent,\n RemoveEvent,\n UpdateEvent,\n} from 'typeorm';\nimport { EventSubscriber } from 'typeorm';\nimport { publishDomainEvent } from '../../event-publisher/index.ts';\nimport { UserEntity } from './entity.ts';\nimport { CachePrefix } from '../constants.ts';\n\nasync function publishEvent(\n event: `${EntityDefaultEventName}`,\n data: User,\n) {\n await publishDomainEvent({\n content: {\n type: EntityType.USER,\n event,\n data,\n },\n destinations: [\n {\n channel: (id) => buildEntityChannelName(EntityType.USER, id),\n namespace: buildEntityNamespaceName(data.realm_id),\n },\n { channel: (id) => buildEntityChannelName(EntityType.USER, id) },\n ],\n });\n}\n\n@EventSubscriber()\nexport class UserSubscriber implements EntitySubscriberInterface<User> {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n listenTo(): Function | string {\n return UserEntity;\n }\n\n async afterInsert(event: InsertEvent<User>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n await publishEvent(EntityDefaultEventName.CREATED, event.entity);\n }\n\n async afterUpdate(event: UpdateEvent<User>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n if (event.connection.queryResultCache) {\n await event.connection.queryResultCache.remove([\n buildRedisKeyPath({\n prefix: CachePrefix.USER,\n key: event.entity.id,\n }),\n ]);\n }\n\n await publishEvent(EntityDefaultEventName.UPDATED, event.entity as User);\n }\n\n async afterRemove(event: RemoveEvent<User>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n if (event.connection.queryResultCache) {\n await event.connection.queryResultCache.remove([\n buildRedisKeyPath({\n prefix: CachePrefix.USER,\n key: event.entity.id,\n }),\n ]);\n }\n\n await publishEvent(EntityDefaultEventName.DELETED, event.entity);\n }\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n Column,\n CreateDateColumn,\n Entity,\n Index,\n JoinColumn,\n ManyToOne,\n PrimaryGeneratedColumn,\n UpdateDateColumn,\n} from 'typeorm';\nimport type {\n \n IdentityProvider, \n IdentityProviderAccount, \n Realm, \n User, \n} from '@authup/core-kit';\nimport { RealmEntity } from '../realm/index.ts';\nimport { UserEntity } from '../user/index.ts';\nimport { IdentityProviderEntity } from '../identity-provider/index.ts';\n\n@Entity({ name: 'auth_identity_provider_accounts' })\n@Index(['provider_id', 'user_id'], { unique: true })\nexport class IdentityProviderAccountEntity implements IdentityProviderAccount {\n @PrimaryGeneratedColumn('uuid')\n id: string;\n\n @Column({\n type: 'text',\n nullable: true,\n default: null, \n })\n access_token: string;\n\n @Column({\n type: 'text',\n nullable: true,\n default: null, \n })\n refresh_token: string;\n\n @Column({\n type: 'varchar',\n length: 256, \n })\n provider_user_id: string;\n\n @Column({\n type: 'varchar',\n length: 256,\n nullable: true,\n default: null,\n })\n provider_user_name: string;\n\n @Column({\n type: 'varchar',\n length: 512,\n nullable: true,\n default: null,\n })\n provider_user_email: string;\n\n @Column({\n type: 'int',\n unsigned: true,\n nullable: true,\n default: null,\n })\n expires_in: number | null;\n\n @Column({\n type: 'varchar',\n length: 28,\n nullable: true,\n default: null,\n })\n expires_at: string | null;\n\n @CreateDateColumn()\n created_at: Date;\n\n @UpdateDateColumn()\n updated_at: Date;\n\n // -----------------------------------------------\n\n @Column()\n user_id: User['id'];\n\n @ManyToOne(() => UserEntity, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'user_id' })\n user: UserEntity;\n\n @Column({ nullable: true })\n user_realm_id: Realm['id'] | null;\n\n @ManyToOne(() => RealmEntity, {\n onDelete: 'CASCADE',\n nullable: true, \n })\n @JoinColumn({ name: 'user_realm_id' })\n user_realm: RealmEntity | null;\n\n // -----------------------------------------------\n\n @Column()\n provider_id: IdentityProvider['id'];\n\n @ManyToOne(() => IdentityProviderEntity, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'provider_id' })\n provider: IdentityProviderEntity;\n\n @Column({ nullable: true })\n provider_realm_id: Realm['id'] | null;\n\n @ManyToOne(() => RealmEntity, {\n onDelete: 'CASCADE',\n nullable: true, \n })\n @JoinColumn({ name: 'provider_realm_id' })\n provider_realm: RealmEntity | null;\n}\n","/*\n * Copyright (c) 2022-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { IdentityProviderAccount } from '@authup/core-kit';\nimport { EntityDefaultEventName, EntityType, buildEntityChannelName } from '@authup/core-kit';\nimport { buildRedisKeyPath } from '@authup/server-kit';\nimport type {\n EntitySubscriberInterface, \n InsertEvent,\n RemoveEvent,\n UpdateEvent,\n} from 'typeorm';\nimport { EventSubscriber } from 'typeorm';\nimport { publishDomainEvent } from '../../event-publisher/index.ts';\nimport { IdentityProviderAccountEntity } from './entity.ts';\nimport { CachePrefix } from '../constants.ts';\n\nasync function publishEvent(\n event: `${EntityDefaultEventName}`,\n data: IdentityProviderAccount,\n) {\n await publishDomainEvent({\n content: {\n type: EntityType.IDENTITY_PROVIDER_ACCOUNT,\n event,\n data,\n },\n destinations: [\n { channel: (id) => buildEntityChannelName(EntityType.IDENTITY_PROVIDER_ACCOUNT, id) },\n ],\n });\n}\n\n@EventSubscriber()\nexport class IdentityProviderAccountSubscriber implements EntitySubscriberInterface<IdentityProviderAccount> {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n listenTo(): Function | string {\n return IdentityProviderAccountEntity;\n }\n\n async afterInsert(event: InsertEvent<IdentityProviderAccount>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n await publishEvent(EntityDefaultEventName.CREATED, event.entity);\n }\n\n async afterUpdate(event: UpdateEvent<IdentityProviderAccount>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n if (event.connection.queryResultCache) {\n await event.connection.queryResultCache.remove([\n buildRedisKeyPath({\n prefix: CachePrefix.IDENTITY_PROVIDER_ACCOUNT,\n key: event.entity.id,\n }),\n ]);\n }\n\n await publishEvent(EntityDefaultEventName.UPDATED, event.entity as IdentityProviderAccount);\n }\n\n async afterRemove(event: RemoveEvent<IdentityProviderAccount>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n if (event.connection.queryResultCache) {\n await event.connection.queryResultCache.remove([\n buildRedisKeyPath({\n prefix: CachePrefix.IDENTITY_PROVIDER_ACCOUNT,\n key: event.entity.id,\n }),\n ]);\n }\n\n await publishEvent(EntityDefaultEventName.DELETED, event.entity);\n }\n}\n","/*\n * Copyright (c) 2021-2021.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n Column,\n CreateDateColumn,\n Entity,\n Index,\n JoinColumn,\n ManyToOne,\n PrimaryGeneratedColumn,\n UpdateDateColumn,\n} from 'typeorm';\nimport type { IdentityProviderAttributeMapping, IdentityProviderMappingSyncMode, Realm } from '@authup/core-kit';\nimport { IdentityProviderEntity } from '../identity-provider/index.ts';\nimport { RealmEntity } from '../realm/index.ts';\n\n@Entity({ name: 'auth_identity_provider_attribute_mappings' })\n@Index(['provider_id', 'target_name'], { unique: true })\nexport class IdentityProviderAttributeMappingEntity implements IdentityProviderAttributeMapping {\n @PrimaryGeneratedColumn('uuid')\n id: string;\n\n @Column({\n type: 'varchar',\n length: 64,\n nullable: true, \n })\n synchronization_mode: `${IdentityProviderMappingSyncMode}` | null;\n\n @Column({\n type: 'varchar',\n length: 64,\n nullable: true, \n })\n name: string | null;\n\n @Column({\n type: 'varchar',\n length: 128,\n nullable: true, \n })\n value: string | null;\n\n @Column({\n type: 'boolean',\n default: false, \n })\n value_is_regex: boolean;\n\n @Column({\n type: 'varchar',\n length: 64, \n })\n target_name: string;\n\n @Column({\n type: 'varchar',\n length: 128,\n nullable: true, \n })\n target_value: string | null;\n\n @CreateDateColumn()\n created_at: Date;\n\n @UpdateDateColumn()\n updated_at: Date;\n\n // -----------------------------------------------\n\n @Column()\n provider_id: string;\n\n @ManyToOne(() => IdentityProviderEntity, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'provider_id' })\n provider: IdentityProviderEntity;\n\n @Column()\n provider_realm_id: Realm['id'];\n\n @ManyToOne(() => RealmEntity, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'provider_realm_id' })\n provider_realm: RealmEntity;\n}\n","/*\n * Copyright (c) 2021-2021.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n Column,\n CreateDateColumn,\n Entity,\n Index,\n JoinColumn,\n ManyToOne,\n PrimaryGeneratedColumn,\n UpdateDateColumn,\n} from 'typeorm';\nimport type {\n IdentityProviderMappingSyncMode, \n IdentityProviderPermissionMapping,\n Realm, \n Role, \n} from '@authup/core-kit';\nimport { IdentityProviderEntity } from '../identity-provider/index.ts';\nimport { PermissionEntity } from '../permission/index.ts';\nimport { RealmEntity } from '../realm/index.ts';\n\n@Entity({ name: 'auth_identity_provider_permission_mappings' })\n@Index(['provider_id', 'permission_id'], { unique: true })\nexport class IdentityProviderPermissionMappingEntity implements IdentityProviderPermissionMapping {\n @PrimaryGeneratedColumn('uuid')\n id: string;\n\n @Column({\n type: 'varchar',\n length: 64,\n nullable: true, \n })\n synchronization_mode: `${IdentityProviderMappingSyncMode}` | null;\n\n @Column({\n type: 'varchar',\n length: 64,\n nullable: true, \n })\n name: string | null;\n\n @Column({\n type: 'varchar',\n length: 128,\n nullable: true, \n })\n value: string | null;\n\n @Column({\n type: 'boolean',\n default: false, \n })\n value_is_regex: boolean;\n\n @CreateDateColumn()\n created_at: Date;\n\n @UpdateDateColumn()\n updated_at: Date;\n\n // -----------------------------------------------\n\n @Column()\n permission_id: string;\n\n @ManyToOne(() => PermissionEntity, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'permission_id' })\n permission: Role;\n\n @Column({ nullable: true })\n permission_realm_id: Realm['id'] | null;\n\n @ManyToOne(() => RealmEntity, {\n onDelete: 'CASCADE',\n nullable: true, \n })\n @JoinColumn({ name: 'permission_realm_id' })\n permission_realm: RealmEntity | null;\n\n @Column()\n provider_id: string;\n\n @ManyToOne(() => IdentityProviderEntity, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'provider_id' })\n provider: IdentityProviderEntity;\n\n @Column()\n provider_realm_id: Realm['id'];\n\n @ManyToOne(() => RealmEntity, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'provider_realm_id' })\n provider_realm: RealmEntity;\n}\n","/*\n * Copyright (c) 2021-2021.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n Column,\n CreateDateColumn,\n Entity,\n Index,\n JoinColumn,\n ManyToOne,\n PrimaryGeneratedColumn,\n UpdateDateColumn,\n} from 'typeorm';\nimport type {\n IdentityProviderMappingSyncMode, \n IdentityProviderRoleMapping, \n Realm,\n Role, \n} from '@authup/core-kit';\nimport { IdentityProviderEntity } from '../identity-provider/index.ts';\nimport { RoleEntity } from '../role/index.ts';\nimport { RealmEntity } from '../realm/index.ts';\n\n@Entity({ name: 'auth_identity_provider_role_mappings' })\n@Index(['provider_id', 'role_id'], { unique: true })\nexport class IdentityProviderRoleMappingEntity implements IdentityProviderRoleMapping {\n @PrimaryGeneratedColumn('uuid')\n id: string;\n\n @Column({\n type: 'varchar',\n length: 64,\n nullable: true, \n })\n synchronization_mode: `${IdentityProviderMappingSyncMode}` | null;\n\n @Column({\n type: 'varchar',\n length: 64,\n nullable: true, \n })\n name: string | null;\n\n @Column({\n type: 'varchar',\n length: 128,\n nullable: true, \n })\n value: string | null;\n\n @Column({\n type: 'boolean',\n default: false, \n })\n value_is_regex: boolean;\n\n @CreateDateColumn()\n created_at: Date;\n\n @UpdateDateColumn()\n updated_at: Date;\n\n // -----------------------------------------------\n\n @Column()\n role_id: string;\n\n @ManyToOne(() => RoleEntity, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'role_id' })\n role: Role;\n\n @Column({ nullable: true })\n role_realm_id: Realm['id'] | null;\n\n @ManyToOne(() => RealmEntity, {\n onDelete: 'CASCADE',\n nullable: true, \n })\n @JoinColumn({ name: 'role_realm_id' })\n role_realm: RealmEntity | null;\n\n @Column()\n provider_id: string;\n\n @ManyToOne(() => IdentityProviderEntity, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'provider_id' })\n provider: IdentityProviderEntity;\n\n @Column()\n provider_realm_id: Realm['id'];\n\n @ManyToOne(() => RealmEntity, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'provider_realm_id' })\n provider_realm: RealmEntity;\n}\n","/*\n * Copyright (c) 2022-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { IdentityProviderRoleMapping } from '@authup/core-kit';\nimport {\n EntityDefaultEventName,\n EntityType,\n buildEntityChannelName,\n buildEntityNamespaceName,\n} from '@authup/core-kit';\nimport type { DomainEventDestination } from '@authup/server-kit';\nimport { buildRedisKeyPath } from '@authup/server-kit';\nimport type {\n EntitySubscriberInterface, \n InsertEvent,\n RemoveEvent,\n UpdateEvent,\n} from 'typeorm';\nimport { EventSubscriber } from 'typeorm';\nimport { publishDomainEvent } from '../../event-publisher/index.ts';\nimport { IdentityProviderRoleMappingEntity } from './entity.ts';\nimport { CachePrefix } from '../constants.ts';\n\nasync function publishEvent(\n event: `${EntityDefaultEventName}`,\n data: IdentityProviderRoleMapping,\n) {\n const destinations : DomainEventDestination[] = [\n { channel: (id) => buildEntityChannelName(EntityType.IDENTITY_PROVIDER_ROLE_MAPPING, id) },\n ];\n\n if (data.provider_realm_id) {\n destinations.push({\n channel: (id) => buildEntityChannelName(EntityType.IDENTITY_PROVIDER_ROLE_MAPPING, id),\n namespace: buildEntityNamespaceName(data.provider_realm_id),\n });\n }\n\n if (data.role_realm_id) {\n destinations.push({\n channel: (id) => buildEntityChannelName(EntityType.IDENTITY_PROVIDER_ROLE_MAPPING, id),\n namespace: buildEntityNamespaceName(data.role_realm_id),\n });\n }\n\n await publishDomainEvent({\n content: {\n type: EntityType.IDENTITY_PROVIDER_ROLE_MAPPING,\n event,\n data,\n },\n destinations,\n });\n}\n\n@EventSubscriber()\nexport class IdentityProviderRoleSubscriber implements EntitySubscriberInterface<IdentityProviderRoleMapping> {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n listenTo(): Function | string {\n return IdentityProviderRoleMappingEntity;\n }\n\n async afterInsert(event: InsertEvent<IdentityProviderRoleMapping>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n await publishEvent(EntityDefaultEventName.CREATED, event.entity);\n }\n\n async afterUpdate(event: UpdateEvent<IdentityProviderRoleMapping>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n if (event.connection.queryResultCache) {\n await event.connection.queryResultCache.remove([\n buildRedisKeyPath({\n prefix: CachePrefix.IDENTITY_PROVIDER_ROLE,\n key: event.entity.id,\n }),\n ]);\n }\n\n await publishEvent(EntityDefaultEventName.UPDATED, event.entity as IdentityProviderRoleMapping);\n }\n\n async afterRemove(event: RemoveEvent<IdentityProviderRoleMapping>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n if (event.connection.queryResultCache) {\n await event.connection.queryResultCache.remove([\n buildRedisKeyPath({\n prefix: CachePrefix.IDENTITY_PROVIDER_ROLE,\n key: event.entity.id,\n }),\n ]);\n }\n\n await publishEvent(EntityDefaultEventName.DELETED, event.entity);\n }\n}\n","/*\n * Copyright (c) 2021-2021.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { createNanoID } from '@authup/kit';\nimport {\n BeforeInsert,\n BeforeUpdate,\n Column,\n CreateDateColumn,\n Entity, \n Index,\n JoinColumn,\n ManyToOne,\n PrimaryGeneratedColumn,\n Unique,\n UpdateDateColumn,\n} from 'typeorm';\nimport type {\n Client,\n Realm,\n Robot,\n User,\n} from '@authup/core-kit';\nimport { RealmEntity } from '../realm/index.ts';\nimport { UserEntity } from '../user/index.ts';\n\n@Entity({ name: 'auth_robots' })\n@Unique(['name', 'realm_id'])\nexport class RobotEntity implements Robot {\n @PrimaryGeneratedColumn('uuid')\n id: string;\n\n @Column({\n type: 'varchar',\n length: 256,\n select: false, \n })\n secret: string;\n\n @Column({\n type: 'varchar',\n length: 128, \n })\n name: string;\n\n @Column({\n type: 'varchar',\n length: 256,\n nullable: true, \n })\n display_name: string | null;\n\n @Column({\n type: 'text',\n nullable: true, \n })\n description: string;\n\n @Column({\n type: 'boolean',\n default: true, \n })\n active: boolean;\n\n // ------------------------------------------------------------------\n\n @CreateDateColumn()\n created_at: Date;\n\n @UpdateDateColumn()\n updated_at: Date;\n\n // ------------------------------------------------------------------\n\n @Column({\n nullable: true,\n default: null, \n })\n user_id: User['id'] | null;\n\n @ManyToOne(() => UserEntity, {\n onDelete: 'CASCADE',\n nullable: true, \n })\n @JoinColumn({ name: 'user_id' })\n user: User | null;\n\n // ------------------------------------------------------------------\n\n @Index()\n @Column({ nullable: true })\n client_id: Client['id'] | null;\n\n @ManyToOne(() => RealmEntity, {\n onDelete: 'CASCADE',\n nullable: true, \n })\n @JoinColumn({ name: 'client_id' })\n client: Client | null;\n\n // ------------------------------------------------------------------\n\n @Index()\n @Column()\n realm_id: Realm['id'];\n\n @ManyToOne(() => RealmEntity, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'realm_id' })\n realm: Realm;\n\n // ------------------------------------------------------------------\n\n @BeforeUpdate()\n @BeforeInsert()\n setName() {\n if (!this.name || this.name.length === 0) {\n this.name = createNanoID(36);\n }\n }\n}\n","/*\n * Copyright (c) 2021-2021.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n Column,\n CreateDateColumn,\n Entity,\n Index,\n JoinColumn,\n ManyToOne,\n PrimaryGeneratedColumn,\n UpdateDateColumn,\n} from 'typeorm';\nimport type {\n Realm, \n Robot, \n RobotRole, \n Role,\n} from '@authup/core-kit';\nimport { RoleEntity } from '../role/index.ts';\nimport { RobotEntity } from '../robot/entity.ts';\nimport { RealmEntity } from '../realm/index.ts';\n\n@Entity({ name: 'auth_robot_roles' })\n@Index(['role_id', 'robot_id'], { unique: true })\nexport class RobotRoleEntity implements RobotRole {\n @PrimaryGeneratedColumn('uuid')\n id: string;\n\n // ------------------------------------------------------------------\n\n @Column()\n role_id: string;\n\n @ManyToOne(() => RoleEntity, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'role_id' })\n role: Role;\n\n @Column({ nullable: true })\n role_realm_id: Realm['id'] | null;\n\n @ManyToOne(() => RealmEntity, {\n onDelete: 'CASCADE',\n nullable: true, \n })\n @JoinColumn({ name: 'role_realm_id' })\n role_realm: Realm | null;\n\n @Column()\n robot_id: string;\n\n @ManyToOne(() => RobotEntity, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'client_id' })\n robot: Robot;\n\n @Column({ nullable: true })\n robot_realm_id: Realm['id'] | null;\n\n @ManyToOne(() => RealmEntity, {\n onDelete: 'CASCADE',\n nullable: true, \n })\n @JoinColumn({ name: 'robot_realm_id' })\n robot_realm: Realm | null;\n\n // ------------------------------------------------------------------\n\n @CreateDateColumn()\n created_at: string;\n\n @UpdateDateColumn()\n updated_at: string;\n}\n","/*\n * Copyright (c) 2022-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { RobotRole } from '@authup/core-kit';\nimport {\n EntityDefaultEventName, \n EntityType,\n buildEntityChannelName,\n buildEntityNamespaceName,\n} from '@authup/core-kit';\nimport type { DomainEventDestination } from '@authup/server-kit';\nimport { buildRedisKeyPath } from '@authup/server-kit';\nimport type {\n EntitySubscriberInterface, \n InsertEvent,\n RemoveEvent,\n UpdateEvent,\n} from 'typeorm';\nimport { EventSubscriber } from 'typeorm';\nimport { publishDomainEvent } from '../../event-publisher/index.ts';\nimport { CachePrefix } from '../constants.ts';\nimport { RobotRoleEntity } from './entity.ts';\n\nasync function publishEvent(\n event: `${EntityDefaultEventName}`,\n data: RobotRole,\n) {\n const destinations : DomainEventDestination[] = [\n { channel: (id) => buildEntityChannelName(EntityType.ROBOT_ROLE, id) },\n ];\n if (data.robot_realm_id) {\n destinations.push({\n channel: (id) => buildEntityChannelName(EntityType.ROBOT_ROLE, id),\n namespace: buildEntityNamespaceName(data.robot_realm_id),\n });\n }\n if (data.role_realm_id) {\n destinations.push({\n channel: (id) => buildEntityChannelName(EntityType.ROBOT_ROLE, id),\n namespace: buildEntityNamespaceName(data.role_realm_id),\n });\n }\n\n await publishDomainEvent({\n content: {\n type: EntityType.ROBOT_ROLE,\n event,\n data,\n },\n destinations,\n });\n}\n\n@EventSubscriber()\nexport class RobotRoleSubscriber implements EntitySubscriberInterface<RobotRole> {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n listenTo(): Function | string {\n return RobotRoleEntity;\n }\n\n async afterInsert(event: InsertEvent<RobotRole>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n if (event.connection.queryResultCache) {\n await event.connection.queryResultCache.remove([\n buildRedisKeyPath({\n prefix: CachePrefix.ROBOT_OWNED_ROLES,\n key: event.entity.robot_id,\n }),\n ]);\n }\n\n await publishEvent(EntityDefaultEventName.CREATED, event.entity);\n }\n\n async afterUpdate(event: UpdateEvent<RobotRole>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n if (event.connection.queryResultCache) {\n await event.connection.queryResultCache.remove([\n buildRedisKeyPath({\n prefix: CachePrefix.ROBOT_OWNED_ROLES,\n key: event.entity.robot_id,\n }),\n ]);\n }\n\n await publishEvent(EntityDefaultEventName.UPDATED, event.entity as RobotRole);\n }\n\n async afterRemove(event: RemoveEvent<RobotRole>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n if (event.connection.queryResultCache) {\n await event.connection.queryResultCache.remove([\n buildRedisKeyPath({\n prefix: CachePrefix.ROBOT_OWNED_ROLES,\n key: event.entity.robot_id,\n }),\n ]);\n }\n\n await publishEvent(EntityDefaultEventName.DELETED, event.entity);\n }\n}\n","/*\n * Copyright (c) 2021-2021.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n Column,\n CreateDateColumn,\n Entity, \n Index,\n JoinColumn,\n ManyToOne,\n PrimaryGeneratedColumn,\n UpdateDateColumn,\n} from 'typeorm';\nimport type {\n Permission, \n Policy, \n Realm,\n Robot, \n RobotPermission,\n} from '@authup/core-kit';\nimport { PermissionEntity } from '../permission/index.ts';\nimport { PolicyEntity } from '../policy/index.ts';\nimport { RobotEntity } from '../robot/entity.ts';\nimport { RealmEntity } from '../realm/index.ts';\n\n@Entity({ name: 'auth_robot_permissions' })\n@Index(['permission_id', 'robot_id'], { unique: true })\nexport class RobotPermissionEntity implements RobotPermission {\n @PrimaryGeneratedColumn('uuid')\n id: string;\n\n // ------------------------------------------------------------------\n\n @Column({ nullable: true })\n policy_id: string | null;\n\n @ManyToOne(() => PolicyEntity, {\n onDelete: 'SET NULL',\n nullable: true, \n })\n @JoinColumn({ name: 'policy_id' })\n policy: Policy | null;\n\n @Column()\n robot_id: string;\n\n @ManyToOne(() => RobotEntity, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'robot_id' })\n robot: Robot;\n\n @Column({ nullable: true })\n robot_realm_id: Realm['id'] | null;\n\n @ManyToOne(() => RealmEntity, {\n onDelete: 'CASCADE',\n nullable: true, \n })\n @JoinColumn({ name: 'robot_realm_id' })\n robot_realm: Realm | null;\n\n @Column({ type: 'varchar' })\n permission_id: string;\n\n @ManyToOne(() => PermissionEntity, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'permission_id' })\n permission: Permission;\n\n @Column({ nullable: true })\n permission_realm_id: Realm['id'] | null;\n\n @ManyToOne(() => RealmEntity, {\n onDelete: 'CASCADE',\n nullable: true, \n })\n @JoinColumn({ name: 'permission_realm_id' })\n permission_realm: Realm | null;\n\n // ------------------------------------------------------------------\n\n @CreateDateColumn()\n created_at: Date;\n\n @UpdateDateColumn()\n updated_at: Date;\n}\n","/*\n * Copyright (c) 2022-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { RobotPermission } from '@authup/core-kit';\nimport {\n EntityDefaultEventName, \n EntityType,\n buildEntityChannelName,\n buildEntityNamespaceName,\n} from '@authup/core-kit';\nimport type { DomainEventDestination } from '@authup/server-kit';\nimport { buildRedisKeyPath } from '@authup/server-kit';\nimport type {\n EntitySubscriberInterface, \n InsertEvent,\n RemoveEvent,\n UpdateEvent,\n} from 'typeorm';\nimport { EventSubscriber } from 'typeorm';\nimport { publishDomainEvent } from '../../event-publisher/index.ts';\nimport { RobotPermissionEntity } from './entity.ts';\nimport { CachePrefix } from '../constants.ts';\n\nasync function publishEvent(\n event: `${EntityDefaultEventName}`,\n data: RobotPermission,\n) {\n const destinations : DomainEventDestination[] = [\n { channel: (id) => buildEntityChannelName(EntityType.ROBOT_PERMISSION, id) },\n ];\n if (data.robot_realm_id) {\n destinations.push({\n channel: (id) => buildEntityChannelName(EntityType.ROBOT_PERMISSION, id),\n namespace: buildEntityNamespaceName(data.robot_realm_id),\n });\n }\n if (data.permission_realm_id) {\n destinations.push({\n channel: (id) => buildEntityChannelName(EntityType.ROBOT_PERMISSION, id),\n namespace: buildEntityNamespaceName(data.permission_realm_id),\n });\n }\n\n await publishDomainEvent({\n content: {\n type: EntityType.ROBOT_PERMISSION,\n event,\n data,\n },\n destinations,\n });\n}\n\n@EventSubscriber()\nexport class RobotPermissionSubscriber implements EntitySubscriberInterface<RobotPermission> {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n listenTo(): Function | string {\n return RobotPermissionEntity;\n }\n\n async afterInsert(event: InsertEvent<RobotPermission>): Promise<any> {\n if (event.connection.queryResultCache) {\n await event.connection.queryResultCache.remove([\n buildRedisKeyPath({\n prefix: CachePrefix.ROBOT_OWNED_PERMISSIONS,\n key: event.entity.robot_id,\n }),\n ]);\n }\n\n await publishEvent(EntityDefaultEventName.CREATED, event.entity);\n\n return Promise.resolve(undefined);\n }\n\n async afterUpdate(event: UpdateEvent<RobotPermission>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n if (event.connection.queryResultCache) {\n await event.connection.queryResultCache.remove([\n buildRedisKeyPath({\n prefix: CachePrefix.ROBOT_OWNED_PERMISSIONS,\n key: event.entity.robot_id,\n }),\n ]);\n }\n\n await publishEvent(EntityDefaultEventName.UPDATED, event.entity as RobotPermission);\n }\n\n async afterRemove(event: RemoveEvent<RobotPermission>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n if (event.connection.queryResultCache) {\n await event.connection.queryResultCache.remove([\n buildRedisKeyPath({\n prefix: CachePrefix.ROBOT_OWNED_PERMISSIONS,\n key: event.entity.robot_id,\n }),\n ]);\n }\n\n await publishEvent(EntityDefaultEventName.DELETED, event.entity);\n }\n}\n","/*\n * Copyright (c) 2021-2021.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type {\n Robot,\n Role,\n} from '@authup/core-kit';\nimport type { BasePolicy, PermissionPolicyBinding } from '@authup/access';\nimport { buildRedisKeyPath } from '@authup/server-kit';\nimport type { DataSource, EntityManager } from 'typeorm';\nimport { InstanceChecker, Repository } from 'typeorm';\nimport { CachePrefix } from '../constants.ts';\nimport { RobotEntity } from './entity.ts';\nimport { RobotRoleEntity } from '../robot-role/index.ts';\nimport { RobotPermissionEntity } from '../robot-permission/index.ts';\nimport { PolicyRepository } from '../policy/index.ts';\n\nexport class RobotRepository extends Repository<RobotEntity> {\n #manager: EntityManager;\n\n constructor(instance: DataSource | EntityManager) {\n super(RobotEntity, InstanceChecker.isDataSource(instance) ? instance.manager : instance);\n this.#manager = InstanceChecker.isDataSource(instance) ? instance.manager : instance;\n }\n\n async getBoundRoles(\n entity: string | Robot,\n ) : Promise<Role[]> {\n let id : string;\n if (typeof entity === 'string') {\n id = entity;\n } else {\n id = entity.id;\n }\n\n const entities = await this.manager\n .getRepository(RobotRoleEntity)\n .find({\n where: { robot_id: id },\n relations: { role: true },\n cache: {\n id: buildRedisKeyPath({\n prefix: CachePrefix.ROBOT_OWNED_ROLES,\n key: id,\n }),\n milliseconds: 60_000,\n },\n });\n\n return entities\n .map((entity) => entity.role);\n }\n\n async getBoundPermissions(\n entity: string | Robot,\n ) : Promise<PermissionPolicyBinding[]> {\n let id : string;\n if (typeof entity === 'string') {\n id = entity;\n } else {\n id = entity.id;\n }\n\n const repository = this.manager.getRepository(RobotPermissionEntity);\n\n const entities = await repository.find({\n where: { robot_id: id },\n relations: { permission: true },\n cache: {\n id: buildRedisKeyPath({\n prefix: CachePrefix.ROBOT_OWNED_PERMISSIONS,\n key: id,\n }),\n milliseconds: 60_000,\n },\n });\n\n const policyIds = new Set<string>();\n for (const entry of entities) {\n if (entry.policy_id) {\n policyIds.add(entry.policy_id);\n }\n }\n\n const policyTrees = await this.loadPolicyTrees([...policyIds]);\n\n return entities\n .map((entry) => {\n const policies: BasePolicy[] = [];\n if (entry.policy_id && policyTrees[entry.policy_id]) {\n policies.push(policyTrees[entry.policy_id]);\n }\n\n return {\n permission: entry.permission,\n policies: policies.length > 0 ? policies : undefined,\n };\n });\n }\n\n private async loadPolicyTrees(policyIds: string[]): Promise<Record<string, BasePolicy>> {\n if (policyIds.length === 0) {\n return {};\n }\n\n const policyRepository = new PolicyRepository(this.#manager);\n const result: Record<string, BasePolicy> = {};\n\n for (const id of policyIds) {\n const tree = await policyRepository.findDescendantsTreeById(id);\n if (tree) {\n result[id] = tree;\n }\n }\n\n return result;\n }\n}\n","/*\n * Copyright (c) 2022-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Robot } from '@authup/core-kit';\nimport {\n EntityDefaultEventName, \n EntityType,\n buildEntityChannelName,\n buildEntityNamespaceName,\n} from '@authup/core-kit';\nimport { buildRedisKeyPath } from '@authup/server-kit';\nimport type {\n EntitySubscriberInterface, \n InsertEvent,\n RemoveEvent,\n UpdateEvent,\n} from 'typeorm';\nimport { EventSubscriber } from 'typeorm';\nimport { publishDomainEvent } from '../../event-publisher/index.ts';\nimport { RobotEntity } from './entity.ts';\nimport { CachePrefix } from '../constants.ts';\n\nasync function publishEvent(\n event: `${EntityDefaultEventName}`,\n data: Robot,\n) {\n await publishDomainEvent({\n content: {\n type: EntityType.ROBOT,\n event,\n data,\n },\n destinations: [\n {\n channel: (id) => buildEntityChannelName(EntityType.ROBOT, id),\n namespace: buildEntityNamespaceName(data.realm_id),\n },\n { channel: (id) => buildEntityChannelName(EntityType.ROBOT, id) },\n ],\n });\n}\n\n@EventSubscriber()\nexport class RobotSubscriber implements EntitySubscriberInterface<Robot> {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n listenTo(): Function | string {\n return RobotEntity;\n }\n\n async afterInsert(event: InsertEvent<Robot>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n await publishEvent(EntityDefaultEventName.CREATED, event.entity);\n }\n\n async afterUpdate(event: UpdateEvent<Robot>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n if (event.connection.queryResultCache) {\n await event.connection.queryResultCache.remove([\n buildRedisKeyPath({\n prefix: CachePrefix.ROBOT,\n key: event.entity.id,\n }),\n ]);\n }\n\n await publishEvent(EntityDefaultEventName.UPDATED, event.entity as Robot);\n }\n\n async afterRemove(event: RemoveEvent<Robot>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n if (event.connection.queryResultCache) {\n await event.connection.queryResultCache.remove([\n buildRedisKeyPath({\n prefix: CachePrefix.ROBOT,\n key: event.entity.id,\n }),\n ]);\n }\n\n await publishEvent(EntityDefaultEventName.DELETED, event.entity);\n }\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n Column, \n CreateDateColumn, \n Entity, \n Index, \n JoinColumn, \n ManyToOne, \n PrimaryGeneratedColumn, \n UpdateDateColumn,\n} from 'typeorm';\nimport type {\n Client, \n Realm, \n Robot, \n Session, \n User,\n} from '@authup/core-kit';\nimport { ClientEntity } from '../client/index.ts';\nimport { RobotEntity } from '../robot/index.ts';\nimport { RealmEntity } from '../realm/index.ts';\nimport { UserEntity } from '../user/index.ts';\n\n@Entity({ name: 'auth_sessions' })\nexport class SessionEntity implements Session {\n @PrimaryGeneratedColumn('uuid')\n id: string;\n\n @Index()\n @Column({\n type: 'varchar',\n length: 64, \n })\n sub: string;\n\n @Index()\n @Column({\n type: 'varchar',\n length: 64, \n })\n sub_kind: string;\n\n @Index()\n @Column({\n type: 'varchar',\n length: 15, \n })\n ip_address: string;\n\n @Index()\n @Column({\n type: 'varchar',\n length: 512, \n })\n user_agent: string;\n\n // ------------------------------------------------------------------\n\n @Column({\n type: 'varchar',\n length: 28,\n })\n expires_at: string;\n\n @Column({\n type: 'varchar',\n length: 28,\n nullable: true,\n })\n refreshed_at: string | null;\n\n @Column({\n type: 'varchar',\n length: 28,\n nullable: true,\n })\n seen_at: string | null;\n\n @UpdateDateColumn()\n updated_at: string;\n\n @CreateDateColumn()\n created_at: string;\n\n // ------------------------------------------------------------------\n\n @Column({\n nullable: true,\n default: null, \n })\n client_id: Client['id'] | null;\n\n @ManyToOne(() => ClientEntity, {\n onDelete: 'CASCADE',\n nullable: true, \n })\n @JoinColumn({ name: 'client_id' })\n client: ClientEntity | null;\n\n @Column({\n nullable: true,\n default: null, \n })\n user_id: User['id'] | null;\n\n @ManyToOne(() => UserEntity, {\n onDelete: 'CASCADE',\n nullable: true, \n })\n @JoinColumn({ name: 'user_id' })\n user: UserEntity | null;\n\n @Column({\n nullable: true,\n default: null, \n })\n robot_id: Robot['id'] | null;\n\n @ManyToOne(() => RobotEntity, {\n onDelete: 'CASCADE',\n nullable: true, \n })\n @JoinColumn({ name: 'robot_id' })\n robot: RobotEntity | null;\n\n @Column()\n realm_id: Realm['id'];\n\n @ManyToOne(() => RealmEntity, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'realm_id' })\n realm: RealmEntity;\n}\n","/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n Column,\n CreateDateColumn,\n Entity,\n Index,\n JoinColumn,\n ManyToOne,\n PrimaryGeneratedColumn,\n UpdateDateColumn,\n} from 'typeorm';\nimport type {\n Permission, \n PermissionPolicy, \n Policy, \n Realm,\n} from '@authup/core-kit';\nimport { PermissionEntity } from '../permission/index.ts';\nimport { PolicyEntity } from '../policy/index.ts';\nimport { RealmEntity } from '../realm/index.ts';\n\n@Entity({ name: 'auth_permission_policies' })\n@Index(['permission_id', 'policy_id'], { unique: true })\nexport class PermissionPolicyEntity implements PermissionPolicy {\n @PrimaryGeneratedColumn('uuid')\n id: string;\n\n @CreateDateColumn()\n created_at: string;\n\n @UpdateDateColumn()\n updated_at: string;\n\n // ------------------------------------------------------------------\n\n @Column()\n permission_id: string;\n\n @ManyToOne(() => PermissionEntity, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'permission_id' })\n permission: Permission;\n\n @Column({ nullable: true })\n permission_realm_id: Realm['id'] | null;\n\n @ManyToOne(() => RealmEntity, {\n onDelete: 'CASCADE',\n nullable: true, \n })\n @JoinColumn({ name: 'permission_realm_id' })\n permission_realm: Realm | null;\n\n // ------------------------------------------------------------------\n\n @Column()\n policy_id: string;\n\n @ManyToOne(() => PolicyEntity, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'policy_id' })\n policy: Policy;\n\n @Column({ nullable: true })\n policy_realm_id: Realm['id'] | null;\n\n @ManyToOne(() => RealmEntity, {\n onDelete: 'CASCADE',\n nullable: true, \n })\n @JoinColumn({ name: 'policy_realm_id' })\n policy_realm: Realm | null;\n}\n","/*\n * Copyright (c) 2022-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { RoleAttribute } from '@authup/core-kit';\nimport {\n EntityDefaultEventName, \n EntityType, \n buildEntityChannelName, \n buildEntityNamespaceName,\n} from '@authup/core-kit';\nimport type { DomainEventDestinations } from '@authup/server-kit';\nimport { buildRedisKeyPath } from '@authup/server-kit';\nimport type {\n EntitySubscriberInterface, \n InsertEvent,\n RemoveEvent,\n UpdateEvent,\n} from 'typeorm';\nimport { EventSubscriber } from 'typeorm';\nimport { publishDomainEvent } from '../../event-publisher/index.ts';\nimport { RoleAttributeEntity } from './entity.ts';\nimport { CachePrefix } from '../constants.ts';\n\nasync function publishEvent(\n event: `${EntityDefaultEventName}`,\n data: RoleAttribute,\n) {\n const destinations : DomainEventDestinations = [\n { channel: (id) => buildEntityChannelName(EntityType.ROLE_ATTRIBUTE, id) },\n ];\n if (data.realm_id) {\n destinations.push({\n channel: (id) => buildEntityChannelName(EntityType.ROLE_ATTRIBUTE, id),\n namespace: buildEntityNamespaceName(data.realm_id),\n });\n }\n\n await publishDomainEvent({\n content: {\n type: EntityType.ROLE_ATTRIBUTE,\n event,\n data,\n },\n destinations,\n });\n}\n\n@EventSubscriber()\nexport class RoleAttributeSubscriber implements EntitySubscriberInterface<RoleAttribute> {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n listenTo(): Function | string {\n return RoleAttributeEntity;\n }\n\n async afterInsert(event: InsertEvent<RoleAttribute>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n if (event.connection.queryResultCache) {\n await event.connection.queryResultCache.remove([\n buildRedisKeyPath({\n prefix: CachePrefix.ROLE_OWNED_PERMISSIONS,\n key: event.entity.role_id,\n }),\n ]);\n }\n\n await publishEvent(EntityDefaultEventName.CREATED, event.entity);\n }\n\n async afterUpdate(event: UpdateEvent<RoleAttribute>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n if (event.connection.queryResultCache) {\n await event.connection.queryResultCache.remove([\n buildRedisKeyPath({\n prefix: CachePrefix.ROLE_OWNED_PERMISSIONS,\n key: event.entity.role_id,\n }),\n ]);\n }\n\n await publishEvent(EntityDefaultEventName.UPDATED, event.entity as RoleAttribute);\n }\n\n async afterRemove(event: RemoveEvent<RoleAttribute>): Promise<any> {\n if (!event.entity) {\n return;\n }\n\n if (event.connection.queryResultCache) {\n await event.connection.queryResultCache.remove([\n buildRedisKeyPath({\n prefix: CachePrefix.ROLE_OWNED_PERMISSIONS,\n key: event.entity.role_id,\n }),\n ]);\n }\n\n await publishEvent(EntityDefaultEventName.DELETED, event.entity);\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { createNanoID, isBCryptHash } from '@authup/kit';\nimport { compare, hash } from '@authup/server-kit';\nimport type { Client } from '@authup/core-kit';\nimport type { ICredentialService } from '../../types.ts';\n\nexport class ClientCredentialsService implements ICredentialService<Client> {\n async verify(input: string, entity: Client): Promise<boolean> {\n if (!entity.secret || !entity.is_confidential) {\n return false;\n }\n\n if (entity.secret_hashed) {\n return compare(input, entity.secret);\n }\n\n // todo: secret encrypted missing (decrypt)\n\n return input === entity.secret;\n }\n\n async protect(input: string, entity: Pick<Client, 'secret_hashed'>): Promise<string> {\n if (entity.secret_hashed) {\n return isBCryptHash(input) ?\n input :\n hash(input);\n }\n\n // todo: secret encrypted missing (encrypt)\n\n return input;\n }\n\n generateSecret() {\n return createNanoID(64);\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { compare, hash } from '@authup/server-kit';\nimport { createNanoID } from '@authup/kit';\nimport type { Robot } from '@authup/core-kit';\nimport type { ICredentialService } from '../../types.ts';\n\nexport class RobotCredentialsService implements ICredentialService<Robot> {\n async verify(input: string, entity: Robot): Promise<boolean> {\n if (!entity.secret) {\n return false;\n }\n\n return compare(input, entity.secret);\n }\n\n async protect(input: string): Promise<string> {\n return hash(input);\n }\n\n generateSecret() {\n return createNanoID(64);\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { compare, hash } from '@authup/server-kit';\nimport type { User } from '@authup/core-kit';\nimport type { ICredentialService } from '../../types.ts';\n\nexport class UserCredentialsService implements ICredentialService<User> {\n async verify(input: string, entity: User): Promise<boolean> {\n if (!entity.password) {\n return false;\n }\n\n return compare(input, entity.password);\n }\n\n async protect(input: string): Promise<string> {\n return hash(input);\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Result } from '@authup/kit';\nimport type { ObjectLiteral } from 'validup';\nimport type { ICredentialsAuthenticator } from './types.ts';\n\nexport abstract class BaseCredentialsAuthenticator<\n OUTPUT extends ObjectLiteral = ObjectLiteral,\n> implements ICredentialsAuthenticator<OUTPUT> {\n async safeAuthenticate(key: string, value: string, realmId?: string): Promise<Result<OUTPUT>> {\n try {\n const data = await this.authenticate(key, value, realmId);\n return {\n success: true,\n data, \n };\n } catch (e) {\n return {\n success: false,\n error: e as Error, \n };\n }\n }\n\n abstract authenticate(key: string, value: string, realmId?: string): Promise<OUTPUT>;\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Client } from '@authup/core-kit';\nimport { ClientError, IdentityType } from '@authup/core-kit';\nimport type { IIdentityResolver } from '../../../identity/index.ts';\nimport { ClientCredentialsService } from '../../credential/index.ts';\nimport { BaseCredentialsAuthenticator } from '../../base.ts';\n\nexport class ClientAuthenticator extends BaseCredentialsAuthenticator<Client> {\n protected identityResolver : IIdentityResolver;\n\n protected credentialsService : ClientCredentialsService;\n\n constructor(identityResolver: IIdentityResolver) {\n super();\n\n this.identityResolver = identityResolver;\n this.credentialsService = new ClientCredentialsService();\n }\n\n async authenticate(key: string, secret: string, realmId?: string): Promise<Client> {\n const identity = await this.identityResolver.resolve(IdentityType.CLIENT, key, realmId);\n if (!identity || identity.type !== IdentityType.CLIENT) {\n throw ClientError.credentialsInvalid();\n }\n\n if (!identity.data.active) {\n throw ClientError.inactive();\n }\n\n if (identity.data.is_confidential) {\n const verified = await this.credentialsService.verify(secret, identity.data);\n if (!verified) {\n throw ClientError.credentialsInvalid();\n }\n } else {\n throw ClientError.invalid();\n }\n\n return identity.data;\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Robot } from '@authup/core-kit';\nimport { IdentityType, RobotError } from '@authup/core-kit';\nimport type { IIdentityResolver } from '../../../identity/index.ts';\nimport { RobotCredentialsService } from '../../credential/index.ts';\nimport { BaseCredentialsAuthenticator } from '../../base.ts';\n\nexport class RobotAuthenticator extends BaseCredentialsAuthenticator<Robot> {\n protected identityResolver : IIdentityResolver;\n\n protected credentialsService : RobotCredentialsService;\n\n constructor(identityResolver: IIdentityResolver) {\n super();\n\n this.identityResolver = identityResolver;\n this.credentialsService = new RobotCredentialsService();\n }\n\n async authenticate(key: string, secret: string, realmId?: string): Promise<Robot> {\n const identity = await this.identityResolver.resolve(IdentityType.ROBOT, key, realmId);\n if (!identity || identity.type !== IdentityType.ROBOT) {\n throw RobotError.credentialsInvalid();\n }\n\n const verified = await this.credentialsService.verify(secret, identity.data);\n if (!verified) {\n throw RobotError.credentialsInvalid();\n }\n\n if (!identity.data.active) {\n throw RobotError.inactive();\n }\n\n return identity.data;\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { User } from '@authup/core-kit';\nimport { IdentityType, UserError } from '@authup/core-kit';\nimport type { IIdentityResolver } from '../../../identity/index.ts';\nimport { UserCredentialsService } from '../../credential/index.ts';\nimport { BaseCredentialsAuthenticator } from '../../base.ts';\n\nexport class UserAuthenticator extends BaseCredentialsAuthenticator<User> {\n protected identityResolver : IIdentityResolver;\n\n protected credentialsService : UserCredentialsService;\n\n constructor(identityResolver: IIdentityResolver) {\n super();\n\n this.identityResolver = identityResolver;\n this.credentialsService = new UserCredentialsService();\n }\n\n async authenticate(key: string, secret: string, realmId?: string): Promise<User> {\n const identity = await this.identityResolver.resolve(IdentityType.USER, key, realmId);\n if (!identity || identity.type !== IdentityType.USER) {\n throw UserError.credentialsInvalid();\n }\n\n const verified = await this.credentialsService.verify(secret, identity.data);\n if (!verified) {\n throw UserError.credentialsInvalid();\n }\n\n if (!identity.data.active) {\n throw UserError.inactive();\n }\n\n return identity.data;\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { ObjectLiteral } from '@authup/kit';\nimport { BaseCredentialsAuthenticator } from './base.ts';\n\nexport class CredentialsAuthenticator<T extends ObjectLiteral = ObjectLiteral> extends BaseCredentialsAuthenticator<T> {\n protected strategies: BaseCredentialsAuthenticator<T>[];\n\n constructor(strategies: BaseCredentialsAuthenticator<T>[]) {\n super();\n\n this.strategies = strategies;\n }\n\n async authenticate(key: string, value: string, realmId?: string): Promise<T> {\n let error : Error | undefined;\n\n for (let i = 0; i < this.strategies.length; i++) {\n const strategy = this.strategies[i];\n\n const output = await strategy.safeAuthenticate(key, value, realmId);\n if (output.success) {\n return output.data;\n }\n\n error = output.error;\n }\n\n if (error) {\n throw error;\n }\n\n throw new Error('No authentication strategy worked.');\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Session } from '@authup/core-kit';\nimport { IdentityType } from '@authup/core-kit';\nimport { JWTError } from '@authup/specs';\nimport type {\n ISessionManager, \n ISessionRepository, \n SessionManagerContext, \n SessionManagerOptions,\n} from './types.ts';\n\nexport class SessionManager implements ISessionManager {\n protected options: SessionManagerOptions;\n\n protected repository: ISessionRepository;\n\n // -----------------------------------------------------\n\n constructor(ctx: SessionManagerContext) {\n this.options = ctx.options;\n this.repository = ctx.repository;\n }\n\n // -----------------------------------------------------\n\n /**\n * Create/Update session\n *\n * @param input\n */\n async create(input: Partial<Session>): Promise<Session> {\n input.ip_address = input.ip_address || '127.0.0.1';\n input.user_agent = input.user_agent || 'system';\n input.expires_at = input.expires_at || new Date(\n Date.now() + (this.options.maxAge * 1_000),\n ).toISOString();\n\n switch (input.sub_kind) {\n case IdentityType.CLIENT: {\n input.client_id = input.sub;\n break;\n }\n case IdentityType.ROBOT: {\n input.robot_id = input.sub;\n break;\n }\n case IdentityType.USER: {\n input.user_id = input.sub;\n break;\n }\n }\n\n return this.repository.save(input);\n }\n\n // -----------------------------------------------------\n\n async ping(session: Session): Promise<Session> {\n if (session.seen_at) {\n const seenAt = new Date(session.seen_at).getTime();\n const threshold = seenAt + (5 * 1_000);\n\n if (threshold > Date.now()) {\n return session;\n }\n }\n\n session.seen_at = new Date().toISOString();\n\n return this.repository.save(session);\n }\n\n // -----------------------------------------------------\n\n async refresh(session: Session): Promise<Session> {\n const now = new Date().toISOString();\n session.refreshed_at = now;\n session.seen_at = now;\n\n session.expires_at = new Date(\n Date.now() + (this.options.maxAge * 1_000),\n ).toISOString();\n\n return this.repository.save(session);\n }\n\n // -----------------------------------------------------\n\n /**\n * Verify session on token inspection/verification.\n *\n * @param id\n * @throws JWTError\n */\n async findOneById(id: string): Promise<Session | null> {\n return this.repository.findOneById(id);\n }\n\n // -----------------------------------------------------\n\n async verify(session: Session): Promise<void> {\n const ms = new Date(session.expires_at).getTime();\n if (Date.now() > ms) {\n await this.repository.remove(session);\n\n // todo: better error\n throw JWTError.expired();\n }\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { REALM_MASTER_NAME } from '@authup/core-kit';\nimport { isObject } from '@authup/kit';\nimport type { ActorContext } from './actor/types.ts';\n\nexport abstract class AbstractEntityService {\n protected isActorMasterRealmMember(actor: ActorContext): boolean {\n if (!actor.identity) {\n return false;\n }\n\n const { data } = actor.identity;\n if ('realm' in data && data.realm && typeof data.realm === 'object' && 'name' in data.realm) {\n return data.realm.name === REALM_MASTER_NAME;\n }\n\n return false;\n }\n\n protected getActorRealmId(actor: ActorContext): string | undefined {\n if (!actor.identity) {\n return undefined;\n }\n\n const { data } = actor.identity;\n if (data.realm_id) {\n return data.realm_id;\n }\n\n if ('realm' in data && isObject(data.realm) && 'id' in data.realm) {\n return data.realm.id;\n }\n\n return undefined;\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { BuiltInPolicyType, PolicyData } from '@authup/access';\nimport { isUUID } from '@authup/kit';\nimport { NotFoundError } from '@ebec/http';\nimport {\n ClientValidator,\n PermissionName,\n ValidatorGroup,\n} from '@authup/core-kit';\nimport type { Client } from '@authup/core-kit';\nimport type { ActorContext } from '../actor/types.ts';\nimport type { IRealmRepository } from '../realm/types.ts';\nimport { AbstractEntityService } from '../service.ts';\nimport type { EntityRepositoryFindManyResult } from '../types.ts';\nimport { ClientCredentialsService } from '../../authentication/credential/entities/client/module.ts';\nimport type { IClientRepository, IClientService } from './types.ts';\n\nexport type ClientServiceContext = {\n repository: IClientRepository;\n realmRepository: IRealmRepository;\n};\n\nexport class ClientService extends AbstractEntityService implements IClientService {\n protected repository: IClientRepository;\n\n protected realmRepository: IRealmRepository;\n\n protected validator: ClientValidator;\n\n constructor(ctx: ClientServiceContext) {\n super();\n this.repository = ctx.repository;\n this.realmRepository = ctx.realmRepository;\n this.validator = new ClientValidator();\n }\n\n async getMany(\n query: Record<string, any>,\n actor: ActorContext,\n ): Promise<EntityRepositoryFindManyResult<Client>> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.CLIENT_READ,\n PermissionName.CLIENT_UPDATE,\n PermissionName.CLIENT_DELETE,\n ],\n });\n\n const {\n data: entities, \n meta, \n } = await this.repository.findMany(query);\n let { total } = meta;\n\n const data: Client[] = [];\n for (const entity of entities) {\n if (\n entity.secret &&\n !entity.secret_encrypted &&\n !entity.secret_hashed\n ) {\n try {\n await actor.permissionEvaluator.evaluateOneOf({\n name: [\n PermissionName.CLIENT_READ,\n PermissionName.CLIENT_UPDATE,\n PermissionName.CLIENT_DELETE,\n ],\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity }),\n });\n data.push(entity);\n } catch {\n total -= 1;\n }\n\n continue;\n }\n\n data.push(entity);\n }\n\n return {\n data,\n meta: {\n ...meta,\n total, \n }, \n };\n }\n\n async getOne(\n idOrName: string,\n actor: ActorContext,\n realmId?: string,\n ): Promise<Client> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.CLIENT_READ,\n PermissionName.CLIENT_UPDATE,\n PermissionName.CLIENT_DELETE,\n ],\n });\n\n let entity: Client | null;\n\n if (isUUID(idOrName)) {\n entity = await this.repository.findOneByIdOrName(idOrName, realmId);\n } else if (realmId) {\n const realm = await this.realmRepository.resolve(realmId);\n if (realm) {\n entity = await this.repository.findOneBy({\n name: idOrName,\n realm_id: realm.id,\n });\n } else {\n entity = null;\n }\n } else {\n entity = await this.repository.findOneByName(idOrName);\n }\n\n if (!entity) {\n throw new NotFoundError();\n }\n\n if (\n entity.secret &&\n !entity.secret_encrypted &&\n !entity.secret_hashed\n ) {\n await actor.permissionEvaluator.evaluateOneOf({\n name: [\n PermissionName.CLIENT_READ,\n PermissionName.CLIENT_UPDATE,\n PermissionName.CLIENT_DELETE,\n ],\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity }),\n });\n }\n\n return entity;\n }\n\n async create(\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<Client> {\n const { entity } = await this.save(undefined, data, actor);\n return entity;\n }\n\n async update(\n idOrName: string,\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<Client> {\n const { entity } = await this.save(idOrName, data, actor, { updateOnly: true });\n return entity;\n }\n\n async save(\n idOrName: string | undefined,\n data: Record<string, any>,\n actor: ActorContext,\n options: { updateOnly?: boolean } = {},\n ): Promise<{\n entity: Client,\n created: boolean \n }> {\n let group: string;\n\n const realm = typeof data.realm_id === 'string' ?\n await this.realmRepository.resolve(data.realm_id) :\n undefined;\n\n let entity: Client | null | undefined;\n if (idOrName) {\n const where: Record<string, any> = {};\n if (isUUID(idOrName)) {\n where.id = idOrName;\n } else {\n where.name = idOrName;\n }\n\n if (realm) {\n where.realm_id = realm.id;\n }\n\n entity = await this.repository.findOneWithSecret(where);\n if (!entity && options.updateOnly) {\n throw new NotFoundError();\n }\n } else if (options.updateOnly) {\n throw new NotFoundError();\n }\n\n if (entity) {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.CLIENT_UPDATE });\n group = ValidatorGroup.UPDATE;\n } else {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.CLIENT_CREATE });\n group = ValidatorGroup.CREATE;\n }\n\n const validated = await this.validator.run(data, { group });\n\n await this.repository.validateJoinColumns(validated);\n await this.repository.checkUniqueness(validated, entity || undefined);\n\n const credentialsService = new ClientCredentialsService();\n\n if (entity) {\n if (\n !validated.realm_id &&\n !entity.realm_id\n ) {\n const actorRealmId = this.getActorRealmId(actor);\n if (actorRealmId) {\n validated.realm_id = actorRealmId;\n }\n }\n\n entity = this.repository.merge(entity, validated);\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.CLIENT_UPDATE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity }),\n });\n\n if (entity.is_confidential) {\n if (!validated.secret && !entity.secret) {\n validated.secret = credentialsService.generateSecret();\n }\n\n if (validated.secret) {\n entity.secret = await credentialsService.protect(validated.secret, entity);\n }\n } else {\n entity.secret = null;\n }\n\n await this.repository.save(entity);\n\n return {\n entity,\n created: false, \n };\n }\n\n if (!validated.realm_id) {\n const actorRealmId = this.getActorRealmId(actor);\n if (actorRealmId) {\n validated.realm_id = actorRealmId;\n }\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.CLIENT_CREATE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: validated }),\n });\n\n entity = this.repository.create(validated);\n\n if (entity.is_confidential) {\n if (!validated.secret) {\n validated.secret = credentialsService.generateSecret();\n }\n\n entity.secret = await credentialsService.protect(validated.secret, validated);\n } else {\n entity.secret = null;\n }\n\n await this.repository.save(entity);\n\n return {\n entity,\n created: true, \n };\n }\n\n async delete(\n id: string,\n actor: ActorContext,\n ): Promise<Client> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.CLIENT_DELETE });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new NotFoundError();\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.CLIENT_DELETE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity }),\n });\n\n const { id: entityId } = entity;\n await this.repository.remove(entity);\n entity.id = entityId;\n\n return entity;\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { BuiltInPolicyType, PolicyData } from '@authup/access';\nimport { NotFoundError } from '@ebec/http';\nimport { PermissionName } from '@authup/core-kit';\nimport type { ClientPermission } from '@authup/core-kit';\nimport type { IIdentityPermissionProvider } from '../../identity/permission/types.ts';\nimport type { ActorContext } from '../actor/types.ts';\nimport { AbstractEntityService } from '../service.ts';\nimport type { EntityRepositoryFindManyResult } from '../types.ts';\nimport type { IClientPermissionRepository, IClientPermissionService } from './types.ts';\n\nexport type ClientPermissionServiceContext = {\n repository: IClientPermissionRepository;\n identityPermissionProvider: IIdentityPermissionProvider;\n};\n\nexport class ClientPermissionService extends AbstractEntityService implements IClientPermissionService {\n protected repository: IClientPermissionRepository;\n\n protected identityPermissionProvider: IIdentityPermissionProvider;\n\n constructor(ctx: ClientPermissionServiceContext) {\n super();\n this.repository = ctx.repository;\n this.identityPermissionProvider = ctx.identityPermissionProvider;\n }\n\n async getMany(\n query: Record<string, any>,\n actor: ActorContext,\n ): Promise<EntityRepositoryFindManyResult<ClientPermission>> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.CLIENT_PERMISSION_CREATE,\n PermissionName.CLIENT_PERMISSION_DELETE,\n ],\n });\n\n return this.repository.findMany(query);\n }\n\n async getOne(\n id: string,\n actor: ActorContext,\n ): Promise<ClientPermission> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.CLIENT_PERMISSION_CREATE,\n PermissionName.CLIENT_PERMISSION_DELETE,\n ],\n });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new NotFoundError();\n }\n\n return entity;\n }\n\n async create(\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<ClientPermission> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.CLIENT_PERMISSION_CREATE });\n\n await this.repository.validateJoinColumns(data);\n\n if (data.permission) {\n data.permission_realm_id = data.permission.realm_id;\n\n await actor.permissionEvaluator.preEvaluate({\n name: data.permission.name,\n realmId: data.permission.realm_id,\n clientId: data.permission.client_id,\n });\n }\n\n if (data.client) {\n data.client_realm_id = data.client.realm_id;\n }\n\n if (\n data.permission &&\n actor.identity &&\n typeof data.policy_id === 'undefined'\n ) {\n const junctionPolicy = await this.identityPermissionProvider.resolveJunctionPolicy(\n {\n type: actor.identity.type,\n id: actor.identity.data.id, \n },\n {\n name: data.permission.name,\n realmId: data.permission.realm_id,\n clientId: data.permission.client_id,\n },\n );\n if (junctionPolicy) {\n data.policy_id = junctionPolicy.id;\n }\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.CLIENT_PERMISSION_CREATE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: data }),\n });\n\n let entity = this.repository.create(data);\n entity = await this.repository.save(entity);\n\n return entity;\n }\n\n async update(\n id: string,\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<ClientPermission> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.CLIENT_PERMISSION_UPDATE });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new NotFoundError();\n }\n\n const updateData: Record<string, any> = {};\n if (Object.prototype.hasOwnProperty.call(data, 'policy_id')) {\n updateData.policy_id = data.policy_id;\n }\n\n await this.repository.validateJoinColumns(updateData);\n\n const merged = this.repository.merge(entity, updateData);\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.CLIENT_PERMISSION_UPDATE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: merged }),\n });\n\n return this.repository.save(merged);\n }\n\n async delete(\n id: string,\n actor: ActorContext,\n ): Promise<ClientPermission> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.CLIENT_PERMISSION_DELETE });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new NotFoundError();\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.CLIENT_PERMISSION_DELETE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity }),\n });\n\n const { id: entityId } = entity;\n await this.repository.remove(entity);\n entity.id = entityId;\n\n return entity;\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { BuiltInPolicyType, PolicyData } from '@authup/access';\nimport { NotFoundError } from '@ebec/http';\nimport { PermissionName } from '@authup/core-kit';\nimport type { ClientRole } from '@authup/core-kit';\nimport type { ActorContext } from '../actor/types.ts';\nimport { AbstractEntityService } from '../service.ts';\nimport type { EntityRepositoryFindManyResult } from '../types.ts';\nimport type { IClientRoleRepository, IClientRoleService } from './types.ts';\n\nexport type ClientRoleServiceContext = {\n repository: IClientRoleRepository;\n};\n\nexport class ClientRoleService extends AbstractEntityService implements IClientRoleService {\n protected repository: IClientRoleRepository;\n\n constructor(ctx: ClientRoleServiceContext) {\n super();\n this.repository = ctx.repository;\n }\n\n async getMany(\n query: Record<string, any>,\n actor: ActorContext,\n ): Promise<EntityRepositoryFindManyResult<ClientRole>> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.CLIENT_ROLE_READ,\n PermissionName.CLIENT_ROLE_UPDATE,\n PermissionName.CLIENT_ROLE_DELETE,\n ],\n });\n\n return this.repository.findMany(query);\n }\n\n async getOne(\n id: string,\n actor: ActorContext,\n ): Promise<ClientRole> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.CLIENT_ROLE_READ,\n PermissionName.CLIENT_ROLE_UPDATE,\n PermissionName.CLIENT_ROLE_DELETE,\n ],\n });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new NotFoundError();\n }\n\n return entity;\n }\n\n async create(\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<ClientRole> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.CLIENT_ROLE_CREATE });\n\n await this.repository.validateJoinColumns(data);\n\n if (data.role) {\n data.role_realm_id = data.role.realm_id;\n }\n\n if (data.client) {\n data.client_realm_id = data.client.realm_id;\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.CLIENT_ROLE_CREATE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: data }),\n });\n\n let entity = this.repository.create(data);\n entity = await this.repository.save(entity);\n\n return entity;\n }\n\n async delete(\n id: string,\n actor: ActorContext,\n ): Promise<ClientRole> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.CLIENT_ROLE_DELETE });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new NotFoundError();\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.CLIENT_ROLE_DELETE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity }),\n });\n\n const { id: entityId } = entity;\n await this.repository.remove(entity);\n entity.id = entityId;\n\n return entity;\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { BuiltInPolicyType, PolicyData } from '@authup/access';\nimport { NotFoundError } from '@ebec/http';\nimport { PermissionName } from '@authup/core-kit';\nimport type { ClientScope } from '@authup/core-kit';\nimport type { ActorContext } from '../actor/types.ts';\nimport { AbstractEntityService } from '../service.ts';\nimport type { EntityRepositoryFindManyResult } from '../types.ts';\nimport type { IClientScopeRepository, IClientScopeService } from './types.ts';\n\nexport type ClientScopeServiceContext = {\n repository: IClientScopeRepository;\n};\n\nexport class ClientScopeService extends AbstractEntityService implements IClientScopeService {\n protected repository: IClientScopeRepository;\n\n constructor(ctx: ClientScopeServiceContext) {\n super();\n this.repository = ctx.repository;\n }\n\n async getMany(\n query: Record<string, any>,\n actor: ActorContext,\n ): Promise<EntityRepositoryFindManyResult<ClientScope>> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.CLIENT_READ,\n PermissionName.CLIENT_UPDATE,\n PermissionName.CLIENT_DELETE,\n ],\n });\n\n return this.repository.findMany(query);\n }\n\n async getOne(\n id: string,\n actor: ActorContext,\n ): Promise<ClientScope> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.CLIENT_READ,\n PermissionName.CLIENT_UPDATE,\n PermissionName.CLIENT_DELETE,\n ],\n });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new NotFoundError();\n }\n\n return entity;\n }\n\n async create(\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<ClientScope> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.CLIENT_SCOPE_CREATE });\n\n await this.repository.validateJoinColumns(data);\n\n if (data.client) {\n data.client_realm_id = data.client.realm_id;\n }\n\n if (data.scope) {\n data.scope_realm_id = data.scope.realm_id;\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.CLIENT_SCOPE_CREATE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: data }),\n });\n\n let entity = this.repository.create(data);\n entity = await this.repository.save(entity);\n\n return entity;\n }\n\n async delete(\n id: string,\n actor: ActorContext,\n ): Promise<ClientScope> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.CLIENT_SCOPE_DELETE });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new NotFoundError();\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.CLIENT_SCOPE_DELETE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity }),\n });\n\n const { id: entityId } = entity;\n await this.repository.remove(entity);\n entity.id = entityId;\n\n return entity;\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { BuiltInPolicyType, PolicyData, SystemPolicyName } from '@authup/access';\nimport { isPropertySet, isUUID } from '@authup/kit';\nimport { AuthupError } from '@authup/errors';\nimport { BadRequestError, NotFoundError } from '@ebec/http';\nimport {\n PermissionName,\n PermissionValidator,\n ROLE_ADMIN_NAME,\n ROLE_REALM_ADMIN_NAME,\n ValidatorGroup,\n} from '@authup/core-kit';\nimport type { Permission } from '@authup/core-kit';\nimport type { ActorContext } from '../actor/types.ts';\nimport type { IPermissionPolicyRepository } from '../permission-policy/types.ts';\nimport type { IPolicyRepository } from '../policy/types.ts';\nimport type { IRealmRepository } from '../realm/types.ts';\nimport type { IRoleRepository } from '../role/types.ts';\nimport type { IRolePermissionRepository } from '../role-permission/types.ts';\nimport { AbstractEntityService } from '../service.ts';\nimport type { EntityRepositoryFindManyResult } from '../types.ts';\nimport type { IPermissionRepository, IPermissionService } from './types.ts';\n\nconst REALM_ADMIN_EXCLUDED_PERMISSIONS = [\n PermissionName.REALM_CREATE,\n PermissionName.REALM_UPDATE,\n PermissionName.REALM_DELETE,\n];\n\n/**\n * CUD permissions that get system.realm-bound on realm_admin.\n * Covers direct entity types (both global-capable and realm-only).\n *\n * Junction entity CUD (e.g. user_role, role_permission) intentionally\n * use realm-or-global instead, because their attributes include\n * multiple realm_id fields (e.g. user_realm_id + role_realm_id).\n * With attribute_name_strict: false, realm-bound would reject\n * junctions where one side is global (realm_id: null).\n */\nconst REALM_ADMIN_BOUND_PERMISSIONS = [\n PermissionName.CLIENT_CREATE,\n PermissionName.CLIENT_UPDATE,\n PermissionName.CLIENT_DELETE,\n PermissionName.IDENTITY_PROVIDER_CREATE,\n PermissionName.IDENTITY_PROVIDER_UPDATE,\n PermissionName.IDENTITY_PROVIDER_DELETE,\n PermissionName.PERMISSION_CREATE,\n PermissionName.PERMISSION_UPDATE,\n PermissionName.PERMISSION_DELETE,\n PermissionName.ROBOT_CREATE,\n PermissionName.ROBOT_UPDATE,\n PermissionName.ROBOT_DELETE,\n PermissionName.ROLE_CREATE,\n PermissionName.ROLE_UPDATE,\n PermissionName.ROLE_DELETE,\n PermissionName.SCOPE_CREATE,\n PermissionName.SCOPE_UPDATE,\n PermissionName.SCOPE_DELETE,\n PermissionName.USER_CREATE,\n PermissionName.USER_UPDATE,\n PermissionName.USER_DELETE,\n];\n\nexport type PermissionServiceContext = {\n repository: IPermissionRepository;\n realmRepository: IRealmRepository;\n roleRepository: IRoleRepository;\n rolePermissionRepository: IRolePermissionRepository;\n policyRepository: IPolicyRepository;\n permissionPolicyRepository: IPermissionPolicyRepository;\n};\n\nexport class PermissionService extends AbstractEntityService implements IPermissionService {\n protected repository: IPermissionRepository;\n\n protected realmRepository: IRealmRepository;\n\n protected roleRepository: IRoleRepository;\n\n protected rolePermissionRepository: IRolePermissionRepository;\n\n protected policyRepository: IPolicyRepository;\n\n protected permissionPolicyRepository: IPermissionPolicyRepository;\n\n protected validator: PermissionValidator;\n\n constructor(ctx: PermissionServiceContext) {\n super();\n this.repository = ctx.repository;\n this.realmRepository = ctx.realmRepository;\n this.roleRepository = ctx.roleRepository;\n this.rolePermissionRepository = ctx.rolePermissionRepository;\n this.policyRepository = ctx.policyRepository;\n this.permissionPolicyRepository = ctx.permissionPolicyRepository;\n this.validator = new PermissionValidator();\n }\n\n async getMany(\n query: Record<string, any>,\n actor: ActorContext,\n ): Promise<EntityRepositoryFindManyResult<Permission>> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.PERMISSION_READ,\n PermissionName.PERMISSION_UPDATE,\n PermissionName.PERMISSION_DELETE,\n ],\n });\n\n return this.repository.findMany(query);\n }\n\n async getOne(\n idOrName: string,\n actor: ActorContext,\n realm?: string,\n ): Promise<Permission> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.PERMISSION_READ,\n PermissionName.PERMISSION_UPDATE,\n PermissionName.PERMISSION_DELETE,\n ],\n });\n\n const entity = await this.repository.findOneByIdOrName(idOrName, realm);\n if (!entity) {\n throw new NotFoundError();\n }\n\n return entity;\n }\n\n async create(\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<Permission> {\n const { entity } = await this.save(undefined, data, actor);\n return entity;\n }\n\n async update(\n idOrName: string,\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<Permission> {\n const { entity } = await this.save(idOrName, data, actor, { updateOnly: true });\n return entity;\n }\n\n async save(\n idOrName: string | undefined,\n data: Record<string, any>,\n actor: ActorContext,\n options: { updateOnly?: boolean } = {},\n ): Promise<{\n entity: Permission,\n created: boolean \n }> {\n let group: string;\n\n const realm = typeof data.realm_id === 'string' ?\n await this.realmRepository.resolve(data.realm_id) :\n undefined;\n\n let entity: Permission | null | undefined;\n if (idOrName) {\n const where: Record<string, any> = {};\n if (isUUID(idOrName)) {\n where.id = idOrName;\n } else {\n where.name = idOrName;\n }\n\n if (realm) {\n where.realm_id = realm.id;\n }\n\n entity = await this.repository.findOneBy(where);\n if (!entity && options.updateOnly) {\n throw new NotFoundError();\n }\n } else if (options.updateOnly) {\n throw new NotFoundError();\n }\n\n if (entity) {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.PERMISSION_UPDATE });\n group = ValidatorGroup.UPDATE;\n } else {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.PERMISSION_CREATE });\n group = ValidatorGroup.CREATE;\n }\n\n const validated = await this.validator.run(data, { group });\n\n await this.repository.validateJoinColumns(validated);\n\n if (entity) {\n if (\n entity.built_in &&\n isPropertySet(validated, 'name') &&\n entity.name !== validated.name\n ) {\n throw new BadRequestError('The name of a built-in permission can not be changed.');\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.PERMISSION_UPDATE,\n input: new PolicyData({\n [BuiltInPolicyType.ATTRIBUTES]: {\n ...entity,\n ...validated,\n },\n }),\n });\n\n await this.repository.checkUniqueness(validated, entity);\n\n entity = this.repository.merge(entity, validated);\n\n await this.repository.save(entity);\n\n return {\n entity,\n created: false, \n };\n }\n\n if (!isPropertySet(validated, 'realm_id') && actor.identity) {\n validated.realm_id = this.getActorRealmId(actor) || null;\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.PERMISSION_CREATE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: validated }),\n });\n\n await this.repository.checkUniqueness(validated);\n\n entity = this.repository.create(validated);\n entity = await this.repository.save(entity);\n\n await this.assignDefaultPolicy(entity);\n await this.assignToAdminRole(entity);\n await this.assignToRealmAdminRoles(entity);\n\n return {\n entity,\n created: true, \n };\n }\n\n async delete(\n id: string,\n actor: ActorContext,\n ): Promise<Permission> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.PERMISSION_DELETE });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new NotFoundError();\n }\n\n if (entity.built_in) {\n throw new BadRequestError('A built-in permission can not be deleted.');\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.PERMISSION_DELETE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity }),\n });\n\n const { id: entityId } = entity;\n await this.repository.remove(entity);\n entity.id = entityId;\n\n return entity;\n }\n\n /**\n * Assign the system.default policy to a newly created permission.\n * This ensures all permissions are evaluated with the baseline security\n * policy (identity, permission-binding, realm-match) by default.\n */\n private async assignDefaultPolicy(permission: Permission): Promise<void> {\n const defaultPolicy = await this.policyRepository.findOneByName(SystemPolicyName.DEFAULT);\n if (!defaultPolicy) {\n throw new AuthupError(`The ${SystemPolicyName.DEFAULT} policy is not provisioned. Cannot create permissions without the default security policy.`);\n }\n\n const entry = this.permissionPolicyRepository.create({\n permission_id: permission.id,\n permission_realm_id: permission.realm_id,\n policy_id: defaultPolicy.id,\n policy_realm_id: defaultPolicy.realm_id,\n });\n await this.permissionPolicyRepository.save(entry);\n }\n\n /**\n * Assign a newly created permission to the global admin role.\n * The admin role receives every permission without policy restrictions.\n */\n private async assignToAdminRole(permission: Permission): Promise<void> {\n const adminRole = await this.roleRepository.findOneByName(ROLE_ADMIN_NAME);\n if (!adminRole) {\n return;\n }\n\n const entry = this.rolePermissionRepository.create({\n role_id: adminRole.id,\n role_realm_id: adminRole.realm_id,\n permission_id: permission.id,\n permission_realm_id: permission.realm_id,\n });\n await this.rolePermissionRepository.save(entry);\n }\n\n /**\n * Assign a newly created permission to all matching realm_admin roles.\n *\n * Uses differentiated junction policies:\n * - CUD on global-capable entity types → system.realm-bound\n * - Everything else → system.realm-or-global\n *\n * Eligible permissions:\n * - Built-in authup permissions (global) — assigned to all realm_admin roles\n * - Realm-scoped permissions — assigned to the realm_admin in the matching realm\n *\n * Excluded:\n * - Realm CRUD permissions (realm_create, realm_update, realm_delete)\n * - Custom global permissions (non-built-in with realm_id: null)\n *\n * Fails closed: skips assignment entirely if required policies are not found.\n */\n private async assignToRealmAdminRoles(permission: Permission): Promise<void> {\n if (REALM_ADMIN_EXCLUDED_PERMISSIONS.includes(permission.name as PermissionName)) {\n return;\n }\n\n const isBuiltIn = (Object.values(PermissionName) as string[]).includes(permission.name);\n if (!permission.realm_id && !isBuiltIn) {\n return;\n }\n\n const policyName = REALM_ADMIN_BOUND_PERMISSIONS.includes(permission.name as PermissionName) ?\n SystemPolicyName.REALM_BOUND :\n SystemPolicyName.REALM_OR_GLOBAL;\n\n const policy = await this.policyRepository.findOneByName(policyName);\n if (!policy) {\n return;\n }\n\n const realmAdminRoles = await this.roleRepository.findManyBy({ name: ROLE_REALM_ADMIN_NAME });\n\n for (const role of realmAdminRoles) {\n if (permission.realm_id && permission.realm_id !== role.realm_id) {\n continue;\n }\n\n const entry = this.rolePermissionRepository.create({\n role_id: role.id,\n role_realm_id: role.realm_id,\n permission_id: permission.id,\n permission_realm_id: permission.realm_id,\n policy_id: policy.id,\n });\n await this.rolePermissionRepository.save(entry);\n }\n }\n}\n","/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { BuiltInPolicyType, PolicyData } from '@authup/access';\nimport { NotFoundError } from '@ebec/http';\nimport { PermissionName } from '@authup/core-kit';\nimport type { PermissionPolicy } from '@authup/core-kit';\nimport type { ActorContext } from '../actor/types.ts';\nimport { AbstractEntityService } from '../service.ts';\nimport type { EntityRepositoryFindManyResult } from '../types.ts';\nimport type { IPermissionPolicyRepository, IPermissionPolicyService } from './types.ts';\n\nexport type PermissionPolicyServiceContext = {\n repository: IPermissionPolicyRepository;\n};\n\nexport class PermissionPolicyService extends AbstractEntityService implements IPermissionPolicyService {\n protected repository: IPermissionPolicyRepository;\n\n constructor(ctx: PermissionPolicyServiceContext) {\n super();\n this.repository = ctx.repository;\n }\n\n async getMany(\n query: Record<string, any>,\n actor: ActorContext,\n ): Promise<EntityRepositoryFindManyResult<PermissionPolicy>> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.PERMISSION_READ,\n PermissionName.PERMISSION_UPDATE,\n ],\n });\n\n return this.repository.findMany(query);\n }\n\n async getOne(\n id: string,\n actor: ActorContext,\n ): Promise<PermissionPolicy> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.PERMISSION_READ,\n PermissionName.PERMISSION_UPDATE,\n ],\n });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new NotFoundError();\n }\n\n return entity;\n }\n\n async create(\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<PermissionPolicy> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.PERMISSION_UPDATE });\n\n await this.repository.validateJoinColumns(data);\n\n if (data.permission) {\n data.permission_realm_id = data.permission.realm_id;\n }\n\n if (data.policy) {\n data.policy_realm_id = data.policy.realm_id;\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.PERMISSION_UPDATE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: data }),\n });\n\n let entity = this.repository.create(data);\n entity = await this.repository.save(entity);\n\n return entity;\n }\n\n async delete(\n id: string,\n actor: ActorContext,\n ): Promise<PermissionPolicy> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.PERMISSION_UPDATE });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new NotFoundError();\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.PERMISSION_UPDATE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity }),\n });\n\n const { id: entityId } = entity;\n await this.repository.remove(entity);\n entity.id = entityId;\n\n return entity;\n }\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n AttributeNamesPolicyValidator,\n AttributesPolicyValidator,\n BuiltInPolicyType,\n DatePolicyValidator,\n TimePolicyValidator,\n} from '@authup/access';\nimport { omitRecord } from '@authup/kit';\nimport type { ContainerOptions } from 'validup';\nimport { Container } from 'validup';\n\ntype PolicyContainerRunOptions<T> = ContainerOptions<T> & {\n attributeNames?: string[]\n};\n\nexport class PolicyAttributesValidator extends Container<Record<string, any>> {\n protected attributeNames : string[];\n\n protected attributesOptionsValidator : AttributesPolicyValidator;\n\n protected attributeNamesOptionsValidator : AttributeNamesPolicyValidator;\n\n protected dateOptionsValidator : DatePolicyValidator;\n\n protected timeOptionsValidator : TimePolicyValidator;\n\n constructor(options: PolicyContainerRunOptions<Record<string, any>>) {\n super(options);\n\n this.attributeNames = options.attributeNames || [];\n\n this.attributesOptionsValidator = new AttributesPolicyValidator();\n this.attributeNamesOptionsValidator = new AttributeNamesPolicyValidator();\n this.dateOptionsValidator = new DatePolicyValidator();\n this.timeOptionsValidator = new TimePolicyValidator();\n }\n\n override async run(\n data: Record<string, any>,\n ) : Promise<Record<string, any>> {\n switch (data.type) {\n case BuiltInPolicyType.ATTRIBUTES: {\n return this.attributesOptionsValidator.run(data);\n }\n case BuiltInPolicyType.ATTRIBUTE_NAMES: {\n return this.attributeNamesOptionsValidator.run(data);\n }\n case BuiltInPolicyType.DATE: {\n return this.dateOptionsValidator.run(data);\n }\n case BuiltInPolicyType.TIME: {\n return this.timeOptionsValidator.run(data);\n }\n default: {\n return omitRecord(data, this.attributeNames);\n }\n }\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { BuiltInPolicyType, PolicyData } from '@authup/access';\nimport {\n \n extendObject, \n isPropertySet, \n isUUID, \n removeObjectProperty, \n} from '@authup/kit';\nimport { BadRequestError, NotFoundError } from '@ebec/http';\nimport {\n PermissionName,\n PolicyValidator,\n ValidatorGroup,\n} from '@authup/core-kit';\nimport type { Policy } from '@authup/core-kit';\nimport type { ActorContext } from '../actor/types.ts';\nimport type { IRealmRepository } from '../realm/types.ts';\nimport { AbstractEntityService } from '../service.ts';\nimport type { EntityRepositoryFindManyResult } from '../types.ts';\nimport { PolicyAttributesValidator } from './attributes-validator.ts';\nimport type { IPolicyRepository, IPolicyService } from './types.ts';\n\nexport type PolicyServiceContext = {\n repository: IPolicyRepository;\n realmRepository: IRealmRepository;\n};\n\nexport class PolicyService extends AbstractEntityService implements IPolicyService {\n protected repository: IPolicyRepository;\n\n protected realmRepository: IRealmRepository;\n\n protected validator: PolicyValidator;\n\n protected attributesValidator: PolicyAttributesValidator;\n\n constructor(ctx: PolicyServiceContext) {\n super();\n this.repository = ctx.repository;\n this.realmRepository = ctx.realmRepository;\n this.validator = new PolicyValidator();\n this.attributesValidator = new PolicyAttributesValidator({});\n }\n\n async getMany(\n query: Record<string, any>,\n actor: ActorContext,\n ): Promise<EntityRepositoryFindManyResult<Policy>> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.PERMISSION_READ,\n PermissionName.PERMISSION_UPDATE,\n PermissionName.PERMISSION_DELETE,\n ],\n });\n\n return this.repository.findMany(query);\n }\n\n async getOne(\n idOrName: string,\n actor: ActorContext,\n realm?: string,\n ): Promise<Policy> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.PERMISSION_READ,\n PermissionName.PERMISSION_UPDATE,\n PermissionName.PERMISSION_DELETE,\n ],\n });\n\n const entity = await this.repository.findOneByIdOrName(idOrName, realm);\n if (!entity) {\n throw new NotFoundError();\n }\n\n return entity;\n }\n\n async create(\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<Policy> {\n const { entity } = await this.save(undefined, data, actor);\n return entity;\n }\n\n async update(\n idOrName: string,\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<Policy> {\n const { entity } = await this.save(idOrName, data, actor, { updateOnly: true });\n return entity;\n }\n\n async save(\n idOrName: string | undefined,\n data: Record<string, any>,\n actor: ActorContext,\n options: { updateOnly?: boolean } = {},\n ): Promise<{\n entity: Policy,\n created: boolean \n }> {\n let group: string;\n\n const realm = typeof data.realm_id === 'string' ?\n await this.realmRepository.resolve(data.realm_id) :\n undefined;\n\n let entity: Policy | null | undefined;\n if (idOrName) {\n const where: Record<string, any> = {};\n if (isUUID(idOrName)) {\n where.id = idOrName;\n } else {\n where.name = idOrName;\n }\n\n if (realm) {\n where.realm_id = realm.id;\n }\n\n entity = await this.repository.findOneBy(where);\n if (!entity && options.updateOnly) {\n throw new NotFoundError();\n }\n } else if (options.updateOnly) {\n throw new NotFoundError();\n }\n\n if (entity) {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.PERMISSION_UPDATE });\n group = ValidatorGroup.UPDATE;\n } else {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.PERMISSION_CREATE });\n group = ValidatorGroup.CREATE;\n }\n\n const validated = await this.validate(data, group);\n\n await this.repository.validateJoinColumns(validated);\n\n if (\n validated.parent &&\n validated.parent.type !== BuiltInPolicyType.COMPOSITE\n ) {\n throw new BadRequestError('The parent policy must be of type group.');\n }\n\n if (entity) {\n if (entity.built_in) {\n throw new BadRequestError('A built-in policy can not be updated.');\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.PERMISSION_UPDATE,\n input: new PolicyData({\n [BuiltInPolicyType.ATTRIBUTES]: {\n ...entity,\n ...validated,\n },\n }),\n });\n\n await this.repository.checkUniqueness(validated, entity);\n\n extendObject(entity, validated);\n\n await this.repository.saveWithEA(entity);\n\n return {\n entity,\n created: false, \n };\n }\n\n if (!isPropertySet(validated, 'realm_id') && actor.identity) {\n validated.realm_id = this.getActorRealmId(actor) || null;\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.PERMISSION_CREATE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: validated }),\n });\n\n await this.repository.checkUniqueness(validated);\n\n entity = this.repository.create(validated);\n await this.repository.saveWithEA(entity);\n\n return {\n entity,\n created: true, \n };\n }\n\n private async validate(\n data: Record<string, any>,\n group: string,\n ): Promise<Policy> {\n const validated = await this.validator.run(data, { group });\n\n const attributes = await this.attributesValidator.run(data);\n extendObject(validated, attributes);\n\n if (Array.isArray(data.children)) {\n if (data.type === BuiltInPolicyType.COMPOSITE) {\n const promises = data.children.map(\n (child) => this.validate(child, group),\n );\n validated.children = await Promise.all(promises);\n }\n }\n\n return validated;\n }\n\n async delete(\n id: string,\n actor: ActorContext,\n ): Promise<Policy> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.PERMISSION_DELETE });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new NotFoundError();\n }\n\n if (entity.built_in) {\n throw new BadRequestError('A built-in policy can not be deleted.');\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.PERMISSION_DELETE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity }),\n });\n\n const { id: entityId } = entity;\n\n await this.repository.deleteFromTree(entity);\n\n entity.id = entityId;\n\n // todo: remove after PolicyEntity - parent delete on cascade\n removeObjectProperty(entity, 'children');\n\n return entity;\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { BuiltInPolicyType, PolicyData } from '@authup/access';\nimport { isPropertySet, isUUID } from '@authup/kit';\nimport { BadRequestError, NotFoundError } from '@ebec/http';\nimport {\n PermissionName,\n REALM_MASTER_NAME,\n RealmValidator,\n ValidatorGroup,\n} from '@authup/core-kit';\nimport type { Realm } from '@authup/core-kit';\nimport type { ActorContext } from '../actor/types.ts';\nimport { AbstractEntityService } from '../service.ts';\nimport type { EntityRepositoryFindManyResult } from '../types.ts';\nimport type { IRealmRepository, IRealmService } from './types.ts';\n\nexport type RealmServiceContext = {\n repository: IRealmRepository;\n};\n\nexport class RealmService extends AbstractEntityService implements IRealmService {\n protected repository: IRealmRepository;\n\n protected validator: RealmValidator;\n\n constructor(ctx: RealmServiceContext) {\n super();\n this.repository = ctx.repository;\n this.validator = new RealmValidator();\n }\n\n async getMany(\n query: Record<string, any>,\n ): Promise<EntityRepositoryFindManyResult<Realm>> {\n return this.repository.findMany(query);\n }\n\n async getOne(\n idOrName: string,\n ): Promise<Realm> {\n const entity = await this.repository.findOneByIdOrName(idOrName);\n if (!entity) {\n throw new NotFoundError();\n }\n\n return entity;\n }\n\n async create(\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<Realm> {\n const { entity } = await this.save(undefined, data, actor);\n return entity;\n }\n\n async update(\n idOrName: string,\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<Realm> {\n const { entity } = await this.save(idOrName, data, actor, { updateOnly: true });\n return entity;\n }\n\n async save(\n idOrName: string | undefined,\n data: Record<string, any>,\n actor: ActorContext,\n options: { updateOnly?: boolean } = {},\n ): Promise<{\n entity: Realm,\n created: boolean \n }> {\n let group: string;\n\n let entity: Realm | null | undefined;\n if (idOrName) {\n const where: Record<string, any> = {};\n if (isUUID(idOrName)) {\n where.id = idOrName;\n } else {\n where.name = idOrName;\n }\n\n entity = await this.repository.findOneBy(where);\n if (!entity && options.updateOnly) {\n throw new NotFoundError();\n }\n } else if (options.updateOnly) {\n throw new NotFoundError();\n }\n\n if (entity) {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.REALM_UPDATE });\n group = ValidatorGroup.UPDATE;\n } else {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.REALM_CREATE });\n group = ValidatorGroup.CREATE;\n }\n\n const validated = await this.validator.run(data, { group });\n\n await this.repository.validateJoinColumns(validated);\n\n if (entity) {\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.REALM_UPDATE,\n input: new PolicyData({\n [BuiltInPolicyType.ATTRIBUTES]: {\n ...entity,\n ...validated,\n },\n }),\n });\n\n if (entity.name === REALM_MASTER_NAME && isPropertySet(validated, 'name') && entity.name !== validated.name) {\n throw new BadRequestError(`The name of the ${REALM_MASTER_NAME} can not be changed.`);\n }\n\n entity = this.repository.merge(entity, validated);\n await this.repository.save(entity);\n\n return {\n entity,\n created: false, \n };\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.REALM_CREATE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: validated }),\n });\n\n entity = this.repository.create(validated);\n await this.repository.save(entity);\n\n return {\n entity,\n created: true, \n };\n }\n\n async delete(\n id: string,\n actor: ActorContext,\n ): Promise<Realm> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.REALM_DELETE });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new NotFoundError();\n }\n\n if (entity.built_in) {\n throw new BadRequestError('A built-in realm can not be deleted.');\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.REALM_DELETE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity }),\n });\n\n const { id: entityId } = entity;\n await this.repository.remove(entity);\n entity.id = entityId;\n\n return entity;\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { BuiltInPolicyType, PolicyData } from '@authup/access';\nimport { isUUID } from '@authup/kit';\nimport { NotFoundError } from '@ebec/http';\nimport {\n PermissionName,\n RobotValidator,\n ValidatorGroup,\n} from '@authup/core-kit';\nimport type { Robot } from '@authup/core-kit';\nimport type { ActorContext } from '../actor/types.ts';\nimport type { IRealmRepository } from '../realm/types.ts';\nimport { AbstractEntityService } from '../service.ts';\nimport type { EntityRepositoryFindManyResult } from '../types.ts';\nimport { RobotCredentialsService } from '../../authentication/credential/entities/robot/module.ts';\nimport type { IRobotRepository, IRobotService } from './types.ts';\n\nexport type RobotServiceContext = {\n repository: IRobotRepository;\n realmRepository: IRealmRepository;\n};\n\nexport class RobotService extends AbstractEntityService implements IRobotService {\n protected repository: IRobotRepository;\n\n protected realmRepository: IRealmRepository;\n\n protected validator: RobotValidator;\n\n constructor(ctx: RobotServiceContext) {\n super();\n this.repository = ctx.repository;\n this.realmRepository = ctx.realmRepository;\n this.validator = new RobotValidator();\n }\n\n async getMany(\n query: Record<string, any>,\n actor: ActorContext,\n ): Promise<EntityRepositoryFindManyResult<Robot>> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.ROBOT_READ,\n PermissionName.ROBOT_UPDATE,\n PermissionName.ROBOT_DELETE,\n ],\n });\n\n const {\n data: entities, \n meta, \n } = await this.repository.findMany(query);\n\n const data: Robot[] = [];\n let { total } = meta;\n\n for (const entity of entities) {\n if (\n actor.identity &&\n actor.identity.type === 'robot' &&\n actor.identity.data.id === entity.id\n ) {\n data.push(entity);\n continue;\n }\n\n try {\n await actor.permissionEvaluator.evaluateOneOf({\n name: [\n PermissionName.ROBOT_READ,\n PermissionName.ROBOT_UPDATE,\n PermissionName.ROBOT_DELETE,\n ],\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity }),\n });\n\n data.push(entity);\n } catch {\n total -= 1;\n }\n }\n\n return {\n data,\n meta: {\n ...meta,\n total, \n }, \n };\n }\n\n async getOne(\n idOrName: string,\n actor: ActorContext,\n realmId?: string,\n ): Promise<Robot> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.ROBOT_READ,\n PermissionName.ROBOT_UPDATE,\n PermissionName.ROBOT_DELETE,\n ],\n });\n\n let entity: Robot | null;\n if (isUUID(idOrName)) {\n entity = await this.repository.findOneById(idOrName);\n } else if (realmId) {\n const realm = await this.realmRepository.resolve(realmId);\n entity = realm ?\n await this.repository.findOneBy({\n name: idOrName,\n realm_id: realm.id, \n }) :\n null;\n } else {\n entity = await this.repository.findOneByName(idOrName);\n }\n\n if (!entity) {\n throw new NotFoundError();\n }\n\n await actor.permissionEvaluator.evaluateOneOf({\n name: [\n PermissionName.ROBOT_READ,\n PermissionName.ROBOT_UPDATE,\n PermissionName.ROBOT_DELETE,\n ],\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity }),\n });\n\n return entity;\n }\n\n async create(\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<Robot> {\n const { entity } = await this.save(undefined, data, actor);\n return entity;\n }\n\n async update(\n idOrName: string,\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<Robot> {\n const { entity } = await this.save(idOrName, data, actor, { updateOnly: true });\n return entity;\n }\n\n async save(\n idOrName: string | undefined,\n data: Record<string, any>,\n actor: ActorContext,\n options: { updateOnly?: boolean } = {},\n ): Promise<{\n entity: Robot,\n created: boolean \n }> {\n let group: string;\n\n const realm = typeof data.realm_id === 'string' ?\n await this.realmRepository.resolve(data.realm_id) :\n undefined;\n\n let entity: Robot | null | undefined;\n if (idOrName) {\n const where: Record<string, any> = {};\n if (isUUID(idOrName)) {\n where.id = idOrName;\n } else {\n where.name = idOrName;\n }\n\n if (realm) {\n where.realm_id = realm.id;\n }\n\n entity = await this.repository.findOneBy(where);\n if (!entity && options.updateOnly) {\n throw new NotFoundError();\n }\n } else if (options.updateOnly) {\n throw new NotFoundError();\n }\n\n if (entity) {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROBOT_UPDATE });\n group = ValidatorGroup.UPDATE;\n } else {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROBOT_CREATE });\n group = ValidatorGroup.CREATE;\n }\n\n const validated = await this.validator.run(data, { group });\n\n await this.repository.validateJoinColumns(validated);\n\n await this.repository.checkUniqueness(validated, entity || undefined);\n\n const credentialsService = new RobotCredentialsService();\n\n if (entity) {\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.ROBOT_UPDATE,\n input: new PolicyData({\n [BuiltInPolicyType.ATTRIBUTES]: {\n ...entity,\n ...validated,\n },\n }),\n });\n\n entity = this.repository.merge(entity, validated);\n if (validated.secret) {\n entity.secret = await credentialsService.protect(validated.secret);\n }\n\n await this.repository.save(entity);\n\n if (validated.secret) {\n entity.secret = validated.secret;\n }\n\n return {\n entity,\n created: false, \n };\n }\n\n if (!validated.realm_id) {\n const actorRealmId = this.getActorRealmId(actor);\n if (actorRealmId) {\n validated.realm_id = actorRealmId;\n }\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.ROBOT_CREATE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: validated }),\n });\n\n if (!validated.secret) {\n validated.secret = credentialsService.generateSecret();\n }\n\n entity = this.repository.create(validated);\n entity.secret = await credentialsService.protect(validated.secret);\n await this.repository.save(entity);\n entity.secret = validated.secret;\n\n return {\n entity,\n created: true, \n };\n }\n\n async delete(\n id: string,\n actor: ActorContext,\n ): Promise<Robot> {\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new NotFoundError();\n }\n\n const isOwner = entity.user_id &&\n actor.identity &&\n actor.identity.type === 'user' &&\n actor.identity.data.id === entity.user_id;\n\n if (!isOwner) {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROBOT_DELETE });\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.ROBOT_DELETE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity }),\n });\n }\n\n const { id: entityId } = entity;\n await this.repository.remove(entity);\n entity.id = entityId;\n\n return entity;\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { BuiltInPolicyType, PolicyData } from '@authup/access';\nimport { NotFoundError } from '@ebec/http';\nimport { PermissionName } from '@authup/core-kit';\nimport type { RobotPermission } from '@authup/core-kit';\nimport type { IIdentityPermissionProvider } from '../../identity/permission/types.ts';\nimport type { ActorContext } from '../actor/types.ts';\nimport { AbstractEntityService } from '../service.ts';\nimport type { EntityRepositoryFindManyResult } from '../types.ts';\nimport type { IRobotPermissionRepository, IRobotPermissionService } from './types.ts';\n\nexport type RobotPermissionServiceContext = {\n repository: IRobotPermissionRepository;\n identityPermissionProvider: IIdentityPermissionProvider;\n};\n\nexport class RobotPermissionService extends AbstractEntityService implements IRobotPermissionService {\n protected repository: IRobotPermissionRepository;\n\n protected identityPermissionProvider: IIdentityPermissionProvider;\n\n constructor(ctx: RobotPermissionServiceContext) {\n super();\n this.repository = ctx.repository;\n this.identityPermissionProvider = ctx.identityPermissionProvider;\n }\n\n async getMany(\n query: Record<string, any>,\n actor: ActorContext,\n ): Promise<EntityRepositoryFindManyResult<RobotPermission>> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.ROBOT_PERMISSION_CREATE,\n PermissionName.ROBOT_PERMISSION_DELETE,\n ],\n });\n\n return this.repository.findMany(query);\n }\n\n async getOne(\n id: string,\n actor: ActorContext,\n ): Promise<RobotPermission> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.ROBOT_PERMISSION_CREATE,\n PermissionName.ROBOT_PERMISSION_DELETE,\n ],\n });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new NotFoundError();\n }\n\n return entity;\n }\n\n async create(\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<RobotPermission> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROBOT_PERMISSION_CREATE });\n\n await this.repository.validateJoinColumns(data);\n\n if (data.permission) {\n data.permission_realm_id = data.permission.realm_id;\n\n await actor.permissionEvaluator.preEvaluate({\n name: data.permission.name,\n realmId: data.permission.realm_id,\n clientId: data.permission.client_id,\n });\n }\n\n if (data.robot) {\n data.robot_realm_id = data.robot.realm_id;\n }\n\n if (\n data.permission &&\n actor.identity &&\n typeof data.policy_id === 'undefined'\n ) {\n const junctionPolicy = await this.identityPermissionProvider.resolveJunctionPolicy(\n {\n type: actor.identity.type,\n id: actor.identity.data.id, \n },\n {\n name: data.permission.name,\n realmId: data.permission.realm_id,\n clientId: data.permission.client_id,\n },\n );\n if (junctionPolicy) {\n data.policy_id = junctionPolicy.id;\n }\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.ROBOT_PERMISSION_CREATE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: data }),\n });\n\n let entity = this.repository.create(data);\n entity = await this.repository.save(entity);\n\n return entity;\n }\n\n async update(\n id: string,\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<RobotPermission> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROBOT_PERMISSION_UPDATE });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new NotFoundError();\n }\n\n const updateData: Record<string, any> = {};\n if (Object.prototype.hasOwnProperty.call(data, 'policy_id')) {\n updateData.policy_id = data.policy_id;\n }\n\n await this.repository.validateJoinColumns(updateData);\n\n const merged = this.repository.merge(entity, updateData);\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.ROBOT_PERMISSION_UPDATE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: merged }),\n });\n\n return this.repository.save(merged);\n }\n\n async delete(\n id: string,\n actor: ActorContext,\n ): Promise<RobotPermission> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROBOT_PERMISSION_DELETE });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new NotFoundError();\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.ROBOT_PERMISSION_DELETE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity }),\n });\n\n const { id: entityId } = entity;\n await this.repository.remove(entity);\n entity.id = entityId;\n\n return entity;\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { BuiltInPolicyType, PolicyData } from '@authup/access';\nimport { NotFoundError } from '@ebec/http';\nimport { PermissionName } from '@authup/core-kit';\nimport type { RobotRole } from '@authup/core-kit';\nimport type { ActorContext } from '../actor/types.ts';\nimport { AbstractEntityService } from '../service.ts';\nimport type { EntityRepositoryFindManyResult } from '../types.ts';\nimport type { IRobotRoleRepository, IRobotRoleService } from './types.ts';\n\nexport type RobotRoleServiceContext = {\n repository: IRobotRoleRepository;\n};\n\nexport class RobotRoleService extends AbstractEntityService implements IRobotRoleService {\n protected repository: IRobotRoleRepository;\n\n constructor(ctx: RobotRoleServiceContext) {\n super();\n this.repository = ctx.repository;\n }\n\n async getMany(\n query: Record<string, any>,\n actor: ActorContext,\n ): Promise<EntityRepositoryFindManyResult<RobotRole>> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.ROBOT_ROLE_READ,\n PermissionName.ROBOT_ROLE_UPDATE,\n PermissionName.ROBOT_ROLE_DELETE,\n ],\n });\n\n return this.repository.findMany(query);\n }\n\n async getOne(\n id: string,\n actor: ActorContext,\n ): Promise<RobotRole> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.ROBOT_ROLE_READ,\n PermissionName.ROBOT_ROLE_UPDATE,\n PermissionName.ROBOT_ROLE_DELETE,\n ],\n });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new NotFoundError();\n }\n\n return entity;\n }\n\n async create(\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<RobotRole> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROBOT_ROLE_CREATE });\n\n await this.repository.validateJoinColumns(data);\n\n if (data.role) {\n data.role_realm_id = data.role.realm_id;\n }\n\n if (data.robot) {\n data.robot_realm_id = data.robot.realm_id;\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.ROBOT_ROLE_CREATE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: data }),\n });\n\n let entity = this.repository.create(data);\n entity = await this.repository.save(entity);\n\n return entity;\n }\n\n async delete(\n id: string,\n actor: ActorContext,\n ): Promise<RobotRole> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROBOT_ROLE_DELETE });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new NotFoundError();\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.ROBOT_ROLE_DELETE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity }),\n });\n\n const { id: entityId } = entity;\n await this.repository.remove(entity);\n entity.id = entityId;\n\n return entity;\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { BuiltInPolicyType, PolicyData } from '@authup/access';\nimport { isPropertySet, isUUID } from '@authup/kit';\nimport { BadRequestError, NotFoundError } from '@ebec/http';\nimport {\n PermissionName,\n ROLE_ADMIN_NAME,\n RoleValidator,\n ValidatorGroup,\n} from '@authup/core-kit';\nimport type { Role } from '@authup/core-kit';\nimport type { ActorContext } from '../actor/types.ts';\nimport type { IRealmRepository } from '../realm/types.ts';\nimport { AbstractEntityService } from '../service.ts';\nimport type { EntityRepositoryFindManyResult } from '../types.ts';\nimport type { IRoleRepository, IRoleService } from './types.ts';\n\nexport type RoleServiceContext = {\n repository: IRoleRepository;\n realmRepository: IRealmRepository;\n};\n\nexport class RoleService extends AbstractEntityService implements IRoleService {\n protected repository: IRoleRepository;\n\n protected realmRepository: IRealmRepository;\n\n protected validator: RoleValidator;\n\n constructor(ctx: RoleServiceContext) {\n super();\n this.repository = ctx.repository;\n this.realmRepository = ctx.realmRepository;\n this.validator = new RoleValidator();\n }\n\n async getMany(\n query: Record<string, any>,\n actor: ActorContext,\n ): Promise<EntityRepositoryFindManyResult<Role>> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.ROLE_READ,\n PermissionName.ROLE_UPDATE,\n PermissionName.ROLE_DELETE,\n ],\n });\n\n return this.repository.findMany(query);\n }\n\n async getOne(\n idOrName: string,\n actor: ActorContext,\n ): Promise<Role> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.ROLE_READ,\n PermissionName.ROLE_UPDATE,\n PermissionName.ROLE_DELETE,\n ],\n });\n\n const entity = await this.repository.findOneByIdOrName(idOrName);\n if (!entity) {\n throw new NotFoundError();\n }\n\n return entity;\n }\n\n async create(\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<Role> {\n const { entity } = await this.save(undefined, data, actor);\n return entity;\n }\n\n async update(\n idOrName: string,\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<Role> {\n const { entity } = await this.save(idOrName, data, actor, { updateOnly: true });\n return entity;\n }\n\n async save(\n idOrName: string | undefined,\n data: Record<string, any>,\n actor: ActorContext,\n options: { updateOnly?: boolean } = {},\n ): Promise<{\n entity: Role,\n created: boolean \n }> {\n let group: string;\n\n const realm = typeof data.realm_id === 'string' ?\n await this.realmRepository.resolve(data.realm_id) :\n undefined;\n\n let entity: Role | null | undefined;\n if (idOrName) {\n const where: Record<string, any> = {};\n if (isUUID(idOrName)) {\n where.id = idOrName;\n } else {\n where.name = idOrName;\n }\n\n if (realm) {\n where.realm_id = realm.id;\n }\n\n entity = await this.repository.findOneBy(where);\n if (!entity && options.updateOnly) {\n throw new NotFoundError();\n }\n } else if (options.updateOnly) {\n throw new NotFoundError();\n }\n\n if (entity) {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROLE_UPDATE });\n group = ValidatorGroup.UPDATE;\n } else {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROLE_CREATE });\n group = ValidatorGroup.CREATE;\n }\n\n const validated = await this.validator.run(data, { group });\n\n await this.repository.validateJoinColumns(validated);\n\n if (entity) {\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.ROLE_UPDATE,\n input: new PolicyData({\n [BuiltInPolicyType.ATTRIBUTES]: {\n ...entity,\n ...validated,\n },\n }),\n });\n\n entity = this.repository.merge(entity, validated);\n await this.repository.checkUniqueness(validated, entity);\n await this.repository.save(entity);\n\n return {\n entity,\n created: false, \n };\n }\n\n if (!isPropertySet(validated, 'realm_id') && actor.identity) {\n validated.realm_id = this.getActorRealmId(actor) || null;\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.ROLE_CREATE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: validated }),\n });\n\n await this.repository.checkUniqueness(validated);\n\n entity = this.repository.create(validated);\n await this.repository.save(entity);\n\n return {\n entity,\n created: true, \n };\n }\n\n async delete(\n id: string,\n actor: ActorContext,\n ): Promise<Role> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROLE_DELETE });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new NotFoundError();\n }\n\n if (entity.name === ROLE_ADMIN_NAME) {\n throw new BadRequestError('The default admin role can not be deleted.');\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.ROLE_DELETE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity }),\n });\n\n const { id: entityId } = entity;\n await this.repository.remove(entity);\n entity.id = entityId;\n\n return entity;\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { BuiltInPolicyType, PolicyData } from '@authup/access';\nimport { NotFoundError } from '@ebec/http';\nimport { PermissionName } from '@authup/core-kit';\nimport type { RoleAttribute } from '@authup/core-kit';\nimport type { ActorContext } from '../actor/types.ts';\nimport { AbstractEntityService } from '../service.ts';\nimport type { EntityRepositoryFindManyResult } from '../types.ts';\nimport type { IRoleAttributeRepository, IRoleAttributeService } from './types.ts';\n\nexport type RoleAttributeServiceContext = {\n repository: IRoleAttributeRepository;\n};\n\nexport class RoleAttributeService extends AbstractEntityService implements IRoleAttributeService {\n protected repository: IRoleAttributeRepository;\n\n constructor(ctx: RoleAttributeServiceContext) {\n super();\n this.repository = ctx.repository;\n }\n\n async getMany(\n query: Record<string, any>,\n actor: ActorContext,\n ): Promise<EntityRepositoryFindManyResult<RoleAttribute>> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.ROLE_READ,\n PermissionName.ROLE_UPDATE,\n PermissionName.ROLE_DELETE,\n ],\n });\n\n const {\n data: entities, \n meta, \n } = await this.repository.findMany(query);\n\n const data: RoleAttribute[] = [];\n let { total } = meta;\n\n for (const entity of entities) {\n try {\n await actor.permissionEvaluator.evaluateOneOf({\n name: [\n PermissionName.ROLE_READ,\n PermissionName.ROLE_UPDATE,\n PermissionName.ROLE_DELETE,\n ],\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity }),\n });\n data.push(entity);\n } catch {\n total--;\n }\n }\n\n return {\n data,\n meta: {\n ...meta,\n total, \n }, \n };\n }\n\n async getOne(\n id: string,\n actor: ActorContext,\n ): Promise<RoleAttribute> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.ROLE_READ,\n PermissionName.ROLE_UPDATE,\n PermissionName.ROLE_DELETE,\n ],\n });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new NotFoundError();\n }\n\n await actor.permissionEvaluator.evaluateOneOf({\n name: [\n PermissionName.ROLE_READ,\n PermissionName.ROLE_UPDATE,\n PermissionName.ROLE_DELETE,\n ],\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity }),\n });\n\n return entity;\n }\n\n async create(\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<RoleAttribute> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROLE_UPDATE });\n\n await this.repository.validateJoinColumns(data);\n\n data.realm_id = data.role.realm_id;\n\n const entity = this.repository.create(data);\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.ROLE_UPDATE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity }),\n });\n\n await this.repository.save(entity);\n\n return entity;\n }\n\n async update(\n id: string,\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<RoleAttribute> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROLE_UPDATE });\n\n await this.repository.validateJoinColumns(data);\n\n let entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new NotFoundError();\n }\n\n entity = this.repository.merge(entity, data);\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.ROLE_UPDATE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity }),\n });\n\n await this.repository.save(entity);\n\n return entity;\n }\n\n async delete(\n id: string,\n actor: ActorContext,\n ): Promise<RoleAttribute> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROLE_UPDATE });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new NotFoundError();\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.ROLE_UPDATE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity }),\n });\n\n const { id: entityId } = entity;\n await this.repository.remove(entity);\n entity.id = entityId;\n\n return entity;\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { BuiltInPolicyType, PolicyData } from '@authup/access';\nimport { NotFoundError } from '@ebec/http';\nimport { PermissionName, ROLE_ADMIN_NAME } from '@authup/core-kit';\nimport type { RolePermission } from '@authup/core-kit';\nimport type { IIdentityPermissionProvider } from '../../identity/permission/types.ts';\nimport type { ActorContext } from '../actor/types.ts';\nimport { AbstractEntityService } from '../service.ts';\nimport type { EntityRepositoryFindManyResult } from '../types.ts';\nimport type { IRolePermissionRepository, IRolePermissionService } from './types.ts';\n\nexport type RolePermissionServiceContext = {\n repository: IRolePermissionRepository;\n identityPermissionProvider: IIdentityPermissionProvider;\n};\n\nexport class RolePermissionService extends AbstractEntityService implements IRolePermissionService {\n protected repository: IRolePermissionRepository;\n\n protected identityPermissionProvider: IIdentityPermissionProvider;\n\n constructor(ctx: RolePermissionServiceContext) {\n super();\n this.repository = ctx.repository;\n this.identityPermissionProvider = ctx.identityPermissionProvider;\n }\n\n async getMany(\n query: Record<string, any>,\n actor: ActorContext,\n ): Promise<EntityRepositoryFindManyResult<RolePermission>> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.ROLE_PERMISSION_DELETE,\n PermissionName.ROLE_PERMISSION_READ,\n ],\n });\n\n return this.repository.findMany(query);\n }\n\n async getOne(\n id: string,\n actor: ActorContext,\n ): Promise<RolePermission> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.ROLE_PERMISSION_DELETE,\n PermissionName.ROLE_PERMISSION_READ,\n ],\n });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new NotFoundError();\n }\n\n return entity;\n }\n\n async create(\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<RolePermission> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROLE_PERMISSION_CREATE });\n\n await this.repository.validateJoinColumns(data);\n\n if (data.permission) {\n data.permission_realm_id = data.permission.realm_id;\n\n if (!data.role || data.role.name !== ROLE_ADMIN_NAME) {\n await actor.permissionEvaluator.preEvaluate({\n name: data.permission.name,\n realmId: data.permission.realm_id,\n clientId: data.permission.client_id,\n });\n }\n }\n\n if (data.role) {\n data.role_realm_id = data.role.realm_id;\n }\n\n if (\n data.permission &&\n actor.identity &&\n typeof data.policy_id === 'undefined'\n ) {\n const junctionPolicy = await this.identityPermissionProvider.resolveJunctionPolicy(\n {\n type: actor.identity.type,\n id: actor.identity.data.id, \n },\n {\n name: data.permission.name,\n realmId: data.permission.realm_id,\n clientId: data.permission.client_id,\n },\n );\n if (junctionPolicy) {\n data.policy_id = junctionPolicy.id;\n }\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.ROLE_PERMISSION_CREATE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: data }),\n });\n\n let entity = this.repository.create(data);\n entity = await this.repository.save(entity);\n\n return entity;\n }\n\n async update(\n id: string,\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<RolePermission> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROLE_PERMISSION_UPDATE });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new NotFoundError();\n }\n\n const updateData: Record<string, any> = {};\n if (Object.prototype.hasOwnProperty.call(data, 'policy_id')) {\n updateData.policy_id = data.policy_id;\n }\n\n await this.repository.validateJoinColumns(updateData);\n\n const merged = this.repository.merge(entity, updateData);\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.ROLE_PERMISSION_UPDATE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: merged }),\n });\n\n return this.repository.save(merged);\n }\n\n async delete(\n id: string,\n actor: ActorContext,\n ): Promise<RolePermission> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROLE_PERMISSION_DELETE });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new NotFoundError();\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.ROLE_PERMISSION_DELETE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity }),\n });\n\n const { id: entityId } = entity;\n await this.repository.remove(entity);\n entity.id = entityId;\n\n return entity;\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { BuiltInPolicyType, PolicyData } from '@authup/access';\nimport { isPropertySet, isUUID } from '@authup/kit';\nimport { NotFoundError } from '@ebec/http';\nimport {\n PermissionName,\n ScopeValidator,\n ValidatorGroup,\n} from '@authup/core-kit';\nimport type { Scope } from '@authup/core-kit';\nimport type { ActorContext } from '../actor/types.ts';\nimport type { IRealmRepository } from '../realm/types.ts';\nimport { AbstractEntityService } from '../service.ts';\nimport type { EntityRepositoryFindManyResult } from '../types.ts';\nimport type { IScopeRepository, IScopeService } from './types.ts';\n\nexport type ScopeServiceContext = {\n repository: IScopeRepository;\n realmRepository: IRealmRepository;\n};\n\nexport class ScopeService extends AbstractEntityService implements IScopeService {\n protected repository: IScopeRepository;\n\n protected realmRepository: IRealmRepository;\n\n protected validator: ScopeValidator;\n\n constructor(ctx: ScopeServiceContext) {\n super();\n this.repository = ctx.repository;\n this.realmRepository = ctx.realmRepository;\n this.validator = new ScopeValidator();\n }\n\n async getMany(\n query: Record<string, any>,\n actor: ActorContext,\n ): Promise<EntityRepositoryFindManyResult<Scope>> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.SCOPE_READ,\n PermissionName.SCOPE_UPDATE,\n PermissionName.SCOPE_DELETE,\n ],\n });\n\n return this.repository.findMany(query);\n }\n\n async getOne(\n idOrName: string,\n actor: ActorContext,\n ): Promise<Scope> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.SCOPE_READ,\n PermissionName.SCOPE_UPDATE,\n PermissionName.SCOPE_DELETE,\n ],\n });\n\n const entity = await this.repository.findOneByIdOrName(idOrName);\n if (!entity) {\n throw new NotFoundError();\n }\n\n return entity;\n }\n\n async create(\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<Scope> {\n const { entity } = await this.save(undefined, data, actor);\n return entity;\n }\n\n async update(\n idOrName: string,\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<Scope> {\n const { entity } = await this.save(idOrName, data, actor, { updateOnly: true });\n return entity;\n }\n\n async save(\n idOrName: string | undefined,\n data: Record<string, any>,\n actor: ActorContext,\n options: { updateOnly?: boolean } = {},\n ): Promise<{\n entity: Scope,\n created: boolean \n }> {\n let group: string;\n\n const realm = typeof data.realm_id === 'string' ?\n await this.realmRepository.resolve(data.realm_id) :\n undefined;\n\n let entity: Scope | null | undefined;\n if (idOrName) {\n const where: Record<string, any> = {};\n if (isUUID(idOrName)) {\n where.id = idOrName;\n } else {\n where.name = idOrName;\n }\n\n if (realm) {\n where.realm_id = realm.id;\n }\n\n entity = await this.repository.findOneBy(where);\n if (!entity && options.updateOnly) {\n throw new NotFoundError();\n }\n } else if (options.updateOnly) {\n throw new NotFoundError();\n }\n\n if (entity) {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.SCOPE_UPDATE });\n group = ValidatorGroup.UPDATE;\n } else {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.SCOPE_CREATE });\n group = ValidatorGroup.CREATE;\n }\n\n const validated = await this.validator.run(data, { group });\n\n await this.repository.validateJoinColumns(validated);\n\n if (entity) {\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.SCOPE_UPDATE,\n input: new PolicyData({\n [BuiltInPolicyType.ATTRIBUTES]: {\n ...entity,\n ...validated,\n },\n }),\n });\n\n await this.repository.checkUniqueness(validated, entity);\n\n entity = this.repository.merge(entity, validated);\n await this.repository.save(entity);\n\n return {\n entity,\n created: false, \n };\n }\n\n if (!isPropertySet(validated, 'realm_id') && actor.identity) {\n validated.realm_id = this.getActorRealmId(actor) || null;\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.SCOPE_CREATE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: validated }),\n });\n\n await this.repository.checkUniqueness(validated);\n\n entity = this.repository.create(validated);\n await this.repository.save(entity);\n\n return {\n entity,\n created: true, \n };\n }\n\n async delete(\n id: string,\n actor: ActorContext,\n ): Promise<Scope> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.SCOPE_DELETE });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new NotFoundError();\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.SCOPE_DELETE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity }),\n });\n\n const { id: entityId } = entity;\n await this.repository.remove(entity);\n entity.id = entityId;\n\n return entity;\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { BuiltInPolicyType, PolicyData } from '@authup/access';\nimport { isUUID, removeObjectProperty } from '@authup/kit';\nimport { BadRequestError, NotFoundError } from '@ebec/http';\nimport {\n PermissionName,\n UserValidator,\n ValidatorGroup,\n} from '@authup/core-kit';\nimport type { User } from '@authup/core-kit';\nimport type { ActorContext } from '../actor/types.ts';\nimport type { IRealmRepository } from '../realm/types.ts';\nimport { AbstractEntityService } from '../service.ts';\nimport type { EntityRepositoryFindManyResult } from '../types.ts';\nimport { UserCredentialsService } from '../../authentication/credential/entities/user/module.ts';\nimport type { IUserRepository, IUserService } from './types.ts';\n\nexport type UserServiceContext = {\n repository: IUserRepository;\n realmRepository: IRealmRepository;\n};\n\nexport class UserService extends AbstractEntityService implements IUserService {\n protected repository: IUserRepository;\n\n protected realmRepository: IRealmRepository;\n\n protected validator: UserValidator;\n\n constructor(ctx: UserServiceContext) {\n super();\n this.repository = ctx.repository;\n this.realmRepository = ctx.realmRepository;\n this.validator = new UserValidator();\n }\n\n async getMany(\n query: Record<string, any>,\n actor: ActorContext,\n ): Promise<EntityRepositoryFindManyResult<User>> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.USER_READ,\n PermissionName.USER_UPDATE,\n PermissionName.USER_DELETE,\n ],\n });\n\n const {\n data: entities, \n meta, \n } = await this.repository.findMany(query);\n\n const data: User[] = [];\n let { total } = meta;\n\n for (const entity of entities) {\n if (\n actor.identity &&\n actor.identity.type === 'user' &&\n actor.identity.data.id === entity.id\n ) {\n data.push(entity);\n continue;\n }\n\n try {\n await actor.permissionEvaluator.evaluateOneOf({\n name: [\n PermissionName.USER_READ,\n PermissionName.USER_UPDATE,\n PermissionName.USER_DELETE,\n ],\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity }),\n });\n\n data.push(entity);\n } catch {\n total -= 1;\n }\n }\n\n return {\n data,\n meta: {\n ...meta,\n total, \n }, \n };\n }\n\n async getOne(\n idOrName: string,\n actor: ActorContext,\n query?: Record<string, any>,\n realmId?: string,\n ): Promise<User> {\n let isMe = false;\n if (actor.identity && actor.identity.type === 'user') {\n if (\n actor.identity.data.id === idOrName ||\n actor.identity.data.name === idOrName\n ) {\n isMe = true;\n }\n }\n\n if (!isMe) {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.USER_READ,\n PermissionName.USER_UPDATE,\n PermissionName.USER_DELETE,\n ],\n });\n }\n\n const resolvedId = isMe ? actor.identity!.data.id : idOrName;\n const entity = await this.repository.findOne(resolvedId, query, realmId);\n if (!entity) {\n throw new NotFoundError();\n }\n\n if (!isMe) {\n await actor.permissionEvaluator.evaluateOneOf({\n name: [\n PermissionName.USER_READ,\n PermissionName.USER_UPDATE,\n PermissionName.USER_DELETE,\n ],\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity }),\n });\n }\n\n return entity;\n }\n\n async create(\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<User> {\n const { entity } = await this.save(undefined, data, actor);\n return entity;\n }\n\n async update(\n idOrName: string,\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<User> {\n const { entity } = await this.save(idOrName, data, actor, { updateOnly: true });\n return entity;\n }\n\n async save(\n idOrName: string | undefined,\n data: Record<string, any>,\n actor: ActorContext,\n options: { updateOnly?: boolean } = {},\n ): Promise<{\n entity: User,\n created: boolean \n }> {\n let group: string;\n\n const realm = typeof data.realm_id === 'string' ?\n await this.realmRepository.resolve(data.realm_id) :\n undefined;\n\n let entity: User | null | undefined;\n if (idOrName) {\n const where: Record<string, any> = {};\n if (isUUID(idOrName)) {\n where.id = idOrName;\n } else {\n where.name = idOrName;\n }\n\n if (realm) {\n where.realm_id = realm.id;\n }\n\n entity = await this.repository.findOneBy(where);\n if (!entity && options.updateOnly) {\n throw new NotFoundError();\n }\n } else if (options.updateOnly) {\n throw new NotFoundError();\n }\n\n let hasAbility: boolean | undefined;\n if (entity) {\n try {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.USER_UPDATE });\n hasAbility = true;\n } catch (e) {\n if (\n !actor.identity ||\n actor.identity.type !== 'user' ||\n actor.identity.data.id !== entity.id\n ) {\n throw e;\n }\n }\n\n group = ValidatorGroup.UPDATE;\n } else {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.USER_CREATE });\n hasAbility = true;\n\n group = ValidatorGroup.CREATE;\n }\n\n const validated = await this.validator.run(data, { group });\n\n await this.repository.validateJoinColumns(validated);\n\n if (!hasAbility) {\n removeObjectProperty(validated, 'name_locked');\n removeObjectProperty(validated, 'active');\n removeObjectProperty(validated, 'status');\n removeObjectProperty(validated, 'status_message');\n }\n\n const credentialsService = new UserCredentialsService();\n\n if (entity) {\n const originalName = entity.name;\n const originalNameLocked = entity.name_locked;\n\n entity = this.repository.merge(entity, validated);\n\n if (\n validated.name &&\n validated.name !== originalName\n ) {\n if (validated.name_locked) {\n entity.name_locked = validated.name_locked;\n }\n\n if (originalNameLocked && validated.name_locked !== false) {\n entity.name = originalName;\n }\n }\n\n if (hasAbility) {\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.USER_UPDATE,\n input: new PolicyData({\n [BuiltInPolicyType.ATTRIBUTES]: {\n ...entity,\n ...validated,\n },\n }),\n });\n }\n\n if (validated.password) {\n entity.password = await credentialsService.protect(validated.password);\n }\n\n await this.repository.save(entity);\n\n return {\n entity,\n created: false, \n };\n }\n\n if (!validated.realm_id) {\n const actorRealmId = this.getActorRealmId(actor);\n if (actorRealmId) {\n validated.realm_id = actorRealmId;\n }\n }\n\n entity = this.repository.create(validated);\n\n if (hasAbility) {\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.USER_CREATE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity }),\n });\n }\n\n if (validated.password) {\n entity.password = await credentialsService.protect(validated.password);\n }\n\n await this.repository.save(entity);\n\n return {\n entity,\n created: true, \n };\n }\n\n async delete(\n id: string,\n actor: ActorContext,\n ): Promise<User> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.USER_DELETE });\n\n if (\n actor.identity &&\n actor.identity.type === 'user' &&\n actor.identity.data.id === id\n ) {\n throw new BadRequestError('The own user can not be deleted.');\n }\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new NotFoundError();\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.USER_DELETE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity }),\n });\n\n const { id: entityId } = entity;\n await this.repository.remove(entity);\n entity.id = entityId;\n\n return entity;\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { BuiltInPolicyType, PolicyData } from '@authup/access';\nimport { BadRequestError, ForbiddenError, NotFoundError } from '@ebec/http';\nimport { PermissionName } from '@authup/core-kit';\nimport type { UserAttribute } from '@authup/core-kit';\nimport { buildErrorMessageForAttribute } from 'validup';\nimport type { ActorContext } from '../actor/types.ts';\nimport { AbstractEntityService } from '../service.ts';\nimport type { EntityRepositoryFindManyResult } from '../types.ts';\nimport type { IUserAttributeRepository, IUserAttributeService } from './types.ts';\n\nexport type UserAttributeServiceContext = {\n repository: IUserAttributeRepository;\n};\n\nexport class UserAttributeService extends AbstractEntityService implements IUserAttributeService {\n protected repository: IUserAttributeRepository;\n\n constructor(ctx: UserAttributeServiceContext) {\n super();\n this.repository = ctx.repository;\n }\n\n async getMany(\n query: Record<string, any>,\n actor: ActorContext,\n ): Promise<EntityRepositoryFindManyResult<UserAttribute>> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.USER_UPDATE,\n PermissionName.USER_SELF_MANAGE,\n ],\n });\n\n const {\n data: entities, \n meta, \n } = await this.repository.findMany(query);\n\n const data: UserAttribute[] = [];\n let { total } = meta;\n\n for (const entity of entities) {\n const canManage = await this.canManageUserAttribute(actor, entity);\n if (canManage) {\n data.push(entity);\n } else {\n total--;\n }\n }\n\n return {\n data,\n meta: {\n ...meta,\n total, \n }, \n };\n }\n\n async getOne(\n id: string,\n actor: ActorContext,\n ): Promise<UserAttribute> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.USER_UPDATE,\n PermissionName.USER_SELF_MANAGE,\n ],\n });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new NotFoundError();\n }\n\n const canManage = await this.canManageUserAttribute(actor, entity);\n if (!canManage) {\n throw new ForbiddenError();\n }\n\n return entity;\n }\n\n async create(\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<UserAttribute> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.USER_UPDATE,\n PermissionName.USER_SELF_MANAGE,\n ],\n });\n\n await this.repository.validateJoinColumns(data);\n\n if (data.user) {\n data.realm_id = data.user.realm_id;\n } else if (\n actor.identity &&\n actor.identity.type === 'user'\n ) {\n data.user_id = actor.identity.data.id;\n data.realm_id = actor.identity.data.realm_id;\n } else {\n throw new BadRequestError(buildErrorMessageForAttribute('user_id'));\n }\n\n const entity = this.repository.create(data);\n\n const canManage = await this.canManageUserAttribute(actor, entity);\n if (!canManage) {\n throw new ForbiddenError();\n }\n\n await this.repository.save(entity);\n\n return entity;\n }\n\n async update(\n id: string,\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<UserAttribute> {\n await actor.permissionEvaluator.evaluateOneOf({\n name: [\n PermissionName.USER_UPDATE,\n PermissionName.USER_SELF_MANAGE,\n ],\n });\n\n await this.repository.validateJoinColumns(data);\n\n let entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new NotFoundError();\n }\n\n entity = this.repository.merge(entity, data);\n\n const canManage = await this.canManageUserAttribute(actor, entity);\n if (!canManage) {\n throw new ForbiddenError();\n }\n\n await this.repository.save(entity);\n\n return entity;\n }\n\n async delete(\n id: string,\n actor: ActorContext,\n ): Promise<UserAttribute> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.USER_UPDATE,\n PermissionName.USER_SELF_MANAGE,\n ],\n });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new NotFoundError();\n }\n\n const canManage = await this.canManageUserAttribute(actor, entity);\n if (!canManage) {\n throw new ForbiddenError();\n }\n\n const { id: entityId } = entity;\n await this.repository.remove(entity);\n entity.id = entityId;\n\n return entity;\n }\n\n private async canManageUserAttribute(\n actor: ActorContext,\n entity: UserAttribute,\n ): Promise<boolean> {\n const isMe = actor.identity &&\n actor.identity.type === 'user' &&\n actor.identity.data.id === entity.user_id;\n\n if (isMe) {\n try {\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.USER_SELF_MANAGE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity }),\n });\n\n return true;\n } catch {\n return false;\n }\n }\n\n try {\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.USER_UPDATE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity }),\n });\n\n return true;\n } catch {\n return false;\n }\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { BuiltInPolicyType, PolicyData } from '@authup/access';\nimport { NotFoundError } from '@ebec/http';\nimport { PermissionName } from '@authup/core-kit';\nimport type { UserPermission } from '@authup/core-kit';\nimport type { IIdentityPermissionProvider } from '../../identity/permission/types.ts';\nimport type { ActorContext } from '../actor/types.ts';\nimport { AbstractEntityService } from '../service.ts';\nimport type { EntityRepositoryFindManyResult } from '../types.ts';\nimport type { IUserPermissionRepository, IUserPermissionService } from './types.ts';\n\nexport type UserPermissionServiceContext = {\n repository: IUserPermissionRepository;\n identityPermissionProvider: IIdentityPermissionProvider;\n};\n\nexport class UserPermissionService extends AbstractEntityService implements IUserPermissionService {\n protected repository: IUserPermissionRepository;\n\n protected identityPermissionProvider: IIdentityPermissionProvider;\n\n constructor(ctx: UserPermissionServiceContext) {\n super();\n this.repository = ctx.repository;\n this.identityPermissionProvider = ctx.identityPermissionProvider;\n }\n\n async getMany(\n query: Record<string, any>,\n actor: ActorContext,\n ): Promise<EntityRepositoryFindManyResult<UserPermission>> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.USER_PERMISSION_CREATE,\n PermissionName.USER_PERMISSION_DELETE,\n PermissionName.USER_PERMISSION_READ,\n ],\n });\n\n return this.repository.findMany(query);\n }\n\n async getOne(\n id: string,\n actor: ActorContext,\n ): Promise<UserPermission> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.USER_PERMISSION_CREATE,\n PermissionName.USER_PERMISSION_DELETE,\n PermissionName.USER_PERMISSION_READ,\n ],\n });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new NotFoundError();\n }\n\n return entity;\n }\n\n async create(\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<UserPermission> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.USER_PERMISSION_CREATE });\n\n await this.repository.validateJoinColumns(data);\n\n if (data.permission) {\n data.permission_realm_id = data.permission.realm_id;\n\n await actor.permissionEvaluator.preEvaluate({\n name: data.permission.name,\n realmId: data.permission.realm_id,\n clientId: data.permission.client_id,\n });\n }\n\n if (data.user) {\n data.user_realm_id = data.user.realm_id;\n }\n\n if (\n data.permission &&\n actor.identity &&\n typeof data.policy_id === 'undefined'\n ) {\n const junctionPolicy = await this.identityPermissionProvider.resolveJunctionPolicy(\n {\n type: actor.identity.type,\n id: actor.identity.data.id, \n },\n {\n name: data.permission.name,\n realmId: data.permission.realm_id,\n clientId: data.permission.client_id,\n },\n );\n if (junctionPolicy) {\n data.policy_id = junctionPolicy.id;\n }\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.USER_PERMISSION_CREATE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: data }),\n });\n\n let entity = this.repository.create(data);\n entity = await this.repository.save(entity);\n\n return entity;\n }\n\n async update(\n id: string,\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<UserPermission> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.USER_PERMISSION_UPDATE });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new NotFoundError();\n }\n\n const updateData: Record<string, any> = {};\n if (Object.prototype.hasOwnProperty.call(data, 'policy_id')) {\n updateData.policy_id = data.policy_id;\n }\n\n await this.repository.validateJoinColumns(updateData);\n\n const merged = this.repository.merge(entity, updateData);\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.USER_PERMISSION_UPDATE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: merged }),\n });\n\n return this.repository.save(merged);\n }\n\n async delete(\n id: string,\n actor: ActorContext,\n ): Promise<UserPermission> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.USER_PERMISSION_DELETE });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new NotFoundError();\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.USER_PERMISSION_DELETE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity }),\n });\n\n const { id: entityId } = entity;\n await this.repository.remove(entity);\n entity.id = entityId;\n\n return entity;\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { BuiltInPolicyType, PolicyData } from '@authup/access';\nimport { NotFoundError } from '@ebec/http';\nimport { PermissionName } from '@authup/core-kit';\nimport type { UserRole } from '@authup/core-kit';\nimport type { ActorContext } from '../actor/types.ts';\nimport { AbstractEntityService } from '../service.ts';\nimport type { EntityRepositoryFindManyResult } from '../types.ts';\nimport type { IUserRoleRepository, IUserRoleService } from './types.ts';\n\nexport type UserRoleServiceContext = {\n repository: IUserRoleRepository;\n};\n\nexport class UserRoleService extends AbstractEntityService implements IUserRoleService {\n protected repository: IUserRoleRepository;\n\n constructor(ctx: UserRoleServiceContext) {\n super();\n this.repository = ctx.repository;\n }\n\n async getMany(\n query: Record<string, any>,\n actor: ActorContext,\n ): Promise<EntityRepositoryFindManyResult<UserRole>> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.USER_ROLE_READ,\n PermissionName.USER_ROLE_CREATE,\n PermissionName.USER_ROLE_UPDATE,\n ],\n });\n\n return this.repository.findMany(query);\n }\n\n async getOne(\n id: string,\n actor: ActorContext,\n ): Promise<UserRole> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.USER_ROLE_READ,\n PermissionName.USER_ROLE_CREATE,\n PermissionName.USER_ROLE_UPDATE,\n ],\n });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new NotFoundError();\n }\n\n return entity;\n }\n\n async create(\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<UserRole> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.USER_ROLE_CREATE });\n\n await this.repository.validateJoinColumns(data);\n\n if (data.role) {\n data.role_realm_id = data.role.realm_id;\n }\n\n if (data.user) {\n data.user_realm_id = data.user.realm_id;\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.USER_ROLE_CREATE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: data }),\n });\n\n let entity = this.repository.create(data);\n entity = await this.repository.save(entity);\n\n return entity;\n }\n\n async delete(\n id: string,\n actor: ActorContext,\n ): Promise<UserRole> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.USER_ROLE_DELETE });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new NotFoundError();\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.USER_ROLE_DELETE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity }),\n });\n\n const { id: entityId } = entity;\n await this.repository.remove(entity);\n entity.id = entityId;\n\n return entity;\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Identity, OAuth2AuthorizationCode, OAuth2AuthorizationCodeRequest } from '@authup/core-kit';\nimport type { IOAuth2AuthorizationCodeRepository, OAuth2AuthorizationCodeInput } from '../repository/index.ts';\nimport type { IOAuth2AuthorizationCodeIssuer, OAuth2AuthorizationCodeIssuerOptions } from './types.ts';\n\nexport class OAuth2AuthorizationCodeIssuer implements IOAuth2AuthorizationCodeIssuer {\n protected repository: IOAuth2AuthorizationCodeRepository;\n\n protected options: OAuth2AuthorizationCodeIssuerOptions;\n\n constructor(\n repository: IOAuth2AuthorizationCodeRepository,\n options: OAuth2AuthorizationCodeIssuerOptions = {},\n ) {\n this.repository = repository;\n this.options = options;\n }\n\n async issue(\n input: OAuth2AuthorizationCodeRequest,\n identity: Identity,\n options: OAuth2AuthorizationCodeIssuerOptions = {},\n ) : Promise<OAuth2AuthorizationCode> {\n const entity: OAuth2AuthorizationCodeInput = {\n redirect_uri: input.redirect_uri,\n client_id: input.client_id,\n scope: input.scope,\n nonce: input.nonce,\n code_challenge: input.code_challenge,\n code_challenge_method: input.code_challenge_method,\n\n realm_id: identity.data.realm.id,\n realm_name: identity.data.realm.name,\n sub: identity.data.id,\n sub_kind: identity.type,\n };\n\n if (options.idToken) {\n entity.id_token = options.idToken;\n }\n\n return this.repository.save(entity, { maxAge: options.maxAge ?? this.options.maxAge });\n }\n\n async updateIdToken(\n entity: OAuth2AuthorizationCode,\n idToken: string,\n ) : Promise<void> {\n entity.id_token = idToken;\n\n await this.repository.save(entity, { maxAge: this.options.maxAge });\n }\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { subtle } from 'uncrypto';\n\nexport function generateOAuth2CodeVerifier() {\n const length = 64;\n const charset = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~';\n\n let codeVerifier = '';\n const randomValues = new Uint8Array(length);\n crypto.getRandomValues(randomValues);\n\n for (let i = 0; i < length; i++) {\n codeVerifier += charset[randomValues[i] % charset.length];\n }\n\n return codeVerifier;\n}\n\nexport function base64URLEncode(arrayBuffer: ArrayBuffer) {\n // Convert the ArrayBuffer to string using Uint8 array.\n // btoa takes chars from 0-255 and base64 encodes.\n // Then convert the base64 encoded to base64url encoded.\n // (replace + with -, replace / with _, trim trailing =)\n const charCode = Array.from(new Uint8Array(arrayBuffer));\n\n return btoa(String.fromCharCode.apply(null, charCode))\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=+$/, '');\n}\n\nexport async function buildOAuth2TokenHash(value: string) : Promise<string> {\n const encoder = new TextEncoder();\n const data = encoder.encode(value);\n const hashBuffer = await subtle.digest('SHA-256', data);\n const halfHash = hashBuffer.slice(0, 16);\n\n return base64URLEncode(halfHash);\n}\n\nexport async function buildOAuth2CodeChallenge(codeVerifier: string) {\n const encoder = new TextEncoder();\n const data = encoder.encode(codeVerifier);\n const arrayBuffer = await subtle.digest('SHA-256', data);\n\n return base64URLEncode(arrayBuffer);\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { OAuth2AuthorizationCode } from '@authup/core-kit';\nimport { OAuth2AuthorizationCodeChallengeMethod, OAuth2Error } from '@authup/specs';\nimport { buildOAuth2CodeChallenge } from '../../helpers.ts';\n\nimport type { IOAuth2AuthorizationCodeRepository } from '../repository/index.ts';\nimport type { IOAuth2AuthorizationCodeVerifier, IOAuth2AuthorizationCodeVerifyOptions } from './types.ts';\n\nexport class OAuth2AuthorizationCodeVerifier implements IOAuth2AuthorizationCodeVerifier {\n protected repository : IOAuth2AuthorizationCodeRepository;\n\n constructor(repository: IOAuth2AuthorizationCodeRepository) {\n this.repository = repository;\n }\n\n async verify(code: string, options: IOAuth2AuthorizationCodeVerifyOptions) : Promise<OAuth2AuthorizationCode> {\n const entity = await this.repository.popOneById(code);\n if (!entity) {\n throw OAuth2Error.grantInvalid();\n }\n\n if (entity.redirect_uri) {\n if (!options.redirectUri || entity.redirect_uri !== options.redirectUri) {\n throw OAuth2Error.redirectUriMismatch();\n }\n }\n\n if (entity.code_challenge) {\n if (entity.code_challenge_method === OAuth2AuthorizationCodeChallengeMethod.PLAIN) {\n if (options.codeVerifier !== entity.code_challenge) {\n throw OAuth2Error.grantInvalid('PKCE code_verifier mismatch.');\n }\n } else {\n if (!options.codeVerifier) {\n throw OAuth2Error.grantInvalid('Code verifier invalid.');\n }\n\n const codeVerifierHash = await buildOAuth2CodeChallenge(options.codeVerifier);\n if (codeVerifierHash !== entity.code_challenge) {\n throw OAuth2Error.grantInvalid('PKCE code_verifier mismatch.');\n }\n }\n }\n\n return entity;\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { OAuth2AuthorizationCodeRequest } from '@authup/core-kit';\nimport { ScopeName } from '@authup/core-kit';\nimport { isSimpleMatch } from '@authup/kit';\nimport { OAuth2Error, hasOAuth2Scopes } from '@authup/specs';\nimport type { IOAuth2ClientRepository } from '../../../client/index.ts';\nimport type { IOAuth2ScopeRepository } from '../../../scope/index.ts';\nimport type {\n IOAuth2AuthorizationCodeRequestVerifier,\n OAuth2AuthorizationCodeRequestVerificationResult,\n OAuth2AuthorizationCodeRequestVerifierContext,\n} from './types.ts';\n\nexport class OAuth2AuthorizationCodeRequestVerifier implements IOAuth2AuthorizationCodeRequestVerifier {\n protected clientRepository: IOAuth2ClientRepository;\n\n protected scopeRepository: IOAuth2ScopeRepository;\n\n constructor(ctx: OAuth2AuthorizationCodeRequestVerifierContext) {\n this.clientRepository = ctx.clientRepository;\n this.scopeRepository = ctx.scopeRepository;\n }\n\n /**\n * Verify validated authorization code request.\n * @param data\n */\n async verify(\n data: OAuth2AuthorizationCodeRequest,\n ) : Promise<OAuth2AuthorizationCodeRequestVerificationResult> {\n if (!data.client_id) {\n throw OAuth2Error.clientInvalid();\n }\n\n const client = await this.clientRepository.findOneByIdOrName(data.client_id, data.realm_id);\n if (!client) {\n throw OAuth2Error.clientInvalid();\n }\n\n if (!client.active) {\n throw OAuth2Error.clientInactive();\n }\n\n data.client_id = client.id;\n data.realm_id = client.realm_id;\n\n const scopes = await this.scopeRepository.findByClientId(client.id);\n const scopeNames = scopes.map((scope) => scope.name);\n if (data.scope) {\n if (\n !hasOAuth2Scopes(scopeNames, data.scope) &&\n !hasOAuth2Scopes(data.scope, ScopeName.GLOBAL)\n ) {\n throw OAuth2Error.scopeInsufficient();\n }\n } else {\n data.scope = scopeNames.join(' ');\n }\n\n if (client.redirect_uri && data.redirect_uri) {\n const redirectUris = client.redirect_uri.split(',');\n\n if (!isSimpleMatch(data.redirect_uri, redirectUris)) {\n throw OAuth2Error.redirectUriMismatch();\n }\n }\n\n return {\n data,\n client,\n scopes,\n };\n }\n}\n","/*\n * Copyright (c) 2022-2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { OAuth2AuthorizationCodeRequest } from '@authup/core-kit';\nimport {\n OAuth2AuthorizationCodeChallengeMethod,\n OAuth2AuthorizationResponseType,\n OAuth2Error,\n} from '@authup/specs';\n\nimport { createValidator } from '@validup/adapter-zod';\nimport { Container } from 'validup';\nimport { z } from 'zod';\n\nexport class OAuth2AuthorizationCodeRequestValidator extends Container<OAuth2AuthorizationCodeRequest> {\n protected initialize() {\n super.initialize();\n\n this.mount(\n 'response_type',\n createValidator(\n z\n .string()\n .nonempty()\n .check((ctx) => {\n const availableResponseTypes = Object.values(OAuth2AuthorizationResponseType);\n const responseTypes = ctx.value.split(' ') as OAuth2AuthorizationResponseType[];\n\n for (const responseType of responseTypes) {\n if (!availableResponseTypes.includes(responseType)) {\n const error = OAuth2Error.responseTypeUnsupported();\n ctx.issues.push({\n input: responseType,\n code: 'custom',\n message: error.message,\n });\n }\n }\n\n return z.NEVER;\n }),\n ),\n );\n\n this.mount(\n 'redirect_uri',\n createValidator(z.string().url()),\n );\n\n this.mount(\n 'scope',\n createValidator(z.string().min(3).max(512)),\n );\n\n this.mount(\n 'state',\n { optional: true },\n createValidator(z.string().min(5).max(2048).nullable()),\n );\n\n this.mount(\n 'code_challenge',\n { optional: true },\n createValidator(z.string().min(1).max(256).nullable()),\n );\n\n this.mount(\n 'code_challenge_method',\n { optional: true },\n createValidator(z.enum(OAuth2AuthorizationCodeChallengeMethod).nullable()),\n );\n\n this.mount(\n 'nonce',\n { optional: true },\n createValidator(z.string().min(1).max(512).nullable()),\n );\n\n this.mount(\n 'realm_id',\n { optional: true },\n createValidator(z.string().nonempty()),\n );\n\n this.mount(\n 'client_id',\n createValidator(z.string().nonempty()),\n );\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { OAuth2Error } from '@authup/specs';\nimport type {\n IOAuth2AuthorizationStateManager,\n IOAuth2AuthorizeStateRepository,\n OAuth2AuthorizationState,\n} from './types.ts';\n\nexport class OAuth2AuthorizationStateManager implements IOAuth2AuthorizationStateManager {\n protected repository: IOAuth2AuthorizeStateRepository;\n\n constructor(repository: IOAuth2AuthorizeStateRepository) {\n this.repository = repository;\n }\n\n async save(data: OAuth2AuthorizationState) : Promise<string> {\n return this.repository.insert(data);\n }\n\n async verify(state: string, input: Partial<OAuth2AuthorizationState>): Promise<OAuth2AuthorizationState> {\n const payload = await this.repository.findOneById(state);\n if (!payload) {\n throw OAuth2Error.stateInvalid();\n }\n\n // avoid replay attacks\n await this.repository.remove(state);\n\n if (\n payload.ip &&\n input.ip !== payload.ip\n ) {\n throw OAuth2Error.stateInvalid();\n }\n\n if (\n payload.userAgent &&\n input.userAgent !== payload.userAgent\n ) {\n throw OAuth2Error.stateInvalid();\n }\n\n return payload;\n }\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Identity, OAuth2AuthorizationCode, OAuth2AuthorizationCodeRequest } from '@authup/core-kit';\nimport { ScopeName } from '@authup/core-kit';\nimport type { OAuth2TokenPayload } from '@authup/specs';\nimport {\n OAuth2AuthorizationResponseType,\n OAuth2Error,\n hasOAuth2Scopes,\n} from '@authup/specs';\nimport type { IOAuth2OpenIDTokenIssuer, IOAuth2TokenIssuer } from '../token/index.ts';\nimport type { IOAuth2AuthorizationCodeIssuer } from './code/index.ts';\nimport { buildOAuth2TokenHash } from './helpers.ts';\nimport type {\n OAuth2AuthorizationManagerContext,\n OAuth2AuthorizationResult,\n} from './types.ts';\nimport type { IIdentityResolver } from '../../identity/index.ts';\n\nexport class OAuth2Authorization {\n protected accessTokenIssuer : IOAuth2TokenIssuer;\n\n protected openIdTokenIssuer : IOAuth2OpenIDTokenIssuer;\n\n protected codeIssuer : IOAuth2AuthorizationCodeIssuer;\n\n protected identityResolver : IIdentityResolver;\n\n constructor(ctx: OAuth2AuthorizationManagerContext) {\n this.accessTokenIssuer = ctx.accessTokenIssuer;\n this.openIdTokenIssuer = ctx.openIdTokenIssuer;\n this.codeIssuer = ctx.codeIssuer;\n this.identityResolver = ctx.identityResolver;\n }\n\n /**\n * Authorize with validated codeRequest.\n *\n * @param data\n * @param identity\n */\n async authorize(\n data: OAuth2AuthorizationCodeRequest,\n identity: Identity,\n ) : Promise<OAuth2AuthorizationResult> {\n const availableResponseTypes : string[] = Object.values(OAuth2AuthorizationResponseType);\n\n let responseTypes : string[] = [];\n if (data.response_type) {\n responseTypes = Array.isArray(data.response_type) ?\n data.response_type :\n data.response_type.split(' ');\n }\n\n const enabledResponseTypes : Record<string, boolean> = {};\n\n for (const responseType of responseTypes) {\n if (!availableResponseTypes.includes(responseType)) {\n throw OAuth2Error.responseTypeUnsupported();\n } else {\n enabledResponseTypes[responseType] = true;\n }\n }\n\n if (!data.redirect_uri) {\n throw OAuth2Error.redirectUriMismatch();\n }\n\n const output : OAuth2AuthorizationResult = {\n redirectUri: data.redirect_uri,\n ...(data.state ? { state: data.state } : {}),\n };\n\n if (!identity) {\n throw OAuth2Error.identityInvalid();\n }\n\n const payloadBaseNormalized : OAuth2TokenPayload = {\n\n sub: identity.data.id,\n sub_kind: identity.type,\n realm_id: identity.data.realm.id,\n realm_name: identity.data.realm.name,\n\n client_id: data.client_id,\n ...(data.scope ? { scope: data.scope } : {}),\n ...(data.nonce ? { nonce: data.nonce } : {}),\n };\n\n let codeEntity : OAuth2AuthorizationCode | undefined;\n\n if (enabledResponseTypes[OAuth2AuthorizationResponseType.TOKEN]) {\n const [token] = await this.accessTokenIssuer.issue(payloadBaseNormalized);\n\n output.accessToken = token;\n }\n\n if (enabledResponseTypes[OAuth2AuthorizationResponseType.CODE]) {\n codeEntity = await this.codeIssuer.issue(\n data,\n identity,\n );\n\n output.authorizationCode = codeEntity.id;\n }\n\n const needsIdToken = enabledResponseTypes[OAuth2AuthorizationResponseType.ID_TOKEN] ||\n (data.scope && hasOAuth2Scopes(data.scope, ScopeName.OPEN_ID));\n\n if (needsIdToken) {\n const idTokenPayload = { ...payloadBaseNormalized };\n\n if (output.accessToken) {\n idTokenPayload.at_hash = await buildOAuth2TokenHash(output.accessToken);\n }\n if (output.authorizationCode) {\n idTokenPayload.c_hash = await buildOAuth2TokenHash(output.authorizationCode);\n }\n\n const [token] = await this.openIdTokenIssuer.issueWithIdentity(\n idTokenPayload,\n identity,\n );\n\n if (enabledResponseTypes[OAuth2AuthorizationResponseType.ID_TOKEN]) {\n output.idToken = token;\n }\n\n if (codeEntity) {\n await this.codeIssuer.updateIdToken(codeEntity, token);\n }\n }\n\n return output;\n }\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { ObjectLiteral } from '@authup/kit';\nimport type { OAuth2TokenGrantResponse } from '@authup/specs';\nimport type { ISessionManager } from '../../authentication/index.ts';\nimport type { IOAuth2TokenIssuer } from '../token/index.ts';\nimport type { BaseGrantContext, IOAuth2Grant, OAuth2GrantRunWIthOptions } from './types.ts';\n\nexport abstract class OAuth2BaseGrant<\n T = ObjectLiteral,\n> implements IOAuth2Grant<T> {\n protected accessTokenIssuer : IOAuth2TokenIssuer;\n\n protected sessionManager : ISessionManager;\n\n // -----------------------------------------------------\n\n constructor(ctx: BaseGrantContext) {\n this.accessTokenIssuer = ctx.accessTokenIssuer;\n this.sessionManager = ctx.sessionManager;\n }\n\n // -----------------------------------------------------\n\n abstract runWith(input: T, options?: OAuth2GrantRunWIthOptions): Promise<OAuth2TokenGrantResponse>;\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { OAuth2TokenGrantResponse, OAuth2TokenPayload } from '@authup/specs';\nimport type { OAuth2BearerResponseBuildContext } from './type.ts';\n\nfunction resolveExpiresIn(payload?: OAuth2TokenPayload, fallbackValue?: number) : number {\n if (payload && payload.exp) {\n return payload.exp - Math.floor(new Date().getTime() / 1000);\n }\n\n return fallbackValue || 3_600;\n}\n\nexport function buildOAuth2BearerTokenResponse(\n context: OAuth2BearerResponseBuildContext,\n) : OAuth2TokenGrantResponse {\n const response : OAuth2TokenGrantResponse = {\n access_token: context.accessToken,\n expires_in: resolveExpiresIn(context.accessTokenPayload),\n token_type: 'Bearer',\n };\n\n if (context.accessTokenPayload) {\n response.scope = context.accessTokenPayload.scope;\n } else if (context.scope) {\n response.scope = context.scope;\n }\n\n if (context.refreshToken) {\n response.refresh_token = context.refreshToken;\n response.refresh_token_expires_in = resolveExpiresIn(context.refreshTokenPayload);\n }\n\n if (context.idToken) {\n response.id_token = context.idToken;\n }\n\n return response;\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { OAuth2TokenGrantResponse, OAuth2TokenPayload } from '@authup/specs';\nimport { hasOAuth2Scopes } from '@authup/specs';\nimport type { OAuth2AuthorizationCode } from '@authup/core-kit';\nimport { ScopeName } from '@authup/core-kit';\nimport type { IOAuth2TokenIssuer } from '../token/index.ts';\nimport { OAuth2BaseGrant } from './base.ts';\nimport type { IOAuth2Grant, OAuth2AuthorizeGrantContext, OAuth2GrantRunWIthOptions } from './types.ts';\nimport type { OAuth2BearerResponseBuildContext } from '../response/index.ts';\nimport { buildOAuth2BearerTokenResponse } from '../response/index.ts';\n\nexport class OAuth2AuthorizeGrant extends OAuth2BaseGrant<OAuth2AuthorizationCode> implements IOAuth2Grant {\n protected refreshTokenIssuer : IOAuth2TokenIssuer;\n\n constructor(ctx: OAuth2AuthorizeGrantContext) {\n super({\n accessTokenIssuer: ctx.accessTokenIssuer,\n sessionManager: ctx.sessionManager,\n });\n\n this.refreshTokenIssuer = ctx.refreshTokenIssuer;\n }\n\n async runWith(\n authorizationCode: OAuth2AuthorizationCode,\n options: OAuth2GrantRunWIthOptions = {},\n ) : Promise<OAuth2TokenGrantResponse> {\n const session = await this.sessionManager.create({\n user_agent: options.userAgent,\n ip_address: options.ipAddress,\n realm_id: authorizationCode.realm_id,\n client_id: authorizationCode.client_id,\n sub_kind: authorizationCode.sub_kind,\n sub: authorizationCode.sub,\n });\n\n const issuePayload : Partial<OAuth2TokenPayload> = {\n user_agent: options.userAgent,\n remote_address: options.ipAddress,\n session_id: session.id,\n sub: authorizationCode.sub || undefined,\n sub_kind: authorizationCode.sub_kind,\n realm_id: authorizationCode.realm_id,\n realm_name: authorizationCode.realm_name,\n scope: authorizationCode.scope || undefined,\n client_id: authorizationCode.client_id || undefined,\n };\n\n const [accessToken, accessTokenPayload] = await this.accessTokenIssuer.issue(issuePayload);\n const [refreshToken, refreshTokenPayload] = await this.refreshTokenIssuer.issue(issuePayload);\n\n const buildContext : OAuth2BearerResponseBuildContext = {\n accessToken,\n accessTokenPayload,\n refreshToken,\n refreshTokenPayload,\n };\n\n if (\n authorizationCode.scope &&\n hasOAuth2Scopes(authorizationCode.scope, ScopeName.OPEN_ID)\n ) {\n buildContext.idToken = authorizationCode.id_token || undefined;\n }\n\n return buildOAuth2BearerTokenResponse(buildContext);\n }\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { OAuth2TokenGrantResponse } from '@authup/specs';\nimport { OAuth2SubKind } from '@authup/specs';\nimport type { Client } from '@authup/core-kit';\nimport {\n IdentityType,\n ScopeName,\n} from '@authup/core-kit';\nimport { OAuth2BaseGrant } from './base.ts';\nimport { buildOAuth2BearerTokenResponse } from '../response/index.ts';\nimport type { OAuth2GrantRunWIthOptions } from './types.ts';\n\nexport class ClientCredentialsGrant extends OAuth2BaseGrant<Client> {\n async runWith(input: Client, options: OAuth2GrantRunWIthOptions = {}) : Promise<OAuth2TokenGrantResponse> {\n const session = await this.sessionManager.create({\n user_agent: options.userAgent,\n ip_address: options.ipAddress,\n realm_id: input.realm_id,\n sub: input.id,\n sub_kind: IdentityType.CLIENT,\n });\n\n const [accessToken, accessTokenPayload] = await this.accessTokenIssuer.issue({\n user_agent: session.user_agent,\n remote_address: session.ip_address,\n session_id: session.id,\n scope: ScopeName.GLOBAL,\n sub: input.id,\n sub_kind: OAuth2SubKind.CLIENT,\n realm_id: input.realm.id,\n realm_name: input.realm.id,\n client_id: input.id,\n });\n\n return buildOAuth2BearerTokenResponse({\n accessToken,\n accessTokenPayload,\n });\n }\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { OAuth2TokenGrantResponse, OAuth2TokenPayload } from '@authup/specs';\nimport type { Identity, Session } from '@authup/core-kit';\nimport { ScopeName } from '@authup/core-kit';\nimport type { IOAuth2TokenIssuer } from '../token/index.ts';\nimport { OAuth2BaseGrant } from './base.ts';\nimport { buildOAuth2BearerTokenResponse } from '../response/index.ts';\nimport type { OAuth2GrantRunWIthOptions, OAuth2IdentityGrantContext } from './types.ts';\n\nexport class IdentityGrantType extends OAuth2BaseGrant<Identity> {\n protected refreshTokenIssuer : IOAuth2TokenIssuer;\n\n constructor(ctx: OAuth2IdentityGrantContext) {\n super({\n accessTokenIssuer: ctx.accessTokenIssuer,\n sessionManager: ctx.sessionManager,\n });\n\n this.refreshTokenIssuer = ctx.refreshTokenIssuer;\n }\n\n async runWith(\n identity: Identity,\n options: OAuth2GrantRunWIthOptions = {},\n ): Promise<OAuth2TokenGrantResponse> {\n const session : Partial<Session> = {\n user_agent: options.userAgent,\n ip_address: options.ipAddress,\n realm_id: identity.data.realm_id,\n sub: identity.data.id,\n sub_kind: identity.type,\n };\n\n const { id: sessionId } = await this.sessionManager.create(session);\n\n const issuePayload : Partial<OAuth2TokenPayload> = {\n session_id: sessionId,\n user_agent: session.user_agent,\n remote_address: session.ip_address,\n scope: ScopeName.GLOBAL,\n realm_id: identity.data.realm_id,\n realm_name: identity.data.realm?.name,\n sub: identity.data.id,\n sub_kind: identity.type,\n };\n\n const [accessToken, accessTokenPayload] = await this.accessTokenIssuer.issue(issuePayload);\n const [refreshToken, refreshTokenPayload] = await this.refreshTokenIssuer.issue(issuePayload);\n\n return buildOAuth2BearerTokenResponse({\n accessToken,\n accessTokenPayload,\n refreshToken,\n refreshTokenPayload,\n });\n }\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { OAuth2TokenGrantResponse, OAuth2TokenPayload } from '@authup/specs';\nimport { OAuth2SubKind } from '@authup/specs';\nimport type { User } from '@authup/core-kit';\nimport {\n IdentityType,\n ScopeName,\n} from '@authup/core-kit';\nimport { buildOAuth2BearerTokenResponse } from '../response/index.ts';\nimport type { IOAuth2TokenIssuer } from '../token/index.ts';\nimport { OAuth2BaseGrant } from './base.ts';\nimport type { OAuth2GrantRunWIthOptions, OAuth2PasswordGrantContext } from './types.ts';\n\nexport class PasswordGrantType extends OAuth2BaseGrant<User> {\n protected refreshTokenIssuer : IOAuth2TokenIssuer;\n\n constructor(ctx: OAuth2PasswordGrantContext) {\n super({\n accessTokenIssuer: ctx.accessTokenIssuer,\n sessionManager: ctx.sessionManager,\n });\n\n this.refreshTokenIssuer = ctx.refreshTokenIssuer;\n }\n\n async runWith(input: User, options: OAuth2GrantRunWIthOptions = {}) : Promise<OAuth2TokenGrantResponse> {\n const session = await this.sessionManager.create({\n user_agent: options.userAgent,\n ip_address: options.ipAddress,\n realm_id: input.realm_id,\n client_id: input.client_id || undefined,\n sub: input.id,\n sub_kind: IdentityType.USER,\n });\n\n const issuePayload : Partial<OAuth2TokenPayload> = {\n client_id: input.client_id || undefined,\n session_id: session.id,\n user_agent: session.user_agent,\n remote_address: session.ip_address,\n scope: ScopeName.GLOBAL,\n sub: input.id,\n sub_kind: OAuth2SubKind.USER,\n realm_id: input.realm_id,\n realm_name: input.realm?.name,\n };\n\n const [accessToken, accessTokenPayload] = await this.accessTokenIssuer.issue(issuePayload);\n const [refreshToken, refreshTokenPayload] = await this.refreshTokenIssuer.issue(issuePayload);\n\n return buildOAuth2BearerTokenResponse({\n accessToken,\n accessTokenPayload,\n refreshToken,\n refreshTokenPayload,\n });\n }\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { OAuth2TokenGrantResponse, OAuth2TokenPayload } from '@authup/specs';\nimport { JWTError } from '@authup/specs';\nimport { buildOAuth2BearerTokenResponse } from '../response/index.ts';\nimport type { IOAuth2TokenIssuer, IOAuth2TokenRevoker, IOAuth2TokenVerifier } from '../token/index.ts';\nimport { OAuth2BaseGrant } from './base.ts';\nimport type { IOAuth2Grant, OAuth2GrantRunWIthOptions, OAuth2RefreshTokenGrantContext } from './types.ts';\n\nexport class OAuth2RefreshTokenGrant extends OAuth2BaseGrant<string | OAuth2TokenPayload> implements IOAuth2Grant {\n protected refreshTokenIssuer : IOAuth2TokenIssuer;\n\n protected tokenVerifier : IOAuth2TokenVerifier;\n\n protected tokenRevoker : IOAuth2TokenRevoker;\n\n constructor(ctx: OAuth2RefreshTokenGrantContext) {\n super({\n accessTokenIssuer: ctx.accessTokenIssuer,\n sessionManager: ctx.sessionManager,\n });\n\n this.refreshTokenIssuer = ctx.refreshTokenIssuer;\n\n this.tokenVerifier = ctx.tokenVerifier;\n this.tokenRevoker = ctx.tokenRevoker;\n }\n\n async runWith(\n input: string | OAuth2TokenPayload,\n options: OAuth2GrantRunWIthOptions = {},\n ) : Promise<OAuth2TokenGrantResponse> {\n let payload : OAuth2TokenPayload;\n if (typeof input === 'string') {\n payload = await this.tokenVerifier.verify(input);\n } else {\n payload = input;\n }\n\n await this.tokenRevoker.revoke(payload);\n\n if (!payload.session_id) {\n throw JWTError.payloadPropertyInvalid('session_id');\n }\n\n const session = await this.sessionManager.findOneById(payload.session_id);\n if (!session) {\n throw JWTError.payloadPropertyInvalid('session_id');\n }\n\n await this.sessionManager.verify(session);\n\n if (options.userAgent) {\n session.user_agent = options.userAgent;\n }\n if (options.ipAddress) {\n session.ip_address = options.ipAddress;\n }\n await this.sessionManager.refresh(session);\n\n const [accessToken, accessTokenPayload] = await this.accessTokenIssuer.issue({\n ...payload,\n user_agent: session.user_agent,\n remote_address: session.ip_address,\n exp: this.accessTokenIssuer.buildExp(),\n });\n\n const [refreshToken, refreshTokenPayload] = await this.refreshTokenIssuer.issue({\n ...payload,\n user_agent: session.user_agent,\n remote_address: session.ip_address,\n exp: this.refreshTokenIssuer.buildExp(),\n });\n\n return buildOAuth2BearerTokenResponse({\n accessToken,\n accessTokenPayload,\n refreshToken,\n refreshTokenPayload,\n });\n }\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { OAuth2TokenGrantResponse } from '@authup/specs';\nimport { OAuth2SubKind } from '@authup/specs';\nimport type { Robot } from '@authup/core-kit';\nimport {\n IdentityType,\n ScopeName,\n} from '@authup/core-kit';\nimport { OAuth2BaseGrant } from './base.ts';\nimport { buildOAuth2BearerTokenResponse } from '../response/index.ts';\nimport type { OAuth2GrantRunWIthOptions } from './types.ts';\n\nexport class RobotCredentialsGrant extends OAuth2BaseGrant<Robot> {\n async runWith(input: Robot, options: OAuth2GrantRunWIthOptions = {}) : Promise<OAuth2TokenGrantResponse> {\n const session = await this.sessionManager.create({\n user_agent: options.userAgent,\n ip_address: options.ipAddress,\n realm_id: input.realm_id,\n sub: input.id,\n sub_kind: IdentityType.ROBOT,\n });\n\n const [accessToken, accessTokenPayload] = await this.accessTokenIssuer.issue({\n session_id: session.id,\n user_agent: session.user_agent,\n remote_address: session.ip_address,\n scope: ScopeName.GLOBAL,\n sub: input.id,\n sub_kind: OAuth2SubKind.ROBOT,\n realm_id: input.realm.id,\n realm_name: input.realm?.id,\n client_id: input.client_id || undefined,\n });\n\n return buildOAuth2BearerTokenResponse({\n accessToken,\n accessTokenPayload,\n });\n }\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type {\n Client, \n Identity, \n Robot, \n User,\n} from '@authup/core-kit';\nimport { hasOwnProperty } from '@authup/kit';\nimport type { OpenIDTokenPayload } from '@authup/specs';\nimport { OAuth2SubKind } from '@authup/specs';\nimport type { ObjectLiteral } from 'validup';\n\ntype AttributeMapTuple<T> = {\n [K in keyof T]: [K, (value: unknown) => any]\n}[keyof T];\n\ntype AttributeMap<T extends Record<string, any>> = Record<\n keyof OpenIDTokenPayload,\nkeyof T | AttributeMapTuple<T>\n>;\n\nexport class OAuth2OpenIDClaimsBuilder {\n protected clientMap : AttributeMap<Client> = {\n name: 'name',\n nickname: 'name',\n preferred_username: 'name',\n updated_at: [\n 'updated_at',\n (value: unknown) => {\n if (typeof value === 'string') {\n return Math.floor(new Date(value).getTime() / 1000);\n }\n\n if (value instanceof Date) {\n return Math.floor(value.getTime() / 1000);\n }\n\n return value;\n },\n ],\n };\n\n protected robotMap : AttributeMap<Robot> = {\n name: 'name',\n nickname: 'name',\n preferred_username: 'name',\n updated_at: [\n 'updated_at',\n (value: unknown) => {\n if (typeof value === 'string') {\n return Math.floor(new Date(value).getTime() / 1000);\n }\n\n if (value instanceof Date) {\n return Math.floor(value.getTime() / 1000);\n }\n\n return value;\n },\n ],\n };\n\n protected userMap : AttributeMap<User> = {\n name: 'name',\n family_name: 'last_name',\n given_name: 'first_name',\n nickname: 'display_name',\n preferred_username: 'display_name',\n updated_at: [\n 'updated_at',\n (value: unknown) => {\n if (typeof value === 'string') {\n return Math.floor(new Date(value).getTime() / 1000);\n }\n\n if (value instanceof Date) {\n return Math.floor(value.getTime() / 1000);\n }\n\n return value;\n },\n ],\n\n email: 'email',\n email_verified: 'active',\n };\n\n /**\n * Build OpenID Claims form Oauth2 Identity.\n *\n * @param identity\n */\n fromIdentity(identity: Identity) : OpenIDTokenPayload {\n if (identity.type === OAuth2SubKind.CLIENT) {\n return this.fromClient(identity.data);\n }\n\n if (identity.type === OAuth2SubKind.ROBOT) {\n return this.fromRobot(identity.data);\n }\n\n return this.fromUser(identity.data);\n }\n\n fromClient(input: Client) : OpenIDTokenPayload {\n return this.extract(this.clientMap, input);\n }\n\n fromRobot(input: Robot): OpenIDTokenPayload {\n return this.extract(this.robotMap, input);\n }\n\n fromUser(input: User) : OpenIDTokenPayload {\n return this.extract(this.userMap, input);\n }\n\n protected extract<T extends ObjectLiteral = ObjectLiteral>(\n attributeMap: AttributeMap<T>,\n attributes: T,\n ) : OpenIDTokenPayload {\n const result = {} as OpenIDTokenPayload;\n\n const keys = Object.keys(attributeMap);\n for (const key_ of keys) {\n const attribute = attributeMap[key_];\n if (typeof attribute === 'string') {\n if (hasOwnProperty(attributes, attribute)) {\n result[key_] = attributes[attribute];\n }\n } else {\n const [key, transformer] = attribute as AttributeMapTuple<T>;\n\n if (hasOwnProperty(attributes, key)) {\n result[key_] = transformer(attributes[key]);\n }\n }\n }\n\n return result;\n }\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Client, Robot, User } from '@authup/core-kit';\nimport { ScopeName } from '@authup/core-kit';\nimport { hasOwnProperty } from '@authup/kit';\nimport { OAuth2SubKind, unwrapOAuth2Scope } from '@authup/specs';\nimport { distinctArray } from 'smob';\nimport type { ObjectLiteral } from 'validup';\n\ntype ScopeFields<T extends ObjectLiteral = ObjectLiteral> = {\n [key: string]: (keyof T & string)[]\n};\n\nexport class OAuth2ScopeAttributesResolver {\n protected clientAttributes : ScopeFields<Client> = {\n [ScopeName.IDENTITY]: ['name'],\n [ScopeName.OPEN_ID]: ['name', 'display_name', 'updated_at', 'active'],\n };\n\n protected robotAttributes : ScopeFields<Robot> = {\n [ScopeName.IDENTITY]: ['name'],\n [ScopeName.OPEN_ID]: ['name', 'display_name', 'updated_at', 'active'],\n };\n\n protected userAttributes : ScopeFields<User> = {\n [ScopeName.IDENTITY]: ['name', 'display_name', 'last_name', 'first_name'],\n [ScopeName.EMAIL]: ['email'],\n [ScopeName.OPEN_ID]: ['name', 'updated_at', 'first_name', 'last_name', 'display_name', 'active', 'email'],\n };\n\n /**\n * Resolve attributes for sub kind.\n *\n * @param type\n * @param scope\n */\n resolveFor(type: OAuth2SubKind, scope: string | string[]) {\n if (type === OAuth2SubKind.CLIENT) {\n return this.resolveForClient(scope);\n }\n\n if (type === OAuth2SubKind.ROBOT) {\n return this.resolveForRobot(scope);\n }\n\n return this.resolveForUser(scope);\n }\n\n resolveForClient(scope: string | string[]) : string[] {\n const attributes : string[] = [];\n const scopes = unwrapOAuth2Scope(scope);\n\n for (const scope of scopes) {\n if (hasOwnProperty(this.clientAttributes, scope)) {\n attributes.push(...this.clientAttributes[scope]);\n }\n\n if (scope === ScopeName.GLOBAL) {\n attributes.push(...Object.values(this.clientAttributes).flat());\n break;\n }\n }\n\n return distinctArray(attributes);\n }\n\n resolveForRobot(scope: string | string[]) : string[] {\n const attributes : string[] = [];\n const scopes = unwrapOAuth2Scope(scope);\n\n for (const scope of scopes) {\n if (hasOwnProperty(this.robotAttributes, scope)) {\n attributes.push(...this.robotAttributes[scope]);\n }\n\n if (scope === ScopeName.GLOBAL) {\n attributes.push(...Object.values(this.robotAttributes).flat());\n break;\n }\n }\n\n return distinctArray(attributes);\n }\n\n resolveForUser(scope: string | string[]) : string[] {\n const attributes : string[] = [];\n const scopes = unwrapOAuth2Scope(scope);\n\n for (const scope of scopes) {\n if (hasOwnProperty(this.userAttributes, scope)) {\n attributes.push(...this.userAttributes[scope]);\n }\n\n if (scope === ScopeName.GLOBAL) {\n attributes.push(...Object.values(this.userAttributes).flat());\n break;\n }\n }\n\n return distinctArray(attributes);\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { OAuth2TokenPayload } from '@authup/specs';\nimport type { IOAuth2TokenIssuer, OAuth2TokenIssuerOptions, OAuth2TokenIssuerResponse } from './types.ts';\n\nexport abstract class OAuth2BaseTokenIssuer implements IOAuth2TokenIssuer {\n protected options: OAuth2TokenIssuerOptions;\n\n // ------------------------------------------------------------------\n\n protected constructor(options?: OAuth2TokenIssuerOptions) {\n this.options = options || {};\n }\n\n // ------------------------------------------------------------------\n\n abstract issue(input: OAuth2TokenPayload, options?: OAuth2TokenIssuerOptions): Promise<OAuth2TokenIssuerResponse>;\n\n // ------------------------------------------------------------------\n\n buildIss(input: OAuth2TokenPayload = {}) : string | undefined {\n if (!this.options.issuer) {\n return undefined;\n }\n\n if (input.realm_name) {\n return `${this.options.issuer}/realms/${input.realm_name}`;\n }\n\n return this.options.issuer;\n }\n\n /**\n * Build utc expire time (in seconds).\n *\n * @param input\n */\n buildExp(input: OAuth2TokenPayload = {}) : number {\n if (input.exp) {\n return input.exp;\n }\n\n const utc = Math.floor(new Date().getTime() / 1000);\n if (this.options.maxAge) {\n return utc + this.options.maxAge;\n }\n\n return utc + 3_600;\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { OAuth2TokenPayload } from '@authup/specs';\nimport { OAuth2TokenKind } from '@authup/specs';\nimport type { IOAuth2TokenSigner } from '../../signer/index.ts';\nimport type { IOAuth2TokenRepository } from '../../repository/index.ts';\nimport { OAuth2BaseTokenIssuer } from '../base.ts';\nimport type { IOAuth2TokenIssuer, OAuth2TokenIssuerOptions, OAuth2TokenIssuerResponse } from '../types.ts';\n\nexport class OAuth2AccessTokenIssuer extends OAuth2BaseTokenIssuer implements IOAuth2TokenIssuer {\n protected repository: IOAuth2TokenRepository;\n\n protected signer : IOAuth2TokenSigner;\n\n constructor(\n repository: IOAuth2TokenRepository,\n signer: IOAuth2TokenSigner,\n options: OAuth2TokenIssuerOptions = {},\n ) {\n super(options);\n\n this.repository = repository;\n this.signer = signer;\n }\n\n async issue(input: OAuth2TokenPayload = {}) : Promise<OAuth2TokenIssuerResponse> {\n const iss = this.buildIss(input);\n\n const data = await this.repository.insert({\n ...input,\n kind: OAuth2TokenKind.ACCESS,\n exp: this.buildExp(input),\n ...(iss ? { iss } : {}),\n });\n\n const token = await this.signer.sign(data);\n\n await this.repository.saveWithSignature(data, token);\n\n return [token, data];\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { OAuth2TokenPayload } from '@authup/specs';\nimport { JWTError, OAuth2TokenKind } from '@authup/specs';\nimport type { Identity } from '@authup/core-kit';\nimport { OAuth2OpenIDClaimsBuilder } from '../../../openid/index.ts';\nimport type { IOAuth2TokenSigner } from '../../signer/index.ts';\nimport type { IOAuth2TokenRepository } from '../../repository/index.ts';\nimport { OAuth2BaseTokenIssuer } from '../base.ts';\nimport type { OAuth2TokenIssuerResponse } from '../types.ts';\nimport type { IOAuth2OpenIDTokenIssuer, OAuth2OpenIDTokenIssuerContext } from './types.ts';\nimport type { IIdentityResolver } from '../../../../identity/index.ts';\n\nexport class OAuth2OpenIDTokenIssuer extends OAuth2BaseTokenIssuer implements IOAuth2OpenIDTokenIssuer {\n protected repository: IOAuth2TokenRepository;\n\n protected signer : IOAuth2TokenSigner;\n\n protected identityResolver : IIdentityResolver;\n\n protected claimsBuilder: OAuth2OpenIDClaimsBuilder;\n\n constructor(ctx: OAuth2OpenIDTokenIssuerContext) {\n super(ctx.options);\n\n this.repository = ctx.repository;\n this.signer = ctx.signer;\n\n this.identityResolver = ctx.identityResolver;\n this.claimsBuilder = new OAuth2OpenIDClaimsBuilder();\n }\n\n async issue(input: OAuth2TokenPayload = {}) : Promise<OAuth2TokenIssuerResponse> {\n if (!input.sub_kind) {\n throw JWTError.payloadPropertyInvalid('sub_kind');\n }\n\n if (!input.sub) {\n throw JWTError.payloadPropertyInvalid('sub');\n }\n\n const identity = await this.identityResolver.resolve(\n input.sub_kind,\n input.sub,\n );\n\n if (!identity) {\n throw JWTError.payloadInvalid();\n }\n\n return this.issueWithIdentity(input, identity);\n }\n\n async issueWithIdentity(\n input: OAuth2TokenPayload,\n identity: Identity,\n ): Promise<OAuth2TokenIssuerResponse> {\n const claims = this.claimsBuilder.fromIdentity(identity);\n\n const utc = Math.floor(new Date().getTime() / 1000);\n\n const iss = this.buildIss(input);\n\n const data = await this.repository.insert({\n ...input,\n ...claims,\n kind: OAuth2TokenKind.ID_TOKEN,\n auth_time: utc,\n exp: this.buildExp(input),\n updated_at: utc,\n ...(iss ? { iss } : {}),\n ...(input.client_id ? { aud: input.client_id } : {}),\n });\n\n const token = await this.signer.sign(data);\n\n await this.repository.saveWithSignature(data, token);\n\n return [token, data];\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { OAuth2TokenPayload } from '@authup/specs';\nimport { OAuth2TokenKind } from '@authup/specs';\nimport type { IOAuth2TokenSigner } from '../../signer/index.ts';\nimport type { IOAuth2TokenRepository } from '../../repository/index.ts';\nimport { OAuth2BaseTokenIssuer } from '../base.ts';\nimport type { IOAuth2TokenIssuer, OAuth2TokenIssuerOptions, OAuth2TokenIssuerResponse } from '../types.ts';\n\nexport class OAuth2RefreshTokenIssuer extends OAuth2BaseTokenIssuer implements IOAuth2TokenIssuer {\n protected repository: IOAuth2TokenRepository;\n\n protected signer : IOAuth2TokenSigner;\n\n constructor(\n repository: IOAuth2TokenRepository,\n signer: IOAuth2TokenSigner,\n options: OAuth2TokenIssuerOptions = {},\n ) {\n super(options);\n\n this.repository = repository;\n this.signer = signer;\n }\n\n async issue(input: OAuth2TokenPayload = {}) : Promise<OAuth2TokenIssuerResponse> {\n const iss = this.buildIss(input);\n\n const data = await this.repository.insert({\n ...input,\n kind: OAuth2TokenKind.REFRESH,\n exp: this.buildExp(input),\n ...(iss ? { iss } : {}),\n });\n\n const token = await this.signer.sign(data);\n\n await this.repository.saveWithSignature(data, token);\n\n return [token, data];\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { OAuth2TokenPayload } from '@authup/specs';\nimport { JWTError } from '@authup/specs';\nimport type { IOAuth2TokenRepository } from '../repository/index.ts';\nimport type { IOAuth2TokenRevoker } from './types.ts';\n\nexport class OAuth2TokenRevoker implements IOAuth2TokenRevoker {\n protected repository : IOAuth2TokenRepository;\n\n constructor(repository : IOAuth2TokenRepository) {\n this.repository = repository;\n }\n\n async revoke(input: OAuth2TokenPayload) : Promise<void> {\n if (!input.jti) {\n throw JWTError.payloadPropertyInvalid('jti');\n }\n\n await this.repository.removeById(input.jti);\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { type TokenECAlgorithm, type TokenRSAAlgorithm, signToken } from '@authup/server-kit';\nimport type { OAuth2TokenPayload } from '@authup/specs';\nimport { JWKError, JWKType } from '@authup/specs';\nimport type { IOAuth2KeyRepository } from '../../key/index.ts';\nimport type { IOAuth2TokenSigner } from './types.ts';\n\nexport class OAuth2TokenSigner implements IOAuth2TokenSigner {\n protected keyRepository : IOAuth2KeyRepository;\n\n constructor(keyRepository : IOAuth2KeyRepository) {\n this.keyRepository = keyRepository;\n }\n\n async sign<T extends OAuth2TokenPayload>(payload: T) : Promise<string> {\n if (!payload.realm_id) {\n throw JWKError.invalidRealm();\n }\n\n const key = await this.keyRepository.findByRealmId(payload.realm_id);\n if (!key) {\n throw JWKError.notFoundForRealm(payload.realm_id, payload.realm_name);\n }\n\n if (!key.decryption_key) {\n throw JWKError.decryptionKeyMissing();\n }\n\n let token : string;\n if (key.type === JWKType.OCT) {\n token = await signToken(\n payload,\n {\n type: JWKType.OCT,\n key: key.decryption_key,\n keyId: key.id,\n },\n );\n } else if (key.type === JWKType.EC) {\n token = await signToken(\n payload,\n {\n type: key.type,\n key: key.decryption_key,\n algorithm: key.signature_algorithm as TokenECAlgorithm,\n keyId: key.id,\n },\n );\n } else {\n token = await signToken(\n payload,\n {\n type: key.type,\n key: key.decryption_key,\n algorithm: key.signature_algorithm as TokenRSAAlgorithm,\n keyId: key.id,\n },\n );\n }\n\n return token;\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n type TokenECAlgorithm, \n type TokenRSAAlgorithm, \n extractTokenHeader, \n verifyToken,\n} from '@authup/server-kit';\nimport type { OAuth2TokenPayload } from '@authup/specs';\nimport { JWKError, JWKType, JWTError } from '@authup/specs';\nimport type { IOAuth2KeyRepository } from '../../key/index.ts';\nimport type { IOAuth2TokenRepository } from '../repository/types.ts';\nimport type { IOAuth2TokenVerifier, OAuth2TokenVerifyOptions } from './types.ts';\n\nexport class OAuth2TokenVerifier implements IOAuth2TokenVerifier {\n protected keyRepository : IOAuth2KeyRepository;\n\n protected tokenRepository : IOAuth2TokenRepository;\n\n constructor(\n keyRepository : IOAuth2KeyRepository,\n tokenRepository : IOAuth2TokenRepository,\n ) {\n this.keyRepository = keyRepository;\n this.tokenRepository = tokenRepository;\n }\n\n async isInactive(id: string): Promise<boolean> {\n return this.tokenRepository.isInactive(id);\n }\n\n async verify(token: string, options: OAuth2TokenVerifyOptions = {}) : Promise<OAuth2TokenPayload> {\n let payload = await this.tokenRepository.findOneBySignature(token);\n if (payload) {\n if (!payload.jti) {\n throw JWTError.payloadPropertyInvalid('jti');\n }\n\n if (!options.skipActiveCheck) {\n const isInactive = await this.isInactive(payload.jti);\n if (isInactive) {\n throw JWTError.notActive();\n }\n }\n\n return payload;\n }\n\n const header = extractTokenHeader(token);\n if (!header.kid) {\n throw JWTError.headerPropertyInvalid('kid');\n }\n\n const key = await this.keyRepository.findById(header.kid);\n if (!key) {\n throw JWKError.notFound(header.kid);\n }\n\n switch (key.type) {\n case JWKType.OCT: {\n if (!key.decryption_key) {\n throw JWKError.decryptionKeyMissing();\n }\n\n payload = await verifyToken(\n token,\n {\n type: JWKType.OCT,\n key: key.decryption_key,\n },\n );\n break;\n }\n case JWKType.EC: {\n if (!key.encryption_key) {\n throw JWKError.decryptionKeyMissing();\n }\n\n payload = await verifyToken(\n token,\n {\n type: key.type,\n key: key.encryption_key,\n ...(\n key.signature_algorithm ?\n { algorithms: [key.signature_algorithm] } :\n []\n ) as TokenECAlgorithm[],\n },\n );\n break;\n }\n default: {\n if (!key.encryption_key) {\n throw JWKError.decryptionKeyMissing();\n }\n\n payload = await verifyToken(\n token,\n {\n type: key.type,\n key: key.encryption_key,\n ...(\n key.signature_algorithm ?\n { algorithms: [key.signature_algorithm] } :\n []\n ) as TokenRSAAlgorithm[],\n },\n );\n }\n }\n\n if (!payload.jti) {\n throw JWTError.payloadPropertyInvalid('jti');\n }\n\n await this.tokenRepository.saveWithSignature(payload, token);\n\n if (!options.skipActiveCheck) {\n const isInactive = await this.isInactive(payload.jti);\n if (isInactive) {\n throw JWTError.notActive();\n }\n }\n\n return payload;\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { BadRequestError, NotFoundError } from '@ebec/http';\nimport { createValidationChain, createValidator } from '@validup/adapter-validator';\nimport { randomBytes } from 'node:crypto';\nimport { Container } from 'validup';\nimport { UserCredentialsService } from '../../authentication/credential/entities/user/module.ts';\nimport type {\n IPasswordRecoveryService,\n PasswordForgotResult,\n PasswordRecoveryServiceContext,\n PasswordRecoveryServiceOptions,\n PasswordResetResult,\n} from './types.ts';\nimport type { IMailClient } from '../../mail/types.ts';\nimport type { IRealmRepository, IUserRepository } from '../../entities/index.ts';\n\nexport class PasswordRecoveryService implements IPasswordRecoveryService {\n protected options: PasswordRecoveryServiceOptions;\n\n protected repository: IUserRepository;\n\n protected realmRepository: IRealmRepository;\n\n protected mailClient: IMailClient;\n\n constructor(ctx: PasswordRecoveryServiceContext) {\n this.options = ctx.options;\n this.repository = ctx.repository;\n this.realmRepository = ctx.realmRepository;\n this.mailClient = ctx.mailClient;\n }\n\n async forgotPassword(data: Record<string, any>): Promise<PasswordForgotResult> {\n if (!this.options.passwordRecoveryEnabled) {\n throw new BadRequestError('Password recovery is not enabled.');\n }\n\n if (!this.options.emailVerificationEnabled) {\n throw new BadRequestError('Email verification is not enabled, but required to reset a password.');\n }\n\n const validated = await this.runForgotPasswordValidator(data);\n\n const realm = await this.realmRepository.resolve(validated.realm_id, true);\n\n const where: Record<string, any> = {\n ...(validated.name ? { name: validated.name } : {}),\n ...(validated.email ? { email: validated.email } : {}),\n realm_id: realm.id,\n };\n\n const entity = await this.repository.findOneByWithEmail(where);\n\n if (!entity) {\n throw new NotFoundError();\n }\n\n const merged = this.repository.merge(entity, {\n reset_expires: new Date(Date.now() + (1000 * 60 * 30)).toISOString(),\n reset_hash: randomBytes(32).toString('hex'),\n });\n\n await this.repository.save(merged);\n\n try {\n await this.mailClient.send({\n to: entity.email,\n subject: 'Forgot Password - Reset code',\n html: `\n <p>Please use the code below to reset your account password.</p>\n <p>${merged.reset_hash}</p>\n `,\n });\n } catch {\n this.repository.merge(merged, {\n reset_hash: null,\n reset_expires: null,\n });\n await this.repository.save(merged);\n\n throw new BadRequestError('Password recovery failed. Could not send reset email.');\n }\n\n return { reset_expires: merged.reset_expires! };\n }\n\n async resetPassword(data: Record<string, any>): Promise<PasswordResetResult> {\n if (!this.options.passwordRecoveryEnabled) {\n throw new BadRequestError('Password recovery is not enabled.');\n }\n\n const validated = await this.runResetPasswordValidator(data);\n\n await this.repository.validateJoinColumns(validated);\n\n const realm = await this.realmRepository.resolve(validated.realm_id, true);\n\n const where: Record<string, any> = {\n ...(validated.name ? { name: validated.name } : {}),\n ...(validated.email ? { email: validated.email } : {}),\n reset_hash: validated.token,\n realm_id: realm.id,\n };\n\n const entity = await this.repository.findOneBy(where);\n if (!entity) {\n throw new NotFoundError();\n }\n\n if (!entity.reset_expires || new Date(entity.reset_expires) < new Date()) {\n throw new BadRequestError('Reset token has expired.');\n }\n\n const credentialsService = new UserCredentialsService();\n const hashedPassword = await credentialsService.protect(validated.password);\n\n const merged = this.repository.merge(entity, {\n reset_at: new Date().toISOString(),\n reset_hash: null,\n reset_expires: null,\n password: hashedPassword,\n });\n\n await this.repository.save(merged);\n\n return { reset_at: merged.reset_at! };\n }\n\n private async runForgotPasswordValidator(data: Record<string, any>) {\n const validator = new Container<any>({});\n\n const oneOfContainer = new Container({ oneOf: true });\n\n oneOfContainer.mount('email', createValidator(() => {\n const chain = createValidationChain();\n return chain\n .exists()\n .notEmpty()\n .isEmail();\n }));\n\n oneOfContainer.mount(\n 'name',\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .exists()\n .notEmpty()\n .isString();\n }),\n );\n\n validator.mount(oneOfContainer);\n\n validator.mount(\n 'realm_id',\n { optional: true },\n createValidator(() => {\n const chain = createValidationChain();\n return chain.exists()\n .isUUID()\n .optional({ values: 'null' });\n }),\n );\n\n return validator.run(data);\n }\n\n private async runResetPasswordValidator(data: Record<string, any>) {\n const validator = new Container<any>({});\n\n const oneOfContainer = new Container({ oneOf: true });\n oneOfContainer.mount(\n 'email',\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .exists()\n .notEmpty()\n .isEmail();\n }),\n );\n oneOfContainer.mount(\n 'name',\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .exists()\n .notEmpty()\n .isString();\n }),\n );\n\n validator.mount(oneOfContainer);\n\n validator.mount(\n 'realm_id',\n { optional: true },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .exists()\n .isUUID()\n .optional({ values: 'null' });\n }),\n );\n\n validator.mount(\n 'token',\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .exists()\n .notEmpty()\n .isLength({\n min: 3,\n max: 256, \n });\n }),\n );\n\n validator.mount(\n 'password',\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .exists()\n .notEmpty()\n .isLength({\n min: 5,\n max: 512, \n });\n }),\n );\n\n return validator.run(data);\n }\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type {\n IdentityPolicyData,\n PermissionPolicyBinding,\n} from '@authup/access';\nimport { isPermissionPolicyBindingEqual, mergePermissionPolicyBindings } from '@authup/access';\nimport type { Policy } from '@authup/core-kit';\nimport { isPolicy } from '@authup/core-kit';\nimport type {\n IIdentityBindingRepository,\n IIdentityPermissionProvider,\n IRoleBindingRepository,\n IdentityPermissionProviderContext,\n ResolveJunctionPolicyOptions,\n} from './types.ts';\n\nexport class IdentityPermissionProvider implements IIdentityPermissionProvider {\n protected clientRepository: IIdentityBindingRepository;\n\n protected userRepository: IIdentityBindingRepository;\n\n protected roleRepository: IRoleBindingRepository;\n\n protected robotRepository: IIdentityBindingRepository;\n\n constructor(ctx: IdentityPermissionProviderContext) {\n this.clientRepository = ctx.clientRepository;\n this.userRepository = ctx.userRepository;\n this.roleRepository = ctx.roleRepository;\n this.robotRepository = ctx.robotRepository;\n }\n\n async isSuperset(parent: IdentityPolicyData, child: IdentityPolicyData) : Promise<boolean> {\n const parentBindings = await this.getFor(parent);\n const childBindings = await this.getFor(child);\n\n const parentMerged = mergePermissionPolicyBindings(parentBindings);\n const childMerged = mergePermissionPolicyBindings(childBindings);\n\n for (const childItem of childMerged) {\n const parentItem = parentMerged.find(\n (p) => isPermissionPolicyBindingEqual(p, childItem),\n );\n\n if (!parentItem) {\n return false;\n }\n\n if (\n parentItem.policies && parentItem.policies.length > 0 &&\n (!childItem.policies || childItem.policies.length === 0)\n ) {\n return false;\n }\n }\n\n return true;\n }\n\n async resolveJunctionPolicy(\n identity: IdentityPolicyData,\n options: ResolveJunctionPolicyOptions,\n ): Promise<Policy | undefined> {\n const bindings = await this.getFor(identity);\n const matching = bindings.filter((b) => {\n if (b.permission.name !== options.name) {\n return false;\n }\n\n if (typeof options.realmId !== 'undefined') {\n if ((b.permission.realm_id ?? null) !== (options.realmId ?? null)) {\n return false;\n }\n }\n\n if (typeof options.clientId !== 'undefined') {\n if ((b.permission.client_id ?? null) !== (options.clientId ?? null)) {\n return false;\n }\n }\n\n return true;\n });\n\n if (matching.length === 0) {\n return undefined;\n }\n\n const merged = mergePermissionPolicyBindings(matching);\n\n if (merged.length > 0 && merged[0].policies && merged[0].policies.length > 0) {\n const policy = merged[0].policies[0];\n if (isPolicy(policy)) {\n return policy;\n }\n }\n\n return undefined;\n }\n\n async getFor(identity: IdentityPolicyData) : Promise<PermissionPolicyBinding[]> {\n switch (identity.type) {\n case 'client': {\n return this.getForClient(identity);\n }\n case 'user': {\n return this.getForUser(identity);\n }\n case 'robot': {\n return this.getForRobot(identity);\n }\n case 'role': {\n return this.getForRole(identity);\n }\n }\n\n return [];\n }\n\n async getForClient(identity: IdentityPolicyData) : Promise<PermissionPolicyBinding[]> {\n const bindings = await this.clientRepository.getBoundPermissions(identity.id);\n const roles = await this.clientRepository.getBoundRoles(identity.id);\n const roleBindings = await this.roleRepository.getBoundPermissionsForMany(roles);\n if (roleBindings.length === 0) {\n return bindings;\n }\n\n return [\n ...bindings,\n ...roleBindings,\n ];\n }\n\n async getForUser(identity: IdentityPolicyData) : Promise<PermissionPolicyBinding[]> {\n const bindings = await this.userRepository.getBoundPermissions(identity.id)\n .then((data) => this.reduceBindingsByIdentityClient(data, identity));\n\n const roles = await this.userRepository.getBoundRoles(identity.id)\n .then((data) => this.reduceEntitiesByIdentityClient(data, identity));\n\n const roleBindings = await this.roleRepository.getBoundPermissionsForMany(roles);\n if (roleBindings.length === 0) {\n return bindings;\n }\n\n return [\n ...bindings,\n ...roleBindings,\n ];\n }\n\n async getForRobot(identity: IdentityPolicyData) : Promise<PermissionPolicyBinding[]> {\n const bindings = await this.robotRepository.getBoundPermissions(identity.id)\n .then((data) => this.reduceBindingsByIdentityClient(data, identity));\n\n const roles = await this.robotRepository.getBoundRoles(identity.id)\n .then((data) => this.reduceEntitiesByIdentityClient(data, identity));\n\n const roleBindings = await this.roleRepository.getBoundPermissionsForMany(roles);\n if (roleBindings.length === 0) {\n return bindings;\n }\n\n return [\n ...bindings,\n ...roleBindings,\n ];\n }\n\n async getForRole(identity: IdentityPolicyData) : Promise<PermissionPolicyBinding[]> {\n return this.roleRepository.getBoundPermissions(identity.id)\n .then((data) => this.reduceBindingsByIdentityClient(data, identity));\n }\n\n private reduceBindingsByIdentityClient(\n bindings: PermissionPolicyBinding[],\n identity: IdentityPolicyData,\n ): PermissionPolicyBinding[] {\n if (!identity.clientId) {\n return bindings;\n }\n\n return bindings.filter((binding) => binding.permission.client_id === identity.clientId);\n }\n\n private reduceEntitiesByIdentityClient<T extends { client_id?: string | null }>(\n entities: T[],\n identity: IdentityPolicyData,\n ): T[] {\n if (!identity.clientId) {\n return entities;\n }\n\n return entities.filter((entity) => entity.client_id === identity.clientId);\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport enum IdentityProviderIdentityOperation {\n CREATE = 'create',\n UPDATE = 'update',\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport enum IdentityProviderMapperOperation {\n NONE = 'none',\n DELETE = 'delete',\n CREATE = 'create',\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { IdentityProviderBaseMapping } from '@authup/core-kit';\nimport { IdentityProviderMappingSyncMode } from '@authup/core-kit';\nimport { getJWTClaimByPattern } from '@authup/specs';\nimport { IdentityProviderIdentityOperation } from '../constants.ts';\nimport type { IdentityProviderIdentity } from '../types.ts';\nimport { IdentityProviderMapperOperation } from './constants.ts';\nimport type { IIdentityProviderMapper, IdentityProviderMapperElement } from './types.ts';\n\nexport abstract class IdentityProviderAccountBaseMapper implements IIdentityProviderMapper {\n protected resolve(\n identity: IdentityProviderIdentity,\n mapping: IdentityProviderBaseMapping,\n ) : [IdentityProviderMapperOperation, unknown] | [IdentityProviderMapperOperation] {\n let operation : IdentityProviderMapperOperation;\n if (\n mapping.synchronization_mode === IdentityProviderMappingSyncMode.ONCE &&\n identity.operation === IdentityProviderIdentityOperation.UPDATE\n ) {\n operation = IdentityProviderMapperOperation.NONE;\n\n return [operation];\n }\n\n if (!mapping.name || !mapping.value) {\n operation = IdentityProviderMapperOperation.CREATE;\n\n return [operation];\n }\n\n const value = getJWTClaimByPattern(\n identity.data,\n mapping.name,\n mapping.value,\n mapping.value_is_regex,\n );\n\n if (value.length === 0) {\n operation = IdentityProviderMapperOperation.DELETE;\n } else {\n operation = IdentityProviderMapperOperation.CREATE;\n }\n\n return [operation, value];\n }\n\n abstract execute(\n identity: IdentityProviderIdentity\n ): Promise<IdentityProviderMapperElement[]>;\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\nimport type { IdentityProviderIdentity } from '../../types.ts';\nimport { IdentityProviderAccountBaseMapper } from '../base.ts';\nimport type { IdentityProviderMapperElement } from '../types.ts';\nimport type { IIdentityProviderAttributeMappingRepository } from './types.ts';\n\nexport class IdentityProviderAttributeMapper extends IdentityProviderAccountBaseMapper {\n protected repository: IIdentityProviderAttributeMappingRepository;\n\n constructor(repository: IIdentityProviderAttributeMappingRepository) {\n super();\n\n this.repository = repository;\n }\n\n async execute(identity: IdentityProviderIdentity): Promise<IdentityProviderMapperElement[]> {\n const entities = await this.repository.findByProviderId(identity.provider.id);\n\n const items : IdentityProviderMapperElement[] = [];\n for (const entity of entities) {\n const [operation, value] = this.resolve(identity, entity);\n\n items.push({\n key: entity.target_name,\n value: entity.target_value ? entity.target_value : value,\n realmId: entity.provider_realm_id,\n operation,\n });\n }\n\n return items;\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { IdentityProviderIdentity } from '../../types.ts';\nimport { IdentityProviderAccountBaseMapper } from '../base.ts';\nimport type { IdentityProviderMapperElement } from '../types.ts';\nimport type { IIdentityProviderRoleMappingFinder } from './types.ts';\n\nexport class IdentityProviderRoleMapper extends IdentityProviderAccountBaseMapper {\n protected finder: IIdentityProviderRoleMappingFinder;\n\n constructor(finder: IIdentityProviderRoleMappingFinder) {\n super();\n\n this.finder = finder;\n }\n\n async execute(identity: IdentityProviderIdentity): Promise<IdentityProviderMapperElement[]> {\n const entities = await this.finder.findByProviderId(identity.provider.id);\n\n const items : IdentityProviderMapperElement[] = [];\n for (const entity of entities) {\n const [operation] = this.resolve(identity, entity);\n\n items.push({\n value: entity.role_id,\n realmId: entity.role_realm_id,\n operation,\n });\n }\n\n return items;\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { IdentityProviderIdentity } from '../../types.ts';\nimport { IdentityProviderAccountBaseMapper } from '../base.ts';\nimport type { IdentityProviderMapperElement } from '../types.ts';\nimport type { IIdentityProviderPermissionMappingRepository } from './types.ts';\n\nexport class IdentityProviderPermissionMapper extends IdentityProviderAccountBaseMapper {\n protected repository: IIdentityProviderPermissionMappingRepository;\n\n constructor(repository: IIdentityProviderPermissionMappingRepository) {\n super();\n\n this.repository = repository;\n }\n\n async execute(identity: IdentityProviderIdentity): Promise<IdentityProviderMapperElement[]> {\n const entities = await this.repository.findByProviderId(identity.provider.id);\n\n const items : IdentityProviderMapperElement[] = [];\n for (const entity of entities) {\n const [operation] = this.resolve(identity, entity);\n\n items.push({\n value: entity.permission_id,\n realmId: entity.permission_realm_id,\n operation,\n });\n }\n\n return items;\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { IdentityProviderAccount, User } from '@authup/core-kit';\nimport {\n UserValidator, \n ValidatorGroup,\n buildUserFakeEmail, \n isUserFakeEmail,\n} from '@authup/core-kit';\nimport { createNanoID, extendObject } from '@authup/kit';\nimport { isValidupError, stringifyPath } from 'validup';\nimport type { IUserIdentityRepository } from '../../entities/index.ts';\nimport { IdentityProviderIdentityOperation } from '../constants.ts';\nimport type { IIdentityProviderMapper } from '../mapper/index.ts';\nimport { IdentityProviderMapperOperation } from '../mapper/index.ts';\nimport type { IdentityProviderIdentity } from '../types.ts';\nimport type { IIdentityProviderAccountManager, IIdentityProviderAccountRepository, IdentityProviderAccountManagerContext } from './types.ts';\n\nexport class IdentityProviderAccountManager implements IIdentityProviderAccountManager {\n protected attributesMapper : IIdentityProviderMapper;\n\n protected permissionMapper : IIdentityProviderMapper;\n\n protected roleMapper : IIdentityProviderMapper;\n\n protected repository : IIdentityProviderAccountRepository;\n\n protected userRepository: IUserIdentityRepository;\n\n protected userValidator : UserValidator;\n\n constructor(ctx: IdentityProviderAccountManagerContext) {\n this.attributesMapper = ctx.attributeMapper;\n this.permissionMapper = ctx.permissionMapper;\n this.roleMapper = ctx.roleMapper;\n this.repository = ctx.repository;\n this.userRepository = ctx.userRepository;\n\n this.userValidator = new UserValidator();\n }\n\n async save(identity: IdentityProviderIdentity): Promise<IdentityProviderAccount> {\n let account = await this.repository.findOneByProviderIdentity(identity);\n if (account) {\n identity.operation = IdentityProviderIdentityOperation.UPDATE;\n\n account.user = await this.saveUser(identity, account.user);\n\n await this.repository.save(account);\n\n await this.saveRoles(identity, account.user);\n await this.savePermissions(identity, account.user);\n\n return account;\n }\n\n identity.operation = IdentityProviderIdentityOperation.CREATE;\n\n const user = await this.saveUser(identity);\n\n account = await this.repository.save({\n provider_id: identity.provider.id,\n provider_user_id: identity.id,\n provider_user_name: user.name, // todo: parse identity.name\n provider_realm_id: identity.provider.realm_id,\n user,\n user_id: user.id,\n user_realm_id: user.realm_id,\n });\n\n await this.saveRoles(identity, account.user);\n await this.savePermissions(identity, account.user);\n\n return account;\n }\n\n async saveUser(\n identity: IdentityProviderIdentity,\n user?: User,\n ): Promise<User> {\n const attributes = await this.attributesMapper.execute(\n identity,\n );\n\n const entity : Record<string, any> = {};\n for (const attribute of attributes) {\n if (\n attribute.key &&\n attribute.operation === IdentityProviderMapperOperation.CREATE\n ) {\n // attribute value might be object, array, ...\n entity[attribute.key] = attribute.value;\n }\n }\n\n if (!user) {\n entity.realm_id = identity.provider.realm_id;\n entity.active = true;\n entity.name_locked = true;\n entity.client_id = identity.clientId || null;\n }\n\n const attributesSelf = await this.validateAttributes(entity, identity, 10);\n if (!attributesSelf) {\n // todo: better error name\n throw new Error('Identity provider attributes could not be validated.');\n }\n const attributesSelfKeys = Object.keys(attributesSelf);\n\n const attributesExtra : Record<string, any> = {};\n\n const entityKeys = Object.keys(entity);\n for (const entityKey of entityKeys) {\n const index = attributesSelfKeys.indexOf(entityKey);\n if (index !== -1) {\n continue;\n }\n\n attributesExtra[entityKey] = entity[entityKey];\n }\n\n let output : User;\n if (user) {\n output = extendObject(user, attributesSelf);\n } else {\n output = attributesSelf;\n }\n\n let attempts = Math.max((identity.attributeCandidates?.name?.length || 0) + 1, 10);\n while (attempts > 0) {\n try {\n // todo: we also need to remove existing ones via idp login flow ( but not other attributes!)\n return await this.userRepository.saveOneWithEA(output, attributesExtra);\n } catch {\n const names = identity.attributeCandidates?.name || [];\n if (names.length > 0) {\n while (names.length > 0) {\n output.name = `${names.shift()}`;\n\n try {\n await this.userValidator.run(output, {\n group: identity.operation === IdentityProviderIdentityOperation.CREATE ?\n ValidatorGroup.CREATE :\n ValidatorGroup.UPDATE,\n });\n break;\n } catch {\n // todo: do nothing.\n }\n }\n } else {\n output.name = createNanoID('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_', 10);\n }\n\n if (isUserFakeEmail(output.email)) {\n output.email = buildUserFakeEmail(output.name);\n }\n\n attempts -= 1;\n }\n }\n\n throw new Error('The user account could not be created due a conflict error.');\n }\n\n async validateAttributes(\n entity: Record<string, any>,\n identity: IdentityProviderIdentity,\n attempts: number,\n ) : Promise<User | null> {\n attempts--;\n if (attempts <= 0) {\n return null;\n }\n\n try {\n return await this.userValidator.run(entity, {\n group: identity.operation === IdentityProviderIdentityOperation.CREATE ?\n ValidatorGroup.CREATE :\n ValidatorGroup.UPDATE,\n });\n } catch (e: any) {\n if (!isValidupError(e)) {\n return null;\n }\n\n let retry = false;\n for (let i = 0; i < e.issues.length; i++) {\n const child = e.issues[i];\n\n const pathNormalized = stringifyPath(child.path);\n\n if (\n Array.isArray(entity[pathNormalized]) &&\n entity[pathNormalized].length > 0\n ) {\n const [first, ...rest] = entity[pathNormalized];\n entity[pathNormalized] = first;\n\n if (rest.length > 0) {\n if (!identity.attributeCandidates) {\n identity.attributeCandidates = {};\n }\n\n if (!identity.attributeCandidates[pathNormalized]) {\n identity.attributeCandidates[pathNormalized] = [];\n }\n\n identity.attributeCandidates[pathNormalized]!.push(...rest);\n }\n\n retry = true;\n break;\n }\n\n if (\n identity.attributeCandidates &&\n identity.attributeCandidates[pathNormalized] &&\n identity.attributeCandidates[pathNormalized]!.length > 0\n ) {\n entity[pathNormalized] = identity.attributeCandidates[pathNormalized]!.shift();\n retry = true;\n break;\n }\n\n if (\n entity.name &&\n pathNormalized === 'email'\n ) {\n entity[pathNormalized] = buildUserFakeEmail(entity.name);\n retry = true;\n break;\n }\n\n if (entity[pathNormalized]) {\n entity[pathNormalized] = null;\n break;\n }\n }\n\n if (retry) {\n return this.validateAttributes(entity, identity, attempts);\n }\n\n return null;\n }\n }\n\n async savePermissions(\n identity: IdentityProviderIdentity,\n user: User,\n ) {\n const entities = await this.permissionMapper.execute(identity);\n\n await this.userRepository.savePermissions(user, entities);\n }\n\n async saveRoles(\n identity: IdentityProviderIdentity,\n user: User,\n ) {\n const entities = await this.roleMapper.execute(identity);\n\n await this.userRepository.saveRoles(user, entities);\n }\n}\n","/*\n * Copyright (c) 2024-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { LdapIdentityProvider, User } from '@authup/core-kit';\nimport { UserError } from '@authup/core-kit';\nimport type { Result } from '@authup/kit';\nimport { template } from '@authup/kit';\nimport ldap from 'ldapjs';\nimport type { Filter } from 'ldapjs';\nimport { BaseCredentialsAuthenticator } from '../../../../../authentication/index.ts';\nimport type { ILdapClient } from '../../../../../ldap/index.ts';\nimport type { IIdentityProviderAccountManager } from '../../../account/index.ts';\nimport type { IdentityProviderIdentity } from '../../../types.ts';\nimport type { IdentityProviderLdapAuthenticatorContext } from './types.ts';\n\nexport class IdentityProviderLdapAuthenticator extends BaseCredentialsAuthenticator<User> {\n protected provider : LdapIdentityProvider;\n\n protected accountManager: IIdentityProviderAccountManager;\n\n protected client: ILdapClient;\n\n constructor(ctx: IdentityProviderLdapAuthenticatorContext) {\n super();\n\n this.accountManager = ctx.accountManager;\n this.provider = ctx.provider;\n this.client = ctx.clientFactory.create({\n url: ctx.provider.url,\n tls: ctx.provider.tls,\n startTLS: ctx.provider.start_tls,\n baseDn: ctx.provider.base_dn,\n user: ctx.provider.user,\n password: ctx.provider.password,\n userNameAttribute: ctx.provider.user_name_attribute,\n });\n }\n\n async authenticate(name: string, password: string) : Promise<User> {\n let bind = await this.safeBind();\n if (!bind.success) {\n await this.safeUnbind();\n\n throw UserError.credentialsInvalid();\n }\n\n const entity = await this.findOneByName(name);\n if (!entity) {\n throw UserError.credentialsInvalid();\n }\n\n const identity : IdentityProviderIdentity = {\n id: entity.dn,\n attributeCandidates: {\n name: [\n entity[this.provider.user_name_attribute || 'cn'],\n this.extractCnFromDn(entity.dn),\n ],\n email: [\n entity[this.provider.user_mail_attribute || 'mail'],\n ],\n },\n data: entity,\n provider: this.provider,\n };\n\n try {\n identity.roles = await this.findUserGroups(entity);\n } catch {\n // todo: log event\n }\n\n bind = await this.safeBind(identity.id, password);\n await this.safeUnbind();\n\n if (!bind.success) {\n throw UserError.credentialsInvalid();\n }\n\n const account = await this.accountManager.save(identity);\n\n return account.user;\n }\n\n protected async bind(user?: string, password?: string) : Promise<void> {\n if (!user) {\n return this.client.bind();\n }\n\n if (!this.client.isDn(user)) {\n const nameAttribute = this.provider.user_name_attribute || 'cn';\n user = `${nameAttribute}=${user},${this.client.resolveDn(this.provider.user_base_dn, this.provider.base_dn)}`;\n }\n\n return this.client.bind(user, password);\n }\n\n protected async safeBind(user?: string, password?: string) : Promise<Result<null>> {\n try {\n await this.bind(user, password);\n\n return {\n success: true,\n data: null, \n };\n } catch (e) {\n return {\n success: false,\n error: e as Error, \n };\n }\n }\n\n protected async unbind() : Promise<void> {\n return this.client.unbind();\n }\n\n protected async safeUnbind() : Promise<Result<null>> {\n try {\n await this.unbind();\n\n return {\n success: true,\n data: null, \n };\n } catch (e) {\n return {\n success: false,\n error: e as Error, \n };\n }\n }\n\n protected async findOneByName(input: string) : Promise<Record<string, any> | null> {\n let filter : Filter | string;\n\n if (this.provider.user_filter) {\n filter = template(this.provider.user_filter, {\n input,\n name_attribute: this.provider.user_name_attribute || 'cn',\n mail_attribute: this.provider.user_mail_attribute || 'mail',\n display_name_attribute: this.provider.user_display_name_attribute || 'cn',\n });\n } else if (this.provider.user_name_attribute) {\n filter = new ldap.EqualityFilter({\n attribute: this.provider.user_name_attribute,\n value: input,\n });\n } else {\n filter = new ldap.OrFilter({\n filters: [\n new ldap.EqualityFilter({\n attribute: 'cn',\n value: input,\n }),\n new ldap.EqualityFilter({\n attribute: 'sAMAccountName',\n value: input,\n }),\n ],\n });\n }\n\n const entities = await this.client.search({\n filter,\n scope: 'sub',\n }, this.client.resolveDn(this.provider.user_base_dn, this.provider.base_dn));\n\n if (entities.length === 0) {\n return null;\n }\n\n return entities[0];\n }\n\n protected extractCnFromDn(dn: string) : string | undefined {\n const match = /^cn=([^,]+)/i.exec(dn);\n return match ? match[1].trim() : undefined;\n }\n\n public async findUserGroups(user: Record<string, any>) : Promise<string[]> {\n const nameAttribute = this.provider.group_name_attribute || 'cn';\n const memberAttribute = this.provider.group_member_attribute || 'member';\n\n let filter : Filter | string;\n if (this.provider.group_filter) {\n filter = template(this.provider.group_filter, {\n ...user,\n name_attribute: nameAttribute,\n member_attribute: memberAttribute,\n });\n } else {\n filter = new ldap.AndFilter({\n filters: [\n new ldap.EqualityFilter({\n attribute: 'objectClass',\n value: this.provider.group_class || 'group',\n }),\n new ldap.EqualityFilter({\n attribute: memberAttribute,\n value: user[this.provider.group_member_user_attribute || 'dn'],\n }),\n ],\n });\n }\n\n const entities = await this.client.search({\n filter,\n scope: 'sub',\n }, this.client.resolveDn(this.provider.group_base_dn, this.provider.base_dn));\n\n if (entities.length === 0) {\n return [];\n }\n\n const attributeKey = this.provider.group_name_attribute || 'cn';\n const names : string[] = [];\n for (const entity of entities) {\n const attribute = entity[attributeKey];\n if (typeof attribute === 'undefined') {\n continue;\n }\n\n if (typeof attribute === 'string') {\n names.push(attribute);\n continue;\n }\n\n if (Array.isArray(attribute)) {\n names.push(...attribute.filter((el) => typeof el === 'string'));\n }\n }\n\n return names;\n }\n}\n","/*\n * Copyright (c) 2025-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { User } from '@authup/core-kit';\nimport { IdentityProviderProtocol, UserError, isLdapIdentityProvider } from '@authup/core-kit';\nimport type { IIdentityProviderRepository } from '../../../../../entities/index.ts';\nimport type { IIdentityProviderAccountManager } from '../../../account/index.ts';\nimport { IdentityProviderLdapAuthenticator } from './module.ts';\nimport type { ILdapClientFactory } from '../../../../../ldap/index.ts';\nimport { BaseCredentialsAuthenticator } from '../../../../../authentication/index.ts';\nimport type { IdentityProviderLdapCollectionAuthenticatorContext } from './types.ts';\n\nexport class IdentityProviderLdapCollectionAuthenticator extends BaseCredentialsAuthenticator<User> {\n protected repository: IIdentityProviderRepository;\n\n protected accountManager: IIdentityProviderAccountManager;\n\n protected clientFactory: ILdapClientFactory;\n\n constructor(ctx: IdentityProviderLdapCollectionAuthenticatorContext) {\n super();\n\n this.repository = ctx.repository;\n this.accountManager = ctx.accountManager;\n this.clientFactory = ctx.clientFactory;\n }\n\n async authenticate(name: string, password: string, realmId?: string): Promise<User> {\n let error : Error | undefined;\n const entities = await this.repository.findByProtocol(IdentityProviderProtocol.LDAP, realmId);\n\n for (const provider of entities) {\n if (!isLdapIdentityProvider(provider)) {\n continue;\n }\n\n const authenticator = new IdentityProviderLdapAuthenticator({\n provider,\n accountManager: this.accountManager,\n clientFactory: this.clientFactory,\n });\n\n const response = await authenticator.safeAuthenticate(name, password);\n if (response.success === true) {\n return response.data;\n }\n\n error = response.error;\n }\n\n if (error) {\n throw error;\n }\n\n throw UserError.credentialsInvalid();\n }\n}\n","/*\n * Copyright (c) 2023-2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { OAuth2IdentityProvider, OpenIDIdentityProvider, User } from '@authup/core-kit';\nimport { buildIdentityProviderAuthorizeCallbackPath } from '@authup/core-kit';\nimport type { Result } from '@authup/kit';\nimport { extractTokenPayload } from '@authup/server-kit';\nimport type { AuthorizeParameters, TokenGrantResponse } from '@hapic/oauth2';\nimport { OAuth2Client } from '@hapic/oauth2';\nimport type { IIdentityProviderAccountManager } from '../../../account/index.ts';\nimport type { IdentityProviderIdentity } from '../../../types.ts';\nimport type {\n IOAuth2Authenticator,\n IdentityProviderOAuth2AuthenticatorContext,\n IdentityProviderOAuth2AuthenticatorOptions,\n OAuth2AuthorizationCodeGrantPayload,\n} from './types.ts';\n\nexport class IdentityProviderOAuth2Authenticator implements IOAuth2Authenticator<User> {\n protected client : OAuth2Client;\n\n protected options : IdentityProviderOAuth2AuthenticatorOptions;\n\n protected accountManager: IIdentityProviderAccountManager;\n\n protected provider : OAuth2IdentityProvider | OpenIDIdentityProvider;\n\n //----------------------------------------------------------------------\n\n constructor(ctx: IdentityProviderOAuth2AuthenticatorContext) {\n this.options = ctx.options;\n this.accountManager = ctx.accountManager;\n this.provider = ctx.provider;\n\n this.client = new OAuth2Client({\n options: {\n clientId: ctx.provider.client_id,\n clientSecret: ctx.provider.client_secret,\n redirectUri: `${ctx.options.baseURL}${buildIdentityProviderAuthorizeCallbackPath(ctx.provider.id)}`,\n scope: ctx.provider.scope,\n authorizationEndpoint: ctx.provider.authorize_url,\n tokenEndpoint: ctx.provider.token_url,\n userinfoEndpoint: ctx.provider.user_info_url || undefined,\n },\n });\n }\n\n //----------------------------------------------------------------------\n\n buildRedirectURL(parameters: Partial<AuthorizeParameters> = {}) : string {\n return this.client.authorize.buildURL(parameters);\n }\n\n //----------------------------------------------------------------------\n\n async authenticate(params: OAuth2AuthorizationCodeGrantPayload): Promise<User> {\n const token = await this.client.token.createWithAuthorizationCode(params);\n\n const identity = await this.buildIdentityWithTokenGrantResponse(token);\n if (this.options.clientId) {\n identity.clientId = this.options.clientId;\n }\n\n const account = await this.accountManager.save(identity);\n\n return account.user;\n }\n\n async safeAuthenticate(params: OAuth2AuthorizationCodeGrantPayload): Promise<Result<User>> {\n try {\n const data = await this.authenticate(params);\n return {\n success: true,\n data, \n };\n } catch (e) {\n return {\n success: false,\n error: e as Error, \n };\n }\n }\n\n //----------------------------------------------------------------------\n\n protected async buildIdentityWithTokenGrantResponse(input: TokenGrantResponse) : Promise<IdentityProviderIdentity> {\n const payload = extractTokenPayload(input.access_token);\n\n return {\n id: payload.sub!,\n attributeCandidates: {\n name: [\n payload.sub,\n ],\n email: [\n payload.email,\n ],\n },\n data: payload,\n provider: this.provider,\n };\n }\n}\n","/*\n * Copyright (c) 2023-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { extractTokenPayload } from '@authup/server-kit';\nimport type { TokenGrantResponse } from '@hapic/oauth2';\nimport type { IdentityProviderIdentity } from '../../../types.ts';\nimport { IdentityProviderOAuth2Authenticator } from '../oauth2/index.ts';\n\nexport class IdentityProviderOpenIDAuthenticator extends IdentityProviderOAuth2Authenticator {\n protected async buildIdentityWithTokenGrantResponse(input: TokenGrantResponse): Promise<IdentityProviderIdentity> {\n const payload = extractTokenPayload(input.access_token);\n\n return {\n id: payload.sub!,\n attributeCandidates: {\n name: [\n payload.preferred_username,\n payload.nickname,\n payload.sub,\n ],\n email: [\n payload.email,\n ],\n },\n data: payload,\n provider: this.provider,\n };\n }\n}\n","/*\n * Copyright (c) 2023-2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { extractTokenPayload } from '@authup/server-kit';\nimport type { TokenGrantResponse } from '@hapic/oauth2';\nimport type { IdentityProviderIdentity } from '../../types.ts';\nimport type { IdentityProviderOAuth2AuthenticatorContext } from '../protocols/index.ts';\nimport { IdentityProviderOAuth2Authenticator } from '../protocols/index.ts';\n\nexport class IdentityProviderFacebookAuthenticator extends IdentityProviderOAuth2Authenticator {\n constructor(ctx: IdentityProviderOAuth2AuthenticatorContext) {\n ctx.provider.scope = 'email';\n ctx.provider.authorize_url = 'https://graph.facebook.com/oauth/authorize';\n ctx.provider.token_url = 'https://graph.facebook.com/oauth/access_token';\n ctx.provider.user_info_url = 'https://graph.facebook.com/me?fields=id,name,email,first_name,last_name';\n\n super(ctx);\n }\n\n protected async buildIdentityWithTokenGrantResponse(input: TokenGrantResponse): Promise<IdentityProviderIdentity> {\n const userInfo = await this.client.userInfo.get({\n type: 'Bearer',\n token: input.access_token,\n });\n\n const payload = extractTokenPayload(input.access_token);\n\n return {\n id: userInfo.id,\n attributeCandidates: {\n name: [\n userInfo.username,\n userInfo.id,\n ],\n email: [\n userInfo.email,\n ],\n first_name: [\n userInfo.first_name,\n ],\n last_name: [\n userInfo.last_name,\n ],\n },\n data: payload,\n provider: this.provider,\n };\n }\n}\n","/*\n * Copyright (c) 2023-2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { extractTokenPayload } from '@authup/server-kit';\nimport type { TokenGrantResponse } from '@hapic/oauth2';\nimport type { IdentityProviderIdentity } from '../../types.ts';\nimport type { IdentityProviderOAuth2AuthenticatorContext } from '../protocols/index.ts';\nimport { IdentityProviderOAuth2Authenticator } from '../protocols/index.ts';\n\nexport class IdentityProviderGithubAuthenticator extends IdentityProviderOAuth2Authenticator {\n constructor(ctx: IdentityProviderOAuth2AuthenticatorContext) {\n ctx.provider.scope = 'user:email';\n ctx.provider.authorize_url = 'https://github.com/login/oauth/authorize';\n ctx.provider.token_url = 'https://github.com/login/oauth/access_token';\n ctx.provider.user_info_url = 'https://api.github.com/user';\n\n super(ctx);\n }\n\n protected async buildIdentityWithTokenGrantResponse(input: TokenGrantResponse): Promise<IdentityProviderIdentity> {\n const userInfo = await this.client.userInfo.get({\n type: 'Bearer',\n token: input.access_token,\n });\n\n const payload = extractTokenPayload(input.access_token);\n\n return {\n id: userInfo.id,\n attributeCandidates: {\n name: [\n userInfo.login,\n userInfo.name,\n userInfo.id,\n ],\n email: [\n userInfo.email,\n ],\n },\n data: payload,\n provider: this.provider,\n };\n }\n}\n","/*\n * Copyright (c) 2023-2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { User } from '@authup/core-kit';\nimport { extractTokenPayload } from '@authup/server-kit';\nimport type { OpenIDTokenPayload } from '@authup/specs';\nimport type { TokenGrantResponse } from '@hapic/oauth2';\nimport type { IdentityProviderIdentity } from '../../types.ts';\nimport type { IdentityProviderOAuth2AuthenticatorContext } from '../protocols/index.ts';\nimport { IdentityProviderOAuth2Authenticator } from '../protocols/index.ts';\n\nexport class IdentityProviderGoogleAuthenticator extends IdentityProviderOAuth2Authenticator {\n constructor(ctx: IdentityProviderOAuth2AuthenticatorContext) {\n ctx.provider.scope = 'openid profile email';\n ctx.provider.authorize_url = 'https://accounts.google.com/o/oauth2/v2/auth';\n ctx.provider.token_url = 'https://oauth2.googleapis.com/token';\n ctx.provider.user_info_url = 'https://openidconnect.googleapis.com/v1/userinfo';\n\n super(ctx);\n }\n\n protected async buildIdentityWithTokenGrantResponse(input: TokenGrantResponse): Promise<IdentityProviderIdentity> {\n const payload = extractTokenPayload(input.access_token);\n\n const attributeCandidates : Record<keyof User, unknown[]> = {};\n\n /**\n * @see https://developers.google.com/identity/openid-connect/openid-connect?hl=de#server-flow\n */\n if (input.id_token) {\n const idTokenPayload = extractTokenPayload(input.id_token) as OpenIDTokenPayload;\n\n attributeCandidates.name = [\n idTokenPayload.name,\n ];\n\n attributeCandidates.email = [\n idTokenPayload.email,\n ];\n\n attributeCandidates.first_name = [\n idTokenPayload.given_name,\n ];\n attributeCandidates.last_name = [\n idTokenPayload.family_name,\n ];\n }\n\n return {\n id: payload.sub!,\n attributeCandidates,\n data: payload,\n provider: this.provider,\n };\n }\n}\n","/*\n * Copyright (c) 2023-2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { extractTokenPayload } from '@authup/server-kit';\nimport type { TokenGrantResponse } from '@hapic/oauth2';\nimport type { IdentityProviderIdentity } from '../../types.ts';\nimport type { IdentityProviderOAuth2AuthenticatorContext } from '../protocols/index.ts';\nimport { IdentityProviderOAuth2Authenticator } from '../protocols/index.ts';\n\nexport class IdentityProviderInstagramAuthenticator extends IdentityProviderOAuth2Authenticator {\n constructor(ctx: IdentityProviderOAuth2AuthenticatorContext) {\n ctx.provider.scope = 'user_profile';\n ctx.provider.authorize_url = 'https://api.instagram.com/oauth/authorize';\n ctx.provider.token_url = 'https://api.instagram.com/oauth/access_token';\n ctx.provider.user_info_url = 'https://graph.instagram.com/me?fields=id,username';\n\n super(ctx);\n }\n\n protected async buildIdentityWithTokenGrantResponse(input: TokenGrantResponse): Promise<IdentityProviderIdentity> {\n const userInfo = await this.client.userInfo.get({\n type: 'Bearer',\n token: input.access_token,\n });\n\n const payload = extractTokenPayload(input.access_token);\n\n return {\n id: userInfo.id,\n attributeCandidates: {\n name: [\n userInfo.username,\n userInfo.id,\n ],\n },\n data: payload,\n provider: this.provider,\n };\n }\n}\n","/*\n * Copyright (c) 2023-2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { extractTokenPayload } from '@authup/server-kit';\nimport type { TokenGrantResponse } from '@hapic/oauth2';\nimport type { IdentityProviderIdentity } from '../../types.ts';\nimport type { IdentityProviderOAuth2AuthenticatorContext } from '../protocols/index.ts';\nimport { IdentityProviderOAuth2Authenticator } from '../protocols/index.ts';\n\nexport class IdentityProviderPaypalAuthenticator extends IdentityProviderOAuth2Authenticator {\n constructor(ctx: IdentityProviderOAuth2AuthenticatorContext) {\n ctx.provider.scope = 'openid profile email';\n ctx.provider.authorize_url = 'https://www.paypal.com/signin/authorize';\n ctx.provider.token_url = 'https://api.paypal.com/v1/identity/openidconnect/tokenservice';\n ctx.provider.user_info_url = 'https://api.paypal.com/v1/oauth2/token/userinfo?schema=openid';\n\n super(ctx);\n }\n\n protected async buildIdentityWithTokenGrantResponse(input: TokenGrantResponse): Promise<IdentityProviderIdentity> {\n const userInfo = await this.client.userInfo.get({\n type: 'Bearer',\n token: input.access_token,\n });\n\n const payload = extractTokenPayload(input.access_token);\n\n return {\n id: userInfo.user_id,\n attributeCandidates: {\n name: [\n userInfo.name,\n userInfo.user_id,\n ],\n email: [\n userInfo.email,\n ],\n },\n data: payload,\n provider: this.provider,\n };\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { TypedToken } from 'eldin';\nimport type { IdentityProviderLdapCollectionAuthenticator } from './protocols/ldap/index.ts';\n\nexport const IDENTITY_PROVIDER_LDAP_COLLECTION_AUTHENTICATOR_TOKEN = new TypedToken<IdentityProviderLdapCollectionAuthenticator>('IdentityProviderLdapCollectionAuthenticator');\n","/*\n * Copyright (c) 2023-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { User } from '@authup/core-kit';\nimport { IdentityProviderPreset, IdentityProviderProtocol } from '@authup/core-kit';\nimport type { IOAuth2Authenticator, IdentityProviderOAuth2AuthenticatorContext } from './protocols/index.ts';\nimport { IdentityProviderOAuth2Authenticator, IdentityProviderOpenIDAuthenticator } from './protocols/index.ts';\nimport {\n IdentityProviderFacebookAuthenticator,\n IdentityProviderGithubAuthenticator,\n IdentityProviderGoogleAuthenticator,\n IdentityProviderInstagramAuthenticator,\n IdentityProviderPaypalAuthenticator,\n} from './presets/index.ts';\n\nexport function createIdentityProviderOAuth2Authenticator(ctx: IdentityProviderOAuth2AuthenticatorContext) : IOAuth2Authenticator<User> {\n if (ctx.provider.preset === IdentityProviderPreset.FACEBOOK) {\n return new IdentityProviderFacebookAuthenticator(ctx);\n }\n\n if (ctx.provider.preset === IdentityProviderPreset.GITHUB) {\n return new IdentityProviderGithubAuthenticator(ctx);\n }\n\n if (ctx.provider.preset === IdentityProviderPreset.GOOGLE) {\n return new IdentityProviderGoogleAuthenticator(ctx);\n }\n\n if (ctx.provider.preset === IdentityProviderPreset.INSTAGRAM) {\n return new IdentityProviderInstagramAuthenticator(ctx);\n }\n\n if (ctx.provider.preset === IdentityProviderPreset.PAYPAL) {\n return new IdentityProviderPaypalAuthenticator(ctx);\n }\n\n if (ctx.provider.protocol === IdentityProviderProtocol.OIDC) {\n return new IdentityProviderOpenIDAuthenticator(ctx);\n }\n\n return new IdentityProviderOAuth2Authenticator(ctx);\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { UserValidator } from '@authup/core-kit';\nimport { createNanoID } from '@authup/kit';\nimport { BadRequestError, NotFoundError } from '@ebec/http';\nimport { randomBytes } from 'node:crypto';\nimport { Container } from 'validup';\nimport { UserCredentialsService } from '../../authentication/credential/entities/user/module.ts';\nimport type {\n IRegistrationService,\n RegistrationResult,\n RegistrationServiceContext,\n RegistrationServiceOptions,\n} from './types.ts';\nimport type { IMailClient } from '../../mail/types.ts';\nimport type { IRealmRepository, IUserRepository } from '../../entities/index.ts';\n\nexport class RegistrationService implements IRegistrationService {\n protected options: RegistrationServiceOptions;\n\n protected mailClient: IMailClient;\n\n protected repository: IUserRepository;\n\n protected realmRepository: IRealmRepository;\n\n constructor(ctx: RegistrationServiceContext) {\n this.options = ctx.options;\n this.mailClient = ctx.mailClient;\n this.repository = ctx.repository;\n this.realmRepository = ctx.realmRepository;\n }\n\n async register(data: Record<string, any>): Promise<RegistrationResult> {\n if (!this.options.registrationEnabled) {\n throw new BadRequestError('User registration is not enabled.');\n }\n\n const validator = new Container({});\n validator.mount(new UserValidator({ pathsToInclude: ['email', 'name', 'password', 'realm_id'] }));\n const validated = await validator.run(data, { group: 'create' });\n\n await this.repository.validateJoinColumns(validated);\n\n if (this.options.emailVerificationEnabled) {\n validated.active = false;\n validated.activate_hash = randomBytes(32).toString('hex');\n } else {\n validated.active = true;\n }\n\n const entity = this.repository.create(validated);\n\n const credentialsService = new UserCredentialsService();\n entity.password = entity.password || createNanoID(64);\n entity.password = await credentialsService.protect(entity.password);\n\n const realm = await this.realmRepository.resolve(entity.realm_id, true);\n entity.realm_id = realm.id;\n\n await this.repository.save(entity);\n\n if (this.options.emailVerificationEnabled) {\n try {\n await this.mailClient.send({\n to: entity.email,\n subject: 'Registration - Activation code',\n html: `\n <p>Please use the code below to activate your account and start using the site.</p>\n <p>${entity.activate_hash}</p>\n `,\n });\n } catch {\n await this.repository.remove(entity);\n throw new BadRequestError('Registration failed. Could not send activation email.');\n }\n }\n\n return { active: entity.active };\n }\n\n async activate(data: { token: string }): Promise<void> {\n const entity = await this.repository.findOneBy({ activate_hash: data.token });\n\n if (!entity) {\n throw new NotFoundError();\n }\n\n const merged = this.repository.merge(entity, {\n active: true,\n activate_hash: null,\n });\n\n await this.repository.save(merged);\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type {\n Client, \n ClientIdentity, \n Identity, \n Robot, \n RobotIdentity, \n User, \n UserIdentity,\n} from '@authup/core-kit';\nimport { IdentityType } from '@authup/core-kit';\nimport { isUUID } from '@authup/kit';\nimport type { IIdentityResolver, IdentityResolverContext } from './types.ts';\nimport type { IClientIdentityRepository, IRobotIdentityRepository, IUserIdentityRepository } from '../entities/index.ts';\n\nexport class IdentityResolver implements IIdentityResolver {\n protected clientRepository: IClientIdentityRepository;\n\n protected userRepository: IUserIdentityRepository;\n\n protected robotRepository: IRobotIdentityRepository;\n\n constructor(ctx: IdentityResolverContext) {\n this.clientRepository = ctx.clientRepository;\n this.userRepository = ctx.userRepository;\n this.robotRepository = ctx.robotRepository;\n }\n\n async resolve(\n type: `${IdentityType}`,\n key: string,\n realmKey?: string,\n ): Promise<Identity | null> {\n switch (type) {\n case IdentityType.CLIENT: {\n return this.resolveClient(key, realmKey);\n }\n case IdentityType.ROBOT: {\n return this.resolveRobot(key, realmKey);\n }\n case IdentityType.USER: {\n return this.resolveUser(key, realmKey);\n }\n }\n\n return null;\n }\n\n private async resolveClient(\n key: string,\n realmKey?: string,\n ) : Promise<ClientIdentity | null> {\n let data : Client | null;\n\n if (isUUID(key)) {\n data = await this.clientRepository.findOneById(key);\n } else {\n data = await this.clientRepository.findOneByName(key, realmKey);\n }\n\n if (data) {\n return {\n type: IdentityType.CLIENT,\n data, \n };\n }\n\n return null;\n }\n\n private async resolveRobot(\n key: string,\n realmKey?: string,\n ) : Promise<RobotIdentity | null> {\n let data : Robot | null;\n\n if (isUUID(key)) {\n data = await this.robotRepository.findOneById(key);\n } else {\n data = await this.robotRepository.findOneByName(key, realmKey);\n }\n\n if (data) {\n return {\n type: IdentityType.ROBOT,\n data, \n };\n }\n\n return null;\n }\n\n private async resolveUser(\n key: string,\n realmKey?: string,\n ) : Promise<UserIdentity | null> {\n let data : User | null;\n\n if (isUUID(key)) {\n data = await this.userRepository.findOneById(key);\n } else {\n data = await this.userRepository.findOneByName(key, realmKey);\n }\n\n if (data) {\n return {\n type: IdentityType.USER,\n data, \n };\n }\n\n return null;\n }\n}\n","/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport enum ProvisioningEntityStrategyType {\n REPLACE = 'replace',\n MERGE = 'merge',\n CREATE_ONLY = 'createOnly',\n ABSENT = 'absent',\n}\n","/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { ObjectLiteral } from '@authup/kit';\nimport { ProvisioningEntityStrategyType } from './constants.ts';\nimport type { ProvisioningEntityStrategy } from './types.ts';\n\nexport function normalizeEntityProvisioningStrategy<A extends ObjectLiteral = ObjectLiteral>(\n input?: ProvisioningEntityStrategy<A>,\n) : ProvisioningEntityStrategy<A> {\n if (!input) {\n return { type: ProvisioningEntityStrategyType.CREATE_ONLY };\n }\n\n return input;\n}\n","/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { createValidator } from '@validup/adapter-zod';\nimport type { ContainerOptions } from 'validup';\nimport { Container } from 'validup';\nimport { z } from 'zod';\nimport type { ProvisioningEntityMergeStrategy, ProvisioningEntityReplaceStrategy, ProvisioningEntityStrategy } from './types.ts';\n\nexport class ProvisioningStrategyValidator extends Container<ProvisioningEntityStrategy> {\n constructor(options: ContainerOptions<ProvisioningEntityStrategy> = {}) {\n super({\n ...options,\n oneOf: true,\n });\n }\n\n protected initialize() {\n super.initialize();\n\n const mergeContainer = new Container<ProvisioningEntityMergeStrategy>();\n mergeContainer.mount('type', createValidator(\n z\n .enum(['merge']),\n ));\n mergeContainer.mount('attributes', createValidator(\n z\n .array(z.string())\n .optional(),\n ));\n this.mount(mergeContainer);\n\n const altContainer = new Container<ProvisioningEntityReplaceStrategy>();\n altContainer.mount('type', createValidator(\n z\n .enum(['replace', 'createOnly', 'absent']),\n ));\n this.mount(altContainer);\n }\n}\n","/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { PermissionValidator } from '@authup/core-kit';\nimport { Container } from 'validup';\nimport { ProvisioningStrategyValidator } from '../../strategy/index.ts';\n\nimport type { PermissionProvisioningEntity } from './types.ts';\n\nexport class PermissionProvisioningValidator extends Container<PermissionProvisioningEntity> {\n protected initialize() {\n super.initialize();\n\n const strategyValidator = new ProvisioningStrategyValidator();\n this.mount('strategy', { optional: true }, strategyValidator);\n\n const attributesValidator = new PermissionValidator();\n this.mount('attributes', attributesValidator);\n }\n}\n","/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { createValidator } from '@validup/adapter-zod';\nimport { Container } from 'validup';\nimport { z } from 'zod';\nimport type { RoleProvisioningRelations } from './types.ts';\n\nexport class RoleProvisioningRelationsValidator extends Container<RoleProvisioningRelations> {\n protected initialize() {\n super.initialize();\n\n this.mount('realmPermissions', { optional: true }, createValidator(\n z.array(z.string()),\n ));\n\n this.mount('globalPermissions', { optional: true }, createValidator(\n z.array(z.string()),\n ));\n }\n}\n","/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { RoleValidator } from '@authup/core-kit';\nimport { Container } from 'validup';\nimport { ProvisioningStrategyValidator } from '../../strategy/index.ts';\nimport { RoleProvisioningRelationsValidator } from './relations-validator.ts';\n\nimport type { RoleProvisioningEntity } from './types.ts';\n\nexport class RoleProvisioningValidator extends Container<RoleProvisioningEntity> {\n protected initialize() {\n super.initialize();\n\n const strategyValidator = new ProvisioningStrategyValidator();\n this.mount('strategy', { optional: true }, strategyValidator);\n\n const dataValidator = new RoleValidator();\n this.mount('attributes', dataValidator);\n\n const relationsValidator = new RoleProvisioningRelationsValidator();\n this.mount('relations', { optional: true }, relationsValidator);\n }\n}\n","/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { createValidator } from '@validup/adapter-zod';\nimport { Container } from 'validup';\nimport { z } from 'zod';\nimport { PermissionProvisioningValidator } from '../permission/index.ts';\nimport { RoleProvisioningValidator } from '../role/index.ts';\nimport type { ClientProvisioningRelations } from './types.ts';\n\nexport class ClientProvisioningRelationsValidator extends Container<ClientProvisioningRelations> {\n protected initialize() {\n super.initialize();\n\n const permissionValidator = new PermissionProvisioningValidator();\n const roleValidator = new RoleProvisioningValidator();\n\n this.mount('permissions.*', { optional: true }, permissionValidator);\n\n this.mount('realmPermissions', { optional: true }, createValidator(\n z.array(z.string()),\n ));\n\n this.mount('globalPermissions', { optional: true }, createValidator(\n z.array(z.string()),\n ));\n\n this.mount('roles.*', { optional: true }, roleValidator);\n\n this.mount('realmRoles', { optional: true }, createValidator(\n z.array(z.string()),\n ));\n\n this.mount('globalRoles', { optional: true }, createValidator(\n z.array(z.string()),\n ));\n }\n}\n","/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { ClientValidator } from '@authup/core-kit';\nimport { Container } from 'validup';\nimport { ProvisioningStrategyValidator } from '../../strategy/index.ts';\nimport { ClientProvisioningRelationsValidator } from './relations-validator.ts';\nimport type { ClientProvisioningEntity } from './types.ts';\n\nexport class ClientProvisioningValidator extends Container<ClientProvisioningEntity> {\n protected initialize() {\n super.initialize();\n\n const strategyValidator = new ProvisioningStrategyValidator();\n this.mount('strategy', { optional: true }, strategyValidator);\n\n const attributesValidator = new ClientValidator();\n this.mount('attributes', attributesValidator);\n\n const relationsValidator = new ClientProvisioningRelationsValidator();\n this.mount('relations', { optional: true }, relationsValidator);\n }\n}\n","/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { createValidator } from '@validup/adapter-zod';\nimport { Container } from 'validup';\nimport { z } from 'zod';\nimport type { RobotProvisioningRelations } from './types.ts';\n\nexport class RobotProvisioningRelationsValidator extends Container<RobotProvisioningRelations> {\n protected initialize() {\n super.initialize();\n\n this.mount('realmPermissions', { optional: true }, createValidator(\n z.array(z.string()),\n ));\n\n this.mount('globalPermissions', { optional: true }, createValidator(\n z.array(z.string()),\n ));\n\n this.mount('realmRoles', { optional: true }, createValidator(\n z.array(z.string()),\n ));\n\n this.mount('globalRoles', { optional: true }, createValidator(\n z.array(z.string()),\n ));\n }\n}\n","/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { RobotValidator } from '@authup/core-kit';\nimport { Container } from 'validup';\nimport { ProvisioningStrategyValidator } from '../../strategy/index.ts';\nimport { RobotProvisioningRelationsValidator } from './relations-validator.ts';\nimport type { RobotProvisioningEntity } from './types.ts';\n\nexport class RobotProvisioningValidator extends Container<RobotProvisioningEntity> {\n protected initialize() {\n super.initialize();\n\n const strategyValidator = new ProvisioningStrategyValidator();\n this.mount('strategy', { optional: true }, strategyValidator);\n\n const attributesValidator = new RobotValidator();\n this.mount('attributes', attributesValidator);\n\n const relationsValidator = new RobotProvisioningRelationsValidator();\n this.mount('relations', { optional: true }, relationsValidator);\n }\n}\n","/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { ScopeValidator } from '@authup/core-kit';\nimport { Container } from 'validup';\nimport { ProvisioningStrategyValidator } from '../../strategy/index.ts';\n\nimport type { ScopeProvisioningEntity } from './types.ts';\n\nexport class ScopeProvisioningValidator extends Container<ScopeProvisioningEntity> {\n protected initialize() {\n super.initialize();\n\n const strategyValidator = new ProvisioningStrategyValidator();\n this.mount('strategy', { optional: true }, strategyValidator);\n\n const attributesValidator = new ScopeValidator();\n this.mount('attributes', attributesValidator);\n }\n}\n","/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { createValidator } from '@validup/adapter-zod';\nimport { Container } from 'validup';\nimport { z } from 'zod';\nimport type { UserProvisioningRelations } from './types.ts';\n\nexport class UserProvisioningRelationsValidator extends Container<UserProvisioningRelations> {\n protected initialize() {\n super.initialize();\n\n this.mount('clientPermissions', { optional: true }, createValidator(\n z.record(z.string(), z.array(z.string())),\n ));\n\n this.mount('realmPermissions', { optional: true }, createValidator(\n z.array(z.string()),\n ));\n\n this.mount('globalPermissions', { optional: true }, createValidator(\n z.array(z.string()),\n ));\n\n this.mount('clientRoles', { optional: true }, createValidator(\n z.record(z.string(), z.array(z.string())),\n ));\n\n this.mount('realmRoles', { optional: true }, createValidator(\n z.array(z.string()),\n ));\n\n this.mount('globalRoles', { optional: true }, createValidator(\n z.array(z.string()),\n ));\n }\n}\n","/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { UserValidator } from '@authup/core-kit';\nimport { Container } from 'validup';\nimport { ProvisioningStrategyValidator } from '../../strategy/index.ts';\nimport { UserProvisioningRelationsValidator } from './relations-validator.ts';\nimport type { UserProvisioningEntity } from './types.ts';\n\nexport class UserProvisioningValidator extends Container<UserProvisioningEntity> {\n protected initialize() {\n super.initialize();\n\n const strategyValidator = new ProvisioningStrategyValidator();\n this.mount('strategy', { optional: true }, strategyValidator);\n\n const attributesValidator = new UserValidator();\n this.mount('attributes', attributesValidator);\n\n const relationsValidator = new UserProvisioningRelationsValidator();\n this.mount('relations', { optional: true }, relationsValidator);\n }\n}\n","/*\n * Copyright (c) 2026-2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { buildZodIssuesForError, createValidator } from '@validup/adapter-zod';\nimport { Container, isValidupError } from 'validup';\nimport { z } from 'zod';\nimport { ClientProvisioningValidator } from '../client/index.ts';\nimport { PermissionProvisioningValidator } from '../permission/index.ts';\nimport { RobotProvisioningValidator } from '../robot/index.ts';\nimport { RoleProvisioningValidator } from '../role/index.ts';\nimport { ScopeProvisioningValidator } from '../scope/index.ts';\nimport { UserProvisioningValidator } from '../user/index.ts';\nimport type { RealmProvisioningRelations } from './types.ts';\n\nexport class RealmProvisioningRelationsValidator extends Container<RealmProvisioningRelations> {\n protected initialize() {\n super.initialize();\n\n const clientValidator = new ClientProvisioningValidator();\n const roleValidator = new RoleProvisioningValidator();\n const permissionValidator = new PermissionProvisioningValidator();\n const robotValidator = new RobotProvisioningValidator();\n const scopeValidator = new ScopeProvisioningValidator();\n const userValidator = new UserProvisioningValidator();\n\n this.mount('clients', { optional: true }, createValidator(\n z\n .array(z.any())\n .check(async (ctx) => {\n try {\n for (let i = 0; i < ctx.value.length; i++) {\n await clientValidator.run(ctx.value[i]);\n }\n } catch (e) {\n if (isValidupError(e)) {\n ctx.issues.push(...buildZodIssuesForError(e));\n }\n }\n }),\n ));\n\n this.mount('roles', { optional: true }, createValidator(\n z\n .array(z.any())\n .check(async (ctx) => {\n try {\n for (let i = 0; i < ctx.value.length; i++) {\n await roleValidator.run(ctx.value[i]);\n }\n } catch (e) {\n if (isValidupError(e)) {\n ctx.issues.push({\n code: 'custom',\n message: '',\n path: [],\n input: undefined,\n });\n ctx.issues.push(...buildZodIssuesForError(e));\n }\n }\n }),\n ));\n\n this.mount('permissions', { optional: true }, createValidator(\n z\n .array(z.any())\n .check(async (ctx) => {\n try {\n for (let i = 0; i < ctx.value.length; i++) {\n await permissionValidator.run(ctx.value[i]);\n }\n } catch (e) {\n if (isValidupError(e)) {\n ctx.issues.push(...buildZodIssuesForError(e));\n }\n }\n }),\n ));\n\n this.mount('robots', { optional: true }, createValidator(\n z\n .array(z.any())\n .check(async (ctx) => {\n try {\n for (let i = 0; i < ctx.value.length; i++) {\n await robotValidator.run(ctx.value[i]);\n }\n } catch (e) {\n if (isValidupError(e)) {\n ctx.issues.push(...buildZodIssuesForError(e));\n }\n }\n }),\n ));\n\n this.mount('scopes', { optional: true }, createValidator(\n z\n .array(z.any())\n .check(async (ctx) => {\n try {\n for (let i = 0; i < ctx.value.length; i++) {\n await scopeValidator.run(ctx.value[i]);\n }\n } catch (e) {\n if (isValidupError(e)) {\n ctx.issues.push(...buildZodIssuesForError(e));\n }\n }\n }),\n ));\n\n this.mount('users', { optional: true }, createValidator(\n z\n .array(z.any())\n .check(async (ctx) => {\n try {\n for (let i = 0; i < ctx.value.length; i++) {\n await userValidator.run(ctx.value[i]);\n }\n } catch (e) {\n if (isValidupError(e)) {\n ctx.issues.push(...buildZodIssuesForError(e));\n }\n }\n }),\n ));\n }\n}\n","/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { RealmValidator } from '@authup/core-kit';\nimport { Container } from 'validup';\nimport { ProvisioningStrategyValidator } from '../../strategy/index.ts';\nimport { RealmProvisioningRelationsValidator } from './relations-validator.ts';\n\nimport type { RealmProvisioningEntity } from './types.ts';\n\nexport class RealmProvisioningValidator extends Container<RealmProvisioningEntity> {\n protected initialize() {\n super.initialize();\n\n const strategyValidator = new ProvisioningStrategyValidator();\n this.mount('strategy', { optional: true }, strategyValidator);\n\n const attributesValidator = new RealmValidator();\n this.mount('attributes', attributesValidator);\n\n const relationsValidator = new RealmProvisioningRelationsValidator();\n this.mount('relations', { optional: true }, relationsValidator);\n }\n}\n","/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { buildZodIssuesForError, createValidator } from '@validup/adapter-zod';\nimport { Container, isValidupError } from 'validup';\nimport { z } from 'zod';\nimport { ProvisioningStrategyValidator } from '../../strategy/index.ts';\nimport { PermissionProvisioningValidator } from '../permission/index.ts';\nimport { RealmProvisioningValidator } from '../realm/index.ts';\nimport { RoleProvisioningValidator } from '../role/index.ts';\nimport { ScopeProvisioningValidator } from '../scope/index.ts';\n\nimport type { RootProvisioningEntity } from './types.ts';\n\nexport class RootProvisioningValidator extends Container<RootProvisioningEntity> {\n protected initialize() {\n super.initialize();\n\n const strategyValidator = new ProvisioningStrategyValidator();\n this.mount('strategy', { optional: true }, strategyValidator);\n\n const realmValidator = new RealmProvisioningValidator();\n this.mount('realms', { optional: true }, createValidator(\n z\n .array(z.any())\n .check(async (ctx) => {\n for (let i = 0; i < ctx.value.length; i++) {\n await realmValidator.run(ctx.value[i]);\n }\n }),\n ));\n\n const roleValidator = new RoleProvisioningValidator();\n this.mount('roles', { optional: true }, createValidator(\n z\n .array(z.any())\n .check(async (ctx) => {\n try {\n for (let i = 0; i < ctx.value.length; i++) {\n await roleValidator.run(ctx.value[i]);\n }\n } catch (e) {\n if (isValidupError(e)) {\n ctx.issues.push(...buildZodIssuesForError(e));\n }\n }\n }),\n ));\n\n const scopeValidator = new ScopeProvisioningValidator();\n this.mount('scopes', { optional: true }, createValidator(\n z\n .array(z.any())\n .check(async (ctx) => {\n try {\n for (let i = 0; i < ctx.value.length; i++) {\n await scopeValidator.run(ctx.value[i]);\n }\n } catch (e) {\n if (isValidupError(e)) {\n ctx.issues.push(...buildZodIssuesForError(e));\n }\n }\n }),\n ));\n\n const permissionValidator = new PermissionProvisioningValidator();\n this.mount('permissions', { optional: true }, createValidator(\n z\n .array(z.any())\n .check(async (ctx) => {\n try {\n for (let i = 0; i < ctx.value.length; i++) {\n await permissionValidator.run(ctx.value[i]);\n }\n } catch (e) {\n if (isValidupError(e)) {\n ctx.issues.push(...buildZodIssuesForError(e));\n }\n }\n }),\n ));\n }\n}\n","/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { IProvisioningSynchronizer } from '../types.ts';\n\nexport abstract class BaseProvisioningSynchronizer<T> implements IProvisioningSynchronizer<T> {\n // Sequential to avoid race conditions on concurrent upserts.\n // Can be switched to Promise.all() if callers guarantee unique inputs.\n async synchronizeMany(input: T[]): Promise<T[]> {\n const output: T[] = [];\n for (const entity of input) {\n output.push(await this.synchronize(entity));\n }\n return output;\n }\n\n abstract synchronize(input: T): Promise<T>;\n}\n","/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { ObjectLiteral } from '@authup/kit';\nimport type { IEntityRepository } from '../../entities/index.ts';\n\nexport class ProvisioningEntityResolver<T extends ObjectLiteral = ObjectLiteral> {\n protected repository: IEntityRepository<T>;\n\n constructor(repository: IEntityRepository<T>) {\n this.repository = repository;\n }\n\n async resolveGlobal(names?: string[]): Promise<T[]> {\n if (!names || names.length === 0) {\n return [];\n }\n\n const hasWildcard = names.includes('*');\n if (hasWildcard) {\n return this.repository.findManyBy({\n realm_id: null,\n client_id: null,\n });\n }\n\n return this.repository.findManyBy({\n name: names,\n realm_id: null,\n client_id: null,\n });\n }\n\n async resolveRealm(names: string[] | undefined, realmId: string): Promise<T[]> {\n if (!names || names.length === 0) {\n return [];\n }\n\n const hasWildcard = names.includes('*');\n if (hasWildcard) {\n return this.repository.findManyBy({\n realm_id: realmId,\n client_id: null,\n });\n }\n\n return this.repository.findManyBy({\n name: names,\n realm_id: realmId,\n client_id: null,\n });\n }\n\n async resolveClient(names: string[] | undefined, realmId: string, clientId: string): Promise<T[]> {\n if (!names || names.length === 0) {\n return [];\n }\n\n const hasWildcard = names.includes('*');\n if (hasWildcard) {\n return this.repository.findManyBy({\n realm_id: realmId,\n client_id: clientId,\n });\n }\n\n return this.repository.findManyBy({\n name: names,\n realm_id: realmId,\n client_id: clientId,\n });\n }\n}\n","/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { ObjectLiteral } from '@authup/kit';\nimport type { IEntityRepository } from '../../entities/index.ts';\n\nexport type ProvisioningJunctionSynchronizerContext<T extends ObjectLiteral = ObjectLiteral> = {\n repository: IEntityRepository<T>,\n ownerKey: string,\n ownerRealmKey: string,\n};\n\nexport class ProvisioningJunctionSynchronizer<T extends ObjectLiteral = ObjectLiteral> {\n protected ctx: ProvisioningJunctionSynchronizerContext<T>;\n\n constructor(ctx: ProvisioningJunctionSynchronizerContext<T>) {\n this.ctx = ctx;\n }\n\n async synchronize(\n owner: {\n id: string,\n realm_id?: string | null \n },\n targets: Array<{\n id: string,\n realm_id?: string | null \n }>,\n targetKey: string,\n targetRealmKey: string,\n extraAttributes?: Record<string, unknown>,\n ): Promise<void> {\n for (const target of targets) {\n const existing = await this.ctx.repository.findOneBy({\n [this.ctx.ownerKey]: owner.id,\n [targetKey]: target.id,\n });\n\n if (!existing) {\n const entity = this.ctx.repository.create({\n [this.ctx.ownerKey]: owner.id,\n [this.ctx.ownerRealmKey]: owner.realm_id,\n [targetKey]: target.id,\n [targetRealmKey]: target.realm_id,\n ...(extraAttributes || {}),\n } as Partial<T>);\n\n await this.ctx.repository.save(entity);\n }\n }\n }\n}\n","/*\n * Copyright (c) 2026-2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type {\n ClientPermission, \n ClientRole, \n Permission, \n Role,\n} from '@authup/core-kit';\nimport { pickRecord } from '@authup/kit';\nimport type { IClientRepository } from '../../../entities/index.ts';\nimport type { ClientProvisioningEntity } from '../../entities/client';\nimport type { PermissionProvisioningEntity } from '../../entities/permission';\nimport type { RoleProvisioningEntity } from '../../entities/role';\nimport { ProvisioningEntityStrategyType, normalizeEntityProvisioningStrategy } from '../../strategy/index.ts';\nimport type { IProvisioningSynchronizer } from '../../types.ts';\nimport { BaseProvisioningSynchronizer } from '../base.ts';\nimport { ProvisioningEntityResolver } from '../entity-resolver.ts';\nimport { ProvisioningJunctionSynchronizer } from '../junction-synchronizer.ts';\nimport type { ClientProvisioningSynchronizerContext } from './types.ts';\n\nexport class ClientProvisioningSynchronizer extends BaseProvisioningSynchronizer<ClientProvisioningEntity> {\n protected clientRepository: IClientRepository;\n\n protected permissionResolver: ProvisioningEntityResolver<Permission>;\n\n protected roleResolver: ProvisioningEntityResolver<Role>;\n\n protected permissionJunction: ProvisioningJunctionSynchronizer<ClientPermission>;\n\n protected roleJunction: ProvisioningJunctionSynchronizer<ClientRole>;\n\n protected permissionSynchronizer: IProvisioningSynchronizer<PermissionProvisioningEntity>;\n\n protected roleSynchronizer: IProvisioningSynchronizer<RoleProvisioningEntity>;\n\n constructor(ctx: ClientProvisioningSynchronizerContext) {\n super();\n\n this.clientRepository = ctx.clientRepository;\n\n this.permissionResolver = new ProvisioningEntityResolver(ctx.permissionRepository);\n this.roleResolver = new ProvisioningEntityResolver(ctx.roleRepository);\n\n this.permissionJunction = new ProvisioningJunctionSynchronizer({\n repository: ctx.clientPermissionRepository,\n ownerKey: 'client_id',\n ownerRealmKey: 'client_realm_id',\n });\n this.roleJunction = new ProvisioningJunctionSynchronizer({\n repository: ctx.clientRoleRepository,\n ownerKey: 'client_id',\n ownerRealmKey: 'client_realm_id',\n });\n\n this.permissionSynchronizer = ctx.permissionSynchronizer;\n this.roleSynchronizer = ctx.roleSynchronizer;\n }\n\n async synchronize(input: ClientProvisioningEntity): Promise<ClientProvisioningEntity> {\n const strategy = normalizeEntityProvisioningStrategy(input.strategy);\n\n let attributes = await this.clientRepository.findOneBy({\n name: input.attributes.name,\n realm_id: input.attributes.realm_id || null,\n });\n\n if (strategy.type === ProvisioningEntityStrategyType.ABSENT) {\n if (attributes) {\n await this.clientRepository.remove(attributes);\n }\n return {\n ...input,\n attributes: attributes || input.attributes, \n };\n }\n\n if (attributes) {\n switch (strategy.type) {\n case ProvisioningEntityStrategyType.MERGE:\n attributes = this.clientRepository.merge(\n attributes,\n strategy.attributes ?\n pickRecord(input.attributes, strategy.attributes) :\n input.attributes,\n );\n attributes = await this.clientRepository.save(attributes);\n break;\n case ProvisioningEntityStrategyType.REPLACE:\n input.attributes.id = attributes.id;\n attributes = await this.clientRepository.save(this.clientRepository.create(input.attributes));\n break;\n }\n } else {\n attributes = await this.clientRepository.save(this.clientRepository.create(input.attributes));\n }\n\n // Permissions (Global + Realm)\n const permissions = [\n ...await this.permissionResolver.resolveGlobal(\n input.relations && input.relations.globalPermissions,\n ),\n ...(attributes.realm_id ?\n await this.permissionResolver.resolveRealm(\n input.relations && input.relations.realmPermissions,\n attributes.realm_id,\n ) :\n []),\n ];\n\n if (permissions.length > 0) {\n await this.permissionJunction.synchronize(\n attributes,\n permissions,\n 'permission_id',\n 'permission_realm_id',\n );\n }\n\n // Roles (Global + Realm)\n const roles = [\n ...await this.roleResolver.resolveGlobal(\n input.relations && input.relations.globalRoles,\n ),\n ...(attributes.realm_id ?\n await this.roleResolver.resolveRealm(\n input.relations && input.relations.realmRoles,\n attributes.realm_id,\n ) :\n []),\n ];\n\n if (roles.length > 0) {\n await this.roleJunction.synchronize(\n attributes,\n roles,\n 'role_id',\n 'role_realm_id',\n );\n }\n\n // Containers\n\n if (input.relations && input.relations.permissions) {\n const children = input.relations.permissions.map((child) => {\n child.attributes.client_id = attributes.id;\n child.attributes.client = attributes;\n return child;\n });\n\n await this.permissionSynchronizer.synchronizeMany(children);\n }\n\n if (input.relations && input.relations.roles) {\n const children = input.relations.roles.map((child) => {\n child.attributes.client_id = attributes.id;\n child.attributes.client = attributes;\n return child;\n });\n\n await this.roleSynchronizer.synchronizeMany(children);\n }\n\n return {\n ...input,\n attributes,\n };\n }\n}\n","/*\n * Copyright (c) 2026-2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { pickRecord } from '@authup/kit';\nimport type { IPermissionRepository } from '../../../entities/index.ts';\nimport type { PermissionProvisioningEntity } from '../../entities/permission';\nimport { ProvisioningEntityStrategyType, normalizeEntityProvisioningStrategy } from '../../strategy/index.ts';\nimport { BaseProvisioningSynchronizer } from '../base.ts';\nimport type { PermissionProvisioningSynchronizerContext } from './types.ts';\n\nexport class PermissionProvisioningSynchronizer extends BaseProvisioningSynchronizer<PermissionProvisioningEntity> {\n protected repository : IPermissionRepository;\n\n constructor(ctx: PermissionProvisioningSynchronizerContext) {\n super();\n\n this.repository = ctx.repository;\n }\n\n async synchronize(input: PermissionProvisioningEntity): Promise<PermissionProvisioningEntity> {\n const strategy = normalizeEntityProvisioningStrategy(input.strategy);\n\n let attributes = await this.repository.findOneBy({\n name: input.attributes.name,\n realm_id: input.attributes.realm_id || null,\n client_id: input.attributes.client_id || null,\n });\n\n if (strategy.type === ProvisioningEntityStrategyType.ABSENT) {\n if (attributes) {\n await this.repository.remove(attributes);\n }\n return {\n ...input,\n attributes: attributes || input.attributes, \n };\n }\n\n if (attributes) {\n switch (strategy.type) {\n case ProvisioningEntityStrategyType.MERGE:\n attributes = this.repository.merge(\n attributes,\n strategy.attributes ?\n pickRecord(input.attributes, strategy.attributes) :\n input.attributes,\n );\n\n attributes = await this.repository.save(attributes);\n break;\n case ProvisioningEntityStrategyType.REPLACE:\n input.attributes.id = attributes.id;\n attributes = await this.repository.save(this.repository.create(input.attributes));\n break;\n }\n } else {\n attributes = await this.repository.save(this.repository.create(input.attributes));\n }\n\n return {\n ...input,\n attributes,\n };\n }\n}\n","/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Policy } from '@authup/core-kit';\nimport type { IPermissionPolicyRepository } from '../../../entities/permission-policy/types.ts';\nimport type { IPolicyRepository } from '../../../entities/index.ts';\nimport type { PolicyProvisioningEntity } from '../../entities/policy/index.ts';\nimport { BaseProvisioningSynchronizer } from '../base.ts';\nimport type { PolicyProvisioningSynchronizerContext } from './types.ts';\n\nexport class PolicyProvisioningSynchronizer extends BaseProvisioningSynchronizer<PolicyProvisioningEntity> {\n protected repository: IPolicyRepository;\n\n protected permissionPolicyRepository: IPermissionPolicyRepository;\n\n constructor(ctx: PolicyProvisioningSynchronizerContext) {\n super();\n\n this.repository = ctx.repository;\n this.permissionPolicyRepository = ctx.permissionPolicyRepository;\n }\n\n async synchronize(input: PolicyProvisioningEntity): Promise<PolicyProvisioningEntity> {\n let entity = await this.repository.findOneBy({\n name: input.attributes.name,\n realm_id: input.attributes.realm_id || null,\n });\n\n if (entity) {\n entity = this.repository.merge(entity, {\n type: input.attributes.type,\n built_in: input.attributes.built_in,\n parent_id: input.attributes.parent_id,\n parent: input.attributes.parent,\n });\n await this.repository.saveWithEA(entity, input.extraAttributes);\n } else {\n entity = this.repository.create(input.attributes);\n await this.repository.saveWithEA(entity, input.extraAttributes);\n }\n\n await this.synchronizeChildren(entity.id, input.children || []);\n\n return {\n ...input,\n attributes: entity,\n };\n }\n\n private async synchronizeChildren(\n parentId: string,\n children: PolicyProvisioningEntity[] = [],\n ): Promise<void> {\n const declaredNames = children.map((c) => c.attributes.name);\n\n await children.reduce(async (prev, child) => {\n await prev;\n child.attributes.parent_id = parentId;\n child.attributes.parent = { id: parentId } as any;\n await this.synchronize(child);\n }, Promise.resolve());\n\n await this.cleanupStaleChildren(parentId, declaredNames);\n }\n\n private async cleanupStaleChildren(\n parentId: string,\n declaredNames: (string | undefined)[],\n ): Promise<void> {\n const existingChildren = await this.repository.findManyBy({ parent_id: parentId });\n\n const staleChildren = existingChildren.filter(\n (child) => !declaredNames.includes(child.name),\n );\n\n await staleChildren.reduce(async (prev, child) => {\n await prev;\n await this.cleanupStaleChild(child);\n }, Promise.resolve());\n }\n\n private async cleanupStaleChild(child: Policy): Promise<void> {\n const referencingJunctions = await this.permissionPolicyRepository.findManyBy({ policy_id: child.id });\n\n if (referencingJunctions.length === 0) {\n await this.repository.deleteFromTree(child);\n } else {\n const detached = this.repository.merge(child, {\n parent_id: null,\n parent: null,\n built_in: false,\n });\n await this.repository.saveWithEA(detached);\n }\n }\n}\n","/*\n * Copyright (c) 2026-2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { pickRecord } from '@authup/kit';\nimport type { IRealmRepository } from '../../../entities/index.ts';\nimport type { ClientProvisioningEntity, ScopeProvisioningEntity } from '../../entities/index.ts';\nimport type { PermissionProvisioningEntity } from '../../entities/permission/index.ts';\nimport type { RealmProvisioningEntity } from '../../entities/realm/index.ts';\nimport type { RobotProvisioningEntity } from '../../entities/robot/index.ts';\nimport type { RoleProvisioningEntity } from '../../entities/role/index.ts';\nimport type { UserProvisioningEntity } from '../../entities/user/index.ts';\nimport { ProvisioningEntityStrategyType, normalizeEntityProvisioningStrategy } from '../../strategy/index.ts';\nimport type { IProvisioningSynchronizer } from '../../types.ts';\nimport { BaseProvisioningSynchronizer } from '../base.ts';\nimport type { RealmProvisioningSynchronizerContext } from './types.ts';\n\nexport class RealmProvisioningSynchronizer extends BaseProvisioningSynchronizer<RealmProvisioningEntity> {\n protected repository : IRealmRepository;\n\n protected clientSynchronizer: IProvisioningSynchronizer<ClientProvisioningEntity>;\n\n protected permissionSynchronizer: IProvisioningSynchronizer<PermissionProvisioningEntity>;\n\n protected roleSynchronizer: IProvisioningSynchronizer<RoleProvisioningEntity>;\n\n protected userSynchronizer: IProvisioningSynchronizer<UserProvisioningEntity>;\n\n protected robotSynchronizer: IProvisioningSynchronizer<RobotProvisioningEntity>;\n\n protected scopeSynchronizer : IProvisioningSynchronizer<ScopeProvisioningEntity>;\n\n constructor(ctx: RealmProvisioningSynchronizerContext) {\n super();\n\n this.repository = ctx.repository;\n this.clientSynchronizer = ctx.clientSynchronizer;\n this.permissionSynchronizer = ctx.permissionSynchronizer;\n this.roleSynchronizer = ctx.roleSynchronizer;\n this.userSynchronizer = ctx.userSynchronizer;\n this.robotSynchronizer = ctx.robotSynchronizer;\n this.scopeSynchronizer = ctx.scopeSynchronizer;\n }\n\n async synchronize(input: RealmProvisioningEntity): Promise<RealmProvisioningEntity> {\n const strategy = normalizeEntityProvisioningStrategy(input.strategy);\n let attributes = await this.repository.findOneBy({ name: input.attributes.name });\n\n if (strategy.type === ProvisioningEntityStrategyType.ABSENT) {\n if (attributes) {\n await this.repository.remove(attributes);\n }\n return {\n ...input,\n attributes: attributes || input.attributes, \n };\n }\n\n if (attributes) {\n switch (strategy.type) {\n case ProvisioningEntityStrategyType.MERGE:\n attributes = this.repository.merge(\n attributes,\n strategy.attributes ?\n pickRecord(input.attributes, strategy.attributes) :\n input.attributes,\n );\n\n attributes = await this.repository.save(attributes);\n break;\n case ProvisioningEntityStrategyType.REPLACE:\n input.attributes.id = attributes.id;\n attributes = await this.repository.save(this.repository.create(input.attributes));\n break;\n }\n } else {\n attributes = await this.repository.save(this.repository.create(input.attributes));\n }\n\n if (input.relations && input.relations.clients) {\n const clients = input.relations.clients.map(\n (child) => {\n child.attributes.realm_id = attributes.id;\n child.attributes.realm = attributes;\n return child;\n },\n );\n\n await this.clientSynchronizer.synchronizeMany(clients);\n }\n\n if (input.relations && input.relations.permissions) {\n const permissions = input.relations.permissions.map((child) => {\n child.attributes.realm_id = attributes.id;\n child.attributes.realm = attributes;\n return child;\n });\n\n await this.permissionSynchronizer.synchronizeMany(permissions);\n }\n\n if (input.relations && input.relations.roles) {\n const roles = input.relations.roles.map((child) => {\n child.attributes.realm_id = attributes.id;\n child.attributes.realm = attributes;\n return child;\n });\n\n await this.roleSynchronizer.synchronizeMany(roles);\n }\n\n if (input.relations && input.relations.users) {\n const users = input.relations.users.map((child) => {\n child.attributes.realm_id = attributes.id;\n child.attributes.realm = attributes;\n return child;\n });\n\n await this.userSynchronizer.synchronizeMany(users);\n }\n\n if (input.relations && input.relations.robots) {\n const robots = input.relations.robots.map((child) => {\n child.attributes.realm_id = attributes.id;\n child.attributes.realm = attributes;\n return child;\n });\n\n await this.robotSynchronizer.synchronizeMany(robots);\n }\n\n if (input.relations && input.relations.scopes) {\n const scopes = input.relations.scopes.map((child) => {\n child.attributes.realm_id = attributes.id;\n child.attributes.realm = attributes;\n return child;\n });\n\n await this.scopeSynchronizer.synchronizeMany(scopes);\n }\n\n return {\n ...input,\n attributes,\n };\n }\n}\n","/*\n * Copyright (c) 2026-2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { pickRecord } from '@authup/kit';\nimport type { Permission, RolePermission } from '@authup/core-kit';\nimport type { IPolicyRepository, IRoleRepository } from '../../../entities/index.ts';\nimport type { RoleProvisioningEntity } from '../../entities/role/index.ts';\nimport { ProvisioningEntityStrategyType, normalizeEntityProvisioningStrategy } from '../../strategy/index.ts';\nimport { BaseProvisioningSynchronizer } from '../base.ts';\nimport { ProvisioningEntityResolver } from '../entity-resolver.ts';\nimport { ProvisioningJunctionSynchronizer } from '../junction-synchronizer.ts';\nimport type { RoleProvisioningSynchronizerContext } from './types.ts';\n\nexport class RoleProvisioningSynchronizer extends BaseProvisioningSynchronizer<RoleProvisioningEntity> {\n protected repository : IRoleRepository;\n\n protected policyRepository?: IPolicyRepository;\n\n protected permissionResolver : ProvisioningEntityResolver<Permission>;\n\n protected permissionJunction: ProvisioningJunctionSynchronizer<RolePermission>;\n\n constructor(ctx: RoleProvisioningSynchronizerContext) {\n super();\n\n this.repository = ctx.repository;\n this.policyRepository = ctx.policyRepository;\n this.permissionResolver = new ProvisioningEntityResolver(ctx.permissionRepository);\n this.permissionJunction = new ProvisioningJunctionSynchronizer({\n repository: ctx.rolePermissionRepository,\n ownerKey: 'role_id',\n ownerRealmKey: 'role_realm_id',\n });\n }\n\n async synchronize(input: RoleProvisioningEntity): Promise<RoleProvisioningEntity> {\n const strategy = normalizeEntityProvisioningStrategy(input.strategy);\n let attributes = await this.repository.findOneBy({\n name: input.attributes.name,\n realm_id: input.attributes.realm_id || null,\n client_id: input.attributes.client_id || null,\n });\n\n if (strategy.type === ProvisioningEntityStrategyType.ABSENT) {\n if (attributes) {\n await this.repository.remove(attributes);\n }\n return {\n ...input,\n attributes: attributes || input.attributes, \n };\n }\n\n if (attributes) {\n switch (strategy.type) {\n case ProvisioningEntityStrategyType.MERGE:\n attributes = this.repository.merge(\n attributes,\n strategy.attributes ?\n pickRecord(input.attributes, strategy.attributes) :\n input.attributes,\n );\n\n attributes = await this.repository.save(attributes);\n break;\n case ProvisioningEntityStrategyType.REPLACE:\n input.attributes.id = attributes.id;\n attributes = await this.repository.save(this.repository.create(input.attributes));\n break;\n }\n } else {\n attributes = await this.repository.save(this.repository.create(input.attributes));\n }\n\n if (!input.relations) {\n return {\n ...input,\n attributes,\n };\n }\n\n let globalPermissions = await this.permissionResolver.resolveGlobal(input.relations.globalPermissions);\n\n if (input.relations.globalPermissionsExclude && input.relations.globalPermissionsExclude.length > 0) {\n const excludeSet = new Set(input.relations.globalPermissionsExclude);\n globalPermissions = globalPermissions.filter((p) => !excludeSet.has(p.name));\n }\n\n const realmPermissions = attributes.realm_id ?\n await this.permissionResolver.resolveRealm(input.relations.realmPermissions, attributes.realm_id) :\n [];\n\n const permissions = [\n ...globalPermissions,\n ...realmPermissions,\n ];\n\n if (permissions.length > 0) {\n const policyMap = await this.resolvePolicyMap(input, attributes.name);\n\n if (policyMap) {\n for (const permission of permissions) {\n const policyId = policyMap.overrides.get(permission.name) ?? policyMap.defaultPolicyId;\n await this.permissionJunction.synchronize(\n attributes,\n [permission],\n 'permission_id',\n 'permission_realm_id',\n policyId ? { policy_id: policyId } : undefined,\n );\n }\n } else {\n await this.permissionJunction.synchronize(\n attributes,\n permissions,\n 'permission_id',\n 'permission_realm_id',\n );\n }\n }\n\n return {\n ...input,\n attributes,\n };\n }\n\n private async resolvePolicyMap(\n input: RoleProvisioningEntity,\n roleName: string | undefined,\n ): Promise<{\n defaultPolicyId: string | undefined,\n overrides: Map<string, string> \n } | undefined> {\n if (!input.relations?.globalPermissionsPolicyName || !this.policyRepository) {\n return undefined;\n }\n\n const defaultPolicy = await this.policyRepository.findOneByName(input.relations.globalPermissionsPolicyName);\n if (!defaultPolicy) {\n throw new Error(\n `Provisioning: policy '${input.relations.globalPermissionsPolicyName}' not found for role '${roleName}'.`,\n );\n }\n\n const overrides = new Map<string, string>();\n\n if (input.relations.globalPermissionsPolicyOverrides) {\n for (const [policyName, permissionNames] of Object.entries(input.relations.globalPermissionsPolicyOverrides)) {\n const policy = await this.policyRepository.findOneByName(policyName);\n if (!policy) {\n throw new Error(\n `Provisioning: override policy '${policyName}' not found for role '${roleName}'.`,\n );\n }\n for (const permName of permissionNames) {\n overrides.set(permName, policy.id);\n }\n }\n }\n\n return {\n defaultPolicyId: defaultPolicy.id,\n overrides,\n };\n }\n}\n","/*\n * Copyright (c) 2026-2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type {\n PolicyProvisioningEntity,\n RealmProvisioningEntity,\n RoleProvisioningEntity,\n RootProvisioningEntity,\n ScopeProvisioningEntity,\n} from '../../entities/index.ts';\nimport type { PermissionProvisioningEntity } from '../../entities/permission/index.ts';\nimport type { IProvisioningSynchronizer } from '../../types.ts';\nimport { BaseProvisioningSynchronizer } from '../base.ts';\nimport type { RootProvisioningSynchronizerContext } from './types.ts';\n\nexport class GraphProvisioningSynchronizer extends BaseProvisioningSynchronizer<RootProvisioningEntity> {\n protected policySynchronizer: IProvisioningSynchronizer<PolicyProvisioningEntity>;\n\n protected realmSynchronizer: IProvisioningSynchronizer<RealmProvisioningEntity>;\n\n protected permissionSynchronizer : IProvisioningSynchronizer<PermissionProvisioningEntity>;\n\n protected roleSynchronizer: IProvisioningSynchronizer<RoleProvisioningEntity>;\n\n protected scopeSynchronizer: IProvisioningSynchronizer<ScopeProvisioningEntity>;\n\n constructor(ctx: RootProvisioningSynchronizerContext) {\n super();\n\n this.policySynchronizer = ctx.policySynchronizer;\n this.permissionSynchronizer = ctx.permissionSynchronizer;\n this.realmSynchronizer = ctx.realmSynchronizer;\n this.roleSynchronizer = ctx.roleSynchronizer;\n this.scopeSynchronizer = ctx.scopeSynchronizer;\n }\n\n async synchronize(input: RootProvisioningEntity): Promise<RootProvisioningEntity> {\n const output : RootProvisioningEntity = {};\n\n if (input.policies) {\n output.policies = await this.policySynchronizer.synchronizeMany(input.policies);\n }\n\n if (input.permissions) {\n output.permissions = await this.permissionSynchronizer.synchronizeMany(input.permissions);\n }\n\n if (input.roles) {\n output.roles = await this.roleSynchronizer.synchronizeMany(input.roles);\n }\n\n if (input.scopes) {\n output.scopes = await this.scopeSynchronizer.synchronizeMany(input.scopes);\n }\n\n if (input.realms) {\n output.realms = await this.realmSynchronizer.synchronizeMany(input.realms);\n }\n\n return output;\n }\n}\n","/*\n * Copyright (c) 2026-2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type {\n Permission, \n RobotPermission, \n RobotRole, \n Role,\n} from '@authup/core-kit';\nimport { pickRecord } from '@authup/kit';\nimport type { IRobotRepository } from '../../../entities/index.ts';\nimport type { RobotProvisioningEntity } from '../../entities/robot/index.ts';\nimport { ProvisioningEntityStrategyType, normalizeEntityProvisioningStrategy } from '../../strategy/index.ts';\nimport { BaseProvisioningSynchronizer } from '../base.ts';\nimport { ProvisioningEntityResolver } from '../entity-resolver.ts';\nimport { ProvisioningJunctionSynchronizer } from '../junction-synchronizer.ts';\nimport type { RobotProvisioningSynchronizerContext } from './types.ts';\n\nexport class RobotProvisioningSynchronizer extends BaseProvisioningSynchronizer<RobotProvisioningEntity> {\n protected robotRepository: IRobotRepository;\n\n protected permissionResolver: ProvisioningEntityResolver<Permission>;\n\n protected roleResolver: ProvisioningEntityResolver<Role>;\n\n protected permissionJunction: ProvisioningJunctionSynchronizer<RobotPermission>;\n\n protected roleJunction: ProvisioningJunctionSynchronizer<RobotRole>;\n\n constructor(ctx: RobotProvisioningSynchronizerContext) {\n super();\n\n this.robotRepository = ctx.robotRepository;\n\n this.permissionResolver = new ProvisioningEntityResolver(ctx.permissionRepository);\n this.roleResolver = new ProvisioningEntityResolver(ctx.roleRepository);\n\n this.permissionJunction = new ProvisioningJunctionSynchronizer({\n repository: ctx.robotPermissionRepository,\n ownerKey: 'robot_id',\n ownerRealmKey: 'robot_realm_id',\n });\n this.roleJunction = new ProvisioningJunctionSynchronizer({\n repository: ctx.robotRoleRepository,\n ownerKey: 'robot_id',\n ownerRealmKey: 'robot_realm_id',\n });\n }\n\n async synchronize(input: RobotProvisioningEntity): Promise<RobotProvisioningEntity> {\n const strategy = normalizeEntityProvisioningStrategy(input.strategy);\n\n let attributes = await this.robotRepository.findOneBy({\n name: input.attributes.name,\n ...(input.attributes.realm_id ? { realm_id: input.attributes.realm_id } : { realm_id: null }),\n });\n\n if (strategy.type === ProvisioningEntityStrategyType.ABSENT) {\n if (attributes) {\n await this.robotRepository.remove(attributes);\n }\n return {\n ...input,\n attributes: attributes || input.attributes, \n };\n }\n\n if (attributes) {\n switch (strategy.type) {\n case ProvisioningEntityStrategyType.MERGE:\n attributes = this.robotRepository.merge(\n attributes,\n strategy.attributes ?\n pickRecord(input.attributes, strategy.attributes) :\n input.attributes,\n );\n\n attributes = await this.robotRepository.save(attributes);\n break;\n case ProvisioningEntityStrategyType.REPLACE:\n input.attributes.id = attributes.id;\n attributes = await this.robotRepository.save(this.robotRepository.create(input.attributes));\n break;\n }\n } else {\n attributes = await this.robotRepository.save(this.robotRepository.create(input.attributes));\n }\n\n // Permissions (Global & Realm)\n const permissions = [\n ...await this.permissionResolver.resolveGlobal(\n input.relations && input.relations.globalPermissions,\n ),\n ...(attributes.realm_id ?\n await this.permissionResolver.resolveRealm(\n input.relations && input.relations.realmPermissions,\n attributes.realm_id,\n ) :\n []),\n ];\n\n if (permissions.length > 0) {\n await this.permissionJunction.synchronize(\n attributes,\n permissions,\n 'permission_id',\n 'permission_realm_id',\n );\n }\n\n // Roles (Global & Realm)\n const roles = [\n ...await this.roleResolver.resolveGlobal(\n input.relations && input.relations.globalRoles,\n ),\n ...(attributes.realm_id ?\n await this.roleResolver.resolveRealm(\n input.relations && input.relations.realmRoles,\n attributes.realm_id,\n ) :\n []),\n ];\n\n if (roles.length > 0) {\n await this.roleJunction.synchronize(\n attributes,\n roles,\n 'role_id',\n 'role_realm_id',\n );\n }\n\n return {\n ...input,\n attributes,\n };\n }\n}\n","/*\n * Copyright (c) 2026-2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { pickRecord } from '@authup/kit';\nimport type { IScopeRepository } from '../../../entities/index.ts';\nimport type { ScopeProvisioningEntity } from '../../entities/index.ts';\nimport { ProvisioningEntityStrategyType, normalizeEntityProvisioningStrategy } from '../../strategy/index.ts';\nimport { BaseProvisioningSynchronizer } from '../base.ts';\nimport type { ScopeProvisioningSynchronizerContext } from './types.ts';\n\nexport class ScopeProvisioningSynchronizer extends BaseProvisioningSynchronizer<ScopeProvisioningEntity> {\n protected repository : IScopeRepository;\n\n constructor(ctx: ScopeProvisioningSynchronizerContext) {\n super();\n\n this.repository = ctx.repository;\n }\n\n async synchronize(input: ScopeProvisioningEntity): Promise<ScopeProvisioningEntity> {\n const strategy = normalizeEntityProvisioningStrategy(input.strategy);\n\n let attributes = await this.repository.findOneBy({\n name: input.attributes.name,\n realm_id: input.attributes.realm_id || null,\n });\n\n if (strategy.type === ProvisioningEntityStrategyType.ABSENT) {\n if (attributes) {\n await this.repository.remove(attributes);\n }\n return {\n ...input,\n attributes: attributes || input.attributes, \n };\n }\n\n if (attributes) {\n switch (strategy.type) {\n case ProvisioningEntityStrategyType.MERGE:\n attributes = this.repository.merge(\n attributes,\n strategy.attributes ?\n pickRecord(input.attributes, strategy.attributes) :\n input.attributes,\n );\n\n attributes = await this.repository.save(attributes);\n break;\n case ProvisioningEntityStrategyType.REPLACE:\n input.attributes.id = attributes.id;\n attributes = await this.repository.save(this.repository.create(input.attributes));\n break;\n }\n } else {\n attributes = await this.repository.save(this.repository.create(input.attributes));\n }\n\n return {\n ...input,\n attributes,\n };\n }\n}\n","/*\n * Copyright (c) 2026-2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type {\n Permission, \n Role, \n UserPermission, \n UserRole,\n} from '@authup/core-kit';\nimport { buildUserFakeEmail } from '@authup/core-kit';\nimport { pickRecord } from '@authup/kit';\nimport type {\n IClientRepository,\n IUserRepository,\n} from '../../../entities/index.ts';\nimport type { UserProvisioningEntity } from '../../entities/user/index.ts';\nimport { ProvisioningEntityStrategyType, normalizeEntityProvisioningStrategy } from '../../strategy/index.ts';\nimport { BaseProvisioningSynchronizer } from '../base.ts';\nimport { ProvisioningEntityResolver } from '../entity-resolver.ts';\nimport { ProvisioningJunctionSynchronizer } from '../junction-synchronizer.ts';\nimport type { UserProvisioningSynchronizerContext } from './types.ts';\n\nexport class UserProvisioningSynchronizer extends BaseProvisioningSynchronizer<UserProvisioningEntity> {\n protected userRepository: IUserRepository;\n\n protected clientRepository: IClientRepository;\n\n protected permissionResolver: ProvisioningEntityResolver<Permission>;\n\n protected roleResolver: ProvisioningEntityResolver<Role>;\n\n protected permissionJunction: ProvisioningJunctionSynchronizer<UserPermission>;\n\n protected roleJunction: ProvisioningJunctionSynchronizer<UserRole>;\n\n constructor(ctx: UserProvisioningSynchronizerContext) {\n super();\n\n this.userRepository = ctx.userRepository;\n this.clientRepository = ctx.clientRepository;\n\n this.permissionResolver = new ProvisioningEntityResolver(ctx.permissionRepository);\n this.roleResolver = new ProvisioningEntityResolver(ctx.roleRepository);\n\n this.permissionJunction = new ProvisioningJunctionSynchronizer({\n repository: ctx.userPermissionRepository,\n ownerKey: 'user_id',\n ownerRealmKey: 'user_realm_id',\n });\n this.roleJunction = new ProvisioningJunctionSynchronizer({\n repository: ctx.userRoleRepository,\n ownerKey: 'user_id',\n ownerRealmKey: 'user_realm_id',\n });\n }\n\n async synchronize(input: UserProvisioningEntity): Promise<UserProvisioningEntity> {\n const strategy = normalizeEntityProvisioningStrategy(input.strategy);\n\n let attributes = await this.userRepository.findOneBy({\n name: input.attributes.name,\n realm_id: input.attributes.realm_id || null,\n client_id: input.attributes.client_id || null,\n });\n\n if (strategy.type === ProvisioningEntityStrategyType.ABSENT) {\n if (attributes) {\n await this.userRepository.remove(attributes);\n }\n return {\n ...input,\n attributes: attributes || input.attributes, \n };\n }\n\n if (attributes) {\n switch (strategy.type) {\n case ProvisioningEntityStrategyType.MERGE:\n if (\n strategy.attributes &&\n strategy.attributes.includes('email')\n ) {\n input.attributes.email = input.attributes.email ||\n attributes.email ||\n buildUserFakeEmail(input.attributes.name || attributes.name);\n }\n\n attributes = this.userRepository.merge(\n attributes,\n strategy.attributes ?\n pickRecord(input.attributes, strategy.attributes) :\n input.attributes,\n );\n\n attributes = await this.userRepository.save(attributes);\n break;\n case ProvisioningEntityStrategyType.REPLACE:\n input.attributes.email = input.attributes.email ||\n attributes.email ||\n (input.attributes.name ? buildUserFakeEmail(input.attributes.name) : undefined);\n\n input.attributes.id = attributes.id;\n attributes = await this.userRepository.save(this.userRepository.create(input.attributes));\n break;\n }\n } else {\n if (!input.attributes.email && input.attributes.name) {\n input.attributes.email = buildUserFakeEmail(input.attributes.name);\n }\n\n attributes = await this.userRepository.save(this.userRepository.create(input.attributes));\n }\n\n // Permissions (Global, Realm & Client)\n const permissions : Permission[] = [\n ...await this.permissionResolver.resolveGlobal(\n input.relations && input.relations.globalPermissions,\n ),\n ...(attributes.realm_id ?\n await this.permissionResolver.resolveRealm(\n input.relations && input.relations.realmPermissions,\n attributes.realm_id,\n ) :\n []),\n ];\n\n if (input.relations && input.relations.clientPermissions) {\n const clientKeys = Object.keys(input.relations.clientPermissions);\n for (const clientKey of clientKeys) {\n const client = await this.clientRepository.findOneBy({\n name: clientKey,\n realm_id: attributes.realm_id,\n });\n\n if (client) {\n const entities = await this.permissionResolver.resolveClient(\n input.relations.clientPermissions[clientKey],\n attributes.realm_id,\n client.id,\n );\n permissions.push(...entities);\n }\n }\n }\n\n if (permissions.length > 0) {\n await this.permissionJunction.synchronize(\n attributes,\n permissions,\n 'permission_id',\n 'permission_realm_id',\n );\n }\n\n // Roles (Global, Realm & Client)\n const roles : Role[] = [\n ...await this.roleResolver.resolveGlobal(\n input.relations && input.relations.globalRoles,\n ),\n ...(attributes.realm_id ?\n await this.roleResolver.resolveRealm(\n input.relations && input.relations.realmRoles,\n attributes.realm_id,\n ) :\n []),\n ];\n\n if (input.relations && input.relations.clientRoles) {\n const clientKeys = Object.keys(input.relations.clientRoles);\n for (const clientKey of clientKeys) {\n const client = await this.clientRepository.findOneBy({\n name: clientKey,\n realm_id: attributes.realm_id,\n });\n\n if (client) {\n const entities = await this.roleResolver.resolveClient(\n input.relations.clientRoles[clientKey],\n attributes.realm_id,\n client.id,\n );\n roles.push(...entities);\n }\n }\n }\n\n if (roles.length > 0) {\n await this.roleJunction.synchronize(\n attributes,\n roles,\n 'role_id',\n 'role_realm_id',\n );\n }\n\n return {\n ...input,\n attributes,\n };\n }\n}\n","/*\n * Copyright (c) 2024-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type {\n BasePolicy,\n CompositePolicy,\n IPolicyEvaluator,\n PermissionPolicyBinding,\n PolicyEvaluationContext,\n PolicyEvaluationResult,\n} from '@authup/access';\nimport {\n AttributesPolicyEvaluator,\n BuiltInPolicyType,\n IdentityPolicyEvaluator,\n PermissionBindingPolicyValidator,\n PolicyEngine,\n PolicyIssueCode,\n definePolicyIssueItem,\n maybeInvertPolicyOutcome,\n mergePermissionPolicyBindings,\n} from '@authup/access';\nimport type { IIdentityPermissionProvider } from '../../identity/permission/types.ts';\n\nexport class PermissionBindingPolicyEvaluator implements IPolicyEvaluator {\n protected validator : PermissionBindingPolicyValidator;\n\n protected identityEvaluator: IdentityPolicyEvaluator;\n\n protected attributesEvaluator : AttributesPolicyEvaluator;\n\n protected identityPermissionProvider: IIdentityPermissionProvider;\n\n constructor(identityPermissionProvider: IIdentityPermissionProvider) {\n this.validator = new PermissionBindingPolicyValidator();\n this.identityEvaluator = new IdentityPolicyEvaluator();\n this.attributesEvaluator = new AttributesPolicyEvaluator();\n this.identityPermissionProvider = identityPermissionProvider;\n }\n\n async accessData(ctx: PolicyEvaluationContext) : Promise<PermissionPolicyBinding | null> {\n if (!ctx.data.has(BuiltInPolicyType.PERMISSION_BINDING)) {\n return null;\n }\n\n if (ctx.data.isValidated(BuiltInPolicyType.PERMISSION_BINDING)) {\n return ctx.data.get(BuiltInPolicyType.PERMISSION_BINDING);\n }\n\n const data = ctx.data.get<PermissionPolicyBinding>(BuiltInPolicyType.PERMISSION_BINDING);\n\n ctx.data.set(BuiltInPolicyType.PERMISSION_BINDING, data);\n ctx.data.setValidated(BuiltInPolicyType.PERMISSION_BINDING);\n\n return data;\n }\n\n async evaluate(value: Record<string, any>, ctx: PolicyEvaluationContext): Promise<PolicyEvaluationResult> {\n const policy = await this.validator.run(value);\n\n const identity = await this.identityEvaluator.accessData(ctx);\n if (!identity) {\n return {\n success: false,\n issues: [\n definePolicyIssueItem({\n code: PolicyIssueCode.DATA_MISSING,\n message: 'The data property identity is missing',\n path: ctx.path,\n }),\n ],\n };\n }\n const binding = await this.accessData(ctx);\n if (!binding) {\n return {\n success: false,\n issues: [\n definePolicyIssueItem({\n code: PolicyIssueCode.DATA_MISSING,\n message: 'The data property permission is missing',\n path: ctx.path,\n }),\n ],\n };\n }\n\n const identityBindings = await this.identityPermissionProvider.getFor(identity)\n .then((bindings) => bindings.filter((item) => {\n if (item.permission.name !== binding.permission.name) {\n return false;\n }\n\n return (binding.permission.realm_id ?? null) === (item.permission.realm_id ?? null) &&\n (binding.permission.client_id ?? null) === (item.permission.client_id ?? null);\n }));\n\n if (identityBindings.length === 0) {\n return { success: maybeInvertPolicyOutcome(false, policy.invert) };\n }\n\n const bindingsMerged = mergePermissionPolicyBindings(identityBindings);\n if (bindingsMerged.length === 0) {\n return { success: maybeInvertPolicyOutcome(false, policy.invert) };\n }\n\n const policies : BasePolicy[] = bindingsMerged\n .flatMap((b) => b.policies || []);\n\n if (policies.length === 0) {\n return { success: maybeInvertPolicyOutcome(true, policy.invert) };\n }\n\n if (!ctx.evaluators) {\n return { success: maybeInvertPolicyOutcome(false, policy.invert) };\n }\n\n const compositePolicy : CompositePolicy = {\n children: policies,\n type: BuiltInPolicyType.COMPOSITE,\n };\n\n const engine = new PolicyEngine(ctx.evaluators);\n const outcome = await engine.evaluate(compositePolicy, {\n ...ctx,\n path: [\n ...(ctx.path || []),\n ...(compositePolicy.type ? [compositePolicy.type] : []),\n ],\n });\n\n return {\n ...outcome,\n success: maybeInvertPolicyOutcome(outcome.success, policy.invert),\n };\n }\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { PolicyEngine as BasePolicyEngine, BuiltInPolicyType, PolicyDefaultEvaluators } from '@authup/access';\nimport type { IIdentityPermissionProvider } from '../../identity/permission/types.ts';\nimport { PermissionBindingPolicyEvaluator } from './evaluator.ts';\n\nexport class PolicyEngine extends BasePolicyEngine {\n constructor(identityPermissionProvider: IIdentityPermissionProvider) {\n super(PolicyDefaultEvaluators);\n\n this.registerEvaluator(BuiltInPolicyType.PERMISSION_BINDING, new PermissionBindingPolicyEvaluator(identityPermissionProvider));\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { ICache } from '@authup/server-kit';\nimport { TypedToken } from 'eldin';\n\nexport const CacheInjectionKey = new TypedToken<ICache>('Cache');\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport const ModuleName = {\n CONFIG: 'config',\n LOGGER: 'logger',\n CACHE: 'cache',\n MAIL: 'mail',\n RUNTIME: 'runtime',\n SWAGGER: 'swagger',\n DATABASE: 'database',\n PROVISIONING: 'provisioning',\n LDAP: 'ldap',\n AUTHENTICATION: 'authentication',\n IDENTITY: 'identity',\n OAUTH2: 'oauth2',\n COMPONENTS: 'components',\n HTTP: 'http',\n} as const;\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { TypedToken } from 'eldin';\nimport type { Config } from './types.ts';\n\nexport const ConfigInjectionKey = new TypedToken<Config>('Config');\n\nexport enum ConfigEnvironmentVariableName {\n NODE_ENV = 'NODE_ENV',\n WRITABLE_DIRECTORY_PATH = 'WRITABLE_DIRECTORY_PATH',\n\n REDIS = 'REDIS',\n SMTP = 'SMTP',\n\n HOST = 'HOST',\n PORT = 'PORT',\n PUBLIC_URL = 'PUBLIC_URL',\n TOKEN_ACCESS_MAX_AGE = 'TOKEN_ACCESS_MAX_AGE',\n TOKEN_REFRESH_MAX_AGE = 'TOKEN_REFRESH_MAX_AGE',\n REGISTRATION_ENABLED = 'REGISTRATION_ENABLED',\n EMAIL_VERIFICATION_ENABLED = 'EMAIL_VERIFICATION_ENABLED',\n PASSWORD_RECOVERY_ENABLED = 'PASSWORD_RECOVERY_ENABLED',\n\n CLIENT_AUTH_BASIC = 'CLIENT_AUTH_BASIC',\n CLIENT_SYSTEM_ENABLED = 'CLIENT_SYSTEM_ENABLED',\n CLIENT_SYSTEM_SECRET = 'CLIENT_SYSTEM_SECRET',\n CLIENT_SYSTEM_SECRET_RESET = 'CLIENT_SYSTEM_SECRET_RESET',\n\n USER_AUTH_BASIC = 'USER_AUTH_BASIC',\n USER_ADMIN_ENABLED = 'USER_ADMIN_ENABLED',\n USER_ADMIN_PASSWORD = 'USER_ADMIN_PASSWORD',\n USER_ADMIN_PASSWORD_RESET = 'USER_ADMIN_PASSWORD_RESET',\n\n ROBOT_AUTH_BASIC = 'ROBOT_AUTH_BASIC',\n ROBOT_ADMIN_ENABLED = 'ROBOT_ADMIN_ENABLED',\n ROBOT_ADMIN_SECRET = 'ROBOT_ADMIN_SECRET',\n ROBOT_ADMIN_SECRET_RESET = 'ROBOT_ADMIN_SECRET_RESET',\n\n PERMISSIONS = 'PERMISSIONS',\n PERMISSIONS_DEFAULT_POLICY_ASSIGNMENT = 'PERMISSIONS_DEFAULT_POLICY_ASSIGNMENT',\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport function toPublicHost(input: string) {\n if (input === '0.0.0.0' || input === '::') {\n return 'localhost';\n }\n\n return input;\n}\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information.optional(),\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { isObject } from '@authup/kit';\nimport type { BetterSqlite3ConnectionOptions } from 'typeorm/driver/better-sqlite3/BetterSqlite3ConnectionOptions.js';\nimport type { MysqlConnectionOptions } from 'typeorm/driver/mysql/MysqlConnectionOptions.js';\nimport type { PostgresConnectionOptions } from 'typeorm/driver/postgres/PostgresConnectionOptions.js';\nimport zod from 'zod';\nimport type { Config, ConfigInput } from './types.ts';\n\nexport function parseConfig(input: unknown = {}): ConfigInput {\n const schema = zod.object({\n env: zod.string().optional(),\n rootPath: zod.string().optional(),\n writableDirectoryPath: zod.string().optional(),\n\n logger: zod.boolean().optional(),\n db: zod.custom<MysqlConnectionOptions | PostgresConnectionOptions | BetterSqlite3ConnectionOptions>(\n (value) => isObject(value),\n ).optional(),\n redis: zod.lazy(() => zod.union([\n zod.string().optional(),\n zod.boolean().optional(),\n zod.any().optional(),\n ])).optional(),\n smtp: zod.lazy(() => zod.union([\n zod.string().optional(),\n zod.boolean().optional(),\n zod.any().optional(),\n ])).optional(),\n port: zod.number()\n .nonnegative().optional(),\n host: zod.string().optional(),\n publicUrl: zod.string()\n .url().optional(),\n middlewareBody: zod.boolean()\n .or(zod.record(zod.string(), zod.any())).optional(),\n middlewareCors: zod.boolean()\n .or(zod.record(zod.string(), zod.any())).optional(),\n middlewareCookie: zod.boolean()\n .or(zod.record(zod.string(), zod.any())).optional(),\n middlewareQuery: zod.boolean()\n .or(zod.record(zod.string(), zod.any())).optional(),\n middlewarePrometheus: zod.boolean()\n .or(zod.record(zod.string(), zod.any())).optional(),\n middlewareRateLimit: zod.boolean()\n .or(zod.record(zod.string(), zod.any())).optional(),\n middlewareSwagger: zod.boolean().optional(),\n\n tokenAccessMaxAge: zod.number()\n .nonnegative().optional(),\n tokenRefreshMaxAge: zod.number()\n .nonnegative().optional(),\n registrationEnabled: zod.boolean().optional(),\n emailVerificationEnabled: zod.boolean().optional(),\n passwordRecoveryEnabled: zod.boolean().optional(),\n\n clientAuthBasic: zod.boolean().optional(),\n clientSystemEnabled: zod.boolean().optional(),\n clientSystemSecret: zod.string()\n .min(3)\n .max(256).optional(),\n clientSystemSecretReset: zod.boolean().optional(),\n\n userAuthBasic: zod.boolean().optional(),\n userAdminEnabled: zod.boolean().optional(),\n userAdminPassword: zod.string()\n .min(3)\n .max(256).optional(),\n userAdminPasswordReset: zod.boolean().optional(),\n\n robotAuthBasic: zod.boolean().optional(),\n robotAdminEnabled: zod.boolean().optional(),\n robotAdminSecret: zod.string()\n .min(3)\n .max(256).optional(),\n robotAdminSecretReset: zod.boolean().optional(),\n\n permissions: zod.string()\n .or(zod.array(zod.string()))\n .optional(),\n\n permissionsDefaultPolicyAssignment: zod.boolean().optional(),\n } satisfies Record<keyof Config, any>);\n\n return schema.parse(input);\n}\n","/*\n * Copyright (c) 2023-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { read } from 'envix';\nimport path from 'node:path';\nimport process from 'node:process';\nimport { EnvironmentName } from '@authup/kit';\nimport { toPublicHost } from '../../../utils/host.ts';\nimport { parseConfig } from './parse.ts';\nimport type { Config, ConfigInput } from './types.ts';\n\nexport function normalizeConfig(input: ConfigInput = {}): Config {\n const parsed = parseConfig(input);\n\n const writableDirectoryPath = parsed.writableDirectoryPath ||\n path.join(process.cwd(), 'writable');\n\n const port = parsed.port || 3001;\n let host = parsed.host || '0.0.0.0';\n\n let publicUrl : string;\n if (parsed.publicUrl) {\n publicUrl = parsed.publicUrl;\n } else {\n const regex = /^([^:]+)(?::(\\d+))?$/;\n const match = host.match(regex);\n if (match) {\n [, host] = match;\n publicUrl = `http://${toPublicHost(host)}:${match[2] || port}`;\n } else {\n publicUrl = `http://${toPublicHost(host)}:${port}`;\n }\n }\n\n return {\n env: read('NODE_ENV', EnvironmentName.DEVELOPMENT),\n rootPath: process.cwd(),\n writableDirectoryPath,\n\n logger: true,\n redis: false,\n smtp: false,\n\n port,\n host,\n publicUrl,\n\n middlewareBody: true,\n middlewareCookie: true,\n middlewareCors: true,\n middlewarePrometheus: true,\n middlewareQuery: true,\n middlewareRateLimit: true,\n middlewareSwagger: true,\n tokenRefreshMaxAge: 259_200,\n tokenAccessMaxAge: 3_600,\n registrationEnabled: false,\n emailVerificationEnabled: false,\n passwordRecoveryEnabled: false,\n\n clientAuthBasic: false,\n clientSystemEnabled: false,\n clientSystemSecret: 'start123',\n clientSystemSecretReset: false,\n\n userAuthBasic: false,\n userAdminEnabled: true,\n userAdminPassword: 'start123',\n userAdminPasswordReset: false,\n\n robotAuthBasic: false,\n robotAdminEnabled: false,\n robotAdminSecret: 'start123',\n robotAdminSecretReset: false,\n\n permissions: [],\n permissionsDefaultPolicyAssignment: true,\n ...parsed,\n };\n}\n","/*\n * Copyright (c) 2022-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n oneOf, \n read, \n readArray, \n readBool, \n readInt,\n} from 'envix';\nimport { hasEnvDataSourceOptions, readDataSourceOptionsFromEnv } from 'typeorm-extension';\nimport type { BetterSqlite3ConnectionOptions } from 'typeorm/driver/better-sqlite3/BetterSqlite3ConnectionOptions.js';\nimport type { MysqlConnectionOptions } from 'typeorm/driver/mysql/MysqlConnectionOptions.js';\nimport type { PostgresConnectionOptions } from 'typeorm/driver/postgres/PostgresConnectionOptions.js';\n\nimport { ConfigEnvironmentVariableName } from '../constants.ts';\nimport type { ConfigInput } from '../types.ts';\n\nexport function readConfigRawFromEnv() : ConfigInput {\n const options : ConfigInput = {};\n\n const env = read(ConfigEnvironmentVariableName.NODE_ENV);\n if (env) {\n options.env = env;\n }\n\n const writableDirectoryPath = read(ConfigEnvironmentVariableName.WRITABLE_DIRECTORY_PATH);\n if (writableDirectoryPath) {\n options.writableDirectoryPath = writableDirectoryPath;\n }\n\n // -------------------------------------------------------------\n\n if (hasEnvDataSourceOptions()) {\n // todo: type casting should be avoided\n options.db = readDataSourceOptionsFromEnv() as MysqlConnectionOptions |\n PostgresConnectionOptions |\n BetterSqlite3ConnectionOptions;\n }\n\n const redis = oneOf([\n readBool(ConfigEnvironmentVariableName.REDIS),\n read(ConfigEnvironmentVariableName.REDIS),\n ]);\n if (typeof redis !== 'undefined') {\n options.redis = redis;\n }\n\n const smtp = oneOf([\n readBool(ConfigEnvironmentVariableName.SMTP),\n read(ConfigEnvironmentVariableName.SMTP),\n ]);\n if (typeof smtp !== 'undefined') {\n options.smtp = smtp;\n }\n\n // -------------------------------------------------------------\n\n const host = read(ConfigEnvironmentVariableName.HOST);\n if (host) {\n options.host = host;\n }\n\n const port = readInt(ConfigEnvironmentVariableName.PORT);\n if (port) {\n options.port = Number.parseInt(`${port}`, 10);\n }\n\n const publicURL = read(ConfigEnvironmentVariableName.PUBLIC_URL);\n if (publicURL) {\n options.publicUrl = publicURL;\n }\n\n const tokenAccessMaxAge = readInt(ConfigEnvironmentVariableName.TOKEN_ACCESS_MAX_AGE);\n if (typeof tokenAccessMaxAge !== 'undefined') {\n options.tokenAccessMaxAge = tokenAccessMaxAge;\n }\n\n const tokenRefreshMaxAge = readInt(ConfigEnvironmentVariableName.TOKEN_REFRESH_MAX_AGE);\n if (typeof tokenRefreshMaxAge !== 'undefined') {\n options.tokenRefreshMaxAge = tokenRefreshMaxAge;\n }\n\n const registrationEnabled = readBool(ConfigEnvironmentVariableName.REGISTRATION_ENABLED);\n if (typeof registrationEnabled !== 'undefined') {\n options.registrationEnabled = registrationEnabled;\n }\n\n const emailVerificationEnabled = readBool(ConfigEnvironmentVariableName.EMAIL_VERIFICATION_ENABLED);\n if (typeof emailVerificationEnabled !== 'undefined') {\n options.emailVerificationEnabled = emailVerificationEnabled;\n }\n\n const passwordRecoveryEnabled = readBool(ConfigEnvironmentVariableName.PASSWORD_RECOVERY_ENABLED);\n if (typeof passwordRecoveryEnabled !== 'undefined') {\n options.passwordRecoveryEnabled = passwordRecoveryEnabled;\n }\n\n // ---------------------------------------------------------------\n\n const clientBasicAuth = readBool(ConfigEnvironmentVariableName.CLIENT_AUTH_BASIC);\n if (typeof clientBasicAuth !== 'undefined') {\n options.clientAuthBasic = clientBasicAuth;\n }\n\n const clientSystemEnabled = readBool(ConfigEnvironmentVariableName.CLIENT_SYSTEM_ENABLED);\n if (typeof clientSystemEnabled !== 'undefined') {\n options.clientSystemEnabled = clientSystemEnabled;\n }\n\n const clientAdminSecret = read(ConfigEnvironmentVariableName.CLIENT_SYSTEM_SECRET);\n if (clientAdminSecret) {\n options.clientSystemSecret = clientAdminSecret;\n }\n\n const clientAdminSecretReset = readBool(ConfigEnvironmentVariableName.CLIENT_SYSTEM_SECRET_RESET);\n if (typeof clientAdminSecretReset !== 'undefined') {\n options.clientSystemSecretReset = clientAdminSecretReset;\n }\n\n // ---------------------------------------------------------------\n\n const userBasicAuth = readBool(ConfigEnvironmentVariableName.USER_AUTH_BASIC);\n if (typeof userBasicAuth !== 'undefined') {\n options.userAuthBasic = userBasicAuth;\n }\n\n const userAdminEnabled = readBool(ConfigEnvironmentVariableName.USER_ADMIN_ENABLED);\n if (typeof userAdminEnabled !== 'undefined') {\n options.userAdminEnabled = userAdminEnabled;\n }\n\n const userAdminPassword = read(ConfigEnvironmentVariableName.USER_ADMIN_PASSWORD);\n if (userAdminPassword) {\n options.userAdminPassword = userAdminPassword;\n }\n\n const userAdminPasswordReset = readBool(ConfigEnvironmentVariableName.USER_ADMIN_PASSWORD_RESET);\n if (typeof userAdminPasswordReset !== 'undefined') {\n options.userAdminPasswordReset = userAdminPasswordReset;\n }\n\n // ---------------------------------------------------------------\n\n const robotBasicAuth = readBool(ConfigEnvironmentVariableName.ROBOT_AUTH_BASIC);\n if (typeof robotBasicAuth !== 'undefined') {\n options.robotAuthBasic = robotBasicAuth;\n }\n\n const robotAdminEnabled = readBool(ConfigEnvironmentVariableName.ROBOT_ADMIN_ENABLED);\n if (typeof robotAdminEnabled !== 'undefined') {\n options.robotAdminEnabled = robotAdminEnabled;\n }\n\n const robotAdminSecret = read(ConfigEnvironmentVariableName.ROBOT_ADMIN_SECRET);\n if (robotAdminSecret) {\n options.robotAdminSecret = robotAdminSecret;\n }\n\n const robotAdminSecretReset = readBool(ConfigEnvironmentVariableName.ROBOT_ADMIN_SECRET_RESET);\n if (typeof robotAdminSecretReset !== 'undefined') {\n options.robotAdminSecretReset = robotAdminSecretReset;\n }\n\n // ---------------------------------------------------------------\n\n const permissions = readArray(ConfigEnvironmentVariableName.PERMISSIONS);\n if (permissions && permissions.length > 0) {\n options.permissions = permissions;\n }\n\n const permissionsDefaultPolicyAssignment = readBool(ConfigEnvironmentVariableName.PERMISSIONS_DEFAULT_POLICY_ASSIGNMENT);\n if (typeof permissionsDefaultPolicyAssignment !== 'undefined') {\n options.permissionsDefaultPolicyAssignment = permissionsDefaultPolicyAssignment;\n }\n\n return options;\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { Container } from 'confinity';\nimport type { ConfigInput } from '../types.ts';\nimport type { ConfigReadFsOptions } from './types.ts';\n\nexport async function readConfigRawFromFS(options: ConfigReadFsOptions = {}) {\n const container = new Container({\n prefix: 'authup',\n cwd: options.cwd,\n });\n\n if (options.file) {\n await container.loadFile(options.file);\n } else {\n await container.load();\n }\n\n const raw : ConfigInput = container.get('server.core') || {};\n\n const db = container.get([\n 'db',\n 'server.db',\n 'server.core.db',\n ]);\n if (db) {\n raw.db = db;\n }\n\n const redis = container.get([\n 'redis',\n 'server.redis',\n 'server.core.redis',\n ]);\n if (redis) {\n raw.redis = redis;\n }\n\n const smtp = container.get([\n 'smtp',\n 'server.smtp',\n 'server.core.smtp',\n ]);\n if (smtp) {\n raw.smtp = smtp;\n }\n\n return raw;\n}\n","/*\n * Copyright (c) 2024-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { merge } from 'smob';\nimport type { ConfigInput } from '../types.ts';\nimport { readConfigRawFromEnv } from './env.ts';\nimport { readConfigRawFromFS } from './fs.ts';\nimport type { ConfigRawReadOptions } from './types.ts';\n\nexport async function readConfigRaw(options: ConfigRawReadOptions = {}) : Promise<ConfigInput> {\n if (options.fs && options.env) {\n const fsOptions = boolableToObject(options.fs);\n const fs = await readConfigRawFromFS(fsOptions);\n const env = readConfigRawFromEnv();\n\n return merge(env, fs);\n }\n\n if (options.fs) {\n const fsOptions = boolableToObject(options.fs);\n return readConfigRawFromFS(fsOptions);\n }\n\n if (options.env) {\n return readConfigRawFromEnv();\n }\n\n return {};\n}\n\nfunction boolableToObject<T>(input: T | boolean) : T {\n if (typeof input === 'boolean') {\n return {} as T;\n }\n\n return input;\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { IModule } from 'orkos';\nimport { ModuleName } from '../constants.ts';\nimport { ConfigInjectionKey } from './constants.ts';\nimport type { IContainer } from 'eldin';\nimport { normalizeConfig } from './normalize.ts';\nimport type { ConfigRawReadOptions } from './read/index.ts';\nimport { readConfigRaw } from './read/index.ts';\nimport type { Config } from './types.ts';\n\nexport class ConfigModule implements IModule {\n readonly name: string;\n\n protected instance : Config | undefined;\n\n // ----------------------------------------------------\n\n constructor(config?: Config) {\n this.name = ModuleName.CONFIG;\n this.instance = config;\n }\n\n // ----------------------------------------------------\n\n async setup(container: IContainer): Promise<void> {\n let instance : Config;\n if (this.instance) {\n instance = this.instance;\n } else {\n instance = await this.read();\n }\n\n container.register(ConfigInjectionKey, { useValue: instance });\n }\n\n // ----------------------------------------------------\n\n /**\n * Read config from env and fs.\n *\n * @param options\n */\n async read(options: ConfigRawReadOptions = {}) : Promise<Config> {\n const raw = await readConfigRaw({\n env: true,\n ...options,\n });\n\n return normalizeConfig(raw);\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { MemoryCache, RedisCache } from '@authup/server-kit';\nimport type { IModule } from 'orkos';\nimport { ModuleName } from '../constants.ts';\nimport { CacheInjectionKey } from './constants.ts';\nimport { ConfigInjectionKey } from '../config/index.ts';\nimport type { IContainer } from 'eldin';\n\nexport class CacheModule implements IModule {\n readonly name: string;\n\n readonly dependencies: string[];\n\n constructor() {\n this.name = ModuleName.CACHE;\n this.dependencies = [ModuleName.CONFIG];\n }\n\n async setup(container: IContainer): Promise<void> {\n const result = container.tryResolve(ConfigInjectionKey);\n if (!result.success || !result.data.redis) {\n container.register(CacheInjectionKey, { useFactory: () => new MemoryCache() });\n\n return;\n }\n\n container.register(CacheInjectionKey, { useFactory: () => new RedisCache(result.data.redis) });\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport enum AuthenticationCachePrefix {\n SESSION = 'session',\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Session } from '@authup/core-kit';\nimport type { ICache } from '@authup/server-kit';\nimport { buildCacheKey } from '@authup/server-kit';\nimport type { Repository } from 'typeorm';\nimport type { ISessionRepository } from '../../../../core/index.ts';\nimport { AuthenticationCachePrefix } from './constants.ts';\n\ntype SessionRepositoryContext = {\n repository: Repository<Session>,\n cache: ICache\n};\n\nexport class SessionRepository implements ISessionRepository {\n protected cache : ICache;\n\n protected repository : Repository<Session>;\n\n // -----------------------------------------------------\n\n constructor(ctx: SessionRepositoryContext) {\n this.cache = ctx.cache;\n this.repository = ctx.repository;\n }\n\n // -----------------------------------------------------\n\n async findOneById(id: string): Promise<Session | null> {\n const session = await this.cache.get<Session>(\n buildCacheKey({\n prefix: AuthenticationCachePrefix.SESSION,\n key: id, \n }),\n );\n\n if (session) {\n return session;\n }\n\n return this.repository.findOneBy({ id });\n }\n\n // -----------------------------------------------------\n\n async save(input: Partial<Session>): Promise<Session> {\n const session = this.repository.create(input);\n await this.repository.save(session);\n\n await this.cache.set(\n buildCacheKey({\n prefix: AuthenticationCachePrefix.SESSION,\n key: session.id, \n }),\n session,\n { ttl: new Date(session.expires_at).getTime() - Date.now() },\n );\n\n return session;\n }\n\n // -----------------------------------------------------\n\n async remove(session: Session): Promise<void> {\n await this.repository.remove(session);\n await this.cache.drop(\n buildCacheKey({\n prefix: AuthenticationCachePrefix.SESSION,\n key: session.id, \n }),\n );\n }\n\n async removeById(id: string): Promise<void> {\n const session = await this.findOneById(id);\n\n if (session) {\n await this.remove(session);\n }\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Session } from '@authup/core-kit';\nimport type { Repository } from 'typeorm';\nimport { SessionEntity } from '../../../adapters/database/domains/index.ts';\nimport type { IContainer } from 'eldin';\nimport { SessionManager } from '../../../core/index.ts';\nimport { CacheInjectionKey } from '../cache/index.ts';\nimport { ConfigInjectionKey } from '../config/index.ts';\n\nimport type { IModule } from 'orkos';\nimport { ModuleName } from '../constants.ts';\nimport { AuthenticationInjectionKey } from './constants.ts';\nimport { SessionRepository } from './repositories/index.ts';\n\nexport class AuthenticationModule implements IModule {\n readonly name: string;\n\n readonly dependencies: string[];\n\n constructor() {\n this.name = ModuleName.AUTHENTICATION;\n this.dependencies = [ModuleName.DATABASE, ModuleName.CACHE, ModuleName.CONFIG];\n }\n\n async setup(container: IContainer): Promise<void> {\n container.register(AuthenticationInjectionKey.SessionRepository, {\n useFactory: (c) => {\n const cache = c.resolve(CacheInjectionKey);\n const repository = c.resolve<Repository<Session>>(SessionEntity);\n return new SessionRepository({\n cache,\n repository,\n });\n },\n });\n\n container.register(AuthenticationInjectionKey.SessionManager, {\n useFactory: (c) => {\n const config = c.resolve(ConfigInjectionKey);\n const repository = c.resolve(AuthenticationInjectionKey.SessionRepository);\n return new SessionManager({\n repository,\n options: { maxAge: config.tokenRefreshMaxAge + 3_600 },\n });\n },\n });\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { DataSource } from 'typeorm';\nimport { PermissionEntity, RoleEntity } from '../../../adapters/database/domains/index.ts';\nimport type { Component } from '../../types.ts';\n\nexport class DatabaseUniqueEntriesComponent implements Component {\n protected dataSource: DataSource;\n\n constructor(dataSource: DataSource) {\n this.dataSource = dataSource;\n }\n\n /**\n * Thus a unique check failed for mysql driver,\n * existing duplicate entries must be removed.\n */\n async start() {\n await this.enforceUniqueRoles();\n await this.enforceUniquePermissions();\n }\n\n async enforceUniqueRoles() {\n const repository = this.dataSource.getRepository(RoleEntity);\n const queryBuilder = repository.createQueryBuilder('role');\n\n queryBuilder.orderBy('role.created_at', 'ASC');\n\n const entities = await queryBuilder.getMany();\n const aggregated = entities.reduce((prev, curr) => {\n const key = this.buildKey({\n name: curr.name,\n client_id: curr.client_id,\n realm_id: curr.realm_id,\n });\n\n if (Array.isArray(prev[key])) {\n prev[key].push(curr);\n } else {\n prev[key] = [curr];\n }\n\n return prev;\n }, {} as Record<string, RoleEntity[]>);\n\n const keys = Object.keys(aggregated);\n for (const key of keys) {\n const [, ...rest] = aggregated[key];\n if (rest.length === 0) {\n continue;\n }\n\n await repository.remove(rest);\n }\n }\n\n async enforceUniquePermissions() {\n const repository = this.dataSource.getRepository(PermissionEntity);\n const queryBuilder = repository.createQueryBuilder('permission');\n\n queryBuilder.orderBy('permission.created_at', 'ASC');\n\n const entities = await queryBuilder.getMany();\n const aggregated = entities.reduce((prev, curr) => {\n const key = this.buildKey({\n name: curr.name,\n client_id: curr.client_id,\n realm_id: curr.realm_id,\n });\n\n if (Array.isArray(prev[key])) {\n prev[key].push(curr);\n } else {\n prev[key] = [curr];\n }\n\n return prev;\n }, {} as Record<string, PermissionEntity[]>);\n\n const keys = Object.keys(aggregated);\n for (const key of keys) {\n const [, ...rest] = aggregated[key];\n if (rest.length === 0) {\n continue;\n }\n\n await repository.remove(rest);\n }\n }\n\n protected buildKey(props: Record<string, string | null>) {\n const keys = Object.keys(props);\n\n return keys\n .map((key) => (typeof props[key] === 'string' ? props[key] : `${props[key]}`))\n .join(':');\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { DataSource } from 'typeorm';\nimport { DatabaseUniqueEntriesComponent } from './module.ts';\n\nexport function createDatabaseUniqueEntriesComponent(dataSource: DataSource) {\n return new DatabaseUniqueEntriesComponent(dataSource);\n}\n","/*\n * Copyright (c) 2022-2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport cron from 'node-cron';\nimport type { DataSource } from 'typeorm';\nimport { LessThan } from 'typeorm';\nimport { SessionEntity } from '../../adapters/database/domains/index.ts';\nimport type { Component } from '../types.ts';\n\nexport function createOAuth2CleanerComponent(dataSource: DataSource) : Component {\n return {\n async start() {\n const sessionRepository = dataSource.getRepository(SessionEntity);\n\n const execute = async () => {\n const isoDate = new Date().toISOString();\n\n await sessionRepository\n .delete({ expires_at: LessThan(isoDate) });\n };\n\n await execute();\n\n cron.schedule('* * * * *', async () => {\n await execute();\n });\n },\n };\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { DataSource } from 'typeorm';\nimport { TypedToken } from 'eldin';\n\nexport const DatabaseInjectionKey = { DataSource: new TypedToken<DataSource>('DataSource') } as const;\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { ICache } from '@authup/server-kit';\nimport { escapeRedisKey } from '@authup/server-kit';\nimport type { QueryResultCache } from 'typeorm/cache/QueryResultCache.js';\nimport type { QueryResultCacheOptions } from 'typeorm/cache/QueryResultCacheOptions.js';\n\nexport class DatabaseQueryResultCache implements QueryResultCache {\n protected instance : ICache;\n\n constructor(cache: ICache) {\n this.instance = cache;\n }\n\n protected buildKey(id: string) {\n return escapeRedisKey(`db:${id}`);\n }\n\n async clear(): Promise<void> {\n await this.instance.clear({ prefix: this.buildKey('') });\n }\n\n async connect(): Promise<void> {\n return Promise.resolve();\n }\n\n async disconnect(): Promise<void> {\n return Promise.resolve();\n }\n\n async getFromCache(options: QueryResultCacheOptions): Promise<QueryResultCacheOptions | undefined> {\n let output : QueryResultCacheOptions | undefined | null;\n if (options.identifier) {\n output = await this.instance.get(this.buildKey(options.identifier));\n } else if (typeof options.query !== 'undefined') {\n output = await this.instance.get(this.buildKey(encodeURIComponent(options.query)));\n }\n\n if (output) {\n return output;\n }\n\n return undefined;\n }\n\n isExpired(savedCache: QueryResultCacheOptions): boolean {\n if (typeof savedCache.time === 'undefined') {\n return true;\n }\n\n return (savedCache.time + savedCache.duration) < new Date().getTime();\n }\n\n async remove(identifiers: string[]): Promise<void> {\n const keys = identifiers.map((identifier) => this.buildKey(identifier));\n await this.instance.dropMany(keys);\n }\n\n async storeInCache(options: QueryResultCacheOptions): Promise<void> {\n if (options.identifier) {\n await this.instance.set(\n this.buildKey(options.identifier),\n options,\n { ttl: options.duration },\n );\n\n return;\n }\n\n if (typeof options.query !== 'undefined') {\n await this.instance.set(\n this.buildKey(encodeURIComponent(options.query)),\n options,\n { ttl: options.duration },\n );\n }\n }\n\n synchronize(): Promise<void> {\n return Promise.resolve(undefined);\n }\n}\n","/*\n * Copyright (c) 2022-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { AuthupError } from '@authup/errors';\nimport type { DataSourceOptions } from 'typeorm';\nimport {\n CodeTransformation, \n isCodeTransformation, \n readDataSourceOptionsFromEnv, \n transformFilePath,\n} from 'typeorm-extension';\nimport {\n ClientEntity,\n ClientPermissionEntity,\n ClientPermissionSubscriber,\n ClientRoleEntity,\n ClientRoleSubscriber,\n ClientScopeEntity,\n ClientScopeSubscriber,\n ClientSubscriber,\n IdentityProviderAccountEntity,\n IdentityProviderAccountSubscriber,\n IdentityProviderAttributeEntity,\n IdentityProviderAttributeMappingEntity,\n IdentityProviderAttributeSubscriber,\n IdentityProviderEntity,\n IdentityProviderPermissionMappingEntity,\n IdentityProviderRoleMappingEntity,\n IdentityProviderRoleSubscriber,\n IdentityProviderSubscriber,\n KeyEntity,\n PermissionEntity,\n PermissionPolicyEntity,\n PermissionSubscriber,\n PolicyAttributeEntity,\n PolicyAttributeSubscriber,\n PolicyEntity,\n PolicySubscriber,\n RealmEntity,\n RealmSubscriber,\n RobotEntity,\n RobotPermissionEntity,\n RobotPermissionSubscriber,\n RobotRoleEntity,\n RobotRoleSubscriber,\n RobotSubscriber,\n RoleAttributeEntity,\n RoleAttributeSubscriber,\n RoleEntity,\n RolePermissionEntity,\n RolePermissionSubscriber,\n RoleSubscriber,\n ScopeEntity,\n ScopeSubscriber,\n SessionEntity,\n UserAttributeEntity,\n UserAttributeSubscriber,\n UserEntity,\n UserPermissionEntity,\n UserPermissionSubscriber,\n UserRoleEntity,\n UserRoleSubscriber,\n UserSubscriber,\n} from '../../domains/index.ts';\n\nexport class DataSourceOptionsBuilder {\n buildWithEnv() {\n const options = readDataSourceOptionsFromEnv();\n\n if (!options) {\n throw new AuthupError('The database configuration could not be read from env variables.');\n }\n\n return this.normalize(options);\n }\n\n buildWith(options: DataSourceOptions) {\n return this.normalize(options);\n }\n\n // ------------------------------------------------------------------\n\n protected normalize(options: DataSourceOptions) : DataSourceOptions {\n if (\n options.type !== 'mysql' &&\n options.type !== 'postgres' &&\n options.type !== 'better-sqlite3'\n ) {\n throw new AuthupError(`The database type ${options.type} is not supported.`);\n }\n\n options = {\n ...options,\n logging: false,\n entities: [\n ...(options.entities ? options.entities : []) as string[],\n KeyEntity,\n\n SessionEntity,\n\n ClientEntity,\n ClientPermissionEntity,\n ClientRoleEntity,\n ClientScopeEntity,\n\n IdentityProviderEntity,\n IdentityProviderAttributeEntity,\n IdentityProviderAccountEntity,\n IdentityProviderRoleMappingEntity,\n IdentityProviderPermissionMappingEntity,\n IdentityProviderAttributeMappingEntity,\n\n PermissionEntity,\n PermissionPolicyEntity,\n\n PolicyEntity,\n PolicyAttributeEntity,\n\n RealmEntity,\n\n RobotEntity,\n RobotPermissionEntity,\n RobotRoleEntity,\n\n RoleEntity,\n RoleAttributeEntity,\n RolePermissionEntity,\n\n ScopeEntity,\n\n UserEntity,\n UserAttributeEntity,\n UserPermissionEntity,\n UserRoleEntity,\n ],\n migrations: [],\n migrationsTransactionMode: 'each',\n subscribers: [\n ...(options.subscribers || []) as string[],\n ClientSubscriber,\n ClientPermissionSubscriber,\n ClientRoleSubscriber,\n ClientScopeSubscriber,\n\n IdentityProviderSubscriber,\n IdentityProviderAccountSubscriber,\n IdentityProviderAttributeSubscriber,\n IdentityProviderRoleSubscriber,\n\n PermissionSubscriber,\n PolicySubscriber,\n PolicyAttributeSubscriber,\n\n RealmSubscriber,\n\n RobotSubscriber,\n RobotRoleSubscriber,\n RobotPermissionSubscriber,\n\n RoleSubscriber,\n RoleAttributeSubscriber,\n RolePermissionSubscriber,\n\n ScopeSubscriber,\n\n UserSubscriber,\n UserAttributeSubscriber,\n UserPermissionSubscriber,\n UserRoleSubscriber,\n ],\n };\n\n if (\n options.type === 'mysql' ||\n options.type === 'postgres'\n ) {\n let migrationPath = `src/adapters/database/migrations/${options.type}/*.{ts,js}`;\n if (!isCodeTransformation(CodeTransformation.JUST_IN_TIME)) {\n migrationPath = transformFilePath(migrationPath, './dist', './src');\n }\n\n Object.assign(options, {\n migrations: [migrationPath],\n migrationsTransactionMode: 'all',\n } as DataSourceOptions);\n }\n\n if (options.type === 'mysql') {\n Object.assign(options, { connectorPackage: 'mysql2' } satisfies Partial<DataSourceOptions>);\n }\n\n return options;\n }\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { singa } from 'singa';\nimport type { DataSource } from 'typeorm';\n\nconst instance = singa<DataSource>({ name: 'dataSource' });\n\nexport function setDataSourceSync(dataSource: DataSource) {\n instance.setFactory(() => dataSource);\n}\n\nexport function unsetDataSourceSync() {\n instance.unset();\n}\n\nexport function useDataSourceSync() {\n return instance.use();\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { ConflictError } from '@ebec/http';\n\nexport class DatabaseConflictError extends ConflictError {\n constructor() {\n super('A db entry with some unique attributes already exist.');\n }\n}\n","/*\n * Copyright (c) 2024-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\nimport type { DatabaseType } from 'typeorm';\nimport { EnvironmentName } from '@authup/kit';\n\nexport function isDatabaseTypeSupported(type: DatabaseType) : boolean {\n return type === 'mysql' ||\n type === 'postgres' ||\n type === 'better-sqlite3';\n}\n\nexport function isDatabaseTypeSupportedForEnvironment(type: DatabaseType, env: string) : boolean {\n if (env === EnvironmentName.PRODUCTION) {\n return type !== 'better-sqlite3' && type !== 'sqlite';\n }\n\n return true;\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Logger } from '@authup/server-kit';\nimport { TypedToken } from 'eldin';\n\nexport const LoggerInjectionKey = new TypedToken<Logger>('Logger');\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { createLogger, createNoopLogger, setLoggerFactory } from '@authup/server-kit';\nimport type { IModule } from 'orkos';\nimport { ModuleName } from '../constants.ts';\nimport { ConfigInjectionKey } from '../config/index.ts';\nimport { LoggerInjectionKey } from './constants.ts';\nimport type { IContainer } from 'eldin';\n\nexport class LoggerModule implements IModule {\n readonly name: string;\n\n readonly dependencies: string[];\n\n constructor() {\n this.name = ModuleName.LOGGER;\n this.dependencies = [ModuleName.CONFIG];\n }\n\n async setup(container: IContainer): Promise<void> {\n const result = container.tryResolve(ConfigInjectionKey);\n if (!result.success || !result.data.logger) {\n container.register(LoggerInjectionKey, { useFactory: createNoopLogger });\n\n return;\n }\n\n container.register(LoggerInjectionKey, {\n useFactory: () => createLogger({\n env: result.data.env,\n directory: result.data.writableDirectoryPath,\n }),\n });\n\n // todo: remove this\n setLoggerFactory(() => createLogger({\n env: result.data.env,\n directory: result.data.writableDirectoryPath,\n }));\n }\n\n // ----------------------------------------------------\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n DomainEventPublisher, \n DomainEventRedisPublisher,\n DomainEventSocketPublisher, \n createRedisClient,\n} from '@authup/server-kit';\nimport { AuthupError } from '@authup/errors';\nimport type { DataSourceOptions } from 'typeorm';\nimport { DataSource, InstanceChecker } from 'typeorm';\nimport {\n checkDatabase,\n createDatabase,\n setDataSource,\n synchronizeDatabaseSchema,\n unsetDataSource,\n} from 'typeorm-extension';\nimport {\n DataSourceOptionsBuilder,\n DatabaseQueryResultCache,\n isDatabaseTypeSupported,\n isDatabaseTypeSupportedForEnvironment,\n setDataSourceSync,\n unsetDataSourceSync,\n} from '../../../adapters/database/index.ts';\nimport { setDomainEventPublisher } from '../../../adapters/database/event-publisher/index.ts';\nimport { CacheInjectionKey } from '../cache/index.ts';\nimport type { IModule } from 'orkos';\nimport { ModuleName } from '../constants.ts';\nimport { DatabaseInjectionKey } from './constants.ts';\nimport { ConfigInjectionKey } from '../config/index.ts';\nimport type { IContainer } from 'eldin';\nimport { LoggerInjectionKey } from '../logger/index.ts';\n\nexport type DatabaseModuleOptions = {\n prepareBuild?: (container: IContainer) => Promise<void>;\n setup?: (container: IContainer, options: DataSourceOptions) => Promise<void>;\n migrate?: (container: IContainer, dataSource: DataSource) => Promise<void>;\n};\n\nexport class DatabaseModule implements IModule {\n readonly name: string;\n\n readonly dependencies: string[];\n\n protected optionsBuilder : DataSourceOptionsBuilder;\n\n protected options: DatabaseModuleOptions;\n\n constructor(options: DatabaseModuleOptions = {}) {\n this.name = ModuleName.DATABASE;\n this.dependencies = [ModuleName.CONFIG, ModuleName.LOGGER];\n\n this.optionsBuilder = new DataSourceOptionsBuilder();\n this.options = options;\n }\n\n async setup(container: IContainer): Promise<void> {\n const logger = container.resolve(LoggerInjectionKey);\n\n if (this.options.prepareBuild) {\n await this.options.prepareBuild(container);\n }\n\n const dataSourceOptions = await this.buildDataSourceOptions(container);\n\n if (this.options.setup) {\n await this.options.setup(container, dataSourceOptions);\n } else {\n await this.setupDatabase(container, dataSourceOptions);\n }\n\n const dataSource = new DataSource(dataSourceOptions);\n\n logger.debug('Establishing database connection...');\n await dataSource.initialize();\n logger.debug('Established database connection.');\n\n // todo: maybe remove this\n setDataSource(dataSource);\n setDataSourceSync(dataSource);\n\n if (this.options.migrate) {\n await this.options.migrate(container, dataSource);\n } else {\n await this.migrate(container, dataSource);\n }\n\n container.register(DatabaseInjectionKey.DataSource, { useValue: dataSource });\n\n this.registerRepositories(container, dataSource);\n this.registerEventPublisher(container);\n }\n\n async teardown(container: IContainer): Promise<void> {\n const dataSource = container.tryResolve(DatabaseInjectionKey.DataSource);\n if (dataSource.success) {\n await dataSource.data.destroy();\n\n container.unregister(DatabaseInjectionKey.DataSource);\n }\n\n unsetDataSource();\n unsetDataSourceSync();\n }\n\n // ----------------------------------------------------\n\n protected async setupDatabase(container: IContainer, options: DataSourceOptions): Promise<void> {\n const logger = container.resolve(LoggerInjectionKey);\n\n const check = await checkDatabase({ options });\n\n if (!check.exists) {\n logger.debug('Creating database...');\n await createDatabase({\n options,\n synchronize: false,\n ifNotExist: true, \n });\n logger.debug('Created database');\n }\n }\n\n protected async migrate(container: IContainer, dataSource: DataSource): Promise<void> {\n const logger = container.resolve(LoggerInjectionKey);\n\n logger.debug('Migrating database...');\n await synchronizeDatabaseSchema(dataSource);\n logger.debug('Migrated database');\n }\n\n // ----------------------------------------------------\n\n /**\n * Load data source options for connection.\n *\n * @protected\n */\n protected async buildDataSourceOptions(container: IContainer) : Promise<DataSourceOptions> {\n const config = container.resolve(ConfigInjectionKey);\n\n let options : DataSourceOptions | undefined;\n if (config.db) {\n options = this.optionsBuilder.buildWith(config.db);\n } else {\n options = this.optionsBuilder.buildWithEnv();\n }\n\n if (!isDatabaseTypeSupported(options.type)) {\n throw new AuthupError(`Database type ${options.type} is not supported (only: mysql, better-sqlite3 and postgres).`);\n }\n\n if (!isDatabaseTypeSupportedForEnvironment(options.type, config.env)) {\n throw new AuthupError(`Database type ${options.type} is not supported for ${config.env}.`);\n }\n\n const cacheResult = container.tryResolve(CacheInjectionKey);\n if (cacheResult.success) {\n Object.assign(options, {\n cache: {\n provider() {\n return new DatabaseQueryResultCache(cacheResult.data);\n },\n },\n } satisfies Partial<DataSourceOptions>);\n }\n\n return options;\n }\n\n protected registerRepositories(container: IContainer, dataSource: DataSource) : void {\n const entities = dataSource.options.entities || [];\n if (!Array.isArray(entities)) {\n return;\n }\n\n for (const entity of entities) {\n if (InstanceChecker.isEntitySchema(entity)) {\n continue;\n }\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n container.register(entity, { useFactory: () => dataSource.getRepository(entity) });\n }\n }\n\n // todo: move, wrong place\n protected registerEventPublisher(container: IContainer) {\n const config = container.resolve(ConfigInjectionKey);\n\n const publisher = new DomainEventPublisher();\n if (config.redis) {\n const client = createRedisClient(config.redis);\n\n publisher.mount(new DomainEventRedisPublisher(client));\n publisher.mount(new DomainEventSocketPublisher(client));\n }\n\n setDomainEventPublisher(publisher);\n }\n}\n","/*\n * Copyright (c) 2025-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { In, IsNull } from 'typeorm';\n\nexport function translateWhereConditions(where: Record<string, any>): Record<string, any> {\n const result: Record<string, any> = {};\n Object.entries(where).forEach(([key, value]) => {\n if (value === null) {\n result[key] = IsNull();\n } else if (Array.isArray(value)) {\n result[key] = In(value);\n } else {\n result[key] = value;\n }\n });\n return result;\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Realm } from '@authup/core-kit';\nimport { REALM_MASTER_NAME } from '@authup/core-kit';\nimport { isUUID } from '@authup/kit';\nimport type { Repository } from 'typeorm';\nimport { applyQuery, validateEntityJoinColumns } from 'typeorm-extension';\nimport type { EntityRepositoryFindManyResult, IRealmRepository } from '../../../../../core/index.ts';\nimport { RealmEntity } from '../../../../../adapters/database/domains/index.ts';\nimport { translateWhereConditions } from '../helpers.ts';\n\nexport class RealmRepositoryAdapter implements IRealmRepository {\n private readonly repository: Repository<Realm>;\n\n constructor(repository: Repository<Realm>) {\n this.repository = repository;\n }\n\n findOneById(id: string): Promise<Realm | null> {\n return this.findOneBy({ id });\n }\n\n findOneByName(name: string): Promise<Realm | null> {\n const qb = this.repository.createQueryBuilder('realm');\n qb.where('realm.name LIKE :name', { name });\n\n return qb.getOne();\n }\n\n async findMany(query: Record<string, any>): Promise<EntityRepositoryFindManyResult<Realm>> {\n const qb = this.repository.createQueryBuilder('realm');\n qb.groupBy('realm.id');\n\n const { pagination } = applyQuery(qb, query, {\n defaultAlias: 'realm',\n filters: { allowed: ['id', 'built_in', 'display_name', 'name'] },\n pagination: { maxLimit: 50 },\n fields: { allowed: ['id', 'name', 'description', 'built_in', 'created_at', 'updated_at'] },\n sort: { allowed: ['id', 'name', 'created_at', 'updated_at'] },\n });\n\n const [entities, total] = await qb.getManyAndCount();\n\n return {\n data: entities,\n meta: {\n total,\n ...pagination,\n },\n };\n }\n\n async findOneByIdOrName(idOrName: string): Promise<Realm | null> {\n return isUUID(idOrName) ?\n this.findOneById(idOrName) :\n this.findOneByName(idOrName);\n }\n\n async findManyBy(where: Record<string, any>): Promise<Realm[]> {\n return this.repository.findBy(translateWhereConditions(where));\n }\n\n async findOneBy(where: Record<string, any>): Promise<Realm | null> {\n return this.repository.findOneBy(translateWhereConditions(where));\n }\n\n create(data: Partial<Realm>): Realm {\n return this.repository.create(data);\n }\n\n merge(entity: Realm, data: Partial<Realm>): Realm {\n return this.repository.merge(entity, data);\n }\n\n async save(entity: Realm): Promise<Realm> {\n return this.repository.save(entity);\n }\n\n async remove(entity: Realm): Promise<void> {\n await this.repository.remove(entity);\n }\n\n async validateJoinColumns(data: Partial<Realm>): Promise<void> {\n await validateEntityJoinColumns(data, {\n dataSource: this.repository.manager.connection,\n entityTarget: RealmEntity,\n });\n }\n\n async resolve(id: string | undefined, withFallback: true): Promise<Realm>;\n\n async resolve(id: string | undefined, withFallback?: boolean): Promise<Realm | null>;\n\n async resolve(id: string | undefined, withFallback?: boolean): Promise<Realm | null> {\n let entity: Realm | null = null;\n\n if (id) {\n entity = await this.findOneByIdOrName(id);\n }\n\n if (!entity && withFallback) {\n entity = await this.findOneBy({ name: REALM_MASTER_NAME });\n }\n\n return entity;\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Client, Realm } from '@authup/core-kit';\nimport { isUUID } from '@authup/kit';\nimport type { Repository } from 'typeorm';\nimport { applyQuery, isEntityUnique, validateEntityJoinColumns } from 'typeorm-extension';\nimport type { EntityRepositoryFindManyResult, IClientRepository, IRealmRepository } from '../../../../../core/index.ts';\nimport { DatabaseConflictError } from '../../../../../adapters/database/index.ts';\nimport { translateWhereConditions } from '../helpers.ts';\nimport { ClientEntity } from '../../../../../adapters/database/domains/index.ts';\nimport { RealmRepositoryAdapter } from '../realm/repository.ts';\n\nexport type ClientRepositoryAdapterContext = {\n repository: Repository<Client>,\n realmRepository: Repository<Realm>,\n};\n\nexport class ClientRepositoryAdapter implements IClientRepository {\n private readonly repository: Repository<Client>;\n\n private readonly realmRepository: IRealmRepository;\n\n constructor(ctx: ClientRepositoryAdapterContext) {\n this.repository = ctx.repository;\n this.realmRepository = new RealmRepositoryAdapter(ctx.realmRepository);\n }\n\n async findMany(query: Record<string, any>): Promise<EntityRepositoryFindManyResult<Client>> {\n const qb = this.repository.createQueryBuilder('client');\n qb.groupBy('client.id');\n\n const { pagination } = applyQuery(qb, query, {\n defaultAlias: 'client',\n fields: {\n default: [\n 'id',\n 'active',\n 'built_in',\n 'name',\n 'display_name',\n 'description',\n 'secret_hashed',\n 'secret_encrypted',\n 'base_url',\n 'root_url',\n 'redirect_uri',\n 'grant_types',\n 'scope',\n 'is_confidential',\n 'realm_id',\n 'updated_at',\n 'created_at',\n ],\n allowed: ['secret'],\n },\n filters: { allowed: ['id', 'name', 'realm_id', 'realm.name'] },\n pagination: { maxLimit: 50 },\n relations: {\n allowed: ['realm'],\n onJoin: (_property: string, key: string, q: any) => {\n q.addGroupBy(`${key}.id`);\n },\n },\n sort: { allowed: ['id', 'created_at', 'updated_at'] },\n });\n\n const [entities, total] = await qb.getManyAndCount();\n\n return {\n data: entities,\n meta: {\n total,\n ...pagination,\n },\n };\n }\n\n findOneById(id: string): Promise<Client | null> {\n return this.findOneBy({ id });\n }\n\n async findOneByName(name: string, realmKey?: string): Promise<Client | null> {\n const qb = this.repository.createQueryBuilder('client');\n qb.where('client.name LIKE :name', { name });\n\n if (realmKey) {\n const realm = await this.realmRepository.resolve(realmKey);\n if (realm) {\n qb.andWhere('client.realm_id = :realmId', { realmId: realm.id });\n }\n }\n\n return qb.getOne();\n }\n\n async findOneByIdOrName(idOrName: string, realm?: string): Promise<Client | null> {\n return isUUID(idOrName) ?\n this.findOneById(idOrName) :\n this.findOneByName(idOrName, realm);\n }\n\n async findManyBy(where: Record<string, any>): Promise<Client[]> {\n return this.repository.findBy(translateWhereConditions(where));\n }\n\n async findOneBy(where: Record<string, any>): Promise<Client | null> {\n return this.repository.findOneBy(translateWhereConditions(where));\n }\n\n async findOneWithSecret(where: Record<string, any>): Promise<Client | null> {\n const qb = this.repository.createQueryBuilder('client');\n\n Object.entries(where).forEach(([key, value]) => {\n qb.andWhere(`client.${key} = :${key}`, { [key]: value });\n });\n\n qb.addSelect('client.secret');\n\n return qb.getOne();\n }\n\n create(data: Partial<Client>): Client {\n return this.repository.create(data);\n }\n\n merge(entity: Client, data: Partial<Client>): Client {\n return this.repository.merge(entity, data);\n }\n\n async save(entity: Client): Promise<Client> {\n return this.repository.save(entity);\n }\n\n async remove(entity: Client): Promise<void> {\n await this.repository.remove(entity);\n }\n\n async validateJoinColumns(data: Partial<Client>): Promise<void> {\n await validateEntityJoinColumns(data, {\n dataSource: this.repository.manager.connection,\n entityTarget: ClientEntity,\n });\n }\n\n async checkUniqueness(data: Partial<Client>, existing?: Client): Promise<void> {\n const isUnique = await isEntityUnique({\n dataSource: this.repository.manager.connection,\n entityTarget: ClientEntity,\n entity: data,\n entityExisting: existing,\n });\n\n if (!isUnique) {\n throw new DatabaseConflictError();\n }\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { ClientPermission } from '@authup/core-kit';\nimport type { Repository } from 'typeorm';\nimport { applyQuery, validateEntityJoinColumns } from 'typeorm-extension';\nimport type { EntityRepositoryFindManyResult } from '../../../../../core/entities/types.ts';\nimport type { IClientPermissionRepository } from '../../../../../core/entities/client-permission/types.ts';\nimport { ClientPermissionEntity } from '../../../../../adapters/database/domains/index.ts';\nimport { translateWhereConditions } from '../helpers.ts';\n\nexport class ClientPermissionRepositoryAdapter implements IClientPermissionRepository {\n private readonly repository: Repository<ClientPermission>;\n\n constructor(repository: Repository<ClientPermission>) {\n this.repository = repository;\n }\n\n async findMany(query: Record<string, any>): Promise<EntityRepositoryFindManyResult<ClientPermission>> {\n const qb = this.repository.createQueryBuilder('clientPermission');\n qb.groupBy('clientPermission.id');\n\n const { pagination } = applyQuery(qb, query, {\n defaultAlias: 'clientPermission',\n filters: { allowed: ['client_id', 'permission_id'] },\n relations: {\n allowed: [\n 'client',\n 'permission',\n ],\n onJoin: (_property: string, key: string, q: any) => {\n q.addGroupBy(`${key}.id`);\n },\n },\n sort: {\n allowed: [\n 'id',\n 'created_at',\n 'updated_at',\n ],\n },\n pagination: { maxLimit: 50 },\n });\n\n const [entities, total] = await qb.getManyAndCount();\n\n return {\n data: entities,\n meta: {\n total,\n ...pagination,\n },\n };\n }\n\n findOneById(id: string): Promise<ClientPermission | null> {\n return this.findOneBy({ id });\n }\n\n findOneByName(_name: string): Promise<ClientPermission | null> {\n return Promise.resolve(null);\n }\n\n findOneByIdOrName(idOrName: string): Promise<ClientPermission | null> {\n return this.findOneById(idOrName);\n }\n\n async findManyBy(where: Record<string, any>): Promise<ClientPermission[]> {\n return this.repository.findBy(translateWhereConditions(where));\n }\n\n async findOneBy(where: Record<string, any>): Promise<ClientPermission | null> {\n return this.repository.findOneBy(translateWhereConditions(where));\n }\n\n create(data: Partial<ClientPermission>): ClientPermission {\n return this.repository.create(data);\n }\n\n merge(entity: ClientPermission, data: Partial<ClientPermission>): ClientPermission {\n return this.repository.merge(entity, data);\n }\n\n async save(entity: ClientPermission): Promise<ClientPermission> {\n return this.repository.save(entity);\n }\n\n async remove(entity: ClientPermission): Promise<void> {\n await this.repository.remove(entity);\n }\n\n async validateJoinColumns(data: Partial<ClientPermission>): Promise<void> {\n await validateEntityJoinColumns(data, {\n dataSource: this.repository.manager.connection,\n entityTarget: ClientPermissionEntity,\n });\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { ClientRole } from '@authup/core-kit';\nimport type { Repository } from 'typeorm';\nimport { applyQuery, validateEntityJoinColumns } from 'typeorm-extension';\nimport type { EntityRepositoryFindManyResult } from '../../../../../core/entities/types.ts';\nimport type { IClientRoleRepository } from '../../../../../core/entities/client-role/types.ts';\nimport { ClientRoleEntity } from '../../../../../adapters/database/domains/index.ts';\nimport { translateWhereConditions } from '../helpers.ts';\n\nexport class ClientRoleRepositoryAdapter implements IClientRoleRepository {\n private readonly repository: Repository<ClientRole>;\n\n constructor(repository: Repository<ClientRole>) {\n this.repository = repository;\n }\n\n async findMany(query: Record<string, any>): Promise<EntityRepositoryFindManyResult<ClientRole>> {\n const qb = this.repository.createQueryBuilder('clientRole');\n qb.groupBy('clientRole.id');\n\n const { pagination } = applyQuery(qb, query, {\n defaultAlias: 'clientRole',\n filters: { allowed: ['client_id', 'role_id'] },\n relations: {\n allowed: ['client', 'role'],\n onJoin: (_property: string, key: string, q: any) => {\n q.addGroupBy(`${key}.id`);\n },\n },\n sort: {\n allowed: [\n 'id',\n 'created_at',\n 'updated_at',\n ],\n },\n pagination: { maxLimit: 50 },\n });\n\n const [entities, total] = await qb.getManyAndCount();\n\n return {\n data: entities,\n meta: {\n total,\n ...pagination,\n },\n };\n }\n\n findOneById(id: string): Promise<ClientRole | null> {\n return this.findOneBy({ id });\n }\n\n findOneByName(_name: string): Promise<ClientRole | null> {\n return Promise.resolve(null);\n }\n\n findOneByIdOrName(idOrName: string): Promise<ClientRole | null> {\n return this.findOneById(idOrName);\n }\n\n async findManyBy(where: Record<string, any>): Promise<ClientRole[]> {\n return this.repository.findBy(translateWhereConditions(where));\n }\n\n async findOneBy(where: Record<string, any>): Promise<ClientRole | null> {\n return this.repository.findOneBy(translateWhereConditions(where));\n }\n\n create(data: Partial<ClientRole>): ClientRole {\n return this.repository.create(data);\n }\n\n merge(entity: ClientRole, data: Partial<ClientRole>): ClientRole {\n return this.repository.merge(entity, data);\n }\n\n async save(entity: ClientRole): Promise<ClientRole> {\n return this.repository.save(entity);\n }\n\n async remove(entity: ClientRole): Promise<void> {\n await this.repository.remove(entity);\n }\n\n async validateJoinColumns(data: Partial<ClientRole>): Promise<void> {\n await validateEntityJoinColumns(data, {\n dataSource: this.repository.manager.connection,\n entityTarget: ClientRoleEntity,\n });\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { ClientScope } from '@authup/core-kit';\nimport type { Repository } from 'typeorm';\nimport { applyQuery, validateEntityJoinColumns } from 'typeorm-extension';\nimport type { EntityRepositoryFindManyResult } from '../../../../../core/entities/types.ts';\nimport type { IClientScopeRepository } from '../../../../../core/entities/client-scope/types.ts';\nimport { ClientScopeEntity } from '../../../../../adapters/database/domains/index.ts';\nimport { translateWhereConditions } from '../helpers.ts';\n\nexport class ClientScopeRepositoryAdapter implements IClientScopeRepository {\n private readonly repository: Repository<ClientScope>;\n\n constructor(repository: Repository<ClientScope>) {\n this.repository = repository;\n }\n\n async findMany(query: Record<string, any>): Promise<EntityRepositoryFindManyResult<ClientScope>> {\n const qb = this.repository.createQueryBuilder('clientScope');\n qb.groupBy('clientScope.id');\n\n const { pagination } = applyQuery(qb, query, {\n defaultAlias: 'clientScope',\n relations: {\n allowed: ['client', 'scope'],\n onJoin: (_property: string, key: string, q: any) => {\n q.addGroupBy(`${key}.id`);\n },\n },\n filters: { allowed: ['client_id', 'scope_id', 'default', 'scope.name'] },\n pagination: { maxLimit: 50 },\n });\n\n const [entities, total] = await qb.getManyAndCount();\n\n return {\n data: entities,\n meta: {\n total,\n ...pagination,\n },\n };\n }\n\n findOneById(id: string): Promise<ClientScope | null> {\n return this.findOneBy({ id });\n }\n\n findOneByName(_name: string): Promise<ClientScope | null> {\n return Promise.resolve(null);\n }\n\n findOneByIdOrName(idOrName: string): Promise<ClientScope | null> {\n return this.findOneById(idOrName);\n }\n\n async findManyBy(where: Record<string, any>): Promise<ClientScope[]> {\n return this.repository.findBy(translateWhereConditions(where));\n }\n\n async findOneBy(where: Record<string, any>): Promise<ClientScope | null> {\n return this.repository.findOneBy(translateWhereConditions(where));\n }\n\n create(data: Partial<ClientScope>): ClientScope {\n return this.repository.create(data);\n }\n\n merge(entity: ClientScope, data: Partial<ClientScope>): ClientScope {\n return this.repository.merge(entity, data);\n }\n\n async save(entity: ClientScope): Promise<ClientScope> {\n return this.repository.save(entity);\n }\n\n async remove(entity: ClientScope): Promise<void> {\n await this.repository.remove(entity);\n }\n\n async validateJoinColumns(data: Partial<ClientScope>): Promise<void> {\n await validateEntityJoinColumns(data, {\n dataSource: this.repository.manager.connection,\n entityTarget: ClientScopeEntity,\n });\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { IdentityProvider, IdentityProviderProtocol, Realm } from '@authup/core-kit';\nimport { isUUID } from '@authup/kit';\nimport type { Repository } from 'typeorm';\nimport { applyQuery, isEntityUnique, validateEntityJoinColumns } from 'typeorm-extension';\nimport type { EntityRepositoryFindManyResult, IIdentityProviderRepository, IRealmRepository } from '../../../../../core/index.ts';\nimport { DatabaseConflictError } from '../../../../../adapters/database/index.ts';\nimport type { IdentityProviderRepository } from '../../../../../adapters/database/domains/index.ts';\nimport { IdentityProviderEntity } from '../../../../../adapters/database/domains/index.ts';\nimport { translateWhereConditions } from '../helpers.ts';\nimport { RealmRepositoryAdapter } from '../realm/repository.ts';\n\nexport type IdentityProviderRepositoryAdapterContext = {\n repository: IdentityProviderRepository,\n realmRepository: Repository<Realm>,\n};\n\nexport class IdentityProviderRepositoryAdapter implements IIdentityProviderRepository {\n private readonly repository: IdentityProviderRepository;\n\n private readonly realmRepository: IRealmRepository;\n\n constructor(ctx: IdentityProviderRepositoryAdapterContext) {\n this.repository = ctx.repository;\n this.realmRepository = new RealmRepositoryAdapter(ctx.realmRepository);\n }\n\n async findMany(query: Record<string, any>): Promise<EntityRepositoryFindManyResult<IdentityProvider>> {\n const qb = this.repository.createQueryBuilder('provider');\n qb.groupBy('provider.id');\n\n const { pagination } = applyQuery(qb, query, {\n defaultAlias: 'provider',\n relations: {\n allowed: ['realm'],\n onJoin: (_property: string, key: string, q: any) => {\n q.addGroupBy(`${key}.id`);\n },\n },\n fields: {\n default: [\n 'id',\n 'name',\n 'display_name',\n 'protocol',\n 'preset',\n 'enabled',\n 'realm_id',\n 'created_at',\n 'updated_at',\n ],\n },\n filters: { allowed: ['name', 'protocol', 'enabled', 'realm_id', 'realm.name'] },\n sort: { allowed: ['id', 'created_at', 'updated_at'] },\n pagination: { maxLimit: 50 },\n });\n\n const [entities, total] = await qb.getManyAndCount();\n\n return {\n data: entities,\n meta: {\n total,\n ...pagination,\n },\n };\n }\n\n async findOneById(id: string): Promise<IdentityProvider | null> {\n const entity = await this.findOneBy({ id });\n if (entity) {\n await this.repository.extendOneWithEA(entity);\n }\n return entity;\n }\n\n async findOneByName(name: string, realmKey?: string): Promise<IdentityProvider | null> {\n const qb = this.repository.createQueryBuilder('provider');\n qb.where('provider.name = :name', { name });\n\n if (realmKey) {\n const realm = await this.realmRepository.resolve(realmKey);\n if (realm) {\n qb.andWhere('provider.realm_id = :realmId', { realmId: realm.id });\n }\n }\n\n const entity = await qb.getOne();\n if (entity) {\n await this.repository.extendOneWithEA(entity);\n }\n return entity;\n }\n\n async findOneByIdOrName(idOrName: string, realm?: string): Promise<IdentityProvider | null> {\n return isUUID(idOrName) ?\n this.findOneById(idOrName) :\n this.findOneByName(idOrName, realm);\n }\n\n async findManyBy(where: Record<string, any>): Promise<IdentityProvider[]> {\n return this.repository.findBy(translateWhereConditions(where));\n }\n\n async findOneBy(where: Record<string, any>): Promise<IdentityProvider | null> {\n return this.repository.findOneBy(translateWhereConditions(where));\n }\n\n create(data: Partial<IdentityProvider>): IdentityProvider {\n return this.repository.create(data);\n }\n\n merge(entity: IdentityProvider, data: Partial<IdentityProvider>): IdentityProvider {\n return this.repository.merge(entity, data);\n }\n\n async save(entity: IdentityProvider): Promise<IdentityProvider> {\n return this.repository.save(entity);\n }\n\n async saveWithEA(entity: IdentityProvider, attributes?: Record<string, any>): Promise<IdentityProvider> {\n await this.repository.saveOneWithEA(entity, attributes);\n return entity;\n }\n\n async extendOneWithEA(entity: IdentityProvider): Promise<void> {\n await this.repository.extendOneWithEA(entity);\n }\n\n async remove(entity: IdentityProvider): Promise<void> {\n await this.repository.remove(entity);\n }\n\n async validateJoinColumns(data: Partial<IdentityProvider>): Promise<void> {\n await validateEntityJoinColumns(data, {\n dataSource: this.repository.manager.connection,\n entityTarget: IdentityProviderEntity,\n });\n }\n\n async checkUniqueness(data: Partial<IdentityProvider>, existing?: IdentityProvider): Promise<void> {\n const isUnique = await isEntityUnique({\n dataSource: this.repository.manager.connection,\n entityTarget: IdentityProviderEntity,\n entity: data,\n entityExisting: existing,\n });\n\n if (!isUnique) {\n throw new DatabaseConflictError();\n }\n }\n\n async findByProtocol(protocol: IdentityProviderProtocol, realmKey?: string): Promise<IdentityProvider[]> {\n const qb = this.repository.createQueryBuilder('provider');\n qb.where('provider.protocol = :protocol', { protocol });\n\n if (realmKey) {\n const realm = await this.realmRepository.resolve(realmKey);\n if (realm) {\n qb.andWhere('provider.realm_id = :realmId', { realmId: realm.id });\n }\n }\n\n const entities = await qb.getMany();\n await this.repository.extendManyWithEA(entities);\n return entities;\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Permission, Realm } from '@authup/core-kit';\nimport { isUUID } from '@authup/kit';\nimport type { Repository } from 'typeorm';\nimport { applyQuery, isEntityUnique, validateEntityJoinColumns } from 'typeorm-extension';\nimport type { EntityRepositoryFindManyResult, IPermissionRepository, IRealmRepository } from '../../../../../core/index.ts';\nimport { DatabaseConflictError } from '../../../../../adapters/database/index.ts';\nimport { translateWhereConditions } from '../helpers.ts';\nimport { PermissionEntity } from '../../../../../adapters/database/domains/index.ts';\nimport { RealmRepositoryAdapter } from '../realm/repository.ts';\n\nexport type PermissionRepositoryAdapterContext = {\n repository: Repository<Permission>,\n realmRepository: Repository<Realm>,\n};\n\nexport class PermissionRepositoryAdapter implements IPermissionRepository {\n private readonly repository: Repository<Permission>;\n\n private readonly realmRepository: IRealmRepository;\n\n constructor(ctx: PermissionRepositoryAdapterContext) {\n this.repository = ctx.repository;\n this.realmRepository = new RealmRepositoryAdapter(ctx.realmRepository);\n }\n\n async findMany(query: Record<string, any>): Promise<EntityRepositoryFindManyResult<Permission>> {\n const qb = this.repository.createQueryBuilder('permission');\n qb.groupBy('permission.id');\n\n const { pagination } = applyQuery(qb, query, {\n defaultAlias: 'permission',\n filters: { allowed: ['id', 'display_name', 'name', 'built_in'] },\n pagination: { maxLimit: 50 },\n relations: { allowed: [] },\n sort: { allowed: ['id', 'name', 'created_at', 'updated_at'] },\n });\n\n const [entities, total] = await qb.getManyAndCount();\n\n return {\n data: entities,\n meta: {\n total,\n ...pagination,\n },\n };\n }\n\n findOneById(id: string): Promise<Permission | null> {\n return this.findOneBy({ id });\n }\n\n async findOneByName(name: string, realmKey?: string): Promise<Permission | null> {\n const qb = this.repository.createQueryBuilder('permission');\n qb.where('permission.name LIKE :name', { name });\n\n if (realmKey) {\n const realm = await this.realmRepository.resolve(realmKey);\n if (realm) {\n qb.andWhere('permission.realm_id = :realmId', { realmId: realm.id });\n }\n }\n\n return qb.getOne();\n }\n\n async findOneByIdOrName(idOrName: string, realm?: string): Promise<Permission | null> {\n const result = isUUID(idOrName) ?\n await this.findOneById(idOrName) :\n await this.findOneByName(idOrName, realm);\n\n return result;\n }\n\n async findManyBy(where: Record<string, any>): Promise<Permission[]> {\n return this.repository.findBy(translateWhereConditions(where));\n }\n\n async findOneBy(where: Record<string, any>): Promise<Permission | null> {\n return this.repository.findOneBy(translateWhereConditions(where));\n }\n\n create(data: Partial<Permission>): Permission {\n return this.repository.create(data);\n }\n\n merge(entity: Permission, data: Partial<Permission>): Permission {\n return this.repository.merge(entity, data);\n }\n\n async save(entity: Permission): Promise<Permission> {\n return this.repository.save(entity);\n }\n\n async remove(entity: Permission): Promise<void> {\n await this.repository.remove(entity);\n }\n\n async validateJoinColumns(data: Partial<Permission>): Promise<void> {\n await validateEntityJoinColumns(data, {\n dataSource: this.repository.manager.connection,\n entityTarget: PermissionEntity,\n });\n }\n\n async checkUniqueness(data: Partial<Permission>, existing?: Permission): Promise<void> {\n const isUnique = await isEntityUnique({\n dataSource: this.repository.manager.connection,\n entityTarget: PermissionEntity,\n entity: data,\n entityExisting: existing,\n });\n\n if (!isUnique) {\n throw new DatabaseConflictError();\n }\n }\n}\n","/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { PermissionPolicy } from '@authup/core-kit';\nimport type { Repository } from 'typeorm';\nimport { applyQuery, validateEntityJoinColumns } from 'typeorm-extension';\nimport type { EntityRepositoryFindManyResult, IPermissionPolicyRepository } from '../../../../../core/index.ts';\nimport { PermissionPolicyEntity } from '../../../../../adapters/database/domains/index.ts';\nimport { translateWhereConditions } from '../helpers.ts';\n\nexport class PermissionPolicyRepositoryAdapter implements IPermissionPolicyRepository {\n private readonly repository: Repository<PermissionPolicy>;\n\n constructor(repository: Repository<PermissionPolicy>) {\n this.repository = repository;\n }\n\n async findMany(query: Record<string, any>): Promise<EntityRepositoryFindManyResult<PermissionPolicy>> {\n const qb = this.repository.createQueryBuilder('permissionPolicy');\n qb.groupBy('permissionPolicy.id');\n\n const { pagination } = applyQuery(qb, query, {\n defaultAlias: 'permissionPolicy',\n filters: { allowed: ['permission_id', 'policy_id'] },\n relations: {\n allowed: [\n 'permission',\n 'policy',\n ],\n onJoin: (_property: string, key: string, q: any) => {\n q.addGroupBy(`${key}.id`);\n },\n },\n sort: {\n allowed: [\n 'id',\n 'created_at',\n 'updated_at',\n ],\n },\n pagination: { maxLimit: 50 },\n });\n\n const [entities, total] = await qb.getManyAndCount();\n\n return {\n data: entities,\n meta: {\n total,\n ...pagination,\n },\n };\n }\n\n findOneById(id: string): Promise<PermissionPolicy | null> {\n return this.findOneBy({ id });\n }\n\n async findOneByName(): Promise<PermissionPolicy | null> {\n return null;\n }\n\n findOneByIdOrName(idOrName: string): Promise<PermissionPolicy | null> {\n return this.findOneById(idOrName);\n }\n\n async findManyBy(where: Record<string, any>): Promise<PermissionPolicy[]> {\n return this.repository.findBy(translateWhereConditions(where));\n }\n\n async findOneBy(where: Record<string, any>): Promise<PermissionPolicy | null> {\n return this.repository.findOneBy(translateWhereConditions(where));\n }\n\n create(data: Partial<PermissionPolicy>): PermissionPolicy {\n return this.repository.create(data);\n }\n\n merge(entity: PermissionPolicy, data: Partial<PermissionPolicy>): PermissionPolicy {\n return this.repository.merge(entity, data);\n }\n\n async save(entity: PermissionPolicy): Promise<PermissionPolicy> {\n return this.repository.save(entity);\n }\n\n async remove(entity: PermissionPolicy): Promise<void> {\n await this.repository.remove(entity);\n }\n\n async validateJoinColumns(data: Partial<PermissionPolicy>): Promise<void> {\n await validateEntityJoinColumns(data, {\n dataSource: this.repository.manager.connection,\n entityTarget: PermissionPolicyEntity,\n });\n }\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type {\n BasePolicy,\n IPermissionProvider,\n PermissionGetOptions,\n PermissionPolicyBinding,\n} from '@authup/access';\nimport {\n buildPermissionKey,\n} from '@authup/access';\nimport { buildCacheKey } from '@authup/server-kit';\nimport type { DataSource, FindOptionsWhere, Repository } from 'typeorm';\nimport { IsNull } from 'typeorm';\nimport {\n CachePrefix,\n PermissionEntity,\n PermissionPolicyEntity,\n PolicyRepository,\n} from '../../../../../adapters/database/domains/index.ts';\n\nexport class PermissionDatabaseProvider implements IPermissionProvider {\n protected dataSource: DataSource;\n\n protected repository : Repository<PermissionEntity>;\n\n protected permissionPolicyRepository : Repository<PermissionPolicyEntity>;\n\n protected policyRepository: PolicyRepository;\n\n constructor(dataSource: DataSource) {\n this.dataSource = dataSource;\n this.repository = this.dataSource.getRepository(PermissionEntity);\n this.permissionPolicyRepository = this.dataSource.getRepository(PermissionPolicyEntity);\n this.policyRepository = new PolicyRepository(this.dataSource);\n }\n\n async findOne(options: PermissionGetOptions) : Promise<PermissionPolicyBinding | null> {\n const where : FindOptionsWhere<PermissionEntity> = { name: options.name };\n\n if (typeof options.clientId !== 'undefined') {\n where.client_id = options.clientId === null ? IsNull() : options.clientId;\n }\n\n if (typeof options.realmId !== 'undefined') {\n where.realm_id = options.realmId === null ? IsNull() : options.realmId;\n }\n\n const entity = await this.repository.findOne({\n where,\n cache: {\n id: buildCacheKey({\n prefix: CachePrefix.PERMISSION,\n key: buildPermissionKey({\n name: options.name,\n client_id: options.clientId,\n realm_id: options.realmId,\n }),\n }),\n milliseconds: 60_000,\n },\n });\n\n if (entity) {\n const junctions = await this.permissionPolicyRepository.find({\n where: { permission_id: entity.id },\n relations: ['policy'],\n });\n\n const policies : BasePolicy[] = [];\n for (const junction of junctions) {\n if (junction.policy) {\n const tree = await this.policyRepository.findDescendantsTree(junction.policy);\n if (tree) {\n policies.push(tree);\n }\n }\n }\n\n return {\n permission: entity,\n policies: policies.length > 0 ? policies : undefined,\n };\n }\n\n return null;\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Policy, Realm } from '@authup/core-kit';\nimport { isUUID } from '@authup/kit';\nimport type { Repository } from 'typeorm';\nimport { applyQuery, isEntityUnique, validateEntityJoinColumns } from 'typeorm-extension';\nimport type { EntityRepositoryFindManyResult, IPolicyRepository, IRealmRepository } from '../../../../../core/index.ts';\nimport { DatabaseConflictError } from '../../../../../adapters/database/index.ts';\nimport type { PolicyRepository } from '../../../../../adapters/database/domains/index.ts';\nimport { PolicyEntity } from '../../../../../adapters/database/domains/index.ts';\nimport { translateWhereConditions } from '../helpers.ts';\nimport { RealmRepositoryAdapter } from '../realm/repository.ts';\n\nexport type PolicyRepositoryAdapterContext = {\n repository: PolicyRepository,\n realmRepository: Repository<Realm>,\n};\n\nexport class PolicyRepositoryAdapter implements IPolicyRepository {\n private readonly repository: PolicyRepository;\n\n private readonly realmRepository: IRealmRepository;\n\n constructor(ctx: PolicyRepositoryAdapterContext) {\n this.repository = ctx.repository;\n this.realmRepository = new RealmRepositoryAdapter(ctx.realmRepository);\n }\n\n async findMany(query: Record<string, any>): Promise<EntityRepositoryFindManyResult<Policy>> {\n const qb = this.repository.createQueryBuilder('policy');\n qb.groupBy('policy.id');\n\n const { pagination } = applyQuery(qb, query, {\n defaultAlias: 'policy',\n relations: {\n // @ts-expect-error onJoin is not in the type definition\n allowed: ['children', 'realm'],\n onJoin: (_property: string, key: string, q: any) => {\n q.addGroupBy(`${key}.id`);\n },\n },\n fields: {\n default: [\n 'id',\n 'built_in',\n 'type',\n 'display_name',\n 'name',\n 'description',\n 'invert',\n 'parent_id',\n 'realm_id',\n 'created_at',\n 'updated_at',\n ],\n },\n filters: {\n // @ts-expect-error realm.name filter requires relation join\n allowed: ['id', 'name', 'type', 'parent_id', 'realm_id', 'realm.name'],\n },\n sort: { allowed: ['id', 'created_at', 'updated_at'] },\n pagination: { maxLimit: 50 },\n });\n\n const [entities, total] = await qb.getManyAndCount();\n await this.repository.extendManyWithEA(entities);\n\n return {\n data: entities,\n meta: {\n total,\n ...pagination,\n },\n };\n }\n\n async findOneById(id: string): Promise<Policy | null> {\n const entity = await this.findOneBy({ id });\n if (entity) {\n await this.repository.extendOneWithEA(entity);\n }\n return entity;\n }\n\n async findOneByName(name: string, realmKey?: string): Promise<Policy | null> {\n const qb = this.repository.createQueryBuilder('policy');\n qb.where('policy.name LIKE :name', { name });\n\n if (realmKey) {\n const realm = await this.realmRepository.resolve(realmKey);\n if (realm) {\n qb.andWhere('policy.realm_id = :realmId', { realmId: realm.id });\n }\n }\n\n const entity = await qb.getOne();\n if (entity) {\n await this.repository.extendOneWithEA(entity);\n }\n return entity;\n }\n\n async findOneByIdOrName(idOrName: string, realm?: string): Promise<Policy | null> {\n return isUUID(idOrName) ?\n this.findOneById(idOrName) :\n this.findOneByName(idOrName, realm);\n }\n\n async findManyBy(where: Record<string, any>): Promise<Policy[]> {\n return this.repository.findBy(translateWhereConditions(where));\n }\n\n async findOneBy(where: Record<string, any>): Promise<Policy | null> {\n return this.repository.findOneBy(translateWhereConditions(where));\n }\n\n create(data: Partial<Policy>): Policy {\n return this.repository.create(data);\n }\n\n merge(entity: Policy, data: Partial<Policy>): Policy {\n return this.repository.merge(entity, data);\n }\n\n async save(entity: Policy): Promise<Policy> {\n return this.repository.save(entity);\n }\n\n async remove(entity: Policy): Promise<void> {\n await this.repository.remove(entity);\n }\n\n async validateJoinColumns(data: Partial<Policy>): Promise<void> {\n await validateEntityJoinColumns(data, {\n dataSource: this.repository.manager.connection,\n entityTarget: PolicyEntity,\n });\n }\n\n async checkUniqueness(data: Partial<Policy>, existing?: Policy): Promise<void> {\n const isUnique = await isEntityUnique({\n dataSource: this.repository.manager.connection,\n entityTarget: PolicyEntity,\n entity: data,\n entityExisting: existing,\n });\n\n if (!isUnique) {\n throw new DatabaseConflictError();\n }\n }\n\n async saveWithEA(entity: Policy, data?: Record<string, any>): Promise<Policy> {\n await this.repository.saveOneWithEA(entity, data);\n await this.repository.updateClosureTable(entity, this.repository.manager);\n\n return entity;\n }\n\n async deleteFromTree(entity: Policy): Promise<void> {\n const treeRepository = this.repository.manager.connection.getTreeRepository(PolicyEntity);\n await treeRepository.remove(entity);\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Realm, Robot } from '@authup/core-kit';\nimport { isUUID } from '@authup/kit';\nimport type { Repository } from 'typeorm';\nimport { applyQuery, isEntityUnique, validateEntityJoinColumns } from 'typeorm-extension';\nimport type { EntityRepositoryFindManyResult, IRealmRepository, IRobotRepository } from '../../../../../core/index.ts';\nimport { DatabaseConflictError } from '../../../../../adapters/database/index.ts';\nimport { translateWhereConditions } from '../helpers.ts';\nimport { RobotEntity } from '../../../../../adapters/database/domains/index.ts';\nimport { RealmRepositoryAdapter } from '../realm/repository.ts';\n\nexport type RobotRepositoryAdapterContext = {\n repository: Repository<Robot>,\n realmRepository: Repository<Realm>,\n};\n\nexport class RobotRepositoryAdapter implements IRobotRepository {\n private readonly repository: Repository<Robot>;\n\n private readonly realmRepository: IRealmRepository;\n\n constructor(ctx: RobotRepositoryAdapterContext) {\n this.repository = ctx.repository;\n this.realmRepository = new RealmRepositoryAdapter(ctx.realmRepository);\n }\n\n async findMany(query: Record<string, any>): Promise<EntityRepositoryFindManyResult<Robot>> {\n const qb = this.repository.createQueryBuilder('robot');\n qb.groupBy('robot.id');\n\n const { pagination } = applyQuery(qb, query, {\n defaultAlias: 'robot',\n fields: {\n allowed: [\n 'secret',\n ],\n default: [\n 'id',\n 'name',\n 'display_name',\n 'description',\n 'active',\n 'user_id',\n 'realm_id',\n 'created_at',\n 'updated_at',\n ],\n },\n filters: { allowed: ['id', 'name', 'realm_id', 'user_id'] },\n pagination: { maxLimit: 50 },\n relations: {\n // @ts-expect-error onJoin is not in the type definition\n allowed: ['realm', 'user'],\n onJoin: (_property: string, key: string, q: any) => {\n q.addGroupBy(`${key}.id`);\n },\n },\n sort: { allowed: ['id', 'realm_id', 'user_id', 'updated_at', 'created_at'] },\n });\n\n const [entities, total] = await qb.getManyAndCount();\n\n return {\n data: entities,\n meta: {\n total,\n ...pagination,\n },\n };\n }\n\n findOneById(id: string): Promise<Robot | null> {\n return this.findOneBy({ id });\n }\n\n async findOneByName(name: string, realmKey?: string): Promise<Robot | null> {\n const qb = this.repository.createQueryBuilder('robot');\n qb.where('robot.name LIKE :name', { name });\n\n if (realmKey) {\n const realm = await this.realmRepository.resolve(realmKey);\n if (realm) {\n qb.andWhere('robot.realm_id = :realmId', { realmId: realm.id });\n }\n }\n\n return qb.getOne();\n }\n\n async findOneByIdOrName(idOrName: string, realm?: string): Promise<Robot | null> {\n return isUUID(idOrName) ?\n this.findOneById(idOrName) :\n this.findOneByName(idOrName, realm);\n }\n\n async findManyBy(where: Record<string, any>): Promise<Robot[]> {\n return this.repository.findBy(translateWhereConditions(where));\n }\n\n async findOneBy(where: Record<string, any>): Promise<Robot | null> {\n return this.repository.findOneBy(translateWhereConditions(where));\n }\n\n async findOneWithSecret(where: Record<string, any>): Promise<Robot | null> {\n const qb = this.repository.createQueryBuilder('robot');\n\n Object.entries(where).forEach(([key, value]) => {\n qb.andWhere(`robot.${key} = :${key}`, { [key]: value });\n });\n\n qb.addSelect('robot.secret');\n\n return qb.getOne();\n }\n\n create(data: Partial<Robot>): Robot {\n return this.repository.create(data);\n }\n\n merge(entity: Robot, data: Partial<Robot>): Robot {\n return this.repository.merge(entity, data);\n }\n\n async save(entity: Robot): Promise<Robot> {\n return this.repository.save(entity);\n }\n\n async remove(entity: Robot): Promise<void> {\n await this.repository.remove(entity);\n }\n\n async validateJoinColumns(data: Partial<Robot>): Promise<void> {\n await validateEntityJoinColumns(data, {\n dataSource: this.repository.manager.connection,\n entityTarget: RobotEntity,\n });\n }\n\n async checkUniqueness(data: Partial<Robot>, existing?: Robot): Promise<void> {\n const isUnique = await isEntityUnique({\n dataSource: this.repository.manager.connection,\n entityTarget: RobotEntity,\n entity: data,\n entityExisting: existing,\n });\n\n if (!isUnique) {\n throw new DatabaseConflictError();\n }\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { RobotPermission } from '@authup/core-kit';\nimport type { Repository } from 'typeorm';\nimport { applyQuery, validateEntityJoinColumns } from 'typeorm-extension';\nimport type { EntityRepositoryFindManyResult } from '../../../../../core/entities/types.ts';\nimport type { IRobotPermissionRepository } from '../../../../../core/entities/robot-permission/types.ts';\nimport { RobotPermissionEntity } from '../../../../../adapters/database/domains/index.ts';\nimport { translateWhereConditions } from '../helpers.ts';\n\nexport class RobotPermissionRepositoryAdapter implements IRobotPermissionRepository {\n private readonly repository: Repository<RobotPermission>;\n\n constructor(repository: Repository<RobotPermission>) {\n this.repository = repository;\n }\n\n async findMany(query: Record<string, any>): Promise<EntityRepositoryFindManyResult<RobotPermission>> {\n const qb = this.repository.createQueryBuilder('robotPermission');\n qb.groupBy('robotPermission.id');\n\n const { pagination } = applyQuery(qb, query, {\n defaultAlias: 'robotPermission',\n filters: { allowed: ['robot_id', 'permission_id'] },\n relations: {\n allowed: [\n 'robot',\n 'permission',\n ],\n onJoin: (_property: string, key: string, q: any) => {\n q.addGroupBy(`${key}.id`);\n },\n },\n sort: {\n allowed: [\n 'id',\n 'created_at',\n 'updated_at',\n ],\n },\n pagination: { maxLimit: 50 },\n });\n\n const [entities, total] = await qb.getManyAndCount();\n\n return {\n data: entities,\n meta: {\n total,\n ...pagination,\n },\n };\n }\n\n findOneById(id: string): Promise<RobotPermission | null> {\n return this.findOneBy({ id });\n }\n\n findOneByName(_name: string): Promise<RobotPermission | null> {\n return Promise.resolve(null);\n }\n\n findOneByIdOrName(idOrName: string): Promise<RobotPermission | null> {\n return this.findOneById(idOrName);\n }\n\n async findManyBy(where: Record<string, any>): Promise<RobotPermission[]> {\n return this.repository.findBy(translateWhereConditions(where));\n }\n\n async findOneBy(where: Record<string, any>): Promise<RobotPermission | null> {\n return this.repository.findOneBy(translateWhereConditions(where));\n }\n\n create(data: Partial<RobotPermission>): RobotPermission {\n return this.repository.create(data);\n }\n\n merge(entity: RobotPermission, data: Partial<RobotPermission>): RobotPermission {\n return this.repository.merge(entity, data);\n }\n\n async save(entity: RobotPermission): Promise<RobotPermission> {\n return this.repository.save(entity);\n }\n\n async remove(entity: RobotPermission): Promise<void> {\n await this.repository.remove(entity);\n }\n\n async validateJoinColumns(data: Partial<RobotPermission>): Promise<void> {\n await validateEntityJoinColumns(data, {\n dataSource: this.repository.manager.connection,\n entityTarget: RobotPermissionEntity,\n });\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { RobotRole } from '@authup/core-kit';\nimport type { Repository } from 'typeorm';\nimport { applyQuery, validateEntityJoinColumns } from 'typeorm-extension';\nimport type { EntityRepositoryFindManyResult, IRobotRoleRepository } from '../../../../../core/index.ts';\nimport { RobotRoleEntity } from '../../../../../adapters/database/domains/index.ts';\nimport { translateWhereConditions } from '../helpers.ts';\n\nexport class RobotRoleRepositoryAdapter implements IRobotRoleRepository {\n private readonly repository: Repository<RobotRole>;\n\n constructor(repository: Repository<RobotRole>) {\n this.repository = repository;\n }\n\n async findMany(query: Record<string, any>): Promise<EntityRepositoryFindManyResult<RobotRole>> {\n const qb = this.repository.createQueryBuilder('robotRole');\n qb.groupBy('robotRole.id');\n\n const { pagination } = applyQuery(qb, query, {\n defaultAlias: 'robotRole',\n filters: { allowed: ['robot_id', 'role_id'] },\n relations: {\n allowed: ['robot', 'role'],\n onJoin: (_property: string, key: string, q: any) => {\n q.addGroupBy(`${key}.id`);\n },\n },\n sort: {\n allowed: [\n 'id',\n 'created_at',\n 'updated_at',\n ],\n },\n pagination: { maxLimit: 50 },\n });\n\n const [entities, total] = await qb.getManyAndCount();\n\n return {\n data: entities,\n meta: {\n total,\n ...pagination,\n },\n };\n }\n\n findOneById(id: string): Promise<RobotRole | null> {\n return this.findOneBy({ id });\n }\n\n async findOneByName(_name: string): Promise<RobotRole | null> {\n return Promise.resolve(null);\n }\n\n findOneByIdOrName(idOrName: string): Promise<RobotRole | null> {\n return this.findOneById(idOrName);\n }\n\n async findManyBy(where: Record<string, any>): Promise<RobotRole[]> {\n return this.repository.findBy(translateWhereConditions(where));\n }\n\n async findOneBy(where: Record<string, any>): Promise<RobotRole | null> {\n return this.repository.findOneBy(translateWhereConditions(where));\n }\n\n create(data: Partial<RobotRole>): RobotRole {\n return this.repository.create(data);\n }\n\n merge(entity: RobotRole, data: Partial<RobotRole>): RobotRole {\n return this.repository.merge(entity, data);\n }\n\n async save(entity: RobotRole): Promise<RobotRole> {\n return this.repository.save(entity);\n }\n\n async remove(entity: RobotRole): Promise<void> {\n await this.repository.remove(entity);\n }\n\n async validateJoinColumns(data: Partial<RobotRole>): Promise<void> {\n await validateEntityJoinColumns(data, {\n dataSource: this.repository.manager.connection,\n entityTarget: RobotRoleEntity,\n });\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Realm, Role } from '@authup/core-kit';\nimport { isUUID } from '@authup/kit';\nimport type { Repository } from 'typeorm';\nimport { applyQuery, isEntityUnique, validateEntityJoinColumns } from 'typeorm-extension';\nimport type { EntityRepositoryFindManyResult, IRealmRepository, IRoleRepository } from '../../../../../core/index.ts';\nimport { DatabaseConflictError } from '../../../../../adapters/database/index.ts';\nimport { translateWhereConditions } from '../helpers.ts';\nimport { RoleEntity } from '../../../../../adapters/database/domains/index.ts';\nimport { RealmRepositoryAdapter } from '../realm/repository.ts';\n\nexport type RoleRepositoryAdapterContext = {\n repository: Repository<Role>,\n realmRepository: Repository<Realm>,\n};\n\nexport class RoleRepositoryAdapter implements IRoleRepository {\n private readonly repository: Repository<Role>;\n\n private readonly realmRepository: IRealmRepository;\n\n constructor(ctx: RoleRepositoryAdapterContext) {\n this.repository = ctx.repository;\n this.realmRepository = new RealmRepositoryAdapter(ctx.realmRepository);\n }\n\n async findMany(query: Record<string, any>): Promise<EntityRepositoryFindManyResult<Role>> {\n const qb = this.repository.createQueryBuilder('role');\n qb.groupBy('role.id');\n\n const { pagination } = applyQuery(qb, query, {\n defaultAlias: 'role',\n fields: {\n allowed: [\n 'id',\n 'name',\n 'display_name',\n 'target',\n 'description',\n 'realm_id',\n 'created_at',\n 'updated_at',\n ],\n },\n filters: { allowed: ['id', 'name', 'target', 'realm_id'] },\n pagination: { maxLimit: 50 },\n sort: { allowed: ['id', 'name', 'updated_at', 'created_at'] },\n });\n\n const [entities, total] = await qb.getManyAndCount();\n\n return {\n data: entities,\n meta: {\n total,\n ...pagination,\n },\n };\n }\n\n findOneById(id: string): Promise<Role | null> {\n return this.findOneBy({ id });\n }\n\n async findOneByName(name: string, realmKey?: string): Promise<Role | null> {\n const qb = this.repository.createQueryBuilder('role');\n qb.where('role.name LIKE :name', { name });\n\n if (realmKey) {\n const realm = await this.realmRepository.resolve(realmKey);\n if (realm) {\n qb.andWhere('role.realm_id = :realmId', { realmId: realm.id });\n }\n }\n\n return qb.getOne();\n }\n\n async findOneByIdOrName(idOrName: string, realm?: string): Promise<Role | null> {\n return isUUID(idOrName) ?\n this.findOneById(idOrName) :\n this.findOneByName(idOrName, realm);\n }\n\n async findManyBy(where: Record<string, any>): Promise<Role[]> {\n return this.repository.findBy(translateWhereConditions(where));\n }\n\n async findOneBy(where: Record<string, any>): Promise<Role | null> {\n return this.repository.findOneBy(translateWhereConditions(where));\n }\n\n create(data: Partial<Role>): Role {\n return this.repository.create(data);\n }\n\n merge(entity: Role, data: Partial<Role>): Role {\n return this.repository.merge(entity, data);\n }\n\n async save(entity: Role): Promise<Role> {\n return this.repository.save(entity);\n }\n\n async remove(entity: Role): Promise<void> {\n await this.repository.remove(entity);\n }\n\n async validateJoinColumns(data: Partial<Role>): Promise<void> {\n await validateEntityJoinColumns(data, {\n dataSource: this.repository.manager.connection,\n entityTarget: RoleEntity,\n });\n }\n\n async checkUniqueness(data: Partial<Role>, existing?: Role): Promise<void> {\n const isUnique = await isEntityUnique({\n dataSource: this.repository.manager.connection,\n entityTarget: RoleEntity,\n entity: data,\n entityExisting: existing,\n });\n\n if (!isUnique) {\n throw new DatabaseConflictError();\n }\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { RoleAttribute } from '@authup/core-kit';\nimport type { Repository } from 'typeorm';\nimport { applyQuery, validateEntityJoinColumns } from 'typeorm-extension';\nimport type { EntityRepositoryFindManyResult, IRoleAttributeRepository } from '../../../../../core/index.ts';\nimport { RoleAttributeEntity } from '../../../../../adapters/database/domains/index.ts';\nimport { translateWhereConditions } from '../helpers.ts';\n\nexport class RoleAttributeRepositoryAdapter implements IRoleAttributeRepository {\n private readonly repository: Repository<RoleAttribute>;\n\n constructor(repository: Repository<RoleAttribute>) {\n this.repository = repository;\n }\n\n async findMany(query: Record<string, any>): Promise<EntityRepositoryFindManyResult<RoleAttribute>> {\n const qb = this.repository.createQueryBuilder('roleAttribute');\n qb.groupBy('roleAttribute.id');\n\n const { pagination } = applyQuery(qb, query, {\n defaultAlias: 'roleAttribute',\n filters: { allowed: ['id', 'name', 'role_id', 'realm_id'] },\n sort: { allowed: ['id', 'name', 'role_id', 'realm_id', 'created_at', 'updated_at'] },\n pagination: { maxLimit: 50 },\n });\n\n const [entities, total] = await qb.getManyAndCount();\n\n return {\n data: entities,\n meta: {\n total,\n ...pagination,\n },\n };\n }\n\n findOneById(id: string): Promise<RoleAttribute | null> {\n return this.findOneBy({ id });\n }\n\n async findOneByName(): Promise<RoleAttribute | null> {\n return null;\n }\n\n async findOneByIdOrName(idOrName: string): Promise<RoleAttribute | null> {\n return this.findOneById(idOrName);\n }\n\n async findManyBy(where: Record<string, any>): Promise<RoleAttribute[]> {\n return this.repository.findBy(translateWhereConditions(where));\n }\n\n async findOneBy(where: Record<string, any>): Promise<RoleAttribute | null> {\n return this.repository.findOneBy(translateWhereConditions(where));\n }\n\n create(data: Partial<RoleAttribute>): RoleAttribute {\n return this.repository.create(data);\n }\n\n merge(entity: RoleAttribute, data: Partial<RoleAttribute>): RoleAttribute {\n return this.repository.merge(entity, data);\n }\n\n async save(entity: RoleAttribute): Promise<RoleAttribute> {\n return this.repository.save(entity);\n }\n\n async remove(entity: RoleAttribute): Promise<void> {\n await this.repository.remove(entity);\n }\n\n async validateJoinColumns(data: Partial<RoleAttribute>): Promise<void> {\n await validateEntityJoinColumns(data, {\n dataSource: this.repository.manager.connection,\n entityTarget: RoleAttributeEntity,\n });\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { RolePermission } from '@authup/core-kit';\nimport type { Repository } from 'typeorm';\nimport { applyQuery, validateEntityJoinColumns } from 'typeorm-extension';\nimport type { EntityRepositoryFindManyResult, IRolePermissionRepository } from '../../../../../core/index.ts';\nimport { RolePermissionEntity } from '../../../../../adapters/database/domains/index.ts';\nimport { translateWhereConditions } from '../helpers.ts';\n\nexport class RolePermissionRepositoryAdapter implements IRolePermissionRepository {\n private readonly repository: Repository<RolePermission>;\n\n constructor(repository: Repository<RolePermission>) {\n this.repository = repository;\n }\n\n async findMany(query: Record<string, any>): Promise<EntityRepositoryFindManyResult<RolePermission>> {\n const qb = this.repository.createQueryBuilder('rolePermission');\n qb.groupBy('rolePermission.id');\n\n const { pagination } = applyQuery(qb, query, {\n defaultAlias: 'rolePermission',\n filters: { allowed: ['role_id', 'permission_id'] },\n relations: {\n allowed: [\n 'role',\n 'permission',\n ],\n onJoin: (_property: string, key: string, q: any) => {\n q.addGroupBy(`${key}.id`);\n },\n },\n sort: {\n allowed: [\n 'id',\n 'created_at',\n 'updated_at',\n ],\n },\n pagination: { maxLimit: 50 },\n });\n\n const [entities, total] = await qb.getManyAndCount();\n\n return {\n data: entities,\n meta: {\n total,\n ...pagination,\n },\n };\n }\n\n findOneById(id: string): Promise<RolePermission | null> {\n return this.findOneBy({ id });\n }\n\n async findOneByName(_name: string): Promise<RolePermission | null> {\n return Promise.resolve(null);\n }\n\n findOneByIdOrName(idOrName: string): Promise<RolePermission | null> {\n return this.findOneById(idOrName);\n }\n\n async findManyBy(where: Record<string, any>): Promise<RolePermission[]> {\n return this.repository.findBy(translateWhereConditions(where));\n }\n\n async findOneBy(where: Record<string, any>): Promise<RolePermission | null> {\n return this.repository.findOneBy(translateWhereConditions(where));\n }\n\n create(data: Partial<RolePermission>): RolePermission {\n return this.repository.create(data);\n }\n\n merge(entity: RolePermission, data: Partial<RolePermission>): RolePermission {\n return this.repository.merge(entity, data);\n }\n\n async save(entity: RolePermission): Promise<RolePermission> {\n return this.repository.save(entity);\n }\n\n async remove(entity: RolePermission): Promise<void> {\n await this.repository.remove(entity);\n }\n\n async validateJoinColumns(data: Partial<RolePermission>): Promise<void> {\n await validateEntityJoinColumns(data, {\n dataSource: this.repository.manager.connection,\n entityTarget: RolePermissionEntity,\n });\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Realm, Scope } from '@authup/core-kit';\nimport { isUUID } from '@authup/kit';\nimport type { Repository } from 'typeorm';\nimport { applyQuery, isEntityUnique, validateEntityJoinColumns } from 'typeorm-extension';\nimport type { EntityRepositoryFindManyResult, IRealmRepository, IScopeRepository } from '../../../../../core/index.ts';\nimport { DatabaseConflictError } from '../../../../../adapters/database/index.ts';\nimport { translateWhereConditions } from '../helpers.ts';\nimport { ScopeEntity } from '../../../../../adapters/database/domains/index.ts';\nimport { RealmRepositoryAdapter } from '../realm/repository.ts';\n\nexport type ScopeRepositoryAdapterContext = {\n repository: Repository<Scope>,\n realmRepository: Repository<Realm>,\n};\n\nexport class ScopeRepositoryAdapter implements IScopeRepository {\n private readonly repository: Repository<Scope>;\n\n private readonly realmRepository: IRealmRepository;\n\n constructor(ctx: ScopeRepositoryAdapterContext) {\n this.repository = ctx.repository;\n this.realmRepository = new RealmRepositoryAdapter(ctx.realmRepository);\n }\n\n async findMany(query: Record<string, any>): Promise<EntityRepositoryFindManyResult<Scope>> {\n const qb = this.repository.createQueryBuilder('scope');\n qb.groupBy('scope.id');\n\n const { pagination } = applyQuery(qb, query, {\n defaultAlias: 'scope',\n fields: {\n allowed: [\n 'id',\n 'built_in',\n 'name',\n 'display_name',\n 'description',\n 'realm_id',\n 'created_at',\n 'updated_at',\n ],\n },\n filters: { allowed: ['id', 'built_in', 'name', 'realm_id'] },\n pagination: { maxLimit: 50 },\n sort: { allowed: ['id', 'name', 'updated_at', 'created_at'] },\n });\n\n const [entities, total] = await qb.getManyAndCount();\n\n return {\n data: entities,\n meta: {\n total,\n ...pagination,\n },\n };\n }\n\n findOneById(id: string): Promise<Scope | null> {\n return this.findOneBy({ id });\n }\n\n async findOneByName(name: string, realmKey?: string): Promise<Scope | null> {\n const qb = this.repository.createQueryBuilder('scope');\n qb.where('scope.name LIKE :name', { name });\n\n if (realmKey) {\n const realm = await this.realmRepository.resolve(realmKey);\n if (realm) {\n qb.andWhere('scope.realm_id = :realmId', { realmId: realm.id });\n }\n }\n\n return qb.getOne();\n }\n\n async findOneByIdOrName(idOrName: string, realm?: string): Promise<Scope | null> {\n return isUUID(idOrName) ?\n this.findOneById(idOrName) :\n this.findOneByName(idOrName, realm);\n }\n\n async findManyBy(where: Record<string, any>): Promise<Scope[]> {\n return this.repository.findBy(translateWhereConditions(where));\n }\n\n async findOneBy(where: Record<string, any>): Promise<Scope | null> {\n return this.repository.findOneBy(translateWhereConditions(where));\n }\n\n create(data: Partial<Scope>): Scope {\n return this.repository.create(data);\n }\n\n merge(entity: Scope, data: Partial<Scope>): Scope {\n return this.repository.merge(entity, data);\n }\n\n async save(entity: Scope): Promise<Scope> {\n return this.repository.save(entity);\n }\n\n async remove(entity: Scope): Promise<void> {\n await this.repository.remove(entity);\n }\n\n async validateJoinColumns(data: Partial<Scope>): Promise<void> {\n await validateEntityJoinColumns(data, {\n dataSource: this.repository.manager.connection,\n entityTarget: ScopeEntity,\n });\n }\n\n async checkUniqueness(data: Partial<Scope>, existing?: Scope): Promise<void> {\n const isUnique = await isEntityUnique({\n dataSource: this.repository.manager.connection,\n entityTarget: ScopeEntity,\n entity: data,\n entityExisting: existing,\n });\n\n if (!isUnique) {\n throw new DatabaseConflictError();\n }\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Realm, User } from '@authup/core-kit';\nimport { isUUID } from '@authup/kit';\nimport type { Repository } from 'typeorm';\nimport { applyQuery, isEntityUnique, validateEntityJoinColumns } from 'typeorm-extension';\nimport type { EntityRepositoryFindManyResult, IRealmRepository, IUserRepository } from '../../../../../core/index.ts';\nimport { DatabaseConflictError } from '../../../../../adapters/database/index.ts';\nimport type { UserRepository } from '../../../../../adapters/database/domains/index.ts';\nimport { UserEntity } from '../../../../../adapters/database/domains/index.ts';\nimport { translateWhereConditions } from '../helpers.ts';\nimport { RealmRepositoryAdapter } from '../realm/repository.ts';\n\nexport type UserRepositoryAdapterContext = {\n repository: UserRepository,\n realmRepository: Repository<Realm>,\n};\n\nexport class UserRepositoryAdapter implements IUserRepository {\n private readonly repository: UserRepository;\n\n private readonly realmRepository: IRealmRepository;\n\n constructor(ctx: UserRepositoryAdapterContext) {\n this.repository = ctx.repository;\n this.realmRepository = new RealmRepositoryAdapter(ctx.realmRepository);\n }\n\n async findMany(query: Record<string, any>): Promise<EntityRepositoryFindManyResult<User>> {\n const qb = this.repository.createQueryBuilder('user');\n qb.groupBy('user.id');\n\n const { pagination } = applyQuery(qb, query, {\n defaultAlias: 'user',\n fields: {\n default: [\n 'id',\n 'name',\n 'name_locked',\n 'first_name',\n 'last_name',\n 'display_name',\n 'avatar',\n 'cover',\n 'active',\n 'created_at',\n 'updated_at',\n 'realm_id',\n ],\n allowed: ['email'],\n },\n filters: { allowed: ['id', 'name', 'realm_id'] },\n pagination: { maxLimit: 50 },\n relations: {\n allowed: ['realm'],\n onJoin: (_property: string, key: string, q: any) => {\n q.addGroupBy(`${key}.id`);\n },\n },\n sort: { allowed: ['id', 'name', 'display_name', 'created_at', 'updated_at'] },\n });\n\n const [entities, total] = await qb.getManyAndCount();\n\n await this.repository.extendManyWithEA(entities);\n\n return {\n data: entities,\n meta: {\n total,\n ...pagination,\n },\n };\n }\n\n async findOneById(id: string): Promise<User | null> {\n const entity = await this.findOneBy({ id });\n if (entity) {\n await this.repository.extendOneWithEA(entity);\n }\n return entity;\n }\n\n async findOneByName(name: string, realmKey?: string): Promise<User | null> {\n const qb = this.repository.createQueryBuilder('user');\n qb.where('user.name LIKE :name', { name });\n\n if (realmKey) {\n const realm = await this.realmRepository.resolve(realmKey);\n if (realm) {\n qb.andWhere('user.realm_id = :realmId', { realmId: realm.id });\n }\n }\n\n const entity = await qb.getOne();\n if (entity) {\n await this.repository.extendOneWithEA(entity);\n }\n return entity;\n }\n\n async findOneByIdOrName(idOrName: string, realm?: string): Promise<User | null> {\n return isUUID(idOrName) ?\n this.findOneById(idOrName) :\n this.findOneByName(idOrName, realm);\n }\n\n async findOne(id: string, query?: Record<string, any>, realmKey?: string): Promise<User | null> {\n const qb = this.repository.createQueryBuilder('user');\n\n if (isUUID(id)) {\n qb.where('user.id = :id', { id });\n } else {\n qb.where('user.name LIKE :name', { name: id });\n\n if (realmKey) {\n const realm = await this.realmRepository.resolve(realmKey);\n if (realm) {\n qb.andWhere('user.realm_id = :realmId', { realmId: realm.id });\n }\n }\n }\n\n applyQuery(qb, query || {}, {\n defaultAlias: 'user',\n fields: {\n default: [\n 'id',\n 'name',\n 'name_locked',\n 'first_name',\n 'last_name',\n 'display_name',\n 'avatar',\n 'cover',\n 'active',\n 'created_at',\n 'updated_at',\n 'realm_id',\n ],\n allowed: ['email'],\n },\n relations: { allowed: ['realm'] },\n });\n\n const entity = await qb.getOne();\n if (entity) {\n await this.repository.extendOneWithEA(entity);\n }\n return entity;\n }\n\n async findManyBy(where: Record<string, any>): Promise<User[]> {\n return this.repository.findBy(translateWhereConditions(where));\n }\n\n async findOneBy(where: Record<string, any>): Promise<User | null> {\n return this.repository.findOneBy(translateWhereConditions(where));\n }\n\n async findOneByWithEmail(where: Record<string, any>): Promise<User | null> {\n const qb = this.repository.createQueryBuilder('user');\n qb.addSelect('user.email');\n\n const translated = translateWhereConditions(where);\n qb.where(translated);\n\n return qb.getOne();\n }\n\n create(data: Partial<User>): User {\n return this.repository.create(data);\n }\n\n merge(entity: User, data: Partial<User>): User {\n return this.repository.merge(entity, data);\n }\n\n async save(entity: User): Promise<User> {\n return this.repository.save(entity);\n }\n\n async remove(entity: User): Promise<void> {\n await this.repository.remove(entity);\n }\n\n async validateJoinColumns(data: Partial<User>): Promise<void> {\n await validateEntityJoinColumns(data, {\n dataSource: this.repository.manager.connection,\n entityTarget: UserEntity,\n });\n }\n\n async checkUniqueness(data: Partial<User>, existing?: User): Promise<void> {\n const isUnique = await isEntityUnique({\n dataSource: this.repository.manager.connection,\n entityTarget: UserEntity,\n entity: data,\n entityExisting: existing,\n });\n\n if (!isUnique) {\n throw new DatabaseConflictError();\n }\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { UserAttribute } from '@authup/core-kit';\nimport type { Repository } from 'typeorm';\nimport { applyQuery, validateEntityJoinColumns } from 'typeorm-extension';\nimport type { EntityRepositoryFindManyResult, IUserAttributeRepository } from '../../../../../core/index.ts';\nimport { UserAttributeEntity } from '../../../../../adapters/database/domains/index.ts';\nimport { translateWhereConditions } from '../helpers.ts';\n\nexport class UserAttributeRepositoryAdapter implements IUserAttributeRepository {\n private readonly repository: Repository<UserAttribute>;\n\n constructor(repository: Repository<UserAttribute>) {\n this.repository = repository;\n }\n\n async findMany(query: Record<string, any>): Promise<EntityRepositoryFindManyResult<UserAttribute>> {\n const qb = this.repository.createQueryBuilder('userAttribute');\n qb.groupBy('userAttribute.id');\n\n const { pagination } = applyQuery(qb, query, {\n defaultAlias: 'userAttribute',\n filters: { allowed: ['id', 'name', 'user_id', 'realm_id'] },\n sort: { allowed: ['id', 'name', 'user_id', 'realm_id', 'created_at', 'updated_at'] },\n pagination: { maxLimit: 50 },\n });\n\n const [entities, total] = await qb.getManyAndCount();\n\n return {\n data: entities,\n meta: {\n total,\n ...pagination,\n },\n };\n }\n\n findOneById(id: string): Promise<UserAttribute | null> {\n return this.findOneBy({ id });\n }\n\n async findOneByName(): Promise<UserAttribute | null> {\n return null;\n }\n\n async findOneByIdOrName(idOrName: string): Promise<UserAttribute | null> {\n return this.findOneById(idOrName);\n }\n\n async findManyBy(where: Record<string, any>): Promise<UserAttribute[]> {\n return this.repository.findBy(translateWhereConditions(where));\n }\n\n async findOneBy(where: Record<string, any>): Promise<UserAttribute | null> {\n return this.repository.findOneBy(translateWhereConditions(where));\n }\n\n create(data: Partial<UserAttribute>): UserAttribute {\n return this.repository.create(data);\n }\n\n merge(entity: UserAttribute, data: Partial<UserAttribute>): UserAttribute {\n return this.repository.merge(entity, data);\n }\n\n async save(entity: UserAttribute): Promise<UserAttribute> {\n return this.repository.save(entity);\n }\n\n async remove(entity: UserAttribute): Promise<void> {\n await this.repository.remove(entity);\n }\n\n async validateJoinColumns(data: Partial<UserAttribute>): Promise<void> {\n await validateEntityJoinColumns(data, {\n dataSource: this.repository.manager.connection,\n entityTarget: UserAttributeEntity,\n });\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { UserPermission } from '@authup/core-kit';\nimport type { Repository } from 'typeorm';\nimport { applyQuery, validateEntityJoinColumns } from 'typeorm-extension';\nimport type { EntityRepositoryFindManyResult, IUserPermissionRepository } from '../../../../../core/index.ts';\nimport { UserPermissionEntity } from '../../../../../adapters/database/domains/index.ts';\nimport { translateWhereConditions } from '../helpers.ts';\n\nexport class UserPermissionRepositoryAdapter implements IUserPermissionRepository {\n private readonly repository: Repository<UserPermission>;\n\n constructor(repository: Repository<UserPermission>) {\n this.repository = repository;\n }\n\n async findMany(query: Record<string, any>): Promise<EntityRepositoryFindManyResult<UserPermission>> {\n const qb = this.repository.createQueryBuilder('userPermission');\n qb.groupBy('userPermission.id');\n\n const { pagination } = applyQuery(qb, query, {\n defaultAlias: 'userPermission',\n filters: {\n allowed: [\n 'user_id',\n 'permission_id',\n ],\n },\n relations: {\n allowed: [\n 'user',\n 'permission',\n ],\n onJoin: (_property: string, key: string, q: any) => {\n q.addGroupBy(`${key}.id`);\n },\n },\n sort: {\n allowed: [\n 'id',\n 'created_at',\n 'updated_at',\n ],\n },\n pagination: { maxLimit: 50 },\n });\n\n const [entities, total] = await qb.getManyAndCount();\n\n return {\n data: entities,\n meta: {\n total,\n ...pagination,\n },\n };\n }\n\n findOneById(id: string): Promise<UserPermission | null> {\n return this.findOneBy({ id });\n }\n\n async findOneByName(_name: string): Promise<UserPermission | null> {\n return Promise.resolve(null);\n }\n\n findOneByIdOrName(idOrName: string): Promise<UserPermission | null> {\n return this.findOneById(idOrName);\n }\n\n async findManyBy(where: Record<string, any>): Promise<UserPermission[]> {\n return this.repository.findBy(translateWhereConditions(where));\n }\n\n async findOneBy(where: Record<string, any>): Promise<UserPermission | null> {\n return this.repository.findOneBy(translateWhereConditions(where));\n }\n\n create(data: Partial<UserPermission>): UserPermission {\n return this.repository.create(data);\n }\n\n merge(entity: UserPermission, data: Partial<UserPermission>): UserPermission {\n return this.repository.merge(entity, data);\n }\n\n async save(entity: UserPermission): Promise<UserPermission> {\n return this.repository.save(entity);\n }\n\n async remove(entity: UserPermission): Promise<void> {\n await this.repository.remove(entity);\n }\n\n async validateJoinColumns(data: Partial<UserPermission>): Promise<void> {\n await validateEntityJoinColumns(data, {\n dataSource: this.repository.manager.connection,\n entityTarget: UserPermissionEntity,\n });\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { UserRole } from '@authup/core-kit';\nimport type { Repository } from 'typeorm';\nimport { applyQuery, validateEntityJoinColumns } from 'typeorm-extension';\nimport type { EntityRepositoryFindManyResult, IUserRoleRepository } from '../../../../../core/index.ts';\nimport { UserRoleEntity } from '../../../../../adapters/database/domains/index.ts';\nimport { translateWhereConditions } from '../helpers.ts';\n\nexport class UserRoleRepositoryAdapter implements IUserRoleRepository {\n private readonly repository: Repository<UserRole>;\n\n constructor(repository: Repository<UserRole>) {\n this.repository = repository;\n }\n\n async findMany(query: Record<string, any>): Promise<EntityRepositoryFindManyResult<UserRole>> {\n const qb = this.repository.createQueryBuilder('userRole');\n qb.groupBy('userRole.id');\n\n const { pagination } = applyQuery(qb, query, {\n defaultAlias: 'userRole',\n filters: { allowed: ['role_id', 'user_id'] },\n relations: {\n allowed: ['user', 'role'],\n onJoin: (_property: string, key: string, q: any) => {\n q.addGroupBy(`${key}.id`);\n },\n },\n sort: {\n allowed: [\n 'id',\n 'created_at',\n 'updated_at',\n ],\n },\n pagination: { maxLimit: 50 },\n });\n\n const [entities, total] = await qb.getManyAndCount();\n\n return {\n data: entities,\n meta: {\n total,\n ...pagination,\n },\n };\n }\n\n findOneById(id: string): Promise<UserRole | null> {\n return this.findOneBy({ id });\n }\n\n async findOneByName(_name: string): Promise<UserRole | null> {\n return Promise.resolve(null);\n }\n\n findOneByIdOrName(idOrName: string): Promise<UserRole | null> {\n return this.findOneById(idOrName);\n }\n\n async findManyBy(where: Record<string, any>): Promise<UserRole[]> {\n return this.repository.findBy(translateWhereConditions(where));\n }\n\n async findOneBy(where: Record<string, any>): Promise<UserRole | null> {\n return this.repository.findOneBy(translateWhereConditions(where));\n }\n\n create(data: Partial<UserRole>): UserRole {\n return this.repository.create(data);\n }\n\n merge(entity: UserRole, data: Partial<UserRole>): UserRole {\n return this.repository.merge(entity, data);\n }\n\n async save(entity: UserRole): Promise<UserRole> {\n return this.repository.save(entity);\n }\n\n async remove(entity: UserRole): Promise<void> {\n await this.repository.remove(entity);\n }\n\n async validateJoinColumns(data: Partial<UserRole>): Promise<void> {\n await validateEntityJoinColumns(data, {\n dataSource: this.repository.manager.connection,\n entityTarget: UserRoleEntity,\n });\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { IdentityProviderRoleMapping } from '@authup/core-kit';\nimport type { Repository } from 'typeorm';\nimport { applyQuery, validateEntityJoinColumns } from 'typeorm-extension';\nimport type { EntityRepositoryFindManyResult, IIdentityProviderRoleMappingRepository } from '../../../../../core/index.ts';\nimport { IdentityProviderRoleMappingEntity } from '../../../../../adapters/database/domains/index.ts';\nimport { translateWhereConditions } from '../helpers.ts';\n\nexport class IdentityProviderRoleMappingRepositoryAdapter implements IIdentityProviderRoleMappingRepository {\n private readonly repository: Repository<IdentityProviderRoleMapping>;\n\n constructor(repository: Repository<IdentityProviderRoleMapping>) {\n this.repository = repository;\n }\n\n async findMany(query: Record<string, any>): Promise<EntityRepositoryFindManyResult<IdentityProviderRoleMapping>> {\n const qb = this.repository.createQueryBuilder('providerRole');\n qb.groupBy('providerRole.id');\n\n const { pagination } = applyQuery(qb, query, {\n defaultAlias: 'providerRole',\n filters: {\n allowed: [\n 'role_id',\n 'provider_id',\n ],\n },\n sort: {\n allowed: [\n 'id',\n 'created_at',\n 'updated_at',\n ],\n },\n relations: {\n allowed: [\n 'role',\n 'provider',\n ],\n onJoin: (_property: string, key: string, q: any) => {\n q.addGroupBy(`${key}.id`);\n },\n },\n pagination: { maxLimit: 50 },\n });\n\n const [entities, total] = await qb.getManyAndCount();\n\n return {\n data: entities,\n meta: {\n total,\n ...pagination,\n },\n };\n }\n\n findOneById(id: string): Promise<IdentityProviderRoleMapping | null> {\n return this.findOneBy({ id });\n }\n\n async findOneByName(): Promise<IdentityProviderRoleMapping | null> {\n return null;\n }\n\n async findOneByIdOrName(idOrName: string): Promise<IdentityProviderRoleMapping | null> {\n return this.findOneById(idOrName);\n }\n\n async findManyBy(where: Record<string, any>): Promise<IdentityProviderRoleMapping[]> {\n return this.repository.findBy(translateWhereConditions(where));\n }\n\n async findOneBy(where: Record<string, any>): Promise<IdentityProviderRoleMapping | null> {\n return this.repository.findOneBy(translateWhereConditions(where));\n }\n\n create(data: Partial<IdentityProviderRoleMapping>): IdentityProviderRoleMapping {\n return this.repository.create(data);\n }\n\n merge(entity: IdentityProviderRoleMapping, data: Partial<IdentityProviderRoleMapping>): IdentityProviderRoleMapping {\n return this.repository.merge(entity, data);\n }\n\n async save(entity: IdentityProviderRoleMapping): Promise<IdentityProviderRoleMapping> {\n return this.repository.save(entity);\n }\n\n async remove(entity: IdentityProviderRoleMapping): Promise<void> {\n await this.repository.remove(entity);\n }\n\n async validateJoinColumns(data: Partial<IdentityProviderRoleMapping>): Promise<void> {\n await validateEntityJoinColumns(data, {\n dataSource: this.repository.manager.connection,\n entityTarget: IdentityProviderRoleMappingEntity,\n });\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Component } from '../../../components/index.ts';\nimport { createDatabaseUniqueEntriesComponent, createOAuth2CleanerComponent } from '../../../components/index.ts';\nimport { DatabaseInjectionKey } from '../database/index.ts';\nimport type { IModule } from 'orkos';\nimport { ModuleName } from '../constants.ts';\nimport type { IContainer } from 'eldin';\n\nexport class ComponentsModule implements IModule {\n readonly name: string;\n\n readonly dependencies: string[];\n\n constructor() {\n this.name = ModuleName.COMPONENTS;\n this.dependencies = [ModuleName.DATABASE];\n }\n\n async setup(container: IContainer): Promise<void> {\n const dataSource = container.resolve(DatabaseInjectionKey.DataSource);\n\n const components: Component[] = [\n createOAuth2CleanerComponent(dataSource),\n createDatabaseUniqueEntriesComponent(dataSource),\n ];\n\n components.forEach((component) => component.start());\n }\n\n // ----------------------------------------------------\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { TypedToken } from 'eldin';\nimport type { IServer } from '../../../adapters/http/index.ts';\n\nexport const HTTPInjectionKey = { Server: new TypedToken<IServer>('Server') } as const;\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport enum RequestHandlerOperation {\n COMMAND = 'command',\n CREATE = 'create',\n READ = 'read',\n UPDATE = 'update',\n DELETE = 'delete',\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Request } from 'routup';\nimport { setRequestEnv, useRequestEnv } from 'routup';\nimport type { RequestPermissionEvaluator } from './module.ts';\n\nconst sym = Symbol('RequestPermissionEvaluator');\n\nexport function useRequestPermissionEvaluator(req: Request) : RequestPermissionEvaluator {\n const instance = useRequestEnv(req, sym);\n if (!instance) {\n throw new Error('The request permission evaluator is not initialised.');\n }\n\n return instance as RequestPermissionEvaluator;\n}\n\nexport function setRequestPermissionEvaluator(req: Request, ctx: RequestPermissionEvaluator) {\n setRequestEnv(req, sym, ctx);\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Identity } from '@authup/core-kit';\nimport { IdentityType, REALM_MASTER_NAME } from '@authup/core-kit';\nimport { UnauthorizedError } from '@ebec/http';\nimport type { Request } from 'routup';\nimport { setRequestEnv, useRequestEnv } from 'routup';\n\nconst sym = Symbol('RIdentity');\n\nexport class RequestIdentity {\n public readonly raw : Identity;\n\n constructor(identity: Identity) {\n this.raw = identity;\n }\n\n get clientId() {\n const { raw } = this;\n if (raw.type === IdentityType.CLIENT) {\n return raw.data.id;\n }\n\n return raw.data.client_id || null;\n }\n\n get data() {\n return this.raw.data;\n }\n\n get type() {\n return this.raw.type;\n }\n\n get id() {\n return this.raw.data.id;\n }\n\n get realmId() {\n return this.raw.data.realm_id || this.raw.data.realm?.id;\n }\n\n get realmName() {\n return this.raw.data.realm?.name;\n }\n}\n\nexport function useRequestIdentity(req: Request) : RequestIdentity | undefined {\n return useRequestEnv(req, sym) as RequestIdentity | undefined;\n}\n\nexport function setRequestIdentity(req: Request, input: Identity | RequestIdentity) : void {\n let data : RequestIdentity;\n\n if (input instanceof RequestIdentity) {\n data = input;\n } else {\n data = new RequestIdentity(input);\n }\n\n setRequestEnv(req, sym, data);\n}\n\nexport function useRequestIdentityOrFail(req: Request) : RequestIdentity {\n const identity = useRequestIdentity(req);\n if (!identity) {\n throw new UnauthorizedError();\n }\n\n return identity;\n}\n\nexport function isRequestIdentityMasterRealmMember(input: RequestIdentity) : boolean {\n return input.realmName === REALM_MASTER_NAME;\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Request } from 'routup';\nimport type { ActorContext } from '../../../../core/index.ts';\nimport { useRequestPermissionEvaluator } from '../permission/helper.ts';\nimport { useRequestIdentity } from './identity.ts';\n\nexport function buildActorContext(req: Request): ActorContext {\n const identity = useRequestIdentity(req);\n\n return {\n permissionEvaluator: useRequestPermissionEvaluator(req),\n identity: identity ? identity.raw : undefined,\n };\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { isUUID } from '@authup/kit';\nimport { useRequestBody } from '@routup/basic/body';\nimport type { Request } from 'routup';\n\nexport function getRequestBodyRealmID(req: Request) : string | undefined {\n const realmId = useRequestBody(req, 'realm_id');\n if (typeof realmId !== 'string') {\n return undefined;\n }\n\n if (!isUUID(realmId)) {\n return undefined;\n }\n\n return realmId;\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { isUUID } from '@authup/kit';\nimport type { Request } from 'routup';\nimport { useRequestParam } from 'routup';\nimport { ValidupError, buildErrorMessageForAttribute, defineIssueItem } from 'validup';\n\ntype RequestIDParamOptions = {\n /**\n * default: true\n */\n isUUID?: boolean\n};\n\nexport function useRequestParamID(req: Request, options: RequestIDParamOptions = {}) : string {\n const id = getRequestParamID(req, options);\n if (typeof id === 'undefined') {\n throw new ValidupError([\n defineIssueItem({\n path: ['id'],\n message: buildErrorMessageForAttribute('id'),\n }),\n ]);\n }\n\n return id;\n}\n\nexport function getRequestParamID(req: Request, options: RequestIDParamOptions = {}) : string | undefined {\n const id = getRequestStringParam(req, 'id');\n if (!id) {\n return undefined;\n }\n\n options.isUUID = options.isUUID ?? true;\n if (options.isUUID && !isUUID(id)) {\n return undefined;\n }\n\n return id;\n}\n\nexport function getRequestStringParam(req: Request, key: string) : string | undefined {\n const value = useRequestParam(req, key);\n if (typeof value !== 'string' || value.length === 0) {\n return undefined;\n }\n\n return value;\n}\n\nexport function getRequestStringParamOrFail(req: Request, key: string) : string | undefined {\n const value = getRequestStringParam(req, key);\n if (typeof value === 'undefined') {\n throw new ValidupError([\n defineIssueItem({\n path: [key],\n message: buildErrorMessageForAttribute(key),\n }),\n ]);\n }\n\n return value;\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Request } from 'routup';\nimport { setRequestEnv, useRequestEnv } from 'routup';\n\nconst sym = Symbol('Scopes');\n\nexport function useRequestScopes(req: Request) : string[] {\n const scopes = useRequestEnv(req, sym) as string[];\n\n return scopes || [];\n}\n\nexport function setRequestScopes(req: Request, scopes: string[]) {\n setRequestEnv(req, sym, scopes);\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Request } from 'routup';\nimport { setRequestEnv, useRequestEnv } from 'routup';\n\nconst sym = Symbol('Token');\n\nexport function useRequestToken(req: Request) {\n return useRequestEnv(req, sym) as string | undefined;\n}\n\nexport function setRequestToken(req: Request, token: string) {\n setRequestEnv(req, sym, token);\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { ScopeName } from '@authup/core-kit';\nimport type {\n IPermissionEvaluator,\n PermissionEvaluationContext,\n} from '@authup/access';\nimport { BuiltInPolicyType, PolicyData } from '@authup/access';\nimport type { Request } from 'routup';\nimport { useRequestIdentity, useRequestScopes } from '../helpers/index.ts';\n\nexport class RequestPermissionEvaluator implements IPermissionEvaluator {\n protected req: Request;\n\n protected evaluator: IPermissionEvaluator;\n\n constructor(req: Request, evaluator: IPermissionEvaluator) {\n this.req = req;\n this.evaluator = evaluator;\n }\n\n // --------------------------------------------------------------\n\n async evaluate(ctx: PermissionEvaluationContext) : Promise<void> {\n return this.evaluator.evaluate(this.extendContext(ctx));\n }\n\n async preEvaluate(ctx: PermissionEvaluationContext) : Promise<void> {\n return this.evaluator.preEvaluate(this.extendContext(ctx));\n }\n\n // --------------------------------------------------------------\n\n async preEvaluateOneOf(ctx: PermissionEvaluationContext) : Promise<void> {\n return this.evaluator.preEvaluateOneOf(this.extendContext(ctx));\n }\n\n async evaluateOneOf(ctx: PermissionEvaluationContext) : Promise<void> {\n return this.evaluator.evaluateOneOf(this.extendContext(ctx));\n }\n\n // --------------------------------------------------------------\n\n protected extendContext(ctx: PermissionEvaluationContext) {\n const scopes = useRequestScopes(this.req);\n if (scopes.includes(ScopeName.GLOBAL)) {\n ctx.input = ctx.input || new PolicyData();\n ctx.input.set(BuiltInPolicyType.IDENTITY, useRequestIdentity(this.req));\n }\n\n return ctx;\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Request } from 'routup';\nimport type { OAuth2AuthorizationCodeRequest } from '@authup/core-kit';\nimport { RoutupContainerAdapter } from '@validup/adapter-routup';\nimport type { IOAuth2AuthorizationCodeRequestVerifier, OAuth2AuthorizationResult } from '../../../../../core/index.ts';\nimport { OAuth2Authorization, OAuth2AuthorizationCodeRequestValidator } from '../../../../../core/index.ts';\nimport { useRequestIdentityOrFail } from '../../../request/index.ts';\nimport type { HTTPOAuth2AuthorizationManagerContext } from './types.ts';\n\nexport class HTTPOAuth2Authorizer extends OAuth2Authorization {\n protected codeRequestVerifier : IOAuth2AuthorizationCodeRequestVerifier;\n\n protected requestValidator : RoutupContainerAdapter<OAuth2AuthorizationCodeRequest>;\n\n constructor(ctx: HTTPOAuth2AuthorizationManagerContext) {\n super(ctx);\n\n this.codeRequestVerifier = ctx.codeRequestVerifier;\n\n const validator = new OAuth2AuthorizationCodeRequestValidator();\n this.requestValidator = new RoutupContainerAdapter(validator);\n }\n\n async authorizeWithRequest(req: Request) : Promise<OAuth2AuthorizationResult> {\n const codeRequestValidated = await this.validateWithRequest(req);\n\n const { data } = await this.codeRequestVerifier.verify(codeRequestValidated);\n\n const identity = useRequestIdentityOrFail(req);\n\n return this.authorize(data, identity.raw);\n }\n\n /**\n * Validate authorization request.\n *\n * @throws OAuth2Error\n *\n * @param req\n */\n async validateWithRequest(\n req: Request,\n ) : Promise<OAuth2AuthorizationCodeRequest> {\n return this.requestValidator.run(req, { locations: ['body', 'query'] });\n }\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { OAuth2TokenGrant } from '@authup/specs';\nimport { useRequestBody } from '@routup/basic/body';\nimport { useRequestQuery } from '@routup/basic/query';\nimport { AuthorizationHeaderType, parseAuthorizationHeader } from 'hapic';\nimport type { Request } from 'routup';\n\nexport function guessOauth2GrantTypeByRequest(\n request: Request,\n) : `${OAuth2TokenGrant}` | undefined {\n const grantType = useRequestBody(request, 'grant_type') || useRequestQuery(request, 'grant_type');\n\n const validGrantTypes = Object.values(OAuth2TokenGrant);\n if (validGrantTypes.includes(grantType)) {\n return grantType;\n }\n\n const username = useRequestBody(request, 'username') || useRequestQuery(request, 'username');\n const password = useRequestBody(request, 'password') || useRequestQuery(request, 'password');\n\n if (username && password) {\n return OAuth2TokenGrant.PASSWORD;\n }\n\n // ------------------------------------------------------------------\n\n const robotId = useRequestBody(request, 'id') || useRequestQuery(request, 'id');\n const robotSecret = useRequestBody(request, 'secret') || useRequestQuery(request, 'secret');\n\n if (robotId && robotSecret) {\n return OAuth2TokenGrant.ROBOT_CREDENTIALS;\n }\n\n // ------------------------------------------------------------------\n\n const refreshToken = useRequestBody(request, 'refresh_token') || useRequestQuery(request, 'refresh_token');\n if (refreshToken) {\n return OAuth2TokenGrant.REFRESH_TOKEN;\n }\n\n // ------------------------------------------------------------------\n\n const code = useRequestBody(request, 'code') || useRequestQuery(request, 'code');\n if (code) {\n return OAuth2TokenGrant.AUTHORIZATION_CODE;\n }\n\n // ------------------------------------------------------------------\n\n let clientId = useRequestBody(request, 'client_id') || useRequestQuery(request, 'client_id');\n let clientSecret = useRequestBody(request, 'client_secret') || useRequestQuery(request, 'client_secret');\n\n if (!clientId && !clientSecret) {\n const { authorization: headerValue } = request.headers;\n\n if (headerValue) {\n const header = parseAuthorizationHeader(headerValue);\n\n if (header.type === AuthorizationHeaderType.BASIC) {\n clientId = header.username;\n clientSecret = header.password;\n }\n }\n }\n\n if (clientId && clientSecret) {\n return OAuth2TokenGrant.CLIENT_CREDENTIALS;\n }\n\n return undefined;\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { OAuth2TokenGrantResponse } from '@authup/specs';\nimport { OAuth2Error } from '@authup/specs';\nimport { useRequestBody } from '@routup/basic/body';\nimport { useRequestQuery } from '@routup/basic/query';\nimport type { Request } from 'routup';\nimport { getRequestHeader, getRequestIP } from 'routup';\nimport { OAuth2AuthorizeGrant } from '../../../../../core/index.ts';\nimport type { IOAuth2AuthorizationCodeVerifier } from '../../../../../core/index.ts';\nimport type { HTTPOAuth2AuthorizeGrantContext, IHTTPOAuth2Grant } from './types.ts';\n\nexport class HTTPOAuth2AuthorizeGrant extends OAuth2AuthorizeGrant implements IHTTPOAuth2Grant {\n protected codeVerifier : IOAuth2AuthorizationCodeVerifier;\n\n constructor(ctx: HTTPOAuth2AuthorizeGrantContext) {\n super(ctx);\n\n this.codeVerifier = ctx.codeVerifier;\n }\n\n async runWithRequest(req: Request): Promise<OAuth2TokenGrantResponse> {\n const code = this.extractParam(req, 'code');\n const redirectUri = this.extractParam(req, 'redirect_uri');\n const codeVerifier = this.extractParam(req, 'code_verifier');\n if (!code) {\n throw OAuth2Error.requestInvalid();\n }\n\n const entity = await this.codeVerifier.verify(code, {\n redirectUri,\n codeVerifier,\n });\n\n return this.runWith(entity, {\n ipAddress: getRequestIP(req, { trustProxy: true }),\n userAgent: getRequestHeader(req, 'user-agent'),\n });\n }\n\n protected extractParam(req: Request, key: string) : string | undefined {\n let value : unknown = useRequestBody(req, key);\n if (!value) {\n value = useRequestQuery(req, key);\n }\n\n return typeof value === 'string' && value.length > 0 ?\n value :\n undefined;\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { OAuth2TokenGrantResponse } from '@authup/specs';\nimport { OAuth2Error } from '@authup/specs';\nimport { useRequestBody } from '@routup/basic/body';\nimport type { Client } from '@authup/core-kit';\nimport { ClientError } from '@authup/core-kit';\nimport { AuthorizationHeaderType, parseAuthorizationHeader } from 'hapic';\nimport type { Request } from 'routup';\nimport { getRequestHeader, getRequestIP } from 'routup';\nimport type { ICredentialsAuthenticator } from '../../../../../core/index.ts';\nimport { ClientCredentialsGrant } from '../../../../../core/index.ts';\nimport type { HTTPOAuth2ClientCredentialsGrantContext, IHTTPOAuth2Grant } from './types.ts';\n\nexport class HTTPClientCredentialsGrant extends ClientCredentialsGrant implements IHTTPOAuth2Grant {\n protected authenticator : ICredentialsAuthenticator<Client>;\n\n constructor(ctx: HTTPOAuth2ClientCredentialsGrantContext) {\n super(ctx);\n\n this.authenticator = ctx.authenticator;\n }\n\n async runWithRequest(req: Request): Promise<OAuth2TokenGrantResponse> {\n let clientId = useRequestBody(req, 'client_id');\n let clientSecret = useRequestBody(req, 'client_secret');\n const realmId = useRequestBody(req, 'realm_id');\n\n if (!clientId && !clientSecret) {\n const { authorization: headerValue } = req.headers;\n\n if (typeof headerValue !== 'string') {\n throw ClientError.credentialsInvalid();\n }\n\n const header = parseAuthorizationHeader(headerValue);\n\n if (header.type !== AuthorizationHeaderType.BASIC) {\n throw OAuth2Error.requestInvalid();\n }\n\n clientId = header.username;\n clientSecret = header.password;\n }\n\n const client = await this.authenticator.authenticate(clientId, clientSecret, realmId);\n\n return this.runWith(client, {\n ipAddress: getRequestIP(req, { trustProxy: true }),\n userAgent: getRequestHeader(req, 'user-agent'),\n });\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { OAuth2TokenGrantResponse } from '@authup/specs';\nimport type { Request } from 'routup';\nimport { getRequestHeader, getRequestIP } from 'routup';\nimport { IdentityGrantType } from '../../../../../core/index.ts';\nimport { useRequestIdentityOrFail } from '../../../request/index.ts';\nimport type { IHTTPOAuth2Grant } from './types.ts';\n\nexport class HTTPOAuth2IdentityGrantType extends IdentityGrantType implements IHTTPOAuth2Grant {\n runWithRequest(req: Request): Promise<OAuth2TokenGrantResponse> {\n const identity = useRequestIdentityOrFail(req);\n\n return this.runWith(\n identity.raw,\n {\n ipAddress: getRequestIP(req, { trustProxy: true }),\n userAgent: getRequestHeader(req, 'user-agent'),\n },\n );\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { User } from '@authup/core-kit';\nimport type { OAuth2TokenGrantResponse } from '@authup/specs';\nimport { useRequestBody } from '@routup/basic/body';\nimport type { Request } from 'routup';\nimport { getRequestHeader, getRequestIP } from 'routup';\nimport type { ICredentialsAuthenticator } from '../../../../../core/index.ts';\nimport { PasswordGrantType } from '../../../../../core/index.ts';\nimport type { HTTPOAuth2PasswordGrantContext, IHTTPOAuth2Grant } from './types.ts';\n\nexport class HTTPPasswordGrant extends PasswordGrantType implements IHTTPOAuth2Grant {\n protected authenticator : ICredentialsAuthenticator<User>;\n\n constructor(ctx: HTTPOAuth2PasswordGrantContext) {\n super(ctx);\n\n this.authenticator = ctx.authenticator;\n }\n\n async runWithRequest(req: Request): Promise<OAuth2TokenGrantResponse> {\n const {\n username,\n password,\n realm_id: realmId,\n } = useRequestBody(req);\n\n const data = await this.authenticator.authenticate(username, password, realmId);\n\n return this.runWith(\n data,\n {\n ipAddress: getRequestIP(req, { trustProxy: true }),\n userAgent: getRequestHeader(req, 'user-agent'),\n },\n );\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { OAuth2TokenGrantResponse } from '@authup/specs';\nimport { useRequestBody } from '@routup/basic/body';\nimport type { Request } from 'routup';\nimport { getRequestHeader, getRequestIP } from 'routup';\nimport { OAuth2RefreshTokenGrant } from '../../../../../core/index.ts';\nimport type { IHTTPOAuth2Grant } from './types.ts';\n\nexport class HTTPOAuth2RefreshTokenGrant extends OAuth2RefreshTokenGrant implements IHTTPOAuth2Grant {\n async runWithRequest(req: Request): Promise<OAuth2TokenGrantResponse> {\n const refreshToken = useRequestBody(req, 'refresh_token');\n\n return this.runWith(refreshToken, {\n ipAddress: getRequestIP(req, { trustProxy: true }),\n userAgent: getRequestHeader(req, 'user-agent'),\n });\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { OAuth2TokenGrantResponse } from '@authup/specs';\nimport { useRequestBody } from '@routup/basic/body';\nimport type { Request } from 'routup';\nimport { getRequestHeader, getRequestIP } from 'routup';\nimport type { Robot } from '@authup/core-kit';\nimport type { ICredentialsAuthenticator } from '../../../../../core/index.ts';\nimport { RobotCredentialsGrant } from '../../../../../core/index.ts';\nimport type { HTTPOAuth2RobotCredentialsGrantContext, IHTTPOAuth2Grant } from './types.ts';\n\nexport class HTTPRobotCredentialsGrant extends RobotCredentialsGrant implements IHTTPOAuth2Grant {\n protected authenticator : ICredentialsAuthenticator<Robot>;\n\n constructor(ctx: HTTPOAuth2RobotCredentialsGrantContext) {\n super(ctx);\n\n this.authenticator = ctx.authenticator;\n }\n\n async runWithRequest(req: Request): Promise<OAuth2TokenGrantResponse> {\n const {\n id,\n secret,\n realm_id: realmId,\n } = useRequestBody(req);\n const entity = await this.authenticator.authenticate(id, secret, realmId);\n\n return this.runWith(\n entity,\n {\n ipAddress: getRequestIP(req, { trustProxy: true }),\n userAgent: getRequestHeader(req, 'user-agent'),\n },\n );\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { IPermissionEvaluator } from '@authup/access';\nimport { PermissionEvaluator } from '@authup/access';\nimport type { Client, Robot, User } from '@authup/core-kit';\nimport {\n IdentityType,\n ScopeName,\n} from '@authup/core-kit';\nimport { HTTPError } from '@authup/errors';\nimport { JWTError, OAuth2TokenKind, deserializeOAuth2Scope } from '@authup/specs';\nimport type { Next, Request, Response } from 'routup';\nimport {\n AuthorizationHeaderType,\n type BasicAuthorizationHeader,\n type BearerAuthorizationHeader,\n parseAuthorizationHeader,\n} from 'hapic';\nimport {\n ClientAuthenticator,\n PolicyEngine,\n RobotAuthenticator,\n UserAuthenticator, \n} from '../../../../../core/index.ts';\nimport type {\n ICredentialsAuthenticator, \n IIdentityResolver,\n IOAuth2TokenVerifier, \n ISessionManager,\n} from '../../../../../core/index.ts';\nimport {\n RequestPermissionEvaluator,\n setRequestIdentity,\n setRequestPermissionEvaluator,\n setRequestScopes,\n setRequestToken,\n} from '../../../request/index.ts';\nimport type { HTTPAuthorizationMiddlewareContext, HTTPAuthorizationMiddlewareOptions } from './types.ts';\n\nexport class AuthorizationMiddleware {\n protected options: HTTPAuthorizationMiddlewareOptions;\n\n // --------------------------------------\n\n protected oauth2TokenVerifier: IOAuth2TokenVerifier;\n\n protected permissionEvaluator: IPermissionEvaluator;\n\n // --------------------------------------\n\n protected identityResolver: IIdentityResolver;\n\n protected sessionManager : ISessionManager;\n\n // --------------------------------------\n\n protected clientAuthenticator : ICredentialsAuthenticator<Client>;\n\n protected robotAuthenticator : ICredentialsAuthenticator<Robot>;\n\n protected userAuthenticator : ICredentialsAuthenticator<User>;\n\n // --------------------------------------\n\n constructor(ctx: HTTPAuthorizationMiddlewareContext) {\n this.options = ctx.options || {};\n\n this.identityResolver = ctx.identityResolver;\n this.sessionManager = ctx.sessionManager;\n\n this.clientAuthenticator = new ClientAuthenticator(ctx.identityResolver);\n this.robotAuthenticator = new RobotAuthenticator(ctx.identityResolver);\n this.userAuthenticator = new UserAuthenticator(ctx.identityResolver);\n\n this.oauth2TokenVerifier = ctx.oauth2TokenVerifier;\n\n this.permissionEvaluator = new PermissionEvaluator({\n provider: ctx.permissionProvider,\n policyEngine: new PolicyEngine(ctx.identityPermissionProvider),\n realmId: null,\n clientId: null,\n });\n }\n\n // --------------------------------------\n\n async run(request: Request, response: Response, next: Next) {\n const requestAccessContext = new RequestPermissionEvaluator(\n request,\n this.permissionEvaluator,\n );\n setRequestPermissionEvaluator(request, requestAccessContext);\n\n const { authorization: headerValue } = request.headers;\n\n try {\n if (typeof headerValue !== 'string') {\n next();\n return;\n }\n\n const header = parseAuthorizationHeader(headerValue);\n\n if (header.type === AuthorizationHeaderType.BEARER) {\n await this.verifyBearerAuthorizationHeader(request, header);\n next();\n return;\n } if (header.type === AuthorizationHeaderType.BASIC) {\n await this.verifyBasicAuthorizationHeader(request, header);\n next();\n return;\n }\n\n next(HTTPError.unsupportedHeaderType(header.type));\n } catch (e) {\n next(e as Error);\n }\n }\n\n /**\n *\n * @throws JWTError\n *\n * @param request\n * @param header\n *\n * @protected\n */\n protected async verifyBearerAuthorizationHeader(\n request: Request,\n header: BearerAuthorizationHeader,\n ) {\n const payload = await this.oauth2TokenVerifier.verify(header.token);\n if (payload.kind !== OAuth2TokenKind.ACCESS) {\n throw JWTError.payloadPropertyInvalid('kind');\n }\n\n if (!payload.realm_id) {\n throw JWTError.payloadPropertyInvalid('realm_id');\n }\n\n setRequestToken(request, header.token);\n\n if (payload.scope) {\n setRequestScopes(request, deserializeOAuth2Scope(payload.scope));\n }\n\n // -------------------------------------------------------\n\n if (!payload.session_id) {\n throw JWTError.payloadPropertyInvalid('session_id');\n }\n\n const session = await this.sessionManager.findOneById(payload.session_id);\n if (!session) {\n throw JWTError.expired();\n }\n\n try {\n await this.sessionManager.verify(session);\n } catch {\n throw JWTError.expired();\n }\n\n await this.sessionManager.ping(session);\n\n // -------------------------------------------------------\n\n if (!payload.sub_kind) {\n throw JWTError.payloadPropertyInvalid('sub_kind');\n }\n\n if (!payload.sub) {\n throw JWTError.payloadPropertyInvalid('sub');\n }\n\n const identity = await this.identityResolver.resolve(\n payload.sub_kind,\n payload.sub,\n );\n\n if (identity) {\n setRequestIdentity(request, identity);\n }\n }\n\n protected async verifyBasicAuthorizationHeader(\n request: Request,\n header: BasicAuthorizationHeader,\n ) {\n if (this.options.clientAuthBasic) {\n const authenticator = await this.clientAuthenticator.safeAuthenticate(\n header.username,\n header.password,\n );\n if (authenticator.success) {\n setRequestScopes(request, [ScopeName.GLOBAL]);\n setRequestIdentity(request, {\n type: IdentityType.CLIENT,\n data: authenticator.data,\n });\n }\n }\n\n if (this.options.userAuthBasic) {\n const authenticated = await this.userAuthenticator.safeAuthenticate(\n header.username,\n header.password,\n );\n\n if (authenticated.success) {\n setRequestScopes(request, [ScopeName.GLOBAL]);\n setRequestIdentity(request, {\n type: IdentityType.USER,\n data: authenticated.data,\n });\n\n return;\n }\n }\n\n if (this.options.robotAuthBasic) {\n const authenticated = await this.robotAuthenticator.safeAuthenticate(\n header.username,\n header.password,\n );\n if (authenticated.success) {\n setRequestScopes(request, [ScopeName.GLOBAL]);\n setRequestIdentity(request, {\n type: IdentityType.ROBOT,\n data: authenticated.data,\n });\n }\n }\n }\n}\n","/*\n * Copyright (c) 2021-2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { coreHandler } from 'routup';\nimport type { Handler } from 'routup';\nimport { AuthorizationMiddleware } from './module.ts';\nimport type { HTTPAuthorizationMiddlewareContext } from './types.ts';\n\nexport function createAuthorizationMiddleware(ctx: HTTPAuthorizationMiddlewareContext) : Handler {\n const middleware = new AuthorizationMiddleware(ctx);\n\n return coreHandler(async (\n request,\n response,\n next,\n ) => middleware.run(request, response, next));\n}\n","/*\n * Copyright (c) 2022-2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { HandlerInterface } from '@routup/decorators';\nimport type { Next, Request, Response } from 'routup';\nimport { useRequestIdentityOrFail } from '../../../request/index.ts';\n\nexport class ForceLoggedInMiddleware implements HandlerInterface {\n public run(request: Request, response: Response, next: Next) {\n useRequestIdentityOrFail(request);\n next();\n }\n}\n","/*\n * Copyright (c) 2022-2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { UnauthorizedError } from '@ebec/http';\nimport type { HandlerInterface } from '@routup/decorators';\nimport type { Next, Request, Response } from 'routup';\nimport { useRequestIdentity } from '../../../request/index.ts';\n\nexport class ForceUserLoggedInMiddleware implements HandlerInterface {\n public run(request: Request, response: Response, next: Next) {\n const identity = useRequestIdentity(request);\n\n if (!identity || identity.type !== 'user') {\n throw new UnauthorizedError();\n }\n\n next();\n }\n}\n","/*\n * Copyright (c) 2023-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nexport const CODE_PATH = path.dirname(fileURLToPath(import.meta.url));\nexport const PACKAGE_PATH = path.join(CODE_PATH, '..');\nexport const SRC_PATH = path.join(PACKAGE_PATH, 'src');\nexport const DIST_PATH = path.join(PACKAGE_PATH, 'dist');\n\nexport const CLIENT_WEB_SLIM_PACKAGE_PATH = path.join(PACKAGE_PATH, '..', 'client-web-slim');\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { load } from 'locter';\nimport { CodeTransformation, isCodeTransformation } from 'typeorm-extension';\nimport { createHandler } from '@routup/assets';\nimport path from 'node:path';\nimport type { Router } from 'routup';\nimport { coreHandler, setRequestParam } from 'routup';\nimport { CLIENT_WEB_SLIM_PACKAGE_PATH, DIST_PATH, PACKAGE_PATH } from '../../../../path.ts';\n\nexport async function registerAssetsMiddleware(router: Router) {\n if (!isCodeTransformation(CodeTransformation.JUST_IN_TIME)) {\n router.use('public', createHandler(\n path.posix.join(PACKAGE_PATH, 'public'),\n {\n fallthrough: true,\n scan: false,\n },\n ));\n\n router.use('public', createHandler(\n path.posix.join(DIST_PATH, 'client'),\n {\n fallthrough: false,\n scan: false,\n },\n ));\n return;\n }\n\n /**\n * @type import('vite')\n */\n const vite = await load('vite');\n\n /**\n * @type {import('vite').ViteDevServer}\n */\n const server = await vite.createServer({\n root: CLIENT_WEB_SLIM_PACKAGE_PATH,\n base: '/public/',\n logLevel: 'error',\n server: {\n middlewareMode: true,\n watch: {\n usePolling: true,\n interval: 100,\n },\n },\n appType: 'custom',\n });\n\n router.use('public', coreHandler((req, res, next) => server.middlewares(req, res, next)));\n router.use(coreHandler((req, res, next) => {\n setRequestParam(req, 'viteServer', server);\n\n next();\n }));\n}\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Options } from '@routup/basic';\nimport { basic } from '@routup/basic';\nimport type { Router } from 'routup';\n\nexport function registerBasicMiddleware(router: Router, input?: Options) {\n router.use(basic(input));\n}\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { CorsOptions } from 'cors';\nimport cors from 'cors';\nimport { coreHandler } from 'routup';\nimport type { Router } from 'routup';\nimport { merge } from 'smob';\n\nexport function registerCorsMiddleware(router: Router, input?: CorsOptions) {\n const options : CorsOptions = merge(input || {}, {\n origin(_origin, callback) {\n callback(null, true);\n },\n credentials: true,\n } satisfies CorsOptions);\n\n router.use(coreHandler((req, res, next) => cors(options)(req, res, next)));\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n BadRequestErrorOptions,\n ConflictErrorOptions,\n HTTPError,\n InsufficientStorageErrorOptions,\n InternalServerErrorOptions,\n} from '@ebec/http';\nimport { AuthupError } from '@authup/errors';\nimport { EntityRelationLookupError } from 'typeorm-extension';\nimport { buildErrorMessageForAttributes, isValidupError, stringifyPath } from 'validup';\nimport { hasOwnProperty, isObject } from '@authup/kit';\n\nexport function sanitizeError(input: unknown) : AuthupError {\n if (input instanceof AuthupError) {\n return input;\n }\n\n if (input instanceof EntityRelationLookupError) {\n return new AuthupError({\n statusCode: BadRequestErrorOptions.statusCode,\n code: BadRequestErrorOptions.code,\n message: input.message,\n stack: input.stack,\n });\n }\n\n if (isValidupError(input)) {\n const paths = input.issues.map((issue) => stringifyPath(issue.path));\n const error = new AuthupError({\n statusCode: BadRequestErrorOptions.statusCode,\n code: BadRequestErrorOptions.code,\n stack: input.stack,\n message: input.message || buildErrorMessageForAttributes(paths),\n });\n\n error.issues.push(...input.issues);\n return error;\n }\n\n if (input instanceof HTTPError) {\n return new AuthupError({\n statusCode: input.statusCode,\n code: input.code,\n message: input.message,\n data: input.data,\n stack: input.stack,\n });\n }\n\n if (isObject(input)) {\n const code = hasOwnProperty(input, 'code') &&\n typeof input.code === 'string' ?\n input.code :\n undefined;\n\n /**\n * @see https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html\n */\n switch (code) {\n case '23505':\n case 'ER_DUP_ENTRY':\n case 'SQLITE_CONSTRAINT_UNIQUE': {\n return new AuthupError({\n statusCode: ConflictErrorOptions.statusCode,\n code: ConflictErrorOptions.code,\n message: 'An entry with some unique attributes already exist.',\n stack: input.stack,\n });\n }\n case 'ER_DISK_FULL':\n return new AuthupError({\n statusCode: InsufficientStorageErrorOptions.statusCode,\n code: InsufficientStorageErrorOptions.code,\n message: 'No database operation possible, due the leak of free disk space.',\n stack: input.stack,\n });\n }\n\n return new AuthupError({\n statusCode: InternalServerErrorOptions.statusCode,\n code: InternalServerErrorOptions.code,\n message: input.message,\n stack: input.stack,\n });\n }\n\n return new AuthupError({\n statusCode: InternalServerErrorOptions.statusCode,\n code: InternalServerErrorOptions.code,\n });\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport function isSelfToken(id: string) {\n return id === '@me' ||\n id === '@self';\n}\n","/*\n * Copyright (c) 2021-2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { isObject } from '@authup/kit';\nimport type { Router } from 'routup';\nimport { errorHandler, send } from 'routup';\nimport { useLogger } from '@authup/server-kit';\nimport type { AuthupError } from '@authup/errors';\nimport type { Issue } from 'validup';\nimport { sanitizeError } from '../../../../utils/index.ts';\n\ntype ErrorResponsePayload = {\n statusCode: number,\n code: string,\n message: string,\n issues: Issue[],\n [key: string]: any\n};\n\nexport function registerErrorMiddleware(router: Router) {\n router.use(errorHandler((\n error,\n request,\n response,\n ) => {\n let next : AuthupError;\n if (error.cause) {\n next = sanitizeError(error.cause);\n } else {\n next = sanitizeError(error);\n }\n\n const payload : ErrorResponsePayload = {\n statusCode: next.statusCode,\n code: `${next.code}`,\n message: next.message,\n issues: next.issues,\n };\n\n const isServerError = next.statusCode >= 500 && next.statusCode < 600;\n if (isServerError) {\n useLogger().error(next);\n\n payload.message = 'An internal server error occurred.';\n } else if (isObject(next.data)) {\n const keys = Object.keys(next.data);\n for (const key of keys) {\n payload[key] = next.data[key];\n }\n }\n\n response.statusCode = payload.statusCode;\n return send(response, payload);\n }));\n}\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport morgan from 'morgan';\nimport type {\n Handler,\n Next, \n Request, \n Response,\n} from 'routup';\nimport { coreHandler, getRequestIP, useRequestPath } from 'routup';\nimport { useLogger } from '@authup/server-kit';\nimport { EnvironmentName } from '@authup/kit';\nimport { useRequestIdentity } from '../../request/index.ts';\n\ntype LoggerMiddlewareOptions = {\n env: string\n};\nexport function createLoggerMiddleware(options: LoggerMiddlewareOptions) : Handler {\n return coreHandler((\n request: Request,\n response: Response,\n next: Next,\n ) => {\n morgan(\n (tokens, req: Request, res: Response) => {\n const parts = [\n getRequestIP(req, { trustProxy: true }),\n ];\n\n const identity = useRequestIdentity(req);\n if (identity) {\n parts.push(`${identity.type}#${identity.id}`);\n }\n\n return [\n ...parts,\n '-',\n tokens.method(req, res),\n tokens.url(req, res),\n tokens.status(req, res),\n '-',\n `${tokens['response-time'](req, res)}ms`,\n ].join(' ');\n },\n {\n stream: {\n write(message) {\n if (options.env !== EnvironmentName.TEST) {\n useLogger()\n .http(message.replace('\\n', ''));\n }\n },\n },\n skip(req: Request, res: Response): boolean {\n const path = useRequestPath(req);\n if (path.length === 0 || path === '/') {\n return true;\n }\n\n if (options.env === EnvironmentName.PRODUCTION) {\n return res.statusCode < 400;\n }\n\n return false;\n },\n },\n )(request, response, next);\n });\n}\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { OptionsInput } from '@routup/prometheus';\nimport { prometheus } from '@routup/prometheus';\nimport type { Router } from 'routup';\nimport { useRequestPath } from 'routup';\n\nexport function registerPrometheusMiddleware(router: Router, input?: OptionsInput) {\n let options : OptionsInput = {\n skip(req) {\n let path = useRequestPath(req);\n if (!path.startsWith('/')) {\n path = `/${path}`;\n }\n\n return path.startsWith('/authorize') ||\n path.startsWith('/token') ||\n path.startsWith('/metrics') ||\n path === '/';\n },\n };\n\n if (input) {\n options = {\n ...options,\n ...input,\n };\n }\n\n router.use(prometheus(options));\n}\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { OptionsInput } from '@routup/rate-limit';\nimport { rateLimit } from '@routup/rate-limit';\nimport type { Request, Router } from 'routup';\nimport { merge } from 'smob';\nimport { useRequestIdentity } from '../../request/index.ts';\n\nexport function registerRateLimitMiddleware(router: Router, input?: OptionsInput) {\n let options : OptionsInput = {\n max(req: Request) {\n const identity = useRequestIdentity(req);\n if (!identity) {\n return 60 * 20; // 20 req. p. sec\n }\n\n switch (identity.type) {\n case 'robot':\n case 'client': {\n return 60 * 5_000; // 1000 req p. sec\n }\n case 'user':\n default: {\n return 60 * 100; // 100 req p. sec\n }\n }\n },\n windowMs: 60 * 1000, // 60 sec\n };\n\n options = merge(input || {}, options);\n\n router.use(rateLimit(options));\n}\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport process from 'node:process';\nimport type { UIOptions } from '@routup/swagger';\nimport { swaggerUI } from '@routup/swagger';\nimport type { Plugin } from 'routup';\nimport { buildFilePath, load, locate } from 'locter';\nimport { AuthupError } from '@authup/errors';\n\ntype SwaggerMiddlewareOptions = {\n documentPath: string,\n options?: UIOptions\n};\nexport async function createSwaggerMiddleware(input: Partial<SwaggerMiddlewareOptions> = {}) : Promise<Plugin> {\n let documentPath : string;\n if (input.documentPath) {\n documentPath = path.isAbsolute(input.documentPath) ?\n input.documentPath :\n path.join(process.cwd(), input.documentPath);\n } else {\n const locatorInfo = await locate('**/swagger.json');\n if (!locatorInfo) {\n throw new AuthupError('Swagger file not found.');\n }\n\n documentPath = buildFilePath(locatorInfo);\n }\n\n if (!fs.existsSync(documentPath)) {\n throw new AuthupError(`Swagger file ( ${documentPath} ) does not exist.`);\n }\n\n const document = await load(documentPath);\n\n return swaggerUI(document, input.options);\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { OAuth2SubKind } from '@authup/specs';\nimport {\n DBody, \n DController, \n DDelete, \n DGet, \n DPath, \n DPost, \n DPut, \n DRequest, \n DResponse, \n DTags,\n} from '@routup/decorators';\nimport { NotFoundError } from '@ebec/http';\nimport type { Client } from '@authup/core-kit';\nimport {\n send, \n sendAccepted, \n sendCreated, \n useRequestParam,\n} from 'routup';\nimport { useRequestQuery } from '@routup/basic/query';\nimport type { IClientRepository, IClientService } from '../../../../../core/index.ts';\nimport { OAuth2ScopeAttributesResolver } from '../../../../../core/index.ts';\nimport { ForceLoggedInMiddleware } from '../../../middleware/index.ts';\nimport { isSelfToken } from '../../../../../utils/index.ts';\nimport {\n buildActorContext,\n useRequestIdentity,\n useRequestScopes,\n} from '../../../request/index.ts';\n\nexport type ClientControllerContext = {\n service: IClientService,\n repository: IClientRepository,\n};\n\n@DTags('oauth2')\n@DController('/clients')\nexport class ClientController {\n protected service: IClientService;\n\n protected repository: IClientRepository;\n\n constructor(ctx: ClientControllerContext) {\n this.service = ctx.service;\n this.repository = ctx.repository;\n }\n\n @DGet('', [])\n async getMany(\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const {\n data, \n meta, \n } = await this.service.getMany(useRequestQuery(req), actor);\n\n return send(res, {\n data,\n meta, \n });\n }\n\n @DGet('/:id', [])\n async get(\n @DPath('id') id: string,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const identity = useRequestIdentity(req);\n\n let isMe = false;\n if (\n identity &&\n identity.type === 'client'\n ) {\n isMe = isSelfToken(id) || identity.id === id;\n }\n\n if (isMe) {\n const attributesResolver = new OAuth2ScopeAttributesResolver();\n const attributes = attributesResolver.resolveFor(OAuth2SubKind.CLIENT, useRequestScopes(req));\n\n const entity = await this.repository.findOneByIdOrName(\n identity!.id,\n useRequestParam(req, 'realmId'),\n );\n\n if (!entity) {\n throw new NotFoundError();\n }\n\n for (const attribute of attributes) {\n const attr = attribute as keyof Client;\n if (attr === 'secret') {\n const withSecret = await this.repository.findOneWithSecret({ id: entity.id });\n if (withSecret) {\n entity.secret = withSecret.secret;\n }\n }\n }\n\n return send(res, entity);\n }\n\n const actor = buildActorContext(req);\n const entity = await this.service.getOne(id, actor, useRequestParam(req, 'realmId'));\n\n return send(res, entity);\n }\n\n @DPost('', [ForceLoggedInMiddleware])\n async add(\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.create(data, actor);\n\n return sendCreated(res, entity);\n }\n\n @DPost('/:id', [ForceLoggedInMiddleware])\n async edit(\n @DPath('id') id: string,\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.update(id, data, actor);\n\n return sendAccepted(res, entity);\n }\n\n @DPut('/:id', [ForceLoggedInMiddleware])\n async put(\n @DPath('id') id: string,\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const {\n entity, \n created, \n } = await this.service.save(\n id || undefined,\n data,\n actor,\n );\n\n if (created) {\n return sendCreated(res, entity);\n }\n\n return sendAccepted(res, entity);\n }\n\n @DDelete('/:id', [ForceLoggedInMiddleware])\n async drop(\n @DPath('id') id: string,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.delete(id, actor);\n\n return sendAccepted(res, entity);\n }\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n DBody, \n DController, \n DDelete, \n DGet, \n DPath, \n DPost, \n DRequest, \n DResponse, \n DTags,\n} from '@routup/decorators';\nimport { send, sendAccepted, sendCreated } from 'routup';\nimport { useRequestQuery } from '@routup/basic/query';\nimport type { IClientPermissionService } from '../../../../../core/index.ts';\nimport { ForceLoggedInMiddleware } from '../../../middleware/index.ts';\nimport { buildActorContext } from '../../../request/index.ts';\n\nexport type ClientPermissionControllerContext = {\n service: IClientPermissionService,\n};\n\n@DTags('client')\n@DController('/client-permissions')\nexport class ClientPermissionController {\n protected service: IClientPermissionService;\n\n constructor(ctx: ClientPermissionControllerContext) {\n this.service = ctx.service;\n }\n\n @DGet('', [ForceLoggedInMiddleware])\n async getMany(\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const {\n data, \n meta, \n } = await this.service.getMany(useRequestQuery(req), actor);\n\n return send(res, {\n data,\n meta, \n });\n }\n\n @DPost('', [ForceLoggedInMiddleware])\n async add(\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n\n const entity = await this.service.create(data, actor);\n\n return sendCreated(res, entity);\n }\n\n @DPost('/:id', [ForceLoggedInMiddleware])\n async edit(\n @DPath('id') id: string,\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.update(id, data, actor);\n\n return sendAccepted(res, entity);\n }\n\n @DGet('/:id', [ForceLoggedInMiddleware])\n async getOne(\n @DPath('id') id: string,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.getOne(id, actor);\n\n return send(res, entity);\n }\n\n @DDelete('/:id', [ForceLoggedInMiddleware])\n async drop(\n @DPath('id') id: string,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.delete(\n id,\n actor,\n );\n\n return sendAccepted(res, entity);\n }\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { createValidationChain, createValidator } from '@validup/adapter-validator';\nimport { Container } from 'validup';\nimport type { ClientPermissionEntity } from '../../../../../database/domains/index.ts';\nimport { RequestHandlerOperation } from '../../../../request/index.ts';\n\nexport class ClientPermissionRequestValidator extends Container<\n ClientPermissionEntity\n> {\n protected initialize() {\n super.initialize();\n\n this.mount(\n 'client_id',\n { group: RequestHandlerOperation.CREATE },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .exists()\n .isUUID();\n }),\n );\n\n this.mount(\n 'permission_id',\n { group: RequestHandlerOperation.CREATE },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .exists()\n .isUUID();\n }),\n );\n\n this.mount(\n 'policy_id',\n { optional: true },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .isUUID()\n .optional({ values: 'null' });\n }),\n );\n }\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { createValidationChain, createValidator } from '@validup/adapter-validator';\nimport { Container } from 'validup';\nimport type { ClientRole } from '@authup/core-kit';\nimport { RequestHandlerOperation } from '../../../../request/index.ts';\n\nexport class ClientRoleRequestValidator extends Container<\n ClientRole\n> {\n protected initialize() {\n super.initialize();\n\n this.mount(\n 'client_id',\n { group: RequestHandlerOperation.CREATE },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .exists()\n .isUUID();\n }),\n );\n\n this.mount(\n 'role_id',\n { group: RequestHandlerOperation.CREATE },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .exists()\n .isUUID();\n }),\n );\n }\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n DBody, \n DController, \n DDelete, \n DGet, \n DPath, \n DPost, \n DRequest, \n DResponse, \n DTags,\n} from '@routup/decorators';\nimport { ForbiddenError } from '@ebec/http';\nimport { send, sendAccepted, sendCreated } from 'routup';\nimport { useRequestQuery } from '@routup/basic/query';\nimport type { IClientRoleRepository, IClientRoleService, IIdentityPermissionProvider } from '../../../../../core/index.ts';\nimport { ForceLoggedInMiddleware } from '../../../middleware/index.ts';\nimport {\n buildActorContext,\n useRequestIdentityOrFail,\n} from '../../../request/index.ts';\n\nexport type ClientRoleControllerContext = {\n service: IClientRoleService,\n repository: IClientRoleRepository,\n identityPermissionProvider: IIdentityPermissionProvider,\n};\n\n@DTags('client')\n@DController('/client-roles')\nexport class ClientRoleController {\n protected service: IClientRoleService;\n\n protected repository: IClientRoleRepository;\n\n protected identityPermissionProvider: IIdentityPermissionProvider;\n\n constructor(ctx: ClientRoleControllerContext) {\n this.service = ctx.service;\n this.repository = ctx.repository;\n this.identityPermissionProvider = ctx.identityPermissionProvider;\n }\n\n @DGet('', [ForceLoggedInMiddleware])\n async getMany(\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const {\n data, \n meta, \n } = await this.service.getMany(useRequestQuery(req), actor);\n\n return send(res, {\n data,\n meta, \n });\n }\n\n @DPost('', [ForceLoggedInMiddleware])\n async add(\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n\n await this.repository.validateJoinColumns(data);\n\n if (data.role) {\n const identity = useRequestIdentityOrFail(req);\n const hasPermissions = await this.identityPermissionProvider.isSuperset(identity, {\n type: 'role',\n id: data.role.id,\n clientId: data.role.client_id,\n });\n if (!hasPermissions) {\n throw new ForbiddenError('You don\\'t own the required permissions.');\n }\n }\n\n const entity = await this.service.create(data, actor);\n\n return sendCreated(res, entity);\n }\n\n @DGet('/:id', [ForceLoggedInMiddleware])\n async getOne(\n @DPath('id') id: string,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.getOne(id, actor);\n\n return send(res, entity);\n }\n\n @DDelete('/:id', [ForceLoggedInMiddleware])\n async drop(\n @DPath('id') id: string,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.delete(id, actor);\n\n return sendAccepted(res, entity);\n }\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n DBody, \n DController, \n DDelete, \n DGet, \n DPath, \n DPost, \n DRequest, \n DResponse, \n DTags,\n} from '@routup/decorators';\nimport { send, sendAccepted, sendCreated } from 'routup';\nimport { useRequestQuery } from '@routup/basic/query';\nimport type { IClientScopeService } from '../../../../../core/index.ts';\nimport { ForceLoggedInMiddleware } from '../../../middleware/index.ts';\nimport { buildActorContext } from '../../../request/index.ts';\n\nexport type ClientScopeControllerContext = {\n service: IClientScopeService,\n};\n\n@DTags('client', 'scope')\n@DController('/client-scopes')\nexport class ClientScopeController {\n protected service: IClientScopeService;\n\n constructor(ctx: ClientScopeControllerContext) {\n this.service = ctx.service;\n }\n\n @DGet('', [])\n async getMany(\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const {\n data, \n meta, \n } = await this.service.getMany(useRequestQuery(req), actor);\n\n return send(res, {\n data,\n meta, \n });\n }\n\n @DPost('', [ForceLoggedInMiddleware])\n async add(\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n\n const entity = await this.service.create(data, actor);\n\n return sendCreated(res, entity);\n }\n\n @DGet('/:id', [])\n async getOne(\n @DPath('id') id: string,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.getOne(id, actor);\n\n return send(res, entity);\n }\n\n @DDelete('/:id', [ForceLoggedInMiddleware])\n async drop(\n @DPath('id') id: string,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.delete(id, actor);\n\n return sendAccepted(res, entity);\n }\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { createValidationChain, createValidator } from '@validup/adapter-validator';\nimport { Container } from 'validup';\nimport type { ClientScopeEntity } from '../../../../../database/domains/index.ts';\nimport { RequestHandlerOperation } from '../../../../request/index.ts';\n\nexport class ClientScopeRequestValidator extends Container<ClientScopeEntity> {\n protected initialize() {\n super.initialize();\n\n this.mount(\n 'client_id',\n { group: RequestHandlerOperation.CREATE },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .exists()\n .isUUID();\n }),\n );\n\n this.mount(\n 'scope_id',\n { group: RequestHandlerOperation.CREATE },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .exists()\n .isUUID();\n }),\n );\n }\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { BuiltInPolicyType, PolicyData } from '@authup/access';\nimport { base64URLDecode, isUUID } from '@authup/kit';\nimport {\n DBody, \n DController, \n DDelete, \n DGet, \n DPath, \n DPost, \n DPut, \n DRequest, \n DResponse, \n DTags,\n} from '@routup/decorators';\nimport type { Request, Response } from 'routup';\nimport {\n getRequestHeader, \n getRequestIP, \n send, \n sendAccepted, \n sendCreated, \n sendRedirect, \n useRequestParam,\n} from 'routup';\nimport type { IdentityProvider, OAuth2AuthorizationCodeRequest } from '@authup/core-kit';\nimport {\n \n IdentityProviderAttributesValidator, \n IdentityProviderValidator, \n IdentityType, \n PermissionName, \n ValidatorGroup, \n isOAuth2IdentityProvider, \n isOpenIDIdentityProvider, \n} from '@authup/core-kit';\nimport { BadRequestError, NotFoundError } from '@ebec/http';\nimport type { AuthorizeParameters } from '@hapic/oauth2';\nimport { useRequestQuery } from '@routup/basic/query';\nimport { OAuth2Error } from '@authup/specs';\nimport { URL } from 'node:url';\nimport { RoutupContainerAdapter } from '@validup/adapter-routup';\nimport type {\n IIdentityProviderAccountManager,\n IIdentityProviderRepository,\n IOAuth2AuthorizationCodeIssuer,\n IOAuth2AuthorizationCodeRequestVerifier,\n IOAuth2AuthorizationStateManager,\n IRealmRepository,\n OAuth2AuthorizationState,\n} from '../../../../../core/index.ts';\nimport {\n OAuth2AuthorizationCodeRequestValidator,\n createIdentityProviderOAuth2Authenticator,\n} from '../../../../../core/index.ts';\nimport {\n getRequestBodyRealmID,\n getRequestParamID,\n useRequestIdentityOrFail,\n useRequestParamID,\n useRequestPermissionEvaluator,\n} from '../../../request/index.ts';\nimport { ForceLoggedInMiddleware } from '../../../middleware/index.ts';\nimport type { IdentityProviderControllerContext, IdentityProviderControllerOptions } from './types.ts';\n\n@DTags('identity')\n@DController('/identity-providers')\nexport class IdentityProviderController {\n protected options: IdentityProviderControllerOptions;\n\n protected repository: IIdentityProviderRepository;\n\n protected realmRepository: IRealmRepository;\n\n protected accountManager: IIdentityProviderAccountManager;\n\n protected codeRequestVerifier : IOAuth2AuthorizationCodeRequestVerifier;\n\n protected codeRequestValidator : OAuth2AuthorizationCodeRequestValidator;\n\n protected stateManager : IOAuth2AuthorizationStateManager;\n\n protected codeIssuer : IOAuth2AuthorizationCodeIssuer;\n\n // ---------------------------------------------------------\n\n constructor(ctx: IdentityProviderControllerContext) {\n this.options = ctx.options;\n this.repository = ctx.repository;\n this.realmRepository = ctx.realmRepository;\n this.accountManager = ctx.accountManager;\n this.codeIssuer = ctx.codeIssuer;\n this.codeRequestVerifier = ctx.codeRequestVerifier;\n this.codeRequestValidator = new OAuth2AuthorizationCodeRequestValidator();\n this.stateManager = ctx.stateManager;\n }\n\n // ---------------------------------------------------------\n\n @DGet('', [])\n async getProviders(\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const {\n data, \n meta, \n } = await this.repository.findMany(useRequestQuery(req));\n\n try {\n const permissionEvaluator = useRequestPermissionEvaluator(req);\n await permissionEvaluator.preEvaluate({ name: PermissionName.IDENTITY_PROVIDER_READ });\n\n for (const datum of data) {\n try {\n await permissionEvaluator.evaluate({\n name: PermissionName.IDENTITY_PROVIDER_READ,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: datum }),\n });\n } catch {\n // do nothing\n }\n }\n } catch {\n // do nothing\n }\n\n return send(res, {\n data,\n meta,\n });\n }\n\n @DGet('/:id', [])\n async getProvider(\n @DPath('id') id: string,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const paramId = useRequestParamID(req, { isUUID: false });\n\n const entity = await this.repository.findOneByIdOrName(\n paramId,\n useRequestParam(req, 'realmId'),\n );\n\n if (!entity) {\n throw new NotFoundError();\n }\n\n try {\n const permissionEvaluator = useRequestPermissionEvaluator(req);\n await permissionEvaluator.evaluate({\n name: PermissionName.IDENTITY_PROVIDER_READ,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity }),\n });\n } catch {\n // do nothing\n }\n\n return send(res, entity);\n }\n\n @DPost('/:id', [ForceLoggedInMiddleware])\n async editProvider(\n @DPath('id') id: string,\n @DBody() user: NonNullable<IdentityProvider>,\n @DRequest() req: any,\n @DResponse() res: any,\n ) : Promise<any> {\n return this.write(req, res, { updateOnly: true });\n }\n\n @DPut('/:id', [ForceLoggedInMiddleware])\n async put(\n @DPath('id') id: string,\n @DBody() user: NonNullable<IdentityProvider>,\n @DRequest() req: any,\n @DResponse() res: any,\n ) : Promise<any> {\n return this.write(req, res);\n }\n\n @DDelete('/:id', [ForceLoggedInMiddleware])\n async dropProvider(\n @DPath('id') id: string,\n @DRequest() req: any,\n @DResponse() res: any,\n ) : Promise<any> {\n const paramId = useRequestParamID(req);\n\n const permissionEvaluator = useRequestPermissionEvaluator(req);\n await permissionEvaluator.preEvaluate({ name: PermissionName.IDENTITY_PROVIDER_DELETE });\n\n const entity = await this.repository.findOneBy({ id: paramId });\n\n if (!entity) {\n throw new NotFoundError();\n }\n\n await permissionEvaluator.evaluate({\n name: PermissionName.IDENTITY_PROVIDER_DELETE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity }),\n });\n\n const { id: entityId } = entity;\n\n await this.repository.remove(entity);\n\n entity.id = entityId;\n\n return sendAccepted(res, entity);\n }\n\n @DPost('', [ForceLoggedInMiddleware])\n async addProvider(\n @DBody() user: NonNullable<IdentityProvider>,\n @DRequest() req: any,\n @DResponse() res: any,\n ) : Promise<any> {\n return this.write(req, res);\n }\n\n // ---------------------------------------------------------\n\n @DGet('/:id/authorize-out', [])\n async authorizeOut(\n @DPath('id') _id: string,\n @DRequest() req: any,\n @DResponse() res: any,\n ) {\n const id = useRequestParamID(req);\n const entity = await this.resolve(id);\n\n if (!isOAuth2IdentityProvider(entity) && !isOpenIDIdentityProvider(entity)) {\n throw new BadRequestError('Only an identity-provider based on the oauth protocol supports authorize redirect.');\n }\n\n const authenticator = createIdentityProviderOAuth2Authenticator({\n accountManager: this.accountManager,\n provider: entity,\n options: { baseURL: this.options.baseURL },\n });\n\n const parameters : AuthorizeParameters = {};\n\n let codeRequest: OAuth2AuthorizationCodeRequest | undefined;\n const query = useRequestQuery(req);\n if (typeof query.codeRequest === 'string') {\n let codeRequestDecoded: OAuth2AuthorizationCodeRequest;\n\n try {\n codeRequestDecoded = JSON.parse(base64URLDecode(query.codeRequest));\n } catch {\n throw OAuth2Error.requestInvalid('The code request is malformed and can not be parsed.');\n }\n\n const codeRequestValidated = await this.codeRequestValidator.run(codeRequestDecoded);\n const data = await this.codeRequestVerifier.verify(codeRequestValidated);\n\n if (\n data.client.realm_id &&\n entity.realm_id &&\n entity.realm_id !== data.client.realm_id\n ) {\n throw OAuth2Error.requestInvalid('The provider and client realm do not match.');\n }\n\n codeRequest = data.data;\n }\n\n parameters.state = await this.saveAuthorizationState(req, codeRequest);\n\n return sendRedirect(res, authenticator.buildRedirectURL(parameters));\n }\n\n @DGet('/:id/authorize-in', [])\n async authorizeIn(\n @DPath('id') _id: string,\n @DRequest() req: Request,\n @DResponse() res: Response,\n ) {\n const id = useRequestParamID(req);\n\n const entity = await this.resolve(id);\n\n if (!isOAuth2IdentityProvider(entity) && !isOpenIDIdentityProvider(entity)) {\n throw new Error(`The provider protocol ${entity.protocol} is not valid.`);\n }\n\n const data = await this.verifyAuthorizationState(req);\n if (\n entity.realm_id &&\n data.codeRequest &&\n data.codeRequest.realm_id &&\n data.codeRequest.realm_id !== entity.realm_id\n ) {\n throw OAuth2Error.requestInvalid('The provider and client realm do not match.');\n }\n\n const { code } = useRequestQuery(req);\n\n const authenticator = createIdentityProviderOAuth2Authenticator({\n accountManager: this.accountManager,\n provider: entity,\n options: {\n baseURL: this.options.baseURL,\n clientId: data.codeRequest?.client_id,\n },\n });\n\n const user = await authenticator.authenticate(code);\n\n const realm = await this.realmRepository.resolve(entity.realm_id, true);\n\n const authorizationCode = await this.codeIssuer.issue(\n {\n response_type: 'code',\n client_id: data.codeRequest?.client_id,\n redirect_uri: data.codeRequest?.redirect_uri,\n scope: data.codeRequest?.scope,\n },\n {\n type: IdentityType.USER,\n data: {\n ...user,\n realm,\n },\n },\n );\n\n if (data.codeRequest) {\n const codeRequestKeys = Object.keys(data.codeRequest);\n\n const url = new URL('/authorize', this.options.baseURL);\n for (const codeRequestKey_ of codeRequestKeys) {\n const codeRequestKey = codeRequestKey_ as keyof OAuth2AuthorizationCodeRequest;\n if (data.codeRequest[codeRequestKey]) {\n url.searchParams.set(codeRequestKey, data.codeRequest[codeRequestKey]);\n }\n }\n\n url.searchParams.set('code', authorizationCode.id);\n\n return sendRedirect(res, url.href);\n }\n\n const url = new URL(this.options.baseURL);\n url.searchParams.set('code', authorizationCode.id);\n\n return sendRedirect(res, url.href);\n }\n\n // ---------------------------------------------------------\n\n private async write(req: Request, res: Response, options: {\n updateOnly?: boolean\n } = {}): Promise<any> {\n let group: string;\n const id = getRequestParamID(req, { isUUID: false });\n const realmId = getRequestBodyRealmID(req);\n\n let entity: IdentityProvider | null | undefined;\n if (id) {\n const where: Record<string, any> = {};\n if (isUUID(id)) {\n where.id = id;\n } else {\n where.name = id;\n }\n\n if (realmId) {\n where.realm_id = realmId;\n }\n\n entity = await this.repository.findOneBy(where);\n if (!entity && options.updateOnly) {\n throw new NotFoundError();\n }\n } else if (options.updateOnly) {\n throw new NotFoundError();\n }\n\n const permissionEvaluator = useRequestPermissionEvaluator(req);\n if (entity) {\n await permissionEvaluator.preEvaluate({ name: PermissionName.IDENTITY_PROVIDER_UPDATE });\n\n group = ValidatorGroup.UPDATE;\n } else {\n await permissionEvaluator.preEvaluate({ name: PermissionName.IDENTITY_PROVIDER_CREATE });\n\n group = ValidatorGroup.CREATE;\n }\n\n const validator = new RoutupContainerAdapter(new IdentityProviderValidator());\n const data = await validator.run(req, { group });\n\n const attributesValidator = new RoutupContainerAdapter(new IdentityProviderAttributesValidator());\n const attributes = await attributesValidator.run(req);\n\n await this.repository.validateJoinColumns(data);\n\n if (entity) {\n await permissionEvaluator.evaluate({\n name: PermissionName.IDENTITY_PROVIDER_UPDATE,\n input: new PolicyData({\n [BuiltInPolicyType.ATTRIBUTES]: {\n ...entity,\n ...data,\n },\n }),\n });\n } else {\n if (!data.realm_id) {\n const identity = useRequestIdentityOrFail(req);\n data.realm_id = identity.realmId;\n }\n\n await permissionEvaluator.evaluate({\n name: PermissionName.IDENTITY_PROVIDER_CREATE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: data }),\n });\n }\n\n await this.repository.checkUniqueness(data, entity || undefined);\n\n if (entity) {\n entity = this.repository.merge(entity, data);\n await this.repository.saveWithEA(entity, attributes);\n\n return sendAccepted(res, entity);\n }\n\n entity = this.repository.create(data);\n await this.repository.saveWithEA(entity, attributes);\n\n return sendCreated(res, entity);\n }\n\n // ---------------------------------------------------------\n\n private async resolve(id: string) {\n const entity = await this.repository.findOneById(id);\n\n if (!entity) {\n throw new NotFoundError();\n }\n\n return entity;\n }\n\n // ---------------------------------------------------------\n\n private async saveAuthorizationState(\n req: Request,\n codeRequest?: OAuth2AuthorizationCodeRequest,\n ) : Promise<string> {\n return this.stateManager.save({\n codeRequest,\n ip: getRequestIP(req, { trustProxy: true }),\n userAgent: getRequestHeader(req, 'user-agent'),\n });\n }\n\n private async verifyAuthorizationState(req: Request): Promise<OAuth2AuthorizationState> {\n const query = useRequestQuery(req);\n if (typeof query.state !== 'string') {\n throw OAuth2Error.stateInvalid();\n }\n\n return this.stateManager.verify(query.state, {\n ip: getRequestIP(req, { trustProxy: true }),\n userAgent: getRequestHeader(req, 'user-agent'),\n });\n }\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { createValidationChain, createValidator } from '@validup/adapter-validator';\nimport { Container } from 'validup';\nimport type { IdentityProviderRoleMappingEntity } from '../../../../../database/domains/index.ts';\nimport { RequestHandlerOperation } from '../../../../request/index.ts';\n\nexport class IdentityProviderRoleMappingRequestValidator extends Container<\n IdentityProviderRoleMappingEntity\n> {\n protected initialize() {\n super.initialize();\n\n this.mount(\n 'provider_id',\n { group: RequestHandlerOperation.CREATE },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .exists()\n .isUUID();\n }),\n );\n\n this.mount(\n 'role_id',\n { group: RequestHandlerOperation.CREATE },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .exists()\n .isUUID();\n }),\n );\n\n this.mount(\n 'name',\n { optional: true },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .isString()\n .optional({ values: 'null' });\n }),\n );\n\n this.mount(\n 'value',\n { optional: true },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .isString()\n .optional({ values: 'null' });\n }),\n );\n\n this.mount(\n 'value_is_regex',\n { optional: true },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .isBoolean();\n }),\n );\n }\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n DBody, \n DController, \n DDelete, \n DGet, \n DPath, \n DPost, \n DRequest, \n DResponse, \n DTags,\n} from '@routup/decorators';\nimport { BuiltInPolicyType, PolicyData } from '@authup/access';\nimport { BadRequestError, ForbiddenError, NotFoundError } from '@ebec/http';\nimport { PermissionName } from '@authup/core-kit';\nimport type { IdentityProviderRoleMapping } from '@authup/core-kit';\nimport type { Request, Response } from 'routup';\nimport { send, sendAccepted, sendCreated } from 'routup';\nimport { useRequestQuery } from '@routup/basic/query';\nimport { RoutupContainerAdapter } from '@validup/adapter-routup';\nimport type { IIdentityPermissionProvider, IIdentityProviderRoleMappingRepository } from '../../../../../core/index.ts';\nimport { ForceLoggedInMiddleware } from '../../../middleware/index.ts';\nimport { IdentityProviderRoleMappingRequestValidator } from './utils/index.ts';\nimport {\n RequestHandlerOperation,\n useRequestIdentityOrFail,\n useRequestParamID,\n useRequestPermissionEvaluator,\n} from '../../../request/index.ts';\n\nexport type OAuth2ProviderRoleControllerContext = {\n repository: IIdentityProviderRoleMappingRepository,\n identityPermissionProvider: IIdentityPermissionProvider,\n};\n\n@DTags('identity-provider')\n@DController('/identity-provider-role-mappings')\nexport class OAuth2ProviderRoleController {\n protected repository: IIdentityProviderRoleMappingRepository;\n\n protected identityPermissionProvider: IIdentityPermissionProvider;\n\n constructor(ctx: OAuth2ProviderRoleControllerContext) {\n this.repository = ctx.repository;\n this.identityPermissionProvider = ctx.identityPermissionProvider;\n }\n\n @DGet('', [])\n async getProviders(\n @DRequest() req: Request,\n @DResponse() res: Response,\n ): Promise<any> {\n const permissionEvaluator = useRequestPermissionEvaluator(req);\n await permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.IDENTITY_PROVIDER_READ,\n PermissionName.IDENTITY_PROVIDER_UPDATE,\n PermissionName.IDENTITY_PROVIDER_DELETE,\n ],\n });\n\n const {\n data, \n meta, \n } = await this.repository.findMany(useRequestQuery(req));\n\n return send(res, {\n data,\n meta,\n });\n }\n\n @DGet('/:id', [])\n async getProvider(\n @DPath('id') id: string,\n @DRequest() req: Request,\n @DResponse() res: Response,\n ): Promise<any> {\n const permissionEvaluator = useRequestPermissionEvaluator(req);\n await permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.IDENTITY_PROVIDER_READ,\n PermissionName.IDENTITY_PROVIDER_UPDATE,\n PermissionName.IDENTITY_PROVIDER_DELETE,\n ],\n });\n\n const paramId = useRequestParamID(req);\n\n const entity = await this.repository.findOneBy({ id: paramId });\n\n if (!entity) {\n throw new NotFoundError();\n }\n\n return send(res, entity);\n }\n\n @DPost('/:id', [ForceLoggedInMiddleware])\n async editProvider(\n @DPath('id') id: string,\n @DBody() user: NonNullable<IdentityProviderRoleMapping>,\n @DRequest() req: Request,\n @DResponse() res: Response,\n ): Promise<any> {\n const paramId = useRequestParamID(req);\n\n const permissionEvaluator = useRequestPermissionEvaluator(req);\n await permissionEvaluator.preEvaluate({ name: PermissionName.IDENTITY_PROVIDER_ROLE_UPDATE });\n\n const validator = new IdentityProviderRoleMappingRequestValidator();\n const validatorAdapter = new RoutupContainerAdapter(validator);\n const data = await validatorAdapter.run(req, { group: RequestHandlerOperation.UPDATE });\n\n await this.repository.validateJoinColumns(data);\n\n let entity = await this.repository.findOneBy({ id: paramId });\n if (!entity) {\n throw new NotFoundError();\n }\n\n entity = this.repository.merge(entity, data);\n\n await permissionEvaluator.evaluate({\n name: PermissionName.IDENTITY_PROVIDER_ROLE_UPDATE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity }),\n });\n\n await this.repository.save(entity);\n\n return sendAccepted(res, entity);\n }\n\n @DDelete('/:id', [ForceLoggedInMiddleware])\n async dropProvider(\n @DPath('id') id: string,\n @DRequest() req: Request,\n @DResponse() res: Response,\n ): Promise<any> {\n const paramId = useRequestParamID(req);\n\n const permissionEvaluator = useRequestPermissionEvaluator(req);\n await permissionEvaluator.preEvaluate({ name: PermissionName.IDENTITY_PROVIDER_ROLE_DELETE });\n\n const entity = await this.repository.findOneBy({ id: paramId });\n if (!entity) {\n throw new NotFoundError();\n }\n\n await permissionEvaluator.evaluate({\n name: PermissionName.IDENTITY_PROVIDER_ROLE_DELETE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity }),\n });\n\n const { id: entityId } = entity;\n\n await this.repository.remove(entity);\n\n entity.id = entityId;\n\n return sendAccepted(res);\n }\n\n @DPost('', [ForceLoggedInMiddleware])\n async addProvider(\n @DBody() user: NonNullable<IdentityProviderRoleMapping>,\n @DRequest() req: Request,\n @DResponse() res: Response,\n ): Promise<any> {\n const permissionEvaluator = useRequestPermissionEvaluator(req);\n await permissionEvaluator.preEvaluate({ name: PermissionName.IDENTITY_PROVIDER_ROLE_CREATE });\n\n const validator = new IdentityProviderRoleMappingRequestValidator();\n const validatorAdapter = new RoutupContainerAdapter(validator);\n\n const data = await validatorAdapter.run(req, { group: RequestHandlerOperation.CREATE });\n\n await this.repository.validateJoinColumns(data);\n\n if (data.provider) {\n data.provider_realm_id = data.provider.realm_id;\n }\n\n if (data.role) {\n data.role_realm_id = data.role.realm_id;\n }\n\n if (\n data.role_realm_id &&\n data.provider_realm_id &&\n data.role_realm_id !== data.provider_realm_id\n ) {\n throw new BadRequestError('It is not possible to map an identity provider to a role of another realm.');\n }\n\n await permissionEvaluator.evaluate({\n name: PermissionName.IDENTITY_PROVIDER_ROLE_CREATE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: data }),\n });\n\n const identity = useRequestIdentityOrFail(req);\n const hasPermissions = await this.identityPermissionProvider.isSuperset(identity, {\n type: 'role',\n id: data.role_id,\n clientId: data.role.client_id,\n });\n if (!hasPermissions) {\n throw new ForbiddenError('You don\\'t own the required permissions.');\n }\n\n const entity = this.repository.create(data);\n\n await this.repository.save(entity);\n\n return sendCreated(res, entity);\n }\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { PermissionAPICheckResponse } from '@authup/core-http-kit';\nimport type { IPermissionProvider, PermissionEvaluationContext } from '@authup/access';\nimport {\n BuiltInPolicyType,\n PermissionEvaluator, \n PolicyData,\n} from '@authup/access';\nimport {\n DBody, \n DController, \n DDelete, \n DGet, \n DPath, \n DPost, \n DPut, \n DRequest, \n DResponse, \n DTags,\n} from '@routup/decorators';\nimport { isUUID } from '@authup/kit';\nimport { NotFoundError } from '@ebec/http';\nimport {\n send, \n sendAccepted, \n sendCreated, \n useRequestParam,\n} from 'routup';\nimport { useRequestQuery } from '@routup/basic/query';\nimport type {\n \n IIdentityPermissionProvider, \n IPermissionRepository, \n IPermissionService, \n IRealmRepository, \n} from '../../../../../core/index.ts';\nimport { PolicyEngine } from '../../../../../core/index.ts';\nimport { ForceLoggedInMiddleware } from '../../../middleware/index.ts';\nimport {\n buildActorContext,\n useRequestIdentity,\n} from '../../../request/index.ts';\n\nexport type PermissionControllerContext = {\n service: IPermissionService,\n repository: IPermissionRepository,\n realmRepository: IRealmRepository,\n identityPermissionProvider: IIdentityPermissionProvider,\n permissionProvider: IPermissionProvider,\n};\n\n@DTags('permission')\n@DController('/permissions')\nexport class PermissionController {\n protected service: IPermissionService;\n\n protected repository: IPermissionRepository;\n\n protected realmRepository: IRealmRepository;\n\n protected identityPermissionProvider: IIdentityPermissionProvider;\n\n protected permissionProvider: IPermissionProvider;\n\n constructor(ctx: PermissionControllerContext) {\n this.service = ctx.service;\n this.repository = ctx.repository;\n this.realmRepository = ctx.realmRepository;\n this.identityPermissionProvider = ctx.identityPermissionProvider;\n this.permissionProvider = ctx.permissionProvider;\n }\n\n @DGet('', [ForceLoggedInMiddleware])\n async getMany(\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const {\n data, \n meta, \n } = await this.service.getMany(useRequestQuery(req), actor);\n\n return send(res, {\n data,\n meta, \n });\n }\n\n @DPost('', [ForceLoggedInMiddleware])\n async add(\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.create(data, actor);\n\n return sendCreated(res, entity);\n }\n\n @DPost('/:id/check', [ForceLoggedInMiddleware])\n async check(\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const id = useRequestParam(req, 'id');\n\n let criteria: Record<string, any>;\n if (isUUID(id)) {\n criteria = { id };\n } else {\n const realm = await this.realmRepository.resolve(useRequestParam(req, 'realmId'));\n criteria = {\n name: id,\n ...(realm ? { realm_id: realm.id } : {}),\n };\n }\n\n const entity = await this.repository.findOneBy(criteria);\n if (!entity) {\n throw new NotFoundError();\n }\n\n if (typeof data[BuiltInPolicyType.IDENTITY] === 'undefined') {\n data[BuiltInPolicyType.IDENTITY] = useRequestIdentity(req);\n }\n\n const ctx: PermissionEvaluationContext = {\n name: entity.name,\n input: new PolicyData(data),\n };\n\n const permissionEvaluator = new PermissionEvaluator({\n provider: this.permissionProvider,\n policyEngine: new PolicyEngine(this.identityPermissionProvider),\n });\n\n let output: PermissionAPICheckResponse;\n try {\n if (\n ctx.input &&\n ctx.input.has(BuiltInPolicyType.ATTRIBUTES)\n ) {\n await permissionEvaluator.evaluate(ctx);\n } else {\n await permissionEvaluator.preEvaluate(ctx);\n }\n\n output = { status: 'success' };\n } catch (e) {\n output = {\n status: 'error',\n data: e as Error,\n };\n }\n\n return sendAccepted(res, output);\n }\n\n @DGet('/:id', [ForceLoggedInMiddleware])\n async get(\n @DPath('id') id: string,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.getOne(\n id,\n actor,\n useRequestParam(req, 'realmId'),\n );\n\n return send(res, entity);\n }\n\n @DPost('/:id', [ForceLoggedInMiddleware])\n async edit(\n @DPath('id') id: string,\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.update(\n id,\n data,\n actor,\n );\n\n return sendAccepted(res, entity);\n }\n\n @DPut('/:id', [ForceLoggedInMiddleware])\n async put(\n @DPath('id') id: string,\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const {\n entity, \n created, \n } = await this.service.save(\n id || undefined,\n data,\n actor,\n );\n\n if (created) {\n return sendCreated(res, entity);\n }\n\n return sendAccepted(res, entity);\n }\n\n @DDelete('/:id', [ForceLoggedInMiddleware])\n async drop(\n @DPath('id') id: string,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.delete(id, actor);\n\n return sendAccepted(res, entity);\n }\n}\n","/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n DBody, \n DController, \n DDelete, \n DGet, \n DPath, \n DPost, \n DRequest, \n DResponse, \n DTags,\n} from '@routup/decorators';\nimport { send, sendAccepted, sendCreated } from 'routup';\nimport { useRequestQuery } from '@routup/basic/query';\nimport type { IPermissionPolicyService } from '../../../../../core/index.ts';\nimport { ForceLoggedInMiddleware } from '../../../middleware/index.ts';\nimport { buildActorContext } from '../../../request/index.ts';\n\nexport type PermissionPolicyControllerContext = {\n service: IPermissionPolicyService,\n};\n\n@DTags('permission')\n@DController('/permission-policies')\nexport class PermissionPolicyController {\n protected service: IPermissionPolicyService;\n\n constructor(ctx: PermissionPolicyControllerContext) {\n this.service = ctx.service;\n }\n\n @DGet('', [ForceLoggedInMiddleware])\n async getMany(\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const {\n data, \n meta, \n } = await this.service.getMany(useRequestQuery(req), actor);\n\n return send(res, {\n data,\n meta, \n });\n }\n\n @DPost('', [ForceLoggedInMiddleware])\n async add(\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n\n const entity = await this.service.create(data, actor);\n\n return sendCreated(res, entity);\n }\n\n @DGet('/:id', [ForceLoggedInMiddleware])\n async getOne(\n @DPath('id') id: string,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.getOne(id, actor);\n\n return send(res, entity);\n }\n\n @DDelete('/:id', [ForceLoggedInMiddleware])\n async drop(\n @DPath('id') id: string,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.delete(id, actor);\n\n return sendAccepted(res, entity);\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { createValidationChain, createValidator } from '@validup/adapter-validator';\nimport { Container } from 'validup';\n\nexport class ActivateRequestValidator extends Container<{ token: string }> {\n protected initialize() {\n super.initialize();\n\n this.mount(\n 'token',\n createValidator(() => {\n const chain = createValidationChain();\n return chain.exists()\n .notEmpty()\n .isLength({\n min: 3,\n max: 256, \n });\n }),\n );\n }\n}\n","/*\n * Copyright (c) 2022-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n DBody, \n DController, \n DPost, \n DRequest, \n DResponse,\n} from '@routup/decorators';\nimport type { Request, Response } from 'routup';\nimport { sendAccepted } from 'routup';\nimport type { IRegistrationService } from '../../../../../core/index.ts';\nimport { ActivateRequestValidator } from './validator.ts';\n\nexport type ActivateControllerContext = {\n service: IRegistrationService,\n};\n\n@DController('/activate')\nexport class ActivateController {\n protected service: IRegistrationService;\n\n constructor(ctx: ActivateControllerContext) {\n this.service = ctx.service;\n }\n\n @DPost('', [])\n async execute(\n @DBody() data: any,\n @DRequest() req: Request,\n @DResponse() res: Response,\n ): Promise<any> {\n const validator = new ActivateRequestValidator();\n const validated = await validator.run(data);\n\n await this.service.activate(validated);\n\n return sendAccepted(res);\n }\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n DController, \n DGet, \n DPost, \n DRequest, \n DResponse,\n} from '@routup/decorators';\nimport { load } from 'locter';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { URL } from 'node:url';\nimport { send, useRequestParam } from 'routup';\nimport { RoutupContainerAdapter } from '@validup/adapter-routup';\nimport type { Client, OAuth2AuthorizationCodeRequest, Scope } from '@authup/core-kit';\nimport { CodeTransformation, isCodeTransformation } from 'typeorm-extension';\nimport { CLIENT_WEB_SLIM_PACKAGE_PATH } from '../../../../../path.ts';\nimport { ForceUserLoggedInMiddleware } from '../../../middleware/index.ts';\nimport { HTTPOAuth2Authorizer } from '../../../adapters/index.ts';\nimport type { IOAuth2AuthorizationCodeRequestVerifier } from '../../../../../core/index.ts';\nimport { OAuth2AuthorizationCodeRequestValidator } from '../../../../../core/index.ts';\nimport { sanitizeError } from '../../../../../utils/index.ts';\nimport type { AuthorizeControllerContext, AuthorizeControllerOptions } from './types.ts';\n\n@DController('/authorize')\nexport class AuthorizeController {\n // todo: maybe /realms/<realm>/protocol/openid-connect/authorize\n // todo: maybe /realms/<realm>/[...]/authorize\n\n protected options: AuthorizeControllerOptions;\n\n protected codeRequestVerifier : IOAuth2AuthorizationCodeRequestVerifier;\n\n protected codeRequestValidator : RoutupContainerAdapter<OAuth2AuthorizationCodeRequest>;\n\n protected authorizer: HTTPOAuth2Authorizer;\n\n // ---------------------------------------------------------\n\n constructor(ctx: AuthorizeControllerContext) {\n this.options = ctx.options;\n\n this.codeRequestVerifier = ctx.codeRequestVerifier;\n\n const validator = new OAuth2AuthorizationCodeRequestValidator();\n this.codeRequestValidator = new RoutupContainerAdapter(validator);\n\n this.authorizer = new HTTPOAuth2Authorizer({\n codeRequestVerifier: this.codeRequestVerifier,\n accessTokenIssuer: ctx.accessTokenIssuer,\n openIdTokenIssuer: ctx.openIdTokenIssuer,\n codeIssuer: ctx.codeIssuer,\n identityResolver: ctx.identityResolver,\n });\n }\n\n // ---------------------------------------------------------\n\n @DPost('', [ForceUserLoggedInMiddleware])\n async confirm(\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<void> {\n const result = await this.authorizer.authorizeWithRequest(req);\n\n const url = new URL(result.redirectUri);\n if (result.state) {\n url.searchParams.set('state', result.state);\n }\n\n if (result.authorizationCode) {\n url.searchParams.set('code', result.authorizationCode);\n }\n\n if (result.accessToken) {\n url.searchParams.set('access_token', result.accessToken);\n }\n\n if (result.idToken) {\n url.searchParams.set('id_token', result.idToken);\n }\n\n return send(res, { url: url.href });\n }\n\n @DGet('', [])\n async serve(\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<void> {\n let codeRequest : OAuth2AuthorizationCodeRequest | undefined;\n\n let client : Client | undefined;\n let scopes : Scope[] | undefined;\n\n let error : Error | undefined;\n\n try {\n const data = await this.codeRequestValidator.run(req, { locations: ['body', 'query'] });\n\n const result = await this.codeRequestVerifier.verify(data);\n client = result.client;\n scopes = result.scopes;\n\n codeRequest = result.data;\n } catch (e) {\n const normalized = sanitizeError(e);\n error = {\n ...normalized,\n message: normalized.message,\n };\n }\n\n const isJIT = isCodeTransformation(CodeTransformation.JUST_IN_TIME);\n\n const payload = {\n config: { baseURL: this.options.baseURL },\n data: {\n codeRequest,\n error,\n client,\n scopes,\n },\n };\n\n let html : string;\n let manifest : Record<string, any>;\n let render : CallableFunction;\n\n const clientWebSlimPackagePath = CLIENT_WEB_SLIM_PACKAGE_PATH;\n\n if (isJIT) {\n /**\n * @type {import('vite').ViteDevServer}\n */\n const vite = useRequestParam(req, 'viteServer');\n\n html = await fs.promises.readFile(\n path.join(clientWebSlimPackagePath, 'index.html'),\n 'utf-8',\n );\n html = await vite.transformIndexHtml('/', html);\n manifest = {};\n render = (await vite.ssrLoadModule('/src/server.ts')).render;\n } else {\n html = await fs.promises.readFile(\n path.join(clientWebSlimPackagePath, 'dist', 'client', 'index.html'),\n 'utf-8',\n );\n\n manifest = JSON.parse(await fs.promises.readFile(\n path.join(clientWebSlimPackagePath, 'dist', 'client', '.vite', 'ssr-manifest.json'),\n 'utf-8',\n ));\n\n render = (await load(path.join(clientWebSlimPackagePath, 'dist', 'server', 'server.js'))).render;\n }\n\n const [appHtml, preloadLinks] = await render({\n url: '/authorize',\n manifest,\n payload,\n });\n\n return send(\n res,\n html\n .replace('<!--preload-links-->', preloadLinks)\n .replace('<!--app-html-->', appHtml),\n );\n }\n}\n","/*\n * Copyright (c) 2022-2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { AsymmetricKey } from '@authup/server-kit';\nimport { JWKType } from '@authup/specs';\nimport type { Request, Response } from 'routup';\nimport { send } from 'routup';\nimport type { Repository } from 'typeorm';\nimport { In } from 'typeorm';\nimport { BadRequestError, NotFoundError } from '@ebec/http';\nimport type { KeyEntity } from '../../../../../database/domains/index.ts';\nimport { getRequestStringParam, getRequestStringParamOrFail } from '../../../../request/index.ts';\n\nexport async function getJwksRouteHandler(\n req: Request,\n res: Response,\n repository: Repository<KeyEntity>,\n realmIdParamKey?: string,\n) : Promise<any> {\n const realmId = getRequestStringParam(req, realmIdParamKey || 'realmId');\n\n const entities = await repository.find({\n where: {\n type: In([JWKType.RSA, JWKType.EC]),\n ...(realmId ? { realm_id: realmId } : {}),\n },\n order: { priority: 'DESC' },\n });\n\n const promises = entities\n .filter((entity) => !!entity.encryption_key)\n .map(\n (entity) => AsymmetricKey\n .fromBase64({\n format: 'spki',\n key: entity.encryption_key!,\n options: AsymmetricKey.buildImportOptionsForJWTAlgorithm(entity.signature_algorithm),\n })\n .then((container) => container.toJWK())\n .then((key) => ({\n ...key,\n kid: entity.id,\n alg: entity.signature_algorithm,\n })),\n );\n\n const keys = await Promise.all(promises);\n\n return send(res, { keys });\n}\n\nexport async function getJwkRouteHandler(\n req: Request,\n res: Response,\n repository: Repository<KeyEntity>,\n idParamKey?: string,\n) : Promise<any> {\n const id = getRequestStringParamOrFail(req, idParamKey || 'id');\n\n const entity = await repository.findOne({\n where: {\n type: In([JWKType.RSA, JWKType.EC]),\n id,\n },\n });\n\n if (!entity) {\n throw new NotFoundError();\n }\n\n if (!entity.encryption_key) {\n throw new BadRequestError('The encryption key does not exist');\n }\n\n const container = await AsymmetricKey\n .fromBase64({\n format: 'spki',\n key: entity.encryption_key!,\n options: AsymmetricKey.buildImportOptionsForJWTAlgorithm(entity.signature_algorithm),\n });\n\n const jsonWebKey = await container.toJWK();\n jsonWebKey.alg = entity.signature_algorithm;\n\n return send(res, {\n ...jsonWebKey,\n kid: entity.id,\n });\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { JWKType } from '@authup/specs';\nimport { AsymmetricKey } from '@authup/server-kit';\nimport {\n DController, \n DGet, \n DPath, \n DRequest, \n DResponse,\n} from '@routup/decorators';\nimport type { Request, Response } from 'routup';\nimport { send } from 'routup';\nimport type { Repository } from 'typeorm';\nimport { In } from 'typeorm';\nimport { BadRequestError, NotFoundError } from '@ebec/http';\nimport type { KeyEntity } from '../../../../database/domains/index.ts';\nimport { getRequestStringParam } from '../../../request/index.ts';\n\nexport type JwkControllerContext = {\n repository: Repository<KeyEntity>\n};\n\n@DController('')\nexport class JwkController {\n protected repository: Repository<KeyEntity>;\n\n constructor(ctx: JwkControllerContext) {\n this.repository = ctx.repository;\n }\n\n @DGet('/jwks', [])\n async getManyJwks(\n @DRequest() req: Request,\n @DResponse() res: Response,\n ): Promise<any> {\n const realmId = getRequestStringParam(req, 'realmId');\n\n const entities = await this.repository.find({\n where: {\n type: In([JWKType.RSA, JWKType.EC]),\n ...(realmId ? { realm_id: realmId } : {}),\n },\n order: { priority: 'DESC' },\n });\n\n const promises = entities\n .filter((entity) => !!entity.encryption_key)\n .map(\n (entity) => AsymmetricKey\n .fromBase64({\n format: 'spki',\n key: entity.encryption_key!,\n options: AsymmetricKey.buildImportOptionsForJWTAlgorithm(entity.signature_algorithm),\n })\n .then((container) => container.toJWK())\n .then((key) => ({\n ...key,\n kid: entity.id,\n alg: entity.signature_algorithm,\n })),\n );\n\n const keys = await Promise.all(promises);\n\n return send(res, { keys });\n }\n\n @DGet('/jwks/:id', [])\n async getOneJwks(\n @DPath('id') id: string,\n @DRequest() req: Request,\n @DResponse() res: Response,\n ): Promise<any> {\n const entity = await this.repository.findOne({\n where: {\n type: In([JWKType.RSA, JWKType.EC]),\n id,\n },\n });\n\n if (!entity) {\n throw new NotFoundError();\n }\n\n if (!entity.encryption_key) {\n throw new BadRequestError('The encryption key does not exist');\n }\n\n const container = await AsymmetricKey\n .fromBase64({\n format: 'spki',\n key: entity.encryption_key!,\n options: AsymmetricKey.buildImportOptionsForJWTAlgorithm(entity.signature_algorithm),\n });\n\n const jsonWebKey = await container.toJWK();\n jsonWebKey.alg = entity.signature_algorithm;\n\n return send(res, {\n ...jsonWebKey,\n kid: entity.id,\n });\n }\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { OpenIDProviderMetadata } from '@authup/specs';\nimport { OAuth2AuthorizationResponseType } from '@authup/specs';\nimport { DController, DGet } from '@routup/decorators';\n\nexport type OpenIDControllerOptions = {\n baseURL: string\n};\n\n@DController('')\nexport class OpenIDController {\n protected options: OpenIDControllerOptions;\n\n constructor(options: OpenIDControllerOptions) {\n this.options = options;\n }\n\n @DGet('/.well-known/openid-configuration', [])\n async getOpenIdConfiguration(): Promise<OpenIDProviderMetadata> {\n return {\n issuer: this.options.baseURL,\n\n authorization_endpoint: new URL('authorize', this.options.baseURL).href,\n\n jwks_uri: new URL('jwks', this.options.baseURL).href,\n\n response_types_supported: [\n OAuth2AuthorizationResponseType.CODE,\n OAuth2AuthorizationResponseType.TOKEN,\n OAuth2AuthorizationResponseType.NONE,\n ],\n\n subject_types_supported: [\n 'public',\n ],\n\n id_token_signing_alg_values_supported: [\n 'HS256', \n 'HS384', \n 'HS512', \n 'RS256', \n 'RS384', \n 'RS512', \n 'none',\n ],\n\n token_endpoint: new URL('token', this.options.baseURL).href,\n\n introspection_endpoint: new URL('token/introspect', this.options.baseURL).href,\n\n revocation_endpoint: new URL('token', this.options.baseURL).href,\n\n // -----------------------------------------------------------\n\n service_documentation: 'https://authup.org/',\n\n userinfo_endpoint: new URL('users/@me', this.options.baseURL).href,\n };\n }\n}\n","/*\n * Copyright (c) 2022-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { PasswordForgotResponse } from '@authup/core-http-kit';\nimport {\n DBody, \n DController, \n DPost, \n DRequest, \n DResponse,\n} from '@routup/decorators';\nimport type { Request, Response } from 'routup';\nimport { sendAccepted } from 'routup';\nimport type { IPasswordRecoveryService } from '../../../../../core/index.ts';\n\nexport type PasswordForgotControllerContext = {\n service: IPasswordRecoveryService,\n};\n\n@DController('/password-forgot')\nexport class PasswordForgotController {\n protected service: IPasswordRecoveryService;\n\n constructor(ctx: PasswordForgotControllerContext) {\n this.service = ctx.service;\n }\n\n @DPost('', [])\n async execute(\n @DBody() data: any,\n @DRequest() req: Request,\n @DResponse() res: Response,\n ): Promise<PasswordForgotResponse> {\n const result = await this.service.forgotPassword(data);\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n return sendAccepted(res, result);\n }\n}\n","/*\n * Copyright (c) 2022-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { PasswordResetResponse } from '@authup/core-http-kit';\nimport {\n DBody, \n DController, \n DPost, \n DRequest, \n DResponse,\n} from '@routup/decorators';\nimport type { Request, Response } from 'routup';\nimport { sendAccepted } from 'routup';\nimport type { IPasswordRecoveryService } from '../../../../../core/index.ts';\n\nexport type PasswordResetControllerContext = {\n service: IPasswordRecoveryService,\n};\n\n@DController('/password-reset')\nexport class PasswordResetController {\n protected service: IPasswordRecoveryService;\n\n constructor(ctx: PasswordResetControllerContext) {\n this.service = ctx.service;\n }\n\n @DPost('', [])\n async execute(\n @DBody() data: any,\n @DRequest() req: Request,\n @DResponse() res: Response,\n ): Promise<PasswordResetResponse> {\n const result = await this.service.resetPassword(data);\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n return sendAccepted(res, result);\n }\n}\n","/*\n * Copyright (c) 2022-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { RegisterResponse } from '@authup/core-http-kit';\nimport {\n DBody, \n DController, \n DPost, \n DRequest, \n DResponse,\n} from '@routup/decorators';\nimport type { Request, Response } from 'routup';\nimport { sendAccepted } from 'routup';\nimport type { IRegistrationService } from '../../../../../core/index.ts';\n\nexport type RegisterControllerContext = {\n service: IRegistrationService,\n};\n\n@DController('/register')\nexport class RegisterController {\n protected service: IRegistrationService;\n\n constructor(ctx: RegisterControllerContext) {\n this.service = ctx.service;\n }\n\n @DPost('', [])\n async execute(\n @DBody() data: any,\n @DRequest() req: Request,\n @DResponse() res: Response,\n ): Promise<RegisterResponse> {\n const result = await this.service.register(data);\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n return sendAccepted(res, result);\n }\n}\n","/*\n * Copyright (c) 2022-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { DController, DGet } from '@routup/decorators';\nimport { load } from 'locter';\nimport path from 'node:path';\nimport { PACKAGE_PATH } from '../../../../../path.ts';\n\nexport type EndpointInfo = {\n version: string,\n date: string\n};\n\n@DController('')\nexport class StatusController {\n @DGet('/', [])\n async status(): Promise<EndpointInfo> {\n const pkgJson = await load(path.join(PACKAGE_PATH, 'package.json'));\n const isoDate = new Date().toISOString();\n\n return {\n version: pkgJson.version,\n date: isoDate,\n };\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { OAuth2Error, OAuth2ErrorCode } from '@authup/specs';\nimport { AuthupError } from '@authup/errors';\nimport { isObject } from '@authup/kit';\nimport { sanitizeError } from '../../../utils/index.ts';\n\n/**\n * Transforms an unknown error to an OAuth2Error.\n *\n * @param err\n */\nexport function toOAuth2Error(err: unknown) : AuthupError | OAuth2Error {\n if (err instanceof OAuth2Error) {\n return err;\n }\n\n let next : AuthupError;\n if (err instanceof AuthupError) {\n next = err;\n } else {\n next = sanitizeError(err);\n }\n\n next.data = {\n error: OAuth2ErrorCode.INVALID_REQUEST,\n error_description: next.message,\n ...(isObject(next.data) ? next.data : {}),\n };\n\n return next;\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { createValidationChain, createValidator } from '@validup/adapter-validator';\nimport { Container } from 'validup';\n\nexport class TokenRequestValidator extends Container<{ token: string }> {\n protected initialize() {\n super.initialize();\n\n this.mount(\n 'token',\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .exists()\n .notEmpty()\n .isString()\n .isLength({\n min: 16,\n max: 2048, \n });\n }),\n );\n }\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Request } from 'routup';\nimport { RoutupContainerAdapter } from '@validup/adapter-routup';\nimport { ValidupError, buildErrorMessageForAttribute, defineIssueItem } from 'validup';\nimport { useRequestToken } from '../../../../request/index.ts';\nimport { TokenRequestValidator } from './validator.ts';\n\nexport async function extractTokenFromRequest(req: Request) : Promise<string> {\n let token : string | undefined;\n\n try {\n const validator = new TokenRequestValidator();\n const validatorAdapter = new RoutupContainerAdapter(validator);\n const data = await validatorAdapter.run(req, { locations: ['body', 'query', 'params'] });\n\n token = data.token;\n } catch {\n token = useRequestToken(req);\n }\n\n if (!token) {\n throw new ValidupError([\n defineIssueItem({\n path: ['token'],\n message: buildErrorMessageForAttribute('token'),\n }),\n ]);\n }\n\n return token;\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { OAuth2TokenGrantResponse, OAuth2TokenIntrospectionResponse, OAuth2TokenPermission } from '@authup/specs';\nimport { OAuth2Error, OAuth2TokenGrant } from '@authup/specs';\nimport {\n DController,\n DGet,\n DPost,\n DRequest,\n DResponse,\n DTags,\n} from '@routup/decorators';\nimport type { Request, Response } from 'routup';\nimport { sendAccepted } from 'routup';\nimport { buildPermissionKey } from '@authup/access';\nimport { toOAuth2Error } from '../../../../../core/oauth2/helpers/index.ts';\nimport type { TokenControllerContext } from './types.ts';\nimport type {\n IIdentityPermissionProvider,\n IIdentityResolver,\n IOAuth2TokenIssuer,\n IOAuth2TokenRevoker,\n IOAuth2TokenVerifier,\n} from '../../../../../core/index.ts';\nimport { OAuth2OpenIDClaimsBuilder } from '../../../../../core/index.ts';\nimport type { IHTTPOAuth2Grant } from '../../../adapters/index.ts';\nimport {\n HTTPClientCredentialsGrant,\n HTTPOAuth2AuthorizeGrant,\n HTTPOAuth2RefreshTokenGrant,\n HTTPPasswordGrant,\n HTTPRobotCredentialsGrant,\n guessOauth2GrantTypeByRequest,\n} from '../../../adapters/index.ts';\nimport { extractTokenFromRequest } from './utils/index.ts';\n\n@DTags('auth')\n@DController('/token')\nexport class TokenController {\n protected refreshTokenIssuer: IOAuth2TokenIssuer;\n\n protected accessTokenIssuer: IOAuth2TokenIssuer;\n\n protected tokenVerifier: IOAuth2TokenVerifier;\n\n protected tokenRevoker: IOAuth2TokenRevoker;\n\n protected identityResolver : IIdentityResolver;\n\n protected identityPermissionProvider : IIdentityPermissionProvider;\n\n protected tokenGrants : Record<`${OAuth2TokenGrant}`, IHTTPOAuth2Grant>;\n\n // -------------------------------------------\n\n constructor(ctx: TokenControllerContext) {\n this.refreshTokenIssuer = ctx.refreshTokenIssuer;\n this.accessTokenIssuer = ctx.accessTokenIssuer;\n this.tokenVerifier = ctx.tokenVerifier;\n this.tokenRevoker = ctx.tokenRevoker;\n this.identityResolver = ctx.identityResolver;\n this.identityPermissionProvider = ctx.identityPermissionProvider;\n\n this.tokenGrants = {\n [OAuth2TokenGrant.AUTHORIZATION_CODE]: new HTTPOAuth2AuthorizeGrant({\n codeVerifier: ctx.codeVerifier,\n accessTokenIssuer: ctx.accessTokenIssuer,\n refreshTokenIssuer: ctx.refreshTokenIssuer,\n sessionManager: ctx.sessionManager,\n }),\n [OAuth2TokenGrant.CLIENT_CREDENTIALS]: new HTTPClientCredentialsGrant({\n accessTokenIssuer: ctx.accessTokenIssuer,\n authenticator: ctx.clientAuthenticator,\n sessionManager: ctx.sessionManager,\n }),\n [OAuth2TokenGrant.ROBOT_CREDENTIALS]: new HTTPRobotCredentialsGrant({\n accessTokenIssuer: ctx.accessTokenIssuer,\n authenticator: ctx.robotAuthenticator,\n sessionManager: ctx.sessionManager,\n }),\n [OAuth2TokenGrant.PASSWORD]: new HTTPPasswordGrant({\n accessTokenIssuer: ctx.accessTokenIssuer,\n refreshTokenIssuer: ctx.refreshTokenIssuer,\n authenticator: ctx.userAuthenticator,\n sessionManager: ctx.sessionManager,\n }),\n [OAuth2TokenGrant.REFRESH_TOKEN]: new HTTPOAuth2RefreshTokenGrant({\n accessTokenIssuer: ctx.accessTokenIssuer,\n refreshTokenIssuer: ctx.refreshTokenIssuer,\n tokenVerifier: ctx.tokenVerifier,\n tokenRevoker: ctx.tokenRevoker,\n sessionManager: ctx.sessionManager,\n }),\n };\n }\n\n // -------------------------------------------\n\n @DGet('/introspect', [])\n async getIntrospect(\n @DRequest() req: Request,\n ): Promise<OAuth2TokenIntrospectionResponse> {\n return this.postIntrospect(req);\n }\n\n @DPost('/introspect', [])\n async postIntrospect(\n @DRequest() req: Request,\n ): Promise<OAuth2TokenIntrospectionResponse> {\n try {\n const token = await extractTokenFromRequest(req);\n const payload = await this.tokenVerifier.verify(token, { skipActiveCheck: true });\n if (!payload.sub || !payload.sub_kind) {\n throw OAuth2Error.identityInvalid();\n }\n\n // todo: only receive client specific permissions\n const permissions = await this.identityPermissionProvider.getFor({\n id: payload.sub,\n type: payload.sub_kind,\n clientId: payload.client_id,\n realmId: payload.realm_id,\n });\n\n const identity = await this.identityResolver.resolve(payload.sub_kind, payload.sub);\n if (!identity) {\n // todo: differentiate between client, robot & user\n throw OAuth2Error.identityInvalid();\n }\n\n const claimsBuilder = new OAuth2OpenIDClaimsBuilder();\n const claims = claimsBuilder.fromIdentity(identity);\n\n let active : boolean;\n if (payload.jti) {\n const isInactive = await this.tokenVerifier.isInactive(payload.jti);\n active = !isInactive;\n } else {\n active = false;\n }\n\n return {\n active,\n // todo: permissions property should be removed.\n permissions: Object.values(\n permissions.reduce((acc, binding) => {\n const key = buildPermissionKey(binding.permission);\n if (!acc[key]) {\n acc[key] = {\n name: binding.permission.name,\n client_id: binding.permission.client_id,\n realm_id: binding.permission.realm_id,\n } as OAuth2TokenPermission;\n }\n return acc;\n }, {} as Record<string, OAuth2TokenPermission>),\n ),\n ...payload,\n ...claims,\n };\n } catch (e) {\n throw toOAuth2Error(e);\n }\n }\n\n // ----------------------------------------------------------\n\n @DPost('/revoke', [])\n async revokeToken(\n @DRequest() req: Request,\n @DResponse() res: Response,\n ) {\n try {\n const token = await extractTokenFromRequest(req);\n\n const payload = await this.tokenVerifier.verify(token);\n\n await this.tokenRevoker.revoke(payload);\n\n return await sendAccepted(res);\n } catch (e) {\n throw toOAuth2Error(e);\n }\n }\n\n // ----------------------------------------------------------\n\n @DPost('', [])\n async createToken(\n @DRequest() req: Request,\n ): Promise<OAuth2TokenGrantResponse> {\n const grantType = guessOauth2GrantTypeByRequest(req);\n if (!grantType) {\n throw OAuth2Error.grantInvalid();\n }\n\n const grant = this.tokenGrants[grantType];\n if (!grant) {\n throw OAuth2Error.grantInvalid();\n }\n\n return grant.runWithRequest(req);\n }\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n DBody, \n DController, \n DDelete, \n DGet, \n DPath, \n DPost, \n DPut, \n DRequest, \n DResponse, \n DTags,\n} from '@routup/decorators';\nimport type { OAuth2JsonWebKey, OpenIDProviderMetadata } from '@authup/specs';\nimport { OAuth2AuthorizationResponseType } from '@authup/specs';\nimport { send, sendAccepted, sendCreated } from 'routup';\nimport { useRequestQuery } from '@routup/basic/query';\nimport type { Repository } from 'typeorm';\nimport type { IRealmService } from '../../../../../core/index.ts';\nimport type { KeyEntity } from '../../../../database/domains/index.ts';\nimport { getJwkRouteHandler, getJwksRouteHandler } from '../../workflows/index.ts';\nimport { ForceLoggedInMiddleware } from '../../../middleware/index.ts';\nimport { buildActorContext } from '../../../request/index.ts';\n\nexport type RealmControllerOptions = {\n baseURL: string\n};\n\nexport type RealmControllerContext = {\n options: RealmControllerOptions,\n service: IRealmService,\n keyRepository: Repository<KeyEntity>,\n};\n\n@DTags('realm')\n@DController('/realms')\nexport class RealmController {\n protected options: RealmControllerOptions;\n\n protected service: IRealmService;\n\n protected keyRepository: Repository<KeyEntity>;\n\n constructor(ctx: RealmControllerContext) {\n this.options = ctx.options;\n this.service = ctx.service;\n this.keyRepository = ctx.keyRepository;\n }\n\n @DGet('', [])\n async getMany(\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const {\n data, \n meta, \n } = await this.service.getMany(useRequestQuery(req));\n\n return send(res, {\n data,\n meta, \n });\n }\n\n @DPost('', [ForceLoggedInMiddleware])\n async add(\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ) : Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.create(data, actor);\n\n return sendCreated(res, entity);\n }\n\n @DGet('/:id', [])\n async get(\n @DPath('id') id: string,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const entity = await this.service.getOne(\n id,\n );\n\n return send(res, entity);\n }\n\n @DGet('/:id/.well-known/openid-configuration', [])\n async getOpenIdConfiguration(\n @DPath('id') id: string,\n ): Promise<OpenIDProviderMetadata> {\n const entity = await this.service.getOne(id);\n\n return {\n issuer: this.options.baseURL,\n\n authorization_endpoint: new URL('authorize', this.options.baseURL).href,\n\n jwks_uri: new URL(`realms/${entity.id}/jwks`, this.options.baseURL).href,\n\n response_types_supported: [\n OAuth2AuthorizationResponseType.CODE,\n OAuth2AuthorizationResponseType.TOKEN,\n OAuth2AuthorizationResponseType.NONE,\n ],\n\n subject_types_supported: [\n 'public',\n ],\n\n id_token_signing_alg_values_supported: [\n 'HS256', \n 'HS384', \n 'HS512', \n 'RS256', \n 'RS384', \n 'RS512', \n 'none',\n ],\n\n token_endpoint: new URL('token', this.options.baseURL).href,\n\n introspection_endpoint: new URL('token/introspect', this.options.baseURL).href,\n\n revocation_endpoint: new URL('token', this.options.baseURL).href,\n\n // -----------------------------------------------------------\n\n service_documentation: 'https://authup.org/',\n\n userinfo_endpoint: new URL('users/@me', this.options.baseURL).href,\n };\n }\n\n @DGet('/:id/jwks', [])\n async getCerts(\n @DPath('id') id: string,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<OAuth2JsonWebKey[]> {\n return getJwksRouteHandler(req, res, this.keyRepository, 'id');\n }\n\n @DGet('/:id/jwks/:keyId', [])\n async getCert(\n @DPath('id') id: string,\n @DPath('keyId') keyId: string,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<OAuth2JsonWebKey> {\n return getJwkRouteHandler(req, res, this.keyRepository, 'keyId');\n }\n\n @DPost('/:id', [ForceLoggedInMiddleware])\n async edit(\n @DPath('id') id: string,\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ) : Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.update(\n id,\n data,\n actor,\n );\n\n return sendAccepted(res, entity);\n }\n\n @DPut('/:id', [ForceLoggedInMiddleware])\n async put(\n @DPath('id') id: string,\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ) : Promise<any> {\n const actor = buildActorContext(req);\n const {\n entity, \n created, \n } = await this.service.save(\n id || undefined,\n data,\n actor,\n );\n\n if (created) {\n return sendCreated(res, entity);\n }\n\n return sendAccepted(res, entity);\n }\n\n @DDelete('/:id', [ForceLoggedInMiddleware])\n async drop(\n @DPath('id') id: string,\n @DRequest() req: any,\n @DResponse() res: any,\n ) : Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.delete(id, actor);\n\n return sendAccepted(res, entity);\n }\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { OAuth2SubKind } from '@authup/specs';\nimport {\n DBody, \n DController, \n DDelete, \n DGet, \n DPath, \n DPost, \n DPut, \n DRequest, \n DResponse, \n DTags,\n} from '@routup/decorators';\nimport { isUUID } from '@authup/kit';\nimport { NotFoundError } from '@ebec/http';\nimport type { Robot } from '@authup/core-kit';\nimport {\n send, \n sendAccepted, \n sendCreated, \n useRequestParam,\n} from 'routup';\nimport { useRequestQuery } from '@routup/basic/query';\nimport type { DataSource } from 'typeorm';\nimport type { IRealmRepository, IRobotRepository, IRobotService } from '../../../../../core/index.ts';\nimport { OAuth2ScopeAttributesResolver } from '../../../../../core/index.ts';\nimport { RobotEntity } from '../../../../database/domains/index.ts';\nimport { ForceLoggedInMiddleware } from '../../../middleware/index.ts';\nimport { isSelfToken } from '../../../../../utils/index.ts';\nimport {\n buildActorContext,\n useRequestIdentity,\n useRequestScopes,\n} from '../../../request/index.ts';\n\nexport type RobotControllerContext = {\n service: IRobotService,\n repository: IRobotRepository,\n realmRepository: IRealmRepository,\n dataSource: DataSource,\n};\n\n@DTags('robot')\n@DController('/robots')\nexport class RobotController {\n protected service: IRobotService;\n\n protected repository: IRobotRepository;\n\n protected realmRepository: IRealmRepository;\n\n protected dataSource: DataSource;\n\n constructor(ctx: RobotControllerContext) {\n this.service = ctx.service;\n this.repository = ctx.repository;\n this.realmRepository = ctx.realmRepository;\n this.dataSource = ctx.dataSource;\n }\n\n @DGet('', [ForceLoggedInMiddleware])\n async getMany(\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const {\n data, \n meta, \n } = await this.service.getMany(useRequestQuery(req), actor);\n\n return send(res, {\n data,\n meta, \n });\n }\n\n @DPost('', [ForceLoggedInMiddleware])\n async add(\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const { entity } = await this.service.save(undefined, data, actor);\n\n return sendCreated(res, entity);\n }\n\n @DGet('/:id', [ForceLoggedInMiddleware])\n async getOne(\n @DPath('id') id: string,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const identity = useRequestIdentity(req);\n let isMe = false;\n\n if (\n isSelfToken(id) &&\n identity &&\n identity.type === 'robot'\n ) {\n isMe = true;\n } else if (isUUID(id)) {\n if (\n identity &&\n identity.type === 'robot' &&\n id === identity.id\n ) {\n isMe = true;\n }\n } else if (\n identity &&\n identity.type === 'robot'\n ) {\n const realm = await this.realmRepository.resolve(useRequestParam(req, 'realmId'), true);\n if (\n identity.realmId === realm.id &&\n identity.data &&\n identity.data.name === id\n ) {\n isMe = true;\n }\n }\n\n let entity: Robot | null;\n\n if (isMe) {\n const attributesResolver = new OAuth2ScopeAttributesResolver();\n const attributes = attributesResolver.resolveFor(OAuth2SubKind.ROBOT, useRequestScopes(req));\n\n const resolvedId = isSelfToken(id) ? identity!.id : id;\n entity = await this.repository.findOneByIdOrName(\n resolvedId,\n useRequestParam(req, 'realmId'),\n );\n\n if (entity) {\n const robotRepository = this.dataSource.getRepository(RobotEntity);\n const validAttributes = robotRepository.metadata.columns.map(\n (column) => column.databaseName,\n );\n for (const attribute of attributes) {\n const isValid = validAttributes.includes(attribute);\n if (isValid && attribute === 'secret') {\n const withSecret = await this.repository.findOneWithSecret({ id: entity.id });\n if (withSecret) {\n entity.secret = withSecret.secret;\n }\n }\n }\n }\n } else {\n const actor = buildActorContext(req);\n entity = await this.service.getOne(\n id,\n actor,\n useRequestParam(req, 'realmId'),\n );\n\n return send(res, entity);\n }\n\n if (!entity) {\n throw new NotFoundError();\n }\n\n return send(res, entity);\n }\n\n @DPost('/:id', [ForceLoggedInMiddleware])\n async edit(\n @DPath('id') id: string,\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const { entity } = await this.service.save(\n id,\n data,\n actor,\n { updateOnly: true },\n );\n\n return sendAccepted(res, entity);\n }\n\n @DPut('/:id', [ForceLoggedInMiddleware])\n async put(\n @DPath('id') id: string,\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const {\n entity, \n created, \n } = await this.service.save(\n id || undefined,\n data,\n actor,\n );\n\n if (created) {\n return sendCreated(res, entity);\n }\n\n return sendAccepted(res, entity);\n }\n\n @DDelete('/:id', [ForceLoggedInMiddleware])\n async drop(\n @DPath('id') id: string,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.delete(id, actor);\n\n return sendAccepted(res, entity);\n }\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n DBody, \n DController, \n DDelete, \n DGet, \n DPath, \n DPost, \n DRequest, \n DResponse, \n DTags,\n} from '@routup/decorators';\nimport { send, sendAccepted, sendCreated } from 'routup';\nimport { useRequestQuery } from '@routup/basic/query';\nimport type { IRobotPermissionService } from '../../../../../core/index.ts';\nimport { ForceLoggedInMiddleware } from '../../../middleware/index.ts';\nimport { buildActorContext } from '../../../request/index.ts';\n\nexport type RobotPermissionControllerContext = {\n service: IRobotPermissionService,\n};\n\n@DTags('robot')\n@DController('/robot-permissions')\nexport class RobotPermissionController {\n protected service: IRobotPermissionService;\n\n constructor(ctx: RobotPermissionControllerContext) {\n this.service = ctx.service;\n }\n\n @DGet('', [ForceLoggedInMiddleware])\n async getMany(\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const {\n data, \n meta, \n } = await this.service.getMany(useRequestQuery(req), actor);\n\n return send(res, {\n data,\n meta, \n });\n }\n\n @DPost('', [ForceLoggedInMiddleware])\n async add(\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n\n const entity = await this.service.create(data, actor);\n\n return sendCreated(res, entity);\n }\n\n @DPost('/:id', [ForceLoggedInMiddleware])\n async edit(\n @DPath('id') id: string,\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.update(id, data, actor);\n\n return sendAccepted(res, entity);\n }\n\n @DGet('/:id', [ForceLoggedInMiddleware])\n async getOne(\n @DPath('id') id: string,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.getOne(id, actor);\n\n return send(res, entity);\n }\n\n @DDelete('/:id', [ForceLoggedInMiddleware])\n async drop(\n @DPath('id') id: string,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.delete(\n id,\n actor,\n );\n\n return sendAccepted(res, entity);\n }\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { createValidationChain, createValidator } from '@validup/adapter-validator';\nimport { Container } from 'validup';\nimport type { RobotPermissionEntity } from '../../../../../database/domains/index.ts';\nimport { RequestHandlerOperation } from '../../../../request/index.ts';\n\nexport class RobotPermissionRequestValidator extends Container<\n RobotPermissionEntity\n> {\n protected initialize() {\n super.initialize();\n\n this.mount(\n 'robot_id',\n { group: RequestHandlerOperation.CREATE },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .exists()\n .isUUID();\n }),\n );\n\n this.mount(\n 'permission_id',\n { group: RequestHandlerOperation.CREATE },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .exists()\n .isUUID();\n }),\n );\n\n this.mount(\n 'policy_id',\n { optional: true },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .isUUID()\n .optional({ values: 'null' });\n }),\n );\n }\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n DBody, \n DController, \n DDelete, \n DGet, \n DPath, \n DPost, \n DRequest, \n DResponse, \n DTags,\n} from '@routup/decorators';\nimport { ForbiddenError } from '@ebec/http';\nimport { send, sendAccepted, sendCreated } from 'routup';\nimport { useRequestQuery } from '@routup/basic/query';\nimport type { IIdentityPermissionProvider, IRobotRoleRepository, IRobotRoleService } from '../../../../../core/index.ts';\nimport { ForceLoggedInMiddleware } from '../../../middleware/index.ts';\nimport {\n buildActorContext,\n useRequestIdentityOrFail,\n} from '../../../request/index.ts';\n\nexport type RobotRoleControllerContext = {\n service: IRobotRoleService,\n repository: IRobotRoleRepository,\n identityPermissionProvider: IIdentityPermissionProvider,\n};\n\n@DTags('robot')\n@DController('/robot-roles')\nexport class RobotRoleController {\n protected service: IRobotRoleService;\n\n protected repository: IRobotRoleRepository;\n\n protected identityPermissionProvider: IIdentityPermissionProvider;\n\n constructor(ctx: RobotRoleControllerContext) {\n this.service = ctx.service;\n this.repository = ctx.repository;\n this.identityPermissionProvider = ctx.identityPermissionProvider;\n }\n\n @DGet('', [ForceLoggedInMiddleware])\n async getMany(\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const {\n data, \n meta, \n } = await this.service.getMany(useRequestQuery(req), actor);\n\n return send(res, {\n data,\n meta, \n });\n }\n\n @DPost('', [ForceLoggedInMiddleware])\n async add(\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n\n await this.repository.validateJoinColumns(data);\n\n if (data.role) {\n const identity = useRequestIdentityOrFail(req);\n const hasPermissions = await this.identityPermissionProvider.isSuperset(identity, {\n type: 'role',\n id: data.role_id,\n clientId: data.role.client_id,\n });\n if (!hasPermissions) {\n throw new ForbiddenError('You don\\'t own the required permissions.');\n }\n }\n\n const entity = await this.service.create(data, actor);\n\n return sendCreated(res, entity);\n }\n\n @DGet('/:id', [ForceLoggedInMiddleware])\n async getOne(\n @DPath('id') id: string,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.getOne(id, actor);\n\n return send(res, entity);\n }\n\n @DDelete('/:id', [ForceLoggedInMiddleware])\n async drop(\n @DPath('id') id: string,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.delete(id, actor);\n\n return sendAccepted(res, entity);\n }\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { createValidationChain, createValidator } from '@validup/adapter-validator';\nimport { Container } from 'validup';\nimport type { RobotRole } from '@authup/core-kit';\nimport { RequestHandlerOperation } from '../../../../request/index.ts';\n\nexport class RobotRoleRequestValidator extends Container<\n RobotRole\n> {\n protected initialize() {\n super.initialize();\n\n this.mount(\n 'robot_id',\n { group: RequestHandlerOperation.CREATE },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .exists()\n .isUUID();\n }),\n );\n\n this.mount(\n 'role_id',\n { group: RequestHandlerOperation.CREATE },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .exists()\n .isUUID();\n }),\n );\n }\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n DBody, \n DController, \n DDelete, \n DGet, \n DPath, \n DPost, \n DPut, \n DRequest, \n DResponse, \n DTags,\n} from '@routup/decorators';\nimport { send, sendAccepted, sendCreated } from 'routup';\nimport { useRequestQuery } from '@routup/basic/query';\nimport type { IRoleService } from '../../../../../core/index.ts';\nimport { ForceLoggedInMiddleware } from '../../../middleware/index.ts';\nimport { buildActorContext } from '../../../request/index.ts';\n\nexport type RoleControllerContext = {\n service: IRoleService,\n};\n\n@DTags('role')\n@DController('/roles')\nexport class RoleController {\n protected service: IRoleService;\n\n constructor(ctx: RoleControllerContext) {\n this.service = ctx.service;\n }\n\n @DGet('', [ForceLoggedInMiddleware])\n async getMany(\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const {\n data, \n meta, \n } = await this.service.getMany(useRequestQuery(req), actor);\n\n return send(res, {\n data,\n meta, \n });\n }\n\n @DPost('', [ForceLoggedInMiddleware])\n async add(\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.create(data, actor);\n\n return sendCreated(res, entity);\n }\n\n @DGet('/:id', [ForceLoggedInMiddleware])\n async get(\n @DPath('id') id: string,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.getOne(\n id,\n actor,\n );\n\n return send(res, entity);\n }\n\n @DPost('/:id', [ForceLoggedInMiddleware])\n async edit(\n @DPath('id') id: string,\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.update(\n id,\n data,\n actor,\n );\n\n return sendAccepted(res, entity);\n }\n\n @DPut('/:id', [ForceLoggedInMiddleware])\n async put(\n @DPath('id') id: string,\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const {\n entity, \n created, \n } = await this.service.save(\n id || undefined,\n data,\n actor,\n );\n\n if (created) {\n return sendCreated(res, entity);\n }\n\n return sendAccepted(res, entity);\n }\n\n @DDelete('/:id', [ForceLoggedInMiddleware])\n async drop(\n @DPath('id') id: string,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.delete(id, actor);\n\n return sendAccepted(res, entity);\n }\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n DBody, \n DController, \n DDelete, \n DGet, \n DPath, \n DPost, \n DRequest, \n DResponse, \n DTags,\n} from '@routup/decorators';\nimport { send, sendAccepted, sendCreated } from 'routup';\nimport { useRequestQuery } from '@routup/basic/query';\nimport type { IRoleAttributeService } from '../../../../../core/index.ts';\nimport { ForceLoggedInMiddleware } from '../../../middleware/index.ts';\nimport { buildActorContext } from '../../../request/index.ts';\n\nexport type RoleAttributeControllerContext = {\n service: IRoleAttributeService,\n};\n\n@DTags('role')\n@DController('/role-attributes')\nexport class RoleAttributeController {\n protected service: IRoleAttributeService;\n\n constructor(ctx: RoleAttributeControllerContext) {\n this.service = ctx.service;\n }\n\n @DGet('', [ForceLoggedInMiddleware])\n async getMany(\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const {\n data, \n meta, \n } = await this.service.getMany(useRequestQuery(req), actor);\n\n return send(res, {\n data,\n meta, \n });\n }\n\n @DPost('', [ForceLoggedInMiddleware])\n async add(\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.create(data, actor);\n\n return sendCreated(res, entity);\n }\n\n @DGet('/:id', [ForceLoggedInMiddleware])\n async get(\n @DPath('id') id: string,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.getOne(id, actor);\n\n return send(res, entity);\n }\n\n @DPost('/:id', [ForceLoggedInMiddleware])\n async edit(\n @DPath('id') id: string,\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.update(id, data, actor);\n\n return sendAccepted(res, entity);\n }\n\n @DDelete('/:id', [ForceLoggedInMiddleware])\n async drop(\n @DPath('id') id: string,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.delete(id, actor);\n\n return sendAccepted(res, entity);\n }\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { createValidationChain, createValidator } from '@validup/adapter-validator';\nimport { Container } from 'validup';\nimport type { RoleAttribute } from '@authup/core-kit';\nimport { RequestHandlerOperation } from '../../../../request/index.ts';\n\nexport class RoleAttributeRequestValidator extends Container<\n RoleAttribute\n> {\n protected initialize() {\n super.initialize();\n\n this.mount(\n 'name',\n { group: RequestHandlerOperation.CREATE },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .exists()\n .notEmpty()\n .isString()\n .isLength({\n min: 3,\n max: 255, \n });\n }),\n );\n\n this.mount(\n 'role_id',\n { group: RequestHandlerOperation.CREATE },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .exists()\n .isUUID();\n }),\n );\n\n this.mount(\n 'value',\n { optional: true },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .exists()\n .notEmpty()\n .isString()\n .isLength({\n min: 3,\n max: 512, \n })\n .optional({ values: 'null' });\n }),\n );\n }\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n DBody, \n DController, \n DDelete, \n DGet, \n DPath, \n DPost, \n DRequest, \n DResponse, \n DTags,\n} from '@routup/decorators';\nimport { send, sendAccepted, sendCreated } from 'routup';\nimport { useRequestQuery } from '@routup/basic/query';\nimport type { IRolePermissionService } from '../../../../../core/index.ts';\nimport { ForceLoggedInMiddleware } from '../../../middleware/index.ts';\nimport { buildActorContext } from '../../../request/index.ts';\n\nexport type RolePermissionControllerContext = {\n service: IRolePermissionService,\n};\n\n@DTags('role')\n@DController('/role-permissions')\nexport class RolePermissionController {\n protected service: IRolePermissionService;\n\n constructor(ctx: RolePermissionControllerContext) {\n this.service = ctx.service;\n }\n\n @DGet('', [ForceLoggedInMiddleware])\n async getMany(\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const {\n data, \n meta, \n } = await this.service.getMany(useRequestQuery(req), actor);\n\n return send(res, {\n data,\n meta, \n });\n }\n\n @DPost('', [ForceLoggedInMiddleware])\n async add(\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n\n const entity = await this.service.create(data, actor);\n\n return sendCreated(res, entity);\n }\n\n @DPost('/:id', [ForceLoggedInMiddleware])\n async edit(\n @DPath('id') id: string,\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.update(id, data, actor);\n\n return sendAccepted(res, entity);\n }\n\n @DGet('/:id', [ForceLoggedInMiddleware])\n async getOne(\n @DPath('id') id: string,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.getOne(id, actor);\n\n return send(res, entity);\n }\n\n @DDelete('/:id', [ForceLoggedInMiddleware])\n async drop(\n @DPath('id') id: string,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.delete(id, actor);\n\n return sendAccepted(res, entity);\n }\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { createValidationChain, createValidator } from '@validup/adapter-validator';\nimport { Container } from 'validup';\nimport type { RolePermissionEntity } from '../../../../../database/domains/index.ts';\nimport { RequestHandlerOperation } from '../../../../request/index.ts';\n\nexport class RolePermissionRequestValidator extends Container<\n RolePermissionEntity\n> {\n protected initialize() {\n super.initialize();\n\n this.mount(\n 'role_id',\n { group: RequestHandlerOperation.CREATE },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .exists()\n .isUUID();\n }),\n );\n\n this.mount(\n 'permission_id',\n { group: RequestHandlerOperation.CREATE },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .exists()\n .isUUID();\n }),\n );\n\n this.mount(\n 'policy_id',\n { optional: true },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .exists()\n .isUUID()\n .optional({ values: 'null' });\n }),\n );\n }\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { PolicyAPICheckResponse } from '@authup/core-http-kit';\nimport { BuiltInPolicyType, PolicyData, definePolicyEvaluationContext } from '@authup/access';\nimport { isUUID } from '@authup/kit';\nimport { NotFoundError } from '@ebec/http';\nimport {\n DBody, \n DController, \n DDelete, \n DGet, \n DPath, \n DPost, \n DPut, \n DRequest, \n DResponse, \n DTags,\n} from '@routup/decorators';\nimport { useRequestQuery } from '@routup/basic/query';\nimport {\n send, \n sendAccepted, \n sendCreated, \n useRequestParam,\n} from 'routup';\nimport type {\n \n IIdentityPermissionProvider, \n IPolicyRepository, \n IPolicyService, \n IRealmRepository, \n} from '../../../../../core/index.ts';\nimport { PolicyEngine } from '../../../../../core/index.ts';\nimport { ForceLoggedInMiddleware } from '../../../middleware/index.ts';\nimport {\n buildActorContext,\n useRequestIdentity,\n} from '../../../request/index.ts';\n\nexport type PolicyControllerContext = {\n service: IPolicyService,\n repository: IPolicyRepository,\n realmRepository: IRealmRepository,\n identityPermissionProvider: IIdentityPermissionProvider,\n};\n\n@DTags('policy')\n@DController('/policies')\nexport class PolicyController {\n protected service: IPolicyService;\n\n protected repository: IPolicyRepository;\n\n protected realmRepository: IRealmRepository;\n\n protected identityPermissionProvider: IIdentityPermissionProvider;\n\n constructor(ctx: PolicyControllerContext) {\n this.service = ctx.service;\n this.repository = ctx.repository;\n this.realmRepository = ctx.realmRepository;\n this.identityPermissionProvider = ctx.identityPermissionProvider;\n }\n\n @DGet('', [])\n async getMany(\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const {\n data, \n meta, \n } = await this.service.getMany(useRequestQuery(req), actor);\n\n return send(res, {\n data,\n meta, \n });\n }\n\n @DGet('/:id/expanded', [])\n async getOneExpanded(\n @DPath('id') id: string,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n return this.getOne(id, req, res, { expanded: true });\n }\n\n @DGet('/:id', [])\n async getOne(\n @DPath('id') id: string,\n @DRequest() req: any,\n @DResponse() res: any,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n options: { expanded?: boolean } = {},\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.getOne(\n id,\n actor,\n useRequestParam(req, 'realmId'),\n );\n\n return send(res, entity);\n }\n\n @DPost('/:id/check', [ForceLoggedInMiddleware])\n async check(\n @DPath('id') id: string,\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const paramId = useRequestParam(req, 'id');\n\n let criteria: Record<string, any>;\n if (isUUID(paramId)) {\n criteria = { id: paramId };\n } else {\n const realm = await this.realmRepository.resolve(useRequestParam(req, 'realmId'));\n criteria = {\n name: paramId,\n ...(realm ? { realm_id: realm.id } : {}),\n };\n }\n\n const entity = await this.repository.findOneBy(criteria);\n if (!entity) {\n throw new NotFoundError();\n }\n\n if (\n !data[BuiltInPolicyType.IDENTITY] &&\n data[BuiltInPolicyType.IDENTITY] !== null\n ) {\n data[BuiltInPolicyType.IDENTITY] = useRequestIdentity(req);\n }\n\n const policyEngine = new PolicyEngine(this.identityPermissionProvider);\n\n let output: PolicyAPICheckResponse;\n try {\n await policyEngine.evaluate(entity, definePolicyEvaluationContext({ data: new PolicyData(data) }));\n\n output = { status: 'success' };\n } catch (e) {\n output = {\n status: 'error',\n data: e as Error,\n };\n }\n\n return sendAccepted(res, output);\n }\n\n @DPost('/:id', [ForceLoggedInMiddleware])\n async update(\n @DPath('id') id: string,\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.update(\n id,\n data,\n actor,\n );\n\n return sendAccepted(res, entity);\n }\n\n @DPut('/:id', [ForceLoggedInMiddleware])\n async replace(\n @DPath('id') id: string,\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n\n const {\n entity, \n created, \n } = await this.service.save(\n id || undefined,\n data,\n actor,\n );\n\n if (created) {\n return sendCreated(res, entity);\n }\n\n return sendAccepted(res, entity);\n }\n\n @DDelete('/:id', [ForceLoggedInMiddleware])\n async drop(\n @DPath('id') id: string,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.delete(id, actor);\n\n return sendAccepted(res, entity);\n }\n\n @DPost('', [ForceLoggedInMiddleware])\n async create(\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.create(data, actor);\n\n return sendCreated(res, entity);\n }\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n AttributeNamesPolicyValidator,\n AttributesPolicyValidator,\n BuiltInPolicyType,\n DatePolicyValidator,\n TimePolicyValidator,\n} from '@authup/access';\nimport { omitRecord } from '@authup/kit';\nimport type { ContainerOptions } from 'validup';\nimport { Container } from 'validup';\n\ntype PolicyContainerRunOptions<T> = ContainerOptions<T> & {\n attributeNames?: string[]\n};\n\nexport class PolicyAttributesValidator extends Container<Record<string, any>> {\n protected attributeNames : string[];\n\n protected attributesOptionsValidator : AttributesPolicyValidator;\n\n protected attributeNamesOptionsValidator : AttributeNamesPolicyValidator;\n\n protected dateOptionsValidator : DatePolicyValidator;\n\n protected timeOptionsValidator : TimePolicyValidator;\n\n constructor(options: PolicyContainerRunOptions<Record<string, any>>) {\n super(options);\n\n this.attributeNames = options.attributeNames || [];\n\n this.attributesOptionsValidator = new AttributesPolicyValidator();\n this.attributeNamesOptionsValidator = new AttributeNamesPolicyValidator();\n this.dateOptionsValidator = new DatePolicyValidator();\n this.timeOptionsValidator = new TimePolicyValidator();\n }\n\n override async run(\n data: Record<string, any>,\n ) : Promise<Record<string, any>> {\n let attributes : Record<string, any> = {};\n\n switch (data.type) {\n case BuiltInPolicyType.ATTRIBUTES: {\n attributes = await this.attributesOptionsValidator.run(data);\n break;\n }\n case BuiltInPolicyType.ATTRIBUTE_NAMES: {\n attributes = await this.attributeNamesOptionsValidator.run(data);\n break;\n }\n case BuiltInPolicyType.DATE: {\n attributes = await this.dateOptionsValidator.run(data);\n break;\n }\n case BuiltInPolicyType.TIME: {\n attributes = await this.timeOptionsValidator.run(data);\n break;\n }\n default: {\n if (typeof this.attributeNames !== 'undefined') {\n attributes = omitRecord(data, this.attributeNames);\n // todo: maybe limit attributes size\n }\n }\n }\n\n return attributes;\n }\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { BuiltInPolicyType } from '@authup/access';\nimport { isPolicyNameValid } from '@authup/core-kit';\nimport { isObject } from 'smob';\nimport type { ValidatorContext } from 'validup';\nimport { Container } from 'validup';\nimport { createValidationChain, createValidator } from '@validup/adapter-validator';\nimport type { PolicyEntity } from '../../../../../database/domains/index.ts';\nimport { RequestHandlerOperation } from '../../../../request/index.ts';\nimport { PolicyAttributesValidator } from './attributes-validator.ts';\n\nexport class PolicyValidator extends Container<PolicyEntity & { parent_id?: string | null }> {\n protected initialize() {\n super.initialize();\n\n const nameValidator = createValidator(() => {\n const chain = createValidationChain();\n return chain\n .exists()\n .notEmpty()\n .isString()\n .isLength({\n min: 3,\n max: 128,\n })\n .custom((value) => isPolicyNameValid(value, { throwOnFailure: true }));\n });\n\n this.mount('name', { group: RequestHandlerOperation.CREATE }, nameValidator);\n this.mount('name', {\n group: RequestHandlerOperation.UPDATE,\n optional: true, \n }, nameValidator);\n\n this.mount(\n 'display_name',\n { optional: true },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .isString()\n .isLength({\n min: 3,\n max: 256, \n })\n .optional({ values: 'null' });\n }),\n );\n\n this.mount(\n 'invert',\n { optional: true },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .isBoolean();\n }),\n );\n\n this.mount(\n 'type',\n { group: RequestHandlerOperation.CREATE },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .exists()\n .isString()\n .isLength({\n min: 3,\n max: 128, \n });\n }),\n );\n\n this.mount(\n 'parent_id',\n { optional: true },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .exists()\n .isUUID()\n .optional({ values: 'null' });\n }),\n );\n\n this.mount(\n 'realm_id',\n { group: RequestHandlerOperation.CREATE },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .exists()\n .isUUID()\n .optional({ values: 'null' });\n }),\n );\n\n this.mount({ optional: true }, new PolicyAttributesValidator({}));\n\n this.mount(\n 'children',\n { optional: true },\n async (ctx: ValidatorContext) => {\n if (!Array.isArray(ctx.value)) {\n // todo: throw error\n return undefined;\n }\n\n if (\n isObject(ctx.data) &&\n ctx.data.type !== BuiltInPolicyType.COMPOSITE\n ) {\n return undefined;\n }\n\n const promises = ctx.value.map((child) => this.run(child, {\n group: ctx.group,\n flat: false,\n path: ctx.path,\n }));\n\n return Promise.all(promises);\n },\n );\n }\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n DBody, \n DController, \n DDelete, \n DGet, \n DPath, \n DPost, \n DPut, \n DRequest, \n DResponse, \n DTags,\n} from '@routup/decorators';\nimport { send, sendAccepted, sendCreated } from 'routup';\nimport { useRequestQuery } from '@routup/basic/query';\nimport type { IScopeService } from '../../../../../core/index.ts';\nimport { ForceLoggedInMiddleware } from '../../../middleware/index.ts';\nimport { buildActorContext } from '../../../request/index.ts';\n\nexport type ScopeControllerContext = {\n service: IScopeService,\n};\n\n@DTags('scope')\n@DController('/scopes')\nexport class ScopeController {\n protected service: IScopeService;\n\n constructor(ctx: ScopeControllerContext) {\n this.service = ctx.service;\n }\n\n @DGet('', [])\n async getMany(\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const {\n data, \n meta, \n } = await this.service.getMany(useRequestQuery(req), actor);\n\n return send(res, {\n data,\n meta, \n });\n }\n\n @DPost('', [ForceLoggedInMiddleware])\n async add(\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.create(data, actor);\n\n return sendCreated(res, entity);\n }\n\n @DGet('/:id', [])\n async get(\n @DPath('id') id: string,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.getOne(\n id,\n actor,\n );\n\n return send(res, entity);\n }\n\n @DPost('/:id', [ForceLoggedInMiddleware])\n async edit(\n @DPath('id') id: string,\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.update(\n id,\n data,\n actor,\n );\n\n return sendAccepted(res, entity);\n }\n\n @DPut('/:id', [ForceLoggedInMiddleware])\n async put(\n @DPath('id') id: string,\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const {\n entity, \n created, \n } = await this.service.save(\n id || undefined,\n data,\n actor,\n );\n\n if (created) {\n return sendCreated(res, entity);\n }\n\n return sendAccepted(res, entity);\n }\n\n @DDelete('/:id', [ForceLoggedInMiddleware])\n async drop(\n @DPath('id') id: string,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.delete(id, actor);\n\n return sendAccepted(res, entity);\n }\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n DBody, \n DController, \n DDelete, \n DGet, \n DPath, \n DPost, \n DPut, \n DRequest, \n DResponse, \n DTags,\n} from '@routup/decorators';\nimport {\n send, \n sendAccepted, \n sendCreated, \n useRequestParam,\n} from 'routup';\nimport { useRequestQuery } from '@routup/basic/query';\nimport type { IUserService } from '../../../../../core/index.ts';\nimport { ForceLoggedInMiddleware } from '../../../middleware/index.ts';\nimport { isSelfToken } from '../../../../../utils/index.ts';\nimport { buildActorContext } from '../../../request/index.ts';\n\nexport type UserControllerContext = {\n service: IUserService,\n};\n\n@DTags('user')\n@DController('/users')\nexport class UserController {\n protected service: IUserService;\n\n constructor(ctx: UserControllerContext) {\n this.service = ctx.service;\n }\n\n @DGet('', [ForceLoggedInMiddleware])\n async getMany(\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const {\n data, \n meta, \n } = await this.service.getMany(useRequestQuery(req), actor);\n\n return send(res, {\n data,\n meta, \n });\n }\n\n @DGet('/:id', [ForceLoggedInMiddleware])\n async get(\n @DPath('id') id: string,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n let paramId = id;\n\n if (\n isSelfToken(paramId) &&\n actor.identity &&\n actor.identity.type === 'user'\n ) {\n paramId = actor.identity.data.id;\n }\n\n const entity = await this.service.getOne(\n paramId,\n actor,\n useRequestQuery(req),\n useRequestParam(req, 'realmId'),\n );\n\n return send(res, entity);\n }\n\n @DPost('', [ForceLoggedInMiddleware])\n async add(\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.create(data, actor);\n\n return sendCreated(res, entity);\n }\n\n @DPost('/:id', [ForceLoggedInMiddleware])\n async edit(\n @DPath('id') id: string,\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.update(\n id,\n data,\n actor,\n );\n\n return sendAccepted(res, entity);\n }\n\n @DPut('/:id', [ForceLoggedInMiddleware])\n async put(\n @DPath('id') id: string,\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const {\n entity, \n created, \n } = await this.service.save(\n id || undefined,\n data,\n actor,\n );\n\n if (created) {\n return sendCreated(res, entity);\n }\n\n return sendAccepted(res, entity);\n }\n\n @DDelete('/:id', [ForceLoggedInMiddleware])\n async drop(\n @DPath('id') id: string,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.delete(id, actor);\n\n return sendAccepted(res, entity);\n }\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n DBody, \n DController, \n DDelete, \n DGet, \n DPath, \n DPost, \n DRequest, \n DResponse, \n DTags,\n} from '@routup/decorators';\nimport { send, sendAccepted, sendCreated } from 'routup';\nimport { useRequestQuery } from '@routup/basic/query';\nimport type { IUserAttributeService } from '../../../../../core/index.ts';\nimport { ForceLoggedInMiddleware } from '../../../middleware/index.ts';\nimport { buildActorContext } from '../../../request/index.ts';\n\nexport type UserAttributeControllerContext = {\n service: IUserAttributeService,\n};\n\n@DTags('user')\n@DController('/user-attributes')\nexport class UserAttributeController {\n protected service: IUserAttributeService;\n\n constructor(ctx: UserAttributeControllerContext) {\n this.service = ctx.service;\n }\n\n @DGet('', [ForceLoggedInMiddleware])\n async getMany(\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const {\n data, \n meta, \n } = await this.service.getMany(useRequestQuery(req), actor);\n\n return send(res, {\n data,\n meta, \n });\n }\n\n @DPost('', [ForceLoggedInMiddleware])\n async add(\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.create(data, actor);\n\n return sendCreated(res, entity);\n }\n\n @DGet('/:id', [ForceLoggedInMiddleware])\n async get(\n @DPath('id') id: string,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.getOne(id, actor);\n\n return send(res, entity);\n }\n\n @DPost('/:id', [ForceLoggedInMiddleware])\n async edit(\n @DPath('id') id: string,\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.update(id, data, actor);\n\n return sendAccepted(res, entity);\n }\n\n @DDelete('/:id', [ForceLoggedInMiddleware])\n async drop(\n @DPath('id') id: string,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.delete(id, actor);\n\n return sendAccepted(res, entity);\n }\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { createValidationChain, createValidator } from '@validup/adapter-validator';\nimport { Container } from 'validup';\nimport type { UserAttribute } from '@authup/core-kit';\nimport { RequestHandlerOperation } from '../../../../request/index.ts';\n\nexport class UserAttributeRequestValidator extends Container<\n UserAttribute\n> {\n protected initialize() {\n super.initialize();\n\n this.mount(\n 'name',\n { group: RequestHandlerOperation.CREATE },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .exists()\n .notEmpty()\n .isString()\n .isLength({\n min: 3,\n max: 255, \n });\n }),\n );\n\n this.mount(\n 'user_id',\n {\n group: RequestHandlerOperation.CREATE,\n optional: true, \n },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .exists()\n .isUUID()\n .optional({ values: 'null' });\n }),\n );\n\n this.mount(\n 'value',\n { optional: true },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .exists()\n .notEmpty()\n .isString()\n .isLength({\n min: 3,\n max: 512, \n })\n .optional({ nullable: true });\n }),\n );\n }\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n DBody, \n DController, \n DDelete, \n DGet, \n DPath, \n DPost, \n DRequest, \n DResponse, \n DTags,\n} from '@routup/decorators';\nimport { send, sendAccepted, sendCreated } from 'routup';\nimport { useRequestQuery } from '@routup/basic/query';\nimport type { IUserPermissionService } from '../../../../../core/index.ts';\nimport { ForceLoggedInMiddleware } from '../../../middleware/index.ts';\nimport { buildActorContext } from '../../../request/index.ts';\n\nexport type UserPermissionControllerContext = {\n service: IUserPermissionService,\n};\n\n@DTags('user')\n@DController('/user-permissions')\nexport class UserPermissionController {\n protected service: IUserPermissionService;\n\n constructor(ctx: UserPermissionControllerContext) {\n this.service = ctx.service;\n }\n\n @DGet('', [ForceLoggedInMiddleware])\n async getMany(\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const {\n data, \n meta, \n } = await this.service.getMany(useRequestQuery(req), actor);\n\n return send(res, {\n data,\n meta, \n });\n }\n\n @DPost('', [ForceLoggedInMiddleware])\n async add(\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n\n const entity = await this.service.create(data, actor);\n\n return sendCreated(res, entity);\n }\n\n @DPost('/:id', [ForceLoggedInMiddleware])\n async edit(\n @DPath('id') id: string,\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.update(id, data, actor);\n\n return sendAccepted(res, entity);\n }\n\n @DGet('/:id', [ForceLoggedInMiddleware])\n async getOne(\n @DPath('id') id: string,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.getOne(id, actor);\n\n return send(res, entity);\n }\n\n @DDelete('/:id', [ForceLoggedInMiddleware])\n async drop(\n @DPath('id') id: string,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.delete(id, actor);\n\n return sendAccepted(res, entity);\n }\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { createValidationChain, createValidator } from '@validup/adapter-validator';\nimport { Container } from 'validup';\nimport type { UserPermissionEntity } from '../../../../../database/domains/index.ts';\nimport { RequestHandlerOperation } from '../../../../request/index.ts';\n\nexport class UserPermissionRequestValidator extends Container<\n UserPermissionEntity\n> {\n protected initialize() {\n super.initialize();\n\n this.mount(\n 'user_id',\n { group: RequestHandlerOperation.CREATE },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .exists()\n .isUUID();\n }),\n );\n\n this.mount(\n 'permission_id',\n { group: RequestHandlerOperation.CREATE },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .exists()\n .isUUID();\n }),\n );\n\n this.mount(\n 'policy_id',\n { optional: true },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .exists()\n .isUUID()\n .optional({ values: 'null' });\n }),\n );\n }\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n DBody, \n DController, \n DDelete, \n DGet, \n DPath, \n DPost, \n DRequest, \n DResponse, \n DTags,\n} from '@routup/decorators';\nimport { ForbiddenError } from '@ebec/http';\nimport { send, sendAccepted, sendCreated } from 'routup';\nimport { useRequestQuery } from '@routup/basic/query';\nimport type { IIdentityPermissionProvider, IUserRoleRepository, IUserRoleService } from '../../../../../core/index.ts';\nimport { ForceLoggedInMiddleware } from '../../../middleware/index.ts';\nimport {\n buildActorContext,\n useRequestIdentityOrFail,\n} from '../../../request/index.ts';\n\nexport type UserRoleControllerContext = {\n service: IUserRoleService,\n repository: IUserRoleRepository,\n identityPermissionProvider: IIdentityPermissionProvider,\n};\n\n@DTags('user')\n@DController('/user-roles')\nexport class UserRoleController {\n protected service: IUserRoleService;\n\n protected repository: IUserRoleRepository;\n\n protected identityPermissionProvider: IIdentityPermissionProvider;\n\n constructor(ctx: UserRoleControllerContext) {\n this.service = ctx.service;\n this.repository = ctx.repository;\n this.identityPermissionProvider = ctx.identityPermissionProvider;\n }\n\n @DGet('', [ForceLoggedInMiddleware])\n async getMany(\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const {\n data, \n meta, \n } = await this.service.getMany(useRequestQuery(req), actor);\n\n return send(res, {\n data,\n meta, \n });\n }\n\n @DPost('', [ForceLoggedInMiddleware])\n async add(\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n\n await this.repository.validateJoinColumns(data);\n\n if (data.role) {\n const identity = useRequestIdentityOrFail(req);\n const hasPermissions = await this.identityPermissionProvider.isSuperset(identity, {\n type: 'role',\n id: data.role_id,\n clientId: data.role.client_id,\n });\n if (!hasPermissions) {\n throw new ForbiddenError('You don\\'t own the required permissions.');\n }\n }\n\n const entity = await this.service.create(data, actor);\n\n return sendCreated(res, entity);\n }\n\n @DGet('/:id', [ForceLoggedInMiddleware])\n async getOne(\n @DPath('id') id: string,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.getOne(id, actor);\n\n return send(res, entity);\n }\n\n @DDelete('/:id', [ForceLoggedInMiddleware])\n async drop(\n @DPath('id') id: string,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.delete(id, actor);\n\n return sendAccepted(res, entity);\n }\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { createValidationChain, createValidator } from '@validup/adapter-validator';\nimport { Container } from 'validup';\nimport type { UserRoleEntity } from '../../../../../database/domains/index.ts';\n\nimport { RequestHandlerOperation } from '../../../../request/index.ts';\n\nexport class UserRoleRequestValidator extends Container<\n UserRoleEntity\n> {\n protected initialize() {\n super.initialize();\n\n this.mount(\n 'user_id',\n { group: RequestHandlerOperation.CREATE },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .exists()\n .isUUID();\n }),\n );\n\n this.mount(\n 'role_id',\n { group: RequestHandlerOperation.CREATE },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .exists()\n .isUUID();\n }),\n );\n }\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport http from 'node:http';\nimport { createNodeDispatcher } from 'routup';\nimport type { HttpServerContext, IServer } from './type.ts';\n\nexport function createHttpServer({ router } : HttpServerContext) : IServer {\n return new http.Server(createNodeDispatcher(router));\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { Version, generate } from '@routup/swagger';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { DIST_PATH, SRC_PATH } from '../../../path.ts';\nimport type { SwaggerOptions } from './type.ts';\n\nexport class Swagger {\n protected distPath : string;\n\n protected srcPath : string;\n\n protected entrypointPath : string;\n\n protected options : SwaggerOptions;\n\n constructor(options: SwaggerOptions) {\n this.distPath = DIST_PATH;\n this.srcPath = SRC_PATH;\n\n this.entrypointPath = path.join(\n this.srcPath,\n 'adapters',\n 'http',\n 'controllers',\n );\n\n this.options = options;\n }\n\n async canGenerate() : Promise<boolean> {\n try {\n let stats = await fs.promises.stat(this.srcPath);\n if (!stats.isDirectory()) {\n return false;\n }\n\n stats = await fs.promises.stat(this.entrypointPath);\n\n return stats.isDirectory();\n } catch {\n return false;\n }\n }\n\n async generate() {\n return generate({\n version: Version.V2,\n options: {\n metadata: {\n cache: false,\n entryPoint: {\n cwd: this.entrypointPath,\n pattern: '**/*{.ts,.js,.d.ts}',\n },\n ignore: [\n '**/node_modules/**',\n ],\n allow: [\n '**/@authup/**',\n ],\n },\n servers: [\n this.options.baseURL,\n ],\n name: 'API Documentation',\n outputDirectory: this.distPath,\n securityDefinitions: {\n bearer: {\n name: 'Bearer',\n type: 'apiKey',\n in: 'header',\n },\n oauth2: {\n type: 'oauth2',\n flows: { password: { tokenUrl: `${new URL('token', this.options.baseURL).href}` } },\n },\n basicAuth: {\n type: 'http',\n schema: 'basic',\n },\n },\n consumes: [],\n produces: [],\n },\n });\n }\n\n async exists() : Promise<boolean> {\n try {\n await fs.promises.access(path.join(\n this.distPath,\n 'swagger.json',\n ), fs.constants.R_OK | fs.constants.F_OK);\n\n return true;\n } catch {\n return false;\n }\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { TypedToken } from 'eldin';\nimport type {\n IOAuth2AuthorizationCodeIssuer,\n IOAuth2AuthorizationCodeRepository,\n IOAuth2AuthorizationCodeRequestVerifier,\n IOAuth2AuthorizationCodeVerifier,\n IOAuth2AuthorizationStateManager,\n IOAuth2AuthorizeStateRepository,\n IOAuth2ClientRepository,\n IOAuth2KeyRepository,\n IOAuth2OpenIDTokenIssuer,\n IOAuth2ScopeRepository,\n IOAuth2TokenIssuer,\n IOAuth2TokenRepository,\n IOAuth2TokenRevoker,\n IOAuth2TokenSigner,\n IOAuth2TokenVerifier,\n} from '../../../core/index.ts';\n\nexport const OAuth2InjectionToken = {\n ClientRepository: new TypedToken<IOAuth2ClientRepository>('ClientRepository'),\n ScopeRepository: new TypedToken<IOAuth2ScopeRepository>('ScopeRepository'),\n\n AuthorizationCodeIssuer: new TypedToken<IOAuth2AuthorizationCodeIssuer>('AuthorizationCodeIssuer'),\n AuthorizationCodeRepository: new TypedToken<IOAuth2AuthorizationCodeRepository>('AuthorizationCodeRepository'),\n AuthorizationCodeVerifier: new TypedToken<IOAuth2AuthorizationCodeVerifier>('AuthorizationCodeVerifier'),\n AuthorizationStateManager: new TypedToken<IOAuth2AuthorizationStateManager>('AuthorizationStateManager'),\n AuthorizationCodeRequestVerifier: new TypedToken<IOAuth2AuthorizationCodeRequestVerifier>('AuthorizationCodeRequestVerifier'),\n\n AuthorizationStateRepository: new TypedToken<IOAuth2AuthorizeStateRepository>('AuthorizationStateRepository'),\n\n KeyRepository: new TypedToken<IOAuth2KeyRepository>('KeyRepository'),\n\n AccessTokenIssuer: new TypedToken<IOAuth2TokenIssuer>('AccessTokenIssuer'),\n OpenIDTokenIssuer: new TypedToken<IOAuth2OpenIDTokenIssuer>('OpenIDTokenIssuer'),\n RefreshTokenIssuer: new TypedToken<IOAuth2TokenIssuer>('RefreshTokenIssuer'),\n\n TokenRepository: new TypedToken<IOAuth2TokenRepository>('TokenRepository'),\n TokenRevoker: new TypedToken<IOAuth2TokenRevoker>('TokenRevoker'),\n TokenSigner: new TypedToken<IOAuth2TokenSigner>('TokenSigner'),\n TokenVerifier: new TypedToken<IOAuth2TokenVerifier>('TokenVerifier'),\n} as const;\n","/*\n * Copyright (c) 2024-2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport enum CacheOAuth2Prefix {\n AUTHORIZATION_STATE = 'oauth2_authorization_state',\n AUTHORIZATION_CODE = 'oauth2_authorization_code',\n TOKEN = 'oauth2_token',\n TOKEN_CLAIMS = 'oauth2_token_claims',\n TOKEN_INACTIVE = 'oauth2_token_blocked',\n}\n","/*\n * Copyright (c) 2024-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { OAuth2AuthorizationCode } from '@authup/core-kit';\nimport type { ICache } from '@authup/server-kit';\nimport { buildCacheKey } from '@authup/server-kit';\nimport { randomBytes } from 'node:crypto';\nimport { CacheOAuth2Prefix } from '../../constants.ts';\nimport type {\n IOAuth2AuthorizationCodeRepository,\n OAuth2AuthorizationCodeInput,\n OAuth2AuthorizationCodeRepositorySaveOptions,\n} from '../../../../../../core/index.ts';\n\nexport class OAuth2AuthorizationCodeRepository implements IOAuth2AuthorizationCodeRepository {\n protected cache : ICache;\n\n constructor(cache: ICache) {\n this.cache = cache;\n }\n\n async findOneById(id: string): Promise<OAuth2AuthorizationCode | null> {\n const entity = await this.cache.get<OAuth2AuthorizationCode>(buildCacheKey({\n prefix: CacheOAuth2Prefix.AUTHORIZATION_CODE,\n key: id,\n }));\n\n if (entity) {\n return entity;\n }\n\n return null;\n }\n\n async popOneById(id: string): Promise<OAuth2AuthorizationCode | null> {\n return this.cache.pop<OAuth2AuthorizationCode>(buildCacheKey({\n prefix: CacheOAuth2Prefix.AUTHORIZATION_CODE,\n key: id,\n }));\n }\n\n async save(\n input: OAuth2AuthorizationCodeInput,\n options: OAuth2AuthorizationCodeRepositorySaveOptions = {},\n ): Promise<OAuth2AuthorizationCode> {\n const ttl = (options.maxAge || 300) * 1_000;\n\n if (!input.id) {\n input.id = randomBytes(10).toString('hex');\n }\n\n await this.cache.set(buildCacheKey({\n prefix: CacheOAuth2Prefix.AUTHORIZATION_CODE,\n key: input.id,\n }), input, { ttl });\n\n return input as OAuth2AuthorizationCode;\n }\n\n async remove(entity: OAuth2AuthorizationCode): Promise<void> {\n return this.removeById(entity.id);\n }\n\n async removeById(id: string): Promise<void> {\n await this.cache.drop(buildCacheKey({\n prefix: CacheOAuth2Prefix.AUTHORIZATION_CODE,\n key: id,\n }));\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { createNanoID } from '@authup/kit';\nimport type { ICache } from '@authup/server-kit';\nimport { buildCacheKey } from '@authup/server-kit';\nimport type { IOAuth2AuthorizeStateRepository, OAuth2AuthorizationState } from '../../../../../../core/index.ts';\nimport { CacheOAuth2Prefix } from '../../constants.ts';\n\nexport class OAuth2AuthorizationStateRepository implements IOAuth2AuthorizeStateRepository {\n protected cache : ICache;\n\n constructor(cache: ICache) {\n this.cache = cache;\n }\n\n async findOneById(key: string): Promise<OAuth2AuthorizationState | null> {\n const id = buildCacheKey({\n prefix: CacheOAuth2Prefix.AUTHORIZATION_CODE,\n key, \n });\n const payload = await this.cache.get<OAuth2AuthorizationState>(id);\n if (payload) {\n return payload;\n }\n\n return null;\n }\n\n async remove(key: string): Promise<void> {\n await this.cache.drop(\n buildCacheKey({\n prefix: CacheOAuth2Prefix.AUTHORIZATION_CODE,\n key, \n }),\n );\n }\n\n async insert(data: OAuth2AuthorizationState): Promise<string> {\n const state = createNanoID();\n\n await this.cache.set(\n buildCacheKey({\n prefix: CacheOAuth2Prefix.AUTHORIZATION_CODE,\n key: state, \n }),\n data,\n { ttl: 1000 * 60 * 30 }, // 30 min\n );\n\n return state;\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Client } from '@authup/core-kit';\nimport { isUUID } from '@authup/kit';\nimport type { Repository } from 'typeorm';\nimport type { IOAuth2ClientRepository } from '../../../../../core/index.ts';\n\nexport class OAuth2ClientRepository implements IOAuth2ClientRepository {\n private readonly repository: Repository<Client>;\n\n constructor(\n repository: Repository<Client>,\n ) {\n this.repository = repository;\n }\n\n async findOneByIdOrName(key: string, realmKey?: string): Promise<Client | null> {\n const query = this.repository.createQueryBuilder('client')\n .leftJoinAndSelect('client.realm', 'realm');\n\n if (isUUID(key)) {\n query.where('client.id = :id', { id: key });\n } else {\n query.where('client.name = :name', { name: key });\n\n if (realmKey) {\n if (isUUID(realmKey)) {\n query.andWhere('client.realm_id = :realmId', { realmId: realmKey });\n } else {\n query.andWhere('realm.name = :realmName', { realmName: realmKey });\n }\n }\n }\n\n return query.getOne();\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { ClientScope, Scope } from '@authup/core-kit';\nimport type { Repository } from 'typeorm';\nimport type { IOAuth2ScopeRepository } from '../../../../../core/index.ts';\n\nexport class OAuth2ScopeRepository implements IOAuth2ScopeRepository {\n private readonly repository: Repository<ClientScope>;\n\n constructor(\n repository: Repository<ClientScope>,\n ) {\n this.repository = repository;\n }\n\n async findByClientId(clientId: string): Promise<Scope[]> {\n const clientScopes = await this.repository.find({\n where: { client_id: clientId },\n relations: { scope: true },\n });\n\n return clientScopes.map((clientScope) => clientScope.scope);\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Key } from '@authup/core-kit';\nimport { AsymmetricKey, CryptoAsymmetricAlgorithm, createAsymmetricKeyPair } from '@authup/server-kit';\nimport { JWKType, JWTAlgorithm } from '@authup/specs';\nimport { useDataSource } from 'typeorm-extension';\nimport { KeyEntity } from '../../../../../adapters/database/index.ts';\nimport type { IOAuth2KeyRepository } from '../../../../../core/index.ts';\n\nexport class OAuth2KeyRepository implements IOAuth2KeyRepository {\n async findByRealmId(realmId: string): Promise<Key | null> {\n return this.createOrGet({ realm_id: realmId });\n }\n\n async findById(id: string): Promise<Key | null> {\n return this.createOrGet({ id });\n }\n\n protected async createOrGet(where: {\n realm_id?: string,\n id?: string\n }) : Promise<Key | null> {\n const dataSource = await useDataSource();\n const repository = dataSource.getRepository(KeyEntity);\n\n let entity = await repository.findOne({\n select: {\n id: true,\n type: true,\n signature_algorithm: true,\n encryption_key: true,\n decryption_key: true,\n },\n where,\n });\n\n if (entity) {\n return entity;\n }\n\n if (typeof where.realm_id !== 'string') {\n return null;\n }\n\n const keyPair = await createAsymmetricKeyPair({ name: CryptoAsymmetricAlgorithm.RSASSA_PKCS1_V1_5 });\n\n const privateKeyContainer = new AsymmetricKey(keyPair.privateKey);\n const publicKeyContainer = new AsymmetricKey(keyPair.publicKey);\n\n entity = repository.create({\n type: JWKType.RSA,\n decryption_key: await privateKeyContainer.toBase64(),\n encryption_key: await publicKeyContainer.toBase64(),\n realm_id: where.realm_id,\n signature_algorithm: `${JWTAlgorithm.RS256}`,\n });\n\n await repository.save(entity);\n\n return entity;\n }\n}\n","/*\n * Copyright (c) 2025-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { ICache } from '@authup/server-kit';\nimport { buildCacheKey } from '@authup/server-kit';\nimport type { OAuth2TokenPayload } from '@authup/specs';\nimport { randomUUID } from 'node:crypto';\nimport type { IOAuth2TokenRepository } from '../../../../../core/index.ts';\nimport { CacheOAuth2Prefix } from '../constants.ts';\n\nexport class OAuth2TokenRepository implements IOAuth2TokenRepository {\n protected cache : ICache;\n\n constructor(cache: ICache) {\n this.cache = cache;\n }\n\n // -----------------------------------------------------\n\n async findOneBySignature(signature: string): Promise<OAuth2TokenPayload | null> {\n return this.cache.get<OAuth2TokenPayload>(\n buildCacheKey({\n prefix: CacheOAuth2Prefix.TOKEN_CLAIMS,\n key: signature, \n }),\n );\n }\n\n async findOneById(id: string): Promise<OAuth2TokenPayload | null> {\n return this.cache.get<OAuth2TokenPayload>(\n buildCacheKey({\n prefix: CacheOAuth2Prefix.TOKEN,\n key: id, \n }),\n );\n }\n\n // -----------------------------------------------------\n\n async removeById(id: string): Promise<void> {\n const token = await this.findOneById(id);\n if (!token) {\n return;\n }\n\n const key = buildCacheKey({\n prefix: CacheOAuth2Prefix.TOKEN,\n key: id, \n });\n await this.cache.drop(key);\n\n await this.setInactive(id, token.exp);\n }\n\n // -----------------------------------------------------\n\n async insert(payload: OAuth2TokenPayload): Promise<OAuth2TokenPayload> {\n payload.jti = randomUUID();\n\n await this.cache.set(\n buildCacheKey({\n prefix: CacheOAuth2Prefix.TOKEN,\n key: payload.jti, \n }),\n payload,\n { ttl: this.buildTTL(payload.exp) },\n );\n\n return payload;\n }\n\n async save(payload: OAuth2TokenPayload): Promise<OAuth2TokenPayload> {\n if (payload.jti) {\n return payload;\n }\n\n return this.insert(payload);\n }\n\n async saveWithSignature(data: OAuth2TokenPayload, signature: string): Promise<OAuth2TokenPayload> {\n const normalized = await this.save(data);\n\n await this.cache.set(\n buildCacheKey({\n prefix: CacheOAuth2Prefix.TOKEN_CLAIMS,\n key: signature, \n }),\n normalized,\n { ttl: this.buildTTL(data.exp) },\n );\n\n return normalized;\n }\n\n // -----------------------------------------------------\n\n async isInactive(key: string): Promise<boolean> {\n const cacheKey = buildCacheKey({\n prefix: CacheOAuth2Prefix.TOKEN_INACTIVE,\n key,\n });\n\n const response = await this.cache.get(cacheKey);\n\n return !!response;\n }\n\n async setInactive(key: string, exp?: number): Promise<void> {\n const ttl = this.buildTTL(exp);\n\n const cacheKey = buildCacheKey({\n prefix: CacheOAuth2Prefix.TOKEN_INACTIVE,\n key,\n });\n\n await this.cache.set(\n cacheKey,\n true,\n { ttl },\n );\n }\n\n // -----------------------------------------------------\n\n /**\n * Transform timestamp in seconds to ttl in ms.\n *\n * @param utc\n * @protected\n */\n protected buildTTL(utc?: number) {\n if (typeof utc === 'number') {\n const ttl = (utc * 1000) - Date.now();\n if (ttl > 0) {\n return ttl;\n }\n }\n\n return 3_600 * 1000;\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { TypedToken } from 'eldin';\nimport type {\n IIdentityProviderAccountManager,\n IIdentityResolver,\n IdentityProviderLdapCollectionAuthenticator,\n} from '../../../core/index.ts';\n\nexport const IdentityInjectionKey = {\n Resolver: new TypedToken<IIdentityResolver>('Resolver'),\n ProviderAccountManager: new TypedToken<IIdentityProviderAccountManager>('AccountManager'),\n ProviderLdapCollectionAuthenticator: new TypedToken<IdentityProviderLdapCollectionAuthenticator>('ProviderLdapCollectionAuthenticator'),\n} as const;\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { IdentityProviderAccount } from '@authup/core-kit';\nimport type { DeepPartial } from 'typeorm';\nimport { useDataSource } from 'typeorm-extension';\nimport type { IIdentityProviderAccountRepository, IdentityProviderIdentity } from '../../../../../../core/index.ts';\nimport { IdentityProviderAccountEntity } from '../../../../../../adapters/database/domains/index.ts';\n\nexport class IdentityProviderAccountRepository implements IIdentityProviderAccountRepository {\n async findOneByProviderIdentity(identity: IdentityProviderIdentity): Promise<IdentityProviderAccount | null> {\n const dataSource = await useDataSource();\n const repository = dataSource.getRepository(IdentityProviderAccountEntity);\n\n return repository.findOne({\n where: {\n provider_user_id: identity.id,\n provider_id: identity.provider.id,\n },\n relations: ['user'],\n });\n }\n\n async save(entity: DeepPartial<IdentityProviderAccount>): Promise<IdentityProviderAccount> {\n const dataSource = await useDataSource();\n const repository = dataSource.getRepository(IdentityProviderAccountEntity);\n\n return repository.save(entity);\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { IdentityProviderAttributeMapping } from '@authup/core-kit';\nimport { useDataSource } from 'typeorm-extension';\nimport type { IIdentityProviderAttributeMappingRepository } from '../../../../../../core/index.ts';\nimport { IdentityProviderAttributeMappingEntity } from '../../../../../../adapters/database/domains/index.ts';\n\nexport class IdentityProviderAttributeMappingRepository implements IIdentityProviderAttributeMappingRepository {\n async findByProviderId(providerId: string): Promise<IdentityProviderAttributeMapping[]> {\n const dataSource = await useDataSource();\n const repository = dataSource.getRepository(IdentityProviderAttributeMappingEntity);\n\n return repository.findBy({ provider_id: providerId });\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { IdentityProviderPermissionMapping } from '@authup/core-kit';\nimport { useDataSource } from 'typeorm-extension';\nimport type { IIdentityProviderPermissionMappingRepository } from '../../../../../../core/index.ts';\nimport { IdentityProviderPermissionMappingEntity } from '../../../../../../adapters/database/domains/index.ts';\n\nexport class IdentityProviderPermissionMappingRepository implements IIdentityProviderPermissionMappingRepository {\n async findByProviderId(providerId: string): Promise<IdentityProviderPermissionMapping[]> {\n const dataSource = await useDataSource();\n const repository = dataSource.getRepository(IdentityProviderPermissionMappingEntity);\n\n return repository.findBy({ provider_id: providerId });\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { IdentityProviderRoleMapping } from '@authup/core-kit';\nimport { useDataSource } from 'typeorm-extension';\nimport type { IIdentityProviderRoleMappingFinder } from '../../../../../../core/index.ts';\nimport { IdentityProviderRoleMappingEntity } from '../../../../../../adapters/database/domains/index.ts';\n\nexport class IdentityProviderRoleMappingRepository implements IIdentityProviderRoleMappingFinder {\n async findByProviderId(providerId: string): Promise<IdentityProviderRoleMapping[]> {\n const dataSource = await useDataSource();\n const repository = dataSource.getRepository(IdentityProviderRoleMappingEntity);\n\n return repository.findBy({ provider_id: providerId });\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { buildRedisKeyPath } from '@authup/server-kit';\nimport { isUUID } from '@authup/kit';\nimport type { Client } from '@authup/core-kit';\nimport type { IClientIdentityRepository } from '../../../../core/index.ts';\nimport type { ClientRepository } from '../../../../adapters/database/domains/index.ts';\nimport { CachePrefix } from '../../../../adapters/database/domains/index.ts';\n\nexport class ClientIdentityRepository implements IClientIdentityRepository {\n private readonly repository: ClientRepository;\n\n constructor(repository: ClientRepository) {\n this.repository = repository;\n }\n\n async findOneById(id: string): Promise<Client | null> {\n return this.find(id);\n }\n\n async findOneByName(id: string, realm?: string): Promise<Client | null> {\n return this.find(id, realm);\n }\n\n async findOneByIdOrName(idOrName: string, realm?: string): Promise<Client | null> {\n return this.find(idOrName, realm);\n }\n\n async findOneBy(where: Record<string, any>): Promise<Client | null> {\n return this.repository.findOneBy(where);\n }\n\n private async find(key: string, realmKey?: string) : Promise<Client | null> {\n const query = this.repository.createQueryBuilder('client')\n .leftJoinAndSelect('client.realm', 'realm');\n\n const isId = isUUID(key);\n if (isId) {\n query.where('client.id = :id', { id: key });\n } else {\n query.where('client.name = :name', { name: key });\n\n if (realmKey) {\n if (isUUID(realmKey)) {\n query.andWhere('client.realm_id = :realmId', { realmId: realmKey });\n } else {\n query.andWhere('realm.name = :realmName', { realmName: realmKey });\n }\n }\n }\n const { columns } = this.repository.metadata;\n for (const column of columns) {\n if (!column.isSelect) {\n query.addSelect(`client.${column.databaseName}`);\n }\n }\n\n if (isId) {\n query.cache(\n buildRedisKeyPath({\n prefix: CachePrefix.CLIENT,\n key,\n }),\n 60_000,\n );\n }\n\n return query.getOne();\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { buildRedisKeyPath } from '@authup/server-kit';\nimport { isUUID } from '@authup/kit';\nimport type { Robot } from '@authup/core-kit';\nimport type { IRobotIdentityRepository } from '../../../../core/index.ts';\nimport type { RobotRepository } from '../../../../adapters/database/domains/index.ts';\nimport { CachePrefix } from '../../../../adapters/database/domains/index.ts';\n\nexport class RobotIdentityRepository implements IRobotIdentityRepository {\n private readonly repository: RobotRepository;\n\n constructor(repository: RobotRepository) {\n this.repository = repository;\n }\n\n async findOneById(id: string): Promise<Robot | null> {\n return this.find(id);\n }\n\n async findOneByName(id: string, realm?: string): Promise<Robot | null> {\n return this.find(id, realm);\n }\n\n async findOneByIdOrName(idOrName: string, realm?: string): Promise<Robot | null> {\n return this.find(idOrName, realm);\n }\n\n async findOneBy(where: Record<string, any>): Promise<Robot | null> {\n return this.repository.findOneBy(where);\n }\n\n private async find(key: string, realmKey?: string) : Promise<Robot | null> {\n const query = this.repository.createQueryBuilder('robot')\n .leftJoinAndSelect('robot.realm', 'realm');\n\n const isId = isUUID(key);\n if (isId) {\n query.where('robot.id = :id', { id: key });\n } else {\n query.where('robot.name = :name', { name: key });\n\n if (realmKey) {\n if (isUUID(realmKey)) {\n query.andWhere('robot.realm_id = :realmId', { realmId: realmKey });\n } else {\n query.andWhere('realm.name = :realmName', { realmName: realmKey });\n }\n }\n }\n\n const { columns } = this.repository.metadata;\n for (const column of columns) {\n if (!column.isSelect) {\n query.addSelect(`robot.${column.databaseName}`);\n }\n }\n\n if (isId) {\n query.cache(\n buildRedisKeyPath({\n prefix: CachePrefix.ROBOT,\n key,\n }),\n 60_000,\n );\n }\n\n return query.getOne();\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { User, UserPermission, UserRole } from '@authup/core-kit';\nimport { isUUID } from '@authup/kit';\nimport { buildRedisKeyPath } from '@authup/server-kit';\nimport type { Repository } from 'typeorm';\nimport { In } from 'typeorm';\nimport type { IUserIdentityRepository, IdentityProviderMapperElement } from '../../../../core/index.ts';\nimport { IdentityProviderMapperOperation } from '../../../../core/index.ts';\nimport type { UserRepository } from '../../../../adapters/database/domains/index.ts';\nimport { CachePrefix } from '../../../../adapters/database/domains/index.ts';\n\nexport type UserIdentityRepositoryContext = {\n repository: UserRepository,\n userPermissionRepository: Repository<UserPermission>,\n userRoleRepository: Repository<UserRole>,\n};\n\nexport class UserIdentityRepository implements IUserIdentityRepository {\n private readonly repository: UserRepository;\n\n private readonly userPermissionRepository: Repository<UserPermission>;\n\n private readonly userRoleRepository: Repository<UserRole>;\n\n constructor(ctx: UserIdentityRepositoryContext) {\n this.repository = ctx.repository;\n this.userPermissionRepository = ctx.userPermissionRepository;\n this.userRoleRepository = ctx.userRoleRepository;\n }\n\n async findOneById(id: string): Promise<User | null> {\n return this.find(id);\n }\n\n async findOneByName(id: string, realm?: string): Promise<User | null> {\n return this.find(id, realm);\n }\n\n async findOneByIdOrName(idOrName: string, realm?: string): Promise<User | null> {\n return this.find(idOrName, realm);\n }\n\n async findOneBy(where: Record<string, any>): Promise<User | null> {\n return this.repository.findOneBy(where);\n }\n\n private async find(key: string, realmKey?: string) : Promise<User | null> {\n const query = this.repository.createQueryBuilder('user')\n .leftJoinAndSelect('user.realm', 'realm');\n\n const isId = isUUID(key);\n if (isId) {\n query.where('user.id = :id', { id: key });\n } else {\n query.where('user.name = :name', { name: key });\n\n if (realmKey) {\n if (isUUID(realmKey)) {\n query.andWhere('user.realm_id = :realmId', { realmId: realmKey });\n } else {\n query.andWhere('realm.name = :realmName', { realmName: realmKey });\n }\n }\n }\n\n const { columns } = this.repository.metadata;\n for (const column of columns) {\n if (!column.isSelect) {\n query.addSelect(`user.${column.databaseName}`);\n }\n }\n\n if (isId) {\n query.cache(\n buildRedisKeyPath({\n prefix: CachePrefix.USER,\n key,\n }),\n 60_000,\n );\n }\n\n const entity = await query.getOne();\n if (entity) {\n return this.repository.extendOneWithEA(entity);\n }\n\n return null;\n }\n\n async saveOneWithEA(user: Partial<User>, extraAttributes: Record<string, any>): Promise<User> {\n const entity = this.repository.create(user);\n return this.repository.saveOneWithEA(entity, extraAttributes);\n }\n\n async savePermissions(user: User, items: IdentityProviderMapperElement[]): Promise<void> {\n const { userPermissionRepository: repository } = this;\n\n const ids = items.map((item) => item.value);\n\n const idsToDelete = items\n .filter((item) => item.operation === IdentityProviderMapperOperation.DELETE)\n .map((item) => item.value);\n\n const entities = await repository.findBy({\n user_id: user.id,\n permission_id: In(ids),\n });\n\n const entitiesToDelete : UserPermission[] = [];\n for (const entity of entities) {\n const index = idsToDelete.indexOf(entity.permission_id);\n if (index === -1) {\n continue;\n }\n\n entitiesToDelete.push(entity);\n }\n\n if (entitiesToDelete.length > 0) {\n await repository.remove(entitiesToDelete);\n }\n\n const entitiesToCreate : UserPermission[] = [];\n for (const item of items) {\n if (item.operation !== IdentityProviderMapperOperation.CREATE) {\n continue;\n }\n\n const index = entities.findIndex(\n (entity) => entity.permission_id === item.value,\n );\n if (index !== -1) {\n continue;\n }\n\n const entity = repository.create({\n user_id: user.id,\n user_realm_id: user.realm_id,\n permission_id: item.value as string,\n permission_realm_id: item.realmId as string,\n });\n\n entitiesToCreate.push(entity);\n }\n\n if (entitiesToCreate.length > 0) {\n await repository.save(entitiesToCreate);\n }\n }\n\n async saveRoles(user: User, items: IdentityProviderMapperElement[]): Promise<void> {\n const { userRoleRepository: repository } = this;\n\n const ids = items.map((item) => item.value);\n\n const idsToDelete = items\n .filter((item) => item.operation === IdentityProviderMapperOperation.DELETE)\n .map((item) => item.value);\n\n const entities = await repository.findBy({\n user_id: user.id,\n role_id: In(ids),\n });\n\n const entitiesToDelete : UserRole[] = [];\n for (const entity of entities) {\n const index = idsToDelete.indexOf(entity.role_id);\n if (index === -1) {\n continue;\n }\n\n entitiesToDelete.push(entity);\n }\n\n if (entitiesToDelete.length > 0) {\n await repository.remove(entitiesToDelete);\n }\n\n const entitiesToCreate : UserRole[] = [];\n for (const item of items) {\n if (item.operation !== IdentityProviderMapperOperation.CREATE) {\n continue;\n }\n\n const index = entities.findIndex((entity) => entity.role_id === item.value);\n if (index !== -1) {\n continue;\n }\n\n const entity = repository.create({\n user_id: user.id,\n user_realm_id: user.realm_id,\n role_id: item.value as string,\n role_realm_id: item.realmId as string,\n });\n\n entitiesToCreate.push(entity);\n }\n\n if (entitiesToCreate.length > 0) {\n await repository.save(entitiesToCreate);\n }\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { TypedToken } from 'eldin';\nimport type { ILdapClientFactory } from '../../../core/index.ts';\n\nexport const LDAPInjectionKey = { ClientFactory: new TypedToken<ILdapClientFactory>('ClientFactory') } as const;\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Change, Client, SearchOptions } from 'ldapjs';\nimport ldap from 'ldapjs';\nimport type { ILdapClient } from '../../../core/index.ts';\nimport type { LdapClientOptions } from './types.ts';\n\nexport class LdapClient implements ILdapClient {\n protected options : LdapClientOptions;\n\n protected driver : Client;\n\n constructor(options: LdapClientOptions) {\n this.options = options;\n this.driver = ldap.createClient({\n url: options.url,\n tlsOptions: options.tls,\n connectTimeout: 3000,\n });\n }\n\n async connect() : Promise<void> {\n return new Promise<void>((resolve, reject) => {\n const listener = () => {\n if (this.options.startTLS) {\n this.driver.starttls(\n this.options.tls || {},\n null,\n (err) => {\n if (err) {\n reject(err);\n return;\n }\n\n resolve();\n },\n );\n } else {\n resolve();\n }\n };\n\n if (this.driver.connected) {\n listener();\n return;\n }\n\n const errorListener = (error?: Error | null) => {\n if (error) {\n reject(error);\n }\n\n resolve();\n };\n\n this.driver.connect();\n this.driver.once('connect', listener);\n this.driver.once('timeout', errorListener);\n this.driver.once('connectTimeout', errorListener);\n this.driver.once('error', errorListener);\n this.driver.once('connectError', errorListener);\n });\n }\n\n get connected() : boolean {\n return this.driver.connected;\n }\n\n public async bind(user?: string, password?: string) : Promise<void> {\n return new Promise<void>((resolve, reject) => {\n this.connect()\n .then(() => {\n if (!user) {\n user = this.options.user;\n password = this.options.password;\n }\n\n if (!user) {\n reject(new Error('User name not defined.'));\n return;\n }\n\n if (!password) {\n reject(new Error('User password not defined.'));\n return;\n }\n\n this.driver.bind(user, password, (err) => {\n if (err) {\n reject(err);\n return;\n }\n\n resolve();\n });\n })\n .catch((e) => reject(e));\n });\n }\n\n async unbind() : Promise<void> {\n return new Promise<void>((resolve, reject) => {\n this.driver.unbind((err) => {\n if (err) {\n reject(err);\n return;\n }\n\n resolve();\n });\n });\n }\n\n async add(name: string, data: Record<string, any>) {\n return new Promise<void>((resolve, reject) => {\n this.driver.add(name, data, (err) => {\n if (err) {\n reject(err);\n return;\n }\n\n resolve();\n });\n });\n }\n\n async del(name: string) : Promise<void> {\n return new Promise<void>((resolve, reject) => {\n this.driver.del(name, (err) => {\n if (err) {\n reject(err);\n return;\n }\n\n resolve();\n });\n });\n }\n\n async modify(name: string, change: Change | Change[]) : Promise<void> {\n return new Promise<void>((resolve, reject) => {\n this.driver.modify(name, change, (err) => {\n if (err) {\n reject(err);\n return;\n }\n\n resolve();\n });\n });\n }\n\n async search(options: SearchOptions, dn?: string) : Promise<Record<string, any>[]> {\n return new Promise((resolve, reject) => {\n this.driver.search(\n this.resolveDn(dn, this.options.baseDn),\n {\n scope: 'sub',\n ...options,\n },\n (err, res) => {\n if (err) {\n reject(err);\n return;\n }\n\n const entries : Record<string, any>[] = [];\n\n res.on('searchEntry', (searchEntry) => {\n const entry : Record<string, any> = { dn: searchEntry.pojo.objectName };\n\n for (let i = 0; i < searchEntry.attributes.length; i++) {\n const attribute = searchEntry.attributes[i];\n\n entry[attribute.type] = Array.isArray(attribute.values) ?\n attribute.values.map((el: string) => el.trim()).filter(Boolean) :\n attribute.values;\n }\n\n entries.push(entry);\n });\n\n res.on('error', (err) => {\n reject(err);\n });\n\n res.on('end', (searchResult) => {\n if (!searchResult || searchResult.status !== 0) {\n reject(new Error('The ldap search was not successfully'));\n } else {\n resolve(entries);\n }\n });\n },\n );\n });\n }\n\n resolveDn(...input: unknown[]) : string {\n let output : string | undefined;\n\n for (let i = 0; i <= input.length; i++) {\n const el = input[i];\n if (typeof el !== 'string') {\n continue;\n }\n\n if (!output) {\n output = el;\n continue;\n }\n\n const dn = ldap.parseDN(output);\n if (dn.childOf(el) || dn.equals(el)) {\n continue;\n }\n\n output += `,${input[i]}`;\n }\n\n if (!output) {\n throw new SyntaxError('Dn could not be resolved.');\n }\n\n return output;\n }\n\n isDn(input: string | ldap.DN) : boolean {\n try {\n if (typeof input !== 'string') {\n return ldap.DN.isDN(input);\n }\n\n if (typeof (ldap.DN as Record<string, any>).fromString === 'function') {\n const dn = (ldap.DN as Record<string, any>).fromString(input);\n return typeof dn !== 'undefined';\n }\n\n return /^(?:(?:(?:[a-zA-Z0-9]+(?:[-._][a-zA-Z0-9]+)*)=(?:[\\s]*[^,+\\n=]+[\\s]*)*)(?:[,][\\s]*)?)+$/.test(input);\n } catch {\n return false;\n }\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { ILdapClient, ILdapClientFactory } from '../../../core/index.ts';\nimport { LdapClient } from './module.ts';\nimport type { LdapClientOptions } from './types.ts';\n\nexport class LdapClientFactory implements ILdapClientFactory {\n create(options: LdapClientOptions): ILdapClient {\n return new LdapClient(options);\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { LdapClientFactory } from '../../../adapters/shared/ldap/index.ts';\nimport type { IModule } from 'orkos';\nimport { ModuleName } from '../constants.ts';\nimport { LDAPInjectionKey } from './constants.ts';\nimport type { IContainer } from 'eldin';\n\nexport class LdapModule implements IModule {\n readonly name: string;\n\n constructor() {\n this.name = ModuleName.LDAP;\n }\n\n async setup(container: IContainer): Promise<void> {\n container.register(LDAPInjectionKey.ClientFactory, { useFactory: () => new LdapClientFactory() });\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Realm, UserPermission, UserRole } from '@authup/core-kit';\nimport type { Repository } from 'typeorm';\nimport {\n ClientIdentityRepository,\n IdentityProviderAccountRepository,\n IdentityProviderAttributeMappingRepository,\n IdentityProviderPermissionMappingRepository,\n IdentityProviderRoleMappingRepository,\n RobotIdentityRepository,\n UserIdentityRepository,\n} from './repositories/index.ts';\nimport { DatabaseInjectionKey, IdentityProviderRepositoryAdapter } from '../database/index.ts';\nimport {\n ClientRepository,\n IdentityProviderRepository,\n RealmEntity,\n RobotRepository,\n UserPermissionEntity,\n UserRepository,\n UserRoleEntity,\n} from '../../../adapters/database/domains/index.ts';\nimport type { IContainer } from 'eldin';\nimport {\n IdentityProviderAccountManager,\n IdentityProviderAttributeMapper,\n IdentityProviderLdapCollectionAuthenticator,\n IdentityProviderPermissionMapper,\n IdentityProviderRoleMapper,\n IdentityResolver,\n} from '../../../core/index.ts';\nimport { LDAPInjectionKey } from '../ldap/index.ts';\n\nimport type { IModule } from 'orkos';\nimport { ModuleName } from '../constants.ts';\nimport { IdentityInjectionKey } from './constants.ts';\n\nexport class IdentityModule implements IModule {\n readonly name: string;\n\n readonly dependencies: string[];\n\n constructor() {\n this.name = ModuleName.IDENTITY;\n this.dependencies = [ModuleName.DATABASE];\n }\n\n async setup(container: IContainer): Promise<void> {\n const dataSource = container.resolve(DatabaseInjectionKey.DataSource);\n\n const clientRepository = new ClientIdentityRepository(\n new ClientRepository(dataSource),\n );\n const robotRepository = new RobotIdentityRepository(\n new RobotRepository(dataSource),\n );\n const userRepository = new UserIdentityRepository({\n repository: new UserRepository(dataSource),\n userPermissionRepository: container.resolve<Repository<UserPermission>>(UserPermissionEntity),\n userRoleRepository: container.resolve<Repository<UserRole>>(UserRoleEntity),\n });\n\n container.register(IdentityInjectionKey.Resolver, {\n useFactory: () => new IdentityResolver({\n clientRepository,\n robotRepository,\n userRepository,\n }),\n });\n\n // ---------------------------------------------\n\n const attributeMapperRepository = new IdentityProviderAttributeMappingRepository();\n const attributeMapper = new IdentityProviderAttributeMapper(attributeMapperRepository);\n\n const roleMapperFinder = new IdentityProviderRoleMappingRepository();\n const roleMapper = new IdentityProviderRoleMapper(roleMapperFinder);\n\n const permissionMapperRepository = new IdentityProviderPermissionMappingRepository();\n const permissionMapper = new IdentityProviderPermissionMapper(permissionMapperRepository);\n\n const providerAccountRepository = new IdentityProviderAccountRepository();\n\n container.register(IdentityInjectionKey.ProviderAccountManager, {\n useFactory: () => new IdentityProviderAccountManager({\n repository: providerAccountRepository,\n userRepository,\n attributeMapper,\n roleMapper,\n permissionMapper,\n }),\n });\n\n // ---------------------------------------------\n\n const identityProviderRepository = new IdentityProviderRepositoryAdapter({\n repository: new IdentityProviderRepository(dataSource),\n realmRepository: container.resolve<Repository<Realm>>(RealmEntity),\n });\n container.register(IdentityInjectionKey.ProviderLdapCollectionAuthenticator, {\n useFactory: (c) => new IdentityProviderLdapCollectionAuthenticator({\n repository: identityProviderRepository,\n accountManager: c.resolve(IdentityInjectionKey.ProviderAccountManager),\n clientFactory: c.resolve(LDAPInjectionKey.ClientFactory),\n }),\n });\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Repository } from 'typeorm';\nimport { CacheInjectionKey } from '../cache/index.ts';\nimport type { IContainer } from 'eldin';\nimport type { IModule } from 'orkos';\nimport { ModuleName } from '../constants.ts';\n\nimport {\n OAuth2AuthorizationCodeRepository,\n OAuth2AuthorizationStateRepository,\n OAuth2ClientRepository,\n OAuth2KeyRepository,\n OAuth2ScopeRepository, \n OAuth2TokenRepository,\n} from './repositories/index.ts';\nimport {\n OAuth2AccessTokenIssuer,\n OAuth2AuthorizationCodeIssuer,\n OAuth2AuthorizationCodeRequestVerifier,\n OAuth2AuthorizationCodeVerifier,\n OAuth2AuthorizationStateManager,\n OAuth2OpenIDTokenIssuer,\n OAuth2RefreshTokenIssuer,\n OAuth2TokenRevoker,\n OAuth2TokenSigner,\n OAuth2TokenVerifier,\n} from '../../../core/index.ts';\nimport { OAuth2InjectionToken } from './constants.ts';\nimport { IdentityInjectionKey } from '../identity/index.ts';\nimport { ClientEntity, ClientScopeEntity } from '../../../adapters/database/domains/index.ts';\nimport { ConfigInjectionKey } from '../config/index.ts';\n\nexport class OAuth2Module implements IModule {\n readonly name: string;\n\n readonly dependencies: string[];\n\n constructor() {\n this.name = ModuleName.OAUTH2;\n this.dependencies = [ModuleName.DATABASE, ModuleName.CACHE, ModuleName.CONFIG, ModuleName.IDENTITY];\n }\n\n async setup(container: IContainer) : Promise<void> {\n const config = container.resolve(ConfigInjectionKey);\n\n container.register(OAuth2InjectionToken.ClientRepository, {\n useFactory: (c) => {\n const repository = c.resolve<Repository<ClientEntity>>(ClientEntity);\n return new OAuth2ClientRepository(repository);\n },\n });\n\n container.register(OAuth2InjectionToken.ScopeRepository, {\n useFactory: (c) => {\n const repository = c.resolve<Repository<ClientScopeEntity>>(ClientScopeEntity);\n return new OAuth2ScopeRepository(repository);\n },\n });\n\n container.register(OAuth2InjectionToken.AuthorizationCodeRepository, {\n useFactory: (c) => {\n const cache = c.resolve(CacheInjectionKey);\n return new OAuth2AuthorizationCodeRepository(cache);\n },\n });\n\n container.register(OAuth2InjectionToken.AuthorizationStateRepository, {\n useFactory: (c) => {\n const cache = c.resolve(CacheInjectionKey);\n return new OAuth2AuthorizationStateRepository(cache);\n },\n });\n\n container.register(OAuth2InjectionToken.TokenRepository, {\n useFactory: (c) => {\n const cache = c.resolve(CacheInjectionKey);\n return new OAuth2TokenRepository(cache);\n },\n });\n\n container.register(OAuth2InjectionToken.KeyRepository, {\n // todo: cache use here\n useFactory: () => new OAuth2KeyRepository(),\n });\n\n container.register(OAuth2InjectionToken.TokenSigner, {\n useFactory: (c) => {\n const keyRepository = c.resolve(OAuth2InjectionToken.KeyRepository);\n return new OAuth2TokenSigner(keyRepository);\n },\n });\n\n // authorization code issuer\n container.register(OAuth2InjectionToken.AuthorizationCodeIssuer, {\n useFactory: (c) => {\n const codeRepository = c.resolve(OAuth2InjectionToken.AuthorizationCodeRepository);\n\n return new OAuth2AuthorizationCodeIssuer(\n codeRepository,\n {\n // todo: own constant here\n maxAge: config.tokenAccessMaxAge,\n },\n );\n },\n });\n container.register(OAuth2InjectionToken.AuthorizationCodeVerifier, {\n useFactory: (c) => {\n const codeRepository = c.resolve(OAuth2InjectionToken.AuthorizationCodeRepository);\n\n return new OAuth2AuthorizationCodeVerifier(codeRepository);\n },\n });\n\n // authorization code request verifier\n container.register(OAuth2InjectionToken.AuthorizationCodeRequestVerifier, {\n useFactory: (c) => {\n const clientRepository = c.resolve(OAuth2InjectionToken.ClientRepository);\n const clientScopeRepository = c.resolve(OAuth2InjectionToken.ScopeRepository);\n\n return new OAuth2AuthorizationCodeRequestVerifier({\n clientRepository,\n scopeRepository: clientScopeRepository,\n });\n },\n });\n\n container.register(OAuth2InjectionToken.AuthorizationStateManager, {\n useFactory: (c) => {\n const stateRepository = c.resolve(OAuth2InjectionToken.AuthorizationStateRepository);\n\n return new OAuth2AuthorizationStateManager(stateRepository);\n },\n });\n\n // token revoker\n container.register(OAuth2InjectionToken.TokenRevoker, {\n useFactory: (c) => {\n const tokenRepository = c.resolve(OAuth2InjectionToken.TokenRepository);\n return new OAuth2TokenRevoker(tokenRepository);\n },\n });\n\n // token verifier\n container.register(OAuth2InjectionToken.TokenVerifier, {\n useFactory: (c) => {\n const keyRepository = c.resolve(OAuth2InjectionToken.KeyRepository);\n const tokenRepository = c.resolve(OAuth2InjectionToken.TokenRepository);\n\n return new OAuth2TokenVerifier(keyRepository, tokenRepository);\n },\n });\n\n // access token issuer\n container.register(OAuth2InjectionToken.AccessTokenIssuer, {\n useFactory: (c) => {\n const tokenRepository = c.resolve(OAuth2InjectionToken.TokenRepository);\n const tokenSigner = c.resolve(OAuth2InjectionToken.TokenSigner);\n return new OAuth2AccessTokenIssuer(\n tokenRepository,\n tokenSigner,\n {\n maxAge: config.tokenAccessMaxAge,\n issuer: config.publicUrl,\n },\n );\n },\n });\n\n // refresh token issuer\n container.register(OAuth2InjectionToken.RefreshTokenIssuer, {\n useFactory: (c) => {\n const tokenRepository = c.resolve(OAuth2InjectionToken.TokenRepository);\n const tokenSigner = c.resolve(OAuth2InjectionToken.TokenSigner);\n\n return new OAuth2RefreshTokenIssuer(\n tokenRepository,\n tokenSigner,\n {\n maxAge: config.tokenRefreshMaxAge,\n issuer: config.publicUrl,\n },\n );\n },\n });\n\n // open-id token issuer\n container.register(OAuth2InjectionToken.OpenIDTokenIssuer, {\n useFactory: (c) => {\n const repository = c.resolve(OAuth2InjectionToken.TokenRepository);\n const signer = c.resolve(OAuth2InjectionToken.TokenSigner);\n const identityResolver = c.resolve(IdentityInjectionKey.Resolver);\n\n return new OAuth2OpenIDTokenIssuer({\n repository,\n signer,\n\n identityResolver,\n\n options: {\n // todo: own constant here\n maxAge: config.tokenAccessMaxAge,\n issuer: config.publicUrl,\n },\n });\n },\n });\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { TypedToken } from 'eldin';\nimport type { IMailClient } from '../../../core/index.ts';\n\nexport const MailInjectionKey = new TypedToken<IMailClient>('Mail');\n","/*\n * Copyright (c) 2022-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { createTransport } from 'nodemailer';\nimport type { SMTPClient, SMTPOptions } from './types.ts';\n\nexport function createSMTPClient(options?: SMTPOptions | string) : SMTPClient {\n let transport : SMTPClient;\n\n options = options || {};\n\n if (typeof options === 'string') {\n transport = createTransport(options);\n } else if (options.connectionString) {\n transport = createTransport(options.connectionString);\n } else {\n let auth: Record<string, any> | undefined;\n if (options.user && options.password) {\n auth = {\n type: 'login',\n user: options.user,\n pass: options.password,\n };\n }\n\n transport = createTransport({\n host: options.host,\n port: options.port,\n auth,\n secure: options.ssl,\n opportunisticTLS: options.starttls,\n tls: { rejectUnauthorized: false },\n });\n }\n\n return transport;\n}\n","/*\n * Copyright (c) 2025-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Transporter } from 'nodemailer';\nimport type { IMailClient, MailSendOptions } from '../../../../../core/index.ts';\nimport { createSMTPClient } from './module.ts';\nimport type { SMTPOptions } from './types.ts';\n\nexport class SMTPMailClientAdapter implements IMailClient {\n protected transporter : Transporter;\n\n constructor(input: string | boolean | SMTPOptions) {\n this.transporter = this.createDriver(input);\n }\n\n protected createDriver(input: string | boolean | SMTPOptions) : Transporter {\n if (typeof input === 'boolean') {\n return createSMTPClient();\n }\n\n if (typeof input === 'string') {\n return createSMTPClient({ connectionString: input });\n }\n\n return createSMTPClient(input);\n }\n\n async send(options: MailSendOptions): Promise<any> {\n return this.transporter.sendMail(options);\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { IMailClient, MailSendOptions } from '../../../../core/index.ts';\n\nexport class VoidMailClientAdapter implements IMailClient {\n send(_options: MailSendOptions): Promise<void> {\n return Promise.resolve(undefined);\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { IModule } from 'orkos';\nimport { ModuleName } from '../constants.ts';\nimport { SMTPMailClientAdapter, VoidMailClientAdapter } from './adapter/index.ts';\nimport { MailInjectionKey } from './constants.ts';\nimport { ConfigInjectionKey } from '../config/index.ts';\nimport type { IContainer } from 'eldin';\n\nexport class MailModule implements IModule {\n readonly name: string;\n\n readonly dependencies: string[];\n\n constructor() {\n this.name = ModuleName.MAIL;\n this.dependencies = [ModuleName.CONFIG];\n }\n\n async setup(container: IContainer): Promise<void> {\n const result = container.tryResolve(ConfigInjectionKey);\n if (!result.success || !result.data.smtp) {\n container.register(MailInjectionKey, { useFactory: () => new VoidMailClientAdapter() });\n\n return;\n }\n\n container.register(MailInjectionKey, { useFactory: () => new SMTPMailClientAdapter(result.data.smtp) });\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Router } from 'routup';\nimport { decorators } from '@routup/decorators';\nimport { useRequestBody } from '@routup/basic/body';\nimport { useRequestCookie, useRequestCookies } from '@routup/basic/cookie';\nimport { useRequestQuery } from '@routup/basic/query';\nimport type {\n Client,\n ClientPermission,\n ClientRole,\n ClientScope,\n Permission,\n PermissionPolicy,\n Realm,\n Robot,\n RobotPermission,\n RobotRole,\n Role,\n RoleAttribute,\n RolePermission,\n Scope,\n UserAttribute,\n UserPermission,\n UserRole,\n} from '@authup/core-kit';\nimport type { Repository } from 'typeorm';\nimport {\n ClientEntity,\n ClientPermissionEntity,\n ClientRepository,\n ClientRoleEntity,\n ClientScopeEntity,\n IdentityProviderRepository,\n IdentityProviderRoleMappingEntity,\n KeyEntity,\n PermissionEntity,\n PermissionPolicyEntity,\n PolicyRepository,\n RealmEntity,\n RobotEntity,\n RobotPermissionEntity,\n RobotRepository,\n RobotRoleEntity,\n RoleAttributeEntity,\n RoleEntity,\n RolePermissionEntity,\n RoleRepository,\n ScopeEntity,\n UserAttributeEntity,\n UserPermissionEntity,\n UserRepository,\n UserRoleEntity,\n} from '../../../../adapters/database/domains/index.ts';\nimport {\n ClientPermissionRepositoryAdapter,\n ClientRepositoryAdapter,\n ClientRoleRepositoryAdapter,\n ClientScopeRepositoryAdapter,\n DatabaseInjectionKey,\n IdentityProviderRepositoryAdapter,\n IdentityProviderRoleMappingRepositoryAdapter,\n PermissionDatabaseProvider,\n PermissionPolicyRepositoryAdapter,\n PermissionRepositoryAdapter,\n PolicyRepositoryAdapter,\n RealmRepositoryAdapter,\n RobotPermissionRepositoryAdapter,\n RobotRepositoryAdapter,\n RobotRoleRepositoryAdapter,\n RoleAttributeRepositoryAdapter,\n RolePermissionRepositoryAdapter,\n RoleRepositoryAdapter,\n ScopeRepositoryAdapter,\n UserAttributeRepositoryAdapter,\n UserPermissionRepositoryAdapter,\n UserRepositoryAdapter,\n UserRoleRepositoryAdapter,\n} from '../../database/index.ts';\nimport {\n ClientController,\n ClientPermissionController,\n ClientRoleController,\n ClientScopeController, \n IdentityProviderController,\n OAuth2ProviderRoleController,\n PermissionController,\n PermissionPolicyController,\n PolicyController,\n RealmController,\n RobotController,\n RobotPermissionController,\n RobotRoleController,\n RoleAttributeController,\n RoleController,\n RolePermissionController,\n ScopeController,\n UserAttributeController,\n UserController,\n UserPermissionController,\n UserRoleController,\n} from '../../../../adapters/http/index.ts';\nimport {\n ActivateController,\n AuthorizeController,\n JwkController,\n OpenIDController,\n PasswordForgotController,\n PasswordResetController,\n RegisterController,\n StatusController,\n TokenController,\n} from '../../../../adapters/http/controllers/index.ts';\nimport type { IContainer } from 'eldin';\nimport {\n ClientAuthenticator,\n ClientPermissionService,\n ClientRoleService,\n ClientScopeService,\n ClientService,\n CredentialsAuthenticator,\n IdentityPermissionProvider,\n PasswordRecoveryService,\n PermissionPolicyService,\n PermissionService,\n PolicyService,\n RealmService,\n RegistrationService,\n RobotAuthenticator,\n RobotPermissionService,\n RobotRoleService,\n RobotService,\n RoleAttributeService,\n RolePermissionService,\n RoleService,\n ScopeService,\n UserAttributeService,\n UserAuthenticator,\n UserPermissionService,\n UserRoleService, \n UserService, \n} from '../../../../core/index.ts';\nimport { AuthenticationInjectionKey } from '../../authentication/index.ts';\nimport { OAuth2InjectionToken } from '../../oauth2/index.ts';\nimport { IdentityInjectionKey } from '../../identity/index.ts';\nimport { ConfigInjectionKey } from '../../config/index.ts';\nimport { MailInjectionKey } from '../../mail/index.ts';\n\nexport class HTTPControllerModule {\n async mount(router: Router, container: IContainer): Promise<void> {\n const realmController = this.createRealmController(container);\n const roleController = this.createRoleController(container);\n const permissionController = await this.createPermissionController(container);\n const permissionPolicyController = this.createPermissionPolicyController(container);\n const clientController = this.createClientController(container);\n const robotController = this.createRobotController(container);\n const clientPermissionController = this.createClientPermissionController(container);\n const clientRoleController = this.createClientRoleController(container);\n const clientScopeController = this.createClientScopeController(container);\n const robotPermissionController = this.createRobotPermissionController(container);\n const robotRoleController = this.createRobotRoleController(container);\n const roleAttributeController = this.createRoleAttributeController(container);\n const rolePermissionController = this.createRolePermissionController(container);\n const scopeController = this.createScopeController(container);\n const userController = this.createUserController(container);\n const userAttributeController = this.createUserAttributeController(container);\n const userPermissionController = this.createUserPermissionController(container);\n const userRoleController = this.createUserRoleController(container);\n const policyController = this.createPolicyController(container);\n const identityProviderRoleController = this.createIdentityProviderRoleController(container);\n\n router.use(decorators({\n controllers: [\n this.createAuthorize(container),\n this.createToken(container),\n this.createJwkController(container),\n this.createOpenIDController(container),\n this.createActivateController(container),\n this.createPasswordForgotController(container),\n this.createPasswordResetController(container),\n this.createRegisterController(container),\n\n StatusController,\n\n clientController,\n clientPermissionController,\n clientRoleController,\n clientScopeController,\n identityProviderRoleController,\n this.createIdentityProvider(container),\n permissionController,\n permissionPolicyController,\n policyController,\n robotController,\n robotPermissionController,\n robotRoleController,\n realmController,\n roleController,\n roleAttributeController,\n rolePermissionController,\n scopeController,\n userController,\n userAttributeController,\n userPermissionController,\n userRoleController,\n ],\n parameter: {\n body: (context, name) => {\n if (name) {\n return useRequestBody(context.request, name);\n }\n\n return useRequestBody(context.request);\n },\n cookie: (context, name) => {\n if (name) {\n return useRequestCookie(context.request, name);\n }\n\n return useRequestCookies(context.request);\n },\n query: (context, name) => {\n if (name) {\n return useRequestQuery(context.request, name);\n }\n\n return useRequestQuery(context.request);\n },\n },\n }));\n }\n\n // ----------------------------------------------------\n\n createIdentityPermissionProvider(container: IContainer) {\n const dataSource = container.resolve(DatabaseInjectionKey.DataSource);\n return new IdentityPermissionProvider({\n clientRepository: new ClientRepository(dataSource),\n userRepository: new UserRepository(dataSource),\n robotRepository: new RobotRepository(dataSource),\n roleRepository: new RoleRepository(dataSource),\n });\n }\n\n createAuthorize(container: IContainer) {\n const config = container.resolve(ConfigInjectionKey);\n const accessTokenIssuer = container.resolve(OAuth2InjectionToken.AccessTokenIssuer);\n const openIdTokenIssuer = container.resolve(OAuth2InjectionToken.OpenIDTokenIssuer);\n\n const codeIssuer = container.resolve(OAuth2InjectionToken.AuthorizationCodeIssuer);\n const codeRequestVerifier = container.resolve(OAuth2InjectionToken.AuthorizationCodeRequestVerifier);\n\n const identityResolver = container.resolve(IdentityInjectionKey.Resolver);\n\n return new AuthorizeController({\n options: { baseURL: config.publicUrl },\n\n accessTokenIssuer,\n openIdTokenIssuer,\n\n codeIssuer,\n codeRequestVerifier,\n\n identityResolver,\n });\n }\n\n createToken(container: IContainer) {\n const sessionManager = container.resolve(AuthenticationInjectionKey.SessionManager);\n\n const codeVerifier = container.resolve(OAuth2InjectionToken.AuthorizationCodeVerifier);\n\n const accessTokenIssuer = container.resolve(OAuth2InjectionToken.AccessTokenIssuer);\n const refreshTokenIssuer = container.resolve(OAuth2InjectionToken.RefreshTokenIssuer);\n\n const tokenRevoker = container.resolve(OAuth2InjectionToken.TokenRevoker);\n const tokenVerifier = container.resolve(OAuth2InjectionToken.TokenVerifier);\n\n const identityResolver = container.resolve(IdentityInjectionKey.Resolver);\n const identityProviderLdapCollectionAuthenticator = container.resolve(IdentityInjectionKey.ProviderLdapCollectionAuthenticator);\n\n const identityPermissionProvider = this.createIdentityPermissionProvider(container);\n\n const clientAuthenticator = new ClientAuthenticator(identityResolver);\n const robotAuthenticator = new RobotAuthenticator(identityResolver);\n\n const userAuthenticator = new CredentialsAuthenticator([\n identityProviderLdapCollectionAuthenticator,\n new UserAuthenticator(identityResolver),\n ]);\n\n return new TokenController({\n codeVerifier,\n\n accessTokenIssuer,\n refreshTokenIssuer,\n\n tokenVerifier,\n tokenRevoker,\n\n identityResolver,\n identityPermissionProvider,\n\n clientAuthenticator,\n robotAuthenticator,\n userAuthenticator,\n\n sessionManager,\n });\n }\n\n createOpenIDController(container: IContainer) {\n const config = container.resolve(ConfigInjectionKey);\n\n return new OpenIDController({ baseURL: config.publicUrl });\n }\n\n createActivateController(container: IContainer) {\n return new ActivateController({ service: this.createRegistrationService(container) });\n }\n\n createPasswordForgotController(container: IContainer) {\n return new PasswordForgotController({ service: this.createPasswordRecoveryService(container) });\n }\n\n createPasswordResetController(container: IContainer) {\n return new PasswordResetController({ service: this.createPasswordRecoveryService(container) });\n }\n\n createPasswordRecoveryService(container: IContainer) {\n const config = container.resolve(ConfigInjectionKey);\n const dataSource = container.resolve(DatabaseInjectionKey.DataSource);\n const realmRepository = container.resolve<Repository<Realm>>(RealmEntity);\n const repository = new UserRepositoryAdapter({\n repository: new UserRepository(dataSource),\n realmRepository,\n });\n const mailClient = container.resolve(MailInjectionKey);\n\n return new PasswordRecoveryService({\n mailClient,\n repository,\n realmRepository: new RealmRepositoryAdapter(realmRepository),\n options: {\n passwordRecoveryEnabled: config.passwordRecoveryEnabled,\n emailVerificationEnabled: config.emailVerificationEnabled,\n },\n });\n }\n\n createRegisterController(container: IContainer) {\n return new RegisterController({ service: this.createRegistrationService(container) });\n }\n\n createRegistrationService(container: IContainer) {\n const config = container.resolve(ConfigInjectionKey);\n const dataSource = container.resolve(DatabaseInjectionKey.DataSource);\n const realmRepository = container.resolve<Repository<Realm>>(RealmEntity);\n const repository = new UserRepositoryAdapter({\n repository: new UserRepository(dataSource),\n realmRepository,\n });\n const mailClient = container.resolve(MailInjectionKey);\n\n return new RegistrationService({\n mailClient,\n repository,\n realmRepository: new RealmRepositoryAdapter(realmRepository),\n options: {\n registrationEnabled: config.registrationEnabled,\n emailVerificationEnabled: config.emailVerificationEnabled,\n },\n });\n }\n\n createIdentityProvider(container: IContainer) {\n const config = container.resolve(ConfigInjectionKey);\n const dataSource = container.resolve(DatabaseInjectionKey.DataSource);\n\n const accountManager = container.resolve(IdentityInjectionKey.ProviderAccountManager);\n\n const codeIssuer = container.resolve(OAuth2InjectionToken.AuthorizationCodeIssuer);\n\n const codeRequestVerifier = container.resolve(OAuth2InjectionToken.AuthorizationCodeRequestVerifier);\n\n const stateManager = container.resolve(OAuth2InjectionToken.AuthorizationStateManager);\n\n const realmRepository = container.resolve<Repository<Realm>>(RealmEntity);\n\n const repository = new IdentityProviderRepositoryAdapter({\n repository: new IdentityProviderRepository(dataSource),\n realmRepository,\n });\n\n return new IdentityProviderController({\n options: { baseURL: config.publicUrl },\n\n repository,\n realmRepository: new RealmRepositoryAdapter(realmRepository),\n\n accountManager,\n\n codeIssuer,\n codeRequestVerifier,\n stateManager,\n });\n }\n\n createClientController(container: IContainer) {\n const realmRepository = container.resolve<Repository<Realm>>(RealmEntity);\n const repository = new ClientRepositoryAdapter({\n repository: container.resolve<Repository<Client>>(ClientEntity),\n realmRepository,\n });\n const realmRepositoryAdapter = new RealmRepositoryAdapter(realmRepository);\n const service = new ClientService({\n repository,\n realmRepository: realmRepositoryAdapter, \n });\n return new ClientController({\n service,\n repository, \n });\n }\n\n createRobotController(container: IContainer) {\n const dataSource = container.resolve(DatabaseInjectionKey.DataSource);\n const realmRepository = container.resolve<Repository<Realm>>(RealmEntity);\n const repository = new RobotRepositoryAdapter({\n repository: container.resolve<Repository<Robot>>(RobotEntity),\n realmRepository,\n });\n const realmRepositoryAdapter = new RealmRepositoryAdapter(realmRepository);\n const service = new RobotService({\n repository,\n realmRepository: realmRepositoryAdapter, \n });\n return new RobotController({\n service,\n repository,\n realmRepository: realmRepositoryAdapter,\n dataSource,\n });\n }\n\n async createPermissionController(container: IContainer) {\n const dataSource = container.resolve(DatabaseInjectionKey.DataSource);\n const realmRepository = container.resolve<Repository<Realm>>(RealmEntity);\n const repository = new PermissionRepositoryAdapter({\n repository: container.resolve<Repository<Permission>>(PermissionEntity),\n realmRepository,\n });\n\n const realmRepositoryAdapter = new RealmRepositoryAdapter(realmRepository);\n const roleRepository = new RoleRepositoryAdapter({\n repository: container.resolve<Repository<Role>>(RoleEntity),\n realmRepository,\n });\n const rolePermissionRepository = new RolePermissionRepositoryAdapter(\n container.resolve<Repository<RolePermission>>(RolePermissionEntity),\n );\n const policyRepository = new PolicyRepositoryAdapter({\n repository: new PolicyRepository(dataSource),\n realmRepository,\n });\n\n const permissionPolicyRepository = new PermissionPolicyRepositoryAdapter(\n container.resolve<Repository<PermissionPolicy>>(PermissionPolicyEntity),\n );\n\n const service = new PermissionService({\n repository,\n realmRepository: realmRepositoryAdapter,\n roleRepository,\n rolePermissionRepository,\n policyRepository,\n permissionPolicyRepository,\n });\n\n const identityPermissionProvider = this.createIdentityPermissionProvider(container);\n const permissionProvider = new PermissionDatabaseProvider(dataSource);\n\n return new PermissionController({\n service,\n repository,\n realmRepository: realmRepositoryAdapter,\n identityPermissionProvider,\n permissionProvider,\n });\n }\n\n createRoleController(container: IContainer) {\n const realmRepository = new RealmRepositoryAdapter(\n container.resolve<Repository<Realm>>(RealmEntity),\n );\n const repository = new RoleRepositoryAdapter({\n repository: container.resolve<Repository<Role>>(RoleEntity),\n realmRepository: container.resolve<Repository<Realm>>(RealmEntity),\n });\n const service = new RoleService({\n repository,\n realmRepository, \n });\n return new RoleController({ service });\n }\n\n createClientPermissionController(container: IContainer) {\n const repository = new ClientPermissionRepositoryAdapter(\n container.resolve<Repository<ClientPermission>>(ClientPermissionEntity),\n );\n const identityPermissionProvider = this.createIdentityPermissionProvider(container);\n const service = new ClientPermissionService({\n repository,\n identityPermissionProvider, \n });\n return new ClientPermissionController({ service });\n }\n\n createClientRoleController(container: IContainer) {\n const repository = new ClientRoleRepositoryAdapter(\n container.resolve<Repository<ClientRole>>(ClientRoleEntity),\n );\n const service = new ClientRoleService({ repository });\n const identityPermissionProvider = this.createIdentityPermissionProvider(container);\n return new ClientRoleController({\n service,\n repository,\n identityPermissionProvider, \n });\n }\n\n createClientScopeController(container: IContainer) {\n const repository = new ClientScopeRepositoryAdapter(\n container.resolve<Repository<ClientScope>>(ClientScopeEntity),\n );\n const service = new ClientScopeService({ repository });\n return new ClientScopeController({ service });\n }\n\n createRobotPermissionController(container: IContainer) {\n const repository = new RobotPermissionRepositoryAdapter(\n container.resolve<Repository<RobotPermission>>(RobotPermissionEntity),\n );\n const identityPermissionProvider = this.createIdentityPermissionProvider(container);\n const service = new RobotPermissionService({\n repository,\n identityPermissionProvider, \n });\n return new RobotPermissionController({ service });\n }\n\n createRobotRoleController(container: IContainer) {\n const repository = new RobotRoleRepositoryAdapter(\n container.resolve<Repository<RobotRole>>(RobotRoleEntity),\n );\n const service = new RobotRoleService({ repository });\n const identityPermissionProvider = this.createIdentityPermissionProvider(container);\n return new RobotRoleController({\n service,\n repository,\n identityPermissionProvider, \n });\n }\n\n createRoleAttributeController(container: IContainer) {\n const repository = new RoleAttributeRepositoryAdapter(\n container.resolve<Repository<RoleAttribute>>(RoleAttributeEntity),\n );\n const service = new RoleAttributeService({ repository });\n return new RoleAttributeController({ service });\n }\n\n createRolePermissionController(container: IContainer) {\n const repository = new RolePermissionRepositoryAdapter(\n container.resolve<Repository<RolePermission>>(RolePermissionEntity),\n );\n const identityPermissionProvider = this.createIdentityPermissionProvider(container);\n const service = new RolePermissionService({\n repository,\n identityPermissionProvider, \n });\n return new RolePermissionController({ service });\n }\n\n createPermissionPolicyController(container: IContainer) {\n const repository = new PermissionPolicyRepositoryAdapter(\n container.resolve<Repository<PermissionPolicy>>(PermissionPolicyEntity),\n );\n const service = new PermissionPolicyService({ repository });\n return new PermissionPolicyController({ service });\n }\n\n createScopeController(container: IContainer) {\n const realmRepository = new RealmRepositoryAdapter(\n container.resolve<Repository<Realm>>(RealmEntity),\n );\n const repository = new ScopeRepositoryAdapter({\n repository: container.resolve<Repository<Scope>>(ScopeEntity),\n realmRepository: container.resolve<Repository<Realm>>(RealmEntity),\n });\n const service = new ScopeService({\n repository,\n realmRepository, \n });\n return new ScopeController({ service });\n }\n\n createUserController(container: IContainer) {\n const dataSource = container.resolve(DatabaseInjectionKey.DataSource);\n const realmRepository = container.resolve<Repository<Realm>>(RealmEntity);\n const repository = new UserRepositoryAdapter({\n repository: new UserRepository(dataSource),\n realmRepository,\n });\n const realmRepositoryAdapter = new RealmRepositoryAdapter(realmRepository);\n const service = new UserService({\n repository,\n realmRepository: realmRepositoryAdapter, \n });\n return new UserController({ service });\n }\n\n createUserAttributeController(container: IContainer) {\n const repository = new UserAttributeRepositoryAdapter(\n container.resolve<Repository<UserAttribute>>(UserAttributeEntity),\n );\n const service = new UserAttributeService({ repository });\n return new UserAttributeController({ service });\n }\n\n createUserPermissionController(container: IContainer) {\n const repository = new UserPermissionRepositoryAdapter(\n container.resolve<Repository<UserPermission>>(UserPermissionEntity),\n );\n const identityPermissionProvider = this.createIdentityPermissionProvider(container);\n const service = new UserPermissionService({\n repository,\n identityPermissionProvider, \n });\n return new UserPermissionController({ service });\n }\n\n createUserRoleController(container: IContainer) {\n const repository = new UserRoleRepositoryAdapter(\n container.resolve<Repository<UserRole>>(UserRoleEntity),\n );\n const service = new UserRoleService({ repository });\n const identityPermissionProvider = this.createIdentityPermissionProvider(container);\n return new UserRoleController({\n service,\n repository,\n identityPermissionProvider, \n });\n }\n\n createPolicyController(container: IContainer) {\n const dataSource = container.resolve(DatabaseInjectionKey.DataSource);\n const realmRepository = container.resolve<Repository<Realm>>(RealmEntity);\n const repository = new PolicyRepositoryAdapter({\n repository: new PolicyRepository(dataSource),\n realmRepository,\n });\n const realmRepositoryAdapter = new RealmRepositoryAdapter(realmRepository);\n const service = new PolicyService({\n repository,\n realmRepository: realmRepositoryAdapter, \n });\n const identityPermissionProvider = this.createIdentityPermissionProvider(container);\n return new PolicyController({\n service,\n repository,\n realmRepository: realmRepositoryAdapter,\n identityPermissionProvider, \n });\n }\n\n createIdentityProviderRoleController(container: IContainer) {\n const repository = new IdentityProviderRoleMappingRepositoryAdapter(\n container.resolve<Repository<any>>(IdentityProviderRoleMappingEntity),\n );\n const identityPermissionProvider = this.createIdentityPermissionProvider(container);\n return new OAuth2ProviderRoleController({\n repository,\n identityPermissionProvider, \n });\n }\n\n createJwkController(container: IContainer) {\n const dataSource = container.resolve(DatabaseInjectionKey.DataSource);\n const repository = dataSource.getRepository(KeyEntity);\n return new JwkController({ repository });\n }\n\n createRealmController(container: IContainer) {\n const config = container.resolve(ConfigInjectionKey);\n const dataSource = container.resolve(DatabaseInjectionKey.DataSource);\n const repository = new RealmRepositoryAdapter(\n container.resolve<Repository<Realm>>(RealmEntity),\n );\n const service = new RealmService({ repository });\n const keyRepository = dataSource.getRepository(KeyEntity);\n\n return new RealmController({\n options: { baseURL: config.publicUrl },\n service,\n keyRepository,\n });\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Router } from 'routup';\nimport path from 'node:path';\nimport type { IContainer } from 'eldin';\nimport { IdentityPermissionProvider } from '../../../../core/index.ts';\nimport {\n createAuthorizationMiddleware,\n createLoggerMiddleware,\n createSwaggerMiddleware,\n registerAssetsMiddleware,\n registerBasicMiddleware,\n registerCorsMiddleware,\n registerErrorMiddleware,\n registerPrometheusMiddleware,\n registerRateLimitMiddleware,\n} from '../../../../adapters/http/index.ts';\nimport { DIST_PATH } from '../../../../path.ts';\nimport { AuthenticationInjectionKey } from '../../authentication/index.ts';\nimport { ConfigInjectionKey } from '../../config/index.ts';\nimport { IdentityInjectionKey } from '../../identity/index.ts';\nimport { OAuth2InjectionToken } from '../../oauth2/index.ts';\nimport { DatabaseInjectionKey, PermissionDatabaseProvider } from '../../database/index.ts';\nimport {\n ClientRepository,\n RobotRepository,\n RoleRepository,\n UserRepository,\n} from '../../../../adapters/database/domains/index.ts';\n\nexport class HTTPMiddlewareModule {\n async mountBefore(router: Router, container: IContainer): Promise<void> {\n await this.mountLogger(router, container);\n await this.mountCors(router, container);\n await this.mountAssets(router);\n await this.mountBasic(router);\n await this.mountPrometheus(router, container);\n await this.mountRateLimit(router, container);\n\n await this.mountSwagger(router, container);\n await this.mountAuthorization(router, container);\n }\n\n \n async mountAfter(router: Router, _container: IContainer): Promise<void> {\n registerErrorMiddleware(router);\n }\n\n // ----------------------------------------------------\n async mountCors(router: Router, container: IContainer): Promise<void> {\n const config = container.resolve(ConfigInjectionKey);\n\n if (!this.isEnabled(config.middlewareCors)) {\n return;\n }\n\n registerCorsMiddleware(router, this.transformBoolToEmptyObject(config.middlewareCors));\n }\n\n async mountLogger(router: Router, container: IContainer): Promise<void> {\n const config = container.resolve(ConfigInjectionKey);\n const middleware = createLoggerMiddleware({ env: config.env });\n\n router.use(middleware);\n }\n\n async mountAssets(router: Router): Promise<void> {\n await registerAssetsMiddleware(router);\n }\n\n async mountBasic(router: Router): Promise<void> {\n registerBasicMiddleware(router);\n }\n\n async mountPrometheus(router: Router, container: IContainer): Promise<void> {\n const config = container.resolve(ConfigInjectionKey);\n\n if (!this.isEnabled(config.middlewarePrometheus)) {\n return;\n }\n\n registerPrometheusMiddleware(router, this.transformBoolToEmptyObject(config.middlewarePrometheus));\n }\n\n async mountRateLimit(router: Router, container: IContainer): Promise<void> {\n const config = container.resolve(ConfigInjectionKey);\n\n if (!this.isEnabled(config.middlewareRateLimit)) {\n return;\n }\n\n registerRateLimitMiddleware(router, this.transformBoolToEmptyObject(config.middlewareRateLimit));\n }\n\n async mountSwagger(router: Router, container: IContainer): Promise<void> {\n const config = container.resolve(ConfigInjectionKey);\n if (!this.isEnabled(config.middlewareSwagger)) {\n return;\n }\n\n const middleware = await createSwaggerMiddleware({\n documentPath: path.join(DIST_PATH, 'swagger.json'),\n options: {\n baseURL: config.publicUrl,\n ...this.transformBoolToEmptyObject(config.middlewareSwagger),\n },\n });\n\n router.use('/docs', middleware);\n }\n\n async mountAuthorization(router: Router, container: IContainer): Promise<void> {\n const config = container.resolve(ConfigInjectionKey);\n\n // todo: no direct datasource access here.\n const dataSource = container.resolve(DatabaseInjectionKey.DataSource);\n\n const identityResolver = container.resolve(IdentityInjectionKey.Resolver);\n const sessionManager = container.resolve(AuthenticationInjectionKey.SessionManager);\n const oauth2TokenVerifier = container.resolve(OAuth2InjectionToken.TokenVerifier);\n\n const permissionProvider = new PermissionDatabaseProvider(dataSource);\n const identityPermissionProvider = new IdentityPermissionProvider({\n clientRepository: new ClientRepository(dataSource),\n userRepository: new UserRepository(dataSource),\n robotRepository: new RobotRepository(dataSource),\n roleRepository: new RoleRepository(dataSource),\n });\n\n const middleware = createAuthorizationMiddleware({\n identityResolver,\n identityPermissionProvider,\n permissionProvider,\n oauth2TokenVerifier,\n sessionManager,\n options: {\n clientAuthBasic: config.clientAuthBasic,\n robotAuthBasic: config.robotAuthBasic,\n userAuthBasic: config.userAuthBasic,\n },\n });\n\n router.use(middleware);\n }\n\n // ----------------------------------------------------\n\n private transformBoolToEmptyObject<T extends Record<string, any>>(\n input?: T | boolean,\n ) : T | undefined {\n if (typeof input === 'boolean') {\n return {} as T;\n }\n\n return input || {} as T;\n }\n\n private isEnabled<T>(input: T | boolean) {\n return typeof input !== 'boolean' || input === true;\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { Router } from 'routup';\nimport type { IServer } from '../../../adapters/http/index.ts';\nimport { createHttpServer } from '../../../adapters/http/index.ts';\nimport { ConfigInjectionKey } from '../config/index.ts';\nimport type { IModule } from 'orkos';\nimport { ModuleName } from '../constants.ts';\nimport { HTTPInjectionKey } from './constants.ts';\nimport type { IContainer } from 'eldin';\nimport { HTTPControllerModule, HTTPMiddlewareModule } from './modules/index.ts';\nimport { LoggerInjectionKey } from '../logger/index.ts';\n\nexport class HTTPModule implements IModule {\n readonly name: string;\n\n readonly dependencies: string[];\n\n protected instance : IServer | undefined;\n\n protected middleware : HTTPMiddlewareModule;\n\n protected controller : HTTPControllerModule;\n\n constructor() {\n this.name = ModuleName.HTTP;\n this.dependencies = [ModuleName.CONFIG, ModuleName.LOGGER, ModuleName.AUTHENTICATION, ModuleName.IDENTITY, ModuleName.OAUTH2];\n this.controller = new HTTPControllerModule();\n this.middleware = new HTTPMiddlewareModule();\n }\n\n // ----------------------------------------------------\n\n async setup(container: IContainer): Promise<void> {\n const config = container.resolve(ConfigInjectionKey);\n const logger = container.resolve(LoggerInjectionKey);\n\n logger.debug('Starting http server...');\n\n const router = new Router();\n\n await this.middleware.mountBefore(router, container);\n await this.controller.mount(router, container);\n await this.middleware.mountAfter(router, container);\n\n const server = createHttpServer({ router });\n\n await new Promise<void>((resolve, reject) => {\n const errorHandler = (err?: null | Error) => {\n reject(err);\n };\n\n server.once('error', errorHandler);\n server.once('listening', () => {\n server.removeListener('error', errorHandler);\n\n resolve();\n });\n\n server.listen(config.port, config.host);\n });\n\n const address = server.address();\n if (address) {\n if (typeof address === 'string') {\n logger.debug(`Listening on ${address}`);\n } else {\n logger.debug(`Listening on ${address.address}:${address.port}`);\n }\n }\n\n container.register(HTTPInjectionKey.Server, { useValue: server });\n\n logger.debug('Started http server.');\n }\n\n // ----------------------------------------------------\n\n async teardown(container: IContainer): Promise<void> {\n if (!this.instance) return;\n\n container.unregister(HTTPInjectionKey.Server);\n\n this.instance.close();\n this.instance = undefined;\n }\n}\n","/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { BuiltInPolicyType, DecisionStrategy, SystemPolicyName } from '@authup/access';\nimport type {\n Client, \n Permission, \n Robot, \n Role, \n Scope, \n User,\n} from '@authup/core-kit';\nimport {\n PermissionName, \n REALM_MASTER_NAME, \n ROLE_ADMIN_NAME, \n ROLE_REALM_ADMIN_NAME, \n ScopeName, \n buildUserFakeEmail,\n} from '@authup/core-kit';\nimport type { IContainer } from 'eldin';\nimport {\n ClientCredentialsService,\n RobotCredentialsService,\n UserCredentialsService,\n} from '../../../../../core/index.ts';\nimport type { Config } from '../../../config/index.ts';\nimport { ConfigInjectionKey } from '../../../config/index.ts';\nimport type { PermissionProvisioningEntity } from '../../../../../core/provisioning/entities/permission/index.ts';\nimport type { PolicyProvisioningEntity } from '../../../../../core/provisioning/entities/policy/index.ts';\nimport type { RealmProvisioningEntity } from '../../../../../core/provisioning/entities/realm/index.ts';\nimport type { RoleProvisioningEntity } from '../../../../../core/provisioning/entities/role/index.ts';\nimport type { RootProvisioningEntity } from '../../../../../core/provisioning/entities/root/index.ts';\nimport type { ScopeProvisioningEntity } from '../../../../../core/provisioning/entities/scope/index.ts';\nimport type { ProvisioningEntityStrategy } from '../../../../../core/provisioning/strategy/index.ts';\nimport { ProvisioningEntityStrategyType } from '../../../../../core/provisioning/strategy/index.ts';\nimport type { IProvisioningSource } from '../../../../../core/provisioning/types.ts';\n\nexport class DefaultProvisioningSource implements IProvisioningSource {\n buildPolicies(): PolicyProvisioningEntity[] {\n return [\n {\n attributes: {\n name: SystemPolicyName.DEFAULT,\n type: BuiltInPolicyType.COMPOSITE,\n built_in: true,\n realm_id: null,\n },\n extraAttributes: { decision_strategy: DecisionStrategy.UNANIMOUS },\n children: [\n {\n attributes: {\n name: SystemPolicyName.IDENTITY,\n type: BuiltInPolicyType.IDENTITY,\n built_in: true,\n realm_id: null,\n },\n },\n {\n attributes: {\n name: SystemPolicyName.PERMISSION_BINDING,\n type: BuiltInPolicyType.PERMISSION_BINDING,\n built_in: true,\n realm_id: null,\n },\n },\n {\n attributes: {\n name: SystemPolicyName.REALM_MATCH,\n type: BuiltInPolicyType.REALM_MATCH,\n built_in: true,\n realm_id: null,\n },\n extraAttributes: {\n attribute_name: ['realm_id'],\n attribute_name_strict: false,\n identity_master_match_all: false,\n attribute_null_match_all: true,\n },\n },\n ],\n },\n {\n attributes: {\n name: SystemPolicyName.REALM_BOUND,\n type: BuiltInPolicyType.REALM_MATCH,\n built_in: true,\n realm_id: null,\n },\n extraAttributes: {\n attribute_name: ['realm_id'],\n attribute_name_strict: false,\n attribute_null_match_all: false,\n identity_master_match_all: false,\n },\n },\n {\n attributes: {\n name: SystemPolicyName.REALM_OR_GLOBAL,\n type: BuiltInPolicyType.REALM_MATCH,\n built_in: true,\n realm_id: null,\n },\n extraAttributes: {\n attribute_name: ['realm_id'],\n attribute_name_strict: false,\n attribute_null_match_all: true,\n identity_master_match_all: false,\n },\n },\n ];\n }\n\n buildPermissions(): PermissionProvisioningEntity[] {\n return Object.values(PermissionName)\n .map((name) => ({\n strategy: {\n type: ProvisioningEntityStrategyType.MERGE,\n attributes: ['built_in'] as (keyof Permission)[],\n },\n attributes: {\n name,\n built_in: true,\n },\n }));\n }\n\n buildScopes(): ScopeProvisioningEntity[] {\n return Object.values(ScopeName)\n .map((name) => ({\n strategy: {\n type: ProvisioningEntityStrategyType.MERGE,\n attributes: ['built_in'] as (keyof Scope)[],\n },\n attributes: {\n name,\n built_in: true,\n },\n }));\n }\n\n buildRoles(): RoleProvisioningEntity[] {\n return [\n {\n strategy: {\n type: ProvisioningEntityStrategyType.MERGE,\n attributes: ['built_in'] as (keyof Role)[],\n },\n attributes: {\n name: ROLE_ADMIN_NAME,\n built_in: true,\n },\n relations: { globalPermissions: ['*'] },\n },\n {\n strategy: {\n type: ProvisioningEntityStrategyType.MERGE,\n attributes: ['built_in'] as (keyof Role)[],\n },\n attributes: {\n name: ROLE_REALM_ADMIN_NAME,\n built_in: true,\n },\n relations: {\n globalPermissions: ['*'],\n globalPermissionsExclude: [\n PermissionName.REALM_CREATE,\n PermissionName.REALM_UPDATE,\n PermissionName.REALM_DELETE,\n ],\n globalPermissionsPolicyName: SystemPolicyName.REALM_OR_GLOBAL,\n globalPermissionsPolicyOverrides: {\n [SystemPolicyName.REALM_BOUND]: [\n PermissionName.CLIENT_CREATE,\n PermissionName.CLIENT_UPDATE,\n PermissionName.CLIENT_DELETE,\n PermissionName.IDENTITY_PROVIDER_CREATE,\n PermissionName.IDENTITY_PROVIDER_UPDATE,\n PermissionName.IDENTITY_PROVIDER_DELETE,\n PermissionName.PERMISSION_CREATE,\n PermissionName.PERMISSION_UPDATE,\n PermissionName.PERMISSION_DELETE,\n PermissionName.ROBOT_CREATE,\n PermissionName.ROBOT_UPDATE,\n PermissionName.ROBOT_DELETE,\n PermissionName.ROLE_CREATE,\n PermissionName.ROLE_UPDATE,\n PermissionName.ROLE_DELETE,\n PermissionName.SCOPE_CREATE,\n PermissionName.SCOPE_UPDATE,\n PermissionName.SCOPE_DELETE,\n PermissionName.USER_CREATE,\n PermissionName.USER_UPDATE,\n PermissionName.USER_DELETE,\n ],\n },\n },\n },\n ];\n }\n\n async buildRealms(config: Config): Promise<RealmProvisioningEntity[]> {\n const masterRealm : RealmProvisioningEntity = {\n strategy: {\n type: ProvisioningEntityStrategyType.MERGE,\n attributes: ['built_in'],\n },\n attributes: {\n name: REALM_MASTER_NAME,\n built_in: true,\n },\n relations: {},\n };\n\n const userCredentialsService = new UserCredentialsService();\n\n let userStrategy : ProvisioningEntityStrategy<User> | undefined;\n if (config.userAdminPasswordReset) {\n userStrategy = {\n type: ProvisioningEntityStrategyType.MERGE,\n attributes: ['password'],\n };\n }\n\n masterRealm.relations = masterRealm.relations || {};\n masterRealm.relations.users = [\n {\n strategy: userStrategy,\n attributes: {\n name: 'admin',\n password: await userCredentialsService.protect(config.userAdminPassword),\n email: buildUserFakeEmail('admin'),\n active: config.userAdminEnabled,\n },\n relations: { globalRoles: [ROLE_ADMIN_NAME] },\n },\n ];\n\n const clientCredentialsService = new ClientCredentialsService();\n\n let clientStrategy : ProvisioningEntityStrategy<Client> | undefined;\n if (config.clientSystemSecretReset) {\n clientStrategy = {\n type: ProvisioningEntityStrategyType.MERGE,\n attributes: ['built_in', 'is_confidential', 'secret', 'secret_hashed', 'secret_encrypted'],\n };\n } else {\n clientStrategy = {\n type: ProvisioningEntityStrategyType.MERGE,\n attributes: ['built_in', 'is_confidential'],\n };\n }\n\n masterRealm.relations = masterRealm.relations || {};\n masterRealm.relations.clients = [\n {\n strategy: clientStrategy,\n attributes: {\n built_in: true,\n is_confidential: true,\n name: 'system',\n secret: await clientCredentialsService.protect(config.clientSystemSecret, { secret_hashed: false }),\n secret_hashed: false,\n active: config.clientSystemEnabled,\n },\n relations: { globalRoles: [ROLE_ADMIN_NAME] },\n },\n ];\n\n const robotCredentialsService = new RobotCredentialsService();\n\n let robotStrategy : ProvisioningEntityStrategy<Robot> | undefined;\n if (config.robotAdminSecretReset) {\n robotStrategy = {\n type: ProvisioningEntityStrategyType.MERGE,\n attributes: ['secret'],\n };\n }\n\n masterRealm.relations = masterRealm.relations || {};\n masterRealm.relations.robots = [\n {\n strategy: robotStrategy,\n attributes: {\n name: 'system',\n secret: await robotCredentialsService.protect(config.robotAdminSecret),\n active: config.robotAdminEnabled,\n },\n relations: { globalRoles: [ROLE_ADMIN_NAME] },\n },\n ];\n\n return [masterRealm];\n }\n\n async load(container: IContainer): Promise<RootProvisioningEntity> {\n const config = container.resolve(ConfigInjectionKey);\n\n return {\n policies: this.buildPolicies(),\n permissions: this.buildPermissions(),\n scopes: this.buildScopes(),\n roles: this.buildRoles(),\n realms: await this.buildRealms(config),\n };\n }\n}\n","/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { RootProvisioningEntity } from '../../../../../core/provisioning/entities/root/index.ts';\nimport type { IProvisioningSource } from '../../../../../core/provisioning/types.ts';\nimport type { IContainer } from 'eldin';\n\nexport class CompositeProvisioningSource implements IProvisioningSource {\n protected sources : IProvisioningSource[];\n\n constructor(sources : IProvisioningSource[]) {\n this.sources = sources;\n }\n\n async load(container: IContainer): Promise<RootProvisioningEntity> {\n const output : RootProvisioningEntity = {};\n\n const sourcesData = await Promise.all(\n (this.sources).map((source) => source.load(container)),\n );\n\n sourcesData.map((sourceData) => this.merge(output, sourceData));\n\n return output;\n }\n\n merge(target: RootProvisioningEntity, source: RootProvisioningEntity) {\n target.policies = this.mergeEntities(target.policies, source.policies);\n target.permissions = this.mergeEntities(target.permissions, source.permissions);\n target.roles = this.mergeEntities(target.roles, source.roles);\n target.scopes = this.mergeEntities(target.scopes, source.scopes);\n target.realms = this.mergeEntities(target.realms, source.realms);\n }\n\n private buildEntityKey(\n attributes: {\n name?: string,\n realm_id?: string | null,\n client_id?: string | null\n },\n ): string | undefined {\n if (!attributes.name) return undefined;\n return `${attributes.name}:${attributes.realm_id || ''}:${attributes.client_id || ''}`;\n }\n\n private mergeEntities<\n T extends {\n attributes: {\n name?: string,\n realm_id?: string | null,\n client_id?: string | null\n }\n },\n >(\n target: T[] | undefined,\n source: T[] | undefined,\n ): T[] | undefined {\n if (!source) return target;\n if (!target) return [...source];\n\n const result = [...target];\n source.forEach((item) => {\n const key = this.buildEntityKey(item.attributes);\n if (!key) {\n result.push(item);\n return;\n }\n\n const idx = result.findIndex((r) => this.buildEntityKey(r.attributes) === key);\n if (idx !== -1) {\n result[idx] = item;\n } else {\n result.push(item);\n }\n });\n return result;\n }\n}\n","/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { load, locateMany } from 'locter';\nimport path from 'node:path';\nimport type { RootProvisioningEntity } from '../../../../../core/provisioning/entities/index.ts';\nimport { RootProvisioningValidator } from '../../../../../core/provisioning/entities/index.ts';\nimport type { IProvisioningSource } from '../../../../../core/provisioning/types.ts';\nimport { CompositeProvisioningSource } from '../composite/index.ts';\nimport type { FileEntitySchemaImporterOptions } from './types.ts';\n\nexport class FileProvisioningSource implements IProvisioningSource {\n protected options: FileEntitySchemaImporterOptions;\n\n protected rootValidator: RootProvisioningValidator;\n\n constructor(options: FileEntitySchemaImporterOptions) {\n this.options = options;\n\n this.rootValidator = new RootProvisioningValidator();\n }\n\n async load(): Promise<RootProvisioningEntity> {\n const cwd = path.isAbsolute(this.options.cwd) ?\n this.options.cwd :\n path.join(process.cwd(), this.options.cwd);\n\n const locations = await locateMany('*.{json,yaml,yml,ts,mts,mjs,js}', { path: cwd });\n\n const compositeSource = new CompositeProvisioningSource([]);\n\n const output : RootProvisioningEntity = {};\n for (const location of locations) {\n const raw = await load(location);\n const data = await this.rootValidator.run(raw.default);\n\n compositeSource.merge(output, data);\n }\n\n return output;\n }\n}\n","/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\nimport type {\n Client,\n ClientPermission,\n ClientRole,\n PermissionPolicy,\n Realm,\n Robot,\n RobotPermission,\n RobotRole,\n Role,\n RolePermission,\n Scope,\n UserPermission,\n UserRole,\n} from '@authup/core-kit';\nimport type { DataSource, Repository } from 'typeorm';\nimport {\n ClientEntity,\n ClientPermissionEntity,\n ClientRoleEntity,\n PermissionEntity,\n RealmEntity,\n RobotEntity,\n RobotPermissionEntity,\n RobotRoleEntity,\n RoleEntity,\n RolePermissionEntity,\n ScopeEntity,\n UserPermissionEntity,\n UserRoleEntity,\n} from '../../../adapters/database/index.ts';\nimport { SystemPolicyName } from '@authup/access';\nimport {\n PermissionPolicyEntity,\n PolicyRepository,\n UserRepository,\n} from '../../../adapters/database/domains/index.ts';\nimport type { IContainer } from 'eldin';\nimport {\n ClientProvisioningSynchronizer,\n GraphProvisioningSynchronizer,\n PermissionProvisioningSynchronizer,\n PolicyProvisioningSynchronizer,\n RealmProvisioningSynchronizer,\n RobotProvisioningSynchronizer,\n RoleProvisioningSynchronizer,\n ScopeProvisioningSynchronizer,\n UserProvisioningSynchronizer,\n} from '../../../core/provisioning/synchronizer/index.ts';\nimport type { IProvisioningSource } from '../../../core/provisioning/types.ts';\nimport {\n ClientPermissionRepositoryAdapter,\n ClientRepositoryAdapter,\n ClientRoleRepositoryAdapter,\n PermissionPolicyRepositoryAdapter,\n PermissionRepositoryAdapter,\n PolicyRepositoryAdapter,\n RealmRepositoryAdapter,\n RobotPermissionRepositoryAdapter,\n RobotRepositoryAdapter,\n RobotRoleRepositoryAdapter,\n RolePermissionRepositoryAdapter,\n RoleRepositoryAdapter,\n ScopeRepositoryAdapter,\n UserPermissionRepositoryAdapter,\n UserRepositoryAdapter,\n UserRoleRepositoryAdapter,\n} from '../database/repositories/index.ts';\nimport { DatabaseInjectionKey } from '../database/index.ts';\nimport type { IModule } from 'orkos';\nimport { ModuleName } from '../constants.ts';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { ConfigInjectionKey } from '../config/index.ts';\nimport { CompositeProvisioningSource, FileProvisioningSource } from './sources/index.ts';\n\nexport class ProvisionerModule implements IModule {\n readonly name: string;\n\n readonly dependencies: string[];\n\n protected sources: IProvisioningSource[];\n\n constructor(sources: IProvisioningSource[] = []) {\n this.name = ModuleName.PROVISIONING;\n this.dependencies = [ModuleName.CONFIG, ModuleName.DATABASE];\n this.sources = sources;\n }\n\n async setup(container: IContainer): Promise<void> {\n const sources = [...this.sources];\n\n const config = container.resolve(ConfigInjectionKey);\n const provisioningDir = path.join(config.writableDirectoryPath, 'provisioning');\n if (fs.existsSync(provisioningDir)) {\n sources.push(new FileProvisioningSource({ cwd: provisioningDir }));\n }\n\n const composite = new CompositeProvisioningSource(sources);\n const data = await composite.load(container);\n\n const dataSource = container.resolve(DatabaseInjectionKey.DataSource);\n const realmRepository = container.resolve<Repository<Realm>>(RealmEntity);\n\n const permissionRepository = new PermissionRepositoryAdapter({\n repository: container.resolve<Repository<PermissionEntity>>(PermissionEntity),\n realmRepository,\n });\n\n const policyRepository = new PolicyRepositoryAdapter({\n repository: new PolicyRepository(dataSource),\n realmRepository,\n });\n\n // ---------------------------------------------------------------\n // Synchronize all entities (policies → permissions → roles → ...)\n // ---------------------------------------------------------------\n\n const permissionPolicyRepository = new PermissionPolicyRepositoryAdapter(\n container.resolve<Repository<PermissionPolicy>>(PermissionPolicyEntity),\n );\n\n const policySynchronizer = new PolicyProvisioningSynchronizer({\n repository: policyRepository,\n permissionPolicyRepository,\n });\n\n const roleRepository = new RoleRepositoryAdapter({\n repository: container.resolve<Repository<Role>>(RoleEntity),\n realmRepository,\n });\n const clientRepository = new ClientRepositoryAdapter({\n repository: container.resolve<Repository<Client>>(ClientEntity),\n realmRepository,\n });\n\n const permissionSynchronizer = new PermissionProvisioningSynchronizer({ repository: permissionRepository });\n\n const roleSynchronizer = new RoleProvisioningSynchronizer({\n repository: roleRepository,\n permissionRepository,\n policyRepository,\n rolePermissionRepository: new RolePermissionRepositoryAdapter(\n container.resolve<Repository<RolePermission>>(RolePermissionEntity),\n ),\n });\n\n const clientSynchronizer = new ClientProvisioningSynchronizer({\n clientRepository,\n clientRoleRepository: new ClientRoleRepositoryAdapter(\n container.resolve<Repository<ClientRole>>(ClientRoleEntity),\n ),\n clientPermissionRepository: new ClientPermissionRepositoryAdapter(\n container.resolve<Repository<ClientPermission>>(ClientPermissionEntity),\n ),\n\n roleRepository,\n permissionRepository,\n\n roleSynchronizer,\n permissionSynchronizer,\n });\n\n const userSynchronizer = new UserProvisioningSynchronizer({\n userRepository: new UserRepositoryAdapter({\n repository: new UserRepository(dataSource),\n realmRepository,\n }),\n userRoleRepository: new UserRoleRepositoryAdapter(\n container.resolve<Repository<UserRole>>(UserRoleEntity),\n ),\n userPermissionRepository: new UserPermissionRepositoryAdapter(\n container.resolve<Repository<UserPermission>>(UserPermissionEntity),\n ),\n\n clientRepository,\n roleRepository,\n permissionRepository,\n });\n\n const robotSynchronizer = new RobotProvisioningSynchronizer({\n robotRepository: new RobotRepositoryAdapter({\n repository: container.resolve<Repository<Robot>>(RobotEntity),\n realmRepository,\n }),\n robotRoleRepository: new RobotRoleRepositoryAdapter(\n container.resolve<Repository<RobotRole>>(RobotRoleEntity),\n ),\n robotPermissionRepository: new RobotPermissionRepositoryAdapter(\n container.resolve<Repository<RobotPermission>>(RobotPermissionEntity),\n ),\n\n roleRepository,\n permissionRepository,\n });\n\n const scopeSynchronizer = new ScopeProvisioningSynchronizer({\n repository: new ScopeRepositoryAdapter({\n repository: container.resolve<Repository<Scope>>(ScopeEntity),\n realmRepository,\n }),\n });\n\n const realmSynchronizer = new RealmProvisioningSynchronizer({\n repository: new RealmRepositoryAdapter(realmRepository),\n\n clientSynchronizer,\n roleSynchronizer,\n permissionSynchronizer,\n userSynchronizer,\n robotSynchronizer,\n scopeSynchronizer,\n });\n\n const rootSynchronizer = new GraphProvisioningSynchronizer({\n policySynchronizer,\n permissionSynchronizer,\n roleSynchronizer,\n realmSynchronizer,\n scopeSynchronizer,\n });\n\n await rootSynchronizer.synchronize(data);\n\n if (config.permissionsDefaultPolicyAssignment) {\n await this.assignDefaultPolicy(dataSource, policyRepository);\n }\n }\n\n protected async assignDefaultPolicy(\n dataSource: DataSource,\n policyRepository: PolicyRepositoryAdapter,\n ): Promise<void> {\n const defaultPolicy = await policyRepository.findOneByName(SystemPolicyName.DEFAULT);\n if (!defaultPolicy) {\n return;\n }\n\n const permissionRepo = dataSource.getRepository(PermissionEntity);\n const junctionRepo = dataSource.getRepository(PermissionPolicyEntity);\n\n const permissions = await permissionRepo.find();\n for (const permission of permissions) {\n const hasAnyPolicy = await junctionRepo.findOneBy({ permission_id: permission.id });\n\n if (!hasAnyPolicy) {\n await junctionRepo.save(junctionRepo.create({\n permission_id: permission.id,\n permission_realm_id: permission.realm_id,\n policy_id: defaultPolicy.id,\n policy_realm_id: defaultPolicy.realm_id,\n }));\n }\n }\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { IModule } from 'orkos';\nimport { ModuleName } from '../constants.ts';\nimport type { IContainer } from 'eldin';\nimport { LoggerInjectionKey } from '../logger/index.ts';\nimport { ConfigInjectionKey } from '../config/index.ts';\n\nexport class RuntimeModule implements IModule {\n readonly name: string;\n\n readonly dependencies: string[];\n\n constructor() {\n this.name = ModuleName.RUNTIME;\n this.dependencies = [ModuleName.CONFIG, ModuleName.LOGGER];\n }\n\n async setup(container: IContainer): Promise<void> {\n const config = container.resolve(ConfigInjectionKey);\n const logger = container.resolve(LoggerInjectionKey);\n\n logger.debug(`Environment: ${config.env}`);\n logger.debug(`WritableDirectoryPath: ${config.writableDirectoryPath}`);\n logger.debug(`Port: ${config.port}`);\n logger.debug(`Host: ${config.host}`);\n logger.debug(`Base-URL: ${config.publicUrl}`);\n logger.debug(`Docs-URL: ${new URL('docs', config.publicUrl).href}`);\n }\n\n // ----------------------------------------------------\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { Swagger } from '../../../adapters/http/index.ts';\nimport type { IModule } from 'orkos';\nimport { ModuleName } from '../constants.ts';\nimport type { IContainer } from 'eldin';\nimport { ConfigInjectionKey } from '../config/index.ts';\nimport { LoggerInjectionKey } from '../logger/index.ts';\n\nexport class SwaggerModule implements IModule {\n readonly name: string;\n\n readonly dependencies: string[];\n\n constructor() {\n this.name = ModuleName.SWAGGER;\n this.dependencies = [ModuleName.CONFIG, ModuleName.LOGGER];\n }\n\n async setup(container: IContainer): Promise<void> {\n const config = container.resolve(ConfigInjectionKey);\n const logger = container.resolve(LoggerInjectionKey);\n\n const swagger = new Swagger({ baseURL: config.publicUrl });\n\n const swaggerCanGenerate = await swagger.canGenerate();\n const swaggerExists = await swagger.exists();\n if (swaggerCanGenerate && !swaggerExists) {\n logger.debug('Generating documentation...');\n\n await swagger.generate();\n\n logger.debug('Generated documentation.');\n }\n }\n\n // ----------------------------------------------------\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n Application,\n type IApplication,\n type IModule,\n} from 'orkos';\nimport {\n AuthenticationModule,\n CacheModule,\n ComponentsModule,\n ConfigModule,\n DatabaseModule,\n HTTPModule,\n IdentityModule,\n LdapModule,\n LoggerModule,\n MailModule,\n ModuleName,\n OAuth2Module,\n ProvisionerModule,\n RuntimeModule,\n SwaggerModule,\n} from './modules/index.ts';\n\ntype ModuleSlot = IModule | false | undefined;\n\ntype ModuleFactory = () => IModule;\n\nconst defaultFactories: Record<string, ModuleFactory> = {\n [ModuleName.CONFIG]: () => new ConfigModule(),\n [ModuleName.LOGGER]: () => new LoggerModule(),\n [ModuleName.CACHE]: () => new CacheModule(),\n [ModuleName.MAIL]: () => new MailModule(),\n [ModuleName.RUNTIME]: () => new RuntimeModule(),\n [ModuleName.SWAGGER]: () => new SwaggerModule(),\n [ModuleName.DATABASE]: () => new DatabaseModule(),\n [ModuleName.PROVISIONING]: () => new ProvisionerModule(),\n [ModuleName.LDAP]: () => new LdapModule(),\n [ModuleName.AUTHENTICATION]: () => new AuthenticationModule(),\n [ModuleName.IDENTITY]: () => new IdentityModule(),\n [ModuleName.OAUTH2]: () => new OAuth2Module(),\n [ModuleName.COMPONENTS]: () => new ComponentsModule(),\n [ModuleName.HTTP]: () => new HTTPModule(),\n};\n\nexport class ApplicationBuilder {\n protected slots: Map<string, ModuleSlot>;\n\n constructor() {\n this.slots = new Map();\n }\n\n // ----------------------------------------------------\n\n withConfig(instance?: ConfigModule | false): this {\n return this.set(ModuleName.CONFIG, instance);\n }\n\n withLogger(instance?: LoggerModule | false): this {\n return this.set(ModuleName.LOGGER, instance);\n }\n\n withCache(instance?: CacheModule | false): this {\n return this.set(ModuleName.CACHE, instance);\n }\n\n withMail(instance?: MailModule | false): this {\n return this.set(ModuleName.MAIL, instance);\n }\n\n withRuntime(instance?: RuntimeModule | false): this {\n return this.set(ModuleName.RUNTIME, instance);\n }\n\n withSwagger(instance?: SwaggerModule | false): this {\n return this.set(ModuleName.SWAGGER, instance);\n }\n\n withDatabase(instance?: DatabaseModule | false): this {\n return this.set(ModuleName.DATABASE, instance);\n }\n\n withProvisioning(instance?: ProvisionerModule | false): this {\n return this.set(ModuleName.PROVISIONING, instance);\n }\n\n withLdap(instance?: LdapModule | false): this {\n return this.set(ModuleName.LDAP, instance);\n }\n\n withAuthentication(instance?: AuthenticationModule | false): this {\n return this.set(ModuleName.AUTHENTICATION, instance);\n }\n\n withIdentity(instance?: IdentityModule | false): this {\n return this.set(ModuleName.IDENTITY, instance);\n }\n\n withOAuth2(instance?: OAuth2Module | false): this {\n return this.set(ModuleName.OAUTH2, instance);\n }\n\n withComponents(instance?: ComponentsModule | false): this {\n return this.set(ModuleName.COMPONENTS, instance);\n }\n\n withHTTP(instance?: HTTPModule | false): this {\n return this.set(ModuleName.HTTP, instance);\n }\n\n // ----------------------------------------------------\n\n buildModules(): IModule[] {\n const modules: IModule[] = [];\n\n this.slots.forEach((slot, name) => {\n if (slot === false) {\n return;\n }\n\n if (slot) {\n modules.push(slot);\n return;\n }\n\n const factory = defaultFactories[name];\n if (factory) {\n modules.push(factory());\n }\n });\n\n return modules;\n }\n\n build(): IApplication {\n return new Application({ modules: this.buildModules() });\n }\n\n // ----------------------------------------------------\n\n protected set(name: string, instance?: IModule | false): this {\n if (instance === false) {\n this.slots.set(name, false);\n } else if (instance) {\n this.slots.set(name, instance);\n } else {\n this.slots.set(name, undefined);\n }\n\n return this;\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { ApplicationBuilder } from './builder.ts';\nimport {\n DefaultProvisioningSource,\n ProvisionerModule,\n} from './modules/index.ts';\n\nexport function createApplication() {\n return new ApplicationBuilder()\n .withConfig()\n .withLogger()\n .withCache()\n .withMail()\n .withRuntime()\n .withSwagger()\n .withDatabase()\n .withProvisioning(new ProvisionerModule([\n new DefaultProvisioningSource(),\n ]))\n .withLdap()\n .withAuthentication()\n .withIdentity()\n .withOAuth2()\n .withComponents()\n .withHTTP()\n .build();\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { defineCommand } from 'citty';\nimport process from 'node:process';\nimport { Swagger } from '../../adapters/http/index.ts';\nimport { ApplicationBuilder, ConfigInjectionKey } from '../../app/index.ts';\n\nexport function defineCLISwaggerCommand() {\n return defineCommand({\n meta: { name: 'swagger' },\n args: {\n operation: {\n required: true,\n type: 'positional',\n options: [\n 'generate',\n ],\n },\n },\n async setup(context) {\n const app = new ApplicationBuilder()\n .withConfig()\n .build();\n\n await app.setup();\n\n const config = app.container.resolve(ConfigInjectionKey);\n\n const swagger = new Swagger({ baseURL: config.publicUrl });\n\n if (context.args.operation === 'generate') {\n await swagger.generate();\n }\n\n process.exit(0);\n },\n });\n}\n","/*\n * Copyright (c) 2021-2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { defineCommand } from 'citty';\nimport http from 'node:http';\nimport process from 'node:process';\nimport { ApplicationBuilder, ConfigInjectionKey } from '../../app/index.ts';\n\nexport function defineCLIHealthCheckCommand() {\n return defineCommand({\n meta: { name: 'healthcheck' },\n async setup() {\n const app = new ApplicationBuilder()\n .withConfig()\n .build();\n\n await app.setup();\n\n const config = app.container.resolve(ConfigInjectionKey);\n\n const healthCheck = http.request(\n {\n path: '/metrics',\n host: '0.0.0.0',\n port: config.port,\n timeout: 2000,\n },\n (res) => {\n if (res.statusCode === 200) {\n process.exit(0);\n } else {\n process.exit(1);\n }\n },\n );\n\n healthCheck.on('error', () => {\n process.exit(1);\n });\n\n healthCheck.end();\n },\n });\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { defineCommand } from 'citty';\nimport path from 'node:path';\nimport process from 'node:process';\nimport {\n checkDatabase,\n createDatabase, \n dropDatabase, \n generateMigration, \n transformFilePath,\n} from 'typeorm-extension';\nimport { DataSource, type DataSourceOptions } from 'typeorm';\nimport { DataSourceOptionsBuilder } from '../../adapters/database/index.ts';\nimport {\n ApplicationBuilder, \n ConfigInjectionKey, \n LoggerInjectionKey, \n ModuleName,\n} from '../../app/index.ts';\nimport type { IContainer } from 'eldin';\nimport { CODE_PATH } from '../../path.ts';\n\nenum MigrationOperation {\n GENERATE = 'generate',\n REVERT = 'revert',\n STATUS = 'status',\n RUN = 'run',\n}\n\nasync function runMigrationOperation(\n container: IContainer,\n operation: string,\n): Promise<void> {\n const config = container.resolve(ConfigInjectionKey);\n const logger = container.resolve(LoggerInjectionKey);\n\n const optionsBuilder = new DataSourceOptionsBuilder();\n\n let options: DataSourceOptions;\n if (config.db) {\n options = optionsBuilder.buildWith(config.db);\n } else {\n options = optionsBuilder.buildWithEnv();\n }\n\n logger.debug(`Type: ${options.type}`);\n logger.debug(`Database: ${options.database}`);\n\n if (Array.isArray(options.migrations)) {\n for (let i = 0; i < options.migrations.length; i++) {\n if (typeof options.migrations[i] === 'string') {\n logger.debug(`Migration-Directory: ${options.migrations[i]}`);\n }\n }\n } else if (typeof options.migrations === 'string') {\n logger.debug(`Migration-Directory: ${options.migrations}`);\n }\n\n const check = await checkDatabase({ options });\n\n if (!check.exists) {\n await createDatabase({\n options,\n synchronize: false,\n ifNotExist: true, \n });\n }\n\n const dataSource = new DataSource({\n ...options,\n logging: ['error', 'schema', 'migration'],\n });\n await dataSource.initialize();\n\n try {\n if (operation === MigrationOperation.REVERT) {\n await dataSource.undoLastMigration();\n } else if (operation === MigrationOperation.STATUS) {\n await dataSource.showMigrations();\n } else {\n await dataSource.runMigrations();\n }\n } finally {\n await dataSource.destroy();\n }\n}\n\nasync function generateMigrations(): Promise<void> {\n const optionsBuilder = new DataSourceOptionsBuilder();\n\n const connections: DataSourceOptions[] = [\n {\n type: 'postgres',\n database: 'migrations',\n host: 'localhost',\n port: 5432,\n username: 'postgres',\n password: 'start123',\n },\n {\n type: 'mysql',\n database: 'migrations',\n host: 'localhost',\n port: 3306,\n username: 'root',\n password: 'start123',\n },\n ];\n\n const baseDirectory = transformFilePath(\n path.join(CODE_PATH, 'adapters', 'database', 'migrations'),\n './src',\n './dist',\n );\n\n const timestamp = Date.now();\n\n for (const connection of connections) {\n const dataSourceOptions = optionsBuilder.buildWith(connection);\n const directoryPath = path.join(baseDirectory, dataSourceOptions.type);\n\n await dropDatabase({ options: dataSourceOptions });\n await createDatabase({\n options: dataSourceOptions,\n synchronize: false, \n });\n\n const dataSource = new DataSource(dataSourceOptions);\n await dataSource.initialize();\n\n try {\n await dataSource.runMigrations();\n\n await generateMigration({\n dataSource,\n name: 'Default',\n directoryPath,\n timestamp,\n prettify: true,\n });\n } finally {\n await dataSource.destroy();\n }\n }\n}\n\nexport function defineCLIMigrationCommand() {\n return defineCommand({\n meta: { name: 'migration' },\n args: {\n operation: {\n required: true,\n type: 'positional',\n options: Object.values(MigrationOperation),\n valueHint: Object.values(MigrationOperation).join('|'),\n },\n },\n async setup(context) {\n try {\n if (context.args.operation === MigrationOperation.GENERATE) {\n await generateMigrations();\n } else {\n const app = new ApplicationBuilder()\n .withConfig()\n .withLogger()\n .build();\n\n app.addModule({\n name: ModuleName.DATABASE,\n dependencies: [ModuleName.CONFIG, ModuleName.LOGGER],\n async setup(container: IContainer): Promise<void> {\n await runMigrationOperation(container, context.args.operation);\n },\n });\n\n await app.setup();\n }\n\n process.exit(0);\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error(e);\n\n process.exit(1);\n }\n },\n });\n}\n","/*\n * Copyright (c) 2021-2021.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { defineCommand } from 'citty';\nimport process from 'node:process';\nimport { ApplicationBuilder } from '../../app/index.ts';\n\nexport function defineCLIResetCommand() {\n return defineCommand({\n meta: { name: 'reset' },\n async setup() {\n const app = new ApplicationBuilder()\n .withConfig()\n .withLogger()\n .withDatabase()\n .build();\n\n await app.setup();\n await app.teardown();\n\n process.exit(0);\n },\n });\n}\n","/*\n * Copyright (c) 2021-2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { defineCommand } from 'citty';\nimport { createApplication } from '../../app/index.ts';\n\nexport function defineCLIStartCommand() {\n return defineCommand({\n meta: { name: 'start' },\n async setup() {\n const app = createApplication();\n\n await app.setup();\n },\n });\n}\n"],"mappings":"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"}
|