PageRenderTime 26ms CodeModel.GetById 15ms RepoModel.GetById 1ms app.codeStats 0ms

/wp-content/plugins/backwpup/inc/class-destination-folder.php

https://bitbucket.org/cesarmedrano/cesarmedrano
PHP | 228 lines | 212 code | 7 blank | 9 comment | 6 complexity | 2d4e388f37fa9281d21dd3ac9f324e09 MD5 | raw file
  1. <?php
  2. /**
  3. *
  4. */
  5. class BackWPup_Destination_Folder extends BackWPup_Destinations {
  6. /**
  7. * @return mixed
  8. */
  9. public function __construct() {
  10. $this->info[ 'ID' ] = 'FOLDER';
  11. $this->info[ 'name' ] = __( 'Folder', 'backwpup' );
  12. $this->info[ 'description' ] = __( 'Backup to Folder', 'backwpup' );
  13. $this->info[ 'URI' ] = translate( BackWPup::get_plugin_data( 'PluginURI' ), 'backwpup' );
  14. $this->info[ 'author' ] = BackWPup::get_plugin_data( 'Author' );
  15. $this->info[ 'authorURI' ] = translate( BackWPup::get_plugin_data( 'AuthorURI' ), 'backwpup' );
  16. $this->info[ 'version' ] = BackWPup::get_plugin_data( 'Version' );
  17. }
  18. /**
  19. * @return array
  20. */
  21. public function option_defaults() {
  22. $upload_dir = wp_upload_dir();
  23. return array( 'maxbackups' => 15, 'backupdir' => trailingslashit( str_replace( '\\', '/',$upload_dir[ 'basedir' ] ) ) . 'backwpup-' . substr( md5( md5( NONCE_SALT ) ),12 ,5 ) . '-backups/', 'backupsyncnodelete' => TRUE );
  24. }
  25. /**
  26. * @param $jobid
  27. * @return void
  28. * @internal param $main
  29. */
  30. public function edit_tab( $jobid ) {
  31. ?>
  32. <h3 class="title"><?php _e( 'Backup settings', 'backwpup' ); ?></h3>
  33. <p></p>
  34. <table class="form-table">
  35. <tr valign="top">
  36. <th scope="row"><label for="idbackupdir"><?php _e( 'Folder to store backups in', 'backwpup' ); ?></label></th>
  37. <td>
  38. <input name="backupdir" id="idbackupdir" type="text" value="<?php echo esc_attr( BackWPup_Option::get( $jobid, 'backupdir' ) ); ?>" class="regular-text" />
  39. </td>
  40. </tr>
  41. <tr valign="top">
  42. <th scope="row"><?php _e( 'File Deletion', 'backwpup' ); ?></th>
  43. <td>
  44. <?php
  45. if ( BackWPup_Option::get( $jobid, 'backuptype' ) == 'archive' ) {
  46. ?>
  47. <label for="idmaxbackups"><input name="maxbackups" id="idmaxbackups" type="text" size="3" value="<?php echo esc_attr( BackWPup_Option::get( $jobid, 'maxbackups' ) ) ;?>" class="small-text" />&nbsp;
  48. <?php _e( 'Number of files to keep in folder.', 'backwpup' ); BackWPup_Help::tip( __( 'Oldest files will be deleted first. 0 = no deletion', 'backwpup' ) ); ?></label>
  49. <?php } else { ?>
  50. <label for="idbackupsyncnodelete"><input class="checkbox" value="1"
  51. type="checkbox" <?php checked( BackWPup_Option::get( $jobid, 'backupsyncnodelete' ), TRUE ); ?>
  52. name="backupsyncnodelete" id="idbackupsyncnodelete" /> <?php _e( 'Do not delete files while syncing to destination!', 'backwpup' ); ?></label>
  53. <?php } ?>
  54. </td>
  55. </tr>
  56. </table>
  57. <?php
  58. }
  59. /**
  60. * @param $jobid
  61. */
  62. public function edit_form_post_save( $jobid ) {
  63. $_POST[ 'backupdir' ] = trailingslashit( str_replace( '//', '/', str_replace( '\\', '/', trim( stripslashes( $_POST[ 'backupdir' ] ) ) ) ) );
  64. if ( $_POST[ 'backupdir' ][ 0 ] == '.' || ( $_POST[ 'backupdir' ][ 0 ] != '/' && ! preg_match( '#^[a-zA-Z]:/#', $_POST[ 'backupdir' ] ) ) )
  65. $_POST[ 'backupdir' ] = trailingslashit( str_replace( '\\', '/', ABSPATH ) ) . $_POST[ 'backupdir' ];
  66. if ( $_POST[ 'backupdir' ] == '/' )
  67. $_POST[ 'backupdir' ] = '';
  68. BackWPup_Option::update( $jobid, 'backupdir', $_POST[ 'backupdir' ] );
  69. BackWPup_Option::update( $jobid, 'maxbackups', isset( $_POST[ 'maxbackups' ] ) ? (int)$_POST[ 'maxbackups' ] : 0 );
  70. BackWPup_Option::update( $jobid, 'backupsyncnodelete', ( isset( $_POST[ 'backupsyncnodelete' ] ) && $_POST[ 'backupsyncnodelete' ] == 1 ) ? TRUE : FALSE );
  71. }
  72. /**
  73. * @param $jobdest
  74. * @param $backupfile
  75. */
  76. public function file_delete( $jobdest, $backupfile ) {
  77. if ( is_file( $backupfile ) )
  78. unlink( $backupfile );
  79. }
  80. /**
  81. * @param $jobid
  82. * @param $get_file
  83. */
  84. public function file_download( $jobid, $get_file ) {
  85. if ( is_file( $get_file ) ) {
  86. header( "Pragma: public" );
  87. header( "Expires: 0" );
  88. header( "Cache-Control: must-revalidate, post-check=0, pre-check=0" );
  89. header( "Content-Type: application/octet-stream" );
  90. header( "Content-Disposition: attachment; filename=" . basename( $get_file ) . ";" );
  91. header( "Content-Transfer-Encoding: binary" );
  92. header( "Content-Length: " . filesize( $get_file ) );
  93. @set_time_limit( 0 );
  94. //chunked readfile
  95. ob_end_clean();
  96. $handle = fopen( $get_file, 'r' );
  97. if ( $handle ) {
  98. while ( ! feof( $handle ) ) {
  99. $buffer = fread( $handle, 20482048 ); //2MB chunkes
  100. echo $buffer;
  101. ob_flush();
  102. flush();
  103. }
  104. fclose( $handle );
  105. }
  106. die();
  107. }
  108. else {
  109. header( $_SERVER[ "SERVER_PROTOCOL" ] . " 404 Not Found" );
  110. header( "Status: 404 Not Found" );
  111. die();
  112. }
  113. }
  114. /**
  115. * @param $jobdest
  116. * @return mixed
  117. */
  118. public function file_get_list( $jobdest ) {
  119. list( $jobid, $dest ) = explode( '_', $jobdest );
  120. $filecounter = 0;
  121. $files = array();
  122. $backup_folder = BackWPup_Option::get( $jobid, 'backupdir' );
  123. if ( $dir = opendir( $backup_folder ) ) { //make file list
  124. while ( FALSE !== ( $file = readdir( $dir ) ) ) {
  125. if ( is_file( $backup_folder . $file ) ) {
  126. //file list for backups
  127. $files[ $filecounter ][ 'folder' ] = $backup_folder;
  128. $files[ $filecounter ][ 'file' ] = $backup_folder . $file;
  129. $files[ $filecounter ][ 'filename' ] = $file;
  130. $files[ $filecounter ][ 'downloadurl' ] = add_query_arg( array(
  131. 'page' => 'backwpupbackups',
  132. 'action' => 'downloadfolder',
  133. 'file' => $backup_folder . $file
  134. ), network_admin_url( 'admin.php' ) );
  135. $files[ $filecounter ][ 'filesize' ] = filesize( $backup_folder . $file );
  136. $files[ $filecounter ][ 'time' ] = filemtime( $backup_folder . $file );
  137. $filecounter ++;
  138. }
  139. }
  140. @closedir( $dir );
  141. }
  142. return $files;
  143. }
  144. /**
  145. * @param $job_object
  146. * @return bool
  147. */
  148. public function job_run_archive( $job_object ) {
  149. $job_object->substeps_todo = 1;
  150. if ( ! empty( $job_object->job[ 'jobid' ] ) )
  151. BackWPup_Option::update( $job_object->job[ 'jobid' ], 'lastbackupdownloadurl', add_query_arg( array(
  152. 'page' => 'backwpupbackups',
  153. 'action' => 'downloadfolder',
  154. 'file' => $job_object->backup_folder . $job_object->backup_file
  155. ), network_admin_url( 'admin.php' ) ) );
  156. //Delete old Backupfiles
  157. $backupfilelist = array();
  158. $files = array();
  159. if ( $dir = opendir( $job_object->backup_folder ) ) { //make file list
  160. while ( FALSE !== ( $file = readdir( $dir ) ) ) {
  161. if ( is_file( $job_object->backup_folder . $file ) ) {
  162. //list for deletion
  163. if ( $job_object->is_backup_archive( $file ) )
  164. $backupfilelist[ filemtime( $job_object->backup_folder . $file ) ] = $file;
  165. }
  166. }
  167. @closedir( $dir );
  168. }
  169. if ( $job_object->job[ 'maxbackups' ] > 0 ) {
  170. if ( count( $backupfilelist ) > $job_object->job[ 'maxbackups' ] ) {
  171. ksort( $backupfilelist );
  172. $numdeltefiles = 0;
  173. while ( $file = array_shift( $backupfilelist ) ) {
  174. if ( count( $backupfilelist ) < $job_object->job[ 'maxbackups' ] )
  175. break;
  176. unlink( $job_object->backup_folder . $file );
  177. foreach ( $files as $key => $filedata ) {
  178. if ( $filedata[ 'file' ] == $job_object->backup_folder . $file )
  179. unset( $files[ $key ] );
  180. }
  181. $numdeltefiles ++;
  182. }
  183. if ( $numdeltefiles > 0 )
  184. $job_object->log( sprintf( _n( 'One backup file deleted', '%d backup files deleted', $numdeltefiles, 'backwpup' ), $numdeltefiles ), E_USER_NOTICE );
  185. }
  186. }
  187. $job_object->substeps_done ++;
  188. return TRUE;
  189. }
  190. /**
  191. * @param $job_object
  192. * @return bool
  193. */
  194. public function can_run( $job_object ) {
  195. if ( empty( $job_object->job[ 'backupdir' ] ) || $job_object->job[ 'backupdir' ] == '/' )
  196. return FALSE;
  197. return TRUE;
  198. }
  199. }