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