Completed
Branch master (a54f59)
by
unknown
95:03 queued 86:17
created
core/services/request/files/FileSubmissionInterface.php 1 patch
Indentation   +31 added lines, -31 removed lines patch added patch discarded remove patch
@@ -15,37 +15,37 @@
 block discarded – undo
15 15
 interface FileSubmissionInterface
16 16
 {
17 17
 
18
-    /**
19
-     * @return string
20
-     */
21
-    public function getName();
22
-
23
-    /**
24
-     * @return string
25
-     */
26
-    public function getType();
27
-
28
-    /**
29
-     * @return int
30
-     */
31
-    public function getSize();
32
-
33
-    /**
34
-     * @return string
35
-     */
36
-    public function getTmpFile();
37
-
38
-    /**
39
-     * Should just return the filename.
40
-     * @since 4.9.80.p
41
-     * @return string
42
-     */
43
-    public function __toString();
44
-
45
-    /**
46
-     * @return string
47
-     */
48
-    public function getErrorCode();
18
+	/**
19
+	 * @return string
20
+	 */
21
+	public function getName();
22
+
23
+	/**
24
+	 * @return string
25
+	 */
26
+	public function getType();
27
+
28
+	/**
29
+	 * @return int
30
+	 */
31
+	public function getSize();
32
+
33
+	/**
34
+	 * @return string
35
+	 */
36
+	public function getTmpFile();
37
+
38
+	/**
39
+	 * Should just return the filename.
40
+	 * @since 4.9.80.p
41
+	 * @return string
42
+	 */
43
+	public function __toString();
44
+
45
+	/**
46
+	 * @return string
47
+	 */
48
+	public function getErrorCode();
49 49
 }
50 50
 // End of file FileSubmissionInterface.php
51 51
 // Location: EventEspresso\core\services\request\files/FileSubmissionInterface.php
Please login to merge, or discard this patch.
core/services/request/files/FilesDataHandler.php 1 patch
Indentation   +246 added lines, -246 removed lines patch added patch discarded remove patch
@@ -38,264 +38,264 @@
 block discarded – undo
38 38
  */
39 39
 class FilesDataHandler
