/var/www/(Del)hsihk.com/wp-content/plugins/backupbuddy/destinations/sftp/init.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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
<?php

// DO NOT CALL THIS CLASS DIRECTLY. CALL VIA: pb_backupbuddy_destination in bootstrap.php.

class pb_backupbuddy_destination_sftp {
    
    public static 
$destination_info = array(
        
'name'            =>        'sFTP',
        
'description'    =>        'Secure File Transport Protocol (over SSH) is a more secure way of sending files between servers than FTP by using SSH. Web hosting accounts are more frequently providing this feature for greater security. This implementation is fully in PHP so PHP memory limits may be a limiting factor on some servers.',
    );
    
    
// Default settings. Should be public static for auto-merging.
    
public static $default_settings = array(
        
'type'            =>        'sftp',    // MUST MATCH your destination slug.
        
'title'            =>        '',        // Required destination field.
        
'address'        =>        '',
        
'username'        =>        '',
        
'password'        =>        '',
        
'path'            =>        '',
        
'archive_limit'    =>        0,
        
'url'            =>        '',        // optional url for migration that corresponds to this sftp/path.
        
'disable_file_management'    =>        '0',        // When 1, _manage.php will not load which renders remote file management DISABLED.
    
);
    
    
    public static function 
_init() {
        
        
//die( get_include_path() . PATH_SEPARATOR . 'phpseclib' );
        
set_include_path(get_include_path() . PATH_SEPARATOR pb_backupbuddy::plugin_path() . '/destinations/sftp/lib/phpseclib');
        require_once( 
pb_backupbuddy::plugin_path() . '/destinations/sftp/lib/phpseclib/Net/SFTP.php' );
        
        if ( 
'3' == pb_backupbuddy::$options['log_level'] ) { // Crank up logging level if in debug mode.
            
define('NET_SFTP_LOGGING'NET_SFTP_LOG_COMPLEX);
        }
        
    } 
// end _init().
    
    
    /*    send()
     *    
     *    Send one or more files.
     *    
     *    @param        array            $files        Array of one or more files to send.
     *    @return        boolean                        True on success, else false.
     */
    
public static function send$settings = array(), $files = array(), $send_id '' ) {
        
        
pb_backupbuddy::status'details''FTP class send() function started.' );
        
self::_init();
        
        
// Connect to server.
        
$server $settings['address'];
        
$port '22'// Default sFTP port.
        
if ( strstr$server':' ) ) { // Handle custom sFTP port.
            
$server_params explode':'$server );
            
$server $server_params[0];
            
$port $server_params[1];
        }
        
pb_backupbuddy::status'details''Connecting to sFTP server...' );
        
$sftp = new Net_SFTP$server$port );
        if ( ! 
$sftp->login$settings['username'], $settings['password'] ) ) {
            
pb_backupbuddy::status'error''Connection to sFTP server FAILED.' );
            
pb_backupbuddy::status'details''sFTP log (if available & enabled via full logging mode): `' $sftp->getSFTPLog() . '`.' );
            return 
false;
        } else {
            
pb_backupbuddy::status'details''Success connecting to sFTP server.' );
        }
        
        
pb_backupbuddy::status'details''Attempting to create path (if it does not exist)...' );
        if ( 
true === $sftp->mkdir$settings['path'] ) ) { // Try to make directory.
            
pb_backupbuddy::status'details''Directory created.' );
        } else {
            
pb_backupbuddy::status'details''Directory not created.' );
        }
        
        
// Change to directory.
        
pb_backupbuddy::status'details''Attempting to change into directory...' );
        if ( 
true === $sftp->chdir$settings['path'] ) ) {
            
pb_backupbuddy::status'details''Changed into directory `' $settings['path'] . '`. All uploads will be relative to this.' );
        } else {
            
pb_backupbuddy::status'error''Unable to change into specified path. Verify the path is correct with valid permissions.' );
            
pb_backupbuddy::status'details''sFTP log (if available & enabled via full logging mode): `' $sftp->getSFTPLog() . '`.' );
            return 
false;
        }
        
        
// Upload files.
        
$total_transfer_size 0;
        
$total_transfer_time 0;
        foreach( 
$files as $file ) {
            
            if ( ! 
file_exists$file ) ) {
                
pb_backupbuddy::status'error''Error #859485495. Could not upload local file `' $file '` to send to sFTP as it does not exist. Verify the file exists, permissions of file, parent directory, and that ownership is correct. You may need suphp installed on the server.' );
            }
            if ( ! 
is_readable$file ) ) {
                
pb_backupbuddy::status'error''Error #8594846548. Could not read local file `' $file '` to send to sFTP as it is not readable. Verify permissions of file, parent directory, and that ownership is correct. You may need suphp installed on the server.' );
            }
            
            
