Fix specs.
[akkoma] / lib / pleroma / user.ex
index 81cec82656ddfe90d3ddd875ae4224ddb158ab6c..ddf66cee95ee4840d9823851921f362ed881e252 100644 (file)
@@ -80,9 +80,15 @@ defmodule Pleroma.User do
     |> validate_length(:name, max: 100)
     |> put_change(:local, false)
     if changes.valid? do
-      followers = User.ap_followers(%User{nickname: changes.changes[:nickname]})
-      changes
-      |> put_change(:follower_address, followers)
+      case changes.changes[:info]["source_data"] do
+        %{"followers" => followers} ->
+          changes
+          |> put_change(:follower_address, followers)
+        _ ->
+          followers = User.ap_followers(%User{nickname: changes.changes[:nickname]})
+          changes
+          |> put_change(:follower_address, followers)
+      end
     else
       changes
     end
@@ -376,4 +382,42 @@ defmodule Pleroma.User do
 
     :ok
   end
+
+  def get_or_fetch_by_ap_id(ap_id) do
+    if user = get_by_ap_id(ap_id) do
+      user
+    else
+      with {:ok, user} <- ActivityPub.make_user_from_ap_id(ap_id) do
+        user
+      end
+    end
+  end
+
+  # AP style
+  def public_key_from_info(%{"source_data" => %{"publicKey" => %{"publicKeyPem" => public_key_pem}}}) do
+     key = :public_key.pem_decode(public_key_pem)
+     |> hd()
+     |> :public_key.pem_entry_decode()
+
+     {:ok, key}
+  end
+
+  # OStatus Magic Key
+  def public_key_from_info(%{"magic_key" => magic_key}) do
+    {:ok, Pleroma.Web.Salmon.decode_key(magic_key)}
+  end
+
+  def get_public_key_for_ap_id(ap_id) do
+    with %User{} = user <- get_or_fetch_by_ap_id(ap_id),
+         {:ok, public_key} <- public_key_from_info(user.info) do
+      {:ok, public_key}
+    else
+      _ -> :error
+    end
+  end
+
+  def insert_or_update_user(data) do
+    cs = User.remote_user_creation(data)
+    Repo.insert(cs, on_conflict: :replace_all, conflict_target: :nickname)
+  end
 end