MAILBOX-292 MaildirId should be relying on UUID As these ids are randomly allocated, using 128 bits instead of 32 allow to drastically reduce chances of collisions.
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/acdb0da0 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/acdb0da0 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/acdb0da0 Branch: refs/heads/master Commit: acdb0da00935a83ab4bbc08b891e615f5a688f12 Parents: 7e32da5 Author: Benoit Tellier <btell...@linagora.com> Authored: Mon Dec 3 10:14:33 2018 +0700 Committer: Benoit Tellier <btell...@linagora.com> Committed: Tue Dec 4 15:47:47 2018 +0700 ---------------------------------------------------------------------- .../james/mailbox/maildir/MaildirFolder.java | 13 ++--- .../apache/james/mailbox/maildir/MaildirId.java | 59 ++++++++------------ .../maildir/MaildirMailboxIdDeserializer.java | 2 +- .../maildir/mail/MaildirMailboxMapper.java | 3 +- .../MaildirMailboxIdDeserializerTest.java | 6 +- 5 files changed, 35 insertions(+), 48 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/acdb0da0/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java ---------------------------------------------------------------------- diff --git a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java index b31b522..bbb7694 100644 --- a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java +++ b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java @@ -27,6 +27,7 @@ import java.io.FilenameFilter; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedList; @@ -39,6 +40,7 @@ import java.util.SortedMap; import java.util.TreeMap; import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.ArrayUtils; import org.apache.james.mailbox.MailboxPathLocker; import org.apache.james.mailbox.MailboxPathLocker.LockAwareExecution; @@ -324,12 +326,9 @@ public class MaildirFolder { saveMailboxId(maildirId); return maildirId; } - try (FileInputStream fis = new FileInputStream(mailboxIdFile); - InputStreamReader isr = new InputStreamReader(fis)) { - char[] mailboxId = new char[20]; - int len = isr.read(mailboxId); - int idAsInt = Integer.parseInt(String.valueOf(mailboxId, 0, len).trim()); - return MaildirId.of(idAsInt); + try (FileInputStream fileInputStream = new FileInputStream(mailboxIdFile)) { + String serializedMaildirId = IOUtils.toString(fileInputStream, StandardCharsets.UTF_8); + return MaildirId.fromString(serializedMaildirId); } } @@ -343,7 +342,7 @@ public class MaildirFolder { throw new IOException("Could not create file " + mailboxIdFile); } try (FileOutputStream fos = new FileOutputStream(mailboxIdFile)) { - fos.write(String.valueOf(id.getRawId()).getBytes()); + fos.write(id.serialize().getBytes(StandardCharsets.UTF_8)); } } http://git-wip-us.apache.org/repos/asf/james-project/blob/acdb0da0/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirId.java ---------------------------------------------------------------------- diff --git a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirId.java b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirId.java index 18df444..f620a9d 100644 --- a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirId.java +++ b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirId.java @@ -19,7 +19,8 @@ package org.apache.james.mailbox.maildir; import java.io.Serializable; -import java.security.SecureRandom; +import java.util.Objects; +import java.util.UUID; import org.apache.james.mailbox.model.MailboxId; @@ -28,64 +29,50 @@ public class MaildirId implements MailboxId, Serializable { public static class Factory implements MailboxId.Factory { @Override public MaildirId fromString(String serialized) { - return of(Integer.valueOf(serialized)); + return MaildirId.fromString(serialized); } } - private static final SecureRandom RANDOM = new SecureRandom(); - public static MaildirId random() { - return MaildirId.of(Math.abs(RANDOM.nextInt())); + return MaildirId.of(UUID.randomUUID()); } - public static MaildirId of(int id) { + public static MaildirId of(UUID id) { return new MaildirId(id); } - private final int id; - - private MaildirId(int id) { - this.id = id; + public static MaildirId fromString(String serialized) { + return of(UUID.fromString(serialized)); } - public int getRawId() { - return id; + private final UUID id; + + private MaildirId(UUID id) { + this.id = id; } @Override public String serialize() { - return String.valueOf(id); + return id.toString(); } @Override public String toString() { - return String.valueOf(id); - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + id; - return result; + return id.toString(); } @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - MaildirId other = (MaildirId) obj; - if (id != other.id) { - return false; + public final boolean equals(Object o) { + if (o instanceof MaildirId) { + MaildirId maildirId = (MaildirId) o; + + return Objects.equals(this.id, maildirId.id); } - return true; + return false; } + @Override + public final int hashCode() { + return Objects.hash(id); + } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/james-project/blob/acdb0da0/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMailboxIdDeserializer.java ---------------------------------------------------------------------- diff --git a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMailboxIdDeserializer.java b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMailboxIdDeserializer.java index 16f301c..088b5b8 100644 --- a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMailboxIdDeserializer.java +++ b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMailboxIdDeserializer.java @@ -27,7 +27,7 @@ public class MaildirMailboxIdDeserializer implements MailboxIdDeserializer { @Override public MaildirId deserialize(String serializedMailboxId) throws MailboxIdDeserialisationException { try { - return MaildirId.of(Integer.valueOf(serializedMailboxId)); + return MaildirId.fromString(serializedMailboxId); } catch (Exception e) { throw new MailboxIdDeserialisationException("Can not deserialize " + serializedMailboxId, e); } http://git-wip-us.apache.org/repos/asf/james-project/blob/acdb0da0/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java ---------------------------------------------------------------------- diff --git a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java index 454d857..173aba6 100644 --- a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java +++ b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java @@ -24,7 +24,6 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Optional; -import java.util.Random; import java.util.regex.Pattern; import org.apache.commons.io.FileUtils; @@ -198,7 +197,7 @@ public class MaildirMailboxMapper extends NonTransactionalMapper implements Mail FileUtils.forceMkdir(originalFolder.getCurFolder()); FileUtils.forceMkdir(originalFolder.getNewFolder()); FileUtils.forceMkdir(originalFolder.getTmpFolder()); - originalFolder.setMailboxId(MaildirId.of(Math.abs(new Random().nextInt()))); + originalFolder.setMailboxId(MaildirId.random()); } catch (IOException e) { throw new MailboxException("Failed to save Mailbox " + mailbox, e); } http://git-wip-us.apache.org/repos/asf/james-project/blob/acdb0da0/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/MaildirMailboxIdDeserializerTest.java ---------------------------------------------------------------------- diff --git a/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/MaildirMailboxIdDeserializerTest.java b/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/MaildirMailboxIdDeserializerTest.java index a56a0fc..b1e1667 100644 --- a/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/MaildirMailboxIdDeserializerTest.java +++ b/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/MaildirMailboxIdDeserializerTest.java @@ -21,6 +21,8 @@ package org.apache.james.mailbox.maildir; import static org.assertj.core.api.Assertions.assertThat; +import java.util.UUID; + import org.apache.james.mailbox.store.mail.model.MailboxIdDeserialisationException; import org.apache.james.mailbox.store.mail.model.MailboxIdDeserializer; import org.junit.Before; @@ -28,9 +30,9 @@ import org.junit.Test; public class MaildirMailboxIdDeserializerTest { - private static final String SERIALIZED_ID = "123"; + private static final String SERIALIZED_ID = "2f3a4fcc-ca64-36e3-9bcf-33e92dd93135"; private static final String MALFORMED_SERIALIZED_ID = "az"; - private static final MaildirId MAILDIR_ID = MaildirId.of(Integer.valueOf(SERIALIZED_ID)); + private static final MaildirId MAILDIR_ID = MaildirId.of(UUID.fromString(SERIALIZED_ID)); private MailboxIdDeserializer mailboxIdDeserializer; --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org