Minor Improvement
[clamp.git] / src / main / java / org / onap / clamp / clds / service / SecureServiceBase.java
index 89e6c09..22fe4a8 100644 (file)
  * limitations under the License.
  * ============LICENSE_END============================================
  * ===================================================================
- * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * 
  */
 
 package org.onap.clamp.clds.service;
 
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+
 import java.security.Principal;
+import java.util.Date;
 
 import javax.ws.rs.NotAuthorizedException;
 import javax.ws.rs.core.Context;
@@ -31,21 +35,19 @@ import javax.ws.rs.core.SecurityContext;
 
 import org.onap.clamp.clds.util.LoggingUtils;
 
-import com.att.eelf.configuration.EELFLogger;
-import com.att.eelf.configuration.EELFManager;
-
 /**
  * Base/abstract Service class. Implements shared security methods.
  */
 public abstract class SecureServiceBase {
-    protected static final EELFLogger       logger          = EELFManager.getInstance().getLogger(SecureServiceBase.class);
+    protected static final EELFLogger logger          = EELFManager.getInstance().getLogger(SecureServiceBase.class);
     protected static final EELFLogger auditLogger     = EELFManager.getInstance().getAuditLogger();
+    protected static final EELFLogger securityLogger  = EELFManager.getInstance().getSecurityLogger();
 
     // By default we'll set it to a default handler
-    private static UserNameHandler  userNameHandler = new DefaultUserNameHandler();
+    private static UserNameHandler    userNameHandler = new DefaultUserNameHandler();
 
     @Context
-    private SecurityContext         securityContext;
+    private SecurityContext           securityContext;
 
     /**
      * Get the userId from AAF/CSP.
@@ -63,7 +65,10 @@ public abstract class SecureServiceBase {
      */
     public String getUserName() {
         String name = userNameHandler.retrieveUserName(securityContext);
-        logger.debug("userName={}", name);
+        Date startTime = new Date();
+        LoggingUtils.setTargetContext("CLDS", "getUserName");
+        LoggingUtils.setTimeContext(startTime, new Date());
+        securityLogger.debug("User logged into the CLDS system={}", name);
         return name;
     }
 
@@ -91,39 +96,27 @@ public abstract class SecureServiceBase {
      * app-perm-type|dev|read
      *
      * @param inPermission
-     * @return
+     *            The permission to validate
+     * @return A boolean to indicate if the user has the permission to do
+     *         execute the inPermission
      * @throws NotAuthorizedException
+     *             In case of issues with the permission test, error is returned
+     *             in this exception
      */
-    public boolean isAuthorized(SecureServicePermission inPermission) throws NotAuthorizedException {
-        boolean authorized = false;
-        logger.debug("checking if {} has permission: {}", getPrincipalName(), inPermission);
-        // check if the user has the permission key or the permission key with a
-        // combination of all instance and/or all action.
-        if (securityContext.isUserInRole(inPermission.getKey())) {
-            logger.info("{} authorized for permission: {}", getPrincipalName(), inPermission.getKey());
-            authorized = true;
-            // the rest of these don't seem to be required - isUserInRole method
-            // appears to take * as a wildcard
-        } else if (securityContext.isUserInRole(inPermission.getKeyAllInstance())) {
-            logger.info("{} authorized because user has permission with * for instance: {}", getPrincipalName(),
-                    inPermission.getKey());
-            authorized = true;
-        } else if (securityContext.isUserInRole(inPermission.getKeyAllInstanceAction())) {
-            logger.info("{} authorized because user has permission with * for instance and * for action: {}",
-                    getPrincipalName(), inPermission.getKey());
-            authorized = true;
-        } else if (securityContext.isUserInRole(inPermission.getKeyAllAction())) {
-            logger.info("{} authorized because user has permission with * for action: {}", getPrincipalName(),
-                    inPermission.getKey());
-            authorized = true;
-        } else {
-            String msg = getPrincipalName() + " does not have permission: " + inPermission;
-            LoggingUtils.setErrorContext("100", "Authorization Error");
-            logger.warn(msg);
-            throw new NotAuthorizedException(msg);
-        }
-        return authorized;
-    }
+       public boolean isAuthorized(SecureServicePermission inPermission) throws NotAuthorizedException {
+               Date startTime = new Date();
+               LoggingUtils.setTargetContext("CLDS", "isAuthorized");
+               LoggingUtils.setTimeContext(startTime, new Date());
+               securityLogger.debug("checking if {} has permission: {}", getPrincipalName(), inPermission);
+               try {
+                       return isUserPermitted(inPermission);
+               } catch (NotAuthorizedException nae) {
+                       String msg = getPrincipalName() + " does not have permission: " + inPermission;
+                       LoggingUtils.setErrorContext("100", "Authorization Error");
+                       securityLogger.warn(msg);
+                       throw new NotAuthorizedException(msg);
+               }
+       }
 
     /**
      * Check if user is authorized for the given aaf permission. Allow matches
@@ -133,43 +126,65 @@ public abstract class SecureServiceBase {
      * it will be authorized if the inPermission to check is:
      * app-perm-type|dev|read
      *
-     * @param aafPermission
-     * @return
-     * @throws NotAuthorizedException
+     * @param inPermission
+     *            The permission to validate
+     * @return A boolean to indicate if the user has the permission to do
+     *         execute the inPermission
+     */
+       public boolean isAuthorizedNoException(SecureServicePermission inPermission) {
+               securityLogger.debug("checking if {} has permission: {}", getPrincipalName(), inPermission);
+               Date startTime = new Date();
+               LoggingUtils.setTargetContext("CLDS", "isAuthorizedNoException");
+               LoggingUtils.setTimeContext(startTime, new Date());
+               try {
+                       return isUserPermitted(inPermission);
+               } catch (NotAuthorizedException nae) {
+                       String msg = getPrincipalName() + " does not have permission: " + inPermission;
+                       LoggingUtils.setErrorContext("100", "Authorization Error");
+                       securityLogger.warn(msg);
+               }
+               return false;
+       }
+
+    /**
+     * This method can be used by the Application.class to set the
+     * UserNameHandler that must be used in this class. The UserNameHandler
+     * where to get the User name
+     * 
+     * @param handler
+     *            The Handler impl to use
      */
-    public boolean isAuthorizedNoException(SecureServicePermission inPermission) throws NotAuthorizedException {
-        boolean authorized = false;
-        logger.debug("checking if {} has permission: {}", getPrincipalName(), inPermission);
-        // check if the user has the permission key or the permission key with a
-        // combination of all instance and/or all action.
+    public static final void setUserNameHandler(UserNameHandler handler) {
+        if (handler != null) {
+            userNameHandler = handler;
+        }
+    }
+
+    public void setSecurityContext(SecurityContext securityContext) {
+        this.securityContext = securityContext;
+    }
+    
+    private boolean isUserPermitted(SecureServicePermission inPermission) throws NotAuthorizedException {
+       boolean authorized = false;
+       // check if the user has the permission key or the permission key with a
+        // combination of  all instance and/or all action.
         if (securityContext.isUserInRole(inPermission.getKey())) {
-            logger.info("{} authorized for permission: {}", getPrincipalName(), inPermission.getKey());
+            securityLogger.info("{} authorized for permission: {}", getPrincipalName(), inPermission.getKey());            
             authorized = true;
             // the rest of these don't seem to be required - isUserInRole method
             // appears to take * as a wildcard
         } else if (securityContext.isUserInRole(inPermission.getKeyAllInstance())) {
-            logger.info("{} authorized because user has permission with * for instance: {}", getPrincipalName(),
-                    inPermission.getKey());
+            securityLogger.info("{} authorized because user has permission with * for instance: {}", getPrincipalName(), inPermission.getKey());
             authorized = true;
         } else if (securityContext.isUserInRole(inPermission.getKeyAllInstanceAction())) {
-            logger.info("{} authorized because user has permission with * for instance and * for action: {}",
-                    getPrincipalName(), inPermission.getKey());
+             securityLogger.info("{} authorized because user has permission with * for instance and * for action: {}", getPrincipalName(), inPermission.getKey());            
             authorized = true;
         } else if (securityContext.isUserInRole(inPermission.getKeyAllAction())) {
-            logger.info("{} authorized because user has permission with * for action: {}", getPrincipalName(),
-                    inPermission.getKey());
+            securityLogger.info("{} authorized because user has permission with * for action: {}", getPrincipalName(), inPermission.getKey());            
             authorized = true;
         } else {
-            String msg = getPrincipalName() + " does not have permission: " + inPermission;
-            LoggingUtils.setErrorContext("100", "Authorization Error");
-            logger.warn(msg);
+            throw new NotAuthorizedException("");
         }
         return authorized;
     }
-
-    public static final void setUserNameHandler(UserNameHandler handler) {
-        if (handler != null) {
-            userNameHandler = handler;
-        }
-    }
-}
+}
\ No newline at end of file