Updated code for audit logs
[portal.git] / ecomp-portal-BE-common / src / main / java / org / onap / portalapp / portal / logging / aop / EPEELFLoggerAdvice.java
index 30795c0..43ea4c3 100644 (file)
@@ -2,7 +2,7 @@
  * ============LICENSE_START==========================================
  * ONAP Portal
  * ===================================================================
- * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
  * ===================================================================
  *
  * Unless otherwise specified, all software contained herein is licensed
  *
  * ============LICENSE_END============================================
  *
- * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * 
  */
 package org.onap.portalapp.portal.logging.aop;
 
 import java.net.InetAddress;
-import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.UUID;
 
 import javax.servlet.http.HttpServletRequest;
 
+import org.onap.portalapp.portal.domain.EPApp;
 import org.onap.portalapp.portal.domain.EPUser;
+import org.onap.portalapp.portal.service.AppsCacheService;
 import org.onap.portalapp.portal.utils.EPCommonSystemProperties;
+import org.onap.portalapp.portal.utils.EcompPortalUtils;
 import org.onap.portalapp.util.EPUserUtils;
 import org.onap.portalsdk.core.exception.SessionExpiredException;
 import org.onap.portalsdk.core.logging.format.AlarmSeverityEnum;
 import org.onap.portalsdk.core.logging.format.AuditLogFormatter;
 import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
+import org.onap.portalsdk.core.logging.logic.LoggerProperties;
 import org.onap.portalsdk.core.util.SystemProperties;
 import org.onap.portalsdk.core.util.SystemProperties.SecurityEventTypeEnum;
 import org.onap.portalsdk.core.web.support.UserUtils;
 import org.slf4j.MDC;
+import org.springframework.beans.factory.annotation.Autowired;
 
 import com.att.eelf.configuration.Configuration;
 
