diff --git a/config/config.exs b/config/config.exs index 683805fe3..8a76c6517 100644 --- a/config/config.exs +++ b/config/config.exs @@ -64,9 +64,9 @@ config :pleroma, Pleroma.Upload, link_name: false, proxy_remote: false, filename_display_max_length: 30, - default_description: nil, + default_description: :filename, base_url: nil, - allowed_mime_types: ["image", "audio", "video"] + allowed_mime_types: ["image", "audio", "video", "application"] config :pleroma, Pleroma.Uploaders.Local, uploads: "uploads" @@ -167,18 +167,18 @@ config :pleroma, :http, adapter: [] config :pleroma, :instance, - name: "Pleroma", - email: "example@example.com", - notify_email: "noreply@example.com", - description: "Pleroma: An efficient and flexible fediverse server", - short_description: "", + name: "Shigusegubu", + email: "pleroma@hjkos.com", + notify_email: "pleroma@hjkos.com", + description: "SigSegV, a pleroma instance", + short_description: "HJ's semi-personal instance", background_image: "/images/city.jpg", instance_thumbnail: "/instance/thumbnail.jpeg", favicon: "/favicon.png", limit: 5_000, description_limit: 5_000, remote_limit: 100_000, - upload_limit: 16_000_000, + upload_limit: 200_000_000, avatar_upload_limit: 2_000_000, background_upload_limit: 4_000_000, banner_upload_limit: 4_000_000, @@ -196,19 +196,17 @@ config :pleroma, :instance, federation_incoming_replies_max_depth: 100, allow_relay: true, public: true, - quarantined_instances: [], + quarantined_instances: [{ "pleroma.rareome.ga", "leaks private posts or sumshit i dont rember" }], rejected_instances: [], static_dir: "instance/static/", allowed_post_formats: [ "text/plain", - "text/html", - "text/markdown", "text/bbcode" ], autofollowed_nicknames: [], autofollowing_nicknames: [], max_pinned_statuses: 1, - attachment_links: false, + attachment_links: true, max_report_comment_size: 1000, report_strip_status: true, safe_dm_mentions: false, @@ -301,8 +299,8 @@ config :pleroma, :markup, config :pleroma, :frontend_configurations, pleroma_fe: %{ - alwaysShowSubjectInput: true, - background: "/images/city.jpg", + alwaysShowSubjectInput: false, + background: "/static/sigsegv_s.png", collapseMessageWithSubject: false, disableChat: false, greentext: false, @@ -316,18 +314,18 @@ config :pleroma, :frontend_configurations, logo: "/static/logo.svg", logoMargin: ".1em", logoMask: true, - minimalScopesMode: false, + minimalScopesMode: true, noAttachmentLinks: false, nsfwCensorImage: "", postContentType: "text/plain", redirectRootLogin: "/main/friends", redirectRootNoLogin: "/main/all", - scopeCopy: true, + scopeCopy: false, sidebarRight: false, showFeaturesPanel: true, - showInstanceSpecificPanel: false, - subjectLineBehavior: "email", - theme: "pleroma-dark", + showInstanceSpecificPanel: true, + subjectLineBehavior: "noop", + theme: "sigsegv2", webPushNotifications: false } @@ -386,8 +384,23 @@ config :pleroma, :mrf_hellthread, config :pleroma, :mrf_simple, media_removal: [], - media_nsfw: [], - federated_timeline_removal: [], + media_nsfw: [ + { "preteengirls.biz", "pron or even cp" }, + { "melalandia.tk", "i don't rember" }, + { "pl.smuglo.li", "instance is dead but i still remember, rip smuglo" }, + { "baraag.net", "pron" }, + { "humblr.social", "3dpd pron" }, + { "pawoo.net", "tasteful pron, mostly." }, + { "sinblr.com", "3dpd pron" } + ], + federated_timeline_removal: [ + { "preteengirls.biz", "pron or even cp" }, + { "melalandia.tk", "i don't rember" }, + { "baraag.net", "pron" }, + { "humblr.social", "3dpd pron" }, + { "pawoo.net", "tasteful pron, mostly." }, + { "sinblr.com", "3dpd pron" } + ], report_removal: [], reject: [], followers_only: [], @@ -498,7 +511,7 @@ config :pleroma, :media_preview_proxy, min_content_length: 100 * 1024 config :pleroma, :shout, - enabled: true, + enabled: false, limit: 5_000 config :phoenix, :format_encoders, json: Jason, "activity+json": Jason @@ -826,7 +839,7 @@ config :pleroma, :web_cache_ttl, config :pleroma, :modules, runtime_dir: "instance/modules" -config :pleroma, configurable_from_database: false +config :pleroma, configurable_from_database: true config :pleroma, Pleroma.Repo, parameters: [gin_fuzzy_search_limit: "500", jit: "off"], @@ -899,9 +912,13 @@ config :pleroma, Pleroma.Web.ApiSpec.CastAndValidate, strict: false config :pleroma, :mrf, policies: [ - Pleroma.Web.ActivityPub.MRF.ObjectAgePolicy, + Pleroma.Web.ActivityPub.MRF.SimplePolicy, + Pleroma.Web.ActivityPub.MRF.HellthreadPolicy, + Pleroma.Web.ActivityPub.MRF.AntiFollowbotPolicy, Pleroma.Web.ActivityPub.MRF.TagPolicy, - Pleroma.Web.ActivityPub.MRF.InlineQuotePolicy + Pleroma.Web.ActivityPub.MRF.ObjectAgePolicy, + Pleroma.Web.ActivityPub.MRF.InlineQuotePolicy, + Pleroma.Web.ActivityPub.MRF.AntiLinkSpamPolicy ], transparency: true, transparency_exclusions: [] diff --git a/installation/pleroma.service b/installation/pleroma.service index 8338228d8..9e959e1ac 100644 --- a/installation/pleroma.service +++ b/installation/pleroma.service @@ -6,6 +6,7 @@ After=network.target postgresql.service ExecReload=/bin/kill $MAINPID KillMode=process Restart=on-failure +StandardOutput=journal ; Name of the user that runs the Pleroma service. User=pleroma @@ -14,9 +15,11 @@ Environment="MIX_ENV=prod" ; Make sure that all paths fit your installation. ; Path to the home directory of the user running the Pleroma service. -Environment="HOME=/var/lib/pleroma" +Environment="HOME=/home/pleroma" ; Path to the folder containing the Pleroma installation. -WorkingDirectory=/opt/pleroma +WorkingDirectory=/home/pleroma/pleroma +; Path to the environment file. the file contains RELEASE_COOKIE and etc +;EnvironmentFile=/opt/pleroma/config/pleroma.env ; Path to the Mix binary. ExecStart=/usr/bin/mix phx.server @@ -24,7 +27,7 @@ ExecStart=/usr/bin/mix phx.server ; Use private /tmp and /var/tmp folders inside a new file system namespace, which are discarded after the process stops. PrivateTmp=true ; The /home, /root, and /run/user folders can not be accessed by this service anymore. If your Pleroma user has its home folder in one of the restricted places, or use one of these folders as its working directory, you have to set this to false. -ProtectHome=true +ProtectHome=false ; Mount /usr, /boot, and /etc as read-only for processes invoked by this service. ProtectSystem=full ; Sets up a new /dev mount for the process and only adds API pseudo devices like /dev/null, /dev/zero or /dev/random but not physical devices. Disabled by default because it may not work on devices like the Raspberry Pi. diff --git a/lib/pleroma/constants.ex b/lib/pleroma/constants.ex index c0411edbf..ba775f430 100644 --- a/lib/pleroma/constants.ex +++ b/lib/pleroma/constants.ex @@ -133,11 +133,15 @@ defmodule Pleroma.Constants do do: ~r/^[^[:cntrl:] ()<>@,;:\\"\/\[\]?=]+\/[^[:cntrl:] ()<>@,;:\\"\/\[\]?=]+(; .*)?$/ ) - # List of allowed chars in the path segment of a URI - # unreserved, sub-delims, ":", "@" and "/" allowed as the separator in path - # https://datatracker.ietf.org/doc/html/rfc3986 - const(uri_path_allowed_reserved_chars, - do: ~c"!$&'()*+,;=/:@" + const(activity_json_canonical_mime_type, + do: "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"" + ) + + const(activity_json_mime_types, + do: [ + "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"", + "application/activity+json" + ] ) const(upload_object_types, do: ["Document", "Image"]) diff --git a/lib/pleroma/web/templates/layout/app.html.eex b/lib/pleroma/web/templates/layout/app.html.eex index e33bada85..99ab0ddad 100644 --- a/lib/pleroma/web/templates/layout/app.html.eex +++ b/lib/pleroma/web/templates/layout/app.html.eex @@ -13,8 +13,10 @@

