feat: Export dbs

This commit is contained in:
Ro 2024-09-29 19:53:00 -05:00
parent 2959a86f8f
commit 57088426f8
13 changed files with 59 additions and 13 deletions

3
.gitignore vendored
View file

@ -28,6 +28,9 @@ postland-*.tar
# Ignore assets that are produced by build tools. # Ignore assets that are produced by build tools.
/priv/static/assets/ /priv/static/assets/
# Ignore temporary files
/priv/tmp/
# Ignore digested assets cache. # Ignore digested assets cache.
/priv/static/cache_manifest.json /priv/static/cache_manifest.json

View file

@ -2,6 +2,7 @@
- Posting - Posting
- Deleting posts - Deleting posts
- Approving / declining follows and authorized instance list
- Following - Following
- Unfollowing - Unfollowing
- Liking - Liking

View file

@ -21,9 +21,9 @@ kill_signal = 'SIGTERM'
[http_service] [http_service]
internal_port = 8080 internal_port = 8080
force_https = true force_https = true
auto_stop_machines = 'stop' auto_stop_machines = false
auto_start_machines = true auto_start_machines = true
min_machines_running = 0 min_machines_running = 1
processes = ['app'] processes = ['app']
[http_service.concurrency] [http_service.concurrency]

View file

@ -80,7 +80,7 @@ defmodule ActivityPub.Headers do
defp find_value(headers, key) do defp find_value(headers, key) do
Enum.find_value(headers, fn {key_candidate, value} -> Enum.find_value(headers, fn {key_candidate, value} ->
String.downcase(key_candidate) == key && value String.downcase(key_candidate) == String.downcase(key) && value
end) end)
end end
@ -94,7 +94,7 @@ defmodule ActivityPub.Headers do
key_map = result.body["publicKey"] key_map = result.body["publicKey"]
if key_map["id"] == key_id do if key_map["id"] == key_id do
[public_key | _] = public_key =
:public_key.pem_decode(key_map["publicKeyPem"]) :public_key.pem_decode(key_map["publicKeyPem"])
|> hd() |> hd()
|> :public_key.pem_entry_decode() |> :public_key.pem_entry_decode()

View file

@ -2,6 +2,8 @@ defmodule PostlandWeb.ActorController do
use PostlandWeb, :controller use PostlandWeb, :controller
def get(conn, _params) do def get(conn, _params) do
render(conn, :actor, %{}) conn
|> put_resp_content_type("application/activity+json")
|> render(:actor, %{})
end end
end end

View file

@ -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

View file

@ -10,13 +10,16 @@ defmodule PostlandWeb.InboxController do
if Headers.verify(conn.method, conn.request_path, conn.req_headers) do if Headers.verify(conn.method, conn.request_path, conn.req_headers) do
case Activities.record_activity(params) do case Activities.record_activity(params) do
{:ok, _activity} -> {:ok, _activity} ->
render(conn, :ok) send_resp(conn, 200, "ok")
error -> error ->
Logger.error(error) Logger.error(error)
render(conn, :unprocessable_entity) send_resp(conn, 422, "unprocessable_entity")
end end
else else
render(conn, :forbidden) Logger.info("Failed to verify type=#{Map.get(params, "type")}")
send_resp(conn, 403, "forbidden")
end end
end end
end end

View file

@ -1,7 +1,9 @@
defmodule PostlandWeb.OutboxController do defmodule PostlandWeb.OutboxController do
use PostlandWeb, :controller use PostlandWeb, :controller
alias ActivityPub.Headers require Logger
alias ActivityPub.Headers
def get(conn, _params) do def get(conn, _params) do
json = %{ json = %{
@ -15,7 +17,7 @@ defmodule PostlandWeb.OutboxController do
if Headers.verify(conn.method, conn.request_path, conn.req_headers) do if Headers.verify(conn.method, conn.request_path, conn.req_headers) do
render(conn, json) render(conn, json)
else else
render(conn, :forbidden) send_resp(conn, 403, "forbidden")
end end
end end
end end

View file

@ -2,6 +2,8 @@ defmodule PostlandWeb.WebfingerController do
use PostlandWeb, :controller use PostlandWeb, :controller
def get(conn, _params) do def get(conn, _params) do
render(conn, :webfinger, %{}) conn
|> put_resp_content_type("application/activity+json")
|> render(:webfinger, %{})
end end
end end

View file

@ -14,6 +14,11 @@ defmodule PostlandWeb.WebfingerJSON do
"rel" => "self", "rel" => "self",
"type" => "application/activity+json", "type" => "application/activity+json",
"href" => url(~p"/actor") "href" => url(~p"/actor")
},
%{
"rel" => "http://webfinger.net/rel/profile-page",
"type" =>"text/html",
"href" => url(~p"/about")
} }
] ]
} }

View file

@ -0,0 +1,9 @@
defmodule PostlandWeb.ProfileLive do
use PostlandWeb, :live_view
def render(assigns) do
~H"""
<div>Nothing here yet.</div>
"""
end
end

View file

@ -27,7 +27,7 @@ defmodule PostlandWeb.Router do
get "/.well-known/webfinger", WebfingerController, :get get "/.well-known/webfinger", WebfingerController, :get
get "/actor", ActorController, :get get "/actor", ActorController, :get
get "/inbox", InboxController, :post post "/inbox", InboxController, :post
get "/outbox", OutboxController, :get get "/outbox", OutboxController, :get
end end
@ -35,6 +35,7 @@ defmodule PostlandWeb.Router do
pipe_through [:browser, :redirect_if_not_set_up] pipe_through [:browser, :redirect_if_not_set_up]
get "/", PageController, :home get "/", PageController, :home
live "/about", ProfileLive, :show
end end
# Other scopes may use custom stacks. # Other scopes may use custom stacks.
@ -74,6 +75,8 @@ defmodule PostlandWeb.Router do
scope "/", PostlandWeb do scope "/", PostlandWeb do
pipe_through [:browser, :require_authenticated_user] pipe_through [:browser, :require_authenticated_user]
get "/system/export", ExportController, :export
live_session :require_authenticated_user, live_session :require_authenticated_user,
on_mount: [{PostlandWeb.UserAuth, :ensure_authenticated}] do on_mount: [{PostlandWeb.UserAuth, :ensure_authenticated}] do
live "/users/settings", UserSettingsLive, :edit live "/users/settings", UserSettingsLive, :edit

0
priv/tmp/.keep Normal file
View file