This is an automated email from the ASF dual-hosted git repository. btellier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit d0e76a3ab1fa2bb851048f3cc20a04dcbcd8acd7 Author: Benoit Tellier <[email protected]> AuthorDate: Fri Dec 3 11:28:57 2021 +0700 JAMES-3674 Have hashing logic encapsulated with algorithm --- .../org/apache/james/user/lib/model/Algorithm.java | 42 ++++++++++++++++++++++ .../apache/james/user/lib/model/DefaultUser.java | 18 +++------- 2 files changed, 47 insertions(+), 13 deletions(-) diff --git a/server/data/data-library/src/main/java/org/apache/james/user/lib/model/Algorithm.java b/server/data/data-library/src/main/java/org/apache/james/user/lib/model/Algorithm.java index 3cca98e..6e0222d 100644 --- a/server/data/data-library/src/main/java/org/apache/james/user/lib/model/Algorithm.java +++ b/server/data/data-library/src/main/java/org/apache/james/user/lib/model/Algorithm.java @@ -19,6 +19,12 @@ package org.apache.james.user.lib.model; +import static java.nio.charset.StandardCharsets.ISO_8859_1; + +import java.io.IOException; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.security.spec.InvalidKeySpecException; import java.util.Arrays; import java.util.List; import java.util.Objects; @@ -27,6 +33,36 @@ import com.google.common.base.Splitter; import com.google.common.collect.ImmutableList; public class Algorithm { + public interface Hasher { + static Hasher from(Algorithm algorithm) { + return new RegularHashingSpec(algorithm); + } + + byte[] digestString(String pass, String salt) throws IOException, NoSuchAlgorithmException, InvalidKeySpecException; + } + + public static class RegularHashingSpec implements Hasher { + private final Algorithm algorithm; + + public RegularHashingSpec(Algorithm algorithm) { + this.algorithm = algorithm; + } + + @Override + public byte[] digestString(String pass, String salt) throws NoSuchAlgorithmException { + MessageDigest md = MessageDigest.getInstance(algorithm.getName()); + String saltedPass = applySalt(algorithm, pass, salt); + return md.digest(saltedPass.getBytes(ISO_8859_1)); + } + + private String applySalt(Algorithm algorithm, String pass, String salt) { + if (algorithm.isSalted()) { + return salt + pass; + } else { + return pass; + } + } + } public enum HashingMode { PLAIN, @@ -61,10 +97,12 @@ public class Algorithm { private final String rawValue; private final HashingMode hashingMode; + private final Hasher hasher; private Algorithm(String rawValue, HashingMode hashingMode) { this.rawValue = rawValue; this.hashingMode = hashingMode; + this.hasher = Hasher.from(this); } public String asString() { @@ -87,6 +125,10 @@ public class Algorithm { return hashingMode == HashingMode.SALTED || hashingMode == HashingMode.LEGACY_SALTED; } + public Hasher hasher() { + return hasher; + } + @Override public final boolean equals(Object o) { if (o instanceof Algorithm) { diff --git a/server/data/data-library/src/main/java/org/apache/james/user/lib/model/DefaultUser.java b/server/data/data-library/src/main/java/org/apache/james/user/lib/model/DefaultUser.java index 96740ab..4a802de 100644 --- a/server/data/data-library/src/main/java/org/apache/james/user/lib/model/DefaultUser.java +++ b/server/data/data-library/src/main/java/org/apache/james/user/lib/model/DefaultUser.java @@ -25,8 +25,8 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; import java.io.Serializable; -import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; +import java.security.spec.InvalidKeySpecException; import javax.mail.MessagingException; import javax.mail.internet.MimeUtility; @@ -129,6 +129,8 @@ public class DefaultUser implements User, Serializable { return currentAlgorithm; } + + /** * Calculate digest of given String using given algorithm. Encode digest in * MIME-like base64. @@ -144,11 +146,9 @@ public class DefaultUser implements User, Serializable { */ static String digestString(String pass, Algorithm algorithm, String salt) throws NoSuchAlgorithmException { try { - MessageDigest md = MessageDigest.getInstance(algorithm.getName()); - String saltedPass = applySalt(algorithm, pass, salt); - byte[] digest = md.digest(saltedPass.getBytes(ISO_8859_1)); + byte[] digest = algorithm.hasher().digestString(pass, salt); return encodeInBase64(algorithm, digest); - } catch (IOException | MessagingException e) { + } catch (IOException | MessagingException | InvalidKeySpecException e) { throw new RuntimeException("Fatal error", e); } } @@ -162,12 +162,4 @@ public class DefaultUser implements User, Serializable { } return bos.toString(ISO_8859_1); } - - static String applySalt(Algorithm algorithm, String pass, String salt) { - if (algorithm.isSalted()) { - return salt + pass; - } else { - return pass; - } - } } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
