diff --git a/config/disposable-email-providers.php b/config/disposable-email-providers.php new file mode 100644 index 00000000..2c9fce72 --- /dev/null +++ b/config/disposable-email-providers.php @@ -0,0 +1,557 @@ + url('/')]) -{{ get_setting('app_title') ?? 'VueFileManager' }} +{{ get_settings('app_title') ?? 'VueFileManager' }} @endcomponent @endslot @@ -22,7 +22,7 @@ {{-- Footer --}} @slot('footer') @component('mail::footer') -© {{ date('Y') }} {{ get_setting('app_title') ?? 'VueFileManager' }}. @lang('All rights reserved.') +© {{ date('Y') }} {{ get_settings('app_title') ?? 'VueFileManager' }}. @lang('All rights reserved.') @endcomponent @endslot @endcomponent diff --git a/resources/views/vendor/mail/text/message.blade.php b/resources/views/vendor/mail/text/message.blade.php index c02aa5f6..07571b36 100644 --- a/resources/views/vendor/mail/text/message.blade.php +++ b/resources/views/vendor/mail/text/message.blade.php @@ -2,7 +2,7 @@ {{-- Header --}} @slot('header') @component('mail::header', ['url' => url('/')]) - {{ get_setting('app_title') }} + {{ get_settings('app_title') }} @endcomponent @endslot @@ -21,7 +21,7 @@ {{-- Footer --}} @slot('footer') @component('mail::footer') - © {{ date('Y') }} {{ get_setting('app_title') }}. @lang('All rights reserved.') + © {{ date('Y') }} {{ get_settings('app_title') }}. @lang('All rights reserved.') @endcomponent @endslot @endcomponent diff --git a/src/App/Providers/AppServiceProvider.php b/src/App/Providers/AppServiceProvider.php index 09d6e8dd..4754044a 100644 --- a/src/App/Providers/AppServiceProvider.php +++ b/src/App/Providers/AppServiceProvider.php @@ -22,7 +22,7 @@ class AppServiceProvider extends ServiceProvider public function boot() { try { - $app_locale = get_setting('language') ?? 'en'; + $app_locale = get_settings('language') ?? 'en'; } catch (\PDOException $exception) { $app_locale = 'en'; } diff --git a/src/App/Users/Actions/CheckStorageCapacityAction.php b/src/App/Users/Actions/CheckStorageCapacityAction.php index 9f9d9364..d45dccad 100644 --- a/src/App/Users/Actions/CheckStorageCapacityAction.php +++ b/src/App/Users/Actions/CheckStorageCapacityAction.php @@ -17,7 +17,7 @@ class CheckStorageCapacityAction $user_storage_used = user_storage_percentage($user_id, $file_size); // Check if user can upload - if (get_setting('storage_limitation') && $user_storage_used >= 100) { + if (get_settings('storage_limitation') && $user_storage_used >= 100) { // Delete file Storage::disk('local') ->delete("chunks/$temp_filename"); diff --git a/src/App/Users/Actions/CreateNewUserAction.php b/src/App/Users/Actions/CreateNewUserAction.php index 997a3145..58d41ad8 100644 --- a/src/App/Users/Actions/CreateNewUserAction.php +++ b/src/App/Users/Actions/CreateNewUserAction.php @@ -2,76 +2,63 @@ namespace App\Users\Actions; use App\Users\Models\User; -use Illuminate\Http\Request; -use Illuminate\Http\Response; -use Illuminate\Validation\Rule; +use App\Users\Requests\RegisterUserRequest; use App\Users\Models\UserSettings; -use Domain\Settings\Models\Setting; use App\Http\Controllers\Controller; use Illuminate\Auth\Events\Registered; -use Illuminate\Support\Facades\Validator; use Illuminate\Contracts\Auth\StatefulGuard; +use Illuminate\Contracts\Foundation\Application; +use Illuminate\Contracts\Routing\ResponseFactory; +use Illuminate\Http\Response; class CreateNewUserAction extends Controller { - use PasswordValidationRules; - public function __construct( protected StatefulGuard $guard - ) { - } + ) {} /** * Validate and create a new user. */ public function __invoke( - Request $request - ): Response { - $settings = Setting::whereIn('name', [ - 'storage_default', 'registration', - ]) - ->pluck('value', 'name'); + RegisterUserRequest $request + ): Application|ResponseFactory|Response + { + $settings = get_settings([ + 'storage_default', 'registration', 'user_verification' + ]); // Check if account registration is enabled if (! intval($settings['registration'])) { abort(401); } - Validator::make($request->all(), [ - 'name' => ['required', 'string', 'max:255'], - 'email' => [ - 'required', - 'string', - 'email', - 'max:255', - Rule::unique(User::class), - ], - 'password' => $this->passwordRules(), - ])->validate(); - + // Create user $user = User::create([ - 'email' => $request->email, - 'password' => bcrypt($request->password), + 'password' => bcrypt($request->input('password')), + 'email' => $request->input('email'), ]); + // Mark as verified if verification is disabled + if (! intval($settings['user_verification'])) { + $user->markEmailAsVerified(); + } + UserSettings::unguard(); $user ->settings() ->create([ - 'name' => $request->name, + 'name' => $request->input('name'), 'storage_capacity' => $settings['storage_default'], ]); - if (! get_setting('user_verification')) { - $user->markEmailAsVerified(); - } - UserSettings::reguard(); event(new Registered($user)); - if (! get_setting('user_verification')) { + // Log in if verification is disabled + if (! intval($settings['user_verification'])) { $this->guard->login($user); } diff --git a/src/App/Users/Models/User.php b/src/App/Users/Models/User.php index a352f3c8..ad5fc0a6 100644 --- a/src/App/Users/Models/User.php +++ b/src/App/Users/Models/User.php @@ -33,6 +33,7 @@ use Illuminate\Database\Eloquent\Relations\BelongsToMany; * @method static sortable(string[] $array) * @method static forceCreate(array $array) * @method static where(string $string, string $string1, string $toDateString) + * @method static create(array $array) */ class User extends Authenticatable implements MustVerifyEmail { @@ -91,7 +92,7 @@ class User extends Authenticatable implements MustVerifyEmail */ public function getStorageAttribute(): array { - $is_storage_limit = get_setting('storage_limitation') ?? 1; + $is_storage_limit = get_settings('storage_limitation') ?? 1; if (! $is_storage_limit) { return [ diff --git a/src/App/Users/Notifications/ResetPassword.php b/src/App/Users/Notifications/ResetPassword.php index 6e4ad3da..16a27f7f 100644 --- a/src/App/Users/Notifications/ResetPassword.php +++ b/src/App/Users/Notifications/ResetPassword.php @@ -41,7 +41,7 @@ class ResetPassword extends Notification public function toMail($notifiable) { $reset_url = url('/create-new-password?token=' . $this->token); - $app_name = get_setting('app_title') ?? 'VueFileManager'; + $app_name = get_settings('app_title') ?? 'VueFileManager'; return (new MailMessage) ->subject(__t('reset_password_subject') . $app_name) diff --git a/src/App/Users/Requests/RegisterUserRequest.php b/src/App/Users/Requests/RegisterUserRequest.php new file mode 100644 index 00000000..229a56f4 --- /dev/null +++ b/src/App/Users/Requests/RegisterUserRequest.php @@ -0,0 +1,36 @@ + ['required', 'string', 'email', 'max:255', 'unique:users,email', new EmailProvider], + 'name' => 'required|string|max:255', + 'password' => $this->passwordRules(), + ]; + } +} diff --git a/src/App/Users/Rules/EmailProvider.php b/src/App/Users/Rules/EmailProvider.php new file mode 100644 index 00000000..4ee2d08c --- /dev/null +++ b/src/App/Users/Rules/EmailProvider.php @@ -0,0 +1,27 @@ +format(); return [ - 'license' => get_setting('license'), + 'license' => get_settings('license'), 'app_version' => config('vuefilemanager.version'), 'total_users' => User::count(), 'total_used_space' => $storage_usage, diff --git a/src/Domain/Admin/Rules/DisabledMimetypes.php b/src/Domain/Admin/Rules/DisabledMimetypes.php index 65c545ec..59085572 100644 --- a/src/Domain/Admin/Rules/DisabledMimetypes.php +++ b/src/Domain/Admin/Rules/DisabledMimetypes.php @@ -13,7 +13,7 @@ class DisabledMimetypes implements Rule */ public function passes($attribute, $value): bool { - $mimetype_blacklist = explode(',', get_setting('mimetypes_blacklist')); + $mimetype_blacklist = explode(',', get_settings('mimetypes_blacklist')); $file_mimetype = explode('/', $value->getMimeType()); return ! array_intersect($file_mimetype, $mimetype_blacklist); diff --git a/src/Domain/Files/Actions/UploadFileAction.php b/src/Domain/Files/Actions/UploadFileAction.php index 4c45360a..f680a481 100644 --- a/src/Domain/Files/Actions/UploadFileAction.php +++ b/src/Domain/Files/Actions/UploadFileAction.php @@ -44,7 +44,7 @@ class UploadFileAction $file_size = File::size($file_path); // Size of limit - $limit = get_setting('upload_limit'); + $limit = get_settings('upload_limit'); // File size handling if ($limit && $file_size > format_bytes($limit)) { diff --git a/src/Domain/Homepage/Controllers/SendContactMessageController.php b/src/Domain/Homepage/Controllers/SendContactMessageController.php index 0d896b4a..93f5a39c 100644 --- a/src/Domain/Homepage/Controllers/SendContactMessageController.php +++ b/src/Domain/Homepage/Controllers/SendContactMessageController.php @@ -15,7 +15,7 @@ class SendContactMessageController extends Controller public function __invoke( SendContactMessageRequest $request ): Response { - $contactEmail = get_setting('contact_email'); + $contactEmail = get_settings('contact_email'); if ($contactEmail) { Mail::to($contactEmail) diff --git a/src/Domain/Localization/Actions/UpgradeLanguageTranslationsAction.php b/src/Domain/Localization/Actions/UpgradeLanguageTranslationsAction.php index faaa9001..ccd1d6b5 100644 --- a/src/Domain/Localization/Actions/UpgradeLanguageTranslationsAction.php +++ b/src/Domain/Localization/Actions/UpgradeLanguageTranslationsAction.php @@ -33,7 +33,7 @@ class UpgradeLanguageTranslationsAction ])->collapse(), ]; - $license = strtolower(get_setting('license')); + $license = strtolower(get_settings('license')); // Find new translations in default translations $newbies = $default_translations[$license] diff --git a/src/Domain/Localization/Controllers/LanguageController.php b/src/Domain/Localization/Controllers/LanguageController.php index 1c09b7a7..713a43be 100644 --- a/src/Domain/Localization/Controllers/LanguageController.php +++ b/src/Domain/Localization/Controllers/LanguageController.php @@ -89,7 +89,7 @@ class LanguageController extends Controller // If user try to delete language used as default, // then set en language as default - if ($language->locale === get_setting('language')) { + if ($language->locale === get_settings('language')) { Setting::whereName('language')->first() ->update(['value' => 'en']); } diff --git a/src/Domain/Localization/Models/Language.php b/src/Domain/Localization/Models/Language.php index 5b4ca398..8193328b 100644 --- a/src/Domain/Localization/Models/Language.php +++ b/src/Domain/Localization/Models/Language.php @@ -48,7 +48,7 @@ class Language extends Model $language->id = Str::uuid(); resolve(SeedDefaultLanguageTranslationsAction::class)( - license: get_setting('license') ?? 'extended', + license: get_settings('license') ?? 'extended', locale: $language->locale ); }); diff --git a/src/Domain/Localization/Resources/LanguageCollection.php b/src/Domain/Localization/Resources/LanguageCollection.php index 03d26082..ae927017 100644 --- a/src/Domain/Localization/Resources/LanguageCollection.php +++ b/src/Domain/Localization/Resources/LanguageCollection.php @@ -17,7 +17,7 @@ class LanguageCollection extends ResourceCollection public function toArray($request) { $current_language = Language::with('languageTranslations') - ->whereLocale(get_setting('language') ?? 'en') + ->whereLocale(get_settings('language') ?? 'en') ->first(); return [ diff --git a/src/Domain/Settings/Controllers/SetStripeController.php b/src/Domain/Settings/Controllers/SetStripeController.php index 77eb6e9a..4cfb73a2 100644 --- a/src/Domain/Settings/Controllers/SetStripeController.php +++ b/src/Domain/Settings/Controllers/SetStripeController.php @@ -18,7 +18,7 @@ class SetStripeController { // TODO: pridat validator do requestu // Check payment setup status - if (get_setting('payments_configured')) { + if (get_settings('payments_configured')) { abort(401, 'Gone'); } diff --git a/src/Domain/Settings/Models/Setting.php b/src/Domain/Settings/Models/Setting.php index 035e036b..46440a69 100644 --- a/src/Domain/Settings/Models/Setting.php +++ b/src/Domain/Settings/Models/Setting.php @@ -11,6 +11,7 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; * @method static where(string $string, mixed $get) * @method static whereIn(string $string, string[] $columns) * @method static create(string[] $array) + * @method static find(array|string $setting) * @property string value * @property string name */ diff --git a/src/Domain/SetupWizard/Controllers/CreateAdminAccountController.php b/src/Domain/SetupWizard/Controllers/CreateAdminAccountController.php index 64da1f4c..2da6fe48 100644 --- a/src/Domain/SetupWizard/Controllers/CreateAdminAccountController.php +++ b/src/Domain/SetupWizard/Controllers/CreateAdminAccountController.php @@ -48,7 +48,7 @@ class CreateAdminAccountController extends Controller $user ->settings() ->create([ - 'storage_capacity' => get_setting('storage_default') ?? 5, + 'storage_capacity' => get_settings('storage_default') ?? 5, 'avatar' => store_avatar($request, 'avatar'), 'name' => $request->input('name'), ]); diff --git a/src/Domain/SetupWizard/Controllers/StoreAppSettingsController.php b/src/Domain/SetupWizard/Controllers/StoreAppSettingsController.php index ea1e1fe4..627789a8 100644 --- a/src/Domain/SetupWizard/Controllers/StoreAppSettingsController.php +++ b/src/Domain/SetupWizard/Controllers/StoreAppSettingsController.php @@ -63,7 +63,7 @@ class StoreAppSettingsController extends Controller [ 'name' => 'storage_default', 'value' => $request->input('defaultStorage') ?? 5, - ], + ] ])->each(function ($col) { Setting::forceCreate([ 'name' => $col['name'], diff --git a/src/Domain/Sharing/Notifications/SharedSendViaEmail.php b/src/Domain/Sharing/Notifications/SharedSendViaEmail.php index 41dfb350..026c347b 100644 --- a/src/Domain/Sharing/Notifications/SharedSendViaEmail.php +++ b/src/Domain/Sharing/Notifications/SharedSendViaEmail.php @@ -45,7 +45,7 @@ class SharedSendViaEmail extends Notification ->greeting(__t('shared_link_email_greeting')) ->line(__t('shared_link_email_user', ['user' => $this->user->settings->name, 'email' => $this->user->email])) ->action(__t('shared_link_email_link'), url('/share', ['token' => $this->token])) - ->salutation(__t('shared_link_email_salutation', ['app_name' => get_setting('app_title') ?? 'VueFileManager'])); + ->salutation(__t('shared_link_email_salutation', ['app_name' => get_settings('app_title') ?? 'VueFileManager'])); } /** diff --git a/src/Domain/Subscriptions/Controllers/StripeWebhookController.php b/src/Domain/Subscriptions/Controllers/StripeWebhookController.php index b8d0d2eb..0e642e1e 100644 --- a/src/Domain/Subscriptions/Controllers/StripeWebhookController.php +++ b/src/Domain/Subscriptions/Controllers/StripeWebhookController.php @@ -34,7 +34,7 @@ class StripeWebhookController extends CashierController $user ->settings() ->update([ - 'storage_capacity' => get_setting('storage_default'), + 'storage_capacity' => get_settings('storage_default'), ]); return $this->successMethod(); diff --git a/src/Support/Middleware/ProtectSetupWizardRoutes.php b/src/Support/Middleware/ProtectSetupWizardRoutes.php index b01c82a6..3e64a3eb 100644 --- a/src/Support/Middleware/ProtectSetupWizardRoutes.php +++ b/src/Support/Middleware/ProtectSetupWizardRoutes.php @@ -19,7 +19,7 @@ class ProtectSetupWizardRoutes DB::getPdo(); // Get setup_wizard status - if (Schema::hasTable('settings') && get_setting('setup_wizard_success')) { + if (Schema::hasTable('settings') && get_settings('setup_wizard_success')) { return response('Gone', 410); } diff --git a/src/Support/helpers.php b/src/Support/helpers.php index b094ed3a..73ff1bee 100644 --- a/src/Support/helpers.php +++ b/src/Support/helpers.php @@ -33,15 +33,29 @@ if (! function_exists('obfuscate_email')) { } } -if (! function_exists('get_setting')) { +if (! function_exists('get_email_provider')) { /** - * Get single value from settings table - * - * @param $setting - * @return |null + * Get single or multiple values from settings table */ - function get_setting($setting) + function get_email_provider(string $email): string { + $provider = explode('@', $email); + + return end($provider); + } +} + +if (! function_exists('get_settings')) { + /** + * Get single or multiple values from settings table + */ + function get_settings(array|string $setting): Collection|string|null + { + if (is_array($setting)) { + return Setting::whereIn('name', $setting) + ->pluck('value', 'name'); + } + return Setting::find($setting)->value ?? null; } } @@ -68,7 +82,7 @@ if (! function_exists('get_setup_status')) { */ function get_setup_status() { - $setup_success = get_setting('setup_wizard_success'); + $setup_success = get_settings('setup_wizard_success'); return boolval($setup_success) ? 'setup-done' : 'setup-disclaimer'; } @@ -943,7 +957,7 @@ if (! function_exists('__t')) { // Get current locale $locale = cache()->rememberForever('language', function () { try { - return get_setting('language') ?? 'en'; + return get_settings('language') ?? 'en'; } catch (QueryException $e) { return 'en'; } diff --git a/tests/App/Users/SignFlowTest.php b/tests/App/Users/SignFlowTest.php index e41a116e..cc740b53 100644 --- a/tests/App/Users/SignFlowTest.php +++ b/tests/App/Users/SignFlowTest.php @@ -60,6 +60,47 @@ class SignFlowTest extends TestCase Notification::assertTimesSent(1, VerifyEmail::class); } + /** + * @test + */ + public function it_try_register_when_registration_is_disabled() + { + Setting::create([ + 'name' => 'registration', + 'value' => 0, + ]); + + $this->postJson('api/register', [ + 'email' => 'john@doe.com', + 'password' => 'SecretPassword', + 'password_confirmation' => 'SecretPassword', + 'name' => 'John Doe', + ])->assertStatus(401); + + $this->assertDatabaseMissing('users', [ + 'email' => 'john@doe.com', + 'email_verified_at' => null, + ]); + } + + /** + * @test + */ + public function it_try_register_from_disabled_email_provider() + { + $this->postJson('api/register', [ + 'email' => 'john@maildrop.cc', + 'password' => 'SecretPassword', + 'password_confirmation' => 'SecretPassword', + 'name' => 'John Doe', + ])->assertStatus(422); + + $this->assertDatabaseMissing('users', [ + 'email' => 'john@doe.com', + 'email_verified_at' => null, + ]); + } + /** * @test */ diff --git a/tests/Domain/Settings/SettingsTest.php b/tests/Domain/Settings/SettingsTest.php index efe9793f..83ab87ae 100644 --- a/tests/Domain/Settings/SettingsTest.php +++ b/tests/Domain/Settings/SettingsTest.php @@ -117,7 +117,7 @@ class SettingsTest extends TestCase ]); Storage::assertExists( - get_setting('app_logo') + get_settings('app_logo') ); } diff --git a/tests/Domain/SetupWizard/SetupWizardTest.php b/tests/Domain/SetupWizard/SetupWizardTest.php index 8d6b492d..811a52b1 100644 --- a/tests/Domain/SetupWizard/SetupWizardTest.php +++ b/tests/Domain/SetupWizard/SetupWizardTest.php @@ -194,7 +194,7 @@ class SetupWizardTest extends TestCase collect(['app_logo', 'app_logo_horizontal', 'app_favicon']) ->each(function ($file) { - $path = get_setting($file); + $path = get_settings($file); $this->assertNotNull($path);