summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/pleroma/formatter.ex7
-rw-r--r--lib/pleroma/user.ex5
-rw-r--r--lib/pleroma/web/common_api/utils.ex1
-rw-r--r--lib/pleroma/web/oauth/authorization.ex10
-rw-r--r--lib/pleroma/web/oauth/token.ex10
-rw-r--r--lib/pleroma/web/twitter_api/controllers/util_controller.ex2
-rw-r--r--test/fixtures/httpoison_mock/https___osada.macgirvin.com_channel_mike.json54
-rw-r--r--test/fixtures/httpoison_mock/mike@osada.macgirvin.com.json53
-rw-r--r--test/formatter_test.exs19
-rw-r--r--test/support/httpoison_mock.ex21
-rw-r--r--test/web/oauth/authorization_test.exs22
-rw-r--r--test/web/oauth/token_test.exs32
12 files changed, 232 insertions, 4 deletions
diff --git a/lib/pleroma/formatter.ex b/lib/pleroma/formatter.ex
index d7de5b483..1756cc187 100644
--- a/lib/pleroma/formatter.ex
+++ b/lib/pleroma/formatter.ex
@@ -227,7 +227,12 @@ defmodule Pleroma.Formatter do
subs =
subs ++
Enum.map(mentions, fn {match, %User{ap_id: ap_id, info: info}, uuid} ->
- ap_id = info["source_data"]["url"] || ap_id
+ ap_id =
+ if is_binary(info["source_data"]["url"]) do
+ info["source_data"]["url"]
+ else
+ ap_id
+ end
short_match = String.split(match, "@") |> tl() |> hd()
diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex
index db6f96daa..e97224731 100644
--- a/lib/pleroma/user.ex
+++ b/lib/pleroma/user.ex
@@ -4,7 +4,7 @@ defmodule Pleroma.User do
import Ecto.{Changeset, Query}
alias Pleroma.{Repo, User, Object, Web, Activity, Notification}
alias Comeonin.Pbkdf2
- alias Pleroma.Web.{OStatus, Websub}
+ alias Pleroma.Web.{OStatus, Websub, OAuth}
alias Pleroma.Web.ActivityPub.{Utils, ActivityPub}
schema "users" do
@@ -132,6 +132,9 @@ defmodule Pleroma.User do
|> validate_required([:password, :password_confirmation])
|> validate_confirmation(:password)
+ OAuth.Token.delete_user_tokens(struct)
+ OAuth.Authorization.delete_user_authorizations(struct)
+
if changeset.valid? do
hashed = Pbkdf2.hashpwsalt(changeset.changes[:password])
diff --git a/lib/pleroma/web/common_api/utils.ex b/lib/pleroma/web/common_api/utils.ex
index 667027c02..4cbbd0c7d 100644
--- a/lib/pleroma/web/common_api/utils.ex
+++ b/lib/pleroma/web/common_api/utils.ex
@@ -126,6 +126,7 @@ defmodule Pleroma.Web.CommonAPI.Utils do
|> String.replace(~r/\r?\n/, "")
|> (&{[], &1}).()
|> Formatter.add_user_links(mentions)
+ |> Formatter.add_hashtag_links(tags)
|> Formatter.finalize()
end
diff --git a/lib/pleroma/web/oauth/authorization.ex b/lib/pleroma/web/oauth/authorization.ex
index 23e8eb7b1..2cad4550a 100644
--- a/lib/pleroma/web/oauth/authorization.ex
+++ b/lib/pleroma/web/oauth/authorization.ex
@@ -4,7 +4,7 @@ defmodule Pleroma.Web.OAuth.Authorization do
alias Pleroma.{User, Repo}
alias Pleroma.Web.OAuth.{Authorization, App}
- import Ecto.{Changeset}
+ import Ecto.{Changeset, Query}
schema "oauth_authorizations" do
field(:token, :string)
@@ -45,4 +45,12 @@ defmodule Pleroma.Web.OAuth.Authorization do
end
def use_token(%Authorization{used: true}), do: {:error, "already used"}
+
+ def delete_user_authorizations(%User{id: user_id}) do
+ from(
+ a in Pleroma.Web.OAuth.Authorization,
+ where: a.user_id == ^user_id
+ )
+ |> Repo.delete_all()
+ end
end
diff --git a/lib/pleroma/web/oauth/token.ex b/lib/pleroma/web/oauth/token.ex
index 343fc0c45..a77d5af35 100644
--- a/lib/pleroma/web/oauth/token.ex
+++ b/lib/pleroma/web/oauth/token.ex
@@ -1,6 +1,8 @@
defmodule Pleroma.Web.OAuth.Token do
use Ecto.Schema
+ import Ecto.Query
+
alias Pleroma.{User, Repo}
alias Pleroma.Web.OAuth.{Token, App, Authorization}
@@ -35,4 +37,12 @@ defmodule Pleroma.Web.OAuth.Token do
Repo.insert(token)
end
+
+ def delete_user_tokens(%User{id: user_id}) do
+ from(
+ t in Pleroma.Web.OAuth.Token,
+ where: t.user_id == ^user_id
+ )
+ |> Repo.delete_all()
+ end
end
diff --git a/lib/pleroma/web/twitter_api/controllers/util_controller.ex b/lib/pleroma/web/twitter_api/controllers/util_controller.ex
index 4aaf28869..109704d00 100644
--- a/lib/pleroma/web/twitter_api/controllers/util_controller.ex
+++ b/lib/pleroma/web/twitter_api/controllers/util_controller.ex
@@ -223,7 +223,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do
|> Enum.map(fn account ->
with %User{} = follower <- User.get_cached_by_ap_id(user.ap_id),
%User{} = followed <- User.get_or_fetch(account),
- {:ok, follower} <- User.follow(follower, followed) do
+ {:ok, follower} <- User.maybe_direct_follow(follower, followed) do
ActivityPub.follow(follower, followed)
else
err -> Logger.debug("follow_import: following #{account} failed with #{inspect(err)}")
diff --git a/test/fixtures/httpoison_mock/https___osada.macgirvin.com_channel_mike.json b/test/fixtures/httpoison_mock/https___osada.macgirvin.com_channel_mike.json
new file mode 100644
index 000000000..c42f3a53c
--- /dev/null
+++ b/test/fixtures/httpoison_mock/https___osada.macgirvin.com_channel_mike.json
@@ -0,0 +1,54 @@
+{
+ "@context": [
+ "https://www.w3.org/ns/activitystreams",
+ "https://w3id.org/security/v1"
+ ],
+ "type": "Person",
+ "id": "https://osada.macgirvin.com/channel/mike",
+ "preferredUsername": "mike",
+ "name": "Mike Macgirvin (Osada)",
+ "updated": "2018-08-29T03:09:11Z",
+ "icon": {
+ "type": "Image",
+ "mediaType": "image/jpeg",
+ "updated": "2018-08-29T03:10:13Z",
+ "url": "https://osada.macgirvin.com/photo/profile/l/2",
+ "height": 300,
+ "width": 300
+ },
+ "url": [
+ {
+ "type": "Link",
+ "mediaType": "text/html",
+ "href": "https://osada.macgirvin.com/channel/mike"
+ },
+ {
+ "type": "Link",
+ "mediaType": "text/x-zot+json",
+ "href": "https://osada.macgirvin.com/channel/mike"
+ }
+ ],
+ "inbox": "https://osada.macgirvin.com/inbox/mike",
+ "outbox": "https://osada.macgirvin.com/outbox/mike",
+ "followers": "https://osada.macgirvin.com/followers/mike",
+ "following": "https://osada.macgirvin.com/following/mike",
+ "endpoints": {
+ "sharedInbox": "https://osada.macgirvin.com/inbox"
+ },
+ "publicKey": {
+ "id": "https://osada.macgirvin.com/channel/mike/public_key_pem",
+ "owner": "https://osada.macgirvin.com/channel/mike",
+ "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAskSyK2VwBNKbzZl9XNJk\nvxU5AAilmRArMmmKSzphdHaVBHakeafUfixvqNrQ/oX2srJvJKcghNmEMrJ6MJ7r\npeEndVOo7pcP4PwVjtnC06p3J711q5tBehqM25BfCLCrB2YqWF6c8zk3CPN3Na21\n8k5s4cO95N/rGN+Po0XFAX/HjKjlpgNpKRDrpxmXxTU8NZfAqeQGJ5oiMBZI9vVB\n+eU7t1L6F5/XWuUCeP4OMrG8oZX822AREba8rknS6DpkWGES0Rx2eNOyYTf6ue75\nI6Ek6rlO+da5wMWr+3BvYMq4JMIwTHzAO+ZqqJPFpzKSiVuAWb2DOX/MDFecVWJE\ntF/R60lONxe4e/00MPCoDdqkLKdwROsk1yGL7z4Zk6jOWFEhIcWy/d2Ya5CpPvS3\nu4wNN4jkYAjra+8TiloRELhV4gpcEk8nkyNwLXOhYm7zQ5sIc5rfXoIrFzALB86W\nG05Nnqg+77zZIaTZpD9qekYlaEt+0OVtt9TTIeTiudQ983l6mfKwZYymrzymH1dL\nVgxBRYo+Z53QOSLiSKELfTBZxEoP1pBw6RiOHXydmJ/39hGgc2YAY/5ADwW2F2yb\nJ7+gxG6bPJ3ikDLYcD4CB5iJQdnTcDsFt3jyHAT6wOCzFAYPbHUqtzHfUM30dZBn\nnJhQF8udPLcXLaj6GW75JacCAwEAAQ==\n-----END PUBLIC KEY-----\n"
+ },
+ "signature": {
+ "@context": [
+ "https://www.w3.org/ns/activitystreams",
+ "https://w3id.org/security/v1"
+ ],
+ "type": "RsaSignature2017",
+ "nonce": "bd60167a764a936788d9538531284dfacc258daae0297bc34a83bce136dedb5d",
+ "creator": "https://osada.macgirvin.com/channel/mike/public_key_pem",
+ "created": "2018-10-17T07:16:28Z",
+ "signatureValue": "WbfFVIPImkd3yNu6brz0CvZaeV242rwAbH0vy8DM4vfnXCxLr5Uv/Wj9gwP+tbooTxGaahAKBeqlGkQp8RLEo37LATrKMRLA/0V6DeeV+C5ORWR9B4WxyWiD3s/9Wf+KesFMtktNLAcMZ5PfnOS/xNYerhnpkp/gWPxtkglmLIWJv+w18A5zZ01JCxsO4QljHbhYaEUPHUfQ97abrkLECeam+FThVwdO6BFCtbjoNXHfzjpSZL/oKyBpi5/fpnqMqOLOQPs5WgBBZJvjEYYkQcoPTyxYI5NGpNbzIjGHPQNuACnOelH16A7L+q4swLWDIaEFeXQ2/5bmqVKZDZZ6usNP4QyTVszwd8jqo27qcDTNibXDUTsTdKpNQvM/3UncBuzuzmUV3FczhtGshIU1/pRVZiQycpVqPlGLvXhP/yZCe+1siyqDd+3uMaS2vkHTObSl5r+VYof+c+TcjrZXHSWnQTg8/X3zkoBWosrQ93VZcwjzMxQoARYv6rphbOoTz7RPmGAXYUt3/PDWkqDlmQDwCpLNNkJo1EidyefZBdD9HXQpCBO0ZU0NHb0JmPvg/+zU0krxlv70bm3RHA/maBETVjroIWzt7EwQEg5pL2hVnvSBG+1wF3BtRVe77etkPOHxLnYYIcAMLlVKCcgDd89DPIziQyruvkx1busHI08="
+ }
+}
diff --git a/test/fixtures/httpoison_mock/mike@osada.macgirvin.com.json b/test/fixtures/httpoison_mock/mike@osada.macgirvin.com.json
new file mode 100644
index 000000000..fe6b83ca6
--- /dev/null
+++ b/test/fixtures/httpoison_mock/mike@osada.macgirvin.com.json
@@ -0,0 +1,53 @@
+{
+ "subject": "acct:mike@osada.macgirvin.com",
+ "aliases": [
+ "https://osada.macgirvin.com/channel/mike",
+ "https://osada.macgirvin.com/~mike",
+ "https://osada.macgirvin.com/@mike"
+ ],
+ "properties": {
+ "http://webfinger.net/ns/name": "Mike Macgirvin (Osada)",
+ "http://xmlns.com/foaf/0.1/name": "Mike Macgirvin (Osada)",
+ "https://w3id.org/security/v1#publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAskSyK2VwBNKbzZl9XNJk\nvxU5AAilmRArMmmKSzphdHaVBHakeafUfixvqNrQ/oX2srJvJKcghNmEMrJ6MJ7r\npeEndVOo7pcP4PwVjtnC06p3J711q5tBehqM25BfCLCrB2YqWF6c8zk3CPN3Na21\n8k5s4cO95N/rGN+Po0XFAX/HjKjlpgNpKRDrpxmXxTU8NZfAqeQGJ5oiMBZI9vVB\n+eU7t1L6F5/XWuUCeP4OMrG8oZX822AREba8rknS6DpkWGES0Rx2eNOyYTf6ue75\nI6Ek6rlO+da5wMWr+3BvYMq4JMIwTHzAO+ZqqJPFpzKSiVuAWb2DOX/MDFecVWJE\ntF/R60lONxe4e/00MPCoDdqkLKdwROsk1yGL7z4Zk6jOWFEhIcWy/d2Ya5CpPvS3\nu4wNN4jkYAjra+8TiloRELhV4gpcEk8nkyNwLXOhYm7zQ5sIc5rfXoIrFzALB86W\nG05Nnqg+77zZIaTZpD9qekYlaEt+0OVtt9TTIeTiudQ983l6mfKwZYymrzymH1dL\nVgxBRYo+Z53QOSLiSKELfTBZxEoP1pBw6RiOHXydmJ/39hGgc2YAY/5ADwW2F2yb\nJ7+gxG6bPJ3ikDLYcD4CB5iJQdnTcDsFt3jyHAT6wOCzFAYPbHUqtzHfUM30dZBn\nnJhQF8udPLcXLaj6GW75JacCAwEAAQ==\n-----END PUBLIC KEY-----\n",
+ "http://purl.org/zot/federation": "zot6,activitypub"
+ },
+ "links": [
+ {
+ "rel": "http://webfinger.net/rel/avatar",
+ "type": "image/jpeg",
+ "href": "https://osada.macgirvin.com/photo/profile/l/2"
+ },
+ {
+ "rel": "http://webfinger.net/rel/blog",
+ "href": "https://osada.macgirvin.com/channel/mike"
+ },
+ {
+ "rel": "http://openid.net/specs/connect/1.0/issuer",
+ "href": "https://osada.macgirvin.com"
+ },
+ {
+ "rel": "http://purl.org/zot/protocol/6.0",
+ "type": "application/x-zot+json",
+ "href": "https://osada.macgirvin.com/channel/mike"
+ },
+ {
+ "rel": "http://purl.org/openwebauth/v1",
+ "type": "application/x-zot+json",
+ "href": "https://osada.macgirvin.com/owa"
+ },
+ {
+ "rel": "http://ostatus.org/schema/1.0/subscribe",
+ "template": "https://osada.macgirvin.com/follow?url={uri}"
+ },
+ {
+ "rel": "self",
+ "type": "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"",
+ "href": "https://osada.macgirvin.com/channel/mike"
+ },
+ {
+ "rel": "self",
+ "type": "application/activity+json",
+ "href": "https://osada.macgirvin.com/channel/mike"
+ }
+ ]
+}
diff --git a/test/formatter_test.exs b/test/formatter_test.exs
index e37b17879..13084baa7 100644
--- a/test/formatter_test.exs
+++ b/test/formatter_test.exs
@@ -1,5 +1,6 @@
defmodule Pleroma.FormatterTest do
alias Pleroma.Formatter
+ alias Pleroma.User
use Pleroma.DataCase
import Pleroma.Factory
@@ -131,6 +132,24 @@ defmodule Pleroma.FormatterTest do
assert expected_text == Formatter.finalize({subs, text})
end
+ test "gives a replacement for user links when the user is using Osada" do
+ mike = User.get_or_fetch("mike@osada.macgirvin.com")
+
+ text = "@mike@osada.macgirvin.com test"
+
+ mentions = Formatter.parse_mentions(text)
+
+ {subs, text} = Formatter.add_user_links({[], text}, mentions)
+
+ assert length(subs) == 1
+ Enum.each(subs, fn {uuid, _} -> assert String.contains?(text, uuid) end)
+
+ expected_text =
+ "<span><a class='mention' href='#{mike.ap_id}'>@<span>mike</span></a></span> test"
+
+ assert expected_text == Formatter.finalize({subs, text})
+ end
+
test "gives a replacement for single-character local nicknames" do
text = "@o hi"
o = insert(:user, %{nickname: "o"})
diff --git a/test/support/httpoison_mock.ex b/test/support/httpoison_mock.ex
index d8b79abef..75c78d70e 100644
--- a/test/support/httpoison_mock.ex
+++ b/test/support/httpoison_mock.ex
@@ -3,6 +3,27 @@ defmodule HTTPoisonMock do
def get(url, body \\ [], headers \\ [])
+ def get("https://osada.macgirvin.com/channel/mike", _, _) do
+ {:ok,
+ %Response{
+ status_code: 200,
+ body:
+ File.read!("test/fixtures/httpoison_mock/https___osada.macgirvin.com_channel_mike.json")
+ }}
+ end
+
+ def get(
+ "https://osada.macgirvin.com/.well-known/webfinger?resource=acct:mike@osada.macgirvin.com",
+ _,
+ _
+ ) do
+ {:ok,
+ %Response{
+ status_code: 200,
+ body: File.read!("test/fixtures/httpoison_mock/mike@osada.macgirvin.com.json")
+ }}
+ end
+
def get("https://info.pleroma.site/activity.json", _, _) do
{:ok,
%Response{
diff --git a/test/web/oauth/authorization_test.exs b/test/web/oauth/authorization_test.exs
index 4a9e2a3ac..98c7c4133 100644
--- a/test/web/oauth/authorization_test.exs
+++ b/test/web/oauth/authorization_test.exs
@@ -55,4 +55,26 @@ defmodule Pleroma.Web.OAuth.AuthorizationTest do
assert {:error, "token expired"} == Authorization.use_token(expired_auth)
end
+
+ test "delete authorizations" do
+ {:ok, app} =
+ Repo.insert(
+ App.register_changeset(%App{}, %{
+ client_name: "client",
+ scopes: "scope",
+ redirect_uris: "url"
+ })
+ )
+
+ user = insert(:user)
+
+ {:ok, auth} = Authorization.create_authorization(app, user)
+ {:ok, auth} = Authorization.use_token(auth)
+
+ {auths, _} = Authorization.delete_user_authorizations(user)
+
+ {_, invalid} = Authorization.use_token(auth)
+
+ assert auth != invalid
+ end
end
diff --git a/test/web/oauth/token_test.exs b/test/web/oauth/token_test.exs
index 58448949c..f926ff50b 100644
--- a/test/web/oauth/token_test.exs
+++ b/test/web/oauth/token_test.exs
@@ -29,4 +29,36 @@ defmodule Pleroma.Web.OAuth.TokenTest do
auth = Repo.get(Authorization, auth.id)
{:error, "already used"} = Token.exchange_token(app, auth)
end
+
+ test "deletes all tokens of a user" do
+ {:ok, app1} =
+ Repo.insert(
+ App.register_changeset(%App{}, %{
+ client_name: "client1",
+ scopes: "scope",
+ redirect_uris: "url"
+ })
+ )
+
+ {:ok, app2} =
+ Repo.insert(
+ App.register_changeset(%App{}, %{
+ client_name: "client2",
+ scopes: "scope",
+ redirect_uris: "url"
+ })
+ )
+
+ user = insert(:user)
+
+ {:ok, auth1} = Authorization.create_authorization(app1, user)
+ {:ok, auth2} = Authorization.create_authorization(app2, user)
+
+ {:ok, token1} = Token.exchange_token(app1, auth1)
+ {:ok, token2} = Token.exchange_token(app2, auth2)
+
+ {tokens, _} = Token.delete_user_tokens(user)
+
+ assert tokens == 2
+ end
end