You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by bd...@apache.org on 2022/09/16 19:19:12 UTC

[directory-scimple] branch etag-exception created (now 593109cb)

This is an automated email from the ASF dual-hosted git repository.

bdemers pushed a change to branch etag-exception
in repository https://gitbox.apache.org/repos/asf/directory-scimple.git


      at 593109cb Add etag specific exception

This branch includes the following new commits:

     new 593109cb Add etag specific exception

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[directory-scimple] 01/01: Add etag specific exception

Posted by bd...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

bdemers pushed a commit to branch etag-exception
in repository https://gitbox.apache.org/repos/asf/directory-scimple.git

commit 593109cb83b9490c0cbd81954276522e57bcb19c
Author: Brian Demers <bd...@apache.org>
AuthorDate: Fri Sep 16 15:19:02 2022 -0400

    Add etag specific exception
    
    Prevent leaking of implementation details of etag generation
---
 .../server/exception/EtagGenerationException.java  | 31 +++++++++++++++++++++
 .../server/rest/BaseResourceTypeResourceImpl.java  |  4 +--
 .../directory/scim/server/rest/EtagGenerator.java  | 32 +++++++++++-----------
 .../rest/ServiceProviderConfigResourceImpl.java    |  7 ++---
 4 files changed, 51 insertions(+), 23 deletions(-)

diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/exception/EtagGenerationException.java b/scim-server/src/main/java/org/apache/directory/scim/server/exception/EtagGenerationException.java
new file mode 100644
index 00000000..6f57cde4
--- /dev/null
+++ b/scim-server/src/main/java/org/apache/directory/scim/server/exception/EtagGenerationException.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.directory.scim.server.exception;
+
+public class EtagGenerationException extends Exception {
+
+  public EtagGenerationException(String message) {
+    super(message);
+  }
+
+  public EtagGenerationException(String message, Throwable cause) {
+    super(message, cause);
+  }
+}
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/rest/BaseResourceTypeResourceImpl.java b/scim-server/src/main/java/org/apache/directory/scim/server/rest/BaseResourceTypeResourceImpl.java
index da459c8a..c1850748 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/rest/BaseResourceTypeResourceImpl.java
+++ b/scim-server/src/main/java/org/apache/directory/scim/server/rest/BaseResourceTypeResourceImpl.java
@@ -394,7 +394,7 @@ public abstract class BaseResourceTypeResourceImpl<T extends ScimResource> imple
   private EntityTag requireEtag(ScimResource resource) throws ScimException {
     try {
       return etagGenerator.generateEtag(resource);
-    } catch (JsonProcessingException | NoSuchAlgorithmException | UnsupportedEncodingException e) {
+    } catch (EtagGenerationException e) {
       throw new ScimException(Status.INTERNAL_SERVER_ERROR, "Failed to generate the etag", e);
     }
   }
@@ -402,7 +402,7 @@ public abstract class BaseResourceTypeResourceImpl<T extends ScimResource> imple
   private EntityTag etag(ScimResource resource) {
     try {
       return etagGenerator.generateEtag(resource);
-    } catch (JsonProcessingException | NoSuchAlgorithmException | UnsupportedEncodingException e) {
+    } catch (EtagGenerationException e) {
       log.warn("Failed to generate etag for resource", e);
       return null;
     }
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/rest/EtagGenerator.java b/scim-server/src/main/java/org/apache/directory/scim/server/rest/EtagGenerator.java
index 73476f48..e3c4b67b 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/rest/EtagGenerator.java
+++ b/scim-server/src/main/java/org/apache/directory/scim/server/rest/EtagGenerator.java
@@ -22,15 +22,11 @@ package org.apache.directory.scim.server.rest;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import jakarta.enterprise.context.ApplicationScoped;
-import jakarta.inject.Inject;
-import jakarta.inject.Named;
-import jdk.jfr.Name;
-import org.apache.directory.scim.core.schema.SchemaRegistry;
+import org.apache.directory.scim.server.exception.EtagGenerationException;
 import org.apache.directory.scim.spec.resources.ScimResource;
 import org.apache.directory.scim.spec.schema.Meta;
 
 import jakarta.ws.rs.core.EntityTag;
-import java.io.UnsupportedEncodingException;
 import java.nio.charset.StandardCharsets;
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
@@ -41,23 +37,27 @@ public class EtagGenerator {
 
   private final ObjectMapper objectMapper = ObjectMapperFactory.getObjectMapper();
 
-  public EntityTag generateEtag(ScimResource resource) throws JsonProcessingException, NoSuchAlgorithmException, UnsupportedEncodingException {
+  public EntityTag generateEtag(ScimResource resource) throws EtagGenerationException {
 
-    Meta meta = resource.getMeta();
+    try {
+      Meta meta = resource.getMeta();
 
-    if (meta == null) {
-      meta = new Meta();
-    }
+      if (meta == null) {
+        meta = new Meta();
+      }
 
-    resource.setMeta(null);
-    String writeValueAsString = objectMapper.writeValueAsString(resource);
+      resource.setMeta(null);
+      String writeValueAsString = objectMapper.writeValueAsString(resource);
 
-    EntityTag etag = hash(writeValueAsString);
-    meta.setVersion(etag.getValue());
+      EntityTag etag = hash(writeValueAsString);
+      meta.setVersion(etag.getValue());
 
-    resource.setMeta(meta);
+      resource.setMeta(meta);
 
-    return etag;
+      return etag;
+    } catch (JsonProcessingException | NoSuchAlgorithmException e) {
+      throw new EtagGenerationException("Failed to generate etag for SCIM resource: " + resource.getId(), e);
+    }
   }
   
   private static EntityTag hash(String input) throws NoSuchAlgorithmException {
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/rest/ServiceProviderConfigResourceImpl.java b/scim-server/src/main/java/org/apache/directory/scim/server/rest/ServiceProviderConfigResourceImpl.java
index 26582a4f..4b803791 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/rest/ServiceProviderConfigResourceImpl.java
+++ b/scim-server/src/main/java/org/apache/directory/scim/server/rest/ServiceProviderConfigResourceImpl.java
@@ -19,8 +19,6 @@
 
 package org.apache.directory.scim.server.rest;
 
-import java.io.UnsupportedEncodingException;
-import java.security.NoSuchAlgorithmException;
 import java.time.LocalDateTime;
 import java.util.List;
 
@@ -31,11 +29,10 @@ import jakarta.ws.rs.core.Response;
 import jakarta.ws.rs.core.UriInfo;
 import jakarta.ws.rs.core.Response.Status;
 
-import com.fasterxml.jackson.core.JsonProcessingException;
-
 import org.apache.directory.scim.server.configuration.ServerConfiguration;
 import org.apache.directory.scim.protocol.ServiceProviderConfigResource;
 import org.apache.directory.scim.protocol.data.ErrorResponse;
+import org.apache.directory.scim.server.exception.EtagGenerationException;
 import org.apache.directory.scim.spec.schema.Meta;
 import org.apache.directory.scim.spec.schema.ServiceProviderConfiguration;
 import org.apache.directory.scim.spec.schema.ServiceProviderConfiguration.AuthenticationSchema;
@@ -97,7 +94,7 @@ public class ServiceProviderConfigResourceImpl implements ServiceProviderConfigR
     try {
       EntityTag etag = etagGenerator.generateEtag(serviceProviderConfiguration);
       return Response.ok(serviceProviderConfiguration).tag(etag).build();
-    } catch (JsonProcessingException | NoSuchAlgorithmException | UnsupportedEncodingException e) {
+    } catch (EtagGenerationException e) {
       return createETagErrorResponse();
     }
   }