40 40
 {
41
-    /**
42
-     * @var Request
43
-     */
44
-    protected $request;
41
+	/**
42
+	 * @var Request
43
+	 */
44
+	protected $request;
45 45
 
46
-    /**
47
-     * @var CollectionInterface | FileSubmissionInterface[]
48
-     */
49
-    protected $file_objects;
46
+	/**
47
+	 * @var CollectionInterface | FileSubmissionInterface[]
48
+	 */
49
+	protected $file_objects;
50 50
 
51
-    /**
52
-     * @var bool
53
-     */
54
-    protected $initialized = false;
51
+	/**
52
+	 * @var bool
53
+	 */
54
+	protected $initialized = false;
55 55
 
56
-    /**
57
-     * FilesDataHandler constructor.
58
-     * @param Request $request
59
-     */
60
-    public function __construct(Request $request)
61
-    {
62
-        $this->request = $request;
63
-    }
56
+	/**
57
+	 * FilesDataHandler constructor.
58
+	 * @param Request $request
59
+	 */
60
+	public function __construct(Request $request)
61
+	{
62
+		$this->request = $request;
63
+	}
64 64
 
65
-    /**
66
-     * @since 4.9.80.p
67
-     * @return CollectionInterface | FileSubmissionInterface[]
68
-     * @throws UnexpectedValueException
69
-     * @throws InvalidArgumentException
70
-     */
71
-    protected function getFileObjects()
72
-    {
73
-        $this->initialize();
74
-        return $this->file_objects;
75
-    }
65
+	/**
66
+	 * @since 4.9.80.p
67
+	 * @return CollectionInterface | FileSubmissionInterface[]
68
+	 * @throws UnexpectedValueException
69
+	 * @throws InvalidArgumentException
70
+	 */
71
+	protected function getFileObjects()
72
+	{
73
+		$this->initialize();
74
+		return $this->file_objects;
75
+	}
76 76
 
77
-    /**
78
-     * Sets up the file objects from the request's $_FILES data.
79
-     * @since 4.9.80.p
80
-     * @throws UnexpectedValueException
81
-     * @throws InvalidArgumentException
82
-     * @throws \EventEspresso\core\exceptions\InvalidInterfaceException
83
-     */
84
-    protected function initialize()
85
-    {
86
-        if ($this->initialized) {
87
-            return;
88
-        }
89
-        $this->file_objects = new Collection(
90
-            // collection interface
91
-            'EventEspresso\core\services\request\files\FileSubmissionInterface',
92
-            // collection name
93
-            'submitted_files'
94
-        );
95
-        $files_raw_data = $this->request->filesParams();
96
-        if (empty($files_raw_data)) {
97
-            return;
98
-        }
99
-        if ($this->isStrangeFilesArray($files_raw_data)) {
100
-            $data = $this->fixFilesDataArray($files_raw_data);
101
-        } else {
102
-            $data = $files_raw_data;
103
-        }
104
-        $this->createFileObjects($data);
105
-        $this->initialized = true;
106
-    }
77
+	/**
78
+	 * Sets up the file objects from the request's $_FILES data.
79
+	 * @since 4.9.80.p
80
+	 * @throws UnexpectedValueException
81
+	 * @throws InvalidArgumentException
82
+	 * @throws \EventEspresso\core\exceptions\InvalidInterfaceException
83
+	 */
84
+	protected function initialize()
85
+	{
86
+		if ($this->initialized) {
87
+			return;
88
+		}
89
+		$this->file_objects = new Collection(
90
+			// collection interface
91
+			'EventEspresso\core\services\request\files\FileSubmissionInterface',
92
+			// collection name
93
+			'submitted_files'
94
+		);
95
+		$files_raw_data = $this->request->filesParams();
96
+		if (empty($files_raw_data)) {
97
+			return;
98
+		}
99
+		if ($this->isStrangeFilesArray($files_raw_data)) {
100
+			$data = $this->fixFilesDataArray($files_raw_data);
101
+		} else {
102
+			$data = $files_raw_data;
103
+		}
104
+		$this->createFileObjects($data);
105
+		$this->initialized = true;
106
+	}
107 107
 
108
-    /**
109
-     * Detects if $_FILES is a weird multi-dimensional array that needs fixing or not.
110
-     * @since 4.9.80.p
111
-     * @param $files_data
112
-     * @return bool
113
-     * @throws UnexpectedValueException
114
-     */
115
-    protected function isStrangeFilesArray($files_data)
116
-    {
117
-        if (!is_array($files_data)) {
118
-            throw new UnexpectedValueException(
119
-                sprintf(
120
-                    esc_html__(
121
-                        'Unexpected PHP $_FILES data format. "%1$s" was expected to be an array.',
122
-                        'event_espresso'
123
-                    ),
124
-                    (string) $files_data
125
-                )
126
-            );
127
-        }
128
-        $first_value = reset($files_data);
129
-        if (!is_array($first_value)) {
130
-            throw new UnexpectedValueException(
131
-                sprintf(
132
-                    esc_html__(
133
-                        'Unexpected PHP $_FILES data format. "%1$s" was expected to be an array.',
134
-                        'event_espresso'
135
-                    ),
136
-                    (string) $first_value
137
-                )
138
-            );
139
-        }
140
-        $first_sub_array_item = reset($first_value);
141
-        if (is_array($first_sub_array_item)) {
142
-            // not just a 2d array
143
-            return true;
144
-        }
145
-        // yep, just 2d array
146
-        return false;
147
-    }
108
+	/**
109
+	 * Detects if $_FILES is a weird multi-dimensional array that needs fixing or not.
110
+	 * @since 4.9.80.p
111
+	 * @param $files_data
112
+	 * @return bool
113
+	 * @throws UnexpectedValueException
114
+	 */
115
+	protected function isStrangeFilesArray($files_data)
116
+	{
117
+		if (!is_array($files_data)) {
118
+			throw new UnexpectedValueException(
119
+				sprintf(
120
+					esc_html__(
121
+						'Unexpected PHP $_FILES data format. "%1$s" was expected to be an array.',
122
+						'event_espresso'
123
+					),
124
+					(string) $files_data
125
+				)
126
+			);
127
+		}
128
+		$first_value = reset($files_data);
129
+		if (!is_array($first_value)) {
130
+			throw new UnexpectedValueException(
131
+				sprintf(
132
+					esc_html__(
133
+						'Unexpected PHP $_FILES data format. "%1$s" was expected to be an array.',
134
+						'event_espresso'
135
+					),
136
+					(string) $first_value
137
+				)
138
+			);
139
+		}
140
+		$first_sub_array_item = reset($first_value);
141
+		if (is_array($first_sub_array_item)) {
142
+			// not just a 2d array
143
+			return true;
144
+		}
145
+		// yep, just 2d array
146
+		return false;
147
+	}
148 148
 
149
-    /**
150
-     * Takes into account that $_FILES does a weird thing when you have hierarchical form names (eg `<input type="file"
151
-     * name="my[hierarchical][form]">`): it leaves the top-level form part alone, but replaces the SECOND part with
152
-     * "name", "size", "tmp_name", etc. So that file's data is located at "my[name][hierarchical][form]",
153
-     * "my[size][hierarchical][form]", "my[tmp_name][hierarchical][form]", etc. It's really weird.
154
-     * @since 4.9.80.p
155
-     * @param $files_data
156
-     * @return array
157
-     */
158
-    protected function fixFilesDataArray($files_data)
159
-    {
160
-        $sane_files_array = [];
161
-        foreach ($files_data as $top_level_name => $top_level_children) {
162
-            $sub_array = [];
163
-            $sane_files_array[ $top_level_name ] = [];
164
-            foreach ($top_level_children as $file_data_part => $second_level_children) {
165
-                foreach ($second_level_children as $next_level_name => $sub_values) {
166
-                    $sub_array[ $next_level_name ] = $this->organizeFilesData($sub_values, $file_data_part);
167
-                }
168
-                $sane_files_array[ $top_level_name ] = array_replace_recursive(
169
-                    $sub_array,
170
-                    $sane_files_array[ $top_level_name ]
171
-                );
172
-            }
173
-        }
174
-        return $sane_files_array;
175
-    }
149
+	/**
150
+	 * Takes into account that $_FILES does a weird thing when you have hierarchical form names (eg `<input type="file"
151
+	 * name="my[hierarchical][form]">`): it leaves the top-level form part alone, but replaces the SECOND part with
152
+	 * "name", "size", "tmp_name", etc. So that file's data is located at "my[name][hierarchical][form]",
153
+	 * "my[size][hierarchical][form]", "my[tmp_name][hierarchical][form]", etc. It's really weird.
154
+	 * @since 4.9.80.p
155
+	 * @param $files_data
156
+	 * @return array
157
+	 */
158
+	protected function fixFilesDataArray($files_data)
159
+	{
160
+		$sane_files_array = [];
161
+		foreach ($files_data as $top_level_name => $top_level_children) {
162
+			$sub_array = [];
163
+			$sane_files_array[ $top_level_name ] = [];
164
+			foreach ($top_level_children as $file_data_part => $second_level_children) {
165
+				foreach ($second_level_children as $next_level_name => $sub_values) {
166
+					$sub_array[ $next_level_name ] = $this->organizeFilesData($sub_values, $file_data_part);
167
+				}
168
+				$sane_files_array[ $top_level_name ] = array_replace_recursive(
169
+					$sub_array,
170
+					$sane_files_array[ $top_level_name ]
171
+				);
172
+			}
173
+		}
174
+		return $sane_files_array;
175
+	}
176 176
 
177
-    /**
178
-     * Recursively explores the array until it finds a leaf node, and tacks `$type` as a final index in front of it.
179
-     * @since 4.9.80.p
180
-     * @param $data array|string
181
-     * @param $type 'name', 'tmp_name', 'size', or 'error'
182
-     * @param $name string
183
-     * @return array|string
184
-     */
185
-    protected function organizeFilesData($data, $type)
186
-    {
187
-        if (! is_array($data)) {
188
-            return [
189
-                $type => $data
190
-            ];
191
-        }
192
-        $organized_data = [];
193
-        foreach ($data as $input_name_part => $sub_inputs_or_value) {
194
-            if (is_array($sub_inputs_or_value)) {
195
-                $organized_data[ $input_name_part ] = $this->organizeFilesData($sub_inputs_or_value, $type);
196
-            } else {
197
-                $organized_data[ $input_name_part ][ $type ] = $sub_inputs_or_value;
198
-            }
199
-        }
200
-        return $organized_data;
201
-    }
177
+	/**
178
+	 * Recursively explores the array until it finds a leaf node, and tacks `$type` as a final index in front of it.
179
+	 * @since 4.9.80.p
180
+	 * @param $data array|string
181
+	 * @param $type 'name', 'tmp_name', 'size', or 'error'
182
+	 * @param $name string
183
+	 * @return array|string
184
+	 */
185
+	protected function organizeFilesData($data, $type)
186
+	{
187
+		if (! is_array($data)) {
188
+			return [
189
+				$type => $data
190
+			];
191
+		}
192
+		$organized_data = [];
193
+		foreach ($data as $input_name_part => $sub_inputs_or_value) {
194
+			if (is_array($sub_inputs_or_value)) {
195
+				$organized_data[ $input_name_part ] = $this->organizeFilesData($sub_inputs_or_value, $type);
196
+			} else {
197
+				$organized_data[ $input_name_part ][ $type ] = $sub_inputs_or_value;
198
+			}
199
+		}
200
+		return $organized_data;
201
+	}
202 202
 
203
-    /**
204
-     * Takes the organized $_FILES array (where all file info is located at the same spot as you'd expect an input
205
-     * to be in $_GET or $_POST, with all the file's data located side-by-side in an array) and creates a
206
-     * multi-dimensional array of FileSubmissionInterface objects. Stores it in `$this->file_objects`.
207
-     * @since 4.9.80.p
208
-     * @param array $organized_files $_FILES but organized like $_POST
209
-     * @param array $name_parts_so_far for multidimensional HTML form names,
210
-     * @throws UnexpectedValueException
211
-     * @throws InvalidArgumentException
212
-     */
213
-    protected function createFileObjects($organized_files, $name_parts_so_far = [])
214
-    {
215
-        if (!is_array($organized_files)) {
216
-            throw new UnexpectedValueException(
217
-                sprintf(
218
-                    esc_html__(
219
-                        'Unexpected PHP $organized_files data format. "%1$s" was expected to be an array.',
220
-                        'event_espresso'
221
-                    ),
222
-                    (string) $organized_files
223
-                )
224
-            );
225
-        }
226
-        foreach ($organized_files as $key => $value) {
227
-            $this_input_name_parts = $name_parts_so_far;
228
-            array_push(
229
-                $this_input_name_parts,
230
-                $key
231
-            );
232
-            if (isset($value['name'], $value['tmp_name'], $value['size'])) {
233
-                $html_name = $this->inputNameFromParts($this_input_name_parts);
234
-                $this->file_objects->add(
235
-                    new FileSubmission(
236
-                        $value['name'],
237
-                        $value['tmp_name'],
238
-                        $value['size'],
239
-                        $value['error']
240
-                    ),
241
-                    $html_name
242
-                );
243
-            } else {
244
-                $this->createFileObjects($value, $this_input_name_parts);
245
-            }
246
-        }
247
-    }
203
+	/**
204
+	 * Takes the organized $_FILES array (where all file info is located at the same spot as you'd expect an input
205
+	 * to be in $_GET or $_POST, with all the file's data located side-by-side in an array) and creates a
206
+	 * multi-dimensional array of FileSubmissionInterface objects. Stores it in `$this->file_objects`.
207
+	 * @since 4.9.80.p
208
+	 * @param array $organized_files $_FILES but organized like $_POST
209
+	 * @param array $name_parts_so_far for multidimensional HTML form names,
210
+	 * @throws UnexpectedValueException
211
+	 * @throws InvalidArgumentException
212
+	 */
213
+	protected function createFileObjects($organized_files, $name_parts_so_far = [])
214
+	{
215
+		if (!is_array($organized_files)) {
216
+			throw new UnexpectedValueException(
217
+				sprintf(
218
+					esc_html__(
219
+						'Unexpected PHP $organized_files data format. "%1$s" was expected to be an array.',
220
+						'event_espresso'
221
+					),
222
+					(string) $organized_files
223
+				)
224
+			);
225
+		}
226
+		foreach ($organized_files as $key => $value) {
227
+			$this_input_name_parts = $name_parts_so_far;
228
+			array_push(
229
+				$this_input_name_parts,
230
+				$key
231
+			);
232
+			if (isset($value['name'], $value['tmp_name'], $value['size'])) {
233
+				$html_name = $this->inputNameFromParts($this_input_name_parts);
234
+				$this->file_objects->add(
235
+					new FileSubmission(
236
+						$value['name'],
237
+						$value['tmp_name'],
238
+						$value['size'],
239
+						$value['error']
240
+					),
241
+					$html_name
242
+				);
243
+			} else {
244
+				$this->createFileObjects($value, $this_input_name_parts);
245
+			}
246
+		}
247
+	}
248 248
 
249
-    /**
250
-     * Takes the input name parts, like `['my', 'great', 'file', 'input1']`
251
-     * and returns the HTML name for it, "my[great][file][input1]"
252
-     * @since 4.9.80.p
253
-     * @param $parts
254
-     * @throws UnexpectedValueException
255
-     */
256
-    protected function inputNameFromParts($parts)
257
-    {
258
-        if (!is_array($parts)) {
259
-            throw new UnexpectedValueException(esc_html__('Name parts should be an array.', 'event_espresso'));
260
-        }
261
-        $generated_string = '';
262
-        foreach ($parts as $part) {
263
-            if ($generated_string === '') {
264
-                $generated_string = (string) $part;
265
-            } else {
266
-                $generated_string .= '[' . (string) $part . ']';
267
-            }
268
-        }
269
-        return $generated_string;
270
-    }
249
+	/**
250
+	 * Takes the input name parts, like `['my', 'great', 'file', 'input1']`
251
+	 * and returns the HTML name for it, "my[great][file][input1]"
252
+	 * @since 4.9.80.p
253
+	 * @param $parts
254
+	 * @throws UnexpectedValueException
255
+	 */
256
+	protected function inputNameFromParts($parts)
257
+	{
258
+		if (!is_array($parts)) {
259
+			throw new UnexpectedValueException(esc_html__('Name parts should be an array.', 'event_espresso'));
260
+		}
261
+		$generated_string = '';
262
+		foreach ($parts as $part) {
263
+			if ($generated_string === '') {
264
+				$generated_string = (string) $part;
265
+			} else {
266
+				$generated_string .= '[' . (string) $part . ']';
267
+			}
268
+		}
269
+		return $generated_string;
270
+	}
271 271
 
272
-    /**
273
-     * Gets the input by the indicated $name_parts.
274
-     * Eg if you're looking for an input named "my[great][file][input1]", $name_parts
275
-     * should be `['my', 'great', 'file', 'input1']`.
276
-     * Alternatively, you could use `FileDataHandler::getFileObject('my[great][file][input1]');`
277
-     * @since 4.9.80.p
278
-     * @param $name_parts
279
-     * @throws UnexpectedValueException
280
-     * @return FileSubmissionInterface
281
-     */
282
-    public function getFileObjectFromNameParts($name_parts)
283
-    {
284
-        return $this->getFileObjects()->get($this->inputNameFromParts($name_parts));
285
-    }
272
+	/**
273
+	 * Gets the input by the indicated $name_parts.
274
+	 * Eg if you're looking for an input named "my[great][file][input1]", $name_parts
275
+	 * should be `['my', 'great', 'file', 'input1']`.
276
+	 * Alternatively, you could use `FileDataHandler::getFileObject('my[great][file][input1]');`
277
+	 * @since 4.9.80.p
278
+	 * @param $name_parts
279
+	 * @throws UnexpectedValueException
280
+	 * @return FileSubmissionInterface
281
+	 */
282
+	public function getFileObjectFromNameParts($name_parts)
283
+	{
284
+		return $this->getFileObjects()->get($this->inputNameFromParts($name_parts));
285
+	}
286 286
 
287
-    /**
288
-     * Gets the FileSubmissionInterface corresponding to the HTML name provided.
289
-     * @since 4.9.80.p
290
-     * @param $html_name
291
-     * @return mixed
292
-     * @throws InvalidArgumentException
293
-     * @throws UnexpectedValueException
294
-     */
295
-    public function getFileObject($html_name)
296
-    {
297
-        return $this->getFileObjects()->get($html_name);
298
-    }
287
+	/**
288
+	 * Gets the FileSubmissionInterface corresponding to the HTML name provided.
289
+	 * @since 4.9.80.p
290
+	 * @param $html_name
291
+	 * @return mixed
292
+	 * @throws InvalidArgumentException
293
+	 * @throws UnexpectedValueException
294
+	 */
295
+	public function getFileObject($html_name)
296
+	{
297
+		return $this->getFileObjects()->get($html_name);
298
+	}
299 299
 }