<%= Pleroma.Config.get([:instance, :name]) %>

-
- <%= @inner_content %> +
+
+ <%= @inner_content %> +
diff --git a/lib/pleroma/web/templates/o_auth/o_auth/_scopes.html.eex b/lib/pleroma/web/templates/o_auth/o_auth/_scopes.html.eex index 310bf2358..fb34b551d 100644 --- a/lib/pleroma/web/templates/o_auth/o_auth/_scopes.html.eex +++ b/lib/pleroma/web/templates/o_auth/o_auth/_scopes.html.eex @@ -5,10 +5,19 @@ <% # Note: using hidden input with `unchecked_value` in order to distinguish user's empty selection from `scope` param being omitted %> <%= if scope in @scopes do %>
- <%= checkbox @form, :"scope_#{scope}", value: scope in @scopes && scope, checked_value: scope, unchecked_value: "", name: "authorization[scope][]" %> - <%= label @form, :"scope_#{scope}", String.capitalize(scope) %> + + <%= checkbox @form, :"scope_#{scope}", value: scope in @scopes && scope, checked_value: scope, unchecked_value: "", name: "authorization[scope][]" %> + <%= label @form, :"scope_#{scope}", "" %> + <%= if scope in @scopes && scope do %> - <%= scope %> <%= :"Elixir.Gettext".dgettext(Gettext, "oauth_scopes", scope) %> +
+
+ <%= :"Elixir.Gettext".dgettext(Gettext, "oauth_scopes", scope) %> +
+
+ <%= scope %> +
+
<% end %>
<% else %> diff --git a/lib/pleroma/web/templates/o_auth/o_auth/show.html.eex b/lib/pleroma/web/templates/o_auth/o_auth/show.html.eex index 6bc8eb602..aadddf1f4 100644 --- a/lib/pleroma/web/templates/o_auth/o_auth/show.html.eex +++ b/lib/pleroma/web/templates/o_auth/o_auth/show.html.eex @@ -8,17 +8,20 @@ <%= form_for @conn, Routes.o_auth_path(@conn, :authorize), [as: "authorization"], fn f -> %> <%= if @user do %> -
- - - + <% end %> -
+
<%= if @app do %>

