PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 6.34
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v6.34
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 6.5.4 All 140 releases
formidable / classes / models / FrmCreateFile.php

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

315 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 foreach ( $this->get_needed_dirs() as $_dir ) {
198 // Only check to see if the Dir exists upon creation failure. Less I/O this way.
199 if ( $wp_filesystem->mkdir( $_dir, $this->chmod_dir ) ) {
200 $index_path = $_dir . '/index.php';
201 $wp_filesystem->put_contents( $index_path, "<?php\n// Silence is golden.\n?>", $this->chmod_file );
202 } else {
203 $dirs_exist = $wp_filesystem->is_dir( $_dir );
204 }
205 }
206 }
207
208 /**
209 * @return string[]
210 */
211 private function get_needed_dirs() {
212 $dir_names = explode( '/', $this->folder_name );
213 $needed_dirs = array();
214 $next_dir = '';
215
216 foreach ( $dir_names as $dir ) {
217 $next_dir .= '/' . $dir;
218 $needed_dirs[] = $this->uploads['basedir'] . $next_dir;
219 }
220
221 return $needed_dirs;
222 }
223
224 /**
225 * @return array|bool
226 */
227 private function get_creds() {
228 if ( ! function_exists( 'get_filesystem_method' ) ) {
229 include_once ABSPATH . 'wp-admin/includes/file.php';
230 }
231
232 $access_type = get_filesystem_method();
233
234 if ( $access_type === 'direct' ) {
235 return request_filesystem_credentials( site_url() . '/wp-admin/', '', false, false, array() );
236 }
237
238 return $this->get_ftp_creds( $access_type );
239 }
240
241 /**
242 * @param string $type
243 *
244 * @return array|false
245 */
246 private function get_ftp_creds( $type ) {
247 $credentials = get_option(
248 'ftp_credentials',
249 array(
250 'hostname' => '',
251 'username' => '',
252 )
253 );
254
255 $credentials['hostname'] = defined( 'FTP_HOST' ) ? FTP_HOST : $credentials['hostname'];
256 $credentials['username'] = defined( 'FTP_USER' ) ? FTP_USER : $credentials['username'];
257 $credentials['password'] = defined( 'FTP_PASS' ) ? FTP_PASS : '';
258
259 // Check to see if we are setting the public/private keys for ssh.
260 $credentials['public_key'] = defined( 'FTP_PUBKEY' ) ? FTP_PUBKEY : '';
261 $credentials['private_key'] = defined( 'FTP_PRIKEY' ) ? FTP_PRIKEY : '';
262
263 // Sanitize the hostname, Some people might pass in odd-data.
264 // Strip any schemes off.
265 $credentials['hostname'] = preg_replace( '|\w+://|', '', $credentials['hostname'] );
266
267 if ( str_contains( $credentials['hostname'], ':' ) ) {
268 list( $credentials['hostname'], $credentials['port'] ) = explode( ':', $credentials['hostname'], 2 );
269
270 if ( ! is_numeric( $credentials['port'] ) ) {
271 unset( $credentials['port'] );
272 }
273 } else {
274 unset( $credentials['port'] );
275 }
276
277 if ( ( defined( 'FTP_SSH' ) && FTP_SSH ) || ( defined( 'FS_METHOD' ) && 'ssh2' === FS_METHOD ) ) {
278 $credentials['connection_type'] = 'ssh';
279 } elseif ( ( defined( 'FTP_SSL' ) && FTP_SSL ) && 'ftpext' === $type ) {
280 // Only the FTP Extension understands SSL.
281 $credentials['connection_type'] = 'ftps';
282 } elseif ( ! isset( $credentials['connection_type'] ) ) {
283 // All else fails (And it's not defaulted to something else saved), Default to FTP.
284 $credentials['connection_type'] = 'ftp';
285 }
286
287 $has_creds = ! empty( $credentials['password'] ) && ! empty( $credentials['username'] ) && ! empty( $credentials['hostname'] );
288 $can_ssh = 'ssh' === $credentials['connection_type'] && ! empty( $credentials['public_key'] ) && ! empty( $credentials['private_key'] );
289
290 if ( $has_creds || $can_ssh ) {
291 $stored_credentials = $credentials;
292
293 if ( ! empty( $stored_credentials['port'] ) ) {
294 // Save port as part of hostname to simplify above code.
295 $stored_credentials['hostname'] .= ':' . $stored_credentials['port'];
296 }
297
298 unset( $stored_credentials['password'], $stored_credentials['port'], $stored_credentials['private_key'], $stored_credentials['public_key'] );
299
300 return $credentials;
301 }
302
303 return false;
304 }
305
306 /**
307 * @return void
308 */
309 private function show_error_message() {
310 if ( $this->error_message ) {
311 echo '<div class="message">' . esc_html( $this->error_message ) . '</div>';
312 }
313 }
314 }
315