300 300
 // End of file FilesDataHandler.php
301 301
 // Location: EventEspresso\core\services\request\files/FilesDataHandler.php
Please login to merge, or discard this patch.
core/services/request/files/FileSubmission.php 1 patch
Indentation   +158 added lines, -158 removed lines patch added patch discarded remove patch
@@ -19,164 +19,164 @@
 block discarded – undo
19 19
  */
20 20
 class FileSubmission implements FileSubmissionInterface
21 21
 {
22
-    /**
23
-     * @var string original name on the client machine
24
-     */
25
-    protected $name;
26
-
27
-    /**
28
-     * @var string mime type
29
-     */
30
-    protected $type;
31
-
32
-    /**
33
-     * @var string file extension
34
-     */
35
-    protected $extension;
36
-
37
-    /**
38
-     * @var int in bytes
39
-     */
40
-    protected $size;
41
-
42
-    /**
43
-     * @var string local filepath to the temporary file
44
-     */
45
-    protected $tmp_file;
46
-
47
-    /**
48
-     * @var int one of UPLOAD_ERR_OK, UPLOAD_ERR_NO_FILE, UPLOAD_ERR_INI_SIZE, UPLOAD_ERR_FORM_SIZE or other values
49
-     * although those aren't expected.
50
-     */
51
-    protected $error_code;
52
-
53
-    /**
54
-     * FileSubmission constructor.
55
-     * @param $name
56
-     * @param $tmp_file
57
-     * @param $size
58
-     * @param null $error_code
59
-     * @throws InvalidArgumentException
60
-     */
61
-    public function __construct($name, $tmp_file, $size, $error_code = null)
62
-    {
63
-        $this->name = basename($name);
64
-        $scheme = parse_url($tmp_file, PHP_URL_SCHEME);
65
-        if (in_array($scheme, ['http', 'https'])) {
66
-            // Wait a minute- just local filepaths please, no URL schemes allowed!
67
-            throw new InvalidArgumentException(
68
-                sprintf(
69
-                    // @codingStandardsIgnoreStart
70
-                    esc_html__('The scheme ("%1$s") on the temporary file ("%2$s") indicates is located elsewhere, that’s not ok!', 'event_espresso'),
71
-                    // @codingStandardsIgnoreEnd
72
-                    $scheme,
73
-                    $tmp_file
74
-                )
75
-            );
76
-        }
77
-        $this->tmp_file = (string) $tmp_file;
78
-        $this->size = (int) $size;
79
-        $this->error_code = (int) $error_code;
80
-    }
81
-
82
-    /**
83
-     * @return string
84
-     */
85
-    public function getName()
86
-    {
87
-        return $this->name;
88
-    }
89
-
90
-    /**
91
-     * Gets the file's mime type
92
-     * @return string
93
-     */
94
-    public function getType()
95
-    {
96
-        if (!$this->type) {
97
-            $this->type = $this->determineType();
98
-        }
99
-        return $this->type;
100
-    }
101
-
102
-    /**
103
-     * @since 4.9.80.p
104
-     * @return string
105
-     */
106
-    protected function determineType()
107
-    {
108
-        if (!$this->getTmpFile()) {
109
-            return '';
110
-        }
111
-        $finfo = new finfo(FILEINFO_MIME_TYPE);
112
-        return $finfo->file($this->getTmpFile());
113
-    }
114
-
115
-    /**
116
-     * Gets the file's extension.
117
-     * @since 4.9.80.p
118
-     * @return string
119
-     */
120
-    public function getExtension()
121
-    {
122
-        if (!$this->extension) {
123
-            $this->extension = $this->determineExtension();
124
-        }
125
-        return $this->extension;
126
-    }
127
-
128
-    /**
129
-     * Determine's the file's extension given the temporary file.
130
-     * @since 4.9.80.p
131
-     * @return string
132
-     */
133
-    protected function determineExtension()
134
-    {
135
-        $position_of_period = strrpos($this->getName(), '.');
136
-        if ($position_of_period === false) {
137
-            return '';
138
-        }
139
-        return mb_substr(
140
-            $this->getName(),
141
-            $position_of_period + 1
142
-        );
143
-    }
144
-
145
-    /**
146
-     * Gets the size of the file
147
-     * @return int
148
-     */
149
-    public function getSize()
150
-    {
151
-        return $this->size;
152
-    }
153
-
154
-    /**
155
-     * Gets the path to the temporary file which was uploaded.
156
-     * @return string
157
-     */
158
-    public function getTmpFile()
159
-    {
160
-        return $this->tmp_file;
161
-    }
162
-
163
-    /**
164
-     * @since 4.9.80.p
165
-     * @return string
166
-     */
167
-    public function __toString()
168
-    {
169
-        return $this->getName();
170
-    }
171
-
172
-    /**
173
-     * Gets the error code PHP reported for the file upload.
174
-     * @return string
175
-     */
176
-    public function getErrorCode()
177
-    {
178
-        return $this->error_code;
179
-    }
22
+	/**
23
+	 * @var string original name on the client machine
24
+	 */
25
+	protected $name;
26
+
27
+	/**
28
+	 * @var string mime type
29
+	 */
30
+	protected $type;
31
+
32
+	/**
33
+	 * @var string file extension
34
+	 */
35
+	protected $extension;
36
+
37
+	/**
38
+	 * @var int in bytes
39
+	 */
40
+	protected $size;
41
+
42
+	/**
43
+	 * @var string local filepath to the temporary file
44
+	 */
45
+	protected $tmp_file;
46
+
47
+	/**
48
+	 * @var int one of UPLOAD_ERR_OK, UPLOAD_ERR_NO_FILE, UPLOAD_ERR_INI_SIZE, UPLOAD_ERR_FORM_SIZE or other values
49
+	 * although those aren't expected.
50
+	 */
51
+	protected $error_code;
52
+
53
+	/**
54
+	 * FileSubmission constructor.
55
+	 * @param $name
56
+	 * @param $tmp_file
57
+	 * @param $size
58
+	 * @param null $error_code
59
+	 * @throws InvalidArgumentException
60
+	 */
61
+	public function __construct($name, $tmp_file, $size, $error_code = null)
62
+	{
63
+		$this->name = basename($name);
64
+		$scheme = parse_url($tmp_file, PHP_URL_SCHEME);
65
+		if (in_array($scheme, ['http', 'https'])) {
66
+			// Wait a minute- just local filepaths please, no URL schemes allowed!
67
+			throw new InvalidArgumentException(
68
+				sprintf(
69
+					// @codingStandardsIgnoreStart
70
+					esc_html__('The scheme ("%1$s") on the temporary file ("%2$s") indicates is located elsewhere, that’s not ok!', 'event_espresso'),
71
+					// @codingStandardsIgnoreEnd
72
+					$scheme,
73
+					$tmp_file
74
+				)
75
+			);
76
+		}
77
+		$this->tmp_file = (string) $tmp_file;
78
+		$this->size = (int) $size;
79
+		$this->error_code = (int) $error_code;
80
+	}
81
+
82
+	/**
83
+	 * @return string
84
+	 */
85
+	public function getName()
86
+	{
87
+		return $this->name;
88
+	}
89
+
90
+	/**
91
+	 * Gets the file's mime type
92
+	 * @return string
93
+	 */
94
+	public function getType()
95
+	{
96
+		if (!$this->type) {
97
+			$this->type = $this->determineType();
98
+		}
99
+		return $this->type;
100
+	}
101
+
102
+	/**
103
+	 * @since 4.9.80.p
104
+	 * @return string
105
+	 */
106
+	protected function determineType()
107
+	{
108
+		if (!$this->getTmpFile()) {
109
+			return '';
110
+		}
111
+		$finfo = new finfo(FILEINFO_MIME_TYPE);
112
+		return $finfo->file($this->getTmpFile());
113
+	}
114
+
115
+	/**
116
+	 * Gets the file's extension.
117
+	 * @since 4.9.80.p
118
+	 * @return string
119
+	 */
120
+	public function getExtension()
121
+	{
122
+		if (!$this->extension) {
123
+			$this->extension = $this->determineExtension();
124
+		}
125
+		return $this->extension;
126
+	}
127
+
128
+	/**
129
+	 * Determine's the file's extension given the temporary file.
130
+	 * @since 4.9.80.p
131
+	 * @return string
132
+	 */
133
+	protected function determineExtension()
134
+	{
135
+		$position_of_period = strrpos($this->getName(), '.');
136
+		if ($position_of_period === false) {
137
+			return '';
138
+		}
139
+		return mb_substr(
140
+			$this->getName(),
141
+			$position_of_period + 1
142
+		);
143
+	}
144
+
145
+	/**
146
+	 * Gets the size of the file
147
+	 * @return int
148
+	 */
149
+	public function getSize()
150
+	{
151
+		return $this->size;
152
+	}
153
+
154
+	/**
155
+	 * Gets the path to the temporary file which was uploaded.
156
+	 * @return string
157
+	 */
158
+	public function getTmpFile()
159
+	{
160
+		return $this->tmp_file;
161
+	}
162
+
163
+	/**
164
+	 * @since 4.9.80.p
165
+	 * @return string
166
+	 */
167
+	public function __toString()
168
+	{
169
+		return $this->getName();
170
+	}
171
+
172
+	/**
173
+	 * Gets the error code PHP reported for the file upload.
174
+	 * @return string
175
+	 */
176
+	public function getErrorCode()
177
+	{
178
+		return $this->error_code;
179
+	}
180 180
 }
