fjordllc / bootcamp

プログラマー向けEラーニングシステム
https://bootcamp.fjord.jp
MIT License
281 stars 71 forks source link

プラクティスを終了していないのに、学習ステータスの変更で他の人の回答が見れてしまう。 #7959

Open reckyy opened 2 months ago

reckyy commented 2 months ago

概要

表題の通りです。 学習ステータスを「修了」にしたあと、提出物ページに行き他の人の提出物をクリックすると、普通に見れてしまいます。 (提出物ページでは、閲覧ユーザーが下部に表示されるので履歴に残るかつFBCには答えを見ようとする方はいないとは思うので、すぐすぐ問題というわけではないとは思いますが)

再現手順

  1. 終了していないプラクティスのページにアクセス。(この時、提出物を出しているか否かは問題ではありません。)
  2. ステータスを「修了」に変更。
  3. 提出物タブをクリックし、他の人の提出物をクリック。アクセスできてしまう。

期待される振る舞い

提出物が確認済みになっていない時は、修了に変更できない。

スクリーンショット

スクリーンショット_2024-07-15_15_54_09

スクリーンショット_2024-07-15_15_54_14

スクリーンショット_2024-07-15_15_54_21

reckyy commented 1 month ago

@komagata お疲れ様です。 こちら修正にあたり、確認したい事項が2つございますので、お手隙の際にご確認よろしくお願いいたします。

まず前提から述べます。

原因

提出物がチェックされていないにも関わらず、学習ステータスのクリックだけでlearning-statusが変更できてしまっているのが原因。

対処

質問

  1. 前者の実装方法

提出物のshowアクションの前に、見れるかどうかのbefore_actionが実行されています。 https://github.com/fjordllc/bootcamp/blob/a3eb41bbc8032572c3dd08bd8bb658f75aceac86/app/controllers/products_controller.rb#L101-L105

このポリシーのshow?の下二つの条件について質問なのですが、 https://github.com/fjordllc/bootcamp/blob/a3eb41bbc8032572c3dd08bd8bb658f75aceac86/app/policies/product_policy.rb#L3-L20 https://github.com/fjordllc/bootcamp/blob/a3eb41bbc8032572c3dd08bd8bb658f75aceac86/app/models/practice.rb#L85-L91 https://github.com/fjordllc/bootcamp/blob/a3eb41bbc8032572c3dd08bd8bb658f75aceac86/app/models/product.rb#L109-L111

学習ステータスを変更できることにより、product.practice.completed?(user)がtrueになってしまい回答が見れてしまっています。 「提出物はチェック済みだけど、プラクティスは修了になっていない」というシチュエーションはちょっと思い当たらないのでこの条件を削除したいのですが、問題ないでしょうか。

  1. 後者の実装の必要有無 今回1を実装すれば、一応他の人の提出物は見れなくなります。 ただ、「そもそも提出物がチェックされていないのにステータスを修了にできるのはおかしいということで、こちらの修正も同時に行うべきでしょうか。 1の実装で、このバグは修正できるので念の為お伺いしました。
komagata commented 1 month ago

@reckyy

1 「提出物はチェック済みだけど、プラクティスは修了になっていない」というシチュエーションはちょっと思い当たらないのでこの条件を削除したいのですが、問題ないでしょうか。

提出物をチェックして、すぐチェックを外したら上記の状態になるように思いました。

2 「そもそも提出物がチェックされていないのにステータスを修了にできるのはおかしいということで、こちらの修正も同時に行うべきでしょうか。

上記を修正したいです〜。

reckyy commented 1 month ago

@komagata 承知しました! 1に関しては据え置きで、2のみを修正するようにします〜。