logo

pleroma

My custom branche(s) on git.pleroma.social/pleroma/pleroma
commit: 2ed17541b776a291cdef38acd5e072ed80acc1ff
parent: b259b4e4d1dc27528b99744fffabfb05c676ec3f
Author: lambda <pleromagit@rogerbraun.net>
Date:   Sat, 20 Jan 2018 15:02:04 +0000

Merge branch 'feature/remote-follow' into 'develop'

remote follow

See merge request pleroma/pleroma!51

Diffstat:

Mlib/pleroma/web/ostatus/ostatus.ex4++++
Mlib/pleroma/web/router.ex13+++++++++++++
Alib/pleroma/web/templates/twitter_api/util/follow.html.eex11+++++++++++
Alib/pleroma/web/templates/twitter_api/util/follow_login.html.eex14++++++++++++++
Alib/pleroma/web/templates/twitter_api/util/followed.html.eex6++++++
Mlib/pleroma/web/twitter_api/controllers/util_controller.ex48++++++++++++++++++++++++++++++++++++++++++++++++
Mlib/pleroma/web/web_finger/web_finger.ex3++-
7 files changed, 98 insertions(+), 1 deletion(-)

diff --git a/lib/pleroma/web/ostatus/ostatus.ex b/lib/pleroma/web/ostatus/ostatus.ex @@ -22,6 +22,10 @@ defmodule Pleroma.Web.OStatus do "#{user.ap_id}/salmon" end + def remote_follow_path do + "#{Web.base_url}/ostatus_subscribe?acct={uri}" + end + def handle_incoming(xml_string) do with doc when doc != :error <- parse_document(xml_string) do entries = :xmerl_xpath.string('//entry', doc) diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex @@ -28,6 +28,13 @@ defmodule Pleroma.Web.Router do 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 @@ -51,6 +58,12 @@ defmodule Pleroma.Web.Router do 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 diff --git a/lib/pleroma/web/templates/twitter_api/util/follow.html.eex b/lib/pleroma/web/templates/twitter_api/util/follow.html.eex @@ -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 %> diff --git a/lib/pleroma/web/templates/twitter_api/util/follow_login.html.eex b/lib/pleroma/web/templates/twitter_api/util/follow_login.html.eex @@ -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 %> diff --git a/lib/pleroma/web/templates/twitter_api/util/followed.html.eex b/lib/pleroma/web/templates/twitter_api/util/followed.html.eex @@ -0,0 +1,6 @@ +<%= if @error do %> +<p>Error following account</p> +<% else %> +<h2>Account followed!</h2> +<% end %> + diff --git a/lib/pleroma/web/twitter_api/controllers/util_controller.ex b/lib/pleroma/web/twitter_api/controllers/util_controller.ex @@ -2,6 +2,8 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do 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} @@ -30,6 +32,52 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do 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 diff --git a/lib/pleroma/web/web_finger/web_finger.ex b/lib/pleroma/web/web_finger/web_finger.ex @@ -44,7 +44,8 @@ defmodule Pleroma.Web.WebFinger do {:Link, %{rel: "http://schemas.google.com/g/2010#updates-from", type: "application/atom+xml", href: OStatus.feed_path(user)}}, {:Link, %{rel: "http://webfinger.net/rel/profile-page", type: "text/html", href: user.ap_id}}, {:Link, %{rel: "salmon", href: OStatus.salmon_path(user)}}, - {:Link, %{rel: "magic-public-key", href: "data:application/magic-public-key,#{magic_key}"}} + {:Link, %{rel: "magic-public-key", href: "data:application/magic-public-key,#{magic_key}"}}, + {:Link, %{rel: "http://ostatus.org/schema/1.0/subscribe", template: OStatus.remote_follow_path()}} ] } |> XmlBuilder.to_doc