James Moger
2015-03-07 45ed92bd767e9e88d70c14d81e8bbb7acd2e5fe2
Minor refactoring of user/team checksumming
2 files modified
97 ■■■■ changed files
src/main/java/com/gitblit/auth/AuthenticationProvider.java 64 ●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/utils/DeepCopier.java 33 ●●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/auth/AuthenticationProvider.java
@@ -15,13 +15,8 @@
 */
package com.gitblit.auth;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -33,6 +28,7 @@
import com.gitblit.models.TeamModel;
import com.gitblit.models.UserModel;
import com.gitblit.utils.ArrayUtils;
import com.gitblit.utils.DeepCopier;
import com.gitblit.utils.StringUtils;
public abstract class AuthenticationProvider {
@@ -83,69 +79,35 @@
        }
    }
    /**
     * Utility method to calculate the checksum of an object.
     * @param sourceObject The object from which to establish the checksum.
     * @return The checksum
     * @throws IOException
     * @throws NoSuchAlgorithmException
     */
    private BigInteger checksum(Object sourceObject) throws IOException, NoSuchAlgorithmException {
        if (sourceObject == null) {
          return BigInteger.ZERO;
        }
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        oos.writeObject(sourceObject);
        oos.close();
        MessageDigest m = MessageDigest.getInstance("SHA1");
        m.update(baos.toByteArray());
        return new BigInteger(1, m.digest());
    }
    protected void updateUser(UserModel userModel) {
        final UserModel userLocalDB = userManager.getUserModel(userModel.getName());
        try {
            // Establish the checksum of the current version of the user
            final BigInteger userCurrentCheck = checksum(userModel);
        final BigInteger userCurrentCheck = DeepCopier.checksum(userModel);
            // Establish the checksum of the stored version of the user
            final BigInteger userLocalDBcheck = checksum(userLocalDB);
        final BigInteger userLocalDBcheck = DeepCopier.checksum(userLocalDB);
            // Compare the checksums
            if (!userCurrentCheck.equals(userLocalDBcheck))
            {
        if (!userCurrentCheck.equals(userLocalDBcheck)) {
                // If mismatch, save the new instance.
                userManager.updateUserModel(userModel);
            }
        } catch (NoSuchAlgorithmException | IOException e) {
            // Trace any potential error.
            if (logger.isErrorEnabled()) {
                logger.error(e.getMessage());
            }
        }
    }
    protected void updateTeam(TeamModel teamModel) {
        final TeamModel teamLocalDB = userManager.getTeamModel(teamModel.name);
        try {
            // Establish the checksum of the current version of the team
            final BigInteger teamCurrentCheck = checksum(teamModel);
        final BigInteger teamCurrentCheck = DeepCopier.checksum(teamModel);
            // Establish the checksum of the stored version of the team
            final BigInteger teamLocalDBcheck = checksum(teamLocalDB);
        final BigInteger teamLocalDBcheck = DeepCopier.checksum(teamLocalDB);
            // Compare the checksums
            if (!teamCurrentCheck.equals(teamLocalDBcheck))
            {
        if (!teamCurrentCheck.equals(teamLocalDBcheck)) {
                // If mismatch, save the new instance.
                userManager.updateTeamModel(teamModel);
            }
        } catch (NoSuchAlgorithmException | IOException e) {
            // Trace any potential error.
            if (logger.isErrorEnabled()) {
                logger.error(e.getMessage());
            }
        }
    }
src/main/java/com/gitblit/utils/DeepCopier.java
@@ -23,10 +23,43 @@
import java.io.ObjectOutputStream;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class DeepCopier {
    /**
     * Utility method to calculate the checksum of an object.
     * @param sourceObject The object from which to establish the checksum.
     * @return The checksum
     * @throws IOException
     */
    public static BigInteger checksum(Object sourceObject) {
        if (sourceObject == null) {
          return BigInteger.ZERO;
        }
        try {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(baos);
            oos.writeObject(sourceObject);
            oos.close();
            MessageDigest m = MessageDigest.getInstance("SHA-1");
            m.update(baos.toByteArray());
            return new BigInteger(1, m.digest());
        } catch (IOException e) {
            throw new RuntimeException(e);
        } catch (NoSuchAlgorithmException e) {
            // impossible
        }
        return BigInteger.ZERO;
    }
    /**
     * Produce a deep copy of the given object. Serializes the entire object to
     * a byte array in memory. Recommended for relatively small objects.
     */