aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobin Appelman <robin@icewind.nl>2024-01-17 17:47:01 +0100
committerRobin Appelman <robin@icewind.nl>2024-01-17 18:10:03 +0100
commit2205e34831a176149cbdbd29c2d7040b2be148d6 (patch)
tree070de640b0978f8387833afd4e70f4b9d14d8591
parent11ed33a4e0615c4cee5e36c516b4001a64e7c5b4 (diff)
downloadnextcloud-server-file-info-key-location-27.tar.gz
nextcloud-server-file-info-key-location-27.zip
add key location to info:file outputfile-info-key-location-27
Signed-off-by: Robin Appelman <robin@icewind.nl>
-rw-r--r--core/Command/Info/File.php19
-rw-r--r--lib/private/Encryption/Keys/Storage.php30
-rw-r--r--lib/private/Encryption/Util.php21
3 files changed, 44 insertions, 26 deletions
diff --git a/core/Command/Info/File.php b/core/Command/Info/File.php
index 238c1e28140..e11f7ac498b 100644
--- a/core/Command/Info/File.php
+++ b/core/Command/Info/File.php
@@ -5,6 +5,7 @@ declare(strict_types=1);
namespace OC\Core\Command\Info;
use OC\Files\ObjectStore\ObjectStoreStorage;
+use OC\Files\View;
use OCA\Files_External\Config\ExternalMountPoint;
use OCA\GroupFolders\Mount\GroupMountPoint;
use OCP\Files\Folder;
@@ -24,11 +25,19 @@ use Symfony\Component\Console\Output\OutputInterface;
class File extends Command {
private IL10N $l10n;
private FileUtils $fileUtils;
+ private View $rootView;
+ private \OC\Encryption\Util $encryptionUtil;
- public function __construct(IFactory $l10nFactory, FileUtils $fileUtils) {
+ public function __construct(
+ IFactory $l10nFactory,
+ FileUtils $fileUtils,
+ \OC\Encryption\Util $encryptionUtil
+ ) {
$this->l10n = $l10nFactory->get("core");
$this->fileUtils = $fileUtils;
+ $this->encryptionUtil = $encryptionUtil;
parent::__construct();
+ $this->rootView = new View();
}
protected function configure(): void {
@@ -53,6 +62,14 @@ class File extends Command {
$output->writeln(" mimetype: " . $node->getMimetype());
$output->writeln(" modified: " . (string)$this->l10n->l("datetime", $node->getMTime()));
$output->writeln(" " . ($node->isEncrypted() ? "encrypted" : "not encrypted"));
+ if ($node->isEncrypted()) {
+ $keyPath = $this->encryptionUtil->getFileKeyDir('', $node->getPath());
+ if ($this->rootView->file_exists($keyPath)) {
+ $output->writeln(" encryption key at: " . $keyPath);
+ } else {
+ $output->writeln(" <error>encryption key not found</error> should be location at: " . $keyPath);
+ }
+ }
$output->writeln(" size: " . Util::humanFileSize($node->getSize()));
$output->writeln(" etag: " . $node->getEtag());
if ($node instanceof Folder) {
diff --git a/lib/private/Encryption/Keys/Storage.php b/lib/private/Encryption/Keys/Storage.php
index e88c305eeec..cc7ed2f1f7b 100644
--- a/lib/private/Encryption/Keys/Storage.php
+++ b/lib/private/Encryption/Keys/Storage.php
@@ -98,14 +98,14 @@ class Storage implements IStorage {
*/
public function getFileKey($path, $keyId, $encryptionModuleId) {
$realFile = $this->util->stripPartialFileExtension($path);
- $keyDir = $this->getFileKeyDir($encryptionModuleId, $realFile);
+ $keyDir = $this->util->getFileKeyDir($encryptionModuleId, $realFile);
$key = $this->getKey($keyDir . $keyId)['key'];
if ($key === '' && $realFile !== $path) {
// Check if the part file has keys and use them, if no normal keys
// exist. This is required to fix copyBetweenStorage() when we
// rename a .part file over storage borders.
- $keyDir = $this->getFileKeyDir($encryptionModuleId, $path);
+ $keyDir = $this->util->getFileKeyDir($encryptionModuleId, $path);
$key = $this->getKey($keyDir . $keyId)['key'];
}
@@ -135,7 +135,7 @@ class Storage implements IStorage {
* @inheritdoc
*/
public function setFileKey($path, $keyId, $key, $encryptionModuleId) {
- $keyDir = $this->getFileKeyDir($encryptionModuleId, $path);
+ $keyDir = $this->util->getFileKeyDir($encryptionModuleId, $path);
return $this->setKey($keyDir . $keyId, [
'key' => base64_encode($key),
]);
@@ -177,7 +177,7 @@ class Storage implements IStorage {
* @inheritdoc
*/
public function deleteFileKey($path, $keyId, $encryptionModuleId) {
- $keyDir = $this->getFileKeyDir($encryptionModuleId, $path);
+ $keyDir = $this->util->getFileKeyDir($encryptionModuleId, $path);
return !$this->view->file_exists($keyDir . $keyId) || $this->view->unlink($keyDir . $keyId);
}
@@ -185,7 +185,7 @@ class Storage implements IStorage {
* @inheritdoc
*/
public function deleteAllFileKeys($path) {
- $keyDir = $this->getFileKeyDir('', $path);
+ $keyDir = $this->util->getFileKeyDir('', $path);
return !$this->view->file_exists($keyDir) || $this->view->deleteAll($keyDir);
}
@@ -356,26 +356,6 @@ class Storage implements IStorage {
}
/**
- * get path to key folder for a given file
- *
- * @param string $encryptionModuleId
- * @param string $path path to the file, relative to data/
- * @return string
- */
- private function getFileKeyDir($encryptionModuleId, $path) {
- [$owner, $filename] = $this->util->getUidAndFilename($path);
-
- // in case of system wide mount points the keys are stored directly in the data directory
- if ($this->util->isSystemWideMountPoint($filename, $owner)) {
- $keyPath = $this->root_dir . '/' . $this->keys_base_dir . $filename . '/';
- } else {
- $keyPath = $this->root_dir . '/' . $owner . $this->keys_base_dir . $filename . '/';
- }
-
- return Filesystem::normalizePath($keyPath . $encryptionModuleId . '/', false);
- }
-
- /**
* move keys if a file was renamed
*
* @param string $source
diff --git a/lib/private/Encryption/Util.php b/lib/private/Encryption/Util.php
index 6ae0006e955..186444af783 100644
--- a/lib/private/Encryption/Util.php
+++ b/lib/private/Encryption/Util.php
@@ -360,4 +360,25 @@ class Util {
public function getKeyStorageRoot(): string {
return $this->config->getAppValue('core', 'encryption_key_storage_root', '');
}
+
+ /**
+ * get path to key folder for a given file
+ *
+ * @param string $encryptionModuleId
+ * @param string $path path to the file, relative to data/
+ * @return string
+ */
+ public function getFileKeyDir(string $encryptionModuleId, string $path): string {
+ [$owner, $filename] = $this->getUidAndFilename($path);
+ $root = $this->getKeyStorageRoot();
+
+ // in case of system-wide mount points the keys are stored directly in the data directory
+ if ($this->isSystemWideMountPoint($filename, $owner)) {
+ $keyPath = $root . '/' . '/files_encryption/keys' . $filename . '/';
+ } else {
+ $keyPath = $root . '/' . $owner . '/files_encryption/keys' . $filename . '/';
+ }
+
+ return Filesystem::normalizePath($keyPath . $encryptionModuleId . '/', false);
+ }
}