Merge pull request #8026 from owncloud/remove_shared_folder
remove the "Shared" folderremotes/origin/ldap_group_count
commit
f520305848
@ -1,76 +1,77 @@
|
||||
<?php
|
||||
|
||||
$installedVersion = OCP\Config::getAppValue('files_sharing', 'installed_version');
|
||||
if (version_compare($installedVersion, '0.3', '<')) {
|
||||
$update_error = false;
|
||||
$query = OCP\DB::prepare('SELECT * FROM `*PREFIX*sharing`');
|
||||
if (version_compare($installedVersion, '0.4', '<')) {
|
||||
removeSharedFolder();
|
||||
}
|
||||
|
||||
// clean up oc_share table from files which are no longer exists
|
||||
if (version_compare($installedVersion, '0.3.5.6', '<')) {
|
||||
\OC\Files\Cache\Shared_Updater::fixBrokenSharesOnAppUpdate();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* update script for the removal of the logical "Shared" folder, we create physical "Shared" folder and
|
||||
* update the users file_target so that it doesn't make any difference for the user
|
||||
* @note parameters are just for testing, please ignore them
|
||||
*/
|
||||
function removeSharedFolder($mkdirs = true, $chunkSize = 99) {
|
||||
$query = OCP\DB::prepare('SELECT * FROM `*PREFIX*share`');
|
||||
$result = $query->execute();
|
||||
$groupShares = array();
|
||||
//we need to set up user backends, otherwise creating the shares will fail with "because user does not exist"
|
||||
$view = new \OC\Files\View('/');
|
||||
$users = array();
|
||||
$shares = array();
|
||||
//we need to set up user backends
|
||||
OC_User::useBackend(new OC_User_Database());
|
||||
OC_Group::useBackend(new OC_Group_Database());
|
||||
OC_App::loadApps(array('authentication'));
|
||||
$rootView = new \OC\Files\View('');
|
||||
//we need to set up user backends, otherwise creating the shares will fail with "because user does not exist"
|
||||
while ($row = $result->fetchRow()) {
|
||||
$meta = $rootView->getFileInfo($$row['source']);
|
||||
$itemSource = $meta['fileid'];
|
||||
if ($itemSource != -1) {
|
||||
$file = $meta;
|
||||
if ($file['mimetype'] == 'httpd/unix-directory') {
|
||||
$itemType = 'folder';
|
||||
} else {
|
||||
$itemType = 'file';
|
||||
}
|
||||
if ($row['permissions'] == 0) {
|
||||
$permissions = OCP\PERMISSION_READ | OCP\PERMISSION_SHARE;
|
||||
} else {
|
||||
$permissions = OCP\PERMISSION_READ | OCP\PERMISSION_UPDATE | OCP\PERMISSION_SHARE;
|
||||
if ($itemType == 'folder') {
|
||||
$permissions |= OCP\PERMISSION_CREATE;
|
||||
}
|
||||
}
|
||||
$pos = strrpos($row['uid_shared_with'], '@');
|
||||
if ($pos !== false && OC_Group::groupExists(substr($row['uid_shared_with'], $pos + 1))) {
|
||||
$shareType = OCP\Share::SHARE_TYPE_GROUP;
|
||||
$shareWith = substr($row['uid_shared_with'], 0, $pos);
|
||||
if (isset($groupShares[$shareWith][$itemSource])) {
|
||||
continue;
|
||||
} else {
|
||||
$groupShares[$shareWith][$itemSource] = true;
|
||||
//collect all user shares
|
||||
if ((int)$row['share_type'] === 0 && ($row['item_type'] === 'file' || $row['item_type'] === 'folder')) {
|
||||
$users[] = $row['share_with'];
|
||||
$shares[$row['id']] = $row['file_target'];
|
||||
} else if ((int)$row['share_type'] === 1 && ($row['item_type'] === 'file' || $row['item_type'] === 'folder')) {
|
||||
//collect all group shares
|
||||
$users = array_merge($users, \OC_group::usersInGroup($row['share_with']));
|
||||
$shares[$row['id']] = $row['file_target'];
|
||||
} else if ((int)$row['share_type'] === 2) {
|
||||
$shares[$row['id']] = $row['file_target'];
|
||||
}
|
||||
}
|
||||
|
||||
$unique_users = array_unique($users);
|
||||
|
||||
if (!empty($unique_users) && !empty($shares)) {
|
||||
|
||||
// create folder Shared for each user
|
||||
|
||||
if ($mkdirs) {
|
||||
foreach ($unique_users as $user) {
|
||||
\OC\Files\Filesystem::initMountPoints($user);
|
||||
if (!$view->file_exists('/' . $user . '/files/Shared')) {
|
||||
$view->mkdir('/' . $user . '/files/Shared');
|
||||
}
|
||||
} else if ($row['uid_shared_with'] == 'public') {
|
||||
$shareType = OCP\Share::SHARE_TYPE_LINK;
|
||||
$shareWith = null;
|
||||
} else {
|
||||
$shareType = OCP\Share::SHARE_TYPE_USER;
|
||||
$shareWith = $row['uid_shared_with'];
|
||||
}
|
||||
OCP\JSON::checkUserExists($row['uid_owner']);
|
||||
OC_User::setUserId($row['uid_owner']);
|
||||
//we need to setup the filesystem for the user, otherwise OC_FileSystem::getRoot will fail and break
|
||||
OC_Util::setupFS($row['uid_owner']);
|
||||
try {
|
||||
OCP\Share::shareItem($itemType, $itemSource, $shareType, $shareWith, $permissions);
|
||||
}
|
||||
catch (Exception $e) {
|
||||
$update_error = true;
|
||||
OCP\Util::writeLog('files_sharing',
|
||||
'Upgrade Routine: Skipping sharing "'.$row['source'].'" to "'.$shareWith
|
||||
.'" (error is "'.$e->getMessage().'")',
|
||||
OCP\Util::WARN);
|
||||
}
|
||||
|
||||
$chunkedShareList = array_chunk($shares, $chunkSize, true);
|
||||
|
||||
foreach ($chunkedShareList as $subList) {
|
||||
|
||||
$statement = "UPDATE `*PREFIX*share` SET `file_target` = CASE `id` ";
|
||||
//update share table
|
||||
$ids = implode(',', array_keys($subList));
|
||||
foreach ($subList as $id => $target) {
|
||||
$statement .= "WHEN " . $id . " THEN '/Shared" . $target . "' ";
|
||||
}
|
||||
OC_Util::tearDownFS();
|
||||
$statement .= ' END WHERE `id` IN (' . $ids . ')';
|
||||
|
||||
$query = OCP\DB::prepare($statement);
|
||||
|
||||
$query->execute(array());
|
||||
}
|
||||
}
|
||||
OC_User::setUserId(null);
|
||||
if ($update_error) {
|
||||
OCP\Util::writeLog('files_sharing', 'There were some problems upgrading the sharing of files', OCP\Util::ERROR);
|
||||
}
|
||||
// NOTE: Let's drop the table after more testing
|
||||
// $query = OCP\DB::prepare('DROP TABLE `*PREFIX*sharing`');
|
||||
// $query->execute();
|
||||
}
|
||||
|
||||
// clean up oc_share table from files which are no longer exists
|
||||
if (version_compare($installedVersion, '0.3.5.6', '<')) {
|
||||
\OC\Files\Cache\Shared_Updater::fixBrokenSharesOnAppUpdate();
|
||||
}
|
||||
}
|
||||
|
||||
@ -1 +1 @@
|
||||
0.3.5.6
|
||||
0.4
|
||||
|
||||
Loading…
Reference in New Issue