Bug(バグ) #2598
完了他の認証プラグインで「秘密の質問」の項目が表示されてしまう
100%
説明
Overview (現象)¶
opAuthOpenIDPlugin をつかって新規登録をおこなうと秘密の質問がハッシュ化されずに登録される。
mysql> select id,member_id,name,value from member_config where member_id=5; +----+-----------+-------------------+-----------------------------------------------+ | id | member_id | name | value | +----+-----------+-------------------+-----------------------------------------------+ | 30 | 5 | register_token | 510d2a4514778c3d12ce594fbb4a728cd | | 31 | 5 | openid | http://openid.example.com/ | | 39 | 5 | secret_question | 1 | | 40 | 5 | secret_answer | 123124 |
Environment (再現バージョン)¶
OpenPNE3.6.0
Way to repro (再現手順)¶
1. ログイン画面より未登録のOpenIDのURLを利用してログインを実行する
2. 手順に沿って新規登録をおこなう
3. member_config テーブルに登録された 2 の情報を確認する
4. 秘密の質問がハッシュ化されていない
これにより、 opAuthOpenIDPlugin で新規登録をおこなったメンバーが、秘密の質問の答えが一致しないためにopAuthMailAddressPluginのパスワード再発行をおこなえない状態がうまれます。
しかし opAuthOpenIDPlugin にはパスワード再発行機能がないのでそれほど重要な問題ではないかもしれません。
関連しているかもしれないチケット
#2595 OpenID で新規登録した場合、秘密の質問への答えが●で表示される
修正方針¶
opAuthOpenIDPluginでは「秘密の質問」の項目を不要とし,表示しないようにする.
実装¶
「秘密の質問」が表示されていた原因はopAuthMailAddressPluginがインストールされていた状態だったからであり,opAuthOpenIDPluginの意図する挙動ではなかったことがあげられる.
そのため,修正はopAuthOpenIDPluginのほうではなくopAuthMailAddressPlugin側で行い,問題の内容を「他の認証プラグインで「秘密の質問」の項目が表示されてしまう」として本チケットの対応を行った.
ファイル
Yuma Sakata さんがほぼ13年前に更新
OpenPNE3.4.17 opAuthOpenIDPlugin Version 1.1.1 でも再現しました。
担当者と話した結果、以下の理由により今回の修正では「秘密の質問への答え」を外します。
opAuthOpenIDPlugin にはパスワード再発行機能がないのでそれほど重要な問題ではないかもしれません。
また、今回の対応により #2595 はクローズします。
Minoru Takai さんがほぼ13年前に更新
- ステータス を New(新規) から Accepted(着手) に変更
- 担当者 を Minoru Takai にセット
調査¶
修正方針は「 OpenID での初回ログイン(登録)時には、そのフォームで秘密の質問と答えを出さないようにする」ということにすると note-2 のコメントがされたときに検討しました。
このチケットの問題は opAuthOpenIDPlugin にあると考えていました(コアではなく、ここだろうと思っていた)。そのため、OpenPNE-3.6.0 を用意し、 opAuthOpenIDPlugin に注目して調査していました。
余談ですが、 http://redmine.openpne.jp/issues/2607 この問題に引っかかって、OpenID での初回ログイン後の登録フォームに辿り着くことすら梃子摺ってしまいました。
早速、「秘密の質問」などの記述がある部分を探ったのですが、妙なことに opAuthMailAddressPlugin の中でしかその記述が見つかりませんでした。
つまり翻訳などが opAuthMailAddressPlugin に依存しているのではないかと思い、これを管理画面から無効にして、再度 OpenID で初回ログインし、登録フォームを表示させてみました(登録フォームで再読み込みしても同じですね)。
するとこのチケットで問題としている部分が諸々無くなりました。
つまり、この問題は opAuthMailAddressPlugin が有効か無効かによって、これに関係しない認証プラグインでの新規登録フォームで表示される入力項目が変わってしまう、コア側の問題と考えられるように思います。
そうでなければ opAuthOpenIDPlugin 側で opAuthMailAddressPlugin 内で用意されたものを使っているという問題ですが、 opAuthMailAddressPlugin を管理画面から無効にしただけで想定する結果となったことを鑑みると、コア側の問題ということになるでしょうか。
ここまでの事実は確認できましたが、具体的な修正箇所については今の時点で私は想像ができていません。
Minoru Takai さんがほぼ13年前に更新
- ファイル only_opAuthOpenIDPlugin.png only_opAuthOpenIDPlugin.png を追加
- ファイル with_opAuthMailAddressPlugin.png with_opAuthMailAddressPlugin.png を追加
note-3 で参考までに画像を添付するのを忘れていました。
- opAuthMailAddressPlugin を有効にしている場合
- opAuthMailAddressPlugin を無効にしている場合
Yuya Watanabe さんがほぼ13年前に更新
原因¶
member_config.ymlというファイル全部の中でisRegistがtrueとなるものがフォームとして表示される.
opAuthMailAddressPluginを無効にするとこの「秘密の質問」が消えるのは,その項目を含むmember_config.ymlファイルを持っているのがopAUthMailAddressPluginconfig/member_config.yml だから.
lib/form/opAuthRegisterForm.class.php内でMemberForm,MemberProfileForm,MemberConfigFormなどのフォームを表示することを決定する.
この中で「秘密の質問」の表示を行なっているのはlib/form/doctrine/MemberConfigForm.class.phpである.
($this->isNew && $value['isRegist'])がtrueとなるときMemberConfigWidgetとして追加される.
48 public function generateConfigWidgets() 49 { 50 foreach ($this->memberConfigSettings as $key => $value) { 51 if ($this->isNew && $value['IsRegist'] || !$this->isNew && $value['IsConfig']) { 52 $this->setMemberConfigWidget($key); 53 } 54 } 55 56 if ('mobile_frontend' === sfConfig::get('sf_app')) 57 { 58 $this->appendMobileInputMode(); 59 } 60 }
sfConfig::get('openpne_member_config')によって OpenPNE に存在する member_config.yml ファイルすべてを取得する.
93 public function setMemberConfigSettings() 94 { 95 $categories = sfConfig::get('openpne_member_category'); 96 $configs = sfConfig::get('openpne_member_config'); 97 //var_dump($configs); 98 99 if (!$this->category) { 100 $this->memberConfigSettings = $configs; 101 return true; 102 } 103 104 foreach ($categories[$this->category] as $value) 105 { 106 $this->memberConfigSettings[$value] = $configs[$value]; 107 } 108 }
member_config.ymlのリスト
./lib/config/config/member_config.yml ./plugins/opDiaryPlugin/config/member_config.yml ./plugins/opAuthMailAddressPlugin/config/member_config.yml ./plugins/opBlogPlugin/config/member_config.yml
IsRegistがtrueとなるmember_config.ymlの設定
./lib/config/config/member_config.yml
36 age_public_flag: 37 Name: "age_public_flag" 38 Caption: "Public Flag for Age" 39 FormType: "select" 40 ValueType: "integer" 41 IsRegist: true 42 IsConfig: true 43 IsRequired: true 44 IsUnique: false 45 IsConfirm: false 46 Default: 3 47 Choices: 48 4: "All Users on the Web" 49 1: "All Members" 50 2: "%my_friend%" 51 3: "Private"
87 password: 88 _attributes: 89 caption: "Password Configuration" 90 enable_pc: true 91 enable_mobile: true 92 password: 93 Name: "password" 94 Caption: "Password" 95 Info: "Password must be 6-12 characters." 96 FormType: "password" 97 ValueType: "password" 98 IsRegist: true 99 IsConfig: true 100 IsUnique: false 101 IsRequired: true 102 IsConfirm: true
./plugins/opAuthMailAddressPlugin/config/member_config.yml
secretQuestion: _attributes: caption: "Secret Question Configuration" enable_pc: true enable_mobile: true secret_question: Name: "secret_question" Caption: "Secret Question" FormType: "select" ValueType: "integer" IsRegist: true IsConfig: true IsUnique: false IsRequired: true IsConfirm: false Choices: 1 : "What is your father's / mother's former name?" 2 : "What is last 5 digits of your driving license number?" 3 : "What is your first crush's name?" 4 : "What is your finished elementary school?" 5 : "What is region name of your domicile of origin?" secret_answer: Name: "secret_answer" Caption: "Answer for Secret Question" FormType: "password" ValueType: "text" IsRegist: true IsConfig: true IsUnique: false IsRequired: true IsConfirm: false
Yuya Watanabe さんがほぼ13年前に更新
- プロジェクト を opAuthOpenIDPlugin から opAuthMailAddressPlugin に変更
- 対象バージョン を削除 (
1.3.1)
Yuya Watanabe さんがほぼ13年前に更新
note-5 の理由により「秘密の質問」の項目を表示しているのはopAuthMailAddressPluginをインストールしていることが原因のため,プロジェクトを移動させました.
Yuya Watanabe さんがほぼ13年前に更新
修正案¶
他のプラグインの新規登録時に「秘密の質問」が表示されないようにIsRegistをfalseにし,opAuthMailAddressPluginの新規登録時のみ表示されるように実装.
diff --git a/config/member_config.yml b/config/member_config.yml index af008ab..1debde9 100644 --- a/config/member_config.yml +++ b/config/member_config.yml @@ -8,7 +8,7 @@ secretQuestion: Caption: "Secret Question" FormType: "select" ValueType: "integer" - IsRegist: true + IsRegist: false IsConfig: true IsUnique: false IsRequired: true @@ -25,7 +25,7 @@ secretQuestion: Caption: "Answer for Secret Question" FormType: "password" ValueType: "text" - IsRegist: true + IsRegist: false IsConfig: true IsUnique: false IsRequired: true diff --git a/lib/form/opAuthRegisterFormMailAddress.class.php b/lib/form/opAuthRegisterFormMailAddress.class.php index 53241bd..1a1ddd5 100644 --- a/lib/form/opAuthRegisterFormMailAddress.class.php +++ b/lib/form/opAuthRegisterFormMailAddress.class.php @@ -20,6 +20,8 @@ class opAuthRegisterFormMailAddress extends opAuthRegisterForm public function configure() { parent::configure(); + $this->configForm->setMemberConfigWidget('secret_question'); + $this->configForm->setMemberConfigWidget('secret_answer'); // Hack for non-rendering secret answer $this->configForm->getWidget('secret_answer')->setOption('type', 'text');
Yuya Watanabe さんがほぼ13年前に更新
- ステータス を Accepted(着手) から Pending Review(レビュー待ち) に変更
- 進捗率 を 0 から 50 に変更
Kousuke Ebihara さんがほぼ13年前に更新
- ステータス を Pending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
- 進捗率 を 50 から 70 に変更
Yuma Sakata さんがほぼ13年前に更新
- ステータス を Pending Testing(テスト待ち) から Fixed(完了) に変更
- 進捗率 を 70 から 100 に変更
テストOKです。
Yuya Watanabe さんがほぼ13年前に更新
- 題名 を opAuthOpenIDPlugin をつかって新規登録をおこなうと秘密の質問がハッシュ化されずに登録される から 他の認証プラグインで「秘密の質問」の項目が表示されてしまう に変更
- 説明 を更新 (差分)