From 4d5646a59f813e09455c78d840d0f62397ec60ad Mon Sep 17 00:00:00 2001 From: Tom Needham Date: Tue, 13 Mar 2012 16:21:17 +0000 Subject: [PATCH] Find migrate.php even for disabled apps. Improve ui for user and admin migrations --- apps/admin_export/settings.php | 17 ++--- apps/bookmarks/appinfo/app.php | 4 -- apps/bookmarks/lib/migrate.php | 1 + apps/user_migrate/settings.php | 91 ++++++++++++++---------- apps/user_migrate/templates/settings.php | 15 ++-- lib/migrate.php | 49 ++++++------- 6 files changed, 99 insertions(+), 78 deletions(-) diff --git a/apps/admin_export/settings.php b/apps/admin_export/settings.php index 5584181fbb9..b60557f3503 100644 --- a/apps/admin_export/settings.php +++ b/apps/admin_export/settings.php @@ -74,15 +74,16 @@ if (isset($_POST['admin_export'])) { } if (isset($_POST['user_files'])) { - // needs to handle data outside of the default data dir. - // adding user files - $zip->addFile($root . '/data/.htaccess', "data/.htaccess"); - $zip->addFile($root . '/data/index.html', "data/index.html"); - foreach (OC_User::getUsers() as $i) { - OC_Log::write('admin_export',"Adding owncloud user files of $i to export",OC_Log::INFO); - zipAddDir($root . "data/" . $i, $zip, true, "/data/"); - } + // needs to handle data outside of the default data dir. + // adding user files + $zip->addFile($root . '/data/.htaccess', "data/.htaccess"); + $zip->addFile($root . '/data/index.html', "data/index.html"); + foreach (OC_User::getUsers() as $i) { + OC_Log::write('admin_export',"Adding owncloud user files of $i to export",OC_Log::INFO); + zipAddDir($root . "data/" . $i, $zip, true, "/data/"); + } } + $zip->close(); header("Content-Type: application/zip"); header("Content-Disposition: attachment; filename=" . basename($filename)); diff --git a/apps/bookmarks/appinfo/app.php b/apps/bookmarks/appinfo/app.php index 13d76e08179..b9c308ca053 100644 --- a/apps/bookmarks/appinfo/app.php +++ b/apps/bookmarks/appinfo/app.php @@ -18,8 +18,4 @@ OC_App::addNavigationEntry( array( 'id' => 'bookmarks_index', 'order' => 70, 'hr OC_App::registerPersonal('bookmarks', 'settings'); OC_Util::addScript('bookmarks','bookmarksearch'); -// Include the migration provider - -require_once('apps/bookmarks/lib/migrate.php'); - OC_Search::registerProvider('OC_Search_Provider_Bookmarks'); diff --git a/apps/bookmarks/lib/migrate.php b/apps/bookmarks/lib/migrate.php index 451699ec15f..8387f706038 100644 --- a/apps/bookmarks/lib/migrate.php +++ b/apps/bookmarks/lib/migrate.php @@ -54,4 +54,5 @@ class OC_Migrate_Provider_Bookmarks extends OC_Migrate_Provider{ } +// Load the provider new OC_Migrate_Provider_Bookmarks( 'bookmarks' ); \ No newline at end of file diff --git a/apps/user_migrate/settings.php b/apps/user_migrate/settings.php index c1121f2ddf5..3b82e148b5c 100644 --- a/apps/user_migrate/settings.php +++ b/apps/user_migrate/settings.php @@ -3,6 +3,8 @@ /** * ownCloud - user_migrate * + * @author Thomas Schmidt + * @copyright 2011 Thomas Schmidt tom@opensuse.org * @author Tom Needham * @copyright 2012 Tom Needham tom@owncloud.com * @@ -22,52 +24,67 @@ */ OC_Util::checkAppEnabled('user_migrate'); +define('DS', '/'); -if (isset($_POST['user_migrate'])) { - // Looks like they want to migrate - $root = OC::$SERVERROOT . "/"; - $user = OC_User::getUser(); +if (isset($_POST['user_export'])) { + + // Setup the export $zip = new ZipArchive(); - $tempdir = get_temp_dir(); - $filename = $tempdir . "/" . $user . "_export_" . date("y-m-d_H-i-s") . ".zip"; - OC_Log::write('user_migrate',"Creating user export file at: " . $filename,OC_Log::INFO); - if ($zip->open($filename, ZIPARCHIVE::CREATE) !== TRUE) { - exit("Cannot open <$filename>\n"); + $tmp = get_temp_dir(); + $user = OC_User::getUser(); + // Create owncoud dir + if( !file_exists( $tmp . '/owncloud' ) ){ + if( !mkdir( $tmp . '/owncloud' ) ){ + die('Failed to create the owncloud tmp directory'); + } } - - // Does the user want to include their files? - if (isset($_POST['user_files'])) { - // needs to handle data outside of the default data dir. - // adding user files - OC_Log::write('user_migrate',"Adding owncloud user files of $user to export",OC_Log::INFO); - zipAddDir($root . "data/" . $user, $zip, true, "files/"); + // Create the export dir + $exportdir = $tmp . '/owncloud' . '/export_' . $user . '_' . date("y-m-d_H-i-s"); + if( !file_exists( $exportdir ) ){ + if( !mkdir( $exportdir ) ){ + die('Failed to create the owncloud export directory'); + } } - - // Does the user want their app data? - if (isset($_POST['user_appdata'])) { - // adding owncloud system files - OC_Log::write('user_migrate',"Adding app data to user export file",OC_Log::INFO); - // Call to OC_Migrate for the xml file. - - // Create migration.db - OC_Migrate::export(OC_User::getUser()); - // Add export db to zip - $zip->addFile($root.'data/'.$user.'/migration.db', "migration.db"); - + $filename = $exportdir . '/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 = OC_Migrate::export( $user ); + $infofile = $exportdir . '/exportinfo.json'; + if( !file_put_contents( $infofile, $info ) ){ + die('Failed to save the export info'); + } + $zip->addFile( $infofile, "exportinfo.json"); + $zip->addFile(OC::$SERVERROOT . '/data/' . $user . '/migration.db', "migration.db"); + // Add the data dir + zipAddDir(OC::$SERVERROOT . "/data/" . $user, $zip, true, "files/"); + + // Save the zip $zip->close(); - - //header("Content-Type: application/zip"); - //header("Content-Disposition: attachment; filename=" . basename($filename)); - //header("Content-Length: " . filesize($filename)); - //readfile($filename); - //unlink($filename); -} else { -// fill template + // 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); + unlink($infofile); + rmdir($exportdir); + +} if( isset( $_POST['user_import'] ) ){ + // TODO +}else { + + // fill template $tmpl = new OC_Template('user_migrate', 'settings'); return $tmpl->fetchPage(); + } function zipAddDir($dir, $zip, $recursive=true, $internalDir='') { @@ -89,6 +106,6 @@ function zipAddDir($dir, $zip, $recursive=true, $internalDir='') { } closedir($dirhandle); } else { - OC_Log::write('admin_export',"Was not able to open directory: " . $dir,OC_Log::ERROR); + OC_Log::write('user_migrate',"Was not able to open directory: " . $dir,OC_Log::ERROR); } } diff --git a/apps/user_migrate/templates/settings.php b/apps/user_migrate/templates/settings.php index ece8f70e064..59a27a926d8 100644 --- a/apps/user_migrate/templates/settings.php +++ b/apps/user_migrate/templates/settings.php @@ -1,12 +1,17 @@
t('Export your user account');?> -

t('This will create a compressed file that contains the data of owncloud account. - Please choose which components should be included:');?> +

t('This will create a compressed file that contains your ownCloud account.');?>

-


-
+ +

+
+
+
+ t('Import user account');?> +

+

- +
diff --git a/lib/migrate.php b/lib/migrate.php index 075358c72b7..88c0e7cfc28 100644 --- a/lib/migrate.php +++ b/lib/migrate.php @@ -26,11 +26,16 @@ */ class OC_Migrate{ + // Holds the db object static private $MDB2=false; + // Array of OC_Migration_Provider objects static private $providers=array(); + // Schema db object static private $schema=false; + // User id of the user to import/export static private $uid=false; - static private $database=false; + // Path to the sqlite db + static private $dbpath=false; /** * register a new migration provider @@ -64,9 +69,18 @@ class OC_Migrate{ $ok = true; $return = array(); + // Find the providers + $apps = OC_App::getAllApps(); + + foreach($apps as $app){ + $path = OC::$SERVERROOT . '/apps/' . $app . '/lib/migrate.php'; + if( file_exists( $path ) ){ + include( $path ); + } + } + // Foreach provider foreach( self::$providers as $provider ){ - $failed = false; // Does this app use the database? @@ -110,7 +124,7 @@ class OC_Migrate{ /** * @breif imports a new user * @param $db string path to migration.db - * @param $migrateinfo string path to the migration info json file + * @param $migrateinfo array of migration ino * @param $uid optional uid to use * @return bool if the import succedded */ @@ -135,27 +149,14 @@ class OC_Migrate{ exit(); } - // Load the json info - if( file_exists( $migrateinfo ) ){ - - } else { - OC_Log::write( 'migration', 'Migration information file not found at: '.$migrateinfo, OC_Log::FATAL ); + if( !is_array( $migrateinfo ) ){ + OC_Log::write('migration','$migrateinfo is not an array', OC_Log::FATAL); return false; exit(); } - // Process migration info - $info = file_get_contents( $migrateinfo ); - $info = json_decode( $info ); - // Set the user id - self::$uid = !$uid : $info['migrateinfo']['uid'] ? $uid; - - // Create the user - if(!self::createUser($uid, $hash)){ - return false; - exit(); - } + self::$uid = $info['migrateinfo']['uid']; $apps = $info['apps']; @@ -177,7 +178,7 @@ class OC_Migrate{ // @breif connects to migration.db, or creates if not found // @param $db optional path to migration.db, defaults to user data dir // @return bool whether the operation was successful - private static function connectDB( $db=null ){ + private static function connectDB( $dbpath=null ){ OC_Log::write('migration','connecting to migration.db for user: '.self::$uid,OC_Log::INFO); // Fail if no user is set if(!self::$uid){ @@ -188,10 +189,10 @@ class OC_Migrate{ if(!self::$MDB2){ require_once('MDB2.php'); - self::$database = !is_null( $db ) ? $db : $datadir.'/'.self::$uid.'/migration.db'; - $datadir = OC_Config::getValue( "datadirectory", OC::$SERVERROOT."/data" ); + self::$dbpath = $datadir.'/'.self::$uid.'/migration.db';//!is_null( $dbpath ) ? $dbpath : $datadir.'/'.self::$uid.'/migration.db'; + // Prepare options array $options = array( 'portability' => MDB2_PORTABILITY_ALL & (!MDB2_PORTABILITY_FIX_CASE), @@ -202,10 +203,10 @@ class OC_Migrate{ ); $dsn = array( 'phptype' => 'sqlite3', - 'database' => self::$database, + 'database' => self::$dbpath, 'mode' => '0644' ); - + // Try to establish connection self::$MDB2 = MDB2::factory( $dsn, $options ); // Die if we could not connect -- 2.39.5