base.jee.api.sql.RecentLogEntriesByPerson Maven / Gradle / Ivy
/**
* Creative commons Attribution-NonCommercial license.
*
* http://creativecommons.org/licenses/by-nc/2.5/au/deed.en_GB
*
* NO WARRANTY IS GIVEN OR IMPLIED, USE AT YOUR OWN RISK.
*/
package base.jee.api.sql;
import base.Query;
import base.jee.Constants;
import base.jee.api.model.AuditLogEntry;
import base.security.PermissionException;
import base.security.User;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import static base.jee.api.sql.util.Log.log;
public class RecentLogEntriesByPerson extends Query {
private SqlAPI api;
private User user;
private UUID person;
private long limit;
private boolean debug;
public RecentLogEntriesByPerson(SqlAPI api, User user, UUID person, boolean debug, long limit) throws PermissionException {
this.api = api;
this.user = user;
this.person = person;
this.limit = limit;
this.debug = debug;
if(api == null) {
throw new IllegalArgumentException("\"api\" parameter must not be null.");
}
if(user == null || !user.isAuthenticated()) {
throw new PermissionException(this.getClass().getSimpleName(), user, "Requires an authenticated user.", "");
}
if(person == null) {
throw new IllegalArgumentException("Please specify person uuid.");
}
if(limit == 0) {
throw new IllegalArgumentException("Please specify a limit");
}
if(limit > 20000) {
throw new IllegalArgumentException("Limit must be less than 20,000.");
}
}
public RecentLogEntriesByPerson() {
}
@Override
public Query newWithParameters(Map parameters) throws PermissionException {
return new RecentLogEntriesByPerson(
(SqlAPI)parameters.get("api"),
(User)parameters.get("user"),
UUID.fromString((String)parameters.get("person")),
parameters.get("debug") != null && ((String)parameters.get("debug")).equalsIgnoreCase("true"),
Integer.parseInt((String)parameters.get("limit")));
}
public List execute() throws IOException {
List results = new LinkedList<>();
Connection c = null;
PreparedStatement s = null;
ResultSet r = null;
try {
c = api.getDataSource().getConnection();
c.setAutoCommit(false);
if(!user.hasRole(Constants.AUDIT_ROLE)) {
log(c, "WARN", user, "Permission denied invoking: " + RecentLogEntriesByPerson.class.getSimpleName() + " " + getJsonParameters());
c.commit();
throw new PermissionException(this.getClass().getSimpleName(), user, "You do not have permission to access audit information.", Constants.AUDIT_ROLE);
}
s = c.prepareStatement(
"select e.event_time,e.level,e.person_uuid,e.message,p.first_name,p.last_name,e.ip "+
"from audit_event e join person p on (e.person_uuid = p.uuid) "+
"where e.person_uuid = ? " +
(debug?"":"and e.level!='DEBUG' ") +
"order by e.event_time desc " +
"limit " + limit);
s.setString(1, person.toString());
r = s.executeQuery();
while(r.next()) {
results.add(new AuditLogEntry(new Date(r.getLong(1)), r.getString(2), nullableUuid(r.getString(3)), r.getString(5), r.getString(6), r.getString(4), r.getString(7)));
}
r.close();
r = null;
s.close();
s = null;
c.commit();
c.close();
c = null;
} catch(SQLException e) {
throw new IOException(e);
} finally {
if(r != null) { try { r.close(); } catch(SQLException e) {} }
if(s != null) { try { s.close(); } catch(SQLException e) {} }
if(c != null) {
try { c.rollback(); } catch (SQLException e) { }
try { c.close(); } catch (SQLException e) { }
}
}
return results;
}
@Override
public String getJsonParameters() {
return "{" +
"}";
}
private UUID nullableUuid(String uuid) {
if(uuid == null || uuid.length() == 0) {
return null;
}
return UUID.fromString(uuid);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy