Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 30 |
CRAP | |
0.00% |
0 / 631 |
InstallController | |
0.00% |
0 / 1 |
|
0.00% |
0 / 30 |
7832 | |
0.00% |
0 / 631 |
__construct | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 5 |
|||
isValid | |
0.00% |
0 / 1 |
20 | |
0.00% |
0 / 13 |
|||
getSessionData | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 3 |
|||
index | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 4 |
|||
step1 | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 15 |
|||
step2 | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 16 |
|||
step3 | |
0.00% |
0 / 1 |
42 | |
0.00% |
0 / 47 |
|||
step4 | |
0.00% |
0 / 1 |
30 | |
0.00% |
0 / 30 |
|||
step5 | |
0.00% |
0 / 1 |
30 | |
0.00% |
0 / 46 |
|||
complete | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 11 |
|||
resetNatTimer | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 5 |
|||
checkModules | |
0.00% |
0 / 1 |
342 | |
0.00% |
0 / 33 |
|||
setPDO | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 12 |
|||
dropTables | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 9 |
|||
getEntityManager | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 23 |
|||
createTables | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 8 |
|||
insert | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 49 |
|||
update | |
0.00% |
0 / 1 |
12 | |
0.00% |
0 / 47 |
|||
getMigration | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 12 |
|||
doMigrate | |
0.00% |
0 / 1 |
12 | |
0.00% |
0 / 12 |
|||
getProtectedDirs | |
0.00% |
0 / 1 |
12 | |
0.00% |
0 / 20 |
|||
createConfigYamlFile | |
0.00% |
0 / 1 |
30 | |
0.00% |
0 / 37 |
|||
addInstallStatus | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 8 |
|||
createDatabaseYamlFile | |
0.00% |
0 / 1 |
56 | |
0.00% |
0 / 49 |
|||
createMailYamlFile | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 23 |
|||
createPathYamlFile | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 23 |
|||
sendAppData | |
0.00% |
0 / 1 |
12 | |
0.00% |
0 / 40 |
|||
migration | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 5 |
|||
migration_plugin | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 16 |
|||
migration_end | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 10 |
<?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\Install; | |
use Doctrine\DBAL\Migrations\Configuration\Configuration; | |
use Doctrine\DBAL\Migrations\Migration; | |
use Doctrine\DBAL\Migrations\MigrationException; | |
use Doctrine\ORM\EntityManager; | |
use Doctrine\ORM\Tools\SchemaTool; | |
use Eccube\Common\Constant; | |
use Eccube\InstallApplication; | |
use Eccube\Util\Str; | |
use Symfony\Component\Filesystem\Filesystem; | |
use Symfony\Component\Finder\Finder; | |
use Symfony\Component\Form\Form; | |
use Symfony\Component\HttpFoundation\Request; | |
use Symfony\Component\Yaml\Yaml; | |
class InstallController | |
{ | |
private $app; | |
private $PDO; | |
private $config_path; | |
private $dist_path; | |
private $cache_path; | |
private $session_data; | |
private $required_modules = array('pdo', 'phar', 'mbstring', 'zlib', 'ctype', 'session', 'JSON', 'xml', 'libxml', 'OpenSSL', 'zip', 'cURL', 'fileinfo'); | |
private $recommended_module = array('hash', 'mcrypt'); | |
const SESSION_KEY = 'eccube.session.install'; | |
public function __construct() | |
{ | |
$this->config_path = __DIR__ . '/../../../../app/config/eccube'; | |
$this->dist_path = __DIR__ . '/../../Resource/config'; | |
$this->cache_path = __DIR__ . '/../../../../app/cache'; | |
} | |
private function isValid(Request $request, Form $form) | |
{ | |
$session = $request->getSession(); | |
if ('POST' === $request->getMethod()) { | |
$form->handleRequest($request); | |
if ($form->isValid()) { | |
$sessionData = $session->get(self::SESSION_KEY) ?: array(); | |
$formData = array_replace_recursive($sessionData, $form->getData()); | |
$session->set(self::SESSION_KEY, $formData); | |
return true; | |
} | |
} | |
return false; | |
} | |
private function getSessionData(Request $request) | |
{ | |
return $this->session_data = $request->getSession()->get(self::SESSION_KEY); | |
} | |
// 最初からやり直す場合、SESSION情報をクリア | |
public function index(InstallApplication $app, Request $request) | |
{ | |
$request->getSession()->remove(self::SESSION_KEY); | |
return $app->redirect($app->url('install_step1')); | |
} | |
// ようこそ | |
public function step1(InstallApplication $app, Request $request) | |
{ | |
$form = $app['form.factory'] | |
->createBuilder('install_step1') | |
->getForm(); | |
$sessionData = $this->getSessionData($request); | |
$form->setData($sessionData); | |
if ($this->isValid($request, $form)) { | |
return $app->redirect($app->url('install_step2')); | |
} | |
$this->checkModules($app); | |
return $app['twig']->render('step1.twig', array( | |
'form' => $form->createView(), | |
'publicPath' => '..' . RELATIVE_PUBLIC_DIR_PATH . '/', | |
)); | |
} | |
// 権限チェック | |
public function step2(InstallApplication $app, Request $request) | |
{ | |
$this->getSessionData($request); | |
$protectedDirs = $this->getProtectedDirs(); | |
// 権限がある場合, キャッシュディレクトリをクリア | |
if (empty($protectedDirs)) { | |
$finder = Finder::create() | |
->in($this->cache_path) | |
->directories() | |
->depth(0); | |
$fs = new Filesystem(); | |
$fs->remove($finder); | |
} | |
return $app['twig']->render('step2.twig', array( | |
'protectedDirs' => $protectedDirs, | |
'publicPath' => '..' . RELATIVE_PUBLIC_DIR_PATH . '/', | |
)); | |
} | |
// サイトの設定 | |
public function step3(InstallApplication $app, Request $request) | |
{ | |
$form = $app['form.factory'] | |
->createBuilder('install_step3') | |
->getForm(); | |
$sessionData = $this->getSessionData($request); | |
if (empty($sessionData['shop_name'])) { | |
$config_file = $this->config_path . '/config.yml'; | |
$fs = new Filesystem(); | |
if ($fs->exists($config_file)) { | |
// すでに登録されていた場合、登録データを表示 | |
$this->setPDO(); | |
$stmt = $this->PDO->query("SELECT shop_name, email01 FROM dtb_base_info WHERE id = 1;"); | |
foreach ($stmt as $row) { | |
$sessionData['shop_name'] = $row['shop_name']; | |
$sessionData['email'] = $row['email01']; | |
} | |
// セキュリティの設定 | |
$config_file = $this->config_path . '/path.yml'; | |
$config = Yaml::parse(file_get_contents($config_file)); | |
$sessionData['admin_dir'] = $config['admin_route']; | |
$config_file = $this->config_path . '/config.yml'; | |
$config = Yaml::parse(file_get_contents($config_file)); | |
$allowHost = $config['admin_allow_host']; | |
if (count($allowHost) > 0) { | |
$sessionData['admin_allow_hosts'] = Str::convertLineFeed(implode("\n", $allowHost)); | |
} | |
$sessionData['admin_force_ssl'] = (bool)$config['force_ssl']; | |
// メール設定 | |
$config_file = $this->config_path . '/mail.yml'; | |
$config = Yaml::parse(file_get_contents($config_file)); | |
$mail = $config['mail']; | |
$sessionData['mail_backend'] = $mail['transport']; | |
$sessionData['smtp_host'] = $mail['host']; | |
$sessionData['smtp_port'] = $mail['port']; | |
$sessionData['smtp_username'] = $mail['username']; | |
$sessionData['smtp_password'] = $mail['password']; | |
} else { | |
// 初期値にmailを設定 | |
$sessionData['mail_backend'] = 'mail'; | |
} | |
} | |
$form->setData($sessionData); | |
if ($this->isValid($request, $form)) { | |
$data = $form->getData(); | |
return $app->redirect($app->url('install_step4')); | |
} | |
return $app['twig']->render('step3.twig', array( | |
'form' => $form->createView(), | |
'publicPath' => '..' . RELATIVE_PUBLIC_DIR_PATH . '/', | |
)); | |
} | |
// データベースの設定 | |
public function step4(InstallApplication $app, Request $request) | |
{ | |
$form = $app['form.factory'] | |
->createBuilder('install_step4') | |
->getForm(); | |
$sessionData = $this->getSessionData($request); | |
if (empty($sessionData['database'])) { | |
$config_file = $this->config_path.'/database.yml'; | |
$fs = new Filesystem(); | |
if ($fs->exists($config_file)) { | |
// すでに登録されていた場合、登録データを表示 | |
// データベース設定 | |
$config = Yaml::parse(file_get_contents($config_file)); | |
$database = $config['database']; | |
$sessionData['database'] = $database['driver']; | |
if ($database['driver'] != 'pdo_sqlite') { | |
$sessionData['database_host'] = $database['host']; | |
$sessionData['database_port'] = $database['port']; | |
$sessionData['database_name'] = $database['dbname']; | |
$sessionData['database_user'] = $database['user']; | |
$sessionData['database_password'] = $database['password']; | |
} | |
} | |
} | |
$form->setData($sessionData); | |
if ($this->isValid($request, $form)) { | |
return $app->redirect($app->url('install_step5')); | |
} | |
return $app['twig']->render('step4.twig', array( | |
'form' => $form->createView(), | |
'publicPath' => '..' . RELATIVE_PUBLIC_DIR_PATH . '/', | |
)); | |
} | |
// データベースの初期化 | |
public function step5(InstallApplication $app, Request $request) | |
{ | |
set_time_limit(0); | |
$this->app = $app; | |
$form = $app['form.factory'] | |
->createBuilder('install_step5') | |
->getForm(); | |
$sessionData = $this->getSessionData($request); | |
$form->setData($sessionData); | |
if ($this->isValid($request, $form)) { | |
$this | |
->createDatabaseYamlFile($sessionData) | |
->createMailYamlFile($sessionData) | |
->createPathYamlFile($sessionData, $request); | |
if (!$form['no_update']->getData()) { | |
set_time_limit(0); | |
$this->createConfigYamlFile($sessionData); | |
$this | |
->setPDO() | |
->dropTables() | |
->createTables() | |
->doMigrate() | |
->insert(); | |
} else { | |
// データベースを初期化しない場合、auth_magicは初期化しない | |
$this->createConfigYamlFile($sessionData, false); | |
$this | |
->setPDO() | |
->update(); | |
} | |
if (isset($sessionData['agree']) && $sessionData['agree'] == '1') { | |
$host = $request->getSchemeAndHttpHost(); | |
$basePath = $request->getBasePath(); | |
$params = array( | |
'http_url' => $host . $basePath, | |
'shop_name' => $sessionData['shop_name'], | |
); | |
$this->sendAppData($params); | |
} | |
$this->addInstallStatus(); | |
$request->getSession()->remove(self::SESSION_KEY); | |
return $app->redirect($app->url('install_complete')); | |
} | |
return $app['twig']->render('step5.twig', array( | |
'form' => $form->createView(), | |
'publicPath' => '..' . RELATIVE_PUBLIC_DIR_PATH . '/', | |
)); | |
} | |
// インストール完了 | |
public function complete(InstallApplication $app, Request $request) | |
{ | |
$config_file = $this->config_path . '/path.yml'; | |
$config = Yaml::parse(file_get_contents($config_file)); | |
$host = $request->getSchemeAndHttpHost(); | |
$basePath = $request->getBasePath(); | |
$adminUrl = $host . $basePath . '/' . $config['admin_dir']; | |
return $app['twig']->render('complete.twig', array( | |
'admin_url' => $adminUrl, | |
'publicPath' => '..' . RELATIVE_PUBLIC_DIR_PATH . '/', | |
)); | |
} | |
private function resetNatTimer() | |
{ | |
// NATの無通信タイマ対策(仮) | |
echo str_repeat(' ', 4 * 1024); | |
ob_flush(); | |
flush(); | |
} | |
private function checkModules($app) | |
{ | |
foreach ($this->required_modules as $module) { | |
if (!extension_loaded($module)) { | |
$app->addDanger('[必須] ' . $module . ' 拡張モジュールが有効になっていません。', 'install'); | |
} | |
} | |
if (!extension_loaded('pdo_mysql') && !extension_loaded('pdo_pgsql')) { | |
$app->addDanger('[必須] ' . 'pdo_pgsql又はpdo_mysql 拡張モジュールを有効にしてください。', 'install'); | |
} | |
foreach ($this->recommended_module as $module) { | |
if (!extension_loaded($module)) { | |
$app->addWarning('[推奨] ' . $module . ' 拡張モジュールが有効になっていません。', 'install'); | |
} | |
} | |
if ('\\' === DIRECTORY_SEPARATOR) { // for Windows | |
if (!extension_loaded('wincache')) { | |
$app->addWarning('[推奨] WinCache 拡張モジュールが有効になっていません。', 'install'); | |
} | |
} else { | |
if (!extension_loaded('apc')) { | |
$app->addWarning('[推奨] APC 拡張モジュールが有効になっていません。', 'install'); | |
} | |
} | |
if (isset($_SERVER['SERVER_SOFTWARE']) && strpos('Apache', $_SERVER['SERVER_SOFTWARE']) !== false) { | |
if (!function_exists('apache_get_modules')) { | |
$app->addWarning('mod_rewrite が有効になっているか不明です。', 'install'); | |
} elseif (!in_array('mod_rewrite', apache_get_modules())) { | |
$app->addDanger('[必須] ' . 'mod_rewriteを有効にしてください。', 'install'); | |
} | |
} elseif (isset($_SERVER['SERVER_SOFTWARE']) && strpos('Microsoft-IIS', $_SERVER['SERVER_SOFTWARE']) !== false) { | |
// iis | |
} elseif (isset($_SERVER['SERVER_SOFTWARE']) && strpos('nginx', $_SERVER['SERVER_SOFTWARE']) !== false) { | |
// nginx | |
} | |
} | |
private function setPDO() | |
{ | |
$config_file = $this->config_path . '/database.yml'; | |
$config = Yaml::parse(file_get_contents($config_file)); | |
try { | |
$this->PDO = \Doctrine\DBAL\DriverManager::getConnection($config['database'], new \Doctrine\DBAL\Configuration()); | |
$this->PDO->connect(); | |
} catch (\Exception $e) { | |
$this->PDO->close(); | |
throw $e; | |
} | |
return $this; | |
} | |
private function dropTables() | |
{ | |
$this->resetNatTimer(); | |
$em = $this->getEntityManager(); | |
$metadatas = $em->getMetadataFactory()->getAllMetadata(); | |
$schemaTool = new SchemaTool($em); | |
$schemaTool->dropSchema($metadatas); | |
$em->getConnection()->executeQuery('DROP TABLE IF EXISTS doctrine_migration_versions'); | |
return $this; | |
} | |
/** | |
* @return EntityManager | |
*/ | |
private function getEntityManager() | |
{ | |
$config_file = $this->config_path . '/database.yml'; | |
$database = Yaml::parse(file_get_contents($config_file)); | |
$this->app->register(new \Silex\Provider\DoctrineServiceProvider(), array( | |
'db.options' => $database['database'] | |
)); | |
$this->app->register(new \Dflydev\Silex\Provider\DoctrineOrm\DoctrineOrmServiceProvider(), array( | |
'orm.proxies_dir' => __DIR__ . '/../../app/cache/doctrine', | |
'orm.em.options' => array( | |
'mappings' => array( | |
array( | |
'type' => 'yml', | |
'namespace' => 'Eccube\Entity', | |
'path' => array( | |
__DIR__ . '/../../Resource/doctrine', | |
__DIR__ . '/../../Resource/doctrine/master', | |
), | |
), | |
), | |
) | |
)); | |
return $em = $this->app['orm.em']; | |
} | |
private function createTables() | |
{ | |
$this->resetNatTimer(); | |
$em = $this->getEntityManager(); | |
$metadatas = $em->getMetadataFactory()->getAllMetadata(); | |
$schemaTool = new SchemaTool($em); | |
$schemaTool->createSchema($metadatas); | |
return $this; | |
} | |
private function insert() | |
{ | |
$this->resetNatTimer(); | |
$config_file = $this->config_path . '/database.yml'; | |
$database = Yaml::parse(file_get_contents($config_file)); | |
$config['database'] = $database['database']; | |
$config_file = $this->config_path . '/config.yml'; | |
$baseConfig = Yaml::parse(file_get_contents($config_file)); | |
$config['config'] = $baseConfig; | |
$this->PDO->beginTransaction(); | |
try { | |
$config = array( | |
'auth_type' => '', | |
'auth_magic' => $config['config']['auth_magic'], | |
'password_hash_algos' => 'sha256', | |
); | |
$passwordEncoder = new \Eccube\Security\Core\Encoder\PasswordEncoder($config); | |
$salt = \Eccube\Util\Str::random(32); | |
$encodedPassword = $passwordEncoder->encodePassword($this->session_data['login_pass'], $salt); | |
$sth = $this->PDO->prepare('INSERT INTO dtb_base_info ( | |
id, | |
shop_name, | |
email01, | |
email02, | |
email03, | |
email04, | |
update_date, | |
option_product_tax_rule | |
) VALUES ( | |
1, | |
:shop_name, | |
:admin_mail, | |
:admin_mail, | |
:admin_mail, | |
:admin_mail, | |
current_timestamp, | |
0);'); | |
$sth->execute(array( | |
':shop_name' => $this->session_data['shop_name'], | |
':admin_mail' => $this->session_data['email'] | |
)); | |
$sth = $this->PDO->prepare("INSERT INTO dtb_member (member_id, login_id, password, salt, work, del_flg, authority, creator_id, rank, update_date, create_date,name,department) VALUES (2, :login_id, :admin_pass , :salt , '1', '0', '0', '1', '1', current_timestamp, current_timestamp,'管理者','EC-CUBE SHOP');"); | |
$sth->execute(array(':login_id' => $this->session_data['login_id'], ':admin_pass' => $encodedPassword, ':salt' => $salt)); | |
$this->PDO->commit(); | |
} catch (\Exception $e) { | |
$this->PDO->rollback(); | |
throw $e; | |
} | |
return $this; | |
} | |
private function update() | |
{ | |
$this->resetNatTimer(); | |
$config_file = $this->config_path . '/database.yml'; | |
$database = Yaml::parse(file_get_contents($config_file)); | |
$config['database'] = $database['database']; | |
$config_file = $this->config_path . '/config.yml'; | |
$baseConfig = Yaml::parse(file_get_contents($config_file)); | |
$config['config'] = $baseConfig; | |
$this->PDO->beginTransaction(); | |
try { | |
$config = array( | |
'auth_type' => '', | |
'auth_magic' => $config['config']['auth_magic'], | |
'password_hash_algos' => 'sha256', | |
); | |
$passwordEncoder = new \Eccube\Security\Core\Encoder\PasswordEncoder($config); | |
$salt = \Eccube\Util\Str::random(32); | |
$stmt = $this->PDO->prepare("SELECT member_id FROM dtb_member WHERE login_id = :login_id;"); | |
$stmt->execute(array(':login_id' => $this->session_data['login_id'])); | |
$rs = $stmt->fetch(); | |
$encodedPassword = $passwordEncoder->encodePassword($this->session_data['login_pass'], $salt); | |
if ($rs) { | |
// 同一の管理者IDであればパスワードのみ更新 | |
$sth = $this->PDO->prepare("UPDATE dtb_member set password = :admin_pass, salt = :salt, update_date = current_timestamp WHERE login_id = :login_id;"); | |
$sth->execute(array(':admin_pass' => $encodedPassword, ':salt' => $salt, ':login_id' => $this->session_data['login_id'])); | |
} else { | |
// 新しい管理者IDが入力されたらinsert | |
$sth = $this->PDO->prepare("INSERT INTO dtb_member (login_id, password, salt, work, del_flg, authority, creator_id, rank, update_date, create_date,name,department) VALUES (:login_id, :admin_pass , :salt , '1', '0', '0', '1', '1', current_timestamp, current_timestamp,'管理者','EC-CUBE SHOP');"); | |
$sth->execute(array(':login_id' => $this->session_data['login_id'], ':admin_pass' => $encodedPassword, ':salt' => $salt)); | |
} | |
$sth = $this->PDO->prepare('UPDATE dtb_base_info set | |
shop_name = :shop_name, | |
email01 = :admin_mail, | |
email02 = :admin_mail, | |
email03 = :admin_mail, | |
email04 = :admin_mail, | |
update_date = current_timestamp | |
WHERE id = 1;'); | |
$sth->execute(array( | |
':shop_name' => $this->session_data['shop_name'], | |
':admin_mail' => $this->session_data['email'] | |
)); | |
$this->PDO->commit(); | |
} catch (\Exception $e) { | |
$this->PDO->rollback(); | |
throw $e; | |
} | |
return $this; | |
} | |
private function getMigration() | |
{ | |
$app = \Eccube\Application::getInstance(); | |
$app->initialize(); | |
$app->boot(); | |
$config = new Configuration($app['db']); | |
$config->setMigrationsNamespace('DoctrineMigrations'); | |
$migrationDir = __DIR__ . '/../../Resource/doctrine/migration'; | |
$config->setMigrationsDirectory($migrationDir); | |
$config->registerMigrationsFromDirectory($migrationDir); | |
$migration = new Migration($config); | |
return $migration; | |
} | |
private function doMigrate() | |
{ | |
try { | |
$migration = $this->getMigration(); | |
// DBとのコネクションを維持するためpingさせる | |
if (is_null($this->PDO)) { | |
$this->setPDO(); | |
} | |
$this->PDO->ping(); | |
// nullを渡すと最新バージョンまでマイグレートする | |
$migration->migrate(null, false); | |
} catch (MigrationException $e) { | |
} | |
return $this; | |
} | |
private function getProtectedDirs() | |
{ | |
$protectedDirs = array(); | |
$base = __DIR__ . '/../../../..'; | |
$dirs = array( | |
'/html', | |
'/app', | |
'/app/template', | |
'/app/cache', | |
'/app/config', | |
'/app/config/eccube', | |
'/app/log', | |
'/app/Plugin', | |
); | |
foreach ($dirs as $dir) { | |
if (!is_writable($base . $dir)) { | |
$protectedDirs[] = $dir; | |
} | |
} | |
return $protectedDirs; | |
} | |
private function createConfigYamlFile($data, $auth = true) | |
{ | |
$fs = new Filesystem(); | |
$config_file = $this->config_path . '/config.yml'; | |
if ($fs->exists($config_file)) { | |
$config = Yaml::parse(file_get_contents($config_file)); | |
$fs->remove($config_file); | |
} | |
if ($auth) { | |
$auth_magic = Str::random(32); | |
} else { | |
if (isset($config['auth_magic'])) { | |
$auth_magic = $config['auth_magic']; | |
} else { | |
$auth_magic = Str::random(32); | |
} | |
} | |
$allowHost = Str::convertLineFeed($data['admin_allow_hosts']); | |
if (empty($allowHost)) { | |
$adminAllowHosts = array(); | |
} else { | |
$adminAllowHosts = explode("\n", $allowHost); | |
} | |
$target = array('${AUTH_MAGIC}', '${SHOP_NAME}', '${ECCUBE_INSTALL}', '${FORCE_SSL}'); | |
$replace = array($auth_magic, $data['shop_name'], '0', $data['admin_force_ssl']); | |
$fs = new Filesystem(); | |
$content = str_replace( | |
$target, | |
$replace, | |
file_get_contents($this->dist_path . '/config.yml.dist') | |
); | |
$fs->dumpFile($config_file, $content); | |
$config = Yaml::parse(file_get_contents($config_file)); | |
$config['admin_allow_host'] = $adminAllowHosts; | |
$yml = Yaml::dump($config); | |
file_put_contents($config_file, $yml); | |
return $this; | |
} | |
private function addInstallStatus() | |
{ | |
$config_file = $this->config_path . '/config.yml'; | |
$config = Yaml::parse(file_get_contents($config_file)); | |
$config['eccube_install'] = 1; | |
$yml = Yaml::dump($config); | |
file_put_contents($config_file, $yml); | |
return $this; | |
} | |
private function createDatabaseYamlFile($data) | |
{ | |
$fs = new Filesystem(); | |
$config_file = $this->config_path . '/database.yml'; | |
if ($fs->exists($config_file)) { | |
$fs->remove($config_file); | |
} | |
if ($data['database'] != 'pdo_sqlite') { | |
switch ($data['database']) { | |
case 'pdo_pgsql': | |
if (empty($data['db_port'])) { | |
$data['db_port'] = '5432'; | |
} | |
$data['db_driver'] = 'pdo_pgsql'; | |
break; | |
case 'pdo_mysql': | |
if (empty($data['db_port'])) { | |
$data['db_port'] = '3306'; | |
} | |
$data['db_driver'] = 'pdo_mysql'; | |
break; | |
} | |
$target = array('${DBDRIVER}', '${DBSERVER}', '${DBNAME}', '${DBPORT}', '${DBUSER}', '${DBPASS}'); | |
$replace = array( | |
$data['db_driver'], | |
$data['database_host'], | |
$data['database_name'], | |
$data['database_port'], | |
$data['database_user'], | |
$data['database_password'] | |
); | |
$fs = new Filesystem(); | |
$content = str_replace( | |
$target, | |
$replace, | |
file_get_contents($this->dist_path . '/database.yml.dist') | |
); | |
} else { | |
$content = Yaml::dump( | |
array( | |
'database' => array( | |
'driver' => 'pdo_sqlite', | |
'path' => realpath($this->config_path.'/eccube.db') | |
) | |
) | |
); | |
} | |
$fs->dumpFile($config_file, $content); | |
return $this; | |
} | |
private function createMailYamlFile($data) | |
{ | |
$fs = new Filesystem(); | |
$config_file = $this->config_path . '/mail.yml'; | |
if ($fs->exists($config_file)) { | |
$fs->remove($config_file); | |
} | |
$target = array('${MAIL_BACKEND}', '${MAIL_HOST}', '${MAIL_PORT}', '${MAIL_USER}', '${MAIL_PASS}'); | |
$replace = array( | |
$data['mail_backend'], | |
$data['smtp_host'], | |
$data['smtp_port'], | |
$data['smtp_username'], | |
$data['smtp_password'] | |
); | |
$fs = new Filesystem(); | |
$content = str_replace( | |
$target, | |
$replace, | |
file_get_contents($this->dist_path . '/mail.yml.dist') | |
); | |
$fs->dumpFile($config_file, $content); | |
return $this; | |
} | |
private function createPathYamlFile($data, Request $request) | |
{ | |
$fs = new Filesystem(); | |
$config_file = $this->config_path . '/path.yml'; | |
if ($fs->exists($config_file)) { | |
$fs->remove($config_file); | |
} | |
$ADMIN_ROUTE = $data['admin_dir']; | |
$TEMPLATE_CODE = 'default'; | |
$USER_DATA_ROUTE = 'user_data'; | |
$ROOT_DIR = realpath(__DIR__ . '/../../../../'); | |
$ROOT_URLPATH = $request->getBasePath(); | |
$ROOT_PUBLIC_URLPATH = $ROOT_URLPATH . RELATIVE_PUBLIC_DIR_PATH; | |
$target = array('${ADMIN_ROUTE}', '${TEMPLATE_CODE}', '${USER_DATA_ROUTE}', '${ROOT_DIR}', '${ROOT_URLPATH}', '${ROOT_PUBLIC_URLPATH}'); | |
$replace = array($ADMIN_ROUTE, $TEMPLATE_CODE, $USER_DATA_ROUTE, $ROOT_DIR, $ROOT_URLPATH, $ROOT_PUBLIC_URLPATH); | |
$fs = new Filesystem(); | |
$content = str_replace( | |
$target, | |
$replace, | |
file_get_contents($this->dist_path . '/path.yml.dist') | |
); | |
$fs->dumpFile($config_file, $content); | |
return $this; | |
} | |
private function sendAppData($params) | |
{ | |
$config_file = $this->config_path . '/database.yml'; | |
$db_config = Yaml::parse(file_get_contents($config_file)); | |
$this->setPDO(); | |
$stmt = $this->PDO->query('select version() as v'); | |
$version = ''; | |
foreach ($stmt as $row) { | |
$version = $row['v']; | |
} | |
if ($db_config['database']['driver'] === 'pdo_mysql') { | |
$db_ver = 'MySQL:' . $version; | |
} else { | |
$db_ver = $version; | |
} | |
$data = http_build_query( | |
array( | |
'site_url' => $params['http_url'], | |
'shop_name' => $params['shop_name'], | |
'cube_ver' => Constant::VERSION, | |
'php_ver' => phpversion(), | |
'db_ver' => $db_ver, | |
'os_type' => php_uname(), | |
) | |
); | |
$header = array( | |
'Content-Type: application/x-www-form-urlencoded', | |
'Content-Length: ' . strlen($data), | |
); | |
$context = stream_context_create( | |
array( | |
'http' => array( | |
'method' => 'POST', | |
'header' => $header, | |
'content' => $data, | |
) | |
) | |
); | |
file_get_contents('http://www.ec-cube.net/mall/use_site.php', false, $context); | |
return $this; | |
} | |
/** | |
* マイグレーション画面を表示する. | |
* | |
* @param InstallApplication $app | |
* @param Request $request | |
* | |
* @return \Symfony\Component\HttpFoundation\Response | |
*/ | |
public function migration(InstallApplication $app, Request $request) | |
{ | |
return $app['twig']->render('migration.twig', array( | |
'publicPath' => '..' . RELATIVE_PUBLIC_DIR_PATH . '/', | |
)); | |
} | |
/** | |
* インストール済プラグインの一覧を表示する. | |
* プラグインがインストールされていない場合は, マイグレーション実行画面へリダイレクトする. | |
* | |
* @param InstallApplication $app | |
* @param Request $request | |
* | |
* @return \Symfony\Component\HttpFoundation\Response | |
*/ | |
public function migration_plugin(InstallApplication $app, Request $request) | |
{ | |
$eccube = \Eccube\Application::getInstance(); | |
$eccube->initialize(); | |
$eccube->boot(); | |
$pluginRepository = $eccube['orm.em']->getRepository('Eccube\Entity\Plugin'); | |
$Plugins = $pluginRepository->findBy(array('del_flg' => Constant::DISABLED)); | |
if (empty($Plugins)) { | |
// インストール済プラグインがない場合はマイグレーション実行画面へリダイレクト. | |
return $app->redirect($app->url('migration_end')); | |
} else { | |
return $app['twig']->render('migration_plugin.twig', array( | |
'Plugins' => $Plugins, | |
'version' => Constant::VERSION, | |
'publicPath' => '..' . RELATIVE_PUBLIC_DIR_PATH . '/', | |
)); | |
} | |
} | |
/** | |
* マイグレーションを実行し, 完了画面を表示させる | |
* | |
* @param InstallApplication $app | |
* @param Request $request | |
* | |
* @return \Symfony\Component\HttpFoundation\Response | |
*/ | |
public function migration_end(InstallApplication $app, Request $request) | |
{ | |
$this->doMigrate(); | |
$config_app = new \Eccube\Application(); // install用のappだとconfigが取れないので | |
$config_app->initialize(); | |
$config_app->boot(); | |
\Eccube\Util\Cache::clear($config_app, true); | |
return $app['twig']->render('migration_end.twig', array( | |
'publicPath' => '..' . RELATIVE_PUBLIC_DIR_PATH . '/', | |
)); | |
} | |
} |