181 181
 // End of file FileSubmission.php
182 182
 // Location: EventEspresso\core\services\request\files/FileSubmission.php
Please login to merge, or discard this patch.
core/services/options/JsonWpOptionManager.php 1 patch
Indentation   +32 added lines, -32 removed lines patch added patch discarded remove patch
@@ -16,39 +16,39 @@
 block discarded – undo
16 16
  */
17 17
 class JsonWpOptionManager
18 18
 {
19
-    /**
20
-     * Updates the object with what's in the DB (specifically, the wp_options table). If nothing is in the DB, leaves
21
-     * the object alone and returns false.
22
-     * @since 4.9.80.p
23
-     * @param JsonWpOptionSerializableInterface $obj
24
-     * @return bool
25
-     */
26
-    public function populateFromDb(JsonWpOptionSerializableInterface $obj)
27
-    {
28
-        $option = get_option($obj->getWpOptionName());
29
-        if ($option) {
30
-            $json = json_decode($option);
31
-            if (is_array($json) || $json instanceof stdClass) {
32
-                return $obj->fromJsonSerializedData($json);
33
-            }
34
-        }
35
-        return false;
36
-    }
19
+	/**
20
+	 * Updates the object with what's in the DB (specifically, the wp_options table). If nothing is in the DB, leaves
21
+	 * the object alone and returns false.
22
+	 * @since 4.9.80.p
23
+	 * @param JsonWpOptionSerializableInterface $obj
24
+	 * @return bool
25
+	 */
26
+	public function populateFromDb(JsonWpOptionSerializableInterface $obj)
27
+	{
28
+		$option = get_option($obj->getWpOptionName());
29
+		if ($option) {
30
+			$json = json_decode($option);
31
+			if (is_array($json) || $json instanceof stdClass) {
32
+				return $obj->fromJsonSerializedData($json);
33
+			}
34
+		}
35
+		return false;
36
+	}
37 37
 
38
-    /**
39
-     * Saves the object's data to the wp_options table for later use.
40
-     * @since 4.9.80.p
41
-     * @param JsonWpOptionSerializableInterface $obj
42
-     * @return bool
43
-     */
44
-    public function saveToDb(JsonWpOptionSerializableInterface $obj)
45
-    {
46
-        return update_option(
47
-            $obj->getWpOptionName(),
48
-            wp_json_encode($obj->toJsonSerializableData()),
49
-            false
50
-        );
51
-    }
38
+	/**
39
+	 * Saves the object's data to the wp_options table for later use.
40
+	 * @since 4.9.80.p
41
+	 * @param JsonWpOptionSerializableInterface $obj
42
+	 * @return bool
43
+	 */
44
+	public function saveToDb(JsonWpOptionSerializableInterface $obj)
45
+	{
46
+		return update_option(
47
+			$obj->getWpOptionName(),
48
+			wp_json_encode($obj->toJsonSerializableData()),
49
+			false
50
+		);
51
+	}
52 52
 }
53 53
 // End of file JsonWpOptionManager.php
54 54
 // Location: EventEspresso\core\services\options/JsonWpOptionManager.php
Please login to merge, or discard this patch.
core/services/options/JsonWpOptionSerializableInterface.php 1 patch
Indentation   +7 added lines, -7 removed lines patch added patch discarded remove patch
@@ -17,13 +17,13 @@
 block discarded – undo
17 17
  */
18 18
 interface JsonWpOptionSerializableInterface extends JsonSerializableAndUnserializable
19 19
 {
20
-    /**
21
-     * Gets the value to use for wp_options.option_name. Note this is not static, so it can use object properties to
22
-     * determine what option name to use.
23
-     * @since 4.9.80.p
24
-     * @return string
25
-     */
26
-    public function getWpOptionName();
20
+	/**
21
+	 * Gets the value to use for wp_options.option_name. Note this is not static, so it can use object properties to
22
+	 * determine what option name to use.
23
+	 * @since 4.9.80.p
24
+	 * @return string
25
+	 */
26
+	public function getWpOptionName();
27 27
 }
28 28
 // End of file JsonWpOptionSerializableInterface.php
29 29
 // Location: EventEspresso\core\services\options/JsonWpOptionSerializableInterface.php
Please login to merge, or discard this patch.
modules/batch/EED_Batch.module.php 1 patch
Indentation   +328 added lines, -328 removed lines patch added patch discarded remove patch
@@ -28,356 +28,356 @@
 block discarded – undo
28 28
 class EED_Batch extends EED_Module