<%= raw Gettext.dpgettext("static_pages", "oauth authorize message", "Application %{client_name} is requesting access to your account.", client_name: safe_to_string(html_escape(@app.client_name))) %>

<%= render Phoenix.Controller.view_module(@conn), "_scopes.html", Map.merge(assigns, %{form: f}) %> @@ -29,7 +32,7 @@ <%= Gettext.dpgettext("static_pages", "oauth authorize cancel button", "Cancel") %> - <%= submit Gettext.dpgettext("static_pages", "oauth authorize approve button", "Approve"), class: "button--approve" %> + <%= submit Gettext.dpgettext("static_pages", "oauth authorize approve button", "Approve"), class: "button button--approve" %>
<% else %> <%= if @params["registration"] in ["true", true] do %> @@ -51,7 +54,9 @@ <%= label f, :password, Gettext.dpgettext("static_pages", "oauth login password prompt", "Password") %> <%= password_input f, :password %>
- <%= submit Gettext.dpgettext("static_pages", "oauth login button", "Log In") %> +
+ <%= submit Gettext.dpgettext("static_pages", "oauth login button", "Log In"), class: "button button--approve" %> +
<% end %> <% end %>
diff --git a/priv/static/instance/static.css b/priv/static/instance/static.css index 48c74c125..32f56d510 100644 --- a/priv/static/instance/static.css +++ b/priv/static/instance/static.css @@ -3,206 +3,84 @@ } :root { - --brand-color: #d8a070; - --background-color: #121a24; - --foreground-color: #182230; - --primary-text-color: #b9b9ba; - --muted-text-color: #89898a; + font-size: 16px; + + --bg: rgba(18, 26, 36, 1); + --fg: rgba(24, 34, 48, 1); + --text: rgba(185, 185, 186, 1); + --link: rgba(216, 160, 112, 1); + --accent: rgba(216, 160, 112, 1); + --cRed: rgba(211, 16, 20, 1); + --cBlue: rgba(0, 149, 255, 1); + --cGreen: rgba(15, 160, 15, 1); + --cOrange: rgba(255, 165, 0, 1); + --font: sans-serif; + --monoFont: monospace; + --wallpaper: rgba(14, 21, 29, 1); + --selectionBackground: rgba(216, 160, 112, 1); + --selectionText: rgba(0, 0, 0, 1); + --badgeNotification: rgba(211, 16, 20, 1); } body { - background-color: var(--background-color); + background-color: var(--wallpaper); font-family: sans-serif; - color: var(--primary-text-color); + color: var(--text); padding: 0; margin: 0; -} - -.instance-header { - height: 60px; - padding: 10px; - background: var(--foreground-color); - box-shadow: 0 1px 4px 0px rgba(0, 0, 0, 0.5); -} - -.instance-header__content { display: flex; - align-items: center; - max-width: 400px; - margin: 0 auto; -} - -.instance-header__thumbnail { - max-width: 40px; - border-radius: 4px; - margin-right: 12px; -} - -.instance-header__title { - font-size: 16px; - font-weight: bold; - color: var(--primary-text-color); -} - -.container { - max-width: 400px; - background-color: var(--foreground-color); - border-radius: 4px; - overflow: hidden; - margin: 35px auto; - box-shadow: 0 1px 4px 0px rgba(0, 0, 0, 0.5); - padding: 0em 1em 0em 1em; -} - -.container__content { - padding: 0 20px; -} - -h1 { - margin: 0; - font-size: 24px; - text-align: center; -} - -h2 { - color: var(--primary-text-color); - font-weight: normal; - font-size: 18px; - margin-bottom: 20px; + flex-direction: column; + align-items: stretch; } a { - color: var(--brand-color); + color: var(--link); text-decoration: none; } -form { - width: 100%; -} - -.input { - color: var(--muted-text-color); - display: flex; - flex-direction: column; -} - -input { - padding: 10px; - margin-top: 5px; - margin-bottom: 10px; - background-color: var(--background-color); - color: var(--primary-text-color); - border: 0; - transition-property: border-bottom; - transition-duration: 0.35s; - border-bottom: 2px solid #2a384a; - font-size: 14px; - width: inherit; - box-sizing: border-box; -} - -.scopes-input { - display: flex; - flex-direction: column; - margin: 1em 0; - color: var(--muted-text-color); -} - -.scopes-input label:first-child { - height: 2em; -} - -.scopes { - display: flex; - flex-wrap: wrap; - color: var(--primary-text-color); -} - -.scope { - display: flex; - flex-basis: 100%; - height: 2em; - align-items: center; -} - -.scope:before { - color: var(--primary-text-color); - content: "✔\fe0e"; - margin-left: 1em; - margin-right: 1em; -} - -[type="checkbox"] + label { - display: none; - cursor: pointer; - margin: 0.5em; -} - -[type="checkbox"] { - display: none; -} - -[type="checkbox"] + label:before { - cursor: pointer; - display: inline-block; - color: white; - background-color: var(--background-color); - border: 4px solid var(--background-color); - box-shadow: 0px 0px 1px 0 var(--brand-color); - width: 1.2em; - height: 1.2em; - margin-right: 1.0em; - content: ""; - transition-property: background-color; - transition-duration: 0.35s; - color: var(--background-color); - margin-bottom: -0.2em; - border-radius: 2px; -} - -[type="checkbox"]:checked + label:before { - background-color: var(--brand-color); -} - -input:focus { - outline: none; - border-bottom: 2px solid var(--brand-color); -} - -.actions { - display: flex; - justify-content: flex-end; -} - -.actions button, -.actions a.button { - width: auto; - margin-left: 10px; -} - -a.button, -button { +.button { width: 100%; background-color: #1c2a3a; color: var(--primary-text-color); border-radius: 4px; border: none; - padding: 10px 16px; - margin-top: 20px; - margin-bottom: 20px; - text-transform: uppercase; - font-size: 16px; - box-shadow: 0px 0px 2px 0px black, - 0px 1px 0px 0px rgba(255, 255, 255, 0.2) inset, - 0px -1px 0px 0px rgba(0, 0, 0, 0.2) inset; + padding: 0 1em; + line-height: 2; + margin-top: 2em; + font-size: 1em; + cursor: pointer; + box-shadow: + 0 0 2px 0 black, + 0 1px 0 0 rgba(255, 255, 255, 0.2) inset, + 0 -1px 0 0 rgba(0, 0, 0, 0.2) inset; } -a.button:hover, -button:hover { - cursor: pointer; - box-shadow: 0px 0px 0px 1px var(--brand-color), - 0px 1px 0px 0px rgba(255, 255, 255, 0.2) inset, - 0px -1px 0px 0px rgba(0, 0, 0, 0.2) inset; +.button:hover { + box-shadow: + 0 0 1px 2px rgba(185, 185, 186, 0.4), + 0 1px 0 0 rgba(255, 255, 255, 0.2) inset, + 0 -1px 0 0 rgba(0, 0, 0, 0.2) inset; +} + +.button:active { + transform: translate(1px, 1px); + box-shadow: + 0 0 2px 0 black, + 0 -1px 0 0 rgba(255, 255, 255, 0.2) inset, + 0 1px 0 0 rgba(0, 0, 0, 0.2) inset; +} + +.button:hover:active { + box-shadow: + 0 0 1px 2px rgba(185, 185, 186, 0.4), + 0 -1px 0 0 rgba(255, 255, 255, 0.2) inset, + 0 1px 0 0 rgba(0, 0, 0, 0.2) inset; +} + +.input { + color: var(--text); + display: flex; + flex-direction: column; } .alert-danger { @@ -226,73 +104,222 @@ button:hover { font-size: 16px; } -.account-header__banner { +.instance-header { + display: flex; + height: 3.5rem; + padding: 0 1em; + background: var(--fg); + box-shadow: + 0 1px 4px 0 rgba(0, 0, 0, 0.4), + 0 2px 7px 0 rgba(0, 0, 0, 0.3); + justify-content: center; + align-self: stretch; + margin-bottom: 1rem; +} + +.instance-header__content { + line-height: 3.5rem; + display: flex; + flex: 1 1 45em; + max-width: 45em; + align-items: center; +} + +.instance-header__thumbnail { + max-width: 3.5em; + border-radius: 0.25em; + margin-right: 0.75em; +} + +.instance-header__title { + font-weight: bold; + color: var(--text); + font-size: 1rem; +} + +.contents { + display: flex; + align-items: stretch; + justify-content: center; +} + +.panel { + color: var(--text); + background-color: var(--bg); + position: relative; + max-width: 45em; + border-radius: 0.5em; + overflow: hidden; + margin: 0; + box-shadow: + 0 0 3px 0 rgba(0, 0, 0, 0.5), + 0 4px 6px 3px rgba(0, 0, 0, 0.3); + padding: 0; + flex: 1 1 45em; +} + +.button { + width: auto; +} + +.panel-body { + padding: 0 1em 1em; + background-color: var(--bg); +} + +.actions { + display: flex; + justify-content: flex-end; +} + +.actions .button { + margin-left: 0.5em; +} + +.account-header { + position: relative; + display: flex; + align-items: end; + width: 100%; + aspect-ratio: 3; + gap: 1em; + padding: 0 1em; +} + +.account-header_container { + position: absolute; + inset: 0; + z-index: 0; + mask: linear-gradient(to top,transparent 0,white 5em) bottom no-repeat; +} + +.account-header__overlay, +.account-header__banner { + position: absolute; + width: 100%; + inset: 0; +} + +.account-header__overlay { + background-color: rgba(18, 26, 36, 0.5); + z-index: -1; +} + +.account-header__banner { + z-index: -2; + object-fit: cover; width: 100%; - height: 112px; - background-size: cover; - background-position: center; } .account-header__avatar { - width: 94px; - height: 94px; + width: 6em; + height: 6em; + flex: 0 0 6em; + z-index: 1; background-size: cover; background-position: center; - margin: -47px 10px 0; - border: 6px solid var(--foreground-color); - border-radius: 999px; } .account-header__meta { - padding: 6px 20px 17px; + z-index: 1; + flex: 1 1 0; + display: flex; + flex-direction: column; + min-width: 10em; + font-size: 125%; } +.account-header__nickname, .account-header__display-name { - font-size: 20px; + font-size: 1.25em; + white-space: nowrap; + overflow-x: hidden; + text-overflow: ellipsis; +} + +.acocunt-header__display-name { font-weight: bold; } .account-header__nickname { - font-size: 14px; - color: var(--muted-text-color); + font-size: 0.75em; + color: var(--link); } -@media all and (max-width: 420px) { - .container { - margin: 0 auto; - border-radius: 0; - } - - .scope { - flex-basis: 0%; - } - - .scope:before { - content: ""; - margin-left: 0em; - margin-right: 1em; - } - - .scope:first-child:before { - margin-left: 1em; - content: "✔\fe0e"; - } - - .scope:after { - content: ","; - } - - .scope:last-child:after { - content: ""; - } +input { + display: inline-block; + background-color: var(--background); + outline: none; + color: var(--text); + line-height: 2; + border-radius: 0.5em; + box-shadow: var(--shadow); + border: none; + padding: 0 0.5em; } -.form-row { + +input[type="checkbox"] { + display: none; +} + +input, label, label::before { + --background: rgba(15, 21, 30, 1); + --shadow: + 0 0 2px 0 rgba(0, 0, 0, 1), + 0 -1px 0 0 rgba(255, 255, 255, 0.2) inset, + 0 1px 0 0 rgba(0, 0, 0, 0.2) inset, + 0 0 2px 0 rgba(0, 0, 0, 0.15) inset, + 1px 0 1px 1px rgba(185, 185, 186, 0.15), + -1px 0 1px 1px rgba(185, 185, 186, 0.15); + --shadowHover: + 0 0 4px 0 rgba(185, 185, 186, 0.5), + 0 -1px 0 0 rgba(255, 255, 255, 0.2) inset, + 0 1px 0 0 rgba(0, 0, 0, 0.2) inset, + 0 0 2px 0 rgba(0, 0, 0, 0.15) inset, + 1px 0 1px 1px rgba(185, 185, 186, 0.15), + -1px 0 1px 1px rgba(185, 185, 186, 0.15); +} + + +label[type="checkbox"]::before { + content: "" +} + +input[type="checkbox"]:checked + label::before { + content: "✓" +} + +label { + padding: 1em; + display: inline-block; +} + +input[type="checkbox"] + label::before { + content: ""; + + box-shadow: + min-width: 1em; + min-height: 1em; + text-align: center; + box-shadow: var(--shadow); +} + +label:hover::before { + box-shadow: var(--shadowHover); +} + +.scope { display: flex; -} -.form-row > label { - line-height: 47px; - flex: 1; -} -.form-row > input { - flex: 2; + align-items: center; + + dl { + margin: 0.75em; + + display: flex; + flex-direction: column; + + dt, dd { + margin: 0; + } + } }