1- import { BadRequestHttpError , MethodNotAllowedHttpError } from " @solid/community-server" ;
1+ import { BadRequestHttpError , ForbiddenHttpError , MethodNotAllowedHttpError } from ' @solid/community-server' ;
22import { getLoggerFor } from 'global-logger-factory' ;
3- import { BaseController } from "../controller/BaseController" ;
4- import { HttpHandler , HttpHandlerContext , HttpHandlerRequest , HttpHandlerResponse } from "../util/http/models/HttpHandler" ;
5- import { verifyHttpCredentials } from "../util/routeSpecific/middlewareUtil" ;
3+ import { BaseController } from '../controller/BaseController' ;
4+ import { WEBID } from '../credentials/Claims' ;
5+ import { ClaimSet } from '../credentials/ClaimSet' ;
6+ import { CredentialParser } from '../credentials/CredentialParser' ;
7+ import { Verifier } from '../credentials/verify/Verifier' ;
8+ import {
9+ HttpHandler ,
10+ HttpHandlerContext ,
11+ HttpHandlerRequest ,
12+ HttpHandlerResponse
13+ } from '../util/http/models/HttpHandler' ;
614
715/**
816 * Base handler for policy and access request endpoints.
@@ -18,19 +26,23 @@ import { verifyHttpCredentials } from "../util/routeSpecific/middlewareUtil";
1826 * - **GET** `/` - retrieve all policies (including their rules) or access requests
1927 * - **POST** `/` - create new policy or access request
2028 */
21- export abstract class BaseHandler extends HttpHandler {
29+ export class BaseHandler extends HttpHandler {
2230
2331 protected readonly logger = getLoggerFor ( this ) ;
2432
2533 /**
2634 * @param controller reference to the controller implementing the policy/access request logic
35+ * @param credentialParser parses the request headers to find the credential format and token
36+ * @param verifier verifies the credential token and extracts the claims
2737 * @param handleLogMessage message to log at the start of each handled request
2838 * @param patchContentType expected content type for PATCH requests (e.g. `application/json` or `application/sparql-update`)
2939 */
3040 constructor (
3141 protected readonly controller : BaseController ,
32- private readonly handleLogMessage : string ,
33- private readonly patchContentType : string ,
42+ protected readonly credentialParser : CredentialParser ,
43+ protected readonly verifier : Verifier ,
44+ protected readonly handleLogMessage : string ,
45+ protected readonly patchContentType : string ,
3446 ) {
3547 super ( ) ;
3648 }
@@ -48,20 +60,25 @@ export abstract class BaseHandler extends HttpHandler {
4860 if ( request . method === 'OPTIONS' )
4961 return this . handleOptions ( ) ;
5062
51- const credentials = verifyHttpCredentials ( request ) ;
63+ const credential = await this . credentialParser . handleSafe ( request ) ;
64+ const claims = await this . verifier . verify ( credential ) ;
65+ const userId = claims [ WEBID ] ;
66+ if ( typeof userId !== 'string' ) {
67+ throw new ForbiddenHttpError ( `Missing claim ${ WEBID } .` ) ;
68+ }
5269
5370 if ( request . parameters ?. id ) {
5471 switch ( request . method ) {
55- case 'GET' : return this . handleSingleGet ( request . parameters . id , credentials ) ;
56- case 'PATCH' : return this . handlePatch ( request as HttpHandlerRequest < string > , request . parameters . id , credentials ) ;
57- case 'PUT' : return this . handlePut ( request as HttpHandlerRequest < string > , request . parameters . id , credentials ) ;
58- case 'DELETE' : return this . handleDelete ( request . parameters . id , credentials ) ;
72+ case 'GET' : return this . handleSingleGet ( request . parameters . id , userId ) ;
73+ case 'PATCH' : return this . handlePatch ( request as HttpHandlerRequest < string > , request . parameters . id , userId ) ;
74+ case 'PUT' : return this . handlePut ( request as HttpHandlerRequest < string > , request . parameters . id , userId ) ;
75+ case 'DELETE' : return this . handleDelete ( request . parameters . id , userId ) ;
5976 default : throw new MethodNotAllowedHttpError ( ) ;
6077 }
6178 } else {
6279 switch ( request . method ) {
63- case 'GET' : return this . handleGet ( credentials ) ;
64- case 'POST' : return this . handlePost ( request as HttpHandlerRequest < string > , credentials ) ;
80+ case 'GET' : return this . handleGet ( userId ) ;
81+ case 'POST' : return this . handlePost ( request as HttpHandlerRequest < string > , userId ) ;
6582 default : throw new MethodNotAllowedHttpError ( ) ;
6683 }
6784 }
0 commit comments