# frozen_string_literal: true module DiscourseAi module AiBot class ArtifactsController < ApplicationController requires_plugin DiscourseAi::PLUGIN_NAME before_action :require_site_settings! skip_before_action :preload_json, :check_xhr, only: %i[show] def show artifact = AiArtifact.find(params[:id]) post = Post.find_by(id: artifact.post_id) if artifact.metadata&.dig("public") # no guardian needed else raise Discourse::NotFound if !post&.topic&.private_message? raise Discourse::NotFound if !guardian.can_see?(post) end # Prepare the inner (untrusted) HTML document untrusted_html = <<~HTML #{ERB::Util.html_escape(artifact.name)} #{artifact.html} HTML # Prepare the outer (trusted) HTML document trusted_html = <<~HTML #{ERB::Util.html_escape(artifact.name)} HTML response.headers.delete("X-Frame-Options") response.headers["Content-Security-Policy"] = "script-src 'unsafe-inline';" response.headers["X-Robots-Tag"] = "noindex" # Render the content render html: trusted_html.html_safe, layout: false, content_type: "text/html" end private def require_site_settings! if !SiteSetting.discourse_ai_enabled || !SiteSetting.ai_artifact_security.in?(%w[lax strict]) raise Discourse::NotFound end end end end end