Version Description
= After an upgrade from version 2 =
Please check all settings after the update:
- Dropbox authentication must be done again
- SugarSync authentication must be done again
- S3 Settings
- Google Storage is now in S3
- Check all your passwords
Download this release
Release Info
Developer | danielhuesken |
Plugin | BackWPup – WordPress Backup Plugin |
Version | 3.0.8 |
Comparing to | |
See all releases |
Code changes from version 3.0.7 to 3.0.8
- backwpup.php +3 -3
- css/adminbar.css +1 -1
- css/adminbar.dev.css +5 -13
- inc/class-create-archive.php +12 -4
- inc/class-cron.php +9 -9
- inc/class-destination-dropbox.php +68 -61
- inc/class-job.php +16 -4
- inc/class-jobtype-dbdump.php +1 -1
- inc/class-page-editjob.php +1 -1
- inc/class-page-jobs.php +7 -5
- inc/class-page-settings.php +10 -7
- js/page_edit_jobtype_dbdump.dev.js +4 -4
- js/page_edit_jobtype_dbdump.js +1 -1
- readme.txt +7 -1
backwpup.php
CHANGED
@@ -5,7 +5,7 @@
|
|
5 |
* Description: WordPress Backup and more...
|
6 |
* Author: Inpsyde GmbH
|
7 |
* Author URI: http://inpsyde.com
|
8 |
-
* Version: 3.0.
|
9 |
* Text Domain: backwpup
|
10 |
* Domain Path: /languages/
|
11 |
* Network: true
|
@@ -79,8 +79,8 @@ if ( ! class_exists( 'BackWPup' ) ) {
|
|
79 |
add_action( 'backwpup_cron', array( 'BackWPup_Cron', 'run' ) );
|
80 |
add_action( 'backwpup_check_cleanup', array( 'BackWPup_Cron', 'check_cleanup' ) );
|
81 |
// add action for doing thinks if cron active
|
82 |
-
add_action( 'wp_loaded', array( 'BackWPup_Cron', 'cron_active' ) );
|
83 |
-
// if in cron the rest
|
84 |
return;
|
85 |
}
|
86 |
//deactivation hook
|
5 |
* Description: WordPress Backup and more...
|
6 |
* Author: Inpsyde GmbH
|
7 |
* Author URI: http://inpsyde.com
|
8 |
+
* Version: 3.0.8
|
9 |
* Text Domain: backwpup
|
10 |
* Domain Path: /languages/
|
11 |
* Network: true
|
79 |
add_action( 'backwpup_cron', array( 'BackWPup_Cron', 'run' ) );
|
80 |
add_action( 'backwpup_check_cleanup', array( 'BackWPup_Cron', 'check_cleanup' ) );
|
81 |
// add action for doing thinks if cron active
|
82 |
+
add_action( 'wp_loaded', array( 'BackWPup_Cron', 'cron_active' ), 1 );
|
83 |
+
// if in cron the rest must not needed
|
84 |
return;
|
85 |
}
|
86 |
//deactivation hook
|
css/adminbar.css
CHANGED
@@ -1 +1 @@
|
|
1 |
-
#wp-admin-bar-backwpup.menupop>.ab-item .ab-icon,#wp-admin-bar-backwpup.menupop>a>span .ab-icon{
|
1 |
+
#wp-admin-bar-backwpup.menupop>.ab-item .ab-icon,#wp-admin-bar-backwpup.menupop>a>span .ab-icon{position:relative;float:left;width:20px;height:20px;margin-top:3px;margin-right:5px;background:url(../images/BackWPup20.png) no-repeat top center}#wp-admin-bar-backwpup.menupop.hover>.ab-item .ab-icon,#wp-admin-bar-backwpup.menupop.hover>a>span .ab-icon:hover{background:url(../images/BackWPup20.png) no-repeat bottom center}@media only screen and (-webkit-min-device-pixel-ratio:2){#wp-admin-bar-backwpup.menupop>.ab-item .ab-icon,#wp-admin-bar-backwpup.menupop>a>span .ab-icon{background-size:20px 40px;background:url(../images/BackWPup20_2x.png) no-repeat top center;position:relative}#wp-admin-bar-backwpup.menupop.hover>.ab-item .ab-icon,#wp-admin-bar-backwpup.menupop.hover>a>span .ab-icon:hover{background:url(../images/BackWPup20_2x.png) no-repeat bottom center}}
|
css/adminbar.dev.css
CHANGED
@@ -1,7 +1,5 @@
|
|
1 |
#wp-admin-bar-backwpup.menupop > .ab-item .ab-icon,
|
2 |
#wp-admin-bar-backwpup.menupop > a > span .ab-icon {
|
3 |
-
background-image: url(../images/BackWPup20.png);
|
4 |
-
background-repeat: no-repeat;
|
5 |
position: relative;
|
6 |
/* for WP lower 3.3 */
|
7 |
float: left;
|
@@ -9,28 +7,22 @@
|
|
9 |
height: 20px;
|
10 |
margin-top: 3px;
|
11 |
margin-right:5px;
|
12 |
-
|
13 |
}
|
14 |
#wp-admin-bar-backwpup.menupop.hover > .ab-item .ab-icon,
|
15 |
#wp-admin-bar-backwpup.menupop.hover > a > span .ab-icon:hover {
|
16 |
-
|
17 |
-
background-repeat: no-repeat;
|
18 |
-
background-position:bottom center;
|
19 |
}
|
20 |
|
21 |
@media only screen and (-webkit-min-device-pixel-ratio: 2) {
|
22 |
#wp-admin-bar-backwpup.menupop > .ab-item .ab-icon,
|
23 |
#wp-admin-bar-backwpup.menupop > a > span .ab-icon {
|
24 |
-
background-image: url(../images/BackWPup20_2x.png);
|
25 |
-
background-repeat: no-repeat;
|
26 |
background-size: 20px 40px;
|
27 |
-
|
28 |
position: relative;
|
29 |
}
|
30 |
#wp-admin-bar-backwpup.menupop.hover > .ab-item .ab-icon,
|
31 |
#wp-admin-bar-backwpup.menupop.hover > a > span .ab-icon:hover {
|
32 |
-
|
33 |
-
|
34 |
-
background-position:bottom center;
|
35 |
-
}
|
36 |
}
|
1 |
#wp-admin-bar-backwpup.menupop > .ab-item .ab-icon,
|
2 |
#wp-admin-bar-backwpup.menupop > a > span .ab-icon {
|
|
|
|
|
3 |
position: relative;
|
4 |
/* for WP lower 3.3 */
|
5 |
float: left;
|
7 |
height: 20px;
|
8 |
margin-top: 3px;
|
9 |
margin-right:5px;
|
10 |
+
background: url(../images/BackWPup20.png) no-repeat top center;
|
11 |
}
|
12 |
#wp-admin-bar-backwpup.menupop.hover > .ab-item .ab-icon,
|
13 |
#wp-admin-bar-backwpup.menupop.hover > a > span .ab-icon:hover {
|
14 |
+
background: url(../images/BackWPup20.png) no-repeat bottom center;
|
|
|
|
|
15 |
}
|
16 |
|
17 |
@media only screen and (-webkit-min-device-pixel-ratio: 2) {
|
18 |
#wp-admin-bar-backwpup.menupop > .ab-item .ab-icon,
|
19 |
#wp-admin-bar-backwpup.menupop > a > span .ab-icon {
|
|
|
|
|
20 |
background-size: 20px 40px;
|
21 |
+
background: url(../images/BackWPup20_2x.png) no-repeat top center;
|
22 |
position: relative;
|
23 |
}
|
24 |
#wp-admin-bar-backwpup.menupop.hover > .ab-item .ab-icon,
|
25 |
#wp-admin-bar-backwpup.menupop.hover > a > span .ab-icon:hover {
|
26 |
+
background: url(../images/BackWPup20_2x.png) no-repeat bottom center;
|
27 |
+
}
|
|
|
|
|
28 |
}
|
inc/class-create-archive.php
CHANGED
@@ -214,9 +214,13 @@ class BackWPup_Create_Archive {
|
|
214 |
*/
|
215 |
public function add_file( $file_name, $name_in_archive = '' ) {
|
216 |
|
|
|
|
|
217 |
//check param
|
218 |
-
if ( empty( $file_name ) )
|
219 |
-
|
|
|
|
|
220 |
|
221 |
if ( ! is_file( $file_name ) || ! is_readable( $file_name ) ) {
|
222 |
trigger_error( sprintf( _x( 'File %s does not exist or is not readable', 'File path to add to archive', 'backwpup' ), $file_name ), E_USER_WARNING );
|
@@ -305,9 +309,13 @@ class BackWPup_Create_Archive {
|
|
305 |
*/
|
306 |
public function add_empty_folder( $folder_name, $name_in_archive = '' ) {
|
307 |
|
|
|
|
|
308 |
//check param
|
309 |
-
if ( empty( $folder_name ) )
|
310 |
-
|
|
|
|
|
311 |
|
312 |
if ( ! is_dir( $folder_name ) || ! is_readable( $folder_name ) ) {
|
313 |
trigger_error( sprintf( _x( 'Folder %s does not exist or is not readable', 'Folder path to add to archive', 'backwpup' ), $folder_name ), E_USER_WARNING );
|
214 |
*/
|
215 |
public function add_file( $file_name, $name_in_archive = '' ) {
|
216 |
|
217 |
+
$file_name = trim( $file_name );
|
218 |
+
|
219 |
//check param
|
220 |
+
if ( empty( $file_name ) ) {
|
221 |
+
trigger_error( __( 'File name cannot be empty', 'backwpup' ), E_USER_WARNING );
|
222 |
+
return FALSE;
|
223 |
+
}
|
224 |
|
225 |
if ( ! is_file( $file_name ) || ! is_readable( $file_name ) ) {
|
226 |
trigger_error( sprintf( _x( 'File %s does not exist or is not readable', 'File path to add to archive', 'backwpup' ), $file_name ), E_USER_WARNING );
|
309 |
*/
|
310 |
public function add_empty_folder( $folder_name, $name_in_archive = '' ) {
|
311 |
|
312 |
+
$folder_name = trim( $folder_name );
|
313 |
+
|
314 |
//check param
|
315 |
+
if ( empty( $folder_name ) ) {
|
316 |
+
trigger_error( __( 'Folder name cannot be empty', 'backwpup' ), E_USER_WARNING );
|
317 |
+
return FALSE;
|
318 |
+
}
|
319 |
|
320 |
if ( ! is_dir( $folder_name ) || ! is_readable( $folder_name ) ) {
|
321 |
trigger_error( sprintf( _x( 'Folder %s does not exist or is not readable', 'Folder path to add to archive', 'backwpup' ), $folder_name ), E_USER_WARNING );
|
inc/class-cron.php
CHANGED
@@ -154,6 +154,15 @@ class BackWPup_Cron {
|
|
154 |
if ( empty( $_GET[ 'backwpup_run' ] ) || ! in_array( $_GET[ 'backwpup_run' ], array( 'test','restart', 'runnow', 'runnowalt', 'runext', 'cronrun' ) ) )
|
155 |
return;
|
156 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
157 |
// generate normal nonce
|
158 |
$nonce = substr( wp_hash( wp_nonce_tick() . 'backwup_job_run-' . $_GET[ 'backwpup_run' ], 'nonce' ), - 12, 10 );
|
159 |
//special nonce on external start
|
@@ -163,15 +172,6 @@ class BackWPup_Cron {
|
|
163 |
if ( empty( $_GET['_nonce'] ) || $nonce != $_GET['_nonce'] )
|
164 |
return;
|
165 |
|
166 |
-
//response on test
|
167 |
-
if ( $_GET[ 'backwpup_run' ] == 'test') {
|
168 |
-
@header( 'Content-Type: text/html; charset=' . get_bloginfo( 'charset' ) );
|
169 |
-
@header( 'X-Robots-Tag: noindex, nofollow' );
|
170 |
-
send_nosniff_header();
|
171 |
-
nocache_headers();
|
172 |
-
die( 'Response Test O.K.' );
|
173 |
-
}
|
174 |
-
|
175 |
//check runext is allowed for job
|
176 |
if ( $_GET[ 'backwpup_run' ] == 'runext' ) {
|
177 |
$jobids_external = BackWPup_Option::get_job_ids( 'activetype', 'link' );
|
154 |
if ( empty( $_GET[ 'backwpup_run' ] ) || ! in_array( $_GET[ 'backwpup_run' ], array( 'test','restart', 'runnow', 'runnowalt', 'runext', 'cronrun' ) ) )
|
155 |
return;
|
156 |
|
157 |
+
//set some header
|
158 |
+
send_nosniff_header();
|
159 |
+
nocache_headers();
|
160 |
+
@header( 'x-backwpup-ver: ' . BackWPup::get_plugin_data( 'version' ) );
|
161 |
+
|
162 |
+
//on test die for fast feedback
|
163 |
+
if ( $_GET[ 'backwpup_run' ] == 'test' )
|
164 |
+
die();
|
165 |
+
|
166 |
// generate normal nonce
|
167 |
$nonce = substr( wp_hash( wp_nonce_tick() . 'backwup_job_run-' . $_GET[ 'backwpup_run' ], 'nonce' ), - 12, 10 );
|
168 |
//special nonce on external start
|
172 |
if ( empty( $_GET['_nonce'] ) || $nonce != $_GET['_nonce'] )
|
173 |
return;
|
174 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
175 |
//check runext is allowed for job
|
176 |
if ( $_GET[ 'backwpup_run' ] == 'runext' ) {
|
177 |
$jobids_external = BackWPup_Option::get_job_ids( 'activetype', 'link' );
|
inc/class-destination-dropbox.php
CHANGED
@@ -32,72 +32,30 @@ class BackWPup_Destination_Dropbox extends BackWPup_Destinations {
|
|
32 |
* @param $jobid
|
33 |
*/
|
34 |
public function edit_tab( $jobid ) {
|
|
|
35 |
//Dropbox auth keys from Dropbox
|
36 |
-
if
|
37 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
38 |
$oAuthStuff = array();
|
39 |
try {
|
40 |
-
$dropbox = new BackWPup_Destination_Dropbox_API( '
|
41 |
-
$oAuthStuff = $dropbox->oAuthAccessToken( $
|
42 |
-
if ( empty( $oAuthStuff ) ) {
|
43 |
-
echo '<div id="message" class="updated"><p>' . __( 'Dropbox
|
44 |
BackWPup_Option::update( $jobid, 'dropboxtoken', $oAuthStuff[ 'oauth_token' ] );
|
45 |
BackWPup_Option::update( $jobid, 'dropboxsecret', BackWPup_Encryption::encrypt( $oAuthStuff[ 'oauth_token_secret' ] ) );
|
46 |
-
BackWPup_Option::update( $jobid, 'dropboxroot', '
|
47 |
-
|
48 |
-
unset( $_SESSION[ 'backwpup_jobedit'][ 'dropboxdropbox_auth' ] );
|
49 |
}
|
50 |
-
} catch ( Exception $e ) {
|
51 |
-
if ( empty( $oAuthStuff ) ) {
|
52 |
-
try {
|
53 |
-
$dropbox = new BackWPup_Destination_Dropbox_API( 'dropbox' );
|
54 |
-
$oAuthStuff = $dropbox->oAuthAccessToken( $_SESSION[ 'backwpup_jobedit'][ 'dropboxdropbox_auth' ][ 'oAuthRequestToken' ], $_SESSION[ 'backwpup_jobedit'][ 'dropboxdropbox_auth' ][ 'oAuthRequestTokenSecret' ] );
|
55 |
-
if ( empty( $oAuthStuff ) ) {
|
56 |
-
echo '<div id="message" class="updated"><p>' . __( 'Dropbox authentication complete!', 'backwpup' ) . '</p></div>';
|
57 |
-
BackWPup_Option::update( $jobid, 'dropboxtoken', $oAuthStuff[ 'oauth_token' ] );
|
58 |
-
BackWPup_Option::update( $jobid, 'dropboxsecret', BackWPup_Encryption::encrypt( $oAuthStuff[ 'oauth_token_secret' ] ) );
|
59 |
-
BackWPup_Option::update( $jobid, 'dropboxroot', 'dropbox' );
|
60 |
-
unset( $_SESSION[ 'backwpup_jobedit'][ 'dropboxsandbox_auth' ] );
|
61 |
-
unset( $_SESSION[ 'backwpup_jobedit'][ 'dropboxdropbox_auth' ] );
|
62 |
-
}
|
63 |
-
} catch ( Exception $e ) {}
|
64 |
-
}
|
65 |
-
}
|
66 |
-
|
67 |
-
//get auth url sandbox
|
68 |
-
if ( empty( $_SESSION[ 'backwpup_jobedit'][ 'dropboxsandbox_auth' ][ 'create_time' ] ) || $_SESSION[ 'backwpup_jobedit'][ 'dropboxsandbox_auth' ][ 'create_time' ] > time() - 120 ) {
|
69 |
-
try {
|
70 |
-
$dropbox = new BackWPup_Destination_Dropbox_API( 'sandbox' );
|
71 |
-
// let the user authorize (user will be redirected)
|
72 |
-
$response_sandbox = $dropbox->oAuthAuthorize( network_admin_url( 'admin.php' ) . '?page=backwpupeditjob&jobid=' .$jobid .'&tab=dest-dropbox&_wpnonce=' . wp_create_nonce( 'edit-job' ) );
|
73 |
-
// save oauth_token_secret
|
74 |
-
$_SESSION[ 'backwpup_jobedit'][ 'dropboxsandbox_auth' ] = array(
|
75 |
-
'oAuthRequestToken' => $response_sandbox[ 'oauth_token' ],
|
76 |
-
'oAuthRequestTokenSecret' => $response_sandbox[ 'oauth_token_secret' ],
|
77 |
-
'authurl' => $response_sandbox[ 'authurl' ],
|
78 |
-
'create_time' => time(),
|
79 |
-
);
|
80 |
-
}
|
81 |
-
catch ( Exception $e ) {
|
82 |
-
echo '<div id="message" class="error"><p>' . sprintf( __( 'Dropbox API: %s', 'backwpup' ), $e->getMessage() ) . '</p></div>';
|
83 |
-
}
|
84 |
-
}
|
85 |
-
//get auth url dropbox
|
86 |
-
if ( empty( $_SESSION[ 'backwpup_jobedit'][ 'dropboxdropbox_auth' ][ 'create_time' ] ) || $_SESSION[ 'backwpup_jobedit'][ 'dropboxdropbox_auth' ][ 'create_time' ] > time() - 120 ) {
|
87 |
-
try {
|
88 |
-
$dropbox = new BackWPup_Destination_Dropbox_API( 'dropbox' );
|
89 |
-
// let the user authorize (user will be redirected)
|
90 |
-
$response_dropbox = $dropbox->oAuthAuthorize( network_admin_url( 'admin.php' ) . '?page=backwpupeditjob&jobid=' .$jobid .'&tab=dest-dropbox&_wpnonce=' . wp_create_nonce( 'edit-job' ) );
|
91 |
-
// save oauth_token_secret
|
92 |
-
$_SESSION[ 'backwpup_jobedit'][ 'dropboxdropbox_auth' ] = array(
|
93 |
-
'oAuthRequestToken' => $response_dropbox[ 'oauth_token' ],
|
94 |
-
'oAuthRequestTokenSecret' => $response_dropbox[ 'oauth_token_secret' ],
|
95 |
-
'authurl' => $response_dropbox[ 'authurl' ],
|
96 |
-
'create_time' => time(),
|
97 |
-
);
|
98 |
-
}
|
99 |
-
catch ( Exception $e ) {
|
100 |
echo '<div id="message" class="error"><p>' . sprintf( __( 'Dropbox API: %s', 'backwpup' ), $e->getMessage() ) . '</p></div>';
|
|
|
101 |
}
|
102 |
}
|
103 |
?>
|
@@ -112,8 +70,8 @@ class BackWPup_Destination_Dropbox extends BackWPup_Destinations {
|
|
112 |
<?php } else { ?>
|
113 |
<span style="color:green;"><?php _e( 'Authenticated!', 'backwpup' ); ?></span><br />
|
114 |
<?php } ?>
|
115 |
-
<a class="button secondary" href="<?php echo
|
116 |
-
<a class="button secondary" href="<?php echo
|
117 |
</td>
|
118 |
</tr>
|
119 |
</table>
|
@@ -148,6 +106,54 @@ class BackWPup_Destination_Dropbox extends BackWPup_Destinations {
|
|
148 |
<?php
|
149 |
}
|
150 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
151 |
|
152 |
/**
|
153 |
* @param $jobid
|
@@ -402,6 +408,7 @@ final class BackWPup_Destination_Dropbox_API {
|
|
402 |
|
403 |
/**
|
404 |
* @param string $boxtype
|
|
|
405 |
*/
|
406 |
public function __construct( $boxtype = 'dropbox' ) {
|
407 |
|
32 |
* @param $jobid
|
33 |
*/
|
34 |
public function edit_tab( $jobid ) {
|
35 |
+
|
36 |
//Dropbox auth keys from Dropbox
|
37 |
+
// if cancelled auth
|
38 |
+
if ( ! empty( $_GET[ 'not_approved' ] ) ) {
|
39 |
+
echo '<div id="message" class="error"><p>' .__( 'Dropbox authentication not approved', 'backwpup' ) . '</p></div>';
|
40 |
+
delete_site_transient( 'backwpup_dropbox_auth_' . $jobid );
|
41 |
+
}
|
42 |
+
// if Auth data exists
|
43 |
+
$auth_data = get_site_transient( 'backwpup_dropbox_auth_' . $jobid );
|
44 |
+
if ( $auth_data ) {
|
45 |
$oAuthStuff = array();
|
46 |
try {
|
47 |
+
$dropbox = new BackWPup_Destination_Dropbox_API( $auth_data[ 'type' ] );
|
48 |
+
$oAuthStuff = $dropbox->oAuthAccessToken( $auth_data[ 'oauth_token' ], $auth_data[ 'oauth_token_secret' ] );
|
49 |
+
if ( ! empty( $oAuthStuff ) ) {
|
50 |
+
echo '<div id="message" class="updated"><p>' . __( 'Dropbox authentication complete!', 'backwpup' ) . '</p></div>';
|
51 |
BackWPup_Option::update( $jobid, 'dropboxtoken', $oAuthStuff[ 'oauth_token' ] );
|
52 |
BackWPup_Option::update( $jobid, 'dropboxsecret', BackWPup_Encryption::encrypt( $oAuthStuff[ 'oauth_token_secret' ] ) );
|
53 |
+
BackWPup_Option::update( $jobid, 'dropboxroot', $auth_data[ 'type' ] );
|
54 |
+
delete_site_transient( 'backwpup_dropbox_auth_' . $jobid );
|
|
|
55 |
}
|
56 |
+
} catch ( Exception $e ) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
57 |
echo '<div id="message" class="error"><p>' . sprintf( __( 'Dropbox API: %s', 'backwpup' ), $e->getMessage() ) . '</p></div>';
|
58 |
+
delete_site_transient( 'backwpup_dropbox_auth_' . $jobid );
|
59 |
}
|
60 |
}
|
61 |
?>
|
70 |
<?php } else { ?>
|
71 |
<span style="color:green;"><?php _e( 'Authenticated!', 'backwpup' ); ?></span><br />
|
72 |
<?php } ?>
|
73 |
+
<a class="button secondary" href="<?php echo admin_url( 'admin-ajax.php', 'relative' );?>?action=backwpup_dest_dropbox&type=sandbox&jobid=<?php echo $jobid ?>"><?php _e( 'Reauthenticate (Sandbox)', 'backwpup' ); ?></a>
|
74 |
+
<a class="button secondary" href="<?php echo admin_url( 'admin-ajax.php', 'relative' );?>?action=backwpup_dest_dropbox&type=dropbox&jobid=<?php echo $jobid ?>"><?php _e( 'Reauthenticate (full Dropbox)', 'backwpup' ); ?></a>
|
75 |
</td>
|
76 |
</tr>
|
77 |
</table>
|
106 |
<?php
|
107 |
}
|
108 |
|
109 |
+
/**
|
110 |
+
* Authentication over ajax
|
111 |
+
*/
|
112 |
+
public function edit_ajax() {
|
113 |
+
|
114 |
+
$_GET[ 'jobid' ] = (int) $_GET[ 'jobid' ];
|
115 |
+
|
116 |
+
// dropbox auth
|
117 |
+
if ( $_GET[ 'type' ] == 'dropbox' ) {
|
118 |
+
try {
|
119 |
+
$dropbox = new BackWPup_Destination_Dropbox_API( 'dropbox' );
|
120 |
+
// let the user authorize (user will be redirected)
|
121 |
+
$response = $dropbox->oAuthAuthorize( network_admin_url( 'admin.php' ) . '?page=backwpupeditjob&jobid=' .$_GET[ 'jobid' ] .'&tab=dest-dropbox&_wpnonce=' . wp_create_nonce( 'edit-job' ) );
|
122 |
+
// save oauth_token_secret
|
123 |
+
$auth_data = array(
|
124 |
+
'oauth_token' => $response[ 'oauth_token' ],
|
125 |
+
'oauth_token_secret' => $response[ 'oauth_token_secret' ],
|
126 |
+
'type' => 'dropbox'
|
127 |
+
);
|
128 |
+
set_site_transient( 'backwpup_dropbox_auth_' . $_GET[ 'jobid' ], $auth_data, 3600 );
|
129 |
+
wp_redirect( $response[ 'authurl' ] );
|
130 |
+
|
131 |
+
}
|
132 |
+
catch ( Exception $e ) {
|
133 |
+
echo '<div id="message" class="error"><p>' . sprintf( __( 'Dropbox API: %s', 'backwpup' ), $e->getMessage() ) . '</p></div>';
|
134 |
+
}
|
135 |
+
}
|
136 |
+
// sandbox auth
|
137 |
+
elseif ( $_GET[ 'type' ] == 'sandbox' ) {
|
138 |
+
try {
|
139 |
+
$dropbox = new BackWPup_Destination_Dropbox_API( 'sandbox' );
|
140 |
+
// let the user authorize (user will be redirected)
|
141 |
+
$response = $dropbox->oAuthAuthorize( network_admin_url( 'admin.php' ) . '?page=backwpupeditjob&jobid=' .$_GET[ 'jobid' ] .'&tab=dest-dropbox&_wpnonce=' . wp_create_nonce( 'edit-job' ) );
|
142 |
+
// save oauth_token_secret
|
143 |
+
$auth_data = array(
|
144 |
+
'oauth_token' => $response[ 'oauth_token' ],
|
145 |
+
'oauth_token_secret' => $response[ 'oauth_token_secret' ],
|
146 |
+
'type' => 'sandbox'
|
147 |
+
);
|
148 |
+
set_site_transient( 'backwpup_dropbox_auth_' . $_GET[ 'jobid' ], $auth_data, 3600 );
|
149 |
+
wp_redirect( $response[ 'authurl' ] );
|
150 |
+
}
|
151 |
+
catch ( Exception $e ) {
|
152 |
+
echo '<div id="message" class="error"><p>' . sprintf( __( 'Dropbox API: %s', 'backwpup' ), $e->getMessage() ) . '</p></div>';
|
153 |
+
}
|
154 |
+
}
|
155 |
+
}
|
156 |
+
|
157 |
|
158 |
/**
|
159 |
* @param $jobid
|
408 |
|
409 |
/**
|
410 |
* @param string $boxtype
|
411 |
+
* @throws BackWPup_Destination_Dropbox_API_Exception
|
412 |
*/
|
413 |
public function __construct( $boxtype = 'dropbox' ) {
|
414 |
|
inc/class-job.php
CHANGED
@@ -145,6 +145,12 @@ final class BackWPup_Job {
|
|
145 |
private function __construct( $starttype, $job_settings = 0 ) {
|
146 |
global $wpdb;
|
147 |
|
|
|
|
|
|
|
|
|
|
|
|
|
148 |
//check startype
|
149 |
if ( ! in_array( $starttype, array( 'runnow', 'runnowalt', 'cronrun', 'runext', 'runcli' ) ) )
|
150 |
return;
|
@@ -614,6 +620,7 @@ final class BackWPup_Job {
|
|
614 |
unset( $job_object );
|
615 |
//set Pid
|
616 |
$this->pid = self::get_pid();
|
|
|
617 |
//set function for PHP user defined error handling
|
618 |
$this->temp[ 'PHP' ][ 'INI' ][ 'ERROR_LOG' ] = ini_get( 'error_log' );
|
619 |
$this->temp[ 'PHP' ][ 'INI' ][ 'LOG_ERRORS' ] = ini_get( 'log_errors' );
|
@@ -703,7 +710,7 @@ final class BackWPup_Job {
|
|
703 |
$done = call_user_func( array( $destinations[ str_replace( 'DEST_SYNC_', '', $this->step_working ) ], 'job_run_sync' ), $this );
|
704 |
elseif ( strstr( $this->step_working, 'DEST_' ) )
|
705 |
$done = call_user_func( array( $destinations[ str_replace( 'DEST_', '', $this->step_working ) ], 'job_run_archive' ), $this );
|
706 |
-
|
707 |
$done = call_user_func( $this->steps_data[ $this->step_working ][ 'CALLBACK' ], $this );
|
708 |
//set step as done
|
709 |
if ( $done == TRUE ) {
|
@@ -749,7 +756,7 @@ final class BackWPup_Job {
|
|
749 |
if ( defined( 'ALTERNATE_WP_CRON' ) && ALTERNATE_WP_CRON ) {
|
750 |
//schedule restart for now
|
751 |
wp_clear_scheduled_hook( 'backwpup_cron', array( 'id' => 'restart' ) );
|
752 |
-
wp_schedule_single_event( time()
|
753 |
} else {
|
754 |
self::get_jobrun_url( 'restart' );
|
755 |
}
|
@@ -1682,8 +1689,13 @@ final class BackWPup_Job {
|
|
1682 |
$jobrestartarchivesize = BackWPup_Option::get( 'cfg', 'jobrestartarchivesize' );
|
1683 |
for ( $i = $this->substeps_done - 1; $i < $this->substeps_todo - 1; $i ++ ) {
|
1684 |
$this->steps_data[ $this->step_working ]['folder_files'] = $this->get_files_in_folder( $folders_to_backup[ $i ] );
|
1685 |
-
|
1686 |
-
|
|
|
|
|
|
|
|
|
|
|
1687 |
if ( count( $this->steps_data[ $this->step_working ]['folder_files'] ) > 0 ) {
|
1688 |
foreach ( $this->steps_data[ $this->step_working ]['folder_files'] as $file ) {
|
1689 |
//restart if size reached in MB
|
145 |
private function __construct( $starttype, $job_settings = 0 ) {
|
146 |
global $wpdb;
|
147 |
|
148 |
+
//check if a job started already than abort
|
149 |
+
if ( is_file( BackWPup::get_plugin_data( 'running_file' ) ) )
|
150 |
+
return;
|
151 |
+
else
|
152 |
+
file_put_contents( BackWPup::get_plugin_data( 'running_file' ), '<?php //'. serialize( $this ) );
|
153 |
+
|
154 |
//check startype
|
155 |
if ( ! in_array( $starttype, array( 'runnow', 'runnowalt', 'cronrun', 'runext', 'runcli' ) ) )
|
156 |
return;
|
620 |
unset( $job_object );
|
621 |
//set Pid
|
622 |
$this->pid = self::get_pid();
|
623 |
+
$this->update_working_data( TRUE );
|
624 |
//set function for PHP user defined error handling
|
625 |
$this->temp[ 'PHP' ][ 'INI' ][ 'ERROR_LOG' ] = ini_get( 'error_log' );
|
626 |
$this->temp[ 'PHP' ][ 'INI' ][ 'LOG_ERRORS' ] = ini_get( 'log_errors' );
|
710 |
$done = call_user_func( array( $destinations[ str_replace( 'DEST_SYNC_', '', $this->step_working ) ], 'job_run_sync' ), $this );
|
711 |
elseif ( strstr( $this->step_working, 'DEST_' ) )
|
712 |
$done = call_user_func( array( $destinations[ str_replace( 'DEST_', '', $this->step_working ) ], 'job_run_archive' ), $this );
|
713 |
+
elseif ( ! empty( $this->steps_data[ $this->step_working ][ 'CALLBACK' ] ) )
|
714 |
$done = call_user_func( $this->steps_data[ $this->step_working ][ 'CALLBACK' ], $this );
|
715 |
//set step as done
|
716 |
if ( $done == TRUE ) {
|
756 |
if ( defined( 'ALTERNATE_WP_CRON' ) && ALTERNATE_WP_CRON ) {
|
757 |
//schedule restart for now
|
758 |
wp_clear_scheduled_hook( 'backwpup_cron', array( 'id' => 'restart' ) );
|
759 |
+
wp_schedule_single_event( time(), 'backwpup_cron', array( 'id' => 'restart' ) );
|
760 |
} else {
|
761 |
self::get_jobrun_url( 'restart' );
|
762 |
}
|
1689 |
$jobrestartarchivesize = BackWPup_Option::get( 'cfg', 'jobrestartarchivesize' );
|
1690 |
for ( $i = $this->substeps_done - 1; $i < $this->substeps_todo - 1; $i ++ ) {
|
1691 |
$this->steps_data[ $this->step_working ]['folder_files'] = $this->get_files_in_folder( $folders_to_backup[ $i ] );
|
1692 |
+
//add empty folders
|
1693 |
+
if ( empty( $this->steps_data[ $this->step_working ]['done_files'] ) && empty( $this->steps_data[ $this->step_working ]['folder_files'] ) ) {
|
1694 |
+
$folder_name_in_archive = trim( ltrim( str_replace( $this->remove_path, '', $folders_to_backup[ $i ] ), '/' ) );
|
1695 |
+
if ( ! empty ( $folder_name_in_archive ) )
|
1696 |
+
$backup_archive->add_empty_folder( $folders_to_backup[ $i ], $folder_name_in_archive );
|
1697 |
+
}
|
1698 |
+
//add files
|
1699 |
if ( count( $this->steps_data[ $this->step_working ]['folder_files'] ) > 0 ) {
|
1700 |
foreach ( $this->steps_data[ $this->step_working ]['folder_files'] as $file ) {
|
1701 |
//restart if size reached in MB
|
inc/class-jobtype-dbdump.php
CHANGED
@@ -41,7 +41,7 @@ class BackWPup_JobType_DBDump extends BackWPup_JobTypes {
|
|
41 |
//set only wordpress tables as default
|
42 |
$dbtables = $wpdb->get_results( 'SHOW TABLES FROM `' . DB_NAME . '`', ARRAY_N );
|
43 |
foreach ( $dbtables as $dbtable) {
|
44 |
-
if ( $wpdb->prefix
|
45 |
$defaults[ 'dbdumpexclude' ][] = $dbtable[ 0 ];
|
46 |
}
|
47 |
|
41 |
//set only wordpress tables as default
|
42 |
$dbtables = $wpdb->get_results( 'SHOW TABLES FROM `' . DB_NAME . '`', ARRAY_N );
|
43 |
foreach ( $dbtables as $dbtable) {
|
44 |
+
if ( $wpdb->prefix != substr( $dbtable[ 0 ], 0, strlen( $wpdb->prefix ) ) )
|
45 |
$defaults[ 'dbdumpexclude' ][] = $dbtable[ 0 ];
|
46 |
}
|
47 |
|
inc/class-page-editjob.php
CHANGED
@@ -856,7 +856,7 @@ class BackWPup_Page_Editjob {
|
|
856 |
jQuery(document).ready(function ($) {
|
857 |
// auto post if things changed
|
858 |
var changed = false;
|
859 |
-
$('
|
860 |
changed = true;
|
861 |
});
|
862 |
$( '.nav-tab' ).click( function () {
|
856 |
jQuery(document).ready(function ($) {
|
857 |
// auto post if things changed
|
858 |
var changed = false;
|
859 |
+
$( '#editjob' ).change( function () {
|
860 |
changed = true;
|
861 |
});
|
862 |
$( '.nav-tab' ).click( function () {
|
inc/class-page-jobs.php
CHANGED
@@ -343,11 +343,13 @@ class BackWPup_Page_Jobs extends WP_List_Table {
|
|
343 |
}
|
344 |
}
|
345 |
//check sever callback
|
346 |
-
$raw_response = wp_remote_get(
|
347 |
-
|
348 |
-
|
349 |
-
|
350 |
-
|
|
|
|
|
351 |
$test_result = '';
|
352 |
if ( is_wp_error( $raw_response ) )
|
353 |
$test_result .= sprintf( __( 'The HTTP response test get a error "%s"','backwpup' ), $raw_response->get_error_message() );
|
343 |
}
|
344 |
}
|
345 |
//check sever callback
|
346 |
+
$raw_response = wp_remote_get( site_url( 'wp-cron.php?backwpup_run=test' ), array(
|
347 |
+
'blocking' => TRUE,
|
348 |
+
'sslverify' => FALSE,
|
349 |
+
'timeout' => 15,
|
350 |
+
'redirection' => 0,
|
351 |
+
'headers' => array( 'Authorization' => 'Basic ' . base64_encode( BackWPup_Option::get( 'cfg', 'httpauthuser' ) . ':' . BackWPup_Encryption::decrypt( BackWPup_Option::get( 'cfg', 'httpauthpassword' ) ) ) ),
|
352 |
+
'user-agent' => BackWPup::get_plugin_data( 'user-agent' ) ) );
|
353 |
$test_result = '';
|
354 |
if ( is_wp_error( $raw_response ) )
|
355 |
$test_result .= sprintf( __( 'The HTTP response test get a error "%s"','backwpup' ), $raw_response->get_error_message() );
|
inc/class-page-settings.php
CHANGED
@@ -365,19 +365,22 @@ class BackWPup_Page_Settings {
|
|
365 |
echo '<tr title=""><td>' . __( 'cURL version', 'backwpup' ) . '</td><td>' . __( 'unavailable', 'backwpup' ) . '</td></tr>';
|
366 |
}
|
367 |
//response test
|
368 |
-
$raw_response = wp_remote_get(
|
369 |
-
|
370 |
-
|
371 |
-
|
372 |
-
|
|
|
|
|
373 |
echo '<tr><td>' . __( 'Server self connect:', 'backwpup' ) . '</td><td>';
|
374 |
$test_result = '';
|
375 |
if ( is_wp_error( $raw_response ) )
|
376 |
$test_result .= sprintf( __( 'The HTTP response test get a error "%s"','backwpup' ), $raw_response->get_error_message() );
|
377 |
if ( 200 != wp_remote_retrieve_response_code( $raw_response ) )
|
378 |
$test_result .= sprintf( __( 'The HTTP response test get a false http status (%s)','backwpup' ), wp_remote_retrieve_response_code( $raw_response ) );
|
379 |
-
|
380 |
-
|
|
|
381 |
|
382 |
if ( empty( $test_result ) )
|
383 |
_e( 'Response Test O.K.', 'backwpup' );
|
365 |
echo '<tr title=""><td>' . __( 'cURL version', 'backwpup' ) . '</td><td>' . __( 'unavailable', 'backwpup' ) . '</td></tr>';
|
366 |
}
|
367 |
//response test
|
368 |
+
$raw_response = wp_remote_get( site_url( 'wp-cron.php?backwpup_run=test' ), array(
|
369 |
+
'blocking' => TRUE,
|
370 |
+
'sslverify' => FALSE,
|
371 |
+
'timeout' => 15,
|
372 |
+
'redirection' => 0,
|
373 |
+
'headers' => array( 'Authorization' => 'Basic ' . base64_encode( BackWPup_Option::get( 'cfg', 'httpauthuser' ) . ':' . BackWPup_Encryption::decrypt( BackWPup_Option::get( 'cfg', 'httpauthpassword' ) ) ) ),
|
374 |
+
'user-agent' => BackWPup::get_plugin_data( 'user-agent' ) ) );
|
375 |
echo '<tr><td>' . __( 'Server self connect:', 'backwpup' ) . '</td><td>';
|
376 |
$test_result = '';
|
377 |
if ( is_wp_error( $raw_response ) )
|
378 |
$test_result .= sprintf( __( 'The HTTP response test get a error "%s"','backwpup' ), $raw_response->get_error_message() );
|
379 |
if ( 200 != wp_remote_retrieve_response_code( $raw_response ) )
|
380 |
$test_result .= sprintf( __( 'The HTTP response test get a false http status (%s)','backwpup' ), wp_remote_retrieve_response_code( $raw_response ) );
|
381 |
+
$headers = wp_remote_retrieve_headers( $raw_response );
|
382 |
+
if ( isset( $headers['x-backwpup-ver'] ) && $headers['x-backwpup-ver'] != BackWPup::get_plugin_data( 'version' ) )
|
383 |
+
$test_result .= sprintf( __( 'The BackWPup HTTP response header gives back the false value "%s"','backwpup' ), $headers['x-backwpup-ver'] );
|
384 |
|
385 |
if ( empty( $test_result ) )
|
386 |
_e( 'Response Test O.K.', 'backwpup' );
|
js/page_edit_jobtype_dbdump.dev.js
CHANGED
@@ -1,16 +1,16 @@
|
|
1 |
jQuery(document).ready(function ($) {
|
2 |
|
3 |
$('#dball').click(function () {
|
4 |
-
$('input[name="tabledb[]"]').prop("checked", true)
|
5 |
});
|
6 |
|
7 |
$('#dbnone').click(function () {
|
8 |
-
$('input[name="tabledb[]"]').prop("checked", false)
|
9 |
});
|
10 |
|
11 |
$('#dbwp').click(function () {
|
12 |
-
$('input[name="tabledb[]"]').prop("checked", false)
|
13 |
-
$('input[name="tabledb[]"][value^="' + $('#dbwp').val() + '"]').prop("checked", true)
|
14 |
});
|
15 |
|
16 |
$('input[name="dbdumpwpdbsettings"]').change(function () {
|
1 |
jQuery(document).ready(function ($) {
|
2 |
|
3 |
$('#dball').click(function () {
|
4 |
+
$('input[name="tabledb[]"]').prop("checked", true).change();;
|
5 |
});
|
6 |
|
7 |
$('#dbnone').click(function () {
|
8 |
+
$('input[name="tabledb[]"]').prop("checked", false).change();;
|
9 |
});
|
10 |
|
11 |
$('#dbwp').click(function () {
|
12 |
+
$('input[name="tabledb[]"]').prop("checked", false).change();;
|
13 |
+
$('input[name="tabledb[]"][value^="' + $('#dbwp').val() + '"]').prop("checked", true).change();;
|
14 |
});
|
15 |
|
16 |
$('input[name="dbdumpwpdbsettings"]').change(function () {
|
js/page_edit_jobtype_dbdump.js
CHANGED
@@ -1 +1 @@
|
|
1 |
-
jQuery(document).ready(function($){$("#dball").click(function(){$('input[name="tabledb[]"]').prop("checked",true);});$("#dbnone").click(function(){$('input[name="tabledb[]"]').prop("checked",false);});$("#dbwp").click(function(){$('input[name="tabledb[]"]').prop("checked",false);$('input[name="tabledb[]"][value^="'+$("#dbwp").val()+'"]').prop("checked",true);});$('input[name="dbdumpwpdbsettings"]').change(function(){if($('input[name="dbdumpwpdbsettings"]').prop("checked")){$("#dbconnection").hide();}else{$("#dbconnection").show();}});function db_tables(){var data={action:"backwpup_jobtype_dbdump",action2:"tables",dbname:$("#dbdumpdbname").val(),dbhost:$("#dbdumpdbhost").val(),dbuser:$("#dbdumpdbuser").val(),dbpassword:$("#dbdumpdbpassword").val(),wpdbsettings:$("#dbdumpwpdbsettings:checked").val(),jobid:$("#jobid").val(),_ajax_nonce:$("#backwpupajaxnonce").val()};$.post(ajaxurl,data,function(response){$("#dbtables").replaceWith(response);});}$("#dbdumpdbname").change(function(){db_tables();});$("#dbdumpwpdbsettings").change(function(){if($("#dbdumpwpdbsettings:checked").val()){db_tables();}else{db_databases();}});function db_databases(){var data={action:"backwpup_jobtype_dbdump",action2:"databases",dbhost:$("#dbdumpdbhost").val(),dbuser:$("#dbdumpdbuser").val(),dbpassword:$("#dbdumpdbpassword").val(),dbname:$('input[name="dbselected"]').val(),_ajax_nonce:$("#backwpupajaxnonce").val()};$.post(ajaxurl,data,function(response){$("#dbdumpdbname").replaceWith(response);db_tables();$("#dbdumpdbname").change(function(){db_tables();});});}$("#dbdumpdbhost").change(function(){db_databases();});$("#dbdumpdbuser").change(function(){db_databases();});$("#dbdumpdbpassword").change(function(){db_databases();});});
|
1 |
+
jQuery(document).ready(function($){$("#dball").click(function(){$('input[name="tabledb[]"]').prop("checked",true).change();});$("#dbnone").click(function(){$('input[name="tabledb[]"]').prop("checked",false).change();});$("#dbwp").click(function(){$('input[name="tabledb[]"]').prop("checked",false).change();$('input[name="tabledb[]"][value^="'+$("#dbwp").val()+'"]').prop("checked",true).change();});$('input[name="dbdumpwpdbsettings"]').change(function(){if($('input[name="dbdumpwpdbsettings"]').prop("checked")){$("#dbconnection").hide();}else{$("#dbconnection").show();}});function db_tables(){var data={action:"backwpup_jobtype_dbdump",action2:"tables",dbname:$("#dbdumpdbname").val(),dbhost:$("#dbdumpdbhost").val(),dbuser:$("#dbdumpdbuser").val(),dbpassword:$("#dbdumpdbpassword").val(),wpdbsettings:$("#dbdumpwpdbsettings:checked").val(),jobid:$("#jobid").val(),_ajax_nonce:$("#backwpupajaxnonce").val()};$.post(ajaxurl,data,function(response){$("#dbtables").replaceWith(response);});}$("#dbdumpdbname").change(function(){db_tables();});$("#dbdumpwpdbsettings").change(function(){if($("#dbdumpwpdbsettings:checked").val()){db_tables();}else{db_databases();}});function db_databases(){var data={action:"backwpup_jobtype_dbdump",action2:"databases",dbhost:$("#dbdumpdbhost").val(),dbuser:$("#dbdumpdbuser").val(),dbpassword:$("#dbdumpdbpassword").val(),dbname:$('input[name="dbselected"]').val(),_ajax_nonce:$("#backwpupajaxnonce").val()};$.post(ajaxurl,data,function(response){$("#dbdumpdbname").replaceWith(response);db_tables();$("#dbdumpdbname").change(function(){db_tables();});});}$("#dbdumpdbhost").change(function(){db_databases();});$("#dbdumpdbuser").change(function(){db_databases();});$("#dbdumpdbpassword").change(function(){db_databases();});});
|
readme.txt
CHANGED
@@ -3,7 +3,7 @@ Contributors: inpsyde, danielhuesken, Bueltge, nullbyte
|
|
3 |
Tags: backup, dump, database, file, ftp, xml, time, upload, multisite, cloud, dropbox, storage, S3
|
4 |
Requires at least: 3.2
|
5 |
Tested up to: 3.5.1
|
6 |
-
Stable tag: 3.0.
|
7 |
License: GPLv3
|
8 |
License URI: http://www.gnu.org/licenses/gpl-3.0.html
|
9 |
|
@@ -179,6 +179,12 @@ Please check all settings after the update:
|
|
179 |
|
180 |
|
181 |
== Changelog ==
|
|
|
|
|
|
|
|
|
|
|
|
|
182 |
= Version 3.0.7 =
|
183 |
* Improved: All job requests will done over wp-cron.php now
|
184 |
* Improved: Ajax calls if blog in maintenance mode
|
3 |
Tags: backup, dump, database, file, ftp, xml, time, upload, multisite, cloud, dropbox, storage, S3
|
4 |
Requires at least: 3.2
|
5 |
Tested up to: 3.5.1
|
6 |
+
Stable tag: 3.0.8
|
7 |
License: GPLv3
|
8 |
License URI: http://www.gnu.org/licenses/gpl-3.0.html
|
9 |
|
179 |
|
180 |
|
181 |
== Changelog ==
|
182 |
+
= Version 3.0.8 =
|
183 |
+
* Fixed: Selected database tables not save on tab change
|
184 |
+
* Fixed: Database tables selection on new job
|
185 |
+
* Fixed: adding empty folder names tow archive
|
186 |
+
* Improved/Fixed: Dropbox Authentication
|
187 |
+
|
188 |
= Version 3.0.7 =
|
189 |
* Improved: All job requests will done over wp-cron.php now
|
190 |
* Improved: Ajax calls if blog in maintenance mode
|