Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
P
pleroma
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
1
Issues
1
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Incidents
Environments
Packages & Registries
Packages & Registries
Container Registry
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Hakaba Hitoyo
pleroma
Commits
0f5bff8c
Commit
0f5bff8c
authored
Aug 26, 2018
by
kaniini
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'develop' into 'feature/relay'
# Conflicts: # lib/pleroma/web/activity_pub/utils.ex
parents
30261772
3448b434
Changes
287
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
287 changed files
with
1251 additions
and
2778 deletions
+1251
-2778
config/config.exs
config/config.exs
+11
-5
installation/caddyfile-pleroma.example
installation/caddyfile-pleroma.example
+33
-5
installation/init.d/pleroma
installation/init.d/pleroma
+21
-0
lib/mix/tasks/generate_invite_token.ex
lib/mix/tasks/generate_invite_token.ex
+25
-0
lib/pleroma/formatter.ex
lib/pleroma/formatter.ex
+35
-7
lib/pleroma/gopher/server.ex
lib/pleroma/gopher/server.ex
+3
-3
lib/pleroma/http/http.ex
lib/pleroma/http/http.ex
+24
-1
lib/pleroma/upload.ex
lib/pleroma/upload.ex
+13
-13
lib/pleroma/user.ex
lib/pleroma/user.ex
+1
-0
lib/pleroma/user_invite_token.ex
lib/pleroma/user_invite_token.ex
+40
-0
lib/pleroma/web/activity_pub/activity_pub.ex
lib/pleroma/web/activity_pub/activity_pub.ex
+1
-1
lib/pleroma/web/activity_pub/transmogrifier.ex
lib/pleroma/web/activity_pub/transmogrifier.ex
+56
-7
lib/pleroma/web/activity_pub/utils.ex
lib/pleroma/web/activity_pub/utils.ex
+15
-5
lib/pleroma/web/activity_pub/views/user_view.ex
lib/pleroma/web/activity_pub/views/user_view.ex
+2
-7
lib/pleroma/web/common_api/utils.ex
lib/pleroma/web/common_api/utils.ex
+2
-3
lib/pleroma/web/mastodon_api/mastodon_api_controller.ex
lib/pleroma/web/mastodon_api/mastodon_api_controller.ex
+53
-15
lib/pleroma/web/mastodon_api/views/account_view.ex
lib/pleroma/web/mastodon_api/views/account_view.ex
+14
-2
lib/pleroma/web/mastodon_api/views/status_view.ex
lib/pleroma/web/mastodon_api/views/status_view.ex
+19
-3
lib/pleroma/web/nodeinfo/nodeinfo_controller.ex
lib/pleroma/web/nodeinfo/nodeinfo_controller.ex
+8
-1
lib/pleroma/web/router.ex
lib/pleroma/web/router.ex
+8
-3
lib/pleroma/web/templates/mastodon_api/mastodon/index.html.eex
...leroma/web/templates/mastodon_api/mastodon/index.html.eex
+1
-1
lib/pleroma/web/twitter_api/controllers/util_controller.ex
lib/pleroma/web/twitter_api/controllers/util_controller.ex
+11
-3
lib/pleroma/web/twitter_api/representers/activity_representer.ex
...roma/web/twitter_api/representers/activity_representer.ex
+10
-1
lib/pleroma/web/twitter_api/representers/object_representer.ex
...leroma/web/twitter_api/representers/object_representer.ex
+6
-4
lib/pleroma/web/twitter_api/twitter_api.ex
lib/pleroma/web/twitter_api/twitter_api.ex
+30
-10
lib/pleroma/web/twitter_api/twitter_api_controller.ex
lib/pleroma/web/twitter_api/twitter_api_controller.ex
+14
-2
lib/pleroma/web/twitter_api/views/user_view.ex
lib/pleroma/web/twitter_api/views/user_view.ex
+12
-1
mix.exs
mix.exs
+17
-17
mix.lock
mix.lock
+9
-9
priv/repo/migrations/20180612110515_create_user_invite_tokens.exs
...o/migrations/20180612110515_create_user_invite_tokens.exs
+12
-0
priv/static/index.html
priv/static/index.html
+1
-1
priv/static/packs/about.js
priv/static/packs/about.js
+1
-1
priv/static/packs/about.js.map
priv/static/packs/about.js.map
+1
-1
priv/static/packs/admin.js
priv/static/packs/admin.js
+1
-1
priv/static/packs/admin.js.map
priv/static/packs/admin.js.map
+1
-1
priv/static/packs/appcache/manifest.appcache
priv/static/packs/appcache/manifest.appcache
+20
-7
priv/static/packs/application.js
priv/static/packs/application.js
+1
-1
priv/static/packs/application.js.map
priv/static/packs/application.js.map
+1
-1
priv/static/packs/base_polyfills.js
priv/static/packs/base_polyfills.js
+1
-1
priv/static/packs/base_polyfills.js.map
priv/static/packs/base_polyfills.js.map
+1
-1
priv/static/packs/common.js
priv/static/packs/common.js
+1
-1
priv/static/packs/common.js.map
priv/static/packs/common.js.map
+1
-1
priv/static/packs/containers/media_container.js
priv/static/packs/containers/media_container.js
+2
-0
priv/static/packs/containers/media_container.js.map
priv/static/packs/containers/media_container.js.map
+1
-0
priv/static/packs/contrast.css
priv/static/packs/contrast.css
+2
-0
priv/static/packs/contrast.css.map
priv/static/packs/contrast.css.map
+1
-0
priv/static/packs/contrast.js
priv/static/packs/contrast.js
+2
-0
priv/static/packs/contrast.js.map
priv/static/packs/contrast.js.map
+1
-0
priv/static/packs/default.css
priv/static/packs/default.css
+1
-1
priv/static/packs/default.js
priv/static/packs/default.js
+1
-1
priv/static/packs/default.js.map
priv/static/packs/default.js.map
+1
-1
priv/static/packs/elephant-fren-d16fd77f9a9387e7d146b5f9d4dc1e7f.png
.../packs/elephant-fren-d16fd77f9a9387e7d146b5f9d4dc1e7f.png
+0
-0
priv/static/packs/elephant_ui_disappointed-8864342480c3612e3061702851d3a798.svg
...hant_ui_disappointed-8864342480c3612e3061702851d3a798.svg
+0
-1
priv/static/packs/elephant_ui_greeting-475430963d0b00fe82b07b17857ebf6c.svg
...elephant_ui_greeting-475430963d0b00fe82b07b17857ebf6c.svg
+0
-1
priv/static/packs/elephant_ui_plane-e3f2d57c12c376e189c274cbe81af8dd.svg
...ks/elephant_ui_plane-e3f2d57c12c376e189c274cbe81af8dd.svg
+0
-1
priv/static/packs/elephant_ui_working-2e653cc278c2ac871c23aeb10de1c0e2.svg
.../elephant_ui_working-2e653cc278c2ac871c23aeb10de1c0e2.svg
+0
-1
priv/static/packs/emoji_picker.js
priv/static/packs/emoji_picker.js
+1
-1
priv/static/packs/emoji_picker.js.map
priv/static/packs/emoji_picker.js.map
+1
-1
priv/static/packs/extra_polyfills.js
priv/static/packs/extra_polyfills.js
+1
-1
priv/static/packs/extra_polyfills.js.map
priv/static/packs/extra_polyfills.js.map
+1
-1
priv/static/packs/features/account_gallery.js
priv/static/packs/features/account_gallery.js
+1
-1
priv/static/packs/features/account_gallery.js.map
priv/static/packs/features/account_gallery.js.map
+1
-1
priv/static/packs/features/account_timeline.js
priv/static/packs/features/account_timeline.js
+1
-1
priv/static/packs/features/account_timeline.js.map
priv/static/packs/features/account_timeline.js.map
+1
-1
priv/static/packs/features/blocks.js
priv/static/packs/features/blocks.js
+1
-1
priv/static/packs/features/blocks.js.map
priv/static/packs/features/blocks.js.map
+1
-1
priv/static/packs/features/community_timeline.js
priv/static/packs/features/community_timeline.js
+1
-1
priv/static/packs/features/community_timeline.js.map
priv/static/packs/features/community_timeline.js.map
+1
-1
priv/static/packs/features/compose.js
priv/static/packs/features/compose.js
+1
-1
priv/static/packs/features/compose.js.map
priv/static/packs/features/compose.js.map
+1
-1
priv/static/packs/features/direct_timeline.js
priv/static/packs/features/direct_timeline.js
+2
-0
priv/static/packs/features/direct_timeline.js.map
priv/static/packs/features/direct_timeline.js.map
+1
-0
priv/static/packs/features/domain_blocks.js
priv/static/packs/features/domain_blocks.js
+2
-0
priv/static/packs/features/domain_blocks.js.map
priv/static/packs/features/domain_blocks.js.map
+1
-0
priv/static/packs/features/favourited_statuses.js
priv/static/packs/features/favourited_statuses.js
+1
-1
priv/static/packs/features/favourited_statuses.js.map
priv/static/packs/features/favourited_statuses.js.map
+1
-1
priv/static/packs/features/favourites.js
priv/static/packs/features/favourites.js
+1
-1
priv/static/packs/features/favourites.js.map
priv/static/packs/features/favourites.js.map
+1
-1
priv/static/packs/features/follow_requests.js
priv/static/packs/features/follow_requests.js
+1
-1
priv/static/packs/features/follow_requests.js.map
priv/static/packs/features/follow_requests.js.map
+1
-1
priv/static/packs/features/followers.js
priv/static/packs/features/followers.js
+1
-1
priv/static/packs/features/followers.js.map
priv/static/packs/features/followers.js.map
+1
-1
priv/static/packs/features/following.js
priv/static/packs/features/following.js
+1
-1
priv/static/packs/features/following.js.map
priv/static/packs/features/following.js.map
+1
-1
priv/static/packs/features/generic_not_found.js
priv/static/packs/features/generic_not_found.js
+1
-1
priv/static/packs/features/generic_not_found.js.map
priv/static/packs/features/generic_not_found.js.map
+1
-1
priv/static/packs/features/getting_started.js
priv/static/packs/features/getting_started.js
+1
-1
priv/static/packs/features/getting_started.js.map
priv/static/packs/features/getting_started.js.map
+1
-1
priv/static/packs/features/hashtag_timeline.js
priv/static/packs/features/hashtag_timeline.js
+1
-1
priv/static/packs/features/hashtag_timeline.js.map
priv/static/packs/features/hashtag_timeline.js.map
+1
-1
priv/static/packs/features/home_timeline.js
priv/static/packs/features/home_timeline.js
+1
-1
priv/static/packs/features/home_timeline.js.map
priv/static/packs/features/home_timeline.js.map
+1
-1
priv/static/packs/features/keyboard_shortcuts.js
priv/static/packs/features/keyboard_shortcuts.js
+1
-1
priv/static/packs/features/keyboard_shortcuts.js.map
priv/static/packs/features/keyboard_shortcuts.js.map
+1
-1
priv/static/packs/features/list_editor.js
priv/static/packs/features/list_editor.js
+1
-1
priv/static/packs/features/list_editor.js.map
priv/static/packs/features/list_editor.js.map
+1
-1
priv/static/packs/features/list_timeline.js
priv/static/packs/features/list_timeline.js
+1
-1
priv/static/packs/features/list_timeline.js.map
priv/static/packs/features/list_timeline.js.map
+1
-1
priv/static/packs/features/lists.js
priv/static/packs/features/lists.js
+2
-0
priv/static/packs/features/lists.js.map
priv/static/packs/features/lists.js.map
+1
-0
priv/static/packs/features/mutes.js
priv/static/packs/features/mutes.js
+2
-0
priv/static/packs/features/mutes.js.map
priv/static/packs/features/mutes.js.map
+1
-0
priv/static/packs/features/notifications.js
priv/static/packs/features/notifications.js
+1
-1
priv/static/packs/features/notifications.js.map
priv/static/packs/features/notifications.js.map
+1
-1
priv/static/packs/features/pinned_statuses.js
priv/static/packs/features/pinned_statuses.js
+2
-0
priv/static/packs/features/pinned_statuses.js.map
priv/static/packs/features/pinned_statuses.js.map
+1
-0
priv/static/packs/features/public_timeline.js
priv/static/packs/features/public_timeline.js
+1
-1
priv/static/packs/features/public_timeline.js.map
priv/static/packs/features/public_timeline.js.map
+1
-1
priv/static/packs/features/reblogs.js
priv/static/packs/features/reblogs.js
+1
-1
priv/static/packs/features/reblogs.js.map
priv/static/packs/features/reblogs.js.map
+1
-1
priv/static/packs/features/status.js
priv/static/packs/features/status.js
+1
-1
priv/static/packs/features/status.js.map
priv/static/packs/features/status.js.map
+1
-1
priv/static/packs/locale_ar.js
priv/static/packs/locale_ar.js
+1
-1
priv/static/packs/locale_ar.js.map
priv/static/packs/locale_ar.js.map
+1
-1
priv/static/packs/locale_bg.js
priv/static/packs/locale_bg.js
+1
-1
priv/static/packs/locale_bg.js.map
priv/static/packs/locale_bg.js.map
+1
-1
priv/static/packs/locale_ca.js
priv/static/packs/locale_ca.js
+1
-1
priv/static/packs/locale_ca.js.map
priv/static/packs/locale_ca.js.map
+1
-1
priv/static/packs/locale_co.js
priv/static/packs/locale_co.js
+2
-0
priv/static/packs/locale_co.js.map
priv/static/packs/locale_co.js.map
+1
-0
priv/static/packs/locale_de.js
priv/static/packs/locale_de.js
+1
-1
priv/static/packs/locale_de.js.map
priv/static/packs/locale_de.js.map
+1
-1
priv/static/packs/locale_el.js
priv/static/packs/locale_el.js
+2
-0
priv/static/packs/locale_el.js.map
priv/static/packs/locale_el.js.map
+1
-0
priv/static/packs/locale_en.js
priv/static/packs/locale_en.js
+1
-1
priv/static/packs/locale_en.js.map
priv/static/packs/locale_en.js.map
+1
-1
priv/static/packs/locale_eo.js
priv/static/packs/locale_eo.js
+1
-1
priv/static/packs/locale_eo.js.map
priv/static/packs/locale_eo.js.map
+1
-1
priv/static/packs/locale_es.js
priv/static/packs/locale_es.js
+1
-1
priv/static/packs/locale_es.js.map
priv/static/packs/locale_es.js.map
+1
-1
priv/static/packs/locale_eu.js
priv/static/packs/locale_eu.js
+2
-0
priv/static/packs/locale_eu.js.map
priv/static/packs/locale_eu.js.map
+1
-0
priv/static/packs/locale_fa.js
priv/static/packs/locale_fa.js
+1
-1
priv/static/packs/locale_fa.js.map
priv/static/packs/locale_fa.js.map
+1
-1
priv/static/packs/locale_fi.js
priv/static/packs/locale_fi.js
+1
-1
priv/static/packs/locale_fi.js.map
priv/static/packs/locale_fi.js.map
+1
-1
priv/static/packs/locale_fr.js
priv/static/packs/locale_fr.js
+1
-1
priv/static/packs/locale_fr.js.map
priv/static/packs/locale_fr.js.map
+1
-1
priv/static/packs/locale_gl.js
priv/static/packs/locale_gl.js
+1
-1
priv/static/packs/locale_gl.js.map
priv/static/packs/locale_gl.js.map
+1
-1
priv/static/packs/locale_he.js
priv/static/packs/locale_he.js
+1
-1
priv/static/packs/locale_he.js.map
priv/static/packs/locale_he.js.map
+1
-1
priv/static/packs/locale_hr.js
priv/static/packs/locale_hr.js
+1
-1
priv/static/packs/locale_hr.js.map
priv/static/packs/locale_hr.js.map
+1
-1
priv/static/packs/locale_hu.js
priv/static/packs/locale_hu.js
+1
-1
priv/static/packs/locale_hu.js.map
priv/static/packs/locale_hu.js.map
+1
-1
priv/static/packs/locale_hy.js
priv/static/packs/locale_hy.js
+1
-1
priv/static/packs/locale_hy.js.map
priv/static/packs/locale_hy.js.map
+1
-1
priv/static/packs/locale_id.js
priv/static/packs/locale_id.js
+1
-1
priv/static/packs/locale_id.js.map
priv/static/packs/locale_id.js.map
+1
-1
priv/static/packs/locale_io.js
priv/static/packs/locale_io.js
+1
-1
priv/static/packs/locale_io.js.map
priv/static/packs/locale_io.js.map
+1
-1
priv/static/packs/locale_it.js
priv/static/packs/locale_it.js
+1
-1
priv/static/packs/locale_it.js.map
priv/static/packs/locale_it.js.map
+1
-1
priv/static/packs/locale_ja.js
priv/static/packs/locale_ja.js
+1
-1
priv/static/packs/locale_ja.js.map
priv/static/packs/locale_ja.js.map
+1
-1
priv/static/packs/locale_ko.js
priv/static/packs/locale_ko.js
+1
-1
priv/static/packs/locale_ko.js.map
priv/static/packs/locale_ko.js.map
+1
-1
priv/static/packs/locale_nl.js
priv/static/packs/locale_nl.js
+1
-1
priv/static/packs/locale_nl.js.map
priv/static/packs/locale_nl.js.map
+1
-1
priv/static/packs/locale_no.js
priv/static/packs/locale_no.js
+1
-1
priv/static/packs/locale_no.js.map
priv/static/packs/locale_no.js.map
+1
-1
priv/static/packs/locale_oc.js
priv/static/packs/locale_oc.js
+1
-1
priv/static/packs/locale_oc.js.map
priv/static/packs/locale_oc.js.map
+1
-1
priv/static/packs/locale_pl.js
priv/static/packs/locale_pl.js
+1
-1
priv/static/packs/locale_pl.js.map
priv/static/packs/locale_pl.js.map
+1
-1
priv/static/packs/locale_pt-BR.js
priv/static/packs/locale_pt-BR.js
+1
-1
priv/static/packs/locale_pt-BR.js.map
priv/static/packs/locale_pt-BR.js.map
+1
-1
priv/static/packs/locale_pt.js
priv/static/packs/locale_pt.js
+1
-1
priv/static/packs/locale_pt.js.map
priv/static/packs/locale_pt.js.map
+1
-1
priv/static/packs/locale_ru.js
priv/static/packs/locale_ru.js
+1
-1
priv/static/packs/locale_ru.js.map
priv/static/packs/locale_ru.js.map
+1
-1
priv/static/packs/locale_sk.js
priv/static/packs/locale_sk.js
+1
-1
priv/static/packs/locale_sk.js.map
priv/static/packs/locale_sk.js.map
+1
-1
priv/static/packs/locale_sl.js
priv/static/packs/locale_sl.js
+2
-0
priv/static/packs/locale_sl.js.map
priv/static/packs/locale_sl.js.map
+1
-0
priv/static/packs/locale_sr-Latn.js
priv/static/packs/locale_sr-Latn.js
+1
-1
priv/static/packs/locale_sr-Latn.js.map
priv/static/packs/locale_sr-Latn.js.map
+1
-1
priv/static/packs/locale_sr.js
priv/static/packs/locale_sr.js
+1
-1
priv/static/packs/locale_sr.js.map
priv/static/packs/locale_sr.js.map
+1
-1
priv/static/packs/locale_sv.js
priv/static/packs/locale_sv.js
+1
-1
priv/static/packs/locale_sv.js.map
priv/static/packs/locale_sv.js.map
+1
-1
priv/static/packs/locale_te.js
priv/static/packs/locale_te.js
+2
-0
priv/static/packs/locale_te.js.map
priv/static/packs/locale_te.js.map
+1
-0
priv/static/packs/locale_th.js
priv/static/packs/locale_th.js
+1
-1
priv/static/packs/locale_th.js.map
priv/static/packs/locale_th.js.map
+1
-1
priv/static/packs/locale_tr.js
priv/static/packs/locale_tr.js
+1
-1
priv/static/packs/locale_tr.js.map
priv/static/packs/locale_tr.js.map
+1
-1
priv/static/packs/locale_uk.js
priv/static/packs/locale_uk.js
+1
-1
priv/static/packs/locale_uk.js.map
priv/static/packs/locale_uk.js.map
+1
-1
priv/static/packs/locale_zh-CN.js
priv/static/packs/locale_zh-CN.js
+1
-1
priv/static/packs/locale_zh-CN.js.map
priv/static/packs/locale_zh-CN.js.map
+1
-1
priv/static/packs/locale_zh-HK.js
priv/static/packs/locale_zh-HK.js
+1
-1
priv/static/packs/locale_zh-HK.js.map
priv/static/packs/locale_zh-HK.js.map
+1
-1
priv/static/packs/locale_zh-TW.js
priv/static/packs/locale_zh-TW.js
+1
-1
priv/static/packs/locale_zh-TW.js.map
priv/static/packs/locale_zh-TW.js.map
+1
-1
priv/static/packs/logo-fe5141d38a25f50068b4c69b77ca1ec8.svg
priv/static/packs/logo-fe5141d38a25f50068b4c69b77ca1ec8.svg
+0
-1
priv/static/packs/logo_alt-6090911445f54a587465e41da77a6969.svg
...tatic/packs/logo_alt-6090911445f54a587465e41da77a6969.svg
+0
-1
priv/static/packs/logo_full-96e7a97fe469f75a23a74852b2478fa3.svg
...atic/packs/logo_full-96e7a97fe469f75a23a74852b2478fa3.svg
+0
-1
priv/static/packs/logo_transparent-6900bab180aa3a46c34425e5367a218f.svg
...cks/logo_transparent-6900bab180aa3a46c34425e5367a218f.svg
+0
-1
priv/static/packs/mailer.js
priv/static/packs/mailer.js
+1
-1
priv/static/packs/mailer.js.map
priv/static/packs/mailer.js.map
+1
-1
priv/static/packs/manifest.json
priv/static/packs/manifest.json
+36
-10
priv/static/packs/mastodon-light.css
priv/static/packs/mastodon-light.css
+2
-0
priv/static/packs/mastodon-light.css.map
priv/static/packs/mastodon-light.css.map
+1
-0
priv/static/packs/mastodon-light.js
priv/static/packs/mastodon-light.js
+2
-0
priv/static/packs/mastodon-light.js.map
priv/static/packs/mastodon-light.js.map
+1
-0
priv/static/packs/modals/embed_modal.js
priv/static/packs/modals/embed_modal.js
+2
-0
priv/static/packs/modals/embed_modal.js.map
priv/static/packs/modals/embed_modal.js.map
+1
-0
priv/static/packs/modals/mute_modal.js
priv/static/packs/modals/mute_modal.js
+2
-0
priv/static/packs/modals/mute_modal.js.map
priv/static/packs/modals/mute_modal.js.map
+1
-0
priv/static/packs/modals/onboarding_modal.js
priv/static/packs/modals/onboarding_modal.js
+1
-1
priv/static/packs/modals/onboarding_modal.js.map
priv/static/packs/modals/onboarding_modal.js.map
+1
-1
priv/static/packs/modals/report_modal.js
priv/static/packs/modals/report_modal.js
+2
-0
priv/static/packs/modals/report_modal.js.map
priv/static/packs/modals/report_modal.js.map
+1
-0
priv/static/packs/preview-9a17d32fc48369e8ccd910a75260e67d.jpg
...static/packs/preview-9a17d32fc48369e8ccd910a75260e67d.jpg
+0
-0
priv/static/packs/public.js
priv/static/packs/public.js
+1
-1
priv/static/packs/public.js.map
priv/static/packs/public.js.map
+1
-1
priv/static/packs/share.js
priv/static/packs/share.js
+1
-1
priv/static/packs/share.js.map
priv/static/packs/share.js.map
+1
-1
priv/static/packs/status/media_gallery.js
priv/static/packs/status/media_gallery.js
+1
-1
priv/static/packs/status/media_gallery.js.map
priv/static/packs/status/media_gallery.js.map
+1
-1
priv/static/static/bg.jpg
priv/static/static/bg.jpg
+0
-0
priv/static/static/config.json
priv/static/static/config.json
+2
-1
priv/static/static/css/app.5d0189b6f119febde070b703869bbd06.css
...tatic/static/css/app.5d0189b6f119febde070b703869bbd06.css
+0
-2
priv/static/static/css/app.5d0189b6f119febde070b703869bbd06.css.map
...c/static/css/app.5d0189b6f119febde070b703869bbd06.css.map
+0
-1
priv/static/static/css/app.b76dcba564bc8d13e27c546e95fbb72e.css
...tatic/static/css/app.b76dcba564bc8d13e27c546e95fbb72e.css
+2
-0
priv/static/static/css/app.b76dcba564bc8d13e27c546e95fbb72e.css.map
...c/static/css/app.b76dcba564bc8d13e27c546e95fbb72e.css.map
+1
-0
priv/static/static/font/.config.json.swp
priv/static/static/font/.config.json.swp
+0
-0
priv/static/static/font/LICENSE.txt
priv/static/static/font/LICENSE.txt
+9
-0
priv/static/static/font/config.json
priv/static/static/font/config.json
+15
-3
priv/static/static/font/css/fontello-codes.css
priv/static/static/font/css/fontello-codes.css
+2
-0
priv/static/static/font/css/fontello-embedded.css
priv/static/static/font/css/fontello-embedded.css
+8
-6
priv/static/static/font/css/fontello-ie7-codes.css
priv/static/static/font/css/fontello-ie7-codes.css
+2
-0
priv/static/static/font/css/fontello-ie7.css
priv/static/static/font/css/fontello-ie7.css
+2
-0
priv/static/static/font/css/fontello.css
priv/static/static/font/css/fontello.css
+9
-7
priv/static/static/font/demo.html
priv/static/static/font/demo.html
+12
-10
priv/static/static/font/font/fontello.eot
priv/static/static/font/font/fontello.eot
+0
-0
priv/static/static/font/font/fontello.svg
priv/static/static/font/font/fontello.svg
+34
-30
priv/static/static/font/font/fontello.ttf
priv/static/static/font/font/fontello.ttf
+0
-0
priv/static/static/font/font/fontello.woff
priv/static/static/font/font/fontello.woff
+0
-0
priv/static/static/font/font/fontello.woff2
priv/static/static/font/font/fontello.woff2
+0
-0
priv/static/static/fontold/LICENSE.txt
priv/static/static/fontold/LICENSE.txt
+0
-30
priv/static/static/fontold/README.txt
priv/static/static/fontold/README.txt
+0
-75
priv/static/static/fontold/config.json
priv/static/static/fontold/config.json
+0
-160
priv/static/static/fontold/css/animation.css
priv/static/static/fontold/css/animation.css
+0
-85
priv/static/static/fontold/css/fontello-codes.css
priv/static/static/fontold/css/fontello-codes.css
+0
-26
priv/static/static/fontold/css/fontello-embedded.css
priv/static/static/fontold/css/fontello-embedded.css
+0
-79
priv/static/static/fontold/css/fontello-ie7-codes.css
priv/static/static/fontold/css/fontello-ie7-codes.css
+0
-26
priv/static/static/fontold/css/fontello-ie7.css
priv/static/static/fontold/css/fontello-ie7.css
+0
-37
priv/static/static/fontold/css/fontello.css
priv/static/static/fontold/css/fontello.css
+0
-82
priv/static/static/fontold/demo.html
priv/static/static/fontold/demo.html
+0
-342
priv/static/static/fontold/font/fontello.eot
priv/static/static/fontold/font/fontello.eot
+0
-0
priv/static/static/fontold/font/fontello.svg
priv/static/static/fontold/font/fontello.svg
+0
-60
priv/static/static/fontold/font/fontello.ttf
priv/static/static/fontold/font/fontello.ttf
+0
-0
priv/static/static/fontold/font/fontello.woff
priv/static/static/fontold/font/fontello.woff
+0
-0
priv/static/static/fontold/font/fontello.woff2
priv/static/static/fontold/font/fontello.woff2
+0
-0
priv/static/static/js/app.d3eba781c5f30aabbb47.js
priv/static/static/js/app.d3eba781c5f30aabbb47.js
+9
-0
priv/static/static/js/app.d3eba781c5f30aabbb47.js.map
priv/static/static/js/app.d3eba781c5f30aabbb47.js.map
+1
-0
priv/static/static/js/app.de965bb2a0a8bffbeafa.js
priv/static/static/js/app.de965bb2a0a8bffbeafa.js
+0
-8
priv/static/static/js/app.de965bb2a0a8bffbeafa.js.map
priv/static/static/js/app.de965bb2a0a8bffbeafa.js.map
+0
-1
priv/static/static/js/manifest.004e63f0a7e5719fbbe8.js
priv/static/static/js/manifest.004e63f0a7e5719fbbe8.js
+2
-0
priv/static/static/js/manifest.004e63f0a7e5719fbbe8.js.map
priv/static/static/js/manifest.004e63f0a7e5719fbbe8.js.map
+1
-1
priv/static/static/js/manifest.f2341edd686e54ee9b4a.js
priv/static/static/js/manifest.f2341edd686e54ee9b4a.js
+0
-2
priv/static/static/js/vendor.48cf760f1485c83eb636.js
priv/static/static/js/vendor.48cf760f1485c83eb636.js
+33
-0
priv/static/static/js/vendor.48cf760f1485c83eb636.js.map
priv/static/static/js/vendor.48cf760f1485c83eb636.js.map
+1
-0
priv/static/static/js/vendor.a93310d51acbd9480094.js
priv/static/static/js/vendor.a93310d51acbd9480094.js
+0
-32
priv/static/static/js/vendor.a93310d51acbd9480094.js.map
priv/static/static/js/vendor.a93310d51acbd9480094.js.map
+0
-1
priv/static/static/temp/fontello-a9f33f16.zip
priv/static/static/temp/fontello-a9f33f16.zip
+0
-0
priv/static/static/yeah.png
priv/static/static/yeah.png
+0
-0
priv/static/sw.js
priv/static/sw.js
+2
-1361
test/fixtures/httpoison_mock/7even.json
test/fixtures/httpoison_mock/7even.json
+1
-0
test/fixtures/httpoison_mock/peertube.moe-vid.json
test/fixtures/httpoison_mock/peertube.moe-vid.json
+1
-0
test/fixtures/httpoison_mock/puckipedia.com.json
test/fixtures/httpoison_mock/puckipedia.com.json
+1
-0
test/fixtures/kroeg-post-activity.json
test/fixtures/kroeg-post-activity.json
+50
-0
test/fixtures/test.txt
test/fixtures/test.txt
+1
-0
test/formatter_test.exs
test/formatter_test.exs
+37
-2
test/support/factory.ex
test/support/factory.ex
+20
-0
test/support/httpoison_mock.ex
test/support/httpoison_mock.ex
+24
-0
test/upload_test.exs
test/upload_test.exs
+26
-0
test/web/activity_pub/activity_pub_controller_test.exs
test/web/activity_pub/activity_pub_controller_test.exs
+26
-0
test/web/activity_pub/activity_pub_test.exs
test/web/activity_pub/activity_pub_test.exs
+9
-0
test/web/activity_pub/transmogrifier_test.exs
test/web/activity_pub/transmogrifier_test.exs
+21
-0
test/web/mastodon_api/account_view_test.exs
test/web/mastodon_api/account_view_test.exs
+22
-3
test/web/twitter_api/representers/object_representer_test.exs
.../web/twitter_api/representers/object_representer_test.exs
+4
-2
test/web/twitter_api/twitter_api_test.exs
test/web/twitter_api/twitter_api_test.exs
+65
-1
test/web/twitter_api/views/user_view_test.exs
test/web/twitter_api/views/user_view_test.exs
+36
-4
No files found.
config/config.exs
View file @
0f5bff8c
...
...
@@ -16,6 +16,8 @@
config
:pleroma
,
:emoji
,
shortcode_globs:
[
"/emoji/custom/**/*.png"
]
config
:pleroma
,
:uri_schemes
,
additionnal_schemes:
[]
# Configures the endpoint
config
:pleroma
,
Pleroma
.
Web
.
Endpoint
,
url:
[
host:
"localhost"
],
...
...
@@ -71,11 +73,8 @@
redirect_root_no_login:
"/main/all"
,
redirect_root_login:
"/main/friends"
,
show_instance_panel:
true
,
show_who_to_follow_panel:
false
,
who_to_follow_provider:
"https://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-osa-api.cgi?{{host}}+{{user}}"
,
who_to_follow_link:
"https://vinayaka.distsn.org/?{{host}}+{{user}}"
,
scope_options_enabled:
false
scope_options_enabled:
false
,
collapse_message_with_subject:
false
config
:pleroma
,
:activitypub
,
accept_blocks:
true
,
...
...
@@ -112,6 +111,13 @@
ip:
{
0
,
0
,
0
,
0
},
port:
9999
config
:pleroma
,
:suggestions
,
enabled:
false
,
third_party_engine:
"http://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-suggestions-api.cgi?{{host}}+{{user}}"
,
timeout:
300_000
,
web:
"https://vinayaka.distsn.org/?{{host}}+{{user}}"
# Import environment specific config. This must remain at the bottom
# of this file so it overrides the configuration defined above.
import_config
"
#{
Mix
.
env
()
}
.exs"
installation/caddyfile-pleroma.example
View file @
0f5bff8c
social.domain.tld {
tls user@domain.tld
log /var/log/caddy/pleroma_access.log
errors /var/log/caddy/pleroma_error.log
log /var/log/caddy/pleroma.log
gzip
proxy / localhost:4000 {
websocket
transparent
}
tls user@domain.tld {
# Remove the rest of the lines in here, if you want to support older devices
key_type p256
ciphers ECDHE-ECDSA-WITH-CHACHA20-POLY1305 ECDHE-RSA-WITH-CHACHA20-POLY1305 ECDHE-ECDSA-AES256-GCM-SHA384 ECDHE-RSA-AES256-GCM-SHA384 ECDHE-ECDSA-AES128-GCM-SHA256 ECDHE-RSA-AES128-GCM-SHA256
}
header / {
X-XSS-Protection "1; mode=block"
X-Frame-Options "DENY"
X-Content-Type-Options "nosniff"
Referrer-Policy "same-origin"
Strict-Transport-Security "max-age=31536000; includeSubDomains;"
Expect-CT "enforce, max-age=2592000"
}
# If you do not want remote frontends to be able to access your Pleroma backend server, remove these lines.
# If you want to allow all origins access, remove the origin lines.
# To use this directive, you need the http.cors plugin for Caddy.
cors / {
origin https://halcyon.domain.tld
origin https://pinafore.domain.tld
...
...
@@ -10,9 +34,13 @@ social.domain.tld {
allowed_headers Authorization,Content-Type,Idempotency-Key
exposed_headers Link,X-RateLimit-Reset,X-RateLimit-Limit,X-RateLimit-Remaining,X-Request-Id
}
# Stop removing lines here.
proxy / localhost:4000 {
websocket
transparent
# If you do not want to use the mediaproxy function, remove these lines.
# To use this directive, you need the http.cache plugin for Caddy.
cache {
match_path /proxy
default_max_age 720m
}
# Stop removing lines here.
}
installation/init.d/pleroma
0 → 100755
View file @
0f5bff8c
#!/sbin/openrc-run
# Requires OpenRC >= 0.35
directory=~pleroma/pleroma
command=/usr/bin/mix
command_args="phx.server"
command_user=pleroma:pleroma
command_background=1
export PORT=4000
export MIX_ENV=prod
# Ask process to terminate within 30 seconds, otherwise kill it
retry="SIGTERM/30 SIGKILL/5"
pidfile="/var/run/pleroma.pid"
depend() {
need nginx postgresql
}
\ No newline at end of file
lib/mix/tasks/generate_invite_token.ex
0 → 100644
View file @
0f5bff8c
defmodule
Mix
.
Tasks
.
GenerateInviteToken
do
use
Mix
.
Task
@shortdoc
"Generate invite token for user"
def
run
([])
do
Mix
.
Task
.
run
(
"app.start"
)
with
{
:ok
,
token
}
<-
Pleroma
.
UserInviteToken
.
create_token
()
do
IO
.
puts
(
"Generated user invite token"
)
IO
.
puts
(
"Url:
#{
Pleroma
.
Web
.
Router
.
Helpers
.
redirect_url
(
Pleroma
.
Web
.
Endpoint
,
:registration_page
,
token
.
token
)
}
"
)
else
_
->
IO
.
puts
(
"Error creating token"
)
end
end
end
lib/pleroma/formatter.ex
View file @
0f5bff8c
...
...
@@ -16,7 +16,7 @@ def parse_tags(text, data \\ %{}) do
def
parse_mentions
(
text
)
do
# Modified from https://www.w3.org/TR/html5/forms.html#valid-e-mail-address
regex
=
~r/@[a-zA-Z0-9.!#$%&'*+\/
=
?^
_
`
{
|
}
~
-
]
+
@
?[
a
-
zA
-
Z0
-
9
](
?:
[
a
-
zA
-
Z0
-
9
-
]{
0
,
61
}[
a
-
zA
-
Z0
-
9
])
?(?:
\
.
[
a
-
zA
-
Z0
-
9
](
?:
[
a
-
zA
-
Z0
-
9
-
]{
0
,
61
}[
a
-
zA
-
Z0
-
9
])
?)
*/
u
~r/@[a-zA-Z0-9.!#$%&'*+\/
=
?^
_
`
{
|
}
~
-
]
*
@
?[
a
-
zA
-
Z0
-
9
](
?:
[
a
-
zA
-
Z0
-
9
-
]{
0
,
61
}[
a
-
zA
-
Z0
-
9
])
?(?:
\
.
[
a
-
zA
-
Z0
-
9
](
?:
[
a
-
zA
-
Z0
-
9
-
]{
0
,
61
}[
a
-
zA
-
Z0
-
9
])
?)
*/
u
Regex
.
scan
(
regex
,
text
)
|>
List
.
flatten
()
...
...
@@ -165,8 +165,29 @@ def get_custom_emoji() do
@emoji
end
@link_regex
~r/https?:\/
\
/
[\
w
\
.
\
/
?=
\
-
#\+%&@~'\(\):]+[\w\/]/u
@link_regex
~r/[0-9a-z+\-\.]+:[0-9a-z$-_.+!*'(),]+/ui
# IANA got a list https://www.iana.org/assignments/uri-schemes/ but
# Stuff like ipfs isn’t in it
# There is very niche stuff
@uri_schemes
[
"https://"
,
"http://"
,
"dat://"
,
"dweb://"
,
"gopher://"
,
"ipfs://"
,
"ipns://"
,
"irc:"
,
"ircs:"
,
"magnet:"
,
"mailto:"
,
"mumble:"
,
"ssb://"
,
"xmpp:"
]
# TODO: make it use something other than @link_regex
def
html_escape
(
text
)
do
Regex
.
split
(
@link_regex
,
text
,
include_captures:
true
)
|>
Enum
.
map_every
(
2
,
fn
chunk
->
...
...
@@ -176,11 +197,18 @@ def html_escape(text) do
|>
Enum
.
join
(
""
)
end
@doc
"changes
http:... link
s to html links"
@doc
"changes
scheme:... url
s to html links"
def
add_links
({
subs
,
text
})
do
additionnal_schemes
=
Application
.
get_env
(
:pleroma
,
:uri_schemes
,
[])
|>
Keyword
.
get
(
:additionnal_schemes
,
[])
links
=
Regex
.
scan
(
@link_regex
,
text
)
|>
Enum
.
map
(
fn
[
url
]
->
{
Ecto
.
UUID
.
generate
(),
url
}
end
)
text
|>
String
.
split
([
" "
,
"
\t
"
,
"<br>"
])
|>
Enum
.
filter
(
fn
word
->
String
.
starts_with?
(
word
,
@uri_schemes
++
additionnal_schemes
)
end
)
|>
Enum
.
filter
(
fn
word
->
Regex
.
match?
(
@link_regex
,
word
)
end
)
|>
Enum
.
map
(
fn
url
->
{
Ecto
.
UUID
.
generate
(),
url
}
end
)
|>
Enum
.
sort_by
(
fn
{
_
,
url
}
->
-
String
.
length
(
url
)
end
)
uuid_text
=
...
...
@@ -244,8 +272,8 @@ def add_hashtag_links({subs, text}, tags) do
subs
=
subs
++
Enum
.
map
(
tags
,
fn
{
_
,
tag
,
uuid
}
->
url
=
"<a href='
#{
Pleroma
.
Web
.
base_url
()
}
/tag/
#{
tag
}
' rel='tag'>#
#{
tag
}
</a>"
Enum
.
map
(
tags
,
fn
{
tag_text
,
tag
,
uuid
}
->
url
=
"<a href='
#{
Pleroma
.
Web
.
base_url
()
}
/tag/
#{
tag
}
' rel='tag'>
#
{
tag_text
}
</a>"
{
uuid
,
url
}
end
)
...
...
lib/pleroma/gopher/server.ex
View file @
0f5bff8c
...
...
@@ -54,7 +54,7 @@ def info(text) do
String
.
split
(
text
,
"
\r
"
)
|>
Enum
.
map
(
fn
text
->
"i
#{
text
}
\t
fake\(NULL)
\t
0
\r\n
"
"i
#{
text
}
\t
fake
\
t
(NULL)
\t
0
\r\n
"
end
)
|>
Enum
.
join
(
""
)
end
...
...
@@ -77,14 +77,14 @@ def render_activities(activities) do
link
(
"Post #
#{
activity
.
id
}
by
#{
user
.
nickname
}
"
,
"/notices/
#{
activity
.
id
}
"
)
<>
info
(
"
#{
like_count
}
likes,
#{
announcement_count
}
repeats"
)
<>
"
\r\n
"
<>
"
i
\t
fake
\t
(NULL)
\t
0
\r\n
"
<>
info
(
HtmlSanitizeEx
.
strip_tags
(
String
.
replace
(
activity
.
data
[
"object"
][
"content"
],
"<br>"
,
"
\r
"
)
)
)
end
)
|>
Enum
.
join
(
"
\r\n
"
)
|>
Enum
.
join
(
"
i
\t
fake
\t
(NULL)
\t
0
\r\n
"
)
end
def
response
(
""
)
do
...
...
lib/pleroma/http/http.ex
View file @
0f5bff8c
defmodule
Pleroma
.
HTTP
do
use
HTTPoison
.
Base
require
HTTPoison
def
request
(
method
,
url
,
body
\\
""
,
headers
\\
[],
options
\\
[])
do
options
=
process_request_options
(
options
)
|>
process_sni_options
(
url
)
HTTPoison
.
request
(
method
,
url
,
body
,
headers
,
options
)
end
defp
process_sni_options
(
options
,
url
)
do
uri
=
URI
.
parse
(
url
)
host
=
uri
.
host
|>
to_charlist
()
case
uri
.
scheme
do
"https"
->
options
++
[
ssl:
[
server_name_indication:
host
]]
_
->
options
end
end
def
process_request_options
(
options
)
do
config
=
Application
.
get_env
(
:pleroma
,
:http
,
[])
...
...
@@ -10,4 +28,9 @@ def process_request_options(options) do
_
->
options
++
[
proxy:
proxy
]
end
end
def
get
(
url
,
headers
\\
[],
options
\\
[]),
do
:
request
(
:get
,
url
,
""
,
headers
,
options
)
def
post
(
url
,
body
,
headers
\\
[],
options
\\
[]),
do
:
request
(
:post
,
url
,
body
,
headers
,
options
)
end
lib/pleroma/upload.ex
View file @
0f5bff8c
...
...
@@ -124,20 +124,20 @@ defp get_name(file, uuid, type, should_dedupe) do
if
should_dedupe
do
create_name
(
uuid
,
List
.
last
(
String
.
split
(
file
.
filename
,
"."
)),
type
)
else
unless
String
.
contains?
(
file
.
filename
,
"."
)
do
case
type
do
"image/png"
->
file
.
filename
<>
".png"
"image/jpeg"
->
file
.
filename
<>
".jpg"
"image/gif"
->
file
.
filename
<>
".gif"
"video/webm"
->
file
.
filename
<>
".webm"
"video/mp4"
->
file
.
filename
<>
".mp4"
"audio/mpeg"
->
file
.
filename
<>
".mp3"
"audio/ogg"
->
file
.
filename
<>
".ogg"
"audio/wav"
->
file
.
filename
<>
".wav"
_
->
file
.
filename
parts
=
String
.
split
(
file
.
filename
,
"."
)
new_filename
=
if
length
(
parts
)
>
1
do
Enum
.
drop
(
parts
,
-
1
)
|>
Enum
.
join
(
"."
)
else
Enum
.
join
(
parts
)
end
else
file
.
filename
case
type
do
"application/octet-stream"
->
file
.
filename
"audio/mpeg"
->
new_filename
<>
".mp3"
"image/jpeg"
->
new_filename
<>
".jpg"
_
->
Enum
.
join
([
new_filename
,
String
.
split
(
type
,
"/"
)
|>
List
.
last
()],
"."
)
end
end
end
...
...
lib/pleroma/user.ex
View file @
0f5bff8c
...
...
@@ -398,6 +398,7 @@ def get_follow_requests(%User{} = user) do
Enum
.
map
(
reqs
,
fn
req
->
req
.
actor
end
)
|>
Enum
.
uniq
()
|>
Enum
.
map
(
fn
ap_id
->
get_by_ap_id
(
ap_id
)
end
)
|>
Enum
.
filter
(
fn
u
->
!following?
(
u
,
user
)
end
)
{
:ok
,
users
}
end
...
...
lib/pleroma/user_invite_token.ex
0 → 100644
View file @
0f5bff8c
defmodule
Pleroma
.
UserInviteToken
do
use
Ecto
.
Schema
import
Ecto
.
Changeset
alias
Pleroma
.
{
User
,
UserInviteToken
,
Repo
}
schema
"user_invite_tokens"
do
field
(
:token
,
:string
)
field
(
:used
,
:boolean
,
default:
false
)
timestamps
()
end
def
create_token
do
token
=
:crypto
.
strong_rand_bytes
(
32
)
|>
Base
.
url_encode64
()
token
=
%
UserInviteToken
{
used:
false
,
token:
token
}
Repo
.
insert
(
token
)
end
def
used_changeset
(
struct
)
do
struct
|>
cast
(%{},
[])
|>
put_change
(
:used
,
true
)
end
def
mark_as_used
(
token
)
do
with
%{
used:
false
}
=
token
<-
Repo
.
get_by
(
UserInviteToken
,
%{
token:
token
}),
{
:ok
,
token
}
<-
Repo
.
update
(
used_changeset
(
token
))
do
{
:ok
,
token
}
else
_e
->
{
:error
,
token
}
end
end
end
lib/pleroma/web/activity_pub/activity_pub.ex
View file @
0f5bff8c
...
...
@@ -576,7 +576,7 @@ def user_data_from_user_object(data) do
def
fetch_and_prepare_user_from_ap_id
(
ap_id
)
do
with
{
:ok
,
%{
status_code:
200
,
body:
body
}}
<-
@httpoison
.
get
(
ap_id
,
Accept:
"application/activity+json"
),
@httpoison
.
get
(
ap_id
,
[
Accept:
"application/activity+json"
],
follow_redirect:
true
),
{
:ok
,
data
}
<-
Jason
.
decode
(
body
)
do
user_data_from_user_object
(
data
)
else
...
...
lib/pleroma/web/activity_pub/transmogrifier.ex
View file @
0f5bff8c
...
...
@@ -18,12 +18,16 @@ def get_actor(%{"actor" => actor}) when is_binary(actor) do
end
def
get_actor
(%{
"actor"
=>
actor
})
when
is_list
(
actor
)
do
Enum
.
at
(
actor
,
0
)
if
is_binary
(
Enum
.
at
(
actor
,
0
))
do
Enum
.
at
(
actor
,
0
)
else
Enum
.
find
(
actor
,
fn
%{
"type"
=>
type
}
->
type
==
"Person"
end
)
|>
Map
.
get
(
"id"
)
end
end
def
get_actor
(%{
"actor"
=>
actor_list
})
do
Enum
.
find
(
actor_list
,
fn
%{
"type"
=>
type
}
->
type
==
"Person"
end
)
|>
Map
.
get
(
"id"
)
def
get_actor
(%{
"actor"
=>
actor
})
when
is_map
(
actor
)
do
actor
[
"id"
]
end
@doc
"""
...
...
@@ -38,6 +42,25 @@ def fix_object(object) do
|>
fix_emoji
|>
fix_tag
|>
fix_content_map
|>
fix_likes
|>
fix_addressing
end
def
fix_addressing_list
(
map
,
field
)
do
if
is_binary
(
map
[
field
])
do
map
|>
Map
.
put
(
field
,
[
map
[
field
]])
else
map
end
end
def
fix_addressing
(
map
)
do
map
|>
fix_addressing_list
(
"to"
)
|>
fix_addressing_list
(
"cc"
)
|>
fix_addressing_list
(
"bto"
)
|>
fix_addressing_list
(
"bcc"
)
end
def
fix_actor
(%{
"attributedTo"
=>
actor
}
=
object
)
do
...
...
@@ -45,6 +68,20 @@ def fix_actor(%{"attributedTo" => actor} = object) do
|>
Map
.
put
(
"actor"
,
get_actor
(%{
"actor"
=>
actor
}))
end
def
fix_likes
(%{
"likes"
=>
likes
}
=
object
)
when
is_bitstring
(
likes
)
do
# Check for standardisation
# This is what Peertube does
# curl -H 'Accept: application/activity+json' $likes | jq .totalItems
object
|>
Map
.
put
(
"likes"
,
[])
|>
Map
.
put
(
"like_count"
,
0
)
end
def
fix_likes
(
object
)
do
object
end
def
fix_in_reply_to
(%{
"inReplyTo"
=>
in_reply_to_id
}
=
object
)
when
not
is_nil
(
in_reply_to_id
)
do
case
ActivityPub
.
fetch_object_from_id
(
in_reply_to_id
)
do
...
...
@@ -72,8 +109,11 @@ def fix_in_reply_to(%{"inReplyTo" => in_reply_to_id} = object)
def
fix_in_reply_to
(
object
),
do
:
object
def
fix_context
(
object
)
do
context
=
object
[
"context"
]
||
object
[
"conversation"
]
||
Utils
.
generate_context_id
()
object
|>
Map
.
put
(
"context"
,
object
[
"conversation"
])
|>
Map
.
put
(
"context"
,
context
)
|>
Map
.
put
(
"conversation"
,
context
)
end
def
fix_attachments
(
object
)
do
...
...
@@ -137,13 +177,22 @@ def fix_content_map(%{"contentMap" => content_map} = object) do
def
fix_content_map
(
object
),
do
:
object
# disallow objects with bogus IDs
def
handle_incoming
(%{
"id"
=>
nil
}),
do
:
:error
def
handle_incoming
(%{
"id"
=>
""
}),
do
:
:error
# length of https:// = 8, should validate better, but good enough for now.
def
handle_incoming
(%{
"id"
=>
id
})
when
not
(
is_binary
(
id
)
and
length
(
id
)
>
8
),
do
:
:error
# TODO: validate those with a Ecto scheme
# - tags
# - emoji
def
handle_incoming
(%{
"type"
=>
"Create"
,
"object"
=>
%{
"type"
=>
objtype
}
=
object
}
=
data
)
when
objtype
in
[
"Article"
,
"Note"
]
do
when
objtype
in
[
"Article"
,
"Note"
,
"Video"
]
do
actor
=
get_actor
(
data
)
data
=
Map
.
put
(
data
,
"actor"
,
actor
)
data
=
Map
.
put
(
data
,
"actor"
,
actor
)
|>
fix_addressing
with
nil
<-
Activity
.
get_create_activity_by_object_ap_id
(
object
[
"id"
]),
%
User
{}
=
user
<-
User
.
get_or_fetch_by_ap_id
(
data
[
"actor"
])
do
...
...
lib/pleroma/web/activity_pub/utils.ex
View file @
0f5bff8c
...
...
@@ -128,7 +128,7 @@ def lazy_put_object_defaults(map, activity \\ %{}) do
Inserts a full object if it is contained in an activity.
"""
def
insert_full_object
(%{
"object"
=>
%{
"type"
=>
type
}
=
object_data
})
when
is_map
(
object_data
)
and
type
in
[
"Article"
,
"Note"
]
do
when
is_map
(
object_data
)
and
type
in
[
"Article"
,
"Note"
,
"Video"
]
do
with
{
:ok
,
_
}
<-
Object
.
create
(
object_data
)
do
:ok
end
...
...
@@ -204,13 +204,17 @@ def update_likes_in_object(likes, object) do
end
def
add_like_to_object
(%
Activity
{
data:
%{
"actor"
=>
actor
}},
object
)
do
with
likes
<-
[
actor
|
object
.
data
[
"likes"
]
||
[]]
|>
Enum
.
uniq
()
do
likes
=
if
is_list
(
object
.
data
[
"likes"
]),
do
:
object
.
data
[
"likes"
],
else
:
[]
with
likes
<-
[
actor
|
likes
]
|>
Enum
.
uniq
()
do
update_likes_in_object
(
likes
,
object
)
end
end
def
remove_like_from_object
(%
Activity
{
data:
%{
"actor"
=>
actor
}},
object
)
do
with
likes
<-
(
object
.
data
[
"likes"
]
||
[])
|>
List
.
delete
(
actor
)
do
likes
=
if
is_list
(
object
.
data
[
"likes"
]),
do
:
object
.
data
[
"likes"
],
else
:
[]
with
likes
<-
likes
|>
List
.
delete
(
actor
)
do
update_likes_in_object
(
likes
,
object
)
end
end
...
...
@@ -380,7 +384,10 @@ def add_announce_to_object(
},
object
)
do
with
announcements
<-
[
actor
|
object
.
data
[
"announcements"
]
||
[]]
|>
Enum
.
uniq
()
do
announcements
=
if
is_list
(
object
.
data
[
"announcements"
]),
do
:
object
.
data
[
"announcements"
],
else
:
[]
with
announcements
<-
[
actor
|
announcements
]
|>
Enum
.
uniq
()
do
update_element_in_object
(
"announcement"
,
announcements
,
object
)
end
end
...
...
@@ -388,7 +395,10 @@ def add_announce_to_object(
def
add_announce_to_object
(
_
,
object
),
do
:
{
:ok
,
object
}
def
remove_announce_from_object
(%
Activity
{
data:
%{
"actor"
=>
actor
}},
object
)
do
with
announcements
<-
(
object
.
data
[
"announcements"
]
||
[])
|>
List
.
delete
(
actor
)
do