PluginProbe
Elementor Website Builder – more than just a page builder / 4.0.0-dev5
Elementor Website Builder – more than just a page builder v4.0.0-dev5
4.3.0-beta2 4.3.0-beta1 4.2.4 4.2.3 4.2.2 4.2.1 4.2.0 4.1.5 4.2.0-beta2 4.2.0-dev2 4.2.0-beta1 4.1.4 4.1.3 4.1.2 4.1.1 4.1.0 4.1.0-beta3 4.1.0-dev3 4.0.9 4.1.0-beta2 4.1.0-dev2 4.0.8 4.1.0-beta1 4.1.0-dev1 4.0.7 All 451 releases
elementor / app / modules / import-export-customization / data / routes / upload.php

upload.php in Elementor Website Builder – more than just a page builder 4.0.0-dev5, at app/modules/import-export-customization/data/routes/upload.php

195 lines 5.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 namespace Elementor\App\Modules\ImportExportCustomization\Data\Routes;
3
4 use Elementor\App\Modules\ImportExportCustomization\Module as ImportExportCustomizationModule;
5 use Elementor\Plugin;
6 use Elementor\App\Modules\ImportExportCustomization\Data\Response;
7
8 if ( ! defined( 'ABSPATH' ) ) {
9 exit; // Exit if accessed directly.
10 }
11
12 class Upload extends Base_Route {
13 protected function get_route(): string {
14 return 'upload';
15 }
16
17 protected function get_method(): string {
18 return \WP_REST_Server::CREATABLE;
19 }
20
21 private function format_url( string $url ): string {
22 return wp_unslash( urldecode( $url ) );
23 }
24
25 /**
26 * @param $request \WP_REST_Request
27 * @return \WP_REST_Response
28 */
29 protected function callback( $request ): \WP_REST_Response {
30 /**
31 * @var $module ImportExportCustomizationModule
32 */
33 $module = Plugin::$instance->app->get_component( 'import-export-customization' );
34
35 try {
36 $file_url = $request->get_param( 'file_url' );
37 $kit_id = $request->get_param( 'kit_id' );
38 $source = $request->get_param( 'source' );
39 $module = Plugin::$instance->app->get_component( 'import-export-customization' );
40
41 $is_import_from_library = ! empty( $file_url );
42 if ( $is_import_from_library ) {
43 $file_url = $this->format_url( $file_url );
44 }
45
46 if ( $is_import_from_library ) {
47 if ( ! filter_var( $file_url, FILTER_VALIDATE_URL ) || 0 !== strpos( $file_url, 'http' ) ) {
48 return Response::error( ImportExportCustomizationModule::KIT_LIBRARY_ERROR_KEY, 'Invalid kit library URL.' );
49 }
50
51 $import_result = apply_filters( 'elementor/import/kit/result', [ 'file_url' => $file_url ] );
52 } elseif ( ! empty( $source ) ) {
53 $import_result = apply_filters( 'elementor/import/kit/result/' . $source, [
54 'kit_id' => $kit_id,
55 'source' => $source,
56 ] );
57 } else {
58 $files = $request->get_file_params();
59 $file = $files['e_import_file'] ?? null;
60
61 if ( empty( $file ) || empty( $file['tmp_name'] ) ) {
62 return Response::error( 'no_file_uploaded', 'No file uploaded or upload error occurred.' );
63 }
64
65 $import_result = [
66 'file_name' => $file['tmp_name'],
67 'referrer' => $module::REFERRER_LOCAL,
68 ];
69 }
70
71 Plugin::$instance->logger->get_logger()->info( 'Uploading Kit via REST API: ', [
72 'meta' => [
73 'kit_id' => $kit_id,
74 'referrer' => $import_result['referrer'] ?? 'unknown',
75 ],
76 ] );
77
78 if ( is_wp_error( $import_result ) ) {
79 return Response::error( $import_result->get_error_message(), 'upload_error' );
80 }
81
82 if ( ! empty( $import_result['media_file_name'] ) ) {
83 $this->setup_media_mapping( $import_result['media_file_name'] );
84 }
85
86 $uploaded_kit = $module->upload_kit( $import_result['file_name'], $import_result['referrer'], $kit_id );
87
88 $result = [
89 'session' => $uploaded_kit['session'],
90 'manifest' => $uploaded_kit['manifest'],
91 ];
92
93 if ( ! empty( $import_result['file_url'] ) ) {
94 $result['file_url'] = $import_result['file_url'];
95 }
96
97 if ( ! empty( $import_result['kit'] ) ) {
98 $result['uploaded_kit'] = $import_result['kit'];
99 }
100
101 if ( ! empty( $uploaded_kit['conflicts'] ) ) {
102 $result['conflicts'] = $uploaded_kit['conflicts'];
103 }
104
105 // Clean up temporary files
106 if ( $is_import_from_library || ! empty( $source ) ) {
107 Plugin::$instance->uploads_manager->remove_file_or_dir( dirname( $import_result['file_name'] ) );
108 }
109
110 return Response::success( $result );
111
112 } catch ( \Error |\Exception $e ) {
113 Plugin::$instance->logger->get_logger()->error( $e->getMessage(), [
114 'meta' => [
115 'trace' => $e->getTraceAsString(),
116 ],
117 ] );
118
119 if ( $module->is_third_party_class( $e->getTrace()[0]['class'] ) ) {
120 return Response::error( ImportExportCustomizationModule::THIRD_PARTY_ERROR, $e->getMessage() );
121 }
122
123 return Response::error( $e->getMessage(), 'upload_error' );
124 }
125 }
126
127 private function setup_media_mapping( $media_zip_path ) {
128 \Elementor\TemplateLibrary\Classes\Media_Mapper::clear_mapping();
129
130 $media_dir = null;
131
132 if ( file_exists( $media_zip_path ) ) {
133 $media_dir = $this->extract_media_zip( $media_zip_path );
134 }
135
136 if ( $media_dir && file_exists( $media_dir . '/media-mapping.json' ) ) {
137 $media_mapping = json_decode( file_get_contents( $media_dir . '/media-mapping.json' ), true );
138
139 \Elementor\TemplateLibrary\Classes\Media_Mapper::set_mapping( $media_mapping, $media_dir );
140 }
141
142 Plugin::$instance->uploads_manager->remove_file_or_dir( $media_zip_path );
143
144 return $media_dir;
145 }
146
147 private function extract_media_zip( $zip_path ) {
148 if ( ! class_exists( '\ZipArchive' ) ) {
149 return null;
150 }
151
152 $zip = new \ZipArchive();
153 if ( $zip->open( $zip_path ) !== true ) {
154 return null;
155 }
156
157 $media_dir = dirname( $zip_path ) . '/media';
158 if ( ! $zip->extractTo( $media_dir ) ) {
159 $zip->close();
160 return null;
161 }
162
163 $zip->close();
164
165 return $media_dir;
166 }
167
168 protected function get_args(): array {
169 return [
170 'file_url' => [
171 'type' => 'string',
172 'description' => 'File URL for upload action',
173 'required' => false,
174 'validate_callback' => function ( $value ) {
175 if ( empty( $value ) ) {
176 return true;
177 }
178
179 return filter_var( $this->format_url( $value ), FILTER_VALIDATE_URL );
180 },
181 ],
182 'kit_id' => [
183 'type' => 'string',
184 'description' => 'Kit ID for upload action',
185 'required' => false,
186 ],
187 'source' => [
188 'type' => 'string',
189 'description' => 'Source for upload action',
190 'required' => false,
191 ],
192 ];
193 }
194 }
195