mirror of
https://github.com/nextcloud/server.git
synced 2026-03-25 20:03:23 -04:00
move zip creation inside OC_Migrate
This commit is contained in:
parent
5a50144a16
commit
a310a81053
3 changed files with 111 additions and 83 deletions
|
|
@ -24,72 +24,27 @@
|
|||
*/
|
||||
OC_Util::checkAppEnabled('user_migrate');
|
||||
|
||||
define('DS', '/');
|
||||
|
||||
if (isset($_POST['user_export'])) {
|
||||
|
||||
// Setup the export
|
||||
$zip = new ZipArchive();
|
||||
$tmp = get_temp_dir();
|
||||
$user = OC_User::getUser();
|
||||
|
||||
$userdatadir = OC_Config::getValue( 'datadirectory' ) . '/' . $user;
|
||||
$filename = $userdatadir . '/owncloud_export_' . $user . '_' . date("y-m-d_H-i-s") . ".zip";
|
||||
OC_Log::write('user_migrate',"Creating export file at: " . $filename,OC_Log::INFO);
|
||||
if ($zip->open($filename, ZIPARCHIVE::CREATE) !== TRUE) {
|
||||
exit("Cannot open <$filename>\n");
|
||||
}
|
||||
|
||||
// Migrate the app info
|
||||
$info = json_encode( OC_Migrate::export( $user ) );
|
||||
$infofile = $userdatadir . '/exportinfo.json';
|
||||
file_put_contents( $infofile, $info );
|
||||
|
||||
// Add the data dir (which includes migration.db and exportinfo.json)
|
||||
zipAddDir( $userdatadir, $zip, true, "/" );
|
||||
|
||||
// Save the zip
|
||||
$zip->close();
|
||||
|
||||
// Send the zip
|
||||
header("Content-Type: application/zip");
|
||||
header("Content-Disposition: attachment; filename=" . basename($filename));
|
||||
header("Content-Length: " . filesize($filename));
|
||||
@ob_end_clean();
|
||||
readfile($filename);
|
||||
// Cleanup
|
||||
unlink($filename);
|
||||
OC_Migrate::cleanUp();
|
||||
|
||||
// Create the export zip
|
||||
$user = OC_User::getUser();
|
||||
$path = OC_Config::getValue( 'datadirectory' ) . '/' . OC_User::getUser() . '/';
|
||||
if( OC_Migrate::createExportFile( $user, $path ) ){
|
||||
// Download it then
|
||||
header("Content-Type: application/zip");
|
||||
header("Content-Disposition: attachment; filename=" . basename($path));
|
||||
header("Content-Length: " . filesize($path));
|
||||
@ob_end_clean();
|
||||
readfile($path);
|
||||
OC_Migrate::cleanUp();
|
||||
} else {
|
||||
die('error');
|
||||
}
|
||||
} if( isset( $_POST['user_import'] ) ){
|
||||
// TODO
|
||||
}else {
|
||||
|
||||
// fill template
|
||||
$tmpl = new OC_Template('user_migrate', 'settings');
|
||||
return $tmpl->fetchPage();
|
||||
|
||||
$tmpl = new OC_Template('user_migrate', 'settings');
|
||||
return $tmpl->fetchPage();
|
||||
}
|
||||
|
||||
function zipAddDir($dir, $zip, $recursive=true, $internalDir='') {
|
||||
$dirname = basename($dir);
|
||||
$zip->addEmptyDir($internalDir . $dirname);
|
||||
$internalDir.=$dirname.='/';
|
||||
|
||||
if ($dirhandle = opendir($dir)) {
|
||||
while (false !== ( $file = readdir($dirhandle))) {
|
||||
|
||||
if (( $file != '.' ) && ( $file != '..' )) {
|
||||
|
||||
if (is_dir($dir . '/' . $file) && $recursive) {
|
||||
zipAddDir($dir . '/' . $file, $zip, $recursive, $internalDir);
|
||||
} elseif (is_file($dir . '/' . $file)) {
|
||||
$zip->addFile($dir . '/' . $file, $internalDir . $file);
|
||||
}
|
||||
}
|
||||
}
|
||||
closedir($dirhandle);
|
||||
} else {
|
||||
OC_Log::write('user_migrate',"Was not able to open directory: " . $dir,OC_Log::ERROR);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
112
lib/migrate.php
112
lib/migrate.php
|
|
@ -36,6 +36,10 @@ class OC_Migrate{
|
|||
static private $uid=false;
|
||||
// Path to the sqlite db
|
||||
static private $dbpath=false;
|
||||
// Holds the ZipArchive object
|
||||
static private $zip=false;
|
||||
// String path to export
|
||||
static private $zippath=false;
|
||||
|
||||
/**
|
||||
* register a new migration provider
|
||||
|
|
@ -47,24 +51,10 @@ class OC_Migrate{
|
|||
|
||||
/**
|
||||
* @breif creates a migration.db in the users data dir with their app data in
|
||||
* @param @uid string userid of the user to export for
|
||||
* @return bool whether operation was successfull
|
||||
*/
|
||||
public static function export( $uid ){
|
||||
|
||||
// Only export database users, otherwise we get chaos
|
||||
if(!OC_User_Database::userExists( $uid )){
|
||||
return false;
|
||||
}
|
||||
|
||||
self::$uid = $uid;
|
||||
|
||||
if(empty(self::$uid)){
|
||||
OC_Log::write('migration','Invalid uid passed',OC_Log::FATAL);
|
||||
return false;
|
||||
exit();
|
||||
}
|
||||
|
||||
private static function exportAppData( ){
|
||||
|
||||
self::connectDB();
|
||||
$ok = true;
|
||||
$return = array();
|
||||
|
|
@ -100,7 +90,7 @@ class OC_Migrate{
|
|||
|
||||
// Run the import function?
|
||||
if( !$failed ){
|
||||
$return['app'][$provider->id]['success'] = $provider->export( $uid );
|
||||
$return['app'][$provider->id]['success'] = $provider->export( self::$uid );
|
||||
} else {
|
||||
$return['app'][$provider->id]['success'] = false;
|
||||
$return['app'][$provider->id]['message'] = 'failed to create the app tables';
|
||||
|
|
@ -114,13 +104,95 @@ class OC_Migrate{
|
|||
|
||||
|
||||
// Add some general info to the return array
|
||||
$return['migrateinfo']['uid'] = $uid;
|
||||
$return['migrateinfo']['uid'] = self::$uid;
|
||||
$return['migrateinfo']['ocversion'] = OC_Util::getVersionString();
|
||||
|
||||
return $return;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @breif creates a zip user export
|
||||
* @param $uid string user id of the user to export
|
||||
* @param $path string path to folder to create file in (with trailing slash)
|
||||
* @return bool success
|
||||
*/
|
||||
static public function createExportFile( $uid, $path ){
|
||||
// Is a directory
|
||||
if( !is_dir( $path ) ){
|
||||
OC_Log::write('migration', 'Path supplied to createExportFile() is not a directory', OC_Log::ERROR);
|
||||
return false;
|
||||
exit();
|
||||
}
|
||||
// Is writeable
|
||||
if( !is_writeable( $path ) ){
|
||||
OC_Log::write('migration', 'Path supplied to createExportFile() is not writeable', OC_Log::ERROR);
|
||||
return false;
|
||||
exit();
|
||||
}
|
||||
// Is a database user?
|
||||
if( !OC_User_Database::userExists( $uid ) ){
|
||||
OC_Log::write('migration', 'User: '.$uid.' is not in the database and so cannot be exported.', OC_Log::ERROR);
|
||||
return false;
|
||||
exit();
|
||||
}
|
||||
|
||||
self::$uid = $uid;
|
||||
self::$zip = new ZipArchive;
|
||||
|
||||
// Get some info
|
||||
$userdatadir = OC_Config::getValue( 'datadirectory' ) . '/' . self::$uid;
|
||||
self::$zippath = $path . 'owncloud_export_' . self::$uid . '_' . date("y-m-d_H-i-s") . ".zip";
|
||||
if ( self::$zip->open( self::$zippath, ZIPARCHIVE::CREATE ) !== TRUE ) {
|
||||
OC_Log::write('migration','Cannot create a zip file at: '.self::$zippath, OC_Log::ERROR);
|
||||
return false;
|
||||
exit();
|
||||
}
|
||||
|
||||
// Export the app info
|
||||
$info = json_encode( self::exportAppData() );
|
||||
file_put_contents( $userdatadir . '/exportinfo.json', $info );
|
||||
|
||||
// Add the data dir (which includes migration.db and exportinfo.json)
|
||||
self::addDirToZip( $userdatadir, '/' );
|
||||
|
||||
// All done!
|
||||
if( !self::$zip->close() ){
|
||||
OC_Log::write('migration', 'Failed to save the zip with error: '.self::$zip->getStatusString(), OC_Log::ERROR);
|
||||
return false;
|
||||
exit();
|
||||
} else {
|
||||
OC_Log::write('migration', 'Created export file for: '.self::$uid, OC_Log::INFO);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @breif adds a directory to the zip object
|
||||
* @return void
|
||||
*/
|
||||
static private function addDirToZip( $dir, $recursive=true, $internalDir='' ){
|
||||
$dirname = basename($dir);
|
||||
self::$zip->addEmptyDir($internalDir . $dirname);
|
||||
$internalDir.=$dirname.='/';
|
||||
if ($dirhandle = opendir($dir)) {
|
||||
while (false !== ( $file = readdir($dirhandle))) {
|
||||
if (( $file != '.' ) && ( $file != '..' )) {
|
||||
if (is_dir($dir . '/' . $file) && $recursive) {
|
||||
self::addDirToZip($dir . '/' . $file, $recursive, $internalDir);
|
||||
} elseif (is_file($dir . '/' . $file)) {
|
||||
self::$zip->addFile($dir . '/' . $file, $internalDir . $file);
|
||||
}
|
||||
}
|
||||
}
|
||||
closedir($dirhandle);
|
||||
} else {
|
||||
OC_Log::write('migration',"Was not able to open directory: " . $dir,OC_Log::ERROR);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @breif returns an array of apps that support migration
|
||||
* @return array
|
||||
|
|
@ -143,7 +215,7 @@ class OC_Migrate{
|
|||
* @param $uid optional uid to use
|
||||
* @return bool if the import succedded
|
||||
*/
|
||||
public static function import( $db, $migrateinfo, $uid=false ){
|
||||
public static function importAppData( $db, $migrateinfo, $uid=false ){
|
||||
|
||||
if(!self::$uid){
|
||||
OC_Log::write('migration','Tried to import without passing a uid',OC_Log::FATAL);
|
||||
|
|
@ -467,6 +539,8 @@ class OC_Migrate{
|
|||
unlink( $userdatadir . '/migration.db' );
|
||||
// Remove exportinfo.json
|
||||
unlink( $userdatadir . '/exportinfo.json' );
|
||||
// Remove the zip
|
||||
unlink(self::$zippath);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -20,9 +20,8 @@ abstract class OC_Migrate_Provider{
|
|||
|
||||
/**
|
||||
* @breif imports data for the app
|
||||
* @param $data array of data. eg: array('info'=> APPINFO, 'data'=>APPDATA ARRAY)
|
||||
* @param $info array of info of the source install
|
||||
* @param $info array of info including exportinfo.json
|
||||
* @return void
|
||||
*/
|
||||
abstract function import($data,$uid);
|
||||
abstract function import( $info );
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue