/var/www/(Del)hsihk.com/wp-content/plugins/backupbuddy/classes/_restoreFiles.php


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
<?php
class backupbuddy_restore_files {

    
/* restore()
     *
     * Restore one or more files to a path.
     *
     * @param    $archive_file    Backup zip archive file to restore files from.
     * @param    $files            Array of files to restore. Each key and value must be the same. Format: array( 'filename.txt' => 'filename.txt' );
     * @param    $finalPath        Destination path to extract into.
     * @return    bool            True on success, else false.
     *
     */
    
public static function restore$archive_file$files$finalPath, &$zipbuddy null ) {
        if ( !
defined'PB_STANDALONE' ) || PB_STANDALONE === false ) {
            if ( ! 
current_user_canpb_backupbuddy::$options['role_access'] ) ) {
                die( 
'Error #473623. Access Denied.' );
            }
        }
        
        
$serial backupbuddy_core::get_serial_from_file$archive_file ); // serial of archive.
        
$success false;
        
        foreach( 
$files as $file ) {
            
$file str_replace'*'''$file ); // Remove any wildcard.
            
if ( file_exists$finalPath $file ) && is_dir$finalPath $file ) ) {
                if ( ( 
$file_count = @scandir$finalPath $file ) ) && ( count$file_count ) > ) ) {
                    
pb_backupbuddy::status'error'__'Error #9036. The destination directory being restored already exists and is NOT empty. The directory will not be restored to prevent inadvertently losing files within the existing directory. Delete existing directory first if you wish to proceed or restore individual files.''it-l10n-backupbuddy' ) . ' Existing directory: `' $finalPath $file '`.' );
                    return 
false;
                }
            }
        }
        
        
        if ( 
null === $zipbuddy ) {
            require_once( 
pb_backupbuddy::plugin_path() . '/lib/zipbuddy/zipbuddy.php' );
            
$zipbuddy = new pluginbuddy_zipbuddybackupbuddy_core::getBackupDirectory() );
        }
        
        
        
// Calculate temp directory & lock it down.
        
$temp_dir get_temp_dir();
        
$destination $temp_dir 'backupbuddy-' $serial;
        if ( ( ( ! 
file_exists$destination ) ) && ( false === mkdir$destination0777true ) ) ) ) {
            
$error 'Error #458485945: Unable to create temporary location `' $destination '`. Check permissions.';
            
pb_backupbuddy::status'error'$error );
            return 
false;
        }
        
        
        
// If temp directory is within webroot then lock it down.
        
$temp_dir str_replace'\\''/'$temp_dir ); // Normalize for Windows.
        
$temp_dir rtrim$temp_dir'/\\' ) . '/'// Enforce single trailing slash.
        
if ( FALSE !== stristr$temp_dirABSPATH ) ) { // Temp dir is within webroot.
            
pb_backupbuddy::anti_directory_browsing$destination );
        }
        unset( 
$temp_dir );
        
pb_backupbuddy::status'details''Extracting into temporary directory "' $destination '".' );
        
        
$prettyFilesList = array();
        foreach( 
$files as $fileSource => $fileDestination ) {
            
$prettyFilesList[] = $fileSource ' => ' $fileDestination;
        }
        
pb_backupbuddy::status'details''Files to extract: `' htmlentitiesimplode', '$prettyFilesList ) ) . '`.' );
        unset( 
$prettyFilesList );
        
        
pb_backupbuddy::flush();
        
        
// Do the actual extraction.
        
$extract_success true;
        if ( 
false === $zipbuddy->extract$archive_file$destination$files ) ) {
            
pb_backupbuddy::status'error''Error #584984458b. Unable to extract.' );
            
$extract_success false;
        }
        
        if ( 
true === $extract_success ) {
            
            
// Verify all files/directories to be extracted exist in temp destination directory. If any missing then delete everything and bail out.
            
foreach( $files as &$file ) {
                
$file str_replace'*'''$file ); // Remove any wildcard.
                
if ( ! file_exists$destination '/' $file ) ) {
                    
// Cleanup.
                    
foreach( $files as $file ) {
                        @
trigger_error'' ); // Clear out last error.
                        
@unlink$destination '/' $file);
                        
$last_error error_get_last();
                        if ( 
is_array$last_error ) ) {
                            
pb_backupbuddy::status'error'$last_error['message'] . ' File: `' $last_error['file'] . '`. Line: `' $last_error['line'] . '`.' );
                        }
                    }
                    
pb_backupbuddy::status'error''Error #854783474. One or more expected files / directories missing.' );
                    
                    
$extract_success false;
                    break;
                }
            }
            unset( 
$file );
            
            
// Made it this far so files all exist. Move them all.
            
foreach( $files as $file ) {
                @
trigger_error'' ); // Clear out last error.
                
if ( false === pb_backupbuddy::$filesystem->recursive_copy$destination '/' $file$finalPath $file ) ) {
                    
$last_error error_get_last();
                    if ( 
is_array$last_error ) ) {
                        
//print_r( $last_error );
                        
pb_backupbuddy::status'error'$last_error['message'] . ' File: `' $last_error['file'] . '`. Line: `' $last_error['line'] . '`.' );
                    }
                    
$error 'Error #9035. Unable to copyrestored file `' $destination '/' $file '` to `' $finalPath $file '`. Verify permissions on destination location & that the destination directory/file does not already exist.';
                    
pb_backupbuddy::status'error'$error );
                } else {
                    
$details 'Recursively moved `' $destination '/' $file '` to `' $finalPath $file '`.<br>';
                    
pb_backupbuddy::status'details'$details );
                    
$success true;
                }
            }
            
        } 
// end extract success.
        
        
        // Try to cleanup.
        
if ( file_exists$destination ) ) {
            if ( 
false === pb_backupbuddy::$filesystem->unlink_recursive$destination ) ) {
                
pb_backupbuddy::status'details''Unable to delete temporary holding directory `' $destination '`.' );
            } else {
                
pb_backupbuddy::status'details''Cleaned up temporary files.' );
            }
        }
        
        
        if ( 
true === $success ) {
            
pb_backupbuddy::status'message''File retrieval completed successfully.' );
            return 
true;
        } else {
            return 
false;
        }
        
    } 
// End function restore().

// End class.