1: | <?php
|
2: | |
3: | |
4: | |
5: | |
6: | |
7: | |
8: | |
9: | |
10: | |
11: | |
12: |
|
13: | namespace Opencart\Admin\Controller\Tool;
|
14: | |
15: | |
16: | |
17: | |
18: |
|
19: | class Upgrade extends \Opencart\System\Engine\Controller {
|
20: | |
21: | |
22: | |
23: | |
24: |
|
25: | public function index(): void {
|
26: | $this->load->language('tool/upgrade');
|
27: |
|
28: | $this->document->setTitle($this->language->get('heading_title'));
|
29: |
|
30: | $data['breadcrumbs'] = [];
|
31: |
|
32: | $data['breadcrumbs'][] = [
|
33: | 'text' => $this->language->get('text_home'),
|
34: | 'href' => $this->url->link('common/dashboard', 'user_token=' . $this->session->data['user_token'])
|
35: | ];
|
36: |
|
37: | $data['breadcrumbs'][] = [
|
38: | 'text' => $this->language->get('heading_title'),
|
39: | 'href' => $this->url->link('tool/upgrade', 'user_token=' . $this->session->data['user_token'])
|
40: | ];
|
41: |
|
42: | $data['current_version'] = VERSION;
|
43: | $data['upgrade'] = false;
|
44: |
|
45: | $curl = curl_init(OPENCART_SERVER . 'index.php?route=api/upgrade');
|
46: |
|
47: | curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
|
48: | curl_setopt($curl, CURLOPT_FORBID_REUSE, 1);
|
49: | curl_setopt($curl, CURLOPT_FRESH_CONNECT, 1);
|
50: | curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
|
51: |
|
52: | $response = curl_exec($curl);
|
53: |
|
54: | curl_close($curl);
|
55: |
|
56: | $response_info = json_decode($response, true);
|
57: |
|
58: | if ($response_info) {
|
59: | $data['latest_version'] = $response_info['version'];
|
60: | $data['date_added'] = date($this->language->get('date_format_short'), strtotime($response_info['date_added']));
|
61: | $data['log'] = nl2br($response_info['log']);
|
62: |
|
63: | if (!version_compare(VERSION, $response_info['version'], '>=')) {
|
64: | $data['upgrade'] = true;
|
65: | }
|
66: | } else {
|
67: | $data['latest_version'] = '';
|
68: | $data['date_added'] = '';
|
69: | $data['log'] = '';
|
70: | }
|
71: |
|
72: |
|
73: |
|
74: |
|
75: | $data['user_token'] = $this->session->data['user_token'];
|
76: |
|
77: | $data['header'] = $this->load->controller('common/header');
|
78: | $data['column_left'] = $this->load->controller('common/column_left');
|
79: | $data['footer'] = $this->load->controller('common/footer');
|
80: |
|
81: | $this->response->setOutput($this->load->view('tool/upgrade', $data));
|
82: | }
|
83: |
|
84: | |
85: | |
86: | |
87: | |
88: |
|
89: | public function download(): void {
|
90: | $this->load->language('tool/upgrade');
|
91: |
|
92: | $json = [];
|
93: |
|
94: | if (isset($this->request->get['version'])) {
|
95: | $version = $this->request->get['version'];
|
96: | } else {
|
97: | $version = '';
|
98: | }
|
99: |
|
100: | if (!$this->user->hasPermission('modify', 'tool/upgrade')) {
|
101: | $json['error'] = $this->language->get('error_permission');
|
102: | }
|
103: |
|
104: | if (version_compare($version, VERSION, '<')) {
|
105: | $json['error'] = $this->language->get('error_version');
|
106: | }
|
107: |
|
108: | $file = DIR_DOWNLOAD . 'opencart-' . $version . '.zip';
|
109: |
|
110: | $handle = fopen($file, 'w');
|
111: |
|
112: | set_time_limit(0);
|
113: |
|
114: | $curl = curl_init('https://github.com/opencart/opencart/archive/' . $version . '.zip');
|
115: |
|
116: | curl_setopt($curl, CURLOPT_USERAGENT, 'OpenCart ' . VERSION);
|
117: | curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
|
118: | curl_setopt($curl, CURLOPT_FORBID_REUSE, 1);
|
119: | curl_setopt($curl, CURLOPT_FRESH_CONNECT, 1);
|
120: | curl_setopt($curl, CURLOPT_TIMEOUT, 300);
|
121: | curl_setopt($curl, CURLOPT_FILE, $handle);
|
122: |
|
123: | curl_exec($curl);
|
124: |
|
125: | fclose($handle);
|
126: |
|
127: | $status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
|
128: |
|
129: | if ($status != 200) {
|
130: | $json['error'] = $this->language->get('error_download');
|
131: | }
|
132: |
|
133: | curl_close($curl);
|
134: |
|
135: | if (!$json) {
|
136: | $json['text'] = $this->language->get('text_install');
|
137: |
|
138: | $json['next'] = $this->url->link('tool/upgrade.install', 'user_token=' . $this->session->data['user_token'] . '&version=' . $version, true);
|
139: | }
|
140: |
|
141: | $this->response->addHeader('Content-Type: application/json');
|
142: | $this->response->setOutput(json_encode($json));
|
143: | }
|
144: |
|
145: | |
146: | |
147: | |
148: | |
149: |
|
150: | public function install(): void {
|
151: | $this->load->language('tool/upgrade');
|
152: |
|
153: | $json = [];
|
154: |
|
155: | if (isset($this->request->get['version'])) {
|
156: | $version = $this->request->get['version'];
|
157: | } else {
|
158: | $version = '';
|
159: | }
|
160: |
|
161: | if (!$this->user->hasPermission('modify', 'tool/upgrade')) {
|
162: | $json['error'] = $this->language->get('error_permission');
|
163: | }
|
164: |
|
165: | $file = DIR_DOWNLOAD . 'opencart-' . $version . '.zip';
|
166: |
|
167: | if (!is_file($file)) {
|
168: | $json['error'] = $this->language->get('error_file');
|
169: | }
|
170: |
|
171: | if (!$json) {
|
172: |
|
173: | $zip = new \ZipArchive();
|
174: |
|
175: | if ($zip->open($file, \ZipArchive::RDONLY)) {
|
176: | $remove = 'opencart-' . $version . '/upload/';
|
177: |
|
178: |
|
179: | for ($i = 0; $i < $zip->numFiles; $i++) {
|
180: | $source = $zip->getNameIndex($i);
|
181: |
|
182: | if (substr($source, 0, strlen($remove)) == $remove) {
|
183: |
|
184: | $destination = str_replace('\\', '/', substr($source, strlen($remove)));
|
185: |
|
186: | if (substr($destination, 0, 8) == 'install/') {
|
187: |
|
188: | $path = '';
|
189: |
|
190: |
|
191: | $directories = explode('/', dirname($destination));
|
192: |
|
193: | foreach ($directories as $directory) {
|
194: | if (!$path) {
|
195: | $path = $directory;
|
196: | } else {
|
197: | $path = $path . '/' . $directory;
|
198: | }
|
199: |
|
200: | if (!is_dir(DIR_OPENCART . $path) && !@mkdir(DIR_OPENCART . $path, 0777)) {
|
201: | $json['error'] = sprintf($this->language->get('error_directory'), $path);
|
202: | }
|
203: | }
|
204: |
|
205: |
|
206: | if (substr($destination, -1) != '/') {
|
207: | if (is_file(DIR_OPENCART . $destination)) {
|
208: | unlink(DIR_OPENCART . $destination);
|
209: | }
|
210: |
|
211: | if (file_put_contents(DIR_OPENCART . $destination, $zip->getFromIndex($i)) === false) {
|
212: | $json['error'] = sprintf($this->language->get('error_copy'), $source, $destination);
|
213: | }
|
214: | }
|
215: | }
|
216: | }
|
217: | }
|
218: |
|
219: | $zip->close();
|
220: |
|
221: | $json['text'] = $this->language->get('text_patch');
|
222: |
|
223: | $json['next'] = HTTP_CATALOG . 'install/index.php?route=upgrade/upgrade_1&version=' . $version . '&admin=' . rtrim(substr(DIR_APPLICATION, strlen(DIR_OPENCART), -1));
|
224: | } else {
|
225: | $json['error'] = $this->language->get('error_unzip');
|
226: | }
|
227: | }
|
228: |
|
229: | $this->response->addHeader('Content-Type: application/json');
|
230: | $this->response->setOutput(json_encode($json));
|
231: | }
|
232: | }
|
233: | |