@@ -63,13 +67,16 @@ import com.att.eelf.configuration.Configuration;
 public class EPEELFLoggerAdvice {
 
        private EELFLoggerDelegate adviceLogger = EELFLoggerDelegate.getLogger(EPEELFLoggerAdvice.class);
+       
+       @Autowired
+       AppsCacheService appCacheService;
 
        /**
-        * DateTime Format according to the ECOMP Application Logging Guidelines.
+        * DateTime Format according to the ONAP Application Logging Guidelines.
         */
 
        /**
-        * @return Current date and time in the format specified by the ECOMP
+        * @return Current date and time in the format specified by the ONAP
         *         Application Logging Guidelines.
         */
        public static String getCurrentDateTimeUTC() {
@@ -102,6 +109,7 @@ public class EPEELFLoggerAdvice {
         * @return Object array
         */
        public Object[] before(SecurityEventTypeEnum securityEventType, Object[] args, Object[] passOnArgs) {
+               try {
                String className = "";
                if (passOnArgs.length > 0 && passOnArgs[0] != null)
                        className = passOnArgs[0].toString();
@@ -111,6 +119,7 @@ public class EPEELFLoggerAdvice {
 
                // Initialize Request defaults only for controller methods.
                MDC.put(className + methodName + EPCommonSystemProperties.METRICSLOG_BEGIN_TIMESTAMP, getCurrentDateTimeUTC());
+               MDC.put(EPCommonSystemProperties.METRICSLOG_BEGIN_TIMESTAMP, getCurrentDateTimeUTC());
                MDC.put(EPCommonSystemProperties.TARGET_ENTITY, EPCommonSystemProperties.ECOMP_PORTAL_BE);
                MDC.put(EPCommonSystemProperties.TARGET_SERVICE_NAME, methodName);
                if (MDC.get(Configuration.MDC_KEY_REQUEST_ID) == null||MDC.get(Configuration.MDC_KEY_REQUEST_ID).isEmpty()){
@@ -118,20 +127,62 @@ public class EPEELFLoggerAdvice {
                        MDC.put(Configuration.MDC_KEY_REQUEST_ID, requestId);
                }
                MDC.put(EPCommonSystemProperties.PARTNER_NAME, "Unknown");
-               MDC.put(Configuration.MDC_SERVICE_NAME, EPCommonSystemProperties.ECOMP_PORTAL_BE);
 
+               EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(className);
+               MDC.put(EPCommonSystemProperties.STATUS_CODE, "INPROGRESS");
+
+               // Log security message, if necessary
                if (securityEventType != null) {
                        MDC.put(className + methodName + EPCommonSystemProperties.AUDITLOG_BEGIN_TIMESTAMP,
                                        getCurrentDateTimeUTC());
+                       MDC.put(EPCommonSystemProperties.AUDITLOG_BEGIN_TIMESTAMP,getCurrentDateTimeUTC());
+                       MDC.put(EPCommonSystemProperties.AUDITLOG_END_TIMESTAMP, getCurrentDateTimeUTC());
+                       this.calculateDateTimeDifference(MDC.get(EPCommonSystemProperties.AUDITLOG_BEGIN_TIMESTAMP),MDC.get(EPCommonSystemProperties.AUDITLOG_END_TIMESTAMP));
                        HttpServletRequest req = null;
                        if (args.length > 0 && args[0] != null && args[0] instanceof HttpServletRequest) {
                                req = (HttpServletRequest) args[0];
                                this.setHttpRequestBasedDefaultsIntoGlobalLoggingContext(req, securityEventType, methodName);
                        }
-               }
+                       try {
+                               MDC.put(Configuration.MDC_SERVER_FQDN, InetAddress.getLocalHost().getCanonicalHostName());
+                       } catch (Exception e) {
+                               adviceLogger.error(EELFLoggerDelegate.errorLogger,
+                                               " while setting the IP address ", e);
+                       }
+                       MDC.put(SystemProperties.CUSTOM_FIELD1, "ENTRY");
+                       MDC.put(SystemProperties.CUSTOM_FIELD2, "InvocationID="+MDC.get(Configuration.MDC_KEY_REQUEST_ID));
+                       this.logSecurityMessage(logger, securityEventType, methodName);
 
-               EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(className);
+                       // Outgoing & LDAP messages are part of Incoming requests so,
+                       // keep "RequestId", "PartnerName", "ServiceName", "LoginId" &
+                       // "ResponseCode" etc. in memory and remove it only when
+                       // finished processing the parent incoming message.
+                       if (securityEventType != SecurityEventTypeEnum.OUTGOING_REST_MESSAGE
+                                       && securityEventType != SecurityEventTypeEnum.LDAP_PHONEBOOK_USER_SEARCH) {
+                               MDC.remove(Configuration.MDC_KEY_REQUEST_ID);
+                               MDC.remove(EPCommonSystemProperties.PARTNER_NAME);
+                               MDC.remove(Configuration.MDC_SERVICE_NAME);
+                               MDC.remove(EPCommonSystemProperties.MDC_LOGIN_ID);
+                               MDC.remove(EPCommonSystemProperties.EXTERNAL_API_RESPONSE_CODE);
+                       }else{
+                               MDC.remove(Configuration.MDC_KEY_REQUEST_ID);
+                               MDC.remove(EPCommonSystemProperties.PARTNER_NAME);
+                               MDC.remove(Configuration.MDC_SERVICE_NAME);
+                       }
+                       logger.debug(EELFLoggerDelegate.debugLogger, "{} was invoked.", methodName);
+                       
+                       MDC.remove(Configuration.MDC_SERVER_FQDN);
+               } else {
+                       MDC.put(SystemProperties.METRICSLOG_END_TIMESTAMP, getCurrentDateTimeUTC());
+                       this.calculateDateTimeDifference(MDC.get(SystemProperties.METRICSLOG_BEGIN_TIMESTAMP),MDC.get(SystemProperties.METRICSLOG_END_TIMESTAMP));
+                       MDC.put(SystemProperties.CUSTOM_FIELD1, "INVOKE");
+                       MDC.put(SystemProperties.CUSTOM_FIELD2, " InvocationID="+MDC.get(Configuration.MDC_KEY_REQUEST_ID));
+                       logger.info(EELFLoggerDelegate.metricsLogger, methodName + " operation is started.");           
+               }
                logger.debug(EELFLoggerDelegate.debugLogger, "EPEELFLoggerAdvice#before: entering {}", methodName);
+               } catch (Exception e) {
+                       adviceLogger.error(EELFLoggerDelegate.errorLogger, "before failed", e);
+               }
                return new Object[] { "" };
        }
 
@@ -146,6 +197,7 @@ public class EPEELFLoggerAdvice {
         */
        public void after(SecurityEventTypeEnum securityEventType, String statusCode, String responseCode, Object[] args,
                        Object[] returnArgs, Object[] passOnArgs) {
+               try {
                String className = "";
                if (passOnArgs.length > 0 && passOnArgs[0] != null)
                        className = passOnArgs[0].toString();
@@ -166,9 +218,11 @@ public class EPEELFLoggerAdvice {
                        String requestId = UUID.randomUUID().toString();
                        MDC.put(Configuration.MDC_KEY_REQUEST_ID, requestId);
                }
-               MDC.put(EPCommonSystemProperties.PARTNER_NAME, "Unknown");
-               MDC.put(Configuration.MDC_SERVICE_NAME, EPCommonSystemProperties.ECOMP_PORTAL_BE);
 
+               if (MDC.get(EPCommonSystemProperties.PARTNER_NAME) == null|| MDC.get(EPCommonSystemProperties.PARTNER_NAME).isEmpty()){
+                       MDC.put(EPCommonSystemProperties.PARTNER_NAME, "Unknown");
+               }
+               
 
                MDC.put(EPCommonSystemProperties.METRICSLOG_BEGIN_TIMESTAMP,
                                MDC.get(className + methodName + EPCommonSystemProperties.METRICSLOG_BEGIN_TIMESTAMP));
@@ -197,12 +251,9 @@ public class EPEELFLoggerAdvice {
                        MDC.put(EPCommonSystemProperties.RESPONSE_CODE, externalAPIResponseCode);
                        MDC.put(EPCommonSystemProperties.STATUS_CODE, "ERROR");
                }
-
+               MDC.put(EPCommonSystemProperties.STATUS_CODE, "COMPLETE");
                EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(className);
-               logger.debug(EELFLoggerDelegate.debugLogger, "EPEELFLoggerAdvice#after: finished {}", methodName);
-               // add the metrics log
-               logger.info(EELFLoggerDelegate.metricsLogger,  methodName + " operation is completed.");
-
+               
                // Log security message, if necessary
                if (securityEventType != null) {
                        MDC.put(EPCommonSystemProperties.AUDITLOG_BEGIN_TIMESTAMP,
@@ -210,7 +261,14 @@ public class EPEELFLoggerAdvice {
                        MDC.put(EPCommonSystemProperties.AUDITLOG_END_TIMESTAMP, getCurrentDateTimeUTC());
                        this.calculateDateTimeDifference(MDC.get(EPCommonSystemProperties.AUDITLOG_BEGIN_TIMESTAMP),
                                        MDC.get(EPCommonSystemProperties.AUDITLOG_END_TIMESTAMP));
-
+                       MDC.put(SystemProperties.CUSTOM_FIELD1, "EXIT");
+                       MDC.put(SystemProperties.CUSTOM_FIELD2, "InvocationID="+MDC.get(Configuration.MDC_KEY_REQUEST_ID));
+                       try {
+                               MDC.put(Configuration.MDC_SERVER_FQDN, InetAddress.getLocalHost().getCanonicalHostName());
+                       } catch (Exception e) {
+                               adviceLogger.error(EELFLoggerDelegate.errorLogger,
+                                               " while setting the IP address ", e);
+                       }
                        this.logSecurityMessage(logger, securityEventType, methodName);
 
                        // Outgoing & LDAP messages are part of Incoming requests so,
@@ -231,6 +289,7 @@ public class EPEELFLoggerAdvice {
                        }
 
                        // clear when finishes audit logging
+                       MDC.remove(Configuration.MDC_SERVER_FQDN);
                        MDC.remove(EPCommonSystemProperties.FULL_URL);
                        MDC.remove(EPCommonSystemProperties.PROTOCOL);
                        MDC.remove(EPCommonSystemProperties.STATUS_CODE);
@@ -238,13 +297,25 @@ public class EPEELFLoggerAdvice {
                        MDC.remove(EPCommonSystemProperties.AUDITLOG_BEGIN_TIMESTAMP);
                        MDC.remove(EPCommonSystemProperties.AUDITLOG_END_TIMESTAMP);
                        MDC.remove(EPCommonSystemProperties.RESPONSE_CODE);
+                       
+               } else {
+                       MDC.put(SystemProperties.CUSTOM_FIELD1, "INVOKE-RETURN");
+                       MDC.put(SystemProperties.CUSTOM_FIELD2, " InvocationID="+MDC.get(Configuration.MDC_KEY_REQUEST_ID));
+                       // add the metrics log
+                       logger.info(EELFLoggerDelegate.metricsLogger,  methodName + " operation is completed.");
                }
+               logger.debug(EELFLoggerDelegate.debugLogger, "EPEELFLoggerAdvice#after: finished {}", methodName);
+               MDC.remove(SystemProperties.CUSTOM_FIELD1);
+               MDC.remove(SystemProperties.CUSTOM_FIELD2);
                MDC.remove(className + methodName + EPCommonSystemProperties.METRICSLOG_BEGIN_TIMESTAMP);
                MDC.remove(EPCommonSystemProperties.METRICSLOG_BEGIN_TIMESTAMP);
                MDC.remove(EPCommonSystemProperties.METRICSLOG_END_TIMESTAMP);
                MDC.remove(EPCommonSystemProperties.MDC_TIMER);
                MDC.remove(EPCommonSystemProperties.TARGET_ENTITY);
                MDC.remove(EPCommonSystemProperties.TARGET_SERVICE_NAME);
+               } catch (Exception e) {
+                       adviceLogger.error(EELFLoggerDelegate.errorLogger, "after failed", e);
+               }
        
        }
 
@@ -310,62 +381,18 @@ public class EPEELFLoggerAdvice {
                                        && securityEventType != SecurityEventTypeEnum.LDAP_PHONEBOOK_USER_SEARCH
                                        && securityEventType != SecurityEventTypeEnum.INCOMING_UEB_MESSAGE) {
                                // Load the RequestID (aka TrasactionId) into MDC context.
-                               String requestId = UserUtils.getRequestId(req);
-                               if (requestId == null||requestId.trim().length()==0) {
-                                       requestId = UUID.randomUUID().toString();
-                               }
-                               MDC.put(Configuration.MDC_KEY_REQUEST_ID, requestId);
-
-                               // Load user agent into MDC context, if available.
-                               String accessingClient = req.getHeader(SystemProperties.USERAGENT_NAME);
-                               accessingClient = (accessingClient == null || accessingClient.trim().length()==0)?"Unknown":accessingClient;
-                               if (accessingClient != null && accessingClient.trim().length()==0 && (accessingClient.contains("Mozilla")
-                                               || accessingClient.contains("Chrome") || accessingClient.contains("Safari"))) {
-                                       accessingClient = EPCommonSystemProperties.ECOMP_PORTAL_FE;
-                               }
-                               MDC.put(EPCommonSystemProperties.PARTNER_NAME, accessingClient);
-
-                               // Load loginId into MDC context.
-                               EPUser user = null;
-                               try {
-                                       user = EPUserUtils.getUserSession(req);
-                               } catch (SessionExpiredException se) {
-                                       adviceLogger.debug(EELFLoggerDelegate.debugLogger,
-                                                       "setHttpRequestBasedDefaultsIntoGlobalLoggingContext: No user found in session");
-                               }
+                               loadRequestId(req);
+                               
+                               loadPartnerName(req);
 
-                               MDC.put(EPCommonSystemProperties.MDC_LOGIN_ID, (user != null ? user.getOrgUserId() : "NoUser"));
-
-                               // Rest URL & Protocol
-                               String restURL = "";
-                               MDC.put(EPCommonSystemProperties.FULL_URL, EPCommonSystemProperties.UNKNOWN);
-                               MDC.put(EPCommonSystemProperties.PROTOCOL, EPCommonSystemProperties.HTTP);
-                               restURL = UserUtils.getFullURL(req);
-                               //if (restURL != null && restURL != "") {
-                               if (restURL != null && restURL.trim().length()>0) {
-                                       MDC.put(EPCommonSystemProperties.FULL_URL, restURL);
-                                       if (restURL.toLowerCase().contains("https")) {
-                                               MDC.put(EPCommonSystemProperties.PROTOCOL, EPCommonSystemProperties.HTTPS);
-                                       }
-                               }
+                               loadLoginId(req);
 
-                               // Rest Path
-                               MDC.put(Configuration.MDC_SERVICE_NAME, restMethod);
-                               String restPath = req.getServletPath();
-                               //if (restPath != null && restPath != "") {
-                               if (restPath != null && restPath.trim().length()>0) {
+                               loadUrlProtocol(req);
 
-                                       MDC.put(Configuration.MDC_SERVICE_NAME, restPath);
-                               }
+                               loadServicePath(req, restMethod);
 
-                               // Client IPAddress i.e. IPAddress of the remote host who is
-                               // making this request.
-                               String clientIPAddress = "";
-                               clientIPAddress = req.getHeader("X-FORWARDED-FOR");
-                               if (clientIPAddress == null) {
-                                       clientIPAddress = req.getRemoteAddr();
-                               }
-                               MDC.put(EPCommonSystemProperties.CLIENT_IP_ADDRESS, clientIPAddress);
+                               loadClientAddress(req);
+                               
                        } else if (securityEventType == SecurityEventTypeEnum.LDAP_PHONEBOOK_USER_SEARCH) {
                                MDC.put(EPCommonSystemProperties.TARGET_ENTITY, "Phonebook");
                                MDC.put(EPCommonSystemProperties.TARGET_SERVICE_NAME, "search");
@@ -387,6 +414,105 @@ public class EPEELFLoggerAdvice {
                }
        }
 
+       private void loadClientAddress(HttpServletRequest req) {
+               // Client IPAddress i.e. IPAddress of the remote host who is
+               // making this request.
+               String clientIPAddress = "";
+               clientIPAddress = req.getHeader("X-FORWARDED-FOR");
+               if (clientIPAddress == null) {
+                       clientIPAddress = req.getRemoteAddr();
+               }
+               MDC.put(EPCommonSystemProperties.CLIENT_IP_ADDRESS, clientIPAddress);
+       }
+
+       private void loadServicePath(HttpServletRequest req, String restMethod) {
+               // Rest Path
+               MDC.put(Configuration.MDC_SERVICE_NAME, restMethod);
+               String restPath = req.getServletPath();
+               //if (restPath != null && restPath != "") {
+               if (restPath != null && restPath.trim().length()>0) {
+
+                       MDC.put(Configuration.MDC_SERVICE_NAME, restPath);
+               }
+       }
+
+       private void loadUrlProtocol(HttpServletRequest req) {
+               // Rest URL & Protocol
+               String restURL = "";
+               MDC.put(EPCommonSystemProperties.FULL_URL, EPCommonSystemProperties.UNKNOWN);
+               MDC.put(EPCommonSystemProperties.PROTOCOL, EPCommonSystemProperties.HTTP);
+               restURL = UserUtils.getFullURL(req);
+               //if (restURL != null && restURL != "") {
+               if (restURL != null && restURL.trim().length()>0) {
+                       MDC.put(EPCommonSystemProperties.FULL_URL, restURL);
+                       if (restURL.toLowerCase().contains("https")) {
+                               MDC.put(EPCommonSystemProperties.PROTOCOL, EPCommonSystemProperties.HTTPS);
+                       }
+               }
+       }
+
+       private void loadRequestId(HttpServletRequest req) {
+               String requestId = UserUtils.getRequestId(req);
+               if (requestId == null||requestId.trim().length()==0) {
+                       requestId = UUID.randomUUID().toString();
+               }
+               MDC.put(Configuration.MDC_KEY_REQUEST_ID, requestId);
+       }
+
+       private void loadLoginId(HttpServletRequest req) {
+               // Load loginId into MDC context.
+               String loginId = "NoUser";
+
+               try {
+                       EPUser user = EPUserUtils.getUserSession(req);
+                       loginId = (user != null ? user.getOrgUserId(): loginId);
+               } catch (SessionExpiredException se) {
+                       adviceLogger.debug(EELFLoggerDelegate.debugLogger,
+                                       "setHttpRequestBasedDefaultsIntoGlobalLoggingContext: No user found in session");
+               }
+               
+               // try fetching from username in header
+               final String nameHeader = req.getHeader(EPCommonSystemProperties.USERNAME);
+               if (nameHeader != null) {
+                       loginId = nameHeader;
+               }
+               
+               // try fetching from BasicAuth info
+               final String authHeader = req.getHeader(EPCommonSystemProperties.AUTHORIZATION);
+               if (authHeader != null) {
+                       String[] accountNamePassword = EcompPortalUtils.getUserNamePassword(authHeader);
+                       if (accountNamePassword != null && accountNamePassword.length == 2) {
+                               loginId = accountNamePassword[0];
+                       }
+
+               }
+               
+               MDC.put(EPCommonSystemProperties.MDC_LOGIN_ID, loginId );
+
+       }
+
+       private void loadPartnerName(HttpServletRequest req) {
+               
+
+               // Load user agent into MDC context, if available.
+               String accessingClient = req.getHeader(SystemProperties.USERAGENT_NAME);
+               accessingClient = (accessingClient == null || accessingClient.trim().length()==0)?"Unknown":accessingClient;
+               if (accessingClient != null && accessingClient.trim().length()==0 && (accessingClient.contains("Mozilla")
+                               || accessingClient.contains("Chrome") || accessingClient.contains("Safari"))) {
+                       accessingClient = EPCommonSystemProperties.ECOMP_PORTAL_FE;
+               }
+               MDC.put(EPCommonSystemProperties.PARTNER_NAME, accessingClient);
+               
+               // try get the Partner name from uebkey
+               String uebVal = req.getHeader(EPCommonSystemProperties.UEB_KEY);
+               if(uebVal != null) {
+                       EPApp appRecord = appCacheService.getAppFromUeb(uebVal);
+                       MDC.put(EPCommonSystemProperties.PARTNER_NAME, appRecord.getName());
+               }
+               
+               
+       }
+
        /**
         * 
         * @param beginDateTime