James Moger
2013-07-02 b5798e1e6cf15da4eb33647190e127b53410c620
Improvements to handling internal accounts (anonymous, federation user)
5 files modified
33 ■■■■ changed files
src/main/java/com/gitblit/AuthenticationFilter.java 4 ●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/GitBlit.java 20 ●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/utils/RefLogUtils.java 2 ●●● patch | view | raw | blame | history
src/main/java/com/gitblit/wicket/GitBlitWebApp.properties 3 ●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/wicket/panels/ReflogPanel.java 4 ●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/AuthenticationFilter.java
@@ -36,6 +36,7 @@
import org.slf4j.LoggerFactory;
import com.gitblit.models.UserModel;
import com.gitblit.utils.DeepCopier;
import com.gitblit.utils.StringUtils;
/**
@@ -151,8 +152,7 @@
        public AuthenticatedRequest(HttpServletRequest req) {
            super(req);
            user = new UserModel("anonymous");
            user.isAuthenticated = false;
            user = DeepCopier.copy(UserModel.ANONYMOUS);
        }
        UserModel getUser() {
src/main/java/com/gitblit/GitBlit.java
@@ -725,6 +725,18 @@
    }
    /**
     * Returns true if the username represents an internal account
     *
     * @param username
     * @return true if the specified username represents an internal account
     */
    protected boolean isInternalAccount(String username) {
        return !StringUtils.isEmpty(username)
                && (username.equalsIgnoreCase(Constants.FEDERATION_USER)
                        || username.equalsIgnoreCase(UserModel.ANONYMOUS.username));
    }
    /**
     * Authenticate a user based on a username and password.
     * 
     * @see IUserService.authenticate(String, char[])
@@ -836,6 +848,7 @@
        if (principal != null) {
            String username = principal.getName();
            if (!StringUtils.isEmpty(username)) {
                boolean internalAccount = isInternalAccount(username);
                UserModel user = getUserModel(username);
                if (user != null) {
                    // existing user
@@ -844,7 +857,7 @@
                            user.username, httpRequest.getRemoteAddr()));
                    return user;
                } else if (settings.getBoolean(Keys.realm.container.autoCreateAccounts, false)
                        && !username.equalsIgnoreCase(Constants.FEDERATION_USER)) {
                        && !internalAccount) {
                    // auto-create user from an authenticated container principal
                    user = new UserModel(username.toLowerCase());
                    user.displayName = username;
@@ -854,7 +867,7 @@
                    logger.debug(MessageFormat.format("{0} authenticated and created by servlet container principal from {1}",
                            user.username, httpRequest.getRemoteAddr()));
                    return user;
                } else {
                } else if (!internalAccount) {
                    logger.warn(MessageFormat.format("Failed to find UserModel for {0}, attempted servlet container authentication from {1}",
                            principal.getName(), httpRequest.getRemoteAddr()));
                }
@@ -2933,8 +2946,7 @@
        String cloneUrl = sb.toString();
        // Retrieve all available repositories
        UserModel user = new UserModel(Constants.FEDERATION_USER);
        user.canAdmin = true;
        UserModel user = getFederationUser();
        List<RepositoryModel> list = getRepositoryModels(user);
        // create the [cloneurl, repositoryModel] map
src/main/java/com/gitblit/utils/RefLogUtils.java
@@ -184,7 +184,7 @@
                PersonIdent ident;
                if (UserModel.ANONYMOUS.equals(user)) {
                    // anonymous push
                    ident = new PersonIdent("anonymous", "anonymous");
                    ident = new PersonIdent(user.username + "/" + user.username, user.username);
                } else {
                    // construct real pushing account
                    ident =    new PersonIdent(MessageFormat.format("{0}/{1}", user.getDisplayName(), user.username),
src/main/java/com/gitblit/wicket/GitBlitWebApp.properties
@@ -500,4 +500,5 @@
gb.reviewPatchset = review {0} patchset {1}
gb.todaysActivityStats = today / {1} commits by {2} authors
gb.todaysActivityNone = today / none
gb.noActivityToday = there has been no activity today
gb.noActivityToday = there has been no activity today
gb.anonymousUser= anonymous
src/main/java/com/gitblit/wicket/panels/ReflogPanel.java
@@ -37,6 +37,7 @@
import com.gitblit.models.RefLogEntry;
import com.gitblit.models.RepositoryCommit;
import com.gitblit.models.RepositoryModel;
import com.gitblit.models.UserModel;
import com.gitblit.utils.RefLogUtils;
import com.gitblit.utils.StringUtils;
import com.gitblit.utils.TimeUtils;
@@ -163,6 +164,9 @@
                if (change.user.username.equals(change.user.emailAddress) && change.user.emailAddress.indexOf('@') > -1) {
                    // username is an email address - 1.2.1 push log bug
                    changeItem.add(new Label("whoChanged", change.user.getDisplayName()));
                } else if (change.user.username.equals(UserModel.ANONYMOUS.username)) {
                    // anonymous change
                    changeItem.add(new Label("whoChanged", getString("gb.anonymousUser")));
                } else {
                    // link to user account page
                    changeItem.add(new LinkPanel("whoChanged", null, change.user.getDisplayName(),