summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVincent Petry <pvince81@owncloud.com>2015-01-26 19:54:14 +0100
committerVincent Petry <pvince81@owncloud.com>2015-01-26 19:54:14 +0100
commitbd888748bd9d0d9e9268447501fe35abf121083b (patch)
treee22d3e68a9617f6d30e6a3037144a750a26363fb
parent44d69d71780d94ab89f81e54ebf9ec23a5b04316 (diff)
parent5ba19ba7fcda12e21fe37e8686218122936c9a68 (diff)
downloadnextcloud-server-bd888748bd9d0d9e9268447501fe35abf121083b.tar.gz
nextcloud-server-bd888748bd9d0d9e9268447501fe35abf121083b.zip
Merge pull request #13490 from owncloud/fix_reshare_s2s_share
use uid provided by setupfs hook to mount server2server shares
-rw-r--r--apps/files_sharing/ajax/external.php4
-rw-r--r--apps/files_sharing/api/server2server.php5
-rw-r--r--apps/files_sharing/application.php6
-rw-r--r--apps/files_sharing/lib/controllers/sharecontroller.php1
-rw-r--r--apps/files_sharing/lib/external/manager.php78
-rw-r--r--apps/files_sharing/lib/hooks.php4
-rw-r--r--apps/files_sharing/tests/server2server.php5
-rw-r--r--lib/private/security/certificatemanager.php42
-rw-r--r--lib/private/server.php13
-rw-r--r--tests/lib/security/certificatemanager.php8
10 files changed, 98 insertions, 68 deletions
diff --git a/apps/files_sharing/ajax/external.php b/apps/files_sharing/ajax/external.php
index 1a709eda07c..a206cacafa3 100644
--- a/apps/files_sharing/ajax/external.php
+++ b/apps/files_sharing/ajax/external.php
@@ -34,8 +34,8 @@ $externalManager = new \OCA\Files_Sharing\External\Manager(
\OC::$server->getDatabaseConnection(),
\OC\Files\Filesystem::getMountManager(),
\OC\Files\Filesystem::getLoader(),
- \OC::$server->getUserSession(),
- \OC::$server->getHTTPHelper()
+ \OC::$server->getHTTPHelper(),
+ \OC::$server->getUserSession()->getUser()->getUID()
);
$name = OCP\Files::buildNotExistingFileName('/', $name);
diff --git a/apps/files_sharing/api/server2server.php b/apps/files_sharing/api/server2server.php
index f78d64caa73..7dce0df7d83 100644
--- a/apps/files_sharing/api/server2server.php
+++ b/apps/files_sharing/api/server2server.php
@@ -60,8 +60,9 @@ class Server2Server {
\OC::$server->getDatabaseConnection(),
\OC\Files\Filesystem::getMountManager(),
\OC\Files\Filesystem::getLoader(),
- \OC::$server->getUserSession(),
- \OC::$server->getHTTPHelper());
+ \OC::$server->getHTTPHelper(),
+ $shareWith
+ );
$name = \OCP\Files::buildNotExistingFileName('/', $name);
diff --git a/apps/files_sharing/application.php b/apps/files_sharing/application.php
index 56ec448d6a9..3302848106f 100644
--- a/apps/files_sharing/application.php
+++ b/apps/files_sharing/application.php
@@ -69,12 +69,14 @@ class Application extends App {
return Helper::isIncomingServer2serverShareEnabled();
});
$container->registerService('ExternalManager', function(SimpleContainer $c) use ($server){
+ $user = $server->getUserSession()->getUser();
+ $uid = $user ? $user->getUID() : null;
return new \OCA\Files_Sharing\External\Manager(
$server->getDatabaseConnection(),
\OC\Files\Filesystem::getMountManager(),
\OC\Files\Filesystem::getLoader(),
- $server->getUserSession(),
- $server->getHTTPHelper()
+ $server->getHTTPHelper(),
+ $uid
);
});
diff --git a/apps/files_sharing/lib/controllers/sharecontroller.php b/apps/files_sharing/lib/controllers/sharecontroller.php
index 1d8eabc1984..cd013d4ca96 100644
--- a/apps/files_sharing/lib/controllers/sharecontroller.php
+++ b/apps/files_sharing/lib/controllers/sharecontroller.php
@@ -142,7 +142,6 @@ class ShareController extends Controller {
return new TemplateResponse('core', '404', array(), 'guest');
}
- $linkItem = OCP\Share::getShareByToken($token, false);
$shareOwner = $linkItem['uid_owner'];
$originalSharePath = null;
$rootLinkItem = OCP\Share::resolveReShare($linkItem);
diff --git a/apps/files_sharing/lib/external/manager.php b/apps/files_sharing/lib/external/manager.php
index 57dc38a9954..8985aeb3fce 100644
--- a/apps/files_sharing/lib/external/manager.php
+++ b/apps/files_sharing/lib/external/manager.php
@@ -14,6 +14,11 @@ class Manager {
const STORAGE = '\OCA\Files_Sharing\External\Storage';
/**
+ * @var string
+ */
+ private $uid;
+
+ /**
* @var \OCP\IDBConnection
*/
private $connection;
@@ -29,11 +34,6 @@ class Manager {
private $storageLoader;
/**
- * @var \OC\User\Session
- */
- private $userSession;
-
- /**
* @var \OC\HTTPHelper
*/
private $httpHelper;
@@ -41,21 +41,35 @@ class Manager {
/**
* @param \OCP\IDBConnection $connection
* @param \OC\Files\Mount\Manager $mountManager
- * @param \OC\User\Session $userSession
* @param \OC\Files\Storage\StorageFactory $storageLoader
+ * @param \OC\HTTPHelper $httpHelper
+ * @param string $uid
*/
public function __construct(\OCP\IDBConnection $connection, \OC\Files\Mount\Manager $mountManager,
- \OC\Files\Storage\StorageFactory $storageLoader, \OC\User\Session $userSession, \OC\HTTPHelper $httpHelper) {
+ \OC\Files\Storage\StorageFactory $storageLoader, \OC\HTTPHelper $httpHelper, $uid) {
$this->connection = $connection;
$this->mountManager = $mountManager;
- $this->userSession = $userSession;
$this->storageLoader = $storageLoader;
$this->httpHelper = $httpHelper;
+ $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->userSession->getUser()->getUID();
+ $user = $user ? $user : $this->uid;
$accepted = $accepted ? 1 : 0;
$mountPoint = Filesystem::normalizePath('/' . $name);
@@ -86,14 +100,13 @@ class Manager {
return false;
}
- $user = $this->userSession->getUser();
- if ($user) {
+ if (!is_null($this->uid)) {
$query = $this->connection->prepare('
SELECT `remote`, `share_token`, `password`, `mountpoint`, `owner`
FROM `*PREFIX*share_external`
WHERE `user` = ? AND `accepted` = ?
');
- $query->execute(array($user->getUID(), 1));
+ $query->execute(array($this->uid, 1));
while ($row = $query->fetch()) {
$row['manager'] = $this;
@@ -114,7 +127,7 @@ class Manager {
SELECT `remote`, `share_token`
FROM `*PREFIX*share_external`
WHERE `id` = ? AND `user` = ?');
- $result = $getShare->execute(array($id, $this->userSession->getUser()->getUID()));
+ $result = $getShare->execute(array($id, $this->uid));
return $result ? $getShare->fetch() : false;
}
@@ -133,7 +146,7 @@ class Manager {
UPDATE `*PREFIX*share_external`
SET `accepted` = ?
WHERE `id` = ? AND `user` = ?');
- $acceptShare->execute(array(1, $id, $this->userSession->getUser()->getUID()));
+ $acceptShare->execute(array(1, $id, $this->uid));
$this->sendFeedbackToRemote($share['remote'], $share['share_token'], $id, 'accept');
}
}
@@ -150,7 +163,7 @@ class Manager {
if ($share) {
$removeShare = $this->connection->prepare('
DELETE FROM `*PREFIX*share_external` WHERE `id` = ? AND `user` = ?');
- $removeShare->execute(array($id, $this->userSession->getUser()->getUID()));
+ $removeShare->execute(array($id, $this->uid));
$this->sendFeedbackToRemote($share['remote'], $share['share_token'], $id, 'decline');
}
}
@@ -175,19 +188,31 @@ class Manager {
return ($result['success'] && $status['ocs']['meta']['statuscode'] === 100);
}
- public static function setup() {
+ /**
+ * 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(),
\OC\Files\Filesystem::getLoader(),
- \OC::$server->getUserSession(),
- \OC::$server->getHTTPHelper()
+ \OC::$server->getHTTPHelper(),
+ $params['user']
);
+
$externalManager->setupMounts();
}
+ /**
+ * remove '/user/files' from the path and trailing slashes
+ *
+ * @param string $path
+ * @return string
+ */
protected function stripPath($path) {
- $prefix = '/' . $this->userSession->getUser()->getUID() . '/files';
+ $prefix = '/' . $this->uid . '/files';
return rtrim(substr($path, strlen($prefix)), '/');
}
@@ -196,11 +221,10 @@ class Manager {
* @return Mount
*/
protected function mountShare($data) {
- $user = $this->userSession->getUser();
$data['manager'] = $this;
- $mountPoint = '/' . $user->getUID() . '/files' . $data['mountpoint'];
+ $mountPoint = '/' . $this->uid . '/files' . $data['mountpoint'];
$data['mountpoint'] = $mountPoint;
- $data['certificateManager'] = \OC::$server->getCertificateManager($user);
+ $data['certificateManager'] = \OC::$server->getCertificateManager($this->uid);
$mount = new Mount(self::STORAGE, $mountPoint, $data, $this, $this->storageLoader);
$this->mountManager->addMount($mount);
return $mount;
@@ -219,7 +243,6 @@ class Manager {
* @return bool
*/
public function setMountPoint($source, $target) {
- $user = $this->userSession->getUser();
$source = $this->stripPath($source);
$target = $this->stripPath($target);
$sourceHash = md5($source);
@@ -231,13 +254,12 @@ class Manager {
WHERE `mountpoint_hash` = ?
AND `user` = ?
');
- $result = (bool)$query->execute(array($target, $targetHash, $sourceHash, $user->getUID()));
+ $result = (bool)$query->execute(array($target, $targetHash, $sourceHash, $this->uid));
return $result;
}
public function removeShare($mountPoint) {
- $user = $this->userSession->getUser();
$mountPoint = $this->stripPath($mountPoint);
$hash = md5($mountPoint);
@@ -245,7 +267,7 @@ class Manager {
SELECT `remote`, `share_token`, `remote_id`
FROM `*PREFIX*share_external`
WHERE `mountpoint_hash` = ? AND `user` = ?');
- $result = $getShare->execute(array($hash, $user->getUID()));
+ $result = $getShare->execute(array($hash, $this->uid));
if ($result) {
$share = $getShare->fetch();
@@ -257,7 +279,7 @@ class Manager {
WHERE `mountpoint_hash` = ?
AND `user` = ?
');
- return (bool)$query->execute(array($hash, $user->getUID()));
+ return (bool)$query->execute(array($hash, $this->uid));
}
/**
@@ -294,7 +316,7 @@ class Manager {
*/
public function getOpenShares() {
$openShares = $this->connection->prepare('SELECT * FROM `*PREFIX*share_external` WHERE `accepted` = ? AND `user` = ?');
- $result = $openShares->execute(array(0, $this->userSession->getUser()->getUID()));
+ $result = $openShares->execute(array(0, $this->uid));
return $result ? $openShares->fetchAll() : array();
diff --git a/apps/files_sharing/lib/hooks.php b/apps/files_sharing/lib/hooks.php
index 6f23c103b1d..10e16be4a91 100644
--- a/apps/files_sharing/lib/hooks.php
+++ b/apps/files_sharing/lib/hooks.php
@@ -30,8 +30,8 @@ class Hooks {
\OC::$server->getDatabaseConnection(),
\OC\Files\Filesystem::getMountManager(),
\OC\Files\Filesystem::getLoader(),
- \OC::$server->getUserSession(),
- \OC::$server->getHTTPHelper());
+ \OC::$server->getHTTPHelper(),
+ $params['uid']);
$manager->removeUserShares($params['uid']);
}
diff --git a/apps/files_sharing/tests/server2server.php b/apps/files_sharing/tests/server2server.php
index 2d59f7be9cd..6e9c0dd0ddd 100644
--- a/apps/files_sharing/tests/server2server.php
+++ b/apps/files_sharing/tests/server2server.php
@@ -153,8 +153,9 @@ class Test_Files_Sharing_S2S_OCS_API extends TestCase {
\OC::$server->getDatabaseConnection(),
\OC\Files\Filesystem::getMountManager(),
\OC\Files\Filesystem::getLoader(),
- \OC::$server->getUserSession(),
- \OC::$server->getHTTPHelper());
+ \OC::$server->getHTTPHelper(),
+ $toDelete
+ );
$manager->removeUserShares($toDelete);
diff --git a/lib/private/security/certificatemanager.php b/lib/private/security/certificatemanager.php
index 4a8ea170731..7bc83766365 100644
--- a/lib/private/security/certificatemanager.php
+++ b/lib/private/security/certificatemanager.php
@@ -16,15 +16,22 @@ use OCP\ICertificateManager;
*/
class CertificateManager implements ICertificateManager {
/**
- * @var \OCP\IUser
+ * @var string
*/
- protected $user;
+ protected $uid;
/**
- * @param \OCP\IUser $user
+ * @var \OC\Files\View
*/
- public function __construct($user) {
- $this->user = $user;
+ 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;
@@ -134,7 +138,7 @@ class CertificateManager implements ICertificateManager {
}
private function getPathToCertificates() {
- $path = $this->user ? $this->user->getHome() . '/files_external/' : '/files_external/';
+ $path = is_null($this->uid) ? '/files_external/' : '/' . $this->uid . '/files_external/';
return $path;
}
diff --git a/lib/private/server.php b/lib/private/server.php
index c98f77c6479..15c33e1905f 100644
--- a/lib/private/server.php
+++ b/lib/private/server.php
@@ -249,7 +249,9 @@ class Server extends SimpleContainer implements IServerContainer {
});
$this->registerService('HTTPHelper', function (Server $c) {
$config = $c->getConfig();
- return new HTTPHelper($config, new \OC\Security\CertificateManager($c->getUserSession()->getUser()));
+ $user = $c->getUserSession()->getUser();
+ $uid = $user ? $user->getUID() : null;
+ return new HTTPHelper($config, new \OC\Security\CertificateManager($uid, new \OC\Files\View()));
});
$this->registerService('EventLogger', function (Server $c) {
if (defined('DEBUG') and DEBUG) {
@@ -631,18 +633,19 @@ class Server extends SimpleContainer implements IServerContainer {
/**
* Get the certificate manager for the user
*
- * @param \OCP\IUser $user (optional) if not specified the current loggedin user is used
+ * @param string $uid (optional) if not specified the current loggedin user is used
* @return \OCP\ICertificateManager
*/
- function getCertificateManager($user = null) {
- if (is_null($user)) {
+ function getCertificateManager($uid = null) {
+ if (is_null($uid)) {
$userSession = $this->getUserSession();
$user = $userSession->getUser();
if (is_null($user)) {
return null;
}
+ $uid = $user->getUID();
}
- return new CertificateManager($user);
+ return new CertificateManager($uid, new \OC\Files\View());
}
/**
diff --git a/tests/lib/security/certificatemanager.php b/tests/lib/security/certificatemanager.php
index cff6932b670..1167fe3d868 100644
--- a/tests/lib/security/certificatemanager.php
+++ b/tests/lib/security/certificatemanager.php
@@ -28,9 +28,7 @@ class CertificateManagerTest extends \Test\TestCase {
\OC\Files\Filesystem::tearDown();
\OC_Util::setupFS($this->username);
- $this->user = \OC::$server->getUserManager()->get($this->username);
-
- $this->certificateManager = new CertificateManager($this->user);
+ $this->certificateManager = new CertificateManager($this->username, new \OC\Files\View());
}
protected function tearDown() {
@@ -84,7 +82,7 @@ class CertificateManagerTest extends \Test\TestCase {
}
function testGetCertificateBundle() {
- $this->assertSame($this->user->getHome().'/files_external/rootcerts.crt', $this->certificateManager->getCertificateBundle());
+ $this->assertSame('/' . $this->username . '/files_external/rootcerts.crt', $this->certificateManager->getCertificateBundle());
}
-} \ No newline at end of file
+}