Allow more values for remote field when creating a database; closes #3842
This commit is contained in:
parent
b07fdc100c
commit
c751ce7f44
5 changed files with 22 additions and 10 deletions
|
@ -5,6 +5,7 @@ namespace Pterodactyl\Http\Requests\Api\Client\Servers\Databases;
|
||||||
use Webmozart\Assert\Assert;
|
use Webmozart\Assert\Assert;
|
||||||
use Pterodactyl\Models\Server;
|
use Pterodactyl\Models\Server;
|
||||||
use Illuminate\Validation\Rule;
|
use Illuminate\Validation\Rule;
|
||||||
|
use Pterodactyl\Models\Database;
|
||||||
use Pterodactyl\Models\Permission;
|
use Pterodactyl\Models\Permission;
|
||||||
use Illuminate\Database\Query\Builder;
|
use Illuminate\Database\Query\Builder;
|
||||||
use Pterodactyl\Contracts\Http\ClientPermissionsRequest;
|
use Pterodactyl\Contracts\Http\ClientPermissionsRequest;
|
||||||
|
@ -28,7 +29,7 @@ class StoreDatabaseRequest extends ClientApiRequest implements ClientPermissions
|
||||||
'database' => [
|
'database' => [
|
||||||
'required',
|
'required',
|
||||||
'alpha_dash',
|
'alpha_dash',
|
||||||
'min:1',
|
'min:3',
|
||||||
'max:48',
|
'max:48',
|
||||||
// Yes, I am aware that you could have the same database name across two unique hosts. However,
|
// Yes, I am aware that you could have the same database name across two unique hosts. However,
|
||||||
// I don't really care about that for this validation. We just want to make sure it is unique to
|
// I don't really care about that for this validation. We just want to make sure it is unique to
|
||||||
|
@ -38,7 +39,7 @@ class StoreDatabaseRequest extends ClientApiRequest implements ClientPermissions
|
||||||
->where('database', DatabaseManagementService::generateUniqueDatabaseName($this->input('database'), $server->id));
|
->where('database', DatabaseManagementService::generateUniqueDatabaseName($this->input('database'), $server->id));
|
||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
'remote' => 'required|string|regex:/^[0-9%.]{1,15}$/',
|
'remote' => Database::getRulesForField('remote'),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -67,7 +67,7 @@ class Database extends Model
|
||||||
'database' => 'required|string|alpha_dash|between:3,48',
|
'database' => 'required|string|alpha_dash|between:3,48',
|
||||||
'username' => 'string|alpha_dash|between:3,100',
|
'username' => 'string|alpha_dash|between:3,100',
|
||||||
'max_connections' => 'nullable|integer',
|
'max_connections' => 'nullable|integer',
|
||||||
'remote' => 'required|string|regex:/^[0-9%.]{1,15}$/',
|
'remote' => 'required|string|regex:/^[\w\-\/.%:]+$/',
|
||||||
'password' => 'string',
|
'password' => 'string',
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
namespace Pterodactyl\Models;
|
namespace Pterodactyl\Models;
|
||||||
|
|
||||||
use Illuminate\Support\Str;
|
use Illuminate\Support\Str;
|
||||||
|
use Illuminate\Support\Arr;
|
||||||
use Illuminate\Validation\Rule;
|
use Illuminate\Validation\Rule;
|
||||||
use Illuminate\Container\Container;
|
use Illuminate\Container\Container;
|
||||||
use Illuminate\Contracts\Validation\Factory;
|
use Illuminate\Contracts\Validation\Factory;
|
||||||
|
@ -111,6 +112,15 @@ abstract class Model extends IlluminateModel
|
||||||
return $rules;
|
return $rules;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the rules for a specific field. If the field is not found an empty
|
||||||
|
* array is returned.
|
||||||
|
*/
|
||||||
|
public static function getRulesForField(string $field): array
|
||||||
|
{
|
||||||
|
return Arr::get(static::getRules(), $field) ?? [];
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the rules associated with the model, specifically for updating the given model
|
* Returns the rules associated with the model, specifically for updating the given model
|
||||||
* rather than just creating it.
|
* rather than just creating it.
|
||||||
|
|
|
@ -21,10 +21,8 @@ const schema = object().shape({
|
||||||
.required('A database name must be provided.')
|
.required('A database name must be provided.')
|
||||||
.min(3, 'Database name must be at least 3 characters.')
|
.min(3, 'Database name must be at least 3 characters.')
|
||||||
.max(48, 'Database name must not exceed 48 characters.')
|
.max(48, 'Database name must not exceed 48 characters.')
|
||||||
.matches(/^[A-Za-z0-9_\-.]{3,48}$/, 'Database name should only contain alphanumeric characters, underscores, dashes, and/or periods.'),
|
.matches(/^[\w\-.]{3,48}$/, 'Database name should only contain alphanumeric characters, underscores, dashes, and/or periods.'),
|
||||||
connectionsFrom: string()
|
connectionsFrom: string().matches(/^[\w\-/.%:]+$/, 'A valid host address must be provided.'),
|
||||||
.required('A connection value must be provided.')
|
|
||||||
.matches(/^([0-9]{1,3}|%)(\.([0-9]{1,3}|%))?(\.([0-9]{1,3}|%))?(\.([0-9]{1,3}|%))?$/, 'A valid connection address must be provided.'),
|
|
||||||
});
|
});
|
||||||
|
|
||||||
export default () => {
|
export default () => {
|
||||||
|
@ -36,7 +34,10 @@ export default () => {
|
||||||
|
|
||||||
const submit = (values: Values, { setSubmitting }: FormikHelpers<Values>) => {
|
const submit = (values: Values, { setSubmitting }: FormikHelpers<Values>) => {
|
||||||
clearFlashes('database:create');
|
clearFlashes('database:create');
|
||||||
createServerDatabase(uuid, { ...values })
|
createServerDatabase(uuid, {
|
||||||
|
databaseName: values.databaseName,
|
||||||
|
connectionsFrom: values.connectionsFrom || '%',
|
||||||
|
})
|
||||||
.then(database => {
|
.then(database => {
|
||||||
appendDatabase(database);
|
appendDatabase(database);
|
||||||
setVisible(false);
|
setVisible(false);
|
||||||
|
@ -51,7 +52,7 @@ export default () => {
|
||||||
<>
|
<>
|
||||||
<Formik
|
<Formik
|
||||||
onSubmit={submit}
|
onSubmit={submit}
|
||||||
initialValues={{ databaseName: '', connectionsFrom: '%' }}
|
initialValues={{ databaseName: '', connectionsFrom: '' }}
|
||||||
validationSchema={schema}
|
validationSchema={schema}
|
||||||
>
|
>
|
||||||
{
|
{
|
||||||
|
@ -81,7 +82,7 @@ export default () => {
|
||||||
id={'connections_from'}
|
id={'connections_from'}
|
||||||
name={'connectionsFrom'}
|
name={'connectionsFrom'}
|
||||||
label={'Connections From'}
|
label={'Connections From'}
|
||||||
description={'Where connections should be allowed from. Use % for wildcards.'}
|
description={'Where connections should be allowed from. Leave blank to allow connections from anywhere.'}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div css={tw`flex flex-wrap justify-end mt-6`}>
|
<div css={tw`flex flex-wrap justify-end mt-6`}>
|
||||||
|
|
0
storage/clockwork/.gitignore
vendored
Normal file → Executable file
0
storage/clockwork/.gitignore
vendored
Normal file → Executable file
Loading…
Reference in a new issue