Merge pull request #3497 from nextcloud/mount-shared-last
mount shared mounts last
This commit is contained in:
commit
e25b997d0b
4 changed files with 52 additions and 4 deletions
|
@ -23,4 +23,20 @@ Feature: external-storage
|
|||
| token | A_TOKEN |
|
||||
| mimetype | httpd/unix-directory |
|
||||
|
||||
|
||||
@local_storage
|
||||
Scenario: Shares dont overwrite external storages
|
||||
Given user "user0" exists
|
||||
And user "user1" exists
|
||||
And As an "user0"
|
||||
And User "user0" moved file "/textfile0.txt" to "/local_storage/textfile0.txt"
|
||||
And invoking occ with "files_external:create --user user0 test local null::null -c datadir=./build/integration/work/local_storage"
|
||||
And invoking occ with "files:scan --path /user0/files/test"
|
||||
And as "user0" the file "/local_storage/textfile0.txt" exists
|
||||
And as "user0" the folder "/test" exists
|
||||
And as "user0" the file "/test/textfile0.txt" exists
|
||||
And As an "user1"
|
||||
And user "user1" created a folder "/test"
|
||||
And User "user1" moved file "/textfile0.txt" to "/test/textfile1.txt"
|
||||
And folder "/test" of user "user1" is shared with user "user0"
|
||||
And As an "user0"
|
||||
Then as "user0" the file "/test/textfile1.txt" does not exist
|
||||
|
|
|
@ -46,7 +46,7 @@ if [ "$INSTALLED" == "true" ]; then
|
|||
mkdir -p work/local_storage
|
||||
OUTPUT_CREATE_STORAGE=`$OCC files_external:create local_storage local null::null -c datadir=./build/integration/work/local_storage`
|
||||
|
||||
ID_STORAGE=`echo $OUTPUT_CREATE_STORAGE | awk {'print $5'}`
|
||||
ID_STORAGE=`echo $OUTPUT_CREATE_STORAGE | tr ' ' '\n' | tail -n1`
|
||||
|
||||
$OCC files_external:option $ID_STORAGE enable_sharing true
|
||||
|
||||
|
|
|
@ -29,6 +29,7 @@ use OCP\Files\Config\IHomeMountProvider;
|
|||
use OCP\Files\Config\IMountProviderCollection;
|
||||
use OCP\Files\Config\IMountProvider;
|
||||
use OCP\Files\Config\IUserMountCache;
|
||||
use OCP\Files\Mount\IMountManager;
|
||||
use OCP\Files\Mount\IMountPoint;
|
||||
use OCP\Files\Storage\IStorageFactory;
|
||||
use OCP\IUser;
|
||||
|
@ -84,6 +85,37 @@ class MountProviderCollection implements IMountProviderCollection, Emitter {
|
|||
}, array());
|
||||
}
|
||||
|
||||
public function addMountForUser(IUser $user, IMountManager $mountManager) {
|
||||
// shared mount provider gets to go last since it needs to know existing files
|
||||
// to check for name collisions
|
||||
$firstMounts = [];
|
||||
$firstProviders = array_filter($this->providers, function (IMountProvider $provider) {
|
||||
return (get_class($provider) !== 'OCA\Files_Sharing\MountProvider');
|
||||
});
|
||||
$lastProviders = array_filter($this->providers, function (IMountProvider $provider) {
|
||||
return (get_class($provider) === 'OCA\Files_Sharing\MountProvider');
|
||||
});
|
||||
foreach ($firstProviders as $provider) {
|
||||
$mounts = $provider->getMountsForUser($user, $this->loader);
|
||||
if (is_array($mounts)) {
|
||||
$firstMounts = array_merge($firstMounts, $mounts);
|
||||
}
|
||||
}
|
||||
array_walk($firstMounts, [$mountManager, 'addMount']);
|
||||
|
||||
$lateMounts = [];
|
||||
foreach ($lastProviders as $provider) {
|
||||
$mounts = $provider->getMountsForUser($user, $this->loader);
|
||||
if (is_array($mounts)) {
|
||||
$lateMounts = array_merge($lateMounts, $mounts);
|
||||
}
|
||||
}
|
||||
|
||||
array_walk($lateMounts, [$mountManager, 'addMount']);
|
||||
|
||||
return array_merge($lateMounts, $firstMounts);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the configured home mount for this user
|
||||
*
|
||||
|
@ -110,6 +142,7 @@ class MountProviderCollection implements IMountProviderCollection, Emitter {
|
|||
*/
|
||||
public function registerProvider(IMountProvider $provider) {
|
||||
$this->providers[] = $provider;
|
||||
|
||||
$this->emit('\OC\Files\Config', 'registerMountProvider', [$provider]);
|
||||
}
|
||||
|
||||
|
|
|
@ -443,8 +443,7 @@ class Filesystem {
|
|||
|
||||
// Chance to mount for other storages
|
||||
if ($userObject) {
|
||||
$mounts = $mountConfigManager->getMountsForUser($userObject);
|
||||
array_walk($mounts, array(self::$mounts, 'addMount'));
|
||||
$mounts = $mountConfigManager->addMountForUser($userObject, self::getMountManager());
|
||||
$mounts[] = $homeMount;
|
||||
$mountConfigManager->registerMounts($userObject, $mounts);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue