From 906db0ac862bf53917618ee0a8b851d16b19611a Mon Sep 17 00:00:00 2001
From: Amanda Anganes <aanganes@mitre.org>
Date: Mon, 29 Jul 2013 09:17:50 -0400
Subject: [PATCH] Opened token api access to all users; restricted to only show
 currently-logged-in-users tokens

---
 .../repository/OAuth2TokenRepository.java     |  2 +-
 .../service/OAuth2TokenEntityService.java     |  7 ++-
 .../impl/JpaOAuth2TokenRepository.java        |  3 +-
 .../DefaultOAuth2ProviderTokenService.java    | 28 +++++++++--
 .../org/mitre/oauth2/web/AccessTokenAPI.java  | 47 +++++--------------
 .../org/mitre/oauth2/web/RefreshTokenAPI.java | 45 +++++-------------
 6 files changed, 54 insertions(+), 78 deletions(-)

diff --git a/openid-connect-common/src/main/java/org/mitre/oauth2/repository/OAuth2TokenRepository.java b/openid-connect-common/src/main/java/org/mitre/oauth2/repository/OAuth2TokenRepository.java
index 37b569291..b5a5a945d 100644
--- a/openid-connect-common/src/main/java/org/mitre/oauth2/repository/OAuth2TokenRepository.java
+++ b/openid-connect-common/src/main/java/org/mitre/oauth2/repository/OAuth2TokenRepository.java
@@ -62,7 +62,7 @@ public interface OAuth2TokenRepository {
 	public OAuth2AccessTokenEntity getAccessTokenForIdToken(OAuth2AccessTokenEntity idToken);
 
 	public Set<OAuth2AccessTokenEntity> getAllAccessTokens();
-	
+
 	public Set<OAuth2RefreshTokenEntity> getAllRefreshTokens();
 
 }
diff --git a/openid-connect-common/src/main/java/org/mitre/oauth2/service/OAuth2TokenEntityService.java b/openid-connect-common/src/main/java/org/mitre/oauth2/service/OAuth2TokenEntityService.java
index 8cd64ccd5..bc43ed08a 100644
--- a/openid-connect-common/src/main/java/org/mitre/oauth2/service/OAuth2TokenEntityService.java
+++ b/openid-connect-common/src/main/java/org/mitre/oauth2/service/OAuth2TokenEntityService.java
@@ -27,10 +27,6 @@ import org.springframework.security.oauth2.provider.token.AuthorizationServerTok
 import org.springframework.security.oauth2.provider.token.ResourceServerTokenServices;
 
 public interface OAuth2TokenEntityService extends AuthorizationServerTokenServices, ResourceServerTokenServices {
-
-	public Set<OAuth2AccessTokenEntity> getAllAccessTokens();
-	
-	public Set<OAuth2RefreshTokenEntity> getAllRefreshTokens();
 	
 	@Override
 	public OAuth2AccessTokenEntity readAccessToken(String accessTokenValue);
@@ -64,4 +60,7 @@ public interface OAuth2TokenEntityService extends AuthorizationServerTokenServic
 	
 	public OAuth2RefreshTokenEntity getRefreshTokenById(Long id);
 
+	public Set<OAuth2AccessTokenEntity> getAllAccessTokensForUser(String name);
+
+	public Set<OAuth2RefreshTokenEntity> getAllRefreshTokensForUser(String name);
 }