$filesize filesize$file );
            
$total_transfer_size += $filesize;
            
            
$destination_file basename$file );
            
pb_backupbuddy::status'details''About to put to sFTP local file `' $file '` of size `' pb_backupbuddy::$format->file_size$filesize ) . '` to remote file `' $destination_file '`.' );
            
$send_time = -microtimetrue );
            
$upload $sftp->put$destination_file$fileNET_SFTP_LOCAL_FILE );
            
$send_time += microtimetrue );
            
$total_transfer_time += $send_time;
            if ( 
$upload === false ) { // Failed sending.
                
$error_message 'ERROR #9012 ( http://ithemes.com/codex/page/BackupBuddy:_Error_Codes#9012 ).  sFTP file upload failed. Check file permissions & disk quota.';
                
pb_backupbuddy::status'error',  $error_message );
                
backupbuddy_core::mail_error$error_message );
                
pb_backupbuddy::status'details''sFTP log (if available & enabled via full logging mode): `' $sftp->getSFTPLog() . '`.' );
                return 
false;
            } else { 
// Success sending.
                
pb_backupbuddy::status'details',  'Success completely sending `' basename$file ) . '` to destination.' );
                
                
                
// Start remote backup limit
                
if ( $settings['archive_limit'] > ) {
                    
pb_backupbuddy::status'details''Archive limit enabled. Getting contents of backup directory.' );
                    
$contents $sftp->rawlist$settings['path'] ); // already in destination directory/path.
                    
                    // Create array of backups
                    
$bkupprefix backupbuddy_core::backup_prefix();
                    
                    
$backups = array();
                    foreach ( 
$contents as $filename => $backup ) {
                        
// check if file is backup
                        
$pos strpos$filename'backup-' $bkupprefix '-' );
                        if ( 
$pos !== FALSE ) {
                            
$backups[] = array(
                                
'file' => $filename,
                                
'modified' => $backup['mtime'],
                            );
                        }
                    }
                    
                    function 
backupbuddy_number_sort$a,$b ) {
                        return 
$a['modified']<$b['modified'];
                    }
                    
// Sort by modified using custom sort function above.
                    
usort$backups'backupbuddy_number_sort' );
                    
                    
                    if ( ( 
count$backups ) ) > $settings['archive_limit'] ) {
                        
pb_backupbuddy::status'details''More backups found (' count$backups ) . ') than limit permits (' $settings['archive_limit'] . ').' print_r$backupstrue ) );
                        
$delete_fail_count 0;
                        
$i 0;
                        foreach( 
$backups as $backup ) {
                            
$i++;
                            if ( 
$i $settings['archive_limit'] ) {
                                if ( 
false === $sftp->delete$settings['path'] . '/' $backup['file'] ) ) {
                                    
pb_backupbuddy::status'details''Unable to delete excess sFTP file `' $backup['file'] . '` in path `' $settings['path'] . '`.' );
                                    
$delete_fail_count++;
                                } else {
                                    
pb_backupbuddy::status'details''Deleted excess sFTP file `' $backup['file'] . '` in path `' $settings['path'] . '`.' );
                                }
                            }
                        }
                        if ( 
$delete_fail_count != ) {
                            
backupbuddy_core::mail_errorsprintf__('sFTP remote limit could not delete %s backups. Please check and verify file permissions.''it-l10n-backupbuddy' ), $delete_fail_count  ) );
                            
pb_backupbuddy::status'error''Unable to delete one or more excess backup archives. File storage limit may be exceeded. Manually clean up backups and check permissions.' );
                        } else {
                            
pb_backupbuddy::status'details''No problems encountered deleting excess backups.' );
                        }
                    } else {
                        
pb_backupbuddy::status'details''Not enough backups found to exceed limit. Skipping limit enforcement.' );
                    }
                } else {
                    
pb_backupbuddy::status'details',  'No sFTP archive file limit to enforce.' );
                }
                
// End remote backup limit
            
}
            
        } 
// end $files loop.
        
        
        // Load destination fileoptions.
        
pb_backupbuddy::status'details''About to load fileoptions data.' );
        require_once( 
pb_backupbuddy::plugin_path() . '/classes/fileoptions.php' );
        
