Skip to content

Commit

Permalink
Fix signature class cast issue __WIP__
Browse files Browse the repository at this point in the history
  • Loading branch information
kullmanp committed Sep 8, 2023
1 parent f1338e7 commit 5201325
Show file tree
Hide file tree
Showing 8 changed files with 58 additions and 46 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
import static java.lang.String.format;

public class ContextHelper {
public Object getOrderedSignatures(Signature signature) {
public Object getOrderedSignatures(Signature2 signature) {
SortedSet<Entry<String, Date>> ret = new TreeSet<>(Comparator.comparing((Function<Entry<String, Date>, Date>) Entry::getValue)
.thenComparing(Entry::getKey));
ret.addAll(signature.getSignatures().entrySet());
Expand All @@ -38,7 +38,7 @@ public final <K> Set<K> union(Set<K>... sets) {

public Map<String, UserProfile> getProfiles(UserManager userManager, Set<String> userNames) {
Map<String, UserProfile> 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));
}
Expand All @@ -52,7 +52,7 @@ public UserProfile getProfileNotNull(UserManager userManager, String userName) {

public SortedSet<UserProfile> getOrderedProfiles(UserManager userManager, Set<String> userNames) {
SortedSet<UserProfile> 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));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,10 +82,10 @@ public String execute(Map<String, String> params, String body, ConversionContext
}

Set<String> userGroups = getSet(params, "signerGroups");
boolean petitionMode = Signature.isPetitionMode(userGroups);
boolean petitionMode = Signature2.isPetitionMode(userGroups);
Set<String> 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)) {
Expand All @@ -100,7 +100,7 @@ public String execute(Map<String, String> params, String body, ConversionContext
}

@NotNull
private Map<String, Object> buildContext(Map<String, String> params, ConversionContext conversionContext, ContentEntityObject page, Signature signature, boolean protectedContent) {
private Map<String, Object> buildContext(Map<String, String> 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));
Expand Down Expand Up @@ -135,7 +135,7 @@ private Map<String, Object> buildContext(Map<String, String> 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);
Expand All @@ -160,15 +160,15 @@ private void ensureProtectedPage(ConversionContext conversionContext, Page page,
}
}

private boolean hideSignatures(Map<String, String> params, Signature signature, String currentUserName) {
private boolean hideSignatures(Map<String, String> 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<>());
if (!signaturesVisible) signature.setSignatures(new HashMap<>());
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);
Expand Down Expand Up @@ -268,8 +268,8 @@ private Set<String> getSet(Map<String, String> params, String key) {
return value == null || value.trim().isEmpty() ? new TreeSet<>() : new TreeSet<>(asList(value.split("[;, ]+")));
}

private Signature sync(Signature signature, Set<String> signers) {
Signature loaded = Signature.fromBandana(this.bandanaManager, signature.getKey());
private Signature2 sync(Signature2 signature, Set<String> signers) {
Signature2 loaded = Signature2.fromBandana(this.bandanaManager, signature.getKey());
if (loaded != null) {
signature.setSignatures(loaded.getSignatures());
boolean save = false;
Expand Down Expand Up @@ -306,9 +306,9 @@ private Signature sync(Signature signature, Set<String> signers) {
return signature;
}

private void save(Signature signature) {
private void save(Signature2 signature) {
if (signature.hasMissingSignatures()) {
Signature.toBandana(bandanaManager, signature);
Signature2.toBandana(bandanaManager, signature);
}
}

Expand All @@ -322,7 +322,7 @@ public OutputType getOutputType() {
return OutputType.BLOCK;
}

protected String getMailto(Collection<UserProfile> profiles, String subject, boolean signed, Signature signature) {
protected String getMailto(Collection<UserProfile> profiles, String subject, boolean signed, Signature2 signature) {
if (profiles == null || profiles.isEmpty()) return null;
Collection<UserProfile> profilesWithMail = profiles.stream().filter(contextHelper::hasEmail).collect(toList());
StringBuilder ret = new StringBuilder("mailto:");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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();
Expand All @@ -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);
Expand All @@ -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);

Expand Down Expand Up @@ -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"));
Expand Down Expand Up @@ -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"));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand All @@ -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");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ class SignatureTest {
class SerializationTest {
@Test
void serialize_empty() {
Signature signature = new Signature();
Signature2 signature = new Signature2();

String json = signature.serialize();

Expand All @@ -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"));
Expand All @@ -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);
Expand All @@ -62,50 +62,50 @@ 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() {
ArgumentCaptor<String> stringCapator = ArgumentCaptor.forClass(String.class);
ArgumentCaptor<Object> 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()));
}
}
}

0 comments on commit 5201325

Please sign in to comment.