Completed
Branch FET/event-question-group-refac... (85b7cc)
by
unknown
45:20 queued 36:34
created

EEH_Sideloader::set_permissions()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
nc 1
nop 1
dl 0
loc 4
rs 10
c 0
b 0
f 0
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;
0 ignored issues
show
Bug introduced by
The property _upload_from_folder does not seem to exist. Did you mean _upload_from?

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.

Loading history...
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