PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 6.29
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v6.29
6.35 6.34 6.33.1 6.33 6.32.1 6.32 6.31 6.25 6.25.1 6.26 6.26.1 6.27 6.28 6.29 6.3 6.3.1 6.3.2 6.30 6.4 6.4.1 6.4.2 6.5 6.5.1 6.5.2 6.5.3 All 141 releases
formidable / classes / models / FrmCreateFile.php

FrmCreateFile.php in Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More 6.29, at classes/models/FrmCreateFile.php

317 lines 7.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 if ( ! defined( 'ABSPATH' ) ) {
3 die( 'You are not allowed to call this page directly.' );
4 }
5
6 class FrmCreateFile {
7
8 /**
9 * @var string
10 */
11 public $folder_name;
12
13 /**
14 * @var string
15 */
16 public $file_name;
17
18 /**
19 * @var string
20 */
21 public $error_message;
22
23 /**
24 * @var array
25 */
26 public $uploads;
27
28 /**
29 * @var string
30 */
31 private $new_file_path;
32
33 /**
34 * @var int
35 */
36 public $chmod_dir = 0755;
37
38 /**
39 * @var int
40 */
41 public $chmod_file = 0644;
42
43 /**
44 * @var bool
45 */
46 private $has_permission = false;
47
48 /**
49 * @param array $atts
50 */
51 public function __construct( $atts ) {
52 $this->folder_name = $atts['folder_name'] ?? '';
53 $this->file_name = $atts['file_name'];
54 $this->error_message = $atts['error_message'] ?? '';
55 $this->uploads = wp_upload_dir();
56 $this->set_new_file_path( $atts );
57 $this->chmod_dir = defined( 'FS_CHMOD_DIR' ) ? FS_CHMOD_DIR : ( fileperms( ABSPATH ) & 0777 | 0755 );
58 $this->chmod_file = defined( 'FS_CHMOD_FILE' ) ? FS_CHMOD_FILE : ( fileperms( ABSPATH . 'index.php' ) & 0777 | 0644 );
59
60 $this->check_permission();
61 }
62
63 /**
64 * @since 3.0
65 *
66 * @param array $atts Attributes.
67 *
68 * @return void
69 */
70 private function set_new_file_path( $atts ) {
71 if ( isset( $atts['new_file_path'] ) ) {
72 $this->new_file_path = $atts['new_file_path'] . '/' . $this->file_name;
73 } else {
74 $this->new_file_path = $this->uploads['basedir'] . '/' . $this->folder_name . '/' . $this->file_name;
75 }
76 }
77
78 /**
79 * @param string $file_content
80 *
81 * @return void
82 */
83 public function create_file( $file_content ) {
84 if ( ! $this->has_permission ) {
85 return;
86 }
87
88 $dirs_exist = true;
89
90 // Create the directories if need be.
91 $this->create_directories( $dirs_exist );
92
93 // Only write the file if the folders exist.
94 if ( ! $dirs_exist ) {
95 return;
96 }
97
98 global $wp_filesystem;
99 $wp_filesystem->put_contents( $this->new_file_path, $file_content, $this->chmod_file );
100 }
101
102 /**
103 * @since 3.0
104 *
105 * @param string $file_content File content.
106 *
107 * @return void
108 */
109 public function append_file( $file_content ) {
110 if ( ! $this->has_permission ) {
111 return;
112 }
113
114 if ( file_exists( $this->new_file_path ) ) {
115 $existing_content = $this->get_contents();
116 $file_content = $existing_content . $file_content;
117 }
118
119 $this->create_file( $file_content );
120 }
121
122 /**
123 * Combine an array of files into one
124 *
125 * @since 3.0
126 *
127 * @param array $file_names And array of file paths.
128 *
129 * @return void
130 */
131 public function combine_files( $file_names ) {
132 if ( ! $this->has_permission ) {
133 return;
134 }
135
136 $content = '';
137
138 foreach ( $file_names as $file_name ) {
139 $content .= $this->get_contents( $file_name ) . "\n";
140 }
141 $this->create_file( $content );
142 }
143
144 /**
145 * @since 3.0
146 *
147 * @return string
148 */
149 public function get_file_contents() {
150 return $this->has_permission ? $this->get_contents() : '';
151 }
152
153 /**
154 * @since 3.0
155 *
156 * @param string $file File.
157 *
158 * @return string
159 */
160 private function get_contents( $file = '' ) {
161 global $wp_filesystem;
162
163 if ( ! $file ) {
164 $file = $this->new_file_path;
165 }
166
167 return $wp_filesystem->get_contents( $file );
168 }
169
170 /**
171 * @since 3.0
172 *
173 * @return void
174 */
175 private function check_permission() {
176 $creds = $this->get_creds();
177
178 $this->has_permission = true;
179
180 if ( $creds && WP_Filesystem( $creds ) ) {
181 return;
182 }
183
184 // Initialize the API - any problems and we exit
185 $this->show_error_message();
186 $this->has_permission = false;
187 }
188
189 /**
190 * @param true $dirs_exist
191 *
192 * @return void
193 */
194 private function create_directories( &$dirs_exist ) {
195 global $wp_filesystem;
196
197 $needed_dirs = $this->get_needed_dirs();
198
199 foreach ( $needed_dirs as $_dir ) {
200 // Only check to see if the Dir exists upon creation failure. Less I/O this way.
201 if ( $wp_filesystem->mkdir( $_dir, $this->chmod_dir ) ) {
202 $index_path = $_dir . '/index.php';
203 $wp_filesystem->put_contents( $index_path, "<?php\n// Silence is golden.\n?>", $this->chmod_file );
204 } else {
205 $dirs_exist = $wp_filesystem->is_dir( $_dir );
206 }
207 }
208 }
209
210 /**
211 * @return string[]
212 */
213 private function get_needed_dirs() {
214 $dir_names = explode( '/', $this->folder_name );
215 $needed_dirs = array();
216 $next_dir = '';
217
218 foreach ( $dir_names as $dir ) {
219 $next_dir .= '/' . $dir;
220 $needed_dirs[] = $this->uploads['basedir'] . $next_dir;
221 }
222
223 return $needed_dirs;
224 }
225
226 /**
227 * @return array|bool
228 */
229 private function get_creds() {
230 if ( ! function_exists( 'get_filesystem_method' ) ) {
231 include_once ABSPATH . 'wp-admin/includes/file.php';
232 }
233
234 $access_type = get_filesystem_method();
235
236 if ( $access_type === 'direct' ) {
237 return request_filesystem_credentials( site_url() . '/wp-admin/', '', false, false, array() );
238 }
239
240 return $this->get_ftp_creds( $access_type );
241 }
242
243 /**
244 * @param string $type
245 *
246 * @return array|false
247 */
248 private function get_ftp_creds( $type ) {
249 $credentials = get_option(
250 'ftp_credentials',
251 array(
252 'hostname' => '',
253 'username' => '',
254 )
255 );
256
257 $credentials['hostname'] = defined( 'FTP_HOST' ) ? FTP_HOST : $credentials['hostname'];
258 $credentials['username'] = defined( 'FTP_USER' ) ? FTP_USER : $credentials['username'];
259 $credentials['password'] = defined( 'FTP_PASS' ) ? FTP_PASS : '';
260
261 // Check to see if we are setting the public/private keys for ssh.
262 $credentials['public_key'] = defined( 'FTP_PUBKEY' ) ? FTP_PUBKEY : '';
263 $credentials['private_key'] = defined( 'FTP_PRIKEY' ) ? FTP_PRIKEY : '';
264
265 // Sanitize the hostname, Some people might pass in odd-data.
266 // Strip any schemes off.
267 $credentials['hostname'] = preg_replace( '|\w+://|', '', $credentials['hostname'] );
268
269 if ( str_contains( $credentials['hostname'], ':' ) ) {
270 list( $credentials['hostname'], $credentials['port'] ) = explode( ':', $credentials['hostname'], 2 );
271
272 if ( ! is_numeric( $credentials['port'] ) ) {
273 unset( $credentials['port'] );
274 }
275 } else {
276 unset( $credentials['port'] );
277 }
278
279 if ( ( defined( 'FTP_SSH' ) && FTP_SSH ) || ( defined( 'FS_METHOD' ) && 'ssh2' === FS_METHOD ) ) {
280 $credentials['connection_type'] = 'ssh';
281 } elseif ( ( defined( 'FTP_SSL' ) && FTP_SSL ) && 'ftpext' === $type ) {
282 // Only the FTP Extension understands SSL.
283 $credentials['connection_type'] = 'ftps';
284 } elseif ( ! isset( $credentials['connection_type'] ) ) {
285 // All else fails (And it's not defaulted to something else saved), Default to FTP.
286 $credentials['connection_type'] = 'ftp';
287 }
288
289 $has_creds = ! empty( $credentials['password'] ) && ! empty( $credentials['username'] ) && ! empty( $credentials['hostname'] );
290 $can_ssh = 'ssh' === $credentials['connection_type'] && ! empty( $credentials['public_key'] ) && ! empty( $credentials['private_key'] );
291
292 if ( $has_creds || $can_ssh ) {
293 $stored_credentials = $credentials;
294
295 if ( ! empty( $stored_credentials['port'] ) ) {
296 // Save port as part of hostname to simplify above code.
297 $stored_credentials['hostname'] .= ':' . $stored_credentials['port'];
298 }
299
300 unset( $stored_credentials['password'], $stored_credentials['port'], $stored_credentials['private_key'], $stored_credentials['public_key'] );
301
302 return $credentials;
303 }
304
305 return false;
306 }
307
308 /**
309 * @return void
310 */
311 private function show_error_message() {
312 if ( $this->error_message ) {
313 echo '<div class="message">' . esc_html( $this->error_message ) . '</div>';
314 }
315 }
316 }
317