29 29
 {
30 30
 
31
-    /**
32
-     * Possibly value for $_REQUEST[ 'batch' ]. Indicates to run a job that
33
-     * processes data only
34
-     */
35
-    const batch_job = 'job';
36
-    /**
37
-     * Possibly value for $_REQUEST[ 'batch' ]. Indicates to run a job that
38
-     * produces a file for download
39
-     */
40
-    const batch_file_job = 'file';
41
-    /**
42
-     * Possibly value for $_REQUEST[ 'batch' ]. Indicates this request is NOT
43
-     * for a batch job. It's the same as not providing the $_REQUEST[ 'batch' ]
44
-     * at all
45
-     */
46
-    const batch_not_job = 'none';
31
+	/**
32
+	 * Possibly value for $_REQUEST[ 'batch' ]. Indicates to run a job that
33
+	 * processes data only
34
+	 */
35
+	const batch_job = 'job';
36
+	/**
37
+	 * Possibly value for $_REQUEST[ 'batch' ]. Indicates to run a job that
38
+	 * produces a file for download
39
+	 */
40
+	const batch_file_job = 'file';
41
+	/**
42
+	 * Possibly value for $_REQUEST[ 'batch' ]. Indicates this request is NOT
43
+	 * for a batch job. It's the same as not providing the $_REQUEST[ 'batch' ]
44
+	 * at all
45
+	 */
46
+	const batch_not_job = 'none';
47 47
 
48
-    /**
49
-     *
50
-     * @var string 'file', or 'job', or false to indicate its not a batch request at all
51
-     */
52
-    protected $_batch_request_type = null;
48
+	/**
49
+	 *
50
+	 * @var string 'file', or 'job', or false to indicate its not a batch request at all
51
+	 */
52
+	protected $_batch_request_type = null;
53 53
 
54
-    /**
55
-     * Because we want to use the response in both the localized JS and in the body
56
-     * we need to make this response available between method calls
57
-     *
58
-     * @var \EventEspressoBatchRequest\Helpers\JobStepResponse
59
-     */
60
-    protected $_job_step_response = null;
54
+	/**
55
+	 * Because we want to use the response in both the localized JS and in the body
56
+	 * we need to make this response available between method calls
57
+	 *
58
+	 * @var \EventEspressoBatchRequest\Helpers\JobStepResponse
59
+	 */
60
+	protected $_job_step_response = null;
61 61
 
62
-    /**
63
-     * @var LoaderInterface
64
-     */
65
-    protected $loader;
62
+	/**
63
+	 * @var LoaderInterface
64
+	 */
65
+	protected $loader;
66 66
 
67
-    /**
68
-     * Gets the batch instance
69
-     *
70
-     * @return EED_Batch
71
-     */
72
-    public static function instance()
73
-    {
74
-        return self::get_instance();
75
-    }
67
+	/**
68
+	 * Gets the batch instance
69
+	 *
70
+	 * @return EED_Batch
71
+	 */
72
+	public static function instance()
73
+	{
74
+		return self::get_instance();
75
+	}
76 76
 
77
-    /**
78
-     * Sets hooks to enable batch jobs on the frontend. Disabled by default
79
-     * because it's an attack vector and there are currently no implementations
80
-     */
81
-    public static function set_hooks()
82
-    {
83
-        // because this is a possibel attack vector, let's have this disabled until
84
-        // we at least have a real use for it on the frontend
85
-        if (apply_filters('FHEE__EED_Batch__set_hooks__enable_frontend_batch', false)) {
86
-            add_action('wp_enqueue_scripts', array(self::instance(), 'enqueue_scripts'));
87
-            add_filter('template_include', array(self::instance(), 'override_template'), 99);
88
-        }
89
-    }
77
+	/**
78
+	 * Sets hooks to enable batch jobs on the frontend. Disabled by default
79
+	 * because it's an attack vector and there are currently no implementations
80
+	 */
81
+	public static function set_hooks()
82
+	{
83
+		// because this is a possibel attack vector, let's have this disabled until
84
+		// we at least have a real use for it on the frontend
85
+		if (apply_filters('FHEE__EED_Batch__set_hooks__enable_frontend_batch', false)) {
86
+			add_action('wp_enqueue_scripts', array(self::instance(), 'enqueue_scripts'));
87
+			add_filter('template_include', array(self::instance(), 'override_template'), 99);
88
+		}
89
+	}
90 90
 
91
-    /**
92
-     * Initializes some hooks for the admin in order to run batch jobs
93
-     */
94
-    public static function set_hooks_admin()
95
-    {
96
-        add_action('admin_menu', array(self::instance(), 'register_admin_pages'));
97
-        add_action('admin_enqueue_scripts', array(self::instance(), 'enqueue_scripts'));
91
+	/**
92
+	 * Initializes some hooks for the admin in order to run batch jobs
93
+	 */
94
+	public static function set_hooks_admin()
95
+	{
96
+		add_action('admin_menu', array(self::instance(), 'register_admin_pages'));
97
+		add_action('admin_enqueue_scripts', array(self::instance(), 'enqueue_scripts'));
98 98
 
99
-        // ajax
100
-        add_action('wp_ajax_espresso_batch_continue', array(self::instance(), 'batch_continue'));
101
-        add_action('wp_ajax_espresso_batch_cleanup', array(self::instance(), 'batch_cleanup'));
102
-        add_action('wp_ajax_nopriv_espresso_batch_continue', array(self::instance(), 'batch_continue'));
103
-        add_action('wp_ajax_nopriv_espresso_batch_cleanup', array(self::instance(), 'batch_cleanup'));
104
-    }
99
+		// ajax
100
+		add_action('wp_ajax_espresso_batch_continue', array(self::instance(), 'batch_continue'));
101
+		add_action('wp_ajax_espresso_batch_cleanup', array(self::instance(), 'batch_cleanup'));
102
+		add_action('wp_ajax_nopriv_espresso_batch_continue', array(self::instance(), 'batch_continue'));
103
+		add_action('wp_ajax_nopriv_espresso_batch_cleanup', array(self::instance(), 'batch_cleanup'));
104
+	}
105 105
 
106
-    /**
107
-     * @since 4.9.80.p
108
-     * @return LoaderInterface
109
-     * @throws InvalidArgumentException
110
-     * @throws InvalidDataTypeException
111
-     * @throws InvalidInterfaceException
112
-     */
113
-    protected function getLoader()
114
-    {
115
-        if (!$this->loader instanceof LoaderInterface) {
116
-            $this->loader = LoaderFactory::getLoader();
117
-        }
118
-        return $this->loader;
119
-    }
106
+	/**
107
+	 * @since 4.9.80.p
108
+	 * @return LoaderInterface
109
+	 * @throws InvalidArgumentException
110
+	 * @throws InvalidDataTypeException
111
+	 * @throws InvalidInterfaceException
112
+	 */
113
+	protected function getLoader()
114
+	{
115
+		if (!$this->loader instanceof LoaderInterface) {
116
+			$this->loader = LoaderFactory::getLoader();
117
+		}
118
+		return $this->loader;
119
+	}
120 120
 
121
-    /**
122
-     * Enqueues batch scripts on the frontend or admin, and creates a job
123
-     */
124
-    public function enqueue_scripts()
125
-    {
126
-        if (isset($_REQUEST['espresso_batch'])
127
-            ||
128
-            (
129
-                isset($_REQUEST['page'])
130
-                && $_REQUEST['page'] == 'espresso_batch'
131
-            )
132
-        ) {
133
-            switch ($this->batch_request_type()) {
134
-                case self::batch_job:
135
-                    $this->enqueue_scripts_styles_batch_create();
136
-                    break;
137
-                case self::batch_file_job:
138
-                    $this->enqueue_scripts_styles_batch_file_create();
139
-                    break;
140
-            }
141
-        }
142
-    }
121
+	/**
122
+	 * Enqueues batch scripts on the frontend or admin, and creates a job
123
+	 */
124
+	public function enqueue_scripts()
125
+	{
126
+		if (isset($_REQUEST['espresso_batch'])
127
+			||
128
+			(
129
+				isset($_REQUEST['page'])
130
+				&& $_REQUEST['page'] == 'espresso_batch'
131
+			)
132
+		) {
133
+			switch ($this->batch_request_type()) {
134
+				case self::batch_job:
135
+					$this->enqueue_scripts_styles_batch_create();
136
+					break;
137
+				case self::batch_file_job:
138
+					$this->enqueue_scripts_styles_batch_file_create();
139
+					break;
140
+			}
141
+		}
142
+	}
143 143
 
144
-    /**
145
-     * Create a batch job, enqueues a script to run it, and localizes some data for it
146
-     */
147
-    public function enqueue_scripts_styles_batch_create()
148
-    {
149
-        $job_response = $this->_enqueue_batch_job_scripts_and_styles_and_start_job();
150
-        wp_enqueue_script(
151
-            'batch_runner_init',
152
-            BATCH_URL . 'assets/batch_runner_init.js',
153
-            array('batch_runner'),
154
-            EVENT_ESPRESSO_VERSION,
155
-            true
156
-        );
157
-        wp_localize_script('batch_runner_init', 'ee_job_response', $job_response->to_array());
158
-        wp_localize_script(
159
-            'batch_runner_init',
160
-            'ee_job_i18n',
161
-            array(
162
-                'return_url' => $_REQUEST['return_url'],
163
-            )
164
-        );
165
-    }
144
+	/**
145
+	 * Create a batch job, enqueues a script to run it, and localizes some data for it
146
+	 */
147
+	public function enqueue_scripts_styles_batch_create()
148
+	{
149
+		$job_response = $this->_enqueue_batch_job_scripts_and_styles_and_start_job();
150
+		wp_enqueue_script(
151
+			'batch_runner_init',
152
+			BATCH_URL . 'assets/batch_runner_init.js',
153
+			array('batch_runner'),
154
+			EVENT_ESPRESSO_VERSION,
155
+			true
156
+		);
157
+		wp_localize_script('batch_runner_init', 'ee_job_response', $job_response->to_array());
158
+		wp_localize_script(
159
+			'batch_runner_init',
160
+			'ee_job_i18n',
161
+			array(
162
+				'return_url' => $_REQUEST['return_url'],
163
+			)
164
+		);
165
+	}
166 166
 
167
-    /**
168
-     * Creates a batch job which will download a file, enqueues a script to run the job, and localizes some data for it
169
-     */
170
-    public function enqueue_scripts_styles_batch_file_create()
171
-    {
172
-        // creates a job based on the request variable
173
-        $job_response = $this->_enqueue_batch_job_scripts_and_styles_and_start_job();
174
-        wp_enqueue_script(
175
-            'batch_file_runner_init',
176
-            BATCH_URL . 'assets/batch_file_runner_init.js',
177
-            array('batch_runner'),
178
-            EVENT_ESPRESSO_VERSION,
179
-            true
180
-        );
181
-        wp_localize_script('batch_file_runner_init', 'ee_job_response', $job_response->to_array());
182
-        wp_localize_script(
183
-            'batch_file_runner_init',
184
-            'ee_job_i18n',
185
-            array(
186
-                'download_and_redirecting' => sprintf(
187
-                    __('File Generation complete. Downloading, and %1$sredirecting%2$s...', 'event_espresso'),
188
-                    '<a href="' . $_REQUEST['return_url'] . '">',
189
-                    '</a>'
190
-                ),
191
-                'return_url'               => $_REQUEST['return_url'],
192
-            )
193
-        );
194
-    }
167
+	/**
168
+	 * Creates a batch job which will download a file, enqueues a script to run the job, and localizes some data for it
169
+	 */
170
+	public function enqueue_scripts_styles_batch_file_create()
171
+	{
172
+		// creates a job based on the request variable
173
+		$job_response = $this->_enqueue_batch_job_scripts_and_styles_and_start_job();
174
+		wp_enqueue_script(
175
+			'batch_file_runner_init',
176
+			BATCH_URL . 'assets/batch_file_runner_init.js',
177
+			array('batch_runner'),
178
+			EVENT_ESPRESSO_VERSION,
179
+			true
180
+		);
181
+		wp_localize_script('batch_file_runner_init', 'ee_job_response', $job_response->to_array());
182
+		wp_localize_script(
183
+			'batch_file_runner_init',
184
+			'ee_job_i18n',
185
+			array(
186
+				'download_and_redirecting' => sprintf(
187
+					__('File Generation complete. Downloading, and %1$sredirecting%2$s...', 'event_espresso'),
188
+					'<a href="' . $_REQUEST['return_url'] . '">',
189
+					'</a>'
190
+				),
191
+				'return_url'               => $_REQUEST['return_url'],
192
+			)
193
+		);
194
+	}
195 195
 
196
-    /**
197
-     * Enqueues scripts and styles common to any batch job, and creates
198
-     * a job from the request data, and stores the response in the
199
-     * $this->_job_step_response property
200
-     *
201
-     * @return \EventEspressoBatchRequest\Helpers\JobStepResponse
202
-     */
203
-    protected function _enqueue_batch_job_scripts_and_styles_and_start_job()
204
-    {
205
-        wp_register_script(
206
-            'progress_bar',
207
-            EE_PLUGIN_DIR_URL . 'core/libraries/batch/Assets/progress_bar.js',
208
-            array('jquery')
209
-        );
210
-        wp_enqueue_style(
211
-            'progress_bar',
212
-            EE_PLUGIN_DIR_URL . 'core/libraries/batch/Assets/progress_bar.css',
213
-            array(),
214
-            EVENT_ESPRESSO_VERSION
215
-        );
216
-        wp_enqueue_script(
217
-            'batch_runner',
218
-            EE_PLUGIN_DIR_URL . 'core/libraries/batch/Assets/batch_runner.js',
219
-            array('progress_bar')
220
-        );
221
-        // just copy the bits of EE admin's eei18n that we need in the JS
222
-        wp_localize_script(
223
-            'batch_runner',
224
-            'eei18n',
225
-            array(
226
-                'ajax_url'      => WP_AJAX_URL,
227
-                'is_admin'      => (bool) is_admin(),
228
-                'error_message' => esc_html__('An error occurred and the job has been stopped. Please refresh the page to try again.', 'event_espresso'),
229
-            )
230
-        );
231
-        $job_handler_classname = stripslashes($_GET['job_handler']);
232
-        $request_data = array_diff_key(
233
-            $_REQUEST,
234
-            array_flip(array('action', 'page', 'ee', 'batch'))
235
-        );
236
-        $batch_runner = $this->getLoader()->getShared('EventEspressoBatchRequest\BatchRequestProcessor');
237
-        // eg 'EventEspressoBatchRequest\JobHandlers\RegistrationsReport'
238
-        $job_response = $batch_runner->create_job($job_handler_classname, $request_data);
239
-        // remember the response for later. We need it to display the page body
240
-        $this->_job_step_response = $job_response;
241
-        return $job_response;
242
-    }
196
+	/**
197
+	 * Enqueues scripts and styles common to any batch job, and creates
198
+	 * a job from the request data, and stores the response in the
199
+	 * $this->_job_step_response property
200
+	 *
201
+	 * @return \EventEspressoBatchRequest\Helpers\JobStepResponse
202
+	 */
203
+	protected function _enqueue_batch_job_scripts_and_styles_and_start_job()
204
+	{
205
+		wp_register_script(
206
+			'progress_bar',
207
+			EE_PLUGIN_DIR_URL . 'core/libraries/batch/Assets/progress_bar.js',
208
+			array('jquery')
209
+		);
210
+		wp_enqueue_style(
211
+			'progress_bar',
212
+			EE_PLUGIN_DIR_URL . 'core/libraries/batch/Assets/progress_bar.css',
213
+			array(),
214
+			EVENT_ESPRESSO_VERSION
215
+		);
216
+		wp_enqueue_script(
217
+			'batch_runner',
218
+			EE_PLUGIN_DIR_URL . 'core/libraries/batch/Assets/batch_runner.js',
219
+			array('progress_bar')
220
+		);
221
+		// just copy the bits of EE admin's eei18n that we need in the JS
222
+		wp_localize_script(
223
+			'batch_runner',
224
+			'eei18n',
225
+			array(
226
+				'ajax_url'      => WP_AJAX_URL,
227
+				'is_admin'      => (bool) is_admin(),
228
+				'error_message' => esc_html__('An error occurred and the job has been stopped. Please refresh the page to try again.', 'event_espresso'),
229
+			)
230
+		);
231
+		$job_handler_classname = stripslashes($_GET['job_handler']);
232
+		$request_data = array_diff_key(
233
+			$_REQUEST,
234
+			array_flip(array('action', 'page', 'ee', 'batch'))
235
+		);
236
+		$batch_runner = $this->getLoader()->getShared('EventEspressoBatchRequest\BatchRequestProcessor');
237
+		// eg 'EventEspressoBatchRequest\JobHandlers\RegistrationsReport'
238
+		$job_response = $batch_runner->create_job($job_handler_classname, $request_data);
239
+		// remember the response for later. We need it to display the page body
240
+		$this->_job_step_response = $job_response;
241
+		return $job_response;
242
+	}
243 243
 
244
-    /**
245
-     * If we are doing a frontend batch job, this makes it so WP shows our template's HTML
246
-     *
247
-     * @param string $template
248
-     * @return string
249
-     */
250
-    public function override_template($template)
251
-    {
252
-        if (isset($_REQUEST['espresso_batch']) && isset($_REQUEST['batch'])) {
253
-            return EE_MODULES . 'batch' . DS . 'templates' . DS . 'batch_frontend_wrapper.template.html';
254
-        }
255
-        return $template;
256
-    }
244
+	/**
245
+	 * If we are doing a frontend batch job, this makes it so WP shows our template's HTML
246
+	 *
247
+	 * @param string $template
248
+	 * @return string
249
+	 */
250
+	public function override_template($template)
251
+	{
252
+		if (isset($_REQUEST['espresso_batch']) && isset($_REQUEST['batch'])) {
253
+			return EE_MODULES . 'batch' . DS . 'templates' . DS . 'batch_frontend_wrapper.template.html';
254
+		}
255
+		return $template;
256
+	}
257 257
 
258
-    /**
259
-     * Adds an admin page which doesn't appear in the admin menu
260
-     */
261
-    public function register_admin_pages()
262
-    {
263
-        add_submenu_page(
264
-            '', // parent slug. we don't want this to actually appear in the menu
265
-            __('Batch Job', 'event_espresso'), // page title
266
-            'n/a', // menu title
267
-            'read', // we want this page to actually be accessible to anyone,
268
-            'espresso_batch', // menu slug
269
-            array(self::instance(), 'show_admin_page')
270
-        );
271
-    }
258
+	/**
259
+	 * Adds an admin page which doesn't appear in the admin menu
260
+	 */
261
+	public function register_admin_pages()
262
+	{
263
+		add_submenu_page(
264
+			'', // parent slug. we don't want this to actually appear in the menu
265
+			__('Batch Job', 'event_espresso'), // page title
266
+			'n/a', // menu title
267
+			'read', // we want this page to actually be accessible to anyone,
268
+			'espresso_batch', // menu slug
269
+			array(self::instance(), 'show_admin_page')
270
+		);
271
+	}
272 272
 
273
-    /**
274
-     * Renders the admin page, after most of the work was already done during enqueuing scripts
275
-     * of creating the job and localizing some data
276
-     */
277
-    public function show_admin_page()
278
-    {
279
-        echo EEH_Template::locate_template(
280
-            EE_MODULES . 'batch' . DS . 'templates' . DS . 'batch_wrapper.template.html',
281
-            array('batch_request_type' => $this->batch_request_type())
282
-        );
283
-    }
273
+	/**
274
+	 * Renders the admin page, after most of the work was already done during enqueuing scripts
275
+	 * of creating the job and localizing some data
276
+	 */
277
+	public function show_admin_page()
278
+	{
279
+		echo EEH_Template::locate_template(
280
+			EE_MODULES . 'batch' . DS . 'templates' . DS . 'batch_wrapper.template.html',
281
+			array('batch_request_type' => $this->batch_request_type())
282
+		);
283
+	}
284 284
 
285
-    /**
286
-     * Receives ajax calls for continuing a job
287
-     */
288
-    public function batch_continue()
289
-    {
290
-        $job_id = sanitize_text_field($_REQUEST['job_id']);
291
-        $batch_runner = $this->getLoader()->getShared('EventEspressoBatchRequest\BatchRequestProcessor');
292
-        $response_obj = $batch_runner->continue_job($job_id);
293
-        $this->_return_json($response_obj->to_array());
294
-    }
285
+	/**
286
+	 * Receives ajax calls for continuing a job
287
+	 */
288
+	public function batch_continue()
289
+	{
290
+		$job_id = sanitize_text_field($_REQUEST['job_id']);
291
+		$batch_runner = $this->getLoader()->getShared('EventEspressoBatchRequest\BatchRequestProcessor');
292
+		$response_obj = $batch_runner->continue_job($job_id);
293
+		$this->_return_json($response_obj->to_array());
294
+	}
295 295
 
296
-    /**
297
-     * Receives the ajax call to cleanup a job
298
-     *
299
-     * @return type
300
-     */
301
-    public function batch_cleanup()
302
-    {
303
-        $job_id = sanitize_text_field($_REQUEST['job_id']);
304
-        $batch_runner = $this->getLoader()->getShared('EventEspressoBatchRequest\BatchRequestProcessor');
305
-        $response_obj = $batch_runner->cleanup_job($job_id);
306
-        $this->_return_json($response_obj->to_array());
307
-    }
296
+	/**
297
+	 * Receives the ajax call to cleanup a job
298
+	 *
299
+	 * @return type
300
+	 */
301
+	public function batch_cleanup()
302
+	{
303
+		$job_id = sanitize_text_field($_REQUEST['job_id']);
304
+		$batch_runner = $this->getLoader()->getShared('EventEspressoBatchRequest\BatchRequestProcessor');
305
+		$response_obj = $batch_runner->cleanup_job($job_id);
306
+		$this->_return_json($response_obj->to_array());
307
+	}
308 308
 
309 309
 
310
-    /**
311
-     * Returns a json response
312
-     *
313
-     * @param array $data The data we want to send echo via in the JSON response's "data" element
314
-     *
315
-     * The returned json object is created from an array in the following format:
316
-     * array(
317
-     *    'notices' => '', // - contains any EE_Error formatted notices
318
-     *    'data' => array() //this can be any key/value pairs that a method returns for later json parsing by the js.
319
-     *    We're also going to include the template args with every package (so js can pick out any specific template
320
-     *    args that might be included in here)
321
-     *    'isEEajax' => true,//indicates this is a response from EE
322
-     * )
323
-     */
324
-    protected function _return_json($data)
325
-    {
326
-        $json = array(
327
-            'notices'  => EE_Error::get_notices(),
328
-            'data'     => $data,
329
-            'isEEajax' => true
330
-            // special flag so any ajax.Success methods in js can identify this return package as a EEajax package.
331
-        );
310
+	/**
311
+	 * Returns a json response
312
+	 *
313
+	 * @param array $data The data we want to send echo via in the JSON response's "data" element
314
+	 *
315
+	 * The returned json object is created from an array in the following format:
316
+	 * array(
317
+	 *    'notices' => '', // - contains any EE_Error formatted notices
318
+	 *    'data' => array() //this can be any key/value pairs that a method returns for later json parsing by the js.
319
+	 *    We're also going to include the template args with every package (so js can pick out any specific template
320
+	 *    args that might be included in here)
321
+	 *    'isEEajax' => true,//indicates this is a response from EE
322
+	 * )
323
+	 */
324
+	protected function _return_json($data)
325
+	{
326
+		$json = array(
327
+			'notices'  => EE_Error::get_notices(),
328
+			'data'     => $data,
329
+			'isEEajax' => true
330
+			// special flag so any ajax.Success methods in js can identify this return package as a EEajax package.
331
+		);
332 332
 
333 333
 
334
-        // make sure there are no php errors or headers_sent.  Then we can set correct json header.
335
-        if (null === error_get_last() || ! headers_sent()) {
336
-            header('Content-Type: application/json; charset=UTF-8');
337
-        }
338
-        echo wp_json_encode($json);
339
-        exit();
340
-    }
334
+		// make sure there are no php errors or headers_sent.  Then we can set correct json header.
335
+		if (null === error_get_last() || ! headers_sent()) {
336
+			header('Content-Type: application/json; charset=UTF-8');
337
+		}
338
+		echo wp_json_encode($json);
339
+		exit();
340
+	}
341 341
 
342
-    /**
343
-     * Gets the job step response which was done during the enqueuing of scripts
344
-     *
345
-     * @return \EventEspressoBatchRequest\Helpers\JobStepResponse
346
-     */
347
-    public function job_step_response()
348
-    {
349
-        return $this->_job_step_response;
350
-    }
342
+	/**
343
+	 * Gets the job step response which was done during the enqueuing of scripts
344
+	 *
345
+	 * @return \EventEspressoBatchRequest\Helpers\JobStepResponse
346
+	 */
347
+	public function job_step_response()
348
+	{
349
+		return $this->_job_step_response;
350
+	}
351 351
 
352
-    /**
353
-     * Gets the batch request type indicated in the $_REQUEST
354
-     *
355
-     * @return string: EED_Batch::batch_job, EED_Batch::batch_file_job, EED_Batch::batch_not_job
356
-     */
357
-    public function batch_request_type()
358
-    {
359
-        if ($this->_batch_request_type === null) {
360
-            if (isset($_GET['batch'])) {
361
-                if ($_GET['batch'] == self::batch_job) {
362
-                    $this->_batch_request_type = self::batch_job;
363
-                } elseif ($_GET['batch'] == self::batch_file_job) {
364
-                    $this->_batch_request_type = self::batch_file_job;
365
-                }
366
-            }
367
-            // if we didn't find that it was a batch request, indicate it wasn't
368
-            if ($this->_batch_request_type === null) {
369
-                $this->_batch_request_type = self::batch_not_job;
370
-            }
371
-        }
372
-        return $this->_batch_request_type;
373
-    }
352
+	/**
353
+	 * Gets the batch request type indicated in the $_REQUEST
354
+	 *
355
+	 * @return string: EED_Batch::batch_job, EED_Batch::batch_file_job, EED_Batch::batch_not_job
356
+	 */
357
+	public function batch_request_type()
358
+	{
359
+		if ($this->_batch_request_type === null) {
360
+			if (isset($_GET['batch'])) {
361
+				if ($_GET['batch'] == self::batch_job) {
362
+					$this->_batch_request_type = self::batch_job;
363
+				} elseif ($_GET['batch'] == self::batch_file_job) {
364
+					$this->_batch_request_type = self::batch_file_job;
365
+				}
366
+			}
367
+			// if we didn't find that it was a batch request, indicate it wasn't
368
+			if ($this->_batch_request_type === null) {
369
+				$this->_batch_request_type = self::batch_not_job;
370
+			}
371
+		}
372
+		return $this->_batch_request_type;
373
+	}
374 374
 
375
-    /**
376
-     * Unnecessary
377
-     *
378
-     * @param type $WP
379
-     */
380
-    public function run($WP)
381
-    {
382
-    }
375
+	/**
376
+	 * Unnecessary
377
+	 *
378
+	 * @param type $WP
379
+	 */
380
+	public function run($WP)
381
+	{
382
+	}
383 383
 }
