@@ -107,6 +107,7 @@ public class AccessGrantClient {
107107 private static final String FOR_PERSONAL_DATA = "forPersonalData" ;
108108 private static final String HAS_STATUS = "hasStatus" ;
109109 private static final String REQUEST = "request" ;
110+ private static final String VERIFIED_REQUEST = "verifiedRequest" ;
110111 private static final String MODE = "mode" ;
111112 private static final String PROVIDED_CONSENT = "providedConsent" ;
112113 private static final String FOR_PURPOSE = "forPurpose" ;
@@ -252,17 +253,28 @@ private CompletionStage<AccessRequest> requestAccess(final URI recipient, final
252253 }
253254
254255 /**
255- * Issue an access grant based on an access request.
256+ * Issue an access grant based on an access request. The access request is not verified.
256257 *
257258 * @param request the access request
258259 * @return the next stage of completion containing the issued access grant
259260 */
260261 public CompletionStage <AccessGrant > grantAccess (final AccessRequest request ) {
262+ return grantAccess (request , false );
263+ }
264+
265+ /**
266+ * Issue an access grant based on an access request.
267+ *
268+ * @param request the access request
269+ * @param verifyRequest whether the request should be verified before issuing the access grant
270+ * @return the next stage of completion containing the issued access grant
271+ */
272+ public CompletionStage <AccessGrant > grantAccess (final AccessRequest request , final boolean verifyRequest ) {
261273 Objects .requireNonNull (request , "Request may not be null!" );
262274 return v1Metadata ().thenCompose (metadata -> {
263275 final Map <String , Object > data = buildAccessGrantv1 (request .getCreator (), request .getResources (),
264276 request .getModes (), request .getPurposes (), request .getExpiration (), request .getIssuedAt (),
265- request .getIdentifier ());
277+ request .getIdentifier (), verifyRequest );
266278 final Request req = Request .newBuilder (metadata .issueEndpoint )
267279 .header (CONTENT_TYPE , APPLICATION_JSON )
268280 .POST (Request .BodyPublishers .ofByteArray (serialize (data ))).build ();
@@ -285,17 +297,28 @@ public CompletionStage<AccessGrant> grantAccess(final AccessRequest request) {
285297 }
286298
287299 /**
288- * Issue an access denial receipt based on an access request.
300+ * Issue an access denial receipt based on an access request. The access request is not verified.
289301 *
290302 * @param request the access request
291303 * @return the next stage of completion containing the issued access denial
292304 */
293305 public CompletionStage <AccessDenial > denyAccess (final AccessRequest request ) {
306+ return denyAccess (request , false );
307+ }
308+
309+ /**
310+ * Issue an access denial receipt based on an access request.
311+ *
312+ * @param request the access request
313+ * @param verifyRequest whether the request should be verified before issuing the access denial
314+ * @return the next stage of completion containing the issued access denial
315+ */
316+ public CompletionStage <AccessDenial > denyAccess (final AccessRequest request , final boolean verifyRequest ) {
294317 Objects .requireNonNull (request , "Request may not be null!" );
295318 return v1Metadata ().thenCompose (metadata -> {
296319 final Map <String , Object > data = buildAccessDenialv1 (request .getCreator (), request .getResources (),
297320 request .getModes (), request .getPurposes (), request .getExpiration (), request .getIssuedAt (),
298- request .getIdentifier ());
321+ request .getIdentifier (), verifyRequest );
299322 final Request req = Request .newBuilder (metadata .issueEndpoint )
300323 .header (CONTENT_TYPE , APPLICATION_JSON )
301324 .POST (Request .BodyPublishers .ofByteArray (serialize (data ))).build ();
@@ -716,15 +739,22 @@ static URI asUri(final Object value) {
716739 return null ;
717740 }
718741
719- static Map <String , Object > buildAccessDenialv1 (final URI agent , final Set <URI > resources , final Set <String > modes ,
720- final Set <URI > purposes , final Instant expiration , final Instant issuance , final URI accessRequest ) {
742+ static Map <String , Object > buildAccessDenialv1 (
743+ final URI agent ,
744+ final Set <URI > resources ,
745+ final Set <String > modes ,
746+ final Set <URI > purposes ,
747+ final Instant expiration ,
748+ final Instant issuance ,
749+ final URI accessRequest ,
750+ final boolean verifiedRequest ) {
721751 Objects .requireNonNull (agent , "Access denial agent may not be null!" );
722752 final Map <String , Object > consent = new HashMap <>();
723753 consent .put (MODE , modes );
724754 consent .put (HAS_STATUS , "https://w3id.org/GConsent#ConsentStatusRefused" );
725755 consent .put (FOR_PERSONAL_DATA , resources );
726756 consent .put (IS_PROVIDED_TO , agent );
727- consent . put ( REQUEST , accessRequest );
757+ linkRequest ( consent , accessRequest , verifiedRequest );
728758 if (!purposes .isEmpty ()) {
729759 consent .put (FOR_PURPOSE , purposes );
730760 }
@@ -747,15 +777,22 @@ static Map<String, Object> buildAccessDenialv1(final URI agent, final Set<URI> r
747777 return data ;
748778 }
749779
750- static Map <String , Object > buildAccessGrantv1 (final URI agent , final Set <URI > resources , final Set <String > modes ,
751- final Set <URI > purposes , final Instant expiration , final Instant issuance , final URI accessRequest ) {
780+ static Map <String , Object > buildAccessGrantv1 (
781+ final URI agent ,
782+ final Set <URI > resources ,
783+ final Set <String > modes ,
784+ final Set <URI > purposes ,
785+ final Instant expiration ,
786+ final Instant issuance ,
787+ final URI accessRequest ,
788+ final boolean verifiedRequest ) {
752789 Objects .requireNonNull (agent , "Access grant agent may not be null!" );
753790 final Map <String , Object > consent = new HashMap <>();
754791 consent .put (MODE , modes );
755792 consent .put (HAS_STATUS , "https://w3id.org/GConsent#ConsentStatusExplicitlyGiven" );
756793 consent .put (FOR_PERSONAL_DATA , resources );
757794 consent .put (IS_PROVIDED_TO , agent );
758- consent . put ( REQUEST , accessRequest );
795+ linkRequest ( consent , accessRequest , verifiedRequest );
759796 if (!purposes .isEmpty ()) {
760797 consent .put (FOR_PURPOSE , purposes );
761798 }
@@ -861,4 +898,12 @@ static boolean isAccessDenial(final URI type) {
861898 return SOLID_ACCESS_DENIAL .equals (type .toString ()) || QN_ACCESS_DENIAL .equals (type )
862899 || FQ_ACCESS_DENIAL .equals (type );
863900 }
901+
902+ private static void linkRequest (final Map <String , Object > consent , final URI request , final boolean verifiedLink ) {
903+ if (verifiedLink ) {
904+ consent .put (VERIFIED_REQUEST , request );
905+ } else {
906+ consent .put (REQUEST , request );
907+ }
908+ }
864909}
0 commit comments