From 57088426f8427568fb64af79c9761eb1377dc918 Mon Sep 17 00:00:00 2001 From: Ro Date: Sun, 29 Sep 2024 19:53:00 -0500 Subject: [PATCH] feat: Export dbs --- .gitignore | 3 +++ README.md | 1 + fly.toml | 4 ++-- lib/activity_pub/headers.ex | 4 ++-- lib/postland_web/controllers/actor_controller.ex | 4 +++- .../controllers/export_controller.ex | 16 ++++++++++++++++ lib/postland_web/controllers/inbox_controller.ex | 9 ++++++--- .../controllers/outbox_controller.ex | 8 +++++--- .../controllers/webfinger_controller.ex | 4 +++- lib/postland_web/controllers/webfinger_json.ex | 5 +++++ lib/postland_web/live/profile_live.ex | 9 +++++++++ lib/postland_web/router.ex | 5 ++++- priv/tmp/.keep | 0 13 files changed, 59 insertions(+), 13 deletions(-) create mode 100644 lib/postland_web/controllers/export_controller.ex create mode 100644 lib/postland_web/live/profile_live.ex create mode 100644 priv/tmp/.keep diff --git a/.gitignore b/.gitignore index f70aa44..a3fa6d5 100644 --- a/.gitignore +++ b/.gitignore @@ -28,6 +28,9 @@ postland-*.tar # Ignore assets that are produced by build tools. /priv/static/assets/ +# Ignore temporary files +/priv/tmp/ + # Ignore digested assets cache. /priv/static/cache_manifest.json diff --git a/README.md b/README.md index c11688d..aca7ae7 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,7 @@ - Posting - Deleting posts +- Approving / declining follows and authorized instance list - Following - Unfollowing - Liking diff --git a/fly.toml b/fly.toml index 78693f1..e0ca97f 100644 --- a/fly.toml +++ b/fly.toml @@ -21,9 +21,9 @@ kill_signal = 'SIGTERM' [http_service] internal_port = 8080 force_https = true - auto_stop_machines = 'stop' + auto_stop_machines = false auto_start_machines = true - min_machines_running = 0 + min_machines_running = 1 processes = ['app'] [http_service.concurrency] diff --git a/lib/activity_pub/headers.ex b/lib/activity_pub/headers.ex index 24025a9..04fed7e 100644 --- a/lib/activity_pub/headers.ex +++ b/lib/activity_pub/headers.ex @@ -80,7 +80,7 @@ defmodule ActivityPub.Headers do defp find_value(headers, key) do Enum.find_value(headers, fn {key_candidate, value} -> - String.downcase(key_candidate) == key && value + String.downcase(key_candidate) == String.downcase(key) && value end) end @@ -94,7 +94,7 @@ defmodule ActivityPub.Headers do key_map = result.body["publicKey"] if key_map["id"] == key_id do - [public_key | _] = + public_key = :public_key.pem_decode(key_map["publicKeyPem"]) |> hd() |> :public_key.pem_entry_decode() diff --git a/lib/postland_web/controllers/actor_controller.ex b/lib/postland_web/controllers/actor_controller.ex index 1404f7f..b7c4ac2 100644 --- a/lib/postland_web/controllers/actor_controller.ex +++ b/lib/postland_web/controllers/actor_controller.ex @@ -2,6 +2,8 @@ defmodule PostlandWeb.ActorController do use PostlandWeb, :controller def get(conn, _params) do - render(conn, :actor, %{}) + conn + |> put_resp_content_type("application/activity+json") + |> render(:actor, %{}) end end diff --git a/lib/postland_web/controllers/export_controller.ex b/lib/postland_web/controllers/export_controller.ex new file mode 100644 index 0000000..1ab1acb --- /dev/null +++ b/lib/postland_web/controllers/export_controller.ex @@ -0,0 +1,16 @@ +defmodule PostlandWeb.ExportController do + use PostlandWeb, :controller + + def export(conn, _params) do + db_path = Postland.Repo.config() |> Keyword.get(:database) + dirname = Path.dirname(db_path) + filename = Path.basename(db_path) + + files = [filename, "#{filename}-shm", "#{filename}-wal"] |> Enum.map(&String.to_charlist/1) + zip_path = Path.join([File.cwd!(), "priv", "tmp", "db-export.zip"]) + + :zip.create(zip_path, files, cwd: dirname) + + send_download(conn, {:file, zip_path}, filename: "db-export.zip") + end +end diff --git a/lib/postland_web/controllers/inbox_controller.ex b/lib/postland_web/controllers/inbox_controller.ex index f43525a..729be7d 100644 --- a/lib/postland_web/controllers/inbox_controller.ex +++ b/lib/postland_web/controllers/inbox_controller.ex @@ -10,13 +10,16 @@ defmodule PostlandWeb.InboxController do if Headers.verify(conn.method, conn.request_path, conn.req_headers) do case Activities.record_activity(params) do {:ok, _activity} -> - render(conn, :ok) + send_resp(conn, 200, "ok") + error -> Logger.error(error) - render(conn, :unprocessable_entity) + send_resp(conn, 422, "unprocessable_entity") end else - render(conn, :forbidden) + Logger.info("Failed to verify type=#{Map.get(params, "type")}") + + send_resp(conn, 403, "forbidden") end end end diff --git a/lib/postland_web/controllers/outbox_controller.ex b/lib/postland_web/controllers/outbox_controller.ex index f8690a9..0800f9b 100644 --- a/lib/postland_web/controllers/outbox_controller.ex +++ b/lib/postland_web/controllers/outbox_controller.ex @@ -1,7 +1,9 @@ defmodule PostlandWeb.OutboxController do - use PostlandWeb, :controller + use PostlandWeb, :controller - alias ActivityPub.Headers + require Logger + + alias ActivityPub.Headers def get(conn, _params) do json = %{ @@ -15,7 +17,7 @@ defmodule PostlandWeb.OutboxController do if Headers.verify(conn.method, conn.request_path, conn.req_headers) do render(conn, json) else - render(conn, :forbidden) + send_resp(conn, 403, "forbidden") end end end diff --git a/lib/postland_web/controllers/webfinger_controller.ex b/lib/postland_web/controllers/webfinger_controller.ex index 2434192..cfd6c71 100644 --- a/lib/postland_web/controllers/webfinger_controller.ex +++ b/lib/postland_web/controllers/webfinger_controller.ex @@ -2,6 +2,8 @@ defmodule PostlandWeb.WebfingerController do use PostlandWeb, :controller def get(conn, _params) do - render(conn, :webfinger, %{}) + conn + |> put_resp_content_type("application/activity+json") + |> render(:webfinger, %{}) end end diff --git a/lib/postland_web/controllers/webfinger_json.ex b/lib/postland_web/controllers/webfinger_json.ex index f6e7c6e..a6c53a6 100644 --- a/lib/postland_web/controllers/webfinger_json.ex +++ b/lib/postland_web/controllers/webfinger_json.ex @@ -14,6 +14,11 @@ defmodule PostlandWeb.WebfingerJSON do "rel" => "self", "type" => "application/activity+json", "href" => url(~p"/actor") + }, + %{ + "rel" => "http://webfinger.net/rel/profile-page", + "type" =>"text/html", + "href" => url(~p"/about") } ] } diff --git a/lib/postland_web/live/profile_live.ex b/lib/postland_web/live/profile_live.ex new file mode 100644 index 0000000..c89b83e --- /dev/null +++ b/lib/postland_web/live/profile_live.ex @@ -0,0 +1,9 @@ +defmodule PostlandWeb.ProfileLive do + use PostlandWeb, :live_view + + def render(assigns) do + ~H""" +
Nothing here yet.
+ """ + end +end diff --git a/lib/postland_web/router.ex b/lib/postland_web/router.ex index 60a9c50..4829799 100644 --- a/lib/postland_web/router.ex +++ b/lib/postland_web/router.ex @@ -27,7 +27,7 @@ defmodule PostlandWeb.Router do get "/.well-known/webfinger", WebfingerController, :get get "/actor", ActorController, :get - get "/inbox", InboxController, :post + post "/inbox", InboxController, :post get "/outbox", OutboxController, :get end @@ -35,6 +35,7 @@ defmodule PostlandWeb.Router do pipe_through [:browser, :redirect_if_not_set_up] get "/", PageController, :home + live "/about", ProfileLive, :show end # Other scopes may use custom stacks. @@ -74,6 +75,8 @@ defmodule PostlandWeb.Router do scope "/", PostlandWeb do pipe_through [:browser, :require_authenticated_user] + get "/system/export", ExportController, :export + live_session :require_authenticated_user, on_mount: [{PostlandWeb.UserAuth, :ensure_authenticated}] do live "/users/settings", UserSettingsLive, :edit diff --git a/priv/tmp/.keep b/priv/tmp/.keep new file mode 100644 index 0000000..e69de29