From 5ba19ba7fcda12e21fe37e8686218122936c9a68 Mon Sep 17 00:00:00 2001 From: Bjoern Schiessle Date: Tue, 20 Jan 2015 20:34:34 +0100 Subject: [PATCH] certificate manager should always use a \OC\Files\View otherwise we will get problems for different primary storages --- apps/files_sharing/lib/external/manager.php | 27 +++++++++++++++- lib/private/security/certificatemanager.php | 34 ++++++++++++--------- lib/private/server.php | 4 +-- tests/lib/security/certificatemanager.php | 4 +-- 4 files changed, 49 insertions(+), 20 deletions(-) diff --git a/apps/files_sharing/lib/external/manager.php b/apps/files_sharing/lib/external/manager.php index 35dcabbe50..8985aeb3fc 100644 --- a/apps/files_sharing/lib/external/manager.php +++ b/apps/files_sharing/lib/external/manager.php @@ -42,6 +42,7 @@ class Manager { * @param \OCP\IDBConnection $connection * @param \OC\Files\Mount\Manager $mountManager * @param \OC\Files\Storage\StorageFactory $storageLoader + * @param \OC\HTTPHelper $httpHelper * @param string $uid */ public function __construct(\OCP\IDBConnection $connection, \OC\Files\Mount\Manager $mountManager, @@ -53,6 +54,19 @@ class Manager { $this->uid = $uid; } + /** + * add new server-to-server share + * + * @param string $remote + * @param string $token + * @param string $password + * @param string $name + * @param string $owner + * @param boolean $accepted + * @param string $user + * @param int $remoteId + * @return mixed + */ public function addShare($remote, $token, $password, $name, $owner, $accepted=false, $user = null, $remoteId = -1) { $user = $user ? $user : $this->uid; @@ -174,7 +188,12 @@ class Manager { return ($result['success'] && $status['ocs']['meta']['statuscode'] === 100); } - public static function setup($params) { + /** + * setup the server-to-server mounts + * + * @param array $params + */ + public static function setup(array $params) { $externalManager = new \OCA\Files_Sharing\External\Manager( \OC::$server->getDatabaseConnection(), \OC\Files\Filesystem::getMountManager(), @@ -186,6 +205,12 @@ class Manager { $externalManager->setupMounts(); } + /** + * remove '/user/files' from the path and trailing slashes + * + * @param string $path + * @return string + */ protected function stripPath($path) { $prefix = '/' . $this->uid . '/files'; return rtrim(substr($path, strlen($prefix)), '/'); diff --git a/lib/private/security/certificatemanager.php b/lib/private/security/certificatemanager.php index 0744546177..7bc8376636 100644 --- a/lib/private/security/certificatemanager.php +++ b/lib/private/security/certificatemanager.php @@ -21,10 +21,17 @@ class CertificateManager implements ICertificateManager { protected $uid; /** - * @param string $uid + * @var \OC\Files\View */ - public function __construct($uid) { + protected $view; + + /** + * @param string $uid + * @param \OC\Files\View $view relative zu data/ + */ + public function __construct($uid, \OC\Files\View $view) { $this->uid = $uid; + $this->view = $view; } /** @@ -34,18 +41,18 @@ class CertificateManager implements ICertificateManager { */ public function listCertificates() { $path = $this->getPathToCertificates() . 'uploads/'; - if (!is_dir($path)) { + if (!$this->view->is_dir($path)) { return array(); } $result = array(); - $handle = opendir($path); + $handle = $this->view->opendir($path); if (!is_resource($handle)) { return array(); } while (false !== ($file = readdir($handle))) { if ($file != '.' && $file != '..') { try { - $result[] = new Certificate(file_get_contents($path . $file), $file); + $result[] = new Certificate($this->view->file_get_contents($path . $file), $file); } catch(\Exception $e) {} } } @@ -60,10 +67,10 @@ class CertificateManager implements ICertificateManager { $path = $this->getPathToCertificates(); $certs = $this->listCertificates(); - $fh_certs = fopen($path . '/rootcerts.crt', 'w'); + $fh_certs = $this->view->fopen($path . '/rootcerts.crt', 'w'); foreach ($certs as $cert) { $file = $path . '/uploads/' . $cert->getName(); - $data = file_get_contents($file); + $data = $this->view->file_get_contents($file); if (strpos($data, 'BEGIN CERTIFICATE')) { fwrite($fh_certs, $data); fwrite($fh_certs, "\r\n"); @@ -87,17 +94,14 @@ class CertificateManager implements ICertificateManager { } $dir = $this->getPathToCertificates() . 'uploads/'; - if (!file_exists($dir)) { - //path might not exist (e.g. non-standard OC_User::getHome() value) - //in this case create full path using 3rd (recursive=true) parameter. - //note that we use "normal" php filesystem functions here since the certs need to be local - mkdir($dir, 0700, true); + if (!$this->view->file_exists($dir)) { + $this->view->mkdir($dir); } try { $file = $dir . $name; $certificateObject = new Certificate($certificate, $name); - file_put_contents($file, $certificate); + $this->view->file_put_contents($file, $certificate); $this->createCertificateBundle(); return $certificateObject; } catch (\Exception $e) { @@ -117,8 +121,8 @@ class CertificateManager implements ICertificateManager { return false; } $path = $this->getPathToCertificates() . 'uploads/'; - if (file_exists($path . $name)) { - unlink($path . $name); + if ($this->view->file_exists($path . $name)) { + $this->view->unlink($path . $name); $this->createCertificateBundle(); } return true; diff --git a/lib/private/server.php b/lib/private/server.php index 672245c352..15c33e1905 100644 --- a/lib/private/server.php +++ b/lib/private/server.php @@ -251,7 +251,7 @@ class Server extends SimpleContainer implements IServerContainer { $config = $c->getConfig(); $user = $c->getUserSession()->getUser(); $uid = $user ? $user->getUID() : null; - return new HTTPHelper($config, new \OC\Security\CertificateManager($uid)); + return new HTTPHelper($config, new \OC\Security\CertificateManager($uid, new \OC\Files\View())); }); $this->registerService('EventLogger', function (Server $c) { if (defined('DEBUG') and DEBUG) { @@ -645,7 +645,7 @@ class Server extends SimpleContainer implements IServerContainer { } $uid = $user->getUID(); } - return new CertificateManager($uid); + return new CertificateManager($uid, new \OC\Files\View()); } /** diff --git a/tests/lib/security/certificatemanager.php b/tests/lib/security/certificatemanager.php index 83980a6755..1167fe3d86 100644 --- a/tests/lib/security/certificatemanager.php +++ b/tests/lib/security/certificatemanager.php @@ -28,7 +28,7 @@ class CertificateManagerTest extends \Test\TestCase { \OC\Files\Filesystem::tearDown(); \OC_Util::setupFS($this->username); - $this->certificateManager = new CertificateManager($this->username); + $this->certificateManager = new CertificateManager($this->username, new \OC\Files\View()); } protected function tearDown() { @@ -85,4 +85,4 @@ class CertificateManagerTest extends \Test\TestCase { $this->assertSame('/' . $this->username . '/files_external/rootcerts.crt', $this->certificateManager->getCertificateBundle()); } -} \ No newline at end of file +}