Version Description
- WP 3.5 compatibility
- Backup system improved
- Dropbox upload 500 error fixed
Download this release
Release Info
Developer | infinitewp |
Plugin | InfiniteWP Client |
Version | 1.1.5 |
Comparing to | |
See all releases |
Code changes from version 1.1.4 to 1.1.5
- backup.class.php +176 -152
- core.class.php +3 -3
- helper.class.php +1 -1
- init.php +17 -4
- lib/dropbox.oauth.php +0 -1133
- lib/dropbox.php +283 -0
- plugins/cleanup/cleanup.php +8 -8
- readme.txt +6 -1
- stats.class.php +1 -1
backup.class.php
CHANGED
@@ -172,7 +172,7 @@ if (is_array($params['account_info'])) { //only if sends from IWP Admin Panel fi
|
|
172 |
}
|
173 |
}
|
174 |
|
175 |
-
if ($time) { //set next result time before backup
|
176 |
if (is_array($before[$task_name]['task_results'])) {
|
177 |
$before[$task_name]['task_results'] = array_values($before[$task_name]['task_results']);
|
178 |
}
|
@@ -316,7 +316,7 @@ function delete_task_now($task_name){
|
|
316 |
|
317 |
function backup($args, $task_name = false)
|
318 |
{
|
319 |
-
|
320 |
return false;
|
321 |
|
322 |
extract($args); //extract settings
|
@@ -325,7 +325,11 @@ function delete_task_now($task_name){
|
|
325 |
$this->set_memory();
|
326 |
|
327 |
//Remove old backup(s)
|
328 |
-
$this->remove_old_backups($task_name);
|
|
|
|
|
|
|
|
|
329 |
|
330 |
$new_file_path = IWP_BACKUP_DIR;
|
331 |
|
@@ -378,39 +382,38 @@ function delete_task_now($task_name){
|
|
378 |
ob_start();
|
379 |
$result = $this->iwp_mmb_exec($command);
|
380 |
ob_get_clean();
|
|
|
381 |
/*zip_backup_db */
|
382 |
if(!$result){
|
383 |
$zip_archive_db_result = false;
|
384 |
if (class_exists("ZipArchive")) {
|
385 |
$this->_log("DB zip, fallback to ZipArchive");
|
386 |
$zip_archive_db_result = $this->zip_archive_backup_db($task_name, $db_result, $backup_file);
|
|
|
387 |
}
|
388 |
|
389 |
if (!$zip_archive_db_result) {
|
|
|
390 |
// fallback to pclzip
|
391 |
define('PCLZIP_TEMPORARY_DIR', IWP_BACKUP_DIR . '/');
|
392 |
//require_once ABSPATH . '/wp-admin/includes/class-pclzip.php';
|
393 |
require_once $GLOBALS['iwp_mmb_plugin_dir'].'/pclzip.class.php';
|
394 |
$archive = new IWPPclZip($backup_file);
|
395 |
-
|
396 |
-
$result = $archive->add($db_result, PCLZIP_OPT_REMOVE_PATH, IWP_BACKUP_DIR, PCLZIP_OPT_NO_COMPRESSION);
|
397 |
-
|
398 |
-
} else {
|
399 |
-
$result = $archive->add($db_result, PCLZIP_OPT_REMOVE_PATH, IWP_BACKUP_DIR);
|
400 |
-
}*/
|
401 |
if($fail_safe_files && $disable_comp){
|
402 |
-
$result = $archive->add(
|
403 |
}
|
404 |
elseif(!$fail_safe_files && $disable_comp){
|
405 |
-
$result = $archive->add(
|
406 |
}
|
407 |
elseif($fail_safe_files && !$disable_comp){
|
408 |
-
$result = $archive->add(
|
409 |
}
|
410 |
else{
|
411 |
-
$result = $archive->add(
|
412 |
}
|
413 |
@unlink($db_result);
|
|
|
414 |
@rmdir(IWP_DB_DIR);
|
415 |
if (!$result) {
|
416 |
return array(
|
@@ -421,12 +424,13 @@ function delete_task_now($task_name){
|
|
421 |
}
|
422 |
|
423 |
@unlink($db_result);
|
|
|
424 |
@rmdir(IWP_DB_DIR);
|
425 |
-
if (!$result) {
|
426 |
return array(
|
427 |
'error' => 'Failed to zip database.'
|
428 |
);
|
429 |
-
}
|
430 |
$this->update_status($task_name, $this->statuses['db_zip'], true);
|
431 |
}
|
432 |
} elseif (trim($what) == 'full') {
|
@@ -566,7 +570,8 @@ if (isset($account_info['iwp_ftp']) && !empty($account_info['iwp_ftp'])) {
|
|
566 |
|
567 |
function backup_full($task_name, $backup_file, $exclude = array(), $include = array())
|
568 |
{
|
569 |
-
|
|
|
570 |
$sys = substr(PHP_OS, 0, 3);
|
571 |
|
572 |
$this->update_status($task_name, $this->statuses['db_dump']);
|
@@ -597,6 +602,7 @@ if (isset($account_info['iwp_ftp']) && !empty($account_info['iwp_ftp'])) {
|
|
597 |
ob_start();
|
598 |
$result = $this->iwp_mmb_exec($command);
|
599 |
ob_get_clean();
|
|
|
600 |
/*zip_backup_db*/
|
601 |
|
602 |
if(!$result){
|
@@ -604,27 +610,30 @@ if (isset($account_info['iwp_ftp']) && !empty($account_info['iwp_ftp'])) {
|
|
604 |
if (class_exists("ZipArchive")) {
|
605 |
$this->_log("DB zip, fallback to ZipArchive");
|
606 |
$zip_archive_db_result = $this->zip_archive_backup_db($task_name, $db_result, $backup_file);
|
|
|
607 |
}
|
608 |
|
609 |
if (!$zip_archive_db_result) {
|
|
|
610 |
define('PCLZIP_TEMPORARY_DIR', IWP_BACKUP_DIR . '/');
|
611 |
require_once $GLOBALS['iwp_mmb_plugin_dir'].'/pclzip.class.php';
|
612 |
$archive = new IWPPclZip($backup_file);
|
613 |
|
614 |
if($fail_safe_files && $disable_comp){
|
615 |
-
$result_db = $archive->add(
|
616 |
}
|
617 |
elseif(!$fail_safe_files && $disable_comp){
|
618 |
-
$result_db = $archive->add(
|
619 |
}
|
620 |
elseif($fail_safe_files && !$disable_comp){
|
621 |
-
$result_db = $archive->add(
|
622 |
}
|
623 |
else{
|
624 |
-
$result_db = $archive->add(
|
625 |
}
|
626 |
|
627 |
@unlink($db_result);
|
|
|
628 |
@rmdir(IWP_DB_DIR);
|
629 |
|
630 |
if (!$result_db) {
|
@@ -636,6 +645,7 @@ if (isset($account_info['iwp_ftp']) && !empty($account_info['iwp_ftp'])) {
|
|
636 |
}
|
637 |
|
638 |
@unlink($db_result);
|
|
|
639 |
@rmdir(IWP_DB_DIR);
|
640 |
|
641 |
$this->update_status($task_name, $this->statuses['db_zip'], true);
|
@@ -694,7 +704,7 @@ if (isset($account_info['iwp_ftp']) && !empty($account_info['iwp_ftp'])) {
|
|
694 |
$exclude_data .= " $data/*.*";
|
695 |
else
|
696 |
$exclude_data .= " '$data/*'";
|
697 |
-
}
|
698 |
|
699 |
//Include paths by default
|
700 |
$add = array(
|
@@ -746,15 +756,18 @@ if (isset($account_info['iwp_ftp']) && !empty($account_info['iwp_ftp'])) {
|
|
746 |
}
|
747 |
}
|
748 |
ob_get_clean();
|
|
|
749 |
if ($result_f && $result_f != 18) {
|
750 |
$zip_archive_result = false;
|
751 |
if (class_exists("ZipArchive")) {
|
752 |
$this->_log("Files zip fallback to ZipArchive");
|
753 |
$zip_archive_result = $this->zip_archive_backup($task_name, $backup_file, $exclude, $include);
|
|
|
754 |
}
|
755 |
|
756 |
|
757 |
if (!$zip_archive_result) { //Try pclZip
|
|
|
758 |
if (!isset($archive)) {
|
759 |
define('PCLZIP_TEMPORARY_DIR', IWP_BACKUP_DIR . '/');
|
760 |
//require_once ABSPATH . '/wp-admin/includes/class-pclzip.php';
|
@@ -830,7 +843,7 @@ if (isset($account_info['iwp_ftp']) && !empty($account_info['iwp_ftp'])) {
|
|
830 |
}
|
831 |
|
832 |
/**
|
833 |
-
* Zipping database dump and index.php in folder
|
834 |
*
|
835 |
* @param string $task_name the name of backup task
|
836 |
* @param string $db_result relative path to database dump file
|
@@ -845,8 +858,8 @@ if (isset($account_info['iwp_ftp']) && !empty($account_info['iwp_ftp'])) {
|
|
845 |
$zip = new ZipArchive();
|
846 |
$result = $zip->open($backup_file, ZIPARCHIVE::OVERWRITE); // Tries to open $backup_file for acrhiving
|
847 |
if ($result === true) {
|
848 |
-
$result = $result && $zip->addFile(
|
849 |
-
$result = $result && $zip->addFile($db_result, "iwp_db/" . basename($db_result)); // Tries to add db dump form
|
850 |
$result = $result && $zip->close(); // Tries to close $backup_file
|
851 |
} else {
|
852 |
$result = false;
|
@@ -933,6 +946,7 @@ if (isset($account_info['iwp_ftp']) && !empty($account_info['iwp_ftp'])) {
|
|
933 |
return array(
|
934 |
'error' => 'Error creating database backup folder (' . $db_folder . '). Make sure you have corrrect write permissions.'
|
935 |
);
|
|
|
936 |
}
|
937 |
|
938 |
$file = $db_folder . DB_NAME . '.sql';
|
@@ -949,6 +963,7 @@ if (isset($account_info['iwp_ftp']) && !empty($account_info['iwp_ftp'])) {
|
|
949 |
ob_start();
|
950 |
$result = $this->iwp_mmb_exec($command);
|
951 |
ob_get_clean();
|
|
|
952 |
|
953 |
if (!$result) { // Fallback to php
|
954 |
$result = $this->backup_db_php($file);
|
@@ -968,6 +983,7 @@ if (isset($account_info['iwp_ftp']) && !empty($account_info['iwp_ftp'])) {
|
|
968 |
global $wpdb;
|
969 |
|
970 |
if(empty($GLOBALS['fail_safe_db'])){
|
|
|
971 |
$fp = fopen( $file, 'w' );
|
972 |
if ( !mysql_ping( $wpdb->dbh ) ) {
|
973 |
mysql_connect( DB_HOST, DB_USER, DB_PASSWORD );
|
@@ -1050,13 +1066,16 @@ if (isset($account_info['iwp_ftp']) && !empty($account_info['iwp_ftp'])) {
|
|
1050 |
unset ($fp);
|
1051 |
}
|
1052 |
else{
|
|
|
1053 |
$tables = $wpdb->get_results('SHOW TABLES', ARRAY_N);
|
1054 |
foreach ($tables as $table) {
|
1055 |
//drop existing table
|
1056 |
$dump_data = "DROP TABLE IF EXISTS $table[0];";
|
|
|
1057 |
//create table
|
1058 |
$create_table = $wpdb->get_row("SHOW CREATE TABLE $table[0]", ARRAY_N);
|
1059 |
-
|
|
|
1060 |
|
1061 |
$count = $wpdb->get_var("SELECT count(*) FROM $table[0]");
|
1062 |
if ($count > 100)
|
@@ -1071,7 +1090,7 @@ if (isset($account_info['iwp_ftp']) && !empty($account_info['iwp_ftp'])) {
|
|
1071 |
if (is_array($rows)) {
|
1072 |
foreach ($rows as $row) {
|
1073 |
//insert single row
|
1074 |
-
|
1075 |
$num_values = count($row);
|
1076 |
$j = 1;
|
1077 |
foreach ($row as $value) {
|
@@ -1082,13 +1101,14 @@ if (isset($account_info['iwp_ftp']) && !empty($account_info['iwp_ftp'])) {
|
|
1082 |
unset($value);
|
1083 |
}
|
1084 |
$dump_data .= ");\n";
|
|
|
1085 |
}
|
1086 |
}
|
1087 |
}
|
1088 |
-
|
|
|
1089 |
|
1090 |
unset($rows);
|
1091 |
-
file_put_contents($file, $dump_data, FILE_APPEND);
|
1092 |
unset($dump_data);
|
1093 |
}
|
1094 |
}
|
@@ -1281,36 +1301,39 @@ elseif (isset($task['task_results'][$result_id]['ftp'])) {
|
|
1281 |
|
1282 |
//Replace options
|
1283 |
$query = "SELECT option_value FROM " . $new_table_prefix . "options WHERE option_name = 'home'";
|
1284 |
-
$old = $wpdb->get_var($
|
1285 |
$old = rtrim($old, "/");
|
1286 |
-
$query = "UPDATE " . $new_table_prefix . "options SET option_value =
|
1287 |
-
$wpdb->query($wpdb->prepare($query));
|
1288 |
-
$query = "UPDATE " . $new_table_prefix . "options SET option_value =
|
1289 |
-
$wpdb->query($wpdb->prepare($query));
|
1290 |
//Replace content urls
|
1291 |
-
|
1292 |
-
|
|
|
|
|
|
|
1293 |
|
1294 |
if (trim($new_password)) {
|
1295 |
$new_password = wp_hash_password($new_password);
|
1296 |
}
|
1297 |
if (!trim($clone_from_url) && !trim($iwp_clone)) {
|
1298 |
if ($new_user && $new_password) {
|
1299 |
-
$query = "UPDATE " . $new_table_prefix . "users SET user_login =
|
1300 |
-
$wpdb->query($wpdb->prepare($query));
|
1301 |
}
|
1302 |
} else {
|
1303 |
|
1304 |
// if ($iwp_clone) {
|
1305 |
if ($admin_email) {
|
1306 |
//Clean Install
|
1307 |
-
$query = "UPDATE " . $new_table_prefix . "options SET option_value =
|
1308 |
-
$wpdb->query($wpdb->prepare($query));
|
1309 |
$query = "SELECT * FROM " . $new_table_prefix . "users LIMIT 1";
|
1310 |
$temp_user = $wpdb->get_row($query);
|
1311 |
if (!empty($temp_user)) {
|
1312 |
-
$query = "UPDATE " . $new_table_prefix . "users SET user_email
|
1313 |
-
$wpdb->query($wpdb->prepare($query));
|
1314 |
}
|
1315 |
|
1316 |
}
|
@@ -1318,8 +1341,8 @@ elseif (isset($task['task_results'][$result_id]['ftp'])) {
|
|
1318 |
|
1319 |
//if ($clone_from_url) {
|
1320 |
if ($new_user && $new_password) {
|
1321 |
-
$query = "UPDATE " . $new_table_prefix . "users SET user_pass =
|
1322 |
-
$wpdb->query($wpdb->prepare($query));
|
1323 |
}
|
1324 |
// }
|
1325 |
|
@@ -1328,14 +1351,14 @@ elseif (isset($task['task_results'][$result_id]['ftp'])) {
|
|
1328 |
if (is_array($clone_options) && !empty($clone_options)) {
|
1329 |
foreach ($clone_options as $key => $option) {
|
1330 |
if (!empty($key)) {
|
1331 |
-
$query = "SELECT option_value FROM " . $new_table_prefix . "options WHERE option_name =
|
1332 |
-
$res = $wpdb->get_var($query);
|
1333 |
if ($res == false) {
|
1334 |
-
$query = "INSERT INTO " . $new_table_prefix . "options (option_value,option_name) VALUES(
|
1335 |
-
$wpdb->query($wpdb->prepare($query));
|
1336 |
} else {
|
1337 |
-
$query = "UPDATE " . $new_table_prefix . "options SET option_value =
|
1338 |
-
$wpdb->query($wpdb->prepare($query));
|
1339 |
}
|
1340 |
}
|
1341 |
}
|
@@ -1343,7 +1366,7 @@ elseif (isset($task['task_results'][$result_id]['ftp'])) {
|
|
1343 |
|
1344 |
//Remove hit count
|
1345 |
$query = "DELETE FROM " . $new_table_prefix . "options WHERE option_name = 'iwp_client_user_hit_count'";
|
1346 |
-
$wpdb->query($
|
1347 |
|
1348 |
//Check for .htaccess permalinks update
|
1349 |
$this->replace_htaccess($home);
|
@@ -1387,6 +1410,7 @@ elseif (isset($task['task_results'][$result_id]['ftp'])) {
|
|
1387 |
|
1388 |
|
1389 |
@unlink($file_name);
|
|
|
1390 |
return true;
|
1391 |
}
|
1392 |
|
@@ -1440,7 +1464,7 @@ elseif (isset($task['task_results'][$result_id]['ftp'])) {
|
|
1440 |
{
|
1441 |
global $wpdb;
|
1442 |
$query = 'SHOW TABLE STATUS';
|
1443 |
-
$tables = $wpdb->get_results($
|
1444 |
foreach ($tables as $table) {
|
1445 |
if (in_array($table['Engine'], array(
|
1446 |
'MyISAM',
|
@@ -1648,6 +1672,12 @@ function ftp_backup($args)
|
|
1648 |
if ($ftp_ssl) {
|
1649 |
if (function_exists('ftp_ssl_connect')) {
|
1650 |
$conn_id = ftp_ssl_connect($ftp_hostname,$port);
|
|
|
|
|
|
|
|
|
|
|
|
|
1651 |
} else {
|
1652 |
return array(
|
1653 |
'error' => 'Your server doesn\'t support SFTP',
|
@@ -1693,7 +1723,7 @@ function ftp_backup($args)
|
|
1693 |
if ($upload === false) { //Try ascii
|
1694 |
$upload = @ftp_put($conn_id, $ftp_remote_folder . '/' . basename($backup_file), $backup_file, FTP_ASCII);
|
1695 |
}
|
1696 |
-
ftp_close($conn_id);
|
1697 |
|
1698 |
if ($upload === false) {
|
1699 |
return array(
|
@@ -1749,7 +1779,6 @@ function ftp_backup($args)
|
|
1749 |
$login = @ftp_login($conn_id, $ftp_username, $ftp_password);
|
1750 |
if ($login === false) {
|
1751 |
return false;
|
1752 |
-
} else {
|
1753 |
}
|
1754 |
|
1755 |
if ($ftp_site_folder)
|
@@ -1771,32 +1800,32 @@ function ftp_backup($args)
|
|
1771 |
}
|
1772 |
|
1773 |
|
1774 |
-
|
1775 |
-
{
|
1776 |
extract($args);
|
1777 |
|
1778 |
if(isset($consumer_secret) && !empty($consumer_secret)){
|
1779 |
-
|
1780 |
-
|
1781 |
-
|
1782 |
-
|
1783 |
-
|
1784 |
-
|
1785 |
-
|
1786 |
-
|
1787 |
-
|
1788 |
-
|
1789 |
-
|
1790 |
-
|
1791 |
-
|
1792 |
-
|
1793 |
-
|
1794 |
-
|
1795 |
-
|
1796 |
-
|
1797 |
-
|
1798 |
-
|
1799 |
-
|
|
|
1800 |
|
1801 |
} else {
|
1802 |
return array(
|
@@ -1805,78 +1834,70 @@ function ftp_backup($args)
|
|
1805 |
}
|
1806 |
|
1807 |
}
|
|
|
1808 |
|
1809 |
-
|
1810 |
-
|
1811 |
-
if(isset($consumer_secret) && !empty($consumer_secret)){
|
1812 |
-
//New way
|
1813 |
-
require_once('lib/dropbox.oauth.php');
|
1814 |
-
|
1815 |
-
$dropbox = new Dropbox($consumer_key, $consumer_secret);
|
1816 |
-
$dropbox->setOAuthToken($oauth_token);
|
1817 |
-
$dropbox->setOAuthTokenSecret($oauth_token_secret);
|
1818 |
-
|
1819 |
-
if ($dropbox_site_folder == true)
|
1820 |
-
$dropbox_destination .= '/' . $this->site_name;
|
1821 |
-
|
1822 |
-
try{
|
1823 |
-
$dropbox->fileopsDelete($dropbox_destination.'/'.$backup_file, true);
|
1824 |
-
} catch(Exception $e){
|
1825 |
-
|
1826 |
-
}
|
1827 |
-
}
|
1828 |
-
}
|
1829 |
-
|
1830 |
-
function get_dropbox_backup($args){
|
1831 |
-
extract($args);
|
1832 |
-
|
1833 |
-
if(isset($consumer_secret) && !empty($consumer_secret)){
|
1834 |
-
//New way
|
1835 |
-
require_once('lib/dropbox.oauth.php');
|
1836 |
-
|
1837 |
-
$dropbox = new Dropbox($consumer_key, $consumer_secret);
|
1838 |
-
$dropbox->setOAuthToken($oauth_token);
|
1839 |
-
$dropbox->setOAuthTokenSecret($oauth_token_secret);
|
1840 |
-
|
1841 |
-
if ($dropbox_site_folder == true)
|
1842 |
-
$dropbox_destination .= '/' . $this->site_name;
|
1843 |
-
|
1844 |
-
$temp = ABSPATH . 'iwp_temp_backup.zip';
|
1845 |
-
|
1846 |
-
try{
|
1847 |
-
$file = $dropbox->filesGet($dropbox_destination.'/'.$backup_file, true);
|
1848 |
-
|
1849 |
-
if(isset($file['data']) && !empty($file['data']) )
|
1850 |
-
$stream = base64_decode($file['data']);
|
1851 |
-
else
|
1852 |
-
return false;
|
1853 |
-
|
1854 |
-
$handle = @fopen($temp, 'w+');
|
1855 |
-
$result = fwrite($handle,$stream);
|
1856 |
-
fclose($handle);
|
1857 |
-
|
1858 |
-
if($result)
|
1859 |
-
return $temp;
|
1860 |
-
else
|
1861 |
-
return false;
|
1862 |
-
|
1863 |
-
} catch(Exception $e){
|
1864 |
-
|
1865 |
-
|
1866 |
-
return false;
|
1867 |
-
}
|
1868 |
-
|
1869 |
-
} else {
|
1870 |
-
return false;
|
1871 |
-
}
|
1872 |
-
|
1873 |
|
1874 |
-
|
1875 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1876 |
function amazons3_backup($args)
|
1877 |
{
|
1878 |
if ($this->iwp_mmb_function_exists('curl_init')) {
|
1879 |
-
require_once('lib/amazon_s3/sdk.class.php');
|
1880 |
|
1881 |
extract($args);
|
1882 |
|
@@ -1922,7 +1943,7 @@ function ftp_backup($args)
|
|
1922 |
function remove_amazons3_backup($args)
|
1923 |
{
|
1924 |
if ($this->iwp_mmb_function_exists('curl_init')) {
|
1925 |
-
require_once('lib/amazon_s3/sdk.class.php');
|
1926 |
extract($args);
|
1927 |
if ($as3_site_folder == true)
|
1928 |
$as3_directory .= '/' . $this->site_name;
|
@@ -1938,7 +1959,7 @@ function ftp_backup($args)
|
|
1938 |
|
1939 |
function get_amazons3_backup($args)
|
1940 |
{
|
1941 |
-
require_once('lib/amazon_s3/sdk.class.php');
|
1942 |
extract($args);
|
1943 |
$temp = '';
|
1944 |
try{
|
@@ -2142,7 +2163,8 @@ function get_next_schedules()
|
|
2142 |
$backups[$task_name]['task_results']=array();
|
2143 |
|
2144 |
$this->update_tasks($backups);
|
2145 |
-
|
|
|
2146 |
}
|
2147 |
}
|
2148 |
|
@@ -2221,6 +2243,7 @@ function get_next_schedules()
|
|
2221 |
foreach ($db_files as $file) {
|
2222 |
@unlink($file);
|
2223 |
}
|
|
|
2224 |
@rmdir(IWP_DB_DIR);
|
2225 |
}
|
2226 |
|
@@ -2234,9 +2257,10 @@ function get_next_schedules()
|
|
2234 |
@rmdir(WP_CONTENT_DIR . '/' . md5('iwp_mmb-client'));
|
2235 |
}
|
2236 |
|
2237 |
-
|
2238 |
-
|
2239 |
-
|
|
|
2240 |
}
|
2241 |
$deleted = array();
|
2242 |
|
@@ -2365,7 +2389,7 @@ function get_next_schedules()
|
|
2365 |
}
|
2366 |
|
2367 |
|
2368 |
-
public
|
2369 |
global $iwp_mmb_core;
|
2370 |
|
2371 |
if( empty($params) || !isset($params['backups']) )
|
@@ -2414,9 +2438,9 @@ function get_next_schedules()
|
|
2414 |
}
|
2415 |
}
|
2416 |
|
2417 |
-
if( function_exists('add_filter') ){
|
2418 |
add_filter( 'iwp_website_add', 'IWP_MMB_Backup::readd_tasks' );
|
2419 |
-
}
|
2420 |
|
2421 |
if(!function_exists('get_all_files_from_dir')) {
|
2422 |
/**
|
172 |
}
|
173 |
}
|
174 |
|
175 |
+
if (isset($time) && $time) { //set next result time before backup
|
176 |
if (is_array($before[$task_name]['task_results'])) {
|
177 |
$before[$task_name]['task_results'] = array_values($before[$task_name]['task_results']);
|
178 |
}
|
316 |
|
317 |
function backup($args, $task_name = false)
|
318 |
{
|
319 |
+
if (!$args || empty($args))
|
320 |
return false;
|
321 |
|
322 |
extract($args); //extract settings
|
325 |
$this->set_memory();
|
326 |
|
327 |
//Remove old backup(s)
|
328 |
+
$removed = $this->remove_old_backups($task_name);
|
329 |
+
if (is_array($removed) && isset($removed['error'])) {
|
330 |
+
//$error_message = $removed['error'];
|
331 |
+
return $removed;
|
332 |
+
}
|
333 |
|
334 |
$new_file_path = IWP_BACKUP_DIR;
|
335 |
|
382 |
ob_start();
|
383 |
$result = $this->iwp_mmb_exec($command);
|
384 |
ob_get_clean();
|
385 |
+
echo "\n".'DB ZIP CMD';
|
386 |
/*zip_backup_db */
|
387 |
if(!$result){
|
388 |
$zip_archive_db_result = false;
|
389 |
if (class_exists("ZipArchive")) {
|
390 |
$this->_log("DB zip, fallback to ZipArchive");
|
391 |
$zip_archive_db_result = $this->zip_archive_backup_db($task_name, $db_result, $backup_file);
|
392 |
+
echo "\n".'DB ZIP Archive';
|
393 |
}
|
394 |
|
395 |
if (!$zip_archive_db_result) {
|
396 |
+
echo "\n".'DB ZIP PCL';
|
397 |
// fallback to pclzip
|
398 |
define('PCLZIP_TEMPORARY_DIR', IWP_BACKUP_DIR . '/');
|
399 |
//require_once ABSPATH . '/wp-admin/includes/class-pclzip.php';
|
400 |
require_once $GLOBALS['iwp_mmb_plugin_dir'].'/pclzip.class.php';
|
401 |
$archive = new IWPPclZip($backup_file);
|
402 |
+
|
|
|
|
|
|
|
|
|
|
|
403 |
if($fail_safe_files && $disable_comp){
|
404 |
+
$result = $archive->add(IWP_DB_DIR, PCLZIP_OPT_REMOVE_PATH, IWP_BACKUP_DIR, PCLZIP_OPT_NO_COMPRESSION, PCLZIP_OPT_TEMP_FILE_THRESHOLD, 1);
|
405 |
}
|
406 |
elseif(!$fail_safe_files && $disable_comp){
|
407 |
+
$result = $archive->add(IWP_DB_DIR, PCLZIP_OPT_REMOVE_PATH, IWP_BACKUP_DIR, PCLZIP_OPT_NO_COMPRESSION);
|
408 |
}
|
409 |
elseif($fail_safe_files && !$disable_comp){
|
410 |
+
$result = $archive->add(IWP_DB_DIR, PCLZIP_OPT_REMOVE_PATH, IWP_BACKUP_DIR, PCLZIP_OPT_TEMP_FILE_THRESHOLD, 1);
|
411 |
}
|
412 |
else{
|
413 |
+
$result = $archive->add(IWP_DB_DIR, PCLZIP_OPT_REMOVE_PATH, IWP_BACKUP_DIR);
|
414 |
}
|
415 |
@unlink($db_result);
|
416 |
+
@unlink(IWP_BACKUP_DIR.'/iwp_db/index.php');
|
417 |
@rmdir(IWP_DB_DIR);
|
418 |
if (!$result) {
|
419 |
return array(
|
424 |
}
|
425 |
|
426 |
@unlink($db_result);
|
427 |
+
@unlink(IWP_BACKUP_DIR.'/iwp_db/index.php');
|
428 |
@rmdir(IWP_DB_DIR);
|
429 |
+
/*if (!$result) {
|
430 |
return array(
|
431 |
'error' => 'Failed to zip database.'
|
432 |
);
|
433 |
+
}*///commented because of zipArchive
|
434 |
$this->update_status($task_name, $this->statuses['db_zip'], true);
|
435 |
}
|
436 |
} elseif (trim($what) == 'full') {
|
570 |
|
571 |
function backup_full($task_name, $backup_file, $exclude = array(), $include = array())
|
572 |
{
|
573 |
+
|
574 |
+
global $zip_errors;
|
575 |
$sys = substr(PHP_OS, 0, 3);
|
576 |
|
577 |
$this->update_status($task_name, $this->statuses['db_dump']);
|
602 |
ob_start();
|
603 |
$result = $this->iwp_mmb_exec($command);
|
604 |
ob_get_clean();
|
605 |
+
echo "\n".'DB ZIP CMD';
|
606 |
/*zip_backup_db*/
|
607 |
|
608 |
if(!$result){
|
610 |
if (class_exists("ZipArchive")) {
|
611 |
$this->_log("DB zip, fallback to ZipArchive");
|
612 |
$zip_archive_db_result = $this->zip_archive_backup_db($task_name, $db_result, $backup_file);
|
613 |
+
echo "\n".'DB ZIP Archive';
|
614 |
}
|
615 |
|
616 |
if (!$zip_archive_db_result) {
|
617 |
+
echo "\n".'DB ZIP PCL';
|
618 |
define('PCLZIP_TEMPORARY_DIR', IWP_BACKUP_DIR . '/');
|
619 |
require_once $GLOBALS['iwp_mmb_plugin_dir'].'/pclzip.class.php';
|
620 |
$archive = new IWPPclZip($backup_file);
|
621 |
|
622 |
if($fail_safe_files && $disable_comp){
|
623 |
+
$result_db = $archive->add(IWP_DB_DIR, PCLZIP_OPT_REMOVE_PATH, IWP_BACKUP_DIR, PCLZIP_OPT_NO_COMPRESSION, PCLZIP_OPT_TEMP_FILE_THRESHOLD, 1);
|
624 |
}
|
625 |
elseif(!$fail_safe_files && $disable_comp){
|
626 |
+
$result_db = $archive->add(IWP_DB_DIR, PCLZIP_OPT_REMOVE_PATH, IWP_BACKUP_DIR, PCLZIP_OPT_NO_COMPRESSION);
|
627 |
}
|
628 |
elseif($fail_safe_files && !$disable_comp){
|
629 |
+
$result_db = $archive->add(IWP_DB_DIR, PCLZIP_OPT_REMOVE_PATH, IWP_BACKUP_DIR, PCLZIP_OPT_TEMP_FILE_THRESHOLD, 1);
|
630 |
}
|
631 |
else{
|
632 |
+
$result_db = $archive->add(IWP_DB_DIR, PCLZIP_OPT_REMOVE_PATH, IWP_BACKUP_DIR);
|
633 |
}
|
634 |
|
635 |
@unlink($db_result);
|
636 |
+
@unlink(IWP_BACKUP_DIR.'/iwp_db/index.php');
|
637 |
@rmdir(IWP_DB_DIR);
|
638 |
|
639 |
if (!$result_db) {
|
645 |
}
|
646 |
|
647 |
@unlink($db_result);
|
648 |
+
@unlink(IWP_BACKUP_DIR.'/iwp_db/index.php');
|
649 |
@rmdir(IWP_DB_DIR);
|
650 |
|
651 |
$this->update_status($task_name, $this->statuses['db_zip'], true);
|
704 |
$exclude_data .= " $data/*.*";
|
705 |
else
|
706 |
$exclude_data .= " '$data/*'";
|
707 |
+
}*///commented for pclzip modifications
|
708 |
|
709 |
//Include paths by default
|
710 |
$add = array(
|
756 |
}
|
757 |
}
|
758 |
ob_get_clean();
|
759 |
+
echo "\n".'Files ZIP CMD';
|
760 |
if ($result_f && $result_f != 18) {
|
761 |
$zip_archive_result = false;
|
762 |
if (class_exists("ZipArchive")) {
|
763 |
$this->_log("Files zip fallback to ZipArchive");
|
764 |
$zip_archive_result = $this->zip_archive_backup($task_name, $backup_file, $exclude, $include);
|
765 |
+
echo "\n".'Files ZIP Archive';
|
766 |
}
|
767 |
|
768 |
|
769 |
if (!$zip_archive_result) { //Try pclZip
|
770 |
+
echo "\n".'Files ZIP PCL';
|
771 |
if (!isset($archive)) {
|
772 |
define('PCLZIP_TEMPORARY_DIR', IWP_BACKUP_DIR . '/');
|
773 |
//require_once ABSPATH . '/wp-admin/includes/class-pclzip.php';
|
843 |
}
|
844 |
|
845 |
/**
|
846 |
+
* Zipping database dump and index.php in folder iwp_db by ZipArchive class, requires php zip extension.
|
847 |
*
|
848 |
* @param string $task_name the name of backup task
|
849 |
* @param string $db_result relative path to database dump file
|
858 |
$zip = new ZipArchive();
|
859 |
$result = $zip->open($backup_file, ZIPARCHIVE::OVERWRITE); // Tries to open $backup_file for acrhiving
|
860 |
if ($result === true) {
|
861 |
+
$result = $result && $zip->addFile(IWP_BACKUP_DIR.'/iwp_db/index.php', "iwp_db/index.php"); // Tries to add iwp_db/index.php to $backup_file
|
862 |
+
$result = $result && $zip->addFile($db_result, "iwp_db/" . basename($db_result)); // Tries to add db dump form iwp_db dir to $backup_file
|
863 |
$result = $result && $zip->close(); // Tries to close $backup_file
|
864 |
} else {
|
865 |
$result = false;
|
946 |
return array(
|
947 |
'error' => 'Error creating database backup folder (' . $db_folder . '). Make sure you have corrrect write permissions.'
|
948 |
);
|
949 |
+
@file_put_contents(IWP_BACKUP_DIR.'/iwp_db/index.php', '');
|
950 |
}
|
951 |
|
952 |
$file = $db_folder . DB_NAME . '.sql';
|
963 |
ob_start();
|
964 |
$result = $this->iwp_mmb_exec($command);
|
965 |
ob_get_clean();
|
966 |
+
echo "\n".'DB DUMP CMD';
|
967 |
|
968 |
if (!$result) { // Fallback to php
|
969 |
$result = $this->backup_db_php($file);
|
983 |
global $wpdb;
|
984 |
|
985 |
if(empty($GLOBALS['fail_safe_db'])){
|
986 |
+
echo "\n".'DB DUMP PHP Normal';
|
987 |
$fp = fopen( $file, 'w' );
|
988 |
if ( !mysql_ping( $wpdb->dbh ) ) {
|
989 |
mysql_connect( DB_HOST, DB_USER, DB_PASSWORD );
|
1066 |
unset ($fp);
|
1067 |
}
|
1068 |
else{
|
1069 |
+
echo "\n".'DB DUMP PHP Fail-safe';
|
1070 |
$tables = $wpdb->get_results('SHOW TABLES', ARRAY_N);
|
1071 |
foreach ($tables as $table) {
|
1072 |
//drop existing table
|
1073 |
$dump_data = "DROP TABLE IF EXISTS $table[0];";
|
1074 |
+
file_put_contents($file, $dump_data, FILE_APPEND);
|
1075 |
//create table
|
1076 |
$create_table = $wpdb->get_row("SHOW CREATE TABLE $table[0]", ARRAY_N);
|
1077 |
+
$dump_data = "\n\n" . $create_table[1] . ";\n\n";
|
1078 |
+
file_put_contents($file, $dump_data, FILE_APPEND);
|
1079 |
|
1080 |
$count = $wpdb->get_var("SELECT count(*) FROM $table[0]");
|
1081 |
if ($count > 100)
|
1090 |
if (is_array($rows)) {
|
1091 |
foreach ($rows as $row) {
|
1092 |
//insert single row
|
1093 |
+
$dump_data = "INSERT INTO $table[0] VALUES(";
|
1094 |
$num_values = count($row);
|
1095 |
$j = 1;
|
1096 |
foreach ($row as $value) {
|
1101 |
unset($value);
|
1102 |
}
|
1103 |
$dump_data .= ");\n";
|
1104 |
+
file_put_contents($file, $dump_data, FILE_APPEND);
|
1105 |
}
|
1106 |
}
|
1107 |
}
|
1108 |
+
$dump_data = "\n\n\n";
|
1109 |
+
file_put_contents($file, $dump_data, FILE_APPEND);
|
1110 |
|
1111 |
unset($rows);
|
|
|
1112 |
unset($dump_data);
|
1113 |
}
|
1114 |
}
|
1301 |
|
1302 |
//Replace options
|
1303 |
$query = "SELECT option_value FROM " . $new_table_prefix . "options WHERE option_name = 'home'";
|
1304 |
+
$old = $wpdb->get_var($query);
|
1305 |
$old = rtrim($old, "/");
|
1306 |
+
$query = "UPDATE " . $new_table_prefix . "options SET option_value = %s WHERE option_name = 'home'";
|
1307 |
+
$wpdb->query($wpdb->prepare($query, $home));
|
1308 |
+
$query = "UPDATE " . $new_table_prefix . "options SET option_value = %s WHERE option_name = 'siteurl'";
|
1309 |
+
$wpdb->query($wpdb->prepare($query, $home));
|
1310 |
//Replace content urls
|
1311 |
+
|
1312 |
+
$regexp1 = 'src="(.*)'.$old.'(.*)"';
|
1313 |
+
$regexp2 = 'href="(.*)'.$old.'(.*)"';
|
1314 |
+
$query = "UPDATE " . $new_table_prefix . "posts SET post_content = REPLACE (post_content, %s,%s) WHERE post_content REGEXP %s OR post_content REGEXP %s";
|
1315 |
+
$wpdb->query($wpdb->prepare($query, $old, $home, $regexp1, $regexp2));
|
1316 |
|
1317 |
if (trim($new_password)) {
|
1318 |
$new_password = wp_hash_password($new_password);
|
1319 |
}
|
1320 |
if (!trim($clone_from_url) && !trim($iwp_clone)) {
|
1321 |
if ($new_user && $new_password) {
|
1322 |
+
$query = "UPDATE " . $new_table_prefix . "users SET user_login = %s, user_pass = %s WHERE user_login = %s";
|
1323 |
+
$wpdb->query($wpdb->prepare($query, $new_user, $new_password, $old_user));
|
1324 |
}
|
1325 |
} else {
|
1326 |
|
1327 |
// if ($iwp_clone) {
|
1328 |
if ($admin_email) {
|
1329 |
//Clean Install
|
1330 |
+
$query = "UPDATE " . $new_table_prefix . "options SET option_value = %s WHERE option_name = 'admin_email'";
|
1331 |
+
$wpdb->query($wpdb->prepare($query, $admin_email));
|
1332 |
$query = "SELECT * FROM " . $new_table_prefix . "users LIMIT 1";
|
1333 |
$temp_user = $wpdb->get_row($query);
|
1334 |
if (!empty($temp_user)) {
|
1335 |
+
$query = "UPDATE " . $new_table_prefix . "users SET user_email=%s, user_login = %s, user_pass = %s WHERE user_login = %s";
|
1336 |
+
$wpdb->query($wpdb->prepare($query, $admin_email, $new_user, $new_password, $temp_user->user_login));
|
1337 |
}
|
1338 |
|
1339 |
}
|
1341 |
|
1342 |
//if ($clone_from_url) {
|
1343 |
if ($new_user && $new_password) {
|
1344 |
+
$query = "UPDATE " . $new_table_prefix . "users SET user_pass = %s WHERE user_login = %s";
|
1345 |
+
$wpdb->query($wpdb->prepare($query, $new_password, $new_user));
|
1346 |
}
|
1347 |
// }
|
1348 |
|
1351 |
if (is_array($clone_options) && !empty($clone_options)) {
|
1352 |
foreach ($clone_options as $key => $option) {
|
1353 |
if (!empty($key)) {
|
1354 |
+
$query = "SELECT option_value FROM " . $new_table_prefix . "options WHERE option_name = %s";
|
1355 |
+
$res = $wpdb->get_var($wpdb->prepare($query, $key));
|
1356 |
if ($res == false) {
|
1357 |
+
$query = "INSERT INTO " . $new_table_prefix . "options (option_value,option_name) VALUES(%s,%s)";
|
1358 |
+
$wpdb->query($wpdb->prepare($query, $option, $key));
|
1359 |
} else {
|
1360 |
+
$query = "UPDATE " . $new_table_prefix . "options SET option_value = %s WHERE option_name = %s";
|
1361 |
+
$wpdb->query($wpdb->prepare($query, $option, $key));
|
1362 |
}
|
1363 |
}
|
1364 |
}
|
1366 |
|
1367 |
//Remove hit count
|
1368 |
$query = "DELETE FROM " . $new_table_prefix . "options WHERE option_name = 'iwp_client_user_hit_count'";
|
1369 |
+
$wpdb->query($query);
|
1370 |
|
1371 |
//Check for .htaccess permalinks update
|
1372 |
$this->replace_htaccess($home);
|
1410 |
|
1411 |
|
1412 |
@unlink($file_name);
|
1413 |
+
@unlink(dirname($file_name));//remove its folder
|
1414 |
return true;
|
1415 |
}
|
1416 |
|
1464 |
{
|
1465 |
global $wpdb;
|
1466 |
$query = 'SHOW TABLE STATUS';
|
1467 |
+
$tables = $wpdb->get_results($query, ARRAY_A);
|
1468 |
foreach ($tables as $table) {
|
1469 |
if (in_array($table['Engine'], array(
|
1470 |
'MyISAM',
|
1672 |
if ($ftp_ssl) {
|
1673 |
if (function_exists('ftp_ssl_connect')) {
|
1674 |
$conn_id = ftp_ssl_connect($ftp_hostname,$port);
|
1675 |
+
if ($conn_id === false) {
|
1676 |
+
return array(
|
1677 |
+
'error' => 'Failed to connect to ' . $ftp_hostname,
|
1678 |
+
'partial' => 1
|
1679 |
+
);
|
1680 |
+
}
|
1681 |
} else {
|
1682 |
return array(
|
1683 |
'error' => 'Your server doesn\'t support SFTP',
|
1723 |
if ($upload === false) { //Try ascii
|
1724 |
$upload = @ftp_put($conn_id, $ftp_remote_folder . '/' . basename($backup_file), $backup_file, FTP_ASCII);
|
1725 |
}
|
1726 |
+
@ftp_close($conn_id);
|
1727 |
|
1728 |
if ($upload === false) {
|
1729 |
return array(
|
1779 |
$login = @ftp_login($conn_id, $ftp_username, $ftp_password);
|
1780 |
if ($login === false) {
|
1781 |
return false;
|
|
|
1782 |
}
|
1783 |
|
1784 |
if ($ftp_site_folder)
|
1800 |
}
|
1801 |
|
1802 |
|
1803 |
+
function dropbox_backup($args){
|
|
|
1804 |
extract($args);
|
1805 |
|
1806 |
if(isset($consumer_secret) && !empty($consumer_secret)){
|
1807 |
+
|
1808 |
+
require_once $GLOBALS['iwp_mmb_plugin_dir'] . '/lib/dropbox.php';
|
1809 |
+
|
1810 |
+
$dropbox = new Dropbox($consumer_key, $consumer_secret);
|
1811 |
+
$dropbox->setOAuthTokens($oauth_token, $oauth_token_secret);
|
1812 |
+
|
1813 |
+
if ($dropbox_site_folder == true)
|
1814 |
+
$dropbox_destination .= '/' . $this->site_name . '/' . basename($backup_file);
|
1815 |
+
else
|
1816 |
+
$dropbox_destination .= '/' . basename($backup_file);
|
1817 |
+
|
1818 |
+
try {
|
1819 |
+
$dropbox->upload($backup_file, $dropbox_destination, true);
|
1820 |
+
} catch (Exception $e) {
|
1821 |
+
$this->_log($e->getMessage());
|
1822 |
+
return array(
|
1823 |
+
'error' => $e->getMessage(),
|
1824 |
+
'partial' => 1
|
1825 |
+
);
|
1826 |
+
}
|
1827 |
+
|
1828 |
+
return true;
|
1829 |
|
1830 |
} else {
|
1831 |
return array(
|
1834 |
}
|
1835 |
|
1836 |
}
|
1837 |
+
|
1838 |
|
1839 |
+
function remove_dropbox_backup($args) {
|
1840 |
+
extract($args);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1841 |
|
1842 |
+
require_once $GLOBALS['iwp_mmb_plugin_dir'] . '/lib/dropbox.php';
|
1843 |
+
|
1844 |
+
$dropbox = new Dropbox($consumer_key, $consumer_secret);
|
1845 |
+
$dropbox->setOAuthTokens($oauth_token, $oauth_token_secret);
|
1846 |
+
|
1847 |
+
if ($dropbox_site_folder == true)
|
1848 |
+
$dropbox_destination .= '/' . $this->site_name;
|
1849 |
+
|
1850 |
+
try {
|
1851 |
+
$dropbox->fileopsDelete($dropbox_destination . '/' . $backup_file);
|
1852 |
+
} catch (Exception $e) {
|
1853 |
+
$this->_log($e->getMessage());
|
1854 |
+
/*return array(
|
1855 |
+
'error' => $e->getMessage(),
|
1856 |
+
'partial' => 1
|
1857 |
+
);*/
|
1858 |
+
}
|
1859 |
+
|
1860 |
+
//return true;
|
1861 |
+
}
|
1862 |
+
|
1863 |
+
|
1864 |
+
function get_dropbox_backup($args) {
|
1865 |
+
extract($args);
|
1866 |
+
|
1867 |
+
require_once $GLOBALS['iwp_mmb_plugin_dir'] . '/lib/dropbox.php';
|
1868 |
+
|
1869 |
+
$dropbox = new Dropbox($consumer_key, $consumer_secret);
|
1870 |
+
$dropbox->setOAuthTokens($oauth_token, $oauth_token_secret);
|
1871 |
+
|
1872 |
+
if ($dropbox_site_folder == true)
|
1873 |
+
$dropbox_destination .= '/' . $this->site_name;
|
1874 |
+
|
1875 |
+
$temp = ABSPATH . 'iwp_temp_backup.zip';
|
1876 |
+
|
1877 |
+
try {
|
1878 |
+
$file = $dropbox->download($dropbox_destination.'/'.$backup_file);
|
1879 |
+
$handle = @fopen($temp, 'w');
|
1880 |
+
$result = fwrite($handle,$file);
|
1881 |
+
fclose($handle);
|
1882 |
+
|
1883 |
+
if($result)
|
1884 |
+
return $temp;
|
1885 |
+
else
|
1886 |
+
return false;
|
1887 |
+
} catch (Exception $e) {
|
1888 |
+
$this->_log($e->getMessage());
|
1889 |
+
return array(
|
1890 |
+
'error' => $e->getMessage(),
|
1891 |
+
'partial' => 1
|
1892 |
+
);
|
1893 |
+
}
|
1894 |
+
}
|
1895 |
+
|
1896 |
+
|
1897 |
function amazons3_backup($args)
|
1898 |
{
|
1899 |
if ($this->iwp_mmb_function_exists('curl_init')) {
|
1900 |
+
require_once($GLOBALS['iwp_mmb_plugin_dir'].'/lib/amazon_s3/sdk.class.php');
|
1901 |
|
1902 |
extract($args);
|
1903 |
|
1943 |
function remove_amazons3_backup($args)
|
1944 |
{
|
1945 |
if ($this->iwp_mmb_function_exists('curl_init')) {
|
1946 |
+
require_once($GLOBALS['iwp_mmb_plugin_dir'].'/lib/amazon_s3/sdk.class.php');
|
1947 |
extract($args);
|
1948 |
if ($as3_site_folder == true)
|
1949 |
$as3_directory .= '/' . $this->site_name;
|
1959 |
|
1960 |
function get_amazons3_backup($args)
|
1961 |
{
|
1962 |
+
require_once($GLOBALS['iwp_mmb_plugin_dir'].'/lib/amazon_s3/sdk.class.php');
|
1963 |
extract($args);
|
1964 |
$temp = '';
|
1965 |
try{
|
2163 |
$backups[$task_name]['task_results']=array();
|
2164 |
|
2165 |
$this->update_tasks($backups);
|
2166 |
+
|
2167 |
+
return true;
|
2168 |
}
|
2169 |
}
|
2170 |
|
2243 |
foreach ($db_files as $file) {
|
2244 |
@unlink($file);
|
2245 |
}
|
2246 |
+
@unlink(IWP_BACKUP_DIR.'/iwp_db/index.php');
|
2247 |
@rmdir(IWP_DB_DIR);
|
2248 |
}
|
2249 |
|
2257 |
@rmdir(WP_CONTENT_DIR . '/' . md5('iwp_mmb-client'));
|
2258 |
}
|
2259 |
|
2260 |
+
if (!empty($new)) {
|
2261 |
+
foreach ($new as $b) {
|
2262 |
+
$files[] = $b;
|
2263 |
+
}
|
2264 |
}
|
2265 |
$deleted = array();
|
2266 |
|
2389 |
}
|
2390 |
|
2391 |
|
2392 |
+
public function readd_tasks( $params = array() ){
|
2393 |
global $iwp_mmb_core;
|
2394 |
|
2395 |
if( empty($params) || !isset($params['backups']) )
|
2438 |
}
|
2439 |
}
|
2440 |
|
2441 |
+
/*if( function_exists('add_filter') ){
|
2442 |
add_filter( 'iwp_website_add', 'IWP_MMB_Backup::readd_tasks' );
|
2443 |
+
}*/
|
2444 |
|
2445 |
if(!function_exists('get_all_files_from_dir')) {
|
2446 |
/**
|
core.class.php
CHANGED
@@ -259,7 +259,7 @@ class IWP_MMB_Core extends IWP_MMB_Helper
|
|
259 |
private function get_parent_blog_option( $option_name = '' )
|
260 |
{
|
261 |
global $wpdb;
|
262 |
-
$option = $wpdb->get_var( $wpdb->prepare( "SELECT `option_value` FROM {$wpdb->base_prefix}options WHERE option_name =
|
263 |
return $option;
|
264 |
}
|
265 |
|
@@ -434,7 +434,7 @@ class IWP_MMB_Core extends IWP_MMB_Helper
|
|
434 |
|
435 |
//delete plugin options, just in case
|
436 |
if ($this->iwp_mmb_multisite != false) {
|
437 |
-
$network_blogs = $wpdb->get_results(
|
438 |
if(!empty($network_blogs)){
|
439 |
if( is_network_admin() ){
|
440 |
update_option('iwp_client_network_admin_install', 1);
|
@@ -493,7 +493,7 @@ class IWP_MMB_Core extends IWP_MMB_Helper
|
|
493 |
$_wp_using_ext_object_cache = false;
|
494 |
|
495 |
if ($this->iwp_mmb_multisite != false) {
|
496 |
-
$network_blogs = $wpdb->get_col(
|
497 |
if(!empty($network_blogs)){
|
498 |
if( is_network_admin() ){
|
499 |
if( $deactivate ) {
|
259 |
private function get_parent_blog_option( $option_name = '' )
|
260 |
{
|
261 |
global $wpdb;
|
262 |
+
$option = $wpdb->get_var( $wpdb->prepare( "SELECT `option_value` FROM {$wpdb->base_prefix}options WHERE option_name = %s LIMIT 1", $option_name ) );
|
263 |
return $option;
|
264 |
}
|
265 |
|
434 |
|
435 |
//delete plugin options, just in case
|
436 |
if ($this->iwp_mmb_multisite != false) {
|
437 |
+
$network_blogs = $wpdb->get_results("select `blog_id`, `site_id` from `{$wpdb->blogs}`");
|
438 |
if(!empty($network_blogs)){
|
439 |
if( is_network_admin() ){
|
440 |
update_option('iwp_client_network_admin_install', 1);
|
493 |
$_wp_using_ext_object_cache = false;
|
494 |
|
495 |
if ($this->iwp_mmb_multisite != false) {
|
496 |
+
$network_blogs = $wpdb->get_col("select `blog_id` from `{$wpdb->blogs}`");
|
497 |
if(!empty($network_blogs)){
|
498 |
if( is_network_admin() ){
|
499 |
if( $deactivate ) {
|
helper.class.php
CHANGED
@@ -230,7 +230,7 @@ class IWP_MMB_Helper
|
|
230 |
global $wpdb;
|
231 |
$option_name = '_site_transient_'. $option_name;
|
232 |
|
233 |
-
$result = $wpdb->get_var( $wpdb->prepare("SELECT `meta_value` FROM `{$wpdb->sitemeta}` WHERE meta_key =
|
234 |
$result = maybe_unserialize($result);
|
235 |
return $result;
|
236 |
}
|
230 |
global $wpdb;
|
231 |
$option_name = '_site_transient_'. $option_name;
|
232 |
|
233 |
+
$result = $wpdb->get_var( $wpdb->prepare("SELECT `meta_value` FROM `{$wpdb->sitemeta}` WHERE meta_key = %s AND `site_id` = %s", $option_name, $this->mmb_multisite));
|
234 |
$result = maybe_unserialize($result);
|
235 |
return $result;
|
236 |
}
|
init.php
CHANGED
@@ -4,7 +4,7 @@ Plugin Name: InfiniteWP - Client
|
|
4 |
Plugin URI: http://infinitewp.com/
|
5 |
Description: This is the client plugin of InfiniteWP that communicates with the InfiniteWP Admin panel.
|
6 |
Author: Revmakx
|
7 |
-
Version: 1.1.
|
8 |
Author URI: http://www.revmakx.com
|
9 |
*/
|
10 |
/************************************************************
|
@@ -26,7 +26,7 @@ Author URI: http://www.revmakx.com
|
|
26 |
**************************************************************/
|
27 |
|
28 |
if(!defined('IWP_MMB_CLIENT_VERSION'))
|
29 |
-
define('IWP_MMB_CLIENT_VERSION', '1.1.
|
30 |
|
31 |
|
32 |
if ( !defined('IWP_MMB_XFRAME_COOKIE')){
|
@@ -218,10 +218,10 @@ if( !function_exists ( 'iwp_mmb_add_site' )) {
|
|
218 |
$iwp_mmb_core->set_admin_panel_public_key($public_key);
|
219 |
$iwp_mmb_core->set_client_message_id($id);
|
220 |
$iwp_mmb_core->get_stats_instance();
|
221 |
-
if(is_array($notifications) && !empty($notifications)){
|
222 |
$iwp_mmb_core->stats_instance->set_notifications($notifications);
|
223 |
}
|
224 |
-
if(is_array($brand) && !empty($brand)){
|
225 |
update_option('iwp_client_brand',$brand);
|
226 |
}
|
227 |
|
@@ -473,6 +473,19 @@ if( !function_exists ( 'iwp_mmb_clean_orphan_backups' )) {
|
|
473 |
}
|
474 |
}
|
475 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
476 |
if( !function_exists ( 'iwp_mmb_update_client_plugin' )) {
|
477 |
function iwp_mmb_update_client_plugin($params)
|
478 |
{
|
4 |
Plugin URI: http://infinitewp.com/
|
5 |
Description: This is the client plugin of InfiniteWP that communicates with the InfiniteWP Admin panel.
|
6 |
Author: Revmakx
|
7 |
+
Version: 1.1.5
|
8 |
Author URI: http://www.revmakx.com
|
9 |
*/
|
10 |
/************************************************************
|
26 |
**************************************************************/
|
27 |
|
28 |
if(!defined('IWP_MMB_CLIENT_VERSION'))
|
29 |
+
define('IWP_MMB_CLIENT_VERSION', '1.1.5');
|
30 |
|
31 |
|
32 |
if ( !defined('IWP_MMB_XFRAME_COOKIE')){
|
218 |
$iwp_mmb_core->set_admin_panel_public_key($public_key);
|
219 |
$iwp_mmb_core->set_client_message_id($id);
|
220 |
$iwp_mmb_core->get_stats_instance();
|
221 |
+
if(isset($notifications) && is_array($notifications) && !empty($notifications)){
|
222 |
$iwp_mmb_core->stats_instance->set_notifications($notifications);
|
223 |
}
|
224 |
+
if(isset($brand) && is_array($brand) && !empty($brand)){
|
225 |
update_option('iwp_client_brand',$brand);
|
226 |
}
|
227 |
|
473 |
}
|
474 |
}
|
475 |
|
476 |
+
|
477 |
+
|
478 |
+
add_filter( 'iwp_website_add', 'iwp_mmb_readd_backup_task' );
|
479 |
+
|
480 |
+
if (!function_exists('iwp_mmb_readd_backup_task')) {
|
481 |
+
function iwp_mmb_readd_backup_task($params = array()) {
|
482 |
+
global $iwp_mmb_core;
|
483 |
+
$backup_instance = $iwp_mmb_core->get_backup_instance();
|
484 |
+
$settings = $backup_instance->readd_tasks($params);
|
485 |
+
return $settings;
|
486 |
+
}
|
487 |
+
}
|
488 |
+
|
489 |
if( !function_exists ( 'iwp_mmb_update_client_plugin' )) {
|
490 |
function iwp_mmb_update_client_plugin($params)
|
491 |
{
|
lib/dropbox.oauth.php
DELETED
@@ -1,1133 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
/**
|
4 |
-
* Dropbox class
|
5 |
-
*
|
6 |
-
* This source file can be used to communicate with Dropbox (http://dropbox.com)
|
7 |
-
*
|
8 |
-
* The class is documented in the file itself. If you find any bugs help me out and report them. Reporting can be done by sending an email to php-dropbox-bugs[at]verkoyen[dot]eu.
|
9 |
-
* If you report a bug, make sure you give me enough information (include your code).
|
10 |
-
*
|
11 |
-
* Changelog since 1.0.4
|
12 |
-
* - Fixed filesPost so it returns a boolean.
|
13 |
-
* - Some code styling
|
14 |
-
*
|
15 |
-
* Changelog since 1.0.3
|
16 |
-
* - Corrected the authorize-URL (thx to Jacob Budin).
|
17 |
-
*
|
18 |
-
* Changelog since 1.0.2
|
19 |
-
* - Added methods to enable oauth-usage.
|
20 |
-
*
|
21 |
-
* Changelog since 1.0.1
|
22 |
-
* - Bugfix: when doing multiple calles where GET and POST is mixed, the postfields should be reset (thx to Daniel Hトてスsken)
|
23 |
-
*
|
24 |
-
* Changelog since 1.0.0
|
25 |
-
* - fixed some issues with generation off the basestring
|
26 |
-
*
|
27 |
-
* License
|
28 |
-
* Copyright (c), Tijs Verkoyen. All rights reserved.
|
29 |
-
*
|
30 |
-
* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
31 |
-
*
|
32 |
-
* 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
33 |
-
* 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
34 |
-
* 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission.
|
35 |
-
*
|
36 |
-
* This software is provided by the author "as is" and any express or implied warranties, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose are disclaimed. In no event shall the author be liable for any direct, indirect, incidental, special, exemplary, or consequential damages (including, but not limited to, procurement of substitute goods or services; loss of use, data, or profits; or business interruption) however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence or otherwise) arising in any way out of the use of this software, even if advised of the possibility of such damage.
|
37 |
-
*
|
38 |
-
* @author Tijs Verkoyen <php-dropbox@verkoyen.eu>
|
39 |
-
* @version 1.0.5
|
40 |
-
*
|
41 |
-
* @copyright Copyright (c), Tijs Verkoyen. All rights reserved.
|
42 |
-
* @license BSD License
|
43 |
-
*/
|
44 |
-
class Dropbox
|
45 |
-
{
|
46 |
-
// internal constant to enable/disable debugging
|
47 |
-
const DEBUG = false;
|
48 |
-
|
49 |
-
// url for the dropbox-api
|
50 |
-
const API_URL = 'https://api.dropbox.com';
|
51 |
-
const API_AUTH_URL = 'https://www.dropbox.com';
|
52 |
-
const API_CONTENT_URL = 'https://api-content.dropbox.com';
|
53 |
-
|
54 |
-
// port for the dropbox-api
|
55 |
-
const API_PORT = 443;
|
56 |
-
|
57 |
-
// current version
|
58 |
-
const VERSION = '1.0.5';
|
59 |
-
|
60 |
-
|
61 |
-
/**
|
62 |
-
* A cURL instance
|
63 |
-
*
|
64 |
-
* @var resource
|
65 |
-
*/
|
66 |
-
private $curl;
|
67 |
-
|
68 |
-
|
69 |
-
/**
|
70 |
-
* The application key
|
71 |
-
*
|
72 |
-
* @var string
|
73 |
-
*/
|
74 |
-
private $applicationKey;
|
75 |
-
|
76 |
-
|
77 |
-
/**
|
78 |
-
* The application secret
|
79 |
-
*
|
80 |
-
* @var string
|
81 |
-
*/
|
82 |
-
private $applicationSecret;
|
83 |
-
|
84 |
-
|
85 |
-
/**
|
86 |
-
* The oAuth-token
|
87 |
-
*
|
88 |
-
* @var string
|
89 |
-
*/
|
90 |
-
private $oAuthToken = '';
|
91 |
-
|
92 |
-
|
93 |
-
/**
|
94 |
-
* The oAuth-token-secret
|
95 |
-
*
|
96 |
-
* @var string
|
97 |
-
*/
|
98 |
-
private $oAuthTokenSecret = '';
|
99 |
-
|
100 |
-
|
101 |
-
/**
|
102 |
-
* The timeout
|
103 |
-
*
|
104 |
-
* @var int
|
105 |
-
*/
|
106 |
-
private $timeOut = 1200;
|
107 |
-
|
108 |
-
|
109 |
-
/**
|
110 |
-
* The user agent
|
111 |
-
*
|
112 |
-
* @var string
|
113 |
-
*/
|
114 |
-
private $userAgent;
|
115 |
-
|
116 |
-
|
117 |
-
// class methods
|
118 |
-
/**
|
119 |
-
* Default constructor
|
120 |
-
*
|
121 |
-
* @return void
|
122 |
-
* @param string $applicationKey The application key to use.
|
123 |
-
* @param string $applicationSecret The application secret to use.
|
124 |
-
*/
|
125 |
-
public function __construct($applicationKey, $applicationSecret)
|
126 |
-
{
|
127 |
-
$this->setApplicationKey($applicationKey);
|
128 |
-
$this->setApplicationSecret($applicationSecret);
|
129 |
-
}
|
130 |
-
|
131 |
-
|
132 |
-
/**
|
133 |
-
* Default destructor
|
134 |
-
*
|
135 |
-
* @return void
|
136 |
-
*/
|
137 |
-
public function __destruct()
|
138 |
-
{
|
139 |
-
if($this->curl != null) curl_close($this->curl);
|
140 |
-
}
|
141 |
-
|
142 |
-
|
143 |
-
/**
|
144 |
-
* Format the parameters as a querystring
|
145 |
-
*
|
146 |
-
* @return string
|
147 |
-
* @param array $parameters The parameters to pass.
|
148 |
-
*/
|
149 |
-
private function buildQuery(array $parameters)
|
150 |
-
{
|
151 |
-
// no parameters?
|
152 |
-
if(empty($parameters)) return '';
|
153 |
-
|
154 |
-
// encode the keys
|
155 |
-
$keys = self::urlencode_rfc3986(array_keys($parameters));
|
156 |
-
|
157 |
-
// encode the values
|
158 |
-
$values = self::urlencode_rfc3986(array_values($parameters));
|
159 |
-
|
160 |
-
// reset the parameters
|
161 |
-
$parameters = array_combine($keys, $values);
|
162 |
-
|
163 |
-
// sort parameters by key
|
164 |
-
uksort($parameters, 'strcmp');
|
165 |
-
|
166 |
-
// loop parameters
|
167 |
-
foreach($parameters as $key => $value)
|
168 |
-
{
|
169 |
-
// sort by value
|
170 |
-
if(is_array($value)) $parameters[$key] = natsort($value);
|
171 |
-
}
|
172 |
-
|
173 |
-
// process parameters
|
174 |
-
foreach($parameters as $key => $value) $chunks[] = $key . '=' . str_replace('%25', '%', $value);
|
175 |
-
|
176 |
-
// return
|
177 |
-
return implode('&', $chunks);
|
178 |
-
}
|
179 |
-
|
180 |
-
|
181 |
-
/**
|
182 |
-
* All OAuth 1.0 requests use the same basic algorithm for creating a signature base string and a signature.
|
183 |
-
* The signature base string is composed of the HTTP method being used, followed by an ampersand ("&") and then the URL-encoded base URL being accessed,
|
184 |
-
* complete with path (but not query parameters), followed by an ampersand ("&").
|
185 |
-
* Then, you take all query parameters and POST body parameters (when the POST body is of the URL-encoded type, otherwise the POST body is ignored),
|
186 |
-
* including the OAuth parameters necessary for negotiation with the request at hand, and sort them in lexicographical order by first parameter name and
|
187 |
-
* then parameter value (for duplicate parameters), all the while ensuring that both the key and the value for each parameter are URL encoded in isolation.
|
188 |
-
* Instead of using the equals ("=") sign to mark the key/value relationship, you use the URL-encoded form of "%3D". Each parameter is then joined by the
|
189 |
-
* URL-escaped ampersand sign, "%26".
|
190 |
-
*
|
191 |
-
* @return string
|
192 |
-
* @param string $url The url to use.
|
193 |
-
* @param string $method The method that will be called.
|
194 |
-
* @param array $parameters The parameters to pass.
|
195 |
-
*/
|
196 |
-
private function calculateBaseString($url, $method, array $parameters)
|
197 |
-
{
|
198 |
-
// redefine
|
199 |
-
$url = (string) $url;
|
200 |
-
$parameters = (array) $parameters;
|
201 |
-
|
202 |
-
// init var
|
203 |
-
$pairs = array();
|
204 |
-
$chunks = array();
|
205 |
-
|
206 |
-
// sort parameters by key
|
207 |
-
uksort($parameters, 'strcmp');
|
208 |
-
|
209 |
-
// loop parameters
|
210 |
-
foreach($parameters as $key => $value)
|
211 |
-
{
|
212 |
-
// sort by value
|
213 |
-
if(is_array($value)) $parameters[$key] = natsort($value);
|
214 |
-
}
|
215 |
-
|
216 |
-
// process queries
|
217 |
-
foreach($parameters as $key => $value)
|
218 |
-
{
|
219 |
-
// only add if not already in the url
|
220 |
-
if(substr_count($url, $key . '=' . $value) == 0) $chunks[] = self::urlencode_rfc3986($key) . '%3D' . self::urlencode_rfc3986($value);
|
221 |
-
}
|
222 |
-
|
223 |
-
$urlChunks = explode('/', $url);
|
224 |
-
$i = 0;
|
225 |
-
|
226 |
-
foreach($urlChunks as &$chunk)
|
227 |
-
{
|
228 |
-
if($i > 4) $chunk = self::urlencode_rfc3986($chunk);
|
229 |
-
else $chunk = urlencode($chunk);
|
230 |
-
|
231 |
-
$i++;
|
232 |
-
|
233 |
-
}
|
234 |
-
|
235 |
-
// build base
|
236 |
-
$base = $method . '&';
|
237 |
-
$base .= implode('%2F', $urlChunks);
|
238 |
-
$base .= (substr_count($url, '?')) ? '%26' : '&';
|
239 |
-
$base .= implode('%26', $chunks);
|
240 |
-
$base = str_replace(array('%3F', '%20'), array('&', '%2520'), $base);
|
241 |
-
|
242 |
-
// return
|
243 |
-
return $base;
|
244 |
-
}
|
245 |
-
|
246 |
-
|
247 |
-
/**
|
248 |
-
* Build the Authorization header
|
249 |
-
* @later: fix me
|
250 |
-
*
|
251 |
-
* @return string
|
252 |
-
* @param array $parameters The parameters to pass.
|
253 |
-
* @param string $url The url to use.
|
254 |
-
*/
|
255 |
-
private function calculateHeader(array $parameters, $url)
|
256 |
-
{
|
257 |
-
// redefine
|
258 |
-
$url = (string) $url;
|
259 |
-
|
260 |
-
// divide into parts
|
261 |
-
$parts = parse_url($url);
|
262 |
-
|
263 |
-
// init var
|
264 |
-
$chunks = array();
|
265 |
-
|
266 |
-
// process queries
|
267 |
-
foreach($parameters as $key => $value) $chunks[] = str_replace('%25', '%', self::urlencode_rfc3986($key) . '="' . self::urlencode_rfc3986($value) . '"');
|
268 |
-
$parts['path']=str_replace("%2F", "/", rawurlencode($parts['path']));
|
269 |
-
// build return
|
270 |
-
$return = 'Authorization: OAuth realm="' . $parts['scheme'] . '://' . $parts['host'] . $parts['path'] . '", ';
|
271 |
-
$return .= implode(',', $chunks);
|
272 |
-
// prepend name and OAuth part
|
273 |
-
return $return;
|
274 |
-
}
|
275 |
-
|
276 |
-
|
277 |
-
/**
|
278 |
-
* Make an call to the oAuth
|
279 |
-
* @todo refactor me
|
280 |
-
*
|
281 |
-
* @return array
|
282 |
-
* @param string $url The url that has to be called.
|
283 |
-
* @param array[optional] $parameters The parameters to pass.
|
284 |
-
* @param string[optional] $method Which HTTP-method should we use? Possible values are POST, GET.
|
285 |
-
* @param bool[optional] $expectJSON Do we expect JSON?
|
286 |
-
*/
|
287 |
-
private function doOAuthCall($url, array $parameters = null, $method = 'POST', $expectJSON = true)
|
288 |
-
{
|
289 |
-
// redefine
|
290 |
-
$url = (string) $url;
|
291 |
-
|
292 |
-
// append default parameters
|
293 |
-
$parameters['oauth_consumer_key'] = $this->getApplicationKey();
|
294 |
-
$parameters['oauth_nonce'] = md5(microtime() . rand());
|
295 |
-
$parameters['oauth_timestamp'] = time();
|
296 |
-
$parameters['oauth_signature_method'] = 'HMAC-SHA1';
|
297 |
-
$parameters['oauth_version'] = '1.0';
|
298 |
-
|
299 |
-
// calculate the base string
|
300 |
-
$base = $this->calculateBaseString(self::API_URL . '/' . $url, 'POST', $parameters);
|
301 |
-
|
302 |
-
// add sign into the parameters
|
303 |
-
$parameters['oauth_signature'] = $this->hmacsha1($this->getApplicationSecret() . '&' . $this->getOAuthTokenSecret(), $base);
|
304 |
-
|
305 |
-
// calculate header
|
306 |
-
$header = $this->calculateHeader($parameters, self::API_URL . '/' . $url);
|
307 |
-
|
308 |
-
if($method == 'POST')
|
309 |
-
{
|
310 |
-
$options[CURLOPT_POST] = true;
|
311 |
-
$options[CURLOPT_POSTFIELDS] = $this->buildQuery($parameters);
|
312 |
-
}
|
313 |
-
|
314 |
-
else
|
315 |
-
{
|
316 |
-
// reset post
|
317 |
-
$options[CURLOPT_POST] = 0;
|
318 |
-
unset($options[CURLOPT_POSTFIELDS]);
|
319 |
-
|
320 |
-
// add the parameters into the querystring
|
321 |
-
if(!empty($parameters)) $url .= '?' . $this->buildQuery($parameters);
|
322 |
-
}
|
323 |
-
|
324 |
-
// set options
|
325 |
-
$options[CURLOPT_URL] = self::API_URL . '/' . $url;
|
326 |
-
$options[CURLOPT_PORT] = self::API_PORT;
|
327 |
-
$options[CURLOPT_USERAGENT] = $this->getUserAgent();
|
328 |
-
if(ini_get('open_basedir') == '' && ini_get('safe_mode' == 'Off')) $options[CURLOPT_FOLLOWLOCATION] = true;
|
329 |
-
$options[CURLOPT_RETURNTRANSFER] = true;
|
330 |
-
$options[CURLOPT_TIMEOUT] = (int) $this->getTimeOut();
|
331 |
-
$options[CURLOPT_SSL_VERIFYPEER] = false;
|
332 |
-
$options[CURLOPT_SSL_VERIFYHOST] = false;
|
333 |
-
$options[CURLOPT_HTTPHEADER] = array('Expect:');
|
334 |
-
|
335 |
-
// init
|
336 |
-
$this->curl = curl_init();
|
337 |
-
|
338 |
-
// set options
|
339 |
-
curl_setopt_array($this->curl, $options);
|
340 |
-
|
341 |
-
// execute
|
342 |
-
$response = curl_exec($this->curl);
|
343 |
-
$headers = curl_getinfo($this->curl);
|
344 |
-
|
345 |
-
// fetch errors
|
346 |
-
$errorNumber = curl_errno($this->curl);
|
347 |
-
$errorMessage = curl_error($this->curl);
|
348 |
-
|
349 |
-
// error?
|
350 |
-
if($errorNumber != '') throw new DropboxException($errorMessage, $errorNumber);
|
351 |
-
|
352 |
-
// return
|
353 |
-
if($expectJSON) return json_decode($response, true);
|
354 |
-
|
355 |
-
// fallback
|
356 |
-
return $response;
|
357 |
-
}
|
358 |
-
|
359 |
-
|
360 |
-
/**
|
361 |
-
* Make the call
|
362 |
-
*
|
363 |
-
* @return string
|
364 |
-
* @param string $url The url to call.
|
365 |
-
* @param array[optional] $parameters Optional parameters.
|
366 |
-
* @param bool[optional] $method The method to use. Possible values are GET, POST.
|
367 |
-
* @param string[optional] $filePath The path to the file to upload.
|
368 |
-
* @param bool[optional] $expectJSON Do we expect JSON?
|
369 |
-
* @param bool[optional] $isContent Is this content?
|
370 |
-
*/
|
371 |
-
private function doCall($url, array $parameters = null, $method = 'GET', $filePath = null, $expectJSON = true, $isContent = false)
|
372 |
-
{
|
373 |
-
// allowed methods
|
374 |
-
$allowedMethods = array('GET', 'POST');
|
375 |
-
|
376 |
-
// redefine
|
377 |
-
$url = (string) $url;
|
378 |
-
$parameters = (array) $parameters;
|
379 |
-
$method = (string) $method;
|
380 |
-
$expectJSON = (bool) $expectJSON;
|
381 |
-
|
382 |
-
// validate method
|
383 |
-
if(!in_array($method, $allowedMethods)) throw new DropboxException('Unknown method (' . $method . '). Allowed methods are: ' . implode(', ', $allowedMethods));
|
384 |
-
|
385 |
-
// append default parameters
|
386 |
-
$oauth['oauth_consumer_key'] = $this->getApplicationKey();
|
387 |
-
$oauth['oauth_nonce'] = md5(microtime() . rand());
|
388 |
-
$oauth['oauth_timestamp'] = time();
|
389 |
-
$oauth['oauth_token'] = $this->getOAuthToken();
|
390 |
-
$oauth['oauth_signature_method'] = 'HMAC-SHA1';
|
391 |
-
$oauth['oauth_version'] = '1.0';
|
392 |
-
|
393 |
-
// set data
|
394 |
-
$data = $oauth;
|
395 |
-
if(!empty($parameters))
|
396 |
-
{
|
397 |
-
// convert to UTF-8
|
398 |
-
foreach($parameters as &$value) $value = utf8_encode($value);
|
399 |
-
|
400 |
-
// merge
|
401 |
-
$data = array_merge($data, $parameters);
|
402 |
-
}
|
403 |
-
|
404 |
-
if($filePath != null)
|
405 |
-
{
|
406 |
-
// process file
|
407 |
-
$fileInfo = pathinfo($filePath);
|
408 |
-
|
409 |
-
// add to the data
|
410 |
-
$data['file'] = $fileInfo['basename'];
|
411 |
-
|
412 |
-
}
|
413 |
-
|
414 |
-
// calculate the base string
|
415 |
-
if($isContent) $base = $this->calculateBaseString(self::API_CONTENT_URL . '/' . $url, $method, $data);
|
416 |
-
else $base = $this->calculateBaseString(self::API_URL . '/' . $url, $method, $data);
|
417 |
-
|
418 |
-
// based on the method, we should handle the parameters in a different way
|
419 |
-
if($method == 'POST')
|
420 |
-
{
|
421 |
-
// file provided?
|
422 |
-
if($filePath != null)
|
423 |
-
{
|
424 |
-
// build a boundary
|
425 |
-
$boundary = md5(time());
|
426 |
-
|
427 |
-
// init var
|
428 |
-
$content = '--' . $boundary . "\r\n";
|
429 |
-
|
430 |
-
// set file
|
431 |
-
$content .= 'Content-Disposition: form-data; name=file; filename="' . $fileInfo['basename'] . '"' . "\r\n";
|
432 |
-
$content .= 'Content-Type: application/octet-stream' . "\r\n";
|
433 |
-
$content .= "\r\n";
|
434 |
-
$content .= file_get_contents($filePath);
|
435 |
-
$content .= "\r\n";
|
436 |
-
$content .= "--" . $boundary . '--';
|
437 |
-
|
438 |
-
// build headers
|
439 |
-
$headers[] = 'Content-Type: multipart/form-data; boundary=' . $boundary;
|
440 |
-
$headers[] = 'Content-Length: ' . strlen($content);
|
441 |
-
|
442 |
-
// set content
|
443 |
-
$options[CURLOPT_POSTFIELDS] = $content;
|
444 |
-
}
|
445 |
-
|
446 |
-
// no file
|
447 |
-
else $options[CURLOPT_POSTFIELDS] = $this->buildQuery($parameters);
|
448 |
-
|
449 |
-
// enable post
|
450 |
-
$options[CURLOPT_POST] = 1;
|
451 |
-
}
|
452 |
-
|
453 |
-
else
|
454 |
-
{
|
455 |
-
// reset post
|
456 |
-
$options[CURLOPT_POST] = 0;
|
457 |
-
unset($options[CURLOPT_POSTFIELDS]);
|
458 |
-
$url=str_replace("%2F", "/", rawurlencode($url));
|
459 |
-
|
460 |
-
// add the parameters into the querystring
|
461 |
-
if(!empty($parameters)) $url .= '?' . $this->buildQuery($parameters);
|
462 |
-
}
|
463 |
-
|
464 |
-
// add sign into the parameters
|
465 |
-
$oauth['oauth_signature'] = $this->hmacsha1($this->getApplicationSecret() . '&' . $this->getOAuthTokenSecret(), $base);
|
466 |
-
|
467 |
-
if($isContent) $headers[] = $this->calculateHeader($oauth, self::API_CONTENT_URL . '/' . $url);
|
468 |
-
else $headers[] = $this->calculateHeader($oauth, self::API_URL . '/' . $url);
|
469 |
-
$headers[] = 'Expect:';
|
470 |
-
|
471 |
-
// set options
|
472 |
-
if($isContent) $options[CURLOPT_URL] = self::API_CONTENT_URL . '/' . $url;
|
473 |
-
else $options[CURLOPT_URL] = self::API_URL . '/' . $url;
|
474 |
-
$options[CURLOPT_PORT] = self::API_PORT;
|
475 |
-
$options[CURLOPT_USERAGENT] = $this->getUserAgent();
|
476 |
-
if(ini_get('open_basedir') == '' && ini_get('safe_mode' == 'Off')) $options[CURLOPT_FOLLOWLOCATION] = true;
|
477 |
-
$options[CURLOPT_RETURNTRANSFER] = true;
|
478 |
-
$options[CURLOPT_TIMEOUT] = (int) $this->getTimeOut();
|
479 |
-
$options[CURLOPT_SSL_VERIFYPEER] = false;
|
480 |
-
$options[CURLOPT_SSL_VERIFYHOST] = false;
|
481 |
-
$options[CURLOPT_HTTP_VERSION] = CURL_HTTP_VERSION_1_1;
|
482 |
-
$options[CURLOPT_HTTPHEADER] = $headers;
|
483 |
-
// init
|
484 |
-
if($this->curl == null) $this->curl = curl_init();
|
485 |
-
|
486 |
-
// set options
|
487 |
-
curl_setopt_array($this->curl, $options);
|
488 |
-
|
489 |
-
// execute
|
490 |
-
$response = curl_exec($this->curl);
|
491 |
-
$headers = curl_getinfo($this->curl);
|
492 |
-
|
493 |
-
// fetch errors
|
494 |
-
$errorNumber = curl_errno($this->curl);
|
495 |
-
$errorMessage = curl_error($this->curl);
|
496 |
-
|
497 |
-
if(!$expectJSON && $isContent)
|
498 |
-
{
|
499 |
-
// is it JSON?
|
500 |
-
$json = @json_decode($response, true);
|
501 |
-
if($json !== false && isset($json['error'])) throw new DropboxException($json['error']);
|
502 |
-
|
503 |
-
// set return
|
504 |
-
$return['content_type'] = $headers['content_type'];
|
505 |
-
$return['data'] = base64_encode($response);
|
506 |
-
|
507 |
-
// return
|
508 |
-
return $return;
|
509 |
-
}
|
510 |
-
|
511 |
-
// we don't expect JSON, return the response
|
512 |
-
if(!$expectJSON) return $response;
|
513 |
-
|
514 |
-
// replace ids with their string values, added because of some PHP-version can't handle these large values
|
515 |
-
$response = preg_replace('/id":(\d+)/', 'id":"\1"', $response);
|
516 |
-
|
517 |
-
// we expect JSON, so decode it
|
518 |
-
$json = @json_decode($response, true);
|
519 |
-
|
520 |
-
// validate JSON
|
521 |
-
if($json === null)
|
522 |
-
{
|
523 |
-
// should we provide debug information
|
524 |
-
if(self::DEBUG)
|
525 |
-
{
|
526 |
-
// make it output proper
|
527 |
-
echo '<pre>';
|
528 |
-
|
529 |
-
// dump the header-information
|
530 |
-
var_dump($headers);
|
531 |
-
|
532 |
-
// dump the error
|
533 |
-
var_dump($errorMessage);
|
534 |
-
|
535 |
-
// dump the raw response
|
536 |
-
var_dump($response);
|
537 |
-
|
538 |
-
// end proper format
|
539 |
-
echo '</pre>';
|
540 |
-
}
|
541 |
-
|
542 |
-
// throw exception
|
543 |
-
throw new DropboxException('Invalid response.');
|
544 |
-
}
|
545 |
-
|
546 |
-
// any error
|
547 |
-
if(isset($json['error']))
|
548 |
-
{
|
549 |
-
// should we provide debug information
|
550 |
-
if(self::DEBUG)
|
551 |
-
{
|
552 |
-
// make it output proper
|
553 |
-
echo '<pre>';
|
554 |
-
|
555 |
-
// dump the header-information
|
556 |
-
var_dump($headers);
|
557 |
-
|
558 |
-
// dump the raw response
|
559 |
-
var_dump($response);
|
560 |
-
|
561 |
-
// end proper format
|
562 |
-
echo '</pre>';
|
563 |
-
}
|
564 |
-
|
565 |
-
if(isset($json['error']) && is_string($json['error'])) $message = $json['error'];
|
566 |
-
elseif(isset($json['error']['hash']) && $json['error']['hash'] != '') $message = (string) $json['error']['hash'];
|
567 |
-
else $message = 'Invalid response.';
|
568 |
-
|
569 |
-
// throw exception
|
570 |
-
throw new DropboxException($message);
|
571 |
-
}
|
572 |
-
|
573 |
-
// return
|
574 |
-
return $json;
|
575 |
-
}
|
576 |
-
|
577 |
-
|
578 |
-
/**
|
579 |
-
* Get the application key
|
580 |
-
*
|
581 |
-
* @return string
|
582 |
-
*/
|
583 |
-
private function getApplicationKey()
|
584 |
-
{
|
585 |
-
return $this->applicationKey;
|
586 |
-
}
|
587 |
-
|
588 |
-
|
589 |
-
/**
|
590 |
-
* Get the application secret
|
591 |
-
*
|
592 |
-
* @return string
|
593 |
-
*/
|
594 |
-
private function getApplicationSecret()
|
595 |
-
{
|
596 |
-
return $this->applicationSecret;
|
597 |
-
}
|
598 |
-
|
599 |
-
|
600 |
-
/**
|
601 |
-
* Get the oAuth-token
|
602 |
-
*
|
603 |
-
* @return string
|
604 |
-
*/
|
605 |
-
private function getOAuthToken()
|
606 |
-
{
|
607 |
-
return $this->oAuthToken;
|
608 |
-
}
|
609 |
-
|
610 |
-
|
611 |
-
/**
|
612 |
-
* Get the oAuth-token-secret
|
613 |
-
*
|
614 |
-
* @return string
|
615 |
-
*/
|
616 |
-
private function getOAuthTokenSecret()
|
617 |
-
{
|
618 |
-
return $this->oAuthTokenSecret;
|
619 |
-
}
|
620 |
-
|
621 |
-
|
622 |
-
/**
|
623 |
-
* Get the timeout
|
624 |
-
*
|
625 |
-
* @return int
|
626 |
-
*/
|
627 |
-
public function getTimeOut()
|
628 |
-
{
|
629 |
-
return (int) $this->timeOut;
|
630 |
-
}
|
631 |
-
|
632 |
-
|
633 |
-
/**
|
634 |
-
* Get the useragent that will be used. Our version will be prepended to yours.
|
635 |
-
* It will look like: "PHP Dropbox/<version> <your-user-agent>"
|
636 |
-
*
|
637 |
-
* @return string
|
638 |
-
*/
|
639 |
-
public function getUserAgent()
|
640 |
-
{
|
641 |
-
return (string) 'PHP Dropbox/' . self::VERSION . ' ' . $this->userAgent;
|
642 |
-
}
|
643 |
-
|
644 |
-
|
645 |
-
/**
|
646 |
-
* Set the application key
|
647 |
-
*
|
648 |
-
* @return void
|
649 |
-
* @param string $key The application key to use.
|
650 |
-
*/
|
651 |
-
private function setApplicationKey($key)
|
652 |
-
{
|
653 |
-
$this->applicationKey = (string) $key;
|
654 |
-
}
|
655 |
-
|
656 |
-
|
657 |
-
/**
|
658 |
-
* Set the application secret
|
659 |
-
*
|
660 |
-
* @return void
|
661 |
-
* @param string $secret The application secret to use.
|
662 |
-
*/
|
663 |
-
private function setApplicationSecret($secret)
|
664 |
-
{
|
665 |
-
$this->applicationSecret = (string) $secret;
|
666 |
-
}
|
667 |
-
|
668 |
-
|
669 |
-
/**
|
670 |
-
* Set the oAuth-token
|
671 |
-
*
|
672 |
-
* @return void
|
673 |
-
* @param string $token The token to use.
|
674 |
-
*/
|
675 |
-
public function setOAuthToken($token)
|
676 |
-
{
|
677 |
-
$this->oAuthToken = (string) $token;
|
678 |
-
}
|
679 |
-
|
680 |
-
|
681 |
-
/**
|
682 |
-
* Set the oAuth-secret
|
683 |
-
*
|
684 |
-
* @return void
|
685 |
-
* @param string $secret The secret to use.
|
686 |
-
*/
|
687 |
-
public function setOAuthTokenSecret($secret)
|
688 |
-
{
|
689 |
-
$this->oAuthTokenSecret = (string) $secret;
|
690 |
-
}
|
691 |
-
|
692 |
-
|
693 |
-
/**
|
694 |
-
* Set the timeout
|
695 |
-
*
|
696 |
-
* @return void
|
697 |
-
* @param int $seconds The timeout in seconds.
|
698 |
-
*/
|
699 |
-
public function setTimeOut($seconds)
|
700 |
-
{
|
701 |
-
$this->timeOut = (int) $seconds;
|
702 |
-
}
|
703 |
-
|
704 |
-
|
705 |
-
/**
|
706 |
-
* Get the useragent that will be used. Our version will be prepended to yours.
|
707 |
-
* It will look like: "PHP Dropbox/<version> <your-user-agent>"
|
708 |
-
*
|
709 |
-
* @return void
|
710 |
-
* @param string $userAgent Your user-agent, it should look like <app-name>/<app-version>.
|
711 |
-
*/
|
712 |
-
public function setUserAgent($userAgent)
|
713 |
-
{
|
714 |
-
$this->userAgent = (string) $userAgent;
|
715 |
-
}
|
716 |
-
|
717 |
-
|
718 |
-
/**
|
719 |
-
* Build the signature for the data
|
720 |
-
*
|
721 |
-
* @return string
|
722 |
-
* @param string $key The key to use for signing.
|
723 |
-
* @param string $data The data that has to be signed.
|
724 |
-
*/
|
725 |
-
private function hmacsha1($key, $data)
|
726 |
-
{
|
727 |
-
return base64_encode(hash_hmac('SHA1', $data, $key, true));
|
728 |
-
}
|
729 |
-
|
730 |
-
|
731 |
-
/**
|
732 |
-
* URL-encode method for internatl use
|
733 |
-
*
|
734 |
-
* @return string
|
735 |
-
* @param mixed $value The value to encode.
|
736 |
-
*/
|
737 |
-
private static function urlencode_rfc3986($value)
|
738 |
-
{
|
739 |
-
if(is_array($value)) return array_map(array('Dropbox', 'urlencode_rfc3986'), $value);
|
740 |
-
else
|
741 |
-
{
|
742 |
-
$search = array('+', ' ', '%7E', '%');
|
743 |
-
$replace = array('%20', '%20', '~', '%25');
|
744 |
-
|
745 |
-
return str_replace($search, $replace, rawurlencode($value));
|
746 |
-
}
|
747 |
-
}
|
748 |
-
|
749 |
-
|
750 |
-
// oauth resources
|
751 |
-
/**
|
752 |
-
* Call for obtaining an OAuth request token.
|
753 |
-
* Returns a request token and the corresponding request token secret. This token and secret cannot be used to sign requests for the /metadata and /file content API calls.
|
754 |
-
* Their only purpose is for signing a request to oauth/access_token once the user has gone through the application authorization steps provided by oauth/authorize.
|
755 |
-
*
|
756 |
-
* @return array
|
757 |
-
*/
|
758 |
-
public function oAuthRequestToken()
|
759 |
-
{
|
760 |
-
// make the call
|
761 |
-
$response = $this->doOAuthCall('1/oauth/request_token', null, 'POST', false);
|
762 |
-
|
763 |
-
// process response
|
764 |
-
$response = (array) explode('&', $response);
|
765 |
-
$return = array();
|
766 |
-
|
767 |
-
// loop chunks
|
768 |
-
foreach($response as $chunk)
|
769 |
-
{
|
770 |
-
// split again
|
771 |
-
$chunks = explode('=', $chunk, 2);
|
772 |
-
|
773 |
-
// store return
|
774 |
-
if(count($chunks) == 2) $return[$chunks[0]] = $chunks[1];
|
775 |
-
}
|
776 |
-
|
777 |
-
// return
|
778 |
-
return $return;
|
779 |
-
}
|
780 |
-
|
781 |
-
|
782 |
-
/**
|
783 |
-
* Redirect the user to the oauth/authorize location so that Dropbox can authenticate the user and ask whether or not the user wants to authorize the application to access
|
784 |
-
* file metadata and content on its behalf. oauth/authorize is not an API call per se, because it does not have a return value, but rather directs the user to a page on
|
785 |
-
* api.dropbox.com where they are provided means to log in to Dropbox and grant authority to the application requesting it.
|
786 |
-
* The page served by oauth/authorize should be presented to the user through their web browser.
|
787 |
-
* Please note, without directing the user to a Dropbox-provided page via oauth/authorize, it is impossible for your application to use the request token it received
|
788 |
-
* via oauth/request_token to obtain an access token from oauth/access_token.
|
789 |
-
*
|
790 |
-
* @return void
|
791 |
-
* @param string $oauthToken The request token of the application requesting authority from a user.
|
792 |
-
* @param string[optional] $oauthCallback After the user authorizes an application, the user is redirected to the application-served URL provided by this parameter.
|
793 |
-
*/
|
794 |
-
public function oAuthAuthorize($oauthToken, $oauthCallback = null)
|
795 |
-
{
|
796 |
-
// build parameters
|
797 |
-
$parameters = array();
|
798 |
-
$parameters['oauth_token'] = (string) $oauthToken;
|
799 |
-
if($oauthCallback !== null) $parameters['oauth_callback'] = (string) $oauthCallback;
|
800 |
-
|
801 |
-
// build url
|
802 |
-
$url = self::API_AUTH_URL . '/1/oauth/authorize?' . http_build_query($parameters);
|
803 |
-
|
804 |
-
// redirect
|
805 |
-
header('Location: ' . $url);
|
806 |
-
exit;
|
807 |
-
}
|
808 |
-
|
809 |
-
public function iwp_oAuthAuthorize($oauthToken, $oauthCallback = null)
|
810 |
-
{
|
811 |
-
// build parameters
|
812 |
-
$parameters = array();
|
813 |
-
$parameters['oauth_token'] = (string) $oauthToken;
|
814 |
-
if($oauthCallback !== null) $parameters['oauth_callback'] = (string) $oauthCallback;
|
815 |
-
|
816 |
-
// build url
|
817 |
-
$url = self::API_AUTH_URL . '/1/oauth/authorize?' . http_build_query($parameters);
|
818 |
-
|
819 |
-
return $url;
|
820 |
-
}
|
821 |
-
|
822 |
-
/**
|
823 |
-
* This call returns a access token and the corresponding access token secret.
|
824 |
-
* Upon return, the authorization process is now complete and the access token and corresponding secret are used to sign requests for the metadata and file content API calls.
|
825 |
-
*
|
826 |
-
* @return array
|
827 |
-
* @param string $oauthToken The token returned after authorizing.
|
828 |
-
*/
|
829 |
-
public function oAuthAccessToken($oauthToken)
|
830 |
-
{
|
831 |
-
// build parameters
|
832 |
-
$parameters = array();
|
833 |
-
$parameters['oauth_token'] = (string) $oauthToken;
|
834 |
-
|
835 |
-
// make the call
|
836 |
-
$response = $this->doOAuthCall('1/oauth/access_token', $parameters, 'POST', false);
|
837 |
-
|
838 |
-
// process response
|
839 |
-
$response = (array) explode('&', $response);
|
840 |
-
$return = array();
|
841 |
-
|
842 |
-
// loop chunks
|
843 |
-
foreach($response as $chunk)
|
844 |
-
{
|
845 |
-
// split again
|
846 |
-
$chunks = explode('=', $chunk, 2);
|
847 |
-
|
848 |
-
// store return
|
849 |
-
if(count($chunks) == 2) $return[$chunks[0]] = $chunks[1];
|
850 |
-
}
|
851 |
-
|
852 |
-
// return
|
853 |
-
return $return;
|
854 |
-
}
|
855 |
-
|
856 |
-
|
857 |
-
// token resources
|
858 |
-
/**
|
859 |
-
* The token call provides a consumer/secret key pair you can use to consistently access the user's account.
|
860 |
-
* This is the preferred method of authentication over storing the username and password.
|
861 |
-
* Use the key pair as a signature with every subsequent call.
|
862 |
-
* The request must be signed using the application's developer and secret key token. Request or access tokens are necessary.
|
863 |
-
*
|
864 |
-
* Warning: DO NOT STORE THE USER'S PASSWORD! The way this call works is you call it once with the user's email and password and then
|
865 |
-
* keep the token around for later. You do NOT (I repeat NOT) call this before everything you do or on each program startup.
|
866 |
-
* We watch for this and will shut down your application with little notice if we catch you.
|
867 |
-
* In fact, the Objective-C code does this for you so you can't get it wrong.
|
868 |
-
*
|
869 |
-
* @return array Upon successful verification of the user's credentials, returns an array representation of the access token and secret.
|
870 |
-
* @param string $email The email account of the user.
|
871 |
-
* @param string $password The password of the user.
|
872 |
-
*/
|
873 |
-
public function token($email, $password)
|
874 |
-
{
|
875 |
-
// build parameters
|
876 |
-
$parameters = array();
|
877 |
-
$parameters['email'] = (string) $email;
|
878 |
-
$parameters['password'] = (string) $password;
|
879 |
-
|
880 |
-
// make the call
|
881 |
-
$response = (array) $this->doOAuthCall('1/token', $parameters);
|
882 |
-
|
883 |
-
// validate and set
|
884 |
-
if(isset($response['token'])) $this->setOAuthToken($response['token']);
|
885 |
-
if(isset($response['secret'])) $this->setOAuthTokenSecret($response['secret']);
|
886 |
-
|
887 |
-
// return
|
888 |
-
return $response;
|
889 |
-
}
|
890 |
-
|
891 |
-
|
892 |
-
// account resources
|
893 |
-
/**
|
894 |
-
* Given a set of account information, the account call allows an application to create a new Dropbox user account.
|
895 |
-
* This is useful for situations where the trusted third party application is possibly the user's first interaction with Dropbox.
|
896 |
-
*
|
897 |
-
* @return bool
|
898 |
-
* @param string $email The email account of the user.
|
899 |
-
* @param string $password The password for the user.
|
900 |
-
* @param string $firstName The user's first name.
|
901 |
-
* @param string $lastName The user's last name.
|
902 |
-
*/
|
903 |
-
public function account($email, $password, $firstName, $lastName)
|
904 |
-
{
|
905 |
-
// build parameters
|
906 |
-
$parameters['email'] = (string) $email;
|
907 |
-
$parameters['first_name'] = (string) $firstName;
|
908 |
-
$parameters['last_name'] = (string) $lastName;
|
909 |
-
$parameters['password'] = (string) $password;
|
910 |
-
|
911 |
-
return (bool) ($this->doCall('1/account', $parameters, 'POST', null, false) == 'OK');
|
912 |
-
}
|
913 |
-
|
914 |
-
|
915 |
-
/**
|
916 |
-
* Get the user account information.
|
917 |
-
*
|
918 |
-
* @return array
|
919 |
-
*/
|
920 |
-
public function accountInfo()
|
921 |
-
{
|
922 |
-
// make the call
|
923 |
-
return (array) $this->doCall('1/account/info');
|
924 |
-
}
|
925 |
-
|
926 |
-
|
927 |
-
// files & metadata
|
928 |
-
/**
|
929 |
-
* Retrieves file contents relative to the user's Dropbox root or the application's directory within the user's Dropbox.
|
930 |
-
*
|
931 |
-
* @return string
|
932 |
-
* @param string $path Path of the directory wherin the file is located.
|
933 |
-
* @param bool[optional] $sandbox Sandbox mode?
|
934 |
-
*/
|
935 |
-
public function filesGet($path, $sandbox = false)
|
936 |
-
{
|
937 |
-
// build url
|
938 |
-
$url = '1/files/';
|
939 |
-
$url .= ($sandbox) ? 'sandbox/' : 'dropbox/';
|
940 |
-
$url .= trim((string) $path, '/');
|
941 |
-
|
942 |
-
// make the call
|
943 |
-
return $this->doCall($url, null, 'GET', null, false, true);
|
944 |
-
}
|
945 |
-
|
946 |
-
|
947 |
-
/**
|
948 |
-
* Uploads file contents relative to the user's Dropbox root or the application's directory within the user's Dropbox.
|
949 |
-
*
|
950 |
-
* @return bool
|
951 |
-
* @param string $path Path of the directory wherin the file should be uploaded.
|
952 |
-
* @param string $localFile Path to the local file.
|
953 |
-
* @param bool[optional] $sandbox Sandbox mode?
|
954 |
-
*/
|
955 |
-
public function filesPost($path, $localFile, $sandbox = false)
|
956 |
-
{
|
957 |
-
// build url
|
958 |
-
$url = '1/files/';
|
959 |
-
$url .= ($sandbox) ? 'sandbox/' : 'dropbox/';
|
960 |
-
$url .= trim((string) $path, '/');
|
961 |
-
|
962 |
-
// make the call
|
963 |
-
$return = $this->doCall($url, null, 'POST', $localFile, true, true);
|
964 |
-
// return the result
|
965 |
-
return (bool) (isset($return['size']) && $return['size'] == 'winner!');
|
966 |
-
}
|
967 |
-
|
968 |
-
|
969 |
-
/**
|
970 |
-
* Returns metadata for the file or directory at the given <path> location relative to the user's Dropbox or
|
971 |
-
* the user's application sandbox. If <path> represents a directory and the list parameter is true, the metadata will
|
972 |
-
* also include a listing of metadata for the directory's contents.
|
973 |
-
*
|
974 |
-
* @return array
|
975 |
-
* @param string[optional] $path The path to the file/director to get the metadata for.
|
976 |
-
* @param int[optional] $fileLimit When listing a directory, the service will not report listings containing more than $fileLimit files.
|
977 |
-
* @param bool[optional] $hash Listing return values include a hash representing the state of the directory's contents.
|
978 |
-
* @param bool[optional] $list If true, this call returns a list of metadata representations for the contents of the directory. If false, this call returns the metadata for the directory itself.
|
979 |
-
* @param bool[optional] $sandbox Sandbox mode?
|
980 |
-
*/
|
981 |
-
public function metadata($path = '', $fileLimit = 10000, $hash = false, $list = true, $sandbox = false)
|
982 |
-
{
|
983 |
-
// build url
|
984 |
-
$url = '1/metadata/';
|
985 |
-
$url .= ($sandbox) ? 'sandbox/' : 'dropbox/';
|
986 |
-
$url .= trim((string) $path, '/');
|
987 |
-
|
988 |
-
// build parameters
|
989 |
-
$parameters = null;
|
990 |
-
$parameters['file_limit'] = (int) $fileLimit;
|
991 |
-
if((bool) $hash) $parameters['hash'] = '';
|
992 |
-
$parameters['list'] = ($list) ? 'true': 'false';
|
993 |
-
|
994 |
-
// make the call
|
995 |
-
return (array) $this->doCall($url, $parameters);
|
996 |
-
}
|
997 |
-
|
998 |
-
|
999 |
-
/**
|
1000 |
-
* Get a minimized thumbnail for a photo.
|
1001 |
-
*
|
1002 |
-
* @return string Will return a base64_encode string with the JPEG-data
|
1003 |
-
* @param string $path The path to the photo.
|
1004 |
-
* @param string[optional] $size The size, possible values are: 'small' (32x32), 'medium' (64x64), 'large' (128x128).
|
1005 |
-
*/
|
1006 |
-
public function thumbnails($path, $size = 'small')
|
1007 |
-
{
|
1008 |
-
// build url
|
1009 |
-
$url = '1/thumbnails/dropbox/';
|
1010 |
-
$url .= trim((string) $path, '/');
|
1011 |
-
|
1012 |
-
// build parameters
|
1013 |
-
$parameters['size'] = (string) $size;
|
1014 |
-
|
1015 |
-
// make the call
|
1016 |
-
return $this->doCall($url, $parameters, 'GET', null, false, true);
|
1017 |
-
}
|
1018 |
-
|
1019 |
-
|
1020 |
-
// file operations
|
1021 |
-
/**
|
1022 |
-
* Copy a file or folder to a new location.
|
1023 |
-
*
|
1024 |
-
* @return array
|
1025 |
-
* @param string $fromPath fromPath specifies either a file or folder to be copied to the location specified by toPath. This path is interpreted relative to the location specified by root.
|
1026 |
-
* @param string $toPath toPath specifies the destination path including the new name for file or folder. This path is interpreted relative to the location specified by root.
|
1027 |
-
* @param bool[optional] $sandbox Sandbox mode?
|
1028 |
-
*/
|
1029 |
-
public function fileopsCopy($fromPath, $toPath, $sandbox = false)
|
1030 |
-
{
|
1031 |
-
// build url
|
1032 |
-
$url = '1/fileops/copy';
|
1033 |
-
|
1034 |
-
// build parameters
|
1035 |
-
$parameters['from_path'] = (string) $fromPath;
|
1036 |
-
$parameters['to_path'] = (string) $toPath;
|
1037 |
-
$parameters['root'] = ($sandbox) ? 'sandbox' : 'dropbox';
|
1038 |
-
|
1039 |
-
// make the call
|
1040 |
-
return $this->doCall($url, $parameters, 'POST');
|
1041 |
-
}
|
1042 |
-
|
1043 |
-
|
1044 |
-
/**
|
1045 |
-
* Create a folder relative to the user's Dropbox root or the user's application sandbox folder.
|
1046 |
-
*
|
1047 |
-
* @return array
|
1048 |
-
* @param string $path The path to the new folder to create, relative to root.
|
1049 |
-
* @param bool[optional] $sandbox Sandbox mode?
|
1050 |
-
*/
|
1051 |
-
public function fileopsCreateFolder($path, $sandbox = false)
|
1052 |
-
{
|
1053 |
-
// build url
|
1054 |
-
$url = '1/fileops/create_folder';
|
1055 |
-
|
1056 |
-
// build parameters
|
1057 |
-
$parameters['path'] = trim((string) $path, '/');
|
1058 |
-
$parameters['root'] = ($sandbox) ? 'sandbox' : 'dropbox';
|
1059 |
-
|
1060 |
-
// make the call
|
1061 |
-
return $this->doCall($url, $parameters, 'POST');
|
1062 |
-
}
|
1063 |
-
|
1064 |
-
|
1065 |
-
/**
|
1066 |
-
* Deletes a file or folder.
|
1067 |
-
*
|
1068 |
-
* @return array
|
1069 |
-
* @param string $path path specifies either a file or folder to be deleted. This path is interpreted relative to the location specified by root.
|
1070 |
-
* @param bool[optional] $sandbox Sandbox mode?
|
1071 |
-
*/
|
1072 |
-
public function fileopsDelete($path, $sandbox = false)
|
1073 |
-
{
|
1074 |
-
// build url
|
1075 |
-
$url = '1/fileops/delete';
|
1076 |
-
|
1077 |
-
// build parameters
|
1078 |
-
$parameters['path'] = trim((string) $path, '/');
|
1079 |
-
$parameters['root'] = ($sandbox) ? 'sandbox' : 'dropbox';
|
1080 |
-
// make the call
|
1081 |
-
return $this->doCall($url, $parameters, 'POST');
|
1082 |
-
}
|
1083 |
-
|
1084 |
-
|
1085 |
-
/**
|
1086 |
-
* Move a file or folder to a new location.
|
1087 |
-
*
|
1088 |
-
* @return array
|
1089 |
-
* @param string $fromPath fromPath specifies either a file or folder to be copied to the location specified by toPath. This path is interpreted relative to the location specified by root.
|
1090 |
-
* @param string $toPath toPath specifies the destination path including the new name for file or folder. This path is interpreted relative to the location specified by root.
|
1091 |
-
* @param bool[optional] $sandbox Sandbox mode?
|
1092 |
-
*/
|
1093 |
-
public function fileopsMove($fromPath, $toPath, $sandbox = false)
|
1094 |
-
{
|
1095 |
-
// build url
|
1096 |
-
$url = '1/fileops/move';
|
1097 |
-
|
1098 |
-
// build parameters
|
1099 |
-
$parameters['from_path'] = (string) $fromPath;
|
1100 |
-
$parameters['to_path'] = (string) $toPath;
|
1101 |
-
$parameters['root'] = ($sandbox) ? 'sandbox' : 'dropbox';
|
1102 |
-
|
1103 |
-
// make the call
|
1104 |
-
return $this->doCall($url, $parameters, 'POST');
|
1105 |
-
}
|
1106 |
-
|
1107 |
-
function _log($mixed)
|
1108 |
-
{
|
1109 |
-
if (is_array($mixed)) {
|
1110 |
-
$mixed = print_r($mixed, 1);
|
1111 |
-
} else if (is_object($mixed)) {
|
1112 |
-
ob_start();
|
1113 |
-
var_dump($mixed);
|
1114 |
-
$mixed = ob_get_clean();
|
1115 |
-
}
|
1116 |
-
|
1117 |
-
//$handle = fopen(dirname(__FILE__) . '/log', 'a');
|
1118 |
-
//fwrite($handle, $mixed . PHP_EOL);
|
1119 |
-
//fclose($handle);
|
1120 |
-
}
|
1121 |
-
}
|
1122 |
-
|
1123 |
-
|
1124 |
-
/**
|
1125 |
-
* Dropbox Exception class
|
1126 |
-
*
|
1127 |
-
* @author Tijs Verkoyen <php-dropbox@verkoyen.eu>
|
1128 |
-
*/
|
1129 |
-
class DropboxException extends Exception
|
1130 |
-
{
|
1131 |
-
}
|
1132 |
-
|
1133 |
-
?>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
lib/dropbox.php
ADDED
@@ -0,0 +1,283 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Dropbox {
|
3 |
+
const API_URL = 'https://api.dropbox.com/';
|
4 |
+
const API_CONTENT_URL = 'https://api-content.dropbox.com/';
|
5 |
+
const API_WWW_URL = 'https://www.dropbox.com/';
|
6 |
+
const API_VERSION_URL = '1/';
|
7 |
+
|
8 |
+
private $root;
|
9 |
+
private $ProgressFunction = false;
|
10 |
+
private $oauth_app_key;
|
11 |
+
private $oauth_app_secret;
|
12 |
+
private $oauth_token;
|
13 |
+
private $oauth_token_secret;
|
14 |
+
|
15 |
+
public function __construct($oauth_app_key, $oauth_app_secret, $dropbox=false) {
|
16 |
+
$this->oauth_app_key = $oauth_app_key;
|
17 |
+
$this->oauth_app_secret = $oauth_app_secret;
|
18 |
+
|
19 |
+
if ($dropbox)
|
20 |
+
$this->root = 'dropbox';
|
21 |
+
else
|
22 |
+
$this->root = 'sandbox';
|
23 |
+
}
|
24 |
+
|
25 |
+
public function setOAuthTokens($token,$secret) {
|
26 |
+
$this->oauth_token = $token;
|
27 |
+
$this->oauth_token_secret = $secret;
|
28 |
+
}
|
29 |
+
|
30 |
+
public function setProgressFunction($function=null) {
|
31 |
+
if (function_exists($function))
|
32 |
+
$this->ProgressFunction = $function;
|
33 |
+
else
|
34 |
+
$this->ProgressFunction = false;
|
35 |
+
}
|
36 |
+
|
37 |
+
public function accountInfo(){
|
38 |
+
$url = self::API_URL.self::API_VERSION_URL.'account/info';
|
39 |
+
return $this->request($url);
|
40 |
+
}
|
41 |
+
|
42 |
+
public function upload($file, $path = '',$overwrite=true){
|
43 |
+
$file = str_replace("\\", "/",$file);
|
44 |
+
if (!is_readable($file) or !is_file($file))
|
45 |
+
throw new DropboxException("Error: File \"$file\" is not readable or doesn't exist.");
|
46 |
+
$filesize=filesize($file);
|
47 |
+
if ($filesize < (1024*1024*50)) { //chunk transfer on bigger uploads <50MB
|
48 |
+
$filehandle = fopen($file,'r');
|
49 |
+
$url = self::API_CONTENT_URL.self::API_VERSION_URL.'files_put/'.$this->root.'/'.trim($path, '/');
|
50 |
+
$output = $this->request($url, array('overwrite' => ($overwrite)? 'true' : 'false'), 'PUT', $filehandle, $filesize);
|
51 |
+
fclose($filehandle);
|
52 |
+
} else {
|
53 |
+
$output = $this->chunked_upload($file, $path,$overwrite);
|
54 |
+
}
|
55 |
+
return $output;
|
56 |
+
}
|
57 |
+
|
58 |
+
public function chunked_upload($file, $path = '',$overwrite=true){
|
59 |
+
$file = str_replace("\\", "/",$file);
|
60 |
+
if (!is_readable($file) or !is_file($file))
|
61 |
+
throw new DropboxException("Error: File \"$file\" is not readable or doesn't exist.");
|
62 |
+
$file_handle=fopen($file,'r');
|
63 |
+
$uploadid=null;
|
64 |
+
$offset=0;
|
65 |
+
$ProgressFunction=null;
|
66 |
+
while ($data=fread($file_handle,4194304)) { //4194304 = 4MB
|
67 |
+
$chunkHandle = fopen('php://memory', 'rw');
|
68 |
+
fwrite($chunkHandle,$data);
|
69 |
+
rewind($chunkHandle);
|
70 |
+
//overwrite progress function
|
71 |
+
if (!empty($this->ProgressFunction) and function_exists($this->ProgressFunction)) {
|
72 |
+
$ProgressFunction=$this->ProgressFunction;
|
73 |
+
$this->ProgressFunction=false;
|
74 |
+
}
|
75 |
+
$url = self::API_CONTENT_URL.self::API_VERSION_URL.'chunked_upload';
|
76 |
+
$output = $this->request($url, array('upload_id' => $uploadid,'offset'=>$offset), 'PUT', $chunkHandle, strlen($data));
|
77 |
+
fclose($chunkHandle);
|
78 |
+
if ($ProgressFunction) {
|
79 |
+
call_user_func($ProgressFunction,0,0,0,$offset);
|
80 |
+
$this->ProgressFunction=$ProgressFunction;
|
81 |
+
}
|
82 |
+
//args for next chunk
|
83 |
+
$offset=$output['offset'];
|
84 |
+
$uploadid=$output['upload_id'];
|
85 |
+
fseek($file_handle,$offset);
|
86 |
+
}
|
87 |
+
fclose($file_handle);
|
88 |
+
$url = self::API_CONTENT_URL.self::API_VERSION_URL.'commit_chunked_upload/'.$this->root.'/'.trim($path, '/');
|
89 |
+
return $this->request($url, array('overwrite' => ($overwrite)? 'true' : 'false','upload_id'=>$uploadid), 'POST');
|
90 |
+
}
|
91 |
+
|
92 |
+
public function download($path,$echo=false){
|
93 |
+
$url = self::API_CONTENT_URL.self::API_VERSION_URL.'files/'.$this->root.'/'.trim($path,'/');
|
94 |
+
if (!$echo)
|
95 |
+
return $this->request($url);
|
96 |
+
else
|
97 |
+
$this->request($url,'','GET','','',true);
|
98 |
+
}
|
99 |
+
|
100 |
+
public function metadata($path = '', $listContents = true, $fileLimit = 10000){
|
101 |
+
$url = self::API_URL.self::API_VERSION_URL.'metadata/'.$this->root.'/'.trim($path,'/');
|
102 |
+
return $this->request($url, array('list' => ($listContents)? 'true' : 'false', 'file_limit' => $fileLimit));
|
103 |
+
}
|
104 |
+
|
105 |
+
public function search($path = '', $query , $fileLimit = 1000){
|
106 |
+
if (strlen($query)>=3)
|
107 |
+
throw new DropboxException("Error: Query \"$query\" must three characters long.");
|
108 |
+
$url = self::API_URL.self::API_VERSION_URL.'search/'.$this->root.'/'.trim($path,'/');
|
109 |
+
return $this->request($url, array('query' => $query, 'file_limit' => $fileLimit));
|
110 |
+
}
|
111 |
+
|
112 |
+
public function shares($path = ''){
|
113 |
+
$url = self::API_URL.self::API_VERSION_URL.'shares/'.$this->root.'/'.trim($path,'/');
|
114 |
+
return $this->request($url);
|
115 |
+
}
|
116 |
+
|
117 |
+
public function media($path = ''){
|
118 |
+
$url = self::API_URL.self::API_VERSION_URL.'media/'.$this->root.'/'.trim($path,'/');
|
119 |
+
return $this->request($url);
|
120 |
+
}
|
121 |
+
|
122 |
+
public function fileopsDelete($path){
|
123 |
+
$url = self::API_URL.self::API_VERSION_URL.'fileops/delete';
|
124 |
+
return $this->request($url, array('path' => '/'.trim($path,'/'), 'root' => $this->root));
|
125 |
+
}
|
126 |
+
|
127 |
+
public function fileopsCreate_folder($path){
|
128 |
+
$url = self::API_URL.self::API_VERSION_URL.'fileops/create_folder';
|
129 |
+
return $this->request($url, array('path' => '/'.trim($path,'/'), 'root' => $this->root));
|
130 |
+
}
|
131 |
+
|
132 |
+
public function oAuthAuthorize($callback_url) {
|
133 |
+
$headers[] = 'Authorization: OAuth oauth_version="1.0", oauth_signature_method="PLAINTEXT", oauth_consumer_key="'.$this->oauth_app_key.'", oauth_signature="'.$this->oauth_app_secret.'&"';
|
134 |
+
$ch = curl_init();
|
135 |
+
curl_setopt($ch, CURLOPT_URL, self::API_URL . self::API_VERSION_URL . 'oauth/request_token' );
|
136 |
+
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
|
137 |
+
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
|
138 |
+
curl_setopt($ch, CURLOPT_SSLVERSION,3);
|
139 |
+
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
|
140 |
+
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
|
141 |
+
if (is_file(dirname(__FILE__).'/aws/lib/requestcore/cacert.pem'))
|
142 |
+
curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__).'/aws/lib/requestcore/cacert.pem');
|
143 |
+
curl_setopt($ch, CURLOPT_AUTOREFERER , true);
|
144 |
+
curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers );
|
145 |
+
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
146 |
+
$content = curl_exec($ch);
|
147 |
+
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
148 |
+
if ($status>=200 and $status<300 and 0==curl_errno($ch) ) {
|
149 |
+
parse_str($content, $oauth_token);
|
150 |
+
} else {
|
151 |
+
$output = json_decode($content, true);
|
152 |
+
if(isset($output['error']) && is_string($output['error'])) $message = $output['error'];
|
153 |
+
elseif(isset($output['error']['hash']) && $output['error']['hash'] != '') $message = (string) $output['error']['hash'];
|
154 |
+
elseif (0!=curl_errno($ch)) $message = '('.curl_errno($ch).') '.curl_error($ch);
|
155 |
+
else $message = '('.$status.') Invalid response.';
|
156 |
+
throw new DropboxException($message);
|
157 |
+
}
|
158 |
+
curl_close($ch);
|
159 |
+
return array( 'authurl' => self::API_WWW_URL . self::API_VERSION_URL . 'oauth/authorize?oauth_token='.$oauth_token['oauth_token'].'&oauth_callback='.urlencode($callback_url),
|
160 |
+
'oauth_token' => $oauth_token['oauth_token'],
|
161 |
+
'oauth_token_secret'=> $oauth_token['oauth_token_secret'] );
|
162 |
+
}
|
163 |
+
|
164 |
+
public function oAuthAccessToken($oauth_token, $oauth_token_secret) {
|
165 |
+
$headers[] = 'Authorization: OAuth oauth_version="1.0", oauth_signature_method="PLAINTEXT", oauth_consumer_key="'.$this->oauth_app_key.'", oauth_token="'.$oauth_token.'", oauth_signature="'.$this->oauth_app_secret.'&'.$oauth_token_secret.'"';
|
166 |
+
$ch = curl_init();
|
167 |
+
curl_setopt($ch, CURLOPT_URL, self::API_URL . self::API_VERSION_URL . 'oauth/access_token' );
|
168 |
+
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
|
169 |
+
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
|
170 |
+
curl_setopt($ch, CURLOPT_SSLVERSION,3);
|
171 |
+
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
|
172 |
+
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
|
173 |
+
if (is_file(dirname(__FILE__).'/aws/lib/requestcore/cacert.pem'))
|
174 |
+
curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__).'/aws/lib/requestcore/cacert.pem');
|
175 |
+
curl_setopt($ch, CURLOPT_AUTOREFERER , true);
|
176 |
+
curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers );
|
177 |
+
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
178 |
+
$content = curl_exec($ch);
|
179 |
+
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
180 |
+
if ($status>=200 and $status<300 and 0==curl_errno($ch)) {
|
181 |
+
parse_str($content, $oauth_token);
|
182 |
+
$this->setOAuthTokens($oauth_token['oauth_token'], $oauth_token['oauth_token_secret']);
|
183 |
+
return $oauth_token;
|
184 |
+
} else {
|
185 |
+
$output = json_decode($content, true);
|
186 |
+
if(isset($output['error']) && is_string($output['error'])) $message = $output['error'];
|
187 |
+
elseif(isset($output['error']['hash']) && $output['error']['hash'] != '') $message = (string) $output['error']['hash'];
|
188 |
+
elseif (0!=curl_errno($ch)) $message = '('.curl_errno($ch).') '.curl_error($ch);
|
189 |
+
else $message = '('.$status.') Invalid response.';
|
190 |
+
throw new DropboxException($message);
|
191 |
+
}
|
192 |
+
}
|
193 |
+
|
194 |
+
private function request($url, $args = null, $method = 'GET', $filehandle = null, $filesize=0, $echo=false){
|
195 |
+
$args = (is_array($args)) ? $args : array();
|
196 |
+
$url = $this->url_encode($url);
|
197 |
+
|
198 |
+
/* Header*/
|
199 |
+
$headers[]='Authorization: OAuth oauth_version="1.0", oauth_signature_method="PLAINTEXT", oauth_consumer_key="'.$this->oauth_app_key.'", oauth_token="'.$this->oauth_token.'", oauth_signature="'.$this->oauth_app_secret.'&'.$this->oauth_token_secret.'"';
|
200 |
+
$headers[]='Expect:';
|
201 |
+
|
202 |
+
/* Build cURL Request */
|
203 |
+
$ch = curl_init();
|
204 |
+
if ($method == 'POST') {
|
205 |
+
curl_setopt($ch, CURLOPT_POST, true);
|
206 |
+
curl_setopt($ch, CURLOPT_POSTFIELDS, $args);
|
207 |
+
curl_setopt($ch, CURLOPT_URL, $url);
|
208 |
+
} elseif ($method == 'PUT') {
|
209 |
+
curl_setopt($ch,CURLOPT_PUT,true);
|
210 |
+
curl_setopt($ch,CURLOPT_INFILE,$filehandle);
|
211 |
+
curl_setopt($ch,CURLOPT_INFILESIZE,$filesize);
|
212 |
+
$args = (is_array($args)) ? '?'.http_build_query($args, '', '&') : $args;
|
213 |
+
curl_setopt($ch, CURLOPT_URL, $url.$args);
|
214 |
+
} else {
|
215 |
+
$args = (is_array($args)) ? '?'.http_build_query($args, '', '&') : $args;
|
216 |
+
curl_setopt($ch, CURLOPT_URL, $url.$args);
|
217 |
+
}
|
218 |
+
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
|
219 |
+
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
|
220 |
+
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
221 |
+
curl_setopt($ch, CURLOPT_SSLVERSION,3);
|
222 |
+
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
|
223 |
+
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
|
224 |
+
if (is_file(dirname(__FILE__).'/aws/lib/requestcore/cacert.pem'))
|
225 |
+
curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__).'/aws/lib/requestcore/cacert.pem');
|
226 |
+
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
|
227 |
+
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
|
228 |
+
if (!empty($this->ProgressFunction) and function_exists($this->ProgressFunction) and defined('CURLOPT_PROGRESSFUNCTION') and $method == 'PUT') {
|
229 |
+
curl_setopt($ch, CURLOPT_NOPROGRESS, false);
|
230 |
+
curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, $this->ProgressFunction);
|
231 |
+
curl_setopt($ch, CURLOPT_BUFFERSIZE, 512);
|
232 |
+
}
|
233 |
+
if ($echo) {
|
234 |
+
echo curl_exec($ch);
|
235 |
+
$output='';
|
236 |
+
} else {
|
237 |
+
$content = curl_exec($ch);
|
238 |
+
$output = json_decode($content, true);
|
239 |
+
}
|
240 |
+
$status = curl_getinfo($ch);
|
241 |
+
|
242 |
+
if (isset($output['error']) or $status['http_code']>=300 or $status['http_code']<200 or curl_errno($ch)>0) {
|
243 |
+
if(isset($output['error']) && is_string($output['error'])) $message = '('.$status['http_code'].') '.$output['error'];
|
244 |
+
elseif(isset($output['error']['hash']) && $output['error']['hash'] != '') $message = (string) '('.$status['http_code'].') '.$output['error']['hash'];
|
245 |
+
elseif (0!=curl_errno($ch)) $message = '('.curl_errno($ch).') '.curl_error($ch);
|
246 |
+
elseif ($status['http_code']==304) $message = '(304) The folder contents have not changed (relies on hash parameter).';
|
247 |
+
elseif ($status['http_code']==400) $message = '(400) Bad input parameter: '.strip_tags($content);
|
248 |
+
elseif ($status['http_code']==401) $message = '(401) Bad or expired token. This can happen if the user or Dropbox revoked or expired an access token. To fix, you should re-authenticate the user.';
|
249 |
+
elseif ($status['http_code']==403) $message = '(403) Bad OAuth request (wrong consumer key, bad nonce, expired timestamp, ...). Unfortunately, reauthenticating the user won\'t help here.';
|
250 |
+
elseif ($status['http_code']==404) $message = '(404) The file was not found at the specified path, or was not found at the specified rev.';
|
251 |
+
elseif ($status['http_code']==405) $message = '(405) Request method not expected (generally should be GET,PUT or POST).';
|
252 |
+
elseif ($status['http_code']==406) $message = '(406) There are too many file entries to return.';
|
253 |
+
elseif ($status['http_code']==411) $message = '(411) Chunked encoding was attempted for this upload, but is not supported by Dropbox.';
|
254 |
+
elseif ($status['http_code']==415) $message = '(415) The image is invalid and cannot be thumbnailed.';
|
255 |
+
elseif ($status['http_code']==503) $message = '(503) Your app is making too many requests and is being rate limited. 503s can trigger on a per-app or per-user basis.';
|
256 |
+
elseif ($status['http_code']==507) $message = '(507) User is over Dropbox storage quota.';
|
257 |
+
else $message = '('.$status['http_code'].') Invalid response.';
|
258 |
+
throw new DropboxException($message);
|
259 |
+
} else {
|
260 |
+
curl_close($ch);
|
261 |
+
if (!is_array($output))
|
262 |
+
return $content;
|
263 |
+
else
|
264 |
+
return $output;
|
265 |
+
}
|
266 |
+
}
|
267 |
+
|
268 |
+
private function url_encode($string) {
|
269 |
+
$string = str_replace('?','%3F',$string);
|
270 |
+
$string = str_replace('=','%3D',$string);
|
271 |
+
$string = str_replace(' ','%20',$string);
|
272 |
+
$string = str_replace('(','%28',$string);
|
273 |
+
$string = str_replace(')','%29',$string);
|
274 |
+
$string = str_replace('&','%26',$string);
|
275 |
+
$string = str_replace('@','%40',$string);
|
276 |
+
return $string;
|
277 |
+
}
|
278 |
+
|
279 |
+
}
|
280 |
+
|
281 |
+
class DropboxException extends Exception {
|
282 |
+
}
|
283 |
+
?>
|
plugins/cleanup/cleanup.php
CHANGED
@@ -82,7 +82,7 @@ function iwp_mmb_num_revisions()
|
|
82 |
{
|
83 |
global $wpdb;
|
84 |
$sql = "SELECT COUNT(*) FROM $wpdb->posts WHERE post_type = 'revision'";
|
85 |
-
$num_revisions = $wpdb->get_var($
|
86 |
return $num_revisions;
|
87 |
}
|
88 |
|
@@ -90,7 +90,7 @@ function iwp_mmb_select_all_revisions()
|
|
90 |
{
|
91 |
global $wpdb;
|
92 |
$sql = "SELECT * FROM $wpdb->posts WHERE post_type = 'revision'";
|
93 |
-
$revisions = $wpdb->get_results($
|
94 |
return $revisions;
|
95 |
}
|
96 |
|
@@ -98,7 +98,7 @@ function iwp_mmb_delete_all_revisions()
|
|
98 |
{
|
99 |
global $wpdb;
|
100 |
$sql = "DELETE a,b,c FROM $wpdb->posts a LEFT JOIN $wpdb->term_relationships b ON (a.ID = b.object_id) LEFT JOIN $wpdb->postmeta c ON (a.ID = c.post_id) WHERE a.post_type = 'revision'";
|
101 |
-
$revisions = $wpdb->query($
|
102 |
|
103 |
return $revisions;
|
104 |
}
|
@@ -115,8 +115,8 @@ function iwp_mmb_handle_overhead($clear = false)
|
|
115 |
$tot_data = 0;
|
116 |
$tot_idx = 0;
|
117 |
$tot_all = 0;
|
118 |
-
$query = 'SHOW
|
119 |
-
$tables = $wpdb->get_results($
|
120 |
$total_gain = 0;
|
121 |
$table_string = '';
|
122 |
foreach ($tables as $table) {
|
@@ -170,7 +170,7 @@ function iwp_mmb_num_spam_comments()
|
|
170 |
{
|
171 |
global $wpdb;
|
172 |
$sql = "SELECT COUNT(*) FROM $wpdb->comments WHERE comment_approved = 'spam'";
|
173 |
-
$num_spams = $wpdb->get_var($
|
174 |
return $num_spams;
|
175 |
}
|
176 |
|
@@ -181,7 +181,7 @@ function iwp_mmb_delete_spam_comments()
|
|
181 |
$total = 0;
|
182 |
while ($spams) {
|
183 |
$sql = "DELETE FROM $wpdb->comments WHERE comment_approved = 'spam' LIMIT 200";
|
184 |
-
$spams = $wpdb->query($
|
185 |
$total += $spams;
|
186 |
if ($spams)
|
187 |
usleep(100000);
|
@@ -194,7 +194,7 @@ function iwp_mmb_get_spam_comments()
|
|
194 |
{
|
195 |
global $wpdb;
|
196 |
$sql = "SELECT * FROM $wpdb->comments as a LEFT JOIN $wpdb->commentmeta as b WHERE a.comment_ID = b.comment_id AND a.comment_approved = 'spam'";
|
197 |
-
$spams = $wpdb->get_results($
|
198 |
return $spams;
|
199 |
}
|
200 |
|
82 |
{
|
83 |
global $wpdb;
|
84 |
$sql = "SELECT COUNT(*) FROM $wpdb->posts WHERE post_type = 'revision'";
|
85 |
+
$num_revisions = $wpdb->get_var($sql);
|
86 |
return $num_revisions;
|
87 |
}
|
88 |
|
90 |
{
|
91 |
global $wpdb;
|
92 |
$sql = "SELECT * FROM $wpdb->posts WHERE post_type = 'revision'";
|
93 |
+
$revisions = $wpdb->get_results($sql);
|
94 |
return $revisions;
|
95 |
}
|
96 |
|
98 |
{
|
99 |
global $wpdb;
|
100 |
$sql = "DELETE a,b,c FROM $wpdb->posts a LEFT JOIN $wpdb->term_relationships b ON (a.ID = b.object_id) LEFT JOIN $wpdb->postmeta c ON (a.ID = c.post_id) WHERE a.post_type = 'revision'";
|
101 |
+
$revisions = $wpdb->query($sql);
|
102 |
|
103 |
return $revisions;
|
104 |
}
|
115 |
$tot_data = 0;
|
116 |
$tot_idx = 0;
|
117 |
$tot_all = 0;
|
118 |
+
$query = 'SHOW TABLES';
|
119 |
+
$tables = $wpdb->get_results($query, ARRAY_A);
|
120 |
$total_gain = 0;
|
121 |
$table_string = '';
|
122 |
foreach ($tables as $table) {
|
170 |
{
|
171 |
global $wpdb;
|
172 |
$sql = "SELECT COUNT(*) FROM $wpdb->comments WHERE comment_approved = 'spam'";
|
173 |
+
$num_spams = $wpdb->get_var($sql);
|
174 |
return $num_spams;
|
175 |
}
|
176 |
|
181 |
$total = 0;
|
182 |
while ($spams) {
|
183 |
$sql = "DELETE FROM $wpdb->comments WHERE comment_approved = 'spam' LIMIT 200";
|
184 |
+
$spams = $wpdb->query($sql);
|
185 |
$total += $spams;
|
186 |
if ($spams)
|
187 |
usleep(100000);
|
194 |
{
|
195 |
global $wpdb;
|
196 |
$sql = "SELECT * FROM $wpdb->comments as a LEFT JOIN $wpdb->commentmeta as b WHERE a.comment_ID = b.comment_id AND a.comment_approved = 'spam'";
|
197 |
+
$spams = $wpdb->get_results($sql);
|
198 |
return $spams;
|
199 |
}
|
200 |
|
readme.txt
CHANGED
@@ -2,7 +2,7 @@
|
|
2 |
Contributors: infinitewp
|
3 |
Tags: admin, administration, amazon, api, authentication, automatic, dashboard, dropbox, events, integration, manage, multisite, multiple, notification, performance, s3, security, seo, stats, tracking, infinitewp, updates, backup, restore, iwp, infinite
|
4 |
Requires at least: 3.0
|
5 |
-
Tested up to: 3.
|
6 |
Stable tag: trunk
|
7 |
|
8 |
Install this plugin on unlimited sites and manage them all from a central dashboard.
|
@@ -48,6 +48,11 @@ Credits: [Vladimir Prelovac](http://prelovac.com/vladimir) for his worker plugin
|
|
48 |
|
49 |
== Changelog ==
|
50 |
|
|
|
|
|
|
|
|
|
|
|
51 |
= 1.1.4 =
|
52 |
* Bug in command line backup fixed
|
53 |
|
2 |
Contributors: infinitewp
|
3 |
Tags: admin, administration, amazon, api, authentication, automatic, dashboard, dropbox, events, integration, manage, multisite, multiple, notification, performance, s3, security, seo, stats, tracking, infinitewp, updates, backup, restore, iwp, infinite
|
4 |
Requires at least: 3.0
|
5 |
+
Tested up to: 3.5
|
6 |
Stable tag: trunk
|
7 |
|
8 |
Install this plugin on unlimited sites and manage them all from a central dashboard.
|
48 |
|
49 |
== Changelog ==
|
50 |
|
51 |
+
= 1.1.5 =
|
52 |
+
* WP 3.5 compatibility
|
53 |
+
* Backup system improved
|
54 |
+
* Dropbox upload 500 error fixed
|
55 |
+
|
56 |
= 1.1.4 =
|
57 |
* Bug in command line backup fixed
|
58 |
|
stats.class.php
CHANGED
@@ -439,7 +439,7 @@ class IWP_MMB_Stats extends IWP_MMB_Core
|
|
439 |
{
|
440 |
global $current_user, $wpdb;
|
441 |
$user_blogs = get_blogs_of_user( $current_user->ID );
|
442 |
-
$network_blogs = $wpdb->get_results(
|
443 |
if ($this->network_admin_install == '1' && is_super_admin()) {
|
444 |
if (!empty($network_blogs)) {
|
445 |
$blogs = array();
|
439 |
{
|
440 |
global $current_user, $wpdb;
|
441 |
$user_blogs = get_blogs_of_user( $current_user->ID );
|
442 |
+
$network_blogs = $wpdb->get_results( "select `blog_id`, `site_id` from `{$wpdb->blogs}`" );
|
443 |
if ($this->network_admin_install == '1' && is_super_admin()) {
|
444 |
if (!empty($network_blogs)) {
|
445 |
$blogs = array();
|