# frozen_string_literal: true class CspReportsController < ApplicationController skip_before_action :check_xhr, :preload_json, :verify_authenticity_token, only: [:create] def create raise Discourse::NotFound unless report_collection_enabled? report = parse_report if report.blank? render_json_error("empty CSP report", status: 422) else Logster.add_to_env(request.env, "CSP Report", report) Rails.logger.warn("CSP Violation: '#{report["blocked-uri"]}' \n\n#{report["script-sample"]}") head :ok end rescue JSON::ParserError render_json_error("invalid CSP report", status: 422) end private def parse_report obj = JSON.parse(request.body.read) if Hash === obj obj = obj["csp-report"] if Hash === obj obj.slice( "blocked-uri", "disposition", "document-uri", "effective-directive", "original-policy", "referrer", "script-sample", "status-code", "violated-directive", "line-number", "source-file", ) end end end def report_collection_enabled? SiteSetting.content_security_policy_collect_reports end end