diff --git a/openid-connect-server/src/main/java/org/mitre/oauth2/repository/impl/JpaOAuth2TokenRepository.java b/openid-connect-server/src/main/java/org/mitre/oauth2/repository/impl/JpaOAuth2TokenRepository.java
index b41ccbb20..9b009225f 100644
--- a/openid-connect-server/src/main/java/org/mitre/oauth2/repository/impl/JpaOAuth2TokenRepository.java
+++ b/openid-connect-server/src/main/java/org/mitre/oauth2/repository/impl/JpaOAuth2TokenRepository.java
@@ -48,8 +48,9 @@ public class JpaOAuth2TokenRepository implements OAuth2TokenRepository {
 	@Override
 	public Set<OAuth2RefreshTokenEntity> getAllRefreshTokens() {
 		TypedQuery<OAuth2RefreshTokenEntity> query = manager.createNamedQuery("OAuth2RefreshTokenEntity.getAll", OAuth2RefreshTokenEntity.class);
-		return new LinkedHashSet<OAuth2RefreshTokenEntity>(query.getResultList());
+		return new LinkedHashSet<OAuth2RefreshTokenEntity>(query.getResultList());	
 	}
+
 	
 	@Override
 	public OAuth2AccessTokenEntity getAccessTokenByValue(String accessTokenValue) {
diff --git a/openid-connect-server/src/main/java/org/mitre/oauth2/service/impl/DefaultOAuth2ProviderTokenService.java b/openid-connect-server/src/main/java/org/mitre/oauth2/service/impl/DefaultOAuth2ProviderTokenService.java
index 53275502c..e926afa0a 100644
--- a/openid-connect-server/src/main/java/org/mitre/oauth2/service/impl/DefaultOAuth2ProviderTokenService.java
+++ b/openid-connect-server/src/main/java/org/mitre/oauth2/service/impl/DefaultOAuth2ProviderTokenService.java
@@ -72,12 +72,32 @@ public class DefaultOAuth2ProviderTokenService implements OAuth2TokenEntityServi
 	@Autowired
 	private TokenEnhancer tokenEnhancer;
 
-	public Set<OAuth2AccessTokenEntity> getAllAccessTokens() {
-		return tokenRepository.getAllAccessTokens();
+	public Set<OAuth2AccessTokenEntity> getAllAccessTokensForUser(String id) {
+		
+		Set<OAuth2AccessTokenEntity> all = tokenRepository.getAllAccessTokens();
+		Set<OAuth2AccessTokenEntity> results = Sets.newLinkedHashSet();
+		
+		for (OAuth2AccessTokenEntity token : all) {
+			if (token.getAuthenticationHolder().getAuthentication().getName().equals(id)) {
+				results.add(token);
+			}
+		}
+		
+		return results;
 	}
+		
 	
-	public Set<OAuth2RefreshTokenEntity> getAllRefreshTokens() {
-		return tokenRepository.getAllRefreshTokens();
+	public Set<OAuth2RefreshTokenEntity> getAllRefreshTokensForUser(String id) {
+		Set<OAuth2RefreshTokenEntity> all = tokenRepository.getAllRefreshTokens();
+		Set<OAuth2RefreshTokenEntity> results = Sets.newLinkedHashSet();
+		
+		for (OAuth2RefreshTokenEntity token : all) {
+			if (token.getAuthenticationHolder().getAuthentication().getName().equals(id)) {
+				results.add(token);
+			}
+		}
+		
+		return results;
 	}
 	
 	public OAuth2AccessTokenEntity getAccessTokenById(Long id) {
diff --git a/openid-connect-server/src/main/java/org/mitre/oauth2/web/AccessTokenAPI.java b/openid-connect-server/src/main/java/org/mitre/oauth2/web/AccessTokenAPI.java
index 72390ed57..18bd4c18d 100644
--- a/openid-connect-server/src/main/java/org/mitre/oauth2/web/AccessTokenAPI.java
+++ b/openid-connect-server/src/main/java/org/mitre/oauth2/web/AccessTokenAPI.java
@@ -1,5 +1,6 @@
 package org.mitre.oauth2.web;
 
+import java.security.Principal;
 import java.util.Set;
 
 import org.mitre.oauth2.model.OAuth2AccessTokenEntity;
@@ -31,56 +32,32 @@ public class AccessTokenAPI {
 	private static Logger logger = LoggerFactory.getLogger(AccessTokenAPI.class);
 	
 	@RequestMapping(value = "", method = RequestMethod.GET, produces = "application/json")
-	public String getAll(ModelMap m) {
-
-		Set<OAuth2AccessTokenEntity> allTokens = tokenService.getAllAccessTokens();
+	public String getAll(ModelMap m, Principal p) {
 
+		Set<OAuth2AccessTokenEntity> allTokens = tokenService.getAllAccessTokensForUser(p.getName());
 		m.put("entity", allTokens);
-
 		return "jsonEntityView";
 	}
 	
 	@RequestMapping(value = "/{id}", method = RequestMethod.GET, produces = "application/json")
-	public String getById(@PathVariable("id") Long id, ModelMap m) {
+	public String getById(@PathVariable("id") Long id, ModelMap m, Principal p) {
 		
 		OAuth2AccessTokenEntity token = tokenService.getAccessTokenById(id);
 		
-		if (token != null) {
-
-			m.put("entity", token);
-
-			return "jsonEntityView";
-		} else {
-
+		 if (token == null) {
 			logger.error("getToken failed; token not found: " + id);
-
 			m.put("code", HttpStatus.NOT_FOUND);
 			m.put("errorMessage", "The requested token with id " + id + " could not be found.");
 			return "jsonErrorView";
-		}
-	}
-	
-	@PreAuthorize("hasRole('ROLE_ADMIN')")
-	@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
-	public String delete(@PathVariable("id") Long id, ModelMap m) {
-		
-		OAuth2AccessTokenEntity token = tokenService.getAccessTokenById(id);
-		
-		if (token != null) {
-
-			tokenService.revokeAccessToken(token);
-			m.put("code", HttpStatus.OK);
-			return "httpCodeView";
-			
+		} else if (!token.getAuthenticationHolder().getAuthentication().getName().equals(p.getName())) { 
+			logger.error("getToken failed; token does not belong to principal " + p.getName());
+			m.put("code", HttpStatus.FORBIDDEN);
+			m.put("errorMessage", "You do not have permission to view this token");
+			return "jsonErrorView";
 		} else {
-
-			logger.error("Delete token failed; token not found: " + id);
-
-			m.put("code", HttpStatus.NOT_FOUND);
-			m.put("errorMessage", "The requested token with id " + id + " could not be found.");
-			return "jsonErrorView";
+			m.put("entity", token);
+			return "jsonEntityView";
 		}
-
 	}
 	
 }
diff --git a/openid-connect-server/src/main/java/org/mitre/oauth2/web/RefreshTokenAPI.java b/openid-connect-server/src/main/java/org/mitre/oauth2/web/RefreshTokenAPI.java
index 4c1e8f00b..e2a2a46a4 100644
--- a/openid-connect-server/src/main/java/org/mitre/oauth2/web/RefreshTokenAPI.java
+++ b/openid-connect-server/src/main/java/org/mitre/oauth2/web/RefreshTokenAPI.java
@@ -1,5 +1,6 @@
 package org.mitre.oauth2.web;
 
+import java.security.Principal;
 import java.util.Set;
 
 import org.mitre.oauth2.model.OAuth2RefreshTokenEntity;
@@ -32,9 +33,9 @@ public class RefreshTokenAPI {
 	private static Logger logger = LoggerFactory.getLogger(RefreshTokenAPI.class);
 	
 	@RequestMapping(value = "", method = RequestMethod.GET, produces = "application/json")
-	public String getAll(ModelMap m) {
+	public String getAll(ModelMap m, Principal p) {
 
-		Set<OAuth2RefreshTokenEntity> allTokens = tokenService.getAllRefreshTokens();
+		Set<OAuth2RefreshTokenEntity> allTokens = tokenService.getAllRefreshTokensForUser(p.getName());
 
 		m.put("entity", allTokens);
 
@@ -42,46 +43,24 @@ public class RefreshTokenAPI {
 	}
 	
 	@RequestMapping(value = "/{id}", method = RequestMethod.GET, produces = "application/json")
-	public String getById(@PathVariable("id") Long id, ModelMap m) {
+	public String getById(@PathVariable("id") Long id, ModelMap m, Principal p) {
 		
 		OAuth2RefreshTokenEntity token = tokenService.getRefreshTokenById(id);
 		
-		if (token != null) {
-
-			m.put("entity", token);
-
-			return "jsonEntityView";
-		} else {
-
+		 if (token == null) {
 			logger.error("getToken failed; token not found: " + id);
-
 			m.put("code", HttpStatus.NOT_FOUND);
 			m.put("errorMessage", "The requested token with id " + id + " could not be found.");
 			return "jsonErrorView";
-		}
-	}
-	
-	@PreAuthorize("hasRole('ROLE_ADMIN')")
-	@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
-	public String delete(@PathVariable("id") Long id, ModelMap m) {
-		
-		OAuth2RefreshTokenEntity token = tokenService.getRefreshTokenById(id);
-		
-		if (token != null) {
-
-			tokenService.revokeRefreshToken(token);
-			m.put("code", HttpStatus.OK);
-			return "httpCodeView";
-			
+		} else if (!token.getAuthenticationHolder().getAuthentication().getName().equals(p.getName())) { 
+			logger.error("getToken failed; token does not belong to principal " + p.getName());
+			m.put("code", HttpStatus.FORBIDDEN);
+			m.put("errorMessage", "You do not have permission to view this token");
+			return "jsonErrorView";
 		} else {
-
-			logger.error("Delete token failed; token not found: " + id);
-
-			m.put("code", HttpStatus.NOT_FOUND);
-			m.put("errorMessage", "The requested token with id " + id + " could not be found.");
-			return "jsonErrorView";
+			m.put("entity", token);
+			return "jsonEntityView";
 		}
-
 	}
 	
 }