/** * trigger function. * * @access private * * @param mixed $download * * @return void */ private function trigger($download) { $version = $download->get_file_version(); $file_paths = $version->mirrors; // Check if we got files in this version if (empty($file_paths)) { wp_die(__('No file paths defined.', 'download-monitor') . ' <a href="' . home_url() . '">' . __('Go to homepage →', 'download-monitor') . '</a>', __('Download Error', 'download-monitor')); } // Get a random file (mirror) $file_path = $file_paths[array_rand($file_paths)]; // Check if we actually got a path if (!$file_path) { wp_die(__('No file paths defined.', 'download-monitor') . ' <a href="' . home_url() . '">' . __('Go to homepage →', 'download-monitor') . '</a>', __('Download Error', 'download-monitor')); } // Check Access if (!apply_filters('dlm_can_download', true, $download, $version)) { // Check if we need to redirect if visitor don't have access to file if ($redirect = apply_filters('dlm_access_denied_redirect', false)) { wp_redirect($redirect); exit; } else { // get 'no access' page id $no_access_page_id = get_option('dlm_no_access_page', 0); // check if a no access page is set if ($no_access_page_id > 0) { // get permalink of no access page $no_access_permalink = get_permalink($no_access_page_id); // check if we can find a permalink if (false !== $no_access_permalink) { // append download id to no access URL $no_access_permalink = untrailingslashit($no_access_permalink) . '/download-id/' . $download->id . '/'; // redirect to no access page wp_redirect($no_access_permalink); exit; // out } } // if we get to this point, we have no proper 'no access' page. Fallback to default wp_die wp_die(wp_kses_post(get_option('dlm_no_access_error', '')), __('Download Error', 'download-monitor'), array('response' => 200)); } exit; } // check if user downloaded this version in the past minute if (false == DLM_Cookie_Manager::exists($download)) { // DLM Logging object $logger = new DLM_Logging(); // bool if we need to increment download count $increment_download_count = true; // check if unique ips option is enabled and if so, if visitor already downloaded this file version if ($logger->is_logging_enabled() && $logger->is_count_unique_ips_only() && true === $logger->has_ip_downloaded_version($version)) { $increment_download_count = false; } // check if we need to increment the download count if (true === $increment_download_count) { // Increase download count $version->increase_download_count(); } // Trigger Download Action do_action('dlm_downloading', $download, $version, $file_path); // Set cookie to prevent double logging DLM_Cookie_Manager::set_cookie($download); } // Redirect to the file... if ($download->redirect_only() || apply_filters('dlm_do_not_force', false, $download, $version)) { $this->log('download', 'redirected', __('Redirected to file', 'download-monitor'), $download, $version); // Ensure we have a valid URL, not a file path $file_path = str_replace(ABSPATH, site_url('/', 'http'), $file_path); header('Location: ' . $file_path); exit; } // File Manager $file_manager = new DLM_File_Manager(); // Parse file path list($file_path, $remote_file) = $file_manager->parse_file_path($file_path); $this->download_headers($file_path, $download, $version); if (get_option('dlm_xsendfile_enabled')) { if (function_exists('apache_get_modules') && in_array('mod_xsendfile', apache_get_modules())) { $this->log('download', 'redirected', __('Redirected to file', 'download-monitor'), $download, $version); header("X-Sendfile: {$file_path}"); exit; } elseif (stristr(getenv('SERVER_SOFTWARE'), 'lighttpd')) { $this->log('download', 'redirected', __('Redirected to file', 'download-monitor'), $download, $version); header("X-LIGHTTPD-send-file: {$file_path}"); exit; } elseif (stristr(getenv('SERVER_SOFTWARE'), 'nginx') || stristr(getenv('SERVER_SOFTWARE'), 'cherokee')) { $this->log('download', 'redirected', __('Redirected to file', 'download-monitor'), $download, $version); $file_path = str_ireplace($_SERVER['DOCUMENT_ROOT'], '', $file_path); header("X-Accel-Redirect: /{$file_path}"); exit; } } // multipart-download and download resuming support - http://www.phpgang.com/force-to-download-a-file-in-php_112.html if (isset($_SERVER['HTTP_RANGE']) && $version->filesize) { list($a, $range) = explode("=", $_SERVER['HTTP_RANGE'], 2); list($range) = explode(",", $range, 2); list($range, $range_end) = explode("-", $range); $range = intval($range); if (!$range_end) { $range_end = $version->filesize - 1; } else { $range_end = intval($range_end); } $new_length = $range_end - $range; header("HTTP/1.1 206 Partial Content"); header("Content-Length: {$new_length}"); header("Content-Range: bytes {$range}-{$range_end}/{$version->filesize}"); } else { $range = false; } if ($this->readfile_chunked($file_path, $range)) { // Complete! $this->log('download', 'completed', '', $download, $version); } elseif ($remote_file) { // Redirect - we can't track if this completes or not $this->log('download', 'redirected', __('Redirected to remote file.', 'download-monitor'), $download, $version); header('Location: ' . $file_path); } else { $this->log('download', 'failed', __('File not found.', 'download-monitor'), $download, $version); wp_die(__('File not found.', 'download-monitor') . ' <a href="' . home_url() . '">' . __('Go to homepage →', 'download-monitor') . '</a>', __('Download Error', 'download-monitor'), array('response' => 404)); } exit; }
/** * media_browser function. * * @access public * @return void */ public function media_browser() { // File Manager $file_manager = new DLM_File_Manager(); // Files $files = $file_manager->list_files(ABSPATH, 1); echo '<!DOCTYPE html><html lang="en"><head><title>' . __('Browse for a file', 'download-monitor') . '</title>'; wp_enqueue_style('download_monitor_admin_css', WP_DLM::get_plugin_url() . '/assets/css/admin.css', array('dashicons')); do_action('admin_print_styles'); do_action('admin_print_scripts'); do_action('admin_head'); echo '<meta charset="utf-8" /></head><body>'; echo '<ul class="download_monitor_file_browser">'; foreach ($files as $found_file) { $file = pathinfo($found_file['path']); if ($found_file['type'] == 'folder') { echo '<li><a href="#" class="folder" data-path="' . trailingslashit($file['dirname']) . $file['basename'] . '">' . $file['basename'] . '</a></li>'; } else { $filename = $file['basename']; $extension = empty($file['extension']) ? '' : $file['extension']; if (substr($filename, 0, 1) == '.') { continue; } // Ignore files starting with . like htaccess if (in_array($extension, array('', 'php', 'html', 'htm', 'tmp'))) { continue; } // Ignored file types echo '<li><a href="#" class="file filetype-' . sanitize_title($extension) . '" data-path="' . trailingslashit($file['dirname']) . $file['basename'] . '">' . $file['basename'] . '</a></li>'; } } echo '</ul>'; ?> <script type="text/javascript"> jQuery( function () { jQuery( '.download_monitor_file_browser' ).on( 'click', 'a', function () { var $link = jQuery( this ); var $parent = $link.closest( 'li' ); if ( $link.is( '.file' ) ) { var win = window.dialogArguments || opener || parent || top; win.send_to_editor( $link.attr( 'data-path' ) ); } else if ( $link.is( '.folder_open' ) ) { $parent.find( 'ul' ).remove(); $link.removeClass( 'folder_open' ); } else { $link.after( '<ul class="load_tree loading"></ul>' ); var data = { action: 'download_monitor_list_files', path: jQuery( this ).attr( 'data-path' ), security: '<?php echo wp_create_nonce("list-files"); ?> ' }; jQuery.post( '<?php echo admin_url('admin-ajax.php'); ?> ', data, function ( response ) { $link.addClass( 'folder_open' ); if ( response ) { $parent.find( '.load_tree' ).html( response ); } else { $parent.find( '.load_tree' ).html( '<li class="nofiles"><?php _e('No files found', 'download-monitor'); ?> </li>' ); } $parent.find( '.load_tree' ).removeClass( 'load_tree loading' ); } ); } return false; } ); } ); </script> <?php echo '</body></html>'; }
/** * list_files function. * * @access public * @return void */ public function list_files() { // Check Nonce check_ajax_referer('list-files', 'security'); // Check user rights if (!current_user_can('manage_downloads')) { return false; } $path = esc_attr(stripslashes($_POST['path'])); if ($path) { // The File Manager $file_manager = new DLM_File_Manager(); // List all files $files = $file_manager->list_files($path); foreach ($files as $found_file) { // Multi-byte-safe pathinfo $file = $file_manager->mb_pathinfo($found_file['path']); if ($found_file['type'] == 'folder') { echo '<li><a href="#" class="folder" data-path="' . trailingslashit($file['dirname']) . $file['basename'] . '">' . $file['basename'] . '</a></li>'; } else { $filename = $file['basename']; $extension = empty($file['extension']) ? '' : $file['extension']; if (substr($filename, 0, 1) == '.') { continue; } // Ignore files starting with . like htaccess if (in_array($extension, array('', 'php', 'html', 'htm', 'tmp'))) { continue; } // Ignored file types echo '<li><a href="#" class="file filetype-' . sanitize_title($extension) . '" data-path="' . trailingslashit($file['dirname']) . $file['basename'] . '">' . $file['basename'] . '</a></li>'; } } } die; }
/** * get_file_hashes function. * * @access public * * @param string $file_path * * @return array */ public function get_file_hashes($file_path) { // File Manager $file_manager = new DLM_File_Manager(); // Get the hashes $hashes = $file_manager->get_file_hashes($file_path); update_post_meta($this->id, '_md5', $hashes['md5']); update_post_meta($this->id, '_sha1', $hashes['sha1']); update_post_meta($this->id, '_crc32', $hashes['crc32']); return $hashes; }
/** * Fallback for PHP < 5.4 where JSON_UNESCAPED_UNICODE does not exist. * * @deprecated 1.6.0 * * @param array $matches * * @return string */ public function json_unscaped_unicode_fallback($matches) { // Deprecated DLM_Debug_Logger::deprecated(__METHOD__); // File Manger $file_manager = new DLM_File_Manager(); // Return files return $file_manager->json_unscaped_unicode_fallback($matches); }
/** * media_browser function. * * @access public * @return void */ public function media_browser() { // Enqueue scripts and styles for panel wp_enqueue_style('download_monitor_admin_css', WP_DLM::get_plugin_url() . '/assets/css/admin.css', array('dashicons')); wp_enqueue_script('common'); wp_enqueue_style('global'); wp_enqueue_style('wp-admin'); wp_enqueue_style('colors'); wp_enqueue_script('plupload-all'); echo '<!DOCTYPE html><html lang="en"><head><title>' . __('Insert Download', 'download-monitor') . '</title><meta charset="utf-8" />'; do_action('admin_print_styles'); do_action('admin_print_scripts'); do_action('admin_head'); echo '<body id="insert-download" class="wp-core-ui">'; ?> <h2 class="nav-tab-wrapper"> <a href="#insert-shortcode" class="nav-tab nav-tab-active"><?php _e('Insert Shortcode', 'download-monitor'); ?> </a><a href="#quick-add" class="nav-tab"><?php _e('Quick-add download', 'download-monitor'); ?> </a> </h2> <?php // Handle quick-add form if (!empty($_POST['download_url']) && !empty($_POST['download_title']) && wp_verify_nonce($_POST['quick-add-nonce'], 'quick-add')) { $url = stripslashes($_POST['download_url']); $title = sanitize_text_field(stripslashes($_POST['download_title'])); $version = sanitize_text_field(stripslashes($_POST['download_version'])); try { $download = array('post_title' => $title, 'post_content' => '', 'post_status' => 'publish', 'post_author' => get_current_user_id(), 'post_type' => 'dlm_download'); $download_id = wp_insert_post($download); if ($download_id) { // Meta update_post_meta($download_id, '_featured', 'no'); update_post_meta($download_id, '_members_only', 'no'); update_post_meta($download_id, '_redirect_only', 'no'); update_post_meta($download_id, '_download_count', 0); // File $file = array('post_title' => 'Download #' . $download_id . ' File Version', 'post_content' => '', 'post_status' => 'publish', 'post_author' => get_current_user_id(), 'post_parent' => $download_id, 'post_type' => 'dlm_download_version'); $file_id = wp_insert_post($file); if (!$file_id) { throw new Exception(__('Error: File was not created.', 'download-monitor')); } // File Manager $file_manager = new DLM_File_Manager(); // Meta update_post_meta($file_id, '_version', $version); update_post_meta($file_id, '_filesize', $file_manager->get_file_size($url)); update_post_meta($file_id, '_files', $file_manager->json_encode_files(array($url))); // Hashes $hashes = $file_manager->get_file_hashes($url); // Set hashes update_post_meta($file_id, '_md5', $hashes['md5']); update_post_meta($file_id, '_sha1', $hashes['sha1']); update_post_meta($file_id, '_crc32', $hashes['crc32']); // Success message echo '<div class="updated"><p>' . __('Download successfully created.', 'download-monitor') . '</p></div>'; } else { throw new Exception(__('Error: Download was not created.', 'download-monitor')); } } catch (Exception $e) { echo '<div class="error"><p>' . $e->getMessage() . "</p></div>"; } } // Get all downloads $downloads = get_posts(array('post_status' => 'publish', 'post_type' => 'dlm_download', 'orderby' => 'ID', 'posts_per_page' => -1)); ?> <form id="insert-shortcode"> <fieldset> <legend><?php _e('Choose a download', 'download-monitor'); ?> :</legend> <?php $limit = 10; $page = isset($_GET['paged']) ? absint($_GET['paged']) : 1; $dlm_query = new WP_Query(array('post_status' => 'publish', 'post_type' => 'dlm_download', 'posts_per_page' => $limit, 'offset' => ($page - 1) * $limit)); while ($dlm_query->have_posts()) { $dlm_query->the_post(); $download = new DLM_Download($dlm_query->post->ID); echo '<label><input name="download_id" class="radio" type="radio" value="' . absint($download->id) . '" /> #' . $download->id . ' – ' . $download->get_the_title() . ' – ' . $download->get_the_filename() . '</label>'; } if ($dlm_query->max_num_pages > 1) { echo paginate_links(apply_filters('download_monitor_pagination_args', array('base' => str_replace(999999999, '%#%', get_pagenum_link(999999999, false)), 'format' => '', 'current' => $page, 'total' => $dlm_query->max_num_pages, 'prev_text' => '←', 'next_text' => '→', 'type' => 'list', 'end_size' => 3, 'mid_size' => 3))); } ?> </fieldset> <p> <label for="template_name"><?php _e('Template', 'download-monitor'); ?> :</label> <input type="text" id="template_name" value="" class="input" placeholder="<?php _e('Template Name', 'download-monitor'); ?> "/> <span class="description"> <?php _e('Leaving this blank will use the default <code>content-download.php</code> template file. If you enter, for example, <code>image</code>, the <code>content-download-image.php</code> template will be used instead.', 'download-monitor'); ?> </span> </p> <p> <input type="button" class="button insert_download button-primary button-large" value="<?php _e('Insert Shortcode', 'download-monitor'); ?> "/> </p> </form> <form id="quick-add" action="" method="post"> <!-- Uploader section --> <div id="plupload-upload-ui" class="hide-if-no-js"> <div id="drag-drop-area" style="height:240px"> <div class="drag-drop-inside"> <p class="drag-drop-info"><?php _e('Drop file here', 'download-monitor'); ?> </p> <p><?php echo _x('or', 'Drop file here *or* select file', 'download-monitor'); ?> </p> <p class="drag-drop-buttons"><input id="plupload-browse-button" type="button" value="<?php esc_attr_e('Select File', 'download-monitor'); ?> " class="button"/></p> </div> </div> <p><a href="#" class="add_manually"><?php _e('Enter URL manually', 'download-monitor'); ?> →</a> </p> </div> <div id="quick-add-details" style="display:none"> <p> <label for="download_url"><?php _e('Download URL', 'download-monitor'); ?> :</label> <input type="text" name="download_url" id="download_url" value="" class="download_url input" placeholder="<?php _e('Required URL', 'download-monitor'); ?> "/> </p> <p> <label for="download_title"><?php _e('Download Title', 'download-monitor'); ?> :</label> <input type="text" name="download_title" id="download_title" value="" class="download_title input" placeholder="<?php _e('Required title', 'download-monitor'); ?> "/> </p> <p> <label for="download_version"><?php _e('Version', 'download-monitor'); ?> :</label> <input type="text" name="download_version" id="download_version" value="" class="input" placeholder="<?php _e('Optional version number', 'download-monitor'); ?> "/> </p> <p> <input type="submit" class="button button-primary button-large" value="<?php _e('Save Download', 'download-monitor'); ?> "/> <?php wp_nonce_field('quick-add', 'quick-add-nonce'); ?> </p> </div> </form> <script type="text/javascript"> jQuery( function () { jQuery( '.nav-tab-wrapper a' ).click( function () { jQuery( '#insert-shortcode, #quick-add' ).hide(); jQuery( jQuery( this ).attr( 'href' ) ).show(); jQuery( 'a.nav-tab-active' ).removeClass( 'nav-tab-active' ); jQuery( this ).addClass( 'nav-tab-active' ); return false; } ); jQuery( '#quick-add' ).hide(); jQuery( 'body' ).on( 'click', '.insert_download', function () { var win = window.dialogArguments || opener || parent || top; var download_id = jQuery( 'input[name="download_id"]:checked' ).val(); var template = jQuery( '#template_name' ).val(); var shortcode = '[download id="' + download_id + '"'; if ( template ) shortcode = shortcode + ' template="' + template + '"'; shortcode = shortcode + ']'; win.send_to_editor( shortcode ); return false; } ); jQuery( '.add_manually' ).click( function () { jQuery( '#plupload-upload-ui' ).slideUp(); jQuery( '#quick-add-details' ).slideDown(); return false; } ); <?php $plupload_init = array('runtimes' => 'html5,silverlight,flash,html4', 'browse_button' => 'plupload-browse-button', 'container' => 'plupload-upload-ui', 'drop_element' => 'drag-drop-area', 'file_data_name' => 'async-upload', 'multiple_queues' => false, 'max_file_size' => wp_max_upload_size() . 'b', 'url' => admin_url('admin-ajax.php'), 'flash_swf_url' => includes_url('js/plupload/plupload.flash.swf'), 'silverlight_xap_url' => includes_url('js/plupload/plupload.silverlight.xap'), 'filters' => array(array('title' => __('Allowed Files'), 'extensions' => '*')), 'multipart' => true, 'urlstream_upload' => true, 'multipart_params' => array('_ajax_nonce' => wp_create_nonce('file-upload'), 'action' => 'download_monitor_insert_panel_upload', 'type' => 'dlm_download')); // we should probably not apply this filter, plugins may expect wp's media uploader... $plupload_init = apply_filters('plupload_init', $plupload_init); ?> // create the uploader and pass the config from above var uploader = new plupload.Uploader( <?php echo json_encode($plupload_init); ?> ); // checks if browser supports drag and drop upload, makes some css adjustments if necessary uploader.bind( 'Init', function ( up ) { var uploaddiv = jQuery( '#plupload-upload-ui' ); if ( up.features.dragdrop ) { uploaddiv.addClass( 'drag-drop' ); jQuery( '#drag-drop-area' ) .bind( 'dragover.wp-uploader', function () { uploaddiv.addClass( 'drag-over' ); } ) .bind( 'dragleave.wp-uploader, drop.wp-uploader', function () { uploaddiv.removeClass( 'drag-over' ); } ); } else { uploaddiv.removeClass( 'drag-drop' ); jQuery( '#drag-drop-area' ).unbind( '.wp-uploader' ); } } ); uploader.init(); // a file was added in the queue uploader.bind( 'FilesAdded', function ( up, files ) { var hundredmb = 100 * 1024 * 1024, max = parseInt( up.settings.max_file_size, 10 ); plupload.each( files, function ( file ) { if ( max > hundredmb && file.size > hundredmb && up.runtime != 'html5' ) { // file size error? } else { jQuery( '.drag-drop-inside' ).html( '<p><?php _e('Please wait...', 'download-monitor'); ?> </p>' ); } } ); up.refresh(); up.start(); } ); // a file was uploaded uploader.bind( 'FileUploaded', function ( up, file, response ) { jQuery( '#quick-add-details' ).find( 'input.download_url' ).val( response.response ); jQuery( '#quick-add-details' ).find( 'input.download_title' ).val( basename( response.response ) ); jQuery( '#plupload-upload-ui' ).slideUp(); jQuery( '#quick-add-details' ).slideDown(); } ); function basename( path ) { return path.split( '/' ).reverse()[ 0 ]; } } ); </script> <?php echo '</body></html>'; }
/** * save function. * * @access public * * @param int $post_id * @param WP_Post $post * * @return void */ public function save_meta_boxes($post_id, $post) { global $wpdb; // Update options $_featured = isset($_POST['_featured']) ? 'yes' : 'no'; $_members_only = isset($_POST['_members_only']) ? 'yes' : 'no'; $_redirect_only = isset($_POST['_redirect_only']) ? 'yes' : 'no'; update_post_meta($post_id, '_featured', $_featured); update_post_meta($post_id, '_members_only', $_members_only); update_post_meta($post_id, '_redirect_only', $_redirect_only); $total_download_count = 0; // Process files if (isset($_POST['downloadable_file_id'])) { $downloadable_file_id = $_POST['downloadable_file_id']; $downloadable_file_menu_order = $_POST['downloadable_file_menu_order']; $downloadable_file_version = $_POST['downloadable_file_version']; $downloadable_file_urls = $_POST['downloadable_file_urls']; $downloadable_file_date = $_POST['downloadable_file_date']; $downloadable_file_date_hour = $_POST['downloadable_file_date_hour']; $downloadable_file_date_minute = $_POST['downloadable_file_date_minute']; $downloadable_file_download_count = $_POST['downloadable_file_download_count']; for ($i = 0; $i <= max(array_keys($downloadable_file_id)); $i++) { if (!isset($downloadable_file_id[$i])) { continue; } $file_id = absint($downloadable_file_id[$i]); $file_menu_order = absint($downloadable_file_menu_order[$i]); $file_version = strtolower(sanitize_text_field($downloadable_file_version[$i])); $file_date_hour = absint($downloadable_file_date_hour[$i]); $file_date_minute = absint($downloadable_file_date_minute[$i]); $file_date = sanitize_text_field($downloadable_file_date[$i]); $file_download_count = sanitize_text_field($downloadable_file_download_count[$i]); $files = array_filter(array_map('trim', explode("\n", $downloadable_file_urls[$i]))); if (!$file_id) { continue; } // Generate a useful post title $file_post_title = 'Download #' . $post_id . ' File Version'; // Generate date if (empty($file_date)) { $date = current_time('timestamp'); } else { $date = strtotime($file_date . ' ' . $file_date_hour . ':' . $file_date_minute . ':00'); } // Update $wpdb->update($wpdb->posts, array('post_status' => 'publish', 'post_title' => $file_post_title, 'menu_order' => $file_menu_order, 'post_date' => date('Y-m-d H:i:s', $date), 'post_date_gmt' => date('Y-m-d H:i:s', $date)), array('ID' => $file_id)); // File Manager $file_manager = new DLM_File_Manager(); // Update post meta update_post_meta($file_id, '_version', $file_version); update_post_meta($file_id, '_files', $file_manager->json_encode_files($files)); $filesize = -1; $main_file_path = current($files); if ($main_file_path) { $filesize = $file_manager->get_file_size($main_file_path); $hashes = $file_manager->get_file_hashes($main_file_path); update_post_meta($file_id, '_filesize', $filesize); update_post_meta($file_id, '_md5', $hashes['md5']); update_post_meta($file_id, '_sha1', $hashes['sha1']); update_post_meta($file_id, '_crc32', $hashes['crc32']); } else { update_post_meta($file_id, '_filesize', $filesize); update_post_meta($file_id, '_md5', ''); update_post_meta($file_id, '_sha1', ''); update_post_meta($file_id, '_crc32', ''); } if ($file_download_count !== '') { update_post_meta($file_id, '_download_count', absint($file_download_count)); $total_download_count += absint($file_download_count); } else { $total_download_count += absint(get_post_meta($file_id, '_download_count', true)); } do_action('dlm_save_downloadable_file', $file_id, $i); } } // Sync download_count update_post_meta($post_id, '_download_count', $total_download_count); // Delete transients delete_transient('dlm_file_version_ids_' . $post_id); do_action('dlm_save_metabox', $post_id, $post); }