From 92a7c505e3dcb0e0f2321671a26a00a266b8e592 Mon Sep 17 00:00:00 2001 From: Andrew Dryga Date: Wed, 26 Apr 2023 12:13:00 -0600 Subject: [PATCH] Bring back browser/config.xml --- apps/web/lib/web.ex | 15 ++++++++++++++- .../lib/web/controllers/browser_controller.ex | 7 +++++++ apps/web/lib/web/controllers/browser_xml.ex | 5 +++++ .../controllers/browser_xml/config.xml.eex | 9 +++++++++ apps/web/lib/web/controllers/error_xml.ex | 19 +++++++++++++++++++ .../controllers/browser_controller_test.exs | 15 +++++++++++++++ config/config.exs | 10 +++++++++- 7 files changed, 78 insertions(+), 2 deletions(-) create mode 100644 apps/web/lib/web/controllers/browser_controller.ex create mode 100644 apps/web/lib/web/controllers/browser_xml.ex create mode 100644 apps/web/lib/web/controllers/browser_xml/config.xml.eex create mode 100644 apps/web/lib/web/controllers/error_xml.ex create mode 100644 apps/web/test/web/controllers/browser_controller_test.exs diff --git a/apps/web/lib/web.ex b/apps/web/lib/web.ex index 8fe7d0e98..bb9b9c843 100644 --- a/apps/web/lib/web.ex +++ b/apps/web/lib/web.ex @@ -39,7 +39,7 @@ defmodule Web do def controller do quote do use Phoenix.Controller, - formats: [:html, :json], + formats: [:html, :json, :xml], layouts: [html: Web.Layouts] import Plug.Conn @@ -67,6 +67,19 @@ defmodule Web do end end + def xml do + quote do + import Phoenix.Template, only: [embed_templates: 1] + + # Import convenience functions from controllers + import Phoenix.Controller, + only: [get_csrf_token: 0, view_module: 1, view_template: 1] + + # Include general helpers for rendering HTML + unquote(html_helpers()) + end + end + def html do quote do use Phoenix.Component diff --git a/apps/web/lib/web/controllers/browser_controller.ex b/apps/web/lib/web/controllers/browser_controller.ex new file mode 100644 index 000000000..94c8b3f4a --- /dev/null +++ b/apps/web/lib/web/controllers/browser_controller.ex @@ -0,0 +1,7 @@ +defmodule Web.BrowserController do + use Web, :controller + + def config(conn, _params) do + render(conn, "config.xml", layout: false) + end +end diff --git a/apps/web/lib/web/controllers/browser_xml.ex b/apps/web/lib/web/controllers/browser_xml.ex new file mode 100644 index 000000000..e9436b63f --- /dev/null +++ b/apps/web/lib/web/controllers/browser_xml.ex @@ -0,0 +1,5 @@ +defmodule Web.BrowserXML do + use Web, :xml + + embed_templates "browser_xml/*" +end diff --git a/apps/web/lib/web/controllers/browser_xml/config.xml.eex b/apps/web/lib/web/controllers/browser_xml/config.xml.eex new file mode 100644 index 000000000..e1ff44ecb --- /dev/null +++ b/apps/web/lib/web/controllers/browser_xml/config.xml.eex @@ -0,0 +1,9 @@ + + + + + " /> + 331700 + + + diff --git a/apps/web/lib/web/controllers/error_xml.ex b/apps/web/lib/web/controllers/error_xml.ex new file mode 100644 index 000000000..d9dd42570 --- /dev/null +++ b/apps/web/lib/web/controllers/error_xml.ex @@ -0,0 +1,19 @@ +defmodule Web.ErrorXML do + use Web, :xml + + # If you want to customize your error pages, + # uncomment the embed_templates/1 call below + # and add pages to the error directory: + # + # * lib/web_web/controllers/error_xml/404.xml.heex + # * lib/web_web/controllers/error_xml/500.xml.heex + # + # embed_templates "error_xml/*" + + # The default is to render a plain text page based on + # the template name. For example, "404.xml" becomes + # "Not Found". + def render(template, _assigns) do + Phoenix.Controller.status_message_from_template(template) + end +end diff --git a/apps/web/test/web/controllers/browser_controller_test.exs b/apps/web/test/web/controllers/browser_controller_test.exs new file mode 100644 index 000000000..047e78be0 --- /dev/null +++ b/apps/web/test/web/controllers/browser_controller_test.exs @@ -0,0 +1,15 @@ +defmodule Web.BrowserControllerTest do + use Web.ConnCase, async: true + + describe "config/2" do + test "returns valid XML browser config", %{conn: conn} do + test_conn = + conn + # |> put_req_header("accept", "application/xml") + |> get(~p"/browser/config.xml") + + assert response(test_conn, 200) =~ " ["xml"] +} + config :web, Web.SAML, entity_id: "urn:firezone.dev:firezone-app", certfile_path: Path.expand("../apps/web/priv/cert/saml_selfsigned.pem", __DIR__),