OpenPNE Issue Tracking System: チケット
http://redmine.openpne.jp/
http://redmine.openpne.jp/favicon.ico
2017-06-05T08:20:28Z
OpenPNE Issue Tracking System
Redmine
OpenPNE 3 - Enhancement(機能追加・改善) #4200 (New(新規)): 古い静的ファイルのキャッシュが意図せず使われないようにする
http://redmine.openpne.jp/issues/4200
2017-06-05T08:20:28Z
Youichi Kimura
kim.upsilon@bucyou.net
<a name="Overview-概要"></a>
<h3 >Overview (概要)<a href="#Overview-概要" class="wiki-anchor">¶</a></h3>
<p>現状の OpenPNE では、静的ファイル (*.js, *.css など) のキャッシュについて HTTP ヘッダ等による制御を行っておらず、Web ブラウザやプロキシサーバーのデフォルトの動作に委ねられている。</p>
<p>静的ファイルについて Apache のデフォルトの動作では、以下のように <code>Last-Modified</code>, <code>ETag</code> ディレクティブがレスポンスヘッダに出力される。</p>
<pre>
$ curl --head http://v38.localhost/js/util.js
HTTP/1.1 200 OK
Date: Mon, 05 Jun 2017 08:13:30 GMT
Server: Apache/2.4.10 (Debian)
Last-Modified: Fri, 17 Mar 2017 06:02:37 GMT
ETag: "6a2-54ae6ecb2f7a1"
Accept-Ranges: bytes
Content-Length: 1698
Vary: Accept-Encoding
Content-Type: application/javascript
</pre>
<p><a class="issue tracker-1 status-5 priority-5 priority-high3 closed" title="Bug(バグ): メンバー登録時にデータが不正な状態になることがある (Fixed(完了))" href="http://redmine.openpne.jp/issues/3150#note-19">#3150-19</a> で指摘されているように、Google Chrome 58 といった比較的新しいブラウザにおいても静的ファイルの古いキャッシュが問題を引き起こす場合があることから、OpenPNE 側での対処が必要であると考えられる。</p>
<p>なお、 #2287 では <code>Cache-Control: no-store, no-cache, private, max-age=0, must-revalidate, post-check=0, pre-check=0</code> が出力されるように修正が行われているが、これは symfony を経由しない静的ファイルに対しては適用されない。</p>
<a name="Spec-仕様"></a>
<h3 >Spec (仕様)<a href="#Spec-仕様" class="wiki-anchor">¶</a></h3>
opFavoritePlugin - Bug(バグ) #4163 (New(新規)): テスト用fixtureの記述に誤りがありロード時にエラーが発生する
http://redmine.openpne.jp/issues/4163
2017-02-17T08:58:04Z
Youichi Kimura
kim.upsilon@bucyou.net
<a name="Overview-概要"></a>
<h3 >Overview (概要)<a href="#Overview-概要" class="wiki-anchor">¶</a></h3>
<p>MySQL 5.7 の Strict Mode が有効な状態での動作確認 (<a class="issue tracker-5 status-2 priority-4 priority-default parent" title="Task(タスク): MySQLのStrict Modeを有効にした場合に生じる問題を調査 (Accepted(着手))" href="http://redmine.openpne.jp/issues/4033">#4033</a>) を行った際に発生した。</p>
<p>fixture の読み込みを必要とするテストコードを実行すると下記のエラーが発生する:<br /><pre>
$ php plugins/opFavoritePlugin/test/functional/pc_frontend/favoriteActionsTest.php
PHP Fatal error: Uncaught exception 'Doctrine_Connection_Mysql_Exception' with message 'SQLSTATE[22007]: Invalid datetime format: 1292 Incorrect datetime value: '1487263613' for column 'date' at row 1' in /vagrant/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Connection.php:1082
Stack trace:
#0 /vagrant/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Connection/Statement.php(269): Doctrine_Connection->rethrowException(Object(PDOException), Object(Doctrine_Connection_Statement))
#1 /vagrant/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Connection.php(1042): Doctrine_Connection_Statement->execute(Array)
#2 /vagrant/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Connection.php(687): Doctrine_Connection->exec('INSERT INTO blo...', Array)
#3 /vagrant/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Connection/UnitOfWork.php(647): Doctrine_Connection->insert(Object(BlogRssCacheTable), in /vagrant/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Connection.php on line 1082
</pre></p>
<a name="Causes-原因"></a>
<h3 >Causes (原因)<a href="#Causes-原因" class="wiki-anchor">¶</a></h3>
<p><a href="https://github.com/tejimaya/opFavoritePlugin/blob/bca2c9a470adc6e81003f69d9135a5507227e139/test/fixtures/004_import_blog_rss_cache.yml#L14" class="external">test/fixtures/004_import_blog_rss_cache.yml#L14</a>:<br /><pre><code class="yaml syntaxhl"><span class="CodeRay"><span class="key">BlogRssCache</span>:
<span class="key">first_member_blog_rss_cache</span>:
<span class="key">Member</span>: <span class="string"><span class="content">third_member</span></span>
<span class="key">title</span>: <span class="string"><span class="delimiter">"</span><span class="content"><&\"'>BlogRssCache.title ESCAPING HTML TEST DATA</span><span class="delimiter">"</span></span>
<span class="key">description</span>: <span class="string"><span class="delimiter">"</span><span class="content">description</span><span class="delimiter">"</span></span>
<span class="key">link</span>: <span class="string"><span class="delimiter">"</span><span class="content">http://localhost/</span><span class="delimiter">"</span></span>
<span class="key">date</span>: <span class="string"><span class="content"><?php echo date("Y-m-d H:i:s\n") ?></span></span>
</span></code></pre></p>
<p>上記のように記述された fixture は以下のような YAML を出力します。</p>
<pre><code class="yaml syntaxhl"><span class="CodeRay"><span class="key">BlogRssCache</span>:
<span class="key">first_member_blog_rss_cache</span>:
<span class="key">Member</span>: <span class="string"><span class="content">third_member</span></span>
<span class="key">title</span>: <span class="string"><span class="delimiter">"</span><span class="content"><&\"'>BlogRssCache.title ESCAPING HTML TEST DATA</span><span class="delimiter">"</span></span>
<span class="key">description</span>: <span class="string"><span class="delimiter">"</span><span class="content">description</span><span class="delimiter">"</span></span>
<span class="key">link</span>: <span class="string"><span class="delimiter">"</span><span class="content">http://localhost/</span><span class="delimiter">"</span></span>
<span class="key">date</span>: <span class="string"><span class="content">2017-02-27 01:46:53</span></span>
</span></code></pre>
<p>文字列としてダブルクオーテーションで囲われていない日付は、YAML のロード時にタイムスタンプの数値に置換されるため、<code>'1487263613'</code> が不正な形式の日付であるとしてエラーが発生する。</p>
opDiaryPlugin - Bug(バグ) #4161 (New(新規)): MySQLのSTRICT_TRANS_TABLESが有効な状態でテスト用fixtureのロードに失敗する
http://redmine.openpne.jp/issues/4161
2017-02-17T08:36:57Z
Youichi Kimura
kim.upsilon@bucyou.net
<a name="Overview-現象"></a>
<h3 >Overview (現象)<a href="#Overview-現象" class="wiki-anchor">¶</a></h3>
<p>MySQL 5.7 の Strict Mode が有効な状態での動作確認 (<a class="issue tracker-5 status-2 priority-4 priority-default parent" title="Task(タスク): MySQLのStrict Modeを有効にした場合に生じる問題を調査 (Accepted(着手))" href="http://redmine.openpne.jp/issues/4033">#4033</a>) を行った際に発生した。</p>
<p>fixture の読み込みを必要とするテストコードを実行すると下記のエラーが発生する:</p>
<pre>
$ php plugins/opDiaryPlugin/test/unit/model/DiaryTest.php
[...]
Fatal error: Uncaught exception 'Doctrine_Connection_Mysql_Exception' with message 'SQLSTATE[HY000]: General error: 1364 Field 'last_comment_time' doesn't have a default value' in /vagrant/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Connection.php:1082
Stack trace:
#0 /vagrant/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Connection/Statement.php(269): Doctrine_Connection->rethrowException(Object(PDOException), Object(Doctrine_Connection_Statement))
#1 /vagrant/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Connection.php(1042): Doctrine_Connection_Statement->execute(Array)
#2 /vagrant/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Connection.php(687): Doctrine_Connection->exec('INSERT INTO dia...', Array)
#3 /vagrant/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Connection/UnitOfWork.php(647): Doctrine_Connection->insert(Object(DiaryCommentUpdateTable), Array)
#4 /vagr in /vagrant/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Connection.php on line 1082
</pre>
<a name="Causes-原因"></a>
<h3 >Causes (原因)<a href="#Causes-原因" class="wiki-anchor">¶</a></h3>
<p><a href="https://github.com/tejimaya/opDiaryPlugin/blob/a72db784a0dc3fea8f3a9d40a274c11db6253213/test/fixtures/diaries.yml#L110-L111" class="external">test/fixtures/diaries.yml#L110-L111</a>:<br /><pre><code class="php syntaxhl"><span class="CodeRay"><span class="inline-delimiter"><?php</span> <span class="keyword">for</span> (<span class="local-variable">$i</span> = <span class="integer">1</span>; <span class="local-variable">$i</span> <= <span class="integer">60</span>; <span class="local-variable">$i</span>++): <span class="inline-delimiter">?></span>
diary_for_member1_<span class="inline-delimiter"><?php</span> <span class="predefined">echo</span> <span class="local-variable">$i</span> <span class="inline-delimiter">?></span>:
Member: member1
title: "title:<span class="inline-delimiter"><?php</span> <span class="predefined">echo</span> <span class="local-variable">$i</span> <span class="inline-delimiter">?></span> by member1"
body: "body:<span class="inline-delimiter"><?php</span> <span class="predefined">echo</span> <span class="local-variable">$i</span> <span class="inline-delimiter">?></span> by member1"
created_at: "2009-03-<span class="inline-delimiter"><?php</span> <span class="predefined">printf</span>(<span class="string"><span class="delimiter">'</span><span class="content">%02d</span><span class="delimiter">'</span></span>, <span class="local-variable">$i</span>) <span class="inline-delimiter">?></span> 10:00:00"
updated_at: "2009-03-<span class="inline-delimiter"><?php</span> <span class="predefined">printf</span>(<span class="string"><span class="delimiter">'</span><span class="content">%02d</span><span class="delimiter">'</span></span>, <span class="local-variable">$i</span>) <span class="inline-delimiter">?></span> 10:00:00"
<span class="inline-delimiter"><?php</span> <span class="keyword">endfor</span>; <span class="inline-delimiter">?></span>
</span></code></pre></p>
<p>上記のように記述された fixture は次のような YAML を出力します。</p>
<pre><code class="yaml syntaxhl"><span class="CodeRay"> <span class="key">diary_for_member1_1</span>:
<span class="key">Member</span>: <span class="string"><span class="content">member1</span></span>
<span class="key">title</span>: <span class="string"><span class="delimiter">"</span><span class="content">title:1 by member1</span><span class="delimiter">"</span></span>
<span class="key">body</span>: <span class="string"><span class="delimiter">"</span><span class="content">body:1 by member1</span><span class="delimiter">"</span></span>
<span class="key">created_at</span>: <span class="string"><span class="delimiter">"</span><span class="content">2009-03-01 10:00:00</span><span class="delimiter">"</span></span>
<span class="key">updated_at</span>: <span class="string"><span class="delimiter">"</span><span class="content">2009-03-01 10:00:00</span><span class="delimiter">"</span></span>
<span class="head"><span class="head">...</span></span>
<span class="key">diary_for_member1_60</span>:
<span class="key">Member</span>: <span class="string"><span class="content">member1</span></span>
<span class="key">title</span>: <span class="string"><span class="delimiter">"</span><span class="content">title:60 by member1</span><span class="delimiter">"</span></span>
<span class="key">body</span>: <span class="string"><span class="delimiter">"</span><span class="content">body:60 by member1</span><span class="delimiter">"</span></span>
<span class="key">created_at</span>: <span class="string"><span class="delimiter">"</span><span class="content">2009-03-60 10:00:00</span><span class="delimiter">"</span></span>
<span class="key">updated_at</span>: <span class="string"><span class="delimiter">"</span><span class="content">2009-03-60 10:00:00</span><span class="delimiter">"</span></span>
</span></code></pre>
<p>created_at および updated_at にセットされる <code>"2009-03-60 10:00:00"</code> は不正な日付のため、<code>STRICT_TRANS_TABLES</code> が有効な MySQL ではエラーが発生する。</p>
opCommunityTopicPlugin - Bug(バグ) #4160 (New(新規)): テスト用fixtureの記述に誤りがありロード時にエラーが発生する
http://redmine.openpne.jp/issues/4160
2017-02-17T08:24:55Z
Youichi Kimura
kim.upsilon@bucyou.net
<a name="Overview-概要"></a>
<h3 >Overview (概要)<a href="#Overview-概要" class="wiki-anchor">¶</a></h3>
<p>MySQL 5.7 の Strict Mode が有効な状態での動作確認 (<a class="issue tracker-5 status-2 priority-4 priority-default parent" title="Task(タスク): MySQLのStrict Modeを有効にした場合に生じる問題を調査 (Accepted(着手))" href="http://redmine.openpne.jp/issues/4033">#4033</a>) を行った際に発生した。</p>
<p>fixture の読み込みを必要とするテストコードを実行すると下記のエラーが発生する:<br /><pre>
$ php plugins/opCommunityTopicPlugin/test/unit/model/CommunityTopicTest.php
PHP Fatal error: Uncaught exception 'Doctrine_Connection_Mysql_Exception' with message 'SQLSTATE[22007]: Invalid datetime format: 1292 Incorrect datetime value: '2017-02-17 open_date_comment: 'あかさたな'' for column 'open_date' at row 1' in /vagrant/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Connection.php:1082
Stack trace:
#0 /vagrant/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Connection/Statement.php(269): Doctrine_Connection->rethrowException(Object(PDOException), Object(Doctrine_Connection_Statement))
#1 /vagrant/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Connection.php(1042): Doctrine_Connection_Statement->execute(Array)
#2 /vagrant/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Connection.php(687): Doctrine_Connection->exec('INSERT INTO com...', Array)
#3 /vagrant/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Connection/UnitOfWork.php(647): Doctrine_C in /vagrant/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Connection.php on line 1082
</pre></p>
<a name="Causes-原因"></a>
<h3 >Causes (原因)<a href="#Causes-原因" class="wiki-anchor">¶</a></h3>
<p><a href="https://github.com/tejimaya/opCommunityTopicPlugin/blob/1176429425ca9bca6557fe281321fd59eaae037d/test/fixtures/999_test_data.yml#L360" class="external">test/fixtures/999_test_data.yml#L360</a>:<br /><pre><code class="yaml syntaxhl"><span class="CodeRay"> <span class="error">community_event_a_<?php echo $i ?>:</span>
<span class="key">Community</span>: <span class="string"><span class="content">community_a</span></span>
<span class="key">Member</span>: <span class="string"><span class="content">member_1</span></span>
<span class="key">name</span>: <span class="string"><span class="content">'イベントナンバー <?php echo $i ?>'</span></span>
<span class="key">body</span>: <span class="string"><span class="content">'こんにちは <?php echo $i ?>'</span></span>
<span class="key">open_date</span>: <span class="string"><span class="content"><?php echo date('Y-m-d', time())?></span></span>
<span class="key">open_date_comment</span>: <span class="string"><span class="content">'あかさたな'</span></span>
<span class="key">area</span>: <span class="string"><span class="content">'福岡県'</span></span>
</span></code></pre></p>
<p>上記のように記述された fixture は以下のような YAML を出力します。</p>
<pre><code class="yaml syntaxhl"><span class="CodeRay"> <span class="key">community_event_a_1</span>:
<span class="key">Community</span>: <span class="string"><span class="content">community_a</span></span>
<span class="key">Member</span>: <span class="string"><span class="content">member_1</span></span>
<span class="key">name</span>: <span class="string"><span class="content">'イベントナンバー 1'</span></span>
<span class="key">body</span>: <span class="string"><span class="content">'こんにちは 1'</span></span>
<span class="key">open_date</span>: <span class="string"><span class="content">2017-02-17 open_date_comment: 'あかさたな'</span></span>
<span class="key">area</span>: <span class="string"><span class="content">'福岡県'</span></span>
</span></code></pre>
<p>これは PHP タグの仕様で、<code>?></code> と後続する改行文字を含めて除去されるためです。そして、open_date にセットされる日付が不正な文字列であるとしてエラーが発生します。</p>
OpenPNE 3 - Task(タスク) #4159 (New(新規)): MySQLのSTRICT_TRANS_TABLESが有効な状態でテスト用fixtureのロードに失敗する
http://redmine.openpne.jp/issues/4159
2017-02-17T07:57:45Z
Youichi Kimura
kim.upsilon@bucyou.net
<a name="Overview-概要"></a>
<h3 >Overview (概要)<a href="#Overview-概要" class="wiki-anchor">¶</a></h3>
<p>MySQL 5.7 の Strict Mode が有効な状態での動作確認 (<a class="issue tracker-5 status-2 priority-4 priority-default parent" title="Task(タスク): MySQLのStrict Modeを有効にした場合に生じる問題を調査 (Accepted(着手))" href="http://redmine.openpne.jp/issues/4033">#4033</a>) を行った際に発生した。</p>
<p>fixture の読み込みを必要とするテストコードを実行すると下記のエラーが発生する:<br /><pre>
$ php test/unit/model/doctrine/MemberTest.php
PHP Fatal error: Uncaught exception 'Doctrine_Connection_Mysql_Exception' with message 'SQLSTATE[22007]: Invalid datetime format: 1292 Incorrect datetime value: '' for column 'value_datetime' at row 1' in /vagrant/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Connection.php:1082
Stack trace:
#0 /vagrant/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Connection/Statement.php(269): Doctrine_Connection->rethrowException(Object(PDOException), Object(Doctrine_Connection_Statement))
#1 /vagrant/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Connection.php(1042): Doctrine_Connection_Statement->execute(Array)
#2 /vagrant/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Connection.php(687): Doctrine_Connection->exec('INSERT INTO mem...', Array)
#3 /vagrant/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Connection/UnitOfWork.php(647): Doctrine_Connection->insert(Object(MemberProfileTable), in /vagrant/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Connection.php on line 1082
</pre></p>
<a name="Causes-原因"></a>
<h3 >Causes (原因)<a href="#Causes-原因" class="wiki-anchor">¶</a></h3>
<p><a class="source" href="http://redmine.openpne.jp/projects/op3/repository/revisions/43190aa1/entry/test/fixtures/common/test_data.yml#L344">source:test/fixtures/common/test_data.yml@43190aa1#L344</a>:<br /><pre><code class="yaml syntaxhl"><span class="CodeRay"> <span class="key">second_member_profile_birthday</span>:
<span class="key">value</span>: <span class="string"><span class="delimiter">"</span><span class="delimiter">"</span></span>
<span class="key">value_datetime</span>: <span class="string"><span class="delimiter">"</span><span class="delimiter">"</span></span>
<span class="key">public_flag</span>: <span class="string"><span class="content">1</span></span>
<span class="key">Member</span>: <span class="string"><span class="content">second_member</span></span>
<span class="key">Profile</span>: <span class="string"><span class="content">profile_birthday</span></span>
<span class="key">children</span>: <span class="string"><span class="content">[]</span></span>
</span></code></pre></p>
<p>上記の value_datetime に空文字列をセットしていることが原因。</p>
<p><a class="source" href="http://redmine.openpne.jp/projects/op3/repository/revisions/43190aa1/entry/test/fixtures/common/xss_test_data.yml#L244">source:test/fixtures/common/xss_test_data.yml@43190aa1#L244</a>:<br /><pre><code class="yaml syntaxhl"><span class="CodeRay"><span class="key">OAuthMemberToken</span>:
<span class="key">first_member_html_oauth_token</span>:
<span class="key">key_string</span>: <span class="string"><span class="delimiter">"</span><span class="content">fIrStMeMbErHtMlOaUtHtOkEn</span><span class="delimiter">"</span></span>
<span class="key">secret</span>: <span class="string"><span class="delimiter">"</span><span class="content">fIrStMeMbErHtMlOaUtHsEcReT</span><span class="delimiter">"</span></span>
<span class="key">type</span>: <span class="string"><span class="delimiter">"</span><span class="content">access</span><span class="delimiter">"</span></span>
<span class="key">is_active</span>: <span class="string"><span class="content">1</span></span>
<span class="key">Consumer</span>: <span class="string"><span class="content">html_oauth_consumer1</span></span>
<span class="key">Member</span>: <span class="string"><span class="content">first_member</span></span>
</span></code></pre></p>
<p>また、上記の key_string についても定義されている VARCHAR のサイズを越える文字列のためエラーが発生する。</p>
OpenPNE 3 - Task(タスク) #4158 (New(新規)): MySQLのSTRICT_TRANS_TABLESが有効な状態でプリセットのプロフィール項目を登録するとエラー
http://redmine.openpne.jp/issues/4158
2017-02-17T03:55:14Z
Youichi Kimura
kim.upsilon@bucyou.net
<a name="Overview-概要"></a>
<h3 >Overview (概要)<a href="#Overview-概要" class="wiki-anchor">¶</a></h3>
<p>MySQL 5.7 の Strict Mode が有効な状態での動作確認 (<a class="issue tracker-5 status-2 priority-4 priority-default parent" title="Task(タスク): MySQLのStrict Modeを有効にした場合に生じる問題を調査 (Accepted(着手))" href="http://redmine.openpne.jp/issues/4033">#4033</a>) を行った際に発生した。</p>
<p>管理画面の「プロフィール項目登録」でプリセットから選択した項目を登録すると下記のエラーが発生する:</p>
<pre>
SQLSTATE[HY000]: General error: 1364 Field 'caption' doesn't have a default value
</pre>
<a name="Causes-原因"></a>
<h3 >Causes (原因)<a href="#Causes-原因" class="wiki-anchor">¶</a></h3>
<pre><code class="sql syntaxhl"><span class="CodeRay"><span class="class">INSERT</span> <span class="class">INTO</span> profile (name, is_required, is_unique, is_edit_public_flag, default_public_flag, form_type, value_type, is_disp_regist, is_disp_config, is_disp_search, is_public_web, sort_order, created_at, updated_at) <span class="keyword">VALUES</span> (<span class="string"><span class="delimiter">'</span><span class="content">op_preset_country</span><span class="delimiter">'</span></span>, <span class="string"><span class="delimiter">'</span><span class="content">0</span><span class="delimiter">'</span></span>, <span class="string"><span class="delimiter">'</span><span class="content">0</span><span class="delimiter">'</span></span>, <span class="string"><span class="delimiter">'</span><span class="content">0</span><span class="delimiter">'</span></span>, <span class="string"><span class="delimiter">'</span><span class="content">1</span><span class="delimiter">'</span></span>, <span class="string"><span class="delimiter">'</span><span class="content">country_select</span><span class="delimiter">'</span></span>, <span class="string"><span class="delimiter">'</span><span class="content">string</span><span class="delimiter">'</span></span>, <span class="string"><span class="delimiter">'</span><span class="content">1</span><span class="delimiter">'</span></span>, <span class="string"><span class="delimiter">'</span><span class="content">1</span><span class="delimiter">'</span></span>, <span class="string"><span class="delimiter">'</span><span class="content">1</span><span class="delimiter">'</span></span>, <span class="string"><span class="delimiter">'</span><span class="content">0</span><span class="delimiter">'</span></span>, <span class="string"><span class="delimiter">'</span><span class="content">130</span><span class="delimiter">'</span></span>, <span class="string"><span class="delimiter">'</span><span class="content">2017-02-16 21:24:37</span><span class="delimiter">'</span></span>, <span class="string"><span class="delimiter">'</span><span class="content">2017-02-16 21:24:37</span><span class="delimiter">'</span></span>)
<span class="class">INSERT</span> <span class="class">INTO</span> profile_translation (id, lang) <span class="keyword">VALUES</span> (<span class="string"><span class="delimiter">'</span><span class="content">5</span><span class="delimiter">'</span></span>, <span class="string"><span class="delimiter">'</span><span class="content">en</span><span class="delimiter">'</span></span>)
</span></code></pre>
<p>二つ目のクエリで、NOT NULL 制約のある <code>caption</code> に値がセットされていないためエラーが発生している。</p>
<a name="Way-to-fix-修正内容"></a>
<h3 >Way to fix (修正内容)<a href="#Way-to-fix-修正内容" class="wiki-anchor">¶</a></h3>
<p>修正内容を記入</p>
opWebAPIPlugin - Bug(バグ) #4156 (New(新規)): MySQLのONLY_FULL_GROUP_BYが有効な状態でコミュニティ一覧のフィードを取得するとエラー
http://redmine.openpne.jp/issues/4156
2017-02-16T11:33:52Z
Youichi Kimura
kim.upsilon@bucyou.net
<a name="Overview-概要"></a>
<h3 >Overview (概要)<a href="#Overview-概要" class="wiki-anchor">¶</a></h3>
<p>MySQL 5.7 の Strict Mode が有効な状態での動作確認 (<a class="issue tracker-5 status-2 priority-4 priority-default parent" title="Task(タスク): MySQLのStrict Modeを有効にした場合に生じる問題を調査 (Accepted(着手))" href="http://redmine.openpne.jp/issues/4033">#4033</a>) を行った際に発生した。</p>
<p>コミュニティ一覧のフィード (<code>/api.php/feeds/community</code>) を取得すると下記のエラーが発生する:</p>
<pre>
SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'openpne.c3.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by.
</pre>
<a name="Causes-原因"></a>
<h3 >Causes (原因)<a href="#Causes-原因" class="wiki-anchor">¶</a></h3>
<pre><code class="sql syntaxhl"><span class="CodeRay"><span class="class">SELECT</span> <span class="keyword">DISTINCT</span> c3.id
<span class="keyword">FROM</span> community c3
<span class="keyword">LEFT</span> <span class="keyword">JOIN</span> community_member c4 <span class="keyword">ON</span> c3.id = c4.community_id
<span class="keyword">GROUP</span> <span class="keyword">BY</span> c4.community_id
<span class="keyword">ORDER</span> <span class="keyword">BY</span> c3.created_at <span class="directive">DESC</span>
LIMIT <span class="integer">25</span>
</span></code></pre>
<p>上記のクエリで、<code>c3.id</code> が GROUP BY に含まれていないためエラーが発生している。</p>
<a name="Way-to-fix-修正内容"></a>
<h3 >Way to fix (修正内容)<a href="#Way-to-fix-修正内容" class="wiki-anchor">¶</a></h3>
<p>修正内容を記入</p>
opRankingPlugin - Bug(バグ) #4155 (New(新規)): MySQLのONLY_FULL_GROUP_BYが有効な状態でコミュニティ盛り上がり度ランキング画面を表示す...
http://redmine.openpne.jp/issues/4155
2017-02-16T07:20:26Z
Youichi Kimura
kim.upsilon@bucyou.net
<a name="Overview-概要"></a>
<h3 >Overview (概要)<a href="#Overview-概要" class="wiki-anchor">¶</a></h3>
<p>MySQL 5.7 の Strict Mode が有効な状態での動作確認 (<a class="issue tracker-5 status-2 priority-4 priority-default parent" title="Task(タスク): MySQLのStrict Modeを有効にした場合に生じる問題を調査 (Accepted(着手))" href="http://redmine.openpne.jp/issues/4033">#4033</a>) を行った際に発生した。</p>
<p>コミュニティ盛り上がり度ランキング画面を開くと下記のエラーが発生する:</p>
<pre>
SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'openpne.c.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
</pre>
<a name="Causes-原因"></a>
<h3 >Causes (原因)<a href="#Causes-原因" class="wiki-anchor">¶</a></h3>
<pre><code class="sql syntaxhl"><span class="CodeRay"><span class="class">SELECT</span> c.id <span class="keyword">AS</span> c__id, c2.id <span class="keyword">AS</span> c2__id, c2.community_id <span class="keyword">AS</span> c2__1, <span class="predefined">COUNT</span>(*) <span class="keyword">AS</span> c__0, c2.community_id <span class="keyword">AS</span> c2__1
<span class="keyword">FROM</span> community_topic_comment c
<span class="keyword">LEFT</span> <span class="keyword">JOIN</span> community_topic c2 <span class="keyword">ON</span> c.community_topic_id = c2.id
<span class="keyword">WHERE</span> (c.created_at >= <span class="string"><span class="delimiter">'</span><span class="content">2017-02-15</span><span class="delimiter">'</span></span> <span class="keyword">AND</span> c.created_at < <span class="string"><span class="delimiter">'</span><span class="content">2017-02-16</span><span class="delimiter">'</span></span>)
<span class="keyword">GROUP</span> <span class="keyword">BY</span> c2.community_id
<span class="keyword">ORDER</span> <span class="keyword">BY</span> <span class="predefined">COUNT</span>(*) <span class="directive">DESC</span>
LIMIT <span class="integer">10</span>
</span></code></pre>
<p>上記のクエリで、<code>c.id</code> が GROUP BY に含まれていないためエラーが発生している。</p>
<a name="Way-to-fix-修正内容"></a>
<h3 >Way to fix (修正内容)<a href="#Way-to-fix-修正内容" class="wiki-anchor">¶</a></h3>
<p>修正内容を記入</p>
opRankingPlugin - Bug(バグ) #4154 (New(新規)): MySQLのONLY_FULL_GROUP_BYが有効な状態でコミュニティ参加人数ランキング画面を表示するとエラー
http://redmine.openpne.jp/issues/4154
2017-02-16T07:18:21Z
Youichi Kimura
kim.upsilon@bucyou.net
<a name="Overview-概要"></a>
<h3 >Overview (概要)<a href="#Overview-概要" class="wiki-anchor">¶</a></h3>
<p>MySQL 5.7 の Strict Mode が有効な状態での動作確認 (<a class="issue tracker-5 status-2 priority-4 priority-default parent" title="Task(タスク): MySQLのStrict Modeを有効にした場合に生じる問題を調査 (Accepted(着手))" href="http://redmine.openpne.jp/issues/4033">#4033</a>) を行った際に発生した。</p>
<p>コミュニティ参加人数ランキング画面を開くと下記のエラーが発生する:</p>
<pre>
SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'openpne.c.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by.
</pre>
<a name="Causes-原因"></a>
<h3 >Causes (原因)<a href="#Causes-原因" class="wiki-anchor">¶</a></h3>
<pre><code class="sql syntaxhl"><span class="CodeRay"><span class="class">SELECT</span> c.id <span class="keyword">AS</span> c__id, c.community_id <span class="keyword">AS</span> c__community_id, <span class="predefined">COUNT</span>(*) <span class="keyword">AS</span> c__0
<span class="keyword">FROM</span> community_member c
<span class="keyword">GROUP</span> <span class="keyword">BY</span> c.community_id
<span class="keyword">ORDER</span> <span class="keyword">BY</span> <span class="predefined">COUNT</span>(*) <span class="directive">DESC</span>
LIMIT <span class="integer">10</span>
</span></code></pre>
<p>上記のクエリで、<code>c.id</code> が GROUP BY に含まれていないためエラーが発生している。</p>
<a name="Way-to-fix-修正内容"></a>
<h3 >Way to fix (修正内容)<a href="#Way-to-fix-修正内容" class="wiki-anchor">¶</a></h3>
<p>修正内容を記入</p>
opRankingPlugin - Bug(バグ) #4153 (New(新規)): MySQLのONLY_FULL_GROUP_BYが有効な状態でフレンド数ランキング画面を表示するとエラー
http://redmine.openpne.jp/issues/4153
2017-02-16T07:16:05Z
Youichi Kimura
kim.upsilon@bucyou.net
<a name="Overview-概要"></a>
<h3 >Overview (概要)<a href="#Overview-概要" class="wiki-anchor">¶</a></h3>
<p>MySQL 5.7 の Strict Mode が有効な状態での動作確認 (<a class="issue tracker-5 status-2 priority-4 priority-default parent" title="Task(タスク): MySQLのStrict Modeを有効にした場合に生じる問題を調査 (Accepted(着手))" href="http://redmine.openpne.jp/issues/4033">#4033</a>) を行った際に発生した。</p>
<p>フレンド数ランキング画面を開くと下記のエラーが発生する:</p>
<pre>
SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'openpne.m.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
</pre>
<a name="Causes-原因"></a>
<h3 >Causes (原因)<a href="#Causes-原因" class="wiki-anchor">¶</a></h3>
<pre><code class="sql syntaxhl"><span class="CodeRay"><span class="class">SELECT</span> m.id <span class="keyword">AS</span> m__id, m.member_id_to <span class="keyword">AS</span> m__member_id_to, <span class="predefined">COUNT</span>(*) <span class="keyword">AS</span> m__0
<span class="keyword">FROM</span> member_relationship m
<span class="keyword">LEFT</span> <span class="keyword">JOIN</span> member m2 <span class="keyword">ON</span> m.member_id_to = m2.id
<span class="keyword">WHERE</span> (m.is_friend = <span class="string"><span class="delimiter">'</span><span class="content">1</span><span class="delimiter">'</span></span> <span class="keyword">AND</span> m2.is_active = <span class="string"><span class="delimiter">'</span><span class="content">1</span><span class="delimiter">'</span></span>)
<span class="keyword">GROUP</span> <span class="keyword">BY</span> m2.id
<span class="keyword">ORDER</span> <span class="keyword">BY</span> <span class="predefined">COUNT</span>(*) <span class="directive">DESC</span>
LIMIT <span class="integer">10</span>
</span></code></pre>
<p>上記のクエリで、<code>m.id</code> が GROUP BY に含まれていないためエラーが発生している。</p>
<a name="Way-to-fix-修正内容"></a>
<h3 >Way to fix (修正内容)<a href="#Way-to-fix-修正内容" class="wiki-anchor">¶</a></h3>
<p>修正内容を記入</p>
opRankingPlugin - Bug(バグ) #4152 (New(新規)): MySQLのONLY_FULL_GROUP_BYが有効な状態でアクセス数ランキング画面を表示するとエラー
http://redmine.openpne.jp/issues/4152
2017-02-16T07:02:03Z
Youichi Kimura
kim.upsilon@bucyou.net
<a name="Overview-概要"></a>
<h3 >Overview (概要)<a href="#Overview-概要" class="wiki-anchor">¶</a></h3>
<p>MySQL 5.7 の Strict Mode が有効な状態での動作確認 (<a class="issue tracker-5 status-2 priority-4 priority-default parent" title="Task(タスク): MySQLのStrict Modeを有効にした場合に生じる問題を調査 (Accepted(着手))" href="http://redmine.openpne.jp/issues/4033">#4033</a>) を行った際に発生した。</p>
<p>アクセス数ランキング画面を開くと下記のエラーが発生する:</p>
<pre>
SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'openpne.a.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
</pre>
<a name="Causes-原因"></a>
<h3 >Causes (原因)<a href="#Causes-原因" class="wiki-anchor">¶</a></h3>
<pre><code class="sql syntaxhl"><span class="CodeRay"><span class="class">SELECT</span> a.id <span class="keyword">AS</span> a__id, a.member_id_to <span class="keyword">AS</span> a__member_id_to, <span class="predefined">COUNT</span>(*) <span class="keyword">AS</span> a__0
<span class="keyword">FROM</span> ashiato a
<span class="keyword">WHERE</span> (a.created_at >= <span class="string"><span class="delimiter">'</span><span class="content">2017-02-15</span><span class="delimiter">'</span></span> <span class="keyword">AND</span> a.created_at < <span class="string"><span class="delimiter">'</span><span class="content">2017-02-16</span><span class="delimiter">'</span></span>)
<span class="keyword">GROUP</span> <span class="keyword">BY</span> a.member_id_to
<span class="keyword">ORDER</span> <span class="keyword">BY</span> <span class="predefined">COUNT</span>(*) <span class="directive">DESC</span>
LIMIT <span class="integer">10</span>
</span></code></pre>
<p>上記のクエリで、<code>a.id</code> が GROUP BY に含まれていないためエラーが発生している。</p>
<a name="Way-to-fix-修正内容"></a>
<h3 >Way to fix (修正内容)<a href="#Way-to-fix-修正内容" class="wiki-anchor">¶</a></h3>
<p>修正内容を記入</p>
opDiaryPlugin - Bug(バグ) #4151 (New(新規)): MySQLのONLY_FULL_GROUP_BYが有効な状態で「日記コメント記入履歴」ガジェットを表示するとエラー
http://redmine.openpne.jp/issues/4151
2017-02-16T06:44:32Z
Youichi Kimura
kim.upsilon@bucyou.net
<a name="Overview-現象"></a>
<h3 >Overview (現象)<a href="#Overview-現象" class="wiki-anchor">¶</a></h3>
<p>MySQL 5.7 の Strict Mode が有効な状態での動作確認 (<a class="issue tracker-5 status-2 priority-4 priority-default parent" title="Task(タスク): MySQLのStrict Modeを有効にした場合に生じる問題を調査 (Accepted(着手))" href="http://redmine.openpne.jp/issues/4033">#4033</a>) を行った際に発生した。</p>
<p>「日記コメント記入履歴」ガジェットを追加した状態でホーム画面を開くと下記のエラーが発生する:</p>
<pre>
SQLSTATE[HY000]: General error: 3065 Expression #1 of ORDER BY clause is not in SELECT list, references column 'openpne.d3.last_comment_time' which is not in SELECT list; this is incompatible with DISTINCT
</pre>
<a name="Causes-原因"></a>
<h3 >Causes (原因)<a href="#Causes-原因" class="wiki-anchor">¶</a></h3>
<pre><code class="sql syntaxhl"><span class="CodeRay"><span class="class">SELECT</span> <span class="keyword">DISTINCT</span> d3.diary_id
<span class="keyword">FROM</span> diary_comment_update d3
<span class="keyword">INNER</span> <span class="keyword">JOIN</span> diary d4 <span class="keyword">ON</span> d3.diary_id = d4.id
<span class="keyword">LEFT</span> <span class="keyword">JOIN</span> member m3 <span class="keyword">ON</span> d4.member_id = m3.id
<span class="keyword">LEFT</span> <span class="keyword">JOIN</span> member_relationship m4 <span class="keyword">ON</span> m3.id = m4.member_id_to <span class="keyword">AND</span> (m4.member_id_from = <span class="string"><span class="delimiter">'</span><span class="content">1</span><span class="delimiter">'</span></span>)
<span class="keyword">WHERE</span> d3.member_id = <span class="string"><span class="delimiter">'</span><span class="content">1</span><span class="delimiter">'</span></span>
<span class="keyword">AND</span> (
d4.public_flag = <span class="string"><span class="delimiter">'</span><span class="content">4</span><span class="delimiter">'</span></span> <span class="keyword">OR</span>
d4.public_flag = <span class="string"><span class="delimiter">'</span><span class="content">1</span><span class="delimiter">'</span></span> <span class="keyword">OR</span>
(d4.public_flag = <span class="string"><span class="delimiter">'</span><span class="content">2</span><span class="delimiter">'</span></span> <span class="keyword">AND</span> m4.is_friend = <span class="integer">1</span>)
)
<span class="keyword">AND</span> (m3.is_active = <span class="string"><span class="delimiter">'</span><span class="content">1</span><span class="delimiter">'</span></span> <span class="keyword">OR</span> m3.is_active <span class="keyword">IS</span> <span class="predefined-constant">NULL</span>)
<span class="keyword">ORDER</span> <span class="keyword">BY</span> d3.last_comment_time <span class="directive">DESC</span>
LIMIT <span class="integer">5</span>
</span></code></pre>
<p>上記のクエリで、ORDER BY で使用するカラムが DISTINCT の対象に含まれていないためにエラーが発生している。</p>
<a name="Way-to-fix-修正内容"></a>
<h3 >Way to fix (修正内容)<a href="#Way-to-fix-修正内容" class="wiki-anchor">¶</a></h3>
<p>修正内容を記入</p>
opAshiatoPlugin - Bug(バグ) #4150 (New(新規)): MySQLのONLY_FULL_GROUP_BYが有効な状態であしあとページを開くとエラーが発生する
http://redmine.openpne.jp/issues/4150
2017-02-16T05:09:58Z
Youichi Kimura
kim.upsilon@bucyou.net
<a name="Overview-現象"></a>
<h3 >Overview (現象)<a href="#Overview-現象" class="wiki-anchor">¶</a></h3>
<p>MySQL 5.7 の Strict Mode が有効な状態 (<a class="issue tracker-5 status-2 priority-4 priority-default parent" title="Task(タスク): MySQLのStrict Modeを有効にした場合に生じる問題を調査 (Accepted(着手))" href="http://redmine.openpne.jp/issues/4033">#4033</a>) であしあとページを開くと下記のエラーが発生する:</p>
<pre>
SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'openpne.a.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
</pre>
<a name="Causes-原因"></a>
<h3 >Causes (原因)<a href="#Causes-原因" class="wiki-anchor">¶</a></h3>
<pre><code class="sql syntaxhl"><span class="CodeRay"><span class="class">SELECT</span> a.id <span class="keyword">AS</span> a__id, a.r_date <span class="keyword">AS</span> a__r_date <span class="keyword">FROM</span> ashiato a <span class="keyword">WHERE</span> (a.member_id_to = <span class="error">?</span>) <span class="keyword">GROUP</span> <span class="keyword">BY</span> a.r_date <span class="directive">DESC</span> LIMIT <span class="integer">30</span>
</span></code></pre>
<p>実行される上記のクエリについて、GROUP BY で指定されていない <code>a.id</code> が SELECT リストで参照されていることが原因。</p>
<a name="Way-to-fix-修正内容"></a>
<h3 >Way to fix (修正内容)<a href="#Way-to-fix-修正内容" class="wiki-anchor">¶</a></h3>
<p>修正内容を記入</p>
OpenPNE 3 - Task(タスク) #4040 (New(新規)): #3083の修正コミットがstable-3.8.xのみに存在し、masterブランチに対するチケット及びPull R...
http://redmine.openpne.jp/issues/4040
2016-11-14T07:59:10Z
Youichi Kimura
kim.upsilon@bucyou.net
<a name="概要"></a>
<h3 >概要<a href="#概要" class="wiki-anchor">¶</a></h3>
<p><a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Bug(バグ): --internetオプション付けないでインストールした場合、プラグイン設定ページにアクセスできない (Fixed(完了))" href="http://redmine.openpne.jp/issues/3083">#3083</a> はトラッカーが Bug のチケットであるが、その修正コミットである <a class="changeset" title="(fixes #3083) fixed not to occur Exception when channel server was not registered" href="http://redmine.openpne.jp/projects/op3/repository/revisions/41db124efa99201060a2d17cecac966045b8c611">41db124e</a> は stable-3.8.x に取り込まれている。<br />そのため <a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Bug(バグ): --internetオプション付けないでインストールした場合、プラグイン設定ページにアクセスできない (Fixed(完了))" href="http://redmine.openpne.jp/issues/3083">#3083</a> の役割は実質 Backport のチケットであるが、一方で <a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Bug(バグ): --internetオプション付けないでインストールした場合、プラグイン設定ページにアクセスできない (Fixed(完了))" href="http://redmine.openpne.jp/issues/3083">#3083</a> の修正を master ブランチで行うチケットが存在していない。</p>
<p>内容が酷似した <a class="issue tracker-1 status-13 priority-4 priority-default closed" title="Bug(バグ): --internetオプション付けないでインストールした場合、プラグイン設定ページにアクセスできない (Won't fix(対応せず))" href="http://redmine.openpne.jp/issues/3011">#3011</a>, <a class="issue tracker-4 status-5 priority-4 priority-default closed" title="Backport(バックポート): --internetオプション付けないでインストールした場合、プラグイン設定ページにアクセスできない (Fixed(完了))" href="http://redmine.openpne.jp/issues/3012">#3012</a> のチケットも存在するが、これらは <a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Bug(バグ): --internetオプション付けないでインストールした場合、プラグイン設定ページにアクセスできない (Fixed(完了))" href="http://redmine.openpne.jp/issues/3083">#3083</a> 以前に master ブランチで修正および stable-3.8.x へのバックポートが既に行われている。<br /><a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Bug(バグ): --internetオプション付けないでインストールした場合、プラグイン設定ページにアクセスできない (Fixed(完了))" href="http://redmine.openpne.jp/issues/3083">#3083</a> は、一度 <a class="issue tracker-1 status-13 priority-4 priority-default closed" title="Bug(バグ): --internetオプション付けないでインストールした場合、プラグイン設定ページにアクセスできない (Won't fix(対応せず))" href="http://redmine.openpne.jp/issues/3011">#3011</a>, <a class="issue tracker-4 status-5 priority-4 priority-default closed" title="Backport(バックポート): --internetオプション付けないでインストールした場合、プラグイン設定ページにアクセスできない (Fixed(完了))" href="http://redmine.openpne.jp/issues/3012">#3012</a> で修正した問題について再び修正を試みたチケットであるように読み取れる。</p>
<a name="対応方法"></a>
<h3 >対応方法<a href="#対応方法" class="wiki-anchor">¶</a></h3>
<p>stable-3.8.x ブランチにしか存在しない <a class="changeset" title="(fixes #3083) fixed not to occur Exception when channel server was not registered" href="http://redmine.openpne.jp/projects/op3/repository/revisions/41db124efa99201060a2d17cecac966045b8c611">41db124e</a> の修正を master ブランチに cherry-pick するためのチケットおよび Pull Request を作成する</p>
OpenPNE 3 - Enhancement(機能追加・改善) #4014 (New(新規)): member_configに格納しているメールアドレスを独立したテーブルに分離する
http://redmine.openpne.jp/issues/4014
2016-09-29T05:15:11Z
Youichi Kimura
kim.upsilon@bucyou.net
<a name="Overview-概要"></a>
<h3 >Overview (概要)<a href="#Overview-概要" class="wiki-anchor">¶</a></h3>
<p>OpenPNE3 では SNS メンバーのメールアドレスを member_config テーブルに格納しており、下記の name を割り当てている。<br />(「設定が完了していない」状態とは <a class="issue tracker-2 status-12 priority-5 priority-high3 closed" title="Enhancement(機能追加・改善): member_configのpc_address_preを複数の目的で使用すべきではない (Invalid(無効))" href="http://redmine.openpne.jp/issues/3829#note-3">#3829-3</a> で指摘しているような「所有者確認が済んでいないメールアドレス」を指す)</p>
<ul>
<li>pc_address
<ul>
<li>PCメールアドレス</li>
</ul>
</li>
<li>mobile_address
<ul>
<li>携帯メールアドレス</li>
</ul>
</li>
<li>pc_address_pre
<ul>
<li>設定が完了していないPCメールアドレス</li>
</ul>
</li>
<li>mobile_address_pre
<ul>
<li>設定が完了していない携帯メールアドレス</li>
</ul></li>
</ul>
<p>これらのメールアドレスに関する設定は下記のような問題点を抱えている。</p>
<a name="問題点1-ユニーク制約を設定できないテーブル構造"></a>
<h4 >問題点1: ユニーク制約を設定できないテーブル構造<a href="#問題点1-ユニーク制約を設定できないテーブル構造" class="wiki-anchor">¶</a></h4>
<p>メールアドレスは SNS メンバーのログインおよびパスワード再発行にも使用される重要な役割を担っている。また、その用途から自明なとおり 1 つのメールアドレスに対応する SNS メンバーが 2 人以上存在してはならない。<br />しかし、メールアドレスを格納している member_config テーブルに同じメールアドレスが複数含まれないようにユニーク制約を設定することはできない。member_config はメールアドレス以外にも様々な設定を扱っており、value に対してユニーク制約を設定してしまうと他のメンバーと設定が重複しうる別の設定項目にも影響してしまうためである。</p>
<p>そのため現在に至るまで pc_address, mobile_address には DB スキーマ上のユニーク制約を設けることができないまま、アプリケーション側でメールアドレスの重複が生じないように対処し続けてきた。<br />しかし <a class="issue tracker-1 status-5 priority-5 priority-high3 closed" title="Bug(バグ): 管理画面 招待メール送信 を利用すると同じメールアドレスを重複登録できる (Fixed(完了))" href="http://redmine.openpne.jp/issues/1816">#1816</a> のように一度でも重複チェックに漏れが生じると member_config テーブルには重複したメールアドレスが残り続けてしまう。その後の修正も <a class="issue tracker-1 status-5 priority-5 priority-high3 closed" title="Bug(バグ): 管理画面 招待メール送信 を利用すると同じメールアドレスを重複登録できる (Fixed(完了))" href="http://redmine.openpne.jp/issues/1816">#1816</a> 自体の修正だけでは足らず、 <a class="issue tracker-1 status-5 priority-5 priority-high3 closed" title="Bug(バグ): 重複登録しないように修正する前の環境で送信した招待メールでは重複登録が可能になってしまっている (Fixed(完了))" href="http://redmine.openpne.jp/issues/2340">#2340</a> のように既に重複したメールアドレスが存在していても正しく動作させるためにレコードの更新日時をチェックするといった修正も行われることになる。<br />もしユニーク制約が設定できる設計であったならば、仮に <a class="issue tracker-1 status-5 priority-5 priority-high3 closed" title="Bug(バグ): 管理画面 招待メール送信 を利用すると同じメールアドレスを重複登録できる (Fixed(完了))" href="http://redmine.openpne.jp/issues/1816">#1816</a> のような不具合が発生しても DB にレコードが追加される前に異常終了するため、その不具合のみ修正されれば十分だったはずである。</p>
<a name="問題点2-pc_address-と-mobile_address-の区別"></a>
<h4 >問題点2: pc_address と mobile_address の区別<a href="#問題点2-pc_address-と-mobile_address-の区別" class="wiki-anchor">¶</a></h4>
<p>PCメールアドレスと携帯メールアドレスの違いは <code>opToolkit::isMobileEmailAddress()</code> によって携帯メールアドレスと判断されるか否かの違いであり、いわゆる <a href="https://ja.wikipedia.org/wiki/%E3%82%AD%E3%83%A3%E3%83%AA%E3%82%A2%E3%83%A1%E3%83%BC%E3%83%AB" class="external">キャリアメール</a> が携帯メールアドレスとして扱われている。PCメールアドレスと携帯メールアドレスは利用できる機能にも下記のような違いがある。</p>
<ul>
<li>「メール投稿」関連の機能は携帯メールアドレスからのみ利用できる</li>
<li>ログイン用メールアドレスに「PCメールアドレスと携帯メールアドレスのどちらか一方を受け付ける」を設定しているSNSでは、PCメールアドレスではPC版のみ、携帯メールアドレスでは携帯版のみにログインできる
<ul>
<li>この設定は後にデフォルトではなくなった (master, 3.6.x および 3.8.x の最新バージョン)</li>
</ul></li>
</ul>
<p>スマートフォンから OpenPNE を利用する場合は携帯 IP アドレス帯域制限により mobile_frontend は使用できないが、そのような携帯端末でも新規登録にキャリアメールを使用すると mobile_address として登録されるためログインできなくなるという問題も過去に生じていた (<a class="issue tracker-1 status-13 priority-4 priority-default closed" title="Bug(バグ): スマートフォンで携帯メールアドレスを利用することができない (Won't fix(対応せず))" href="http://redmine.openpne.jp/issues/3155">#3155</a>)。<br />また、Gmail などとキャリアメールの双方を扱える携帯端末が増えたことで pc_address, mobile_address の区別が形骸化しつつあり、携帯 (スマートフォン) で Gmail を使用しているユーザーが「携帯メールアドレス」の設定画面に <code>@gmail.com</code> のメールアドレスを入力するとエラーになるといった不親切な状態も招いている。</p>
<a name="Spec-仕様"></a>
<h3 >Spec (仕様)<a href="#Spec-仕様" class="wiki-anchor">¶</a></h3>
<p>これらの問題点を解決するために、下記のような email_address テーブルを新たに追加する。</p>
<pre><code class="yaml syntaxhl"><span class="CodeRay"><span class="key">Member</span>:
<span class="key">actAs</span>: <span class="string"><span class="content">[Timestampable, opActivateBehavior]</span></span>
<span class="key">columns</span>:
<span class="key">id</span>: <span class="string"><span class="content">{ type: integer(4), primary: true, autoincrement: true }</span></span>
<span class="key">name</span>: <span class="string"><span class="content">{ type: string(64), default: "", notnull: true }</span></span>
<span class="key">invite_member_id</span>: <span class="string"><span class="content">{ type: integer(4) }</span></span>
<span class="key">is_login_rejected</span>: <span class="string"><span class="content">{ type: boolean, notnull: true, default: false }</span></span>
<span class="key">primary_email_address_id</span>: <span class="string"><span class="content">{ type: integer(4) }</span></span> <span class="comment"># 追加</span>
<span class="key">relations</span>:
<span class="key">Member</span>: <span class="string"><span class="content">{ local: invite_member_id, foreign: id, onDelete: set null }</span></span>
<span class="key">PrimaryEmailAddress</span>: <span class="string"><span class="content">{ class: EmailAddress, local: primary_email_id, onDelete: set null }</span></span> <span class="comment"># 追加</span>
<span class="comment"># 新規テーブル</span>
<span class="key">EmailAddress</span>:
<span class="key">columns</span>:
<span class="key">id</span>: <span class="string"><span class="content">{ type: integer(4), primary: true, autoincrement: true }</span></span>
<span class="key">email_address</span>: <span class="string"><span class="content">{ type: string(255), notnull: true }</span></span>
<span class="key">member_id</span>: <span class="string"><span class="content">{ type: integer(4), notnull: true }</span></span>
<span class="key">verified</span>: <span class="string"><span class="content">{ type: boolean, notnull: true }</span></span>
<span class="key">relations</span>:
<span class="key">Member</span>: <span class="string"><span class="content">{ onDelete: cascade }</span></span>
<span class="key">indexes</span>:
<span class="key">email_address_UNIQUE</span>:
<span class="key">fields</span>: <span class="string"><span class="content">[email_address]</span></span>
<span class="key">type</span>: <span class="string"><span class="content">unique</span></span>
</span></code></pre>
<a name="DB-スキーマの詳細"></a>
<h4 >DB スキーマの詳細<a href="#DB-スキーマの詳細" class="wiki-anchor">¶</a></h4>
<ul>
<li>メンバーは 0 個以上のメールアドレスを持つことができる
<ul>
<li>0 個を許容するのは OpenID や LDAP などメールアドレスを用いない認証方式を考慮するため</li>
<li>2 個以上を許容するのは既に pc_address, mobile_address の両方にメールアドレスを設定しているメンバーを考慮するため</li>
</ul>
</li>
<li>メールアドレスに紐付くメンバーは常に 1 人のみ存在する</li>
<li>メールアドレスは pc, mobile の区別を行わずに格納する</li>
<li>メールアドレス変更や新規登録などにおける、所有者確認が済んでいないメールアドレスは <code>email_address.verified = 0</code> で表す
<ul>
<li><code>{pc,mobile}_address_pre</code> に相当する</li>
<li><a class="issue tracker-1 status-5 priority-4 priority-default closed parent" title="Bug(バグ): メールアドレス設定から意図的に他のメンバーと同じメールアドレスを設定できる (Fixed(完了))" href="http://redmine.openpne.jp/issues/4012">#4012</a> における対応と異なり、これらのメールアドレスについても一切の重複を認めない</li>
</ul>
</li>
<li>メンバーは自ら設定しているメールアドレスのうち 1 つを <code>member.primary_email_address_id</code> に設定できる</li>
</ul>
<a name="互換性に関する考慮"></a>
<h4 >互換性に関する考慮<a href="#互換性に関する考慮" class="wiki-anchor">¶</a></h4>
<ul>
<li>メールテンプレートなど pc, mobile の区別が必要な場面ではその都度 <code>opToolkit::isMobileEmailAddress()</code> を使用して判別する</li>
<li>member_config テーブルの pc_address, mobile_address は引き続き参照できる状態にする
<ul>
<li>pc_address, mobile_address を直接参照しているプラグインとの互換性を保つため</li>
<li>メンバーの PrimaryEmailAddress が変更されると、設定されたメールアドレスが pc_address, mobile_address のいずれか一方にも設定される</li>
<li>PrimaryEmailAddress のメールアドレスが pc_address に設定された場合、mobile_address のレコードが存在すれば削除される (常にどちらか一方のみ存在する状態になる)</li>
</ul></li>
</ul>