Cleanup worker filter translations (#2621)
* refactor: 💡 clean-up worker filter translations
This commit is contained in:
1 parent
5e7b74a7ed
commit
6d2f1dcbbf
18 files changed
+74
-122
No files matched your search
@@ -63,3 +63,5 @@ narrow-results: Narrow results
|
||||
overflow-options: Overflow Options
|
||||
show-errors: Show Errors
|
||||
hide-errors: Hide Errors
|
||||
edit-worker-filter: Edit Worker Filter
|
||||
add-worker-filter: Add Worker Filter
|
||||
@@ -44,6 +44,8 @@ titles:
|
||||
not-set: Not set
|
||||
year: '{numberOfYears, plural, =1 {# year} other {# years}}'
|
||||
days: '{days, plural, =1 {# day} other {# days}}'
|
||||
workers: Workers
|
||||
no-worker-filter: No worker filter added
|
||||
descriptions:
|
||||
empty-set: There are no items to display yet. You may be able to add items or try back later.
|
||||
cluster-url-initialization: To get started, please enter your cluster URL
|
||||
@@ -134,26 +136,25 @@ settings:
|
||||
cache-daemon: There may be a problem with the cache daemon
|
||||
client-agent: There may be a problem with the client agent
|
||||
worker-filter-generator:
|
||||
title: Filter generator
|
||||
description: Choose what you want to format into a filter.
|
||||
link: Learn more about formatting a worker filter.
|
||||
toggle:
|
||||
title: Show filter generator
|
||||
description: The generator will automatically generate a pre-formatted filter for you. You can copy the result to the editor above.
|
||||
filter-generator:
|
||||
title: Filter generator
|
||||
description: Choose what you want to format into a filter.
|
||||
link: Learn more about formatting a worker filter.
|
||||
input-values:
|
||||
title: Input values
|
||||
description: Next, input what you want to format.
|
||||
formatted-result:
|
||||
title: Formatted result
|
||||
description: Copy and paste this into the editor above.
|
||||
label: Generated result
|
||||
tag:
|
||||
label: Tag
|
||||
helper: Format a worker tag
|
||||
name:
|
||||
label: Name
|
||||
helper: Format a worker name
|
||||
operator:
|
||||
matches: matches
|
||||
contains: contains
|
||||
input-values:
|
||||
title: Input values
|
||||
description: Next, input what you want to format.
|
||||
formatted-result:
|
||||
title: Formatted result
|
||||
description: Copy and paste this into the editor above.
|
||||
label: Generated result
|
||||
tag:
|
||||
label: Tag
|
||||
helper: Format a worker tag
|
||||
name:
|
||||
label: Name
|
||||
helper: Format a worker name
|
||||
operator:
|
||||
matches: matches
|
||||
contains: contains
|
||||
@@ -183,3 +183,5 @@ created:
|
||||
other_fields:
|
||||
label: Other Fields
|
||||
help: This information is provided by the server and cannot be edited in Boundary
|
||||
worker_filter:
|
||||
label: Worker Filter
|
||||
@@ -239,7 +239,6 @@ host-catalog:
|
||||
label: Client/Application ID
|
||||
help: The client (application) ID of an Azure service principal that Boundary will use to authenticate and discover hosts from Azure.
|
||||
worker_filter:
|
||||
label: Worker Filter
|
||||
help: Insert a worker filter in order to route requests to the correct worker.
|
||||
host-set:
|
||||
title: Host Set
|
||||
@@ -501,7 +500,6 @@ storage-bucket:
|
||||
label: Secret access key
|
||||
help: The secret access key generated by your storage provider for the IAM user to use with this storage bucket. We will not show this data after it is saved, but you can replace it.
|
||||
worker_filter:
|
||||
label: Worker filter
|
||||
help: Filters to the worker(s) that can handle requests for this storage bucket.
|
||||
disable_credential_rotation:
|
||||
label: Disable credential rotation
|
||||
@@ -782,11 +780,9 @@ target:
|
||||
title: Add Injected Application Credential Sources
|
||||
description: Select injected Application credential sources to assign to this target.
|
||||
workers:
|
||||
title: Workers
|
||||
description: You can customize how your workers route traffic to this target by setting up a filter that matches specific worker tags. If your target is in a private network, we recommend setting up an egress filter to specify a worker inside the network so that Boundary can access the host. Ingress and egress filters are allowed to select the same worker.
|
||||
messages:
|
||||
none:
|
||||
title: No worker filter added
|
||||
description: You haven't added an {type} worker filter yet.
|
||||
diagram:
|
||||
client: Client
|
||||
@@ -812,14 +808,10 @@ target:
|
||||
title: Edit Ingress Worker Filter
|
||||
description: Specify workers Boundary should use to start the route to this target.
|
||||
worker-filter:
|
||||
title: Worker filter
|
||||
description: The worker filter format for this target.
|
||||
accordion-label:
|
||||
egress-workers: Egress workers
|
||||
ingress-workers: Ingress workers
|
||||
actions:
|
||||
edit-worker-filter: Edit worker filter
|
||||
add-worker-filter: Add worker filter
|
||||
credential-store:
|
||||
title: Credential Store
|
||||
title_plural: Credential Stores
|
||||
@@ -830,19 +822,14 @@ credential-store:
|
||||
titles:
|
||||
new: New Credential Store
|
||||
worker-filter:
|
||||
title: Worker Filter
|
||||
description: The worker filter format for this credential store.
|
||||
description: A filter used to control which PKI workers can handle Vault requests, allowing the use of private Vault instances with Boundary.
|
||||
messages:
|
||||
none:
|
||||
title: No worker filter added
|
||||
description: You haven't added a worker filter yet.
|
||||
edit:
|
||||
title: Edit Worker Filter
|
||||
description: Specify workers that have access to the credential store.
|
||||
actions:
|
||||
add: Add Worker Filter
|
||||
delete: Delete Credential Store
|
||||
edit: Edit Worker Filter
|
||||
types:
|
||||
vault: Vault
|
||||
static: Static
|
||||
@@ -878,9 +865,6 @@ credential-store:
|
||||
help: A PEM-encoded private key matching the client certificate from Client Certificate.
|
||||
client_certificate_key_hmac:
|
||||
label: Client Certificate Key HMAC
|
||||
worker_filter:
|
||||
label: Worker Filter
|
||||
help: A filter used to control which PKI workers can handle Vault requests, allowing the use of private Vault instances with Boundary.
|
||||
credential-library:
|
||||
title: Credential Library
|
||||
title_plural: Credential Libraries
|
||||
@@ -1014,7 +998,6 @@ managed-group:
|
||||
help: The list of groups that this Managed Group belongs to.
|
||||
worker:
|
||||
title: Worker
|
||||
title_plural: Workers
|
||||
titles:
|
||||
new: New PKI Worker
|
||||
description: Workers are the server components that perform the session handling.
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
{{#if (and (feature-flag 'vault-worker-filter') @model.isVault)}}
|
||||
<dd.Interactive
|
||||
@route='scopes.scope.credential-stores.credential-store.edit-worker-filter'
|
||||
@text={{t 'resources.credential-store.actions.edit'}}
|
||||
@text={{t 'actions.edit-worker-filter'}}
|
||||
/>
|
||||
{{/if}}
|
||||
{{#if (can 'delete model' @model)}}
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
<nav.link
|
||||
@route='scopes.scope.credential-stores.credential-store.worker-filter'
|
||||
>
|
||||
{{t 'resources.credential-store.worker-filter.title'}}
|
||||
{{t 'form.worker_filter.label'}}
|
||||
</nav.link>
|
||||
{{/if}}
|
||||
{{#if (can 'navigate model' @model collection='credential-libraries')}}
|
||||
|
||||
@@ -360,9 +360,7 @@
|
||||
disabled={{form.disabled}}
|
||||
as |F|
|
||||
>
|
||||
<F.Label>
|
||||
{{t 'resources.host-catalog.form.worker_filter.label'}}
|
||||
</F.Label>
|
||||
<F.Label>{{t 'form.worker_filter.label'}}</F.Label>
|
||||
<F.HelperText>
|
||||
{{t 'resources.host-catalog.form.worker_filter.help'}}
|
||||
<Hds::Link::Inline @href={{doc-url 'worker.create-tags'}}>
|
||||
|
||||
@@ -464,9 +464,7 @@
|
||||
@isRequired={{true}}
|
||||
as |F|
|
||||
>
|
||||
<F.Legend id={{labelId}}>{{t
|
||||
'resources.storage-bucket.form.worker_filter.label'
|
||||
}}</F.Legend>
|
||||
<F.Legend id={{labelId}}>{{t 'form.worker_filter.label'}}</F.Legend>
|
||||
<F.HelperText id={{helpId}}>
|
||||
{{t 'resources.storage-bucket.form.worker_filter.help'}}
|
||||
<Hds::Link::Inline @href={{doc-url 'storage-bucket.worker-filter'}}>
|
||||
|
||||
@@ -323,9 +323,7 @@
|
||||
@isRequired={{true}}
|
||||
as |F|
|
||||
>
|
||||
<F.Legend id={{labelId}}>{{t
|
||||
'resources.storage-bucket.form.worker_filter.label'
|
||||
}}</F.Legend>
|
||||
<F.Legend id={{labelId}}>{{t 'form.worker_filter.label'}}</F.Legend>
|
||||
<F.HelperText {{helpId}}>
|
||||
{{t 'resources.storage-bucket.form.worker_filter.help'}}
|
||||
<Hds::Link::Inline @href={{doc-url 'storage-bucket.worker-filter'}}>
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
{{t 'titles.details'}}
|
||||
</nav.link>
|
||||
<nav.link @route='scopes.scope.targets.target.workers'>
|
||||
{{t 'resources.target.workers.title'}}
|
||||
{{t 'titles.workers'}}
|
||||
</nav.link>
|
||||
<nav.link @route='scopes.scope.targets.target.host-sources'>
|
||||
{{t 'resources.target.host-source.title_plural'}}
|
||||
|
||||
@@ -51,15 +51,15 @@
|
||||
{{on 'change' this.setGeneratorType}}
|
||||
as |G|
|
||||
>
|
||||
<G.Legend>{{t 'worker-filter-generator.filter-generator.title'}}</G.Legend>
|
||||
<G.Legend>{{t 'worker-filter-generator.title'}}</G.Legend>
|
||||
<G.HelperText>
|
||||
{{t 'worker-filter-generator.filter-generator.description'}}
|
||||
{{t 'worker-filter-generator.description'}}
|
||||
<br />
|
||||
<Hds::Link::Inline
|
||||
@href={{doc-url 'worker-filters-format'}}
|
||||
@color='secondary'
|
||||
>
|
||||
{{t 'worker-filter-generator.filter-generator.link'}}
|
||||
{{t 'worker-filter-generator.link'}}
|
||||
</Hds::Link::Inline>
|
||||
</G.HelperText>
|
||||
<G.RadioField
|
||||
@@ -67,24 +67,16 @@
|
||||
checked={{eq this.selectedGeneratorType this.generatorTagType}}
|
||||
as |F|
|
||||
>
|
||||
<F.Label>{{t
|
||||
'worker-filter-generator.filter-generator.tag.label'
|
||||
}}</F.Label>
|
||||
<F.HelperText>{{t
|
||||
'worker-filter-generator.filter-generator.tag.helper'
|
||||
}}</F.HelperText>
|
||||
<F.Label>{{t 'worker-filter-generator.tag.label'}}</F.Label>
|
||||
<F.HelperText>{{t 'worker-filter-generator.tag.helper'}}</F.HelperText>
|
||||
</G.RadioField>
|
||||
<G.RadioField
|
||||
@value={{this.generatorNameType}}
|
||||
checked={{eq this.selectedGeneratorType this.generatorNameType}}
|
||||
as |F|
|
||||
>
|
||||
<F.Label>{{t
|
||||
'worker-filter-generator.filter-generator.name.label'
|
||||
}}</F.Label>
|
||||
<F.HelperText>{{t
|
||||
'worker-filter-generator.filter-generator.name.helper'
|
||||
}}</F.HelperText>
|
||||
<F.Label>{{t 'worker-filter-generator.name.label'}}</F.Label>
|
||||
<F.HelperText>{{t 'worker-filter-generator.name.helper'}}</F.HelperText>
|
||||
</G.RadioField>
|
||||
</Hds::Form::Radio::Group>
|
||||
|
||||
@@ -96,10 +88,10 @@
|
||||
as |F|
|
||||
>
|
||||
<F.Legend id={{labelId}}>{{t
|
||||
'worker-filter-generator.filter-generator.input-values.title'
|
||||
'worker-filter-generator.input-values.title'
|
||||
}}</F.Legend>
|
||||
<F.HelperText id={{helpId}}>{{t
|
||||
'worker-filter-generator.filter-generator.input-values.description'
|
||||
'worker-filter-generator.input-values.description'
|
||||
}}</F.HelperText>
|
||||
<F.Control>
|
||||
{{#if (eq this.selectedGeneratorType this.generatorTagType)}}
|
||||
@@ -133,12 +125,7 @@
|
||||
{{#if (eq operator '==')}}
|
||||
{{operator}}
|
||||
{{else}}
|
||||
{{t
|
||||
(concat
|
||||
'worker-filter-generator.filter-generator.operator.'
|
||||
operator
|
||||
)
|
||||
}}
|
||||
{{t (concat 'worker-filter-generator.operator.' operator)}}
|
||||
{{/if}}
|
||||
</option>
|
||||
{{/each}}
|
||||
@@ -169,14 +156,14 @@
|
||||
as |F|
|
||||
>
|
||||
<F.Legend id={{labelId}}>{{t
|
||||
'worker-filter-generator.filter-generator.formatted-result.title'
|
||||
'worker-filter-generator.formatted-result.title'
|
||||
}}</F.Legend>
|
||||
<F.HelperText id={{helpId}}>{{t
|
||||
'worker-filter-generator.filter-generator.formatted-result.description'
|
||||
'worker-filter-generator.formatted-result.description'
|
||||
}}</F.HelperText>
|
||||
<F.Control>
|
||||
<Hds::Text::Body @tag='p' @weight='semibold'>{{t
|
||||
'worker-filter-generator.filter-generator.formatted-result.label'
|
||||
'worker-filter-generator.formatted-result.label'
|
||||
}}</Hds::Text::Body>
|
||||
<div class='generated-results-container'>
|
||||
<Hds::Form::TextInput::Base
|
||||
|
||||
@@ -83,7 +83,7 @@
|
||||
}}
|
||||
<nav.link @route='scopes.scope.workers'>
|
||||
<Rose::Icon @name='flight-icons/svg/cpu-16' @size='medium' />
|
||||
{{t 'resources.worker.title_plural'}}
|
||||
{{t 'titles.workers'}}
|
||||
</nav.link>
|
||||
{{/if}}
|
||||
</Rose::Nav::Sidebar>
|
||||
|
||||
+3
-5
@@ -3,11 +3,9 @@
|
||||
SPDX-License-Identifier: BUSL-1.1
|
||||
}}
|
||||
|
||||
{{page-title
|
||||
(t 'resources.credential-store.worker-filter.messages.edit.title')
|
||||
}}
|
||||
{{page-title (t 'actions.edit-worker-filter')}}
|
||||
<Breadcrumbs::Item
|
||||
@text={{t 'resources.credential-store.worker-filter.messages.edit.title'}}
|
||||
@text={{t 'actions.edit-worker-filter'}}
|
||||
@route='scopes.scope.credential-stores.credential-store.edit-worker-filter'
|
||||
/>
|
||||
|
||||
@@ -18,7 +16,7 @@
|
||||
|
||||
<page.header>
|
||||
<Hds::Text::Display @tag='h2' @size='300' class='h2'>
|
||||
{{t 'resources.credential-store.worker-filter.messages.edit.title'}}
|
||||
{{t 'actions.edit-worker-filter'}}
|
||||
<DocLink @doc='worker-filters-format' @iconSize='large' />
|
||||
</Hds::Text::Display>
|
||||
<Hds::Text::Body @tag='p' @size='300'>
|
||||
|
||||
+5
-11
@@ -3,9 +3,9 @@
|
||||
SPDX-License-Identifier: BUSL-1.1
|
||||
}}
|
||||
|
||||
{{page-title (t 'resources.credential-store.worker-filter.title')}}
|
||||
{{page-title (t 'form.worker_filter.label')}}
|
||||
<Breadcrumbs::Item
|
||||
@text={{t 'resources.credential-store.worker-filter.title'}}
|
||||
@text={{t 'form.worker_filter.label'}}
|
||||
@route='scopes.scope.credential-stores.credential-store.worker-filter'
|
||||
/>
|
||||
|
||||
@@ -38,9 +38,7 @@
|
||||
@hasCopyButton={{true}}
|
||||
as |CB|
|
||||
>
|
||||
<CB.Title>
|
||||
{{t 'resources.credential-store.worker-filter.title'}}
|
||||
</CB.Title>
|
||||
<CB.Title>{{t 'form.worker_filter.label'}}</CB.Title>
|
||||
<CB.Description>
|
||||
{{t 'resources.credential-store.worker-filter.description'}}
|
||||
</CB.Description>
|
||||
@@ -48,11 +46,7 @@
|
||||
{{else}}
|
||||
<Rose::Layout::Centered>
|
||||
<Hds::ApplicationState as |A|>
|
||||
<A.Header
|
||||
@title={{t
|
||||
'resources.credential-store.worker-filter.messages.none.title'
|
||||
}}
|
||||
/>
|
||||
<A.Header @title={{t 'titles.no-worker-filter'}} />
|
||||
<A.Body
|
||||
@text={{t
|
||||
'resources.credential-store.worker-filter.messages.none.description'
|
||||
@@ -61,7 +55,7 @@
|
||||
<A.Footer as |F|>
|
||||
<F.LinkStandalone
|
||||
@icon='plus-circle'
|
||||
@text={{t 'resources.credential-store.actions.add'}}
|
||||
@text={{t 'actions.add-worker-filter'}}
|
||||
@route='scopes.scope.credential-stores.credential-store.edit-worker-filter'
|
||||
/>
|
||||
</A.Footer>
|
||||
|
||||
@@ -3,9 +3,9 @@
|
||||
SPDX-License-Identifier: BUSL-1.1
|
||||
}}
|
||||
|
||||
{{page-title (t 'resources.target.workers.title')}}
|
||||
{{page-title (t 'titles.workers')}}
|
||||
<Breadcrumbs::Item
|
||||
@text={{t 'resources.target.workers.title'}}
|
||||
@text={{t 'titles.workers'}}
|
||||
@route='scopes.scope.targets.target.workers'
|
||||
/>
|
||||
|
||||
@@ -55,8 +55,8 @@
|
||||
@text={{t
|
||||
(if
|
||||
@model.ingress_worker_filter
|
||||
'resources.target.workers.actions.edit-worker-filter'
|
||||
'resources.target.workers.actions.add-worker-filter'
|
||||
'actions.edit-worker-filter'
|
||||
'actions.add-worker-filter'
|
||||
)
|
||||
}}
|
||||
@route='scopes.scope.targets.target.edit-ingress-worker-filter'
|
||||
@@ -72,18 +72,14 @@
|
||||
@value={{@model.ingress_worker_filter}}
|
||||
as |CB|
|
||||
>
|
||||
<CB.Title>{{t
|
||||
'resources.target.workers.worker-filter.title'
|
||||
}}</CB.Title>
|
||||
<CB.Title>{{t 'form.worker_filter.label'}}</CB.Title>
|
||||
<CB.Description>{{t
|
||||
'resources.target.workers.worker-filter.description'
|
||||
}}</CB.Description>
|
||||
</Hds::CodeBlock>
|
||||
{{else}}
|
||||
<Hds::ApplicationState as |A|>
|
||||
<A.Header
|
||||
@title={{t 'resources.target.workers.messages.none.title'}}
|
||||
/>
|
||||
<A.Header @title={{t 'titles.no-worker-filter'}} />
|
||||
<A.Body
|
||||
@text={{t
|
||||
'resources.target.workers.messages.none.description'
|
||||
@@ -110,8 +106,8 @@
|
||||
@text={{t
|
||||
(if
|
||||
@model.egress_worker_filter
|
||||
'resources.target.workers.actions.edit-worker-filter'
|
||||
'resources.target.workers.actions.add-worker-filter'
|
||||
'actions.edit-worker-filter'
|
||||
'actions.add-worker-filter'
|
||||
)
|
||||
}}
|
||||
@route='scopes.scope.targets.target.edit-egress-worker-filter'
|
||||
@@ -127,18 +123,14 @@
|
||||
@value={{@model.egress_worker_filter}}
|
||||
as |CB|
|
||||
>
|
||||
<CB.Title>{{t
|
||||
'resources.target.workers.worker-filter.title'
|
||||
}}</CB.Title>
|
||||
<CB.Title>{{t 'form.worker_filter.label'}}</CB.Title>
|
||||
<CB.Description>{{t
|
||||
'resources.target.workers.worker-filter.description'
|
||||
}}</CB.Description>
|
||||
</Hds::CodeBlock>
|
||||
{{else}}
|
||||
<Hds::ApplicationState as |A|>
|
||||
<A.Header
|
||||
@title={{t 'resources.target.workers.messages.none.title'}}
|
||||
/>
|
||||
<A.Header @title={{t 'titles.no-worker-filter'}} />
|
||||
<A.Body
|
||||
@text={{t
|
||||
'resources.target.workers.messages.none.description'
|
||||
|
||||
@@ -3,10 +3,7 @@
|
||||
SPDX-License-Identifier: BUSL-1.1
|
||||
}}
|
||||
|
||||
{{page-title (t 'resources.worker.title_plural')}}
|
||||
<Breadcrumbs::Item
|
||||
@text={{t 'resources.worker.title_plural'}}
|
||||
@route='scopes.scope.workers'
|
||||
/>
|
||||
{{page-title (t 'titles.workers')}}
|
||||
<Breadcrumbs::Item @text={{t 'titles.workers'}} @route='scopes.scope.workers' />
|
||||
|
||||
{{outlet}}
|
||||
@@ -11,7 +11,7 @@
|
||||
|
||||
<page.header>
|
||||
<h2>
|
||||
{{t 'resources.worker.title_plural'}}
|
||||
{{t 'titles.workers'}}
|
||||
<DocLink @doc='worker' @iconSize='large' />
|
||||
</h2>
|
||||
</page.header>
|
||||
@@ -218,7 +218,7 @@
|
||||
'descriptions.neither-list-nor-create'
|
||||
)
|
||||
)
|
||||
resource=(t 'resources.worker.title_plural')
|
||||
resource=(t 'titles.workers')
|
||||
}}
|
||||
/>
|
||||
{{#if
|
||||
|
||||
@@ -14,6 +14,7 @@ module('Acceptance | targets | workers', function (hooks) {
|
||||
setupApplicationTest(hooks);
|
||||
setupMirage(hooks);
|
||||
|
||||
let intl;
|
||||
let featuresService;
|
||||
let featureEdition;
|
||||
|
||||
@@ -52,6 +53,7 @@ module('Acceptance | targets | workers', function (hooks) {
|
||||
};
|
||||
|
||||
hooks.beforeEach(async function () {
|
||||
intl = this.owner.lookup('service:intl');
|
||||
featuresService = this.owner.lookup('service:features');
|
||||
featureEdition = this.owner.lookup('service:featureEdition');
|
||||
|
||||
@@ -258,10 +260,10 @@ module('Acceptance | targets | workers', function (hooks) {
|
||||
|
||||
assert
|
||||
.dom(ACCORDION_DROPDOWN_TEXT_SELECTOR('egress'))
|
||||
.hasText('Add worker filter');
|
||||
.hasText(intl.t('actions.add-worker-filter'));
|
||||
assert
|
||||
.dom(ACCORDION_DROPDOWN_TEXT_SELECTOR('ingress'))
|
||||
.hasText('Add worker filter');
|
||||
.hasText(intl.t('actions.add-worker-filter'));
|
||||
});
|
||||
|
||||
test('user will see "Edit worker filter" if filter is set', async function (assert) {
|
||||
@@ -272,10 +274,10 @@ module('Acceptance | targets | workers', function (hooks) {
|
||||
|
||||
assert
|
||||
.dom(ACCORDION_DROPDOWN_TEXT_SELECTOR('egress'))
|
||||
.hasText('Edit worker filter');
|
||||
.hasText(intl.t('actions.edit-worker-filter'));
|
||||
assert
|
||||
.dom(ACCORDION_DROPDOWN_TEXT_SELECTOR('ingress'))
|
||||
.hasText('Edit worker filter');
|
||||
.hasText(intl.t('actions.edit-worker-filter'));
|
||||
});
|
||||
|
||||
test('user can cancel changes to egress worker filter in a target', async function (assert) {
|
||||
|
||||
Reference in new issue
Block a user