From 9a6a428bad30be341e4df2c6b0f77d9b9e9881ca Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Thu, 02 May 2013 09:57:19 -0400
Subject: [PATCH] Improve effective permission determination

---
 src/main/java/com/gitblit/models/UserModel.java      |   36 +++++-
 src/main/java/com/gitblit/Constants.java             |   24 +++
 src/main/java/com/gitblit/models/TeamModel.java      |   36 +++++
 src/test/java/com/gitblit/tests/PermissionsTest.java |  220 ++++++++++++++++++++++++++++++++++++
 4 files changed, 303 insertions(+), 13 deletions(-)

diff --git a/src/main/java/com/gitblit/Constants.java b/src/main/java/com/gitblit/Constants.java
index 7663f8b..5bd5b60 100644
--- a/src/main/java/com/gitblit/Constants.java
+++ b/src/main/java/com/gitblit/Constants.java
@@ -147,6 +147,28 @@
 		public String toString() {
 			return name();
 		}
+		
+		public boolean isValidPermission(AccessPermission permission) {
+			switch (this) {
+			case VIEW:
+				// VIEW restriction
+				// all access permissions are valid
+				return true;
+			case CLONE:
+				// CLONE restriction
+				// only CLONE or greater access permissions are valid
+				return permission.atLeast(AccessPermission.CLONE);
+			case PUSH:
+				// PUSH restriction
+				// only PUSH or greater access permissions are valid 
+				return permission.atLeast(AccessPermission.PUSH);
+			case NONE:
+				// NO access restriction
+				// all access permissions are invalid
+				return false;
+			}
+			return false;
+		}
 	}
 	
 	/**
@@ -416,7 +438,7 @@
 	}
 	
 	public static enum PermissionType {
-		MISSING, EXPLICIT, TEAM, REGEX, OWNER, ADMINISTRATOR;
+		MISSING, ANONYMOUS, EXPLICIT, TEAM, REGEX, OWNER, ADMINISTRATOR;
 	}
 	
 	public static enum GCStatus {
diff --git a/src/main/java/com/gitblit/models/TeamModel.java b/src/main/java/com/gitblit/models/TeamModel.java
index 9587ca7..8e0d5d5 100644
--- a/src/main/java/com/gitblit/models/TeamModel.java
+++ b/src/main/java/com/gitblit/models/TeamModel.java
@@ -197,6 +197,13 @@
 		ap.permission = AccessPermission.NONE;
 		ap.mutable = false;
 		
+		if (AccessRestrictionType.NONE.equals(repository.accessRestriction)) {
+			// anonymous rewind
+			ap.permissionType = PermissionType.ANONYMOUS;
+			ap.permission = AccessPermission.REWIND;
+			return ap;
+		}
+		
 		if (canAdmin) {
 			ap.permissionType = PermissionType.ADMINISTRATOR;
 			ap.permission = AccessPermission.REWIND;
@@ -206,7 +213,7 @@
 		if (permissions.containsKey(repository.name.toLowerCase())) {
 			// exact repository permission specified
 			AccessPermission p = permissions.get(repository.name.toLowerCase());
-			if (p != null) {
+			if (p != null && repository.accessRestriction.isValidPermission(p)) {
 				ap.permissionType = PermissionType.EXPLICIT;
 				ap.permission = p;
 				ap.mutable = true;
@@ -217,7 +224,7 @@
 			for (String key : permissions.keySet()) {
 				if (StringUtils.matchesIgnoreCase(repository.name, key)) {
 					AccessPermission p = permissions.get(key);
-					if (p != null) {
+					if (p != null && repository.accessRestriction.isValidPermission(p)) {
 						// take first match
 						ap.permissionType = PermissionType.REGEX;
 						ap.permission = p;
@@ -227,6 +234,31 @@
 				}
 			}
 		}
+		
+		// still no explicit or regex, check for implicit permissions
+		if (AccessPermission.NONE == ap.permission) {
+			switch (repository.accessRestriction) {
+			case VIEW:
+				// no implicit permissions possible
+				break;
+			case CLONE:
+				// implied view permission
+				ap.permission = AccessPermission.VIEW;
+				ap.permissionType = PermissionType.ANONYMOUS;
+				break;
+			case PUSH:
+				// implied clone permission
+				ap.permission = AccessPermission.CLONE;
+				ap.permissionType = PermissionType.ANONYMOUS;
+				break;
+			case NONE:
+				// implied REWIND or CLONE if frozen
+				ap.permission = repository.isFrozen ? AccessPermission.CLONE : AccessPermission.REWIND;
+				ap.permissionType = PermissionType.ANONYMOUS;
+				break;
+			}
+		}
+
 		return ap;
 	}
 	
diff --git a/src/main/java/com/gitblit/models/UserModel.java b/src/main/java/com/gitblit/models/UserModel.java
index bec011d..5750d46 100644
--- a/src/main/java/com/gitblit/models/UserModel.java
+++ b/src/main/java/com/gitblit/models/UserModel.java
@@ -281,7 +281,7 @@
 
 		if (AccessRestrictionType.NONE.equals(repository.accessRestriction)) {
 			// anonymous rewind
-			ap.permissionType = PermissionType.ADMINISTRATOR;
+			ap.permissionType = PermissionType.ANONYMOUS;
 			ap.permission = AccessPermission.REWIND;
 			return ap;
 		}
@@ -320,7 +320,7 @@
 		if (permissions.containsKey(repository.name.toLowerCase())) {
 			// exact repository permission specified, use it
 			AccessPermission p = permissions.get(repository.name.toLowerCase());
-			if (p != null) {
+			if (p != null && repository.accessRestriction.isValidPermission(p)) {
 				ap.permissionType = PermissionType.EXPLICIT;
 				ap.permission = p;
 				ap.mutable = true;
@@ -331,7 +331,7 @@
 			for (String key : permissions.keySet()) {
 				if (StringUtils.matchesIgnoreCase(repository.name, key)) {
 					AccessPermission p = permissions.get(key);
-					if (p != null) {
+					if (p != null && repository.accessRestriction.isValidPermission(p)) {
 						// take first match
 						ap.permissionType = PermissionType.REGEX;
 						ap.permission = p;
@@ -345,13 +345,37 @@
 		// try to find a team match
 		for (TeamModel team : teams) {
 			RegistrantAccessPermission p = team.getRepositoryPermission(repository);
-			if (p.permission.exceeds(ap.permission)) {
-				// use highest team permission
+			if (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;
 				ap.permissionType = PermissionType.TEAM;
 			}
-		}		
+		}
+		
+		// still no explicit, regex, or team match, check for implicit permissions
+		if (AccessPermission.NONE == ap.permission) {
+			switch (repository.accessRestriction) {
+			case VIEW:
+				// no implicit permissions possible
+				break;
+			case CLONE:
+				// implied view permission
+				ap.permission = AccessPermission.VIEW;
+				ap.permissionType = PermissionType.ANONYMOUS;
+				break;
+			case PUSH:
+				// implied clone permission
+				ap.permission = AccessPermission.CLONE;
+				ap.permissionType = PermissionType.ANONYMOUS;
+				break;
+			case NONE:
+				// implied REWIND or CLONE if frozen
+				ap.permission = repository.isFrozen ? AccessPermission.CLONE : AccessPermission.REWIND;
+				ap.permissionType = PermissionType.ANONYMOUS;
+				break;
+			}
+		}
 		
 		return ap;
 	}
diff --git a/src/test/java/com/gitblit/tests/PermissionsTest.java b/src/test/java/com/gitblit/tests/PermissionsTest.java
index 5a95104..a094f9a 100644
--- a/src/test/java/com/gitblit/tests/PermissionsTest.java
+++ b/src/test/java/com/gitblit/tests/PermissionsTest.java
@@ -17,7 +17,7 @@
 
 import java.util.Date;
 
-import junit.framework.Assert;
+import org.junit.Assert;
 
 import org.junit.Test;
 
@@ -57,6 +57,8 @@
 			assertTrue("admin CAN NOT delete ref!", user.canDeleteRef(repository));
 			assertTrue("admin CAN NOT rewind ref!", user.canRewindRef(repository));
 			
+			assertEquals("admin has wrong permission!", AccessPermission.REWIND, user.getRepositoryPermission(repository).permission);
+
 			assertTrue("admin CAN NOT fork!", user.canFork(repository));
 			
 			assertTrue("admin CAN NOT delete!", user.canDelete(repository));
@@ -74,7 +76,7 @@
 		repository.accessRestriction = AccessRestrictionType.NONE;
 		
 		UserModel user = UserModel.ANONYMOUS;
-		
+				
 		// all permissions, except fork
 		assertTrue("anonymous CAN NOT view!", user.canView(repository));
 		assertTrue("anonymous CAN NOT clone!", user.canClone(repository));
@@ -83,6 +85,8 @@
 		assertTrue("anonymous CAN NOT create ref!", user.canCreateRef(repository));
 		assertTrue("anonymous CAN NOT delete ref!", user.canDeleteRef(repository));
 		assertTrue("anonymous CAN NOT rewind ref!", user.canRewindRef(repository));
+
+		assertEquals("anonymous has wrong permission!", AccessPermission.REWIND, user.getRepositoryPermission(repository).permission);
 
 		repository.allowForks = false;
 		assertFalse("anonymous CAN fork!", user.canFork(repository));
@@ -109,6 +113,8 @@
 		assertFalse("anonymous CAN delete ref!", user.canDeleteRef(repository));
 		assertFalse("anonymous CAN rewind ref!", user.canRewindRef(repository));
 		
+		assertEquals("anonymous has wrong permission!", AccessPermission.CLONE, user.getRepositoryPermission(repository).permission);
+
 		repository.allowForks = false;
 		assertFalse("anonymous CAN fork!", user.canFork(repository));
 		repository.allowForks = true;
@@ -131,6 +137,8 @@
 		assertFalse("anonymous CAN delete ref!", user.canDeleteRef(repository));
 		assertFalse("anonymous CAN rewind ref!", user.canRewindRef(repository));
 
+		assertEquals("anonymous has wrong permission!", AccessPermission.VIEW, user.getRepositoryPermission(repository).permission);
+
 		repository.allowForks = false;
 		assertFalse("anonymous CAN fork!", user.canFork(repository));
 		repository.allowForks = true;
@@ -152,6 +160,8 @@
 		assertFalse("anonymous CAN create ref!", user.canCreateRef(repository));
 		assertFalse("anonymous CAN delete ref!", user.canDeleteRef(repository));
 		assertFalse("anonymous CAN rewind ref!", user.canRewindRef(repository));
+
+		assertEquals("anonymous has wrong permission!", AccessPermission.NONE, user.getRepositoryPermission(repository).permission);
 
 		repository.allowForks = false;
 		assertFalse("anonymous CAN fork!", user.canFork(repository));
@@ -178,6 +188,8 @@
 		assertTrue("authenticated CAN NOT create ref!", user.canCreateRef(repository));
 		assertTrue("authenticated CAN NOT delete ref!", user.canDeleteRef(repository));
 		assertTrue("authenticated CAN NOT rewind ref!", user.canRewindRef(repository));
+
+		assertEquals("authenticated has wrong permission!", AccessPermission.REWIND, user.getRepositoryPermission(repository).permission);
 
 		user.canFork = false;
 		repository.allowForks = false;
@@ -207,6 +219,8 @@
 		assertTrue("authenticated CAN NOT delete ref!", user.canDeleteRef(repository));
 		assertTrue("authenticated CAN NOT rewind ref!", user.canRewindRef(repository));
 
+		assertEquals("authenticated has wrong permission!", AccessPermission.REWIND, user.getRepositoryPermission(repository).permission);
+
 		user.canFork = false;
 		repository.allowForks = false;
 		assertFalse("authenticated CAN fork!", user.canFork(repository));
@@ -232,6 +246,8 @@
 		assertTrue("authenticated CAN NOT delete ref!", user.canDeleteRef(repository));
 		assertTrue("authenticated CAN NOT rewind ref!", user.canRewindRef(repository));
 
+		assertEquals("authenticated has wrong permission!", AccessPermission.REWIND, user.getRepositoryPermission(repository).permission);
+
 		user.canFork = false;
 		repository.allowForks = false;
 		assertFalse("authenticated CAN fork!", user.canFork(repository));
@@ -256,6 +272,8 @@
 		assertTrue("authenticated CAN NOT create ref!", user.canCreateRef(repository));
 		assertTrue("authenticated CAN NOT delete ref!", user.canDeleteRef(repository));
 		assertTrue("authenticated CAN NOT rewind ref!", user.canRewindRef(repository));
+
+		assertEquals("authenticated has wrong permission!", AccessPermission.REWIND, user.getRepositoryPermission(repository).permission);
 
 		user.canFork = false;
 		repository.allowForks = false;
@@ -285,6 +303,8 @@
 		assertTrue("named CAN NOT delete ref!", user.canDeleteRef(repository));
 		assertTrue("named CAN NOT rewind ref!", user.canRewindRef(repository));
 		
+		assertEquals("named has wrong permission!", AccessPermission.REWIND, user.getRepositoryPermission(repository).permission);
+
 		repository.allowForks = false;
 		user.canFork = false;
 		assertFalse("named CAN fork!", user.canFork(repository));
@@ -316,6 +336,8 @@
 		assertFalse("named CAN delete ref!", user.canDeleteRef(repository));
 		assertFalse("named CAN rewind ref!", user.canRewindRef(repository));
 
+		assertEquals("named has wrong permission!", AccessPermission.CLONE, user.getRepositoryPermission(repository).permission);
+
 		repository.allowForks = false;
 		user.canFork = false;
 		assertFalse("named CAN fork!", user.canFork(repository));
@@ -343,6 +365,8 @@
 		assertFalse("named CAN create ref!", user.canCreateRef(repository));
 		assertFalse("named CAN delete ref!", user.canDeleteRef(repository));
 		assertFalse("named CAN rewind ref!", user.canRewindRef(repository));
+
+		assertEquals("named has wrong permission!", AccessPermission.VIEW, user.getRepositoryPermission(repository).permission);
 
 		repository.allowForks = false;
 		user.canFork = false;
@@ -372,6 +396,8 @@
 		assertFalse("named CAN delete ref!", user.canDeleteRef(repository));
 		assertFalse("named CAN rewind ref!", user.canRewindRef(repository));
 		
+		assertEquals("named has wrong permission!", AccessPermission.NONE, user.getRepositoryPermission(repository).permission);
+
 		repository.allowForks = false;
 		user.canFork = false;
 		assertFalse("named CAN fork!", user.canFork(repository));
@@ -402,7 +428,9 @@
 		assertTrue("named CAN NOT create ref!", user.canCreateRef(repository));
 		assertTrue("named CAN NOT delete ref!", user.canDeleteRef(repository));
 		assertTrue("named CAN NOT rewind ref!", user.canRewindRef(repository));
-		
+
+		assertEquals("named has wrong permission!", AccessPermission.REWIND, user.getRepositoryPermission(repository).permission);
+
 		repository.allowForks = false;
 		user.canFork = false;
 		assertFalse("named CAN fork!", user.canFork(repository));
@@ -431,6 +459,8 @@
 		assertFalse("named CAN create ref!", user.canCreateRef(repository));
 		assertFalse("named CAN delete ref!", user.canDeleteRef(repository));
 		assertFalse("named CAN rewind ref!", user.canRewindRef(repository));
+
+		assertEquals("named has wrong permission!", AccessPermission.CLONE, user.getRepositoryPermission(repository).permission);
 
 		repository.allowForks = false;
 		user.canFork = false;
@@ -461,6 +491,8 @@
 		assertFalse("named CAN delete ref!", user.canDeleteRef(repository));
 		assertFalse("named CAN rewind ref!", user.canRewindRef(repository));
 
+		assertEquals("named has wrong permission!", AccessPermission.VIEW, user.getRepositoryPermission(repository).permission);
+
 		repository.allowForks = false;
 		user.canFork = false;
 		assertFalse("named CAN fork!", user.canFork(repository));
@@ -490,6 +522,8 @@
 		assertFalse("named CAN delete ref!", user.canDeleteRef(repository));
 		assertFalse("named CAN rewind ref!", user.canRewindRef(repository));
 		
+		assertEquals("named has wrong permission!", AccessPermission.VIEW, user.getRepositoryPermission(repository).permission);
+
 		repository.allowForks = false;
 		user.canFork = false;
 		assertFalse("named CAN fork!", user.canFork(repository));
@@ -520,6 +554,8 @@
 		assertTrue("named CAN NOT delete ref!", user.canDeleteRef(repository));
 		assertTrue("named CAN NOT rewind ref!", user.canRewindRef(repository));
 		
+		assertEquals("named has wrong permission!", AccessPermission.REWIND, user.getRepositoryPermission(repository).permission);
+
 		repository.allowForks = false;
 		user.canFork = false;
 		assertFalse("named CAN fork!", user.canFork(repository));
@@ -533,7 +569,7 @@
 	 * PUSH_CLONE = PUSH access restriction, CLONE access permission
 	 */
 	@Test
