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

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