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:13 UTC

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

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();
     }
   }