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]

Reply via email to