Version Description
Added
- Validation on leave feedback, report issue and delete backup actions
- More descriptive wpress file names on export
Changed
- Remove "Unable to authenticate with secret key" message
Fixed
- Wrong file size in wpress file on export
Download this release
Release Info
| Developer | bangelov |
| Plugin | |
| Version | 6.51 |
| Comparing to | |
| See all releases | |
Code changes from version 6.50 to 6.51
- all-in-one-wp-migration.php +1 -1
- constants.php +1 -1
- exceptions.php +6 -3
- functions.php +83 -24
- lib/controller/class-ai1wm-backups-controller.php +16 -3
- lib/controller/class-ai1wm-export-controller.php +1 -2
- lib/controller/class-ai1wm-feedback-controller.php +20 -7
- lib/controller/class-ai1wm-import-controller.php +1 -2
- lib/controller/class-ai1wm-main-controller.php +13 -7
- lib/controller/class-ai1wm-report-controller.php +19 -6
- lib/controller/class-ai1wm-resolve-controller.php +1 -2
- lib/controller/class-ai1wm-status-controller.php +1 -2
- lib/model/class-ai1wm-backups.php +2 -11
- lib/model/class-ai1wm-extensions.php +1 -1
- lib/model/class-ai1wm-feedback.php +5 -5
- lib/model/class-ai1wm-report.php +4 -4
- lib/model/export/class-ai1wm-export-content.php +46 -79
- lib/model/export/class-ai1wm-export-download.php +10 -1
- lib/model/export/class-ai1wm-export-init.php +10 -1
- lib/model/import/class-ai1wm-import-content.php +57 -75
- lib/model/import/class-ai1wm-import-validate.php +28 -34
- lib/vendor/servmask/archiver/class-ai1wm-archiver.php +81 -145
- lib/vendor/servmask/archiver/class-ai1wm-compressor.php +137 -88
- lib/vendor/servmask/archiver/class-ai1wm-extractor.php +327 -239
- lib/view/assets/javascript/backups.min.js +17 -3
- lib/view/assets/javascript/export.min.js +13 -2
- lib/view/assets/javascript/import.min.js +13 -2
- readme.txt +15 -1
all-in-one-wp-migration.php
CHANGED
|
@@ -5,7 +5,7 @@
|
|
| 5 |
* Description: Migration tool for all your blog data. Import or Export your blog content with a single click.
|
| 6 |
* Author: ServMask
|
| 7 |
* Author URI: https://servmask.com/
|
| 8 |
-
* Version: 6.
|
| 9 |
* Text Domain: all-in-one-wp-migration
|
| 10 |
* Domain Path: /languages
|
| 11 |
* Network: True
|
| 5 |
* Description: Migration tool for all your blog data. Import or Export your blog content with a single click.
|
| 6 |
* Author: ServMask
|
| 7 |
* Author URI: https://servmask.com/
|
| 8 |
+
* Version: 6.51
|
| 9 |
* Text Domain: all-in-one-wp-migration
|
| 10 |
* Domain Path: /languages
|
| 11 |
* Network: True
|
constants.php
CHANGED
|
@@ -31,7 +31,7 @@ define( 'AI1WM_DEBUG', false );
|
|
| 31 |
// ==================
|
| 32 |
// = Plugin Version =
|
| 33 |
// ==================
|
| 34 |
-
define( 'AI1WM_VERSION', '6.
|
| 35 |
|
| 36 |
// ===============
|
| 37 |
// = Plugin Name =
|
| 31 |
// ==================
|
| 32 |
// = Plugin Version =
|
| 33 |
// ==================
|
| 34 |
+
define( 'AI1WM_VERSION', '6.51' );
|
| 35 |
|
| 36 |
// ===============
|
| 37 |
// = Plugin Name =
|
exceptions.php
CHANGED
|
@@ -29,10 +29,13 @@ class Ai1wm_Export_Exception extends Exception {}
|
|
| 29 |
class Ai1wm_Http_Exception extends Exception {}
|
| 30 |
class Ai1wm_Import_Exception extends Exception {}
|
| 31 |
class Ai1wm_Import_Retry_Exception extends Exception {}
|
| 32 |
-
class
|
| 33 |
-
class
|
|
|
|
| 34 |
class Ai1wm_Not_Readable_Exception extends Exception {}
|
| 35 |
class Ai1wm_Not_Writable_Exception extends Exception {}
|
| 36 |
-
class
|
|
|
|
| 37 |
class Ai1wm_Not_Valid_Secret_Key_Exception extends Exception {}
|
|
|
|
| 38 |
class Ai1wm_Storage_Exception extends Exception {}
|
| 29 |
class Ai1wm_Http_Exception extends Exception {}
|
| 30 |
class Ai1wm_Import_Exception extends Exception {}
|
| 31 |
class Ai1wm_Import_Retry_Exception extends Exception {}
|
| 32 |
+
class Ai1wm_Not_Accessible_Exception extends Exception {}
|
| 33 |
+
class Ai1wm_Not_Seekable_Exception extends Exception {}
|
| 34 |
+
class Ai1wm_Not_Tellable_Exception extends Exception {}
|
| 35 |
class Ai1wm_Not_Readable_Exception extends Exception {}
|
| 36 |
class Ai1wm_Not_Writable_Exception extends Exception {}
|
| 37 |
+
class Ai1wm_Not_Found_Exception extends Exception {}
|
| 38 |
+
class Ai1wm_Not_Directory_Exception extends Exception {}
|
| 39 |
class Ai1wm_Not_Valid_Secret_Key_Exception extends Exception {}
|
| 40 |
+
class Ai1wm_Quota_Exceeded_Exception extends Exception {}
|
| 41 |
class Ai1wm_Storage_Exception extends Exception {}
|
functions.php
CHANGED
|
@@ -275,25 +275,27 @@ function ai1wm_parse_size( $size, $default = null ) {
|
|
| 275 |
/**
|
| 276 |
* Get current site name
|
| 277 |
*
|
|
|
|
| 278 |
* @return string
|
| 279 |
*/
|
| 280 |
-
function ai1wm_site_name() {
|
| 281 |
-
return parse_url(
|
| 282 |
}
|
| 283 |
|
| 284 |
/**
|
| 285 |
* Get archive file name
|
| 286 |
*
|
|
|
|
| 287 |
* @return string
|
| 288 |
*/
|
| 289 |
-
function ai1wm_archive_file() {
|
| 290 |
$name = array();
|
| 291 |
|
| 292 |
// Add domain
|
| 293 |
-
$name[] = parse_url(
|
| 294 |
|
| 295 |
// Add path
|
| 296 |
-
if ( ( $path = explode( '/', parse_url(
|
| 297 |
foreach ( $path as $directory ) {
|
| 298 |
if ( $directory ) {
|
| 299 |
$name[] = $directory;
|
|
@@ -316,16 +318,17 @@ function ai1wm_archive_file() {
|
|
| 316 |
/**
|
| 317 |
* Get archive folder name
|
| 318 |
*
|
|
|
|
| 319 |
* @return string
|
| 320 |
*/
|
| 321 |
-
function ai1wm_archive_folder() {
|
| 322 |
$name = array();
|
| 323 |
|
| 324 |
// Add domain
|
| 325 |
-
$name[] = parse_url(
|
| 326 |
|
| 327 |
// Add path
|
| 328 |
-
if ( ( $path = explode( '/', parse_url(
|
| 329 |
foreach ( $path as $directory ) {
|
| 330 |
if ( $directory ) {
|
| 331 |
$name[] = $directory;
|
|
@@ -766,15 +769,15 @@ function ai1wm_urldecode( $value ) {
|
|
| 766 |
/**
|
| 767 |
* Opens a file in specified mode
|
| 768 |
*
|
| 769 |
-
* @param string
|
| 770 |
-
* @param string
|
| 771 |
* @return resource
|
| 772 |
-
* @throws
|
| 773 |
*/
|
| 774 |
function ai1wm_open( $file, $mode ) {
|
| 775 |
-
$file_handle = fopen( $file, $mode );
|
| 776 |
if ( false === $file_handle ) {
|
| 777 |
-
throw new
|
| 778 |
}
|
| 779 |
|
| 780 |
return $file_handle;
|
|
@@ -785,12 +788,12 @@ function ai1wm_open( $file, $mode ) {
|
|
| 785 |
*
|
| 786 |
* @param resource $handle File handle to write to
|
| 787 |
* @param string $content Contents to write to the file
|
| 788 |
-
* @return
|
| 789 |
* @throws Ai1wm_Not_Writable_Exception
|
| 790 |
* @throws Ai1wm_Quota_Exceeded_Exception
|
| 791 |
*/
|
| 792 |
function ai1wm_write( $handle, $content ) {
|
| 793 |
-
$write_result = fwrite( $handle, $content );
|
| 794 |
if ( false === $write_result ) {
|
| 795 |
if ( ( $meta = stream_get_meta_data( $handle ) ) ) {
|
| 796 |
throw new Ai1wm_Not_Writable_Exception( sprintf( __( 'Unable to write to: %s', AI1WM_PLUGIN_NAME ), $meta['uri'] ) );
|
|
@@ -807,11 +810,11 @@ function ai1wm_write( $handle, $content ) {
|
|
| 807 |
*
|
| 808 |
* @param resource $handle File handle to read from
|
| 809 |
* @param string $filesize File size
|
| 810 |
-
* @return
|
| 811 |
* @throws Ai1wm_Not_Readable_Exception
|
| 812 |
*/
|
| 813 |
function ai1wm_read( $handle, $filesize ) {
|
| 814 |
-
$read_result = fread( $handle, $filesize );
|
| 815 |
if ( false === $read_result ) {
|
| 816 |
if ( ( $meta = stream_get_meta_data( $handle ) ) ) {
|
| 817 |
throw new Ai1wm_Not_Readable_Exception( sprintf( __( 'Unable to read file: %s', AI1WM_PLUGIN_NAME ), $meta['uri'] ) );
|
|
@@ -821,11 +824,45 @@ function ai1wm_read( $handle, $filesize ) {
|
|
| 821 |
return $read_result;
|
| 822 |
}
|
| 823 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 824 |
/**
|
| 825 |
* Closes a file handle
|
| 826 |
*
|
| 827 |
* @param resource $handle File handle to close
|
| 828 |
-
* @return
|
| 829 |
*/
|
| 830 |
function ai1wm_close( $handle ) {
|
| 831 |
return @fclose( $handle );
|
|
@@ -834,13 +871,35 @@ function ai1wm_close( $handle ) {
|
|
| 834 |
/**
|
| 835 |
* Deletes a file
|
| 836 |
*
|
| 837 |
-
* @param string
|
| 838 |
-
* @return
|
| 839 |
*/
|
| 840 |
function ai1wm_unlink( $file ) {
|
| 841 |
return @unlink( $file );
|
| 842 |
}
|
| 843 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 844 |
/**
|
| 845 |
* Copies one file's contents to another
|
| 846 |
*
|
|
@@ -862,8 +921,8 @@ function ai1wm_copy( $source_file, $destination_file ) {
|
|
| 862 |
*
|
| 863 |
* This method supports files > 2GB on PHP x86
|
| 864 |
*
|
| 865 |
-
* @param string
|
| 866 |
-
* @param
|
| 867 |
*
|
| 868 |
* @return mixed Math_BigInteger|string|null
|
| 869 |
*/
|
|
@@ -934,8 +993,8 @@ function ai1wm_disable_jetpack_photon() {
|
|
| 934 |
/**
|
| 935 |
* Verify secret key
|
| 936 |
*
|
| 937 |
-
* @param string
|
| 938 |
-
* @return
|
| 939 |
* @throws Ai1wm_Not_Valid_Secret_Key_Exception
|
| 940 |
*/
|
| 941 |
function ai1wm_verify_secret_key( $secret_key ) {
|
| 275 |
/**
|
| 276 |
* Get current site name
|
| 277 |
*
|
| 278 |
+
* @param integer $blog_id Blog ID
|
| 279 |
* @return string
|
| 280 |
*/
|
| 281 |
+
function ai1wm_site_name( $blog_id = null ) {
|
| 282 |
+
return parse_url( get_site_url( $blog_id ), PHP_URL_HOST );
|
| 283 |
}
|
| 284 |
|
| 285 |
/**
|
| 286 |
* Get archive file name
|
| 287 |
*
|
| 288 |
+
* @param integer $blog_id Blog ID
|
| 289 |
* @return string
|
| 290 |
*/
|
| 291 |
+
function ai1wm_archive_file( $blog_id = null ) {
|
| 292 |
$name = array();
|
| 293 |
|
| 294 |
// Add domain
|
| 295 |
+
$name[] = parse_url( get_site_url( $blog_id ), PHP_URL_HOST );
|
| 296 |
|
| 297 |
// Add path
|
| 298 |
+
if ( ( $path = explode( '/', parse_url( get_site_url( $blog_id ), PHP_URL_PATH ) ) ) ) {
|
| 299 |
foreach ( $path as $directory ) {
|
| 300 |
if ( $directory ) {
|
| 301 |
$name[] = $directory;
|
| 318 |
/**
|
| 319 |
* Get archive folder name
|
| 320 |
*
|
| 321 |
+
* @param integer $blog_id Blog ID
|
| 322 |
* @return string
|
| 323 |
*/
|
| 324 |
+
function ai1wm_archive_folder( $blog_id = null ) {
|
| 325 |
$name = array();
|
| 326 |
|
| 327 |
// Add domain
|
| 328 |
+
$name[] = parse_url( get_site_url( $blog_id ), PHP_URL_HOST );
|
| 329 |
|
| 330 |
// Add path
|
| 331 |
+
if ( ( $path = explode( '/', parse_url( get_site_url( $blog_id ), PHP_URL_PATH ) ) ) ) {
|
| 332 |
foreach ( $path as $directory ) {
|
| 333 |
if ( $directory ) {
|
| 334 |
$name[] = $directory;
|
| 769 |
/**
|
| 770 |
* Opens a file in specified mode
|
| 771 |
*
|
| 772 |
+
* @param string $file Path to the file to open
|
| 773 |
+
* @param string $mode Mode in which to open the file
|
| 774 |
* @return resource
|
| 775 |
+
* @throws Ai1wm_Not_Accessible_Exception
|
| 776 |
*/
|
| 777 |
function ai1wm_open( $file, $mode ) {
|
| 778 |
+
$file_handle = @fopen( $file, $mode );
|
| 779 |
if ( false === $file_handle ) {
|
| 780 |
+
throw new Ai1wm_Not_Accessible_Exception( sprintf( __( 'Unable to open %s with mode %s', AI1WM_PLUGIN_NAME ), $file, $mode ) );
|
| 781 |
}
|
| 782 |
|
| 783 |
return $file_handle;
|
| 788 |
*
|
| 789 |
* @param resource $handle File handle to write to
|
| 790 |
* @param string $content Contents to write to the file
|
| 791 |
+
* @return integer
|
| 792 |
* @throws Ai1wm_Not_Writable_Exception
|
| 793 |
* @throws Ai1wm_Quota_Exceeded_Exception
|
| 794 |
*/
|
| 795 |
function ai1wm_write( $handle, $content ) {
|
| 796 |
+
$write_result = @fwrite( $handle, $content );
|
| 797 |
if ( false === $write_result ) {
|
| 798 |
if ( ( $meta = stream_get_meta_data( $handle ) ) ) {
|
| 799 |
throw new Ai1wm_Not_Writable_Exception( sprintf( __( 'Unable to write to: %s', AI1WM_PLUGIN_NAME ), $meta['uri'] ) );
|
| 810 |
*
|
| 811 |
* @param resource $handle File handle to read from
|
| 812 |
* @param string $filesize File size
|
| 813 |
+
* @return integer
|
| 814 |
* @throws Ai1wm_Not_Readable_Exception
|
| 815 |
*/
|
| 816 |
function ai1wm_read( $handle, $filesize ) {
|
| 817 |
+
$read_result = @fread( $handle, $filesize );
|
| 818 |
if ( false === $read_result ) {
|
| 819 |
if ( ( $meta = stream_get_meta_data( $handle ) ) ) {
|
| 820 |
throw new Ai1wm_Not_Readable_Exception( sprintf( __( 'Unable to read file: %s', AI1WM_PLUGIN_NAME ), $meta['uri'] ) );
|
| 824 |
return $read_result;
|
| 825 |
}
|
| 826 |
|
| 827 |
+
/**
|
| 828 |
+
* Seeks on a file pointer
|
| 829 |
+
*
|
| 830 |
+
* @param string $handle File handle to seeks
|
| 831 |
+
* @return integer
|
| 832 |
+
*/
|
| 833 |
+
function ai1wm_seek( $handle, $offset, $mode = SEEK_SET ) {
|
| 834 |
+
$seek_result = @fseek( $handle, $offset, $mode );
|
| 835 |
+
if ( -1 === $seek_result ) {
|
| 836 |
+
if ( ( $meta = stream_get_meta_data( $handle ) ) ) {
|
| 837 |
+
throw new Ai1wm_Not_Seekable_Exception( sprintf( __( 'Unable to seek to offset %d on %s', AI1WM_PLUGIN_NAME ), $offset, $meta['uri'] ) );
|
| 838 |
+
}
|
| 839 |
+
}
|
| 840 |
+
|
| 841 |
+
return $seek_result;
|
| 842 |
+
}
|
| 843 |
+
|
| 844 |
+
/**
|
| 845 |
+
* Tells on a file pointer
|
| 846 |
+
*
|
| 847 |
+
* @param string $handle File handle to tells
|
| 848 |
+
* @return integer
|
| 849 |
+
*/
|
| 850 |
+
function ai1wm_tell( $handle ) {
|
| 851 |
+
$tell_result = @ftell( $handle );
|
| 852 |
+
if ( false === $tell_result ) {
|
| 853 |
+
if ( ( $meta = stream_get_meta_data( $handle ) ) ) {
|
| 854 |
+
throw new Ai1wm_Not_Tellable_Exception( sprintf( __( 'Unable to get current pointer position of %s', AI1WM_PLUGIN_NAME ), $meta['uri'] ) );
|
| 855 |
+
}
|
| 856 |
+
}
|
| 857 |
+
|
| 858 |
+
return $tell_result;
|
| 859 |
+
}
|
| 860 |
+
|
| 861 |
/**
|
| 862 |
* Closes a file handle
|
| 863 |
*
|
| 864 |
* @param resource $handle File handle to close
|
| 865 |
+
* @return boolean
|
| 866 |
*/
|
| 867 |
function ai1wm_close( $handle ) {
|
| 868 |
return @fclose( $handle );
|
| 871 |
/**
|
| 872 |
* Deletes a file
|
| 873 |
*
|
| 874 |
+
* @param string $file Path to file to delete
|
| 875 |
+
* @return boolean
|
| 876 |
*/
|
| 877 |
function ai1wm_unlink( $file ) {
|
| 878 |
return @unlink( $file );
|
| 879 |
}
|
| 880 |
|
| 881 |
+
/**
|
| 882 |
+
* Sets modification time of a file
|
| 883 |
+
*
|
| 884 |
+
* @param string $file Path to file to change modification time
|
| 885 |
+
* @param integer $time File modification time
|
| 886 |
+
* @return boolean
|
| 887 |
+
*/
|
| 888 |
+
function ai1wm_touch( $file, $mtime ) {
|
| 889 |
+
return @touch( $file, $mtime );
|
| 890 |
+
}
|
| 891 |
+
|
| 892 |
+
/**
|
| 893 |
+
* Changes file mode
|
| 894 |
+
*
|
| 895 |
+
* @param string $file Path to file to change mode
|
| 896 |
+
* @param integer $time File mode
|
| 897 |
+
* @return boolean
|
| 898 |
+
*/
|
| 899 |
+
function ai1wm_chmod( $file, $mode ) {
|
| 900 |
+
return @chmod( $file, $mode );
|
| 901 |
+
}
|
| 902 |
+
|
| 903 |
/**
|
| 904 |
* Copies one file's contents to another
|
| 905 |
*
|
| 921 |
*
|
| 922 |
* This method supports files > 2GB on PHP x86
|
| 923 |
*
|
| 924 |
+
* @param string $file_path Path to the file
|
| 925 |
+
* @param boolean $as_string Return the filesize as string instead of BigInteger
|
| 926 |
*
|
| 927 |
* @return mixed Math_BigInteger|string|null
|
| 928 |
*/
|
| 993 |
/**
|
| 994 |
* Verify secret key
|
| 995 |
*
|
| 996 |
+
* @param string $secret_key Secret key
|
| 997 |
+
* @return boolean
|
| 998 |
* @throws Ai1wm_Not_Valid_Secret_Key_Exception
|
| 999 |
*/
|
| 1000 |
function ai1wm_verify_secret_key( $secret_key ) {
|
lib/controller/class-ai1wm-backups-controller.php
CHANGED
|
@@ -39,29 +39,42 @@ class Ai1wm_Backups_Controller {
|
|
| 39 |
}
|
| 40 |
|
| 41 |
public static function delete( $params = array() ) {
|
| 42 |
-
$
|
| 43 |
|
| 44 |
// Set params
|
| 45 |
if ( empty( $params ) ) {
|
| 46 |
$params = stripslashes_deep( $_POST );
|
| 47 |
}
|
| 48 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 49 |
// Set archive
|
| 50 |
$archive = null;
|
| 51 |
if ( isset( $params['archive'] ) ) {
|
| 52 |
$archive = trim( $params['archive'] );
|
| 53 |
}
|
| 54 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 55 |
$model = new Ai1wm_Backups;
|
| 56 |
|
| 57 |
try {
|
| 58 |
// Delete file
|
| 59 |
$model->delete_file( $archive );
|
| 60 |
} catch ( Exception $e ) {
|
| 61 |
-
$
|
| 62 |
}
|
| 63 |
|
| 64 |
-
echo json_encode( $
|
| 65 |
exit;
|
| 66 |
}
|
| 67 |
}
|
| 39 |
}
|
| 40 |
|
| 41 |
public static function delete( $params = array() ) {
|
| 42 |
+
$errors = array();
|
| 43 |
|
| 44 |
// Set params
|
| 45 |
if ( empty( $params ) ) {
|
| 46 |
$params = stripslashes_deep( $_POST );
|
| 47 |
}
|
| 48 |
|
| 49 |
+
// Set secret key
|
| 50 |
+
$secret_key = null;
|
| 51 |
+
if ( isset( $params['secret_key'] ) ) {
|
| 52 |
+
$secret_key = trim( $params['secret_key'] );
|
| 53 |
+
}
|
| 54 |
+
|
| 55 |
// Set archive
|
| 56 |
$archive = null;
|
| 57 |
if ( isset( $params['archive'] ) ) {
|
| 58 |
$archive = trim( $params['archive'] );
|
| 59 |
}
|
| 60 |
|
| 61 |
+
try {
|
| 62 |
+
// Ensure that unauthorized people cannot access delete action
|
| 63 |
+
ai1wm_verify_secret_key( $secret_key );
|
| 64 |
+
} catch ( Ai1wm_Not_Valid_Secret_Key_Exception $e ) {
|
| 65 |
+
exit;
|
| 66 |
+
}
|
| 67 |
+
|
| 68 |
$model = new Ai1wm_Backups;
|
| 69 |
|
| 70 |
try {
|
| 71 |
// Delete file
|
| 72 |
$model->delete_file( $archive );
|
| 73 |
} catch ( Exception $e ) {
|
| 74 |
+
$errors[] = $e->getMessage();
|
| 75 |
}
|
| 76 |
|
| 77 |
+
echo json_encode( array( 'errors' => $errors ) );
|
| 78 |
exit;
|
| 79 |
}
|
| 80 |
}
|
lib/controller/class-ai1wm-export-controller.php
CHANGED
|
@@ -52,14 +52,13 @@ class Ai1wm_Export_Controller {
|
|
| 52 |
// Set secret key
|
| 53 |
$secret_key = null;
|
| 54 |
if ( isset( $params['secret_key'] ) ) {
|
| 55 |
-
$secret_key = $params['secret_key'];
|
| 56 |
}
|
| 57 |
|
| 58 |
try {
|
| 59 |
// Ensure that unauthorized people cannot access export action
|
| 60 |
ai1wm_verify_secret_key( $secret_key );
|
| 61 |
} catch ( Ai1wm_Not_Valid_Secret_Key_Exception $e ) {
|
| 62 |
-
Ai1wm_Log::error( $e->getMessage() );
|
| 63 |
exit;
|
| 64 |
}
|
| 65 |
|
| 52 |
// Set secret key
|
| 53 |
$secret_key = null;
|
| 54 |
if ( isset( $params['secret_key'] ) ) {
|
| 55 |
+
$secret_key = trim( $params['secret_key'] );
|
| 56 |
}
|
| 57 |
|
| 58 |
try {
|
| 59 |
// Ensure that unauthorized people cannot access export action
|
| 60 |
ai1wm_verify_secret_key( $secret_key );
|
| 61 |
} catch ( Ai1wm_Not_Valid_Secret_Key_Exception $e ) {
|
|
|
|
| 62 |
exit;
|
| 63 |
}
|
| 64 |
|
lib/controller/class-ai1wm-feedback-controller.php
CHANGED
|
@@ -32,36 +32,49 @@ class Ai1wm_Feedback_Controller {
|
|
| 32 |
$params = stripslashes_deep( $_POST );
|
| 33 |
}
|
| 34 |
|
| 35 |
-
// Set
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 36 |
$type = null;
|
| 37 |
if ( isset( $params['ai1wm_type'] ) ) {
|
| 38 |
$type = trim( $params['ai1wm_type'] );
|
| 39 |
}
|
| 40 |
|
| 41 |
-
// Set
|
| 42 |
$email = null;
|
| 43 |
if ( isset( $params['ai1wm_email'] ) ) {
|
| 44 |
$email = trim( $params['ai1wm_email'] );
|
| 45 |
}
|
| 46 |
|
| 47 |
-
// Set
|
| 48 |
$message = null;
|
| 49 |
if ( isset( $params['ai1wm_message'] ) ) {
|
| 50 |
$message = trim( $params['ai1wm_message'] );
|
| 51 |
}
|
| 52 |
|
| 53 |
-
// Set
|
| 54 |
$terms = false;
|
| 55 |
if ( isset( $params['ai1wm_terms'] ) ) {
|
| 56 |
$terms = (bool) $params['ai1wm_terms'];
|
| 57 |
}
|
| 58 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 59 |
$model = new Ai1wm_Feedback;
|
| 60 |
|
| 61 |
-
// Send
|
| 62 |
-
$
|
| 63 |
|
| 64 |
-
echo json_encode( $
|
| 65 |
exit;
|
| 66 |
}
|
| 67 |
}
|
| 32 |
$params = stripslashes_deep( $_POST );
|
| 33 |
}
|
| 34 |
|
| 35 |
+
// Set secret key
|
| 36 |
+
$secret_key = null;
|
| 37 |
+
if ( isset( $params['secret_key'] ) ) {
|
| 38 |
+
$secret_key = trim( $params['secret_key'] );
|
| 39 |
+
}
|
| 40 |
+
|
| 41 |
+
// Set type
|
| 42 |
$type = null;
|
| 43 |
if ( isset( $params['ai1wm_type'] ) ) {
|
| 44 |
$type = trim( $params['ai1wm_type'] );
|
| 45 |
}
|
| 46 |
|
| 47 |
+
// Set e-mail
|
| 48 |
$email = null;
|
| 49 |
if ( isset( $params['ai1wm_email'] ) ) {
|
| 50 |
$email = trim( $params['ai1wm_email'] );
|
| 51 |
}
|
| 52 |
|
| 53 |
+
// Set message
|
| 54 |
$message = null;
|
| 55 |
if ( isset( $params['ai1wm_message'] ) ) {
|
| 56 |
$message = trim( $params['ai1wm_message'] );
|
| 57 |
}
|
| 58 |
|
| 59 |
+
// Set terms
|
| 60 |
$terms = false;
|
| 61 |
if ( isset( $params['ai1wm_terms'] ) ) {
|
| 62 |
$terms = (bool) $params['ai1wm_terms'];
|
| 63 |
}
|
| 64 |
|
| 65 |
+
try {
|
| 66 |
+
// Ensure that unauthorized people cannot access feedback action
|
| 67 |
+
ai1wm_verify_secret_key( $secret_key );
|
| 68 |
+
} catch ( Ai1wm_Not_Valid_Secret_Key_Exception $e ) {
|
| 69 |
+
exit;
|
| 70 |
+
}
|
| 71 |
+
|
| 72 |
$model = new Ai1wm_Feedback;
|
| 73 |
|
| 74 |
+
// Send feedback
|
| 75 |
+
$errors = $model->add( $type, $email, $message, $terms );
|
| 76 |
|
| 77 |
+
echo json_encode( array( 'errors' => $errors ) );
|
| 78 |
exit;
|
| 79 |
}
|
| 80 |
}
|
lib/controller/class-ai1wm-import-controller.php
CHANGED
|
@@ -52,14 +52,13 @@ class Ai1wm_Import_Controller {
|
|
| 52 |
// Set secret key
|
| 53 |
$secret_key = null;
|
| 54 |
if ( isset( $params['secret_key'] ) ) {
|
| 55 |
-
$secret_key = $params['secret_key'];
|
| 56 |
}
|
| 57 |
|
| 58 |
try {
|
| 59 |
// Ensure that unauthorized people cannot access import action
|
| 60 |
ai1wm_verify_secret_key( $secret_key );
|
| 61 |
} catch ( Ai1wm_Not_Valid_Secret_Key_Exception $e ) {
|
| 62 |
-
Ai1wm_Log::error( $e->getMessage() );
|
| 63 |
exit;
|
| 64 |
}
|
| 65 |
|
| 52 |
// Set secret key
|
| 53 |
$secret_key = null;
|
| 54 |
if ( isset( $params['secret_key'] ) ) {
|
| 55 |
+
$secret_key = trim( $params['secret_key'] );
|
| 56 |
}
|
| 57 |
|
| 58 |
try {
|
| 59 |
// Ensure that unauthorized people cannot access import action
|
| 60 |
ai1wm_verify_secret_key( $secret_key );
|
| 61 |
} catch ( Ai1wm_Not_Valid_Secret_Key_Exception $e ) {
|
|
|
|
| 62 |
exit;
|
| 63 |
}
|
| 64 |
|
lib/controller/class-ai1wm-main-controller.php
CHANGED
|
@@ -384,11 +384,13 @@ class Ai1wm_Main_Controller {
|
|
| 384 |
'ajax' => array(
|
| 385 |
'url' => wp_make_link_relative( admin_url( 'admin-ajax.php?action=ai1wm_feedback' ) ),
|
| 386 |
),
|
|
|
|
| 387 |
) );
|
| 388 |
wp_localize_script( 'ai1wm-js-export', 'ai1wm_report', array(
|
| 389 |
'ajax' => array(
|
| 390 |
'url' => wp_make_link_relative( admin_url( 'admin-ajax.php?action=ai1wm_report' ) ),
|
| 391 |
),
|
|
|
|
| 392 |
) );
|
| 393 |
wp_localize_script( 'ai1wm-js-export', 'ai1wm_export', array(
|
| 394 |
'ajax' => array(
|
|
@@ -445,11 +447,13 @@ class Ai1wm_Main_Controller {
|
|
| 445 |
'ajax' => array(
|
| 446 |
'url' => wp_make_link_relative( admin_url( 'admin-ajax.php?action=ai1wm_feedback' ) ),
|
| 447 |
),
|
|
|
|
| 448 |
) );
|
| 449 |
wp_localize_script( 'ai1wm-js-import', 'ai1wm_report', array(
|
| 450 |
'ajax' => array(
|
| 451 |
'url' => wp_make_link_relative( admin_url( 'admin-ajax.php?action=ai1wm_report' ) ),
|
| 452 |
),
|
|
|
|
| 453 |
) );
|
| 454 |
wp_localize_script( 'ai1wm-js-import', 'ai1wm_import', array(
|
| 455 |
'ajax' => array(
|
|
@@ -515,16 +519,19 @@ class Ai1wm_Main_Controller {
|
|
| 515 |
'ajax' => array(
|
| 516 |
'url' => wp_make_link_relative( admin_url( 'admin-ajax.php?action=ai1wm_feedback' ) ),
|
| 517 |
),
|
|
|
|
| 518 |
) );
|
| 519 |
wp_localize_script( 'ai1wm-js-backups', 'ai1wm_report', array(
|
| 520 |
'ajax' => array(
|
| 521 |
'url' => wp_make_link_relative( admin_url( 'admin-ajax.php?action=ai1wm_report' ) ),
|
| 522 |
),
|
|
|
|
| 523 |
) );
|
| 524 |
wp_localize_script( 'ai1wm-js-backups', 'ai1wm_backups', array(
|
| 525 |
'ajax' => array(
|
| 526 |
'url' => wp_make_link_relative( admin_url( 'admin-ajax.php?action=ai1wm_backups' ) ),
|
| 527 |
),
|
|
|
|
| 528 |
) );
|
| 529 |
wp_localize_script( 'ai1wm-js-backups', 'ai1wm_import', array(
|
| 530 |
'ajax' => array(
|
|
@@ -619,24 +626,23 @@ class Ai1wm_Main_Controller {
|
|
| 619 |
add_action( 'wp_ajax_nopriv_ai1wm_import', 'Ai1wm_Import_Controller::import' );
|
| 620 |
add_action( 'wp_ajax_nopriv_ai1wm_status', 'Ai1wm_Status_Controller::status' );
|
| 621 |
add_action( 'wp_ajax_nopriv_ai1wm_resolve', 'Ai1wm_Resolve_Controller::resolve' );
|
|
|
|
|
|
|
|
|
|
| 622 |
|
| 623 |
// Private actions
|
| 624 |
add_action( 'wp_ajax_ai1wm_export', 'Ai1wm_Export_Controller::export' );
|
| 625 |
add_action( 'wp_ajax_ai1wm_import', 'Ai1wm_Import_Controller::import' );
|
| 626 |
add_action( 'wp_ajax_ai1wm_status', 'Ai1wm_Status_Controller::status' );
|
| 627 |
add_action( 'wp_ajax_ai1wm_resolve', 'Ai1wm_Resolve_Controller::resolve' );
|
|
|
|
|
|
|
|
|
|
| 628 |
|
| 629 |
// Update
|
| 630 |
if ( current_user_can( 'update_plugins' ) ) {
|
| 631 |
add_action( 'wp_ajax_ai1wm_updater', 'Ai1wm_Updater_Controller::updater' );
|
| 632 |
}
|
| 633 |
-
|
| 634 |
-
// Delete backup, send feedback and report problem
|
| 635 |
-
if ( current_user_can( 'export' ) || current_user_can( 'import' ) ) {
|
| 636 |
-
add_action( 'wp_ajax_ai1wm_backups', 'Ai1wm_Backups_Controller::delete' );
|
| 637 |
-
add_action( 'wp_ajax_ai1wm_feedback', 'Ai1wm_Feedback_Controller::feedback' );
|
| 638 |
-
add_action( 'wp_ajax_ai1wm_report', 'Ai1wm_Report_Controller::report' );
|
| 639 |
-
}
|
| 640 |
}
|
| 641 |
|
| 642 |
/**
|
| 384 |
'ajax' => array(
|
| 385 |
'url' => wp_make_link_relative( admin_url( 'admin-ajax.php?action=ai1wm_feedback' ) ),
|
| 386 |
),
|
| 387 |
+
'secret_key' => get_option( AI1WM_SECRET_KEY ),
|
| 388 |
) );
|
| 389 |
wp_localize_script( 'ai1wm-js-export', 'ai1wm_report', array(
|
| 390 |
'ajax' => array(
|
| 391 |
'url' => wp_make_link_relative( admin_url( 'admin-ajax.php?action=ai1wm_report' ) ),
|
| 392 |
),
|
| 393 |
+
'secret_key' => get_option( AI1WM_SECRET_KEY ),
|
| 394 |
) );
|
| 395 |
wp_localize_script( 'ai1wm-js-export', 'ai1wm_export', array(
|
| 396 |
'ajax' => array(
|
| 447 |
'ajax' => array(
|
| 448 |
'url' => wp_make_link_relative( admin_url( 'admin-ajax.php?action=ai1wm_feedback' ) ),
|
| 449 |
),
|
| 450 |
+
'secret_key' => get_option( AI1WM_SECRET_KEY ),
|
| 451 |
) );
|
| 452 |
wp_localize_script( 'ai1wm-js-import', 'ai1wm_report', array(
|
| 453 |
'ajax' => array(
|
| 454 |
'url' => wp_make_link_relative( admin_url( 'admin-ajax.php?action=ai1wm_report' ) ),
|
| 455 |
),
|
| 456 |
+
'secret_key' => get_option( AI1WM_SECRET_KEY ),
|
| 457 |
) );
|
| 458 |
wp_localize_script( 'ai1wm-js-import', 'ai1wm_import', array(
|
| 459 |
'ajax' => array(
|
| 519 |
'ajax' => array(
|
| 520 |
'url' => wp_make_link_relative( admin_url( 'admin-ajax.php?action=ai1wm_feedback' ) ),
|
| 521 |
),
|
| 522 |
+
'secret_key' => get_option( AI1WM_SECRET_KEY ),
|
| 523 |
) );
|
| 524 |
wp_localize_script( 'ai1wm-js-backups', 'ai1wm_report', array(
|
| 525 |
'ajax' => array(
|
| 526 |
'url' => wp_make_link_relative( admin_url( 'admin-ajax.php?action=ai1wm_report' ) ),
|
| 527 |
),
|
| 528 |
+
'secret_key' => get_option( AI1WM_SECRET_KEY ),
|
| 529 |
) );
|
| 530 |
wp_localize_script( 'ai1wm-js-backups', 'ai1wm_backups', array(
|
| 531 |
'ajax' => array(
|
| 532 |
'url' => wp_make_link_relative( admin_url( 'admin-ajax.php?action=ai1wm_backups' ) ),
|
| 533 |
),
|
| 534 |
+
'secret_key' => get_option( AI1WM_SECRET_KEY ),
|
| 535 |
) );
|
| 536 |
wp_localize_script( 'ai1wm-js-backups', 'ai1wm_import', array(
|
| 537 |
'ajax' => array(
|
| 626 |
add_action( 'wp_ajax_nopriv_ai1wm_import', 'Ai1wm_Import_Controller::import' );
|
| 627 |
add_action( 'wp_ajax_nopriv_ai1wm_status', 'Ai1wm_Status_Controller::status' );
|
| 628 |
add_action( 'wp_ajax_nopriv_ai1wm_resolve', 'Ai1wm_Resolve_Controller::resolve' );
|
| 629 |
+
add_action( 'wp_ajax_nopriv_ai1wm_backups', 'Ai1wm_Backups_Controller::delete' );
|
| 630 |
+
add_action( 'wp_ajax_nopriv_ai1wm_feedback', 'Ai1wm_Feedback_Controller::feedback' );
|
| 631 |
+
add_action( 'wp_ajax_nopriv_ai1wm_report', 'Ai1wm_Report_Controller::report' );
|
| 632 |
|
| 633 |
// Private actions
|
| 634 |
add_action( 'wp_ajax_ai1wm_export', 'Ai1wm_Export_Controller::export' );
|
| 635 |
add_action( 'wp_ajax_ai1wm_import', 'Ai1wm_Import_Controller::import' );
|
| 636 |
add_action( 'wp_ajax_ai1wm_status', 'Ai1wm_Status_Controller::status' );
|
| 637 |
add_action( 'wp_ajax_ai1wm_resolve', 'Ai1wm_Resolve_Controller::resolve' );
|
| 638 |
+
add_action( 'wp_ajax_ai1wm_backups', 'Ai1wm_Backups_Controller::delete' );
|
| 639 |
+
add_action( 'wp_ajax_ai1wm_feedback', 'Ai1wm_Feedback_Controller::feedback' );
|
| 640 |
+
add_action( 'wp_ajax_ai1wm_report', 'Ai1wm_Report_Controller::report' );
|
| 641 |
|
| 642 |
// Update
|
| 643 |
if ( current_user_can( 'update_plugins' ) ) {
|
| 644 |
add_action( 'wp_ajax_ai1wm_updater', 'Ai1wm_Updater_Controller::updater' );
|
| 645 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 646 |
}
|
| 647 |
|
| 648 |
/**
|
lib/controller/class-ai1wm-report-controller.php
CHANGED
|
@@ -32,30 +32,43 @@ class Ai1wm_Report_Controller {
|
|
| 32 |
$params = stripslashes_deep( $_POST );
|
| 33 |
}
|
| 34 |
|
| 35 |
-
// Set
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 36 |
$email = null;
|
| 37 |
if ( isset( $params['ai1wm_email'] ) ) {
|
| 38 |
$email = trim( $params['ai1wm_email'] );
|
| 39 |
}
|
| 40 |
|
| 41 |
-
// Set
|
| 42 |
$message = null;
|
| 43 |
if ( isset( $params['ai1wm_message'] ) ) {
|
| 44 |
$message = trim( $params['ai1wm_message'] );
|
| 45 |
}
|
| 46 |
|
| 47 |
-
// Set
|
| 48 |
$terms = false;
|
| 49 |
if ( isset( $params['ai1wm_terms'] ) ) {
|
| 50 |
$terms = (bool) $params['ai1wm_terms'];
|
| 51 |
}
|
| 52 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 53 |
$model = new Ai1wm_Report;
|
| 54 |
|
| 55 |
-
// Send
|
| 56 |
-
$
|
| 57 |
|
| 58 |
-
echo json_encode( $
|
| 59 |
exit;
|
| 60 |
}
|
| 61 |
}
|
| 32 |
$params = stripslashes_deep( $_POST );
|
| 33 |
}
|
| 34 |
|
| 35 |
+
// Set secret key
|
| 36 |
+
$secret_key = null;
|
| 37 |
+
if ( isset( $params['secret_key'] ) ) {
|
| 38 |
+
$secret_key = trim( $params['secret_key'] );
|
| 39 |
+
}
|
| 40 |
+
|
| 41 |
+
// Set e-mail
|
| 42 |
$email = null;
|
| 43 |
if ( isset( $params['ai1wm_email'] ) ) {
|
| 44 |
$email = trim( $params['ai1wm_email'] );
|
| 45 |
}
|
| 46 |
|
| 47 |
+
// Set message
|
| 48 |
$message = null;
|
| 49 |
if ( isset( $params['ai1wm_message'] ) ) {
|
| 50 |
$message = trim( $params['ai1wm_message'] );
|
| 51 |
}
|
| 52 |
|
| 53 |
+
// Set terms
|
| 54 |
$terms = false;
|
| 55 |
if ( isset( $params['ai1wm_terms'] ) ) {
|
| 56 |
$terms = (bool) $params['ai1wm_terms'];
|
| 57 |
}
|
| 58 |
|
| 59 |
+
try {
|
| 60 |
+
// Ensure that unauthorized people cannot access report action
|
| 61 |
+
ai1wm_verify_secret_key( $secret_key );
|
| 62 |
+
} catch ( Ai1wm_Not_Valid_Secret_Key_Exception $e ) {
|
| 63 |
+
exit;
|
| 64 |
+
}
|
| 65 |
+
|
| 66 |
$model = new Ai1wm_Report;
|
| 67 |
|
| 68 |
+
// Send report
|
| 69 |
+
$errors = $model->add( $email, $message, $terms );
|
| 70 |
|
| 71 |
+
echo json_encode( array( 'errors' => $errors ) );
|
| 72 |
exit;
|
| 73 |
}
|
| 74 |
}
|
lib/controller/class-ai1wm-resolve-controller.php
CHANGED
|
@@ -35,14 +35,13 @@ class Ai1wm_Resolve_Controller {
|
|
| 35 |
// Set secret key
|
| 36 |
$secret_key = null;
|
| 37 |
if ( isset( $params['secret_key'] ) ) {
|
| 38 |
-
$secret_key = $params['secret_key'];
|
| 39 |
}
|
| 40 |
|
| 41 |
try {
|
| 42 |
// Ensure that unauthorized people cannot access resolve action
|
| 43 |
ai1wm_verify_secret_key( $secret_key );
|
| 44 |
} catch ( Ai1wm_Not_Valid_Secret_Key_Exception $e ) {
|
| 45 |
-
Ai1wm_Log::error( $e->getMessage() );
|
| 46 |
exit;
|
| 47 |
}
|
| 48 |
|
| 35 |
// Set secret key
|
| 36 |
$secret_key = null;
|
| 37 |
if ( isset( $params['secret_key'] ) ) {
|
| 38 |
+
$secret_key = trim( $params['secret_key'] );
|
| 39 |
}
|
| 40 |
|
| 41 |
try {
|
| 42 |
// Ensure that unauthorized people cannot access resolve action
|
| 43 |
ai1wm_verify_secret_key( $secret_key );
|
| 44 |
} catch ( Ai1wm_Not_Valid_Secret_Key_Exception $e ) {
|
|
|
|
| 45 |
exit;
|
| 46 |
}
|
| 47 |
|
lib/controller/class-ai1wm-status-controller.php
CHANGED
|
@@ -35,14 +35,13 @@ class Ai1wm_Status_Controller {
|
|
| 35 |
// Set secret key
|
| 36 |
$secret_key = null;
|
| 37 |
if ( isset( $params['secret_key'] ) ) {
|
| 38 |
-
$secret_key = $params['secret_key'];
|
| 39 |
}
|
| 40 |
|
| 41 |
try {
|
| 42 |
// Ensure that unauthorized people cannot access status action
|
| 43 |
ai1wm_verify_secret_key( $secret_key );
|
| 44 |
} catch ( Ai1wm_Not_Valid_Secret_Key_Exception $e ) {
|
| 45 |
-
Ai1wm_Log::error( $e->getMessage() );
|
| 46 |
exit;
|
| 47 |
}
|
| 48 |
|
| 35 |
// Set secret key
|
| 36 |
$secret_key = null;
|
| 37 |
if ( isset( $params['secret_key'] ) ) {
|
| 38 |
+
$secret_key = trim( $params['secret_key'] );
|
| 39 |
}
|
| 40 |
|
| 41 |
try {
|
| 42 |
// Ensure that unauthorized people cannot access status action
|
| 43 |
ai1wm_verify_secret_key( $secret_key );
|
| 44 |
} catch ( Ai1wm_Not_Valid_Secret_Key_Exception $e ) {
|
|
|
|
| 45 |
exit;
|
| 46 |
}
|
| 47 |
|
lib/model/class-ai1wm-backups.php
CHANGED
|
@@ -68,18 +68,9 @@ class Ai1wm_Backups {
|
|
| 68 |
* @return boolean
|
| 69 |
*/
|
| 70 |
public function delete_file( $file ) {
|
| 71 |
-
if (
|
| 72 |
-
|
| 73 |
-
} else if ( ! unlink( AI1WM_BACKUPS_PATH . DIRECTORY_SEPARATOR . $file ) ) {
|
| 74 |
-
throw new Ai1wm_Backups_Exception(
|
| 75 |
-
sprintf(
|
| 76 |
-
__( 'Unable to delete <strong>"%s"</strong> file.', AI1WM_PLUGIN_NAME ),
|
| 77 |
-
AI1WM_BACKUPS_PATH . DIRECTORY_SEPARATOR . $file
|
| 78 |
-
)
|
| 79 |
-
);
|
| 80 |
}
|
| 81 |
-
|
| 82 |
-
return true;
|
| 83 |
}
|
| 84 |
|
| 85 |
/**
|
| 68 |
* @return boolean
|
| 69 |
*/
|
| 70 |
public function delete_file( $file ) {
|
| 71 |
+
if ( ( $basename = basename( $file ) ) ) {
|
| 72 |
+
return @unlink( AI1WM_BACKUPS_PATH . DIRECTORY_SEPARATOR . $basename );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 73 |
}
|
|
|
|
|
|
|
| 74 |
}
|
| 75 |
|
| 76 |
/**
|
lib/model/class-ai1wm-extensions.php
CHANGED
|
@@ -76,7 +76,7 @@ class Ai1wm_Extensions {
|
|
| 76 |
'about' => AI1WMME_PLUGIN_ABOUT,
|
| 77 |
'basename' => AI1WMME_PLUGIN_BASENAME,
|
| 78 |
'version' => AI1WMME_VERSION,
|
| 79 |
-
'requires' => '3.
|
| 80 |
'short' => AI1WMME_PLUGIN_SHORT,
|
| 81 |
);
|
| 82 |
}
|
| 76 |
'about' => AI1WMME_PLUGIN_ABOUT,
|
| 77 |
'basename' => AI1WMME_PLUGIN_BASENAME,
|
| 78 |
'version' => AI1WMME_VERSION,
|
| 79 |
+
'requires' => '3.33',
|
| 80 |
'short' => AI1WMME_PLUGIN_SHORT,
|
| 81 |
);
|
| 82 |
}
|
lib/model/class-ai1wm-feedback.php
CHANGED
|
@@ -28,10 +28,10 @@ class Ai1wm_Feedback {
|
|
| 28 |
/**
|
| 29 |
* Submit customer feedback to ServMask.com
|
| 30 |
*
|
| 31 |
-
* @param string $type Feedback
|
| 32 |
-
* @param string $email User
|
| 33 |
-
* @param string $message User
|
| 34 |
-
* @param integer $terms User
|
| 35 |
*
|
| 36 |
* @return array
|
| 37 |
*/
|
|
@@ -64,6 +64,6 @@ class Ai1wm_Feedback {
|
|
| 64 |
}
|
| 65 |
}
|
| 66 |
|
| 67 |
-
return
|
| 68 |
}
|
| 69 |
}
|
| 28 |
/**
|
| 29 |
* Submit customer feedback to ServMask.com
|
| 30 |
*
|
| 31 |
+
* @param string $type Feedback type
|
| 32 |
+
* @param string $email User e-mail
|
| 33 |
+
* @param string $message User message
|
| 34 |
+
* @param integer $terms User accept terms
|
| 35 |
*
|
| 36 |
* @return array
|
| 37 |
*/
|
| 64 |
}
|
| 65 |
}
|
| 66 |
|
| 67 |
+
return $errors;
|
| 68 |
}
|
| 69 |
}
|
lib/model/class-ai1wm-report.php
CHANGED
|
@@ -28,9 +28,9 @@ class Ai1wm_Report {
|
|
| 28 |
/**
|
| 29 |
* Submit customer report to ServMask.com
|
| 30 |
*
|
| 31 |
-
* @param string $email User
|
| 32 |
-
* @param string $message User
|
| 33 |
-
* @param integer $terms User
|
| 34 |
*
|
| 35 |
* @return array
|
| 36 |
*/
|
|
@@ -60,6 +60,6 @@ class Ai1wm_Report {
|
|
| 60 |
}
|
| 61 |
}
|
| 62 |
|
| 63 |
-
return
|
| 64 |
}
|
| 65 |
}
|
| 28 |
/**
|
| 29 |
* Submit customer report to ServMask.com
|
| 30 |
*
|
| 31 |
+
* @param string $email User e-mail
|
| 32 |
+
* @param string $message User message
|
| 33 |
+
* @param integer $terms User accept terms
|
| 34 |
*
|
| 35 |
* @return array
|
| 36 |
*/
|
| 60 |
}
|
| 61 |
}
|
| 62 |
|
| 63 |
+
return $errors;
|
| 64 |
}
|
| 65 |
}
|
lib/model/export/class-ai1wm-export-content.php
CHANGED
|
@@ -27,25 +27,18 @@ class Ai1wm_Export_Content {
|
|
| 27 |
|
| 28 |
public static function execute( $params ) {
|
| 29 |
|
| 30 |
-
// Set
|
| 31 |
-
if ( isset( $params['
|
| 32 |
-
$
|
| 33 |
} else {
|
| 34 |
-
$
|
| 35 |
}
|
| 36 |
|
| 37 |
-
// Set
|
| 38 |
-
if ( isset( $params['
|
| 39 |
-
$
|
| 40 |
} else {
|
| 41 |
-
$
|
| 42 |
-
}
|
| 43 |
-
|
| 44 |
-
// Set filemap offset
|
| 45 |
-
if ( isset( $params['filemap_offset'] ) ) {
|
| 46 |
-
$filemap_offset = (int) $params['filemap_offset'];
|
| 47 |
-
} else {
|
| 48 |
-
$filemap_offset = 0;
|
| 49 |
}
|
| 50 |
|
| 51 |
// Get total files count
|
|
@@ -62,20 +55,21 @@ class Ai1wm_Export_Content {
|
|
| 62 |
$total_files_size = 1;
|
| 63 |
}
|
| 64 |
|
| 65 |
-
// Get processed files
|
| 66 |
-
if ( isset( $params['
|
| 67 |
-
$
|
| 68 |
} else {
|
| 69 |
-
$
|
| 70 |
}
|
| 71 |
|
| 72 |
// What percent of files have we processed?
|
| 73 |
-
$progress = (int) ( ( $
|
| 74 |
|
| 75 |
// Set progress
|
| 76 |
-
|
| 77 |
-
|
| 78 |
-
|
|
|
|
| 79 |
|
| 80 |
// Start time
|
| 81 |
$start = microtime( true );
|
|
@@ -84,56 +78,35 @@ class Ai1wm_Export_Content {
|
|
| 84 |
$filemap = ai1wm_open( ai1wm_filemap_path( $params ), 'r' );
|
| 85 |
|
| 86 |
// Set filemap pointer at the current index
|
| 87 |
-
if ( fseek( $filemap, $
|
| 88 |
|
| 89 |
// Get archive
|
| 90 |
$archive = new Ai1wm_Compressor( ai1wm_archive_path( $params ) );
|
| 91 |
|
|
|
|
| 92 |
while ( $path = trim( fgets( $filemap ) ) ) {
|
| 93 |
-
|
| 94 |
-
|
| 95 |
-
// Add file to archive
|
| 96 |
-
if ( ( $current_offset = $archive->add_file( WP_CONTENT_DIR . DIRECTORY_SEPARATOR . $path, $path, $current_filesize, $content_offset, 10 ) ) ) {
|
| 97 |
-
|
| 98 |
-
// What percent of files have we processed?
|
| 99 |
-
if ( ( $processed += ( $current_offset - $content_offset ) ) ) {
|
| 100 |
-
$progress = (int) ( ( $processed / $total_files_size ) * 100 );
|
| 101 |
-
}
|
| 102 |
-
|
| 103 |
-
// Set progress
|
| 104 |
-
Ai1wm_Status::info( sprintf( __( 'Archiving %d files...<br />%d%% complete', AI1WM_PLUGIN_NAME ), $total_files_count, $progress ) );
|
| 105 |
|
| 106 |
-
|
| 107 |
-
|
|
|
|
| 108 |
|
| 109 |
-
|
| 110 |
-
|
| 111 |
-
|
| 112 |
-
break;
|
| 113 |
-
}
|
| 114 |
-
|
| 115 |
-
// Increment processed files
|
| 116 |
-
if ( empty( $content_offset ) ) {
|
| 117 |
-
$processed += $archive->get_current_filesize();
|
| 118 |
-
}
|
| 119 |
|
| 120 |
-
|
| 121 |
-
|
| 122 |
|
| 123 |
-
|
| 124 |
-
|
| 125 |
|
| 126 |
-
|
| 127 |
-
|
| 128 |
-
|
| 129 |
-
} catch ( Ai1wm_Quota_Exceeded_Exception $e ) {
|
| 130 |
-
throw new Exception( 'Out of disk space.' );
|
| 131 |
-
} catch ( Exception $e ) {
|
| 132 |
-
// Skip bad file permissions
|
| 133 |
-
}
|
| 134 |
|
| 135 |
// More than 10 seconds have passed, break and do another request
|
| 136 |
if ( ( microtime( true ) - $start ) > 10 ) {
|
|
|
|
| 137 |
break;
|
| 138 |
}
|
| 139 |
}
|
|
@@ -145,37 +118,31 @@ class Ai1wm_Export_Content {
|
|
| 145 |
// End of the filemap?
|
| 146 |
if ( feof( $filemap ) ) {
|
| 147 |
|
| 148 |
-
// Unset
|
| 149 |
-
unset( $params['
|
| 150 |
-
|
| 151 |
-
// Unset content offset
|
| 152 |
-
unset( $params['content_offset'] );
|
| 153 |
|
| 154 |
-
// Unset filemap offset
|
| 155 |
-
unset( $params['
|
| 156 |
|
| 157 |
-
// Unset processed files
|
| 158 |
-
unset( $params['
|
| 159 |
|
| 160 |
// Unset completed flag
|
| 161 |
unset( $params['completed'] );
|
| 162 |
|
| 163 |
} else {
|
| 164 |
|
| 165 |
-
// Set
|
| 166 |
-
$params['
|
| 167 |
-
|
| 168 |
-
// Set content offset
|
| 169 |
-
$params['content_offset'] = $content_offset;
|
| 170 |
|
| 171 |
-
// Set filemap offset
|
| 172 |
-
$params['
|
| 173 |
|
| 174 |
-
// Set processed files
|
| 175 |
-
$params['
|
| 176 |
|
| 177 |
// Set completed flag
|
| 178 |
-
$params['completed'] =
|
| 179 |
}
|
| 180 |
|
| 181 |
// Close the filemap file
|
| 27 |
|
| 28 |
public static function execute( $params ) {
|
| 29 |
|
| 30 |
+
// Set file bytes offset
|
| 31 |
+
if ( isset( $params['file_bytes_offset'] ) ) {
|
| 32 |
+
$file_bytes_offset = (int) $params['file_bytes_offset'];
|
| 33 |
} else {
|
| 34 |
+
$file_bytes_offset = 0;
|
| 35 |
}
|
| 36 |
|
| 37 |
+
// Set filemap bytes offset
|
| 38 |
+
if ( isset( $params['filemap_bytes_offset'] ) ) {
|
| 39 |
+
$filemap_bytes_offset = (int) $params['filemap_bytes_offset'];
|
| 40 |
} else {
|
| 41 |
+
$filemap_bytes_offset = 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 42 |
}
|
| 43 |
|
| 44 |
// Get total files count
|
| 55 |
$total_files_size = 1;
|
| 56 |
}
|
| 57 |
|
| 58 |
+
// Get processed files size
|
| 59 |
+
if ( isset( $params['processed_files_size'] ) ) {
|
| 60 |
+
$processed_files_size = (int) $params['processed_files_size'];
|
| 61 |
} else {
|
| 62 |
+
$processed_files_size = 0;
|
| 63 |
}
|
| 64 |
|
| 65 |
// What percent of files have we processed?
|
| 66 |
+
$progress = (int) min( ( $processed_files_size / $total_files_size ) * 100, 100 );
|
| 67 |
|
| 68 |
// Set progress
|
| 69 |
+
Ai1wm_Status::info( sprintf( __( 'Archiving %d files...<br />%d%% complete', AI1WM_PLUGIN_NAME ), $total_files_count, $progress ) );
|
| 70 |
+
|
| 71 |
+
// Flag to hold if file data has been processed
|
| 72 |
+
$completed = true;
|
| 73 |
|
| 74 |
// Start time
|
| 75 |
$start = microtime( true );
|
| 78 |
$filemap = ai1wm_open( ai1wm_filemap_path( $params ), 'r' );
|
| 79 |
|
| 80 |
// Set filemap pointer at the current index
|
| 81 |
+
if ( fseek( $filemap, $filemap_bytes_offset ) !== -1 ) {
|
| 82 |
|
| 83 |
// Get archive
|
| 84 |
$archive = new Ai1wm_Compressor( ai1wm_archive_path( $params ) );
|
| 85 |
|
| 86 |
+
// Loop over files
|
| 87 |
while ( $path = trim( fgets( $filemap ) ) ) {
|
| 88 |
+
$file_bytes_written = 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 89 |
|
| 90 |
+
// Add file to archive
|
| 91 |
+
if ( ( $completed = $archive->add_file( WP_CONTENT_DIR . DIRECTORY_SEPARATOR . $path, $path, $file_bytes_written, $file_bytes_offset, 10 ) ) ) {
|
| 92 |
+
$file_bytes_offset = 0;
|
| 93 |
|
| 94 |
+
// Set filemap bytes offset
|
| 95 |
+
$filemap_bytes_offset = ftell( $filemap );
|
| 96 |
+
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 97 |
|
| 98 |
+
// Increment processed files size
|
| 99 |
+
$processed_files_size += $file_bytes_written;
|
| 100 |
|
| 101 |
+
// What percent of files have we processed?
|
| 102 |
+
$progress = (int) min( ( $processed_files_size / $total_files_size ) * 100, 100 );
|
| 103 |
|
| 104 |
+
// Set progress
|
| 105 |
+
Ai1wm_Status::info( sprintf( __( 'Archiving %d files...<br />%d%% complete', AI1WM_PLUGIN_NAME ), $total_files_count, $progress ) );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 106 |
|
| 107 |
// More than 10 seconds have passed, break and do another request
|
| 108 |
if ( ( microtime( true ) - $start ) > 10 ) {
|
| 109 |
+
$completed = false;
|
| 110 |
break;
|
| 111 |
}
|
| 112 |
}
|
| 118 |
// End of the filemap?
|
| 119 |
if ( feof( $filemap ) ) {
|
| 120 |
|
| 121 |
+
// Unset file bytes offset
|
| 122 |
+
unset( $params['file_bytes_offset'] );
|
|
|
|
|
|
|
|
|
|
| 123 |
|
| 124 |
+
// Unset filemap bytes offset
|
| 125 |
+
unset( $params['filemap_bytes_offset'] );
|
| 126 |
|
| 127 |
+
// Unset processed files size
|
| 128 |
+
unset( $params['processed_files_size'] );
|
| 129 |
|
| 130 |
// Unset completed flag
|
| 131 |
unset( $params['completed'] );
|
| 132 |
|
| 133 |
} else {
|
| 134 |
|
| 135 |
+
// Set file bytes offset
|
| 136 |
+
$params['file_bytes_offset'] = $file_bytes_offset;
|
|
|
|
|
|
|
|
|
|
| 137 |
|
| 138 |
+
// Set filemap bytes offset
|
| 139 |
+
$params['filemap_bytes_offset'] = $filemap_bytes_offset;
|
| 140 |
|
| 141 |
+
// Set processed files size
|
| 142 |
+
$params['processed_files_size'] = $processed_files_size;
|
| 143 |
|
| 144 |
// Set completed flag
|
| 145 |
+
$params['completed'] = $completed;
|
| 146 |
}
|
| 147 |
|
| 148 |
// Close the filemap file
|
lib/model/export/class-ai1wm-export-download.php
CHANGED
|
@@ -39,10 +39,19 @@ class Ai1wm_Export_Download {
|
|
| 39 |
// Rename archive file
|
| 40 |
if ( rename( ai1wm_archive_path( $params ), ai1wm_download_path( $params ) ) ) {
|
| 41 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 42 |
// Set archive details
|
| 43 |
$link = ai1wm_backups_url( $params );
|
| 44 |
$size = ai1wm_download_size( $params );
|
| 45 |
-
$name = ai1wm_site_name();
|
| 46 |
|
| 47 |
// Set progress
|
| 48 |
Ai1wm_Status::download(
|
| 39 |
// Rename archive file
|
| 40 |
if ( rename( ai1wm_archive_path( $params ), ai1wm_download_path( $params ) ) ) {
|
| 41 |
|
| 42 |
+
$blog_id = null;
|
| 43 |
+
|
| 44 |
+
// Get subsite Blog ID
|
| 45 |
+
if ( isset( $params['options']['sites'] ) && ( $sites = $params['options']['sites'] ) ) {
|
| 46 |
+
if ( count( $sites ) === 1 ) {
|
| 47 |
+
$blog_id = array_shift( $sites );
|
| 48 |
+
}
|
| 49 |
+
}
|
| 50 |
+
|
| 51 |
// Set archive details
|
| 52 |
$link = ai1wm_backups_url( $params );
|
| 53 |
$size = ai1wm_download_size( $params );
|
| 54 |
+
$name = ai1wm_site_name( $blog_id );
|
| 55 |
|
| 56 |
// Set progress
|
| 57 |
Ai1wm_Status::download(
|
lib/model/export/class-ai1wm-export-init.php
CHANGED
|
@@ -27,9 +27,18 @@ class Ai1wm_Export_Init {
|
|
| 27 |
|
| 28 |
public static function execute( $params ) {
|
| 29 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 30 |
// Set archive
|
| 31 |
if ( empty( $params['archive'] ) ) {
|
| 32 |
-
$params['archive'] = ai1wm_archive_file();
|
| 33 |
}
|
| 34 |
|
| 35 |
// Set storage
|
| 27 |
|
| 28 |
public static function execute( $params ) {
|
| 29 |
|
| 30 |
+
$blog_id = null;
|
| 31 |
+
|
| 32 |
+
// Get subsite Blog ID
|
| 33 |
+
if ( isset( $params['options']['sites'] ) && ( $sites = $params['options']['sites'] ) ) {
|
| 34 |
+
if ( count( $sites ) === 1 ) {
|
| 35 |
+
$blog_id = array_shift( $sites );
|
| 36 |
+
}
|
| 37 |
+
}
|
| 38 |
+
|
| 39 |
// Set archive
|
| 40 |
if ( empty( $params['archive'] ) ) {
|
| 41 |
+
$params['archive'] = ai1wm_archive_file( $blog_id );
|
| 42 |
}
|
| 43 |
|
| 44 |
// Set storage
|
lib/model/import/class-ai1wm-import-content.php
CHANGED
|
@@ -37,18 +37,18 @@ class Ai1wm_Import_Content {
|
|
| 37 |
// Close handle
|
| 38 |
ai1wm_close( $handle );
|
| 39 |
|
| 40 |
-
// Set
|
| 41 |
-
if ( isset( $params['
|
| 42 |
-
$
|
| 43 |
} else {
|
| 44 |
-
$
|
| 45 |
}
|
| 46 |
|
| 47 |
-
// Set archive offset
|
| 48 |
-
if ( isset( $params['
|
| 49 |
-
$
|
| 50 |
} else {
|
| 51 |
-
$
|
| 52 |
}
|
| 53 |
|
| 54 |
// Get total files count
|
|
@@ -65,20 +65,21 @@ class Ai1wm_Import_Content {
|
|
| 65 |
$total_files_size = 1;
|
| 66 |
}
|
| 67 |
|
| 68 |
-
// Get processed files
|
| 69 |
-
if ( isset( $params['
|
| 70 |
-
$
|
| 71 |
} else {
|
| 72 |
-
$
|
| 73 |
}
|
| 74 |
|
| 75 |
// What percent of files have we processed?
|
| 76 |
-
$progress = (int) ( ( $
|
| 77 |
|
| 78 |
// Set progress
|
| 79 |
-
|
| 80 |
-
|
| 81 |
-
|
|
|
|
| 82 |
|
| 83 |
// Start time
|
| 84 |
$start = microtime( true );
|
|
@@ -87,7 +88,7 @@ class Ai1wm_Import_Content {
|
|
| 87 |
$archive = new Ai1wm_Extractor( ai1wm_archive_path( $params ) );
|
| 88 |
|
| 89 |
// Set the file pointer to the one that we have saved
|
| 90 |
-
$archive->set_file_pointer(
|
| 91 |
|
| 92 |
$old_paths = array();
|
| 93 |
$new_paths = array();
|
|
@@ -139,58 +140,39 @@ class Ai1wm_Import_Content {
|
|
| 139 |
}
|
| 140 |
|
| 141 |
while ( $archive->has_not_reached_eof() ) {
|
| 142 |
-
|
| 143 |
-
|
| 144 |
-
|
| 145 |
-
|
| 146 |
-
|
| 147 |
-
|
| 148 |
-
|
| 149 |
-
|
| 150 |
-
|
| 151 |
-
|
| 152 |
-
|
| 153 |
-
|
| 154 |
-
|
| 155 |
-
|
| 156 |
-
|
| 157 |
-
|
| 158 |
-
|
| 159 |
-
if ( ( $processed += ( $current_offset - $content_offset ) ) ) {
|
| 160 |
-
$progress = (int) ( ( $processed / $total_files_size ) * 100 );
|
| 161 |
-
}
|
| 162 |
-
|
| 163 |
-
// Set progress
|
| 164 |
-
Ai1wm_Status::info( sprintf( __( 'Restoring %d files...<br />%d%% complete', AI1WM_PLUGIN_NAME ), $total_files_count, $progress ) );
|
| 165 |
-
|
| 166 |
-
// Set content offset
|
| 167 |
-
$content_offset = $current_offset;
|
| 168 |
-
|
| 169 |
-
// Set archive offset
|
| 170 |
-
$archive_offset = $archive->get_file_pointer();
|
| 171 |
-
|
| 172 |
-
break;
|
| 173 |
-
}
|
| 174 |
|
| 175 |
-
|
| 176 |
-
|
| 177 |
-
$processed += $archive->get_current_filesize();
|
| 178 |
-
}
|
| 179 |
|
| 180 |
-
|
| 181 |
-
|
| 182 |
|
| 183 |
-
|
| 184 |
-
|
| 185 |
|
| 186 |
-
|
| 187 |
-
|
| 188 |
-
} catch ( Exception $e ) {
|
| 189 |
-
// Skip bad file permissions
|
| 190 |
-
}
|
| 191 |
|
| 192 |
// More than 10 seconds have passed, break and do another request
|
| 193 |
if ( ( microtime( true ) - $start ) > 10 ) {
|
|
|
|
| 194 |
break;
|
| 195 |
}
|
| 196 |
}
|
|
@@ -198,31 +180,31 @@ class Ai1wm_Import_Content {
|
|
| 198 |
// End of the archive?
|
| 199 |
if ( $archive->has_reached_eof() ) {
|
| 200 |
|
| 201 |
-
// Unset
|
| 202 |
-
unset( $params['
|
| 203 |
|
| 204 |
-
// Unset archive offset
|
| 205 |
-
unset( $params['
|
| 206 |
|
| 207 |
-
// Unset processed files
|
| 208 |
-
unset( $params['
|
| 209 |
|
| 210 |
// Unset completed flag
|
| 211 |
unset( $params['completed'] );
|
| 212 |
|
| 213 |
} else {
|
| 214 |
|
| 215 |
-
// Set
|
| 216 |
-
$params['
|
| 217 |
|
| 218 |
-
// Set archive offset
|
| 219 |
-
$params['
|
| 220 |
|
| 221 |
-
// Set processed files
|
| 222 |
-
$params['
|
| 223 |
|
| 224 |
// Set completed flag
|
| 225 |
-
$params['completed'] =
|
| 226 |
}
|
| 227 |
|
| 228 |
// Close the archive file
|
| 37 |
// Close handle
|
| 38 |
ai1wm_close( $handle );
|
| 39 |
|
| 40 |
+
// Set file bytes offset
|
| 41 |
+
if ( isset( $params['file_bytes_offset'] ) ) {
|
| 42 |
+
$file_bytes_offset = (int) $params['file_bytes_offset'];
|
| 43 |
} else {
|
| 44 |
+
$file_bytes_offset = 0;
|
| 45 |
}
|
| 46 |
|
| 47 |
+
// Set archive bytes offset
|
| 48 |
+
if ( isset( $params['archive_bytes_offset'] ) ) {
|
| 49 |
+
$archive_bytes_offset = (int) $params['archive_bytes_offset'];
|
| 50 |
} else {
|
| 51 |
+
$archive_bytes_offset = 0;
|
| 52 |
}
|
| 53 |
|
| 54 |
// Get total files count
|
| 65 |
$total_files_size = 1;
|
| 66 |
}
|
| 67 |
|
| 68 |
+
// Get processed files size
|
| 69 |
+
if ( isset( $params['processed_files_size'] ) ) {
|
| 70 |
+
$processed_files_size = (int) $params['processed_files_size'];
|
| 71 |
} else {
|
| 72 |
+
$processed_files_size = 0;
|
| 73 |
}
|
| 74 |
|
| 75 |
// What percent of files have we processed?
|
| 76 |
+
$progress = (int) min( ( $processed_files_size / $total_files_size ) * 100, 100 );
|
| 77 |
|
| 78 |
// Set progress
|
| 79 |
+
Ai1wm_Status::info( sprintf( __( 'Restoring %d files...<br />%d%% complete', AI1WM_PLUGIN_NAME ), $total_files_count, $progress ) );
|
| 80 |
+
|
| 81 |
+
// Flag to hold if file data has been processed
|
| 82 |
+
$completed = true;
|
| 83 |
|
| 84 |
// Start time
|
| 85 |
$start = microtime( true );
|
| 88 |
$archive = new Ai1wm_Extractor( ai1wm_archive_path( $params ) );
|
| 89 |
|
| 90 |
// Set the file pointer to the one that we have saved
|
| 91 |
+
$archive->set_file_pointer( $archive_bytes_offset );
|
| 92 |
|
| 93 |
$old_paths = array();
|
| 94 |
$new_paths = array();
|
| 140 |
}
|
| 141 |
|
| 142 |
while ( $archive->has_not_reached_eof() ) {
|
| 143 |
+
$file_bytes_written = 0;
|
| 144 |
+
|
| 145 |
+
// Exclude WordPress files
|
| 146 |
+
$exclude_files = array_keys( _get_dropins() );
|
| 147 |
+
|
| 148 |
+
// Exclude plugin files
|
| 149 |
+
$exclude_files = array_merge( $exclude_files, array(
|
| 150 |
+
AI1WM_PACKAGE_NAME,
|
| 151 |
+
AI1WM_MULTISITE_NAME,
|
| 152 |
+
AI1WM_DATABASE_NAME,
|
| 153 |
+
AI1WM_MUPLUGINS_NAME,
|
| 154 |
+
) );
|
| 155 |
+
|
| 156 |
+
// Extract a file from archive to WP_CONTENT_DIR
|
| 157 |
+
if ( ( $completed = $archive->extract_one_file_to( WP_CONTENT_DIR, $exclude_files, $old_paths, $new_paths, $file_bytes_written, $file_bytes_offset, 10 ) ) ) {
|
| 158 |
+
$file_bytes_offset = 0;
|
| 159 |
+
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 160 |
|
| 161 |
+
// Set archive bytes offset
|
| 162 |
+
$archive_bytes_offset = $archive->get_file_pointer();
|
|
|
|
|
|
|
| 163 |
|
| 164 |
+
// Increment processed files size
|
| 165 |
+
$processed_files_size += $file_bytes_written;
|
| 166 |
|
| 167 |
+
// What percent of files have we processed?
|
| 168 |
+
$progress = (int) min( ( $processed_files_size / $total_files_size ) * 100, 100 );
|
| 169 |
|
| 170 |
+
// Set progress
|
| 171 |
+
Ai1wm_Status::info( sprintf( __( 'Restoring %d files...<br />%d%% complete', AI1WM_PLUGIN_NAME ), $total_files_count, $progress ) );
|
|
|
|
|
|
|
|
|
|
| 172 |
|
| 173 |
// More than 10 seconds have passed, break and do another request
|
| 174 |
if ( ( microtime( true ) - $start ) > 10 ) {
|
| 175 |
+
$completed = false;
|
| 176 |
break;
|
| 177 |
}
|
| 178 |
}
|
| 180 |
// End of the archive?
|
| 181 |
if ( $archive->has_reached_eof() ) {
|
| 182 |
|
| 183 |
+
// Unset file bytes offset
|
| 184 |
+
unset( $params['file_bytes_offset'] );
|
| 185 |
|
| 186 |
+
// Unset archive bytes offset
|
| 187 |
+
unset( $params['archive_bytes_offset'] );
|
| 188 |
|
| 189 |
+
// Unset processed files size
|
| 190 |
+
unset( $params['processed_files_size'] );
|
| 191 |
|
| 192 |
// Unset completed flag
|
| 193 |
unset( $params['completed'] );
|
| 194 |
|
| 195 |
} else {
|
| 196 |
|
| 197 |
+
// Set file bytes offset
|
| 198 |
+
$params['file_bytes_offset'] = $file_bytes_offset;
|
| 199 |
|
| 200 |
+
// Set archive bytes offset
|
| 201 |
+
$params['archive_bytes_offset'] = $archive_bytes_offset;
|
| 202 |
|
| 203 |
+
// Set processed files size
|
| 204 |
+
$params['processed_files_size'] = $processed_files_size;
|
| 205 |
|
| 206 |
// Set completed flag
|
| 207 |
+
$params['completed'] = $completed;
|
| 208 |
}
|
| 209 |
|
| 210 |
// Close the archive file
|
lib/model/import/class-ai1wm-import-validate.php
CHANGED
|
@@ -27,18 +27,18 @@ class Ai1wm_Import_Validate {
|
|
| 27 |
|
| 28 |
public static function execute( $params ) {
|
| 29 |
|
| 30 |
-
// Set
|
| 31 |
-
if ( isset( $params['
|
| 32 |
-
$
|
| 33 |
} else {
|
| 34 |
-
$
|
| 35 |
}
|
| 36 |
|
| 37 |
-
// Set archive offset
|
| 38 |
-
if ( isset( $params['
|
| 39 |
-
$
|
| 40 |
} else {
|
| 41 |
-
$
|
| 42 |
}
|
| 43 |
|
| 44 |
// Set progress
|
|
@@ -48,7 +48,7 @@ class Ai1wm_Import_Validate {
|
|
| 48 |
$archive = new Ai1wm_Extractor( ai1wm_archive_path( $params ) );
|
| 49 |
|
| 50 |
// Set the file pointer to the one that we have saved
|
| 51 |
-
$archive->set_file_pointer(
|
| 52 |
|
| 53 |
// Validate the archive file consistency
|
| 54 |
if ( ! $archive->is_valid() ) {
|
|
@@ -69,7 +69,7 @@ class Ai1wm_Import_Validate {
|
|
| 69 |
|
| 70 |
// Check file size of the archive
|
| 71 |
if ( false === $size ) {
|
| 72 |
-
throw new
|
| 73 |
sprintf( __( 'Unable to get the file size of <strong>%s</strong>', AI1WM_PLUGIN_NAME ), $name )
|
| 74 |
);
|
| 75 |
}
|
|
@@ -91,25 +91,19 @@ class Ai1wm_Import_Validate {
|
|
| 91 |
);
|
| 92 |
}
|
| 93 |
|
|
|
|
|
|
|
|
|
|
| 94 |
if ( $archive->has_not_reached_eof() ) {
|
|
|
|
| 95 |
|
| 96 |
// Unpack package.json, multisite.json and database.sql files
|
| 97 |
-
if ( ( $
|
| 98 |
-
|
| 99 |
-
// Set content offset
|
| 100 |
-
$content_offset = $current_offset;
|
| 101 |
-
|
| 102 |
-
// Set archive offset
|
| 103 |
-
$archive_offset = $archive->get_file_pointer();
|
| 104 |
-
|
| 105 |
-
} else {
|
| 106 |
-
|
| 107 |
-
// Set content offset
|
| 108 |
-
$content_offset = 0;
|
| 109 |
-
|
| 110 |
-
// Set archive offset
|
| 111 |
-
$archive_offset = $archive->get_file_pointer();
|
| 112 |
}
|
|
|
|
|
|
|
|
|
|
| 113 |
}
|
| 114 |
|
| 115 |
// End of the archive?
|
|
@@ -122,25 +116,25 @@ class Ai1wm_Import_Validate {
|
|
| 122 |
);
|
| 123 |
}
|
| 124 |
|
| 125 |
-
// Unset
|
| 126 |
-
unset( $params['
|
| 127 |
|
| 128 |
-
// Unset archive offset
|
| 129 |
-
unset( $params['
|
| 130 |
|
| 131 |
// Unset completed flag
|
| 132 |
unset( $params['completed'] );
|
| 133 |
|
| 134 |
} else {
|
| 135 |
|
| 136 |
-
// Set
|
| 137 |
-
$params['
|
| 138 |
|
| 139 |
-
// Set archive offset
|
| 140 |
-
$params['
|
| 141 |
|
| 142 |
// Set completed flag
|
| 143 |
-
$params['completed'] =
|
| 144 |
}
|
| 145 |
|
| 146 |
// Close the archive file
|
| 27 |
|
| 28 |
public static function execute( $params ) {
|
| 29 |
|
| 30 |
+
// Set file bytes offset
|
| 31 |
+
if ( isset( $params['file_bytes_offset'] ) ) {
|
| 32 |
+
$file_bytes_offset = (int) $params['file_bytes_offset'];
|
| 33 |
} else {
|
| 34 |
+
$file_bytes_offset = 0;
|
| 35 |
}
|
| 36 |
|
| 37 |
+
// Set archive bytes offset
|
| 38 |
+
if ( isset( $params['archive_bytes_offset'] ) ) {
|
| 39 |
+
$archive_bytes_offset = (int) $params['archive_bytes_offset'];
|
| 40 |
} else {
|
| 41 |
+
$archive_bytes_offset = 0;
|
| 42 |
}
|
| 43 |
|
| 44 |
// Set progress
|
| 48 |
$archive = new Ai1wm_Extractor( ai1wm_archive_path( $params ) );
|
| 49 |
|
| 50 |
// Set the file pointer to the one that we have saved
|
| 51 |
+
$archive->set_file_pointer( $archive_bytes_offset );
|
| 52 |
|
| 53 |
// Validate the archive file consistency
|
| 54 |
if ( ! $archive->is_valid() ) {
|
| 69 |
|
| 70 |
// Check file size of the archive
|
| 71 |
if ( false === $size ) {
|
| 72 |
+
throw new Ai1wm_Not_Accessible_Exception(
|
| 73 |
sprintf( __( 'Unable to get the file size of <strong>%s</strong>', AI1WM_PLUGIN_NAME ), $name )
|
| 74 |
);
|
| 75 |
}
|
| 91 |
);
|
| 92 |
}
|
| 93 |
|
| 94 |
+
// Flag to hold if file data has been processed
|
| 95 |
+
$completed = true;
|
| 96 |
+
|
| 97 |
if ( $archive->has_not_reached_eof() ) {
|
| 98 |
+
$file_bytes_written = 0;
|
| 99 |
|
| 100 |
// Unpack package.json, multisite.json and database.sql files
|
| 101 |
+
if ( ( $completed = $archive->extract_by_files_array( ai1wm_storage_path( $params ), array( AI1WM_PACKAGE_NAME, AI1WM_MULTISITE_NAME, AI1WM_DATABASE_NAME ), $file_bytes_written, $file_bytes_offset, 10 ) ) ) {
|
| 102 |
+
$file_bytes_offset = 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 103 |
}
|
| 104 |
+
|
| 105 |
+
// Set archive bytes offset
|
| 106 |
+
$archive_bytes_offset = $archive->get_file_pointer();
|
| 107 |
}
|
| 108 |
|
| 109 |
// End of the archive?
|
| 116 |
);
|
| 117 |
}
|
| 118 |
|
| 119 |
+
// Unset file bytes offset
|
| 120 |
+
unset( $params['file_bytes_offset'] );
|
| 121 |
|
| 122 |
+
// Unset archive bytes offset
|
| 123 |
+
unset( $params['archive_bytes_offset'] );
|
| 124 |
|
| 125 |
// Unset completed flag
|
| 126 |
unset( $params['completed'] );
|
| 127 |
|
| 128 |
} else {
|
| 129 |
|
| 130 |
+
// Set file bytes offset
|
| 131 |
+
$params['file_bytes_offset'] = $file_bytes_offset;
|
| 132 |
|
| 133 |
+
// Set archive bytes offset
|
| 134 |
+
$params['archive_bytes_offset'] = $archive_bytes_offset;
|
| 135 |
|
| 136 |
// Set completed flag
|
| 137 |
+
$params['completed'] = $completed;
|
| 138 |
}
|
| 139 |
|
| 140 |
// Close the archive file
|
lib/vendor/servmask/archiver/class-ai1wm-archiver.php
CHANGED
|
@@ -25,46 +25,12 @@
|
|
| 25 |
|
| 26 |
abstract class Ai1wm_Archiver {
|
| 27 |
|
| 28 |
-
/**
|
| 29 |
-
* Header block format of a file
|
| 30 |
-
*
|
| 31 |
-
* Field Name Offset Length Contents
|
| 32 |
-
* name 0 255 filename (no path, no slash)
|
| 33 |
-
* size 255 14 size of file contents
|
| 34 |
-
* mtime 269 12 last modification time
|
| 35 |
-
* prefix 281 4096 path name, no trailing slashes
|
| 36 |
-
*
|
| 37 |
-
* @type string
|
| 38 |
-
*/
|
| 39 |
-
protected $block_format = array(
|
| 40 |
-
'a255', // filename
|
| 41 |
-
'a14', // size of file contents
|
| 42 |
-
'a12', // last time modified
|
| 43 |
-
'a4096', // path
|
| 44 |
-
);
|
| 45 |
-
|
| 46 |
-
public function get_block_format() {
|
| 47 |
-
return $this->block_format;
|
| 48 |
-
}
|
| 49 |
-
|
| 50 |
-
public function set_block_format( $block_format ) {
|
| 51 |
-
$this->block_format = $block_format;
|
| 52 |
-
}
|
| 53 |
-
|
| 54 |
/**
|
| 55 |
* Filename including path to the file
|
| 56 |
*
|
| 57 |
* @type string
|
| 58 |
*/
|
| 59 |
-
protected $
|
| 60 |
-
|
| 61 |
-
public function get_filename() {
|
| 62 |
-
return $this->filename;
|
| 63 |
-
}
|
| 64 |
-
|
| 65 |
-
public function set_filename( $filename ) {
|
| 66 |
-
$this->filename = $filename;
|
| 67 |
-
}
|
| 68 |
|
| 69 |
/**
|
| 70 |
* Handle to the file
|
|
@@ -73,162 +39,132 @@ abstract class Ai1wm_Archiver {
|
|
| 73 |
*/
|
| 74 |
protected $file_handle = null;
|
| 75 |
|
| 76 |
-
public function get_file_handle() {
|
| 77 |
-
return $this->file_handle;
|
| 78 |
-
}
|
| 79 |
-
|
| 80 |
-
public function set_file_handle( $file_handle ) {
|
| 81 |
-
$this->file_handle = $file_handle;
|
| 82 |
-
}
|
| 83 |
-
|
| 84 |
/**
|
| 85 |
-
*
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 86 |
*
|
| 87 |
-
* @type
|
| 88 |
*/
|
| 89 |
-
protected $
|
| 90 |
-
|
| 91 |
-
|
| 92 |
-
|
| 93 |
-
|
| 94 |
-
|
| 95 |
-
public function set_current_filesize( $current_filesize ) {
|
| 96 |
-
$this->current_filesize = $current_filesize;
|
| 97 |
-
}
|
| 98 |
|
| 99 |
/**
|
| 100 |
-
* End
|
| 101 |
*
|
| 102 |
* @type string
|
| 103 |
*/
|
| 104 |
protected $eof = null;
|
| 105 |
|
| 106 |
-
public function get_eof() {
|
| 107 |
-
return $this->eof;
|
| 108 |
-
}
|
| 109 |
-
|
| 110 |
-
public function set_eof( $eof ) {
|
| 111 |
-
$this->eof = $eof;
|
| 112 |
-
}
|
| 113 |
-
|
| 114 |
/**
|
| 115 |
* Default constructor
|
| 116 |
*
|
| 117 |
* Initializes filename and end of file block
|
| 118 |
*
|
| 119 |
-
* @param string $
|
|
|
|
| 120 |
*/
|
| 121 |
-
public function __construct( $
|
| 122 |
-
|
| 123 |
-
$this->filename = $filename;
|
| 124 |
|
| 125 |
-
//
|
| 126 |
$this->eof = pack( 'a4377', '' );
|
| 127 |
|
| 128 |
-
//
|
| 129 |
if ( $write ) {
|
| 130 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 131 |
} else {
|
| 132 |
-
|
|
|
|
|
|
|
|
|
|
| 133 |
}
|
| 134 |
}
|
| 135 |
|
| 136 |
/**
|
| 137 |
-
*
|
| 138 |
-
*
|
| 139 |
-
* @param string $file File to open
|
| 140 |
*
|
| 141 |
-
* @
|
| 142 |
-
* @throws \Ai1wm_Not_Accesible_Exception
|
| 143 |
-
*/
|
| 144 |
-
protected function open_file_for_reading( $file ) {
|
| 145 |
-
return $this->open_file_in_mode( $file, 'rb' );
|
| 146 |
-
}
|
| 147 |
-
|
| 148 |
-
/**
|
| 149 |
-
* Open the archive for writing/appending
|
| 150 |
*
|
| 151 |
-
* @
|
| 152 |
*
|
| 153 |
-
* @return
|
| 154 |
-
* @throws \Ai1wm_Not_Accesible_Exception
|
| 155 |
*/
|
| 156 |
-
|
| 157 |
-
|
|
|
|
|
|
|
| 158 |
}
|
| 159 |
|
| 160 |
/**
|
| 161 |
-
*
|
| 162 |
*
|
| 163 |
-
* @
|
| 164 |
*
|
| 165 |
-
* @return
|
| 166 |
-
* @throws \Ai1wm_Not_Accesible_Exception
|
| 167 |
*/
|
| 168 |
-
|
| 169 |
-
|
| 170 |
-
|
|
|
|
|
|
|
| 171 |
|
| 172 |
-
|
| 173 |
-
* Opens file in the passed mode
|
| 174 |
-
*
|
| 175 |
-
* @param string $file File to be opened
|
| 176 |
-
* @param string $mode Mode to openthe file in
|
| 177 |
-
*
|
| 178 |
-
* @return resource
|
| 179 |
-
* @throws \Ai1wm_Not_Accesible_Exception
|
| 180 |
-
*/
|
| 181 |
-
protected function open_file_in_mode( $file, $mode ) {
|
| 182 |
-
return ai1wm_open( $file, $mode );
|
| 183 |
}
|
| 184 |
|
| 185 |
/**
|
| 186 |
-
*
|
| 187 |
-
*
|
| 188 |
-
* @param resource $handle File handle
|
| 189 |
-
* @param string $data Data to be written - binary
|
| 190 |
*
|
|
|
|
| 191 |
* @throws \Ai1wm_Not_Writable_Exception
|
| 192 |
-
|
| 193 |
-
protected function write_to_handle( $handle, $data ) {
|
| 194 |
-
return ai1wm_write( $handle, $data );
|
| 195 |
-
}
|
| 196 |
-
|
| 197 |
-
/**
|
| 198 |
-
* Read data from a handle
|
| 199 |
-
*
|
| 200 |
-
* @param resource $handle File handle
|
| 201 |
-
* @param int $size Size of data to be read in bytes
|
| 202 |
-
*
|
| 203 |
-
* @return string Content that was read
|
| 204 |
-
* @throws \Ai1wm_Not_Readable_Exception
|
| 205 |
-
*/
|
| 206 |
-
protected function read_from_handle( $handle, $size ) {
|
| 207 |
-
return ai1wm_read( $handle, $size );
|
| 208 |
-
}
|
| 209 |
-
|
| 210 |
-
/**
|
| 211 |
-
* Appends end of file block to the archive
|
| 212 |
*
|
| 213 |
-
* @
|
| 214 |
*/
|
| 215 |
protected function append_eof() {
|
| 216 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 217 |
}
|
| 218 |
|
| 219 |
/**
|
| 220 |
-
* Validate file
|
| 221 |
*
|
| 222 |
-
* return bool
|
| 223 |
*/
|
| 224 |
public function is_valid() {
|
| 225 |
-
$offset = ftell( $this->file_handle )
|
| 226 |
-
|
| 227 |
-
|
| 228 |
-
|
| 229 |
-
|
| 230 |
-
|
| 231 |
-
return true;
|
| 232 |
}
|
| 233 |
}
|
| 234 |
}
|
|
@@ -242,16 +178,16 @@ abstract class Ai1wm_Archiver {
|
|
| 242 |
* We either close the file or append the end of file block if complete argument is set to tru
|
| 243 |
*
|
| 244 |
* @param bool $complete Flag to append end of file block
|
| 245 |
-
* @return void
|
| 246 |
*
|
|
|
|
| 247 |
*/
|
| 248 |
public function close( $complete = false ) {
|
| 249 |
-
//
|
| 250 |
if ( true === $complete ) {
|
| 251 |
$this->append_eof();
|
| 252 |
}
|
| 253 |
|
| 254 |
-
//
|
| 255 |
-
|
| 256 |
}
|
| 257 |
}
|
| 25 |
|
| 26 |
abstract class Ai1wm_Archiver {
|
| 27 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 28 |
/**
|
| 29 |
* Filename including path to the file
|
| 30 |
*
|
| 31 |
* @type string
|
| 32 |
*/
|
| 33 |
+
protected $file_name = null;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 34 |
|
| 35 |
/**
|
| 36 |
* Handle to the file
|
| 39 |
*/
|
| 40 |
protected $file_handle = null;
|
| 41 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 42 |
/**
|
| 43 |
+
* Header block format of a file
|
| 44 |
+
*
|
| 45 |
+
* Field Name Offset Length Contents
|
| 46 |
+
* name 0 255 filename (no path, no slash)
|
| 47 |
+
* size 255 14 size of file contents
|
| 48 |
+
* mtime 269 12 last modification time
|
| 49 |
+
* prefix 281 4096 path name, no trailing slashes
|
| 50 |
*
|
| 51 |
+
* @type array
|
| 52 |
*/
|
| 53 |
+
protected $block_format = array(
|
| 54 |
+
'a255', // filename
|
| 55 |
+
'a14', // size of file contents
|
| 56 |
+
'a12', // last time modified
|
| 57 |
+
'a4096', // path
|
| 58 |
+
);
|
|
|
|
|
|
|
|
|
|
| 59 |
|
| 60 |
/**
|
| 61 |
+
* End of file block string
|
| 62 |
*
|
| 63 |
* @type string
|
| 64 |
*/
|
| 65 |
protected $eof = null;
|
| 66 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 67 |
/**
|
| 68 |
* Default constructor
|
| 69 |
*
|
| 70 |
* Initializes filename and end of file block
|
| 71 |
*
|
| 72 |
+
* @param string $file_name Archive file
|
| 73 |
+
* @param bool $write Read/write mode
|
| 74 |
*/
|
| 75 |
+
public function __construct( $file_name, $write = false ) {
|
| 76 |
+
$this->file_name = $file_name;
|
|
|
|
| 77 |
|
| 78 |
+
// Initialize end of file block
|
| 79 |
$this->eof = pack( 'a4377', '' );
|
| 80 |
|
| 81 |
+
// Open archive file
|
| 82 |
if ( $write ) {
|
| 83 |
+
// Open archive file for writing
|
| 84 |
+
if ( ( $this->file_handle = @fopen( $file_name, 'cb' ) ) === false ) {
|
| 85 |
+
throw new Ai1wm_Not_Accessible_Exception( sprintf( 'Unable to open file for writing. File: %s', $this->file_name ) );
|
| 86 |
+
}
|
| 87 |
+
|
| 88 |
+
// Seek to end of archive file
|
| 89 |
+
if ( @fseek( $this->file_handle, 0, SEEK_END ) === -1 ) {
|
| 90 |
+
throw new Ai1wm_Not_Seekable_Exception( sprintf( 'Unable to seek to end of file. File: %s', $this->file_name ) );
|
| 91 |
+
}
|
| 92 |
} else {
|
| 93 |
+
// Open archive file for reading
|
| 94 |
+
if ( ( $this->file_handle = @fopen( $file_name, 'rb' ) ) === false ) {
|
| 95 |
+
throw new Ai1wm_Not_Accessible_Exception( sprintf( 'Unable to open file for reading. File: %s', $this->file_name ) );
|
| 96 |
+
}
|
| 97 |
}
|
| 98 |
}
|
| 99 |
|
| 100 |
/**
|
| 101 |
+
* Set current file pointer
|
|
|
|
|
|
|
| 102 |
*
|
| 103 |
+
* @param int $offset Archive offset
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 104 |
*
|
| 105 |
+
* @throws \Ai1wm_Not_Seekable_Exception
|
| 106 |
*
|
| 107 |
+
* @return void
|
|
|
|
| 108 |
*/
|
| 109 |
+
public function set_file_pointer( $offset ) {
|
| 110 |
+
if ( @fseek( $this->file_handle, $offset, SEEK_CUR ) === -1 ) {
|
| 111 |
+
throw new Ai1wm_Not_Seekable_Exception( sprintf( 'Unable to seek to offset on file. File: %s Offset: %d', $this->file_name, $offset ) );
|
| 112 |
+
}
|
| 113 |
}
|
| 114 |
|
| 115 |
/**
|
| 116 |
+
* Get current file pointer
|
| 117 |
*
|
| 118 |
+
* @throws \Ai1wm_Not_Tellable_Exception
|
| 119 |
*
|
| 120 |
+
* @return int
|
|
|
|
| 121 |
*/
|
| 122 |
+
public function get_file_pointer() {
|
| 123 |
+
$offset = 0;
|
| 124 |
+
if ( ( $offset = @ftell( $this->file_handle ) ) === false ) {
|
| 125 |
+
throw new Ai1wm_Not_Tellable_Exception( sprintf( 'Unable to tell offset on file. File: %s', $this->file_name ) );
|
| 126 |
+
}
|
| 127 |
|
| 128 |
+
return $offset;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 129 |
}
|
| 130 |
|
| 131 |
/**
|
| 132 |
+
* Appends end of file block to the archive file
|
|
|
|
|
|
|
|
|
|
| 133 |
*
|
| 134 |
+
* @throws \Ai1wm_Not_Seekable_Exception
|
| 135 |
* @throws \Ai1wm_Not_Writable_Exception
|
| 136 |
+
* @throws \Ai1wm_Quota_Exceeded_Exception
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 137 |
*
|
| 138 |
+
* @return void
|
| 139 |
*/
|
| 140 |
protected function append_eof() {
|
| 141 |
+
// Seek to end of archive file
|
| 142 |
+
if ( @fseek( $this->file_handle, 0, SEEK_END ) === -1 ) {
|
| 143 |
+
throw new Ai1wm_Not_Seekable_Exception( sprintf( 'Unable to seek to end of file. File: %s', $this->file_name ) );
|
| 144 |
+
}
|
| 145 |
+
|
| 146 |
+
// Write end of file block
|
| 147 |
+
if ( ( $file_bytes = @fwrite( $this->file_handle, $this->eof ) ) !== false ) {
|
| 148 |
+
if ( strlen( $this->eof ) !== $file_bytes ) {
|
| 149 |
+
throw new Ai1wm_Quota_Exceeded_Exception( sprintf( 'Out of disk space. Unable to write end of block to file. File: %s', $this->file_name ) );
|
| 150 |
+
}
|
| 151 |
+
} else {
|
| 152 |
+
throw new Ai1wm_Not_Writable_Exception( sprintf( 'Unable to write end of block to file. File: %s', $this->file_name ) );
|
| 153 |
+
}
|
| 154 |
}
|
| 155 |
|
| 156 |
/**
|
| 157 |
+
* Validate archive file
|
| 158 |
*
|
| 159 |
+
* @return bool
|
| 160 |
*/
|
| 161 |
public function is_valid() {
|
| 162 |
+
if ( ( $offset = @ftell( $this->file_handle ) ) !== false ) {
|
| 163 |
+
if ( @fseek( $this->file_handle, -4377, SEEK_END ) !== -1 ) {
|
| 164 |
+
if ( @fread( $this->file_handle, 4377 ) === $this->eof ) {
|
| 165 |
+
if ( @fseek( $this->file_handle, $offset, SEEK_SET ) !== -1 ) {
|
| 166 |
+
return true;
|
| 167 |
+
}
|
|
|
|
| 168 |
}
|
| 169 |
}
|
| 170 |
}
|
| 178 |
* We either close the file or append the end of file block if complete argument is set to tru
|
| 179 |
*
|
| 180 |
* @param bool $complete Flag to append end of file block
|
|
|
|
| 181 |
*
|
| 182 |
+
* @return void
|
| 183 |
*/
|
| 184 |
public function close( $complete = false ) {
|
| 185 |
+
// Are we done appending to the file?
|
| 186 |
if ( true === $complete ) {
|
| 187 |
$this->append_eof();
|
| 188 |
}
|
| 189 |
|
| 190 |
+
// Close the file
|
| 191 |
+
@fclose( $this->file_handle );
|
| 192 |
}
|
| 193 |
}
|
lib/vendor/servmask/archiver/class-ai1wm-compressor.php
CHANGED
|
@@ -28,128 +28,177 @@ class Ai1wm_Compressor extends Ai1wm_Archiver {
|
|
| 28 |
/**
|
| 29 |
* Overloaded constructor that opens the passed file for writing
|
| 30 |
*
|
| 31 |
-
* @param string $
|
| 32 |
*/
|
| 33 |
-
public function __construct( $
|
| 34 |
-
//
|
| 35 |
-
parent::__construct( $
|
| 36 |
}
|
| 37 |
|
| 38 |
/**
|
| 39 |
* Add a file to the archive
|
| 40 |
*
|
| 41 |
-
* @param string $
|
| 42 |
-
* @param string $
|
| 43 |
-
* @param int $
|
| 44 |
-
* @param int $
|
| 45 |
-
* @param int $timeout
|
| 46 |
*
|
| 47 |
-
* @throws \
|
| 48 |
-
* @throws \Ai1wm_Not_Readable_Exception
|
| 49 |
* @throws \Ai1wm_Not_Writable_Exception
|
|
|
|
|
|
|
|
|
|
| 50 |
*/
|
| 51 |
-
public function add_file( $
|
| 52 |
-
|
| 53 |
-
$handle = $this->open_file_for_reading( $file );
|
| 54 |
-
|
| 55 |
-
// set file offset or set file header
|
| 56 |
-
if ( $offset ) {
|
| 57 |
-
// set file offset
|
| 58 |
-
fseek( $handle, $offset, SEEK_SET );
|
| 59 |
-
|
| 60 |
-
// set file size
|
| 61 |
-
$this->current_filesize = $current_filesize;
|
| 62 |
-
} else {
|
| 63 |
-
// get file block header of the file we are trying to archive
|
| 64 |
-
$block = $this->get_file_block( $file, $new_filename );
|
| 65 |
-
|
| 66 |
-
// write file block header to our archive file
|
| 67 |
-
$this->write_to_handle( $this->file_handle, $block );
|
| 68 |
-
}
|
| 69 |
|
| 70 |
-
//
|
| 71 |
-
$
|
| 72 |
|
| 73 |
-
//
|
| 74 |
$start = microtime( true );
|
| 75 |
|
| 76 |
-
//
|
| 77 |
-
|
| 78 |
-
|
| 79 |
-
|
| 80 |
-
|
| 81 |
-
|
| 82 |
-
|
| 83 |
-
|
| 84 |
-
|
| 85 |
-
|
| 86 |
-
|
| 87 |
-
|
| 88 |
-
|
| 89 |
-
|
| 90 |
-
|
| 91 |
-
|
| 92 |
-
|
| 93 |
-
// set file offset
|
| 94 |
-
$offset = ftell( $handle );
|
| 95 |
|
| 96 |
-
|
| 97 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 98 |
|
| 99 |
-
|
| 100 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 101 |
}
|
| 102 |
}
|
|
|
|
|
|
|
|
|
|
| 103 |
}
|
| 104 |
|
| 105 |
-
|
| 106 |
-
ai1wm_close( $handle );
|
| 107 |
}
|
| 108 |
|
| 109 |
/**
|
| 110 |
* Generate binary block header for a file
|
| 111 |
*
|
| 112 |
-
* @param string $
|
| 113 |
-
* @param string $
|
| 114 |
*
|
| 115 |
-
* @return
|
| 116 |
-
* @throws \Ai1wm_Not_Accesible_Exception
|
| 117 |
*/
|
| 118 |
-
private function get_file_block( $
|
| 119 |
-
|
| 120 |
-
$stat = stat( $file );
|
| 121 |
-
if ( false === $stat ) {
|
| 122 |
-
// unable to get file data
|
| 123 |
-
throw new Ai1wm_Not_Accesible_Exception( __( 'Unable to get properties of file ' . $file, AI1WM_PLUGIN_NAME ) );
|
| 124 |
-
}
|
| 125 |
|
| 126 |
-
//
|
| 127 |
-
$
|
| 128 |
|
| 129 |
-
|
| 130 |
-
|
| 131 |
-
|
| 132 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 133 |
|
| 134 |
-
|
| 135 |
-
|
| 136 |
|
| 137 |
-
|
| 138 |
-
|
| 139 |
|
| 140 |
-
|
| 141 |
-
|
| 142 |
|
| 143 |
-
|
| 144 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 145 |
|
| 146 |
-
|
| 147 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 148 |
|
| 149 |
-
//
|
| 150 |
-
|
|
|
|
|
|
|
| 151 |
|
| 152 |
-
|
| 153 |
-
return pack( $format, $name, $size, $date, $path );
|
| 154 |
}
|
| 155 |
}
|
| 28 |
/**
|
| 29 |
* Overloaded constructor that opens the passed file for writing
|
| 30 |
*
|
| 31 |
+
* @param string $file_name File to use as archive
|
| 32 |
*/
|
| 33 |
+
public function __construct( $file_name ) {
|
| 34 |
+
// Call parent, to initialize variables
|
| 35 |
+
parent::__construct( $file_name, true );
|
| 36 |
}
|
| 37 |
|
| 38 |
/**
|
| 39 |
* Add a file to the archive
|
| 40 |
*
|
| 41 |
+
* @param string $file_name File to add to the archive
|
| 42 |
+
* @param string $new_file_name Write the file with a different name
|
| 43 |
+
* @param int $file_written File written (in bytes)
|
| 44 |
+
* @param int $file_offset File offset (in bytes)
|
| 45 |
+
* @param int $timeout Process timeout (in seconds)
|
| 46 |
*
|
| 47 |
+
* @throws \Ai1wm_Not_Seekable_Exception
|
|
|
|
| 48 |
* @throws \Ai1wm_Not_Writable_Exception
|
| 49 |
+
* @throws \Ai1wm_Quota_Exceeded_Exception
|
| 50 |
+
*
|
| 51 |
+
* @return bool
|
| 52 |
*/
|
| 53 |
+
public function add_file( $file_name, $new_file_name = '', &$file_written = 0, &$file_offset = 0, $timeout = 0 ) {
|
| 54 |
+
$file_written = 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 55 |
|
| 56 |
+
// Flag to hold if file data has been processed
|
| 57 |
+
$completed = true;
|
| 58 |
|
| 59 |
+
// Start time
|
| 60 |
$start = microtime( true );
|
| 61 |
|
| 62 |
+
// Open the file for reading in binary mode
|
| 63 |
+
if ( ( $file_handle = @fopen( $file_name, 'rb' ) ) !== false ) {
|
| 64 |
+
$file_bytes = 0;
|
| 65 |
+
|
| 66 |
+
// Get header block
|
| 67 |
+
if ( ( $block = $this->get_file_block( $file_name, $new_file_name ) ) ) {
|
| 68 |
+
|
| 69 |
+
// Write header block
|
| 70 |
+
if ( $file_offset === 0 ) {
|
| 71 |
+
if ( ( $file_bytes = @fwrite( $this->file_handle, $block ) ) !== false ) {
|
| 72 |
+
if ( strlen( $block ) !== $file_bytes ) {
|
| 73 |
+
throw new Ai1wm_Quota_Exceeded_Exception( sprintf( 'Out of disk space. Unable to write header to file. File: %s', $this->file_name ) );
|
| 74 |
+
}
|
| 75 |
+
} else {
|
| 76 |
+
throw new Ai1wm_Not_Writable_Exception( sprintf( 'Unable to write header to file. File: %s', $this->file_name ) );
|
| 77 |
+
}
|
| 78 |
+
}
|
|
|
|
|
|
|
| 79 |
|
| 80 |
+
// Set file offset
|
| 81 |
+
if ( @fseek( $file_handle, $file_offset, SEEK_SET ) !== -1 ) {
|
| 82 |
+
|
| 83 |
+
// Read the file in 512KB chunks
|
| 84 |
+
while ( false === @feof( $file_handle ) ) {
|
| 85 |
+
|
| 86 |
+
// Read the file in chunks of 512KB
|
| 87 |
+
if ( ( $file_content = @fread( $file_handle, 512000 ) ) !== false ) {
|
| 88 |
+
if ( ( $file_bytes = @fwrite( $this->file_handle, $file_content ) ) !== false ) {
|
| 89 |
+
if ( strlen( $file_content ) !== $file_bytes ) {
|
| 90 |
+
throw new Ai1wm_Quota_Exceeded_Exception( sprintf( 'Out of disk space. Unable to write content to file. File: %s', $this->file_name ) );
|
| 91 |
+
}
|
| 92 |
+
} else {
|
| 93 |
+
throw new Ai1wm_Not_Writable_Exception( sprintf( 'Unable to write content to file. File: %s', $this->file_name ) );
|
| 94 |
+
}
|
| 95 |
+
|
| 96 |
+
// Set file written
|
| 97 |
+
$file_written += $file_bytes;
|
| 98 |
+
}
|
| 99 |
+
|
| 100 |
+
// Time elapsed
|
| 101 |
+
if ( $timeout ) {
|
| 102 |
+
if ( ( microtime( true ) - $start ) > $timeout ) {
|
| 103 |
+
$completed = false;
|
| 104 |
+
break;
|
| 105 |
+
}
|
| 106 |
+
}
|
| 107 |
+
}
|
| 108 |
+
}
|
| 109 |
|
| 110 |
+
// Set file offset
|
| 111 |
+
$file_offset += $file_written;
|
| 112 |
+
|
| 113 |
+
// Write file size to file header
|
| 114 |
+
if ( ( $block = $this->get_file_size_block( $file_offset ) ) ) {
|
| 115 |
+
|
| 116 |
+
// Seek to beginning of file size
|
| 117 |
+
if ( @fseek( $this->file_handle, - $file_offset - 4096 - 12 - 14, SEEK_CUR ) === -1 ) {
|
| 118 |
+
throw new Ai1wm_Not_Seekable_Exception( sprintf( 'Unable to seek to offset on file. File: %s Offset: %d', $this->file_name, - $file_offset - 4096 - 12 - 14 ) );
|
| 119 |
+
}
|
| 120 |
+
|
| 121 |
+
// Write file size to file header
|
| 122 |
+
if ( ( $file_bytes = @fwrite( $this->file_handle, $block ) ) !== false ) {
|
| 123 |
+
if ( strlen( $block ) !== $file_bytes ) {
|
| 124 |
+
throw new Ai1wm_Quota_Exceeded_Exception( sprintf( 'Out of disk space. Unable to write size to file. File: %s', $this->file_name ) );
|
| 125 |
+
}
|
| 126 |
+
} else {
|
| 127 |
+
throw new Ai1wm_Not_Writable_Exception( sprintf( 'Unable to write size to file. File: %s', $this->file_name ) );
|
| 128 |
+
}
|
| 129 |
+
|
| 130 |
+
// Seek to end of file content
|
| 131 |
+
if ( @fseek( $this->file_handle, + $file_offset + 4096 + 12, SEEK_CUR ) === -1 ) {
|
| 132 |
+
throw new Ai1wm_Not_Seekable_Exception( sprintf( 'Unable to seek to offset on file. File: %s Offset: %d', $this->file_name, + $file_offset + 4096 + 12 ) );
|
| 133 |
+
}
|
| 134 |
}
|
| 135 |
}
|
| 136 |
+
|
| 137 |
+
// Close the handle
|
| 138 |
+
@fclose( $file_handle );
|
| 139 |
}
|
| 140 |
|
| 141 |
+
return $completed;
|
|
|
|
| 142 |
}
|
| 143 |
|
| 144 |
/**
|
| 145 |
* Generate binary block header for a file
|
| 146 |
*
|
| 147 |
+
* @param string $file_name Filename to generate block header for
|
| 148 |
+
* @param string $new_file_name Write the file with a different name
|
| 149 |
*
|
| 150 |
+
* @return mixed
|
|
|
|
| 151 |
*/
|
| 152 |
+
private function get_file_block( $file_name, $new_file_name = '' ) {
|
| 153 |
+
$block = false;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 154 |
|
| 155 |
+
// Get stats about the file
|
| 156 |
+
if ( ( $stat = @stat( $file_name ) ) !== false ) {
|
| 157 |
|
| 158 |
+
// Get path details
|
| 159 |
+
if ( empty( $new_file_name ) ) {
|
| 160 |
+
$pathinfo = pathinfo( $file_name );
|
| 161 |
+
} else {
|
| 162 |
+
$pathinfo = pathinfo( $new_file_name );
|
| 163 |
+
}
|
| 164 |
+
|
| 165 |
+
// Filename of the file we are accessing
|
| 166 |
+
$name = $pathinfo['basename'];
|
| 167 |
+
|
| 168 |
+
// Size in bytes of the file
|
| 169 |
+
$size = $stat['size'];
|
| 170 |
|
| 171 |
+
// Last time the file was modified
|
| 172 |
+
$date = $stat['mtime'];
|
| 173 |
|
| 174 |
+
// Replace DIRECTORY_SEPARATOR with / in path, we want to always have /
|
| 175 |
+
$path = str_replace( DIRECTORY_SEPARATOR, '/', $pathinfo['dirname'] );
|
| 176 |
|
| 177 |
+
// Concatenate block format parts
|
| 178 |
+
$format = implode( '', $this->block_format );
|
| 179 |
|
| 180 |
+
// Pack file data into binary string
|
| 181 |
+
$block = pack( $format, $name, $size, $date, $path );
|
| 182 |
+
}
|
| 183 |
+
|
| 184 |
+
return $block;
|
| 185 |
+
}
|
| 186 |
|
| 187 |
+
/**
|
| 188 |
+
* Generate file size binary block header for a file
|
| 189 |
+
*
|
| 190 |
+
* @param int $file_size File size
|
| 191 |
+
*
|
| 192 |
+
* @return string
|
| 193 |
+
*/
|
| 194 |
+
public function get_file_size_block( $file_size ) {
|
| 195 |
+
$block = false;
|
| 196 |
|
| 197 |
+
// Pack file data into binary string
|
| 198 |
+
if ( isset( $this->block_format[1] ) ) {
|
| 199 |
+
$block = pack( $this->block_format[1], $file_size );
|
| 200 |
+
}
|
| 201 |
|
| 202 |
+
return $block;
|
|
|
|
| 203 |
}
|
| 204 |
}
|
lib/vendor/servmask/archiver/class-ai1wm-extractor.php
CHANGED
|
@@ -42,48 +42,54 @@ class Ai1wm_Extractor extends Ai1wm_Archiver {
|
|
| 42 |
/**
|
| 43 |
* Overloaded constructor that opens the passed file for reading
|
| 44 |
*
|
| 45 |
-
* @param string $
|
| 46 |
*/
|
| 47 |
-
public function __construct( $
|
| 48 |
-
//
|
| 49 |
-
parent::__construct( $
|
| 50 |
}
|
| 51 |
|
| 52 |
/**
|
| 53 |
* Get the total files count in an archive
|
| 54 |
*
|
| 55 |
-
* @return int
|
| 56 |
-
* @throws \Ai1wm_Not_Accesible_Exception
|
| 57 |
-
* @throws \Ai1wm_Not_Readable_Exception
|
| 58 |
*/
|
| 59 |
public function get_total_files_count() {
|
| 60 |
if ( is_null( $this->total_files_count ) ) {
|
| 61 |
-
// set poisition to the beginning of the file
|
| 62 |
-
fseek( $this->file_handle, SEEK_SET, 0 );
|
| 63 |
|
| 64 |
-
//
|
| 65 |
$this->total_files_count = 0;
|
| 66 |
|
| 67 |
-
//
|
| 68 |
$this->total_files_size = 0;
|
| 69 |
|
| 70 |
-
|
| 71 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 72 |
if ( $block === $this->eof ) {
|
| 73 |
continue;
|
| 74 |
}
|
| 75 |
|
| 76 |
-
//
|
| 77 |
-
$data = $this->get_data_from_block( $block )
|
| 78 |
|
| 79 |
-
|
| 80 |
-
|
| 81 |
|
| 82 |
-
|
| 83 |
-
|
| 84 |
|
| 85 |
-
|
| 86 |
-
|
|
|
|
|
|
|
|
|
|
| 87 |
}
|
| 88 |
}
|
| 89 |
|
|
@@ -93,284 +99,375 @@ class Ai1wm_Extractor extends Ai1wm_Archiver {
|
|
| 93 |
/**
|
| 94 |
* Get the total files size in an archive
|
| 95 |
*
|
| 96 |
-
* @return int
|
| 97 |
-
* @throws \Ai1wm_Not_Accesible_Exception
|
| 98 |
-
* @throws \Ai1wm_Not_Readable_Exception
|
| 99 |
*/
|
| 100 |
public function get_total_files_size() {
|
| 101 |
if ( is_null( $this->total_files_size ) ) {
|
| 102 |
-
// set poisition to the beginning of the file
|
| 103 |
-
fseek( $this->file_handle, SEEK_SET, 0 );
|
| 104 |
|
| 105 |
-
//
|
| 106 |
$this->total_files_count = 0;
|
| 107 |
|
| 108 |
-
//
|
| 109 |
$this->total_files_size = 0;
|
| 110 |
|
| 111 |
-
|
| 112 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 113 |
if ( $block === $this->eof ) {
|
| 114 |
continue;
|
| 115 |
}
|
| 116 |
|
| 117 |
-
//
|
| 118 |
-
$data = $this->get_data_from_block( $block )
|
| 119 |
|
| 120 |
-
|
| 121 |
-
|
| 122 |
|
| 123 |
-
|
| 124 |
-
|
| 125 |
|
| 126 |
-
|
| 127 |
-
|
|
|
|
|
|
|
|
|
|
| 128 |
}
|
| 129 |
}
|
| 130 |
|
| 131 |
return $this->total_files_size;
|
| 132 |
}
|
| 133 |
|
| 134 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 135 |
if ( false === is_dir( $location ) ) {
|
| 136 |
-
throw new
|
| 137 |
}
|
| 138 |
|
| 139 |
-
|
|
|
|
| 140 |
|
| 141 |
-
//
|
| 142 |
-
if ( $
|
| 143 |
-
@fseek( $this->file_handle,
|
| 144 |
-
|
| 145 |
-
|
| 146 |
}
|
| 147 |
|
| 148 |
-
//
|
| 149 |
-
$
|
| 150 |
|
| 151 |
-
|
| 152 |
-
|
| 153 |
-
$filename = $data['filename'];
|
| 154 |
-
} else {
|
| 155 |
-
$filename = $data['path'] . '/' . $data['filename'];
|
| 156 |
-
}
|
| 157 |
|
| 158 |
-
|
| 159 |
-
|
| 160 |
|
| 161 |
-
|
| 162 |
-
|
| 163 |
|
| 164 |
-
|
| 165 |
-
for ( $i = 0; $i < count( $exclude ); $i++ ) {
|
| 166 |
-
if ( strpos( $filename . DIRECTORY_SEPARATOR, $exclude[ $i ] . DIRECTORY_SEPARATOR ) === 0 ) {
|
| 167 |
-
$this->set_file_pointer( $this->file_handle, $data['size'] );
|
| 168 |
-
return;
|
| 169 |
-
}
|
| 170 |
-
}
|
| 171 |
|
| 172 |
-
|
| 173 |
-
|
| 174 |
-
if ( strpos( $path . DIRECTORY_SEPARATOR, $old_paths[ $i ] . DIRECTORY_SEPARATOR ) === 0 ) {
|
| 175 |
-
$path = substr_replace( $path, $new_paths[ $i ], 0, strlen( $old_paths[ $i ] ) );
|
| 176 |
-
break;
|
| 177 |
-
}
|
| 178 |
-
}
|
| 179 |
|
| 180 |
-
|
|
|
|
| 181 |
|
| 182 |
-
|
| 183 |
-
|
| 184 |
-
|
| 185 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 186 |
|
| 187 |
-
|
| 188 |
-
|
| 189 |
-
|
| 190 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 191 |
}
|
| 192 |
-
} catch ( Exception $e ) {
|
| 193 |
-
// we don't have file permissions, skip file content
|
| 194 |
-
$this->set_file_pointer( $this->file_handle, $data['size'] );
|
| 195 |
}
|
|
|
|
|
|
|
| 196 |
}
|
| 197 |
|
| 198 |
/**
|
| 199 |
* Extract specific files from archive
|
| 200 |
*
|
| 201 |
-
* @param string $location
|
| 202 |
-
* @param array $files
|
| 203 |
-
* @param
|
| 204 |
-
* @param int $
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 205 |
*/
|
| 206 |
-
public function extract_by_files_array( $location, $files = array(),
|
| 207 |
if ( false === is_dir( $location ) ) {
|
| 208 |
-
throw new
|
| 209 |
}
|
| 210 |
|
| 211 |
-
//
|
|
|
|
|
|
|
|
|
|
| 212 |
$start = microtime( true );
|
| 213 |
|
| 214 |
-
//
|
| 215 |
-
|
| 216 |
-
|
| 217 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 218 |
if ( $block === $this->eof ) {
|
| 219 |
-
|
|
|
|
| 220 |
@fseek( $this->file_handle, 1, SEEK_END );
|
| 221 |
-
@fgetc( $this->file_handle );
|
| 222 |
-
return;
|
| 223 |
-
}
|
| 224 |
|
| 225 |
-
|
|
|
|
| 226 |
|
| 227 |
-
// set filename
|
| 228 |
-
if ( $data['path'] === '.' ) {
|
| 229 |
-
$filename = $data['filename'];
|
| 230 |
} else {
|
| 231 |
-
$filename = $data['path'] . '/' . $data['filename'];
|
| 232 |
-
}
|
| 233 |
|
| 234 |
-
|
| 235 |
-
|
| 236 |
|
| 237 |
-
|
| 238 |
-
|
| 239 |
|
| 240 |
-
|
| 241 |
-
|
| 242 |
|
| 243 |
-
|
| 244 |
-
|
| 245 |
-
if ( strpos( $filename . DIRECTORY_SEPARATOR, $files[ $i ] . DIRECTORY_SEPARATOR ) === 0 ) {
|
| 246 |
-
$include = true;
|
| 247 |
-
break;
|
| 248 |
-
}
|
| 249 |
-
}
|
| 250 |
|
| 251 |
-
|
| 252 |
-
|
| 253 |
-
$directory = $location . DIRECTORY_SEPARATOR . $path;
|
| 254 |
|
| 255 |
-
|
| 256 |
-
|
| 257 |
-
mkdir( $directory, $this->get_permissions_for_directory(), true );
|
| 258 |
-
}
|
| 259 |
|
| 260 |
-
|
| 261 |
-
|
| 262 |
-
|
| 263 |
-
|
|
|
|
|
|
|
| 264 |
}
|
| 265 |
-
} catch ( Exception $e ) {
|
| 266 |
-
// we don't have file permissions, skip file content
|
| 267 |
-
$this->set_file_pointer( $this->file_handle, $data['size'] );
|
| 268 |
-
}
|
| 269 |
-
} else {
|
| 270 |
-
// we don't have a match, skip file content
|
| 271 |
-
$this->set_file_pointer( $this->file_handle, $data['size'] );
|
| 272 |
-
}
|
| 273 |
|
| 274 |
-
|
| 275 |
-
|
| 276 |
-
if ( ( microtime( true ) - $start ) > $timeout ) {
|
| 277 |
-
break;
|
| 278 |
-
}
|
| 279 |
-
}
|
| 280 |
-
}
|
| 281 |
-
}
|
| 282 |
|
| 283 |
-
|
| 284 |
-
|
| 285 |
-
|
| 286 |
-
|
| 287 |
-
}
|
| 288 |
|
| 289 |
-
|
| 290 |
-
|
| 291 |
-
|
| 292 |
-
|
| 293 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 294 |
}
|
| 295 |
}
|
|
|
|
|
|
|
| 296 |
}
|
| 297 |
|
| 298 |
-
|
| 299 |
-
|
| 300 |
-
|
| 301 |
-
|
| 302 |
-
|
| 303 |
-
|
| 304 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 305 |
|
| 306 |
-
//
|
| 307 |
-
$
|
| 308 |
|
| 309 |
-
//
|
| 310 |
-
$
|
| 311 |
|
| 312 |
-
//
|
| 313 |
-
$
|
|
|
|
|
|
|
|
|
|
|
|
|
| 314 |
|
| 315 |
-
//
|
| 316 |
-
$
|
| 317 |
|
| 318 |
-
//
|
| 319 |
-
|
| 320 |
-
|
| 321 |
-
$chunk_size = $data['size'] > 512000 ? 512000 : $data['size'];
|
| 322 |
|
| 323 |
-
//
|
| 324 |
-
|
| 325 |
|
| 326 |
-
|
| 327 |
-
|
| 328 |
|
| 329 |
-
|
| 330 |
-
|
|
|
|
| 331 |
|
| 332 |
-
|
| 333 |
-
|
| 334 |
-
|
| 335 |
-
|
| 336 |
-
$offset = $this->get_file_pointer() - $data_file_pointer;
|
| 337 |
|
| 338 |
-
//
|
| 339 |
-
$
|
| 340 |
|
| 341 |
-
//
|
| 342 |
-
$
|
|
|
|
|
|
|
|
|
|
|
|
|
| 343 |
|
| 344 |
-
//
|
| 345 |
-
|
|
|
|
| 346 |
|
| 347 |
-
|
| 348 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 349 |
}
|
| 350 |
}
|
| 351 |
-
}
|
| 352 |
|
| 353 |
-
|
| 354 |
-
|
| 355 |
|
| 356 |
-
|
| 357 |
-
|
| 358 |
|
| 359 |
-
|
| 360 |
-
|
| 361 |
|
| 362 |
-
|
| 363 |
-
|
| 364 |
|
| 365 |
-
|
| 366 |
-
return @touch( $file, $mtime );
|
| 367 |
-
}
|
| 368 |
|
| 369 |
-
|
| 370 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 371 |
}
|
| 372 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 373 |
private function get_data_from_block( $block ) {
|
|
|
|
|
|
|
| 374 |
// prepare our array keys to unpack
|
| 375 |
$format = array(
|
| 376 |
$this->block_format[0] . 'filename/',
|
|
@@ -380,15 +477,27 @@ class Ai1wm_Extractor extends Ai1wm_Archiver {
|
|
| 380 |
);
|
| 381 |
$format = implode( '', $format );
|
| 382 |
|
| 383 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 384 |
|
| 385 |
-
|
| 386 |
-
|
| 387 |
-
$data['mtime'] = trim( $data['mtime'] );
|
| 388 |
-
$data['path'] = trim( $data['path'] );
|
| 389 |
|
| 390 |
-
|
| 391 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 392 |
|
| 393 |
return $data;
|
| 394 |
}
|
|
@@ -400,7 +509,7 @@ class Ai1wm_Extractor extends Ai1wm_Archiver {
|
|
| 400 |
* @return bool
|
| 401 |
*/
|
| 402 |
public function has_reached_eof() {
|
| 403 |
-
return feof( $this->file_handle );
|
| 404 |
}
|
| 405 |
|
| 406 |
/**
|
|
@@ -410,33 +519,13 @@ class Ai1wm_Extractor extends Ai1wm_Archiver {
|
|
| 410 |
* @return bool
|
| 411 |
*/
|
| 412 |
public function has_not_reached_eof() {
|
| 413 |
-
return ! feof( $this->file_handle );
|
| 414 |
-
}
|
| 415 |
-
|
| 416 |
-
/**
|
| 417 |
-
* Get current file pointer
|
| 418 |
-
*
|
| 419 |
-
* return int
|
| 420 |
-
*/
|
| 421 |
-
public function get_file_pointer() {
|
| 422 |
-
$result = ftell( $this->file_handle );
|
| 423 |
-
|
| 424 |
-
if ( false === $result ) {
|
| 425 |
-
throw new Ai1wm_Not_Accesible_Exception(
|
| 426 |
-
sprintf(
|
| 427 |
-
__( 'Unable to get current pointer position of %s', AI1WM_PLUGIN_NAME ),
|
| 428 |
-
$this->filename
|
| 429 |
-
)
|
| 430 |
-
);
|
| 431 |
-
}
|
| 432 |
-
|
| 433 |
-
return $result;
|
| 434 |
}
|
| 435 |
|
| 436 |
/**
|
| 437 |
* Get directory permissions
|
| 438 |
*
|
| 439 |
-
* return int
|
| 440 |
*/
|
| 441 |
public function get_permissions_for_directory() {
|
| 442 |
if ( defined( 'FS_CHMOD_DIR' ) ) {
|
|
@@ -449,7 +538,7 @@ class Ai1wm_Extractor extends Ai1wm_Archiver {
|
|
| 449 |
/**
|
| 450 |
* Get file permissions
|
| 451 |
*
|
| 452 |
-
* return int
|
| 453 |
*/
|
| 454 |
public function get_permissions_for_file() {
|
| 455 |
if ( defined( 'FS_CHMOD_FILE' ) ) {
|
|
@@ -458,5 +547,4 @@ class Ai1wm_Extractor extends Ai1wm_Archiver {
|
|
| 458 |
|
| 459 |
return 0644;
|
| 460 |
}
|
| 461 |
-
|
| 462 |
}
|
| 42 |
/**
|
| 43 |
* Overloaded constructor that opens the passed file for reading
|
| 44 |
*
|
| 45 |
+
* @param string $file_name File to use as archive
|
| 46 |
*/
|
| 47 |
+
public function __construct( $file_name ) {
|
| 48 |
+
// Call parent, to initialize variables
|
| 49 |
+
parent::__construct( $file_name );
|
| 50 |
}
|
| 51 |
|
| 52 |
/**
|
| 53 |
* Get the total files count in an archive
|
| 54 |
*
|
| 55 |
+
* @return int
|
|
|
|
|
|
|
| 56 |
*/
|
| 57 |
public function get_total_files_count() {
|
| 58 |
if ( is_null( $this->total_files_count ) ) {
|
|
|
|
|
|
|
| 59 |
|
| 60 |
+
// Total files count
|
| 61 |
$this->total_files_count = 0;
|
| 62 |
|
| 63 |
+
// Total files size
|
| 64 |
$this->total_files_size = 0;
|
| 65 |
|
| 66 |
+
// Seek to beginning of archive file
|
| 67 |
+
if ( @fseek( $this->file_handle, 0, SEEK_SET ) === -1 ) {
|
| 68 |
+
throw new Ai1wm_Not_Seekable_Exception( sprintf( 'Unable to seek to beginning of file. File: %s', $this->file_name ) );
|
| 69 |
+
}
|
| 70 |
+
|
| 71 |
+
// Loop over files
|
| 72 |
+
while ( $block = @fread( $this->file_handle, 4377 ) ) {
|
| 73 |
+
|
| 74 |
+
// End block has been reached
|
| 75 |
if ( $block === $this->eof ) {
|
| 76 |
continue;
|
| 77 |
}
|
| 78 |
|
| 79 |
+
// Get file data from the block
|
| 80 |
+
if ( ( $data = $this->get_data_from_block( $block ) ) ) {
|
| 81 |
|
| 82 |
+
// We have a file, increment the count
|
| 83 |
+
$this->total_files_count += 1;
|
| 84 |
|
| 85 |
+
// We have a file, increment the size
|
| 86 |
+
$this->total_files_size += $data['size'];
|
| 87 |
|
| 88 |
+
// Skip file content so we can move forward to the next file
|
| 89 |
+
if ( @fseek( $this->file_handle, $data['size'], SEEK_CUR ) === -1 ) {
|
| 90 |
+
throw new Ai1wm_Not_Seekable_Exception( sprintf( 'Unable to seek to offset on file. File: %s Offset: %d', $this->file_name, $data['size'] ) );
|
| 91 |
+
}
|
| 92 |
+
}
|
| 93 |
}
|
| 94 |
}
|
| 95 |
|
| 99 |
/**
|
| 100 |
* Get the total files size in an archive
|
| 101 |
*
|
| 102 |
+
* @return int
|
|
|
|
|
|
|
| 103 |
*/
|
| 104 |
public function get_total_files_size() {
|
| 105 |
if ( is_null( $this->total_files_size ) ) {
|
|
|
|
|
|
|
| 106 |
|
| 107 |
+
// Total files count
|
| 108 |
$this->total_files_count = 0;
|
| 109 |
|
| 110 |
+
// Total files size
|
| 111 |
$this->total_files_size = 0;
|
| 112 |
|
| 113 |
+
// Seek to beginning of archive file
|
| 114 |
+
if ( @fseek( $this->file_handle, 0, SEEK_SET ) === -1 ) {
|
| 115 |
+
throw new Ai1wm_Not_Seekable_Exception( sprintf( 'Unable to seek to beginning of file. File: %s', $this->file_name ) );
|
| 116 |
+
}
|
| 117 |
+
|
| 118 |
+
// Loop over files
|
| 119 |
+
while ( $block = @fread( $this->file_handle, 4377 ) ) {
|
| 120 |
+
|
| 121 |
+
// End block has been reached
|
| 122 |
if ( $block === $this->eof ) {
|
| 123 |
continue;
|
| 124 |
}
|
| 125 |
|
| 126 |
+
// Get file data from the block
|
| 127 |
+
if ( ( $data = $this->get_data_from_block( $block ) ) ) {
|
| 128 |
|
| 129 |
+
// We have a file, increment the count
|
| 130 |
+
$this->total_files_count += 1;
|
| 131 |
|
| 132 |
+
// We have a file, increment the size
|
| 133 |
+
$this->total_files_size += $data['size'];
|
| 134 |
|
| 135 |
+
// Skip file content so we can move forward to the next file
|
| 136 |
+
if ( @fseek( $this->file_handle, $data['size'], SEEK_CUR ) === -1 ) {
|
| 137 |
+
throw new Ai1wm_Not_Seekable_Exception( sprintf( 'Unable to seek to offset on file. File: %s Offset: %d', $this->file_name, $data['size'] ) );
|
| 138 |
+
}
|
| 139 |
+
}
|
| 140 |
}
|
| 141 |
}
|
| 142 |
|
| 143 |
return $this->total_files_size;
|
| 144 |
}
|
| 145 |
|
| 146 |
+
/**
|
| 147 |
+
* Extract one file to location
|
| 148 |
+
*
|
| 149 |
+
* @param string $location Destination path
|
| 150 |
+
* @param array $exclude Files to exclude
|
| 151 |
+
* @param array $old_paths Old replace paths
|
| 152 |
+
* @param array $new_paths New replace paths
|
| 153 |
+
* @param int $file_written File written (in bytes)
|
| 154 |
+
* @param int $file_offset File offset (in bytes)
|
| 155 |
+
* @param int $timeout Process timeout (in seconds)
|
| 156 |
+
*
|
| 157 |
+
* @throws \Ai1wm_Not_Directory_Exception
|
| 158 |
+
* @throws \Ai1wm_Not_Seekable_Exception
|
| 159 |
+
*
|
| 160 |
+
* @return bool
|
| 161 |
+
*/
|
| 162 |
+
public function extract_one_file_to( $location, $exclude = array(), $old_paths = array(), $new_paths = array(), &$file_written = 0, &$file_offset = 0, $timeout = 0 ) {
|
| 163 |
if ( false === is_dir( $location ) ) {
|
| 164 |
+
throw new Ai1wm_Not_Directory_Exception( sprintf( 'Location is not a directory: %s', $location ) );
|
| 165 |
}
|
| 166 |
|
| 167 |
+
// Flag to hold if file data has been processed
|
| 168 |
+
$completed = true;
|
| 169 |
|
| 170 |
+
// Seek to file offset to archive file
|
| 171 |
+
if ( $file_offset > 0 ) {
|
| 172 |
+
if ( @fseek( $this->file_handle, - $file_offset - 4377, SEEK_CUR ) === -1 ) {
|
| 173 |
+
throw new Ai1wm_Not_Seekable_Exception( sprintf( 'Unable to seek to offset on file. File: %s Offset: %d', $this->file_name, - $file_offset - 4377 ) );
|
| 174 |
+
}
|
| 175 |
}
|
| 176 |
|
| 177 |
+
// Read file header block
|
| 178 |
+
if ( ( $block = @fread( $this->file_handle, 4377 ) ) ) {
|
| 179 |
|
| 180 |
+
// We reached end of file, set the pointer to the end of the file so that feof returns true
|
| 181 |
+
if ( $block === $this->eof ) {
|
|
|
|
|
|
|
|
|
|
|
|
|
| 182 |
|
| 183 |
+
// Seek to end of archive file minus 1 byte
|
| 184 |
+
@fseek( $this->file_handle, 1, SEEK_END );
|
| 185 |
|
| 186 |
+
// Read 1 character
|
| 187 |
+
@fgetc( $this->file_handle );
|
| 188 |
|
| 189 |
+
} else {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 190 |
|
| 191 |
+
// Get file header data from the block
|
| 192 |
+
if ( ( $data = $this->get_data_from_block( $block ) ) ) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 193 |
|
| 194 |
+
// Set file name
|
| 195 |
+
$file_name = $data['filename'];
|
| 196 |
|
| 197 |
+
// Set file size
|
| 198 |
+
$file_size = $data['size'];
|
| 199 |
+
|
| 200 |
+
// Set file mtime
|
| 201 |
+
$file_mtime = $data['mtime'];
|
| 202 |
+
|
| 203 |
+
// Set file path
|
| 204 |
+
$file_path = $data['path'];
|
| 205 |
+
|
| 206 |
+
// Set should exclude file
|
| 207 |
+
$should_exclude_file = false;
|
| 208 |
+
|
| 209 |
+
// Should we skip this file?
|
| 210 |
+
for ( $i = 0; $i < count( $exclude ); $i++ ) {
|
| 211 |
+
if ( strpos( $file_name . DIRECTORY_SEPARATOR, $exclude[ $i ] . DIRECTORY_SEPARATOR ) === 0 ) {
|
| 212 |
+
$should_exclude_file = true;
|
| 213 |
+
break;
|
| 214 |
+
}
|
| 215 |
+
}
|
| 216 |
|
| 217 |
+
// Do we have a match?
|
| 218 |
+
if ( $should_exclude_file === false ) {
|
| 219 |
+
|
| 220 |
+
// Replace extract paths
|
| 221 |
+
for ( $i = 0; $i < count( $old_paths ); $i++ ) {
|
| 222 |
+
if ( strpos( $file_path . DIRECTORY_SEPARATOR, $old_paths[ $i ] . DIRECTORY_SEPARATOR ) === 0 ) {
|
| 223 |
+
$file_path = substr_replace( $file_path, $new_paths[ $i ], 0, strlen( $old_paths[ $i ] ) );
|
| 224 |
+
break;
|
| 225 |
+
}
|
| 226 |
+
}
|
| 227 |
+
|
| 228 |
+
// Check if location doesn't exist, then create it
|
| 229 |
+
if ( false === is_dir( $location . DIRECTORY_SEPARATOR . $file_path ) ) {
|
| 230 |
+
@mkdir( $location . DIRECTORY_SEPARATOR . $file_path, $this->get_permissions_for_directory(), true );
|
| 231 |
+
}
|
| 232 |
+
|
| 233 |
+
$file_written = 0;
|
| 234 |
+
|
| 235 |
+
// We have a match, let's extract the file
|
| 236 |
+
if ( ( $completed = $this->extract_to( $location . DIRECTORY_SEPARATOR . $file_name, $file_size, $file_mtime, $file_written, $file_offset, $timeout ) ) ) {
|
| 237 |
+
$file_offset = 0;
|
| 238 |
+
}
|
| 239 |
+
} else {
|
| 240 |
+
|
| 241 |
+
// We don't have a match, skip file content
|
| 242 |
+
if ( @fseek( $this->file_handle, $file_size, SEEK_CUR ) === -1 ) {
|
| 243 |
+
throw new Ai1wm_Not_Seekable_Exception( sprintf( 'Unable to seek to offset on file. File: %s Offset: %d', $this->file_name, $file_size ) );
|
| 244 |
+
}
|
| 245 |
+
}
|
| 246 |
+
}
|
| 247 |
}
|
|
|
|
|
|
|
|
|
|
| 248 |
}
|
| 249 |
+
|
| 250 |
+
return $completed;
|
| 251 |
}
|
| 252 |
|
| 253 |
/**
|
| 254 |
* Extract specific files from archive
|
| 255 |
*
|
| 256 |
+
* @param string $location Location where to extract files
|
| 257 |
+
* @param array $files Files to extract
|
| 258 |
+
* @param int $file_written File written (in bytes)
|
| 259 |
+
* @param int $file_offset File offset (in bytes)
|
| 260 |
+
* @param int $timeout Process timeout (in seconds)
|
| 261 |
+
*
|
| 262 |
+
* @throws \Ai1wm_Not_Directory_Exception
|
| 263 |
+
* @throws \Ai1wm_Not_Seekable_Exception
|
| 264 |
+
*
|
| 265 |
+
* @return bool
|
| 266 |
*/
|
| 267 |
+
public function extract_by_files_array( $location, $files = array(), &$file_written = 0, &$file_offset = 0, $timeout = 0 ) {
|
| 268 |
if ( false === is_dir( $location ) ) {
|
| 269 |
+
throw new Ai1wm_Not_Directory_Exception( sprintf( 'Location is not a directory: %s', $location ) );
|
| 270 |
}
|
| 271 |
|
| 272 |
+
// Flag to hold if file data has been processed
|
| 273 |
+
$completed = true;
|
| 274 |
+
|
| 275 |
+
// Start time
|
| 276 |
$start = microtime( true );
|
| 277 |
|
| 278 |
+
// Seek to file offset to archive file
|
| 279 |
+
if ( $file_offset > 0 ) {
|
| 280 |
+
if ( @fseek( $this->file_handle, - $file_offset - 4377, SEEK_CUR ) === -1 ) {
|
| 281 |
+
throw new Ai1wm_Not_Seekable_Exception( sprintf( 'Unable to seek to offset on file. File: %s Offset: %d', $this->file_name, - $file_offset - 4377 ) );
|
| 282 |
+
}
|
| 283 |
+
}
|
| 284 |
+
|
| 285 |
+
// We read until we reached the end of the file, or the files we were looking for were found
|
| 286 |
+
while ( ( $block = @fread( $this->file_handle, 4377 ) ) ) {
|
| 287 |
+
|
| 288 |
+
// We reached end of file, set the pointer to the end of the file so that feof returns true
|
| 289 |
if ( $block === $this->eof ) {
|
| 290 |
+
|
| 291 |
+
// Seek to end of archive file minus 1 byte
|
| 292 |
@fseek( $this->file_handle, 1, SEEK_END );
|
|
|
|
|
|
|
|
|
|
| 293 |
|
| 294 |
+
// Read 1 character
|
| 295 |
+
@fgetc( $this->file_handle );
|
| 296 |
|
|
|
|
|
|
|
|
|
|
| 297 |
} else {
|
|
|
|
|
|
|
| 298 |
|
| 299 |
+
// Get file header data from the block
|
| 300 |
+
if ( ( $data = $this->get_data_from_block( $block ) ) ) {
|
| 301 |
|
| 302 |
+
// Set file name
|
| 303 |
+
$file_name = $data['filename'];
|
| 304 |
|
| 305 |
+
// Set file size
|
| 306 |
+
$file_size = $data['size'];
|
| 307 |
|
| 308 |
+
// Set file mtime
|
| 309 |
+
$file_mtime = $data['mtime'];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 310 |
|
| 311 |
+
// Set file path
|
| 312 |
+
$file_path = $data['path'];
|
|
|
|
| 313 |
|
| 314 |
+
// Set should include file
|
| 315 |
+
$should_include_file = false;
|
|
|
|
|
|
|
| 316 |
|
| 317 |
+
// Should be extract this file?
|
| 318 |
+
for ( $i = 0; $i < count( $files ); $i++ ) {
|
| 319 |
+
if ( strpos( $file_name . DIRECTORY_SEPARATOR, $files[ $i ] . DIRECTORY_SEPARATOR ) === 0 ) {
|
| 320 |
+
$should_include_file = true;
|
| 321 |
+
break;
|
| 322 |
+
}
|
| 323 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 324 |
|
| 325 |
+
// Do we have a match?
|
| 326 |
+
if ( $should_include_file === true ) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 327 |
|
| 328 |
+
// Check if location doesn't exist, then create it
|
| 329 |
+
if ( false === is_dir( $location . DIRECTORY_SEPARATOR . $file_path ) ) {
|
| 330 |
+
@mkdir( $location . DIRECTORY_SEPARATOR . $file_path, $this->get_permissions_for_directory(), true );
|
| 331 |
+
}
|
|
|
|
| 332 |
|
| 333 |
+
$file_written = 0;
|
| 334 |
+
|
| 335 |
+
// We have a match, let's extract the file and remove it from the array
|
| 336 |
+
if ( ( $completed = $this->extract_to( $location . DIRECTORY_SEPARATOR . $file_name, $file_size, $file_mtime, $file_written, $file_offset, $timeout ) ) ) {
|
| 337 |
+
$file_offset = 0;
|
| 338 |
+
}
|
| 339 |
+
} else {
|
| 340 |
+
|
| 341 |
+
// We don't have a match, skip file content
|
| 342 |
+
if ( @fseek( $this->file_handle, $file_size, SEEK_CUR ) === -1 ) {
|
| 343 |
+
throw new Ai1wm_Not_Seekable_Exception( sprintf( 'Unable to seek to offset on file. File: %s Offset: %d', $this->file_name, $file_size ) );
|
| 344 |
+
}
|
| 345 |
+
}
|
| 346 |
+
|
| 347 |
+
// Time elapsed
|
| 348 |
+
if ( $timeout ) {
|
| 349 |
+
if ( ( microtime( true ) - $start ) > $timeout ) {
|
| 350 |
+
$completed = false;
|
| 351 |
+
break;
|
| 352 |
+
}
|
| 353 |
+
}
|
| 354 |
+
}
|
| 355 |
}
|
| 356 |
}
|
| 357 |
+
|
| 358 |
+
return $completed;
|
| 359 |
}
|
| 360 |
|
| 361 |
+
/**
|
| 362 |
+
* Extract file to
|
| 363 |
+
*
|
| 364 |
+
* @param string $file_name File name
|
| 365 |
+
* @param array $file_size File size (in bytes)
|
| 366 |
+
* @param array $file_mtime File modified time (in seconds)
|
| 367 |
+
* @param int $file_written File written (in bytes)
|
| 368 |
+
* @param int $file_offset File offset (in bytes)
|
| 369 |
+
* @param int $timeout Process timeout (in seconds)
|
| 370 |
+
*
|
| 371 |
+
* @throws \Ai1wm_Not_Seekable_Exception
|
| 372 |
+
* @throws \Ai1wm_Not_Readable_Exception
|
| 373 |
+
* @throws \Ai1wm_Quota_Exceeded_Exception
|
| 374 |
+
*
|
| 375 |
+
* @return bool
|
| 376 |
+
*/
|
| 377 |
+
private function extract_to( $file_name, $file_size, $file_mtime, &$file_written = 0, &$file_offset = 0, $timeout = 0 ) {
|
| 378 |
+
$file_written = 0;
|
| 379 |
|
| 380 |
+
// Flag to hold if file data has been processed
|
| 381 |
+
$completed = true;
|
| 382 |
|
| 383 |
+
// Start time
|
| 384 |
+
$start = microtime( true );
|
| 385 |
|
| 386 |
+
// Seek to file offset to archive file
|
| 387 |
+
if ( $file_offset > 0 ) {
|
| 388 |
+
if ( @fseek( $this->file_handle, $file_offset, SEEK_CUR ) === -1 ) {
|
| 389 |
+
throw new Ai1wm_Not_Seekable_Exception( sprintf( 'Unable to seek to offset on file. File: %s Offset: %d', $this->file_name, $file_size ) );
|
| 390 |
+
}
|
| 391 |
+
}
|
| 392 |
|
| 393 |
+
// Set file size
|
| 394 |
+
$file_size -= $file_offset;
|
| 395 |
|
| 396 |
+
// Should the extract overwrite the file if it exists?
|
| 397 |
+
if ( ( $file_handle = @fopen( $file_name, ( $file_offset === 0 ? 'wb' : 'ab' ) ) ) !== false ) {
|
| 398 |
+
$file_bytes = 0;
|
|
|
|
| 399 |
|
| 400 |
+
// Is the filesize more than 0 bytes?
|
| 401 |
+
while ( $file_size > 0 ) {
|
| 402 |
|
| 403 |
+
// Read the file in chunks of 512KB
|
| 404 |
+
$chunk_size = $file_size > 512000 ? 512000 : $file_size;
|
| 405 |
|
| 406 |
+
// Read data chunk by chunk from archive file
|
| 407 |
+
if ( $chunk_size > 0 ) {
|
| 408 |
+
$file_content = null;
|
| 409 |
|
| 410 |
+
// Read the file in chunks of 512KB from archiver
|
| 411 |
+
if ( ( $file_content = @fread( $this->file_handle, $chunk_size ) ) === false ) {
|
| 412 |
+
throw new Ai1wm_Not_Readable_Exception( sprintf( 'Unable to read content from file. File: %s', $this->file_name ) );
|
| 413 |
+
}
|
|
|
|
| 414 |
|
| 415 |
+
// Remove the amount of bytes we read
|
| 416 |
+
$file_size -= $chunk_size;
|
| 417 |
|
| 418 |
+
// Write file contents
|
| 419 |
+
if ( ( $file_bytes = @fwrite( $file_handle, $file_content ) ) !== false ) {
|
| 420 |
+
if ( strlen( $file_content ) !== $file_bytes ) {
|
| 421 |
+
throw new Ai1wm_Quota_Exceeded_Exception( sprintf( 'Out of disk space. Unable to write content to file. File: %s', $file_name ) );
|
| 422 |
+
}
|
| 423 |
+
}
|
| 424 |
|
| 425 |
+
// Set file written
|
| 426 |
+
$file_written += $chunk_size;
|
| 427 |
+
}
|
| 428 |
|
| 429 |
+
// Time elapsed
|
| 430 |
+
if ( $timeout ) {
|
| 431 |
+
if ( ( microtime( true ) - $start ) > $timeout ) {
|
| 432 |
+
$completed = false;
|
| 433 |
+
break;
|
| 434 |
+
}
|
| 435 |
}
|
| 436 |
}
|
|
|
|
| 437 |
|
| 438 |
+
// Set file offset
|
| 439 |
+
$file_offset += $file_written;
|
| 440 |
|
| 441 |
+
// Close the handle
|
| 442 |
+
@fclose( $file_handle );
|
| 443 |
|
| 444 |
+
// Let's apply last modified date
|
| 445 |
+
@touch( $file_name, $file_mtime );
|
| 446 |
|
| 447 |
+
// All files should chmoded to 644
|
| 448 |
+
@chmod( $file_name, $this->get_permissions_for_file() );
|
| 449 |
|
| 450 |
+
} else {
|
|
|
|
|
|
|
| 451 |
|
| 452 |
+
// We don't have file permissions, skip file content
|
| 453 |
+
if ( @fseek( $this->file_handle, $file_size, SEEK_CUR ) === -1 ) {
|
| 454 |
+
throw new Ai1wm_Not_Seekable_Exception( sprintf( 'Unable to seek to offset on file. File: %s Offset: %d', $this->file_name, $file_size ) );
|
| 455 |
+
}
|
| 456 |
+
}
|
| 457 |
+
|
| 458 |
+
return $completed;
|
| 459 |
}
|
| 460 |
|
| 461 |
+
/**
|
| 462 |
+
* Get file header data from the block
|
| 463 |
+
*
|
| 464 |
+
* @param string $block Binary file header
|
| 465 |
+
*
|
| 466 |
+
* @return array
|
| 467 |
+
*/
|
| 468 |
private function get_data_from_block( $block ) {
|
| 469 |
+
$data = false;
|
| 470 |
+
|
| 471 |
// prepare our array keys to unpack
|
| 472 |
$format = array(
|
| 473 |
$this->block_format[0] . 'filename/',
|
| 477 |
);
|
| 478 |
$format = implode( '', $format );
|
| 479 |
|
| 480 |
+
// Unpack file header data
|
| 481 |
+
if ( ( $data = unpack( $format, $block ) ) ) {
|
| 482 |
+
|
| 483 |
+
// Set file details
|
| 484 |
+
$data['filename'] = trim( $data['filename'] );
|
| 485 |
+
$data['size'] = trim( $data['size'] );
|
| 486 |
+
$data['mtime'] = trim( $data['mtime'] );
|
| 487 |
+
$data['path'] = trim( $data['path'] );
|
| 488 |
|
| 489 |
+
// Set file name
|
| 490 |
+
$data['filename'] = ( $data['path'] === '.' ? $data['filename'] : $data['path'] . DIRECTORY_SEPARATOR . $data['filename'] );
|
|
|
|
|
|
|
| 491 |
|
| 492 |
+
// Set file path
|
| 493 |
+
$data['path'] = ( $data['path'] === '.' ? null : $data['path'] );
|
| 494 |
+
|
| 495 |
+
// Replace forward slash with current directory separator
|
| 496 |
+
$data['filename'] = str_replace( '/', DIRECTORY_SEPARATOR, $data['filename'] );
|
| 497 |
+
|
| 498 |
+
// Replace forward slash with current directory separator
|
| 499 |
+
$data['path'] = str_replace( '/', DIRECTORY_SEPARATOR, $data['path'] );
|
| 500 |
+
}
|
| 501 |
|
| 502 |
return $data;
|
| 503 |
}
|
| 509 |
* @return bool
|
| 510 |
*/
|
| 511 |
public function has_reached_eof() {
|
| 512 |
+
return @feof( $this->file_handle );
|
| 513 |
}
|
| 514 |
|
| 515 |
/**
|
| 519 |
* @return bool
|
| 520 |
*/
|
| 521 |
public function has_not_reached_eof() {
|
| 522 |
+
return ! @feof( $this->file_handle );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 523 |
}
|
| 524 |
|
| 525 |
/**
|
| 526 |
* Get directory permissions
|
| 527 |
*
|
| 528 |
+
* @return int
|
| 529 |
*/
|
| 530 |
public function get_permissions_for_directory() {
|
| 531 |
if ( defined( 'FS_CHMOD_DIR' ) ) {
|
| 538 |
/**
|
| 539 |
* Get file permissions
|
| 540 |
*
|
| 541 |
+
* @return int
|
| 542 |
*/
|
| 543 |
public function get_permissions_for_file() {
|
| 544 |
if ( defined( 'FS_CHMOD_FILE' ) ) {
|
| 547 |
|
| 548 |
return 0644;
|
| 549 |
}
|
|
|
|
| 550 |
}
|
lib/view/assets/javascript/backups.min.js
CHANGED
|
@@ -94,7 +94,10 @@
|
|
| 94 |
url: ai1wm_backups.ajax.url,
|
| 95 |
type: 'POST',
|
| 96 |
dataType: 'json',
|
| 97 |
-
data: {
|
|
|
|
|
|
|
|
|
|
| 98 |
dataFilter: function dataFilter(data, type) {
|
| 99 |
return Util.json(data);
|
| 100 |
},
|
|
@@ -187,7 +190,12 @@
|
|
| 187 |
type: 'POST',
|
| 188 |
dataType: 'json',
|
| 189 |
async: false,
|
| 190 |
-
data: {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 191 |
dataFilter: function dataFilter(data, type) {
|
| 192 |
return Util.json(data);
|
| 193 |
},
|
|
@@ -390,7 +398,13 @@
|
|
| 390 |
type: 'POST',
|
| 391 |
dataType: 'json',
|
| 392 |
async: false,
|
| 393 |
-
data: {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 394 |
dataFilter: function dataFilter(data, type) {
|
| 395 |
return Util.json(data);
|
| 396 |
},
|
| 94 |
url: ai1wm_backups.ajax.url,
|
| 95 |
type: 'POST',
|
| 96 |
dataType: 'json',
|
| 97 |
+
data: {
|
| 98 |
+
'secret_key': ai1wm_backups.secret_key,
|
| 99 |
+
'archive': self.data('archive')
|
| 100 |
+
},
|
| 101 |
dataFilter: function dataFilter(data, type) {
|
| 102 |
return Util.json(data);
|
| 103 |
},
|
| 190 |
type: 'POST',
|
| 191 |
dataType: 'json',
|
| 192 |
async: false,
|
| 193 |
+
data: {
|
| 194 |
+
'secret_key': ai1wm_report.secret_key,
|
| 195 |
+
'ai1wm_email': email,
|
| 196 |
+
'ai1wm_message': message,
|
| 197 |
+
'ai1wm_terms': +terms
|
| 198 |
+
},
|
| 199 |
dataFilter: function dataFilter(data, type) {
|
| 200 |
return Util.json(data);
|
| 201 |
},
|
| 398 |
type: 'POST',
|
| 399 |
dataType: 'json',
|
| 400 |
async: false,
|
| 401 |
+
data: {
|
| 402 |
+
'secret_key': ai1wm_feedback.secret_key,
|
| 403 |
+
'ai1wm_type': type,
|
| 404 |
+
'ai1wm_email': email,
|
| 405 |
+
'ai1wm_message': message,
|
| 406 |
+
'ai1wm_terms': +terms
|
| 407 |
+
},
|
| 408 |
dataFilter: function dataFilter(data, type) {
|
| 409 |
return Util.json(data);
|
| 410 |
},
|
lib/view/assets/javascript/export.min.js
CHANGED
|
@@ -170,7 +170,12 @@
|
|
| 170 |
type: 'POST',
|
| 171 |
dataType: 'json',
|
| 172 |
async: false,
|
| 173 |
-
data: {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 174 |
dataFilter: function dataFilter(data, type) {
|
| 175 |
return Util.json(data);
|
| 176 |
},
|
|
@@ -373,7 +378,13 @@
|
|
| 373 |
type: 'POST',
|
| 374 |
dataType: 'json',
|
| 375 |
async: false,
|
| 376 |
-
data: {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 377 |
dataFilter: function dataFilter(data, type) {
|
| 378 |
return Util.json(data);
|
| 379 |
},
|
| 170 |
type: 'POST',
|
| 171 |
dataType: 'json',
|
| 172 |
async: false,
|
| 173 |
+
data: {
|
| 174 |
+
'secret_key': ai1wm_report.secret_key,
|
| 175 |
+
'ai1wm_email': email,
|
| 176 |
+
'ai1wm_message': message,
|
| 177 |
+
'ai1wm_terms': +terms
|
| 178 |
+
},
|
| 179 |
dataFilter: function dataFilter(data, type) {
|
| 180 |
return Util.json(data);
|
| 181 |
},
|
| 378 |
type: 'POST',
|
| 379 |
dataType: 'json',
|
| 380 |
async: false,
|
| 381 |
+
data: {
|
| 382 |
+
'secret_key': ai1wm_feedback.secret_key,
|
| 383 |
+
'ai1wm_type': type,
|
| 384 |
+
'ai1wm_email': email,
|
| 385 |
+
'ai1wm_message': message,
|
| 386 |
+
'ai1wm_terms': +terms
|
| 387 |
+
},
|
| 388 |
dataFilter: function dataFilter(data, type) {
|
| 389 |
return Util.json(data);
|
| 390 |
},
|
lib/view/assets/javascript/import.min.js
CHANGED
|
@@ -144,7 +144,12 @@
|
|
| 144 |
type: 'POST',
|
| 145 |
dataType: 'json',
|
| 146 |
async: false,
|
| 147 |
-
data: {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 148 |
dataFilter: function dataFilter(data, type) {
|
| 149 |
return Util.json(data);
|
| 150 |
},
|
|
@@ -347,7 +352,13 @@
|
|
| 347 |
type: 'POST',
|
| 348 |
dataType: 'json',
|
| 349 |
async: false,
|
| 350 |
-
data: {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 351 |
dataFilter: function dataFilter(data, type) {
|
| 352 |
return Util.json(data);
|
| 353 |
},
|
| 144 |
type: 'POST',
|
| 145 |
dataType: 'json',
|
| 146 |
async: false,
|
| 147 |
+
data: {
|
| 148 |
+
'secret_key': ai1wm_report.secret_key,
|
| 149 |
+
'ai1wm_email': email,
|
| 150 |
+
'ai1wm_message': message,
|
| 151 |
+
'ai1wm_terms': +terms
|
| 152 |
+
},
|
| 153 |
dataFilter: function dataFilter(data, type) {
|
| 154 |
return Util.json(data);
|
| 155 |
},
|
| 352 |
type: 'POST',
|
| 353 |
dataType: 'json',
|
| 354 |
async: false,
|
| 355 |
+
data: {
|
| 356 |
+
'secret_key': ai1wm_feedback.secret_key,
|
| 357 |
+
'ai1wm_type': type,
|
| 358 |
+
'ai1wm_email': email,
|
| 359 |
+
'ai1wm_message': message,
|
| 360 |
+
'ai1wm_terms': +terms
|
| 361 |
+
},
|
| 362 |
dataFilter: function dataFilter(data, type) {
|
| 363 |
return Util.json(data);
|
| 364 |
},
|
readme.txt
CHANGED
|
@@ -3,7 +3,7 @@ Contributors: yani.iliev, bangelov, pimjitsawang
|
|
| 3 |
Tags: move, transfer, copy, migrate, backup, clone, restore, db migration, wordpress migration, website migration, database export, database import, apoyo, sauvegarde, di riserva, バックアップ
|
| 4 |
Requires at least: 3.3
|
| 5 |
Tested up to: 4.8
|
| 6 |
-
Stable tag: 6.
|
| 7 |
License: GPLv2 or later
|
| 8 |
|
| 9 |
Move, transfer, copy, migrate, and backup a site with 1-click. Quick, easy, and reliable.
|
|
@@ -90,6 +90,20 @@ Alternatively you can download the plugin using the download button on this page
|
|
| 90 |
3. Plugin Menu
|
| 91 |
|
| 92 |
== Changelog ==
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 93 |
= 6.50 =
|
| 94 |
**Fixed**
|
| 95 |
|
| 3 |
Tags: move, transfer, copy, migrate, backup, clone, restore, db migration, wordpress migration, website migration, database export, database import, apoyo, sauvegarde, di riserva, バックアップ
|
| 4 |
Requires at least: 3.3
|
| 5 |
Tested up to: 4.8
|
| 6 |
+
Stable tag: 6.51
|
| 7 |
License: GPLv2 or later
|
| 8 |
|
| 9 |
Move, transfer, copy, migrate, and backup a site with 1-click. Quick, easy, and reliable.
|
| 90 |
3. Plugin Menu
|
| 91 |
|
| 92 |
== Changelog ==
|
| 93 |
+
= 6.51 =
|
| 94 |
+
**Added**
|
| 95 |
+
|
| 96 |
+
* Validation on leave feedback, report issue and delete backup actions
|
| 97 |
+
* More descriptive wpress file names on export
|
| 98 |
+
|
| 99 |
+
**Changed**
|
| 100 |
+
|
| 101 |
+
* Remove "Unable to authenticate with secret key" message
|
| 102 |
+
|
| 103 |
+
**Fixed**
|
| 104 |
+
|
| 105 |
+
* Wrong file size in wpress file on export
|
| 106 |
+
|
| 107 |
= 6.50 =
|
| 108 |
**Fixed**
|
| 109 |
|
