Browse Source

[MRM-1296] Audit Log Report

o created data model, dao and query constraint object for audit logs
o save events in database


git-svn-id: https://svn.apache.org/repos/asf/archiva/branches/MRM-1296@890155 13f79535-47bb-0310-9956-ffa450edef68
MRM-1296
Maria Odea B. Ching 14 years ago
parent
commit
6a1209462f

+ 1
- 1
archiva-modules/archiva-base/archiva-model/pom.xml View File

@@ -70,7 +70,7 @@
<groupId>org.codehaus.modello</groupId>
<artifactId>modello-maven-plugin</artifactId>
<configuration>
<version>1.2.1</version>
<version>1.2.3</version>
<packageWithVersion>false</packageWithVersion>
<models>
<model>src/main/mdo/archiva-base.xml</model>

+ 74
- 1
archiva-modules/archiva-base/archiva-model/src/main/mdo/archiva-base.xml View File

@@ -5,7 +5,7 @@
xsd.target-namespace="http://archiva.apache.org/model/1.2.0">
<id>archiva-base-model</id>
<name>ArchivaBaseModel</name>
<version>1.2.1</version>
<version>1.2.3</version>
<description>Archiva Model</description>
<defaults>
<default>
@@ -75,6 +75,14 @@
<multiplicity>*</multiplicity>
</association>
</field>
<field>
<name>archivaAuditLogs</name>
<version>1.3.0+</version>
<association>
<type>ArchivaAuditLogs</type>
<multiplicity>*</multiplicity>
</association>
</field>
</fields>
<codeSegments>
<codeSegment>
@@ -2278,5 +2286,70 @@
</codeSegment>
</codeSegments>
</class>
<class stash.storable="true"
jpox.table="AUDIT_LOGS">
<name>ArchivaAuditLogs</name>
<version>1.2.3+</version>
<fields>
<field stash.maxSize="50">
<name>repositoryId</name>
<version>1.2.3+</version>
<identifier>false</identifier>
<required>true</required>
<type>String</type>
<description>
The repository id where the operation was done.
</description>
</field>
<field>
<name>eventDate</name>
<version>1.2.3+</version>
<identifier>false</identifier>
<required>true</required>
<type>Date</type>
<description>
The timestamp on when the event happened.
</description>
</field>
<field>
<name>artifact</name>
<version>1.2.3+</version>
<identifier>false</identifier>
<required>false</required>
<type>String</type>
<description>
The affected artifact, if there is one.
</description>
</field>
<field>
<name>event</name>
<version>1.2.3+</version>
<identifier>false</identifier>
<required>false</required>
<type>String</type>
<description>
The event that happened.
</description>
</field>
<field>
<name>username</name>
<version>1.2.3+</version>
<identifier>false</identifier>
<required>true</required>
<type>String</type>
<description>
The user who executed the event.
</description>
</field>
</fields>
<codeSegments>
<codeSegment>
<version>1.2.3+</version>
<code><![CDATA[
private static final long serialVersionUID = -7113629916828442780L;
]]></code>
</codeSegment>
</codeSegments>
</class>
</classes>
</model>

+ 35
- 0
archiva-modules/archiva-database/src/main/java/org/apache/maven/archiva/database/ArchivaAuditLogsDao.java View File

@@ -0,0 +1,35 @@
package org.apache.maven.archiva.database;

/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/

import java.util.List;

import org.apache.maven.archiva.model.ArchivaAuditLogs;

public interface ArchivaAuditLogsDao
{
public List<ArchivaAuditLogs> queryAuditLogs( Constraint constraint )
throws ObjectNotFoundException, ArchivaDatabaseException;

public ArchivaAuditLogs saveAuditLogs( ArchivaAuditLogs logs );
public void deleteAuditLogs( ArchivaAuditLogs logs )
throws ArchivaDatabaseException;
}

+ 43
- 0
archiva-modules/archiva-database/src/main/java/org/apache/maven/archiva/database/constraints/MostRecentArchivaAuditLogsConstraint.java View File

@@ -0,0 +1,43 @@
package org.apache.maven.archiva.database.constraints;

