mirror of
				https://github.com/CommunitySolidServer/CommunitySolidServer.git
				synced 2024-10-03 14:55:10 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			69 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import type { ResourceStore } from '../../src/';
 | |
| import { BasicRepresentation } from '../../src/';
 | |
| import type { AclPermission } from '../../src/authorization/permissions/AclPermission';
 | |
| 
 | |
| export type AclHelperInput = {
 | |
|   permissions: AclPermission;
 | |
|   agentClass?: 'agent' | 'authenticated';
 | |
|   agent?: string;
 | |
|   accessTo?: boolean;
 | |
|   default?: boolean;
 | |
| };
 | |
| 
 | |
| export class AclHelper {
 | |
|   public readonly store: ResourceStore;
 | |
| 
 | |
|   public constructor(store: ResourceStore) {
 | |
|     this.store = store;
 | |
|   }
 | |
| 
 | |
|   public async setSimpleAcl(
 | |
|     resource: string,
 | |
|     options: AclHelperInput | AclHelperInput[],
 | |
|   ): Promise<void> {
 | |
|     options = Array.isArray(options) ? options : [ options ];
 | |
| 
 | |
|     const acl: string[] = [
 | |
|       '@prefix   acl:  <http://www.w3.org/ns/auth/acl#>.\n',
 | |
|       '@prefix  foaf:  <http://xmlns.com/foaf/0.1/>.\n',
 | |
|     ];
 | |
| 
 | |
|     for (const [ i, option ] of options.entries()) {
 | |
|       acl.push(`\n<http://test.com/#auth${i}> a acl:Authorization`);
 | |
| 
 | |
|       if (!option.agentClass && !option.agent) {
 | |
|         throw new Error('At least one of agentClass or agent have to be provided.');
 | |
|       }
 | |
|       if (!option.accessTo && !option.default) {
 | |
|         throw new Error('At least one of accessTo or default have to be true.');
 | |
|       }
 | |
| 
 | |
|       for (const perm of [ 'Read', 'Append', 'Write', 'Control' ]) {
 | |
|         if (option.permissions[perm.toLowerCase() as keyof AclPermission]) {
 | |
|           acl.push(`;\n acl:mode acl:${perm}`);
 | |
|         }
 | |
|       }
 | |
|       if (option.accessTo) {
 | |
|         acl.push(`;\n acl:accessTo <${resource}>`);
 | |
|       }
 | |
|       if (option.default) {
 | |
|         acl.push(`;\n acl:default <${resource}>`);
 | |
|       }
 | |
|       if (option.agentClass) {
 | |
|         acl.push(
 | |
|           `;\n acl:agentClass ${
 | |
|             option.agentClass === 'agent' ? 'foaf:Agent' : 'foaf:AuthenticatedAgent'
 | |
|           }`,
 | |
|         );
 | |
|       }
 | |
|       if (option.agent) {
 | |
|         acl.push(`;\n acl:agent ${option.agent}`);
 | |
|       }
 | |
| 
 | |
|       acl.push('.');
 | |
|     }
 | |
| 
 | |
|     await this.store.setRepresentation({ path: `${resource}.acl` }, new BasicRepresentation(acl, 'text/turtle'));
 | |
|   }
 | |
| }
 | 
