plug Pleroma.Plugs.AuthenticationPlug, %{fetcher: &Router.user_fetcher/1, optional: true}
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
plug :accepts, ["xml", "xrd+xml"]
end
get "/emoji", UtilController, :emoji
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
pipe_through :authenticated_api
post "/follow_import", UtilController, :follow_import
--- /dev/null
+<%= 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 %>
use Pleroma.Web, :controller
require Logger
alias Pleroma.Web
+ alias Pleroma.Web.OStatus
+ alias Comeonin.Pbkdf2
alias Pleroma.Formatter
alias Pleroma.Web.ActivityPub.ActivityPub
alias Pleroma.{Repo, PasswordResetToken, User}
json(conn, "ok")
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)
def config(conn, _params) do
case get_format(conn) do