Failed Conditions
Push — improve/performance ( a6615f...85882a )
by Ryo
422:59 queued 414:38
created

PluginController::handler_down()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 7
Code Lines 4

Duplication

Lines 7
Ratio 100 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 7
loc 7
ccs 0
cts 4
cp 0
rs 9.4285
cc 1
eloc 4
nc 1
nop 2
crap 2
1
<?php
2
/*
3
 * This file is part of EC-CUBE
4
 *
5
 * Copyright(c) 2000-2015 LOCKON CO.,LTD. All Rights Reserved.
6
 *
7
 * http://www.lockon.co.jp/
8
 *
9
 * This program is free software; you can redistribute it and/or
10
 * modify it under the terms of the GNU General Public License
11
 * as published by the Free Software Foundation; either version 2
12
 * of the License, or (at your option) any later version.
13
 *
14
 * This program is distributed in the hope that it will be useful,
15
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
 * GNU General Public License for more details.
18
 *
19
 * You should have received a copy of the GNU General Public License
20
 * along with this program; if not, write to the Free Software
21
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22
 */
23
24
25
namespace Eccube\Controller\Admin\Store;
26
27
use Eccube\Application;
28
use Eccube\Common\Constant;
29
use Eccube\Controller\AbstractController;
30
use Eccube\Exception\PluginException;
31
use Eccube\Util\Cache;
32
use Eccube\Util\Str;
33
use Symfony\Component\Filesystem\Filesystem;
34
use Symfony\Component\Finder\Finder;
35
use Symfony\Component\HttpFoundation\Request;
36
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
37
use Symfony\Component\Routing\Exception\RouteNotFoundException;
38
use Symfony\Component\Validator\Constraints as Assert;
39
use Symfony\Component\Form\FormError;
40
use Monolog\Logger;
41
42
class PluginController extends AbstractController
0 ignored issues
show
introduced by
Missing class doc comment
Loading history...
43
{
44
45
    /**
46
     * @var string 証明書ファイル
47
     */
48
    private $certFileName = 'cacert.pem';
49
50
    /**
51
     * インストール済プラグイン画面
52
     *
53
     * @param Application $app
54
     * @param Request $request
0 ignored issues
show
introduced by
Expected 5 spaces after parameter type; 1 found
Loading history...
55
     */
0 ignored issues
show
introduced by
Missing @return tag in function comment
Loading history...
56
    public function index(Application $app, Request $request)
57
    {
58
59
        $pluginForms = array();
60
        $configPages = array();
61
62
        $Plugins = $app['eccube.repository.plugin']->findBy(array(), array('name' => 'ASC'));
63
64
        // ファイル設置プラグインの取得.
65
        $unregisterdPlugins = $this->getUnregisteredPlugins($Plugins, $app);
66
        $unregisterdPluginsConfigPages = array();
67
        foreach ($unregisterdPlugins as $unregisterdPlugin) {
68
            try {
69
                $code = $unregisterdPlugin['code'];
70
                // プラグイン用設定画面があれば表示(プラグイン用のサービスプロバイダーに定義されているか)
71
                $unregisterdPluginsConfigPages[$code] = $app->url('plugin_'.$code.'_config');
72
            } catch (RouteNotFoundException $e) {
73
                // プラグインで設定画面のルートが定義されていない場合は無視
74
            }
75
        }
76
77
        $officialPlugins = array();
78
        $unofficialPlugins = array();
79
80
        foreach ($Plugins as $Plugin) {
0 ignored issues
show
Coding Style introduced by
Blank line found at start of control structure
Loading history...
81
82
            $form = $app['form.factory']
83
                ->createNamedBuilder('form'.$Plugin->getId(), 'plugin_management', null, array(
84
                    'plugin_id' => $Plugin->getId(),
85
                ))
86
                ->getForm();
87
88
            $pluginForms[$Plugin->getId()] = $form->createView();
89
90
            try {
91
                // プラグイン用設定画面があれば表示(プラグイン用のサービスプロバイダーに定義されているか)
92
                $configPages[$Plugin->getCode()] = $app->url('plugin_'.$Plugin->getCode().'_config');
93
            } catch (\Exception $e) {
94
                // プラグインで設定画面のルートが定義されていない場合は無視
95
            }
96
97
            if ($Plugin->getSource() == 0) {
98
                // 商品IDが設定されていない場合、非公式プラグイン
99
                $unofficialPlugins[] = $Plugin;
100
            } else {
101
                $officialPlugins[] = $Plugin;
102
            }
103
0 ignored issues
show
Coding Style introduced by
Blank line found at end of control structure
Loading history...
104
        }
105
106
        // オーナーズストアからダウンロード可能プラグイン情報を取得
107
        $BaseInfo = $app['eccube.repository.base_info']->get();
108
109
        $authKey = $BaseInfo->getAuthenticationKey();
110
111
        if (!is_null($authKey)) {
0 ignored issues
show
Coding Style introduced by
Blank line found at start of control structure
Loading history...
112
113
            // オーナーズストア通信
114
            $url = $app['config']['owners_store_url'].'?method=list';
115
            list($json, $info) = $this->getRequestApi($request, $authKey, $url, $app);
0 ignored issues
show
Unused Code introduced by
The assignment to $info is unused. Consider omitting it like so list($first,,$third).

This checks looks for assignemnts to variables using the list(...) function, where not all assigned variables are subsequently used.

Consider the following code example.

<?php

function returnThreeValues() {
    return array('a', 'b', 'c');
}

list($a, $b, $c) = returnThreeValues();

print $a . " - " . $c;

Only the variables $a and $c are used. There was no need to assign $b.

Instead, the list call could have been.

list($a,, $c) = returnThreeValues();
Loading history...
116
117
            if ($json) {
0 ignored issues
show
Coding Style introduced by
Blank line found at start of control structure
Loading history...
118
119
                // 接続成功時
120
121
                $data = json_decode($json, true);
122
123
                if (isset($data['success'])) {
124
                    $success = $data['success'];
125
                    if ($success == '1') {
0 ignored issues
show
Coding Style introduced by
Blank line found at start of control structure
Loading history...
126
127
                        // 既にインストールされているかどうか確認
128
                        foreach ($data['item'] as $item) {
129
                            foreach ($officialPlugins as $plugin) {
130
                                if ($plugin->getSource() == $item['product_id']) {
131
                                    // 商品IDが同一の情報を設定
132
                                    $plugin->setNewVersion($item['version']);
133
                                    $plugin->setLastUpdateDate($item['last_update_date']);
134
                                    $plugin->setProductUrl($item['product_url']);
135
                                    $plugin->setEccubeVersion($item['eccube_version']);
136
137
                                    if ($plugin->getVersion() != $item['version']) {
138
                                        // バージョンが異なる
139
                                        $plugin->setUpdateStatus(3);
140
                                        break;
141
                                    }
142
                                }
143
                            }
144
                        }
145
                    }
146
                }
147
            }
148
        }
149
150
151
        return $app->render('Store/plugin.twig', array(
152
            'plugin_forms' => $pluginForms,
153
            'officialPlugins' => $officialPlugins,
154
            'unofficialPlugins' => $unofficialPlugins,
155
            'configPages' => $configPages,
156
            'unregisterdPlugins' => $unregisterdPlugins,
157
            'unregisterdPluginsConfigPages' => $unregisterdPluginsConfigPages,
158
        ));
159
160
    }
161
162
    /**
0 ignored issues
show
introduced by
Doc comment for parameter "$id" missing
Loading history...
163
     * インストール済プラグインからのアップデート
164
     *
165
     * @param Application $app
166
     * @param Request $request
0 ignored issues
show
introduced by
Expected 5 spaces after parameter type; 1 found
Loading history...
167
     * @param $id
0 ignored issues
show
introduced by
Missing parameter name
Loading history...
168
     */
0 ignored issues
show
introduced by
Missing @return tag in function comment
Loading history...
169
    public function update(Application $app, Request $request, $id)
170
    {
171
172
        $Plugin = $app['eccube.repository.plugin']->find($id);
173
174
        $form = $app['form.factory']
175
            ->createNamedBuilder('form'.$id, 'plugin_management', null, array(
176
                'plugin_id' => null, // placeHolder
177
            ))
178
            ->getForm();
179
180
        $message = '';
181
182
        if ('POST' === $request->getMethod()) {
183
            $form->handleRequest($request);
184
185
            if ($form->isValid()) {
0 ignored issues
show
Coding Style introduced by
Blank line found at start of control structure
Loading history...
186
187
                $tmpDir = null;
188
                try {
0 ignored issues
show
Coding Style introduced by
Blank line found at start of control structure
Loading history...
189
190
                    $formFile = $form['plugin_archive']->getData();
191
192
                    $tmpDir = $app['eccube.service.plugin']->createTempDir();
193
                    $tmpFile = sha1(Str::random(32)).'.'.$formFile->getClientOriginalExtension();
194
195
                    $formFile->move($tmpDir, $tmpFile);
196
                    $app['eccube.service.plugin']->update($Plugin, $tmpDir.'/'.$tmpFile);
197
198
                    $fs = new Filesystem();
199
                    $fs->remove($tmpDir);
200
201
                    $app->addSuccess('admin.plugin.update.complete', 'admin');
202
203
                    Cache::clear($app, false);
204
205
                    return $app->redirect($app->url('admin_store_plugin'));
206
0 ignored issues
show
Coding Style introduced by
Blank line found at end of control structure
Loading history...
207
                } catch (PluginException $e) {
208
                    if (!empty($tmpDir) && file_exists($tmpDir)) {
209
                        $fs = new Filesystem();
210
                        $fs->remove($tmpDir);
211
                    }
212
                    $message = $e->getMessage();
213
                }
214
            } else {
215
                $errors = $form->getErrors(true);
216
                foreach ($errors as $error) {
217
                    $message = $error->getMessage();
218
                }
219
0 ignored issues
show
Coding Style introduced by
Blank line found at end of control structure
Loading history...
220
            }
221
0 ignored issues
show
Coding Style introduced by
Blank line found at end of control structure
Loading history...
222
        }
223
224
        $app->addError($message, 'admin');
225
226
        return $app->redirect($app->url('admin_store_plugin'));
227
    }
228
229
230
    /**
0 ignored issues
show
introduced by
Doc comment for parameter "$id" missing
Loading history...
231
     * 対象のプラグインを有効にします。
232
     *
233
     * @param Application $app
234
     * @param $id
0 ignored issues
show
introduced by
Missing parameter name
Loading history...
235
     */
0 ignored issues
show
introduced by
Missing @return tag in function comment
Loading history...
236 View Code Duplication
    public function enable(Application $app, $id)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
237
    {
238
        $this->isTokenValid($app);
239
240
        $Plugin = $app['eccube.repository.plugin']->find($id);
241
242
        if (!$Plugin) {
243
            throw new NotFoundHttpException();
244
        }
245
246
        if ($Plugin->getEnable() == Constant::ENABLED) {
247
            $app->addError('admin.plugin.already.enable', 'admin');
248
        } else {
249
            $app['eccube.service.plugin']->enable($Plugin);
250
            $app->addSuccess('admin.plugin.enable.complete', 'admin');
251
        }
252
253
        return $app->redirect($app->url('admin_store_plugin'));
254
    }
255
256
    /**
0 ignored issues
show
introduced by
Doc comment for parameter "$id" missing
Loading history...
257
     * 対象のプラグインを無効にします。
258
     *
259
     * @param Application $app
260
     * @param $id
0 ignored issues
show
introduced by
Missing parameter name
Loading history...
261
     */
0 ignored issues
show
introduced by
Missing @return tag in function comment
Loading history...
262 View Code Duplication
    public function disable(Application $app, $id)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
263
    {
264
        $this->isTokenValid($app);
265
266
        $Plugin = $app['eccube.repository.plugin']->find($id);
267
268
        if (!$Plugin) {
269
            throw new NotFoundHttpException();
270
        }
271
272
        if ($Plugin->getEnable() == Constant::ENABLED) {
273
            $app['eccube.service.plugin']->disable($Plugin);
274
            $app->addSuccess('admin.plugin.disable.complete', 'admin');
275
        } else {
276
            $app->addError('admin.plugin.already.disable', 'admin');
277
        }
278
279
        return $app->redirect($app->url('admin_store_plugin'));
280
    }
281
282
283
    /**
0 ignored issues
show
introduced by
Doc comment for parameter "$id" missing
Loading history...
284
     * 対象のプラグインを削除します。
285
     *
286
     * @param Application $app
287
     * @param $id
0 ignored issues
show
introduced by
Missing parameter name
Loading history...
288
     */
0 ignored issues
show
introduced by
Missing @return tag in function comment
Loading history...
289
    public function uninstall(Application $app, $id)
290
    {
291
        $this->isTokenValid($app);
292
293
        $Plugin = $app['eccube.repository.plugin']->find($id);
294
295
        if (!$Plugin) {
296
            $app->deleteMessage();
297
            return $app->redirect($app->url('admin_store_plugin'));
0 ignored issues
show
introduced by
Missing blank line before return statement
Loading history...
298
        }
299
300
        $app['eccube.service.plugin']->uninstall($Plugin);
301
302
        $app->addSuccess('admin.plugin.uninstall.complete', 'admin');
303
304
        return $app->redirect($app->url('admin_store_plugin'));
305
    }
306
307
    public function handler(Application $app)
0 ignored issues
show
introduced by
Missing function doc comment
Loading history...
308
    {
309
        $handlers = $app['eccube.repository.plugin_event_handler']->getHandlers();
310
311
        // 一次元配列からイベント毎の二次元配列に変換する
312
        $HandlersPerEvent = array();
313
        foreach ($handlers as $handler) {
314
            $HandlersPerEvent[$handler->getEvent()][$handler->getHandlerType()][] = $handler;
315
        }
316
317
        return $app->render('Store/plugin_handler.twig', array(
0 ignored issues
show
introduced by
Add a comma after each item in a multi-line array
Loading history...
318
            'handlersPerEvent' => $HandlersPerEvent
319
        ));
320
321
    }
322
323 View Code Duplication
    public function handler_up(Application $app, $handlerId)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
introduced by
Missing function doc comment
Loading history...
Coding Style introduced by
Method name "PluginController::handler_up" is not in camel caps format
Loading history...
324
    {
325
        $repo = $app['eccube.repository.plugin_event_handler'];
326
        $repo->upPriority($repo->find($handlerId));
327
328
        return $app->redirect($app->url('admin_store_plugin_handler'));
329
    }
330
331 View Code Duplication
    public function handler_down(Application $app, $handlerId)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
introduced by
Missing function doc comment
Loading history...
Coding Style introduced by
Method name "PluginController::handler_down" is not in camel caps format
Loading history...
332
    {
333
        $repo = $app['eccube.repository.plugin_event_handler'];
334
        $repo->upPriority($repo->find($handlerId), false);
335
336
        return $app->redirect($app->url('admin_store_plugin_handler'));
337
    }
338
339
    /**
340
     * プラグインファイルアップロード画面
341
     *
342
     * @param Application $app
343
     * @param Request $request
0 ignored issues
show
introduced by
Expected 5 spaces after parameter type; 1 found
Loading history...
344
     */
0 ignored issues
show
introduced by
Missing @return tag in function comment
Loading history...
345
    public function install(Application $app, Request $request)
346
    {
347
        $form = $app['form.factory']
348
            ->createBuilder('plugin_local_install')
349
            ->getForm();
350
351
        $errors = array();
352
353
        if ('POST' === $request->getMethod()) {
354
            $form->handleRequest($request);
355
356
            if ($form->isValid()) {
0 ignored issues
show
Coding Style introduced by
Blank line found at start of control structure
Loading history...
357
358
                $tmpDir = null;
359
                try {
360
                    $service = $app['eccube.service.plugin'];
361
362
                    $formFile = $form['plugin_archive']->getData();
363
364
                    $tmpDir = $service->createTempDir();
365
                    $tmpFile = sha1(Str::random(32)).'.'.$formFile->getClientOriginalExtension(); // 拡張子を付けないとpharが動かないので付ける
366
367
                    $formFile->move($tmpDir, $tmpFile);
368
369
                    $service->install($tmpDir.'/'.$tmpFile);
370
371
                    $fs = new Filesystem();
372
                    $fs->remove($tmpDir);
373
374
                    $app->addSuccess('admin.plugin.install.complete', 'admin');
375
376
                    return $app->redirect($app->url('admin_store_plugin'));
377
0 ignored issues
show
Coding Style introduced by
Blank line found at end of control structure
Loading history...
378
                } catch (PluginException $e) {
379
                    if (!empty($tmpDir) && file_exists($tmpDir)) {
380
                        $fs = new Filesystem();
381
                        $fs->remove($tmpDir);
382
                    }
383
                    $app['monolog']->error("plugin install failed.", array(
0 ignored issues
show
introduced by
Add a comma after each item in a multi-line array
Loading history...
384
                        'original-message' => $e->getMessage()
385
                    ));
386
                    $errors[] = $e;
387
                }
388
            } else {
389
                foreach ($form->getErrors(true) as $error) {
390
                    $errors[] = $error;
391
                }
392
            }
393
        }
394
395
        return $app->render('Store/plugin_install.twig', array(
396
            'form' => $form->createView(),
397
            'errors' => $errors,
398
        ));
399
400
    }
401
402
    /**
403
     * オーナーズストアプラグインインストール画面
404
     *
405
     * @param Application $app
406
     * @param Request $request
0 ignored issues
show
introduced by
Expected 5 spaces after parameter type; 1 found
Loading history...
407
     * @return \Symfony\Component\HttpFoundation\Response
408
     */
409
    public function ownersInstall(Application $app, Request $request)
410
    {
411
        // オーナーズストアからダウンロード可能プラグイン情報を取得
412
        $BaseInfo = $app['eccube.repository.base_info']->get();
413
414
        $authKey = $BaseInfo->getAuthenticationKey();
415
        $authResult = true;
416
        $success = 0;
417
        $items = array();
418
        $promotionItems = array();
419
        $message = '';
420
        if (!is_null($authKey)) {
0 ignored issues
show
Coding Style introduced by
Blank line found at start of control structure
Loading history...
421
422
            // オーナーズストア通信
423
            $url = $app['config']['owners_store_url'].'?method=list';
424
            list($json, $info) = $this->getRequestApi($request, $authKey, $url, $app);
425
426
            if ($json === false) {
427
                // 接続失敗時
428
                $success = 0;
429
430
                $message = $this->getResponseErrorMessage($info);
431
0 ignored issues
show
Coding Style introduced by
Blank line found at end of control structure
Loading history...
432
            } else {
433
                // 接続成功時
434
435
                $data = json_decode($json, true);
436
437
                if (isset($data['success'])) {
438
                    $success = $data['success'];
439
                    if ($success == '1') {
440
                        $items = array();
441
442
                        // 既にインストールされているかどうか確認
443
                        $Plugins = $app['eccube.repository.plugin']->findAll();
444
                        $status = false;
445
                        // update_status 1 : 未インストール、2 : インストール済、 3 : 更新あり、4 : 有料購入
446
                        foreach ($data['item'] as $item) {
447
                            foreach ($Plugins as $plugin) {
448
                                if ($plugin->getSource() == $item['product_id']) {
449
                                    if ($plugin->getVersion() == $item['version']) {
450
                                        // バージョンが同じ
451
                                        $item['update_status'] = 2;
452
                                    } else {
453
                                        // バージョンが異なる
454
                                        $item['update_status'] = 3;
455
                                    }
456
                                    $items[] = $item;
457
                                    $status = true;
458
                                    break;
459
                                }
460
                            }
461
                            if (!$status) {
462
                                // 未インストール
463
                                $item['update_status'] = 1;
464
                                $items[] = $item;
465
                            }
466
                            $status = false;
467
                        }
468
469
                        // EC-CUBEのバージョンチェック
470
                        // 参照渡しをして値を追加
471
                        foreach ($items as &$item) {
472
                            if (in_array(Constant::VERSION, $item['eccube_version'])) {
473
                                // 対象バージョン
474
                                $item['version_check'] = 1;
475
                            } else {
476
                                // 未対象バージョン
477
                                $item['version_check'] = 0;
478
                            }
479
                            if ($item['price'] != '0' && $item['purchased'] == '0') {
480
                                // 有料商品で未購入
481
                                $item['update_status'] = 4;
482
                            }
483
                        }
484
                        unset($item);
485
486
                        // promotionアイテム
487
                        $i = 0;
488
                        foreach ($items as $item) {
489
                            if ($item['promotion'] == 1) {
490
                                $promotionItems[] = $item;
491
                                unset($items[$i]);
492
                            }
493
                            $i++;
494
                        }
495
0 ignored issues
show
Coding Style introduced by
Blank line found at end of control structure
Loading history...
496
                    } else {
497
                        $message = $data['error_code'].' : '.$data['error_message'];
498
                    }
499
                } else {
500
                    $success = 0;
501
                    $message = "EC-CUBEオーナーズストアにエラーが発生しています。";
502
                }
503
            }
504
0 ignored issues
show
Coding Style introduced by
Blank line found at end of control structure
Loading history...
505
        } else {
506
            $authResult = false;
507
        }
508
509
        return $app->render('Store/plugin_owners_install.twig', array(
510
            'authResult' => $authResult,
511
            'success' => $success,
512
            'items' => $items,
513
            'promotionItems' => $promotionItems,
514
            'message' => $message,
515
        ));
516
517
    }
518
519
    /**
0 ignored issues
show
introduced by
Doc comment for parameter "$action" missing
Loading history...
introduced by
Doc comment for parameter "$version" missing
Loading history...
introduced by
Doc comment for parameter "$id" missing
Loading history...
520
     * オーナーズブラグインインストール、アップデート
521
     *
522
     * @param Application $app
523
     * @param Request $request
0 ignored issues
show
introduced by
Expected 5 spaces after parameter type; 1 found
Loading history...
524
     * @param $action
0 ignored issues
show
introduced by
Missing parameter name
Loading history...
525
     * @param $id
0 ignored issues
show
introduced by
Missing parameter name
Loading history...
526
     * @param $version
0 ignored issues
show
introduced by
Missing parameter name
Loading history...
527
     */
0 ignored issues
show
introduced by
Missing @return tag in function comment
Loading history...
528
    public function upgrade(Application $app, Request $request, $action, $id, $version)
529
    {
530
531
        $BaseInfo = $app['eccube.repository.base_info']->get();
532
533
        $authKey = $BaseInfo->getAuthenticationKey();
534
        $message = '';
535
536
        if (!is_null($authKey)) {
0 ignored issues
show
Coding Style introduced by
Blank line found at start of control structure
Loading history...
537
538
            // オーナーズストア通信
539
            $url = $app['config']['owners_store_url'].'?method=download&product_id='.$id;
540
            list($json, $info) = $this->getRequestApi($request, $authKey, $url, $app);
541
542
            if ($json === false) {
543
                // 接続失敗時
544
545
                $message = $this->getResponseErrorMessage($info);
546
0 ignored issues
show
Coding Style introduced by
Blank line found at end of control structure
Loading history...
547
            } else {
548
                // 接続成功時
549
550
                $data = json_decode($json, true);
551
552
                if (isset($data['success'])) {
553
                    $success = $data['success'];
554
                    if ($success == '1') {
555
                        $tmpDir = null;
556
                        try {
557
                            $service = $app['eccube.service.plugin'];
558
559
                            $item = $data['item'];
560
                            $file = base64_decode($item['data']);
561
                            $extension = pathinfo($item['file_name'], PATHINFO_EXTENSION);
562
563
                            $tmpDir = $service->createTempDir();
564
                            $tmpFile = sha1(Str::random(32)).'.'.$extension;
565
566
                            // ファイル作成
567
                            $fs = new Filesystem();
568
                            $fs->dumpFile($tmpDir.'/'.$tmpFile, $file);
569
570
                            if ($action == 'install') {
0 ignored issues
show
Coding Style introduced by
Blank line found at start of control structure
Loading history...
571
572
                                $service->install($tmpDir.'/'.$tmpFile, $id);
573
                                $app->addSuccess('admin.plugin.install.complete', 'admin');
574
0 ignored issues
show
Coding Style introduced by
Blank line found at end of control structure
Loading history...
575
                            } else if ($action == 'update') {
0 ignored issues
show
Coding Style introduced by
Blank line found at start of control structure
Loading history...
576
577
                                $Plugin = $app['eccube.repository.plugin']->findOneBy(array('source' => $id));
578
579
                                $service->update($Plugin, $tmpDir.'/'.$tmpFile);
580
                                $app->addSuccess('admin.plugin.update.complete', 'admin');
581
582
                                Cache::clear($app, false);
583
0 ignored issues
show
Coding Style introduced by
Blank line found at end of control structure
Loading history...
584
                            }
585
586
                            $fs = new Filesystem();
587
                            $fs->remove($tmpDir);
588
589
                            // ダウンロード完了通知処理(正常終了時)
590
                            $url = $app['config']['owners_store_url'].'?method=commit&product_id='.$id.'&status=1&version='.$version;
591
                            $this->getRequestApi($request, $authKey, $url, $app);
592
593
                            return $app->redirect($app->url('admin_store_plugin'));
594
0 ignored issues
show
Coding Style introduced by
Blank line found at end of control structure
Loading history...
595
                        } catch (PluginException $e) {
596
                            if (!empty($tmpDir) && file_exists($tmpDir)) {
597
                                $fs = new Filesystem();
598
                                $fs->remove($tmpDir);
599
                            }
600
                            $message = $e->getMessage();
601
                        }
602
0 ignored issues
show
Coding Style introduced by
Blank line found at end of control structure
Loading history...
603
                    } else {
604
                        $message = $data['error_code'].' : '.$data['error_message'];
605
                    }
606
                } else {
607
                    $message = "EC-CUBEオーナーズストアにエラーが発生しています。";
608
                }
609
            }
610
        }
611
612
        // ダウンロード完了通知処理(エラー発生時)
613
        $url = $app['config']['owners_store_url'].'?method=commit&product_id='.$id.'&status=0&version='.$version.'&message='.urlencode($message);
614
        $this->getRequestApi($request, $authKey, $url, $app);
615
616
        $app->addError($message, 'admin');
617
618
        return $app->redirect($app->url('admin_store_plugin_owners_install'));
619
    }
620
621
    /**
622
     * 認証キー設定画面
623
     *
624
     * @param Application $app
625
     * @param Request $request
0 ignored issues
show
introduced by
Expected 5 spaces after parameter type; 1 found
Loading history...
626
     */
0 ignored issues
show
introduced by
Missing @return tag in function comment
Loading history...
627
    public function authenticationSetting(Application $app, Request $request)
628
    {
629
630
        $form = $app->form()->getForm();
631
632
        $BaseInfo = $app['eccube.repository.base_info']->get();
633
634
        // 認証キーの取得
635
        $form->add(
636
            'authentication_key', 'text', array(
637
            'label' => '認証キー',
638
            'constraints' => array(
639
                new Assert\Regex(array(
640
                    'pattern' => "/^[0-9a-zA-Z]+$/",
641
                )),
642
            ),
643
            'data' => $BaseInfo->getAuthenticationKey(),
644
        ));
645
646
        if ('POST' === $request->getMethod()) {
647
            $form->handleRequest($request);
648
649
            if ($form->isValid()) {
650
                $data = $form->getData();
651
652
                // 認証キーの登録
653
                $BaseInfo->setAuthenticationKey($data['authentication_key']);
654
                $app['orm.em']->flush($BaseInfo);
655
656
                $app->addSuccess('admin.plugin.authentication.setting.complete', 'admin');
657
0 ignored issues
show
Coding Style introduced by
Blank line found at end of control structure
Loading history...
658
            }
659
        }
660
661
662
        return $app->render('Store/authentication_setting.twig', array(
663
            'form' => $form->createView(),
664
        ));
665
666
    }
667
668
669
    /**
670
     * 認証キーダウンロード
671
     *
672
     * @param Application $app
673
     * @param Request $request
0 ignored issues
show
introduced by
Expected 5 spaces after parameter type; 1 found
Loading history...
674
     * @return \Symfony\Component\HttpFoundation\RedirectResponse
675
     */
676
    public function download(Application $app, Request $request)
0 ignored issues
show
Unused Code introduced by
The parameter $request is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
677
    {
678
679
        $this->isTokenValid($app);
680
681
        $url = $app['config']['cacert_pem_url'];
682
683
        $curl = curl_init($url);
684
        $fileName = $app['config']['root_dir'].'/app/config/eccube/'.$this->certFileName;
685
        $fp = fopen($fileName, 'w');
686
        if ($fp === false) {
687
            $app->addError('admin.plugin.download.pem.error', 'admin');
688
            $app->log('Cannot fopen to '.$fileName, array(), Logger::ERROR);
689
            return $app->redirect($app->url('admin_store_authentication_setting'));
0 ignored issues
show
introduced by
Missing blank line before return statement
Loading history...
690
        }
691
692
        curl_setopt($curl, CURLOPT_FILE, $fp);
693
        curl_setopt($curl, CURLOPT_HEADER, 0);
694
695
        $results = curl_exec($curl);
696
        $error = curl_error($curl);
697
        curl_close($curl);
698
699
        // curl で取得できない場合は file_get_contents で取得を試みる
700
        if ($results === false) {
701
            $file = file_get_contents($url);
702
            if ($file !== false) {
703
                fwrite($fp, $file);
704
            }
705
        }
706
        fclose($fp);
707
708
        $f = new Filesystem();
709
        if ($f->exists($fileName) && filesize($fileName) > 0) {
710
            $app->addSuccess('admin.plugin.download.pem.complete', 'admin');
711
        } else {
712
            $app->addError('admin.plugin.download.pem.error', 'admin');
713
            $app->log('curl_error: '.$error, array(), Logger::ERROR);
714
        }
715
716
        return $app->redirect($app->url('admin_store_authentication_setting'));
717
718
    }
719
720
721
    /**
722
     * APIリクエスト処理
723
     *
724
     * @param Request $request
725
     * @param $authKey
726
     * @param string $url
727
     * @param Application $app
728
     * @return array
729
     */
730
    private function getRequestApi(Request $request, $authKey, $url, $app)
731
    {
732
        $curl = curl_init($url);
733
734
        $options = array(           // オプション配列
735
            //HEADER
736
            CURLOPT_HTTPHEADER => array(
737
                'Authorization: '.base64_encode($authKey),
738
                'x-eccube-store-url: '.base64_encode($request->getSchemeAndHttpHost().$request->getBasePath()),
739
                'x-eccube-store-version: '.base64_encode(Constant::VERSION),
740
            ),
741
            CURLOPT_HTTPGET => true,
742
            CURLOPT_SSL_VERIFYPEER => true,
743
            CURLOPT_RETURNTRANSFER => true,
744
            CURLOPT_FAILONERROR => true,
745
        );
746
747
        curl_setopt_array($curl, $options); /// オプション値を設定
748
749
        $certFile = $app['config']['root_dir'].'/app/config/eccube/'.$this->certFileName;
750
        if (file_exists($certFile)) {
751
            // php5.6でサーバ上に適切な証明書がなければhttps通信エラーが発生するため、
752
            // http://curl.haxx.se/ca/cacert.pem を利用して通信する
753
            curl_setopt($curl, CURLOPT_CAINFO, $certFile);
754
        }
755
756
        $result = curl_exec($curl);
757
        $info = curl_getinfo($curl);
758
759
        $message = curl_error($curl);
760
        $info['message'] = $message;
761
        curl_close($curl);
762
763
        $app->log('http get_info', $info);
764
765
        return array($result, $info);
766
    }
767
768
    /**
769
     * レスポンスのチェック
770
     *
771
     * @param $info
772
     * @return string
773
     */
774
    private function getResponseErrorMessage($info)
775
    {
776
        if (!empty($info)) {
777
            $statusCode = $info['http_code'];
778
            $message = $info['message'];
779
780
            $message = $statusCode.' : '.$message;
781
0 ignored issues
show
Coding Style introduced by
Blank line found at end of control structure
Loading history...
782
        } else {
783
            $message = "タイムアウトエラーまたはURLの指定に誤りがあります。";
784
        }
785
786
        return $message;
787
    }
788
789
790
    /**
791
     * フォルダ設置のみのプラグインを取得する.
792
     *
793
     * @param array $plugins
794
     * @param Application $app
795
     * @return array
796
     */
797
    protected function getUnregisteredPlugins(array $plugins, \Eccube\Application $app)
0 ignored issues
show
introduced by
Declare public methods first, then protected ones and finally private ones
Loading history...
798
    {
799
        $finder = new Finder();
800
        $pluginCodes = array();
801
802
        // DB登録済みプラグインコードのみ取得
803
        foreach ($plugins as $key => $plugin) {
804
            $pluginCodes[] = $plugin->getCode();
805
        }
806
        // DB登録済みプラグインコードPluginディレクトリから排他
807
        $dirs = $finder->in($app['config']['plugin_realdir'])->depth(0)->directories();
808
809
        // プラグイン基本チェック
810
        $unregisteredPlugins = array();
811
        foreach ($dirs as $dir) {
812
            $pluginCode = $dir->getBasename();
813
            if (in_array($pluginCode, $pluginCodes, true)) {
814
                continue;
815
            }
816
            try {
817
                $app['eccube.service.plugin']->checkPluginArchiveContent($dir->getRealPath());
818
            } catch (\Eccube\Exception\PluginException $e) {
819
                //config.yamlに不備があった際は全てスキップ
820
                $app['monolog']->warning($e->getMessage());
821
                continue;
822
            }
823
            $config = $app['eccube.service.plugin']->readYml($dir->getRealPath().'/config.yml');
824
            $unregisteredPlugins[$pluginCode]['name'] = isset($config['name']) ? $config['name'] : null;
825
            $unregisteredPlugins[$pluginCode]['event'] = isset($config['event']) ? $config['event'] : null;
826
            $unregisteredPlugins[$pluginCode]['version'] = isset($config['version']) ? $config['version'] : null;
827
            $unregisteredPlugins[$pluginCode]['enable'] = Constant::DISABLED;
828
            $unregisteredPlugins[$pluginCode]['code'] = isset($config['code']) ? $config['code'] : null;
829
        }
830
831
        return $unregisteredPlugins;
832
    }
833
}
834