Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 16
CRAP
0.00% covered (danger)
0.00%
0 / 466
PluginController
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 16
7832
0.00% covered (danger)
0.00%
0 / 466
 index
0.00% covered (danger)
0.00%
0 / 1
210
0.00% covered (danger)
0.00%
0 / 69
 update
0.00% covered (danger)
0.00%
0 / 1
56
0.00% covered (danger)
0.00%
0 / 39
 enable
0.00% covered (danger)
0.00%
0 / 1
12
0.00% covered (danger)
0.00%
0 / 14
 disable
0.00% covered (danger)
0.00%
0 / 1
12
0.00% covered (danger)
0.00%
0 / 14
 uninstall
0.00% covered (danger)
0.00%
0 / 1
6
0.00% covered (danger)
0.00%
0 / 11
 handler
0.00% covered (danger)
0.00%
0 / 1
6
0.00% covered (danger)
0.00%
0 / 10
 handler_up
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 5
 handler_down
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 5
 install
0.00% covered (danger)
0.00%
0 / 1
56
0.00% covered (danger)
0.00%
0 / 41
 ownersInstall
0.00% covered (danger)
0.00%
0 / 1
272
0.00% covered (danger)
0.00%
0 / 79
 upgrade
0.00% covered (danger)
0.00%
0 / 1
110
0.00% covered (danger)
0.00%
0 / 57
 authenticationSetting
0.00% covered (danger)
0.00%
0 / 1
12
0.00% covered (danger)
0.00%
0 / 26
 download
0.00% covered (danger)
0.00%
0 / 1
42
0.00% covered (danger)
0.00%
0 / 32
 getRequestApi
0.00% covered (danger)
0.00%
0 / 1
6
0.00% covered (danger)
0.00%
0 / 26
 getResponseErrorMessage
0.00% covered (danger)
0.00%
0 / 1
6
0.00% covered (danger)
0.00%
0 / 10
 getUnregisteredPlugins
