<%--
  -
  - Copyright (C) 2005-2008 Jive Software. 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.
--%>

<%@ page import="org.jivesoftware.util.JiveGlobals,
                 org.jivesoftware.util.ParamUtils"
%>
<%@ page import="org.xmpp.packet.JID"%>
<%@ page import="java.net.URLEncoder" %>
<%@ page import="java.util.Collection" %>
<%@ page import="org.jivesoftware.openfire.security.SecurityAuditManager" %>
<%@ page import="org.jivesoftware.openfire.security.SecurityAuditEvent" %>
<%@ page import="java.util.Date" %>
<%@ page import="org.jivesoftware.openfire.security.AuditWriteOnlyException" %>
<%@ page import="java.text.SimpleDateFormat" %>
<%@ page import="java.text.ParseException" %>
<%@ page import="org.jivesoftware.util.LocaleUtils" %>
<%@ page import="org.jivesoftware.util.StringUtils" %>

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>

<%!
    final int DEFAULT_RANGE = 15;
    final int[] RANGE_PRESETS = {15, 25, 50, 75, 100};
    SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yy HH:mm:ss");
    SimpleDateFormat shortDateFormat = new SimpleDateFormat("MM/dd/yy");
%>

<jsp:useBean id="webManager" class="org.jivesoftware.util.WebManager"  />
<% webManager.init(request, response, session, application, out ); %>

<html>
    <head>
        <title><fmt:message key="security.audit.viewer.title"/></title>
        <meta name="pageID" content="security-audit-viewer"/>
    </head>
    <body>

