Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
a1batross
pleroma
Commits
7030721b
Commit
7030721b
authored
Sep 26, 2019
by
rinpatch
Browse files
Merge branch 'backport/1.0-hackney-and-outbox-fixes' into 'master'
Pleroma 1.0.7 See merge request
pleroma/pleroma!1723
parents
b9188361
df8fda26
Changes
8
Hide whitespace changes
Inline
Side-by-side
CHANGELOG.md
View file @
7030721b
...
...
@@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file.
The format is based on
[
Keep a Changelog
](
https://keepachangelog.com/en/1.0.0/
)
.
## [1.0.7] - 2019-09-26
### Fixed
-
Broken federation on Erlang 22 (previous versions of hackney http client were using an option that got deprecated)
### Changed
-
ActivityPub: The first page in inboxes/outboxes is no longer embedded.
## [1.0.6] - 2019-08-14
### Fixed
-
MRF: fix use of unserializable keyword lists in describe() implementations
...
...
lib/pleroma/web/activity_pub/activity_pub.ex
View file @
7030721b
...
...
@@ -842,7 +842,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
defp
restrict_muted_reblogs
(
query
,
_
),
do
:
query
defp
exclude_poll_votes
(
query
,
%{
"include_poll_votes"
=>
"
true
"
}),
do
:
query
defp
exclude_poll_votes
(
query
,
%{
"include_poll_votes"
=>
true
}),
do
:
query
defp
exclude_poll_votes
(
query
,
_
)
do
if
has_named_binding?
(
query
,
:object
)
do
...
...
lib/pleroma/web/activity_pub/activity_pub_controller.ex
View file @
7030721b
...
...
@@ -144,12 +144,43 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubController do
end
end
def
outbox
(
conn
,
%{
"nickname"
=>
nickname
}
=
params
)
do
def
outbox
(
conn
,
%{
"nickname"
=>
nickname
,
"page"
=>
page?
}
=
params
)
when
page?
in
[
true
,
"true"
]
do
with
%
User
{}
=
user
<-
User
.
get_cached_by_nickname
(
nickname
),
{
:ok
,
user
}
<-
User
.
ensure_keys_present
(
user
)
do
activities
=
if
params
[
"max_id"
]
do
ActivityPub
.
fetch_user_activities
(
user
,
nil
,
%{
"max_id"
=>
params
[
"max_id"
],
# This is a hack because postgres generates inefficient queries when filtering by
# 'Answer', poll votes will be hidden by the visibility filter in this case anyway
"include_poll_votes"
=>
true
,
"limit"
=>
10
})
else
ActivityPub
.
fetch_user_activities
(
user
,
nil
,
%{
"limit"
=>
10
,
"include_poll_votes"
=>
true
})
end
conn
|>
put_resp_header
(
"content-type"
,
"application/activity+json"
)
|>
json
(
UserView
.
render
(
"outbox.json"
,
%{
user:
user
,
max_id:
params
[
"max_id"
]}))
|>
put_resp_content_type
(
"application/activity+json"
)
|>
put_view
(
UserView
)
|>
render
(
"activity_collection_page.json"
,
%{
activities:
activities
,
iri:
"
#{
user
.
ap_id
}
/outbox"
})
end
end
def
outbox
(
conn
,
%{
"nickname"
=>
nickname
})
do
with
%
User
{}
=
user
<-
User
.
get_cached_by_nickname
(
nickname
),
{
:ok
,
user
}
<-
User
.
ensure_keys_present
(
user
)
do
conn
|>
put_resp_content_type
(
"application/activity+json"
)
|>
put_view
(
UserView
)
|>
render
(
"activity_collection.json"
,
%{
iri:
"
#{
user
.
ap_id
}
/outbox"
})
end
end
...
...
@@ -212,18 +243,63 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubController do
def
whoami
(
_conn
,
_params
),
do
:
{
:error
,
:not_found
}
def
read_inbox
(%{
assigns:
%{
user:
user
}}
=
conn
,
%{
"nickname"
=>
nickname
}
=
params
)
do
if
nickname
==
user
.
nickname
do
conn
|>
put_resp_header
(
"content-type"
,
"application/activity+json"
)
|>
json
(
UserView
.
render
(
"inbox.json"
,
%{
user:
user
,
max_id:
params
[
"max_id"
]}))
else
def
read_inbox
(
%{
assigns:
%{
user:
%{
nickname:
nickname
}
=
user
}}
=
conn
,
%{
"nickname"
=>
nickname
,
"page"
=>
page?
}
=
params
)
when
page?
in
[
true
,
"true"
]
do
activities
=
if
params
[
"max_id"
]
do
ActivityPub
.
fetch_activities
([
user
.
ap_id
|
user
.
following
],
%{
"max_id"
=>
params
[
"max_id"
],
"limit"
=>
10
})
else
ActivityPub
.
fetch_activities
([
user
.
ap_id
|
user
.
following
],
%{
"limit"
=>
10
})
end
conn
|>
put_resp_content_type
(
"application/activity+json"
)
|>
put_view
(
UserView
)
|>
render
(
"activity_collection_page.json"
,
%{
activities:
activities
,
iri:
"
#{
user
.
ap_id
}
/inbox"
})
end
def
read_inbox
(%{
assigns:
%{
user:
%{
nickname:
nickname
}
=
user
}}
=
conn
,
%{
"nickname"
=>
nickname
})
do
with
{
:ok
,
user
}
<-
User
.
ensure_keys_present
(
user
)
do
conn
|>
put_status
(
:forbidden
)
|>
json
(
"can't read inbox of
#{
nickname
}
as
#{
user
.
nickname
}
"
)
|>
put_resp_content_type
(
"application/activity+json"
)
|>
put_view
(
UserView
)
|>
render
(
"activity_collection.json"
,
%{
iri:
"
#{
user
.
ap_id
}
/inbox"
})
end
end
def
read_inbox
(%{
assigns:
%{
user:
nil
}}
=
conn
,
%{
"nickname"
=>
nickname
})
do
err
=
dgettext
(
"errors"
,
"can't read inbox of %{nickname}"
,
nickname:
nickname
)
conn
|>
put_status
(
:forbidden
)
|>
json
(
err
)
end
def
read_inbox
(%{
assigns:
%{
user:
%{
nickname:
as_nickname
}}}
=
conn
,
%{
"nickname"
=>
nickname
})
do
err
=
dgettext
(
"errors"
,
"can't read inbox of %{nickname} as %{as_nickname}"
,
nickname:
nickname
,
as_nickname:
as_nickname
)
conn
|>
put_status
(
:forbidden
)
|>
json
(
err
)
end
def
handle_user_activity
(
user
,
%{
"type"
=>
"Create"
}
=
params
)
do
object
=
params
[
"object"
]
...
...
lib/pleroma/web/activity_pub/views/user_view.ex
View file @
7030721b
...
...
@@ -8,7 +8,6 @@ defmodule Pleroma.Web.ActivityPub.UserView do
alias
Pleroma
.
Keys
alias
Pleroma
.
Repo
alias
Pleroma
.
User
alias
Pleroma
.
Web
.
ActivityPub
.
ActivityPub
alias
Pleroma
.
Web
.
ActivityPub
.
Transmogrifier
alias
Pleroma
.
Web
.
ActivityPub
.
Utils
alias
Pleroma
.
Web
.
Endpoint
...
...
@@ -173,25 +172,22 @@ defmodule Pleroma.Web.ActivityPub.UserView do
|>
Map
.
merge
(
Utils
.
make_json_ld_header
())
end
def
render
(
"outbox.json"
,
%{
user:
user
,
max_id:
max_qid
})
do
params
=
%{
"limit"
=>
"10"
def
render
(
"activity_collection.json"
,
%{
iri:
iri
})
do
%{
"id"
=>
iri
,
"type"
=>
"OrderedCollection"
,
"first"
=>
"
#{
iri
}
?page=true"
}
|>
Map
.
merge
(
Utils
.
make_json_ld_header
())
end
params
=
if
max_qid
!=
nil
do
Map
.
put
(
params
,
"max_id"
,
max_qid
)
else
params
end
activities
=
ActivityPub
.
fetch_user_activities
(
user
,
nil
,
params
)
def
render
(
"activity_collection_page.json"
,
%{
activities:
activities
,
iri:
iri
})
do
# this is sorted chronologically, so first activity is the newest (max)
{
max_id
,
min_id
,
collection
}
=
if
length
(
activities
)
>
0
do
{
Enum
.
at
(
Enum
.
reverse
(
activities
),
0
)
.
id
,
Enum
.
at
(
activities
,
0
)
.
id
,
Enum
.
at
(
Enum
.
reverse
(
activities
),
0
)
.
id
,
Enum
.
map
(
activities
,
fn
act
->
{
:ok
,
data
}
=
Transmogrifier
.
prepare_outgoing
(
act
.
data
)
data
...
...
@@ -205,71 +201,14 @@ defmodule Pleroma.Web.ActivityPub.UserView do
}
end
iri
=
"
#{
user
.
ap_id
}
/outbox"
page
=
%{
"id"
=>
"
#{
iri
}
?max_id=
#{
max_id
}
"
,
"type"
=>
"OrderedCollectionPage"
,
"partOf"
=>
iri
,
"orderedItems"
=>
collection
,
"next"
=>
"
#{
iri
}
?max_id=
#{
min_id
}
"
}
if
max_qid
==
nil
do
%{
"id"
=>
iri
,
"type"
=>
"OrderedCollection"
,
"first"
=>
page
}
|>
Map
.
merge
(
Utils
.
make_json_ld_header
())
else
page
|>
Map
.
merge
(
Utils
.
make_json_ld_header
())
end
end
def
render
(
"inbox.json"
,
%{
user:
user
,
max_id:
max_qid
})
do
params
=
%{
"limit"
=>
"10"
}
params
=
if
max_qid
!=
nil
do
Map
.
put
(
params
,
"max_id"
,
max_qid
)
else
params
end
activities
=
ActivityPub
.
fetch_activities
([
user
.
ap_id
|
user
.
following
],
params
)
min_id
=
Enum
.
at
(
Enum
.
reverse
(
activities
),
0
)
.
id
max_id
=
Enum
.
at
(
activities
,
0
)
.
id
collection
=
Enum
.
map
(
activities
,
fn
act
->
{
:ok
,
data
}
=
Transmogrifier
.
prepare_outgoing
(
act
.
data
)
data
end
)
iri
=
"
#{
user
.
ap_id
}
/inbox"
page
=
%{
"id"
=>
"
#{
iri
}
?max_id=
#{
max_id
}
"
,
%{
"id"
=>
"
#{
iri
}
?max_id=
#{
max_id
}
&page=true"
,
"type"
=>
"OrderedCollectionPage"
,
"partOf"
=>
iri
,
"orderedItems"
=>
collection
,
"next"
=>
"
#{
iri
}
?max_id=
#{
min_id
}
"
"next"
=>
"
#{
iri
}
?max_id=
#{
min_id
}
&page=true
"
}
if
max_qid
==
nil
do
%{
"id"
=>
iri
,
"type"
=>
"OrderedCollection"
,
"first"
=>
page
}
|>
Map
.
merge
(
Utils
.
make_json_ld_header
())
else
page
|>
Map
.
merge
(
Utils
.
make_json_ld_header
())
end
|>
Map
.
merge
(
Utils
.
make_json_ld_header
())
end
def
collection
(
collection
,
iri
,
page
,
show_items
\\
true
,
total
\\
nil
)
do
...
...
mix.exs
View file @
7030721b
...
...
@@ -4,7 +4,7 @@ defmodule Pleroma.Mixfile do
def
project
do
[
app:
:pleroma
,
version:
version
(
"1.0.
6
"
),
version:
version
(
"1.0.
7
"
),
elixir:
"~> 1.7"
,
elixirc_paths:
elixirc_paths
(
Mix
.
env
()),
compilers:
[
:phoenix
,
:gettext
]
++
Mix
.
compilers
(),
...
...
mix.lock
View file @
7030721b
...
...
@@ -33,9 +33,9 @@
"ex_syslogger": {:git, "https://github.com/slashmili/ex_syslogger.git", "f3963399047af17e038897c69e20d552e6899e1d", [tag: "1.4.0"]},
"excoveralls": {:hex, :excoveralls, "0.11.1", "dd677fbdd49114fdbdbf445540ec735808250d56b011077798316505064edb2c", [:mix], [{:hackney, "~> 1.0", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm"},
"floki": {:hex, :floki, "0.20.4", "be42ac911fece24b4c72f3b5846774b6e61b83fe685c2fc9d62093277fb3bc86", [:mix], [{:html_entities, "~> 0.4.0", [hex: :html_entities, repo: "hexpm", optional: false]}, {:mochiweb, "~> 2.15", [hex: :mochiweb, repo: "hexpm", optional: false]}], "hexpm"},
"gen_smtp": {:hex, :gen_smtp, "0.1
3
.0", "
11f08504c4bdd831dc520b8f84a1dce5ce624474a797394e7aafd3c29f5dcd25
", [:rebar3], [], "hexpm"},
"gettext": {:hex, :gettext, "0.1
5
.0", "
40a2b8ce33a80ced7727e36768499fc9286881c43ebafccae6bab731e2b2b8ce
", [:mix], [], "hexpm"},
"hackney": {:hex, :hackney, "1.15.
1
", "
9f8f471c844b8ce395f7b6d8398139e26ddca9ebc171a8b91342ee15a19963f4
", [:rebar3], [{:certifi, "2.5.1", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "6.0.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "1.0.1", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "1.1.
4
", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}], "hexpm"},
"gen_smtp": {:hex, :gen_smtp, "0.1
4
.0", "
39846a03522456077c6429b4badfd1d55e5e7d0fdfb65e935b7c5e38549d9202
", [:rebar3], [], "hexpm"},
"gettext": {:hex, :gettext, "0.1
7
.0", "
abe21542c831887a2b16f4c94556db9c421ab301aee417b7c4fbde7fbdbe01ec
", [:mix], [], "hexpm"},
"hackney": {:hex, :hackney, "1.15.
2
", "
07e33c794f8f8964ee86cebec1a8ed88db5070e52e904b8f12209773c1036085
", [:rebar3], [{:certifi, "2.5.1", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "6.0.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "1.0.1", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "1.1.
5
", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}], "hexpm"},
"html_entities": {:hex, :html_entities, "0.4.0", "f2fee876858cf6aaa9db608820a3209e45a087c5177332799592142b50e89a6b", [:mix], [], "hexpm"},
"html_sanitize_ex": {:hex, :html_sanitize_ex, "1.3.0", "f005ad692b717691203f940c686208aa3d8ffd9dd4bb3699240096a51fa9564e", [:mix], [{:mochiweb, "~> 2.15", [hex: :mochiweb, repo: "hexpm", optional: false]}], "hexpm"},
"http_signatures": {:git, "https://git.pleroma.social/pleroma/http_signatures.git", "9789401987096ead65646b52b5a2ca6bf52fc531", [ref: "9789401987096ead65646b52b5a2ca6bf52fc531"]},
...
...
@@ -76,8 +76,8 @@
"quack": {:hex, :quack, "0.1.1", "cca7b4da1a233757fdb44b3334fce80c94785b3ad5a602053b7a002b5a8967bf", [:mix], [{:poison, ">= 1.0.0", [hex: :poison, repo: "hexpm", optional: false]}, {:tesla, "~> 1.2.0", [hex: :tesla, repo: "hexpm", optional: false]}], "hexpm"},
"ranch": {:hex, :ranch, "1.7.1", "6b1fab51b49196860b733a49c07604465a47bdb78aa10c1c16a3d199f7f8c881", [:rebar3], [], "hexpm"},
"recon": {:git, "https://github.com/ferd/recon.git", "75d70c7c08926d2f24f1ee6de14ee50fe8a52763", [tag: "2.4.0"]},
"ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.4", "f0eafff810d2041e93f915ef59899c923f4568f4585904d010387ed74988e77b", [:make, :mix, :rebar3], [], "hexpm"},
"swoosh": {:hex, :swoosh, "0.20.0", "9a6c13822c9815993c03b6f8fccc370fcffb3c158d9754f67b1fdee6b3a5d928", [:mix], [{:cowboy, "~> 1.0.1 or ~> 1.1 or ~> 2.4", [hex: :cowboy, repo: "hexpm", optional: true]}, {:gen_smtp, "~> 0.12", [hex: :gen_smtp, repo: "hexpm", optional: true]}, {:hackney, "~> 1.9", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mime, "~> 1.1", [hex: :mime, repo: "hexpm", optional: false]}, {:plug, "~> 1.4", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm"},
"ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.5", "6eaf7ad16cb568bb01753dbbd7a95ff8b91c7979482b95f38443fe2c8852a79b", [:make, :mix, :rebar3], [], "hexpm"},
"syslog": {:git, "https://github.com/Vagabond/erlang-syslog.git", "4a6c6f2c996483e86c1320e9553f91d337bcb6aa", [tag: "1.0.5"]},
"telemetry": {:hex, :telemetry, "0.4.0", "8339bee3fa8b91cb84d14c2935f8ecf399ccd87301ad6da6b71c09553834b2ab", [:rebar3], [], "hexpm"},
"tesla": {:hex, :tesla, "1.2.1", "864783cc27f71dd8c8969163704752476cec0f3a51eb3b06393b3971dc9733ff", [:mix], [{:exjsx, ">= 3.0.0", [hex: :exjsx, repo: "hexpm", optional: true]}, {:fuse, "~> 2.4", [hex: :fuse, repo: "hexpm", optional: true]}, {:hackney, "~> 1.6", [hex: :hackney, repo: "hexpm", optional: true]}, {:ibrowse, "~> 4.4.0", [hex: :ibrowse, repo: "hexpm", optional: true]}, {:jason, ">= 1.0.0", [hex: :jason, repo: "hexpm", optional: true]}, {:mime, "~> 1.0", [hex: :mime, repo: "hexpm", optional: false]}, {:poison, ">= 1.0.0", [hex: :poison, repo: "hexpm", optional: true]}], "hexpm"},
...
...
test/web/activity_pub/activity_pub_controller_test.exs
View file @
7030721b
...
...
@@ -308,7 +308,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do
conn
|>
assign
(
:user
,
user
)
|>
put_req_header
(
"accept"
,
"application/activity+json"
)
|>
get
(
"/users/
#{
user
.
nickname
}
/inbox"
)
|>
get
(
"/users/
#{
user
.
nickname
}
/inbox
?page=true
"
)
assert
response
(
conn
,
200
)
=~
note_activity
.
data
[
"object"
][
"content"
]
end
...
...
@@ -393,7 +393,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do
conn
=
conn
|>
put_req_header
(
"accept"
,
"application/activity+json"
)
|>
get
(
"/users/
#{
user
.
nickname
}
/outbox"
)
|>
get
(
"/users/
#{
user
.
nickname
}
/outbox
?page=true
"
)
assert
response
(
conn
,
200
)
=~
note_activity
.
data
[
"object"
][
"content"
]
end
...
...
@@ -405,7 +405,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do
conn
=
conn
|>
put_req_header
(
"accept"
,
"application/activity+json"
)
|>
get
(
"/users/
#{
user
.
nickname
}
/outbox"
)
|>
get
(
"/users/
#{
user
.
nickname
}
/outbox
?page=true
"
)
assert
response
(
conn
,
200
)
=~
announce_activity
.
data
[
"object"
]
end
...
...
test/web/activity_pub/views/user_view_test.exs
View file @
7030721b
...
...
@@ -4,6 +4,7 @@ defmodule Pleroma.Web.ActivityPub.UserViewTest do
alias
Pleroma
.
User
alias
Pleroma
.
Web
.
ActivityPub
.
UserView
alias
Pleroma
.
Web
.
CommonAPI
test
"Renders a user, including the public key"
do
user
=
insert
(
:user
)
...
...
@@ -78,4 +79,35 @@ defmodule Pleroma.Web.ActivityPub.UserViewTest do
refute
result
[
"endpoints"
][
"oauthTokenEndpoint"
]
end
end
test
"activity collection page aginates correctly"
do
user
=
insert
(
:user
)
posts
=
for
i
<-
0
..
25
do
{
:ok
,
activity
}
=
CommonAPI
.
post
(
user
,
%{
"status"
=>
"post
#{
i
}
"
})
activity
end
# outbox sorts chronologically, newest first, with ten per page
posts
=
Enum
.
reverse
(
posts
)
%{
"next"
=>
next_url
}
=
UserView
.
render
(
"activity_collection_page.json"
,
%{
iri:
"
#{
user
.
ap_id
}
/outbox"
,
activities:
Enum
.
take
(
posts
,
10
)
})
next_id
=
Enum
.
at
(
posts
,
9
)
.
id
assert
next_url
=~
next_id
%{
"next"
=>
next_url
}
=
UserView
.
render
(
"activity_collection_page.json"
,
%{
iri:
"
#{
user
.
ap_id
}
/outbox"
,
activities:
Enum
.
take
(
Enum
.
drop
(
posts
,
10
),
10
)
})
next_id
=
Enum
.
at
(
posts
,
19
)
.
id
assert
next_url
=~
next_id
end
end
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment