Compare commits
20 Commits
2abaa9b68a
...
66a66aa8a4
Author | SHA1 | Date | |
---|---|---|---|
66a66aa8a4 | |||
|
7e47439787 | ||
|
245a74f9ca | ||
|
d2842db18d | ||
|
346c37df80 | ||
|
20f06798a0 | ||
|
e66aaee1a4 | ||
|
9bfbba3224 | ||
|
378af3a0a0 | ||
|
d096965eec | ||
a3532b6087 | |||
d6672cfaa4 | |||
ec3497484e | |||
0c669660fe | |||
c840249030 | |||
ad7c411f83 | |||
cbd9c81277 | |||
5d2959ff76 | |||
40c8cd1332 | |||
725b26a938 |
@ -4,3 +4,7 @@ ignore:
|
||||
# We have rate-limits on authentication endpoints in place (including second
|
||||
# factor verification) since Mastodon v3.2.0
|
||||
- CVE-2024-0227
|
||||
# devise-two-factor advisory about generated secrets being weaker than expected
|
||||
# We call `generate_otp_secret` ourselves with a requested length of 32 characters,
|
||||
# which exceeds the recommended remediation of 26 characters, so we're safe
|
||||
- CVE-2024-8796
|
||||
|
21
CHANGELOG.md
@ -2,6 +2,27 @@
|
||||
|
||||
All notable changes to this project will be documented in this file.
|
||||
|
||||
## [4.2.13] - 2024-09-30
|
||||
|
||||
### Security
|
||||
|
||||
- Fix ReDoS vulnerability on some Ruby versions ([GHSA-jpxp-r43f-rhvx](https://github.com/mastodon/mastodon/security/advisories/GHSA-jpxp-r43f-rhvx))
|
||||
- Update dependencies
|
||||
|
||||
### Added
|
||||
|
||||
- Add “A Mastodon update is available.” message on admin dashboard for non-bugfix updates (#32106 by @ClearlyClaire)
|
||||
|
||||
### Changed
|
||||
|
||||
- Change Mastodon to issue correct HTTP signatures by default (#31994 by @ClearlyClaire)
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fix replies collection being cached improperly
|
||||
- Fix security context sometimes not being added in LD-Signed activities (#31871 by @ClearlyClaire)
|
||||
- Fix error when encountering reblog of deleted post in feed rebuild (#32001 by @ClearlyClaire)
|
||||
|
||||
## [4.2.12] - 2024-08-19
|
||||
|
||||
### Fixed
|
||||
|
10
Gemfile.lock
@ -201,7 +201,7 @@ GEM
|
||||
climate_control (0.2.0)
|
||||
cocoon (1.2.15)
|
||||
color_diff (0.1)
|
||||
concurrent-ruby (1.2.3)
|
||||
concurrent-ruby (1.3.4)
|
||||
connection_pool (2.4.1)
|
||||
cose (1.3.0)
|
||||
cbor (~> 0.5.9)
|
||||
@ -256,7 +256,7 @@ GEM
|
||||
multi_json
|
||||
encryptor (3.0.0)
|
||||
erubi (1.12.0)
|
||||
et-orbi (1.2.7)
|
||||
et-orbi (1.2.11)
|
||||
tzinfo
|
||||
excon (0.100.0)
|
||||
fabrication (2.30.0)
|
||||
@ -306,8 +306,8 @@ GEM
|
||||
fog-json (>= 1.0)
|
||||
ipaddress (>= 0.8)
|
||||
formatador (0.3.0)
|
||||
fugit (1.8.1)
|
||||
et-orbi (~> 1, >= 1.2.7)
|
||||
fugit (1.11.1)
|
||||
et-orbi (~> 1, >= 1.2.11)
|
||||
raabro (~> 1.4)
|
||||
fuubar (2.5.1)
|
||||
rspec-core (~> 3.0)
|
||||
@ -527,7 +527,7 @@ GEM
|
||||
premailer (~> 1.7, >= 1.7.9)
|
||||
private_address_check (0.5.0)
|
||||
public_suffix (5.0.3)
|
||||
puma (6.4.2)
|
||||
puma (6.4.3)
|
||||
nio4r (~> 2.0)
|
||||
pundit (2.3.0)
|
||||
activesupport (>= 3.0.0)
|
||||
|
@ -64,4 +64,4 @@ class StatusesIndex < Chewy::Index
|
||||
field(:properties, type: 'keyword', value: ->(status) { status.searchable_properties })
|
||||
field(:created_at, type: 'date', value: ->(status) { clamp_date(status.created_at) })
|
||||
end
|
||||
end
|
||||
end
|
@ -14,7 +14,7 @@ class ActivityPub::RepliesController < ActivityPub::BaseController
|
||||
before_action :set_replies
|
||||
|
||||
def index
|
||||
expires_in 0, public: public_fetch_mode?
|
||||
expires_in 0, public: @status.distributable? && public_fetch_mode?
|
||||
render json: replies_collection_presenter, serializer: ActivityPub::CollectionSerializer, adapter: ActivityPub::Adapter, content_type: 'application/activity+json', skip_activities: true
|
||||
end
|
||||
|
||||
|
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 8.5 KiB After Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 950 B After Width: | Height: | Size: 2.5 KiB |
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 34 KiB |
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 3.5 KiB |
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 46 KiB |
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 5.7 KiB |
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 7.8 KiB |
Before Width: | Height: | Size: 76 KiB After Width: | Height: | Size: 99 KiB |
Before Width: | Height: | Size: 4.0 KiB After Width: | Height: | Size: 9.1 KiB |
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 9.7 KiB |
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 6.0 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 6.9 KiB After Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 7.5 KiB After Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 4.4 KiB |
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 4.6 KiB |
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 5.7 KiB |
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 6.1 KiB |
BIN
app/javascript/icons/bak/android-chrome-144x144.png
Normal file
After Width: | Height: | Size: 5.7 KiB |
BIN
app/javascript/icons/bak/android-chrome-192x192.png
Normal file
After Width: | Height: | Size: 8.5 KiB |
BIN
app/javascript/icons/bak/android-chrome-256x256.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
app/javascript/icons/bak/android-chrome-36x36.png
Normal file
After Width: | Height: | Size: 950 B |
BIN
app/javascript/icons/bak/android-chrome-384x384.png
Normal file
After Width: | Height: | Size: 21 KiB |
BIN
app/javascript/icons/bak/android-chrome-48x48.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
app/javascript/icons/bak/android-chrome-512x512.png
Normal file
After Width: | Height: | Size: 31 KiB |
BIN
app/javascript/icons/bak/android-chrome-72x72.png
Normal file
After Width: | Height: | Size: 2.2 KiB |
BIN
app/javascript/icons/bak/android-chrome-96x96.png
Normal file
After Width: | Height: | Size: 3.2 KiB |
BIN
app/javascript/icons/bak/apple-touch-icon-1024x1024.png
Normal file
After Width: | Height: | Size: 76 KiB |
BIN
app/javascript/icons/bak/apple-touch-icon-114x114.png
Normal file
After Width: | Height: | Size: 4.0 KiB |
BIN
app/javascript/icons/bak/apple-touch-icon-120x120.png
Normal file
After Width: | Height: | Size: 4.3 KiB |
BIN
app/javascript/icons/bak/apple-touch-icon-144x144.png
Normal file
After Width: | Height: | Size: 5.7 KiB |
BIN
app/javascript/icons/bak/apple-touch-icon-152x152.png
Normal file
After Width: | Height: | Size: 6.0 KiB |
BIN
app/javascript/icons/bak/apple-touch-icon-167x167.png
Normal file
After Width: | Height: | Size: 6.9 KiB |
BIN
app/javascript/icons/bak/apple-touch-icon-180x180.png
Normal file
After Width: | Height: | Size: 7.5 KiB |
BIN
app/javascript/icons/bak/apple-touch-icon-57x57.png
Normal file
After Width: | Height: | Size: 1.6 KiB |
BIN
app/javascript/icons/bak/apple-touch-icon-60x60.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
app/javascript/icons/bak/apple-touch-icon-72x72.png
Normal file
After Width: | Height: | Size: 2.2 KiB |
BIN
app/javascript/icons/bak/apple-touch-icon-76x76.png
Normal file
After Width: | Height: | Size: 2.3 KiB |
BIN
app/javascript/icons/bak/favicon-16x16.png
Normal file
After Width: | Height: | Size: 588 B |
BIN
app/javascript/icons/bak/favicon-32x32.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
app/javascript/icons/bak/favicon-48x48.png
Normal file
After Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 588 B After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 2.3 KiB |
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 3.7 KiB |
2
app/javascript/styles/758postal.scss
Normal file
@ -0,0 +1,2 @@
|
||||
@import '758postal/variables';
|
||||
@import 'application';
|
5
app/javascript/styles/758postal/diff.scss
Normal file
@ -0,0 +1,5 @@
|
||||
/* blurple */
|
||||
/*
|
||||
.notification-bar-action {
|
||||
color: $blurple-300;
|
||||
}*/
|
116
app/javascript/styles/758postal/variables.scss
Normal file
@ -0,0 +1,116 @@
|
||||
// 758postal Renga theme
|
||||
// v1.02
|
||||
|
||||
$black: #000000; // Kuro
|
||||
$white: #ffffff; // Shiro
|
||||
$red-600: #bd5cff !default; // Murasaki
|
||||
$red-500: #c485ef !default; // Tsutsuji
|
||||
$blurple-600: #d51a2a; // Postal-red
|
||||
$blurple-500: #dd4855;
|
||||
$blurple-400: #e46a74;
|
||||
$blurple-300: #ea8d95;
|
||||
$grey-600: #584b46;
|
||||
$grey-100: #c2bebd;
|
||||
|
||||
$success-green: #8db568 !default; // Matcha
|
||||
$error-red: $red-500 !default;
|
||||
$warning-red: #8c72ff !default; //Rindou
|
||||
$gold-star: #de8937 !default; //Kogane
|
||||
|
||||
$red-bookmark: $warning-red;
|
||||
|
||||
// Values from the classic Mastodon UI
|
||||
$classic-base-color: #342018; // Renga
|
||||
$classic-primary-color: #cab1a7;
|
||||
$classic-secondary-color: #e0dddc;
|
||||
$classic-highlight-color: $blurple-500;
|
||||
|
||||
// Variables for defaults in UI
|
||||
$base-shadow-color: $black !default;
|
||||
$base-overlay-background: $black !default;
|
||||
$base-border-color: $white !default;
|
||||
$simple-background-color: $white !default;
|
||||
$valid-value-color: $success-green !default;
|
||||
$error-value-color: $error-red !default;
|
||||
|
||||
// Tell UI to use selected colors
|
||||
$ui-base-color: $classic-base-color !default; // Darkest
|
||||
$ui-base-lighter-color: lighten(
|
||||
$ui-base-color,
|
||||
26%
|
||||
) !default; // Lighter darkest
|
||||
$ui-primary-color: $classic-primary-color !default; // Lighter
|
||||
$ui-secondary-color: $classic-secondary-color !default; // Lightest
|
||||
$ui-highlight-color: $classic-highlight-color !default;
|
||||
$ui-button-color: $white !default;
|
||||
$ui-button-background-color: $blurple-500 !default;
|
||||
$ui-button-focus-background-color: $blurple-600 !default;
|
||||
$ui-button-focus-outline-color: $blurple-400 !default;
|
||||
$ui-button-focus-outline: solid 2px $ui-button-focus-outline-color !default;
|
||||
|
||||
$ui-button-secondary-color: $blurple-500 !default;
|
||||
$ui-button-secondary-border-color: $blurple-500 !default;
|
||||
$ui-button-secondary-focus-border-color: $blurple-300 !default;
|
||||
$ui-button-secondary-focus-color: $blurple-300 !default;
|
||||
|
||||
$ui-button-tertiary-color: $blurple-300 !default;
|
||||
$ui-button-tertiary-border-color: $blurple-300 !default;
|
||||
$ui-button-tertiary-focus-background-color: $blurple-600 !default;
|
||||
$ui-button-tertiary-focus-color: $white !default;
|
||||
|
||||
$ui-button-destructive-background-color: $red-500 !default;
|
||||
$ui-button-destructive-focus-background-color: $red-600 !default;
|
||||
|
||||
$ui-button-icon-focus-outline: $ui-button-focus-outline !default;
|
||||
$ui-button-icon-hover-background-color: rgba(255, 101, 120, 40%) !default;
|
||||
|
||||
// Variables for texts
|
||||
$primary-text-color: $white !default;
|
||||
$darker-text-color: $ui-primary-color !default;
|
||||
$dark-text-color: $ui-base-lighter-color !default;
|
||||
$secondary-text-color: $ui-secondary-color !default;
|
||||
$highlight-text-color: lighten($ui-highlight-color, 8%) !default;
|
||||
$action-button-color: $ui-base-lighter-color !default;
|
||||
$action-button-focus-color: lighten($ui-base-lighter-color, 4%) !default;
|
||||
$passive-text-color: $gold-star !default;
|
||||
$active-passive-text-color: $success-green !default;
|
||||
|
||||
// For texts on inverted backgrounds
|
||||
$inverted-text-color: $ui-base-color !default;
|
||||
$lighter-text-color: $ui-base-lighter-color !default;
|
||||
$light-text-color: $ui-primary-color !default;
|
||||
|
||||
// Language codes that uses CJK fonts
|
||||
$cjk-langs: ja, ko, zh-CN, zh-HK, zh-TW;
|
||||
|
||||
// Variables for components
|
||||
$media-modal-media-max-width: 100%;
|
||||
|
||||
// put margins on top and bottom of image to avoid the screen covered by image.
|
||||
$media-modal-media-max-height: 80%;
|
||||
|
||||
$no-gap-breakpoint: 1175px;
|
||||
$mobile-breakpoint: 630px;
|
||||
|
||||
$font-sans-serif: 'mastodon-font-sans-serif' !default;
|
||||
$font-display: 'mastodon-font-display' !default;
|
||||
$font-monospace: 'mastodon-font-monospace' !default;
|
||||
|
||||
:root {
|
||||
--dropdown-border-color: #{lighten($ui-base-color, 4%)};
|
||||
--dropdown-background-color: #{rgba(darken($ui-base-color, 8%), 0.9)};
|
||||
--dropdown-shadow: 0 20px 25px -5px #{rgba($base-shadow-color, 0.25)},
|
||||
0 8px 10px -6px #{rgba($base-shadow-color, 0.25)};
|
||||
--modal-background-color: #{rgba(darken($ui-base-color, 8%), 0.7)};
|
||||
--modal-background-variant-color: #{rgba($ui-base-color, 0.7)};
|
||||
--modal-border-color: #{lighten($ui-base-color, 4%)};
|
||||
--background-border-color: #{lighten($ui-base-color, 4%)};
|
||||
--background-filter: blur(10px) saturate(180%) contrast(75%) brightness(70%);
|
||||
--background-color: #{darken($ui-base-color, 8%)};
|
||||
--background-color-tint: #{rgba(darken($ui-base-color, 8%), 0.9)};
|
||||
--surface-background-color: #{darken($ui-base-color, 4%)};
|
||||
--surface-variant-background-color: #{$ui-base-color};
|
||||
--surface-variant-active-background-color: #{lighten($ui-base-color, 4%)};
|
||||
--on-surface-color: #{transparentize($ui-base-color, 0.5)};
|
||||
--avatar-border-radius: 8px;
|
||||
}
|
22
app/javascript/styles/758postal/variables.scss.bak
Normal file
@ -0,0 +1,22 @@
|
||||
$black: #000000;
|
||||
$white: #ffffff;
|
||||
$red-600: #b72588 !default;
|
||||
$red-500: #df40ad !default;
|
||||
$blurple-600: #e6313f;
|
||||
$blurple-500: #eb5d68;
|
||||
$blurple-400: #ef7b84;
|
||||
$blurple-300: #f39ba2;
|
||||
$grey-600: #534c5a;
|
||||
$grey-100: #ecdafc;
|
||||
|
||||
$success-green: #79a2bd !default;
|
||||
$error-red: $red-500 !default;
|
||||
$warning-red: #c465ea !default;
|
||||
$gold-star: #e8a405 !default;
|
||||
|
||||
$classic-base-color: #1d1227;
|
||||
$classic-primary-color: #b497cf;
|
||||
$classic-secondary-color: #ddd0e9;
|
||||
$classic-highlight-color: #eb5d68;
|
||||
|
||||
$ui-button-icon-hover-background-color: rgba(255, 130, 145, 40%) !default;
|
2
app/javascript/styles/hatoba.scss
Normal file
@ -0,0 +1,2 @@
|
||||
@import 'hatoba/variables';
|
||||
@import 'application';
|
116
app/javascript/styles/hatoba/variables.scss
Normal file
@ -0,0 +1,116 @@
|
||||
// 758postal Hatoba theme
|
||||
// v1.00
|
||||
|
||||
$black: #000000; // Kuro
|
||||
$white: #ffffff; // Shiro
|
||||
$red-600: #bd5cff !default; // Murasaki
|
||||
$red-500: #c485ef !default; // Tsutsuji
|
||||
$blurple-600: #d51a2a; // Postal-red
|
||||
$blurple-500: #dd4855;
|
||||
$blurple-400: #e46a74;
|
||||
$blurple-300: #ea8d95;
|
||||
$grey-600: #5b5264;
|
||||
$grey-100: #e6d6f4;
|
||||
|
||||
$success-green: #8db568 !default; // Matcha
|
||||
$error-red: $red-500 !default;
|
||||
$warning-red: #8c72ff !default; //Rindou
|
||||
$gold-star: #de8937 !default; //Kogane
|
||||
|
||||
$red-bookmark: $warning-red;
|
||||
|
||||
// Values from the classic Mastodon UI
|
||||
$classic-base-color: #2a2033; // Hatoba
|
||||
$classic-primary-color: #b8aac4;
|
||||
$classic-secondary-color: #e7e1ec;
|
||||
$classic-highlight-color: $blurple-500;
|
||||
|
||||
// Variables for defaults in UI
|
||||
$base-shadow-color: $black !default;
|
||||
$base-overlay-background: $black !default;
|
||||
$base-border-color: $white !default;
|
||||
$simple-background-color: $white !default;
|
||||
$valid-value-color: $success-green !default;
|
||||
$error-value-color: $error-red !default;
|
||||
|
||||
// Tell UI to use selected colors
|
||||
$ui-base-color: $classic-base-color !default; // Darkest
|
||||
$ui-base-lighter-color: lighten(
|
||||
$ui-base-color,
|
||||
26%
|
||||
) !default; // Lighter darkest
|
||||
$ui-primary-color: $classic-primary-color !default; // Lighter
|
||||
$ui-secondary-color: $classic-secondary-color !default; // Lightest
|
||||
$ui-highlight-color: $classic-highlight-color !default;
|
||||
$ui-button-color: $white !default;
|
||||
$ui-button-background-color: $blurple-500 !default;
|
||||
$ui-button-focus-background-color: $blurple-600 !default;
|
||||
$ui-button-focus-outline-color: $blurple-400 !default;
|
||||
$ui-button-focus-outline: solid 2px $ui-button-focus-outline-color !default;
|
||||
|
||||
$ui-button-secondary-color: $blurple-500 !default;
|
||||
$ui-button-secondary-border-color: $blurple-500 !default;
|
||||
$ui-button-secondary-focus-border-color: $blurple-300 !default;
|
||||
$ui-button-secondary-focus-color: $blurple-300 !default;
|
||||
|
||||
$ui-button-tertiary-color: $blurple-300 !default;
|
||||
$ui-button-tertiary-border-color: $blurple-300 !default;
|
||||
$ui-button-tertiary-focus-background-color: $blurple-600 !default;
|
||||
$ui-button-tertiary-focus-color: $white !default;
|
||||
|
||||
$ui-button-destructive-background-color: $red-500 !default;
|
||||
$ui-button-destructive-focus-background-color: $red-600 !default;
|
||||
|
||||
$ui-button-icon-focus-outline: $ui-button-focus-outline !default;
|
||||
$ui-button-icon-hover-background-color: rgba(255, 101, 120, 40%) !default;
|
||||
|
||||
// Variables for texts
|
||||
$primary-text-color: $white !default;
|
||||
$darker-text-color: $ui-primary-color !default;
|
||||
$dark-text-color: $ui-base-lighter-color !default;
|
||||
$secondary-text-color: $ui-secondary-color !default;
|
||||
$highlight-text-color: lighten($ui-highlight-color, 8%) !default;
|
||||
$action-button-color: $ui-base-lighter-color !default;
|
||||
$action-button-focus-color: lighten($ui-base-lighter-color, 4%) !default;
|
||||
$passive-text-color: $gold-star !default;
|
||||
$active-passive-text-color: $success-green !default;
|
||||
|
||||
// For texts on inverted backgrounds
|
||||
$inverted-text-color: $ui-base-color !default;
|
||||
$lighter-text-color: $ui-base-lighter-color !default;
|
||||
$light-text-color: $ui-primary-color !default;
|
||||
|
||||
// Language codes that uses CJK fonts
|
||||
$cjk-langs: ja, ko, zh-CN, zh-HK, zh-TW;
|
||||
|
||||
// Variables for components
|
||||
$media-modal-media-max-width: 100%;
|
||||
|
||||
// put margins on top and bottom of image to avoid the screen covered by image.
|
||||
$media-modal-media-max-height: 80%;
|
||||
|
||||
$no-gap-breakpoint: 1175px;
|
||||
$mobile-breakpoint: 630px;
|
||||
|
||||
$font-sans-serif: 'mastodon-font-sans-serif' !default;
|
||||
$font-display: 'mastodon-font-display' !default;
|
||||
$font-monospace: 'mastodon-font-monospace' !default;
|
||||
|
||||
:root {
|
||||
--dropdown-border-color: #{lighten($ui-base-color, 4%)};
|
||||
--dropdown-background-color: #{rgba(darken($ui-base-color, 8%), 0.9)};
|
||||
--dropdown-shadow: 0 20px 25px -5px #{rgba($base-shadow-color, 0.25)},
|
||||
0 8px 10px -6px #{rgba($base-shadow-color, 0.25)};
|
||||
--modal-background-color: #{rgba(darken($ui-base-color, 8%), 0.7)};
|
||||
--modal-background-variant-color: #{rgba($ui-base-color, 0.7)};
|
||||
--modal-border-color: #{lighten($ui-base-color, 4%)};
|
||||
--background-border-color: #{lighten($ui-base-color, 4%)};
|
||||
--background-filter: blur(10px) saturate(180%) contrast(75%) brightness(70%);
|
||||
--background-color: #{darken($ui-base-color, 8%)};
|
||||
--background-color-tint: #{rgba(darken($ui-base-color, 8%), 0.9)};
|
||||
--surface-background-color: #{darken($ui-base-color, 4%)};
|
||||
--surface-variant-background-color: #{$ui-base-color};
|
||||
--surface-variant-active-background-color: #{lighten($ui-base-color, 4%)};
|
||||
--on-surface-color: #{transparentize($ui-base-color, 0.5)};
|
||||
--avatar-border-radius: 8px;
|
||||
}
|
2
app/javascript/styles/karasuba.scss
Normal file
@ -0,0 +1,2 @@
|
||||
@import 'karasuba/variables';
|
||||
@import 'application';
|
116
app/javascript/styles/karasuba/variables.scss
Normal file
@ -0,0 +1,116 @@
|
||||
// 758postal Karasuba theme
|
||||
// v1.00
|
||||
|
||||
$black: #000000; // Kuro
|
||||
$white: #ffffff; // Shiro
|
||||
$red-600: #bd5cff !default; // Murasaki
|
||||
$red-500: #c485ef !default; // Tsutsuji
|
||||
$blurple-600: #d51a2a; // Postal-red
|
||||
$blurple-500: #dd4855;
|
||||
$blurple-400: #e46a74;
|
||||
$blurple-300: #ea8d95;
|
||||
$grey-600: #575f57;
|
||||
$grey-100: #e4e6e4;
|
||||
|
||||
$success-green: #8db568 !default; // Matcha
|
||||
$error-red: $red-500 !default;
|
||||
$warning-red: #8c72ff !default; //Rindou
|
||||
$gold-star: #de8937 !default; //Kogane
|
||||
|
||||
$red-bookmark: $warning-red;
|
||||
|
||||
// Values from the classic Mastodon UI
|
||||
$classic-base-color: #001100; // Karasuba
|
||||
$classic-primary-color: #a8c6a8;
|
||||
$classic-secondary-color: #e9f2e9;
|
||||
$classic-highlight-color: $blurple-500;
|
||||
|
||||
// Variables for defaults in UI
|
||||
$base-shadow-color: $black !default;
|
||||
$base-overlay-background: $black !default;
|
||||
$base-border-color: $white !default;
|
||||
$simple-background-color: $white !default;
|
||||
$valid-value-color: $success-green !default;
|
||||
$error-value-color: $error-red !default;
|
||||
|
||||
// Tell UI to use selected colors
|
||||
$ui-base-color: $classic-base-color !default; // Darkest
|
||||
$ui-base-lighter-color: lighten(
|
||||
$ui-base-color,
|
||||
26%
|
||||
) !default; // Lighter darkest
|
||||
$ui-primary-color: $classic-primary-color !default; // Lighter
|
||||
$ui-secondary-color: $classic-secondary-color !default; // Lightest
|
||||
$ui-highlight-color: $classic-highlight-color !default;
|
||||
$ui-button-color: $white !default;
|
||||
$ui-button-background-color: $blurple-500 !default;
|
||||
$ui-button-focus-background-color: $blurple-600 !default;
|
||||
$ui-button-focus-outline-color: $blurple-400 !default;
|
||||
$ui-button-focus-outline: solid 2px $ui-button-focus-outline-color !default;
|
||||
|
||||
$ui-button-secondary-color: $blurple-500 !default;
|
||||
$ui-button-secondary-border-color: $blurple-500 !default;
|
||||
$ui-button-secondary-focus-border-color: $blurple-300 !default;
|
||||
$ui-button-secondary-focus-color: $blurple-300 !default;
|
||||
|
||||
$ui-button-tertiary-color: $blurple-300 !default;
|
||||
$ui-button-tertiary-border-color: $blurple-300 !default;
|
||||
$ui-button-tertiary-focus-background-color: $blurple-600 !default;
|
||||
$ui-button-tertiary-focus-color: $white !default;
|
||||
|
||||
$ui-button-destructive-background-color: $red-500 !default;
|
||||
$ui-button-destructive-focus-background-color: $red-600 !default;
|
||||
|
||||
$ui-button-icon-focus-outline: $ui-button-focus-outline !default;
|
||||
$ui-button-icon-hover-background-color: rgba(255, 101, 120, 40%) !default;
|
||||
|
||||
// Variables for texts
|
||||
$primary-text-color: $white !default;
|
||||
$darker-text-color: $ui-primary-color !default;
|
||||
$dark-text-color: $ui-base-lighter-color !default;
|
||||
$secondary-text-color: $ui-secondary-color !default;
|
||||
$highlight-text-color: lighten($ui-highlight-color, 8%) !default;
|
||||
$action-button-color: $ui-base-lighter-color !default;
|
||||
$action-button-focus-color: lighten($ui-base-lighter-color, 4%) !default;
|
||||
$passive-text-color: $gold-star !default;
|
||||
$active-passive-text-color: $success-green !default;
|
||||
|
||||
// For texts on inverted backgrounds
|
||||
$inverted-text-color: $ui-base-color !default;
|
||||
$lighter-text-color: $ui-base-lighter-color !default;
|
||||
$light-text-color: $ui-primary-color !default;
|
||||
|
||||
// Language codes that uses CJK fonts
|
||||
$cjk-langs: ja, ko, zh-CN, zh-HK, zh-TW;
|
||||
|
||||
// Variables for components
|
||||
$media-modal-media-max-width: 100%;
|
||||
|
||||
// put margins on top and bottom of image to avoid the screen covered by image.
|
||||
$media-modal-media-max-height: 80%;
|
||||
|
||||
$no-gap-breakpoint: 1175px;
|
||||
$mobile-breakpoint: 630px;
|
||||
|
||||
$font-sans-serif: 'mastodon-font-sans-serif' !default;
|
||||
$font-display: 'mastodon-font-display' !default;
|
||||
$font-monospace: 'mastodon-font-monospace' !default;
|
||||
|
||||
:root {
|
||||
--dropdown-border-color: #{lighten($ui-base-color, 4%)};
|
||||
--dropdown-background-color: #{rgba(darken($ui-base-color, 8%), 0.9)};
|
||||
--dropdown-shadow: 0 20px 25px -5px #{rgba($base-shadow-color, 0.25)},
|
||||
0 8px 10px -6px #{rgba($base-shadow-color, 0.25)};
|
||||
--modal-background-color: #{rgba(darken($ui-base-color, 8%), 0.7)};
|
||||
--modal-background-variant-color: #{rgba($ui-base-color, 0.7)};
|
||||
--modal-border-color: #{lighten($ui-base-color, 4%)};
|
||||
--background-border-color: #{lighten($ui-base-color, 4%)};
|
||||
--background-filter: blur(10px) saturate(180%) contrast(75%) brightness(70%);
|
||||
--background-color: #{darken($ui-base-color, 8%)};
|
||||
--background-color-tint: #{rgba(darken($ui-base-color, 8%), 0.9)};
|
||||
--surface-background-color: #{darken($ui-base-color, 4%)};
|
||||
--surface-variant-background-color: #{$ui-base-color};
|
||||
--surface-variant-active-background-color: #{lighten($ui-base-color, 4%)};
|
||||
--on-surface-color: #{transparentize($ui-base-color, 0.5)};
|
||||
--avatar-border-radius: 8px;
|
||||
}
|
@ -4,6 +4,7 @@ class ActivityPub::LinkedDataSignature
|
||||
include JsonLdHelper
|
||||
|
||||
CONTEXT = 'https://w3id.org/identity/v1'
|
||||
SIGNATURE_CONTEXT = 'https://w3id.org/security/v1'
|
||||
|
||||
def initialize(json)
|
||||
@json = json.with_indifferent_access
|
||||
@ -46,7 +47,13 @@ class ActivityPub::LinkedDataSignature
|
||||
|
||||
signature = Base64.strict_encode64(keypair.sign(OpenSSL::Digest.new('SHA256'), to_be_signed))
|
||||
|
||||
@json.merge('signature' => options.merge('signatureValue' => signature))
|
||||
# Mastodon's context is either an array or a single URL
|
||||
context_with_security = Array(@json['@context'])
|
||||
context_with_security << 'https://w3id.org/security/v1'
|
||||
context_with_security.uniq!
|
||||
context_with_security = context_with_security.first if context_with_security.size == 1
|
||||
|
||||
@json.merge('signature' => options.merge('signatureValue' => signature), '@context' => context_with_security)
|
||||
end
|
||||
|
||||
private
|
||||
|
@ -14,14 +14,16 @@ class Admin::SystemCheck::SoftwareVersionCheck < Admin::SystemCheck::BaseCheck
|
||||
def message
|
||||
if software_updates.any?(&:urgent?)
|
||||
Admin::SystemCheck::Message.new(:software_version_critical_check, nil, admin_software_updates_path, true)
|
||||
else
|
||||
elsif software_updates.any?(&:patch_type?)
|
||||
Admin::SystemCheck::Message.new(:software_version_patch_check, nil, admin_software_updates_path)
|
||||
else
|
||||
Admin::SystemCheck::Message.new(:software_version_check, nil, admin_software_updates_path)
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def software_updates
|
||||
@software_updates ||= SoftwareUpdate.pending_to_a.filter { |update| update.urgent? || update.patch_type? }
|
||||
@software_updates ||= SoftwareUpdate.pending_to_a
|
||||
end
|
||||
end
|
||||
|
@ -557,7 +557,7 @@ class FeedManager
|
||||
arr = crutches[:active_mentions][s.id] || []
|
||||
arr.push(s.account_id)
|
||||
|
||||
if s.reblog?
|
||||
if s.reblog? && s.reblog.present?
|
||||
arr.push(s.reblog.account_id)
|
||||
arr.concat(crutches[:active_mentions][s.reblog_of_id] || [])
|
||||
end
|
||||
|
@ -77,7 +77,7 @@ class Request
|
||||
@url = Addressable::URI.parse(url).normalize
|
||||
@http_client = options.delete(:http_client)
|
||||
@allow_local = options.delete(:allow_local)
|
||||
@full_path = options.delete(:with_query_string)
|
||||
@full_path = !options.delete(:omit_query_string)
|
||||
@options = options.merge(socket_class: use_proxy? || @allow_local ? ProxySocket : Socket)
|
||||
@options = @options.merge(timeout_class: PerOperationWithDeadline, timeout_options: TIMEOUT)
|
||||
@options = @options.merge(proxy_url) if use_proxy?
|
||||
|
@ -49,7 +49,7 @@ class ActivityPub::FetchRepliesService < BaseService
|
||||
rescue Mastodon::UnexpectedResponseError => e
|
||||
raise unless e.response && e.response.code == 401 && Addressable::URI.parse(collection_or_uri).query.present?
|
||||
|
||||
fetch_resource_without_id_validation(collection_or_uri, nil, true, request_options: { with_query_string: true })
|
||||
fetch_resource_without_id_validation(collection_or_uri, nil, true, request_options: { omit_query_string: false })
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -858,6 +858,9 @@ en:
|
||||
message_html: You haven't defined any server rules.
|
||||
sidekiq_process_check:
|
||||
message_html: No Sidekiq process running for the %{value} queue(s). Please review your Sidekiq configuration
|
||||
software_version_check:
|
||||
action: See available updates
|
||||
message_html: A Mastodon update is available.
|
||||
software_version_critical_check:
|
||||
action: See available updates
|
||||
message_html: A critical Mastodon update is available, please update as quickly as possible.
|
||||
@ -1739,6 +1742,9 @@ en:
|
||||
contrast: Mastodon (High contrast)
|
||||
default: Mastodon (Dark)
|
||||
mastodon-light: Mastodon (Light)
|
||||
758postal: 758postal Renga (Dark)
|
||||
hatoba: 758postal Hatoba (Dark)
|
||||
karasuba: 758postal Karasuba (Dark)
|
||||
time:
|
||||
formats:
|
||||
default: "%b %d, %Y, %H:%M"
|
||||
|
@ -1701,6 +1701,9 @@ ja:
|
||||
contrast: Mastodon (ハイコントラスト)
|
||||
default: Mastodon (ダーク)
|
||||
mastodon-light: Mastodon (ライト)
|
||||
758postal: 七五八逓信局・煉瓦 (ダーク)
|
||||
hatoba: 七五八逓信局・鳩羽 (ダーク)
|
||||
karasuba: 七五八逓信局・烏羽 (ダーク)
|
||||
time:
|
||||
formats:
|
||||
default: "%Y年%m月%d日 %H:%M"
|
||||
|
@ -1,3 +1,6 @@
|
||||
default: styles/application.scss
|
||||
contrast: styles/contrast.scss
|
||||
mastodon-light: styles/mastodon-light.scss
|
||||
758postal: styles/758postal.scss
|
||||
hatoba: styles/hatoba.scss
|
||||
karasuba: styles/karasuba.scss
|
||||
|
@ -56,7 +56,7 @@ services:
|
||||
|
||||
web:
|
||||
build: .
|
||||
image: ghcr.io/mastodon/mastodon:v4.2.12
|
||||
image: ghcr.io/mastodon/mastodon:v4.2.13
|
||||
restart: always
|
||||
env_file: .env.production
|
||||
command: bash -c "rm -f /mastodon/tmp/pids/server.pid; bundle exec rails s -p 3000"
|
||||
@ -77,7 +77,7 @@ services:
|
||||
|
||||
streaming:
|
||||
build: .
|
||||
image: ghcr.io/mastodon/mastodon:v4.2.12
|
||||
image: ghcr.io/mastodon/mastodon:v4.2.13
|
||||
restart: always
|
||||
env_file: .env.production
|
||||
command: node ./streaming
|
||||
@ -95,7 +95,7 @@ services:
|
||||
|
||||
sidekiq:
|
||||
build: .
|
||||
image: ghcr.io/mastodon/mastodon:v4.2.12
|
||||
image: ghcr.io/mastodon/mastodon:v4.2.13
|
||||
restart: always
|
||||
env_file: .env.production
|
||||
command: bundle exec sidekiq
|
||||
|
@ -13,7 +13,7 @@ module Mastodon
|
||||
end
|
||||
|
||||
def patch
|
||||
12
|
||||
13
|
||||
end
|
||||
|
||||
def default_prerelease
|
||||
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 150 KiB |
BIN
public/avatars/original/missing.png.bak
Normal file
After Width: | Height: | Size: 2.8 KiB |
@ -99,16 +99,11 @@ RSpec.describe ActivityPub::LinkedDataSignature do
|
||||
describe '#sign!' do
|
||||
subject { described_class.new(raw_json).sign!(sender) }
|
||||
|
||||
it 'returns a hash' do
|
||||
it 'returns a hash with a signature, the expected context, and the signature can be verified', :aggregate_failures do
|
||||
expect(subject).to be_a Hash
|
||||
end
|
||||
|
||||
it 'contains signature' do
|
||||
expect(subject['signature']).to be_a Hash
|
||||
expect(subject['signature']['signatureValue']).to be_present
|
||||
end
|
||||
|
||||
it 'can be verified again' do
|
||||
expect(Array(subject['@context'])).to include('https://w3id.org/security/v1')
|
||||
expect(described_class.new(subject).verify_actor!).to eq sender
|
||||
end
|
||||
end
|
||||
|
@ -51,8 +51,8 @@ describe Admin::SystemCheck::SoftwareVersionCheck do
|
||||
Fabricate(:software_update, version: '99.99.99', type: 'major', urgent: false)
|
||||
end
|
||||
|
||||
it 'returns true' do
|
||||
expect(check.pass?).to be true
|
||||
it 'returns false' do
|
||||
expect(check.pass?).to be false
|
||||
end
|
||||
end
|
||||
|
||||
|