summaryrefslogtreecommitdiffstats
path: root/base/server/cms/src
diff options
context:
space:
mode:
authorEndi S. Dewata <edewata@redhat.com>2017-03-28 21:02:22 +0200
committerEndi S. Dewata <edewata@redhat.com>2017-04-04 22:07:54 +0200
commit88cd07655268831e14e7cd4f6f6a65e331f86583 (patch)
tree9519b55cfa1638746423e7e5a227783a42a2af73 /base/server/cms/src
parent6a682f8e56c982ed0e0810326e71f9de23347590 (diff)
Added CLIs to access audit log files.
New pki audit commands have been added to list and retrieve audit log files. Change-Id: I785fa6f55d9b143f513d9210ebf82d04e06eaed5
Diffstat (limited to 'base/server/cms/src')
-rw-r--r--base/server/cms/src/com/netscape/cms/servlet/base/PKIService.java1
-rw-r--r--base/server/cms/src/org/dogtagpki/server/rest/AuditService.java107
2 files changed, 108 insertions, 0 deletions
diff --git a/base/server/cms/src/com/netscape/cms/servlet/base/PKIService.java b/base/server/cms/src/com/netscape/cms/servlet/base/PKIService.java
index 8dfbef1e5..e023aa682 100644
--- a/base/server/cms/src/com/netscape/cms/servlet/base/PKIService.java
+++ b/base/server/cms/src/com/netscape/cms/servlet/base/PKIService.java
@@ -59,6 +59,7 @@ public class PKIService {
MediaType.APPLICATION_XML_TYPE,
MediaType.APPLICATION_JSON_TYPE,
MediaType.APPLICATION_FORM_URLENCODED_TYPE,
+ MediaType.APPLICATION_OCTET_STREAM_TYPE,
MediaType.valueOf("application/pkix-cert"),
MediaType.valueOf("application/pkcs7-mime"),
MediaType.valueOf("application/x-pem-file")
diff --git a/base/server/cms/src/org/dogtagpki/server/rest/AuditService.java b/base/server/cms/src/org/dogtagpki/server/rest/AuditService.java
index 9af95d992..7bb048f19 100644
--- a/base/server/cms/src/org/dogtagpki/server/rest/AuditService.java
+++ b/base/server/cms/src/org/dogtagpki/server/rest/AuditService.java
@@ -18,16 +18,27 @@
package org.dogtagpki.server.rest;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URI;
+import java.util.ArrayList;
import java.util.Collection;
+import java.util.Collections;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.TreeSet;
+import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Response;
+import javax.ws.rs.core.StreamingOutput;
+import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.jboss.resteasy.plugins.providers.atom.Link;
@@ -36,7 +47,10 @@ import com.netscape.certsrv.base.BadRequestException;
import com.netscape.certsrv.base.EBaseException;
import com.netscape.certsrv.base.IConfigStore;
import com.netscape.certsrv.base.PKIException;
+import com.netscape.certsrv.base.ResourceNotFoundException;
import com.netscape.certsrv.logging.AuditConfig;
+import com.netscape.certsrv.logging.AuditFile;
+import com.netscape.certsrv.logging.AuditFileCollection;
import com.netscape.certsrv.logging.AuditResource;
import com.netscape.certsrv.logging.ILogger;
import com.netscape.cms.servlet.base.SubsystemService;
@@ -299,6 +313,99 @@ public class AuditService extends SubsystemService implements AuditResource {
}
}
+ public File getCurrentLogFile() {
+ IConfigStore cs = CMS.getConfigStore();
+ String filename = cs.get("log.instance.SignedAudit.fileName");
+ return new File(filename);
+ }
+
+ public File getLogDirectory() {
+ File file = getCurrentLogFile();
+ return file.getParentFile();
+ }
+
+ public List<File> getLogFiles() {
+
+ List<String> filenames = new ArrayList<>();
+
+ File currentFile = getCurrentLogFile();
+ String currentFilename = currentFile.getName();
+ File logDir = currentFile.getParentFile();
+
+ // add all log files except the current one
+ for (String filename : logDir.list()) {
+ if (filename.equals(currentFilename)) continue;
+ filenames.add(filename);
+ }
+
+ // sort log files in ascending order
+ Collections.sort(filenames);
+
+ // add the current log file last (i.e. newest)
+ filenames.add(currentFilename);
+
+ List<File> files = new ArrayList<>();
+ for (String filename : filenames) {
+ files.add(new File(logDir, filename));
+ }
+
+ return files;
+ }
+
+ @Override
+ public Response findAuditFiles() {
+
+ AuditFileCollection response = new AuditFileCollection();
+
+ List<File> files = getLogFiles();
+
+ CMS.debug("Audit files:");
+ for (File file : files) {
+ String name = file.getName();
+ CMS.debug(" - " + name);
+
+ AuditFile auditFile = new AuditFile();
+ auditFile.setName(name);
+ auditFile.setSize(file.length());
+
+ response.addEntry(auditFile);
+ }
+
+ response.setTotal(files.size());
+
+ return createOKResponse(response);
+ }
+
+ @Override
+ public Response getAuditFile(String filename) {
+
+ // make sure filename does not contain path
+ if (!new File(filename).getName().equals(filename)) {
+ CMS.debug("Invalid file name: " + filename);
+ throw new BadRequestException("Invalid file name: " + filename);
+ }
+
+ File logDir = getLogDirectory();
+ File file = new File(logDir, filename);
+
+ if (!file.exists()) {
+ throw new ResourceNotFoundException("File not found: " + filename);
+ }
+
+ StreamingOutput so = new StreamingOutput() {
+
+ @Override
+ public void write(OutputStream out) throws IOException, WebApplicationException {
+
+ try (InputStream is = new FileInputStream(file)) {
+ IOUtils.copy(is, out);
+ }
+ }
+ };
+
+ return createOKResponse(so);
+ }
+
/*
* in case of failure, "info" should be in the params
*/