/** * Copyright 2013 Sean Kavanagh - sean.p.kavanagh6@gmail.com * * 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. */ package com.keybox.manage.util; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.keybox.common.util.AppConfig; import com.keybox.manage.db.SessionAuditDB; import com.keybox.manage.model.AuditWrapper; import com.keybox.manage.model.SessionOutput; import com.keybox.manage.model.User; import com.keybox.manage.model.UserSessionsOutput; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.apache.commons.lang3.StringUtils; import java.sql.Connection; import java.util.*; import java.util.concurrent.ConcurrentHashMap; /** * Utility to is used to store the output for a session until the ajax call that brings it to the screen */ public class SessionOutputUtil { private static Logger log = LoggerFactory.getLogger(SessionOutputUtil.class); private static Map<Long, UserSessionsOutput> userSessionsOutputMap = new ConcurrentHashMap<>(); public final static boolean enableInternalAudit = "true".equals(AppConfig.getProperty("enableInternalAudit")); private static Gson gson = new GsonBuilder().registerTypeAdapter(AuditWrapper.class, new SessionOutputSerializer()).create(); private static Logger systemAuditLogger = LoggerFactory.getLogger("com.keybox.manage.util.SystemAudit"); private SessionOutputUtil() { } /** * removes session for user session * * @param sessionId session id */ public static void removeUserSession(Long sessionId) { UserSessionsOutput userSessionsOutput = userSessionsOutputMap.get(sessionId); if (userSessionsOutput != null) { userSessionsOutput.getSessionOutputMap().clear(); } userSessionsOutputMap.remove(sessionId); } /** * removes session output for host system * * @param sessionId session id * @param instanceId id of host system instance */ public static void removeOutput(Long sessionId, Integer instanceId) { UserSessionsOutput userSessionsOutput = userSessionsOutputMap.get(sessionId); if (userSessionsOutput != null) { userSessionsOutput.getSessionOutputMap().remove(instanceId); } } /** * adds a new output * * @param sessionOutput session output object */ public static void addOutput(SessionOutput sessionOutput) { UserSessionsOutput userSessionsOutput = userSessionsOutputMap.get(sessionOutput.getSessionId()); if (userSessionsOutput == null) { userSessionsOutputMap.put(sessionOutput.getSessionId(), new UserSessionsOutput()); userSessionsOutput = userSessionsOutputMap.get(sessionOutput.getSessionId()); } userSessionsOutput.getSessionOutputMap().put(sessionOutput.getInstanceId(), sessionOutput); } /** * adds a new output * * @param sessionId session id * @param instanceId id of host system instance * @param value Array that is the source of characters * @param offset The initial offset * @param count The length */ public static void addToOutput(Long sessionId, Integer instanceId, char value[], int offset, int count) { UserSessionsOutput userSessionsOutput = userSessionsOutputMap.get(sessionId); if (userSessionsOutput != null) { userSessionsOutput.getSessionOutputMap().get(instanceId).getOutput().append(value, offset, count); } } /** * returns list of output lines * * @param sessionId session id object * @param user user auth object * @return session output list */ public static List<SessionOutput> getOutput(Connection con, Long sessionId, User user) { List<SessionOutput> outputList = new ArrayList<>(); UserSessionsOutput userSessionsOutput = userSessionsOutputMap.get(sessionId); if (userSessionsOutput != null) { for (Integer key : userSessionsOutput.getSessionOutputMap().keySet()) { //get output chars and set to output try { SessionOutput sessionOutput = userSessionsOutput.getSessionOutputMap().get(key); if (sessionOutput!=null && sessionOutput.getOutput() != null && StringUtils.isNotEmpty(sessionOutput.getOutput())) { outputList.add(sessionOutput); //send to audit logger systemAuditLogger.info(gson.toJson(new AuditWrapper(user, sessionOutput))); if(enableInternalAudit) { SessionAuditDB.insertTerminalLog(con, sessionOutput); } userSessionsOutput.getSessionOutputMap().put(key, new SessionOutput(sessionId, sessionOutput)); } } catch (Exception ex) { log.error(ex.toString(), ex); } } } return outputList; } }