Compare commits

...

5 Commits

Author SHA1 Message Date
Matt Jankowski
8c992ad5f0
Merge be0489ac1f into 14cb5ff881 2025-09-03 20:07:43 +00:00
Claire
14cb5ff881
Add compatibility hack for GoToSocial interaction policies (#36004)
Some checks are pending
Check i18n / check-i18n (push) Waiting to run
CodeQL / Analyze (javascript) (push) Waiting to run
CodeQL / Analyze (ruby) (push) Waiting to run
Check formatting / lint (push) Waiting to run
Ruby Linting / lint (push) Waiting to run
Historical data migration test / test (14-alpine) (push) Waiting to run
Historical data migration test / test (15-alpine) (push) Waiting to run
Historical data migration test / test (16-alpine) (push) Waiting to run
Historical data migration test / test (17-alpine) (push) Waiting to run
Ruby Testing / build (production) (push) Waiting to run
Ruby Testing / build (test) (push) Waiting to run
Ruby Testing / test (.ruby-version) (push) Blocked by required conditions
Ruby Testing / test (3.2) (push) Blocked by required conditions
Ruby Testing / test (3.3) (push) Blocked by required conditions
Ruby Testing / ImageMagick tests (.ruby-version) (push) Blocked by required conditions
Ruby Testing / ImageMagick tests (3.2) (push) Blocked by required conditions
Ruby Testing / ImageMagick tests (3.3) (push) Blocked by required conditions
Ruby Testing / End to End testing (.ruby-version) (push) Blocked by required conditions
Ruby Testing / End to End testing (3.2) (push) Blocked by required conditions
Ruby Testing / End to End testing (3.3) (push) Blocked by required conditions
Ruby Testing / Elastic Search integration testing (.ruby-version, docker.elastic.co/elasticsearch/elasticsearch:7.17.13) (push) Blocked by required conditions
Ruby Testing / Elastic Search integration testing (.ruby-version, docker.elastic.co/elasticsearch/elasticsearch:8.10.2) (push) Blocked by required conditions
Ruby Testing / Elastic Search integration testing (.ruby-version, opensearchproject/opensearch:2) (push) Blocked by required conditions
Ruby Testing / Elastic Search integration testing (3.2, docker.elastic.co/elasticsearch/elasticsearch:7.17.13) (push) Blocked by required conditions
Ruby Testing / Elastic Search integration testing (3.3, docker.elastic.co/elasticsearch/elasticsearch:7.17.13) (push) Blocked by required conditions
2025-09-03 19:35:43 +00:00
diondiondion
bc952ebde9
Add new plain (text-only) button variant (#36002)
Some checks failed
Check i18n / check-i18n (push) Waiting to run
CodeQL / Analyze (javascript) (push) Waiting to run
CodeQL / Analyze (ruby) (push) Waiting to run
Check formatting / lint (push) Waiting to run
Ruby Linting / lint (push) Waiting to run
Historical data migration test / test (14-alpine) (push) Waiting to run
Historical data migration test / test (15-alpine) (push) Waiting to run
Historical data migration test / test (16-alpine) (push) Waiting to run
Historical data migration test / test (17-alpine) (push) Waiting to run
Ruby Testing / build (production) (push) Waiting to run
Ruby Testing / build (test) (push) Waiting to run
Ruby Testing / test (.ruby-version) (push) Blocked by required conditions
Ruby Testing / test (3.2) (push) Blocked by required conditions
Ruby Testing / test (3.3) (push) Blocked by required conditions
Ruby Testing / ImageMagick tests (.ruby-version) (push) Blocked by required conditions
Ruby Testing / ImageMagick tests (3.2) (push) Blocked by required conditions
Ruby Testing / ImageMagick tests (3.3) (push) Blocked by required conditions
Ruby Testing / End to End testing (.ruby-version) (push) Blocked by required conditions
Ruby Testing / End to End testing (3.2) (push) Blocked by required conditions
Ruby Testing / End to End testing (3.3) (push) Blocked by required conditions
Ruby Testing / Elastic Search integration testing (.ruby-version, docker.elastic.co/elasticsearch/elasticsearch:7.17.13) (push) Blocked by required conditions
Ruby Testing / Elastic Search integration testing (.ruby-version, docker.elastic.co/elasticsearch/elasticsearch:8.10.2) (push) Blocked by required conditions
Ruby Testing / Elastic Search integration testing (.ruby-version, opensearchproject/opensearch:2) (push) Blocked by required conditions
Ruby Testing / Elastic Search integration testing (3.2, docker.elastic.co/elasticsearch/elasticsearch:7.17.13) (push) Blocked by required conditions
Ruby Testing / Elastic Search integration testing (3.3, docker.elastic.co/elasticsearch/elasticsearch:7.17.13) (push) Blocked by required conditions
Chromatic / Run Chromatic (push) Has been cancelled
CSS Linting / lint (push) Has been cancelled
JavaScript Linting / lint (push) Has been cancelled
JavaScript Testing / test (push) Has been cancelled
2025-09-03 12:34:29 +00:00
renovate[bot]
c1542643f5
fix(deps): update dependency sass to v1.92.0 (#36001)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-03 12:23:00 +00:00
Matt Jankowski
be0489ac1f Add IpBlock#to_cidr method to build string 2025-08-21 09:44:08 -04:00
12 changed files with 96 additions and 15 deletions

View File

@ -8,6 +8,7 @@ const meta = {
component: Button, component: Button,
args: { args: {
secondary: false, secondary: false,
plain: false,
compact: false, compact: false,
dangerous: false, dangerous: false,
disabled: false, disabled: false,
@ -57,6 +58,14 @@ export const Secondary: Story = {
play: buttonTest, play: buttonTest,
}; };
export const Plain: Story = {
args: {
plain: true,
children: 'Plain button',
},
play: buttonTest,
};
export const Compact: Story = { export const Compact: Story = {
args: { args: {
compact: true, compact: true,
@ -101,6 +110,14 @@ export const SecondaryDisabled: Story = {
play: disabledButtonTest, play: disabledButtonTest,
}; };
export const PlainDisabled: Story = {
args: {
...Plain.args,
disabled: true,
},
play: disabledButtonTest,
};
const loadingButtonTest: Story['play'] = async ({ const loadingButtonTest: Story['play'] = async ({
args, args,
canvas, canvas,

View File

@ -9,6 +9,7 @@ interface BaseProps
extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'children'> { extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'children'> {
block?: boolean; block?: boolean;
secondary?: boolean; secondary?: boolean;
plain?: boolean;
compact?: boolean; compact?: boolean;
dangerous?: boolean; dangerous?: boolean;
loading?: boolean; loading?: boolean;
@ -35,6 +36,7 @@ export const Button: React.FC<Props> = ({
disabled, disabled,
block, block,
secondary, secondary,
plain,
compact, compact,
dangerous, dangerous,
loading, loading,
@ -62,6 +64,7 @@ export const Button: React.FC<Props> = ({
<button <button
className={classNames('button', className, { className={classNames('button', className, {
'button-secondary': secondary, 'button-secondary': secondary,
'button--plain': plain,
'button--compact': compact, 'button--compact': compact,
'button--block': block, 'button--block': block,
'button--dangerous': dangerous, 'button--dangerous': dangerous,

View File

@ -201,6 +201,41 @@
} }
} }
&.button--plain {
color: $highlight-text-color;
background: transparent;
padding: 6px;
// The button has no outline, so we use negative margin to
// visually align its label with its surroundings while maintaining
// a generous click target
margin-inline: -6px;
border: 1px solid transparent;
&:active,
&:focus,
&:hover {
border-color: transparent;
color: lighten($highlight-text-color, 4%);
background-color: transparent;
text-decoration: none;
}
&:disabled,
&.disabled {
opacity: 0.7;
border-color: transparent;
color: $ui-button-disabled-color;
&:active,
&:focus,
&:hover {
border-color: transparent;
color: $ui-button-disabled-color;
}
}
}
&.button-tertiary { &.button-tertiary {
background: transparent; background: transparent;
padding: 6px 17px; padding: 6px 17px;

View File

@ -31,9 +31,10 @@ class IpBlock < ApplicationRecord
after_commit :reset_cache after_commit :reset_cache
def to_log_human_identifier def to_cidr
"#{ip}/#{ip.prefix}" "#{ip}/#{ip.prefix}"
end end
alias to_log_human_identifier to_cidr
class << self class << self
def blocked?(remote_ip) def blocked?(remote_ip)

View File

@ -232,6 +232,15 @@ class ActivityPub::NoteSerializer < ActivityPub::Serializer
canQuote: { canQuote: {
automaticApproval: approved_uris, automaticApproval: approved_uris,
}, },
canReply: {
always: 'https://www.w3.org/ns/activitystreams#Public',
},
canLike: {
always: 'https://www.w3.org/ns/activitystreams#Public',
},
canAnnounce: {
always: 'https://www.w3.org/ns/activitystreams#Public',
},
} }
end end

View File

@ -9,6 +9,6 @@ class REST::Admin::IpBlockSerializer < ActiveModel::Serializer
end end
def ip def ip
"#{object.ip}/#{object.ip.prefix}" object.to_cidr
end end
end end

View File

@ -3,7 +3,7 @@
= f.check_box :ip_block_ids, { multiple: true, include_hidden: false }, ip_block.id = f.check_box :ip_block_ids, { multiple: true, include_hidden: false }, ip_block.id
.batch-table__row__content.pending-account .batch-table__row__content.pending-account
.pending-account__header .pending-account__header
%samp= link_to "#{ip_block.ip}/#{ip_block.ip.prefix}", admin_accounts_path(ip: "#{ip_block.ip}/#{ip_block.ip.prefix}") %samp= link_to ip_block.to_cidr, admin_accounts_path(ip: ip_block.to_cidr)
- if ip_block.comment.present? - if ip_block.comment.present?
· ·
= ip_block.comment = ip_block.comment

View File

@ -107,9 +107,9 @@ module Mastodon::CLI
IpBlock.severity_no_access.find_each do |ip_block| IpBlock.severity_no_access.find_each do |ip_block|
case options[:format] case options[:format]
when 'nginx' when 'nginx'
say "deny #{ip_block.ip}/#{ip_block.ip.prefix};" say "deny #{ip_block.to_cidr};"
else else
say "#{ip_block.ip}/#{ip_block.ip.prefix}" say ip_block.to_cidr
end end
end end
end end

View File

@ -251,12 +251,12 @@ RSpec.describe Mastodon::CLI::IpBlocks do
it 'exports blocked IPs with "no_access" severity in plain format' do it 'exports blocked IPs with "no_access" severity in plain format' do
expect { subject } expect { subject }
.to output_results("#{first_ip_range_block.ip}/#{first_ip_range_block.ip.prefix}\n#{second_ip_range_block.ip}/#{second_ip_range_block.ip.prefix}") .to output_results("#{first_ip_range_block.to_cidr}\n#{second_ip_range_block.to_cidr}")
end end
it 'does not export blocked IPs with different severities' do it 'does not export blocked IPs with different severities' do
expect { subject } expect { subject }
.to_not output_results("#{third_ip_range_block.ip}/#{first_ip_range_block.ip.prefix}") .to_not output_results(third_ip_range_block.to_cidr)
end end
end end
@ -265,19 +265,19 @@ RSpec.describe Mastodon::CLI::IpBlocks do
it 'exports blocked IPs with "no_access" severity in plain format' do it 'exports blocked IPs with "no_access" severity in plain format' do
expect { subject } expect { subject }
.to output_results("deny #{first_ip_range_block.ip}/#{first_ip_range_block.ip.prefix};\ndeny #{second_ip_range_block.ip}/#{second_ip_range_block.ip.prefix};") .to output_results("deny #{first_ip_range_block.to_cidr};\ndeny #{second_ip_range_block.to_cidr};")
end end
it 'does not export blocked IPs with different severities' do it 'does not export blocked IPs with different severities' do
expect { subject } expect { subject }
.to_not output_results("deny #{third_ip_range_block.ip}/#{first_ip_range_block.ip.prefix};") .to_not output_results("deny #{third_ip_range_block.to_cidr};")
end end
end end
context 'when --format option is not provided' do context 'when --format option is not provided' do
it 'exports blocked IPs in plain format by default' do it 'exports blocked IPs in plain format by default' do
expect { subject } expect { subject }
.to output_results("#{first_ip_range_block.ip}/#{first_ip_range_block.ip.prefix}\n#{second_ip_range_block.ip}/#{second_ip_range_block.ip.prefix}") .to output_results("#{first_ip_range_block.to_cidr}\n#{second_ip_range_block.to_cidr}")
end end
end end
end end

View File

@ -26,6 +26,22 @@ RSpec.describe IpBlock do
end end
end end
describe '#to_cidr' do
subject { Fabricate.build(:ip_block, ip:).to_cidr }
context 'with an IP and a specified prefix' do
let(:ip) { '192.168.1.0/24' }
it { is_expected.to eq('192.168.1.0/24') }
end
context 'with an IP and a default prefix' do
let(:ip) { '192.168.1.0' }
it { is_expected.to eq('192.168.1.0/32') }
end
end
describe '.blocked?' do describe '.blocked?' do
context 'when the IP is blocked' do context 'when the IP is blocked' do
it 'returns true' do it 'returns true' do

View File

@ -97,7 +97,7 @@ RSpec.describe 'IP Blocks' do
expect(response.parsed_body) expect(response.parsed_body)
.to include( .to include(
ip: eq("#{ip_block.ip}/#{ip_block.ip.prefix}"), ip: eq(ip_block.to_cidr),
severity: eq(ip_block.severity.to_s) severity: eq(ip_block.severity.to_s)
) )
end end
@ -216,7 +216,7 @@ RSpec.describe 'IP Blocks' do
expect(response.content_type) expect(response.content_type)
.to start_with('application/json') .to start_with('application/json')
expect(response.parsed_body).to match(hash_including({ expect(response.parsed_body).to match(hash_including({
ip: "#{ip_block.ip}/#{ip_block.ip.prefix}", ip: ip_block.to_cidr,
severity: 'sign_up_requires_approval', severity: 'sign_up_requires_approval',
comment: 'Decreasing severity', comment: 'Decreasing severity',
})) }))

View File

@ -11957,8 +11957,8 @@ __metadata:
linkType: hard linkType: hard
"sass@npm:^1.62.1": "sass@npm:^1.62.1":
version: 1.91.0 version: 1.92.0
resolution: "sass@npm:1.91.0" resolution: "sass@npm:1.92.0"
dependencies: dependencies:
"@parcel/watcher": "npm:^2.4.1" "@parcel/watcher": "npm:^2.4.1"
chokidar: "npm:^4.0.0" chokidar: "npm:^4.0.0"
@ -11969,7 +11969,7 @@ __metadata:
optional: true optional: true
bin: bin:
sass: sass.js sass: sass.js
checksum: 10c0/5be1c98f7a618cb5f90b62f63d2aa0f78f9bf369c93ec7cd9880752a26b0ead19aa63cc341e8a26ce6c74d080baa5705f1685dff52fe6a3f28a7828ae50182b6 checksum: 10c0/bdff9fa6988620e2a81962efdd016e3894d19934cfadc105cf41db767f59dd47afd8ff32840e612ef700cb67e19d9e83c108f1724eb8f0bef56c4877dbe6f14d
languageName: node languageName: node
linkType: hard linkType: hard