From 52013258db22035b55c43ce3e7a9e6fc156123cf Mon Sep 17 00:00:00 2001 From: Peter Kullmann Date: Fri, 8 Sep 2023 16:47:24 +0200 Subject: [PATCH] Fix signature class cast issue __WIP__ --- .../digitalsignature/ContextHelper.java | 6 ++-- .../DigitalSignatureMacro.java | 22 +++++++-------- .../digitalsignature/Signature.java | 1 + .../digitalsignature/Signature2.java | 16 ++++++++--- .../rest/DigitalSignatureService.java | 21 ++++++++------ .../DigitalSignatureMacroTest.java | 2 +- .../SignatureSerialisationTest.java | 8 +++--- .../digitalsignature/SignatureTest.java | 28 +++++++++---------- 8 files changed, 58 insertions(+), 46 deletions(-) diff --git a/src/main/java/com/baloise/confluence/digitalsignature/ContextHelper.java b/src/main/java/com/baloise/confluence/digitalsignature/ContextHelper.java index ff65eaa..2c67bc6 100644 --- a/src/main/java/com/baloise/confluence/digitalsignature/ContextHelper.java +++ b/src/main/java/com/baloise/confluence/digitalsignature/ContextHelper.java @@ -11,7 +11,7 @@ import static java.lang.String.format; public class ContextHelper { - public Object getOrderedSignatures(Signature signature) { + public Object getOrderedSignatures(Signature2 signature) { SortedSet> ret = new TreeSet<>(Comparator.comparing((Function, Date>) Entry::getValue) .thenComparing(Entry::getKey)); ret.addAll(signature.getSignatures().entrySet()); @@ -38,7 +38,7 @@ public final Set union(Set... sets) { public Map getProfiles(UserManager userManager, Set userNames) { Map ret = new HashMap<>(); - if (Signature.isPetitionMode(userNames)) return ret; + if (Signature2.isPetitionMode(userNames)) return ret; for (String userName : userNames) { ret.put(userName, getProfileNotNull(userManager, userName)); } @@ -52,7 +52,7 @@ public UserProfile getProfileNotNull(UserManager userManager, String userName) { public SortedSet getOrderedProfiles(UserManager userManager, Set userNames) { SortedSet ret = new TreeSet<>(new UserProfileByName()); - if (Signature.isPetitionMode(userNames)) return ret; + if (Signature2.isPetitionMode(userNames)) return ret; for (String userName : userNames) { ret.add(getProfileNotNull(userManager, userName)); } diff --git a/src/main/java/com/baloise/confluence/digitalsignature/DigitalSignatureMacro.java b/src/main/java/com/baloise/confluence/digitalsignature/DigitalSignatureMacro.java index 8f28d40..f77e527 100644 --- a/src/main/java/com/baloise/confluence/digitalsignature/DigitalSignatureMacro.java +++ b/src/main/java/com/baloise/confluence/digitalsignature/DigitalSignatureMacro.java @@ -82,10 +82,10 @@ public String execute(Map params, String body, ConversionContext } Set userGroups = getSet(params, "signerGroups"); - boolean petitionMode = Signature.isPetitionMode(userGroups); + boolean petitionMode = Signature2.isPetitionMode(userGroups); Set signers = petitionMode ? all : contextHelper.union(getSet(params, "signers"), loadUserGroups(userGroups), loadInheritedSigners(InheritSigners.ofValue(params.get("inheritSigners")), conversionContext)); ContentEntityObject entity = conversionContext.getEntity(); - Signature signature = sync(new Signature(entity.getLatestVersionId(), body, params.get("title")).withNotified(getSet(params, "notified")).withMaxSignatures(getLong(params, "maxSignatures", -1)).withVisibilityLimit(getLong(params, "visibilityLimit", -1)), signers); + Signature2 signature = sync(new Signature2(entity.getLatestVersionId(), body, params.get("title")).withNotified(getSet(params, "notified")).withMaxSignatures(getLong(params, "maxSignatures", -1)).withVisibilityLimit(getLong(params, "visibilityLimit", -1)), signers); boolean protectedContent = getBoolean(params, "protectedContent", false); if (protectedContent && isPage(conversionContext)) { @@ -100,7 +100,7 @@ public String execute(Map params, String body, ConversionContext } @NotNull - private Map buildContext(Map params, ConversionContext conversionContext, ContentEntityObject page, Signature signature, boolean protectedContent) { + private Map buildContext(Map params, ConversionContext conversionContext, ContentEntityObject page, Signature2 signature, boolean protectedContent) { ConfluenceUser currentUser = AuthenticatedUserThreadLocal.get(); String currentUserName = currentUser.getName(); boolean protectedContentAccess = protectedContent && (permissionManager.hasPermission(currentUser, Permission.EDIT, page) || signature.hasSigned(currentUserName)); @@ -135,7 +135,7 @@ private Map buildContext(Map params, ConversionC return context; } - private void ensureProtectedPage(ConversionContext conversionContext, Page page, Signature signature) { + private void ensureProtectedPage(ConversionContext conversionContext, Page page, Signature2 signature) { Page protectedPage = pageManager.getPage(conversionContext.getSpaceKey(), signature.getProtectedKey()); if (protectedPage == null) { ContentPermissionSet editors = page.getContentPermissionSet(EDIT_PERMISSION); @@ -160,7 +160,7 @@ private void ensureProtectedPage(ConversionContext conversionContext, Page page, } } - private boolean hideSignatures(Map params, Signature signature, String currentUserName) { + private boolean hideSignatures(Map params, Signature2 signature, String currentUserName) { boolean pendingVisible = isVisible(signature, currentUserName, params.get("pendingVisible")); boolean signaturesVisible = isVisible(signature, currentUserName, params.get("signaturesVisible")); if (!pendingVisible) signature.setMissingSignatures(new TreeSet<>()); @@ -168,7 +168,7 @@ private boolean hideSignatures(Map params, Signature signature, return pendingVisible && signaturesVisible; } - private boolean isVisible(Signature signature, String currentUserName, String signaturesVisibleParam) { + private boolean isVisible(Signature2 signature, String currentUserName, String signaturesVisibleParam) { switch (SignaturesVisible.ofValue(signaturesVisibleParam)) { case IF_SIGNATORY: return signature.hasSigned(currentUserName) || signature.isSignatory(currentUserName); @@ -268,8 +268,8 @@ private Set getSet(Map params, String key) { return value == null || value.trim().isEmpty() ? new TreeSet<>() : new TreeSet<>(asList(value.split("[;, ]+"))); } - private Signature sync(Signature signature, Set signers) { - Signature loaded = Signature.fromBandana(this.bandanaManager, signature.getKey()); + private Signature2 sync(Signature2 signature, Set signers) { + Signature2 loaded = Signature2.fromBandana(this.bandanaManager, signature.getKey()); if (loaded != null) { signature.setSignatures(loaded.getSignatures()); boolean save = false; @@ -306,9 +306,9 @@ private Signature sync(Signature signature, Set signers) { return signature; } - private void save(Signature signature) { + private void save(Signature2 signature) { if (signature.hasMissingSignatures()) { - Signature.toBandana(bandanaManager, signature); + Signature2.toBandana(bandanaManager, signature); } } @@ -322,7 +322,7 @@ public OutputType getOutputType() { return OutputType.BLOCK; } - protected String getMailto(Collection profiles, String subject, boolean signed, Signature signature) { + protected String getMailto(Collection profiles, String subject, boolean signed, Signature2 signature) { if (profiles == null || profiles.isEmpty()) return null; Collection profilesWithMail = profiles.stream().filter(contextHelper::hasEmail).collect(toList()); StringBuilder ret = new StringBuilder("mailto:"); diff --git a/src/main/java/com/baloise/confluence/digitalsignature/Signature.java b/src/main/java/com/baloise/confluence/digitalsignature/Signature.java index e084eed..dac0c95 100644 --- a/src/main/java/com/baloise/confluence/digitalsignature/Signature.java +++ b/src/main/java/com/baloise/confluence/digitalsignature/Signature.java @@ -9,6 +9,7 @@ import java.util.Set; import java.util.TreeSet; +@Deprecated public class Signature implements Serializable, Cloneable { private static final long serialVersionUID = 1L; diff --git a/src/main/java/com/baloise/confluence/digitalsignature/Signature2.java b/src/main/java/com/baloise/confluence/digitalsignature/Signature2.java index e57dfad..f57d350 100644 --- a/src/main/java/com/baloise/confluence/digitalsignature/Signature2.java +++ b/src/main/java/com/baloise/confluence/digitalsignature/Signature2.java @@ -68,11 +68,19 @@ public static Signature2 fromBandana(BandanaManager mgr, String key) { throw new IllegalArgumentException("Value is null in Bandana???"); } - if (value instanceof Signature2) { + if (value instanceof Signature) { // required for downward compatibility - update for next time. - Signature2 signature = (Signature2) value; - toBandana(mgr, key, signature); - return signature; + Signature signature = (Signature) value; + Signature2 sig = new Signature2(signature.getPageId(), signature.getBody(), signature.getTitle()); + sig.setSignatures(signature.getSignatures()); + sig.setMaxSignatures(signature.getMaxSignatures()); + sig.setHash(signature.getHash()); + sig.setKey(signature.getKey()); + sig.setNotify(signature.getNotify()); + sig.setMissingSignatures(signature.getMissingSignatures()); + sig.setVisibilityLimit(signature.getVisibilityLimit()); + toBandana(mgr, key, sig); + return sig; } if (value instanceof String) { diff --git a/src/main/java/com/baloise/confluence/digitalsignature/rest/DigitalSignatureService.java b/src/main/java/com/baloise/confluence/digitalsignature/rest/DigitalSignatureService.java index 587b492..1feaf23 100644 --- a/src/main/java/com/baloise/confluence/digitalsignature/rest/DigitalSignatureService.java +++ b/src/main/java/com/baloise/confluence/digitalsignature/rest/DigitalSignatureService.java @@ -20,13 +20,16 @@ import com.atlassian.velocity.htmlsafe.HtmlSafe; import com.baloise.confluence.digitalsignature.ContextHelper; import com.baloise.confluence.digitalsignature.Markdown; -import com.baloise.confluence.digitalsignature.Signature; +import com.baloise.confluence.digitalsignature.Signature2; import org.apache.velocity.tools.generic.DateTool; -import org.jsoup.helper.StringUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.ws.rs.*; +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; @@ -87,9 +90,9 @@ public Response sign(@QueryParam("key") final String key, @Context UriInfo uriInfo) { ConfluenceUser confluenceUser = AuthenticatedUserThreadLocal.get(); String userName = confluenceUser.getName(); - Signature signature = Signature.fromBandana(bandanaManager, key); + Signature2 signature = Signature2.fromBandana(bandanaManager, key); - if (signature == null || StringUtil.isBlank(userName)) { + if (signature == null || userName == null || userName.trim().isEmpty()) { log.error("Both, a signature and a user name are required to call this method.", new NullPointerException(signature == null ? "signature" : "userName")); return Response.noContent().build(); @@ -102,7 +105,7 @@ public Response sign(@QueryParam("key") final String key, .build(); } - Signature.toBandana(bandanaManager, key, signature); + Signature2.toBandana(bandanaManager, key, signature); String baseUrl = settingsManager.getGlobalSettings().getBaseUrl(); for (String notifiedUser : signature.getNotify()) { notify(notifiedUser, confluenceUser, signature, baseUrl); @@ -118,7 +121,7 @@ public Response sign(@QueryParam("key") final String key, return temporaryRedirect(pageUri).build(); } - private void notify(final String notifiedUser, ConfluenceUser signedUser, final Signature signature, final String baseUrl) { + private void notify(final String notifiedUser, ConfluenceUser signedUser, final Signature2 signature, final String baseUrl) { try { UserProfile notifiedUserProfile = contextHelper.getProfileNotNull(userManager, notifiedUser); @@ -171,7 +174,7 @@ private void notify(final String notifiedUser, ConfluenceUser signedUser, final @Produces("text/html; charset=UTF-8") @HtmlSafe public String export(@QueryParam("key") final String key) { - Signature signature = Signature.fromBandana(bandanaManager, key); + Signature2 signature = Signature2.fromBandana(bandanaManager, key); if (signature == null) { log.error("A signature is required to call this method.", new NullPointerException("signature")); @@ -200,7 +203,7 @@ public Response emails(@QueryParam("key") final String key, @QueryParam("signed") final boolean signed, @QueryParam("emailOnly") final boolean emailOnly, @Context UriInfo uriInfo) { - Signature signature = Signature.fromBandana(bandanaManager, key); + Signature2 signature = Signature2.fromBandana(bandanaManager, key); if (signature == null) { log.error("A signature is required to call this method.", new NullPointerException("signature")); diff --git a/src/test/java/com/baloise/confluence/digitalsignature/DigitalSignatureMacroTest.java b/src/test/java/com/baloise/confluence/digitalsignature/DigitalSignatureMacroTest.java index 8bebb10..8a0aa02 100644 --- a/src/test/java/com/baloise/confluence/digitalsignature/DigitalSignatureMacroTest.java +++ b/src/test/java/com/baloise/confluence/digitalsignature/DigitalSignatureMacroTest.java @@ -13,7 +13,7 @@ import static org.mockito.Mockito.when; class DigitalSignatureMacroTest { - private final Signature signature = new Signature(1, "test", "title"); + private final Signature2 signature = new Signature2(1, "test", "title"); private final BootstrapManager bootstrapManager = mock(BootstrapManager.class); private final BandanaManager bandana = mock(BandanaManager.class); diff --git a/src/test/java/com/baloise/confluence/digitalsignature/SignatureSerialisationTest.java b/src/test/java/com/baloise/confluence/digitalsignature/SignatureSerialisationTest.java index b33aca5..9542834 100644 --- a/src/test/java/com/baloise/confluence/digitalsignature/SignatureSerialisationTest.java +++ b/src/test/java/com/baloise/confluence/digitalsignature/SignatureSerialisationTest.java @@ -18,7 +18,7 @@ class SignatureSerialisationTest { @Test void deserialize() throws IOException, ClassNotFoundException { ObjectInputStream in = new ObjectInputStream(getClass().getResourceAsStream("/signature.ser")); - Signature signature = (Signature) in.readObject(); + Signature2 signature = (Signature2) in.readObject(); in.close(); assertAll( @@ -29,16 +29,16 @@ void deserialize() throws IOException, ClassNotFoundException { () -> assertEquals(9999, signature.getSignatures().get("signed1").getTime()), // assert we can still read the old gson serialization - () -> assertEquals(signature, Signature.deserialize(SIG_JSON)), + () -> assertEquals(signature, Signature2.deserialize(SIG_JSON)), // assert that deserialization of the serialization results in the original Signature - () -> assertEquals(signature, Signature.deserialize(signature.serialize())) + () -> assertEquals(signature, Signature2.deserialize(signature.serialize())) ); } @Test void serialize() throws IOException, ClassNotFoundException { - Signature signature = new Signature(123L, "body", "title"); + Signature2 signature = new Signature2(123L, "body", "title"); signature.getNotify().add("notify1"); signature.getMissingSignatures().add("missing1"); signature.getMissingSignatures().add("missing2"); diff --git a/src/test/java/com/baloise/confluence/digitalsignature/SignatureTest.java b/src/test/java/com/baloise/confluence/digitalsignature/SignatureTest.java index a43c8b3..3c2212c 100644 --- a/src/test/java/com/baloise/confluence/digitalsignature/SignatureTest.java +++ b/src/test/java/com/baloise/confluence/digitalsignature/SignatureTest.java @@ -18,7 +18,7 @@ class SignatureTest { class SerializationTest { @Test void serialize_empty() { - Signature signature = new Signature(); + Signature2 signature = new Signature2(); String json = signature.serialize(); @@ -27,7 +27,7 @@ void serialize_empty() { @Test void serialize_initializedObject() { - Signature signature = new Signature(42L, "body text", "title text"); + Signature2 signature = new Signature2(42L, "body text", "title text"); signature.sign("max.mustermann"); signature.setMissingSignatures(Collections.singleton("max.muster")); signature.setNotify(Collections.singleton("max.meier")); @@ -39,20 +39,20 @@ void serialize_initializedObject() { @Test void deserialize_empty() { - assertNull(Signature.deserialize(null)); - assertNull(Signature.deserialize("")); + assertNull(Signature2.deserialize(null)); + assertNull(Signature2.deserialize("")); } @Test void serializeAndDeserialize() { - Signature signature = new Signature(42L, "body text", "title text"); + Signature2 signature = new Signature2(42L, "body text", "title text"); signature.sign("max.mustermann"); signature.setMissingSignatures(Collections.singleton("max.muster")); signature.setNotify(Collections.singleton("max.meier")); String json = signature.serialize(); - Signature restoredSignature = Signature.deserialize(json); + Signature2 restoredSignature = Signature2.deserialize(json); assertEquals("{\"key\":\"signature.752b4cc6b4933fc7f0a6efa819c1bcc440c32155457e836d99d1bfe927cc22f5\",\"hash\":\"752b4cc6b4933fc7f0a6efa819c1bcc440c32155457e836d99d1bfe927cc22f5\",\"pageId\":42,\"title\":\"title text\",\"body\":\"body text\",\"maxSignatures\":-1,\"visibilityLimit\":-1,\"signatures\":{},\"missingSignatures\":[\"max.muster\"],\"notify\":[\"max.meier\"]}", json); assertEquals(signature, restoredSignature); @@ -62,7 +62,7 @@ void serializeAndDeserialize() { @Nested class BandanaWrapperTest { private final BandanaManager bandana = mock(DefaultBandanaManager.class); - private final Signature signature = new Signature(1, "test", "title"); + private final Signature2 signature = new Signature2(1, "test", "title"); @Test void toBandanaFromBandana_readAsWritten() { @@ -70,42 +70,42 @@ void toBandanaFromBandana_readAsWritten() { ArgumentCaptor objectCapator = ArgumentCaptor.forClass(Object.class); String key = signature.getKey(); - assertNull(Signature.fromBandana(bandana, key), "Should not be there yet."); + assertNull(Signature2.fromBandana(bandana, key), "Should not be there yet."); doNothing().when(bandana).setValue(any(), stringCapator.capture(), objectCapator.capture()); when(bandana.getKeys(any())).thenReturn(Collections.singletonList(key)); - Signature.toBandana(bandana, signature); + Signature2.toBandana(bandana, signature); assertEquals(key, stringCapator.getValue()); assertEquals(signature.serialize(), objectCapator.getValue()); when(bandana.getValue(any(), any())).thenCallRealMethod(); when(bandana.getValue(any(), eq(key), eq(true))).thenReturn(signature); - assertEquals(signature, Signature.fromBandana(bandana, signature.getKey())); + assertEquals(signature, Signature2.fromBandana(bandana, signature.getKey())); } @Test void fromBandana_signature_signature() { String key = signature.getKey(); - assertNull(Signature.fromBandana(bandana, key), "Should not be there yet."); + assertNull(Signature2.fromBandana(bandana, key), "Should not be there yet."); when(bandana.getKeys(any())).thenReturn(Collections.singletonList(key)); when(bandana.getValue(any(), any())).thenCallRealMethod(); when(bandana.getValue(any(), eq(key), eq(true))).thenReturn(signature); - assertEquals(signature, Signature.fromBandana(bandana, signature.getKey())); + assertEquals(signature, Signature2.fromBandana(bandana, signature.getKey())); } @Test void fromBandana_string_signature() { String key = signature.getKey(); - assertNull(Signature.fromBandana(bandana, key), "Should not be there yet."); + assertNull(Signature2.fromBandana(bandana, key), "Should not be there yet."); when(bandana.getKeys(any())).thenReturn(Collections.singletonList(key)); when(bandana.getValue(any(), any())).thenCallRealMethod(); when(bandana.getValue(any(), eq(key), eq(true))).thenReturn(signature.serialize()); - assertEquals(signature, Signature.fromBandana(bandana, signature.getKey())); + assertEquals(signature, Signature2.fromBandana(bandana, signature.getKey())); } } }