/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/

import org.apache.maven.archiva.model.ArchivaAuditLogs;

public class MostRecentArchivaAuditLogsConstraint
extends AbstractSimpleConstraint
{
private String sql;

public MostRecentArchivaAuditLogsConstraint()
{
sql = "SELECT FROM " + ArchivaAuditLogs.class.getName() + " ORDER BY eventDate DESCENDING RANGE 0,1";
}

public Class<?> getResultClass()
{
return ArchivaAuditLogs.class;
}

public String getSelectSql()
{
return sql;
}
}

+ 61
- 0
archiva-modules/archiva-database/src/main/java/org/apache/maven/archiva/database/jdo/JdoArchivaAuditLogsDao.java View File

@@ -0,0 +1,61 @@
package org.apache.maven.archiva.database.jdo;

/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/

import java.util.List;

import org.apache.maven.archiva.database.ArchivaAuditLogsDao;
import org.apache.maven.archiva.database.ArchivaDatabaseException;
import org.apache.maven.archiva.database.Constraint;
import org.apache.maven.archiva.database.ObjectNotFoundException;
import org.apache.maven.archiva.model.ArchivaAuditLogs;

/**
* JdoArchivaAuditLogsDao
*
* @version
*
* @plexus.component role-hint="jdo"
*/
public class JdoArchivaAuditLogsDao
implements ArchivaAuditLogsDao
{
/**
* @plexus.requirement role-hint="archiva"
*/
private JdoAccess jdo;

public void deleteAuditLogs( ArchivaAuditLogs logs )
throws ArchivaDatabaseException
{
jdo.removeObject( logs );
}

public List<ArchivaAuditLogs> queryAuditLogs( Constraint constraint )
throws ObjectNotFoundException, ArchivaDatabaseException
{
return (List<ArchivaAuditLogs>) jdo.queryObjects( ArchivaAuditLogs.class, constraint );
}

public ArchivaAuditLogs saveAuditLogs( ArchivaAuditLogs logs )
{
return (ArchivaAuditLogs) jdo.saveObject( logs );
}
}

+ 17
- 0
archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/PlexusActionSupport.java View File

@@ -20,11 +20,14 @@ package org.apache.maven.archiva.web.action;
*/
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.apache.maven.archiva.database.ArchivaAuditLogsDao;
import org.apache.maven.archiva.model.ArchivaAuditLogs;
import org.apache.maven.archiva.repository.audit.AuditEvent;
import org.apache.maven.archiva.repository.audit.AuditListener;
import org.apache.maven.archiva.repository.audit.Auditable;
@@ -53,6 +56,11 @@ public abstract class PlexusActionSupport
*/
private List<AuditListener> auditListeners = new ArrayList<AuditListener>();
/**
* @plexus.requirement role-hint="jdo"
*/
private ArchivaAuditLogsDao auditLogsDao;
private String principal;
@SuppressWarnings("unchecked")
@@ -85,6 +93,15 @@ public abstract class PlexusActionSupport
{
listener.auditEvent( event );
}
ArchivaAuditLogs auditLogs = new ArchivaAuditLogs();
auditLogs.setArtifact( resource );
auditLogs.setEvent( action );
auditLogs.setEventDate( Calendar.getInstance().getTime() );
auditLogs.setRepositoryId( repositoryId );
auditLogs.setUsername( getPrincipal() );
auditLogsDao.saveAuditLogs( auditLogs );
}
protected void triggerAuditEvent( String resource, String action )

+ 2
- 1
archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/UploadAction.java View File

@@ -41,6 +41,7 @@ import org.apache.maven.archiva.common.utils.VersionUtil;
import org.apache.maven.archiva.configuration.ArchivaConfiguration;
import org.apache.maven.archiva.configuration.Configuration;
import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration;
import org.apache.maven.archiva.database.ArchivaAuditLogsDao;
import org.apache.maven.archiva.model.ArchivaProjectModel;
import org.apache.maven.archiva.model.ArchivaRepositoryMetadata;
import org.apache.maven.archiva.model.ArtifactReference;
@@ -149,7 +150,7 @@ public class UploadAction
* @plexus.requirement
*/
private ArchivaTaskScheduler scheduler;
private ChecksumAlgorithm[] algorithms = new ChecksumAlgorithm[]{ChecksumAlgorithm.SHA1, ChecksumAlgorithm.MD5};

