1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
/** |
4
|
|
|
* EEH_Sideloader |
5
|
|
|
* |
6
|
|
|
* This is a helper utility class that provides "sideloading" functionality. Sideloading simply refers to retrieving files hosted elsehwere (usually github) that are downloaded into EE. |
7
|
|
|
* |
8
|
|
|
* @package Event Espresso |
9
|
|
|
* @subpackage /helpers/EEH_Sideloader.helper.php |
10
|
|
|
* @author Darren Ethier |
11
|
|
|
* |
12
|
|
|
* ------------------------------------------------------------------------ |
13
|
|
|
*/ |
14
|
|
|
class EEH_Sideloader extends EEH_Base |
15
|
|
|
{ |
16
|
|
|
|
17
|
|
|
private $_upload_to; |
18
|
|
|
private $_upload_from; |
19
|
|
|
private $_permissions; |
20
|
|
|
private $_new_file_name; |
21
|
|
|
|
22
|
|
|
|
23
|
|
|
/** |
24
|
|
|
* constructor allows the user to set the properties on the sideloader on construct. However, there are also setters for doing so. |
25
|
|
|
* |
26
|
|
|
* @access public |
27
|
|
|
* @param array $init array fo initializing the sideloader if keys match the properties. |
28
|
|
|
*/ |
29
|
|
|
public function __construct($init = array()) |
30
|
|
|
{ |
31
|
|
|
$this->_init($init); |
32
|
|
|
} |
33
|
|
|
|
34
|
|
|
|
35
|
|
|
/** |
36
|
|
|
* sets the properties for class either to defaults or using incoming initialization array |
37
|
|
|
* |
38
|
|
|
* @access private |
39
|
|
|
* @param array $init array on init (keys match properties others ignored) |
40
|
|
|
* @return void |
41
|
|
|
*/ |
42
|
|
|
private function _init($init) |
43
|
|
|
{ |
44
|
|
|
$defaults = array( |
45
|
|
|
'_upload_to' => $this->_get_wp_uploads_dir(), |
46
|
|
|
'_upload_from' => '', |
47
|
|
|
'_permissions' => 0644, |
48
|
|
|
'_new_file_name' => 'EE_Sideloader_' . uniqid() . '.default' |
49
|
|
|
); |
50
|
|
|
|
51
|
|
|
$props = array_merge($defaults, $init); |
52
|
|
|
|
53
|
|
|
foreach ($props as $key => $val) { |
54
|
|
|
if (EEH_Class_Tools::has_property($this, $key)) { |
55
|
|
|
$this->{$key} = $val; |
56
|
|
|
} |
57
|
|
|
} |
58
|
|
|
|
59
|
|
|
// make sure we include the required wp file for needed functions |
60
|
|
|
require_once(ABSPATH . 'wp-admin/includes/file.php'); |
61
|
|
|
} |
62
|
|
|
|
63
|
|
|
|
64
|
|
|
// utilities |
65
|
|
|
private function _get_wp_uploads_dir() |
66
|
|
|
{ |
67
|
|
|
} |
68
|
|
|
|
69
|
|
|
// setters |
70
|
|
|
public function set_upload_to($upload_to_folder) |
71
|
|
|
{ |
72
|
|
|
$this->_upload_to = $upload_to_folder; |
73
|
|
|
} |
74
|
|
|
public function set_upload_from($upload_from_folder) |
75
|
|
|
{ |
76
|
|
|
$this->_upload_from_folder = $upload_from_folder; |
|
|
|
|
77
|
|
|
} |
78
|
|
|
public function set_permissions($permissions) |
79
|
|
|
{ |
80
|
|
|
$this->_permissions = $permissions; |
81
|
|
|
} |
82
|
|
|
public function set_new_file_name($new_file_name) |
83
|
|
|
{ |
84
|
|
|
$this->_new_file_name = $new_file_name; |
85
|
|
|
} |
86
|
|
|
|
87
|
|
|
// getters |
88
|
|
|
public function get_upload_to() |
89
|
|
|
{ |
90
|
|
|
return $this->_upload_to; |
91
|
|
|
} |
92
|
|
|
public function get_upload_from() |
93
|
|
|
{ |
94
|
|
|
return $this->_upload_from; |
95
|
|
|
} |
96
|
|
|
public function get_permissions() |
97
|
|
|
{ |
98
|
|
|
return $this->_permissions; |
99
|
|
|
} |
100
|
|
|
public function get_new_file_name() |
101
|
|
|
{ |
102
|
|
|
return $this->_new_file_name; |
103
|
|
|
} |
104
|
|
|
|
105
|
|
|
|
106
|
|
|
// upload methods |
107
|
|
|
public function sideload() |
108
|
|
|
{ |
109
|
|
|
// setup temp dir |
110
|
|
|
$temp_file = wp_tempnam($this->_upload_from); |
111
|
|
|
|
112
|
|
|
if (!$temp_file) { |
113
|
|
|
EE_Error::add_error( |
114
|
|
|
esc_html__('Something went wrong with the upload. Unable to create a tmp file for the uploaded file on the server', 'event_espresso'), |
115
|
|
|
__FILE__, |
116
|
|
|
__FUNCTION__, |
117
|
|
|
__LINE__ |
118
|
|
|
); |
119
|
|
|
return false; |
120
|
|
|
} |
121
|
|
|
|
122
|
|
|
do_action('AHEE__EEH_Sideloader__sideload__before', $this, $temp_file); |
123
|
|
|
|
124
|
|
|
$wp_remote_args = apply_filters('FHEE__EEH_Sideloader__sideload__wp_remote_args', array( 'timeout' => 500, 'stream' => true, 'filename' => $temp_file ), $this, $temp_file); |
125
|
|
|
|
126
|
|
|
$response = wp_safe_remote_get($this->_upload_from, $wp_remote_args); |
127
|
|
|
|
128
|
|
|
if (is_wp_error($response) || 200 != wp_remote_retrieve_response_code($response)) { |
129
|
|
|
unlink($temp_file); |
130
|
|
|
if (defined('WP_DEBUG') && WP_DEBUG) { |
131
|
|
|
EE_Error::add_error( |
132
|
|
|
sprintf( |
133
|
|
|
esc_html__('Unable to upload the file. Either the path given to upload from is incorrect, or something else happened. Here is the path given: %s', 'event_espresso'), |
134
|
|
|
$this->_upload_from |
135
|
|
|
), |
136
|
|
|
__FILE__, |
137
|
|
|
__FUNCTION__, |
138
|
|
|
__LINE__ |
139
|
|
|
); |
140
|
|
|
} |
141
|
|
|
return false; |
142
|
|
|
} |
143
|
|
|
|
144
|
|
|
// possible md5 check |
145
|
|
|
$content_md5 = wp_remote_retrieve_header($response, 'content-md5'); |
146
|
|
|
if ($content_md5) { |
147
|
|
|
$md5_check = verify_file_md5($temp_file, $content_md5); |
148
|
|
|
if (is_wp_error($md5_check)) { |
149
|
|
|
unlink($temp_file); |
150
|
|
|
EE_Error::add_error( |
151
|
|
|
$md5_check->get_error_message(), |
152
|
|
|
__FILE__, |
153
|
|
|
__FUNCTION__, |
154
|
|
|
__LINE__ |
155
|
|
|
); |
156
|
|
|
return false; |
157
|
|
|
} |
158
|
|
|
} |
159
|
|
|
|
160
|
|
|
$file = $temp_file; |
161
|
|
|
|
162
|
|
|
// now we have the file, let's get it in the right directory with the right name. |
163
|
|
|
$path = apply_filters('FHEE__EEH_Sideloader__sideload__new_path', $this->_upload_to . $this->_new_file_name, $this); |
164
|
|
|
|
165
|
|
|
// move file in |
166
|
|
|
if (false === @ rename($file, $path)) { |
167
|
|
|
unlink($temp_file); |
168
|
|
|
EE_Error::add_error( |
169
|
|
|
sprintf( |
170
|
|
|
esc_html__('Unable to move the file to new location (possible permissions errors). This is the path the class attempted to move the file to: %s', 'event_espresso'), |
171
|
|
|
$path |
172
|
|
|
), |
173
|
|
|
__FILE__, |
174
|
|
|
__FUNCTION__, |
175
|
|
|
__LINE__ |
176
|
|
|
); |
177
|
|
|
return false; |
178
|
|
|
} |
179
|
|
|
|
180
|
|
|
// set permissions |
181
|
|
|
$permissions = apply_filters('FHEE__EEH_Sideloader__sideload__permissions_applied', $this->_permissions, $this); |
182
|
|
|
chmod($path, $permissions); |
183
|
|
|
|
184
|
|
|
// that's it. let's allow for actions after file uploaded. |
185
|
|
|
do_action('AHEE__EE_Sideloader__sideload_after', $this, $path); |
186
|
|
|
|
187
|
|
|
// unlink tempfile |
188
|
|
|
@unlink($temp_file); |
189
|
|
|
return true; |
190
|
|
|
} |
191
|
|
|
} //end EEH_Template class |
192
|
|
|
|
An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.
If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.