From 2cd65e91f6fd36dfd056d2bc27aba77fb23a1529 Mon Sep 17 00:00:00 2001 From: Camden Moors Date: Wed, 24 Jun 2020 12:33:23 -0400 Subject: [PATCH 01/13] Add challenge end time to db --- db/migrate/20200624162213_add_challenge_end_time.rb | 5 +++++ db/schema.rb | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20200624162213_add_challenge_end_time.rb diff --git a/db/migrate/20200624162213_add_challenge_end_time.rb b/db/migrate/20200624162213_add_challenge_end_time.rb new file mode 100644 index 00000000..213b747d --- /dev/null +++ b/db/migrate/20200624162213_add_challenge_end_time.rb @@ -0,0 +1,5 @@ +class AddChallengeEndTime < ActiveRecord::Migration[6.0] + def change + add_column :games, :datetime, :datetime + end +end diff --git a/db/schema.rb b/db/schema.rb index ee61e45f..13a62e68 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2020_04_16_180339) do +ActiveRecord::Schema.define(version: 2020_06_24_162213) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -121,6 +121,7 @@ t.text "prizes_text" t.text "terms_and_conditions" t.integer "board_layout", default: 0, null: false + t.datetime "datetime" end create_table "messages", id: :serial, force: :cascade do |t| From a3bcc9ceb84472bd8ea8f01589c9ab46b26eced5 Mon Sep 17 00:00:00 2001 From: Camden Moors Date: Wed, 24 Jun 2020 13:50:05 -0400 Subject: [PATCH 02/13] Fix DB schema --- db/migrate/20200624162213_add_challenge_end_time.rb | 2 +- db/schema.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/db/migrate/20200624162213_add_challenge_end_time.rb b/db/migrate/20200624162213_add_challenge_end_time.rb index 213b747d..5841f30c 100644 --- a/db/migrate/20200624162213_add_challenge_end_time.rb +++ b/db/migrate/20200624162213_add_challenge_end_time.rb @@ -1,5 +1,5 @@ class AddChallengeEndTime < ActiveRecord::Migration[6.0] def change - add_column :games, :datetime, :datetime + add_column :challenges, :challenge_end, :datetime end end diff --git a/db/schema.rb b/db/schema.rb index 13a62e68..3db27d6b 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -48,6 +48,7 @@ t.integer "solved_decrement_period", default: 1 t.boolean "design_phase", default: false t.bigint "game_id" + t.datetime "challenge_end" t.index ["game_id"], name: "index_challenges_on_game_id" end @@ -121,7 +122,6 @@ t.text "prizes_text" t.text "terms_and_conditions" t.integer "board_layout", default: 0, null: false - t.datetime "datetime" end create_table "messages", id: :serial, force: :cascade do |t| From ce7ce118649f37939ac4279471dc9f49f51d9f00 Mon Sep 17 00:00:00 2001 From: Camden Moors Date: Wed, 24 Jun 2020 13:50:47 -0400 Subject: [PATCH 03/13] Add a check if the challenge is closed --- app/models/challenge.rb | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/app/models/challenge.rb b/app/models/challenge.rb index b164e31f..1baf2e93 100644 --- a/app/models/challenge.rb +++ b/app/models/challenge.rb @@ -34,8 +34,16 @@ def challenge_open? state.eql? 'open' end + def before_close? + unless challenge_end.nil? + time = Time.now.utc + return time < challenge_end + end + true + end + def open? - challenge_open? && game.open? + challenge_open? && before_close? && game.open? end def display_point_value(_ = nil) From 3f0ea6bbc77202200e080a73ee586afc6264cbba Mon Sep 17 00:00:00 2001 From: Camden Moors Date: Wed, 24 Jun 2020 13:51:26 -0400 Subject: [PATCH 04/13] Ensure that the game actually closes when its past the stop date --- test/models/challenge_test.rb | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/test/models/challenge_test.rb b/test/models/challenge_test.rb index 5f8a5408..e83ff646 100644 --- a/test/models/challenge_test.rb +++ b/test/models/challenge_test.rb @@ -11,4 +11,11 @@ class ChallengeTest < ActiveSupport::TestCase assert_equal chal2, chal1.next_challenge assert_nil chal3.next_challenge end + + test 'game is closed when its passed closing time' do + game = create(:active_game) + challenge = create(:standard_challenge, challenge_end: Time.current - 1.days) + + assert_not challenge.before_close? + end end From 97354f1f79bcbf563144d421cb30b68810652954 Mon Sep 17 00:00:00 2001 From: Camden Moors Date: Wed, 24 Jun 2020 14:17:42 -0400 Subject: [PATCH 05/13] Use shorter syntax for checking if it's passed the challenge end --- app/models/challenge.rb | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/app/models/challenge.rb b/app/models/challenge.rb index 1baf2e93..1a426ecd 100644 --- a/app/models/challenge.rb +++ b/app/models/challenge.rb @@ -35,10 +35,7 @@ def challenge_open? end def before_close? - unless challenge_end.nil? - time = Time.now.utc - return time < challenge_end - end + return Time.now.utc < challenge_end unless challenge_end.nil? true end From b9d9435912e4ce8f7ab6f38d79f809d9693a2241 Mon Sep 17 00:00:00 2001 From: Camden Moors Date: Wed, 24 Jun 2020 14:23:20 -0400 Subject: [PATCH 06/13] Empty line after return statement --- app/models/challenge.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/models/challenge.rb b/app/models/challenge.rb index 1a426ecd..d7d53b29 100644 --- a/app/models/challenge.rb +++ b/app/models/challenge.rb @@ -36,6 +36,7 @@ def challenge_open? def before_close? return Time.now.utc < challenge_end unless challenge_end.nil? + true end From c8d19b282d37c9941fb0b9cb03b212fd85b15718 Mon Sep 17 00:00:00 2001 From: Camden Moors Date: Wed, 24 Jun 2020 15:23:25 -0400 Subject: [PATCH 07/13] Typo in test name --- test/models/challenge_test.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/models/challenge_test.rb b/test/models/challenge_test.rb index e83ff646..3cf71a6b 100644 --- a/test/models/challenge_test.rb +++ b/test/models/challenge_test.rb @@ -12,7 +12,7 @@ class ChallengeTest < ActiveSupport::TestCase assert_nil chal3.next_challenge end - test 'game is closed when its passed closing time' do + test 'challenge is closed when its passed closing time' do game = create(:active_game) challenge = create(:standard_challenge, challenge_end: Time.current - 1.days) From 4034c6a8ac40a831e103974ece0385be1b0d6192 Mon Sep 17 00:00:00 2001 From: Camden Moors Date: Wed, 24 Jun 2020 15:29:04 -0400 Subject: [PATCH 08/13] Remove trailing whitespace --- app/models/challenge.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/challenge.rb b/app/models/challenge.rb index d7d53b29..9023ee97 100644 --- a/app/models/challenge.rb +++ b/app/models/challenge.rb @@ -36,7 +36,7 @@ def challenge_open? def before_close? return Time.now.utc < challenge_end unless challenge_end.nil? - + true end From 1c655154d0f1ad9527ea221f561daa37541045c4 Mon Sep 17 00:00:00 2001 From: Camden Moors Date: Fri, 26 Jun 2020 10:36:44 -0400 Subject: [PATCH 09/13] Remove challenge_end and add open/close_challenge_at --- app/models/challenge.rb | 10 ++++++++-- ...01_add_open_challenge_at_and_close_challenge_at.rb | 6 ++++++ db/migrate/20200626140517_remove_challenge_end.rb | 5 +++++ db/schema.rb | 11 ++++++----- 4 files changed, 25 insertions(+), 7 deletions(-) create mode 100644 db/migrate/20200626135801_add_open_challenge_at_and_close_challenge_at.rb create mode 100644 db/migrate/20200626140517_remove_challenge_end.rb diff --git a/app/models/challenge.rb b/app/models/challenge.rb index 9023ee97..2a869d66 100644 --- a/app/models/challenge.rb +++ b/app/models/challenge.rb @@ -35,13 +35,19 @@ def challenge_open? end def before_close? - return Time.now.utc < challenge_end unless challenge_end.nil? + return Time.now.utc < close_challenge_at unless close_challenge_at.nil? + + true + end + + def after_open? + return Time.now.utc > open_challenge_at unless open_challenge_at.nil? true end def open? - challenge_open? && before_close? && game.open? + challenge_open? && before_close? && after_open? && game.open? end def display_point_value(_ = nil) diff --git a/db/migrate/20200626135801_add_open_challenge_at_and_close_challenge_at.rb b/db/migrate/20200626135801_add_open_challenge_at_and_close_challenge_at.rb new file mode 100644 index 00000000..f8ba5054 --- /dev/null +++ b/db/migrate/20200626135801_add_open_challenge_at_and_close_challenge_at.rb @@ -0,0 +1,6 @@ +class AddOpenChallengeAtAndCloseChallengeAt < ActiveRecord::Migration[6.0] + def change + add_column :challenges, :open_challenge_at, :datetime + add_column :challenges, :close_challenge_at, :datetime + end +end diff --git a/db/migrate/20200626140517_remove_challenge_end.rb b/db/migrate/20200626140517_remove_challenge_end.rb new file mode 100644 index 00000000..b372bf6c --- /dev/null +++ b/db/migrate/20200626140517_remove_challenge_end.rb @@ -0,0 +1,5 @@ +class RemoveChallengeEnd < ActiveRecord::Migration[6.0] + def change + remove_column :challenges, :challenge_end + end +end diff --git a/db/schema.rb b/db/schema.rb index 16fd377f..7410ecd4 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2020_06_24_162213) do +ActiveRecord::Schema.define(version: 2020_06_26_140517) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -48,11 +48,12 @@ t.integer "solved_decrement_period", default: 1 t.boolean "design_phase", default: false t.bigint "game_id" - t.datetime "challenge_end" t.boolean "sponsored", default: false, null: false - t.text "sponsor", default: '' - t.text "sponsor_logo", default: '', null: false - t.text "sponsor_description", default: '', null: false + t.text "sponsor", default: "" + t.text "sponsor_logo", default: "", null: false + t.text "sponsor_description", default: "", null: false + t.datetime "open_challenge_at" + t.datetime "close_challenge_at" t.index ["game_id"], name: "index_challenges_on_game_id" end From ca8515508484dedb67415cc59894640cd4a94cad Mon Sep 17 00:00:00 2001 From: Camden Moors Date: Mon, 29 Jun 2020 09:57:37 -0400 Subject: [PATCH 10/13] Rename challenge_end to close_challenge_at --- test/models/challenge_test.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/models/challenge_test.rb b/test/models/challenge_test.rb index 3cf71a6b..77729943 100644 --- a/test/models/challenge_test.rb +++ b/test/models/challenge_test.rb @@ -14,7 +14,7 @@ class ChallengeTest < ActiveSupport::TestCase test 'challenge is closed when its passed closing time' do game = create(:active_game) - challenge = create(:standard_challenge, challenge_end: Time.current - 1.days) + challenge = create(:standard_challenge, close_challenge_at: Time.current - 1.days) assert_not challenge.before_close? end From 7983ec950c832efcb7b870cd2f2232251974bd6a Mon Sep 17 00:00:00 2001 From: Camden Moors Date: Mon, 29 Jun 2020 12:47:38 -0400 Subject: [PATCH 11/13] Remove two unneeded migrations --- db/migrate/20200624162213_add_challenge_end_time.rb | 5 ----- db/migrate/20200626140517_remove_challenge_end.rb | 5 ----- 2 files changed, 10 deletions(-) delete mode 100644 db/migrate/20200624162213_add_challenge_end_time.rb delete mode 100644 db/migrate/20200626140517_remove_challenge_end.rb diff --git a/db/migrate/20200624162213_add_challenge_end_time.rb b/db/migrate/20200624162213_add_challenge_end_time.rb deleted file mode 100644 index 5841f30c..00000000 --- a/db/migrate/20200624162213_add_challenge_end_time.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddChallengeEndTime < ActiveRecord::Migration[6.0] - def change - add_column :challenges, :challenge_end, :datetime - end -end diff --git a/db/migrate/20200626140517_remove_challenge_end.rb b/db/migrate/20200626140517_remove_challenge_end.rb deleted file mode 100644 index b372bf6c..00000000 --- a/db/migrate/20200626140517_remove_challenge_end.rb +++ /dev/null @@ -1,5 +0,0 @@ -class RemoveChallengeEnd < ActiveRecord::Migration[6.0] - def change - remove_column :challenges, :challenge_end - end -end From 47da91a9a4eb9a69e0aa05c24fec887dcafb8c7b Mon Sep 17 00:00:00 2001 From: Camden Moors Date: Mon, 29 Jun 2020 12:49:08 -0400 Subject: [PATCH 12/13] More testing for challenge opening --- db/schema.rb | 2 +- test/models/challenge_test.rb | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/db/schema.rb b/db/schema.rb index 7410ecd4..f4cf7757 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2020_06_26_140517) do +ActiveRecord::Schema.define(version: 2020_06_26_135801) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" diff --git a/test/models/challenge_test.rb b/test/models/challenge_test.rb index 77729943..70bf5273 100644 --- a/test/models/challenge_test.rb +++ b/test/models/challenge_test.rb @@ -12,10 +12,11 @@ class ChallengeTest < ActiveSupport::TestCase assert_nil chal3.next_challenge end - test 'challenge is closed when its passed closing time' do + test 'challenge is closed when its passed closing time or before opening time' do game = create(:active_game) - challenge = create(:standard_challenge, close_challenge_at: Time.current - 1.days) + challenge = create(:standard_challenge, close_challenge_at: Time.current - 1.days, open_challenge_at: Time.current + 1.days) assert_not challenge.before_close? + assert_not challenge.after_open? end end From 625281db684f0e2d242c217278572aa8253263e9 Mon Sep 17 00:00:00 2001 From: Camden Moors Date: Tue, 30 Jun 2020 10:05:54 -0400 Subject: [PATCH 13/13] Put stop_calculation_at in defense/share challenges --- app/lib/flag_challenge_share_module.rb | 6 +++--- app/models/defense_flag.rb | 6 +++++- app/models/share_challenge.rb | 6 +++++- test/models/pentest_flag_test.rb | 1 + 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/app/lib/flag_challenge_share_module.rb b/app/lib/flag_challenge_share_module.rb index ddc760e9..47535ca1 100644 --- a/app/lib/flag_challenge_share_module.rb +++ b/app/lib/flag_challenge_share_module.rb @@ -24,7 +24,7 @@ def solved?(times = 1) end def first_solve_time - first_solve&.created_at || Game.instance.defense_end + first_solve&.created_at || challenge&.close_challenge_at || Game.instance.defense_end end # Calculates how many points each team should get for solving a specific teams flag @@ -82,11 +82,11 @@ def convert_shares_to_points_for(num_shares, total_shares, challenge_point_value private def calc_points_for_first_solve - first_capture_point_bonus + calc_point_value(start_calculation_at, Game.instance.defense_end) + first_capture_point_bonus + calc_point_value(start_calculation_at, stop_calculation_at) end def calc_points_for_solve - potential_shares = calc_shares(first_solve_time, Game.instance.defense_end) + potential_shares = calc_shares(first_solve_time, stop_calculation_at) convert_shares_to_points_for( potential_shares, calc_offensive_shares_for_solved_challenges.values.sum + potential_shares, diff --git a/app/models/defense_flag.rb b/app/models/defense_flag.rb index 69891135..9f08913b 100644 --- a/app/models/defense_flag.rb +++ b/app/models/defense_flag.rb @@ -36,7 +36,11 @@ def challenge_open? end def start_calculation_at - super || Game.instance.start + super || challenge&.open_challenge_at || Game.instance.start + end + + def stop_calculation_at + challenge&.close_challenge_at || Game.instance.stop end def open? diff --git a/app/models/share_challenge.rb b/app/models/share_challenge.rb index f3f9e7c7..1aab0c40 100644 --- a/app/models/share_challenge.rb +++ b/app/models/share_challenge.rb @@ -7,7 +7,11 @@ class ShareChallenge < StandardChallenge validates :unsolved_increment_period, numericality: { greater_than: 0 } def start_calculation_at - game&.start + open_challenge_at || game&.start + end + + def stop_calculation_at + close_challenge_at || game&.stop end # Share Challenges do not have a concept of teams, however the FlagChallengeShareModule diff --git a/test/models/pentest_flag_test.rb b/test/models/pentest_flag_test.rb index ae0630b7..a82f2e12 100644 --- a/test/models/pentest_flag_test.rb +++ b/test/models/pentest_flag_test.rb @@ -29,6 +29,7 @@ def setup unsolve_team = create(:team) solved_challenge = create(:pentest_solved_challenge, team: solve_team, challenge: @challenge) point_value = solved_challenge.flag.display_point_value(unsolve_team) + puts solved_challenge.flag.display_point_value(solve_team) assert_equal 50, point_value end