2012-07-13 17:17:36 +04:00
< ? php
2012-09-10 02:29:47 +04:00
$installedVersion = OCP\Config :: getAppValue ( 'files_sharing' , 'installed_version' );
2012-09-11 05:57:05 +04:00
if ( version_compare ( $installedVersion , '0.3' , '<' )) {
2012-09-22 01:25:57 +04:00
$update_error = false ;
2012-09-10 02:29:47 +04:00
$query = OCP\DB :: prepare ( 'SELECT * FROM `*PREFIX*sharing`' );
$result = $query -> execute ();
$groupShares = array ();
2012-09-25 13:47:45 +04:00
//we need to set up user backends, otherwise creating the shares will fail with "because user does not exist"
OC_User :: useBackend ( new OC_User_Database ());
OC_Group :: useBackend ( new OC_Group_Database ());
OC_App :: loadApps ( array ( 'authentication' ));
2012-10-27 16:25:15 +04:00
$rootView = new \OC\Files\View ( '' );
2012-09-10 02:29:47 +04:00
while ( $row = $result -> fetchRow ()) {
2012-10-27 16:25:15 +04:00
$meta = $rootView -> getFileInfo ( $$row [ 'source' ]);
$itemSource = $meta [ 'fileid' ];
2012-09-10 02:29:47 +04:00
if ( $itemSource != - 1 ) {
2012-10-27 16:25:15 +04:00
$file = $meta ;
2012-09-10 02:29:47 +04:00
if ( $file [ 'mimetype' ] == 'httpd/unix-directory' ) {
$itemType = 'folder' ;
} else {
$itemType = 'file' ;
2012-08-29 10:42:49 +04:00
}
2012-09-10 02:29:47 +04:00
if ( $row [ 'permissions' ] == 0 ) {
2012-11-11 22:58:54 +04:00
$permissions = OCP\PERMISSION_READ | OCP\PERMISSION_SHARE ;
2012-09-10 02:29:47 +04:00
} else {
2012-11-11 22:58:54 +04:00
$permissions = OCP\PERMISSION_READ | OCP\PERMISSION_UPDATE | OCP\PERMISSION_SHARE ;
2012-09-10 02:29:47 +04:00
if ( $itemType == 'folder' ) {
2012-11-11 22:58:54 +04:00
$permissions |= OCP\PERMISSION_CREATE ;
2012-09-10 02:29:47 +04:00
}
}
$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 ;
}
} 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' ];
}
2014-01-21 14:32:30 +04:00
OCP\JSON :: checkUserExists ( $row [ 'uid_owner' ]);
2012-09-10 02:29:47 +04:00
OC_User :: setUserId ( $row [ 'uid_owner' ]);
2012-09-25 13:47:45 +04:00
//we need to setup the filesystem for the user, otherwise OC_FileSystem::getRoot will fail and break
OC_Util :: setupFS ( $row [ 'uid_owner' ]);
2012-09-22 01:25:57 +04:00
try {
OCP\Share :: shareItem ( $itemType , $itemSource , $shareType , $shareWith , $permissions );
}
catch ( Exception $e ) {
$update_error = true ;
2013-02-15 01:37:49 +04:00
OCP\Util :: writeLog ( 'files_sharing' ,
'Upgrade Routine: Skipping sharing "' . $row [ 'source' ] . '" to "' . $shareWith
. '" (error is "' . $e -> getMessage () . '")' ,
OCP\Util :: WARN );
2012-09-22 01:25:57 +04:00
}
2012-09-25 13:47:45 +04:00
OC_Util :: tearDownFS ();
2012-08-29 10:42:49 +04:00
}
2012-07-13 17:17:36 +04:00
}
2012-10-18 20:44:03 +04:00
OC_User :: setUserId ( null );
2012-09-22 01:25:57 +04:00
if ( $update_error ) {
2012-09-26 14:27:34 +04:00
OCP\Util :: writeLog ( 'files_sharing' , 'There were some problems upgrading the sharing of files' , OCP\Util :: ERROR );
2012-09-22 01:25:57 +04:00
}
2012-09-10 02:29:47 +04:00
// NOTE: Let's drop the table after more testing
// $query = OCP\DB::prepare('DROP TABLE `*PREFIX*sharing`');
// $query->execute();
2012-09-22 01:25:57 +04:00
}
2013-10-07 12:59:09 +04:00
// clean up oc_share table from files which are no longer exists
2013-10-08 17:16:33 +04:00
if ( version_compare ( $installedVersion , '0.3.5' , '<' )) {
2013-10-07 12:59:09 +04:00
// get all shares where the original file no longer exists
2013-10-08 17:45:52 +04:00
$findShares = \OC_DB :: prepare ( 'SELECT `file_source` FROM `*PREFIX*share` LEFT JOIN `*PREFIX*filecache` ON `file_source` = `*PREFIX*filecache`.`fileid` WHERE `*PREFIX*filecache`.`fileid` IS NULL AND `*PREFIX*share`.`item_type` IN (\'file\', \'folder\')' );
2013-10-07 12:59:09 +04:00
$sharesFound = $findShares -> execute ( array ()) -> fetchAll ();
// delete those shares from the oc_share table
if ( is_array ( $sharesFound ) && ! empty ( $sharesFound )) {
$delArray = array ();
foreach ( $sharesFound as $share ) {
$delArray [] = $share [ 'file_source' ];
}
$removeShares = \OC_DB :: prepare ( 'DELETE FROM `*PREFIX*share` WHERE `file_source` IN (?)' );
$result = $removeShares -> execute ( array ( implode ( ',' , $delArray )));
2012-10-08 01:34:21 +04:00
}
2012-10-27 01:05:02 +04:00
}