diff --git a/app/Http/Controllers/SettingsController.php b/app/Http/Controllers/SettingsController.php index b9026aaec..aa773d9ee 100755 --- a/app/Http/Controllers/SettingsController.php +++ b/app/Http/Controllers/SettingsController.php @@ -7,6 +7,11 @@ use App\Helpers\StorageHelper; use App\Http\Requests\ImageUploadRequest; use App\Http\Requests\SettingsSamlRequest; use App\Http\Requests\SetupUserRequest; +use App\Http\Requests\StoreLdapSettings; +use App\Http\Requests\StoreLocalizationSettings; +use App\Http\Requests\StoreNotificationSettings; +use App\Http\Requests\StoreLabelSettings; +use App\Http\Requests\StoreSecuritySettings; use App\Models\CustomField; use App\Models\Group; use App\Models\Setting; @@ -273,20 +278,6 @@ class SettingsController extends Controller return view('settings/index', compact('settings')); } - /** - * Return the admin settings page. - * - * @author [A. Gianotto] [] - * - * @since [v1.0] - */ - public function getEdit() : View - - { - $setting = Setting::getSettings(); - - return view('settings/general', compact('setting')); - } /** * Return a form to allow a super admin to update settings. @@ -486,7 +477,7 @@ class SettingsController extends Controller * * @since [v1.0] */ - public function postSecurity(Request $request) : RedirectResponse + public function postSecurity(StoreSecuritySettings $request) : RedirectResponse { $this->validate($request, [ 'pwd_secure_complexity' => 'array', @@ -556,7 +547,7 @@ class SettingsController extends Controller * * @since [v1.0] */ - public function postLocalization(Request $request) : RedirectResponse + public function postLocalization(StoreLocalizationSettings $request) : RedirectResponse { if (is_null($setting = Setting::getSettings())) { return redirect()->to('admin')->with('error', trans('admin/settings/message.update.error')); @@ -599,7 +590,7 @@ class SettingsController extends Controller * @author [A. Gianotto] [] * @since [v1.0] */ - public function postAlerts(Request $request) : RedirectResponse + public function postAlerts(StoreNotificationSettings $request) : RedirectResponse { if (is_null($setting = Setting::getSettings())) { return redirect()->to('admin')->with('error', trans('admin/settings/message.update.error')); @@ -780,7 +771,7 @@ class SettingsController extends Controller * @author [A. Gianotto] [] * @since [v4.0] */ - public function postLabels(Request $request) : RedirectResponse + public function postLabels(StoreLabelSettings $request) : RedirectResponse { if (is_null($setting = Setting::getSettings())) { return redirect()->to('admin')->with('error', trans('admin/settings/message.update.error')); @@ -859,26 +850,7 @@ class SettingsController extends Controller { $setting = Setting::getSettings(); $groups = Group::pluck('name', 'id'); - - - /** - * This validator is only temporary (famous last words.) - @snipe - */ - $messages = [ - 'ldap_username_field.not_in' => 'sAMAccountName (mixed case) will likely not work. You should use samaccountname (lowercase) instead. ', - 'ldap_auth_filter_query.not_in' => 'uid=samaccountname is probably not a valid auth filter. You probably want uid= ', - 'ldap_filter.regex' => 'This value should probably not be wrapped in parentheses.', - ]; - - $validator = Validator::make($setting->toArray(), [ - 'ldap_username_field' => 'not_in:sAMAccountName', - 'ldap_auth_filter_query' => 'not_in:uid=samaccountname|required_if:ldap_enabled,1', - 'ldap_filter' => 'nullable|regex:"^[^(]"|required_if:ldap_enabled,1', - ], $messages); - - - - return view('settings.ldap', compact('setting', 'groups'))->withErrors($validator); + return view('settings.ldap', compact('setting', 'groups')); } /** @@ -887,7 +859,7 @@ class SettingsController extends Controller * @author [A. Gianotto] [] * @since [v4.0] */ - public function postLdapSettings(Request $request) : RedirectResponse + public function postLdapSettings(StoreLdapSettings $request) : RedirectResponse { if (is_null($setting = Setting::getSettings())) { return redirect()->to('admin')->with('error', trans('admin/settings/message.update.error')); diff --git a/app/Http/Requests/StoreLabelSettings.php b/app/Http/Requests/StoreLabelSettings.php new file mode 100644 index 000000000..a203d2702 --- /dev/null +++ b/app/Http/Requests/StoreLabelSettings.php @@ -0,0 +1,41 @@ +|string> + */ + public function rules(): array + { + return [ + 'labels_per_page' => 'numeric', + 'labels_width' => 'numeric', + 'labels_height' => 'numeric', + 'labels_pmargin_left' => 'numeric|nullable', + 'labels_pmargin_right' => 'numeric|nullable', + 'labels_pmargin_top' => 'numeric|nullable', + 'labels_pmargin_bottom' => 'numeric|nullable', + 'labels_display_bgutter' => 'numeric|nullable', + 'labels_display_sgutter' => 'numeric|nullable', + 'labels_fontsize' => 'numeric|min:5', + 'labels_pagewidth' => 'numeric|nullable', + 'labels_pageheight' => 'numeric|nullable', + 'qr_text' => 'max:31|nullable', + ]; + } +} diff --git a/app/Http/Requests/StoreLdapSettings.php b/app/Http/Requests/StoreLdapSettings.php new file mode 100644 index 000000000..65668bb4e --- /dev/null +++ b/app/Http/Requests/StoreLdapSettings.php @@ -0,0 +1,39 @@ +|string> + */ + public function rules(): array + { + \Log::error('boop'); + return [ + 'ldap_username_field' => 'not_in:sAMAccountName|required_if:ldap_enabled,1', + 'ldap_auth_filter_query' => 'not_in:uid=samaccountname|required_if:ldap_enabled,1', + 'ldap_filter' => 'nullable|regex:"^[^(]"|required_if:ldap_enabled,1', + 'ldap_server' => 'nullable|required_if:ldap_enabled,1|starts_with:ldap://,ldaps://', + 'ldap_uname' => 'nullable|required_if:ldap_enabled,1', + 'ldap_pword' => 'nullable|required_if:ldap_enabled,1', + 'ldap_basedn' => 'nullable|required_if:ldap_enabled,1', + 'ldap_fname_field' => 'nullable|required_if:ldap_enabled,1', + 'custom_forgot_pass_url' => 'nullable|url', + ]; + } + +} diff --git a/app/Http/Requests/StoreLocalizationSettings.php b/app/Http/Requests/StoreLocalizationSettings.php new file mode 100644 index 000000000..4cea8826e --- /dev/null +++ b/app/Http/Requests/StoreLocalizationSettings.php @@ -0,0 +1,30 @@ +|string> + */ + public function rules(): array + { + return [ + 'default_currency' => 'required', + 'locale' => 'required', + ]; + } +} diff --git a/app/Http/Requests/StoreNotificationSettings.php b/app/Http/Requests/StoreNotificationSettings.php new file mode 100644 index 000000000..db7e8a0fe --- /dev/null +++ b/app/Http/Requests/StoreNotificationSettings.php @@ -0,0 +1,37 @@ +|string> + */ + public function rules(): array + { + return [ + 'alert_email' => 'email_array|nullable', + 'admin_cc_email' => 'email|nullable', + 'alert_threshold' => 'numeric|nullable|gt:0', + 'alert_interval' => 'numeric|nullable|gt:0', + 'audit_warning_days' => 'numeric|nullable|gt:0', + 'due_checkin_days' => 'numeric|nullable|gt:0', + 'audit_interval' => 'numeric|nullable|gt:0', + ]; + } + +} diff --git a/app/Http/Requests/StoreSecuritySettings.php b/app/Http/Requests/StoreSecuritySettings.php new file mode 100644 index 000000000..42a529aa5 --- /dev/null +++ b/app/Http/Requests/StoreSecuritySettings.php @@ -0,0 +1,35 @@ +|string> + */ + public function rules(): array + { + return [ + 'pwd_secure_min' => 'numeric|required|min:8', + 'custom_forgot_pass_url' => 'url|nullable', + 'privacy_policy_link' => 'nullable|url', + 'login_remote_user_enabled' => 'numeric|nullable', + 'login_common_disabled' => 'numeric|nullable', + 'login_remote_user_custom_logout_url' => 'string|nullable', + 'login_remote_user_header_name' => 'string|nullable', + ]; + } +} diff --git a/app/Models/Setting.php b/app/Models/Setting.php index d775be81c..6f585b95f 100755 --- a/app/Models/Setting.php +++ b/app/Models/Setting.php @@ -51,36 +51,7 @@ class Setting extends Model */ protected $rules = [ 'brand' => 'required|min:1|numeric', - 'qr_text' => 'max:31|nullable', - 'alert_email' => 'email_array|nullable', - 'admin_cc_email' => 'email|nullable', - 'default_currency' => 'required', - 'locale' => 'required', - 'labels_per_page' => 'numeric', - 'labels_width' => 'numeric', - 'labels_height' => 'numeric', - 'labels_pmargin_left' => 'numeric|nullable', - 'labels_pmargin_right' => 'numeric|nullable', - 'labels_pmargin_top' => 'numeric|nullable', - 'labels_pmargin_bottom' => 'numeric|nullable', - 'labels_display_bgutter' => 'numeric|nullable', - 'labels_display_sgutter' => 'numeric|nullable', - 'labels_fontsize' => 'numeric|min:5', - 'labels_pagewidth' => 'numeric|nullable', - 'labels_pageheight' => 'numeric|nullable', - 'login_remote_user_enabled' => 'numeric|nullable', - 'login_common_disabled' => 'numeric|nullable', - 'login_remote_user_custom_logout_url' => 'string|nullable', - 'login_remote_user_header_name' => 'string|nullable', 'thumbnail_max_h' => 'numeric|max:500|min:25', - 'pwd_secure_min' => 'numeric|required|min:8', - 'alert_threshold' => 'numeric|nullable', - 'alert_interval' => 'numeric|nullable', - 'audit_warning_days' => 'numeric|nullable', - 'due_checkin_days' => 'numeric|nullable', - 'audit_interval' => 'numeric|nullable', - 'custom_forgot_pass_url' => 'url|nullable', - 'privacy_policy_link' => 'nullable|url', 'google_client_id' => 'nullable|ends_with:apps.googleusercontent.com' ]; diff --git a/app/Providers/ValidationServiceProvider.php b/app/Providers/ValidationServiceProvider.php index 1f3abca8a..76ba1b629 100644 --- a/app/Providers/ValidationServiceProvider.php +++ b/app/Providers/ValidationServiceProvider.php @@ -31,6 +31,7 @@ class ValidationServiceProvider extends ServiceProvider Validator::extend('email_array', function ($attribute, $value, $parameters, $validator) { $value = str_replace(' ', '', $value); $array = explode(',', $value); + $email_to_validate = []; foreach ($array as $email) { //loop over values $email_to_validate['alert_email'][] = $email; @@ -38,7 +39,7 @@ class ValidationServiceProvider extends ServiceProvider $rules = ['alert_email.*'=>'email']; $messages = [ - 'alert_email.*'=>trans('validation.email_array'), + 'alert_email.*' => trans('validation.custom.email_array'), ]; $validator = Validator::make($email_to_validate, $rules, $messages); diff --git a/resources/lang/en-US/admin/settings/general.php b/resources/lang/en-US/admin/settings/general.php index 9a81886ae..d656391ed 100644 --- a/resources/lang/en-US/admin/settings/general.php +++ b/resources/lang/en-US/admin/settings/general.php @@ -385,5 +385,6 @@ return [ 'restore_default_avatar_help' => '', 'due_checkin_days' => 'Due For Checkin Warning', 'due_checkin_days_help' => 'How many days before the expected checkin of an asset should it be listed in the "Due for checkin" page?', + 'no_groups' => 'No groups have been created yet. Visit Admin Settings > Permission Groups to add one.', ]; diff --git a/resources/lang/en-US/validation.php b/resources/lang/en-US/validation.php index 634170791..7d7840eb4 100644 --- a/resources/lang/en-US/validation.php +++ b/resources/lang/en-US/validation.php @@ -173,6 +173,7 @@ return [ 'ulid' => 'The :attribute field must be a valid ULID.', 'uuid' => 'The :attribute field must be a valid UUID.', + /* |-------------------------------------------------------------------------- | Custom Validation Language Lines @@ -194,7 +195,7 @@ return [ 'custom_field_not_found_on_model' => 'This field seems to exist, but is not available on this Asset Model\'s fieldset.', // date_format validation with slightly less stupid messages. It duplicates a lot, but it gets the job done :( - // We use this because the default error message for date_format is reflects php Y-m-d, which non-PHP + // We use this because the default error message for date_format reflects php Y-m-d, which non-PHP // people won't know how to format. 'purchase_date.date_format' => 'The :attribute must be a valid date in YYYY-MM-DD format', 'last_audit_date.date_format' => 'The :attribute must be a valid date in YYYY-MM-DD hh:mm:ss format', @@ -206,6 +207,13 @@ return [ 'checkboxes' => ':attribute contains invalid options.', 'radio_buttons' => ':attribute is invalid.', 'invalid_value_in_field' => 'Invalid value included in this field', + + 'ldap_username_field' => [ + 'not_in' => 'sAMAccountName (mixed case) will likely not work. You should use samaccountname (lowercase) instead.' + ], + 'ldap_auth_filter_query' => ['not_in' => 'uid=samaccountname is probably not a valid auth filter. You probably want uid= '], + 'ldap_filter' => ['regex' => 'This value should probably not be wrapped in parentheses.'], + ], /* |-------------------------------------------------------------------------- diff --git a/resources/views/layouts/default.blade.php b/resources/views/layouts/default.blade.php index 163bcee28..81440136f 100644 --- a/resources/views/layouts/default.blade.php +++ b/resources/views/layouts/default.blade.php @@ -189,14 +189,14 @@ dir="{{ Helper::determineLanguageDirection() }}"> action="{{ route('findbytag/hardware') }}" method="get">
- - + +
- diff --git a/resources/views/settings/alerts.blade.php b/resources/views/settings/alerts.blade.php index edbf1be83..ddca5c815 100644 --- a/resources/views/settings/alerts.blade.php +++ b/resources/views/settings/alerts.blade.php @@ -21,9 +21,10 @@ - {{ Form::open(['method' => 'POST', 'files' => false, 'autocomplete' => 'off', 'class' => 'form-horizontal', 'role' => 'form' ]) }} +
+ - {{csrf_field()}} + {{ csrf_field() }}
@@ -68,12 +69,10 @@ {{ Form::label('alert_email', trans('admin/settings/general.alert_email')) }}
- {{ Form::text('alert_email', old('alert_email', $setting->alert_email), array('class' => 'form-control','placeholder' => 'admin@yourcompany.com')) }} + {!! $errors->first('alert_email', '
') !!} -

{{ trans('admin/settings/general.alert_email_help') }}

-
@@ -84,7 +83,7 @@ {{ Form::label('admin_cc_email', trans('admin/settings/general.admin_cc_email')) }}
- {{ Form::text('admin_cc_email', old('admin_cc_email', $setting->admin_cc_email), array('class' => 'form-control','placeholder' => 'admin@yourcompany.com')) }} + {!! $errors->first('admin_cc_email', '
') !!}

{{ trans('admin/settings/general.admin_cc_email_help') }}

@@ -122,7 +121,7 @@ {{ Form::label('audit_interval', trans('admin/settings/general.audit_interval')) }}
- {{ Form::text('audit_interval', old('audit_interval', $setting->audit_interval), array('class' => 'form-control','placeholder' => '12', 'maxlength'=>'3', 'style'=>'width: 60px;')) }} + {{ Form::text('audit_interval', old('audit_interval', $setting->audit_interval), array('class' => 'form-control','placeholder' => '12', 'maxlength'=>'3')) }} {{ trans('general.months') }}
@@ -137,7 +136,7 @@ {{ Form::label('audit_warning_days', trans('admin/settings/general.audit_warning_days')) }}
- {{ Form::text('audit_warning_days', old('audit_warning_days', $setting->audit_warning_days), array('class' => 'form-control','placeholder' => '14', 'maxlength'=>'3', 'style'=>'width: 60px;')) }} + {{ Form::text('audit_warning_days', old('audit_warning_days', $setting->audit_warning_days), array('class' => 'form-control','placeholder' => '14', 'maxlength'=>'3')) }} {{ trans('general.days') }}
@@ -152,12 +151,8 @@ {{ Form::label('due_checkin_days', trans('admin/settings/general.due_checkin_days')) }}
- {{ Form::text('due_checkin_days', old('due_checkin_days', $setting->due_checkin_days), array('class' => 'form-control','placeholder' => '14', 'maxlength'=>'3', 'style'=>'width: 60px;')) }} + {{ Form::text('due_checkin_days', old('due_checkin_days', $setting->due_checkin_days), array('class' => 'form-control','placeholder' => '14', 'maxlength'=>'3')) }} {{ trans('general.days') }} - - - -
{!! $errors->first('due_checkin_days', '') !!} diff --git a/resources/views/settings/general.blade.php b/resources/views/settings/general.blade.php index c800b26ac..17c0a8ec8 100644 --- a/resources/views/settings/general.blade.php +++ b/resources/views/settings/general.blade.php @@ -18,7 +18,7 @@ - {{ Form::open(['method' => 'POST', 'files' => false, 'autocomplete' => 'off', 'class' => 'form-horizontal', 'role' => 'form' ]) }} + {{csrf_field()}} diff --git a/resources/views/settings/ldap.blade.php b/resources/views/settings/ldap.blade.php index 0c9faf8c2..5b483f48a 100644 --- a/resources/views/settings/ldap.blade.php +++ b/resources/views/settings/ldap.blade.php @@ -2,7 +2,7 @@ {{-- Page title --}} @section('title') - Update LDAP/AD Settings + {{ trans('admin/settings/general.ldap_ad') }} @parent @stop @@ -42,8 +42,7 @@ @endif - - {{ Form::open(['method' => 'POST', 'files' => false, 'autocomplete' => 'off', 'class' => 'form-horizontal', 'role' => 'form']) }} + {{csrf_field()}} @@ -62,7 +61,7 @@

{{ trans('admin/settings/general.ldap_ad') }} -

+
@@ -76,11 +75,15 @@
+ @if (config('app.lock_passwords')===true) -

{{ trans('general.feature_disabled') }}

+

+ + {{ trans('general.feature_disabled') }} +

@endif
@@ -93,13 +96,21 @@
- {!! $errors->first('is_ad', '') !!} + @error('is_ad') + + + {{ $message }} + + @enderror @if (config('app.lock_passwords')===true) -

{{ trans('general.feature_disabled') }}

+

+ + {{ trans('general.feature_disabled') }} +

@endif
@@ -111,14 +122,23 @@

{{ trans('admin/settings/general.ldap_pw_sync_help') }}

- {!! $errors->first('ldap_pw_sync_help', '') !!} + @error('ldap_pw_sync') + + + {{ $message }} + + @enderror + @if (config('app.lock_passwords')===true) -

{{ trans('general.feature_disabled') }}

+

+ + {{ trans('general.feature_disabled') }} +

@endif
@@ -130,42 +150,43 @@ {{ Form::label('ad_domain', trans('admin/settings/general.ad_domain')) }}
- {{ Form::text('ad_domain', old('ad_domain', $setting->ad_domain), ['class' => 'form-control','placeholder' => trans('general.example') .'example.com', $setting->demoMode]) }} + {{ Form::text('ad_domain', old('ad_domain', $setting->ad_domain), ['class' => 'form-control','placeholder' => trans('general.example') .'example.com']) }}

{{ trans('admin/settings/general.ad_domain_help') }}

- {!! $errors->first('ad_domain', '') !!} + @error('ad_domain') + + + {{ $message }} + + @enderror + @if (config('app.lock_passwords')===true) -

{{ trans('general.feature_disabled') }}

+

+ + {{ trans('general.feature_disabled') }} +

@endif
- {{-- NOTICE - this was a feature for AdLdap2-based LDAP syncing, and is already handled in 'classic' LDAP, so we now hide the checkbox (but haven't deleted the field) -
-
- {{ Form::label('ad_append_domain', trans('admin/settings/general.ad_append_domain_label')) }} -
-
- {{ Form::checkbox('ad_append_domain', '1', old('ad_append_domain', $setting->ad_append_domain),['class' => 'minimal '. $setting->demoMode, $setting->demoMode]) }} - {{ trans('admin/settings/general.ad_append_domain') }} -

{{ trans('admin/settings/general.ad_append_domain_help') }}

- {!! $errors->first('ad_append_domain', ':message') !!} - @if (config('app.lock_passwords')===true) -

{{ trans('general.feature_disabled') }}

- @endif -
-
--}} -
{{ Form::label('ldap_client_tls_key', trans('admin/settings/general.ldap_client_tls_key')) }}
- {{ Form::textarea('ldap_client_tls_key', old('ldap_client_tls_key', $setting->ldap_client_tls_key), ['class' => 'form-control','placeholder' => trans('general.example') .'-----BEGIN RSA PRIVATE KEY-----'."\r\n1234567890\r\n-----END RSA PRIVATE KEY----- -", $setting->demoMode]) }} - {!! $errors->first('ldap_client_tls_key', '') !!} + {{ Form::textarea('ldap_client_tls_key', old('ldap_client_tls_key', $setting->ldap_client_tls_key), ['class' => 'form-control','placeholder' => trans('general.example') .'-----BEGIN RSA PRIVATE KEY-----'."\r\n1234567890\r\n-----END RSA PRIVATE KEY-----"]) }} + @error('ldap_client_tls_key') + + + {{ $message }} + + @enderror + @if (config('app.lock_passwords')===true) -

{{ trans('general.feature_disabled') }}

+

+ + {{ trans('general.feature_disabled') }} +

@endif
@@ -176,11 +197,20 @@ {{ Form::label('ldap_client_tls_cert', trans('admin/settings/general.ldap_client_tls_cert')) }}
- {{ Form::textarea('ldap_client_tls_cert', old('ldap_client_tls_cert', $setting->ldap_client_tls_cert), ['class' => 'form-control','placeholder' => trans('general.example') .'-----BEGIN CERTIFICATE-----'."\r\n1234567890\r\n-----END CERTIFICATE-----", $setting->demoMode]) }} + {{ Form::textarea('ldap_client_tls_cert', old('ldap_client_tls_cert', $setting->ldap_client_tls_cert), ['class' => 'form-control','placeholder' => trans('general.example') .'-----BEGIN CERTIFICATE-----'."\r\n1234567890\r\n-----END CERTIFICATE-----"]) }}

{{ trans('admin/settings/general.ldap_client_tls_cert_help') }}

- {!! $errors->first('ldap_client_tls_cert', '') !!} + @error('ldap_client_tls_cert') + + + {{ $message }} + + @enderror + @if (config('app.lock_passwords')===true) -

{{ trans('general.feature_disabled') }}

+

+ + {{ trans('general.feature_disabled') }} +

@endif
@@ -191,11 +221,21 @@ {{ Form::label('ldap_server', trans('admin/settings/general.ldap_server')) }}
- {{ Form::text('ldap_server', old('ldap_server', $setting->ldap_server), ['class' => 'form-control','placeholder' => trans('general.example') .'ldap://ldap.example.com', $setting->demoMode]) }} + {{ Form::text('ldap_server', old('ldap_server', $setting->ldap_server), ['class' => 'form-control','placeholder' => trans('general.example') .'ldap://ldap.example.com']) }} + @error('ldap_server') + + + {{ $message }} + + @enderror +

{{ trans('admin/settings/general.ldap_server_help') }}

- {!! $errors->first('ldap_server', '') !!} + @if (config('app.lock_passwords')===true) -

{{ trans('general.feature_disabled') }}

+

+ + {{ trans('general.feature_disabled') }} +

@endif
@@ -207,12 +247,21 @@
- {!! $errors->first('ldap_tls', '') !!} + @error('ldap_tls') + + + {{ $message }} + + @enderror + @if (config('app.lock_passwords')===true) -

{{ trans('general.feature_disabled') }}

+

+ + {{ trans('general.feature_disabled') }} +

@endif
@@ -224,13 +273,24 @@
- {!! $errors->first('ldap_server_cert_ignore', '') !!} -

{{ trans('admin/settings/general.ldap_server_cert_help') }}

+ @error('ldap_server_cert_ignore') + + + {{ $message }} + + @enderror + +

+ {{ trans('admin/settings/general.ldap_server_cert_help') }} +

@if (config('app.lock_passwords')===true) -

{{ trans('general.feature_disabled') }}

+

+ + {{ trans('general.feature_disabled') }} +

@endif
@@ -241,10 +301,19 @@ {{ Form::label('ldap_uname', trans('admin/settings/general.ldap_uname')) }}
- {{ Form::text('ldap_uname', old('ldap_uname', $setting->ldap_uname), ['class' => 'form-control','autocomplete' => 'off', 'placeholder' => trans('general.example') .'binduser@example.com', $setting->demoMode]) }} - {!! $errors->first('ldap_uname', '') !!} + {{ Form::text('ldap_uname', old('ldap_uname', $setting->ldap_uname), ['class' => 'form-control','autocomplete' => 'off', 'placeholder' => trans('general.example') .'binduser@example.com']) }} + @error('ldap_uname') + + + {{ $message }} + + @enderror + @if (config('app.lock_passwords')===true) -

{{ trans('general.feature_disabled') }}

+

+ + {{ trans('general.feature_disabled') }} +

@endif
@@ -255,10 +324,19 @@ {{ Form::label('ldap_pword', trans('admin/settings/general.ldap_pword')) }}
- {{ Form::password('ldap_pword', ['class' => 'form-control', 'autocomplete' => 'off', 'onfocus' => "this.removeAttribute('readonly');", $setting->demoMode, ' readonly']) }} - {!! $errors->first('ldap_pword', '') !!} + {{ Form::password('ldap_pword', ['class' => 'form-control', 'autocomplete' => 'off', 'onfocus' => "this.removeAttribute('readonly');", ' readonly']) }} + @error('ldap_pword') + + + {{ $message }} + + @enderror + @if (config('app.lock_passwords')===true) -

{{ trans('general.feature_disabled') }}

+

+ + {{ trans('general.feature_disabled') }} +

@endif
@@ -269,10 +347,19 @@ {{ Form::label('ldap_basedn', trans('admin/settings/general.ldap_basedn')) }}
- {{ Form::text('ldap_basedn', old('ldap_basedn', $setting->ldap_basedn), ['class' => 'form-control', 'placeholder' => trans('general.example') .'cn=users/authorized,dc=example,dc=com', $setting->demoMode]) }} - {!! $errors->first('ldap_basedn', '') !!} + {{ Form::text('ldap_basedn', old('ldap_basedn', $setting->ldap_basedn), ['class' => 'form-control', 'placeholder' => trans('general.example') .'cn=users/authorized,dc=example,dc=com']) }} + @error('ldap_basedn') + + + {{ $message }} + + @enderror + @if (config('app.lock_passwords')===true) -

{{ trans('general.feature_disabled') }}

+

+ + {{ trans('general.feature_disabled') }} +

@endif
@@ -283,10 +370,19 @@ {{ Form::label('ldap_filter', trans('admin/settings/general.ldap_filter')) }}
- {{ Form::text('ldap_filter', old('ldap_filter', $setting->ldap_filter), ['class' => 'form-control','placeholder' => trans('general.example') .'&(cn=*)', $setting->demoMode]) }} - {!! $errors->first('ldap_filter', '') !!} + + @error('ldap_filter') + + + {{ $message }} + + @enderror + @if (config('app.lock_passwords')===true) -

{{ trans('general.feature_disabled') }}

+

+ + {{ trans('general.feature_disabled') }} +

@endif
@@ -297,10 +393,19 @@ {{ Form::label('ldap_username_field', trans('admin/settings/general.ldap_username_field')) }}
- {{ Form::text('ldap_username_field', old('ldap_username_field', $setting->ldap_username_field), ['class' => 'form-control','placeholder' => trans('general.example') .'samaccountname', $setting->demoMode]) }} - {!! $errors->first('ldap_username_field', '') !!} + + @error('ldap_username_field') + + + {!! $message !!} + + @enderror + @if (config('app.lock_passwords')===true) -

{{ trans('general.feature_disabled') }}

+

+ + {{ trans('general.feature_disabled') }} +

@endif
@@ -311,10 +416,19 @@ {{ Form::label('ldap_lname_field', trans('admin/settings/general.ldap_lname_field')) }}
- {{ Form::text('ldap_lname_field', old('ldap_lname_field', $setting->ldap_lname_field), ['class' => 'form-control','placeholder' => trans('general.example') .'sn', $setting->demoMode]) }} - {!! $errors->first('ldap_lname_field', '') !!} + + @error('ldap_lname_field') + + + {{ $message }} + + @enderror + @if (config('app.lock_passwords')===true) -

{{ trans('general.feature_disabled') }}

+

+ + {{ trans('general.feature_disabled') }} +

@endif
@@ -325,10 +439,19 @@ {{ Form::label('ldap_fname_field', trans('admin/settings/general.ldap_fname_field')) }}
- {{ Form::text('ldap_fname_field', old('ldap_fname_field', $setting->ldap_fname_field), ['class' => 'form-control', 'placeholder' => trans('general.example') .'givenname', $setting->demoMode]) }} - {!! $errors->first('ldap_fname_field', '') !!} + + @error('ldap_fname_field') + + + {{ $message }} + + @enderror + @if (config('app.lock_passwords')===true) -

{{ trans('general.feature_disabled') }}

+

+ + {{ trans('general.feature_disabled') }} +

@endif
@@ -336,13 +459,23 @@
- {{ Form::label('ldap_auth_filter_query', trans('admin/settings/general.ldap_auth_filter_query')) }} +
- {{ Form::text('ldap_auth_filter_query', old('ldap_auth_filter_query', $setting->ldap_auth_filter_query), ['class' => 'form-control','placeholder' => trans('general.example') .'uid=', $setting->demoMode]) }} - {!! $errors->first('ldap_auth_filter_query', '') !!} + + + @error('ldap_auth_filter_query') + + + {!! $message !!} + + @enderror + @if (config('app.lock_passwords')===true) -

{{ trans('general.feature_disabled') }}

+

+ + {{ trans('general.feature_disabled') }} +

@endif
@@ -364,7 +497,6 @@ @endforeach - {{ trans('admin/users/general.group_memberships_helpblock') }} @else
@@ -383,7 +515,7 @@
@endif @else -

No groups have been created yet. Visit Admin Settings > Permission Groups to add one.

+

{!! trans('admin/settings/general.no_groups') !!}

@endif @@ -395,13 +527,21 @@ {{ Form::label('ldap_active_flag', trans('admin/settings/general.ldap_active_flag')) }}
- {{ Form::text('ldap_active_flag', old('ldap_active_flag', $setting->ldap_active_flag), ['class' => 'form-control', $setting->demoMode]) }} - +

{!! trans('admin/settings/general.ldap_activated_flag_help') !!}

- {!! $errors->first('ldap_active_flag', '') !!} + @error('ldap_active_flag') + + + {{ $message }} + + @enderror + @if (config('app.lock_passwords')===true) -

{{ trans('general.feature_disabled') }}

+

+ + {{ trans('general.feature_disabled') }} +

@endif
@@ -412,10 +552,19 @@ {{ Form::label('ldap_emp_num', trans('admin/settings/general.ldap_emp_num')) }}
- {{ Form::text('ldap_emp_num', old('ldap_emp_num', $setting->ldap_emp_num), ['class' => 'form-control','placeholder' => trans('general.example') .'employeenumber/employeeid', $setting->demoMode]) }} - {!! $errors->first('ldap_emp_num', '') !!} + {{ Form::text('ldap_emp_num', old('ldap_emp_num', $setting->ldap_emp_num), ['class' => 'form-control','placeholder' => trans('general.example') .'employeenumber/employeeid']) }} + @error('ldap_emp_num') + + + {{ $message }} + + @enderror + @if (config('app.lock_passwords')===true) -

{{ trans('general.feature_disabled') }}

+

+ + {{ trans('general.feature_disabled') }} +

@endif
@@ -425,10 +574,20 @@ {{ Form::label('ldap_dept', trans('admin/settings/general.ldap_dept')) }}
- {{ Form::text('ldap_dept', old('ldap_dept', $setting->ldap_dept), ['class' => 'form-control','placeholder' => trans('general.example') .'department', $setting->demoMode]) }} - {!! $errors->first('ldap_dept', '') !!} + {{ Form::text('ldap_dept', old('ldap_dept', $setting->ldap_dept), ['class' => 'form-control','placeholder' => trans('general.example') .'department']) }} + + @error('ldap_dept') + + + {{ $message }} + + @enderror + @if (config('app.lock_passwords')===true) -

{{ trans('general.feature_disabled') }}

+

+ + {{ trans('general.feature_disabled') }} +

@endif
@@ -438,10 +597,19 @@ {{ Form::label('ldap_dept', trans('admin/settings/general.ldap_manager')) }}
- {{ Form::text('ldap_manager', old('ldap_manager', $setting->ldap_manager), ['class' => 'form-control','placeholder' => trans('general.example') .'manager', $setting->demoMode]) }} - {!! $errors->first('ldap_manager', '') !!} + {{ Form::text('ldap_manager', old('ldap_manager', $setting->ldap_manager), ['class' => 'form-control','placeholder' => trans('general.example') .'manager']) }} + @error('ldap_manager') + + + {{ $message }} + + @enderror + @if (config('app.lock_passwords')===true) -

{{ trans('general.feature_disabled') }}

+

+ + {{ trans('general.feature_disabled') }} +

@endif
@@ -452,10 +620,19 @@ {{ Form::label('ldap_email', trans('admin/settings/general.ldap_email')) }}
- {{ Form::text('ldap_email', old('ldap_email', $setting->ldap_email), ['class' => 'form-control','placeholder' => trans('general.example') .'mail', $setting->demoMode]) }} - {!! $errors->first('ldap_email', '') !!} + {{ Form::text('ldap_email', old('ldap_email', $setting->ldap_email), ['class' => 'form-control','placeholder' => trans('general.example') .'mail']) }} + @error('ldap_email') + + + {{ $message }} + + @enderror + @if (config('app.lock_passwords')===true) -

{{ trans('general.feature_disabled') }}

+

+ + {{ trans('general.feature_disabled') }} +

@endif
@@ -466,10 +643,19 @@ {{ Form::label('ldap_phone', trans('admin/settings/general.ldap_phone')) }}
- {{ Form::text('ldap_phone', old('ldap_phone', $setting->ldap_phone_field), ['class' => 'form-control','placeholder' => trans('general.example') .'telephonenumber', $setting->demoMode]) }} - {!! $errors->first('ldap_phone', '') !!} + {{ Form::text('ldap_phone', old('ldap_phone', $setting->ldap_phone_field), ['class' => 'form-control','placeholder' => trans('general.example') .'telephonenumber']) }} + @error('ldap_phone') + + + {{ $message }} + + @enderror + @if (config('app.lock_passwords')===true) -

{{ trans('general.feature_disabled') }}

+

+ + {{ trans('general.feature_disabled') }} +

@endif
@@ -480,10 +666,19 @@ {{ Form::label('ldap_jobtitle', trans('admin/settings/general.ldap_jobtitle')) }}
- {{ Form::text('ldap_jobtitle', old('ldap_jobtitle', $setting->ldap_jobtitle), ['class' => 'form-control','placeholder' => trans('general.example') .'title', $setting->demoMode]) }} - {!! $errors->first('ldap_jobtitle', '') !!} + {{ Form::text('ldap_jobtitle', old('ldap_jobtitle', $setting->ldap_jobtitle), ['class' => 'form-control','placeholder' => trans('general.example') .'title']) }} + @error('ldap_jobtitle') + + + {{ $message }} + + @enderror + @if (config('app.lock_passwords')===true) -

{{ trans('general.feature_disabled') }}

+

+ + {{ trans('general.feature_disabled') }} +

@endif
@@ -494,10 +689,19 @@ {{ Form::label('ldap_country', trans('admin/settings/general.ldap_country')) }}
- {{ Form::text('ldap_country', old('ldap_country', $setting->ldap_country), ['class' => 'form-control','placeholder' => trans('general.example') .'c', $setting->demoMode]) }} - {!! $errors->first('ldap_country', '') !!} + {{ Form::text('ldap_country', old('ldap_country', $setting->ldap_country), ['class' => 'form-control','placeholder' => trans('general.example') .'c']) }} + @error('ldap_country') + + + {{ $message }} + + @enderror + @if (config('app.lock_passwords')===true) -

{{ trans('general.feature_disabled') }}

+

+ + {{ trans('general.feature_disabled') }} +

@endif
@@ -507,11 +711,20 @@ {{ Form::label('ldap_location', trans('admin/settings/general.ldap_location')) }}
- {{ Form::text('ldap_location', old('ldap_location', $setting->ldap_location), ['class' => 'form-control','placeholder' => trans('general.example') .'physicaldeliveryofficename', $setting->demoMode]) }} + {{ Form::text('ldap_location', old('ldap_location', $setting->ldap_location), ['class' => 'form-control','placeholder' => trans('general.example') .'physicaldeliveryofficename']) }}

{!! trans('admin/settings/general.ldap_location_help') !!}

- {!! $errors->first('ldap_location', '') !!} + @error('ldap_location') + + + {{ $message }} + + @enderror + @if (config('app.lock_passwords')===true) -

{{ trans('general.feature_disabled') }}

+

+ + {{ trans('general.feature_disabled') }} +

@endif
@@ -523,7 +736,7 @@ {{ Form::label('test_ldap_sync', 'Test LDAP Sync') }}

@@ -532,7 +745,10 @@

{{ trans('admin/settings/general.ldap_login_sync_help') }}

@if (config('app.lock_passwords')===true) -

{{ trans('general.feature_disabled') }}

+

+ + {{ trans('general.feature_disabled') }} +

@endif
@@ -578,11 +794,20 @@ {{ Form::label('custom_forgot_pass_url', trans('admin/settings/general.custom_forgot_pass_url')) }}
- {{ Form::text('custom_forgot_pass_url', old('custom_forgot_pass_url', $setting->custom_forgot_pass_url), ['class' => 'form-control','placeholder' => trans('general.example') .'https://my.ldapserver-forgotpass.com', $setting->demoMode]) }} + {{ Form::text('custom_forgot_pass_url', old('custom_forgot_pass_url', $setting->custom_forgot_pass_url), ['class' => 'form-control','placeholder' => trans('general.example') .'https://my.ldapserver-forgotpass.com']) }}

{{ trans('admin/settings/general.custom_forgot_pass_url_help') }}

- {!! $errors->first('custom_forgot_pass_url', '') !!} + @error('custom_forgot_pass_url') + + + {{ $message }} + + @enderror + @if (config('app.lock_passwords')===true) -

{{ trans('general.feature_disabled') }}

+

+ + {{ trans('general.feature_disabled') }} +

@endif
@@ -607,9 +832,10 @@ {{Form::close()}} -@stop +@endsection @push('js') + diff --git a/resources/views/settings/security.blade.php b/resources/views/settings/security.blade.php index 1b04f7d58..a51c86fcc 100644 --- a/resources/views/settings/security.blade.php +++ b/resources/views/settings/security.blade.php @@ -16,9 +16,10 @@ - {{ Form::open(['method' => 'POST', 'files' => false, 'autocomplete' => 'off', 'class' => 'form-horizontal', 'role' => 'form' ]) }} + + - {{csrf_field()}} + {{ csrf_field() }}
diff --git a/tests/Feature/Settings/AlertsSettingTest.php b/tests/Feature/Settings/AlertsSettingTest.php index 87e7c0286..d79bd1cf2 100644 --- a/tests/Feature/Settings/AlertsSettingTest.php +++ b/tests/Feature/Settings/AlertsSettingTest.php @@ -2,22 +2,28 @@ namespace Tests\Feature\Settings; -use App\Models\Asset; use Tests\TestCase; -use Illuminate\Http\UploadedFile; -use Illuminate\Support\Facades\Storage; use App\Models\User; -use App\Models\Setting; class AlertsSettingTest extends TestCase { public function testPermissionRequiredToViewAlertSettings() { - $asset = Asset::factory()->create(); $this->actingAs(User::factory()->create()) ->get(route('settings.alerts.index')) ->assertForbidden(); } + public function testAdminCCEmailArrayCanBeSaved() + { + $response = $this->actingAs(User::factory()->superuser()->create()) + ->post(route('settings.alerts.save', ['alert_email' => 'me@example.com,you@example.com'])) + ->assertStatus(302) + ->assertValid('alert_email') + ->assertRedirect(route('settings.index')) + ->assertSessionHasNoErrors(); + $this->followRedirects($response)->assertSee('alert-success'); + } + } diff --git a/tests/Feature/Settings/BrandingSettingsTest.php b/tests/Feature/Settings/BrandingSettingsTest.php index 03e2b013f..d751a1ab4 100644 --- a/tests/Feature/Settings/BrandingSettingsTest.php +++ b/tests/Feature/Settings/BrandingSettingsTest.php @@ -2,7 +2,6 @@ namespace Tests\Feature\Settings; -use App\Models\Asset; use Tests\TestCase; use Illuminate\Http\UploadedFile; use Illuminate\Support\Facades\Storage; diff --git a/tests/Feature/Settings/LabelSettingTest.php b/tests/Feature/Settings/LabelSettingTest.php new file mode 100644 index 000000000..e96c684a8 --- /dev/null +++ b/tests/Feature/Settings/LabelSettingTest.php @@ -0,0 +1,18 @@ +actingAs(User::factory()->create()) + ->get(route('settings.labels.index')) + ->assertForbidden(); + } + +} diff --git a/tests/Feature/Settings/LdapSettingsTest.php b/tests/Feature/Settings/LdapSettingsTest.php new file mode 100644 index 000000000..317ccb42d --- /dev/null +++ b/tests/Feature/Settings/LdapSettingsTest.php @@ -0,0 +1,62 @@ +actingAs(User::factory()->create()) + ->get(route('settings.ldap.index')) + ->assertForbidden(); + } + + public function testLdapSettingsCanBeSaved() + { + $response = $this->actingAs(User::factory()->superuser()->create()) + ->post(route('settings.ldap.save', [ + 'ldap_enabled' => 1, + 'ldap_username_field' => 'samaccountname', + 'ldap_filter' => 'uid=', + 'ldap_auth_filter_query' => 'uid=', + 'ldap_uname' => 'SomeUserField', + 'ldap_pword' => 'MyAwesomePassword', + 'ldap_basedn' => 'uid=', + 'ldap_fname_field' => 'SomeFirstnameField', + 'ldap_server' => 'ldaps://ldap.example.com', + ])) + ->assertStatus(302) + ->assertValid('ldap_enabled') + ->assertRedirect(route('settings.ldap.index')) + ->assertSessionHasNoErrors(); + $this->followRedirects($response)->assertSee('alert-success'); + } + + public function testLdapSettingsAreValidatedCorrectly() + { + $response = $this->actingAs(User::factory()->superuser()->create()) + ->from(route('settings.ldap.index')) + ->post(route('settings.ldap.save', [ + 'ldap_enabled' => 1, + 'ldap_username_field' => 'sAMAccountName', + 'ldap_filter' => '(uid=)', + ])) + ->assertStatus(302) + ->assertRedirect(route('settings.ldap.index')) + ->assertSessionHasErrors([ + 'ldap_username_field', + 'ldap_auth_filter_query', + 'ldap_uname', + 'ldap_pword', + 'ldap_basedn', + 'ldap_fname_field', + 'ldap_server', + ]); + $this->followRedirects($response)->assertSee('alert-danger'); + } + +} diff --git a/tests/Feature/Settings/SecuritySettingTest.php b/tests/Feature/Settings/SecuritySettingTest.php new file mode 100644 index 000000000..6edeee673 --- /dev/null +++ b/tests/Feature/Settings/SecuritySettingTest.php @@ -0,0 +1,18 @@ +actingAs(User::factory()->create()) + ->get(route('settings.security.index')) + ->assertForbidden(); + } + +}