diff --git a/apps/files_external/lib/Lib/Storage/SFTP.php b/apps/files_external/lib/Lib/Storage/SFTP.php
index 6504ea610f345..4ac6b28b9fc94 100644
--- a/apps/files_external/lib/Lib/Storage/SFTP.php
+++ b/apps/files_external/lib/Lib/Storage/SFTP.php
@@ -333,7 +333,7 @@ public function fopen(string $path, string $mode) {
$fh = fopen('sftpwrite://' . trim($absPath, '/'), 'w', false, $context);
if ($fh) {
$fh = CallbackWrapper::wrap($fh, null, null, function () use ($path): void {
- $this->knownMTimes->set($path, time());
+ $this->touch($path, time());
});
}
return $fh;
@@ -357,18 +357,17 @@ public function fopen(string $path, string $mode) {
}
public function touch(string $path, ?int $mtime = null): bool {
- try {
+
+ $result = $this->getConnection()->touch($this->absPath($path), $mtime, $mtime);
+
+ if ($result) {
+ $this->getConnection()->clearStatCache();
if (!is_null($mtime)) {
- return false;
- }
- if (!$this->file_exists($path)) {
- return $this->getConnection()->put($this->absPath($path), '');
- } else {
- return false;
+ $this->knownMTimes->set($path, $mtime);
}
- } catch (\Exception $e) {
- return false;
}
+
+ return $result;
}
/**
@@ -429,6 +428,9 @@ public function constructUrl(string $path): string {
public function file_put_contents(string $path, mixed $data): int|float|false {
/** @psalm-suppress InternalMethod */
$result = $this->getConnection()->put($this->absPath($path), $data);
+
+ $this->touch($path, time());
+
if ($result) {
return strlen($data);
} else {
@@ -448,6 +450,9 @@ public function writeStream(string $path, $stream, ?int $size = null): int {
/** @psalm-suppress InternalMethod */
$result = $this->getConnection()->put($this->absPath($path), $stream);
fclose($stream);
+
+ $this->touch($path, time());
+
if ($result) {
if ($size === null) {
throw new \Exception('Failed to get written size from sftp storage wrapper');
diff --git a/apps/files_external/lib/Lib/Storage/SFTPWriteStream.php b/apps/files_external/lib/Lib/Storage/SFTPWriteStream.php
index 6a5e2e19fdcaf..f1dba8ec22357 100644
--- a/apps/files_external/lib/Lib/Storage/SFTPWriteStream.php
+++ b/apps/files_external/lib/Lib/Storage/SFTPWriteStream.php
@@ -32,6 +32,8 @@ class SFTPWriteStream implements File {
private $buffer = '';
+ private string $path;
+
public static function register($protocol = 'sftpwrite') {
if (in_array($protocol, stream_get_wrappers(), true)) {
return false;
@@ -71,6 +73,8 @@ public function stream_open($path, $mode, $options, &$opened_path) {
}
$remote_file = $this->sftp->_realpath($path);
+
+ $this->path = $remote_file;
if ($remote_file === false) {
return false;
}
@@ -160,6 +164,8 @@ public function stream_close() {
if (!$this->sftp->_close_handle($this->handle)) {
return false;
}
+ $this->sftp->touch($this->path, time(), time());
+
return true;
}
}
diff --git a/build/psalm-baseline.xml b/build/psalm-baseline.xml
index fc0e97dcaba9e..1b247434bd2ce 100644
--- a/build/psalm-baseline.xml
+++ b/build/psalm-baseline.xml
@@ -1359,7 +1359,6 @@
-