summaryrefslogtreecommitdiffstats
path: root/dozentenmodulserver/src/main/java
diff options
context:
space:
mode:
authorSimon Rettberg2016-07-20 13:53:15 +0200
committerSimon Rettberg2016-07-20 13:53:15 +0200
commit25629b04334e8d0cafd00ec4c61d8e2fc2dcd649 (patch)
tree0b0010aab64b3b52a1aeaf1c6f43eb15d91edb5a /dozentenmodulserver/src/main/java
parent[client] disabled UI elements for unfinished features (diff)
downloadtutor-module-25629b04334e8d0cafd00ec4c61d8e2fc2dcd649.tar.gz
tutor-module-25629b04334e8d0cafd00ec4c61d8e2fc2dcd649.tar.xz
tutor-module-25629b04334e8d0cafd00ec4c61d8e2fc2dcd649.zip
[server] Add log table; add log messages to relevant actions and events
Diffstat (limited to 'dozentenmodulserver/src/main/java')
-rw-r--r--dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/database/Updater.java36
-rw-r--r--dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/database/mappers/DbImage.java6
-rw-r--r--dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/database/mappers/DbLog.java49
-rw-r--r--dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/maintenance/DeleteOldImages.java5
-rw-r--r--dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/permissions/User.java5
-rw-r--r--dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/thrift/ServerHandler.java40
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();
}