pb_backupbuddy::status'details''Fileoptions instance #6.' );
        
$fileoptions_obj = new pb_backupbuddy_fileoptionsbackupbuddy_core::getLogDirectory() . 'fileoptions/send-' $send_id '.txt'$read_only false$ignore_lock false$create_file false );
        if ( 
true !== ( $result $fileoptions_obj->is_ok() ) ) {
            
pb_backupbuddy::status'error'__('Fatal Error #9034.843498. Unable to access fileoptions data.''it-l10n-backupbuddy' ) . ' Error: ' $result );
            return 
false;
        }
        
pb_backupbuddy::status'details''Fileoptions data loaded.' );
        
$fileoptions = &$fileoptions_obj->options;
        
        
// Save stats.
        
$fileoptions['write_speed'] = $total_transfer_size $total_transfer_time;
        
$fileoptions_obj->save();
        unset( 
$fileoptions_obj );
        
        
        return 
true;
        
    } 
// End send().
    
    
    
    /*    test()
     *    
     *    function description
     *    
     *    @param        array            $settings    Destination settings.
     *    @return        bool|string                    True on success, string error message on failure.
     */
    
public static function test$settings ) {
        
        
self::_init();
        
        
// Connect to server.
        
$server $settings['address'];
        
$port '22'// Default sFTP port.
        
if ( strstr$server':' ) ) { // Handle custom sFTP port.
            
$server_params explode':'$server );
            
$server $server_params[0];
            
$port $server_params[1];
        }
        
pb_backupbuddy::status'details''Connecting to sFTP server...' );
        
$sftp = new Net_SFTP$server$port );
        if ( ! 
$sftp->login$settings['username'], $settings['password'] ) ) {
            
pb_backupbuddy::status'error''Connection to sFTP server FAILED.' );
            
pb_backupbuddy::status'details''sFTP log (if available & enabled via full logging mode): `' $sftp->getSFTPLog() . '`.' );
            return 
__'Unable to connect to server using host, username, and password combination provided.''it-l10n-backupbuddy' );
        } else {
            
pb_backupbuddy::status'details''Success connecting to sFTP server.' );
        }
        
        
pb_backupbuddy::status'details''Attempting to create path (if it does not exist)...' );
        if ( 
true === $sftp->mkdir$settings['path'] ) ) { // Try to make directory.
            
pb_backupbuddy::status'details''Directory created.' );
        } else {
            
pb_backupbuddy::status'details''Directory not created.' );
        }
        
        
        
$destination_file $settings['path'] . '/backupbuddy_test.txt';
        
pb_backupbuddy::status'details''About to put to sFTP test file `backupbuddy_test.txt` to remote location `' $destination_file '`.' );
        
$send_time = -microtimetrue );
        if ( 
true !== $sftp->put$destination_file'Upload test for BackupBuddy destination. Delete me.' ) ) {
            
pb_backupbuddy::status'details''sFTP test: Failure uploading test file.' );
            
$sftp->delete$destination_file ); // Just in case it partionally made file. This has happened oddly.
            
pb_backupbuddy::status'details''sFTP log (if available & enabled via full logging mode): `' $sftp->getSFTPLog() . '`.' );
            return 
__('Failure uploading. Check path & permissions.''it-l10n-backupbuddy' );
        } else { 
// File uploaded.
            
            
pb_backupbuddy::status'details''File uploaded.' );
            if ( 
$settings['url'] != '' ) {
                
$response wp_remote_getrtrim$settings['url'], '/\\' ) . '/backupbuddy_test.txt', array(
                        
'method' => 'GET',
                        
'timeout' => 20,
                        
'redirection' => 5,
                        
'httpversion' => '1.0',
                        
'blocking' => true,
                        
'headers' => array(),
                        
'body' => null,
                        
'cookies' => array()
                    )
                );
                                
                if ( 
is_wp_error$response ) ) {
                    return 
__'Failure. Unable to connect to the provided optional URL.''it-l10n-backupbuddy' );
                }
                
                if ( 
stristr$response['body'], 'backupbuddy' ) === false ) {
                    return 
__('Failure. The path appears valid but the URL does not correspond to it. Leave the URL blank if not using this destination for migrations.''it-l10n-backupbuddy' );
                }
            }
            
            
            
pb_backupbuddy::status'details''sFTP test: Deleting temp test file.' );
            
$sftp->delete$destination_file );
        }
        
        
        return 
true// Success if we got this far.
    
// End test().
    
    
// End class.