mirror of
https://github.com/digitalocean/nginxconfig.io.git
synced 2025-10-15 19:19:21 +08:00
Dependency updates + full ESM (#327)
* Dependency updates * Fix eslint issues * Switch to esm fully * Fix Jest tests * Update to node 16, force mini-css-extract-plugin to 1.x * More dep updates * Use correct NPM version in Actions * Fix mini-css-extract-plugin version overrides * Don't rely on Webpack for available languages
This commit is contained in:
committed by
GitHub
parent
26e907bd81
commit
387a47b014
@@ -1,5 +1,5 @@
|
||||
<!--
|
||||
Copyright 2021 DigitalOcean
|
||||
Copyright 2022 DigitalOcean
|
||||
|
||||
This code is licensed under the MIT License.
|
||||
You may obtain a copy of the License at
|
||||
@@ -67,8 +67,9 @@ THE SOFTWARE.
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<div class="field">
|
||||
<div v-for="(name, value) in $props.data.sslProfile.options"
|
||||
:class="`control${sslProfileChanged && value === sslProfile ? ' is-changed' : ''}`"
|
||||
<div
|
||||
v-for="(name, value) in $props.data.sslProfile.options"
|
||||
:class="`control${sslProfileChanged && value === sslProfile ? ' is-changed' : ''}`"
|
||||
>
|
||||
<div class="radio">
|
||||
<PrettyRadio v-model="sslProfile" :value="value" class="p-default p-round p-fill p-icon">
|
||||
@@ -97,8 +98,9 @@ THE SOFTWARE.
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="$props.data.ocspCloudflare.computed" class="control field is-horizontal is-expanded">
|
||||
<div v-for="(name, value) in $props.data.ocspCloudflareType.options"
|
||||
:class="`control${ocspCloudflareTypeChanged && value === ocspCloudflareType ? ' is-changed' : ''}`"
|
||||
<div
|
||||
v-for="(name, value) in $props.data.ocspCloudflareType.options"
|
||||
:class="`control${ocspCloudflareTypeChanged && value === ocspCloudflareType ? ' is-changed' : ''}`"
|
||||
>
|
||||
<div class="radio">
|
||||
<PrettyRadio v-model="ocspCloudflareType" :value="value" class="p-default p-round p-fill p-icon">
|
||||
@@ -118,8 +120,9 @@ THE SOFTWARE.
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="$props.data.ocspGoogle.computed" class="control field is-horizontal is-expanded">
|
||||
<div v-for="(name, value) in $props.data.ocspGoogleType.options"
|
||||
:class="`control${ocspGoogleTypeChanged && value === ocspGoogleType ? ' is-changed' : ''}`"
|
||||
<div
|
||||
v-for="(name, value) in $props.data.ocspGoogleType.options"
|
||||
:class="`control${ocspGoogleTypeChanged && value === ocspGoogleType ? ' is-changed' : ''}`"
|
||||
>
|
||||
<div class="radio">
|
||||
<PrettyRadio v-model="ocspGoogleType" :value="value" class="p-default p-round p-fill p-icon">
|
||||
@@ -139,8 +142,9 @@ THE SOFTWARE.
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="$props.data.ocspOpenDns.computed" class="control field is-horizontal is-expanded">
|
||||
<div v-for="(name, value) in $props.data.ocspOpenDnsType.options"
|
||||
:class="`control${ocspOpenDnsTypeChanged && value === ocspOpenDnsType ? ' is-changed' : ''}`"
|
||||
<div
|
||||
v-for="(name, value) in $props.data.ocspOpenDnsType.options"
|
||||
:class="`control${ocspOpenDnsTypeChanged && value === ocspOpenDnsType ? ' is-changed' : ''}`"
|
||||
>
|
||||
<div class="radio">
|
||||
<PrettyRadio v-model="ocspOpenDnsType" :value="value" class="p-default p-round p-fill p-icon">
|
||||
@@ -160,8 +164,9 @@ THE SOFTWARE.
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="$props.data.ocspQuad9.computed" class="control field is-horizontal is-expanded">
|
||||
<div v-for="(name, value) in $props.data.ocspQuad9Type.options"
|
||||
:class="`control${ocspQuad9TypeChanged && value === ocspQuad9Type ? ' is-changed' : ''}`"
|
||||
<div
|
||||
v-for="(name, value) in $props.data.ocspQuad9Type.options"
|
||||
:class="`control${ocspQuad9TypeChanged && value === ocspQuad9Type ? ' is-changed' : ''}`"
|
||||
>
|
||||
<div class="radio">
|
||||
<PrettyRadio v-model="ocspQuad9Type" :value="value" class="p-default p-round p-fill p-icon">
|
||||
@@ -181,8 +186,9 @@ THE SOFTWARE.
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="$props.data.ocspVerisign.computed" class="control field is-horizontal is-expanded">
|
||||
<div v-for="(name, value) in $props.data.ocspVerisignType.options"
|
||||
:class="`control${ocspVerisignTypeChanged && value === ocspVerisignType ? ' is-changed' : ''}`"
|
||||
<div
|
||||
v-for="(name, value) in $props.data.ocspVerisignType.options"
|
||||
:class="`control${ocspVerisignTypeChanged && value === ocspVerisignType ? ' is-changed' : ''}`"
|
||||
>
|
||||
<div class="radio">
|
||||
<PrettyRadio v-model="ocspVerisignType" :value="value" class="p-default p-round p-fill p-icon">
|
||||
@@ -203,10 +209,11 @@ THE SOFTWARE.
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<div :class="`control${letsEncryptRootChanged ? ' is-changed' : ''}`">
|
||||
<input v-model="letsEncryptRoot"
|
||||
class="input"
|
||||
type="text"
|
||||
:placeholder="$props.data.letsEncryptRoot.default"
|
||||
<input
|
||||
v-model="letsEncryptRoot"
|
||||
class="input"
|
||||
type="text"
|
||||
:placeholder="$props.data.letsEncryptRoot.default"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
@@ -220,10 +227,11 @@ THE SOFTWARE.
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<div :class="`control${letsEncryptCertRootChanged ? ' is-changed' : ''}`">
|
||||
<input v-model="letsEncryptCertRoot"
|
||||
class="input"
|
||||
type="text"
|
||||
:placeholder="$props.data.letsEncryptCertRoot.default"
|
||||
<input
|
||||
v-model="letsEncryptCertRoot"
|
||||
class="input"
|
||||
type="text"
|
||||
:placeholder="$props.data.letsEncryptCertRoot.default"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
@@ -1,5 +1,5 @@
|
||||
<!--
|
||||
Copyright 2020 DigitalOcean
|
||||
Copyright 2022 DigitalOcean
|
||||
|
||||
This code is licensed under the MIT License.
|
||||
You may obtain a copy of the License at
|
||||
@@ -33,10 +33,11 @@ THE SOFTWARE.
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<div :class="`control${accessLogChanged ? ' is-changed' : ''}`">
|
||||
<input v-model="accessLog"
|
||||
class="input"
|
||||
type="text"
|
||||
:placeholder="$props.data.accessLog.default"
|
||||
<input
|
||||
v-model="accessLog"
|
||||
class="input"
|
||||
type="text"
|
||||
:placeholder="$props.data.accessLog.default"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
@@ -50,10 +51,11 @@ THE SOFTWARE.
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<div :class="`control${errorLogChanged ? ' is-changed' : ''}`">
|
||||
<input v-model="errorLog"
|
||||
class="input"
|
||||
type="text"
|
||||
:placeholder="$props.data.errorLog.default"
|
||||
<input
|
||||
v-model="errorLog"
|
||||
class="input"
|
||||
type="text"
|
||||
:placeholder="$props.data.errorLog.default"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
@@ -1,5 +1,5 @@
|
||||
<!--
|
||||
Copyright 2020 DigitalOcean
|
||||
Copyright 2022 DigitalOcean
|
||||
|
||||
This code is licensed under the MIT License.
|
||||
You may obtain a copy of the License at
|
||||
@@ -33,10 +33,11 @@ THE SOFTWARE.
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<div :class="`control${nginxConfigDirectoryChanged ? ' is-changed' : ''}`">
|
||||
<input v-model="nginxConfigDirectory"
|
||||
class="input"
|
||||
type="text"
|
||||
:placeholder="$props.data.nginxConfigDirectory.default"
|
||||
<input
|
||||
v-model="nginxConfigDirectory"
|
||||
class="input"
|
||||
type="text"
|
||||
:placeholder="$props.data.nginxConfigDirectory.default"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
@@ -50,9 +51,10 @@ THE SOFTWARE.
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<div :class="`control${workerProcessesChanged ? ' is-changed' : ''}`">
|
||||
<VueSelect v-model="workerProcesses"
|
||||
:options="$props.data.workerProcesses.options"
|
||||
:clearable="false"
|
||||
<VueSelect
|
||||
v-model="workerProcesses"
|
||||
:options="$props.data.workerProcesses.options"
|
||||
:clearable="false"
|
||||
></VueSelect>
|
||||
</div>
|
||||
</div>
|
||||
@@ -66,10 +68,11 @@ THE SOFTWARE.
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<div :class="`control${userChanged ? ' is-changed' : ''}`">
|
||||
<input v-model="user"
|
||||
class="input"
|
||||
type="text"
|
||||
:placeholder="$props.data.user.default"
|
||||
<input
|
||||
v-model="user"
|
||||
class="input"
|
||||
type="text"
|
||||
:placeholder="$props.data.user.default"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
@@ -83,10 +86,11 @@ THE SOFTWARE.
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<div :class="`control${pidChanged ? ' is-changed' : ''}`">
|
||||
<input v-model="pid"
|
||||
class="input"
|
||||
type="text"
|
||||
:placeholder="$props.data.pid.default"
|
||||
<input
|
||||
v-model="pid"
|
||||
class="input"
|
||||
type="text"
|
||||
:placeholder="$props.data.pid.default"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
@@ -100,12 +104,13 @@ THE SOFTWARE.
|
||||
<div class="field-body">
|
||||
<div class="field has-addons">
|
||||
<div :class="`control is-expanded${clientMaxBodySizeChanged ? ' is-changed' : ''}`">
|
||||
<input v-model.number="clientMaxBodySize"
|
||||
class="input"
|
||||
type="number"
|
||||
min="0"
|
||||
step="1"
|
||||
:placeholder="$props.data.clientMaxBodySize.default"
|
||||
<input
|
||||
v-model.number="clientMaxBodySize"
|
||||
class="input"
|
||||
type="number"
|
||||
min="0"
|
||||
step="1"
|
||||
:placeholder="$props.data.clientMaxBodySize.default"
|
||||
/>
|
||||
</div>
|
||||
<div class="control">
|
||||
@@ -124,9 +129,10 @@ THE SOFTWARE.
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<div :class="`control${typesHashMaxSizeChanged ? ' is-changed' : ''}`">
|
||||
<VueSelect v-model="typesHashMaxSize"
|
||||
:options="$props.data.typesHashMaxSize.options"
|
||||
:clearable="false"
|
||||
<VueSelect
|
||||
v-model="typesHashMaxSize"
|
||||
:options="$props.data.typesHashMaxSize.options"
|
||||
:clearable="false"
|
||||
></VueSelect>
|
||||
</div>
|
||||
</div>
|
||||
@@ -140,9 +146,10 @@ THE SOFTWARE.
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<div :class="`control${typesHashBucketSizeChanged ? ' is-changed' : ''}`">
|
||||
<VueSelect v-model="typesHashBucketSize"
|
||||
:options="$props.data.typesHashBucketSize.options"
|
||||
:clearable="false"
|
||||
<VueSelect
|
||||
v-model="typesHashBucketSize"
|
||||
:options="$props.data.typesHashBucketSize.options"
|
||||
:clearable="false"
|
||||
></VueSelect>
|
||||
</div>
|
||||
</div>
|
||||
|
@@ -1,5 +1,5 @@
|
||||
<!--
|
||||
Copyright 2020 DigitalOcean
|
||||
Copyright 2022 DigitalOcean
|
||||
|
||||
This code is licensed under the MIT License.
|
||||
You may obtain a copy of the License at
|
||||
@@ -82,10 +82,11 @@ THE SOFTWARE.
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<div :class="`control${assetsExpirationChanged ? ' is-changed' : ''}`">
|
||||
<input v-model="assetsExpiration"
|
||||
class="input"
|
||||
type="text"
|
||||
:placeholder="$props.data.assetsExpiration.default"
|
||||
<input
|
||||
v-model="assetsExpiration"
|
||||
class="input"
|
||||
type="text"
|
||||
:placeholder="$props.data.assetsExpiration.default"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
@@ -99,10 +100,11 @@ THE SOFTWARE.
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<div :class="`control${mediaExpirationChanged ? ' is-changed' : ''}`">
|
||||
<input v-model="mediaExpiration"
|
||||
class="input"
|
||||
type="text"
|
||||
:placeholder="$props.data.mediaExpiration.default"
|
||||
<input
|
||||
v-model="mediaExpiration"
|
||||
class="input"
|
||||
type="text"
|
||||
:placeholder="$props.data.mediaExpiration.default"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
@@ -116,10 +118,11 @@ THE SOFTWARE.
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<div :class="`control${svgExpirationChanged ? ' is-changed' : ''}`">
|
||||
<input v-model="svgExpiration"
|
||||
class="input"
|
||||
type="text"
|
||||
:placeholder="$props.data.svgExpiration.default"
|
||||
<input
|
||||
v-model="svgExpiration"
|
||||
class="input"
|
||||
type="text"
|
||||
:placeholder="$props.data.svgExpiration.default"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
@@ -133,10 +136,11 @@ THE SOFTWARE.
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<div :class="`control${fontsExpirationChanged ? ' is-changed' : ''}`">
|
||||
<input v-model="fontsExpiration"
|
||||
class="input"
|
||||
type="text"
|
||||
:placeholder="$props.data.fontsExpiration.default"
|
||||
<input
|
||||
v-model="fontsExpiration"
|
||||
class="input"
|
||||
type="text"
|
||||
:placeholder="$props.data.fontsExpiration.default"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
@@ -1,5 +1,5 @@
|
||||
<!--
|
||||
Copyright 2020 DigitalOcean
|
||||
Copyright 2022 DigitalOcean
|
||||
|
||||
This code is licensed under the MIT License.
|
||||
You may obtain a copy of the License at
|
||||
@@ -48,10 +48,11 @@ THE SOFTWARE.
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<div :class="`control${pythonServerChanged ? ' is-changed' : ''}`">
|
||||
<input v-model="pythonServer"
|
||||
class="input"
|
||||
type="text"
|
||||
:placeholder="$props.data.pythonServer.default"
|
||||
<input
|
||||
v-model="pythonServer"
|
||||
class="input"
|
||||
type="text"
|
||||
:placeholder="$props.data.pythonServer.default"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
@@ -1,5 +1,5 @@
|
||||
<!--
|
||||
Copyright 2021 DigitalOcean
|
||||
Copyright 2022 DigitalOcean
|
||||
|
||||
This code is licensed under the MIT License.
|
||||
You may obtain a copy of the License at
|
||||
@@ -49,12 +49,13 @@ THE SOFTWARE.
|
||||
<div class="field-body">
|
||||
<div class="field has-addons">
|
||||
<div :class="`control is-expanded${proxyConnectTimeoutChanged ? ' is-changed' : ''}`">
|
||||
<input v-model.number="proxyConnectTimeout"
|
||||
class="input"
|
||||
type="number"
|
||||
min="0"
|
||||
step="1"
|
||||
:placeholder="$props.data.proxyConnectTimeout.default"
|
||||
<input
|
||||
v-model.number="proxyConnectTimeout"
|
||||
class="input"
|
||||
type="number"
|
||||
min="0"
|
||||
step="1"
|
||||
:placeholder="$props.data.proxyConnectTimeout.default"
|
||||
/>
|
||||
</div>
|
||||
<div class="control">
|
||||
@@ -73,12 +74,13 @@ THE SOFTWARE.
|
||||
<div class="field-body">
|
||||
<div class="field has-addons">
|
||||
<div :class="`control is-expanded${proxySendTimeoutChanged ? ' is-changed' : ''}`">
|
||||
<input v-model.number="proxySendTimeout"
|
||||
class="input"
|
||||
type="number"
|
||||
min="0"
|
||||
step="1"
|
||||
:placeholder="$props.data.proxySendTimeout.default"
|
||||
<input
|
||||
v-model.number="proxySendTimeout"
|
||||
class="input"
|
||||
type="number"
|
||||
min="0"
|
||||
step="1"
|
||||
:placeholder="$props.data.proxySendTimeout.default"
|
||||
/>
|
||||
</div>
|
||||
<div class="control">
|
||||
@@ -97,12 +99,13 @@ THE SOFTWARE.
|
||||
<div class="field-body">
|
||||
<div class="field has-addons">
|
||||
<div :class="`control is-expanded${proxyReadTimeoutChanged ? ' is-changed' : ''}`">
|
||||
<input v-model.number="proxyReadTimeout"
|
||||
class="input"
|
||||
type="number"
|
||||
min="0"
|
||||
step="1"
|
||||
:placeholder="$props.data.proxyReadTimeout.default"
|
||||
<input
|
||||
v-model.number="proxyReadTimeout"
|
||||
class="input"
|
||||
type="number"
|
||||
min="0"
|
||||
step="1"
|
||||
:placeholder="$props.data.proxyReadTimeout.default"
|
||||
/>
|
||||
</div>
|
||||
<div class="control">
|
||||
@@ -121,8 +124,9 @@ THE SOFTWARE.
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<div class="field">
|
||||
<div v-for="(name, value) in $props.data.proxyCoexistenceXForwarded.options"
|
||||
:class="`control${proxyCoexistenceXForwardedChanged && value === proxyCoexistenceXForwarded ? ' is-changed' : ''}`"
|
||||
<div
|
||||
v-for="(name, value) in $props.data.proxyCoexistenceXForwarded.options"
|
||||
:class="`control${proxyCoexistenceXForwardedChanged && value === proxyCoexistenceXForwarded ? ' is-changed' : ''}`"
|
||||
>
|
||||
<div class="radio">
|
||||
<PrettyRadio v-model="proxyCoexistenceXForwarded" :value="value" class="p-default p-round p-fill p-icon">
|
||||
|
@@ -1,5 +1,5 @@
|
||||
<!--
|
||||
Copyright 2021 DigitalOcean
|
||||
Copyright 2022 DigitalOcean
|
||||
|
||||
This code is licensed under the MIT License.
|
||||
You may obtain a copy of the License at
|
||||
@@ -33,9 +33,10 @@ THE SOFTWARE.
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<div :class="`control${referrerPolicyChanged ? ' is-changed' : ''}`">
|
||||
<VueSelect v-model="referrerPolicy"
|
||||
:options="$props.data.referrerPolicy.options"
|
||||
:clearable="false"
|
||||
<VueSelect
|
||||
v-model="referrerPolicy"
|
||||
:options="$props.data.referrerPolicy.options"
|
||||
:clearable="false"
|
||||
></VueSelect>
|
||||
</div>
|
||||
</div>
|
||||
@@ -49,16 +50,18 @@ THE SOFTWARE.
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<div :class="`control${contentSecurityPolicyChanged ? ' is-changed' : ''}`">
|
||||
<input v-model="contentSecurityPolicy"
|
||||
class="input"
|
||||
type="text"
|
||||
:placeholder="$props.data.contentSecurityPolicy.default"
|
||||
<input
|
||||
v-model="contentSecurityPolicy"
|
||||
class="input"
|
||||
type="text"
|
||||
:placeholder="$props.data.contentSecurityPolicy.default"
|
||||
/>
|
||||
</div>
|
||||
<div v-if="hasWordPress && !hasWordPressUnsafeEval" class="control">
|
||||
<label class="text message is-warning">
|
||||
<span class="message-body"
|
||||
v-html="$t('templates.globalSections.security.whenUsingWordPressUnsafeEvalIsOftenRequiredToAllowFunctionality')"
|
||||
<span
|
||||
class="message-body"
|
||||
v-html="$t('templates.globalSections.security.whenUsingWordPressUnsafeEvalIsOftenRequiredToAllowFunctionality')"
|
||||
></span>
|
||||
</label>
|
||||
</div>
|
||||
@@ -73,10 +76,11 @@ THE SOFTWARE.
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<div :class="`control${permissionsPolicyChanged ? ' is-changed' : ''}`">
|
||||
<input v-model="permissionsPolicy"
|
||||
class="input"
|
||||
type="text"
|
||||
:placeholder="$props.data.permissionsPolicy.default"
|
||||
<input
|
||||
v-model="permissionsPolicy"
|
||||
class="input"
|
||||
type="text"
|
||||
:placeholder="$props.data.permissionsPolicy.default"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
@@ -144,10 +148,11 @@ THE SOFTWARE.
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<div :class="`control${securityTxtChanged ? ' is-changed' : ''}`">
|
||||
<input v-model="securityTxtPath"
|
||||
class="input"
|
||||
type="text"
|
||||
:placeholder="$props.data.securityTxtPath.default"
|
||||
<input
|
||||
v-model="securityTxtPath"
|
||||
class="input"
|
||||
type="text"
|
||||
:placeholder="$props.data.securityTxtPath.default"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
@@ -1,5 +1,5 @@
|
||||
<!--
|
||||
Copyright 2021 DigitalOcean
|
||||
Copyright 2022 DigitalOcean
|
||||
|
||||
This code is licensed under the MIT License.
|
||||
You may obtain a copy of the License at
|
||||
@@ -70,11 +70,12 @@ THE SOFTWARE.
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<div class="control">
|
||||
<input v-model="shareLink"
|
||||
class="input"
|
||||
type="text"
|
||||
readonly="readonly"
|
||||
@click="select"
|
||||
<input
|
||||
v-model="shareLink"
|
||||
class="input"
|
||||
type="text"
|
||||
readonly="readonly"
|
||||
@click="select"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
Reference in New Issue
Block a user