James Moger
2015-03-07 ec7fb78e7992c7b3ff14410f56f64d3b2c402bcc
Merge branch 'ticket/244' into develop
2 files modified
68 ■■■■ changed files
src/main/java/com/gitblit/auth/AuthenticationProvider.java 35 ●●●●● 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
@@ -16,6 +16,7 @@
package com.gitblit.auth;
import java.io.File;
import java.math.BigInteger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -28,6 +29,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 {
@@ -79,24 +81,35 @@
    }
    protected void updateUser(UserModel userModel) {
        // TODO implement user model change detection
        // account for new user and revised user
        final UserModel userLocalDB = userManager.getUserModel(userModel.getName());
        // username
        // displayname
        // email address
        // cookie
        // Establish the checksum of the current version of the user
        final BigInteger userCurrentCheck = DeepCopier.checksum(userModel);
        userManager.updateUserModel(userModel);
        // Establish the checksum of the stored version of the user
        final BigInteger userLocalDBcheck = DeepCopier.checksum(userLocalDB);
        // Compare the checksums
        if (!userCurrentCheck.equals(userLocalDBcheck)) {
            // If mismatch, save the new instance.
            userManager.updateUserModel(userModel);
        }
    }
    protected void updateTeam(TeamModel teamModel) {
        // TODO implement team model change detection
        // account for new team and revised team
        final TeamModel teamLocalDB = userManager.getTeamModel(teamModel.name);
        // memberships
        // Establish the checksum of the current version of the team
        final BigInteger teamCurrentCheck = DeepCopier.checksum(teamModel);
        userManager.updateTeamModel(teamModel);
        // Establish the checksum of the stored version of the team
        final BigInteger teamLocalDBcheck = DeepCopier.checksum(teamLocalDB);
        // Compare the checksums
        if (!teamCurrentCheck.equals(teamLocalDBcheck)) {
            // If mismatch, save the new instance.
            userManager.updateTeamModel(teamModel);
        }
    }
    public abstract void setup();
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.
     */