forked from AkkomaGang/akkoma
Add remote follow pages.
This commit is contained in:
parent
bc689740f0
commit
47e8c8db05
5 changed files with 92 additions and 0 deletions
|
@ -28,6 +28,13 @@ def user_fetcher(username) do
|
||||||
plug Pleroma.Plugs.AuthenticationPlug, %{fetcher: &Router.user_fetcher/1, optional: true}
|
plug Pleroma.Plugs.AuthenticationPlug, %{fetcher: &Router.user_fetcher/1, optional: true}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
pipeline :pleroma_html do
|
||||||
|
plug :accepts, ["html"]
|
||||||
|
plug :fetch_session
|
||||||
|
plug Pleroma.Plugs.OAuthPlug
|
||||||
|
plug Pleroma.Plugs.AuthenticationPlug, %{fetcher: &Router.user_fetcher/1, optional: true}
|
||||||
|
end
|
||||||
|
|
||||||
pipeline :well_known do
|
pipeline :well_known do
|
||||||
plug :accepts, ["xml", "xrd+xml"]
|
plug :accepts, ["xml", "xrd+xml"]
|
||||||
end
|
end
|
||||||
|
@ -51,6 +58,12 @@ def user_fetcher(username) do
|
||||||
get "/emoji", UtilController, :emoji
|
get "/emoji", UtilController, :emoji
|
||||||
end
|
end
|
||||||
|
|
||||||
|
scope "/", Pleroma.Web.TwitterAPI do
|
||||||
|
pipe_through :pleroma_html
|
||||||
|
get "/ostatus_subscribe", UtilController, :remote_follow
|
||||||
|
post "/ostatus_subscribe", UtilController, :do_remote_follow
|
||||||
|
end
|
||||||
|
|
||||||
scope "/api/pleroma", Pleroma.Web.TwitterAPI do
|
scope "/api/pleroma", Pleroma.Web.TwitterAPI do
|
||||||
pipe_through :authenticated_api
|
pipe_through :authenticated_api
|
||||||
post "/follow_import", UtilController, :follow_import
|
post "/follow_import", UtilController, :follow_import
|
||||||
|
|
11
lib/pleroma/web/templates/twitter_api/util/follow.html.eex
Normal file
11
lib/pleroma/web/templates/twitter_api/util/follow.html.eex
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
<%= if @error == :error do %>
|
||||||
|
<h2>Error fetching user</h2>
|
||||||
|
<% else %>
|
||||||
|
<h2>Remote follow</h2>
|
||||||
|
<img width="128" height="128" src="<%= @avatar %>">
|
||||||
|
<p><%= @name %></p>
|
||||||
|
<%= form_for @conn, util_path(@conn, :do_remote_follow), [as: "user"], fn f -> %>
|
||||||
|
<%= hidden_input f, :id, value: @id %>
|
||||||
|
<%= submit "Authorize" %>
|
||||||
|
<% end %>
|
||||||
|
<% end %>
|
|
@ -0,0 +1,14 @@
|
||||||
|
<%= if @error do %>
|
||||||
|
<h2><%= @error %></h2>
|
||||||
|
<% end %>
|
||||||
|
<h2>Log in to follow</h2>
|
||||||
|
<p><%= @name %></p>
|
||||||
|
<img height="128" width="128" src="<%= @avatar %>">
|
||||||
|
<%= form_for @conn, util_path(@conn, :do_remote_follow), [as: "authorization"], fn f -> %>
|
||||||
|
<%= text_input f, :name, placeholder: "Username" %>
|
||||||
|
<br>
|
||||||
|
<%= password_input f, :password, placeholder: "Password" %>
|
||||||
|
<br>
|
||||||
|
<%= hidden_input f, :id, value: @id %>
|
||||||
|
<%= submit "Authorize" %>
|
||||||
|
<% end %>
|
|
@ -0,0 +1,6 @@
|
||||||
|
<%= if @error do %>
|
||||||
|
<p>Error following account</p>
|
||||||
|
<% else %>
|
||||||
|
<h2>Account followed!</h2>
|
||||||
|
<% end %>
|
||||||
|
|
|
@ -2,6 +2,8 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do
|
||||||
use Pleroma.Web, :controller
|
use Pleroma.Web, :controller
|
||||||
require Logger
|
require Logger
|
||||||
alias Pleroma.Web
|
alias Pleroma.Web
|
||||||
|
alias Pleroma.Web.OStatus
|
||||||
|
alias Comeonin.Pbkdf2
|
||||||
alias Pleroma.Formatter
|
alias Pleroma.Formatter
|
||||||
alias Pleroma.Web.ActivityPub.ActivityPub
|
alias Pleroma.Web.ActivityPub.ActivityPub
|
||||||
alias Pleroma.{Repo, PasswordResetToken, User}
|
alias Pleroma.{Repo, PasswordResetToken, User}
|
||||||
|
@ -30,6 +32,52 @@ def help_test(conn, _params) do
|
||||||
json(conn, "ok")
|
json(conn, "ok")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def remote_follow(%{assigns: %{user: user}} = conn, %{"acct" => acct}) do
|
||||||
|
{err, followee} = OStatus.find_or_make_user(acct)
|
||||||
|
avatar = User.avatar_url(followee)
|
||||||
|
name = followee.nickname
|
||||||
|
id = followee.id
|
||||||
|
|
||||||
|
if !!user do
|
||||||
|
conn
|
||||||
|
|> render("follow.html", %{error: err, acct: acct, avatar: avatar, name: name, id: id})
|
||||||
|
else
|
||||||
|
conn
|
||||||
|
|> render("follow_login.html", %{error: false, acct: acct, avatar: avatar, name: name, id: id})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def do_remote_follow(conn, %{"authorization" => %{"name" => username, "password" => password, "id" => id}}) do
|
||||||
|
followee = Repo.get(User, id)
|
||||||
|
avatar = User.avatar_url(followee)
|
||||||
|
name = followee.nickname
|
||||||
|
with %User{} = user <- User.get_cached_by_nickname(username),
|
||||||
|
true <- Pbkdf2.checkpw(password, user.password_hash),
|
||||||
|
%User{} = followed <- Repo.get(User, id),
|
||||||
|
{:ok, follower} <- User.follow(user, followee),
|
||||||
|
{:ok, _activity} <- ActivityPub.follow(follower, followee) do
|
||||||
|
conn
|
||||||
|
|> render("followed.html", %{error: false})
|
||||||
|
else
|
||||||
|
_e ->
|
||||||
|
conn
|
||||||
|
|> render("follow_login.html", %{error: "Wrong username or password", id: id, name: name, avatar: avatar})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
def do_remote_follow(%{assigns: %{user: user}} = conn, %{"user" => %{"id" => id}}) do
|
||||||
|
with %User{} = followee <- Repo.get(User, id),
|
||||||
|
{:ok, follower} <- User.follow(user, followee),
|
||||||
|
{:ok, _activity} <- ActivityPub.follow(follower, followee) do
|
||||||
|
conn
|
||||||
|
|> render("followed.html", %{error: false})
|
||||||
|
else
|
||||||
|
e ->
|
||||||
|
Logger.debug("Remote follow failed with error #{inspect e}")
|
||||||
|
conn
|
||||||
|
|> render("followed.html", %{error: inspect(e)})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
@instance Application.get_env(:pleroma, :instance)
|
@instance Application.get_env(:pleroma, :instance)
|
||||||
def config(conn, _params) do
|
def config(conn, _params) do
|
||||||
case get_format(conn) do
|
case get_format(conn) do
|
||||||
|
|
Loading…
Reference in a new issue