mirror of
https://github.com/snipe/snipe-it.git
synced 2024-12-26 14:09:43 -08:00
e27065fe16
Signed-off-by: snipe <snipe@snipe.net> # Conflicts: # .all-contributorsrc # README.md # app/Console/Commands/ResetDemoSettings.php # app/Helpers/Helper.php # app/Http/Controllers/Api/AccessoriesController.php # app/Http/Controllers/Api/AssetsController.php # app/Http/Controllers/Api/CategoriesController.php # app/Http/Controllers/Api/ComponentsController.php # app/Http/Controllers/Api/ConsumablesController.php # app/Http/Controllers/Api/LocationsController.php # app/Http/Controllers/Api/StatuslabelsController.php # app/Http/Controllers/Api/SuppliersController.php # app/Http/Controllers/AssetMaintenancesController.php # app/Http/Controllers/Auth/ForgotPasswordController.php # app/Http/Controllers/DepreciationsController.php # app/Http/Controllers/ReportsController.php # app/Http/Controllers/SettingsController.php # app/Http/Requests/ImageUploadRequest.php # app/Http/Transformers/ActionlogsTransformer.php # app/Http/Transformers/DepreciationsTransformer.php # app/Listeners/CheckoutableListener.php # app/Models/Accessory.php # app/Models/Asset.php # app/Models/Company.php # app/Models/Ldap.php # app/Models/User.php # app/Presenters/AssetPresenter.php # app/Presenters/CategoryPresenter.php # composer.json # composer.lock # config/version.php # database/factories/AssetModelFactory.php # database/migrations/2020_10_22_233743_move_accessory_checkout_note_to_join_table.php # database/seeds/AssetModelSeeder.php # package-lock.json # public/css/build/AdminLTE.css # public/css/build/app.css # public/css/build/overrides.css # public/css/dist/all.css # public/css/dist/bootstrap-table.css # public/css/dist/skins/skin-black-dark.css # public/css/dist/skins/skin-black-dark.min.css # public/css/dist/skins/skin-black.css # public/css/dist/skins/skin-black.min.css # public/css/dist/skins/skin-blue-dark.css # public/css/dist/skins/skin-blue-dark.min.css # public/css/dist/skins/skin-blue.css # public/css/dist/skins/skin-blue.min.css # public/css/dist/skins/skin-contrast.css # public/css/dist/skins/skin-contrast.min.css # public/css/dist/skins/skin-green-dark.css # public/css/dist/skins/skin-green-dark.min.css # public/css/dist/skins/skin-green.css # public/css/dist/skins/skin-green.min.css # public/css/dist/skins/skin-orange-dark.css # public/css/dist/skins/skin-orange-dark.min.css # public/css/dist/skins/skin-orange.css # public/css/dist/skins/skin-orange.min.css # public/css/dist/skins/skin-purple-dark.css # public/css/dist/skins/skin-purple-dark.min.css # public/css/dist/skins/skin-purple.css # public/css/dist/skins/skin-purple.min.css # public/css/dist/skins/skin-red-dark.css # public/css/dist/skins/skin-red-dark.min.css # public/css/dist/skins/skin-red.css # public/css/dist/skins/skin-red.min.css # public/css/dist/skins/skin-yellow-dark.css # public/css/dist/skins/skin-yellow-dark.min.css # public/css/dist/skins/skin-yellow.css # public/css/dist/skins/skin-yellow.min.css # public/js/build/app.js # public/js/build/vendor.js # public/js/dist/all.js # public/js/dist/bootstrap-table.js # public/mix-manifest.json # resources/assets/js/vue.js # resources/lang/af/validation.php # resources/lang/ar/admin/settings/general.php # resources/lang/ar/validation.php # resources/lang/bg/admin/settings/general.php # resources/lang/bg/validation.php # resources/lang/cs/admin/settings/general.php # resources/lang/cs/validation.php # resources/lang/cy/help.php # resources/lang/cy/validation.php # resources/lang/da/admin/settings/general.php # resources/lang/da/validation.php # resources/lang/de/admin/settings/general.php # resources/lang/de/validation.php # resources/lang/el/validation.php # resources/lang/en-GB/admin/settings/general.php # resources/lang/en-GB/validation.php # resources/lang/en-ID/admin/hardware/table.php # resources/lang/en-ID/admin/settings/general.php # resources/lang/en-ID/validation.php # resources/lang/es-CO/admin/settings/general.php # resources/lang/es-CO/auth/message.php # resources/lang/es-CO/button.php # resources/lang/es-CO/help.php # resources/lang/es-CO/validation.php # resources/lang/es-ES/admin/settings/general.php # resources/lang/es-ES/auth/message.php # resources/lang/es-ES/button.php # resources/lang/es-ES/help.php # resources/lang/es-ES/validation.php # resources/lang/es-MX/admin/settings/general.php # resources/lang/es-MX/validation.php # resources/lang/es-VE/admin/settings/general.php # resources/lang/es-VE/auth/message.php # resources/lang/es-VE/button.php # resources/lang/es-VE/help.php # resources/lang/es-VE/validation.php # resources/lang/et/validation.php # resources/lang/fa/validation.php # resources/lang/fi/admin/settings/general.php # resources/lang/fi/validation.php # resources/lang/fil/validation.php # resources/lang/fr/admin/settings/general.php # resources/lang/fr/validation.php # resources/lang/ga-IE/validation.php # resources/lang/he/admin/settings/general.php # resources/lang/he/general.php # resources/lang/he/validation.php # resources/lang/hr/validation.php # resources/lang/hu/validation.php # resources/lang/id/validation.php # resources/lang/is/admin/categories/general.php # resources/lang/is/admin/companies/message.php # resources/lang/is/admin/companies/table.php # resources/lang/is/admin/components/general.php # resources/lang/is/admin/components/table.php # resources/lang/is/admin/consumables/table.php # resources/lang/is/admin/depreciations/general.php # resources/lang/is/admin/depreciations/message.php # resources/lang/is/admin/hardware/form.php # resources/lang/is/admin/hardware/general.php # resources/lang/is/admin/hardware/message.php # resources/lang/is/admin/hardware/table.php # resources/lang/is/admin/kits/general.php # resources/lang/is/admin/licenses/form.php # resources/lang/is/admin/licenses/general.php # resources/lang/is/admin/locations/table.php # resources/lang/is/admin/manufacturers/table.php # resources/lang/is/admin/reports/message.php # resources/lang/is/admin/settings/general.php # resources/lang/is/admin/settings/message.php # resources/lang/is/admin/statuslabels/message.php # resources/lang/is/admin/suppliers/message.php # resources/lang/is/admin/suppliers/table.php # resources/lang/is/admin/users/table.php # resources/lang/is/mail.php # resources/lang/is/validation.php # resources/lang/it/admin/settings/general.php # resources/lang/it/validation.php # resources/lang/iu/validation.php # resources/lang/ja/mail.php # resources/lang/ja/validation.php # resources/lang/ko/validation.php # resources/lang/lt/validation.php # resources/lang/lv/validation.php # resources/lang/mi/validation.php # resources/lang/mk/validation.php # resources/lang/ml-IN/validation.php # resources/lang/mn/validation.php # resources/lang/ms/validation.php # resources/lang/nl/admin/settings/general.php # resources/lang/nl/validation.php # resources/lang/no/validation.php # resources/lang/pl/admin/settings/general.php # resources/lang/pl/validation.php # resources/lang/pt-BR/admin/settings/general.php # resources/lang/pt-BR/mail.php # resources/lang/pt-BR/validation.php # resources/lang/pt-PT/validation.php # resources/lang/ro/validation.php # resources/lang/ru/validation.php # resources/lang/sl/validation.php # resources/lang/sr-CS/admin/settings/general.php # resources/lang/sr-CS/validation.php # resources/lang/sv-SE/admin/settings/general.php # resources/lang/sv-SE/auth/message.php # resources/lang/sv-SE/button.php # resources/lang/sv-SE/mail.php # resources/lang/sv-SE/validation.php # resources/lang/ta/validation.php # resources/lang/th/validation.php # resources/lang/tl/validation.php # resources/lang/tr/mail.php # resources/lang/tr/validation.php # resources/lang/uk/admin/accessories/table.php # resources/lang/uk/admin/asset_maintenances/message.php # resources/lang/uk/admin/asset_maintenances/table.php # resources/lang/uk/validation.php # resources/lang/ur-PK/validation.php # resources/lang/vi/admin/settings/general.php # resources/lang/vi/validation.php # resources/lang/zh-CN/admin/settings/general.php # resources/lang/zh-CN/validation.php # resources/lang/zh-HK/validation.php # resources/lang/zh-TW/validation.php # resources/lang/zu/validation.php # resources/views/partials/bootstrap-table.blade.php # resources/views/partials/forms/edit/company-select.blade.php # routes/api.php
401 lines
12 KiB
PHP
Executable file
401 lines
12 KiB
PHP
Executable file
<?php
|
||
|
||
namespace App\Models;
|
||
|
||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||
use Illuminate\Database\Eloquent\Model;
|
||
use Illuminate\Notifications\Notifiable;
|
||
use Illuminate\Support\Collection;
|
||
use Illuminate\Support\Facades\App;
|
||
use Illuminate\Support\Facades\Cache;
|
||
use Parsedown;
|
||
use Watson\Validating\ValidatingTrait;
|
||
|
||
/**
|
||
* Settings model.
|
||
*/
|
||
class Setting extends Model
|
||
{
|
||
use HasFactory;
|
||
use Notifiable, ValidatingTrait;
|
||
|
||
/**
|
||
* The app settings cache key name.
|
||
*
|
||
* @var string
|
||
*/
|
||
const APP_SETTINGS_KEY = 'snipeit_app_settings';
|
||
|
||
/**
|
||
* The setup check cache key name.
|
||
*
|
||
* @var string
|
||
*/
|
||
const SETUP_CHECK_KEY = 'snipeit_setup_check';
|
||
|
||
/**
|
||
* Whether the model should inject it's identifier to the unique
|
||
* validation rules before attempting validation. If this property
|
||
* is not set in the model it will default to true.
|
||
*
|
||
* @var bool
|
||
*/
|
||
protected $injectUniqueIdentifier = true;
|
||
|
||
/**
|
||
* Model rules.
|
||
*
|
||
* @var array
|
||
*/
|
||
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',
|
||
'slack_endpoint' => 'url|required_with:slack_channel|nullable',
|
||
'labels_per_page' => 'numeric',
|
||
'slack_channel' => 'regex:/^[\#\@]?\w+/|required_with:slack_endpoint|nullable',
|
||
'slack_botname' => 'string|nullable',
|
||
'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',
|
||
'audit_warning_days' => 'numeric|nullable',
|
||
'audit_interval' => 'numeric|nullable',
|
||
'custom_forgot_pass_url' => 'url|nullable',
|
||
'privacy_policy_link' => 'nullable|url',
|
||
];
|
||
|
||
protected $fillable = [
|
||
'site_name',
|
||
'email_domain',
|
||
'email_format',
|
||
'username_format',
|
||
];
|
||
|
||
/**
|
||
* Get the app settings.
|
||
* Cache is expired on Setting model saved in EventServiceProvider.
|
||
*
|
||
* @author Wes Hulette <jwhulette@gmail.com>
|
||
*
|
||
* @since 5.0.0
|
||
*
|
||
* @return \App\Models\Setting|null
|
||
*/
|
||
public static function getSettings(): ?self
|
||
{
|
||
return Cache::rememberForever(self::APP_SETTINGS_KEY, function () {
|
||
// Need for setup as no tables exist
|
||
try {
|
||
return self::first();
|
||
} catch (\Throwable $th) {
|
||
return null;
|
||
}
|
||
});
|
||
}
|
||
|
||
/**
|
||
* Check to see if setup process is complete.
|
||
* Cache is expired on Setting model saved in EventServiceProvider.
|
||
*
|
||
* @return bool
|
||
*/
|
||
public static function setupCompleted(): bool
|
||
{
|
||
try {
|
||
$usercount = User::withTrashed()->count();
|
||
$settingsCount = self::count();
|
||
|
||
return $usercount > 0 && $settingsCount > 0;
|
||
} catch (\Throwable $th) {
|
||
\Log::debug('User table and settings table DO NOT exist or DO NOT have records');
|
||
// Catch the error if the tables dont exit
|
||
return false;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Get the current Laravel version.
|
||
*
|
||
* @return string
|
||
*/
|
||
public function lar_ver(): string
|
||
{
|
||
$app = App::getFacadeApplication();
|
||
|
||
return $app::VERSION;
|
||
}
|
||
|
||
/**
|
||
* Get the default EULA text.
|
||
*
|
||
* @return string|null
|
||
*/
|
||
public static function getDefaultEula(): ?string
|
||
{
|
||
if (self::getSettings()->default_eula_text) {
|
||
$parsedown = new Parsedown();
|
||
|
||
return $parsedown->text(e(self::getSettings()->default_eula_text));
|
||
}
|
||
|
||
return null;
|
||
}
|
||
|
||
/**
|
||
* Check wether to show in model dropdowns.
|
||
*
|
||
* @param string $element
|
||
*
|
||
* @return bool
|
||
*/
|
||
public function modellistCheckedValue($element): bool
|
||
{
|
||
$settings = self::getSettings();
|
||
// If the value is blank for some reason
|
||
if ($settings->modellist_displays == '') {
|
||
return false;
|
||
}
|
||
|
||
$values = explode(',', $settings->modellist_displays);
|
||
|
||
foreach ($values as $value) {
|
||
if ($value == $element) {
|
||
return true;
|
||
}
|
||
}
|
||
|
||
return false;
|
||
}
|
||
|
||
/**
|
||
* Escapes the custom CSS, and then un-escapes the greater-than symbol
|
||
* so it can work with direct descendant characters for bootstrap
|
||
* menu overrides like:.
|
||
*
|
||
* .skin-blue .sidebar-menu>li.active>a, .skin-blue .sidebar-menu>li:hover>a
|
||
*
|
||
* Important: Do not remove the e() escaping here, as we output raw in the blade.
|
||
*
|
||
* @return string escaped CSS
|
||
*
|
||
* @author A. Gianotto <snipe@snipe.net>
|
||
*/
|
||
public function show_custom_css(): string
|
||
{
|
||
$custom_css = self::getSettings()->custom_css;
|
||
$custom_css = e($custom_css);
|
||
// Needed for modifying the bootstrap nav :(
|
||
$custom_css = str_ireplace('script', 'SCRIPTS-NOT-ALLOWED-HERE', $custom_css);
|
||
$custom_css = str_replace('>', '>', $custom_css);
|
||
// Allow String output (needs quotes)
|
||
$custom_css = str_replace('"', '"', $custom_css);
|
||
|
||
return $custom_css;
|
||
}
|
||
|
||
/**
|
||
* Converts bytes into human readable file size.
|
||
*
|
||
* @param string $bytes
|
||
*
|
||
* @return string human readable file size (2,87 Мб)
|
||
*
|
||
* @author Mogilev Arseny
|
||
*/
|
||
public static function fileSizeConvert($bytes): string
|
||
{
|
||
$bytes = floatval($bytes);
|
||
$arBytes = [
|
||
0 => [
|
||
'UNIT' => 'TB',
|
||
'VALUE' => pow(1024, 4),
|
||
],
|
||
1 => [
|
||
'UNIT' => 'GB',
|
||
'VALUE' => pow(1024, 3),
|
||
],
|
||
2 => [
|
||
'UNIT' => 'MB',
|
||
'VALUE' => pow(1024, 2),
|
||
],
|
||
3 => [
|
||
'UNIT' => 'KB',
|
||
'VALUE' => 1024,
|
||
],
|
||
4 => [
|
||
'UNIT' => 'B',
|
||
'VALUE' => 1,
|
||
],
|
||
];
|
||
|
||
foreach ($arBytes as $arItem) {
|
||
if ($bytes >= $arItem['VALUE']) {
|
||
$result = $bytes / $arItem['VALUE'];
|
||
$result = round($result, 2).$arItem['UNIT'];
|
||
break;
|
||
}
|
||
}
|
||
|
||
return $result;
|
||
}
|
||
|
||
/**
|
||
* The url for slack notifications.
|
||
* Used by Notifiable trait.
|
||
*
|
||
* @return string
|
||
*/
|
||
public function routeNotificationForSlack(): string
|
||
{
|
||
// At this point the endpoint is the same for everything.
|
||
// In the future this may want to be adapted for individual notifications.
|
||
return self::getSettings()->slack_endpoint;
|
||
}
|
||
|
||
/**
|
||
* Get the mail reply to address from configuration.
|
||
*
|
||
* @return string
|
||
*/
|
||
public function routeNotificationForMail(): string
|
||
{
|
||
// At this point the endpoint is the same for everything.
|
||
// In the future this may want to be adapted for individual notifications.
|
||
return config('mail.reply_to.address');
|
||
}
|
||
|
||
/**
|
||
* Get the password complexity rule.
|
||
*
|
||
* @return string
|
||
*/
|
||
public static function passwordComplexityRulesSaving($action = 'update'): string
|
||
{
|
||
$security_rules = '';
|
||
$settings = self::getSettings();
|
||
|
||
// Check if they have uncommon password enforcement selected in settings
|
||
if ($settings->pwd_secure_uncommon == 1) {
|
||
$security_rules .= '|dumbpwd';
|
||
}
|
||
|
||
// Check for any secure password complexity rules that may have been selected
|
||
if ($settings->pwd_secure_complexity != '') {
|
||
$security_rules .= '|'.$settings->pwd_secure_complexity;
|
||
}
|
||
|
||
if ($action == 'update') {
|
||
return 'nullable|min:'.$settings->pwd_secure_min.$security_rules;
|
||
}
|
||
|
||
return 'required|min:'.$settings->pwd_secure_min.$security_rules;
|
||
}
|
||
|
||
/**
|
||
* Get the specific LDAP settings
|
||
*
|
||
* @author Wes Hulette <jwhulette@gmail.com>
|
||
*
|
||
* @since 5.0.0
|
||
*
|
||
* @return Collection
|
||
*/
|
||
public static function getLdapSettings(): Collection
|
||
{
|
||
$ldapSettings = self::select([
|
||
'ldap_enabled',
|
||
'ldap_server',
|
||
'ldap_uname',
|
||
'ldap_pword',
|
||
'ldap_basedn',
|
||
'ldap_filter',
|
||
'ldap_username_field',
|
||
'ldap_lname_field',
|
||
'ldap_fname_field',
|
||
'ldap_auth_filter_query',
|
||
'ldap_version',
|
||
'ldap_active_flag',
|
||
'ldap_emp_num',
|
||
'ldap_email',
|
||
'ldap_server_cert_ignore',
|
||
'ldap_port',
|
||
'ldap_tls',
|
||
'ldap_pw_sync',
|
||
'is_ad',
|
||
'ad_domain',
|
||
'ad_append_domain',
|
||
'ldap_client_tls_key',
|
||
'ldap_client_tls_cert'
|
||
])->first()->getAttributes();
|
||
|
||
return collect($ldapSettings);
|
||
}
|
||
|
||
/**
|
||
* Return the filename for the client-side SSL cert
|
||
*
|
||
* @var string
|
||
*/
|
||
public static function get_client_side_cert_path()
|
||
{
|
||
return storage_path().'/ldap_client_tls.cert';
|
||
}
|
||
|
||
/**
|
||
* Return the filename for the client-side SSL key
|
||
*
|
||
* @var string
|
||
*/
|
||
public static function get_client_side_key_path()
|
||
{
|
||
return storage_path().'/ldap_client_tls.key';
|
||
}
|
||
|
||
public function update_client_side_cert_files()
|
||
{
|
||
/**
|
||
* I'm not sure if it makes sense to have a cert but no key
|
||
* nor vice versa, but for now I'm just leaving it like this.
|
||
*
|
||
* Also, we could easily set this up with an event handler and
|
||
* self::saved() or something like that but there's literally only
|
||
* one place where we will do that, so I'll just explicitly call
|
||
* this method at that spot instead. It'll be easier to debug and understand.
|
||
*/
|
||
if ($this->ldap_client_tls_cert) {
|
||
file_put_contents(self::get_client_side_cert_path(), $this->ldap_client_tls_cert);
|
||
} else {
|
||
if (file_exists(self::get_client_side_cert_path())) {
|
||
unlink(self::get_client_side_cert_path());
|
||
}
|
||
}
|
||
|
||
if ($this->ldap_client_tls_key) {
|
||
file_put_contents(self::get_client_side_key_path(), $this->ldap_client_tls_key);
|
||
} else {
|
||
if (file_exists(self::get_client_side_key_path())) {
|
||
unlink(self::get_client_side_key_path());
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
}
|