From 67d012de706e13176a8e867efdd617cb2fa6fe90 Mon Sep 17 00:00:00 2001 From: Stuart Dum Date: Tue, 28 Mar 2023 18:45:46 -0400 Subject: [PATCH 1/2] Move existing plugs to plugs dir --- lib/file_finder_web.ex | 4 ++-- lib/file_finder_web/{api/auth.ex => plugs/api.ex} | 10 +++++----- .../{events/auth.ex => plugs/events.ex} | 8 ++++---- lib/file_finder_web/router.ex | 4 ++-- 4 files changed, 13 insertions(+), 13 deletions(-) rename lib/file_finder_web/{api/auth.ex => plugs/api.ex} (83%) rename lib/file_finder_web/{events/auth.ex => plugs/events.ex} (88%) diff --git a/lib/file_finder_web.ex b/lib/file_finder_web.ex index 452abd1..12ebcb3 100644 --- a/lib/file_finder_web.ex +++ b/lib/file_finder_web.ex @@ -74,8 +74,8 @@ defmodule FileFinderWeb do import Plug.Conn import Phoenix.Controller import Phoenix.LiveView.Router - import FileFinderWeb.Api.Auth, only: [authenticate_shop: 2] - import FileFinderWeb.Events.Auth, only: [authenticate_event: 2] + import FileFinderWeb.Plugs.Api, only: [authenticate_shop: 2] + import FileFinderWeb.Plugs.Events, only: [authenticate_event: 2] end end diff --git a/lib/file_finder_web/api/auth.ex b/lib/file_finder_web/plugs/api.ex similarity index 83% rename from lib/file_finder_web/api/auth.ex rename to lib/file_finder_web/plugs/api.ex index 35f1b41..af9d3c7 100644 --- a/lib/file_finder_web/api/auth.ex +++ b/lib/file_finder_web/plugs/api.ex @@ -1,4 +1,4 @@ -defmodule FileFinderWeb.Api.Auth do +defmodule FileFinderWeb.Plugs.Api do @moduledoc """ A module plug that verifies the bearer token in the request headers. The authorization header value may look like `Bearer xxxxxxx`. @@ -48,16 +48,16 @@ defmodule FileFinderWeb.Api.Auth do ## Examples - iex> FileFinderWeb.Api.Auth.verify_token("good-token", conn) + iex> FileFinderWeb.Plugs.Api.verify_token("good-token", conn) {:ok, 1} - iex> FileFinderWeb.Api.Auth.verify_token("bad-token", conn) + iex> FileFinderWeb.Plugs.Api.verify_token("bad-token", conn) {:error, :invalid} - iex> FileFinderWeb.Api.Auth.verify_token("old-token", conn) + iex> FileFinderWeb.Plugs.Api.verify_token("old-token", conn) {:error, :expired} - iex> FileFinderWeb.Api.Auth.verify_token(nil, conn) + iex> FileFinderWeb.Plugs.Api.verify_token(nil, conn) {:error, :missing} """ diff --git a/lib/file_finder_web/events/auth.ex b/lib/file_finder_web/plugs/events.ex similarity index 88% rename from lib/file_finder_web/events/auth.ex rename to lib/file_finder_web/plugs/events.ex index 7fd6bce..bc555c4 100644 --- a/lib/file_finder_web/events/auth.ex +++ b/lib/file_finder_web/plugs/events.ex @@ -1,4 +1,4 @@ -defmodule FileFinderWeb.Events.Auth do +defmodule FileFinderWeb.Plugs.Events do @moduledoc """ A module plug that verifies webhook event signatures. """ @@ -47,13 +47,13 @@ defmodule FileFinderWeb.Events.Auth do ## Examples - iex> FileFinderWeb.Events.Auth.verify_signature("good-signature", conn) + iex> FileFinderWeb.Plugs.Events.verify_signature("good-signature", conn) {:ok} - iex> FileFinderWeb.Events.Auth.verify_signature("bad-signature", conn) + iex> FileFinderWeb.Plugs.Events.verify_signature("bad-signature", conn) {:error, :invalid} - iex> FileFinderWeb.Events.Auth.verify_signature(nil, conn) + iex> FileFinderWeb.Plugs.Events.verify_signature(nil, conn) {:error, :missing_signature} """ diff --git a/lib/file_finder_web/router.ex b/lib/file_finder_web/router.ex index 6f68ac9..7016dd0 100644 --- a/lib/file_finder_web/router.ex +++ b/lib/file_finder_web/router.ex @@ -9,7 +9,7 @@ defmodule FileFinderWeb.Router do pipeline :api do plug :accepts, ["json"] - plug FileFinderWeb.Api.Auth + plug FileFinderWeb.Plugs.Api end pipeline :browser do @@ -23,7 +23,7 @@ defmodule FileFinderWeb.Router do pipeline :events do plug :accepts, ["json"] plug :put_secure_browser_headers - plug FileFinderWeb.Events.Auth + plug FileFinderWeb.Plugs.Events end scope "/", FileFinderWeb do From af31e011f1b76ef0a50a71eecab7adb4b443585c Mon Sep 17 00:00:00 2001 From: Stuart Dum Date: Wed, 29 Mar 2023 21:42:44 -0400 Subject: [PATCH 2/2] Add mixpanel proxy --- .../controllers/mixpanel_controller.ex | 37 +++++++++++++++++++ lib/file_finder_web/mixpanel_router.ex | 15 ++++++++ lib/file_finder_web/plugs/mixpanel.ex | 24 ++++++++++++ lib/file_finder_web/views/mixpanel_view.ex | 11 ++++++ 4 files changed, 87 insertions(+) create mode 100644 lib/file_finder_web/controllers/mixpanel_controller.ex create mode 100644 lib/file_finder_web/mixpanel_router.ex create mode 100644 lib/file_finder_web/plugs/mixpanel.ex create mode 100644 lib/file_finder_web/views/mixpanel_view.ex diff --git a/lib/file_finder_web/controllers/mixpanel_controller.ex b/lib/file_finder_web/controllers/mixpanel_controller.ex new file mode 100644 index 0000000..a787221 --- /dev/null +++ b/lib/file_finder_web/controllers/mixpanel_controller.ex @@ -0,0 +1,37 @@ +defmodule FileFinderWeb.MixpanelController do + use FileFinderWeb, :controller + + def lib_js(conn, _params) do + js = HTTPoison.get("https://cdn.mxpnl.com/libs/mixpanel-2-latest.js") + render("mixpanel.js", js: js) + end + + def lib_min_js(conn, _params) do + js = HTTPoison.get("https://cdn.mxpnl.com/libs/mixpanel-2-latest.min.js") + render("mixpanel.js", js: js) + end + + def request(conn, _params) do + url = + if conn.path_info |> List.first() == "decide" do + "https://decide.mixpanel.com" + else + "https://api.mixpanel.com" + end + + ip = + cond do + get_req_header(conn, "x-forwarded-for") |> length() > 0 -> + get_resp_header(conn, "x-forwarded-for") |> List.first() + + get_req_header(conn, "x-real-ip") |> length() > 0 -> + get_req_header(conn, "x-real-ip") |> List.first() + + true -> + # TODO: format + conn.remote_ip + end + + render("mixpanel.json", json: %{debug: "TODO"}) + end +end diff --git a/lib/file_finder_web/mixpanel_router.ex b/lib/file_finder_web/mixpanel_router.ex new file mode 100644 index 0000000..a1d3241 --- /dev/null +++ b/lib/file_finder_web/mixpanel_router.ex @@ -0,0 +1,15 @@ +defmodule FileFinderWeb.MixpanelRouter do + use FileFinderWeb, :router + + pipeline :proxy do + plug :accepts, ["js", "json"] + end + + scope "/", FileFinderWeb do + pipe_through :proxy + + get "/lib.js", MixpanelController, :lib_js + get "/lib.min.js", MixpanelController, :lib_min_js + get "/*path", MixpanelController, :api_request + end +end diff --git a/lib/file_finder_web/plugs/mixpanel.ex b/lib/file_finder_web/plugs/mixpanel.ex new file mode 100644 index 0000000..41b3bc4 --- /dev/null +++ b/lib/file_finder_web/plugs/mixpanel.ex @@ -0,0 +1,24 @@ +defmodule FileFinderWeb.Plugs.Mixpanel do + import Plug.Conn + + @doc false + def init(default), do: default + + @doc false + def call(conn, router) do + case get_subdomain(conn.host) do + subdomain when subdomain == "mixpanel" -> + conn + |> router.call(router.init({})) + |> halt() + + _ -> + conn + end + end + + defp get_subdomain(host) do + root_host = Subdomainer.Endpoint.config(:url)[:host] + String.replace(host, ~r/.?#{root_host}/, "") + end +end diff --git a/lib/file_finder_web/views/mixpanel_view.ex b/lib/file_finder_web/views/mixpanel_view.ex new file mode 100644 index 0000000..f5aa465 --- /dev/null +++ b/lib/file_finder_web/views/mixpanel_view.ex @@ -0,0 +1,11 @@ +defmodule FileFinderWeb.MixpanelView do + use FileFinderWeb, :view + + def render("mixpanel.js", %{js: js}) do + js + end + + def render("mixpanel.json", %{json: json}) do + json + end +end