From 101b1476eaa1226acebdec5c29afd8a6b9306ea2 Mon Sep 17 00:00:00 2001 From: Ryan Ahearn Date: Tue, 25 Jun 2024 17:37:41 -0400 Subject: [PATCH 1/3] Add Document model --- Gemfile | 1 + Gemfile.lock | 3 +++ app/models/document.rb | 3 +++ db/migrate/20240625213001_create_documents.rb | 10 ++++++++++ db/schema.rb | 9 ++++++++- doc/compliance/rendered/apps/data.logical.pdf | Bin 0 -> 25880 bytes spec/models/document_spec.rb | 8 ++++++++ spec/rails_helper.rb | 2 +- spec/support/shoulda.rb | 6 ++++++ 9 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 app/models/document.rb create mode 100644 db/migrate/20240625213001_create_documents.rb create mode 100644 doc/compliance/rendered/apps/data.logical.pdf create mode 100644 spec/models/document_spec.rb create mode 100644 spec/support/shoulda.rb diff --git a/Gemfile b/Gemfile index 2b3084f..e35f09b 100644 --- a/Gemfile +++ b/Gemfile @@ -70,4 +70,5 @@ gem "sidekiq", "~> 7.2" group :test do gem "climate_control", "~> 1.0" + gem "shoulda-matchers", "~> 6.2" end diff --git a/Gemfile.lock b/Gemfile.lock index 2bc7399..15da52c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -281,6 +281,8 @@ GEM rexml ruby-progressbar (1.13.0) secure_headers (6.5.0) + shoulda-matchers (6.2.0) + activesupport (>= 5.2.0) sidekiq (7.2.4) concurrent-ruby (< 2) connection_pool (>= 2.3.0) @@ -351,6 +353,7 @@ DEPENDENCIES rails_template_18f! rspec-rails (~> 6.1) secure_headers (~> 6.3) + shoulda-matchers (~> 6.2) sidekiq (~> 7.2) sprockets-rails standard (~> 1.36) diff --git a/app/models/document.rb b/app/models/document.rb new file mode 100644 index 0000000..e1c8385 --- /dev/null +++ b/app/models/document.rb @@ -0,0 +1,3 @@ +class Document < ApplicationRecord + validates_presence_of :title, :url +end diff --git a/db/migrate/20240625213001_create_documents.rb b/db/migrate/20240625213001_create_documents.rb new file mode 100644 index 0000000..126f8c8 --- /dev/null +++ b/db/migrate/20240625213001_create_documents.rb @@ -0,0 +1,10 @@ +class CreateDocuments < ActiveRecord::Migration[7.1] + def change + create_table :documents do |t| + t.string :title, null: false + t.string :url, null: false + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index f913998..ec97031 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,8 +10,15 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.1].define(version: 0) do +ActiveRecord::Schema[7.1].define(version: 2024_06_25_213001) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" + create_table "documents", force: :cascade do |t| + t.string "title", null: false + t.string "url", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + end diff --git a/doc/compliance/rendered/apps/data.logical.pdf b/doc/compliance/rendered/apps/data.logical.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3640877ab56cd573721c5d70abfdce5bb5503dc2 GIT binary patch literal 25880 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

