PluginProbe
Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder / 2.9.1
Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder v2.9.1
V-3.3.0 3.2.2 3.2.1 3.2.0 3.1.4 3.1.3 3.1.2 3.1.1 3.1.0 V3.0.3 V3.0.2 -3.0.1 V_3.0.0 1.1.1 1.1.8 1.2 1.3 1.4 1.4.18 1.5.2 1.9 2.0 2.10.0 2.10.1 2.10.2 All 137 releases
bit-form / includes / Core / Util / FileDownloadProvider.php

FileDownloadProvider.php in Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder 2.9.1, at includes/Core/Util/FileDownloadProvider.php

151 lines 4.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace BitCode\BitForm\Core\Util;
4
5 final class FileDownloadProvider
6 {
7 public function register()
8 {
9 add_action('template_redirect', [$this, 'authCheckandFrceDownloadHelper']);
10 add_shortcode('bitforms-frontend-file', [$this, 'handleFileDownload']);
11 }
12
13 public function handleFileDownload()
14 {
15 if (!isset($_GET['formID']) || !isset($_GET['entryID']) || !isset($_GET['fileID'])) {
16 global $wp_query;
17 $wp_query->set_404();
18 status_header(404);
19 get_template_part(404);
20 exit();
21 }
22 $formID = intval(sanitize_text_field($_GET['formID']));
23 $entryID = intval(sanitize_text_field($_GET['entryID']));
24 $fileID = sanitize_file_name($_GET['fileID']);
25 $filePath = BITFORMS_UPLOAD_DIR . DIRECTORY_SEPARATOR . $formID . DIRECTORY_SEPARATOR . $entryID . DIRECTORY_SEPARATOR . $fileID;
26 if (is_readable($filePath)) {
27 $this->fileDownloadORView($filePath, true);
28 }
29 }
30
31 public static function getBaseDownloadURL()
32 {
33 $routes = get_option('bitforms_routes');
34 if (isset($routes['file'])) {
35 $file_page = get_post($routes['file']);
36 if (empty($file_page)) {
37 $file_route_id = wp_insert_post(
38 [
39 'post_name' => 'bitforms-file',
40 'comment_status' => 'closed',
41 'ping_status' => 'closed',
42 'post_content' => '<!-- wp:shortcode -->[bitforms-frontend-file /]<!-- /wp:shortcode -->',
43 'post_status' => 'publish',
44 'post_type' => 'bitforms'
45 ]
46 );
47 $routes['file'] = $file_route_id;
48 update_option('bitforms_routes', $routes);
49 $file_page_slug = get_post_permalink($file_route_id);
50 } else {
51 $file_page_slug = get_post_permalink($file_page->ID);
52 }
53 } else {
54 $file_route_id = wp_insert_post(
55 [
56 'post_name' => 'bitforms-file',
57 'comment_status' => 'closed',
58 'ping_status' => 'closed',
59 'post_content' => '<!-- wp:shortcode -->[bitforms-frontend-file /]<!-- /wp:shortcode -->',
60 'post_status' => 'publish',
61 'post_type' => 'bitforms'
62 ]
63 );
64 $route_value = [];
65 $route_value['file'] = $file_route_id;
66 update_option('bitforms_routes', $route_value);
67 $file_page_slug = get_post_permalink($file_route_id);
68 }
69
70 return $file_page_slug;
71 }
72
73 public function authCheckandFrceDownloadHelper()
74 {
75 if (!is_singular('bitforms')) {
76 return;
77 }
78 global $post;
79 if (!empty($post->post_content)) {
80 $shortCodeRegex = get_shortcode_regex();
81 preg_match_all('/' . $shortCodeRegex . '/', $post->post_content, $regexMatchGroups);
82 if (!empty($regexMatchGroups[2]) && in_array('bitforms-frontend-file', $regexMatchGroups[2]) && is_user_logged_in()) {
83 $file = $this->isRequestedFileExists();
84 if ($file) {
85 $this->fileDownloadORView($file, isset($_GET['download']));
86 } else {
87 $this->show404();
88 }
89 } else {
90 auth_redirect();
91 }
92 }
93 }
94
95 private function show404()
96 {
97 global $wp_query;
98 $wp_query->set_404();
99 status_header(404);
100 get_template_part(404);
101 exit();
102 }
103
104 private function isRequestedFileExists()
105 {
106 if (!isset($_GET['formID']) || !isset($_GET['entryID']) || !isset($_GET['fileID'])) {
107 return false;
108 }
109 $formID = intval(sanitize_text_field($_GET['formID']));
110 $entryID = intval(sanitize_text_field($_GET['entryID']));
111 $fileID = sanitize_file_name($_GET['fileID']);
112 $filePath = BITFORMS_UPLOAD_DIR . DIRECTORY_SEPARATOR . $formID . DIRECTORY_SEPARATOR . $entryID . DIRECTORY_SEPARATOR . $fileID;
113 if (is_readable($filePath)) {
114 return $filePath;
115 }
116
117 return false;
118 }
119
120 private function fileDownloadORView($filePath, $forceDownload = false)
121 {
122 if ($forceDownload) {
123 header('Content-Type: application/force-download');
124 header('Content-Type: application/octet-stream');
125 header('Content-Type: application/download');
126 header('Content-Disposition: attachment; filename="' . basename($filePath) . '"');
127 } else {
128 $fileInfo = wp_check_filetype($filePath);
129 $content_types = 'text/plain';
130 if ($fileInfo['type'] && $fileInfo['ext']) {
131 $content_types = $fileInfo['type'];
132 $ext = $fileInfo['ext'];
133 if (in_array($ext[1], ['txt', 'php', 'html', 'xhtml', 'json'])) {
134 $content_types = 'text/plain';
135 }
136 }
137 header('Content-Disposition:filename="' . basename($filePath) . '"');
138 header("Content-Type: $content_types");
139 }
140 header('Content-Description: File Transfer');
141 header('Expires: 0');
142 header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
143 header('Pragma: public');
144 header('Content-Length: ' . filesize($filePath));
145 header('Content-Transfer-Encoding: binary ');
146 flush();
147 readfile($filePath);
148 die();
149 }
150 }
151