-	public void testNamed_PUSH_READ() throws Exception {
+	public void testNamed_PUSH_CLONE() throws Exception {
 		RepositoryModel repository = new RepositoryModel("myrepo.git", null, null, new Date());
 		repository.authorizationControl = AuthorizationControl.NAMED;
 		repository.accessRestriction = AccessRestrictionType.PUSH;
@@ -548,6 +584,8 @@
 		assertFalse("named CAN create ref!", user.canCreateRef(repository));
 		assertFalse("named CAN delete ref!", user.canDeleteRef(repository));
 		assertFalse("named CAN rewind ref!", user.canRewindRef(repository));
+
+		assertEquals("named has wrong permission!", AccessPermission.CLONE, user.getRepositoryPermission(repository).permission);
 
 		repository.allowForks = false;
 		user.canFork = false;
@@ -578,6 +616,8 @@
 		assertFalse("named CAN delete ref!", user.canDeleteRef(repository));
 		assertFalse("named CAN rewind ref!", user.canRewindRef(repository));
 
+		assertEquals("named has wrong permission!", AccessPermission.CLONE, user.getRepositoryPermission(repository).permission);
+
 		repository.allowForks = false;
 		user.canFork = false;
 		assertFalse("named CAN fork!", user.canFork(repository));
@@ -607,6 +647,8 @@
 		assertFalse("named CAN delete ref!", user.canDeleteRef(repository));
 		assertFalse("named CAN rewind ref!", user.canRewindRef(repository));
 		
+		assertEquals("named has wrong permission!", AccessPermission.CLONE, user.getRepositoryPermission(repository).permission);
+
 		repository.allowForks = false;
 		user.canFork = false;
 		assertFalse("named CAN fork!", user.canFork(repository));
@@ -637,6 +679,8 @@
 		assertTrue("named CAN NOT delete ref!", user.canDeleteRef(repository));
 		assertTrue("named CAN NOT rewind ref!", user.canRewindRef(repository));
 		
+		assertEquals("named has wrong permission!", AccessPermission.REWIND, user.getRepositoryPermission(repository).permission);
+
 		repository.allowForks = false;
 		user.canFork = false;
 		assertFalse("named CAN fork!", user.canFork(repository));
@@ -665,6 +709,8 @@
 		assertFalse("named CAN create ref!", user.canCreateRef(repository));
 		assertFalse("named CAN delete ref!", user.canDeleteRef(repository));
 		assertFalse("named CAN rewind ref!", user.canRewindRef(repository));
+
+		assertEquals("named has wrong permission!", AccessPermission.PUSH, user.getRepositoryPermission(repository).permission);
 
 		repository.allowForks = false;
 		user.canFork = false;
@@ -695,6 +741,8 @@
 		assertFalse("named CAN delete red!", user.canDeleteRef(repository));
 		assertFalse("named CAN rewind ref!", user.canRewindRef(repository));
 
+		assertEquals("named has wrong permission!", AccessPermission.PUSH, user.getRepositoryPermission(repository).permission);
+
 		repository.allowForks = false;
 		user.canFork = false;
 		assertFalse("named CAN fork!", user.canFork(repository));
@@ -724,6 +772,8 @@
 		assertFalse("named CAN delete ref!", user.canDeleteRef(repository));
 		assertFalse("named CAN rewind ref!", user.canRewindRef(repository));
 		
+		assertEquals("named has wrong permission!", AccessPermission.PUSH, user.getRepositoryPermission(repository).permission);
+
 		repository.allowForks = false;
 		user.canFork = false;
 		assertFalse("named CAN fork!", user.canFork(repository));
@@ -754,6 +804,8 @@
 		assertTrue("named CAN NOT delete ref!", user.canDeleteRef(repository));
 		assertTrue("named CAN NOT rewind ref!", user.canRewindRef(repository));
 		
+		assertEquals("named has wrong permission!", AccessPermission.REWIND, user.getRepositoryPermission(repository).permission);
+
 		repository.allowForks = false;
 		user.canFork = false;
 		assertFalse("named CAN fork!", user.canFork(repository));
@@ -782,6 +834,8 @@
 		assertTrue("named CAN NOT create ref!", user.canCreateRef(repository));
 		assertFalse("named CAN delete ref!", user.canDeleteRef(repository));
 		assertFalse("named CAN rewind ref!", user.canRewindRef(repository));
+
+		assertEquals("named has wrong permission!", AccessPermission.CREATE, user.getRepositoryPermission(repository).permission);
 
 		repository.allowForks = false;
 		user.canFork = false;
@@ -812,6 +866,8 @@
 		assertFalse("named CAN delete red!", user.canDeleteRef(repository));
 		assertFalse("named CAN rewind ref!", user.canRewindRef(repository));
 
+		assertEquals("named has wrong permission!", AccessPermission.CREATE, user.getRepositoryPermission(repository).permission);
+
 		repository.allowForks = false;
 		user.canFork = false;
 		assertFalse("named CAN fork!", user.canFork(repository));
@@ -841,6 +897,8 @@
 		assertFalse("named CAN delete ref!", user.canDeleteRef(repository));
 		assertFalse("named CAN rewind ref!", user.canRewindRef(repository));
 		
+		assertEquals("named has wrong permission!", AccessPermission.CREATE, user.getRepositoryPermission(repository).permission);
+
 		repository.allowForks = false;
 		user.canFork = false;
 		assertFalse("named CAN fork!", user.canFork(repository));
@@ -871,6 +929,8 @@
 		assertTrue("named CAN NOT delete ref!", user.canDeleteRef(repository));
 		assertTrue("named CAN NOT rewind ref!", user.canRewindRef(repository));
 		
+		assertEquals("named has wrong permission!", AccessPermission.REWIND, user.getRepositoryPermission(repository).permission);
+
 		repository.allowForks = false;
 		user.canFork = false;
 		assertFalse("named CAN fork!", user.canFork(repository));
@@ -899,6 +959,8 @@
 		assertTrue("named CAN NOT create ref!", user.canCreateRef(repository));
 		assertTrue("named CAN NOT delete ref!", user.canDeleteRef(repository));
 		assertFalse("named CAN rewind ref!", user.canRewindRef(repository));
+
+		assertEquals("named has wrong permission!", AccessPermission.DELETE, user.getRepositoryPermission(repository).permission);
 
 		repository.allowForks = false;
 		user.canFork = false;
@@ -929,6 +991,8 @@
 		assertTrue("named CAN NOT delete red!", user.canDeleteRef(repository));
 		assertFalse("named CAN rewind ref!", user.canRewindRef(repository));
 
+		assertEquals("named has wrong permission!", AccessPermission.DELETE, user.getRepositoryPermission(repository).permission);
+
 		repository.allowForks = false;
 		user.canFork = false;
 		assertFalse("named CAN fork!", user.canFork(repository));
@@ -958,6 +1022,8 @@
 		assertTrue("named CAN NOT delete ref!", user.canDeleteRef(repository));
 		assertFalse("named CAN rewind ref!", user.canRewindRef(repository));
 		
+		assertEquals("named has wrong permission!", AccessPermission.DELETE, user.getRepositoryPermission(repository).permission);
+
 		repository.allowForks = false;
 		user.canFork = false;
 		assertFalse("named CAN fork!", user.canFork(repository));
@@ -988,6 +1054,8 @@
 		assertTrue("named CAN NOT delete ref!", user.canDeleteRef(repository));
 		assertTrue("named CAN NOT rewind ref!", user.canRewindRef(repository));
 		
+		assertEquals("named has wrong permission!", AccessPermission.REWIND, user.getRepositoryPermission(repository).permission);
+
 		repository.allowForks = false;
 		user.canFork = false;
 		assertFalse("named CAN fork!", user.canFork(repository));
@@ -1016,6 +1084,8 @@
 		assertTrue("named CAN NOT create ref!", user.canCreateRef(repository));
 		assertTrue("named CAN NOT delete ref!", user.canDeleteRef(repository));
 		assertTrue("named CAN NOT rewind ref!", user.canRewindRef(repository));
+
+		assertEquals("named has wrong permission!", AccessPermission.REWIND, user.getRepositoryPermission(repository).permission);
 
 		repository.allowForks = false;
 		user.canFork = false;
@@ -1046,6 +1116,8 @@
 		assertTrue("named CAN NOT delete ref!", user.canDeleteRef(repository));
 		assertTrue("named CAN NOT rewind ref!", user.canRewindRef(repository));
 
+		assertEquals("named has wrong permission!", AccessPermission.REWIND, user.getRepositoryPermission(repository).permission);
+
 		repository.allowForks = false;
 		user.canFork = false;
 		assertFalse("named CAN fork!", user.canFork(repository));
@@ -1075,6 +1147,8 @@
 		assertTrue("named CAN NOT delete ref!", user.canDeleteRef(repository));
 		assertTrue("named CAN NOT rewind ref!", user.canRewindRef(repository));
 		
+		assertEquals("named has wrong permission!", AccessPermission.REWIND, user.getRepositoryPermission(repository).permission);
+
 		repository.allowForks = false;
 		user.canFork = false;
 		assertFalse("named CAN fork!", user.canFork(repository));
@@ -1102,6 +1176,9 @@
 		assertTrue("team CAN NOT create ref!", team.canCreateRef(repository));
 		assertTrue("team CAN NOT delete ref!", team.canDeleteRef(repository));
 		assertTrue("team CAN NOT rewind ref!", team.canRewindRef(repository));
+		
+		assertEquals("team has wrong permission!", AccessPermission.REWIND, team.getRepositoryPermission(repository).permission);
+
 	}
 	
 	/**
@@ -1122,6 +1199,9 @@
 		assertFalse("team CAN create ref!", team.canCreateRef(repository));
 		assertFalse("team CAN delete ref!", team.canDeleteRef(repository));
 		assertFalse("team CAN rewind ref!", team.canRewindRef(repository));
+		
+		assertEquals("team has wrong permission!", AccessPermission.CLONE, team.getRepositoryPermission(repository).permission);
+
 	}
 
 	/**
@@ -1142,6 +1222,8 @@
 		assertFalse("team CAN create ref!", team.canCreateRef(repository));
 		assertFalse("team CAN delete ref!", team.canDeleteRef(repository));
 		assertFalse("team CAN rewind ref!", team.canRewindRef(repository));
+		
+		assertEquals("team has wrong permission!", AccessPermission.VIEW, team.getRepositoryPermission(repository).permission);
 	}
 
 	/**
@@ -1162,6 +1244,8 @@
 		assertFalse("team CAN create ref!", team.canCreateRef(repository));
 		assertFalse("team CAN delete ref!", team.canDeleteRef(repository));
 		assertFalse("team CAN rewind ref!", team.canRewindRef(repository));
+		
+		assertEquals("team has wrong permission!", AccessPermission.NONE, team.getRepositoryPermission(repository).permission);
 	}
 	
 	/**
@@ -1184,6 +1268,8 @@
 		assertTrue("team CAN NOT create ref!", team.canCreateRef(repository));
 		assertTrue("team CAN NOT delete ref!", team.canDeleteRef(repository));
 		assertTrue("team CAN NOT rewind ref!", team.canRewindRef(repository));
+		
+		assertEquals("team has wrong permission!", AccessPermission.REWIND, team.getRepositoryPermission(repository).permission);
 	}
 	
 	/**
@@ -1205,6 +1291,8 @@
 		assertFalse("team CAN create ref!", team.canCreateRef(repository));
 		assertFalse("team CAN delete ref!", team.canDeleteRef(repository));
 		assertFalse("team CAN rewind ref!", team.canRewindRef(repository));
+		
+		assertEquals("team has wrong permission!", AccessPermission.PUSH, team.getRepositoryPermission(repository).permission);
 	}
 	
 	/**
@@ -1226,6 +1314,8 @@
 		assertFalse("team CAN create ref!", team.canCreateRef(repository));
 		assertFalse("team CAN delete ref!", team.canDeleteRef(repository));
 		assertFalse("team CAN rewind ref!", team.canRewindRef(repository));
+		
+		assertEquals("team has wrong permission!", AccessPermission.PUSH, team.getRepositoryPermission(repository).permission);
 	}
 	
 	/**
@@ -1247,6 +1337,8 @@
 		assertFalse("team CAN create ref!", team.canCreateRef(repository));
 		assertFalse("team CAN delete ref!", team.canDeleteRef(repository));
 		assertFalse("team CAN rewind ref!", team.canRewindRef(repository));
+
+		assertEquals("team has wrong permission!", AccessPermission.PUSH, team.getRepositoryPermission(repository).permission);
 	}
 	
 	/**
@@ -1269,6 +1361,8 @@
 		assertTrue("team CAN NOT create ref!", team.canCreateRef(repository));
 		assertTrue("team CAN NOT delete ref!", team.canDeleteRef(repository));
 		assertTrue("team CAN NOT rewind ref!", team.canRewindRef(repository));
+
+		assertEquals("team has wrong permission!", AccessPermission.REWIND, team.getRepositoryPermission(repository).permission);
 	}
 	
 	/**
@@ -1290,6 +1384,8 @@
 		assertTrue("team CAN NOT create ref!", team.canCreateRef(repository));
 		assertFalse("team CAN delete ref!", team.canDeleteRef(repository));
 		assertFalse("team CAN rewind ref!", team.canRewindRef(repository));
+
+		assertEquals("team has wrong permission!", AccessPermission.CREATE, team.getRepositoryPermission(repository).permission);
 	}
 	
 	/**
@@ -1311,6 +1407,8 @@
 		assertTrue("team CAN NOT create ref!", team.canCreateRef(repository));
 		assertFalse("team CAN delete ref!", team.canDeleteRef(repository));
 		assertFalse("team CAN rewind ref!", team.canRewindRef(repository));
+
+		assertEquals("team has wrong permission!", AccessPermission.CREATE, team.getRepositoryPermission(repository).permission);
 	}
 	
 	/**
@@ -1332,6 +1430,8 @@
 		assertTrue("team CAN NOT create ref!", team.canCreateRef(repository));
 		assertFalse("team CAN delete ref!", team.canDeleteRef(repository));
 		assertFalse("team CAN rewind ref!", team.canRewindRef(repository));
+
+		assertEquals("team has wrong permission!", AccessPermission.CREATE, team.getRepositoryPermission(repository).permission);
 	}
 
 	/**
@@ -1354,6 +1454,8 @@
 		assertTrue("team CAN NOT create ref!", team.canCreateRef(repository));
 		assertTrue("team CAN NOT delete ref!", team.canDeleteRef(repository));
 		assertTrue("team CAN NOT rewind ref!", team.canRewindRef(repository));
+
+		assertEquals("team has wrong permission!", AccessPermission.REWIND, team.getRepositoryPermission(repository).permission);
 	}
 	
 	/**
@@ -1375,6 +1477,8 @@
 		assertTrue("team CAN NOT create ref!", team.canCreateRef(repository));
 		assertTrue("team CAN NOT delete ref!", team.canDeleteRef(repository));
 		assertFalse("team CAN rewind ref!", team.canRewindRef(repository));
+
+		assertEquals("team has wrong permission!", AccessPermission.DELETE, team.getRepositoryPermission(repository).permission);
 	}
 	
 	/**
@@ -1396,6 +1500,8 @@
 		assertTrue("team CAN NOT create ref!", team.canCreateRef(repository));
 		assertTrue("team CAN NOT delete ref!", team.canDeleteRef(repository));
 		assertFalse("team CAN rewind ref!", team.canRewindRef(repository));
+		
+		assertEquals("team has wrong permission!", AccessPermission.DELETE, team.getRepositoryPermission(repository).permission);
 	}
 	
 	/**
@@ -1417,6 +1523,8 @@
 		assertTrue("team CAN NOT create ref!", team.canCreateRef(repository));
 		assertTrue("team CAN NOT delete ref!", team.canDeleteRef(repository));
 		assertFalse("team CAN rewind ref!", team.canRewindRef(repository));
+
+		assertEquals("team has wrong permission!", AccessPermission.DELETE, team.getRepositoryPermission(repository).permission);
 	}
 	
 	/**
@@ -1439,6 +1547,8 @@
 		assertTrue("team CAN NOT create ref!", team.canCreateRef(repository));
 		assertTrue("team CAN NOT delete ref!", team.canDeleteRef(repository));
 		assertTrue("team CAN NOT rewind ref!", team.canRewindRef(repository));
+
+		assertEquals("team has wrong permission!", AccessPermission.REWIND, team.getRepositoryPermission(repository).permission);
 	}
 	
 	/**
@@ -1460,6 +1570,8 @@
 		assertTrue("team CAN NOT create ref!", team.canCreateRef(repository));
 		assertTrue("team CAN NOT delete ref!", team.canDeleteRef(repository));
 		assertTrue("team CAN NOT rewind ref!", team.canRewindRef(repository));
+
+		assertEquals("team has wrong permission!", AccessPermission.REWIND, team.getRepositoryPermission(repository).permission);
 	}
 	
 	/**
@@ -1481,6 +1593,8 @@
 		assertTrue("team CAN NOT create ref!", team.canCreateRef(repository));
 		assertTrue("team CAN NOT delete ref!", team.canDeleteRef(repository));
 		assertTrue("team CAN NOT rewind ref!", team.canRewindRef(repository));
+
+		assertEquals("team has wrong permission!", AccessPermission.REWIND, team.getRepositoryPermission(repository).permission);
 	}
 	
 	/**
@@ -1502,6 +1616,8 @@
 		assertTrue("team CAN NOT create ref!", team.canCreateRef(repository));
 		assertTrue("team CAN NOT delete ref!", team.canDeleteRef(repository));
 		assertTrue("team CAN NOT rewind ref!", team.canRewindRef(repository));
+
+		assertEquals("team has wrong permission!", AccessPermission.REWIND, team.getRepositoryPermission(repository).permission);
 	}
 	
 	/**
@@ -1524,6 +1640,8 @@
 		assertTrue("team CAN NOT create ref!", team.canCreateRef(repository));
 		assertTrue("team CAN NOT delete ref!", team.canDeleteRef(repository));
 		assertTrue("team CAN NOT rewind ref!", team.canRewindRef(repository));
+
+		assertEquals("team has wrong permission!", AccessPermission.REWIND, team.getRepositoryPermission(repository).permission);
 	}
 
 	/**
@@ -1545,6 +1663,8 @@
 		assertFalse("team CAN create ref!", team.canCreateRef(repository));
 		assertFalse("team CAN delete ref!", team.canDeleteRef(repository));
 		assertFalse("team CAN rewind ref!", team.canRewindRef(repository));
+
+		assertEquals("team has wrong permission!", AccessPermission.CLONE, team.getRepositoryPermission(repository).permission);
 	}
 
 	/**
@@ -1566,6 +1686,8 @@
 		assertFalse("team CAN create ref!", team.canCreateRef(repository));
 		assertFalse("team CAN delete ref!", team.canDeleteRef(repository));
 		assertFalse("team CAN rewind ref!", team.canRewindRef(repository));
+
+		assertEquals("team has wrong permission!", AccessPermission.CLONE, team.getRepositoryPermission(repository).permission);
 	}
 	
 	/**
@@ -1587,6 +1709,8 @@
 		assertFalse("team CAN create ref!", team.canCreateRef(repository));
 		assertFalse("team CAN delete ref!", team.canDeleteRef(repository));
 		assertFalse("team CAN rewind ref!", team.canRewindRef(repository));
+
+		assertEquals("team has wrong permission!", AccessPermission.CLONE, team.getRepositoryPermission(repository).permission);
 	}
 
 	/**
@@ -1609,6 +1733,8 @@
 		assertTrue("team CAN NOT create ref!", team.canCreateRef(repository));
 		assertTrue("team CAN NOT delete ref!", team.canDeleteRef(repository));
 		assertTrue("team CAN NOT rewind ref!", team.canRewindRef(repository));
+
+		assertEquals("team has wrong permission!", AccessPermission.REWIND, team.getRepositoryPermission(repository).permission);
 	}
 
 	/**
@@ -1630,6 +1756,8 @@
 		assertFalse("team CAN create ref!", team.canCreateRef(repository));
 		assertFalse("team CAN delete ref!", team.canDeleteRef(repository));
 		assertFalse("team CAN rewind ref!", team.canRewindRef(repository));
+
+		assertEquals("team has wrong permission!", AccessPermission.CLONE, team.getRepositoryPermission(repository).permission);
 	}
 	
 	/**
@@ -1651,6 +1779,8 @@
 		assertFalse("team CAN create ref!", team.canCreateRef(repository));
 		assertFalse("team CAN delete ref!", team.canDeleteRef(repository));
 		assertFalse("team CAN rewind ref!", team.canRewindRef(repository));
+
+		assertEquals("team has wrong permission!", AccessPermission.VIEW, team.getRepositoryPermission(repository).permission);
 	}
 	
 	/**
@@ -1672,6 +1802,8 @@
 		assertFalse("team CAN create ref!", team.canCreateRef(repository));
 		assertFalse("team CAN delete ref!", team.canDeleteRef(repository));
 		assertFalse("team CAN rewind ref!", team.canRewindRef(repository));
+
+		assertEquals("team has wrong permission!", AccessPermission.VIEW, team.getRepositoryPermission(repository).permission);
 	}
 	
 	/**
@@ -1694,6 +1826,8 @@
 		assertTrue("team member CAN NOT create ref!", user.canCreateRef(repository));
 		assertTrue("team member CAN NOT delete ref!", user.canDeleteRef(repository));
 		assertTrue("team member CAN NOT rewind ref!", user.canRewindRef(repository));
+
+		assertEquals("team member has wrong permission!", AccessPermission.REWIND, user.getRepositoryPermission(repository).permission);
 	}
 	
 	/**
@@ -1716,6 +1850,8 @@
 		assertFalse("team member CAN create ref!", user.canCreateRef(repository));
 		assertFalse("team member CAN delete ref!", user.canDeleteRef(repository));
 		assertFalse("team member CAN rewind ref!", user.canRewindRef(repository));
+
+		assertEquals("team member has wrong permission!", AccessPermission.CLONE, user.getRepositoryPermission(repository).permission);
 	}
 
 	/**
@@ -1738,6 +1874,8 @@
 		assertFalse("team member CAN create ref!", user.canCreateRef(repository));
 		assertFalse("team member CAN delete ref!", user.canDeleteRef(repository));
 		assertFalse("team member CAN rewind ref!", user.canRewindRef(repository));
+
+		assertEquals("team member has wrong permission!", AccessPermission.VIEW, user.getRepositoryPermission(repository).permission);
 	}
 
 	/**
@@ -1760,6 +1898,8 @@
 		assertFalse("team member CAN create ref!", user.canCreateRef(repository));
 		assertFalse("team member CAN delete ref!", user.canDeleteRef(repository));
 		assertFalse("team member CAN rewind ref!", user.canRewindRef(repository));
+
+		assertEquals("team member has wrong permission!", AccessPermission.NONE, user.getRepositoryPermission(repository).permission);
 	}
 	
 	/**
@@ -1784,6 +1924,8 @@
 		assertTrue("team member CAN NOT create ref!", user.canCreateRef(repository));
 		assertTrue("team member CAN NOT delete ref!", user.canDeleteRef(repository));
 		assertTrue("team member CAN NOT rewind ref!", user.canRewindRef(repository));
+
+		assertEquals("team member has wrong permission!", AccessPermission.REWIND, user.getRepositoryPermission(repository).permission);
 	}
 	
 	/**
@@ -1807,6 +1949,8 @@
 		assertFalse("team member CAN create ref!", user.canCreateRef(repository));
 		assertFalse("team member CAN delete ref!", user.canDeleteRef(repository));
 		assertFalse("team member CAN rewind ref!", user.canRewindRef(repository));
+
+		assertEquals("team member has wrong permission!", AccessPermission.PUSH, user.getRepositoryPermission(repository).permission);
 	}
 	
 	/**
@@ -1830,6 +1974,8 @@
 		assertFalse("team member CAN create ref!", user.canCreateRef(repository));
 		assertFalse("team member CAN delete ref!", user.canDeleteRef(repository));
 		assertFalse("team member CAN rewind ref!", user.canRewindRef(repository));
+
+		assertEquals("team member has wrong permission!", AccessPermission.PUSH, user.getRepositoryPermission(repository).permission);
 	}
 	
 	/**
@@ -1853,6 +1999,8 @@
 		assertFalse("team member CAN create ref!", user.canCreateRef(repository));
 		assertFalse("team member CAN delete ref!", user.canDeleteRef(repository));
 		assertFalse("team member CAN rewind ref!", user.canRewindRef(repository));
+
+		assertEquals("team member has wrong permission!", AccessPermission.PUSH, user.getRepositoryPermission(repository).permission);
 	}
 	
 	/**
@@ -1877,6 +2025,8 @@
 		assertTrue("team member CAN NOT create ref!", user.canCreateRef(repository));
 		assertTrue("team member CAN NOT delete ref!", user.canDeleteRef(repository));
 		assertTrue("team member CAN NOT rewind ref!", user.canRewindRef(repository));
+
+		assertEquals("team member has wrong permission!", AccessPermission.REWIND, user.getRepositoryPermission(repository).permission);
 	}
 	
 	/**
@@ -1900,6 +2050,8 @@
 		assertTrue("team member CAN NOT create ref!", user.canCreateRef(repository));
 		assertFalse("team member CAN delete ref!", user.canDeleteRef(repository));
 		assertFalse("team member CAN rewind ref!", user.canRewindRef(repository));
+
+		assertEquals("team member has wrong permission!", AccessPermission.CREATE, user.getRepositoryPermission(repository).permission);
 	}
 	
 	/**
@@ -1923,6 +2075,8 @@
 		assertTrue("team member CAN NOT create ref!", user.canCreateRef(repository));
 		assertFalse("team member CAN delete ref!", user.canDeleteRef(repository));
 		assertFalse("team member CAN rewind ref!", user.canRewindRef(repository));
+
+		assertEquals("team member has wrong permission!", AccessPermission.CREATE, user.getRepositoryPermission(repository).permission);
 	}
 	
 	/**
@@ -1946,6 +2100,8 @@
 		assertTrue("team member CAN NOT create ref!", user.canCreateRef(repository));
 		assertFalse("team member CAN delete ref!", user.canDeleteRef(repository));
 		assertFalse("team member CAN rewind ref!", user.canRewindRef(repository));
+
+		assertEquals("team member has wrong permission!", AccessPermission.CREATE, user.getRepositoryPermission(repository).permission);
 	}
 
 	/**
@@ -1970,6 +2126,8 @@
 		assertTrue("team member CAN NOT create ref!", user.canCreateRef(repository));
 		assertTrue("team member CAN NOT delete ref!", user.canDeleteRef(repository));
 		assertTrue("team member CAN NOT rewind ref!", user.canRewindRef(repository));
+
+		assertEquals("team member has wrong permission!", AccessPermission.REWIND, user.getRepositoryPermission(repository).permission);
 	}
 	
 	/**
@@ -1993,6 +2151,8 @@
 		assertTrue("team member CAN NOT create ref!", user.canCreateRef(repository));
 		assertTrue("team member CAN NOT delete ref!", user.canDeleteRef(repository));
 		assertFalse("team member CAN rewind ref!", user.canRewindRef(repository));
+
+		assertEquals("team member has wrong permission!", AccessPermission.DELETE, user.getRepositoryPermission(repository).permission);
 	}
 	
 	/**
@@ -2016,6 +2176,8 @@
 		assertTrue("team member CAN NOT create ref!", user.canCreateRef(repository));
 		assertTrue("team member CAN NOT delete ref!", user.canDeleteRef(repository));
 		assertFalse("team member CAN rewind ref!", user.canRewindRef(repository));
+
+		assertEquals("team member has wrong permission!", AccessPermission.DELETE, user.getRepositoryPermission(repository).permission);
 	}
 	
 	/**
@@ -2039,6 +2201,8 @@
 		assertTrue("team member CAN NOT create ref!", user.canCreateRef(repository));
 		assertTrue("team member CAN NOT delete ref!", user.canDeleteRef(repository));
 		assertFalse("team member CAN rewind ref!", user.canRewindRef(repository));
+
+		assertEquals("team member has wrong permission!", AccessPermission.DELETE, user.getRepositoryPermission(repository).permission);
 	}
 
 	/**
@@ -2063,6 +2227,8 @@
 		assertTrue("team member CAN NOT create ref!", user.canCreateRef(repository));
 		assertTrue("team member CAN NOT delete ref!", user.canDeleteRef(repository));
 		assertTrue("team member CAN NOT rewind ref!", user.canRewindRef(repository));
+
+		assertEquals("team member has wrong permission!", AccessPermission.REWIND, user.getRepositoryPermission(repository).permission);
 	}
 	
 	/**
@@ -2086,6 +2252,8 @@
 		assertTrue("team member CAN NOT create ref!", user.canCreateRef(repository));
 		assertTrue("team member CAN NOT delete ref!", user.canDeleteRef(repository));
 		assertTrue("team member CAN NOT rewind ref!", user.canRewindRef(repository));
+
+		assertEquals("team member has wrong permission!", AccessPermission.REWIND, user.getRepositoryPermission(repository).permission);
 	}
 	
 	/**
@@ -2109,6 +2277,8 @@
 		assertTrue("team member CAN NOT create ref!", user.canCreateRef(repository));
 		assertTrue("team member CAN NOT delete ref!", user.canDeleteRef(repository));
 		assertTrue("team member CAN NOT rewind ref!", user.canRewindRef(repository));
+
+		assertEquals("team member has wrong permission!", AccessPermission.REWIND, user.getRepositoryPermission(repository).permission);
 	}
 	
 	/**
@@ -2132,6 +2302,8 @@
 		assertTrue("team member CAN NOT create ref!", user.canCreateRef(repository));
 		assertTrue("team member CAN NOT delete ref!", user.canDeleteRef(repository));
 		assertTrue("team member CAN NOT rewind ref!", user.canRewindRef(repository));
+
+		assertEquals("team member has wrong permission!", AccessPermission.REWIND, user.getRepositoryPermission(repository).permission);
 	}
 	
 	/**
@@ -2156,6 +2328,8 @@
 		assertTrue("team member CAN NOT create ref!", user.canCreateRef(repository));
 		assertTrue("team member CAN NOT delete ref!", user.canDeleteRef(repository));
 		assertTrue("team member CAN NOT rewind ref!", user.canRewindRef(repository));
+
+		assertEquals("team member has wrong permission!", AccessPermission.REWIND, user.getRepositoryPermission(repository).permission);
 	}
 
 	/**
@@ -2179,6 +2353,8 @@
 		assertFalse("team member CAN create ref!", user.canCreateRef(repository));
 		assertFalse("team member CAN delete ref!", user.canDeleteRef(repository));
 		assertFalse("team member CAN rewind ref!", user.canRewindRef(repository));
+
+		assertEquals("team member has wrong permission!", AccessPermission.CLONE, user.getRepositoryPermission(repository).permission);
 	}
 
 	/**
@@ -2202,6 +2378,8 @@
 		assertFalse("team member CAN create ref!", user.canCreateRef(repository));
 		assertFalse("team member CAN delete ref!", user.canDeleteRef(repository));
 		assertFalse("team member CAN rewind ref!", user.canRewindRef(repository));
+
+		assertEquals("team member has wrong permission!", AccessPermission.CLONE, user.getRepositoryPermission(repository).permission);
 	}
 	
 	/**
@@ -2225,6 +2403,8 @@
 		assertFalse("team member CAN create ref!", user.canCreateRef(repository));
 		assertFalse("team member CAN delete ref!", user.canDeleteRef(repository));
 		assertFalse("team member CAN rewind ref!", user.canRewindRef(repository));
+
+		assertEquals("team member has wrong permission!", AccessPermission.CLONE, user.getRepositoryPermission(repository).permission);
 	}
 
 	/**
@@ -2249,6 +2429,8 @@
 		assertTrue("team member CAN NOT create ref!", user.canCreateRef(repository));
 		assertTrue("team member CAN NOT delete ref!", user.canDeleteRef(repository));
 		assertTrue("team member CAN NOT rewind ref!", user.canRewindRef(repository));
+
+		assertEquals("team member has wrong permission!", AccessPermission.REWIND, user.getRepositoryPermission(repository).permission);
 	}
 
 	/**
@@ -2272,6 +2454,8 @@
 		assertFalse("team member CAN create ref!", user.canCreateRef(repository));
 		assertFalse("team member CAN delete ref!", user.canDeleteRef(repository));
 		assertFalse("team member CAN rewind ref!", user.canRewindRef(repository));
+
+		assertEquals("team member has wrong permission!", AccessPermission.CLONE, user.getRepositoryPermission(repository).permission);
 	}
 	
 	/**
@@ -2295,6 +2479,8 @@
 		assertFalse("team member CAN create ref!", user.canCreateRef(repository));
 		assertFalse("team member CAN delete ref!", user.canDeleteRef(repository));
 		assertFalse("team member CAN rewind ref!", user.canRewindRef(repository));
+
+		assertEquals("team member has wrong permission!", AccessPermission.VIEW, user.getRepositoryPermission(repository).permission);
 	}
 	
 	/**
@@ -2318,6 +2504,8 @@
 		assertFalse("team member CAN create ref!", user.canCreateRef(repository));
 		assertFalse("team member CAN delete ref!", user.canDeleteRef(repository));
 		assertFalse("team member CAN rewind ref!", user.canRewindRef(repository));
+
+		assertEquals("team member has wrong permission!", AccessPermission.VIEW, user.getRepositoryPermission(repository).permission);
 	}
 	
 	@Test
@@ -2337,6 +2525,8 @@
 		assertTrue("owner CAN NOT create ref!", user.canCreateRef(repository));
 		assertTrue("owner CAN NOT delete ref!", user.canDeleteRef(repository));
 		assertTrue("owner CAN NOT rewind ref!", user.canRewindRef(repository));
+
+		assertEquals("owner has wrong permission!", AccessPermission.REWIND, user.getRepositoryPermission(repository).permission);
 
 		assertTrue("owner CAN NOT fork!", user.canFork(repository));
 		
@@ -2365,6 +2555,8 @@
 		assertTrue("owner CAN NOT delete ref!", user.canDeleteRef(repository));
 		assertTrue("owner CAN NOT rewind ref!", user.canRewindRef(repository));
 
+		assertEquals("owner has wrong permission!", AccessPermission.REWIND, user.getRepositoryPermission(repository).permission);
+
 		assertTrue("owner CAN NOT fork!", user.canFork(repository));
 		
 		assertFalse("owner CAN NOT delete!", user.canDelete(repository));
@@ -2379,6 +2571,8 @@
 		assertTrue("owner CAN NOT create ref!", user2.canCreateRef(repository));
 		assertTrue("owner CAN NOT delete ref!", user2.canDeleteRef(repository));
 		assertTrue("owner CAN NOT rewind ref!", user2.canRewindRef(repository));
+
+		assertEquals("owner has wrong permission!", AccessPermission.REWIND, user2.getRepositoryPermission(repository).permission);
 
 		assertTrue("owner CAN NOT fork!", user2.canFork(repository));
 		
@@ -2407,6 +2601,8 @@
 		assertTrue("user CAN NOT delete ref!", user.canDeleteRef(repository));
 		assertTrue("user CAN NOT rewind ref!", user.canRewindRef(repository));
 
+		assertEquals("user has wrong permission!", AccessPermission.REWIND, user.getRepositoryPermission(repository).permission);
+
 		assertFalse("user CAN fork!", user.canFork(repository));
 		
 		assertTrue("user CAN NOT delete!", user.canDelete(repository));
@@ -2431,6 +2627,8 @@
 		assertFalse("user CAN delete ref!", user.canDeleteRef(repository));
 		assertFalse("user CAN rewind ref!", user.canRewindRef(repository));
 
+		assertEquals("user has wrong permission!", AccessPermission.NONE, user.getRepositoryPermission(repository).permission);
+
 		assertFalse("user CAN fork!", user.canFork(repository));
 		
 		assertFalse("user CAN delete!", user.canDelete(repository));
@@ -2454,6 +2652,8 @@
 		assertFalse("user CAN create ref!", user.canCreateRef(repository));
 		assertFalse("user CAN delete ref!", user.canDeleteRef(repository));
 		assertFalse("user CAN rewind ref!", user.canRewindRef(repository));
+
+		assertEquals("user has wrong permission!", AccessPermission.CLONE, user.getRepositoryPermission(repository).permission);
 
 		assertFalse("user CAN fork!", user.canFork(repository));
 		
@@ -2481,6 +2681,8 @@
 		assertFalse("user CAN delete ref!", user.canDeleteRef(common));
 		assertFalse("user CAN rewind ref!", user.canRewindRef(common));
 
+		assertEquals("user has wrong permission!", AccessPermission.CLONE, user.getRepositoryPermission(common).permission);
+
 		assertFalse("user CAN fork!", user.canFork(common));
 		
 		assertFalse("user CAN delete!", user.canDelete(common));
@@ -2499,6 +2701,8 @@
 		assertFalse("user CAN create ref!", user.canCreateRef(personal));
 		assertFalse("user CAN delete ref!", user.canDeleteRef(personal));
 		assertFalse("user CAN rewind ref!", user.canRewindRef(personal));
+
+		assertEquals("user has wrong permission!", AccessPermission.NONE, user.getRepositoryPermission(personal).permission);
 
 		assertFalse("user CAN fork!", user.canFork(personal));
 		
@@ -2528,6 +2732,8 @@
 		assertFalse("user CAN delete ref!", user.canDeleteRef(personal));
 		assertFalse("user CAN rewind ref!", user.canRewindRef(personal));
 
+		assertEquals("user has wrong permission!", AccessPermission.CLONE, user.getRepositoryPermission(personal).permission);
+
 		assertFalse("user CAN fork!", user.canFork(personal));
 		
 		assertFalse("user CAN delete!", user.canDelete(personal));
@@ -2554,6 +2760,8 @@
 		assertFalse("user CAN delete ref!", user.canDeleteRef(personal));
 		assertFalse("user CAN rewind ref!", user.canRewindRef(personal));
 
+		assertEquals("user has wrong permission!", AccessPermission.PUSH, user.getRepositoryPermission(personal).permission);
+
 		assertFalse("user CAN fork!", user.canFork(personal));
 		
 		assertFalse("user CAN delete!", user.canDelete(personal));
@@ -2572,6 +2780,8 @@
 		assertFalse("user CAN create ref!", user.canCreateRef(personal));
 		assertFalse("user CAN delete ref!", user.canDeleteRef(personal));
 		assertFalse("user CAN rewind ref!", user.canRewindRef(personal));
+
+		assertEquals("user has wrong permission!", AccessPermission.CLONE, user.getRepositoryPermission(personal).permission);
 
 		assertFalse("user CAN fork!", user.canFork(personal));
 				
@@ -2599,6 +2809,8 @@
 		assertFalse("user CAN delete ref!", user.canDeleteRef(personal));
 		assertFalse("user CAN rewind ref!", user.canRewindRef(personal));
 
+		assertEquals("user has wrong permission!", AccessPermission.EXCLUDE, user.getRepositoryPermission(personal).permission);
+
 		assertFalse("user CAN fork!", user.canFork(personal));
 				
 		assertFalse("user CAN delete!", user.canDelete(personal));

--
Gitblit v1.9.1