private ProjectModelWriter pomWriter = new ProjectModel400Writer();

+ 47
- 11
archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/reports/ViewAuditLogReportAction.java View File

@@ -25,6 +25,12 @@ import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.apache.maven.archiva.database.ArchivaAuditLogsDao;
import org.apache.maven.archiva.database.ArchivaDatabaseException;
import org.apache.maven.archiva.database.Constraint;
import org.apache.maven.archiva.database.ObjectNotFoundException;
import org.apache.maven.archiva.database.constraints.MostRecentArchivaAuditLogsConstraint;
import org.apache.maven.archiva.model.ArchivaAuditLogs;
import org.apache.maven.archiva.security.AccessDeniedException;
import org.apache.maven.archiva.security.ArchivaSecurityException;
import org.apache.maven.archiva.security.PrincipalNotFoundException;
@@ -51,6 +57,11 @@ public class ViewAuditLogReportAction
*/
private UserRepositories userRepositories;
/**
* @plexus.requirement role-hint="jdo"
*/
private ArchivaAuditLogsDao auditLogsDao;
private String repository;

private List<String> repositories;
@@ -61,16 +72,8 @@ public class ViewAuditLogReportAction
private int rowCount = 30;
public int getRowCount()
{
return rowCount;
}

public void setRowCount( int rowCount )
{
this.rowCount = rowCount;
}

private List<ArchivaAuditLogs> auditLogs = new ArrayList<ArchivaAuditLogs>();
public SecureActionBundle getSecureActionBundle()
throws SecureActionException
{
@@ -87,12 +90,25 @@ public class ViewAuditLogReportAction
{
repositories = getObservableRepositories();
Constraint constraint = new MostRecentArchivaAuditLogsConstraint();
try
{
this.auditLogs = auditLogsDao.queryAuditLogs( constraint );
}
catch( ObjectNotFoundException e )
{
log.warn( "No audit logs found." );
}
catch ( ArchivaDatabaseException e )
{
log.warn( "Error occurred while querying audit logs." );
}
}
public String execute()
throws Exception
{
{
return SUCCESS;
}
@@ -156,4 +172,24 @@ public class ViewAuditLogReportAction
{
this.artifactId = artifactId;
}
public List<ArchivaAuditLogs> getAuditLogs()
{
return auditLogs;
}

public void setAuditLogs( List<ArchivaAuditLogs> auditLogs )
{
this.auditLogs = auditLogs;
}

public int getRowCount()
{
return rowCount;
}

public void setRowCount( int rowCount )
{
this.rowCount = rowCount;
}
}

+ 23
- 2
archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/reports/auditLogReport.jsp View File

@@ -19,6 +19,7 @@

<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib uri="http://www.extremecomponents.org" prefix="ec" %>

<html>
<head>
@@ -44,7 +45,7 @@
<div id="contentArea">
<s:form action="viewAuditLogReport" namespace="/report" validate="false">
<div id="auditLogReport">
<s:select label="Repository" name="repository" list="repositories"/>
@@ -80,7 +81,27 @@
<s:submit value="View Audit Log"/>
</div>
</s:form>
</s:form>
<table border="1">
<tr>
<th align="center">Event</th>
<th align="center">Repository</th>
<th align="center">Artifact</th>
<th align="center">Event Date</th>
<th align="center">Username</th>
</tr>
<c:forEach items="${auditLogs}" var="auditLog" varStatus="i">
<tr>
<td>${auditLog.event}</td>
<td>${auditLog.repositoryId}</td>
<td>${auditLog.artifact}</td>
<td>${auditLog.eventDate}</td>
<td>${auditLog.username}</td>
</tr>
</c:forEach>
</table>

</div>


Loading…
Cancel
Save