(ZH$LH|6X#`L$nZH25GM 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 Date: Tue, 25 Jun 2024 18:10:22 -0400 Subject: [PATCH 2/3] Display documents on home page --- app/assets/stylesheets/uswds-components.scss | 1 + app/controllers/pages_controller.rb | 1 + app/models/document.rb | 11 +++++ app/views/pages/home.html.erb | 22 +++++++++- config/brakeman.ignore | 40 ++++++++++++++++++ db/migrate/20240625213001_create_documents.rb | 1 + db/schema.rb | 1 + db/seeds.rb | 2 + doc/compliance/rendered/apps/data.logical.pdf | Bin 25880 -> 26244 bytes spec/models/document_spec.rb | 2 + spec/views/pages/home.html.erb_spec.rb | 2 + 11 files changed, 81 insertions(+), 2 deletions(-) create mode 100644 config/brakeman.ignore diff --git a/app/assets/stylesheets/uswds-components.scss b/app/assets/stylesheets/uswds-components.scss index 814d66a..7b6bd21 100644 --- a/app/assets/stylesheets/uswds-components.scss +++ b/app/assets/stylesheets/uswds-components.scss @@ -7,6 +7,7 @@ @forward "usa-section"; @forward "usa-language-selector"; // add additional packages here as you use them +@forward "usa-table"; // or replace these all with // @forward "uswds"; diff --git a/app/controllers/pages_controller.rb b/app/controllers/pages_controller.rb index 45f463e..7ddfee6 100644 --- a/app/controllers/pages_controller.rb +++ b/app/controllers/pages_controller.rb @@ -1,4 +1,5 @@ class PagesController < ApplicationController def home + @documents = Document.all end end diff --git a/app/models/document.rb b/app/models/document.rb index e1c8385..399e858 100644 --- a/app/models/document.rb +++ b/app/models/document.rb @@ -1,3 +1,14 @@ class Document < ApplicationRecord validates_presence_of :title, :url + + validate :url_is_https + + private + + def url_is_https + parsed = URI(url) + errors.add(:url, "must begin with https") unless parsed.scheme == "https" + rescue ArgumentError + errors.add(:url, "must begin with https") + end end diff --git a/app/views/pages/home.html.erb b/app/views/pages/home.html.erb index 3453cf2..0f4198d 100644 --- a/app/views/pages/home.html.erb +++ b/app/views/pages/home.html.erb @@ -1,2 +1,20 @@ -

Pages#home

-

Find me in app/views/pages/home.html.erb

+

Published Compliance Documents

+ + + + + + + + + + <% @documents.each do |d| %> + + + + + <% end %> + +
+ Component Definitions +
Document titleDescription
<%= link_to d.title, d.url, class: "usa-link usa-link--external", rel: "noreferrer", target: "_blank" %><%= d.description %>
diff --git a/config/brakeman.ignore b/config/brakeman.ignore new file mode 100644 index 0000000..3d66779 --- /dev/null +++ b/config/brakeman.ignore @@ -0,0 +1,40 @@ +{ + "ignored_warnings": [ + { + "warning_type": "Cross-Site Scripting", + "warning_code": 4, + "fingerprint": "d0e9d6fdde0767b697aa5a6acefada357aadb15e48d55ce07a17ed87db41e8a6", + "check_name": "LinkToHref", + "message": "Potentially unsafe model attribute in `link_to` href", + "file": "app/views/pages/home.html.erb", + "line": 15, + "link": "https://brakemanscanner.org/docs/warning_types/link_to_href", + "code": "link_to(Document.new.title, Document.new.url, :class => \"usa-link usa-link--external\", :rel => \"noreferrer\", :target => \"_blank\")", + "render_path": [ + { + "type": "controller", + "class": "PagesController", + "method": "home", + "line": 4, + "file": "app/controllers/pages_controller.rb", + "rendered": { + "name": "pages/home", + "file": "app/views/pages/home.html.erb" + } + } + ], + "location": { + "type": "template", + "template": "pages/home" + }, + "user_input": "Document.new.url", + "confidence": "Weak", + "cwe_id": [ + 79 + ], + "note": "Document#url is validated to only begin with https" + } + ], + "updated": "2024-06-25 17:59:19 -0400", + "brakeman_version": "6.1.2" +} diff --git a/db/migrate/20240625213001_create_documents.rb b/db/migrate/20240625213001_create_documents.rb index 126f8c8..73151c9 100644 --- a/db/migrate/20240625213001_create_documents.rb +++ b/db/migrate/20240625213001_create_documents.rb @@ -2,6 +2,7 @@ class CreateDocuments < ActiveRecord::Migration[7.1] def change create_table :documents do |t| t.string :title, null: false + t.text :description, null: false, default: "" t.string :url, null: false t.timestamps diff --git a/db/schema.rb b/db/schema.rb index ec97031..974639e 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -16,6 +16,7 @@ create_table "documents", force: :cascade do |t| t.string "title", null: false + t.text "description", default: "", null: false t.string "url", null: false t.datetime "created_at", null: false t.datetime "updated_at", null: false diff --git a/db/seeds.rb b/db/seeds.rb index 4fbd6ed..58d01ce 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -7,3 +7,5 @@ # ["Action", "Comedy", "Drama", "Horror"].each do |genre_name| # MovieGenre.find_or_create_by!(name: genre_name) # end + +Document.find_or_create_by(title: "Cloud.gov LATO CRM", description: "OSCAL 1.1.2 Component Definition defining the CRM for a cloud.gov-hosted system persuing a GSA LATO", url: "https://raw.githubusercontent.com/GSA-TTS/docker-trestle/main/templates/component-definitions/cloud_gov/component-definition.json") diff --git a/doc/compliance/rendered/apps/data.logical.pdf b/doc/compliance/rendered/apps/data.logical.pdf index 3640877ab56cd573721c5d70abfdce5bb5503dc2..abd63cea0bcb08e1e5cbd80b440132b1bef9182c 100644 GIT binary patch delta 8390 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 delta 8051 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 Bh#UX_ diff --git a/spec/models/document_spec.rb b/spec/models/document_spec.rb index d2d3100..6ce45ca 100644 --- a/spec/models/document_spec.rb +++ b/spec/models/document_spec.rb @@ -4,5 +4,7 @@ describe "validations" do it { should validate_presence_of :title } it { should validate_presence_of :url } + it { should allow_value("https://raw.githubusercontent.com/GSA-TTS/docker-trestle/main/templates/component-definitions/cloud_gov/component-definition.json").for :url } + it { should_not allow_value("javascript:alert('oops')").for :url } end end diff --git a/spec/views/pages/home.html.erb_spec.rb b/spec/views/pages/home.html.erb_spec.rb index 6ce2e2a..a66279d 100644 --- a/spec/views/pages/home.html.erb_spec.rb +++ b/spec/views/pages/home.html.erb_spec.rb @@ -1,6 +1,8 @@ require "rails_helper" RSpec.describe "pages/home.html.erb", type: :view do + before { assign(:documents, Document.all) } + it "displays the gov banner" do render template: "pages/home", layout: "layouts/application" expect(rendered).to match "An official website of the United States government" From c24497af44b52083a1798af551654b998927d44c Mon Sep 17 00:00:00 2001 From: Ryan Ahearn Date: Tue, 25 Jun 2024 18:15:58 -0400 Subject: [PATCH 3/3] Seed data before ci runs of pa11y or owasp --- .github/actions/run-server/action.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/actions/run-server/action.yml b/.github/actions/run-server/action.yml index 0672abd..6b17c95 100644 --- a/.github/actions/run-server/action.yml +++ b/.github/actions/run-server/action.yml @@ -11,6 +11,14 @@ inputs: runs: using: "composite" steps: + - name: Seed data + shell: bash + env: + RAILS_ENV: ${{ inputs.rails_env }} + DATABASE_URL: ${{ inputs.database_url }} + SECRET_KEY_BASE: not-actually-secret + run: bundle exec rails db:seed + - name: "Start server in background" shell: bash env: