Florian Zschocke
2013-08-15 69007029f122c3f77db044e879188cc12be3c2f6
src/main/java/com/gitblit/models/UserModel.java
@@ -75,17 +75,21 @@
   // non-persisted fields
   public boolean isAuthenticated;
   public AccountType accountType;
   public UserPreferences userPreferences;
   
   public UserModel(String username) {
      this.username = username;
      this.isAuthenticated = true;
      this.accountType = AccountType.LOCAL;
      this.userPreferences = new UserPreferences(this.username);
   }
   private UserModel() {
      this.username = "$anonymous";
      this.isAuthenticated = false;
      this.accountType = AccountType.LOCAL;
      this.userPreferences = new UserPreferences(this.username);
   }
   
   public boolean isLocalAccount() {
@@ -269,7 +273,13 @@
   }
      
   public void setRepositoryPermission(String repository, AccessPermission permission) {
      permissions.put(repository.toLowerCase(), permission);
      if (permission == null) {
         // remove the permission
         permissions.remove(repository.toLowerCase());
      } else {
         // set the new permission
         permissions.put(repository.toLowerCase(), permission);
      }
   }
   public RegistrantAccessPermission getRepositoryPermission(RepositoryModel repository) {
@@ -278,18 +288,31 @@
      ap.registrantType = RegistrantType.USER;
      ap.permission = AccessPermission.NONE;
      ap.mutable = false;
      // determine maximum permission for the repository
      final AccessPermission maxPermission =
            (repository.isFrozen || !repository.isBare) ?
                  AccessPermission.CLONE : AccessPermission.REWIND;
      if (AccessRestrictionType.NONE.equals(repository.accessRestriction)) {
         // anonymous rewind
         ap.permissionType = PermissionType.ANONYMOUS;
         ap.permission = AccessPermission.REWIND;
         if (AccessPermission.REWIND.atMost(maxPermission)) {
            ap.permission = AccessPermission.REWIND;
         } else {
            ap.permission = maxPermission;
         }
         return ap;
      }
      // administrator
      if (canAdmin()) {
         ap.permissionType = PermissionType.ADMINISTRATOR;
         ap.permission = AccessPermission.REWIND;
         if (AccessPermission.REWIND.atMost(maxPermission)) {
            ap.permission = AccessPermission.REWIND;
         } else {
            ap.permission = maxPermission;
         }
         if (!canAdmin) {
            // administator permission from team membership
            for (TeamModel team : teams) {
@@ -305,13 +328,21 @@
      // repository owner - either specified owner or personal repository
      if (repository.isOwner(username) || repository.isUsersPersonalRepository(username)) {
         ap.permissionType = PermissionType.OWNER;
         ap.permission = AccessPermission.REWIND;
         if (AccessPermission.REWIND.atMost(maxPermission)) {
            ap.permission = AccessPermission.REWIND;
         } else {
            ap.permission = maxPermission;
         }
         return ap;
      }
      
      if (AuthorizationControl.AUTHENTICATED.equals(repository.authorizationControl) && isAuthenticated) {
         // AUTHENTICATED is a shortcut for authorizing all logged-in users RW+ access
         ap.permission = AccessPermission.REWIND;
         if (AccessPermission.REWIND.atMost(maxPermission)) {
            ap.permission = AccessPermission.REWIND;
         } else {
            ap.permission = maxPermission;
         }
         return ap;
      }
      
@@ -322,7 +353,11 @@
         AccessPermission p = permissions.get(repository.name.toLowerCase());
         if (p != null && repository.accessRestriction.isValidPermission(p)) {
            ap.permissionType = PermissionType.EXPLICIT;
            ap.permission = p;
            if (p.atMost(maxPermission)) {
               ap.permission = p;
            } else {
               ap.permission = maxPermission;
            }
            ap.mutable = true;
            return ap;
         }
@@ -334,7 +369,11 @@
               if (p != null && repository.accessRestriction.isValidPermission(p)) {
                  // take first match
                  ap.permissionType = PermissionType.REGEX;
                  ap.permission = p;
                  if (p.atMost(maxPermission)) {
                     ap.permission = p;
                  } else {
                     ap.permission = maxPermission;
                  }
                  ap.source = key;
                  return ap;
               }
@@ -345,7 +384,7 @@
      // try to find a team match
      for (TeamModel team : teams) {
         RegistrantAccessPermission p = team.getRepositoryPermission(repository);
         if (p.permission.exceeds(ap.permission) && PermissionType.ANONYMOUS != p.permissionType) {
         if (p.permission.atMost(maxPermission) && p.permission.exceeds(ap.permission) && PermissionType.ANONYMOUS != p.permissionType) {
            // use highest team permission that is not an implicit permission
            ap.permission = p.permission;
            ap.source = team.name;
@@ -370,8 +409,8 @@
            ap.permissionType = PermissionType.ANONYMOUS;
            break;
         case NONE:
            // implied REWIND or CLONE if frozen
            ap.permission = repository.isFrozen ? AccessPermission.CLONE : AccessPermission.REWIND;
            // implied REWIND or CLONE
            ap.permission = maxPermission;
            ap.permissionType = PermissionType.ANONYMOUS;
            break;
         }
@@ -573,6 +612,10 @@
      return "~" + username;
   }
   
   public UserPreferences getPreferences() {
      return userPreferences;
   }
   @Override
   public int hashCode() {
      return username.hashCode();