0.00% covered (danger)
0.00%
0 / 1
90
0.00% covered (danger)
0.00%
0 / 28
<?php
/*
 * This file is part of EC-CUBE
 *
 * Copyright(c) 2000-2015 LOCKON CO.,LTD. All Rights Reserved.
 *
 * http://www.lockon.co.jp/
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */
namespace Eccube\Controller\Admin\Store;
use Eccube\Application;
use Eccube\Common\Constant;
use Eccube\Controller\AbstractController;
use Eccube\Exception\PluginException;
use Eccube\Util\Str;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\Finder\Finder;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Routing\Exception\RouteNotFoundException;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Form\FormError;
use Monolog\Logger;
class PluginController extends AbstractController
{
    /**
     * @var string 証明書ファイル
     */
    private $certFileName = 'cacert.pem';
    /**
     * インストール済プラグイン画面
     *
     * @param Application $app
     * @param Request $request
     */
    public function index(Application $app, Request $request)
    {
        $pluginForms = array();
        $configPages = array();
        $Plugins = $app['eccube.repository.plugin']->findBy(array(), array('name' => 'ASC'));
        // ファイル設置プラグインの取得.
        $unregisterdPlugins = $this->getUnregisteredPlugins($Plugins, $app);
        $unregisterdPluginsConfigPages = array();
        foreach ($unregisterdPlugins as $unregisterdPlugin) {
            try {
                $code = $unregisterdPlugin['code'];
                // プラグイン用設定画面があれば表示(プラグイン用のサービスプロバイダーに定義されているか)
                $unregisterdPluginsConfigPages[$code] = $app->url('plugin_'.$code.'_config');
            } catch (RouteNotFoundException $e) {
                // プラグインで設定画面のルートが定義されていない場合は無視
            }
        }
        $officialPlugins = array();
        $unofficialPlugins = array();
        foreach ($Plugins as $Plugin) {
            $form = $app['form.factory']
                ->createNamedBuilder('form'.$Plugin->getId(), 'plugin_management', null, array(
                    'plugin_id' => $Plugin->getId(),
                ))
                ->getForm();
            $pluginForms[$Plugin->getId()] = $form->createView();
            try {
                // プラグイン用設定画面があれば表示(プラグイン用のサービスプロバイダーに定義されているか)
                $configPages[$Plugin->getCode()] = $app->url('plugin_'.$Plugin->getCode().'_config');
            } catch (\Exception $e) {
                // プラグインで設定画面のルートが定義されていない場合は無視
            }
            if ($Plugin->getSource() == 0) {
                // 商品IDが設定されていない場合、非公式プラグイン
                $unofficialPlugins[] = $Plugin;
            } else {
                $officialPlugins[] = $Plugin;
            }
        }
        // オーナーズストアからダウンロード可能プラグイン情報を取得
        $BaseInfo = $app['eccube.repository.base_info']->get();
        $authKey = $BaseInfo->getAuthenticationKey();
        if (!is_null($authKey)) {
            // オーナーズストア通信
            $url = $app['config']['owners_store_url'].'?method=list';
            list($json, $info) = $this->getRequestApi($request, $authKey, $url, $app);
            if ($json) {
                // 接続成功時
                $data = json_decode($json, true);
                if (isset($data['success'])) {
                    $success = $data['success'];
                    if ($success == '1') {
                        // 既にインストールされているかどうか確認
                        foreach ($data['item'] as $item) {
                            foreach ($officialPlugins as $plugin) {
                                if ($plugin->getSource() == $item['product_id']) {
                                    // 商品IDが同一の情報を設定
                                    $plugin->setNewVersion($item['version']);
                                    $plugin->setLastUpdateDate($item['last_update_date']);
                                    $plugin->setProductUrl($item['product_url']);
                                    $plugin->setEccubeVersion($item['eccube_version']);
                                    if ($plugin->getVersion() != $item['version']) {
                                        // バージョンが異なる
                                        $plugin->setUpdateStatus(3);
                                        break;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        return $app->render('Store/plugin.twig', array(
            'plugin_forms' => $pluginForms,
            'officialPlugins' => $officialPlugins,
            'unofficialPlugins' => $unofficialPlugins,
            'configPages' => $configPages,
            'unregisterdPlugins' => $unregisterdPlugins,
            'unregisterdPluginsConfigPages' => $unregisterdPluginsConfigPages,
        ));
    }
    /**
     * インストール済プラグインからのアップデート
     *
     * @param Application $app
     * @param Request $request
     * @param $id
     */
    public function update(Application $app, Request $request, $id)
    {
        $Plugin = $app['eccube.repository.plugin']->find($id);
        $form = $app['form.factory']
            ->createNamedBuilder('form'.$id, 'plugin_management', null, array(
                'plugin_id' => null, // placeHolder
            ))
            ->getForm();
        $message = '';
        if ('POST' === $request->getMethod()) {
            $form->handleRequest($request);
            if ($form->isValid()) {
                $tmpDir = null;
                try {
                    $formFile = $form['plugin_archive']->getData();
                    $tmpDir = $app['eccube.service.plugin']->createTempDir();
                    $tmpFile = sha1(Str::random(32)).'.'.$formFile->getClientOriginalExtension();
                    $formFile->move($tmpDir, $tmpFile);
                    $app['eccube.service.plugin']->update($Plugin, $tmpDir.'/'.$tmpFile);
                    $fs = new Filesystem();
                    $fs->remove($tmpDir);
                    $app->addSuccess('admin.plugin.update.complete', 'admin');
                    return $app->redirect($app->url('admin_store_plugin'));
                } catch (PluginException $e) {
                    if (!empty($tmpDir) && file_exists($tmpDir)) {
                        $fs = new Filesystem();
                        $fs->remove($tmpDir);
                    }
                    $message = $e->getMessage();
                }
            } else {
                $errors = $form->getErrors(true);
                foreach ($errors as $error) {
                    $message = $error->getMessage();
                }
            }
        }
        $app->addError($message, 'admin');
        return $app->redirect($app->url('admin_store_plugin'));
    }
    /**
     * 対象のプラグインを有効にします。
     *
     * @param Application $app
     * @param $id
     */
    public function enable(Application $app, $id)
    {
        $this->isTokenValid($app);
        $Plugin = $app['eccube.repository.plugin']->find($id);
        if (!$Plugin) {
            throw new NotFoundHttpException();
        }
        if ($Plugin->getEnable() == Constant::ENABLED) {
            $app->addError('admin.plugin.already.enable', 'admin');
        } else {
            $app['eccube.service.plugin']->enable($Plugin);
            $app->addSuccess('admin.plugin.enable.complete', 'admin');
        }
        return $app->redirect($app->url('admin_store_plugin'));
    }
    /**
     * 対象のプラグインを無効にします。
     *
     * @param Application $app
     * @param $id
     */
    public function disable(Application $app, $id)
    {
        $this->isTokenValid($app);
        $Plugin = $app['eccube.repository.plugin']->find($id);
        if (!$Plugin) {
            throw new NotFoundHttpException();
        }
        if ($Plugin->getEnable() == Constant::ENABLED) {
            $app['eccube.service.plugin']->disable($Plugin);
            $app->addSuccess('admin.plugin.disable.complete', 'admin');
        } else {
            $app->addError('admin.plugin.already.disable', 'admin');
        }
        return $app->redirect($app->url('admin_store_plugin'));
    }
    /**
     * 対象のプラグインを削除します。
     *
     * @param Application $app
     * @param $id
     */
    public function uninstall(Application $app, $id)
    {
        $this->isTokenValid($app);
        $Plugin = $app['eccube.repository.plugin']->find($id);
        if (!$Plugin) {
            $app->deleteMessage();
            return $app->redirect($app->url('admin_store_plugin'));
        }
        $app['eccube.service.plugin']->uninstall($Plugin);
        $app->addSuccess('admin.plugin.uninstall.complete', 'admin');
        return $app->redirect($app->url('admin_store_plugin'));
    }
    public function handler(Application $app)
    {
        $handlers = $app['eccube.repository.plugin_event_handler']->getHandlers();
        // 一次元配列からイベント毎の二次元配列に変換する
        $HandlersPerEvent = array();
        foreach ($handlers as $handler) {
            $HandlersPerEvent[$handler->getEvent()][$handler->getHandlerType()][] = $handler;
        }
        return $app->render('Store/plugin_handler.twig', array(
            'handlersPerEvent' => $HandlersPerEvent
        ));
    }
    public function handler_up(Application $app, $handlerId)
    {
        $repo = $app['eccube.repository.plugin_event_handler'];
        $repo->upPriority($repo->find($handlerId));
        return $app->redirect($app->url('admin_store_plugin_handler'));
    }
    public function handler_down(Application $app, $handlerId)
    {
        $repo = $app['eccube.repository.plugin_event_handler'];
        $repo->upPriority($repo->find($handlerId), false);
        return $app->redirect($app->url('admin_store_plugin_handler'));
    }
    /**
     * プラグインファイルアップロード画面
     *
     * @param Application $app
     * @param Request $request
     */
    public function install(Application $app, Request $request)
    {
        $form = $app['form.factory']
            ->createBuilder('plugin_local_install')
            ->getForm();
        $errors = array();
        if ('POST' === $request->getMethod()) {
            $form->handleRequest($request);
            if ($form->isValid()) {
                $tmpDir = null;
                try {
                    $service = $app['eccube.service.plugin'];
                    $formFile = $form['plugin_archive']->getData();
                    $tmpDir = $service->createTempDir();
                    $tmpFile = sha1(Str::random(32)).'.'.$formFile->getClientOriginalExtension(); // 拡張子を付けないとpharが動かないので付ける
                    $formFile->move($tmpDir, $tmpFile);
                    $service->install($tmpDir.'/'.$tmpFile);
                    $fs = new Filesystem();
                    $fs->remove($tmpDir);
                    $app->addSuccess('admin.plugin.install.complete', 'admin');
                    return $app->redirect($app->url('admin_store_plugin'));
                } catch (PluginException $e) {
                    if (!empty($tmpDir) && file_exists($tmpDir)) {
                        $fs = new Filesystem();
                        $fs->remove($tmpDir);
                    }
                    $app['monolog']->error("plugin install failed.", array(
                        'original-message' => $e->getMessage()
                    ));
                    $errors[] = $e;
                }
            } else {
                foreach ($form->getErrors(true) as $error) {
                    $errors[] = $error;
                }
            }
        }
        return $app->render('Store/plugin_install.twig', array(
            'form' => $form->createView(),
            'errors' => $errors,
        ));
    }
    /**
     * オーナーズストアプラグインインストール画面
     *
     * @param Application $app
     * @param Request $request
     * @return \Symfony\Component\HttpFoundation\Response
     */
    public function ownersInstall(Application $app, Request $request)
    {
        // オーナーズストアからダウンロード可能プラグイン情報を取得
        $BaseInfo = $app['eccube.repository.base_info']->get();
        $authKey = $BaseInfo->getAuthenticationKey();
        $authResult = true;
        $success = 0;
        $items = array();
        $promotionItems = array();
        $message = '';
        if (!is_null($authKey)) {
            // オーナーズストア通信
            $url = $app['config']['owners_store_url'].'?method=list';
            list($json, $info) = $this->getRequestApi($request, $authKey, $url, $app);
            if ($json === false) {
                // 接続失敗時
                $success = 0;
                $message = $this->getResponseErrorMessage($info);
            } else {
                // 接続成功時
                $data = json_decode($json, true);
                if (isset($data['success'])) {
                    $success = $data['success'];
                    if ($success == '1') {
                        $items = array();
                        // 既にインストールされているかどうか確認
                        $Plugins = $app['eccube.repository.plugin']->findAll();
                        $status = false;
                        // update_status 1 : 未インストール、2 : インストール済、 3 : 更新あり、4 : 有料購入
                        foreach ($data['item'] as $item) {
                            foreach ($Plugins as $plugin) {
                                if ($plugin->getSource() == $item['product_id']) {
                                    if ($plugin->getVersion() == $item['version']) {
                                        // バージョンが同じ
                                        $item['update_status'] = 2;
                                    } else {
                                        // バージョンが異なる
                                        $item['update_status'] = 3;
                                    }
                                    $items[] = $item;
                                    $status = true;
                                    break;
                                }
                            }
                            if (!$status) {
                                // 未インストール
                                $item['update_status'] = 1;
                                $items[] = $item;
                            }
                            $status = false;
                        }
                        // EC-CUBEのバージョンチェック
                        // 参照渡しをして値を追加
                        foreach ($items as &$item) {
                            if (in_array(Constant::VERSION, $item['eccube_version'])) {
                                // 対象バージョン
                                $item['version_check'] = 1;
                            } else {
                                // 未対象バージョン
                                $item['version_check'] = 0;
                            }
                            if ($item['price'] != '0' && $item['purchased'] == '0') {
                                // 有料商品で未購入
                                $item['update_status'] = 4;
                            }
                        }
                        unset($item);
                        // promotionアイテム
                        $i = 0;
                        foreach ($items as $item) {
                            if ($item['promotion'] == 1) {
                                $promotionItems[] = $item;
                                unset($items[$i]);
                            }
                            $i++;
                        }
                    } else {
                        $message = $data['error_code'].' : '.$data['error_message'];
                    }
                } else {
                    $success = 0;
                    $message = "EC-CUBEオーナーズストアにエラーが発生しています。";
                }
            }
        } else {
            $authResult = false;
        }
        return $app->render('Store/plugin_owners_install.twig', array(
            'authResult' => $authResult,
            'success' => $success,
            'items' => $items,
            'promotionItems' => $promotionItems,
            'message' => $message,
        ));
    }
    /**
     * オーナーズブラグインインストール、アップデート
     *
     * @param Application $app
     * @param Request $request
     * @param $action
     * @param $id
     * @param $version
     */
    public function upgrade(Application $app, Request $request, $action, $id, $version)
    {
        $BaseInfo = $app['eccube.repository.base_info']->get();
        $authKey = $BaseInfo->getAuthenticationKey();
        $message = '';
        if (!is_null($authKey)) {
            // オーナーズストア通信
            $url = $app['config']['owners_store_url'].'?method=download&product_id='.$id;
            list($json, $info) = $this->getRequestApi($request, $authKey, $url, $app);
            if ($json === false) {
                // 接続失敗時
                $message = $this->getResponseErrorMessage($info);
            } else {
                // 接続成功時
                $data = json_decode($json, true);
                if (isset($data['success'])) {
                    $success = $data['success'];
                    if ($success == '1') {
                        $tmpDir = null;
                        try {
                            $service = $app['eccube.service.plugin'];
                            $item = $data['item'];
                            $file = base64_decode($item['data']);
                            $extension = pathinfo($item['file_name'], PATHINFO_EXTENSION);
                            $tmpDir = $service->createTempDir();
                            $tmpFile = sha1(Str::random(32)).'.'.$extension;
                            // ファイル作成
                            $fs = new Filesystem();
                            $fs->dumpFile($tmpDir.'/'.$tmpFile, $file);
                            if ($action == 'install') {
                                $service->install($tmpDir.'/'.$tmpFile, $id);
                                $app->addSuccess('admin.plugin.install.complete', 'admin');
                            } else if ($action == 'update') {
                                $Plugin = $app['eccube.repository.plugin']->findOneBy(array('source' => $id));
                                $service->update($Plugin, $tmpDir.'/'.$tmpFile);
                                $app->addSuccess('admin.plugin.update.complete', 'admin');
                            }
                            $fs = new Filesystem();
                            $fs->remove($tmpDir);
                            // ダウンロード完了通知処理(正常終了時)
                            $url = $app['config']['owners_store_url'].'?method=commit&product_id='.$id.'&status=1&version='.$version;
                            $this->getRequestApi($request, $authKey, $url, $app);
                            return $app->redirect($app->url('admin_store_plugin'));
                        } catch (PluginException $e) {
                            if (!empty($tmpDir) && file_exists($tmpDir)) {
                                $fs = new Filesystem();
                                $fs->remove($tmpDir);
                            }
                            $message = $e->getMessage();
                        }
                    } else {
                        $message = $data['error_code'].' : '.$data['error_message'];
                    }
                } else {
                    $message = "EC-CUBEオーナーズストアにエラーが発生しています。";
                }
            }
        }
        // ダウンロード完了通知処理(エラー発生時)
        $url = $app['config']['owners_store_url'].'?method=commit&product_id='.$id.'&status=0&version='.$version.'&message='.urlencode($message);
        $this->getRequestApi($request, $authKey, $url, $app);
        $app->addError($message, 'admin');
        return $app->redirect($app->url('admin_store_plugin_owners_install'));
    }
    /**
     * 認証キー設定画面
     *
     * @param Application $app
     * @param Request $request
     */
    public function authenticationSetting(Application $app, Request $request)
    {
        $form = $app->form()->getForm();
        $BaseInfo = $app['eccube.repository.base_info']->get();
        // 認証キーの取得
        $form->add(
            'authentication_key', 'text', array(
            'label' => '認証キー',
            'constraints' => array(
                new Assert\Regex(array(
                    'pattern' => "/^[0-9a-zA-Z]+$/",
                )),
            ),
            'data' => $BaseInfo->getAuthenticationKey(),
        ));
        if ('POST' === $request->getMethod()) {
            $form->handleRequest($request);
            if ($form->isValid()) {
                $data = $form->getData();
                // 認証キーの登録
                $BaseInfo->setAuthenticationKey($data['authentication_key']);
                $app['orm.em']->flush($BaseInfo);
                $app->addSuccess('admin.plugin.authentication.setting.complete', 'admin');
            }
        }
        return $app->render('Store/authentication_setting.twig', array(
            'form' => $form->createView(),
        ));
    }
    /**
     * 認証キーダウンロード
     *
     * @param Application $app
     * @param Request $request
     * @return \Symfony\Component\HttpFoundation\RedirectResponse
     */
    public function download(Application $app, Request $request)
    {
        $this->isTokenValid($app);
        $url = $app['config']['cacert_pem_url'];
        $curl = curl_init($url);
        $fileName = $app['config']['root_dir'].'/app/config/eccube/'.$this->certFileName;
        $fp = fopen($fileName, 'w');
        if ($fp === false) {
            $app->addError('admin.plugin.download.pem.error', 'admin');
            $app->log('Cannot fopen to '.$fileName, array(), Logger::ERROR);
            return $app->redirect($app->url('admin_store_authentication_setting'));
        }
        curl_setopt($curl, CURLOPT_FILE, $fp);
        curl_setopt($curl, CURLOPT_HEADER, 0);
        $results = curl_exec($curl);
        $error = curl_error($curl);
        curl_close($curl);
        // curl で取得できない場合は file_get_contents で取得を試みる
        if ($results === false) {
            $file = file_get_contents($url);
            if ($file !== false) {
                fwrite($fp, $file);
            }
        }
        fclose($fp);
        $f = new Filesystem();
        if ($f->exists($fileName) && filesize($fileName) > 0) {
            $app->addSuccess('admin.plugin.download.pem.complete', 'admin');
        } else {
            $app->addError('admin.plugin.download.pem.error', 'admin');
            $app->log('curl_error: '.$error, array(), Logger::ERROR);
        }
        return $app->redirect($app->url('admin_store_authentication_setting'));
    }
    /**
     * APIリクエスト処理
     *
     * @param Request $request
     * @param $authKey
     * @param string $url
     * @param Application $app
     * @return array
     */
    private function getRequestApi(Request $request, $authKey, $url, $app)
    {
        $curl = curl_init($url);
        $options = array(           // オプション配列
            //HEADER
            CURLOPT_HTTPHEADER => array(
                'Authorization: '.base64_encode($authKey),
                'x-eccube-store-url: '.base64_encode($request->getSchemeAndHttpHost().$request->getBasePath()),
                'x-eccube-store-version: '.base64_encode(Constant::VERSION),
            ),
            CURLOPT_HTTPGET => true,
            CURLOPT_SSL_VERIFYPEER => true,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_FAILONERROR => true,
        );
        curl_setopt_array($curl, $options); /// オプション値を設定
        $certFile = $app['config']['root_dir'].'/app/config/eccube/'.$this->certFileName;
        if (file_exists($certFile)) {
            // php5.6でサーバ上に適切な証明書がなければhttps通信エラーが発生するため、
            // http://curl.haxx.se/ca/cacert.pem を利用して通信する
            curl_setopt($curl, CURLOPT_CAINFO, $certFile);
        }
        $result = curl_exec($curl);
        $info = curl_getinfo($curl);
        $message = curl_error($curl);
        $info['message'] = $message;
        curl_close($curl);
        $app->log('http get_info', $info);
        return array($result, $info);
    }
    /**
     * レスポンスのチェック
     *
     * @param $info
     * @return string
     */
    private function getResponseErrorMessage($info)
    {
        if (!empty($info)) {
            $statusCode = $info['http_code'];
            $message = $info['message'];
            $message = $statusCode.' : '.$message;
        } else {
            $message = "タイムアウトエラーまたはURLの指定に誤りがあります。";
        }
        return $message;
    }
    /**
     * フォルダ設置のみのプラグインを取得する.
     *
     * @param array $plugins
     * @param Application $app
     * @return array
     */
    protected function getUnregisteredPlugins(array $plugins, \Eccube\Application $app)
    {
        $finder = new Finder();
        $pluginCodes = array();
        // DB登録済みプラグインコードのみ取得
        foreach ($plugins as $key => $plugin) {
            $pluginCodes[] = $plugin->getCode();
        }
        // DB登録済みプラグインコードPluginディレクトリから排他
        $dirs = $finder->in($app['config']['plugin_realdir'])->depth(0)->directories();
        // プラグイン基本チェック
        $unregisteredPlugins = array();
        foreach ($dirs as $dir) {
            $pluginCode = $dir->getBasename();
            if (in_array($pluginCode, $pluginCodes, true)) {
                continue;
            }
            try {
                $app['eccube.service.plugin']->checkPluginArchiveContent($dir->getRealPath());
            } catch (\Eccube\Exception\PluginException $e) {
                //config.yamlに不備があった際は全てスキップ
                $app['monolog']->warning($e->getMessage());
                continue;
            }
            $config = $app['eccube.service.plugin']->readYml($dir->getRealPath().'/config.yml');
            $unregisteredPlugins[$pluginCode]['name'] = isset($config['name']) ? $config['name'] : null;
            $unregisteredPlugins[$pluginCode]['event'] = isset($config['event']) ? $config['event'] : null;
            $unregisteredPlugins[$pluginCode]['version'] = isset($config['version']) ? $config['version'] : null;
            $unregisteredPlugins[$pluginCode]['enable'] = Constant::DISABLED;
            $unregisteredPlugins[$pluginCode]['code'] = isset($config['code']) ? $config['code'] : null;
        }
        return $unregisteredPlugins;
    }
}