Please login to merge, or discard this patch.
espresso.php 1 patch
Indentation   +80 added lines, -80 removed lines patch added patch discarded remove patch
@@ -38,103 +38,103 @@
 block discarded – undo
38 38
  * @since           4.0
39 39
  */
40 40
 if (function_exists('espresso_version')) {
41
-    if (! function_exists('espresso_duplicate_plugin_error')) {
42
-        /**
43
-         *    espresso_duplicate_plugin_error
44
-         *    displays if more than one version of EE is activated at the same time
45
-         */
46
-        function espresso_duplicate_plugin_error()
47
-        {
48
-            ?>
41
+	if (! function_exists('espresso_duplicate_plugin_error')) {
42
+		/**
43
+		 *    espresso_duplicate_plugin_error
44
+		 *    displays if more than one version of EE is activated at the same time
45
+		 */
46
+		function espresso_duplicate_plugin_error()
47
+		{
48
+			?>
49 49
             <div class="error">
50 50
                 <p>
51 51
                     <?php
52
-                    echo esc_html__(
53
-                        'Can not run multiple versions of Event Espresso! One version has been automatically deactivated. Please verify that you have the correct version you want still active.',
54
-                        'event_espresso'
55
-                    ); ?>
52
+					echo esc_html__(
53
+						'Can not run multiple versions of Event Espresso! One version has been automatically deactivated. Please verify that you have the correct version you want still active.',
54
+						'event_espresso'
55
+					); ?>
56 56
                 </p>
57 57
             </div>
58 58
             <?php
59
-            espresso_deactivate_plugin(plugin_basename(__FILE__));
60
-        }
61
-    }
62
-    add_action('admin_notices', 'espresso_duplicate_plugin_error', 1);
59
+			espresso_deactivate_plugin(plugin_basename(__FILE__));
60
+		}
61
+	}
62
+	add_action('admin_notices', 'espresso_duplicate_plugin_error', 1);
63 63
 } else {
64
-    define('EE_MIN_PHP_VER_REQUIRED', '5.4.0');
65
-    if (! version_compare(PHP_VERSION, EE_MIN_PHP_VER_REQUIRED, '>=')) {
66
-        /**
67
-         * espresso_minimum_php_version_error
68
-         *
69
-         * @return void
70
-         */
71
-        function espresso_minimum_php_version_error()
72
-        {
73
-            ?>
64
+	define('EE_MIN_PHP_VER_REQUIRED', '5.4.0');
65
+	if (! version_compare(PHP_VERSION, EE_MIN_PHP_VER_REQUIRED, '>=')) {
66
+		/**
67
+		 * espresso_minimum_php_version_error
68
+		 *
69
+		 * @return void
70
+		 */
71
+		function espresso_minimum_php_version_error()
72
+		{
73
+			?>
74 74
             <div class="error">
75 75
                 <p>
76 76
                     <?php
77
-                    printf(
78
-                        esc_html__(
79
-                            'We\'re sorry, but Event Espresso requires PHP version %1$s or greater in order to operate. You are currently running version %2$s.%3$sIn order to update your version of PHP, you will need to contact your current hosting provider.%3$sFor information on stable PHP versions, please go to %4$s.',
80
-                            'event_espresso'
81
-                        ),
82
-                        EE_MIN_PHP_VER_REQUIRED,
83
-                        PHP_VERSION,
84
-                        '<br/>',
85
-                        '<a href="http://php.net/downloads.php">http://php.net/downloads.php</a>'
86
-                    );
87
-                    ?>
77
+					printf(
78
+						esc_html__(
79
+							'We\'re sorry, but Event Espresso requires PHP version %1$s or greater in order to operate. You are currently running version %2$s.%3$sIn order to update your version of PHP, you will need to contact your current hosting provider.%3$sFor information on stable PHP versions, please go to %4$s.',
80
+							'event_espresso'
81
+						),
82
+						EE_MIN_PHP_VER_REQUIRED,
83
+						PHP_VERSION,
84
+						'<br/>',
85
+						'<a href="http://php.net/downloads.php">http://php.net/downloads.php</a>'
86
+					);
87
+					?>
88 88
                 </p>
89 89
             </div>
90 90
             <?php
91
-            espresso_deactivate_plugin(plugin_basename(__FILE__));
92
-        }
91
+			espresso_deactivate_plugin(plugin_basename(__FILE__));
92
+		}
93 93
 
94
-        add_action('admin_notices', 'espresso_minimum_php_version_error', 1);
95
-    } else {
96
-        define('EVENT_ESPRESSO_MAIN_FILE', __FILE__);
97
-        /**
98
-         * espresso_version
99
-         * Returns the plugin version
100
-         *
101
-         * @return string
102
-         */
103
-        function espresso_version()
104
-        {
105
-            return apply_filters('FHEE__espresso__espresso_version', '4.9.81.rc.003');
106
-        }
94
+		add_action('admin_notices', 'espresso_minimum_php_version_error', 1);
95
+	} else {
96
+		define('EVENT_ESPRESSO_MAIN_FILE', __FILE__);
97
+		/**
98
+		 * espresso_version
99
+		 * Returns the plugin version
100
+		 *
101
+		 * @return string
102
+		 */
103
+		function espresso_version()
104
+		{
105
+			return apply_filters('FHEE__espresso__espresso_version', '4.9.81.rc.003');
106
+		}
107 107
 
108
-        /**
109
-         * espresso_plugin_activation
110
-         * adds a wp-option to indicate that EE has been activated via the WP admin plugins page
111
-         */
112
-        function espresso_plugin_activation()
113
-        {
114
-            update_option('ee_espresso_activation', true);
115
-        }
108
+		/**
109
+		 * espresso_plugin_activation
110
+		 * adds a wp-option to indicate that EE has been activated via the WP admin plugins page
111
+		 */
112
+		function espresso_plugin_activation()
113
+		{
114
+			update_option('ee_espresso_activation', true);
115
+		}
116 116
 
117
-        register_activation_hook(EVENT_ESPRESSO_MAIN_FILE, 'espresso_plugin_activation');
117
+		register_activation_hook(EVENT_ESPRESSO_MAIN_FILE, 'espresso_plugin_activation');
118 118
 
119
-        require_once __DIR__ . '/core/bootstrap_espresso.php';
120
-        bootstrap_espresso();
121
-    }
119
+		require_once __DIR__ . '/core/bootstrap_espresso.php';
120
+		bootstrap_espresso();
121
+	}
122 122
 }
