PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 6.28
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v6.28
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.28, at classes/models/FrmCreateFile.php

313 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 if ( file_exists( $this->new_file_path ) ) {
112 $existing_content = $this->get_contents();
113 $file_content = $existing_content . $file_content;
114 }
115
116 $this->create_file( $file_content );
117 }
118 }
119
120 /**
121 * Combine an array of files into one
122 *
123 * @since 3.0
124 *
125 * @param array $file_names And array of file paths.
126 *
127 * @return void
128 */
129 public function combine_files( $file_names ) {
130 if ( $this->has_permission ) {
131 $content = '';
132
133 foreach ( $file_names as $file_name ) {
134 $content .= $this->get_contents( $file_name ) . "\n";
135 }
136 $this->create_file( $content );
137 }
138 }
139
140 /**
141 * @since 3.0
142 *
143 * @return string
144 */
145 public function get_file_contents() {
146 return $this->has_permission ? $this->get_contents() : '';
147 }
148
149 /**
150 * @since 3.0
151 *
152 * @param string $file File.
153 *
154 * @return string
155 */
156 private function get_contents( $file = '' ) {
157 global $wp_filesystem;
158
159 if ( ! $file ) {
160 $file = $this->new_file_path;
161 }
162
163 return $wp_filesystem->get_contents( $file );
164 }
165
166 /**
167 * @since 3.0
168 *
169 * @return void
170 */
171 private function check_permission() {
172 $creds = $this->get_creds();
173
174 $this->has_permission = true;
175
176 if ( $creds && WP_Filesystem( $creds ) ) {
177 return;
178 }
179
180 // Initialize the API - any problems and we exit
181 $this->show_error_message();
182 $this->has_permission = false;
183 }
184
185 /**
186 * @param true $dirs_exist
187 *
188 * @return void
189 */
190 private function create_directories( &$dirs_exist ) {
191 global $wp_filesystem;
192
193 $needed_dirs = $this->get_needed_dirs();
194
195 foreach ( $needed_dirs as $_dir ) {
196 // Only check to see if the Dir exists upon creation failure. Less I/O this way.
197 if ( $wp_filesystem->mkdir( $_dir, $this->chmod_dir ) ) {
198 $index_path = $_dir . '/index.php';
199 $wp_filesystem->put_contents( $index_path, "<?php\n// Silence is golden.\n?>", $this->chmod_file );
200 } else {
201 $dirs_exist = $wp_filesystem->is_dir( $_dir );
202 }
203 }
204 }
205
206 /**
207 * @return string[]
208 */
209 private function get_needed_dirs() {
210 $dir_names = explode( '/', $this->folder_name );
211 $needed_dirs = array();
212 $next_dir = '';
213
214 foreach ( $dir_names as $dir ) {
215 $next_dir .= '/' . $dir;
216 $needed_dirs[] = $this->uploads['basedir'] . $next_dir;
217 }
218
219 return $needed_dirs;
220 }
221
222 /**
223 * @return array|bool
224 */
225 private function get_creds() {
226 if ( ! function_exists( 'get_filesystem_method' ) ) {
227 include_once ABSPATH . 'wp-admin/includes/file.php';
228 }
229
230 $access_type = get_filesystem_method();
231
232 if ( $access_type === 'direct' ) {
233 return request_filesystem_credentials( site_url() . '/wp-admin/', '', false, false, array() );
234 }
235
236 return $this->get_ftp_creds( $access_type );
237 }
238
239 /**
240 * @param string $type
241 *
242 * @return array|false
243 */
244 private function get_ftp_creds( $type ) {
245 $credentials = get_option(
246 'ftp_credentials',
247 array(
248 'hostname' => '',
249 'username' => '',
250 )
251 );
252
253 $credentials['hostname'] = defined( 'FTP_HOST' ) ? FTP_HOST : $credentials['hostname'];
254 $credentials['username'] = defined( 'FTP_USER' ) ? FTP_USER : $credentials['username'];
255 $credentials['password'] = defined( 'FTP_PASS' ) ? FTP_PASS : '';
256
257 // Check to see if we are setting the public/private keys for ssh.
258 $credentials['public_key'] = defined( 'FTP_PUBKEY' ) ? FTP_PUBKEY : '';
259 $credentials['private_key'] = defined( 'FTP_PRIKEY' ) ? FTP_PRIKEY : '';
260
261 // Sanitize the hostname, Some people might pass in odd-data.
262 // Strip any schemes off.
263 $credentials['hostname'] = preg_replace( '|\w+://|', '', $credentials['hostname'] );
264
265 if ( str_contains( $credentials['hostname'], ':' ) ) {
266 list( $credentials['hostname'], $credentials['port'] ) = explode( ':', $credentials['hostname'], 2 );
267
268 if ( ! is_numeric( $credentials['port'] ) ) {
269 unset( $credentials['port'] );
270 }
271 } else {
272 unset( $credentials['port'] );
273 }
274
275 if ( ( defined( 'FTP_SSH' ) && FTP_SSH ) || ( defined( 'FS_METHOD' ) && 'ssh2' === FS_METHOD ) ) {
276 $credentials['connection_type'] = 'ssh';
277 } elseif ( ( defined( 'FTP_SSL' ) && FTP_SSL ) && 'ftpext' === $type ) {
278 // Only the FTP Extension understands SSL.
279 $credentials['connection_type'] = 'ftps';
280 } elseif ( ! isset( $credentials['connection_type'] ) ) {
281 // All else fails (And it's not defaulted to something else saved), Default to FTP.
282 $credentials['connection_type'] = 'ftp';
283 }
284
285 $has_creds = ! empty( $credentials['password'] ) && ! empty( $credentials['username'] ) && ! empty( $credentials['hostname'] );
286 $can_ssh = 'ssh' === $credentials['connection_type'] && ! empty( $credentials['public_key'] ) && ! empty( $credentials['private_key'] );
287
288 if ( $has_creds || $can_ssh ) {
289 $stored_credentials = $credentials;
290
291 if ( ! empty( $stored_credentials['port'] ) ) {
292 // Save port as part of hostname to simplify above code.
293 $stored_credentials['hostname'] .= ':' . $stored_credentials['port'];
294 }
295
296 unset( $stored_credentials['password'], $stored_credentials['port'], $stored_credentials['private_key'], $stored_credentials['public_key'] );
297
298 return $credentials;
299 }
300
301 return false;
302 }
303
304 /**
305 * @return void
306 */
307 private function show_error_message() {
308 if ( ! empty( $this->error_message ) ) {
309 echo '<div class="message">' . esc_html( $this->error_message ) . '</div>';
310 }
311 }
312 }
313