PageRenderTime 44ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 0ms

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

https://gitlab.com/pankajmohale/chef2go
PHP | 250 lines | 205 code | 21 blank | 24 comment | 19 complexity | 21d1dc60e6a809874ef2783ef53a9e2a MD5 | raw file
  1. <?php
  2. /**
  3. *
  4. */
  5. class BackWPup_Destination_Folder extends BackWPup_Destinations {
  6. /**
  7. * @return array
  8. */
  9. public function option_defaults() {
  10. $upload_dir = wp_upload_dir( null, false, true );
  11. $backups_dir = trailingslashit( str_replace( '\\', '/',$upload_dir[ 'basedir' ] ) ) . 'backwpup-' . BackWPup::get_plugin_data( 'hash' ) . '-backups/';
  12. $content_path = trailingslashit( str_replace( '\\', '/', WP_CONTENT_DIR ) );
  13. $backups_dir = str_replace( $content_path, '', $backups_dir );
  14. return array( 'maxbackups' => 15, 'backupdir' => $backups_dir, 'backupsyncnodelete' => TRUE );
  15. }
  16. /**
  17. * @param $jobid
  18. * @return void
  19. * @internal param $main
  20. */
  21. public function edit_tab( $jobid ) {
  22. ?>
  23. <h3 class="title"><?php esc_html_e( 'Backup settings', 'backwpup' ); ?></h3>
  24. <p></p>
  25. <table class="form-table">
  26. <tr>
  27. <th scope="row"><label for="idbackupdir"><?php esc_html_e( 'Folder to store backups in', 'backwpup' ); ?></label></th>
  28. <td>
  29. <input name="backupdir" id="idbackupdir" type="text" value="<?php echo esc_attr( BackWPup_Option::get( $jobid, 'backupdir' ) ); ?>" class="regular-text" />
  30. </td>
  31. </tr>
  32. <tr>
  33. <th scope="row"><?php esc_html_e( 'File Deletion', 'backwpup' ); ?></th>
  34. <td>
  35. <?php
  36. if ( BackWPup_Option::get( $jobid, 'backuptype' ) === 'archive' ) {
  37. ?>
  38. <label for="idmaxbackups">
  39. <input id="idmaxbackups" name="maxbackups" type="number" min="0" step="1" value="<?php echo esc_attr( BackWPup_Option::get( $jobid, 'maxbackups' ) ); ?>" class="small-text"/>
  40. &nbsp;<?php esc_html_e( 'Number of files to keep in folder.', 'backwpup' ); ?>
  41. </label>
  42. <p><?php _e( '<strong>Warning</strong>: Files belonging to this job are now tracked. Old backup archives which are untracked will not be automatically deleted.', 'backwpup' ) ?></p>
  43. <?php } else { ?>
  44. <label for="idbackupsyncnodelete">
  45. <input class="checkbox" value="1" type="checkbox" <?php checked( BackWPup_Option::get( $jobid, 'backupsyncnodelete' ), true ); ?> name="backupsyncnodelete" id="idbackupsyncnodelete"/>
  46. &nbsp;<?php esc_html_e( 'Do not delete files while syncing to destination!', 'backwpup' ); ?>
  47. </label>
  48. <?php } ?>
  49. </td>
  50. </tr>
  51. </table>
  52. <?php
  53. }
  54. /**
  55. * @param $jobid
  56. */
  57. public function edit_form_post_save( $jobid ) {
  58. $_POST[ 'backupdir' ] = trailingslashit( str_replace( array( '//', '\\' ), '/', trim( sanitize_text_field( $_POST[ 'backupdir' ] ) ) ) );
  59. BackWPup_Option::update( $jobid, 'backupdir', $_POST[ 'backupdir' ] );
  60. BackWPup_Option::update( $jobid, 'maxbackups', ! empty( $_POST[ 'maxbackups' ] ) ? absint( $_POST[ 'maxbackups' ] ) : 0 );
  61. BackWPup_Option::update( $jobid, 'backupsyncnodelete', ! empty( $_POST[ 'backupsyncnodelete' ] ) );
  62. }
  63. /**
  64. * @param $jobdest
  65. * @param $backupfile
  66. */
  67. public function file_delete( $jobdest, $backupfile ) {
  68. list( $jobid, $dest ) = explode( '_', $jobdest, 2 );
  69. if ( empty( $jobid ) ) {
  70. return;
  71. }
  72. $backup_dir = esc_attr( BackWPup_Option::get( (int)$jobid, 'backupdir' ) );
  73. $backup_dir = BackWPup_File::get_absolute_path( $backup_dir );
  74. $backupfile = realpath( trailingslashit( $backup_dir ) . basename( $backupfile ) );
  75. if ( $backupfile && is_writeable( $backupfile ) && !is_dir( $backupfile ) && !is_link( $backupfile ) ) {
  76. unlink( $backupfile );
  77. }
  78. }
  79. /**
  80. * @param $jobid
  81. * @param $get_file
  82. */
  83. public function file_download( $jobid, $get_file ) {
  84. $backup_dir = esc_attr( BackWPup_Option::get( (int) $jobid, 'backupdir' ) );
  85. $backup_dir = BackWPup_File::get_absolute_path( $backup_dir );
  86. $get_file = realpath( trailingslashit( $backup_dir ) . basename( $get_file ) );
  87. if ( $get_file && is_readable( $get_file ) ) {
  88. if ( $level = ob_get_level() ) {
  89. for ( $i = 0; $i < $level; $i ++ ) {
  90. ob_end_clean();
  91. }
  92. }
  93. @set_time_limit( 300 );
  94. nocache_headers();
  95. header( 'Content-Description: File Transfer' );
  96. header( 'Content-Type: ' . BackWPup_Job::get_mime_type( $get_file ) );
  97. header( 'Content-Disposition: attachment; filename="' . basename( $get_file ) . '"' );
  98. header( 'Content-Transfer-Encoding: binary' );
  99. header( 'Content-Length: ' . filesize( $get_file ) );
  100. $handle = fopen( $get_file, 'rb' );
  101. if ( $handle ) {
  102. while ( ! feof( $handle ) ) {
  103. echo fread( $handle, 10241024 ); //chunks
  104. flush();
  105. }
  106. fclose( $handle );
  107. }
  108. die();
  109. } else {
  110. header( $_SERVER["SERVER_PROTOCOL"] . " 404 Not Found" );
  111. header( "Status: 404 Not Found" );
  112. die();
  113. }
  114. }
  115. /**
  116. * @param $jobdest
  117. * @return mixed
  118. */
  119. public function file_get_list( $jobdest ) {
  120. list( $jobid, $dest ) = explode( '_', $jobdest, 2 );
  121. $filecounter = 0;
  122. $files = array();
  123. $backup_folder = BackWPup_Option::get( $jobid, 'backupdir' );
  124. $backup_folder = BackWPup_File::get_absolute_path( $backup_folder );
  125. if ( is_dir( $backup_folder ) ) { //make file list
  126. $dir = new BackWPup_Directory( $backup_folder );
  127. foreach ( $dir as $file ) {
  128. if ( $file->isDot() || in_array( $file->getFilename(), array( 'index.php', '.htaccess', '.donotbackup', 'Web.config' ), true ) || $file->isDir() || $file->isLink() ) {
  129. continue;
  130. }
  131. if ( $file->isReadable() ) {
  132. //file list for backups
  133. $files[ $filecounter ][ 'folder' ] = $backup_folder;
  134. $files[ $filecounter ][ 'file' ] = str_replace( '\\', '/', $file->getPathname() );
  135. $files[ $filecounter ][ 'filename' ] = $file->getFilename();
  136. $files[ $filecounter ][ 'downloadurl' ] = add_query_arg( array(
  137. 'page' => 'backwpupbackups',
  138. 'action' => 'downloadfolder',
  139. 'file' => $file->getFilename(),
  140. 'jobid' => $jobid
  141. ), network_admin_url( 'admin.php' ) );
  142. $files[ $filecounter ][ 'filesize' ] = $file->getSize();
  143. $files[ $filecounter ][ 'time' ] = $file->getMTime() + ( get_option( 'gmt_offset' ) * 3600 );
  144. $filecounter ++;
  145. }
  146. }
  147. }
  148. return $files;
  149. }
  150. /**
  151. * @param $job_object
  152. * @return bool
  153. */
  154. public function job_run_archive( BackWPup_Job $job_object ) {
  155. $job_object->substeps_todo = 1;
  156. if ( ! empty( $job_object->job[ 'jobid' ] ) )
  157. BackWPup_Option::update( $job_object->job[ 'jobid' ], 'lastbackupdownloadurl', add_query_arg( array(
  158. 'page' => 'backwpupbackups',
  159. 'action' => 'downloadfolder',
  160. 'file' => basename( $job_object->backup_file ),
  161. 'jobid' => $job_object->job[ 'jobid' ]
  162. ), network_admin_url( 'admin.php' ) ) );
  163. //Delete old Backupfiles
  164. $backupfilelist = array();
  165. $files = array();
  166. if ( is_writable( $job_object->backup_folder ) ) { //make file list
  167. try {
  168. $dir = new BackWPup_Directory( $job_object->backup_folder );
  169. foreach ( $dir as $file ) {
  170. if ( $file->isWritable() && ! $file->isDir() && ! $file->isLink() ) {
  171. //list for deletion
  172. if ( $job_object->is_backup_archive( $file->getFilename() ) && $job_object->owns_backup_archive( $file->getFilename() ) ) {
  173. $backupfilelist[ $file->getMTime() ] = clone $file;
  174. }
  175. }
  176. }
  177. }
  178. catch ( UnexpectedValueException $e ) {
  179. $job_object->log( sprintf( __( "Could not open path: %s", 'backwpup' ), $e->getMessage() ), E_USER_WARNING );
  180. }
  181. }
  182. if ( $job_object->job[ 'maxbackups' ] > 0 ) {
  183. if ( count( $backupfilelist ) > $job_object->job[ 'maxbackups' ] ) {
  184. ksort( $backupfilelist );
  185. $numdeltefiles = 0;
  186. while ( $file = array_shift( $backupfilelist ) ) {
  187. if ( count( $backupfilelist ) < $job_object->job[ 'maxbackups' ] )
  188. break;
  189. unlink( $file->getPathname() );
  190. foreach ( $files as $key => $filedata ) {
  191. if ( $filedata[ 'file' ] == $file->getPathname() ) {
  192. unset( $files[ $key ] );
  193. }
  194. }
  195. $numdeltefiles ++;
  196. }
  197. if ( $numdeltefiles > 0 )
  198. $job_object->log( sprintf( _n( 'One backup file deleted', '%d backup files deleted', $numdeltefiles, 'backwpup' ), $numdeltefiles ), E_USER_NOTICE );
  199. }
  200. }
  201. $job_object->substeps_done ++;
  202. return TRUE;
  203. }
  204. /**
  205. * @param $job_settings array
  206. * @return bool
  207. */
  208. public function can_run( array $job_settings ) {
  209. if ( empty( $job_settings[ 'backupdir' ] ) || $job_settings[ 'backupdir' ] == '/' )
  210. return FALSE;
  211. return TRUE;
  212. }
  213. }