<%  // Get parameters
    int start = ParamUtils.getIntParameter(request,"start",0);
    int range = ParamUtils.getIntParameter(request,"range",webManager.getRowsPerPage("security-audit-viewer", DEFAULT_RANGE));
    String username = null;
    String usernameParam = ParamUtils.getParameter(request,"username");
    if (usernameParam != null && !usernameParam.equals("")) {
        username = usernameParam;
    }
    Date startTime = null;
    String startTimeParam = ParamUtils.getParameter(request, "startdate");
    String startDateSetting = null;
    if (startTimeParam != null) {
        try {
            startTime = dateFormat.parse(startTimeParam+" 00:00:00");
            startDateSetting = shortDateFormat.format(startTime);
        }
        catch (ParseException e) {
            // Bad date, ignore
        }
    }
    Date endTime = null;
    String endTimeParam = ParamUtils.getParameter(request, "enddate");
    String endDateSetting = null;
    if (endTimeParam != null) {
        try {
            endTime = dateFormat.parse(endTimeParam+" 23:59:59");
            endDateSetting = shortDateFormat.format(endTime);
        }
        catch (ParseException e) {
            // Bad date, ignore
        }
    }

    if (request.getParameter("range") != null) {
        webManager.setRowsPerPage("security-audit-viewer", range);
    }

    // Get the presence manager
    SecurityAuditManager auditManager = webManager.getSecurityAuditManager();

    if (!SecurityAuditManager.getSecurityAuditProvider().isWriteOnly()) {
%>

<p>
    <fmt:message key="security.audit.viewer.description" />
</p>

<form action="security-audit-viewer.jsp" method="post">
<p>
    <strong><fmt:message key="security.audit.viewer.events_to_show" /></strong>:
    <select size="1" name="range">

    <% for (int aRANGE_PRESETS : RANGE_PRESETS) { %>

    <option value="<%= aRANGE_PRESETS %>"
            <%= (aRANGE_PRESETS == range ? "selected" : "") %>><%= aRANGE_PRESETS %>
    </option>

    <% } %>

    </select>
    &nbsp;&nbsp;
    <strong><fmt:message key="security.audit.viewer.username" /></strong>:
    <input type="text" size="30" maxlength="150" name="username" value="<%= username != null ? StringUtils.escapeForXML(username) : "" %>"/>
    <br/>
    <strong><fmt:message key="security.audit.viewer.date_range"/></strong>:
    <fmt:message key="security.audit.viewer.date_range.start"/>:
    <input type="text" size="15" maxlength="15" name="startdate" value="<%= startDateSetting != null ? startDateSetting : "" %>"/> (<fmt:message key="security.audit.viewer.date_range.use"/>)
    &nbsp;
    <fmt:message key="security.audit.viewer.date_range.end"/>:
    <input type="text" size="15" maxlength="15" name="enddate" value="<%= endDateSetting != null ? endDateSetting : "" %>"/> (<fmt:message key="security.audit.viewer.date_range.use"/>)
    &nbsp;&nbsp;&nbsp;
    <input type="submit" name="search" value="<fmt:message key="security.audit.viewer.search"/>" />
</p>
</form>

<div class="jive-table">
<table cellpadding="0" cellspacing="0" border="0" width="100%">
<thead>
    <tr>
        <th nowrap><fmt:message key="security.audit.viewer.id" /></th>
        <th nowrap><fmt:message key="security.audit.viewer.username" /></th>
        <th nowrap><fmt:message key="security.audit.viewer.node" /></th>
        <th nowrap><fmt:message key="security.audit.viewer.event" /></th>
        <th nowrap><fmt:message key="security.audit.viewer.timestamp" /></th>
    </tr>
</thead>
<tbody>

<%  // Print the list of users
    try {
        Collection<SecurityAuditEvent> events = auditManager.getEvents(username, start, range, startTime, endTime);
        if (events.isEmpty()) {
%>
    <tr>
        <td align="center" colspan="5">
            <fmt:message key="security.audit.viewer.no_logs" />
        </td>
    </tr>

<%
        }
        int i = start;
        for (SecurityAuditEvent event : events) {
            i++;
%>
    <tr class="jive-<%= (((i%2)==0) ? "even" : "odd") %>" valign="top">
        <td width="1%">
            <%= event.getMsgID() %>
        </td>
        <td width="10%">
            <a href="user-properties.jsp?username=<%= URLEncoder.encode(event.getUsername(), "UTF-8") %>"><%= StringUtils.escapeHTMLTags(JID.unescapeNode(event.getUsername())) %></a>
        </td>
        <td width="15%">
            <%= event.getNode() %>
        </td>
        <td width="59%">
            <%= StringUtils.escapeHTMLTags(event.getSummary()) %>
            <% if (event.getDetails() != null) { %>
            &nbsp; <a href="" onclick="if (document.getElementById('details<%= event.getMsgID() %>').style.display == 'none') { document.getElementById('details<%= event.getMsgID() %>').style.display = 'block'; document.getElementById('label<%= event.getMsgID() %>').innerHTML = '<%= LocaleUtils.getLocalizedString("security.audit.viewer.hide_details")%>'; return false;} else { document.getElementById('details<%= event.getMsgID() %>').style.display = 'none'; document.getElementById('label<%= event.getMsgID() %>').innerHTML = '<%= LocaleUtils.getLocalizedString("security.audit.viewer.show_details")%>'; return false;}" id="label<%= event.getMsgID() %>"><fmt:message key="security.audit.viewer.show_details" /></a><br/>
            <pre id="details<%= event.getMsgID() %>" style="display:none; margin: 0px; padding: 1px;"><%= StringUtils.escapeHTMLTags(event.getDetails()) %></pre>
            <% } %>
        </td>
        <td width="15%">
            <%= JiveGlobals.formatDateTime(event.getEventStamp()) %>
        </td>
    </tr>

<%
        }
    }
    catch (AuditWriteOnlyException e) {
        // This should never occur, so we're ignoring.
    }
%>
</tbody>
</table>
</div>
    <% } else { %>
<div>
    <fmt:message key="security.audit.viewer.write_only"/>
    <% if (SecurityAuditManager.getSecurityAuditProvider().getAuditURL() != null) { %>
    <fmt:message key="security.audit.viewer.view_url"/>
    <br />
    <br />
    <strong><fmt:message key="security.audit.viewer.view_url.url" /></strong>: <a target="_new" href="<%= SecurityAuditManager.getSecurityAuditProvider().getAuditURL() %>"><%= SecurityAuditManager.getSecurityAuditProvider().getAuditURL() %></a>
    <% } %>
</div>
    <% } %>

    </body>
</html>
