Merge branch 'develop' into 'edits'

# Conflicts:
#   priv/static/schemas/litepub-0.1.jsonld
This commit is contained in:
marcin mikołajczak 2022-09-03 14:14:25 +00:00
commit 0312f6770c
170 changed files with 845 additions and 3900 deletions

View file

@ -1 +0,0 @@
https://github.com/hashnuke/heroku-buildpack-elixir

View file

@ -9,3 +9,65 @@ test/
# Required to get version
!.git
# App artifacts
/_build
/db
/deps
/*.ez
/test/instance
/test/uploads
/.elixir_ls
/test/fixtures/DSCN0010_tmp.jpg
/test/fixtures/test_tmp.txt
/test/fixtures/image_tmp.jpg
/test/tmp/
/test/frontend_static_test/
/doc
/instance
/priv/ssh_keys
# Prevent committing custom emojis
/priv/static/emoji/custom/*
# Generated on crash by the VM
erl_crash.dump
# Files matching config/*.secret.exs pattern contain sensitive
# data and you should not commit them into version control.
#
# Alternatively, you may comment the line below and commit the
# secrets files as long as you replace their contents by environment
# variables.
/config/*.secret.exs
/config/generated_config.exs
/config/runtime.exs
/config/*.env
# Database setup file, some may forget to delete it
/config/setup_db*.psql
# Whitelist Landing FE
!/instance/static/frontends/landing-fe/vendor/**
.DS_Store
.env
# Editor config
/.vscode/
# Prevent committing docs files
/priv/static/doc/*
docs/generated_config.md
# Code test coverage
/cover
/Elixir.*.coverdata
.idea
pleroma.iml
# Editor temp files
/*~
/*#

3
.gitignore vendored
View file

@ -36,9 +36,6 @@ erl_crash.dump
# Database setup file, some may forget to delete it
/config/setup_db*.psql
# Whitelist Landing FE
!/instance/static/frontends/landing-fe/vendor/**
.DS_Store
.env

View file

@ -6,6 +6,9 @@ variables: &global_variables
POSTGRES_PASSWORD: postgres
DB_HOST: postgres
MIX_ENV: test
# Needed for Dokku deployment.
# https://github.com/dokku/dokku/issues/2514#issuecomment-616775470
GIT_DEPTH: 0
cache: &global_cache_policy
key:
@ -88,7 +91,6 @@ unit-testing:
unit-testing-erratic:
stage: test
retry: 2
allow_failure: true
only:
changes: *build_changes_policy
@ -187,34 +189,27 @@ docs-deploy:
- apk add curl
script:
- curl -X POST -F"token=$DOCS_PIPELINE_TRIGGER" -F'ref=master' -F"variables[BRANCH]=$CI_COMMIT_REF_NAME" https://git.pleroma.social/api/v4/projects/673/trigger/pipeline
# Deploy with Dokku
# https://github.com/dokku/gitlab-ci
# https://github.com/dokku/ci-docker-image
review_app:
image: alpine:3.9
image: dokku/ci-docker-image
stage: deploy
before_script:
- apk update && apk add openssh-client git
when: manual
environment:
name: review/$CI_COMMIT_REF_NAME
url: https://$CI_ENVIRONMENT_SLUG.pleroma.online/
on_stop: stop_review_app
url: https://$CI_ENVIRONMENT_SLUG.dokku.soapbox.pub
# on_stop: stop_review_app
only:
- branches
except:
- master
- develop
script:
- echo "$CI_ENVIRONMENT_SLUG"
- mkdir -p ~/.ssh
- eval $(ssh-agent -s)
- echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
- ssh-keyscan -H "pleroma.online" >> ~/.ssh/known_hosts
- (ssh -t dokku@pleroma.online -- apps:create "$CI_ENVIRONMENT_SLUG") || true
- (ssh -t dokku@pleroma.online -- git:set "$CI_ENVIRONMENT_SLUG" keep-git-dir true) || true
- ssh -t dokku@pleroma.online -- config:set "$CI_ENVIRONMENT_SLUG" APP_NAME="$CI_ENVIRONMENT_SLUG" APP_HOST="$CI_ENVIRONMENT_SLUG.pleroma.online" MIX_ENV=dokku
- (ssh -t dokku@pleroma.online -- postgres:create $(echo $CI_ENVIRONMENT_SLUG | sed -e 's/-/_/g')_db) || true
- (ssh -t dokku@pleroma.online -- postgres:link $(echo $CI_ENVIRONMENT_SLUG | sed -e 's/-/_/g')_db "$CI_ENVIRONMENT_SLUG") || true
- (ssh -t dokku@pleroma.online -- certs:add "$CI_ENVIRONMENT_SLUG" /home/dokku/server.crt /home/dokku/server.key) || true
- git push -f dokku@pleroma.online:$CI_ENVIRONMENT_SLUG $CI_COMMIT_SHA:refs/heads/master
variables:
GIT_REMOTE_URL: ssh://dokku@$DOKKU_HOST/$CI_ENVIRONMENT_SLUG
script: dokku-deploy
after_script: [dokku-unlock]
before_script: []
allow_failure: true
spec-deploy:
stage: deploy

View file

@ -13,6 +13,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
### Changed
- Allow users to remove their emails if instance does not need email to register
- Uploadfilter `Pleroma.Upload.Filter.Exiftool` has been renamed to `Pleroma.Upload.Filter.Exiftool.StripLocation`
- Updated the recommended pleroma.vcl configuration for Varnish to target Varnish 7.0+
### Added
- `activeMonth` and `activeHalfyear` fields in NodeInfo usage.users object
@ -48,6 +49,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- Fixed crash when pinned_objects is nil
- Fixed slow timelines when there are a lot of deactivated users
- Fixed account deletion API
- Fixed lowercase HTTP HEAD method in the Media Proxy Preview code
### Removed

View file

@ -1,6 +1,8 @@
FROM ubuntu:22.04 as build
ENV MIX_ENV=prod
ARG MIX_ENV=prod \
OAUTH_CONSUMER_STRATEGIES="twitter facebook google microsoft slack github keycloak:ueberauth_keycloak_strategy"
WORKDIR /src
RUN apt-get update &&\
@ -24,8 +26,8 @@ ARG DEBIAN_FRONTEND="noninteractive"
ENV TZ="Etc/UTC"
LABEL maintainer="hello@soapbox.pub" \
org.opencontainers.image.title="soapbox-be" \
org.opencontainers.image.description="Soapbox BE for Docker" \
org.opencontainers.image.title="rebased" \
org.opencontainers.image.description="Rebased" \
org.opencontainers.image.authors="hello@soapbox.pub" \
org.opencontainers.image.vendor="soapbox.pub" \
org.opencontainers.image.documentation="https://gitlab.com/soapbox-pub/soapbox-be" \
@ -53,6 +55,4 @@ COPY --from=build --chown=pleroma:0 /src/release ${HOME}
COPY ./config/docker.exs /etc/pleroma/config.exs
COPY ./docker-entrypoint.sh ${HOME}
EXPOSE 4000
ENTRYPOINT ["/opt/pleroma/docker-entrypoint.sh"]

View file

@ -1,16 +1,16 @@
# Soapbox BE
# Rebased
![Soapbox BE](https://gitlab.com/soapbox-pub/soapbox-be/uploads/288bc05ba65e60970ffddd37d58f7c21/be-1-0-thumb.png)
![Rebased](rebased.png)
**Soapbox BE** is the preferred backend for Soapbox.
It is based on [Pleroma](https://pleroma.social/).
**Rebased** is a Fediverse backend written in Elixir.
It's compatible with the Mastodon API and is the recommended backend for Soapbox.
## Your social media server
Soapbox empowers people to take control of their social media experience.
Rebased empowers people to take control of their social media experience.
Hosting your own server means that *you* get to decide the rules.
Soapbox connects to over 4,000 other servers on the Fediverse.
Rebased connects to over 4,000 other servers on the Fediverse.
It is designed to spread your message far and wide, while being resilient to deplatforming.
## Installation
@ -19,15 +19,15 @@ See [the installation guide](https://soapbox.pub/install/).
## License
Soapbox is free software: you can redistribute it and/or modify
Rebased is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Soapbox is distributed in the hope that it will be useful,
Rebased is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with Soapbox. If not, see <https://www.gnu.org/licenses/>.
along with Rebased. If not, see <https://www.gnu.org/licenses/>.

13
app.json Normal file
View file

@ -0,0 +1,13 @@
{
"name": "Rebased",
"description": "Rebased, the recommended backend for Soapbox written in Elixir.",
"keywords": [
"fediverse"
],
"website": "https://soapbox.pub",
"dokku": {
"plugins": [
"postgres"
]
}
}

View file

@ -189,7 +189,7 @@
description: "Pleroma: An efficient and flexible fediverse server",
short_description: "",
background_image: "/images/city.jpg",
instance_thumbnail: "/instance/thumbnail.jpeg",
instance_thumbnail: "/instance/thumbnail.png",
limit: 5_000,
description_limit: 5_000,
remote_limit: 100_000,
@ -629,7 +629,14 @@
for strategy <- oauth_consumer_strategies do
strategy_module_name = "Elixir.Ueberauth.Strategy.#{String.capitalize(strategy)}"
strategy_module = String.to_atom(strategy_module_name)
{String.to_atom(strategy), {strategy_module, [callback_params: ["state"]]}}
params =
case strategy do
"keycloak" -> [uid_field: :email, default_scope: "openid profile"]
_ -> [callback_params: ["state"]]
end
{String.to_atom(strategy), {strategy_module, params}}
end
config :ueberauth,
@ -752,7 +759,7 @@
"name" => "fedi-fe",
"git" => "https://git.pleroma.social/pleroma/fedi-fe",
"build_url" =>
"https://git.pleroma.social/pleroma/fedi-fe/-/jobs/artifacts/${ref}/download?job=build",
"https://git.pleroma.social/pleroma/fedi-fe/-/jobs/artifacts/${ref}/download?job=build_release",
"ref" => "master",
"custom-http-headers" => [
{"service-worker-allowed", "/"}
@ -772,6 +779,14 @@
"https://gitlab.com/soapbox-pub/soapbox-fe/-/jobs/artifacts/${ref}/download?job=build-production",
"ref" => "develop",
"build_dir" => "static"
},
"glitch-lily" => %{
"name" => "glitch-lily",
"git" => "https://lily-is.land/infra/glitch-lily",
"build_url" =>
"https://lily-is.land/infra/glitch-lily/-/jobs/artifacts/${ref}/download?job=build",
"ref" => "servant",
"build_dir" => "public"
}
}

View file

@ -2,23 +2,28 @@
config :pleroma, Pleroma.Web.Endpoint,
url: [host: System.get_env("DOMAIN", "localhost"), scheme: "https", port: 443],
http: [ip: {0, 0, 0, 0}, port: 4000]
http: [ip: {0, 0, 0, 0}, port: System.get_env("PORT", "5000")]
config :pleroma, :instance,
name: System.get_env("INSTANCE_NAME", "Pleroma"),
name: System.get_env("INSTANCE_NAME", "Soapbox"),
email: System.get_env("ADMIN_EMAIL"),
notify_email: System.get_env("NOTIFY_EMAIL"),
limit: 5000,
registrations_open: false,
healthcheck: true
config :pleroma, Pleroma.Repo,
adapter: Ecto.Adapters.Postgres,
username: System.get_env("DB_USER", "pleroma"),
password: System.fetch_env!("DB_PASS"),
database: System.get_env("DB_NAME", "pleroma"),
hostname: System.get_env("DB_HOST", "db"),
pool_size: 10
# Prefer `DATABASE_URL` if set, otherwise use granular env.
case System.get_env("DATABASE_URL") do
database_url when is_binary(database_url) ->
config :pleroma, Pleroma.Repo, url: database_url
_ ->
config :pleroma, Pleroma.Repo,
username: System.get_env("DB_USER", "postgres"),
password: System.get_env("DB_PASS", "postgres"),
database: System.get_env("DB_NAME", "postgres"),
hostname: System.get_env("DB_HOST", "db")
end
# Configure web push notifications
config :web_push_encryption, :vapid_details, subject: "mailto:#{System.get_env("NOTIFY_EMAIL")}"

View file

@ -6,9 +6,6 @@
# Twitter-like block behavior
config :pleroma, :activitypub, blockers_visible: false
# Set the default frontend to an instructions page
config :pleroma, :frontends, primary: %{"name" => "landing-fe", "ref" => "vendor"}
# Sane default upload filters
config :pleroma, Pleroma.Upload,
filters: [
@ -37,6 +34,9 @@
# Allow privileged staff
config :pleroma, :instance, privileged_staff: true
# Enable instance favicons
config :pleroma, :instances_favicons, enabled: true
# Hellthread limits
config :pleroma, :mrf_hellthread,
delist_threshold: 15,

View file

@ -122,6 +122,8 @@
config :pleroma, :mrf, policies: []
config :pleroma, :instances_favicons, enabled: false
config :pleroma, :pipeline,
object_validator: Pleroma.Web.ActivityPub.ObjectValidatorMock,
mrf: Pleroma.Web.ActivityPub.MRFMock,

View file

@ -2,8 +2,10 @@
set -e
DATABASE_URL=${DATABASE_URL:-"postgres://${DB_USER:-postgres}:${DB_PASS:-postgres}@${DB_HOST:-db}:5432/${DB_NAME:-postgres}"}
echo "-- Waiting for database..."
while ! pg_isready -U ${DB_USER:-pleroma} -d postgres://${DB_HOST:-db}:5432/${DB_NAME:-pleroma} -t 1; do
while ! pg_isready -d $DATABASE_URL -t 1; do
sleep 1s
done

View file

@ -1,4 +1,5 @@
# Recommended varnishncsa logging format: '%h %l %u %t "%m %{X-Forwarded-Proto}i://%{Host}i%U%q %H" %s %b "%{Referer}i" "%{User-agent}i"'
# Please use Varnish 7.0+ for proper Range Requests / Chunked encoding support
vcl 4.1;
import std;
@ -22,11 +23,6 @@ sub vcl_recv {
set req.http.X-Forwarded-Proto = "https";
}
# CHUNKED SUPPORT
if (req.http.Range ~ "bytes=") {
set req.http.x-range = req.http.Range;
}
# Pipe if WebSockets request is coming through
if (req.http.upgrade ~ "(?i)websocket") {
return (pipe);
@ -35,9 +31,9 @@ sub vcl_recv {
# Allow purging of the cache
if (req.method == "PURGE") {
if (!client.ip ~ purge) {
return(synth(405,"Not allowed."));
return (synth(405,"Not allowed."));
}
return(purge);
return (purge);
}
}
@ -53,17 +49,11 @@ sub vcl_backend_response {
return (retry);
}
# CHUNKED SUPPORT
if (bereq.http.x-range ~ "bytes=" && beresp.status == 206) {
set beresp.ttl = 10m;
set beresp.http.CR = beresp.http.content-range;
}
# Bypass cache for large files
# 50000000 ~ 50MB
if (std.integer(beresp.http.content-length, 0) > 50000000) {
set beresp.uncacheable = true;
return(deliver);
return (deliver);
}
# Don't cache objects that require authentication
@ -94,7 +84,7 @@ sub vcl_synth {
if (resp.status == 750) {
set resp.status = 301;
set resp.http.Location = req.http.x-redir;
return(deliver);
return (deliver);
}
}
@ -106,25 +96,12 @@ sub vcl_pipe {
}
}
sub vcl_hash {
# CHUNKED SUPPORT
if (req.http.x-range ~ "bytes=") {
hash_data(req.http.x-range);
unset req.http.Range;
}
}
sub vcl_backend_fetch {
# Be more lenient for slow servers on the fediverse
if (bereq.url ~ "^/proxy/") {
set bereq.first_byte_timeout = 300s;
}
# CHUNKED SUPPORT
if (bereq.http.x-range) {
set bereq.http.Range = bereq.http.x-range;
}
if (bereq.retries == 0) {
# Clean up the X-Varnish-Backend-503 flag that is used internally
# to mark broken backend responses that should be retried.
@ -143,14 +120,6 @@ sub vcl_backend_fetch {
}
}
sub vcl_deliver {
# CHUNKED SUPPORT
if (resp.http.CR) {
set resp.http.Content-Range = resp.http.CR;
unset resp.http.CR;
}
}
sub vcl_backend_error {
# Retry broken backend responses.
set bereq.http.X-Varnish-Backend-503 = "1";

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 981 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 81 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.6 KiB

View file

@ -1,74 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>Welcome to Soapbox</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover,user-scalable=no">
<link rel="icon" type="image/png" href="/favicon.png">
<style type="text/css">
:root {
--brand-color: #0482d8;
--background-color: #f2f2f2;
}
body {
background-color: var(--background-color);
font-family: 'Lato', sans-serif;
padding: 0;
margin: 0;
}
main {
max-width: 500px;
margin: 0 auto;
padding: 30px;
}
.logo {
width: 100%;
display: block;
}
h2 {
font-size: 1.5rem;
font-weight: normal;
line-height: 1.5;
}
p {
line-height: 1.5;
}
a {
color: var(--brand-color);
}
code {
display: block;
color: white;
background-color: black;
border-radius: 10px;
padding: 10px;
}
code.inline {
display: inline;
border-radius: 4px;
padding: 4px;
}
</style>
</head>
<body>
<main>
<img class="logo" src="/assets/soapbox-logo-wide.svg" alt="Soapbox" />
<h2>Almost done...</h2>
<p>Congrats! 🎉 You've installed Soapbox BE. Now you just need to install a frontend.</p>
<h2>Installing Soapbox FE</h2>
<p>To install <a href="https://gitlab.com/soapbox-pub/soapbox-fe" target="_blank">Soapbox FE</a>, SSH into the server and download a .zip of the latest build:</p>
<code>curl -L https://gitlab.com/soapbox-pub/soapbox-fe/-/jobs/artifacts/develop/download?job=build-production -o soapbox-fe.zip</code>
<p>Then unpack it into the <code class="inline">instance</code> directory:</p>
<code>busybox unzip soapbox-fe.zip -o -d /opt/pleroma/instance</code>
<p><strong>That's it!</strong> Just refresh this page.</p>
</main>
</body>
</html>

View file

@ -421,6 +421,38 @@ def run(["list"]) do
|> Stream.run()
end
def run(["fix_follow_state", local_user, remote_user]) do
start_pleroma()
with {:local, %User{} = local} <- {:local, User.get_by_nickname(local_user)},
{:remote, %User{} = remote} <- {:remote, User.get_by_nickname(remote_user)},
{:follow_data, %{data: %{"state" => request_state}}} <-
{:follow_data, Pleroma.Web.ActivityPub.Utils.fetch_latest_follow(local, remote)} do
calculated_state = User.following?(local, remote)
shell_info(
"Request state is #{request_state}, vs calculated state of following=#{calculated_state}"
)
if calculated_state == false && request_state == "accept" do
shell_info("Discrepancy found, fixing")
Pleroma.Web.CommonAPI.reject_follow_request(local, remote)
shell_info("Relationship fixed")
else
shell_info("No discrepancy found")
end
else
{:local, _} ->
shell_error("No local user #{local_user}")
{:remote, _} ->
shell_error("No remote user #{remote_user}")
{:follow_data, _} ->
shell_error("No follow data for #{local_user} and #{remote_user}")
end
end
defp set_moderator(user, value) do
{:ok, user} =
user

View file

@ -12,13 +12,16 @@ defmodule Pleroma.Application do
require Logger
@name Mix.Project.config()[:name]
@compat_name Mix.Project.config()[:compat_name]
@version Mix.Project.config()[:version]
@repository Mix.Project.config()[:source_url]
@mix_env Mix.env()
def name, do: @name
def compat_name, do: @compat_name
def version, do: @version
def named_version, do: @name <> " " <> @version
def compat_version, do: @compat_name <> " " <> @version
def repository, do: @repository
def user_agent do
@ -26,7 +29,7 @@ def user_agent do
case Config.get([:http, :user_agent], :default) do
:default ->
info = "#{Pleroma.Web.Endpoint.url()} <#{Config.get([:instance, :email], "")}>"
named_version() <> "; " <> info
compat_version() <> "; " <> info
custom ->
custom
@ -112,7 +115,17 @@ def start(_type, _args) do
# See http://elixir-lang.org/docs/stable/elixir/Supervisor.html
# for other strategies and supported options
opts = [strategy: :one_for_one, name: Pleroma.Supervisor]
# If we have a lot of caches, default max_restarts can cause test
# resets to fail.
# Go for the default 3 unless we're in test
max_restarts =
if @mix_env == :test do
100
else
3
end
opts = [strategy: :one_for_one, name: Pleroma.Supervisor, max_restarts: max_restarts]
result = Supervisor.start_link(children, opts)
set_postgres_server_version()

View file

@ -1,13 +1,13 @@
# emoji-test.txt
# Date: 2021-08-26, 17:22:23 GMT
# © 2021 Unicode®, Inc.
# Date: 2022-08-12, 20:24:39 GMT
# © 2022 Unicode®, Inc.
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
# For terms of use, see http://www.unicode.org/terms_of_use.html
# For terms of use, see https://www.unicode.org/terms_of_use.html
#
# Emoji Keyboard/Display Test Data for UTS #51
# Version: 14.0
# Version: 15.0
#
# For documentation and usage, see http://www.unicode.org/reports/tr51
# For documentation and usage, see https://www.unicode.org/reports/tr51
#
# This file provides data for testing which emoji forms should be in keyboards and which should also be displayed/processed.
# Format: code points; status # emoji name
@ -92,6 +92,7 @@
1F62C ; fully-qualified # 😬 E1.0 grimacing face
1F62E 200D 1F4A8 ; fully-qualified # 😮‍💨 E13.1 face exhaling
1F925 ; fully-qualified # 🤥 E3.0 lying face
1FAE8 ; fully-qualified # 🫨 E15.0 shaking face
# subgroup: face-sleepy
1F60C ; fully-qualified # 😌 E0.6 relieved face
@ -155,7 +156,7 @@
# subgroup: face-negative
1F624 ; fully-qualified # 😤 E0.6 face with steam from nose
1F621 ; fully-qualified # 😡 E0.6 pouting face
1F621 ; fully-qualified # 😡 E0.6 enraged face
1F620 ; fully-qualified # 😠 E0.6 angry face
1F92C ; fully-qualified # 🤬 E5.0 face with symbols on mouth
1F608 ; fully-qualified # 😈 E1.0 smiling face with horns
@ -190,8 +191,7 @@
1F649 ; fully-qualified # 🙉 E0.6 hear-no-evil monkey
1F64A ; fully-qualified # 🙊 E0.6 speak-no-evil monkey
# subgroup: emotion
1F48B ; fully-qualified # 💋 E0.6 kiss mark
# subgroup: heart
1F48C ; fully-qualified # 💌 E0.6 love letter
1F498 ; fully-qualified # 💘 E0.6 heart with arrow
1F49D ; fully-qualified # 💝 E0.6 heart with ribbon
@ -210,14 +210,20 @@
2764 200D 1FA79 ; unqualified # ❤‍🩹 E13.1 mending heart
2764 FE0F ; fully-qualified # ❤️ E0.6 red heart
2764 ; unqualified # ❤ E0.6 red heart
1FA77 ; fully-qualified # 🩷 E15.0 pink heart
1F9E1 ; fully-qualified # 🧡 E5.0 orange heart
1F49B ; fully-qualified # 💛 E0.6 yellow heart
1F49A ; fully-qualified # 💚 E0.6 green heart
1F499 ; fully-qualified # 💙 E0.6 blue heart
1FA75 ; fully-qualified # 🩵 E15.0 light blue heart
1F49C ; fully-qualified # 💜 E0.6 purple heart
1F90E ; fully-qualified # 🤎 E12.0 brown heart
1F5A4 ; fully-qualified # 🖤 E3.0 black heart
1FA76 ; fully-qualified # 🩶 E15.0 grey heart
1F90D ; fully-qualified # 🤍 E12.0 white heart
# subgroup: emotion
1F48B ; fully-qualified # 💋 E0.6 kiss mark
1F4AF ; fully-qualified # 💯 E0.6 hundred points
1F4A2 ; fully-qualified # 💢 E0.6 anger symbol
1F4A5 ; fully-qualified # 💥 E0.6 collision
@ -226,21 +232,20 @@
1F4A8 ; fully-qualified # 💨 E0.6 dashing away
1F573 FE0F ; fully-qualified # 🕳️ E0.7 hole
1F573 ; unqualified # 🕳 E0.7 hole
1F4A3 ; fully-qualified # 💣 E0.6 bomb
1F4AC ; fully-qualified # 💬 E0.6 speech balloon
1F441 FE0F 200D 1F5E8 FE0F ; fully-qualified # 👁️‍🗨️ E2.0 eye in speech bubble
1F441 200D 1F5E8 FE0F ; unqualified # 👁‍🗨️ E2.0 eye in speech bubble
1F441 FE0F 200D 1F5E8 ; unqualified # 👁️‍🗨 E2.0 eye in speech bubble
1F441 FE0F 200D 1F5E8 ; minimally-qualified # 👁️‍🗨 E2.0 eye in speech bubble
1F441 200D 1F5E8 ; unqualified # 👁‍🗨 E2.0 eye in speech bubble
1F5E8 FE0F ; fully-qualified # 🗨️ E2.0 left speech bubble
1F5E8 ; unqualified # 🗨 E2.0 left speech bubble
1F5EF FE0F ; fully-qualified # 🗯️ E0.7 right anger bubble
1F5EF ; unqualified # 🗯 E0.7 right anger bubble
1F4AD ; fully-qualified # 💭 E1.0 thought balloon
1F4A4 ; fully-qualified # 💤 E0.6 zzz
1F4A4 ; fully-qualified # 💤 E0.6 ZZZ
# Smileys & Emotion subtotal: 177
# Smileys & Emotion subtotal: 177 w/o modifiers
# Smileys & Emotion subtotal: 180
# Smileys & Emotion subtotal: 180 w/o modifiers
# group: People & Body
@ -300,6 +305,18 @@
1FAF4 1F3FD ; fully-qualified # 🫴🏽 E14.0 palm up hand: medium skin tone
1FAF4 1F3FE ; fully-qualified # 🫴🏾 E14.0 palm up hand: medium-dark skin tone
1FAF4 1F3FF ; fully-qualified # 🫴🏿 E14.0 palm up hand: dark skin tone
1FAF7 ; fully-qualified # 🫷 E15.0 leftwards pushing hand
1FAF7 1F3FB ; fully-qualified # 🫷🏻 E15.0 leftwards pushing hand: light skin tone
1FAF7 1F3FC ; fully-qualified # 🫷🏼 E15.0 leftwards pushing hand: medium-light skin tone
1FAF7 1F3FD ; fully-qualified # 🫷🏽 E15.0 leftwards pushing hand: medium skin tone
1FAF7 1F3FE ; fully-qualified # 🫷🏾 E15.0 leftwards pushing hand: medium-dark skin tone
1FAF7 1F3FF ; fully-qualified # 🫷🏿 E15.0 leftwards pushing hand: dark skin tone
1FAF8 ; fully-qualified # 🫸 E15.0 rightwards pushing hand
1FAF8 1F3FB ; fully-qualified # 🫸🏻 E15.0 rightwards pushing hand: light skin tone
1FAF8 1F3FC ; fully-qualified # 🫸🏼 E15.0 rightwards pushing hand: medium-light skin tone
1FAF8 1F3FD ; fully-qualified # 🫸🏽 E15.0 rightwards pushing hand: medium skin tone
1FAF8 1F3FE ; fully-qualified # 🫸🏾 E15.0 rightwards pushing hand: medium-dark skin tone
1FAF8 1F3FF ; fully-qualified # 🫸🏿 E15.0 rightwards pushing hand: dark skin tone
# subgroup: hand-fingers-partial
1F44C ; fully-qualified # 👌 E0.6 OK hand
@ -473,11 +490,11 @@
1F932 1F3FE ; fully-qualified # 🤲🏾 E5.0 palms up together: medium-dark skin tone
1F932 1F3FF ; fully-qualified # 🤲🏿 E5.0 palms up together: dark skin tone
1F91D ; fully-qualified # 🤝 E3.0 handshake
1F91D 1F3FB ; fully-qualified # 🤝🏻 E3.0 handshake: light skin tone
1F91D 1F3FC ; fully-qualified # 🤝🏼 E3.0 handshake: medium-light skin tone
1F91D 1F3FD ; fully-qualified # 🤝🏽 E3.0 handshake: medium skin tone
1F91D 1F3FE ; fully-qualified # 🤝🏾 E3.0 handshake: medium-dark skin tone
1F91D 1F3FF ; fully-qualified # 🤝🏿 E3.0 handshake: dark skin tone
1F91D 1F3FB ; fully-qualified # 🤝🏻 E14.0 handshake: light skin tone
1F91D 1F3FC ; fully-qualified # 🤝🏼 E14.0 handshake: medium-light skin tone
1F91D 1F3FD ; fully-qualified # 🤝🏽 E14.0 handshake: medium skin tone
1F91D 1F3FE ; fully-qualified # 🤝🏾 E14.0 handshake: medium-dark skin tone
1F91D 1F3FF ; fully-qualified # 🤝🏿 E14.0 handshake: dark skin tone
1FAF1 1F3FB 200D 1FAF2 1F3FC ; fully-qualified # 🫱🏻‍🫲🏼 E14.0 handshake: light skin tone, medium-light skin tone
1FAF1 1F3FB 200D 1FAF2 1F3FD ; fully-qualified # 🫱🏻‍🫲🏽 E14.0 handshake: light skin tone, medium skin tone
1FAF1 1F3FB 200D 1FAF2 1F3FE ; fully-qualified # 🫱🏻‍🫲🏾 E14.0 handshake: light skin tone, medium-dark skin tone
@ -1455,7 +1472,7 @@
1F575 1F3FF ; fully-qualified # 🕵🏿 E2.0 detective: dark skin tone
1F575 FE0F 200D 2642 FE0F ; fully-qualified # 🕵️‍♂️ E4.0 man detective
1F575 200D 2642 FE0F ; unqualified # 🕵‍♂️ E4.0 man detective
1F575 FE0F 200D 2642 ; unqualified # 🕵️‍♂ E4.0 man detective
1F575 FE0F 200D 2642 ; minimally-qualified # 🕵️‍♂ E4.0 man detective
1F575 200D 2642 ; unqualified # 🕵‍♂ E4.0 man detective
1F575 1F3FB 200D 2642 FE0F ; fully-qualified # 🕵🏻‍♂️ E4.0 man detective: light skin tone
1F575 1F3FB 200D 2642 ; minimally-qualified # 🕵🏻‍♂ E4.0 man detective: light skin tone
@ -1469,7 +1486,7 @@
1F575 1F3FF 200D 2642 ; minimally-qualified # 🕵🏿‍♂ E4.0 man detective: dark skin tone
1F575 FE0F 200D 2640 FE0F ; fully-qualified # 🕵️‍♀️ E4.0 woman detective
1F575 200D 2640 FE0F ; unqualified # 🕵‍♀️ E4.0 woman detective
1F575 FE0F 200D 2640 ; unqualified # 🕵️‍♀ E4.0 woman detective
1F575 FE0F 200D 2640 ; minimally-qualified # 🕵️‍♀ E4.0 woman detective
1F575 200D 2640 ; unqualified # 🕵‍♀ E4.0 woman detective
1F575 1F3FB 200D 2640 FE0F ; fully-qualified # 🕵🏻‍♀️ E4.0 woman detective: light skin tone
1F575 1F3FB 200D 2640 ; minimally-qualified # 🕵🏻‍♀ E4.0 woman detective: light skin tone
@ -2302,7 +2319,7 @@
1F3CC 1F3FF ; fully-qualified # 🏌🏿 E4.0 person golfing: dark skin tone
1F3CC FE0F 200D 2642 FE0F ; fully-qualified # 🏌️‍♂️ E4.0 man golfing
1F3CC 200D 2642 FE0F ; unqualified # 🏌‍♂️ E4.0 man golfing
1F3CC FE0F 200D 2642 ; unqualified # 🏌️‍♂ E4.0 man golfing
1F3CC FE0F 200D 2642 ; minimally-qualified # 🏌️‍♂ E4.0 man golfing
1F3CC 200D 2642 ; unqualified # 🏌‍♂ E4.0 man golfing
1F3CC 1F3FB 200D 2642 FE0F ; fully-qualified # 🏌🏻‍♂️ E4.0 man golfing: light skin tone
1F3CC 1F3FB 200D 2642 ; minimally-qualified # 🏌🏻‍♂ E4.0 man golfing: light skin tone
@ -2316,7 +2333,7 @@
1F3CC 1F3FF 200D 2642 ; minimally-qualified # 🏌🏿‍♂ E4.0 man golfing: dark skin tone
1F3CC FE0F 200D 2640 FE0F ; fully-qualified # 🏌️‍♀️ E4.0 woman golfing
1F3CC 200D 2640 FE0F ; unqualified # 🏌‍♀️ E4.0 woman golfing
1F3CC FE0F 200D 2640 ; unqualified # 🏌️‍♀ E4.0 woman golfing
1F3CC FE0F 200D 2640 ; minimally-qualified # 🏌️‍♀ E4.0 woman golfing
1F3CC 200D 2640 ; unqualified # 🏌‍♀ E4.0 woman golfing
1F3CC 1F3FB 200D 2640 FE0F ; fully-qualified # 🏌🏻‍♀️ E4.0 woman golfing: light skin tone
1F3CC 1F3FB 200D 2640 ; minimally-qualified # 🏌🏻‍♀ E4.0 woman golfing: light skin tone
@ -2427,7 +2444,7 @@
26F9 1F3FF ; fully-qualified # ⛹🏿 E2.0 person bouncing ball: dark skin tone
26F9 FE0F 200D 2642 FE0F ; fully-qualified # ⛹️‍♂️ E4.0 man bouncing ball
26F9 200D 2642 FE0F ; unqualified # ⛹‍♂️ E4.0 man bouncing ball
26F9 FE0F 200D 2642 ; unqualified # ⛹️‍♂ E4.0 man bouncing ball
26F9 FE0F 200D 2642 ; minimally-qualified # ⛹️‍♂ E4.0 man bouncing ball
26F9 200D 2642 ; unqualified # ⛹‍♂ E4.0 man bouncing ball
26F9 1F3FB 200D 2642 FE0F ; fully-qualified # ⛹🏻‍♂️ E4.0 man bouncing ball: light skin tone
26F9 1F3FB 200D 2642 ; minimally-qualified # ⛹🏻‍♂ E4.0 man bouncing ball: light skin tone
@ -2441,7 +2458,7 @@
26F9 1F3FF 200D 2642 ; minimally-qualified # ⛹🏿‍♂ E4.0 man bouncing ball: dark skin tone
26F9 FE0F 200D 2640 FE0F ; fully-qualified # ⛹️‍♀️ E4.0 woman bouncing ball
26F9 200D 2640 FE0F ; unqualified # ⛹‍♀️ E4.0 woman bouncing ball
26F9 FE0F 200D 2640 ; unqualified # ⛹️‍♀ E4.0 woman bouncing ball
26F9 FE0F 200D 2640 ; minimally-qualified # ⛹️‍♀ E4.0 woman bouncing ball
26F9 200D 2640 ; unqualified # ⛹‍♀ E4.0 woman bouncing ball
26F9 1F3FB 200D 2640 FE0F ; fully-qualified # ⛹🏻‍♀️ E4.0 woman bouncing ball: light skin tone
26F9 1F3FB 200D 2640 ; minimally-qualified # ⛹🏻‍♀ E4.0 woman bouncing ball: light skin tone
@ -2462,7 +2479,7 @@
1F3CB 1F3FF ; fully-qualified # 🏋🏿 E2.0 person lifting weights: dark skin tone
1F3CB FE0F 200D 2642 FE0F ; fully-qualified # 🏋️‍♂️ E4.0 man lifting weights
1F3CB 200D 2642 FE0F ; unqualified # 🏋‍♂️ E4.0 man lifting weights
1F3CB FE0F 200D 2642 ; unqualified # 🏋️‍♂ E4.0 man lifting weights
1F3CB FE0F 200D 2642 ; minimally-qualified # 🏋️‍♂ E4.0 man lifting weights
1F3CB 200D 2642 ; unqualified # 🏋‍♂ E4.0 man lifting weights
1F3CB 1F3FB 200D 2642 FE0F ; fully-qualified # 🏋🏻‍♂️ E4.0 man lifting weights: light skin tone
1F3CB 1F3FB 200D 2642 ; minimally-qualified # 🏋🏻‍♂ E4.0 man lifting weights: light skin tone
@ -2476,7 +2493,7 @@
1F3CB 1F3FF 200D 2642 ; minimally-qualified # 🏋🏿‍♂ E4.0 man lifting weights: dark skin tone
1F3CB FE0F 200D 2640 FE0F ; fully-qualified # 🏋️‍♀️ E4.0 woman lifting weights
1F3CB 200D 2640 FE0F ; unqualified # 🏋‍♀️ E4.0 woman lifting weights
1F3CB FE0F 200D 2640 ; unqualified # 🏋️‍♀ E4.0 woman lifting weights
1F3CB FE0F 200D 2640 ; minimally-qualified # 🏋️‍♀ E4.0 woman lifting weights
1F3CB 200D 2640 ; unqualified # 🏋‍♀ E4.0 woman lifting weights
1F3CB 1F3FB 200D 2640 FE0F ; fully-qualified # 🏋🏻‍♀️ E4.0 woman lifting weights: light skin tone
1F3CB 1F3FB 200D 2640 ; minimally-qualified # 🏋🏻‍♀ E4.0 woman lifting weights: light skin tone
@ -3262,8 +3279,8 @@
1FAC2 ; fully-qualified # 🫂 E13.0 people hugging
1F463 ; fully-qualified # 👣 E0.6 footprints
# People & Body subtotal: 2986
# People & Body subtotal: 506 w/o modifiers
# People & Body subtotal: 2998
# People & Body subtotal: 508 w/o modifiers
# group: Component
@ -3306,6 +3323,8 @@
1F405 ; fully-qualified # 🐅 E1.0 tiger
1F406 ; fully-qualified # 🐆 E1.0 leopard
1F434 ; fully-qualified # 🐴 E0.6 horse face
1FACE ; fully-qualified # 🫎 E15.0 moose
1FACF ; fully-qualified # 🫏 E15.0 donkey
1F40E ; fully-qualified # 🐎 E0.6 horse
1F984 ; fully-qualified # 🦄 E1.0 unicorn
1F993 ; fully-qualified # 🦓 E5.0 zebra
@ -3373,6 +3392,9 @@
1F9A9 ; fully-qualified # 🦩 E12.0 flamingo
1F99A ; fully-qualified # 🦚 E11.0 peacock
1F99C ; fully-qualified # 🦜 E11.0 parrot
1FABD ; fully-qualified # 🪽 E15.0 wing
1F426 200D 2B1B ; fully-qualified # 🐦‍⬛ E15.0 black bird
1FABF ; fully-qualified # 🪿 E15.0 goose
# subgroup: animal-amphibian
1F438 ; fully-qualified # 🐸 E0.6 frog
@ -3399,6 +3421,7 @@
1F419 ; fully-qualified # 🐙 E0.6 octopus
1F41A ; fully-qualified # 🐚 E0.6 spiral shell
1FAB8 ; fully-qualified # 🪸 E14.0 coral
1FABC ; fully-qualified # 🪼 E15.0 jellyfish
# subgroup: animal-bug
1F40C ; fully-qualified # 🐌 E0.6 snail
@ -3433,6 +3456,7 @@
1F33B ; fully-qualified # 🌻 E0.6 sunflower
1F33C ; fully-qualified # 🌼 E0.6 blossom
1F337 ; fully-qualified # 🌷 E0.6 tulip
1FABB ; fully-qualified # 🪻 E15.0 hyacinth
# subgroup: plant-other
1F331 ; fully-qualified # 🌱 E0.6 seedling
@ -3451,9 +3475,10 @@
1F343 ; fully-qualified # 🍃 E0.6 leaf fluttering in wind
1FAB9 ; fully-qualified # 🪹 E14.0 empty nest
1FABA ; fully-qualified # 🪺 E14.0 nest with eggs
1F344 ; fully-qualified # 🍄 E0.6 mushroom
# Animals & Nature subtotal: 151
# Animals & Nature subtotal: 151 w/o modifiers
# Animals & Nature subtotal: 159
# Animals & Nature subtotal: 159 w/o modifiers
# group: Food & Drink
@ -3492,10 +3517,11 @@
1F966 ; fully-qualified # 🥦 E5.0 broccoli
1F9C4 ; fully-qualified # 🧄 E12.0 garlic
1F9C5 ; fully-qualified # 🧅 E12.0 onion
1F344 ; fully-qualified # 🍄 E0.6 mushroom
1F95C ; fully-qualified # 🥜 E3.0 peanuts
1FAD8 ; fully-qualified # 🫘 E14.0 beans
1F330 ; fully-qualified # 🌰 E0.6 chestnut
1FADA ; fully-qualified # 🫚 E15.0 ginger root
1FADB ; fully-qualified # 🫛 E15.0 pea pod
# subgroup: food-prepared
1F35E ; fully-qualified # 🍞 E0.6 bread
@ -3607,8 +3633,8 @@
1FAD9 ; fully-qualified # 🫙 E14.0 jar
1F3FA ; fully-qualified # 🏺 E1.0 amphora
# Food & Drink subtotal: 134
# Food & Drink subtotal: 134 w/o modifiers
# Food & Drink subtotal: 135
# Food & Drink subtotal: 135 w/o modifiers
# group: Travel & Places
@ -3974,11 +4000,10 @@
1F3AF ; fully-qualified # 🎯 E0.6 bullseye
1FA80 ; fully-qualified # 🪀 E12.0 yo-yo
1FA81 ; fully-qualified # 🪁 E12.0 kite
1F52B ; fully-qualified # 🔫 E0.6 water pistol
1F3B1 ; fully-qualified # 🎱 E0.6 pool 8 ball
1F52E ; fully-qualified # 🔮 E0.6 crystal ball
1FA84 ; fully-qualified # 🪄 E13.0 magic wand
1F9FF ; fully-qualified # 🧿 E11.0 nazar amulet
1FAAC ; fully-qualified # 🪬 E14.0 hamsa
1F3AE ; fully-qualified # 🎮 E0.6 video game
1F579 FE0F ; fully-qualified # 🕹️ E0.7 joystick
1F579 ; unqualified # 🕹 E0.7 joystick
@ -4013,8 +4038,8 @@
1F9F6 ; fully-qualified # 🧶 E11.0 yarn
1FAA2 ; fully-qualified # 🪢 E13.0 knot
# Activities subtotal: 97
# Activities subtotal: 97 w/o modifiers
# Activities subtotal: 96
# Activities subtotal: 96 w/o modifiers
# group: Objects
@ -4040,6 +4065,7 @@
1FA73 ; fully-qualified # 🩳 E12.0 shorts
1F459 ; fully-qualified # 👙 E0.6 bikini
1F45A ; fully-qualified # 👚 E0.6 womans clothes
1FAAD ; fully-qualified # 🪭 E15.0 folding hand fan
1F45B ; fully-qualified # 👛 E0.6 purse
1F45C ; fully-qualified # 👜 E0.6 handbag
1F45D ; fully-qualified # 👝 E0.6 clutch bag
@ -4055,6 +4081,7 @@
1F461 ; fully-qualified # 👡 E0.6 womans sandal
1FA70 ; fully-qualified # 🩰 E12.0 ballet shoes
1F462 ; fully-qualified # 👢 E0.6 womans boot
1FAAE ; fully-qualified # 🪮 E15.0 hair pick
1F451 ; fully-qualified # 👑 E0.6 crown
1F452 ; fully-qualified # 👒 E0.6 womans hat
1F3A9 ; fully-qualified # 🎩 E0.6 top hat
@ -4103,6 +4130,8 @@
1FA95 ; fully-qualified # 🪕 E12.0 banjo
1F941 ; fully-qualified # 🥁 E3.0 drum
1FA98 ; fully-qualified # 🪘 E13.0 long drum
1FA87 ; fully-qualified # 🪇 E15.0 maracas
1FA88 ; fully-qualified # 🪈 E15.0 flute
# subgroup: phone
1F4F1 ; fully-qualified # 📱 E0.6 mobile phone
@ -4275,7 +4304,7 @@
1F5E1 ; unqualified # 🗡 E0.7 dagger
2694 FE0F ; fully-qualified # ⚔️ E1.0 crossed swords
2694 ; unqualified # ⚔ E1.0 crossed swords
1F52B ; fully-qualified # 🔫 E0.6 water pistol
1F4A3 ; fully-qualified # 💣 E0.6 bomb
1FA83 ; fully-qualified # 🪃 E13.0 boomerang
1F3F9 ; fully-qualified # 🏹 E1.0 bow and arrow
1F6E1 FE0F ; fully-qualified # 🛡️ E0.7 shield
@ -4354,12 +4383,14 @@
1FAA6 ; fully-qualified # 🪦 E13.0 headstone
26B1 FE0F ; fully-qualified # ⚱️ E1.0 funeral urn
26B1 ; unqualified # ⚱ E1.0 funeral urn
1F9FF ; fully-qualified # 🧿 E11.0 nazar amulet
1FAAC ; fully-qualified # 🪬 E14.0 hamsa
1F5FF ; fully-qualified # 🗿 E0.6 moai
1FAA7 ; fully-qualified # 🪧 E13.0 placard
1FAAA ; fully-qualified # 🪪 E14.0 identification card
# Objects subtotal: 304
# Objects subtotal: 304 w/o modifiers
# Objects subtotal: 310
# Objects subtotal: 310 w/o modifiers
# group: Symbols
@ -4455,6 +4486,7 @@
262E ; unqualified # ☮ E1.0 peace symbol
1F54E ; fully-qualified # 🕎 E1.0 menorah
1F52F ; fully-qualified # 🔯 E0.6 dotted six-pointed star
1FAAF ; fully-qualified # 🪯 E15.0 khanda
# subgroup: zodiac
2648 ; fully-qualified # ♈ E0.6 Aries
@ -4503,6 +4535,7 @@
1F505 ; fully-qualified # 🔅 E1.0 dim button
1F506 ; fully-qualified # 🔆 E1.0 bright button
1F4F6 ; fully-qualified # 📶 E0.6 antenna bars
1F6DC ; fully-qualified # 🛜 E15.0 wireless
1F4F3 ; fully-qualified # 📳 E0.6 vibration mode
1F4F4 ; fully-qualified # 📴 E0.6 mobile phone off
@ -4693,8 +4726,8 @@
1F533 ; fully-qualified # 🔳 E0.6 white square button
1F532 ; fully-qualified # 🔲 E0.6 black square button
# Symbols subtotal: 302
# Symbols subtotal: 302 w/o modifiers
# Symbols subtotal: 304
# Symbols subtotal: 304 w/o modifiers
# group: Flags
@ -4709,7 +4742,7 @@
1F3F3 200D 1F308 ; unqualified # 🏳‍🌈 E4.0 rainbow flag
1F3F3 FE0F 200D 26A7 FE0F ; fully-qualified # 🏳️‍⚧️ E13.0 transgender flag
1F3F3 200D 26A7 FE0F ; unqualified # 🏳‍⚧️ E13.0 transgender flag
1F3F3 FE0F 200D 26A7 ; unqualified # 🏳️‍⚧ E13.0 transgender flag
1F3F3 FE0F 200D 26A7 ; minimally-qualified # 🏳️‍⚧ E13.0 transgender flag
1F3F3 200D 26A7 ; unqualified # 🏳‍⚧ E13.0 transgender flag
1F3F4 200D 2620 FE0F ; fully-qualified # 🏴‍☠️ E11.0 pirate flag
1F3F4 200D 2620 ; minimally-qualified # 🏴‍☠ E11.0 pirate flag
@ -4983,9 +5016,9 @@
# Flags subtotal: 275 w/o modifiers
# Status Counts
# fully-qualified : 3624
# minimally-qualified : 817
# unqualified : 252
# fully-qualified : 3655
# minimally-qualified : 827
# unqualified : 242
# component : 9
#EOF

View file

@ -1587,13 +1587,19 @@ def block(%User{} = blocker, %User{} = blocked) do
blocker
end
# clear any requested follows as well
# clear any requested follows from both sides as well
blocked =
case CommonAPI.reject_follow_request(blocked, blocker) do
{:ok, %User{} = updated_blocked} -> updated_blocked
nil -> blocked
end
blocker =
case CommonAPI.reject_follow_request(blocker, blocked) do
{:ok, %User{} = updated_blocker} -> updated_blocker
nil -> blocker
end
unsubscribe(blocked, blocker)
unfollowing_blocked = Config.get([:activitypub, :unfollow_blocked], true)

View file

@ -91,8 +91,9 @@ def create(relationship_type, %User{} = source, %User{} = target, expires_at \\
expires_at: expires_at
})
|> Repo.insert(
on_conflict: {:replace_all_except, [:id]},
conflict_target: [:source_id, :relationship_type, :target_id]
on_conflict: {:replace_all_except, [:id, :inserted_at]},
conflict_target: [:source_id, :relationship_type, :target_id],
returning: true
)
end

View file

@ -29,6 +29,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.QuestionValidator do
field(:closed, ObjectValidators.DateTime)
field(:voters, {:array, ObjectValidators.ObjectID}, default: [])
field(:votersCount, :integer)
field(:nonAnonymous, :boolean)
embeds_many(:anyOf, QuestionOptionsValidator)
embeds_many(:oneOf, QuestionOptionsValidator)

View file

@ -723,6 +723,14 @@ def replies(%{"replies" => %{"items" => items}}) when not is_nil(items) do
def replies(_), do: []
defp set_voters_count(%{"voters" => [_ | _] = voters} = obj) do
obj
|> Map.merge(%{"votersCount" => length(voters)})
|> Map.delete("voters")
end
defp set_voters_count(obj), do: obj
# Prepares the object of an outgoing create activity.
def prepare_object(object) do
object
@ -735,6 +743,7 @@ def prepare_object(object) do
|> set_reply_to_uri
|> set_quote_url
|> set_replies
|> set_voters_count
|> strip_internal_fields
|> strip_internal_tags
|> set_type

View file

@ -18,7 +18,7 @@ def render("show.json", _) do
title: Keyword.get(instance, :name),
description: Keyword.get(instance, :description),
short_description: Keyword.get(instance, :short_description),
version: "#{@mastodon_api_level} (compatible; #{Pleroma.Application.named_version()})",
version: "#{@mastodon_api_level} (compatible; #{Pleroma.Application.compat_version()})",
email: Keyword.get(instance, :email),
urls: %{
streaming_api: Pleroma.Web.Endpoint.websocket_url()
@ -54,7 +54,8 @@ def render("show.json", _) do
birthday_min_age: Config.get([:instance, :birthday_min_age])
},
stats: %{mau: Pleroma.User.active_user_count()},
vapid_public_key: Keyword.get(Pleroma.Web.Push.vapid_config(), :public_key)
vapid_public_key: Keyword.get(Pleroma.Web.Push.vapid_config(), :public_key),
oauth_consumer_strategies: Pleroma.Config.oauth_consumer_strategies()
},
configuration: configuration(),
soapbox: %{

View file

@ -71,6 +71,10 @@ defp options_and_votes_count(options) do
end)
end
defp voters_count(%{data: %{"votersCount" => voters}}) when is_number(voters) do
voters
end
defp voters_count(%{data: %{"voters" => [_ | _] = voters}}) do
length(voters)
end

View file

@ -54,7 +54,7 @@ defp handle_preview(conn, url) do
media_proxy_url = MediaProxy.url(url)
with {:ok, %{status: status} = head_response} when status in 200..299 <-
Pleroma.HTTP.request("head", media_proxy_url, [], [], pool: :media) do
Pleroma.HTTP.request("HEAD", media_proxy_url, [], [], pool: :media) do
content_type = Tesla.get_header(head_response, "content-type")
content_length = Tesla.get_header(head_response, "content-length")
content_length = content_length && String.to_integer(content_length)

View file

@ -24,7 +24,7 @@ def get_nodeinfo("2.0") do
%{
version: "2.0",
software: %{
name: Pleroma.Application.name() |> String.downcase(),
name: Pleroma.Application.compat_name() |> String.downcase(),
version: Pleroma.Application.version()
},
protocols: Publisher.gather_nodeinfo_protocol_names(),

View file

@ -47,15 +47,17 @@ def call(conn, _) do
#
@spec fetch_user_and_token(String.t()) :: {:ok, User.t(), Token.t()} | nil
defp fetch_user_and_token(token) do
query =
token_query =
from(t in Token,
where: t.token == ^token,
join: user in assoc(t, :user),
preload: [user: user]
where: t.token == ^token
)
with %Token{user: user} = token_record <- Repo.one(query) do
with %Token{user_id: user_id} = token_record <- Repo.one(token_query),
false <- is_nil(user_id),
%User{} = user <- User.get_cached_by_id(user_id) do
{:ok, user, token_record}
else
_ -> nil
end
end

View file

@ -5,11 +5,23 @@
<meta name="viewport" content="width=device-width,initial-scale=1,minimal-ui">
<title><%= Pleroma.Config.get([:instance, :name]) %></title>
<link rel="stylesheet" href="/instance/static.css">
<style>
:root {
<%= Pleroma.Web.Utils.Colors.shades_to_css(
"primary",
Pleroma.Config.get([:frontend_configurations, :soapbox_fe, "brandColor"], "#0482d8")
) %>
<%= Pleroma.Web.Utils.Colors.shades_to_css(
"accent",
Pleroma.Config.get([:frontend_configurations, :soapbox_fe, "accentColor"], "#2bd110")
) %>
}
</style>
</head>
<body>
<div class="instance-header">
<a class="instance-header__content" href="/">
<img class="instance-header__thumbnail" src="<%= Pleroma.Config.get([:instance, :instance_thumbnail]) %>">
<img class="instance-header__thumbnail" src="<%= Pleroma.Config.get([:frontend_configurations, :soapbox_fe, "logo"], Pleroma.Config.get([:instance, :instance_thumbnail])) %>">
<h1 class="instance-header__title"><%= Pleroma.Config.get([:instance, :name]) %></h1>
</a>
</div>

View file

@ -0,0 +1,90 @@
# Pleroma: A lightweight social networking server
# Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only
defmodule Pleroma.Web.Utils.Colors do
alias Pleroma.Web.Utils.Colors.RGB
# Adapted from:
# https://gitlab.com/soapbox-pub/soapbox-fe/-/blob/develop/app/soapbox/utils/colors.ts
@intensity_map %{
50 => 0.95,
100 => 0.9,
200 => 0.75,
300 => 0.3,
400 => 0.2,
600 => 0.9,
700 => 0.75,
800 => 0.3,
900 => 0.19
}
def get_shades("#" <> base_color) do
base_color = base_color |> hex_to_rgb()
shades = %{
500 => base_color |> rgb_to_string()
}
shades =
[50, 100, 200, 300, 400]
|> Enum.reduce(shades, fn level, map ->
Map.put(map, level, lighten(base_color, Map.get(@intensity_map, level)))
end)
shades =
[600, 700, 800, 900]
|> Enum.reduce(shades, fn level, map ->
Map.put(map, level, darken(base_color, Map.get(@intensity_map, level)))
end)
shades
end
def get_shades(_) do
get_shades("#0482d8")
end
defp lighten(%RGB{red: red, green: green, blue: blue}, intensity) do
%RGB{
red: round(red + (255 - red) * intensity),
green: round(green + (255 - green) * intensity),
blue: round(blue + (255 - blue) * intensity)
}
|> rgb_to_string()
end
defp darken(%RGB{red: red, green: green, blue: blue}, intensity) do
%RGB{
red: round(red * intensity),
green: round(green * intensity),
blue: round(blue * intensity)
}
|> rgb_to_string()
end
defp rgb_to_string(%RGB{red: red, green: green, blue: blue}) do
"#{red}, #{green}, #{blue}"
end
defp hex_to_rgb(<<red::binary-size(2), green::binary-size(2), blue::binary-size(2)>>) do
%RGB{
red: hex_to_decimal(red),
green: hex_to_decimal(green),
blue: hex_to_decimal(blue)
}
end
defp hex_to_decimal(hex) do
{decimal, ""} = Integer.parse(hex, 16)
decimal
end
def shades_to_css(name, base_color \\ nil) do
get_shades(base_color)
|> Map.to_list()
|> Enum.reduce([], fn {key, shade}, list -> list ++ ["--color-#{name}-#{key}: #{shade};"] end)
|> Enum.join("\n")
end
end

View file

@ -0,0 +1,13 @@
# Pleroma: A lightweight social networking server
# Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only
defmodule Pleroma.Web.Utils.Colors.RGB do
defstruct red: 0, green: 0, blue: 0
@type t :: %__MODULE__{
red: non_neg_integer(),
green: non_neg_integer(),
blue: non_neg_integer()
}
end

View file

@ -9,6 +9,12 @@ defmodule Pleroma.Workers.ReceiverWorker do
@impl Oban.Worker
def perform(%Job{args: %{"op" => "incoming_ap_doc", "params" => params}}) do
Federator.perform(:incoming_ap_doc, params)
with {:ok, res} <- Federator.perform(:incoming_ap_doc, params) do
{:ok, res}
else
{:error, :origin_containment_failed} -> {:cancel, :origin_containment_failed}
{:error, {:reject, reason}} -> {:cancel, reason}
e -> e
end
end
end

View file

@ -6,6 +6,8 @@ defmodule Pleroma.Mixfile do
def project do
[
app: :pleroma,
name: "Rebased",
compat_name: "Pleroma",
version: version("2.4.52"),
elixir: "~> 1.9",
elixirc_paths: elixirc_paths(Mix.env()),
@ -18,12 +20,11 @@ def project do
test_coverage: [tool: ExCoveralls],
preferred_cli_env: ["coveralls.html": :test],
# Docs
name: "Pleroma",
homepage_url: "https://pleroma.social/",
source_url: "https://git.pleroma.social/pleroma/pleroma",
homepage_url: "https://soapbox.pub/",
source_url: "https://gitlab.com/soapbox-pub/rebased",
docs: [
source_url_pattern:
"https://git.pleroma.social/pleroma/pleroma/blob/develop/%{path}#L%{line}",
"https://gitlab.com/soapbox-pub/rebased/blob/develop/%{path}#L%{line}",
logo: "priv/static/images/logo.png",
extras: ["README.md", "CHANGELOG.md"] ++ Path.wildcard("docs/**/*.md"),
groups_for_extras: [

View file

@ -90,6 +90,8 @@
"nimble_parsec": {:hex, :nimble_parsec, "0.5.0", "90e2eca3d0266e5c53f8fbe0079694740b9c91b6747f2b7e3c5d21966bba8300", [:mix], [], "hexpm", "5c040b8469c1ff1b10093d3186e2e10dbe483cd73d79ec017993fb3985b8a9b3"},
"nimble_pool": {:hex, :nimble_pool, "0.2.4", "1db8e9f8a53d967d595e0b32a17030cdb6c0dc4a451b8ac787bf601d3f7704c3", [:mix], [], "hexpm", "367e8071e137b787764e6a9992ccb57b276dc2282535f767a07d881951ebeac6"},
"nodex": {:git, "https://git.pleroma.social/pleroma/nodex", "cb6730f943cfc6aad674c92161be23a8411f15d1", [ref: "cb6730f943cfc6aad674c92161be23a8411f15d1"]},
"oauth2": {:hex, :oauth2, "0.9.4", "632e8e8826a45e33ac2ea5ac66dcc019ba6bb5a0d2ba77e342d33e3b7b252c6e", [:mix], [{:hackney, "~> 1.7", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "407c6b9f60aa0d01b915e2347dc6be78adca706a37f0c530808942da3b62e7af"},
"oauther": {:hex, :oauther, "1.3.0", "82b399607f0ca9d01c640438b34d74ebd9e4acd716508f868e864537ecdb1f76", [:mix], [], "hexpm", "78eb888ea875c72ca27b0864a6f550bc6ee84f2eeca37b093d3d833fbcaec04e"},
"oban": {:hex, :oban, "2.3.4", "ec7509b9af2524d55f529cb7aee93d36131ae0bf0f37706f65d2fe707f4d9fd8", [:mix], [{:ecto_sql, ">= 3.4.3", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.14", [hex: :postgrex, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "c70ca0434758fd1805422ea4446af5e910ddc697c0c861549c8f0eb0cfbd2fdf"},
"oembed_providers": {:hex, :oembed_providers, "0.1.0", "9b336ee5f3ca20ee4ed005383c74b154d30d0abeb98e95828855c0e2841ae46b", [:mix], [{:glob, "~> 1.0", [hex: :glob, repo: "hexpm", optional: false]}, {:jason, "~> 1.2", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "ac1dda0f743aa6fdead3eef59decfefc9de91d550bf0805b8fce16ed10d421ba"},
"open_api_spex": {:hex, :open_api_spex, "3.10.0", "94e9521ad525b3fcf6dc77da7c45f87fdac24756d4de588cb0816b413e7c1844", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:plug, "~> 1.7", [hex: :plug, repo: "hexpm", optional: false]}, {:poison, "~> 3.1", [hex: :poison, repo: "hexpm", optional: true]}], "hexpm", "2dbb2bde3d2b821f06936e8dfaf3284331186556291946d84eeba3750ac28765"},
@ -135,6 +137,13 @@
"trailing_format_plug": {:hex, :trailing_format_plug, "0.0.7", "64b877f912cf7273bed03379936df39894149e35137ac9509117e59866e10e45", [:mix], [{:plug, "> 0.12.0", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "bd4fde4c15f3e993a999e019d64347489b91b7a9096af68b2bdadd192afa693f"},
"tzdata": {:hex, :tzdata, "1.0.5", "69f1ee029a49afa04ad77801febaf69385f3d3e3d1e4b56b9469025677b89a28", [:mix], [{:hackney, "~> 1.0", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "55519aa2a99e5d2095c1e61cc74c9be69688f8ab75c27da724eb8279ff402a5a"},
"ueberauth": {:hex, :ueberauth, "0.6.3", "d42ace28b870e8072cf30e32e385579c57b9cc96ec74fa1f30f30da9c14f3cc0", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "afc293d8a1140d6591b53e3eaf415ca92842cb1d32fad3c450c6f045f7f91b60"},
"ueberauth_facebook": {:hex, :ueberauth_facebook, "0.8.0", "9ec8571f804dd5c06f4e305d70606b39fc0ac8a8f43ed56ebb76012a97d14729", [:mix], [{:oauth2, "~> 0.9", [hex: :oauth2, repo: "hexpm", optional: false]}, {:ueberauth, "~> 0.4", [hex: :ueberauth, repo: "hexpm", optional: false]}], "hexpm", "6d0c88d6ea4cc40cf99b3abcf8aaa435a31f836dc8921e8b4015d760e183f7ba"},
"ueberauth_github": {:hex, :ueberauth_github, "0.7.0", "637067c5500f7b13c18caca3db66d09eba661524e0d0e9518b54151e99484bad", [:mix], [{:oauth2, "~> 0.9", [hex: :oauth2, repo: "hexpm", optional: false]}, {:ueberauth, "~> 0.4", [hex: :ueberauth, repo: "hexpm", optional: false]}], "hexpm", "05d5ec9ac501a8ca82c41275436d1d0cf05f5c380ab194c5d79414a02de2645e"},
"ueberauth_google": {:hex, :ueberauth_google, "0.8.0", "dc0e8417061c74107a3ba1419943cc930d3403b5c536b3757886964a3a70c333", [:mix], [{:oauth2, "~> 0.9", [hex: :oauth2, repo: "hexpm", optional: false]}, {:ueberauth, "~> 0.4", [hex: :ueberauth, repo: "hexpm", optional: false]}], "hexpm", "72cd7710cd721ec340a2eda418658e77254ab516ddcb52257db834055878cdc7"},
"ueberauth_keycloak_strategy": {:hex, :ueberauth_keycloak_strategy, "0.2.0", "5ed0471a1cbb2ad4c0b371ab9f2a8e413070d9f307a2e55925a613254e7be619", [:mix], [{:oauth2, "~> 0.9", [hex: :oauth2, repo: "hexpm", optional: false]}, {:ueberauth, "~> 0.4", [hex: :ueberauth, repo: "hexpm", optional: false]}], "hexpm", "9db30c00fe7e55f032254e6220d7c9b260e14367bfd0dba6c29760ce05a0131c"},
"ueberauth_microsoft": {:hex, :ueberauth_microsoft, "0.4.0", "1c0be9c218e93c426e32c416421e9d41ea59fdf1e3b24310ed5be41df46ddcc1", [:mix], [{:oauth2, "~> 0.8", [hex: :oauth2, repo: "hexpm", optional: false]}, {:ueberauth, "~> 0.4", [hex: :ueberauth, repo: "hexpm", optional: false]}], "hexpm", "0b124367853a9becd265639f9eaa0c5318a313feb8ebd51464c8c68be1353e20"},
"ueberauth_slack": {:hex, :ueberauth_slack, "0.3.0", "ec8f6c96e1d41a458a00b5d8cd918c1f387998884fe4636e67dd88b1bd06f928", [:mix], [{:oauth2, "~> 0.5", [hex: :oauth2, repo: "hexpm", optional: false]}, {:ueberauth, "~> 0.2", [hex: :ueberauth, repo: "hexpm", optional: false]}], "hexpm", "b4012b2cf1664dc80eda5762c5d3a495a819456186ab789da8ce4e7b9c0fa22f"},
"ueberauth_twitter": {:hex, :ueberauth_twitter, "0.4.0", "4b98620341bc91bac90459093bba093c650823b6e2df35b70255c493c17e9227", [:mix], [{:httpoison, "~> 1.0", [hex: :httpoison, repo: "hexpm", optional: false]}, {:oauther, "~> 1.1", [hex: :oauther, repo: "hexpm", optional: false]}, {:ueberauth, "~> 0.6", [hex: :ueberauth, repo: "hexpm", optional: false]}], "hexpm", "fb29c9047ca263038c0c61f5a0ec8597e8564aba3f2b4cb02704b60205fd4468"},
"unicode_util_compat": {:hex, :unicode_util_compat, "0.7.0", "bc84380c9ab48177092f43ac89e4dfa2c6d62b40b8bd132b1059ecc7232f9a78", [:rebar3], [], "hexpm", "25eee6d67df61960cf6a794239566599b09e17e668d3700247bc498638152521"},
"unsafe": {:hex, :unsafe, "1.0.1", "a27e1874f72ee49312e0a9ec2e0b27924214a05e3ddac90e91727bc76f8613d8", [:mix], [], "hexpm", "6c7729a2d214806450d29766abc2afaa7a2cbecf415be64f36a6691afebb50e5"},
"web_push_encryption": {:hex, :web_push_encryption, "0.3.1", "76d0e7375142dfee67391e7690e89f92578889cbcf2879377900b5620ee4708d", [:mix], [{:httpoison, "~> 1.0", [hex: :httpoison, repo: "hexpm", optional: false]}, {:jose, "~> 1.11.1", [hex: :jose, repo: "hexpm", optional: false]}], "hexpm", "4f82b2e57622fb9337559058e8797cb0df7e7c9790793bdc4e40bc895f70e2a2"},

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 95 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 981 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1 KiB

After

Width:  |  Height:  |  Size: 4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 124 B

After

Width:  |  Height:  |  Size: 81 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1,014 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 854 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 533 KiB

View file

@ -0,0 +1,45 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="172.99954mm"
height="26.458334mm"
viewBox="0 0 172.99955 26.458334"
version="1.1"
id="svg31383"
xml:space="preserve"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><defs
id="defs31380" /><g
aria-label="Rebased"
id="text1402"
style="font-size:31.2405px;fill:#0482d8;stroke:#0482d8;stroke-width:14.5079"><path
d="M 31.199042,24.663189 V 2.7948393 H 41.72709 q 3.061569,0 5.279644,0.999696 2.249316,0.999696 3.467696,2.8741259 1.218379,1.8431895 1.218379,4.3736698 0,2.530481 -1.218379,4.37367 -1.21838,1.811949 -3.467696,2.780405 -2.218075,0.968455 -5.279644,0.968455 h -6.435543 l 3.280252,-3.030328 v 8.528656 z m 13.089769,0 -5.373366,-7.966327 h 7.810125 l 5.435847,7.966327 z m -5.717012,-7.716403 -3.280252,-3.342734 h 5.966935 q 1.530785,0 2.249316,-0.687291 0.749772,-0.687291 0.749772,-1.87443 0,-1.1871388 -0.749772,-1.8744298 -0.718531,-0.687291 -2.249316,-0.687291 h -5.966935 l 3.280252,-3.3427335 z"
style="font-weight:900;font-family:Montserrat;-inkscape-font-specification:'Montserrat Heavy';stroke:none"
id="path2359" /><path
d="m 63.689128,24.975594 q -3.12405,0 -5.467087,-1.155899 -2.311797,-1.155898 -3.592658,-3.15529 -1.28086,-2.030632 -1.28086,-4.561113 0,-2.592961 1.24962,-4.592353 1.28086,-1.9993923 3.467695,-3.1240503 2.218076,-1.124658 4.96724,-1.124658 2.53048,0 4.654834,0.999696 2.155595,0.999696 3.436455,2.9678473 1.312101,1.968152 1.312101,4.873518 0,0.374886 -0.03124,0.843494 -0.03124,0.437367 -0.06248,0.812253 H 59.190496 v -3.405215 h 9.403391 l -2.655443,0.905975 q 0,-0.999696 -0.374886,-1.686987 -0.343645,-0.718532 -0.968455,-1.093418 -0.62481,-0.406126 -1.499544,-0.406126 -0.874734,0 -1.530785,0.406126 -0.62481,0.374886 -0.968455,1.093418 -0.343646,0.687291 -0.343646,1.686987 v 1.062177 q 0,1.093417 0.437367,1.87443 0.437367,0.781012 1.24962,1.187139 0.812253,0.374886 1.968152,0.374886 1.187139,0 1.936911,-0.312405 0.781012,-0.312405 1.624506,-0.937215 l 3.686379,3.717619 q -1.24962,1.343341 -3.09281,2.061873 -1.811949,0.687291 -4.37367,0.687291 z"
style="font-weight:900;font-family:Montserrat;-inkscape-font-specification:'Montserrat Heavy';stroke:none"
id="path2361" /><path
d="m 86.057319,24.975594 q -2.343037,0 -3.7801,-0.937215 -1.437063,-0.937215 -2.093113,-2.905367 -0.62481,-1.968151 -0.62481,-5.02972 0,-3.030328 0.687291,-4.967239 0.687291,-1.9681518 2.124353,-2.9053668 1.468304,-0.9684555 3.686379,-0.9684555 2.249316,0 4.123746,1.062177 1.87443,1.062177 2.999088,3.0615693 1.124658,1.968151 1.124658,4.717315 0,2.749164 -1.124658,4.748556 -1.124658,1.968151 -2.999088,3.061569 -1.87443,1.062177 -4.123746,1.062177 z M 74.654537,24.663189 V 1.4827383 h 7.060353 v 8.3724539 l -0.312405,6.2480998 -0.03124,6.2481 v 2.311797 z m 9.715795,-5.185923 q 0.781013,0 1.405823,-0.374886 0.62481,-0.374886 0.999696,-1.124658 0.374886,-0.781012 0.374886,-1.87443 0,-1.124658 -0.374886,-1.843189 -0.374886,-0.749772 -0.999696,-1.124658 -0.62481,-0.374886 -1.405823,-0.374886 -0.781012,0 -1.405822,0.374886 -0.62481,0.374886 -0.999696,1.124658 -0.374886,0.718531 -0.374886,1.843189 0,1.093418 0.374886,1.87443 0.374886,0.749772 0.999696,1.124658 0.62481,0.374886 1.405822,0.374886 z"
style="font-weight:900;font-family:Montserrat;-inkscape-font-specification:'Montserrat Heavy';stroke:none"
id="path2363" /><path
d="M 106.4261,24.663189 V 21.63286 l -0.49985,-0.812253 v -5.748251 q 0,-1.24962 -0.78101,-1.905671 -0.74978,-0.65605 -2.468,-0.65605 -1.1559,0 -2.34304,0.374886 -1.18714,0.343645 -2.030633,0.968455 L 96.054251,9.1991417 q 1.499544,-0.937215 3.592657,-1.437063 2.093112,-0.499848 4.092502,-0.499848 4.40491,0 6.81043,1.9681515 2.43676,1.9681518 2.43676,6.2480998 v 9.184707 z m -4.84228,0.312405 q -2.093114,0 -3.498937,-0.718532 -1.405822,-0.718531 -2.124354,-1.90567 -0.718531,-1.21838 -0.718531,-2.686683 0,-1.655746 0.843493,-2.811645 0.843494,-1.155898 2.561721,-1.749468 1.749468,-0.593569 4.404908,-0.593569 h 3.56142 v 3.405214 h -2.43676 q -1.12466,0 -1.65575,0.374886 -0.49984,0.343646 -0.49984,1.062177 0,0.59357 0.43736,0.999696 0.46861,0.374886 1.24962,0.374886 0.71853,0 1.3121,-0.374886 0.62481,-0.406126 0.90598,-1.24962 l 0.90597,2.093113 q -0.40612,1.905671 -1.71822,2.842886 -1.31211,0.937215 -3.53018,0.937215 z"
style="font-weight:900;font-family:Montserrat;-inkscape-font-specification:'Montserrat Heavy';stroke:none"
id="path2365" /><path
d="m 122.73363,24.975594 q -2.18683,0 -4.31118,-0.468608 -2.12436,-0.468607 -3.43646,-1.218379 l 1.93691,-4.654834 q 1.21838,0.718531 2.81165,1.124658 1.6245,0.406126 3.15529,0.406126 1.28086,0 1.71822,-0.218683 0.46861,-0.218684 0.46861,-0.59357 0,-0.374886 -0.53109,-0.531088 -0.53108,-0.187443 -1.40582,-0.281165 -0.87473,-0.09372 -1.93691,-0.218683 -1.03094,-0.156203 -2.09311,-0.437367 -1.06218,-0.281165 -1.93691,-0.843494 -0.87474,-0.562329 -1.40583,-1.499544 -0.53108,-0.968455 -0.53108,-2.436759 0,-1.624506 0.96845,-2.936607 0.9997,-1.3121008 2.93661,-2.0931133 1.96815,-0.812253 4.84227,-0.812253 1.87443,0 3.74886,0.3436455 1.87443,0.3436455 3.21778,1.062177 l -1.93691,4.6548348 q -1.31211,-0.718532 -2.59297,-0.968456 -1.24962,-0.281164 -2.34303,-0.281164 -1.34335,0 -1.84319,0.249924 -0.46861,0.249924 -0.46861,0.562329 0,0.374886 0.53109,0.562329 0.53109,0.187443 1.40582,0.281164 0.87473,0.09372 1.90567,0.249924 1.06218,0.124962 2.09311,0.437367 1.06218,0.281165 1.93692,0.843494 0.87473,0.562329 1.40582,1.530784 0.53109,0.937215 0.53109,2.405519 0,1.530784 -0.96846,2.874125 -0.96845,1.312101 -2.93661,2.124354 -1.96815,0.781013 -4.936,0.781013 z"
style="font-weight:900;font-family:Montserrat;-inkscape-font-specification:'Montserrat Heavy';stroke:none"
id="path2367" /><path
d="m 143.13363,24.975594 q -3.12405,0 -5.46709,-1.155899 -2.31179,-1.155898 -3.59265,-3.15529 -1.28086,-2.030632 -1.28086,-4.561113 0,-2.592961 1.24962,-4.592353 1.28086,-1.9993923 3.46769,-3.1240503 2.21808,-1.124658 4.96724,-1.124658 2.53048,0 4.65484,0.999696 2.15559,0.999696 3.43645,2.9678473 1.3121,1.968152 1.3121,4.873518 0,0.374886 -0.0312,0.843494 -0.0312,0.437367 -0.0625,0.812253 H 138.635 v -3.405215 h 9.40339 l -2.65544,0.905975 q 0,-0.999696 -0.37489,-1.686987 -0.34364,-0.718532 -0.96845,-1.093418 -0.62481,-0.406126 -1.49955,-0.406126 -0.87473,0 -1.53078,0.406126 -0.62481,0.374886 -0.96846,1.093418 -0.34364,0.687291 -0.34364,1.686987 v 1.062177 q 0,1.093417 0.43736,1.87443 0.43737,0.781012 1.24962,1.187139 0.81226,0.374886 1.96816,0.374886 1.18713,0 1.93691,-0.312405 0.78101,-0.312405 1.6245,-0.937215 l 3.68638,3.717619 q -1.24962,1.343341 -3.09281,2.061873 -1.81195,0.687291 -4.37367,0.687291 z"
style="font-weight:900;font-family:Montserrat;-inkscape-font-specification:'Montserrat Heavy';stroke:none"
id="path2369" /><path
d="m 161.59676,24.975594 q -2.21807,0 -4.12375,-1.062177 -1.87443,-1.093418 -2.99908,-3.061569 -1.12466,-1.999392 -1.12466,-4.748556 0,-2.749164 1.12466,-4.717315 1.12465,-1.9993923 2.99908,-3.0615693 1.90568,-1.062177 4.12375,-1.062177 2.24932,0 3.68638,0.9684555 1.43706,0.937215 2.12435,2.9053668 0.68729,1.936911 0.68729,4.967239 0,3.061569 -0.65605,5.02972 -0.62481,1.968152 -2.06187,2.905367 -1.40582,0.937215 -3.7801,0.937215 z m 1.68699,-5.498328 q 0.78101,0 1.40582,-0.374886 0.62481,-0.374886 0.9997,-1.124658 0.37488,-0.781012 0.37488,-1.87443 0,-1.124658 -0.37488,-1.843189 -0.37489,-0.749772 -0.9997,-1.124658 -0.62481,-0.374886 -1.40582,-0.374886 -0.78101,0 -1.40582,0.374886 -0.62481,0.374886 -0.9997,1.124658 -0.37489,0.718531 -0.37489,1.843189 0,1.093418 0.37489,1.87443 0.37489,0.749772 0.9997,1.124658 0.62481,0.374886 1.40582,0.374886 z m 2.99909,5.185923 v -2.311797 l -0.0312,-6.2481 -0.31241,-6.2480998 V 1.4827383 h 7.06035 V 24.663189 Z"
style="font-weight:900;font-family:Montserrat;-inkscape-font-specification:'Montserrat Heavy';stroke:none"
id="path2371" /></g><path
id="path337-7-6-2"
style="fill:#0482d8;stroke-width:1.9864"
d="m 22.583601,3.874735 a 13.229167,13.229167 0 0 1 0,18.708865 13.229167,13.229167 0 0 1 -18.7088674,2e-6 13.229167,13.229167 0 0 1 0,-18.7088685 13.229167,13.229167 0 0 1 18.7088674,1.5e-6 z" /><path
id="path337-7-6-2-2"
clip-path="none"
style="fill:#ffffff;stroke-width:9.25897"
d="M 412.38163 316.12998 A 19.374084 19.374084 0 0 0 399.20541 310.95896 A 19.374084 19.374084 0 0 0 379.83112 330.33325 A 19.374084 19.374084 0 0 0 380.13771 333.69203 L 359.06189 339.76917 A 14.165557 14.165557 0 0 0 345.32189 329.02006 A 14.165557 14.165557 0 0 0 338.49022 330.78631 L 328.8959 316.6682 A 14.846037 14.846037 0 0 0 332.03156 298.75188 A 14.846037 14.846037 0 0 0 319.42252 290.85398 A 61.663666 61.663666 0 0 0 306.59716 313.95325 A 14.846037 14.846037 0 0 0 325.71937 318.87389 L 335.28644 333.2032 A 14.165557 14.165557 0 0 0 331.1561 343.18586 A 14.165557 14.165557 0 0 0 345.32189 357.35165 A 14.165557 14.165557 0 0 0 359.47066 343.91484 L 381.1903 337.45958 A 19.374084 19.374084 0 0 0 399.20541 349.70754 A 19.374084 19.374084 0 0 0 418.5797 330.33325 A 19.374084 19.374084 0 0 0 412.38163 316.12998 z "
transform="matrix(0.1517009,-0.1517009,0.1517009,0.1517009,-92.512315,18.419317)" /></svg>

After

Width:  |  Height:  |  Size: 9.2 KiB

View file

@ -1 +1,75 @@
<!DOCTYPE html><html lang=en><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,user-scalable=no"><!--server-generated-meta--><link rel=icon type=image/png href=/favicon.png><link href=/static/css/app.7d2d223f75c3a14b0991.css rel=stylesheet></head><body class=hidden><noscript>To use Pleroma, please enable JavaScript.</noscript><div id=app></div><script type=text/javascript src=/static/js/vendors~app.cea10ab53f3aa19fc30e.js></script><script type=text/javascript src=/static/js/app.6c972d84b60f601b01f8.js></script></body></html>
<!DOCTYPE html>
<html lang="en">
<head>
<title>Welcome to Rebased</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover,user-scalable=no">
<link rel="icon" type="image/png" href="/favicon.png">
<style type="text/css">
:root {
--brand-color: #0482d8;
--background-color: #f2f2f2;
}
body {
background-color: var(--background-color);
font-family: 'Lato', sans-serif;
padding: 0;
margin: 0;
}
main {
max-width: 500px;
margin: 0 auto;
padding: 30px;
}
.logo {
width: 100%;
display: block;
}
h2 {
font-size: 1.5rem;
font-weight: normal;
line-height: 1.5;
}
p {
line-height: 1.5;
}
a {
color: var(--brand-color);
}
code {
display: block;
color: white;
background-color: black;
border-radius: 10px;
padding: 10px;
}
code.inline {
display: inline;
border-radius: 4px;
padding: 4px;
}
</style>
<!--server-generated-meta-->
</head>
<body>
<main>
<img class="logo" src="/images/rebased-wide.svg" alt="Rebased" />
<h2>Almost done...</h2>
<p>Congrats! 🎉 You've installed Rebased. Now you just need to install a frontend.</p>
<h2>Installing Soapbox</h2>
<p>To install <a href="https://gitlab.com/soapbox-pub/soapbox-fe" target="_blank">Soapbox</a>, SSH into the server and download a .zip of the latest build:</p>
<code>curl -L https://gitlab.com/soapbox-pub/soapbox-fe/-/jobs/artifacts/develop/download?job=build-production -o soapbox-fe.zip</code>
<p>Then unpack it into the <code class="inline">instance</code> directory:</p>
<code>busybox unzip soapbox-fe.zip -o -d /opt/pleroma/instance</code>
<p><strong>That's it!</strong> Just refresh this page.</p>
</main>
</body>
</html>

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

View file

Before

Width:  |  Height:  |  Size: 9.6 KiB

After

Width:  |  Height:  |  Size: 9.6 KiB

View file

@ -42,7 +42,8 @@
"vcard": "http://www.w3.org/2006/vcard/ns#",
"sm": "http://smithereen.software/ns#",
"nonAnonymous": "sm:nonAnonymous",
"formerRepresentations": "litepub:formerRepresentations"
"formerRepresentations": "litepub:formerRepresentations",
"votersCount" : "toot:votersCount"
}
]
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 628 KiB

View file

@ -1,28 +0,0 @@
{
"alwaysShowSubjectInput": true,
"background": "/static/aurora_borealis.jpg",
"collapseMessageWithSubject": false,
"greentext": false,
"hideFilteredStatuses": false,
"hideMutedPosts": false,
"hidePostStats": false,
"hideSitename": false,
"hideUserStats": false,
"loginMethod": "password",
"logo": "/static/logo.svg",
"logoMargin": ".1em",
"logoMask": true,
"logoLeft": false,
"minimalScopesMode": false,
"nsfwCensorImage": "",
"postContentType": "text/plain",
"redirectRootLogin": "/main/friends",
"redirectRootNoLogin": "/main/all",
"scopeCopy": true,
"showFeaturesPanel": true,
"showInstanceSpecificPanel": false,
"sidebarRight": false,
"subjectLineBehavior": "email",
"theme": "pleroma-dark",
"webPushNotifications": false
}

View file

@ -1 +0,0 @@
{"version":3,"sources":["webpack:///./src/hocs/with_subscription/with_subscription.scss"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA,C","file":"static/css/2.0778a6a864a1307a6c41.css","sourcesContent":[".with-subscription-loading {\n padding: 10px;\n text-align: center;\n}\n.with-subscription-loading .error {\n font-size: 14px;\n}"],"sourceRoot":""}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Some files were not shown because too many files have changed in this diff Show more