diff -r 32102edaa81b -r c7c0fbc09788 web/wp-content/plugins/duplicator/inc/actions.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/wp-content/plugins/duplicator/inc/actions.php Mon Dec 03 16:30:36 2012 -0800 @@ -0,0 +1,339 @@ +done + */ +function duplicator_create() { + + global $wp_version; + global $wpdb; + global $current_user; + + $packname = isset($_POST['package_name']) ? trim($_POST['package_name']) : null; + + $secure_token = uniqid() . mt_rand(1000, 9999); + $uniquename = "{$secure_token}_{$packname}"; + foreach(glob(DUPLICATOR_SSDIR_PATH . '/*.log') as $log_file){ + @unlink($log_file); + } + + $logfilename = "{$uniquename}.log"; + $GLOBALS['duplicator_package_log_handle'] = @fopen(DUPLICATOR_SSDIR_PATH . "/{$logfilename}", "c+"); + + duplicator_log("*********************************************************"); + duplicator_log("PACKAGE-LOG: "); + duplicator_log("*********************************************************"); + duplicator_log("duplicator: " . DUPLICATOR_VERSION); + duplicator_log("wordpress: {$wp_version}"); + duplicator_log("php: " . phpversion()); + duplicator_log("php sapi: " . php_sapi_name()); + duplicator_log("server: {$_SERVER['SERVER_SOFTWARE']}"); + duplicator_log("browser: {$_SERVER['HTTP_USER_AGENT']}"); + duplicator_log("package name: {$packname}"); + + if($packname) { + + $max_time = @ini_set("max_execution_time", $GLOBALS['duplicator_opts']['max_time']); + $max_memory = @ini_set('memory_limit', $GLOBALS['duplicator_opts']['max_memory']); + $max_time = ($max_time === false) ? "Unabled to set max_execution_time" : "from={$max_time} to={$GLOBALS['duplicator_opts']['max_time']}"; + $max_memory = ($max_memory === false) ? "Unabled to set memory_limit" : "from={$max_memory} to={$GLOBALS['duplicator_opts']['max_memory']}"; + + @set_time_limit(0); + duplicator_log("max_time: {$max_time}"); + duplicator_log("max_memory: {$max_memory}"); + + $zipfilename = "{$uniquename}_package.zip"; + $sqlfilename = "{$uniquename}_database.sql"; + $exefilename = "{$uniquename}_installer.php"; + + $zipfilepath = DUPLICATOR_SSDIR_PATH . "/{$zipfilename}"; + $sqlfilepath = DUPLICATOR_SSDIR_PATH . "/{$sqlfilename}"; + $exefilepath = DUPLICATOR_SSDIR_PATH . "/{$exefilename}"; + $zipsize = 0; + + duplicator_log("mysql wait_timeout: {$GLOBALS['duplicator_opts']['max_time']}"); + $wpdb->query("SET session wait_timeout = {$GLOBALS['duplicator_opts']['max_time']}"); + + + duplicator_log("*********************************************************"); + duplicator_log("SQL SCRIPT"); + duplicator_log("*********************************************************"); + duplicator_create_dbscript($sqlfilepath); + + + //CREATE ZIP ARCHIVE + duplicator_log("*********************************************************"); + duplicator_log("ZIP ARCHIVE"); + duplicator_log("*********************************************************"); + + $zip = new Duplicator_Zip($zipfilepath, rtrim(DUPLICATOR_WPROOTPATH, '/'), $sqlfilepath); + $zipsize = filesize($zipfilepath); + + ($zipsize == false) + ? duplicator_log("log:act__create=>warning: zipsize is unknown.") + : duplicator_log("log:act__create=>zip file size is: " . duplicator_bytesize($zipsize)); + + duplicator_log("log:act__create=>zip archive complete.", 2); + + //Serlized settings + $settings = array('plugin_version' => DUPLICATOR_VERSION, + 'type' => 'Manual'); + $serialized_settings = serialize($settings); + + //Record archive info to database + $results = $wpdb->insert($wpdb->prefix . "duplicator", + array( + 'token' => $secure_token, + 'packname' => $packname, + 'zipname' => $zipfilename, + 'zipsize' => $zipsize, + 'created' => current_time('mysql', get_option('gmt_offset')), + 'owner' => $current_user->user_login, + 'settings' => "{$serialized_settings}") + ); + if ($wpdb->insert_id) { + duplicator_log("log:act__create=>recorded archieve id: " . $wpdb->insert_id); + } else { + duplicator_log("log:act__create=>unable to record to database."); + } + $wpdb->flush(); + + + //UPDATE INSTALL FILE + duplicator_log("*********************************************************"); + duplicator_log("UPDATE INSTALLER FILE"); + duplicator_log("*********************************************************"); + duplicator_create_installerFile($uniquename); + + //SEND EMAIL + //TODO: Send only SQL File via mail. Zip files can get too large + if( $GLOBALS['duplicator_opts']['email-me'] == "1" ) { + duplicator_log("log:act__create=>email started"); + $status = ($zipsize) ? 'Success' : 'Failure'; + $attachments = ""; //array(DUPLICATOR_SSDIR_PATH . '/' . $packname .'.zip'); + $headers = 'From: Duplicator Plugin ' ."\r\n"; + $subject = "Package '{$packname}' completed"; + $message = "Run Status: {$status}\n\rSite Name: " . get_bloginfo('name') . "\n\rPackage Name: {$packname} \n\rCompleted at: " .current_time('mysql',get_option('gmt_offset')) ; + wp_mail($current_user->user_email, $subject, $message, $headers, $attachments); + duplicator_log("log:act__create=>sent email to: {$current_user->user_email}"); + $other_emails = @preg_split("/[,;]/", $GLOBALS['duplicator_opts']['email_others']); + if (count($other_emails)) { + wp_mail($other_emails, $subject, $message, $headers, $attachments); + duplicator_log("log:act__create=>other emails sent: {$GLOBALS['duplicator_opts']['email_others']}"); + } + duplicator_log("log:act__create=>email finished"); + } + + } + + duplicator_log("*********************************************************"); + duplicator_log("DONE PROCESSING => {$packname}"); + duplicator_log("*********************************************************"); + @fclose($GLOBALS['duplicator_package_log_handle']); + die(); +} + + +/** + * DUPLICATOR_DELETE + * Deletes the zip file and database record entries for the + * selected ids. Supports 1 to many deletes + * + * @return string A message about the action. + * - see: duplicator_unlink + */ +function duplicator_delete() { + try + { + $uniqueid = isset($_POST['duplicator_delid']) ? trim($_POST['duplicator_delid']) : null; + if ($uniqueid != null) { + $unique_list = explode(",", $uniqueid); + foreach ($unique_list as $id) { + $msg = duplicator_unlink($id); + } + } + die($msg); + } + catch(Exception $e) + { + die("log:fun__delete=>runtime error: " . $e); + } +} + + +/** + * DUPLICATOR_SYSTEM_CHECK + * Check to see if the package already exsits or required files + * are installed. Also check for package size + * + * @return string A message about the action + * - log:act__system_check=>create new package + * - log:act__system_check=>overwrite + */ +function duplicator_system_check() { + global $wpdb; + + @set_time_limit($GLOBALS['duplicator_opts']['max_time']); + duplicator_init_snapshotpath(); + + $json = array(); + + //SYS-100: FILE PERMS + $test = is_readable(DUPLICATOR_WPROOTPATH) + && is_writeable(DUPLICATOR_SSDIR_PATH) + && is_writeable(DUPLICATOR_PLUGIN_PATH . 'files/') + && is_writeable(DUPLICATOR_PLUGIN_PATH . 'files/installer.rescue.php'); + $json['SYS-100'] = ($test) ? 'Pass' : 'Fail'; + + //SYS-101 RESERVED FILE + $phpFile = file_exists(DUPLICATOR_WPROOTPATH . DUPLICATOR_INSTALL_PHP) ? DUPLICATOR_INSTALL_PHP : ""; + $sqlFile = file_exists(DUPLICATOR_WPROOTPATH . DUPLICATOR_INSTALL_SQL) ? DUPLICATOR_INSTALL_SQL : ""; + $logFile = file_exists(DUPLICATOR_WPROOTPATH . DUPLICATOR_INSTALL_LOG) ? DUPLICATOR_INSTALL_LOG : ""; + $test = ! (strlen($phpFile) || strlen($sqlFile ) || strlen($logFile)); + $json['SYS-101'] = ($test) ? 'Pass' : 'Fail'; + + //SYS-102 ZIP-ARCHIVE + $test = class_exists('ZipArchive'); + $json['SYS-102'] = ($test) ? 'Pass' : 'Fail'; + + //SYS-103 SAFE MODE + $test = ini_get('safe_mode');; + $json['SYS-103'] = ! ($test) ? 'Pass' : 'Fail'; + + //SYS-104 MYSQLI SUPPORT + $test = function_exists('mysqli_connect'); + $json['SYS-104'] = ($test) ? 'Pass' : 'Fail'; + + $result = in_array('Fail', $json); + $json['Success'] = ! $result; + + die(json_encode($json)); +} + + +/** + * DUPLICATOR_SYSTEM_DIRECTORY + * Returns the directory size and file count for the root directory minus + * any of the filters + * + * @return json size and file count of directory + */ +function duplicator_system_directory() { + + $json = array(); + $dirInfo = duplicator_dirInfo(rtrim(duplicator_safe_path(DUPLICATOR_WPROOTPATH), '/')); + $dirSizeFormat = duplicator_bytesize($dirInfo['size']) or "0"; + $dirCountFormat = number_format($dirInfo['count']) or "unknown"; + $dirFolderFormat = number_format($dirInfo['folders']) or "unknown"; + + $json['size'] = $dirSizeFormat; + $json['count'] = $dirCountFormat; + $json['folders'] = $dirFolderFormat; + $json['flag'] = $dirInfo['flag']; + + die(json_encode($json)); +} + +/** + * DUPLICATOR_UNLINK + * Removes the package + * + * @param string $file The file name of the file to delete. + * @param string $path The full path and file name of the file to delete + * + * @return string A message about the action + * - log:act__unlink=>removed + * - log:act__unlink=>file not found + */ +function duplicator_unlink($uniqueid) { + try + { + $msg = "log:act__unlink=>file not found"; + if($uniqueid) { + global $wpdb; + $table_name = $wpdb->prefix . 'duplicator'; + if($wpdb->query("DELETE FROM {$table_name} WHERE zipname= '{$uniqueid}_package.zip'" ) != 0) { + $msg = "log:act__unlink=>removed"; + try { + @chmod(duplicator_safe_path(DUPLICATOR_SSDIR_PATH . "/{$uniqueid}_package.zip"), 0644); + @chmod(duplicator_safe_path(DUPLICATOR_SSDIR_PATH . "/{$uniqueid}_database.sql"), 0644); + @unlink(duplicator_safe_path(DUPLICATOR_SSDIR_PATH . "/{$uniqueid}_package.zip")); + @unlink(duplicator_safe_path(DUPLICATOR_SSDIR_PATH . "/{$uniqueid}_database.sql")); + @unlink(duplicator_safe_path(DUPLICATOR_SSDIR_PATH . "/{$uniqueid}_installer.php")); + } + catch(Exception $e) { + error_log(var_dump($e->getMessage())); + } + //Check for Legacy pre 0.3.1 + } else if($wpdb->query("DELETE FROM {$table_name} WHERE zipname= '{$uniqueid}'" ) != 0) { + try { + @chmod(duplicator_safe_path(DUPLICATOR_SSDIR_PATH . "/{$uniqueid}"), 0644); + @unlink(duplicator_safe_path(DUPLICATOR_SSDIR_PATH . "/{$uniqueid}")); + } catch(Exception $e) { + error_log(var_dump($e->getMessage())); + } + } + } + return $msg; + } + catch(Exception $e) + { + die("log:fun__unlink=>runtime error: " . $e); + } +} + + +/** + * DUPLICATOR_SETTINGS + * Saves plugin settings + * + * @return string A message about the action + * - log:act__settings=>saved + */ +function duplicator_settings(){ + + //defaults + add_option('duplicator_options', ''); + + $skip_ext = str_replace(array(' ', '.'), "", $_POST['skip_ext']); + $by_pass_array = explode(";", $_POST['dir_bypass']); + $by_pass_clean = ""; + + foreach ($by_pass_array as $val) { + if (strlen($val) >= 2) { + $by_pass_clean .= duplicator_safe_path(trim(rtrim($val, "/\\"))) . ";"; + } + } + + if (is_numeric($_POST['max_memory'])) { + $maxmem = $_POST['max_memory'] < 256 ? 256 : $_POST['max_memory']; + } else { + $maxmem = 256; + } + + $duplicator_opts = array( + 'dbhost' =>$_POST['dbhost'], + 'dbname' =>$_POST['dbname'], + 'dbuser' =>$_POST['dbuser'], + 'dbiconv' =>$_POST['dbiconv'], + 'nurl' =>rtrim($_POST['nurl'], '/'), + 'email-me' =>$_POST['email-me'], + 'email_others' =>$_POST['email_others'], + 'max_time' =>$_POST['max_time'], + 'max_memory' =>preg_replace('/\D/', '', $maxmem) . 'M', + 'skip_ext' =>str_replace(",", ";", $skip_ext), + 'dir_bypass' =>$by_pass_clean, + 'log_level' =>$_POST['log_level'], + 'rm_snapshot' =>$_POST['rm_snapshot']); + + + update_option('duplicator_options', serialize($duplicator_opts)); + + die("log:act__settings=>saved"); +} +//DO NOT ADD A CARRIAGE RETURN BEYOND THIS POINT (headers issue)!! +?> \ No newline at end of file