Skip to content
Snippets Groups Projects
Commit 6449bbd2 authored by Quazgar's avatar Quazgar
Browse files

Merge branch 'f-fix-99' into 'dev'

FIX: Forcing SRID initiation also for ChecksumUpdater

See merge request caosdb/caosdb-server!50
parents e25befdc 72b76510
Branches
Tags
No related merge requests found
......@@ -56,6 +56,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- #11 - pam_authentication leaks the password to unprivileged processes on the
same machine.
- #39 - quotes around datetimes in queries
- #99 - Checksum updating resulted in infinite loop on server.
### Security (in case of vulnerabilities)
......
......@@ -119,6 +119,7 @@ import caosdb.server.database.backend.interfaces.RetrieveUserImpl;
import caosdb.server.database.backend.interfaces.RetrieveVersionHistoryImpl;
import caosdb.server.database.backend.interfaces.RuleLoaderImpl;
import caosdb.server.database.backend.interfaces.SetFileCheckedTimestampImpl;
import caosdb.server.database.backend.interfaces.SetFileChecksumImpl;
import caosdb.server.database.backend.interfaces.SetPasswordImpl;
import caosdb.server.database.backend.interfaces.SetPermissionRulesImpl;
import caosdb.server.database.backend.interfaces.SetQueryTemplateDefinitionImpl;
......@@ -209,6 +210,7 @@ public abstract class BackendTransaction implements Undoable {
RetrieveQueryTemplateDefinitionImpl.class, MySQLRetrieveQueryTemplateDefinition.class);
setImpl(InsertEntityDatatypeImpl.class, MySQLInsertEntityDatatype.class);
setImpl(RetrieveVersionHistoryImpl.class, MySQLRetrieveVersionHistory.class);
setImpl(SetFileChecksumImpl.class, MySQLSetFileChecksum.class);
}
}
......
package caosdb.server.database;
import caosdb.server.database.access.Access;
import caosdb.server.database.backend.implementation.MySQL.ConnectionException;
import caosdb.server.database.backend.implementation.MySQL.MySQLTransaction;
import caosdb.server.database.backend.interfaces.SetFileChecksumImpl;
import caosdb.server.database.exceptions.TransactionException;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class MySQLSetFileChecksum extends MySQLTransaction implements SetFileChecksumImpl {
public MySQLSetFileChecksum(Access access) {
super(access);
}
public static final String STMT_SET_CHECKSUM =
"UPDATE files SET hash = unhex(?) WHERE file_id = ?";
@Override
public void execute(Integer id, String checksum) {
try {
PreparedStatement stmt = prepareStatement(STMT_SET_CHECKSUM);
stmt.setInt(2, id);
stmt.setString(1, checksum);
stmt.execute();
} catch (SQLException | ConnectionException e) {
throw new TransactionException(e);
}
}
}
package caosdb.server.database.backend.interfaces;
public interface SetFileChecksumImpl extends BackendTransactionImpl {
void execute(Integer id, String checksum);
}
package caosdb.server.database.backend.transaction;
import caosdb.server.database.BackendTransaction;
import caosdb.server.database.backend.interfaces.SetFileChecksumImpl;
import caosdb.server.entity.EntityInterface;
public class SetFileChecksum extends BackendTransaction {
private EntityInterface entity;
public SetFileChecksum(EntityInterface entity) {
this.entity = entity;
}
@Override
protected void execute() {
RetrieveSparseEntity.removeCached(this.entity);
if (entity.hasFileProperties()) {
GetFileRecordByPath.removeCached(this.entity.getFileProperties().getPath());
final SetFileChecksumImpl t = getImplementation(SetFileChecksumImpl.class);
t.execute(this.entity.getId(), this.entity.getFileProperties().getChecksum());
}
}
}
......@@ -220,10 +220,10 @@ public class FileProperties {
if (file.getAbsolutePath().startsWith(FileSystem.getBasepath())) {
final Undoable d;
final File parent = file.getParentFile();
if (file.getCanonicalPath().startsWith(FileSystem.getBasepath())) {
d = FileUtils.delete(file, file.isDirectory());
} else if (FileUtils.isSymlink(file)) {
if (FileUtils.isSymlink(file)) {
d = FileUtils.unlink(file);
} else if (file.getCanonicalPath().startsWith(FileSystem.getBasepath())) {
d = FileUtils.delete(file, file.isDirectory());
} else {
throw new CaosDBException(
"File is in Filesystem, but it is neither a normal file nor a symlink.");
......
......@@ -27,7 +27,7 @@ import caosdb.server.database.DatabaseMonitor;
import caosdb.server.database.access.Access;
import caosdb.server.database.backend.transaction.GetUpdateableChecksums;
import caosdb.server.database.backend.transaction.RetrieveSparseEntity;
import caosdb.server.database.backend.transaction.UpdateSparseEntity;
import caosdb.server.database.backend.transaction.SetFileChecksum;
import caosdb.server.database.exceptions.TransactionException;
import caosdb.server.entity.EntityInterface;
import caosdb.server.entity.FileProperties;
......@@ -46,6 +46,7 @@ import java.security.NoSuchAlgorithmException;
public class ChecksumUpdater extends WriteTransaction<TransactionContainer> implements Runnable {
private Boolean running = false;
private static final ChecksumUpdater instance = new ChecksumUpdater();
private ChecksumUpdater() {
......@@ -85,7 +86,7 @@ public class ChecksumUpdater extends WriteTransaction<TransactionContainer> impl
DatabaseMonitor.getInstance().acquireStrongAccess(this);
// update
execute(new UpdateSparseEntity(fileEntity), strongAccess);
execute(new SetFileChecksum(fileEntity), strongAccess);
strongAccess.commit();
} catch (final InterruptedException e) {
......@@ -145,6 +146,7 @@ public class ChecksumUpdater extends WriteTransaction<TransactionContainer> impl
}
} catch (final Exception e) {
e.printStackTrace();
instance.running = false;
return null;
} finally {
weakAccess.release();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment