);
}
-
}
export default injectIntl(withIdentity(NavigationPanel));
diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json
index 77448bd493..e4ab53563c 100644
--- a/app/javascript/mastodon/locales/en.json
+++ b/app/javascript/mastodon/locales/en.json
@@ -16,7 +16,7 @@
"about.kmyblue_capabilities": "Features available in this server",
"about.kmyblue_capability": "This server is using kmyblue, a fork of Mastodon. On this server, kmyblues unique features are configured as follows.",
"about.not_available": "This information has not been made available on this server.",
- "about.powered_by": "Decentralized social media powered by {mastodon}",
+ "about.powered_by": "Decentralized social media powered by {domain}",
"about.public_visibility": "Public visibility",
"about.rules": "Server rules",
"account.account_note_header": "Personal note",
diff --git a/app/javascript/mastodon/locales/sco.json b/app/javascript/mastodon/locales/sco.json
index 5960fb7760..ec8a92ac2e 100644
--- a/app/javascript/mastodon/locales/sco.json
+++ b/app/javascript/mastodon/locales/sco.json
@@ -1,7 +1,7 @@
{
"about.blocks": "Moderatit servers",
"about.contact": "Contack:",
- "about.disclaimer": "Mastodon is free, open-soorced saftware, an a trademairk o Mastodon gGmbH.",
+ "about.disclaimer": "Join the Fediverse, become part of a community, and break free from Big Tech™'s stranglehold on public discourse.",
"about.domain_blocks.no_reason_available": "Raison no available",
"about.domain_blocks.preamble": "On the hail, Mastodon lats ye view content frae an interack wi uisers fae onie ither server in the fediverse.",
"about.domain_blocks.silenced.explanation": "Ye'll generally no see profiles an content frae this server, unless ye explicitly luik it up or opt intae it bi follaein.",
diff --git a/app/javascript/mastodon/models/account.ts b/app/javascript/mastodon/models/account.ts
index 55dbbcbb34..88cbc3359b 100644
--- a/app/javascript/mastodon/models/account.ts
+++ b/app/javascript/mastodon/models/account.ts
@@ -178,5 +178,10 @@ export function createAccountFromServerJSON(serverJSON: ApiAccountJSON) {
),
note_emojified: emojify(accountJSON.note, emojiMap),
note_plain: unescapeHTML(accountJSON.note),
+ url:
+ accountJSON.url.startsWith('http://') ||
+ accountJSON.url.startsWith('https://')
+ ? accountJSON.url
+ : accountJSON.uri,
});
}
diff --git a/app/javascript/styles/full-dark/variables.scss b/app/javascript/styles/full-dark/variables.scss
index 6cedec7df9..1720d716fe 100644
--- a/app/javascript/styles/full-dark/variables.scss
+++ b/app/javascript/styles/full-dark/variables.scss
@@ -1,11 +1,14 @@
$classic-base-color: #282c37; // Midnight Express
$classic-secondary-color: #d9e1e8; // Pattens Blue
-// Variables for defaults in UI
-$simple-background-color: $classic-base-color !default;
+@use '../mastodon/variables' with (
+ // Variables for defaults in UI
+ $simple-background-color: $classic-base-color,
-// Tell UI to use selected colors
-$ui-base-lighter-color: #969fbc !default; // Lighter darkest
+ // Tell UI to use selected colors
+ $ui-base-lighter-color: #969fbc,
-// For texts on inverted backgrounds
-$inverted-text-color: $classic-secondary-color !default;
+ // Lighter darkest
+ // For texts on inverted backgrounds
+ $inverted-text-color: $classic-secondary-color
+);
diff --git a/app/lib/activitypub/parser/media_attachment_parser.rb b/app/lib/activitypub/parser/media_attachment_parser.rb
index 56b8b23f84..bcbf92214f 100644
--- a/app/lib/activitypub/parser/media_attachment_parser.rb
+++ b/app/lib/activitypub/parser/media_attachment_parser.rb
@@ -15,13 +15,15 @@ class ActivityPub::Parser::MediaAttachmentParser
end
def remote_url
- Addressable::URI.parse(@json['url'])&.normalize&.to_s
+ url = Addressable::URI.parse(@json['url'])&.normalize&.to_s
+ url unless unsupported_uri_scheme?(url)
rescue Addressable::URI::InvalidURIError
nil
end
def thumbnail_remote_url
- Addressable::URI.parse(@json['icon'].is_a?(Hash) ? @json['icon']['url'] : @json['icon'])&.normalize&.to_s
+ url = Addressable::URI.parse(@json['icon'].is_a?(Hash) ? @json['icon']['url'] : @json['icon'])&.normalize&.to_s
+ url unless unsupported_uri_scheme?(url)
rescue Addressable::URI::InvalidURIError
nil
end
diff --git a/app/lib/activitypub/parser/status_parser.rb b/app/lib/activitypub/parser/status_parser.rb
index 1968f18468..03e3f789b5 100644
--- a/app/lib/activitypub/parser/status_parser.rb
+++ b/app/lib/activitypub/parser/status_parser.rb
@@ -33,7 +33,10 @@ class ActivityPub::Parser::StatusParser
end
def url
- url_to_href(@object['url'], 'text/html') if @object['url'].present?
+ return if @object['url'].blank?
+
+ url = url_to_href(@object['url'], 'text/html')
+ url unless unsupported_uri_scheme?(url)
end
def text
diff --git a/app/lib/activitypub/tag_manager.rb b/app/lib/activitypub/tag_manager.rb
index 3ead162ec3..99d85a262a 100644
--- a/app/lib/activitypub/tag_manager.rb
+++ b/app/lib/activitypub/tag_manager.rb
@@ -4,6 +4,7 @@ require 'singleton'
class ActivityPub::TagManager
include Singleton
+ include JsonLdHelper
include RoutingHelper
CONTEXT = 'https://www.w3.org/ns/activitystreams'
@@ -17,7 +18,7 @@ class ActivityPub::TagManager
end
def url_for(target)
- return target.url if target.respond_to?(:local?) && !target.local?
+ return unsupported_uri_scheme?(target.url) ? nil : target.url if target.respond_to?(:local?) && !target.local?
return unless target.respond_to?(:object_type)
diff --git a/app/lib/http_signature_draft.rb b/app/lib/http_signature_draft.rb
index fc0d498b29..cb794b223a 100644
--- a/app/lib/http_signature_draft.rb
+++ b/app/lib/http_signature_draft.rb
@@ -6,14 +6,13 @@
class HttpSignatureDraft
REQUEST_TARGET = '(request-target)'
- def initialize(keypair, key_id, full_path: true)
+ def initialize(keypair, key_id)
@keypair = keypair
@key_id = key_id
- @full_path = full_path
end
def request_target(verb, url)
- if url.query.nil? || !@full_path
+ if url.query.nil?
"#{verb} #{url.path}"
else
"#{verb} #{url.path}?#{url.query}"
diff --git a/app/lib/request.rb b/app/lib/request.rb
index ad39f928db..212acf64d0 100644
--- a/app/lib/request.rb
+++ b/app/lib/request.rb
@@ -75,7 +75,6 @@ class Request
@url = Addressable::URI.parse(url).normalize
@http_client = options.delete(:http_client)
@allow_local = options.delete(:allow_local)
- @full_path = !options.delete(:omit_query_string)
@options = {
follow: {
max_hops: 3,
@@ -102,7 +101,7 @@ class Request
key_id = ActivityPub::TagManager.instance.key_uri_for(actor)
keypair = sign_with.present? ? OpenSSL::PKey::RSA.new(sign_with) : actor.keypair
- @signing = HttpSignatureDraft.new(keypair, key_id, full_path: @full_path)
+ @signing = HttpSignatureDraft.new(keypair, key_id)
self
end
diff --git a/app/services/activitypub/fetch_replies_service.rb b/app/services/activitypub/fetch_replies_service.rb
index f2e4f45104..6a6d9e391a 100644
--- a/app/services/activitypub/fetch_replies_service.rb
+++ b/app/services/activitypub/fetch_replies_service.rb
@@ -57,20 +57,7 @@ class ActivityPub::FetchRepliesService < BaseService
return unless @allow_synchronous_requests
return if non_matching_uri_hosts?(@reference_uri, collection_or_uri)
- # NOTE: For backward compatibility reasons, Mastodon signs outgoing
- # queries incorrectly by default.
- #
- # While this is relevant for all URLs with query strings, this is
- # the only code path where this happens in practice.
- #
- # Therefore, retry with correct signatures if this fails.
- begin
- fetch_resource_without_id_validation(collection_or_uri, nil, raise_on_error: :temporary)
- 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, raise_on_error: :temporary, request_options: { omit_query_string: false })
- end
+ fetch_resource_without_id_validation(collection_or_uri, nil, raise_on_error: :temporary)
end
def filter_replies(items)
diff --git a/app/validators/status_length_validator.rb b/app/validators/status_length_validator.rb
index 575aaf1869..d77a0ac610 100644
--- a/app/validators/status_length_validator.rb
+++ b/app/validators/status_length_validator.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
class StatusLengthValidator < ActiveModel::Validator
- MAX_CHARS = 500
+ MAX_CHARS = (ENV['MAX_CHARS'] || 500).to_i
URL_PLACEHOLDER_CHARS = 23
URL_PLACEHOLDER = 'x' * 23
diff --git a/config/initializers/deprecations.rb b/config/initializers/deprecations.rb
new file mode 100644
index 0000000000..e0ad54d8c3
--- /dev/null
+++ b/config/initializers/deprecations.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+if ENV['REDIS_NAMESPACE']
+ es_configured = ENV['ES_ENABLED'] == 'true' || ENV.fetch('ES_HOST', 'localhost') != 'localhost' || ENV.fetch('ES_PORT', '9200') != '9200' || ENV.fetch('ES_PASS', 'password') != 'password'
+
+ warn <<~MESSAGE
+ WARNING: the REDIS_NAMESPACE environment variable is deprecated and will be removed in Mastodon 4.4.0.
+
+ Please see documentation at https://github.com/mastodon/redis_namespace_migration
+ MESSAGE
+
+ warn <<~MESSAGE if es_configured && !ENV['ES_PREFIX']
+
+ In addition, as REDIS_NAMESPACE is being used as a prefix for Elasticsearch, please do not forget to set ES_PREFIX to "#{ENV.fetch('REDIS_NAMESPACE')}".
+ MESSAGE
+end
diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml
index 9264216121..ff17536ee1 100644
--- a/config/locales/simple_form.en.yml
+++ b/config/locales/simple_form.en.yml
@@ -66,18 +66,18 @@ en:
setting_custom_css_lead: 'Be sure to remember: In the unlikely event that you make a mistake in entering your custom CSS and the screen does not display properly, you can disable your custom CSS from the link at the bottom of the sign-in screen. Open the sign-in screen in private mode of your browser, for example, and disable it.'
setting_default_searchability: On kmyblue and Fedibird, the search is based on the search permission setting; on Misskey, all public, local public, and non-public posts are searched regardless of this setting; on Mastodon and Firefish, instead of search permission, the "Make public posts freely searchable on other servers" setting in the profile settings is applied. In Mastodon and Firefish, the "Make public posts freely searchable on other servers" setting in the profile settings is applied instead of the search permission.
setting_default_sensitive: Sensitive media is hidden by default and can be revealed with a click
- setting_disallow_unlisted_public_searchability: この設定を有効にすると、非収載投稿と検索範囲「誰でも」は両立できず不特定多数からの検索が不可になります。Fedibirdと同じ挙動になります
+ setting_disallow_unlisted_public_searchability: If you enable this setting, unlisted posts and the “everyone” search scope cannot coexist, making it impossible for unspecified users to search your posts.
setting_display_media_default: Hide media marked as sensitive
setting_display_media_hide_all: Always hide media
setting_display_media_show_all: Always show media
setting_dtl_force_searchability: 'With using #%{tag} tag, your post settings will be changed forcibly'
setting_dtl_force_visibility: 'With using #%{tag} tag, your post settings will be changed forcibly'
setting_emoji_reaction_policy: Even with this setting, users on non-kmyblue servers are free to put their emoji reaction on the post and share it within the same server. If you simply want to remove the emoji reaction from your own screen, you can disable it from the appearance settings
- setting_emoji_reaction_streaming_notify_impl2: 当該サーバーの独自機能に対応したアプリを利用時に、絵文字リアクション機能を利用できます。動作確認していないため(そもそもそのようなアプリ自体を確認できていないため)正しく動かない場合があります
+ setting_emoji_reaction_streaming_notify_impl2: You can use the emoji reaction feature when using an app that supports this server’s unique functionality. However, since this has not been tested (and such apps have not even been identified), it may not work correctly.
setting_enable_emoji_reaction: If turn off, other users still can react your posts
setting_enabled_visibilities: If turn off, you cannot select and post the privacy.
- setting_hide_network: フォローとフォロワーの情報がプロフィールページで見られないようにします
- setting_public_post_to_unlisted: 未対応のサードパーティアプリからもローカル公開で投稿できますが、公開投稿はWeb以外できなくなります
+ setting_hide_network: It will hide the following and follower information from the profile page.
+ setting_public_post_to_unlisted: You can still post with local visibility using unsupported third-party apps, but public posts will no longer be possible outside of the web interface.
setting_reject_send_limited_to_suspects: This applies to "Mutual Only" posts. Circle posts will be delivered without exception. Some Misskey servers have independently supported limited posting, but this is a setting for those who are concerned about it, as mutual-only posting exposes some of the users you are mutual with to Misskey users!
setting_reject_unlisted_subscription: Misskey and its forks can **subscribe and search** for "non-following" posts from accounts they do not follow. This differs from kmyblue's behavior. It delivers posts in the specified public range to such servers as "followers only". Please understand, however, that due to its structure, it is difficult to handle perfectly and will occasionally be delivered as non-subscribed.
setting_reverse_search_quote: Double-quotes will result in a search with a wider range of notation, which is the opposite of Mastodon's default behavior.
@@ -121,10 +121,10 @@ en:
peers_api_enabled: A list of domain names this server has encountered in the fediverse. No data is included here about whether you federate with a given server, just that your server knows about it. This is used by services that collect statistics on federation in a general sense.
profile_directory: The profile directory lists all users who have opted-in to be discoverable.
receive_other_servers_emoji_reaction: It can cause load. It is recommended to enable it only when there are few people.
- registrations_end_hour: 新規登録が承認なしで可能な時間帯の開始時間を指定します。これより前の時間に登録することはできません。終了時間より後にすることはできません。この時間帯から外れた新規登録には、別途承認が必要となります。
- registrations_limit: 現在のユーザー数がこれを超過すると、管理者がこの数値を増やさない限り新規登録できません。0を指定すると、この制限を無効化します。
- registrations_limit_per_day: 本日登録されたユーザー数がこれを超過すると、UTC時刻で翌日0時にならない限り新規登録できません。0を指定すると、この制限を無効化します。
- registrations_start_hour: 新規登録が承認なしで可能な時間帯の終了時間を指定します。これより後の時間に登録することはできません。開始時間より前にすることはできません。この時間帯から外れた新規登録には、別途承認が必要となります。
+ registrations_end_hour: Specifies the end of the time window during which new registrations can be made without approval. Registrations cannot be made before the start time or after this end time. Registrations outside this time window will require separate approval.
+ registrations_limit: If the current number of users exceeds this value, new registrations will not be possible unless the administrator increases the limit. Setting this to 0 disables the restriction.
+ registrations_limit_per_day: If the number of users registered today exceeds this value, no new registrations will be allowed until 00:00 UTC the next day. Setting this to 0 disables the restriction.
+ registrations_start_hour: Specifies the start of the time window during which new registrations can be made without approval. Registrations cannot be made before this time or after the end time. Registrations outside this time window will require separate approval.
require_invite_text: When sign-ups require manual approval, make the “Why do you want to join?” text input mandatory rather than optional
site_contact_email: How people can reach you for legal or support inquiries.
site_contact_username: How people can reach you on Mastodon.
@@ -201,8 +201,8 @@ en:
discoverable: Feature profile and posts in discovery algorithms
fields:
examples:
- name_1: 例) GitHub
- value_1: 例) https://github.com/xxxxxx
+ name_1: Example Gitea
+ value_1: Example https://giteahub.com
name: Label
value: Content
indexable: Include public posts in search results
diff --git a/docker-compose.yml b/docker-compose.yml
index 0ec0c43bb6..b88ea761dc 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -59,7 +59,7 @@ services:
web:
# You can uncomment the following line if you want to not use the prebuilt image, for example if you have local code changes
build: .
- image: kmyblue:18.0-dev
+ image: kmyblue:18.1
restart: always
env_file: .env.production
command: bundle exec puma -C config/puma.rb
@@ -83,7 +83,7 @@ services:
build:
dockerfile: ./streaming/Dockerfile
context: .
- image: kmyblue-streaming:18.0-dev
+ image: kmyblue-streaming:18.1
restart: always
env_file: .env.production
command: node ./streaming/index.js
@@ -101,7 +101,7 @@ services:
sidekiq:
build: .
- image: kmyblue:18.0-dev
+ image: kmyblue:18.1
restart: always
env_file: .env.production
command: bundle exec sidekiq
diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb
index acf7a4e79a..e8eca96a71 100644
--- a/lib/mastodon/version.rb
+++ b/lib/mastodon/version.rb
@@ -13,13 +13,13 @@ module Mastodon
end
def kmyblue_minor
- 0
+ 1
end
def kmyblue_flag
# 'LTS'
- 'dev'
- # nil
+ # 'dev'
+ nil
end
def major
@@ -35,7 +35,7 @@ module Mastodon
end
def default_prerelease
- 'alpha.4'
+ 'alpha.5'
end
def prerelease
diff --git a/public/avatars/original/missing.png b/public/avatars/original/missing.png
index 781370782e..3b37e69c5d 100644
Binary files a/public/avatars/original/missing.png and b/public/avatars/original/missing.png differ
diff --git a/public/favicon.ico b/public/favicon.ico
old mode 100755
new mode 100644
index fc5e475d42..7f865cfe96
Binary files a/public/favicon.ico and b/public/favicon.ico differ