diff options
6 files changed, 129 insertions, 12 deletions
diff --git a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/database/Updater.java b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/database/Updater.java index abb2f665..e0721e97 100644 --- a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/database/Updater.java +++ b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/database/Updater.java @@ -13,6 +13,7 @@ public class Updater { addLocationPrivateField(); addLectureLocationMapTable(); addHasUsbAccessField(); + addLogTable(); fixEmailFieldLength(); } @@ -87,6 +88,41 @@ public class Updater { } } + private static void addLogTable() throws SQLException { + try (MysqlConnection connection = Database.getConnection()) { + MysqlStatement tablesStmt = connection.prepareStatement("SHOW TABLES"); + ResultSet tables = tablesStmt.executeQuery(); + while (tables.next()) { + if (tables.getString(1).equals("actionlog")) { + return; // Table exists, don't do anything + } + } + // Add table + MysqlStatement tableAddStmt = connection.prepareStatement("CREATE TABLE `actionlog` (" + + " `actionid` int(11) NOT NULL AUTO_INCREMENT," + + " `dateline` bigint(20) NOT NULL," + + " `userid` char(36) CHARACTER SET ascii COLLATE ascii_bin DEFAULT NULL," + + " `targetid` char(36) CHARACTER SET ascii COLLATE ascii_bin DEFAULT NULL," + + " `description` varchar(500) NOT NULL," + + " PRIMARY KEY (`actionid`)," + + " KEY userid (userid, dateline)," + + " KEY targetid (targetid, dateline)," + + " KEY dateline (dateline)" + + " ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci"); + tableAddStmt.executeUpdate(); + // Add constraint + MysqlStatement constraintStmt = connection.prepareStatement("ALTER TABLE `actionlog`" + + " ADD FOREIGN KEY ( `userid` ) REFERENCES `sat`.`user` (`userid`)" + + " ON DELETE SET NULL ON UPDATE CASCADE"); + constraintStmt.executeUpdate(); + connection.commit(); + LOGGER.info("Updated database: Added actionlog table"); + } catch (SQLException e) { + LOGGER.error("Query failed in Updater.addLogTable()", e); + throw e; + } + } + /** * Make email field longer. Was 50 chars, which is not enough in rare cases * :) diff --git a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/database/mappers/DbImage.java b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/database/mappers/DbImage.java index c5e79389..47aa2ced 100644 --- a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/database/mappers/DbImage.java +++ b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/database/mappers/DbImage.java @@ -819,6 +819,12 @@ public class DbImage { return true; } + /** + * Get all images with mussing virtid or osid. + * + * @return + * @throws SQLException + */ public static List<LocalImageVersion> getVersionsWithMissingData() throws SQLException { try (MysqlConnection connection = Database.getConnection()) { MysqlStatement stmt = connection.prepareStatement(localImageBaseSql diff --git a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/database/mappers/DbLog.java b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/database/mappers/DbLog.java new file mode 100644 index 00000000..97ab8f15 --- /dev/null +++ b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/database/mappers/DbLog.java @@ -0,0 +1,49 @@ +package org.openslx.bwlp.sat.database.mappers; + +import java.sql.SQLException; + +import org.apache.log4j.Logger; +import org.openslx.bwlp.sat.database.Database; +import org.openslx.bwlp.sat.database.MysqlConnection; +import org.openslx.bwlp.sat.database.MysqlStatement; +import org.openslx.bwlp.thrift.iface.UserInfo; +import org.openslx.util.Util; + +public class DbLog { + + private static final Logger LOGGER = Logger.getLogger(DbLog.class); + + /** + * Add entry to logging table. + * + * @param userId user causing the action (can be null) + * @param targetId object being acted upon (userid, lectureid, imageid, or + * null) + * @param description Human readable description of the action being + * performed + * @throws SQLException + */ + public static void log(String userId, String targetId, String description) { + if (description == null) { + description = ""; + } + try (MysqlConnection connection = Database.getConnection()) { + MysqlStatement stmt = connection.prepareStatement("INSERT DELAYED INTO actionlog" + + " (dateline, userid, targetid, description) VALUES" + + " (:dateline, :userid, :targetid, :description)"); + stmt.setLong("dateline", Util.unixTime()); + stmt.setString("userid", userId); + stmt.setString("targetid", targetId); + stmt.setString("description", description); + stmt.executeUpdate(); + connection.commit(); + } catch (SQLException e) { + LOGGER.error("Query failed in DbLog.log()", e); + } + } + + public static void log(UserInfo user, String targetId, String description) { + log(user == null ? null : user.userId, targetId, description); + } + +} diff --git a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/maintenance/DeleteOldImages.java b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/maintenance/DeleteOldImages.java index 850f56b8..611ca07f 100644 --- a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/maintenance/DeleteOldImages.java +++ b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/maintenance/DeleteOldImages.java @@ -10,8 +10,10 @@ import org.apache.log4j.Logger; import org.joda.time.DateTime; import org.openslx.bwlp.sat.database.mappers.DbImage; import org.openslx.bwlp.sat.database.mappers.DbImage.DeleteState; +import org.openslx.bwlp.sat.database.mappers.DbLog; import org.openslx.bwlp.sat.database.models.LocalImageVersion; import org.openslx.bwlp.sat.util.FileSystem; +import org.openslx.bwlp.sat.util.Formatter; import org.openslx.util.QuickTimer; import org.openslx.util.QuickTimer.Task; import org.openslx.util.Util; @@ -141,6 +143,9 @@ public class DeleteOldImages implements Runnable { writeln(sb, version.imageVersionId, ": Cannot delete image: ", e.getMessage()); } writeln(sb, version.imageVersionId, ": OK"); + DbLog.log((String)null, version.imageBaseId, + "Version " + version.imageVersionId + " (" + Formatter.date(version.createTime) + + " deleted from database and storage."); } writeln(sb, "Done"); return sb; diff --git a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/permissions/User.java b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/permissions/User.java index bbf534e7..abea5433 100644 --- a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/permissions/User.java +++ b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/permissions/User.java @@ -5,7 +5,6 @@ import java.sql.SQLException; import org.openslx.bwlp.sat.database.mappers.DbImage; import org.openslx.bwlp.sat.database.mappers.DbLecture; import org.openslx.bwlp.sat.database.mappers.DbOrganization; -import org.openslx.bwlp.sat.database.models.LocalImageVersion; import org.openslx.bwlp.sat.database.models.LocalOrganization; import org.openslx.bwlp.sat.database.models.LocalUser; import org.openslx.bwlp.sat.thrift.cache.OrganizationList; @@ -24,7 +23,6 @@ import org.openslx.bwlp.thrift.iface.TAuthorizationException; import org.openslx.bwlp.thrift.iface.TInvocationException; import org.openslx.bwlp.thrift.iface.TNotFoundException; import org.openslx.bwlp.thrift.iface.UserInfo; -import org.openslx.util.Util; public class User { @@ -295,11 +293,10 @@ public class User { } } - public static void canChangeLectureOwnerOrFail(UserInfo user, String lectureId) + public static void canChangeLectureOwnerOrFail(UserInfo user, LectureSummary lecture) throws TAuthorizationException, TNotFoundException, TInvocationException { // TODO: Who should be allowed to change the owner? Any admin, or just the owner? // Currently it's every admin, but this is open for discussion - LectureSummary lecture = getLectureFromId(user, lectureId); if (!lecture.userPermissions.admin) { throw new TAuthorizationException(AuthorizationError.NO_PERMISSION, "No permission to change lecture owner"); diff --git a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/thrift/ServerHandler.java b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/thrift/ServerHandler.java index fc767460..b9bc9ab4 100644 --- a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/thrift/ServerHandler.java +++ b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/thrift/ServerHandler.java @@ -15,6 +15,7 @@ import org.openslx.bwlp.sat.database.mappers.DbImagePermissions; import org.openslx.bwlp.sat.database.mappers.DbLecture; import org.openslx.bwlp.sat.database.mappers.DbLecturePermissions; import org.openslx.bwlp.sat.database.mappers.DbLocation; +import org.openslx.bwlp.sat.database.mappers.DbLog; import org.openslx.bwlp.sat.database.mappers.DbUser; import org.openslx.bwlp.sat.database.models.ImageVersionMeta; import org.openslx.bwlp.sat.database.models.LocalImageVersion; @@ -366,8 +367,8 @@ public class ServerHandler implements SatelliteServer.Iface { DbImage.getBaseIdForVersionId(imageVersionId)); DbImage.markForDeletion(imageVersionId); DbImage.setDeletion(DeleteState.WANT_DELETE, imageVersionId); - LOGGER.info(Formatter.userFullName(user) + " (" + user.userId + ") deleted Version " - + imageVersionId + " of " + imageSummary.imageName + " (" + imageSummary.imageBaseId + DbLog.log(user, imageSummary.imageBaseId, Formatter.userFullName(user) + " deleted Version " + + imageVersionId + " of '" + imageSummary.imageName + "' (" + imageSummary.imageBaseId + ")"); } catch (SQLException e) { throw new TInvocationException(); @@ -402,9 +403,8 @@ public class ServerHandler implements SatelliteServer.Iface { } DeleteOldImages.hardDeleteImages(); } - LOGGER.info(Formatter.userFullName(user) + " (" + user.userId + ") deleted Image " - + imageDetails.imageName + " (" + imageDetails.imageBaseId + ") with all its versions (" - + index + ")"); + DbLog.log(user, null, Formatter.userFullName(user) + " deleted Image '" + imageDetails.imageName + + "' (" + imageDetails.imageBaseId + ") with all its versions (" + index + ")"); try { DbImage.deleteBasePermanently(imageBaseId); } catch (SQLException e) { @@ -449,6 +449,11 @@ public class ServerHandler implements SatelliteServer.Iface { "Cannot change owner of image that gets downloaded from master server"); } DbImage.setImageOwner(imageBaseId, newOwnerId, user); + UserInfo newOwner = DbUser.getOrNull(newOwnerId); + DbLog.log(user, imageBaseId, Formatter.userFullName(user) + " changed owner of '" + + imageSummary.imageName + "' to " + Formatter.userFullName(newOwner)); + DbLog.log(user, newOwnerId, Formatter.userFullName(newOwner) + " was declared new owner of '" + + imageSummary.imageName + "' by " + Formatter.userFullName(user)); } catch (SQLException e) { throw new TInvocationException(); } @@ -522,7 +527,11 @@ public class ServerHandler implements SatelliteServer.Iface { "Could not write to local DB"); } imagePublishData.uploader = user; - return SyncTransferHandler.requestImageDownload(userToken, imagePublishData); + String transferId = SyncTransferHandler.requestImageDownload(userToken, imagePublishData); + DbLog.log(user, imagePublishData.imageBaseId, Formatter.userFullName(user) + + " triggered download from master server of version " + imageVersionId + " of '" + + imagePublishData.imageName + "'"); + return transferId; } @Override @@ -542,7 +551,11 @@ public class ServerHandler implements SatelliteServer.Iface { } User.canUploadToMasterOrFail(user, imgBase); try { - return SyncTransferHandler.requestImageUpload(userToken, imgBase, imgVersion); + String transferId = SyncTransferHandler.requestImageUpload(userToken, imgBase, imgVersion); + DbLog.log(user, imgBase.imageBaseId, Formatter.userFullName(user) + + " triggered upload to master server of version " + imageVersionId + " of '" + + imgBase.imageName + "'"); + return transferId; } catch (TTransferRejectedException e) { LOGGER.warn("Master server rejected upload of image version " + imgVersion.imageVersionId); throw e; @@ -665,9 +678,20 @@ public class ServerHandler implements SatelliteServer.Iface { public void setLectureOwner(String userToken, String lectureId, String newOwnerId) throws TAuthorizationException, TNotFoundException, TInvocationException, TException { UserInfo user = SessionManager.getOrFail(userToken); - User.canChangeLectureOwnerOrFail(user, lectureId); + LectureSummary lecture; + try { + lecture = DbLecture.getLectureSummary(user, lectureId); + } catch (SQLException e1) { + throw new TInvocationException(); + } + User.canChangeLectureOwnerOrFail(user, lecture); try { DbLecture.setOwner(user, lectureId, newOwnerId); + UserInfo newOwner = DbUser.getOrNull(newOwnerId); + DbLog.log(user, lectureId, Formatter.userFullName(user) + " changed owner of '" + + lecture.lectureName + "' to " + Formatter.userFullName(newOwner)); + DbLog.log(user, newOwnerId, Formatter.userFullName(newOwner) + " was declared new owner of '" + + lecture.lectureName + "' by " + Formatter.userFullName(user)); } catch (SQLException e) { throw new TInvocationException(); } |
