/*- * ============LICENSE_START======================================================= * SDC * ================================================================================ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============LICENSE_END========================================================= */ package org.openecomp.sdc.be.auditing.impl; import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum; import org.openecomp.sdc.common.api.Constants; import org.openecomp.sdc.common.datastructure.AuditingFieldsKeysEnum; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.Marker; import org.slf4j.MarkerFactory; import java.util.ArrayList; import java.util.Arrays; import java.util.Formatter; import java.util.Locale; import java.util.Map; public class AuditingLogFormatUtil { // When adding any new fields here, please keep the convention = // , with the space between them. private static final Logger log = LoggerFactory.getLogger(AuditingLogFormatUtil.class); // This is the key by which audit marker is recognized in logback.xml private static String AUDIT_MARKER_STR = "AUDIT_MARKER"; public static final Marker auditMarker = MarkerFactory.getMarker(AUDIT_MARKER_STR); protected static String logAuditEvent(Map auditingFields) { StringBuilder sb = new StringBuilder(); Formatter formatter = new Formatter(sb, Locale.US); log.trace("logAuditEvent - start"); String formattedString = ""; try { // Common fields String modifier = getModifier((String) auditingFields.get(AuditingFieldsKeysEnum.AUDIT_MODIFIER_NAME), (String) auditingFields.get(AuditingFieldsKeysEnum.AUDIT_MODIFIER_UID)); Object statusObj = auditingFields.get(AuditingFieldsKeysEnum.AUDIT_STATUS); String status = null; if (statusObj != null) { status = String.valueOf(statusObj); } String desc = (String) auditingFields.get(AuditingFieldsKeysEnum.AUDIT_DESC); String action = (String) auditingFields.get(AuditingFieldsKeysEnum.AUDIT_ACTION); AuditingActionEnum auditEventType = AuditingActionEnum.getActionByName(action); StringBuilder formattedEvent = getFormattedEvent(auditingFields, modifier, status, desc, action, auditEventType); formattedString = formattedEvent.toString(); // This is the only way to fix DE166225 without major refactoring, // after it was previously agreed with Ella that activity type will // be the method name. if (auditEventType.equals(AuditingActionEnum.AUTH_REQUEST)) { HttpRequestAuthentication(formattedString); } else { log.info(auditMarker, formattedString); } } catch (Exception e) { log.debug("unexpected error occurred: {}", e.getMessage(), e); } finally { formatter.close(); log.trace("logAuditEvent - end"); } return formattedString; } protected static void logAuditEvent(final String formattedString) { log.trace("logAuditEvent - start"); log.info(auditMarker, formattedString); log.trace("logAuditEvent - end"); } private static void HttpRequestAuthentication(String formattedString) { log.info(auditMarker, formattedString); } private static StringBuilder getFormattedEvent(Map auditingFields, String modifier, String status, String desc, String action, AuditingActionEnum auditEventType) { StringBuilder formattedString = new StringBuilder(); switch (auditEventType) { case ADD_USER: case DELETE_USER: case UPDATE_USER: formattedString = buildStringAccrodingToArray(AuditingLogFormatConstants.USER_ADMIN_TEMPLATE_ARRAY, auditingFields); break; case USER_ACCESS: formattedString = buildStringAccrodingToArray(AuditingLogFormatConstants.USER_ACCESS_TEMPLATE_ARRAY, auditingFields); break; case DISTRIBUTION_REGISTER: case DISTRIBUTION_UN_REGISTER: formattedString = buildStringAccrodingToArray(AuditingLogFormatConstants.DISTRIBUTION_REGISTRATION_TEMPLATE_ARRAY, auditingFields); break; case UPDATE_RESOURCE_METADATA: case CREATE_RESOURCE: case IMPORT_RESOURCE: ArrayList createResourceList = new ArrayList(Arrays.asList(AuditingLogFormatConstants.CREATE_RESOURCE_TEMPLATE_PREFIX_ARRAY)); createResourceList.addAll(Arrays.asList(AuditingLogFormatConstants.CREATE_RESOURCE_TEMPLATE_SUFFIX_ARRAY)); if (auditEventType == AuditingActionEnum.IMPORT_RESOURCE) { createResourceList.add(AuditingFieldsKeysEnum.AUDIT_RESOURCE_TOSCA_NODE_TYPE); } AuditingFieldsKeysEnum[] createResourceArray = new AuditingFieldsKeysEnum[100]; createResourceArray = createResourceList.toArray(createResourceArray); formattedString = buildStringAccrodingToArray(createResourceArray, auditingFields); break; case CHECKIN_RESOURCE: case CHECKOUT_RESOURCE: case UNDO_CHECKOUT_RESOURCE: case CERTIFICATION_REQUEST_RESOURCE: case START_CERTIFICATION_RESOURCE: case CERTIFICATION_SUCCESS_RESOURCE: case FAIL_CERTIFICATION_RESOURCE: case CANCEL_CERTIFICATION_RESOURCE: ArrayList checkinFieldsList = new ArrayList(Arrays.asList(AuditingLogFormatConstants.CREATE_RESOURCE_TEMPLATE_PREFIX_ARRAY)); checkinFieldsList.add(AuditingFieldsKeysEnum.AUDIT_RESOURCE_COMMENT); checkinFieldsList.addAll(Arrays.asList(AuditingLogFormatConstants.CREATE_RESOURCE_TEMPLATE_SUFFIX_ARRAY)); AuditingFieldsKeysEnum[] checkinFieldsArray = new AuditingFieldsKeysEnum[100]; checkinFieldsArray = checkinFieldsList.toArray(checkinFieldsArray); String comment = (String) auditingFields.get(AuditingFieldsKeysEnum.AUDIT_RESOURCE_COMMENT); if (comment == null || comment.equals(Constants.NULL_STRING)) { auditingFields.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_COMMENT, Constants.EMPTY_STRING); } formattedString = buildStringAccrodingToArray(checkinFieldsArray, auditingFields); break; case ARTIFACT_UPLOAD: case ARTIFACT_DELETE: case ARTIFACT_METADATA_UPDATE: case ARTIFACT_PAYLOAD_UPDATE: case ARTIFACT_DOWNLOAD: ArrayList artifactFieldsSet = new ArrayList<>(Arrays.asList(AuditingLogFormatConstants.CREATE_RESOURCE_TEMPLATE_PREFIX_ARRAY)) ; artifactFieldsSet.add(AuditingFieldsKeysEnum.AUDIT_PREV_ARTIFACT_UUID); artifactFieldsSet.add(AuditingFieldsKeysEnum.AUDIT_CURR_ARTIFACT_UUID); artifactFieldsSet.add(AuditingFieldsKeysEnum.AUDIT_ARTIFACT_DATA); artifactFieldsSet.addAll(Arrays.asList(AuditingLogFormatConstants.EXTERNAL_DOWNLOAD_ARTIFACT_ARRAY)); AuditingFieldsKeysEnum[] artifactFieldsArray = new AuditingFieldsKeysEnum[100]; artifactFieldsArray = artifactFieldsSet.toArray(artifactFieldsArray); formattedString = buildStringAccrodingToArray(artifactFieldsArray, auditingFields); break; case DOWNLOAD_ARTIFACT: ArrayList downloadArtifactFieldsList = new ArrayList(Arrays.asList(AuditingLogFormatConstants.EXTERNAL_DOWNLOAD_ARTIFACT_ARRAY)); AuditingFieldsKeysEnum[] downloadArtifactFieldsArray = new AuditingFieldsKeysEnum[100]; artifactFieldsArray = downloadArtifactFieldsList.toArray(downloadArtifactFieldsArray); formattedString = buildStringAccrodingToArray(artifactFieldsArray, auditingFields); break; case DISTRIBUTION_STATE_CHANGE_REQUEST: formattedString = buildStringAccrodingToArray(AuditingLogFormatConstants.ACTIVATE_DISTRIBUTION_ARRAY, auditingFields); break; case DISTRIBUTION_STATE_CHANGE_APPROV: case DISTRIBUTION_STATE_CHANGE_REJECT: formattedString = buildStringAccrodingToArray(AuditingLogFormatConstants.CHANGE_DISTRIBUTION_STATUS_ARRAY, auditingFields); break; case CREATE_DISTRIBUTION_TOPIC: formattedString = buildStringAccrodingToArray(AuditingLogFormatConstants.CREATE_TOPIC_TEMPLATE_ARRAY, auditingFields); break; case ADD_KEY_TO_TOPIC_ACL: case REMOVE_KEY_FROM_TOPIC_ACL: formattedString = buildStringAccrodingToArray(AuditingLogFormatConstants.ADD_REMOVE_TOPIC_KEY_ACL_TEMPLATE_ARRAY, auditingFields); break; case DISTRIBUTION_STATUS: formattedString = buildStringAccrodingToArray(AuditingLogFormatConstants.DISTRIBUTION_STATUS_TEMPLATE_ARRAY, auditingFields); break; case DISTRIBUTION_NOTIFY: formattedString = buildStringAccrodingToArray(AuditingLogFormatConstants.DISTRIBUTION_NOTIFY_ARRAY, auditingFields); break; case DISTRIBUTION_DEPLOY: formattedString = buildStringAccrodingToArray(AuditingLogFormatConstants.DISTRIBUTION_DEPLOY_ARRAY, auditingFields); break; case GET_UEB_CLUSTER: formattedString = buildStringAccrodingToArray(AuditingLogFormatConstants.GET_UEB_CLUSTER_ARRAY, auditingFields); break; case DISTRIBUTION_ARTIFACT_DOWNLOAD: formattedString = buildStringAccrodingToArray(AuditingLogFormatConstants.DISTRIBUTION_DOWNLOAD_TEMPLATE_ARRAY, auditingFields); break; case AUTH_REQUEST: formattedString = buildStringAccrodingToArray(AuditingLogFormatConstants.AUTH_TEMPLATE_ARRAY, auditingFields); break; case ADD_ECOMP_USER_CREDENTIALS: case GET_ECOMP_USER_CREDENTIALS: case DELETE_ECOMP_USER_CREDENTIALS: case UPDATE_ECOMP_USER_CREDENTIALS: formattedString = buildStringAccrodingToArray(AuditingLogFormatConstants.ECOMP_USER_TEMPLATE_ARRAY, auditingFields); break; case ADD_CATEGORY: case ADD_SUB_CATEGORY: case ADD_GROUPING: formattedString = buildStringAccrodingToArray(AuditingLogFormatConstants.CATEGORY_TEMPLATE_ARRAY, auditingFields); break; case GET_USERS_LIST: formattedString = buildStringAccrodingToArray(AuditingLogFormatConstants.GET_USERS_LIST_TEMPLATE_ARRAY, auditingFields); break; case GET_CATEGORY_HIERARCHY: formattedString = buildStringAccrodingToArray(AuditingLogFormatConstants.GET_CATEGORY_HIERARCHY_TEMPLATE_ARRAY, auditingFields); break; case GET_ASSET_LIST: case GET_FILTERED_ASSET_LIST: formattedString = buildStringAccrodingToArray(AuditingLogFormatConstants.EXTERNAL_GET_ASSET_LIST_TEMPLATE_ARRAY, auditingFields); break; case GET_ASSET_METADATA: case GET_TOSCA_MODEL: formattedString = buildStringAccrodingToArray(AuditingLogFormatConstants.EXTERNAL_GET_ASSET_TEMPLATE_ARRAY, auditingFields); break; case ARTIFACT_UPLOAD_BY_API: case ARTIFACT_DELETE_BY_API: case ARTIFACT_UPDATE_BY_API: ArrayList uploadArtifactFieldsList = new ArrayList(Arrays.asList(AuditingLogFormatConstants.EXTERNAL_CRUD_API_ARTIFACT_ARRAY)); AuditingFieldsKeysEnum[] uploadArtifactFieldsArray = new AuditingFieldsKeysEnum[100]; artifactFieldsArray = uploadArtifactFieldsList.toArray(uploadArtifactFieldsArray); formattedString = buildStringAccrodingToArray(artifactFieldsArray, auditingFields); break; case CREATE_RESOURCE_BY_API: formattedString = buildStringAccrodingToArray(AuditingLogFormatConstants.EXTERNAL_CRUD_API_ARRAY, auditingFields); break; case CHANGE_LIFECYCLE_BY_API: formattedString = buildStringAccrodingToArray(AuditingLogFormatConstants.EXTERNAL_LYFECYCLE_API_ARRAY, auditingFields); break; case ACTIVATE_SERVICE_BY_API: formattedString = buildStringAccrodingToArray(AuditingLogFormatConstants.EXTERNAL_ACTIVATE_SERVICE_ARRAY, auditingFields); break; case CREATE_ENVIRONMENT: case UPDATE_ENVIRONMENT: case DELETE_ENVIRONMENT: case UNKNOWN_ENVIRONMENT_NOTIFICATION: case UNSUPPORTED_ENVIRONMENT_TYPE: formattedString = buildStringAccrodingToArray(AuditingLogFormatConstants.ECOMP_OPERATIONAL_ENVIRONMENT_ARRAY, auditingFields); break; default: break; } return formattedString; } private static StringBuilder buildStringAccrodingToArray(AuditingFieldsKeysEnum[] sortedFieldsArray, Map auditingFields) { StringBuilder formattedString = new StringBuilder(); for (int i = 0; i < sortedFieldsArray.length; i++) { AuditingFieldsKeysEnum key = sortedFieldsArray[i]; Object fieldVal = auditingFields.get(key); if (fieldVal != null) { formattedString.append(key.getDisplayName()).append(" = \"").append(fieldVal).append("\""); if (i < sortedFieldsArray.length - 1) { formattedString.append(" "); } } } return formattedString; } protected static String getModifier(String modifierName, String modifierUid) { if (modifierUid == null || modifierUid.equals(Constants.EMPTY_STRING)) { return Constants.EMPTY_STRING; } StringBuilder sb = new StringBuilder(); if (modifierName != null) { sb.append(modifierName); } sb.append("(").append(modifierUid).append(")"); return sb.toString(); } protected static String getUser(String userData) { StringBuilder sb = new StringBuilder(); sb.append(userData); return sb.toString(); } }