123 123
 if (! function_exists('espresso_deactivate_plugin')) {
124
-    /**
125
-     *    deactivate_plugin
126
-     * usage:  espresso_deactivate_plugin( plugin_basename( __FILE__ ));
127
-     *
128
-     * @access public
129
-     * @param string $plugin_basename - the results of plugin_basename( __FILE__ ) for the plugin's main file
130
-     * @return    void
131
-     */
132
-    function espresso_deactivate_plugin($plugin_basename = '')
133
-    {
134
-        if (! function_exists('deactivate_plugins')) {
135
-            require_once ABSPATH . 'wp-admin/includes/plugin.php';
136
-        }
137
-        unset($_GET['activate'], $_REQUEST['activate']);
138
-        deactivate_plugins($plugin_basename);
139
-    }
124
+	/**
125
+	 *    deactivate_plugin
126
+	 * usage:  espresso_deactivate_plugin( plugin_basename( __FILE__ ));
127
+	 *
128
+	 * @access public
129
+	 * @param string $plugin_basename - the results of plugin_basename( __FILE__ ) for the plugin's main file
130
+	 * @return    void
131
+	 */
132
+	function espresso_deactivate_plugin($plugin_basename = '')
133
+	{
134
+		if (! function_exists('deactivate_plugins')) {
135
+			require_once ABSPATH . 'wp-admin/includes/plugin.php';
136
+		}
137
+		unset($_GET['activate'], $_REQUEST['activate']);
138
+		deactivate_plugins($plugin_basename);
139
+	}
140 140
 }
Please login to merge, or discard this patch.