HumHubをインストールしたら最初にやっておくべきこと

## 概要
HumHubをインストールしたら、最初に行ったほうがよいセキュリティ対策など。

## 目次
1. [Protected、その他dotfileを公開ディレクトリより上に設置する](https://qiita.com/Esfahan/items/dec5e95eab8825eb09d3#protected%E3%81%9D%E3%81%AE%E4%BB%96dotfile%E3%82%92%E5%85%AC%E9%96%8B%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%82%88%E3%82%8A%E4%B8%8A%E3%81%AB%E8%A8%AD%E7%BD%AE%E3%81%99%E3%82%8B)
1. [index.phpの書き換え](https://qiita.com/Esfahan/items/dec5e95eab8825eb09d3#indexphp%E3%81%AE%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%81%88)
1. [index-test.phpの書き換え](https://qiita.com/Esfahan/items/dec5e95eab8825eb09d3#index-testphp%E3%81%AE%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%81%88)
1. [URLのGETパラメータをキレイにする](https://qiita.com/Esfahan/items/dec5e95eab8825eb09d3#url%E3%81%AEget%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%82%92%E3%82%AD%E3%83%AC%E3%82%A4%E3%81%AB%E3%81%99%E3%82%8B)
1. [ユーザーのPasswordの文字数を制限する ](https://qiita.com/Esfahan/items/dec5e95eab8825eb09d3#%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%AEpassword%E3%81%AE%E6%96%87%E5%AD%97%E6%95%B0%E3%82%92%E5%88%B6%E9%99%90%E3%81%99%E3%82%8B)
1. [ユーザー名（ログインID）は半角英数字、ハイフン、アンダーバーのみ使用を許可する](https://qiita.com/Esfahan/items/dec5e95eab8825eb09d3#%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E5%90%8D%E3%81%AF%E5%8D%8A%E8%A7%92%E8%8B%B1%E6%95%B0%E5%AD%97%E3%83%8F%E3%82%A4%E3%83%95%E3%83%B3%E3%82%A2%E3%83%B3%E3%83%80%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AE%E3%81%BF%E4%BD%BF%E7%94%A8%E3%82%92%E8%A8%B1%E5%8F%AF%E3%81%99%E3%82%8B)
1. [ログインなしでもコンテンツを閲覧できるようにする場合](https://qiita.com/Esfahan/items/dec5e95eab8825eb09d3#%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%AA%E3%81%97%E3%81%A7%E3%82%82%E3%82%B3%E3%83%B3%E3%83%86%E3%83%B3%E3%83%84%E3%82%92%E9%96%B2%E8%A6%A7%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88)
1. [本番リリースの際はDebugモードを無効にする](https://qiita.com/Esfahan/items/dec5e95eab8825eb09d3#%E6%9C%AC%E7%95%AA%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E3%81%AE%E9%9A%9B%E3%81%AFdebug%E3%83%A2%E3%83%BC%E3%83%89%E3%82%92%E7%84%A1%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B)
1. [バックアップについて](https://qiita.com/Esfahan/items/dec5e95eab8825eb09d3#%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)

## 関連
- [HumHubというCMSを使ってSNSを秒で作る](https://qiita.com/Esfahan/items/974687234566ef6b069d)

## Protected、その他dotfileを公開ディレクトリより上に設置する
デフォルトでは、全てのファイルが公開ディレクトリより下に設置される。

.htaccessで、protectedディレクトリ以下をブラウザから直接参照できないようにはなっているが、セキュリティ的に良くないので、protected、また以下のファイルを公開ディレクトリより上に移動させる。

- protected
- composer.json
- package.json
- Gruntfile.js
- .codeclimate.yml
- .editorconfig
- .travis.yml
- CONTRIBUTING.md
- ruleset.xml

## index.phpの書き換え
index.phpを以下に書き換えてください。

- 変更点
  - requireされているprotectedディレクトリのパスを変更する

```diff
<?php

/**
 * @link https://www.humhub.org/
 * @copyright Copyright (c) 2017 HumHub GmbH & Co. KG
 * @license https://www.humhub.com/licences
 */

// comment out the following two lines when deployed to production
if ($_SERVER['ENV'] == 'development') {
    defined('YII_DEBUG') or define('YII_DEBUG', true);
    defined('YII_ENV') or define('YII_ENV', 'dev');
}

-require(__DIR__ . '/protected/vendor/autoload.php');
-require(__DIR__ . '/protected/vendor/yiisoft/yii2/Yii.php');
+require(__DIR__ . '/../protected/vendor/autoload.php');
+require(__DIR__ . '/../protected/vendor/yiisoft/yii2/Yii.php');

$config = yii\helpers\ArrayHelper::merge(
-    require(__DIR__ . '/protected/humhub/config/common.php'),
-    require(__DIR__ . '/protected/humhub/config/web.php'),
-    (is_readable(__DIR__ . '/protected/config/dynamic.php')) ? require(__DIR__ . '/protected/config/dynamic.php') : [],
-    require(__DIR__ . '/protected/config/common.php'),
-    require(__DIR__ . '/protected/config/web.php')
+    require(__DIR__ . '/../protected/humhub/config/common.php'),
+    require(__DIR__ . '/../protected/humhub/config/web.php'),
+    (is_readable(__DIR__ . '/../protected/config/dynamic.php')) ? require(__DIR__ . '/../protected/config/dynamic.php') : [],
+    require(__DIR__ . '/../protected/config/common.php'),
+    require(__DIR__ . '/../protected/config/web.php')
);

(new humhub\components\Application($config))->run();
```

## index-test.phpの書き換え
index-test.phpを以下に書き換えてください。

- 変更点
    - irequireされている、protectedディレクトリのパスを変更する
    - localhost以外からこのファイルにアクセスされた場合は、index.phpにリダイレクトさせる

```diff
<?php

/**
 * @link https://www.humhub.org/
 * @copyright Copyright (c) 2015 HumHub GmbH & Co. KG
 * @license https://www.humhub.com/licences
 */
// NOTE: Make sure this file is not accessible when deployed to production
if (!in_array(@$_SERVER['REMOTE_ADDR'], ['127.0.0.1', '::1'])) {
-    die('You are not allowed to access this file.');
+    header('Location: /');
}

/*defined('YII_DEBUG') or define('YII_DEBUG', true);*/
defined('YII_ENV') or define('YII_ENV', 'test');
defined('YII_ENV_TEST') or define('YII_ENV_TEST', true);

-require(__DIR__ . '/protected/vendor/autoload.php');
-require(__DIR__ . '/protected/vendor/yiisoft/yii2/Yii.php');
+require(__DIR__ . '/../protected/vendor/autoload.php');
+require(__DIR__ . '/../protected/vendor/yiisoft/yii2/Yii.php');

$config = yii\helpers\ArrayHelper::merge(
    // add more configurations here
-    (is_readable(__DIR__ . '/../protected/humhub/tests/codeception/config/dynamic.php')) ? require(__DIR__ . '/../protected/humhub/tests/codeception/config/dynamic.php') : [],
-    require(__DIR__ . '/../protected/humhub/tests/codeception/config/acceptance.php')
+    (is_readable(__DIR__ . '/protected/humhub/tests/codeception/config/dynamic.php')) ? require(__DIR__ . '/protected/humhub/tests/codeception/config/dynamic.php') : [],   
+    require(__DIR__ . '/protected/humhub/tests/codeception/config/acceptance.php')
);

(new humhub\components\Application($config))->run();
```

## protected/humhub/config/assets.phpの書き換え

```diff
 <?php
 
 /**
  * @link https://www.humhub.org/
  * @copyright Copyright (c) 2017 HumHub GmbH & Co. KG
  * @license https://www.humhub.com/licences
  */
 
 /**
  * Configuration file for the "yii asset" console command.
  */
 
 // In the console environment, some path aliases may not exist. Please define these:
 Yii::setAlias('@webroot', __DIR__ . '/../../../');
 Yii::setAlias('@web', '/');
 
-Yii::setAlias('@webroot-static', __DIR__ . '/../../../static');
+Yii::setAlias('@webroot-static', __DIR__ . '/../../../public/static');
 Yii::setAlias('@web-static', '/static');
```

## Gruntfile.jsの書き換え

```diff
module.exports = function (grunt) {



    var uglifyAssetcfg = {};
    uglifyAssetcfg[grunt.option('to')] = grunt.option('from');

    var cssMinAssetcfg = {};
    cssMinAssetcfg[grunt.option('to')] = [grunt.option('from')];

    grunt.log.write(grunt.option('from'));

    grunt.initConfig({
        pkg: grunt.file.readJSON('package.json'),
         clean: ["assets/*"],
         shell: {
             buildAssets: {
-                command: "rm static/js/all-*.js ; rm static/css/all-*.css ; rm -rf static/assets/* ; cd protected ; php yii asset humhub/config/assets.php humhub/config/assets-prod
+                command: "rm public/static/js/all-*.js ; rm public/static/css/all-*.css ; rm -rf public/static/assets/* ; cd protected ; php yii asset humhub/config/assets.php humh
             },
             buildSearch: {
                 command: "cd protected ; php yii search/rebuild"
```

## URLのGETパラメータをキレイにする
以下を参照。

- [HumHubのURLのGETパラメータをキレイにする](https://qiita.com/Esfahan/items/3bafd72d7a613b36e230)

## ユーザーのPasswordの文字数を制限する
パスワードの文字数制限が、変更時には指定されているが、何故か新規登録時には指定されていないので、以下を追記する。

protected/humhub/modules/user/models/Password.php

```diff
    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['newPassword', 'newPasswordConfirm'], 'required', 'on' => 'registration'],
            [['newPassword', 'newPasswordConfirm'], 'trim'],
+           [['newPassword', 'newPasswordConfirm'], 'string', 'min' => 6, 'max' => 255],
            [['user_id'], 'integer'],
            [['password', 'salt'], 'string'],
            [['created_at'], 'safe'],
            [['algorithm'], 'string', 'max' => 20],
            [['currentPassword'], CheckPasswordValidator::className(), 'on' => 'changePassword'],
            [['newPassword', 'newPasswordConfirm', 'currentPassword'], 'required', 'on' => 'changePassword'],
            [['newPassword', 'newPasswordConfirm'], 'string', 'min' => 6, 'max' => 255, 'on' => 'changePassword'],
            [['newPassword'], 'unequalsCurrentPassword', 'on' => 'changePassword'],
            [['newPasswordConfirm'], 'compare', 'compareAttribute' => 'newPassword', 'on' => 'changePassword'],
            [['newPasswordConfirm'], 'compare', 'compareAttribute' => 'newPassword', 'on' => 'registration'],
        ];
    }
```

## ユーザー名（ログインID）は半角英数字、ハイフン、アンダーバーのみ使用を許可する
以下を参照。
[HumHubでvalidationルールを追加する](https://qiita.com/Esfahan/items/6db396b200597440cb17)


## ログインなしでもコンテンツを閲覧できるようにする場合
管理ユーザーで、Administration 管理メニューへ行く。
URL: /index.php?r=admin%2Fauthentication

左メニューのユーザー -> 設定タブ の順に進み、以下にチェックを入れると、ログインしていなくても、一部のページの閲覧が可能になります。

`Allow limited access for non-authenticated users (guests)`

デフォルトではチェックは入っていません。

その他の公開に関する設定もこちらで行えます。

## 本番リリースの際はDebugモードを無効にする
本番公開する場合は、index.phpの以下の箇所をコメントアウトし、画面にエラーログなどが表示されないようにします。

```php
// comment out the following two lines when deployed to production
// defined('YII_DEBUG') or define('YII_DEBUG', true);
// defined('YII_ENV') or define('YII_ENV', 'dev');
```

参考：http://docs.humhub.org/admin-security.html

### ちなみにここをコメントアウトすると
`defined('YII_DEBUG') or define('YII_DEBUG', true);`
をコメントアウトすると、初期設定をするinstallerが動かなくなります。

```php
// comment out the following two lines when deployed to production
// この行だけをコメントアウトするだけで、installerが動かなくなる
defined('YII_DEBUG') or define('YII_DEBUG', true);
// この行だけをコメントアウトしても、installerは動く
defined('YII_ENV') or define('YII_ENV', 'dev');
```

初期設定をしていない状態で
https://sample.com/installer/index
にアクセスし「次へ」をクリックすると、以下のURIを無限に読み込もうとし、先のページへ進めなくなります。

```
https://sample.com/installer/index?_pjax=%23layout-content&_=1521524544905
```

ブラウザのinspectorのNetworkタブを見ると、その挙動を確認できます。

<img width="1280" alt="Screen Shot 2018-03-23 at 1.47.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/105936/4ad3ca40-bc2e-5094-2945-4e0ed974218f.png">


## バックアップについて
以下は、ユーザーの行動によって、動的に中身が変わるディレクトリなので、バックアップを取ることをおすすめします。

| dir | desc |
| --- | --- |
| /protected/modules | Admin管理画面でインストールしたモジュール群 |
| /protected/config | DBアカウントなどが書かれたdynamic.phpが動的に書き換わる |
| /uploads | ユーザーがアップロードした画像など |
| /themes/yourtheme | テーマを変更した場合に格納される |

## TOPページのURLを変更する
デフォルトでは、`https://example.com/`のようなURLでアクセスすると、`https://example.com/dashboard`にリダイレクトされるようになっている。
これを、以下のどちらでもでTOPページアクセスできるようにする。

- https://example.com/
- https://example.com/dashboard


```diff:protected/humhub/modules/dashboard/config.php
<?php
 
 return [
     'id' => 'dashboard',
     'class' => \humhub\modules\dashboard\Module::className(),
     'isCoreModule' => true,
     'events' => array(
         array('class' => \humhub\widgets\TopMenu::className(), 'event' => \humhub\widgets\TopMenu::EVENT_INIT, 'callback' => array('\humhub\modules\dashboard\Events', 'onTopMenuInit')),
     ),
     'urlManagerRules' => [
-        'dashboard' => 'dashboard/dashboard'
+        'dashboard' => 'dashboard/dashboard',
+        '/' => 'dashboard/dashboard'
     ]
 ];
?>
```

各メニューのトップページのリンクを、`/dashboard`から`/`に変更する。

```diff:protected/humhub/config/web.php
 <?php
 
 /**
  * @link https://www.humhub.org/
  * @copyright Copyright (c) 2017 HumHub GmbH & Co. KG
  * @license https://www.humhub.com/licences
  */
 
 $config = [
     'id' => 'humhub',
     'bootstrap' => ['humhub\components\bootstrap\LanguageSelector'],
-    'homeUrl' => ['/dashboard/dashboard'],
+    'homeUrl' => ['/'],
     'defaultRoute' => '/home',
     'layoutPath' => '@humhub/views/layouts',
     'components' => [
```

## 参考
- http://docs.humhub.org/admin-security.html
- http://docs.humhub.org/admin-backup.html
- [Yiiで作ったサイトを公開する際にすること](http://choice-site.com/2013/01/17/yii%E3%81%A7%E4%BD%9C%E3%81%A3%E3%81%9F%E3%82%B5%E3%82%A4%E3%83%88%E3%82%92%E5%85%AC%E9%96%8B%E3%81%99%E3%82%8B%E9%9A%9B%E3%81%AB%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8/)