diff --git a/app/Http/Requests/Company/StoreCompanyRequest.php b/app/Http/Requests/Company/StoreCompanyRequest.php index acab4c2a502e..c9aae8b611be 100644 --- a/app/Http/Requests/Company/StoreCompanyRequest.php +++ b/app/Http/Requests/Company/StoreCompanyRequest.php @@ -56,6 +56,12 @@ class StoreCompanyRequest extends Request } } + $rules['smtp_host'] = 'sometimes|string'; + $rules['smtp_port'] = 'sometimes|string'; + $rules['smtp_encryption'] = 'sometimes|string'; + $rules['smtp_local_domain'] = 'sometimes|string'; + // $rules['smtp_verify_peer'] = 'sometimes|in:true,false'; + return $rules; } @@ -67,11 +73,11 @@ class StoreCompanyRequest extends Request $input['name'] = 'Untitled Company'; } - if (array_key_exists('google_analytics_url', $input)) { + if (isset($input['google_analytics_url'])) { $input['google_analytics_key'] = $input['google_analytics_url']; } - if (array_key_exists('portal_domain', $input)) { + if (isset($input['portal_domain'])) { $input['portal_domain'] = rtrim(strtolower($input['portal_domain']), "/"); } @@ -79,6 +85,17 @@ class StoreCompanyRequest extends Request $input['subdomain'] = MultiDB::randomSubdomainGenerator(); } + if(isset($input['smtp_username']) && strlen(str_replace("*", "", $input['smtp_username'])) < 2) { + unset($input['smtp_username']); + } + + if(isset($input['smtp_password']) && strlen(str_replace("*", "", $input['smtp_password'])) < 2) { + unset($input['smtp_password']); + } + + if(isset($input['smtp_verify_peer']) && is_string($input['smtp_verify_peer'])) + $input['smtp_verify_peer'] == 'true' ? true : false; + $this->replace($input); } } diff --git a/app/Http/Requests/Company/UpdateCompanyRequest.php b/app/Http/Requests/Company/UpdateCompanyRequest.php index b5329ecb43e2..5b716aacf21c 100644 --- a/app/Http/Requests/Company/UpdateCompanyRequest.php +++ b/app/Http/Requests/Company/UpdateCompanyRequest.php @@ -57,8 +57,14 @@ class UpdateCompanyRequest extends Request $rules['matomo_id'] = 'nullable|integer'; $rules['e_invoice_certificate_passphrase'] = 'sometimes|nullable'; $rules['e_invoice_certificate'] = 'sometimes|nullable|file|mimes:p12,pfx,pem,cer,crt,der,txt,p7b,spc,bin'; - // $rules['client_registration_fields'] = 'array'; + $rules['smtp_host'] = 'sometimes|string'; + $rules['smtp_port'] = 'sometimes|string'; + $rules['smtp_encryption'] = 'sometimes|string'; + $rules['smtp_local_domain'] = 'sometimes|string'; + // $rules['smtp_verify_peer'] = 'sometimes|string'; + + if (isset($input['portal_mode']) && ($input['portal_mode'] == 'domain' || $input['portal_mode'] == 'iframe')) { $rules['portal_domain'] = 'bail|nullable|sometimes|url'; } @@ -74,23 +80,35 @@ class UpdateCompanyRequest extends Request { $input = $this->all(); - if (array_key_exists('portal_domain', $input) && strlen($input['portal_domain']) > 1) { + if (isset($input['portal_domain']) && strlen($input['portal_domain']) > 1) { $input['portal_domain'] = $this->addScheme($input['portal_domain']); $input['portal_domain'] = rtrim(strtolower($input['portal_domain']), "/"); } - if (array_key_exists('settings', $input)) { + if (isset($input['settings'])) { $input['settings'] = (array)$this->filterSaveableSettings($input['settings']); } - if(array_key_exists('subdomain', $input) && $this->company->subdomain == $input['subdomain']) { + if(isset($input['subdomain']) && $this->company->subdomain == $input['subdomain']) { unset($input['subdomain']); } - if(array_key_exists('e_invoice_certificate_passphrase', $input) && empty($input['e_invoice_certificate_passphrase'])) { + if(isset($input['e_invoice_certificate_passphrase']) && empty($input['e_invoice_certificate_passphrase'])) { unset($input['e_invoice_certificate_passphrase']); } + if(isset($input['smtp_username']) && strlen(str_replace("*","", $input['smtp_username'])) < 2) { + unset($input['smtp_username']); + } + + if(isset($input['smtp_password']) && strlen(str_replace("*", "", $input['smtp_password'])) < 2) { + unset($input['smtp_password']); + } + + if(isset($input['smtp_verify_peer']) && is_string($input['smtp_verify_peer'])) { + $input['smtp_verify_peer'] == 'true' ? true : false; + } + $this->replace($input); } diff --git a/app/Models/Company.php b/app/Models/Company.php index ea2e2915ae15..4e0ba74eea52 100644 --- a/app/Models/Company.php +++ b/app/Models/Company.php @@ -112,6 +112,13 @@ use Laracasts\Presenter\PresentableTrait; * @property int $notify_vendor_when_paid * @property int $invoice_task_hours * @property int $deleted_at + * @property string smtp_username + * @property string smtp_password + * @property string smtp_host + * @property string smtp_port + * @property string smtp_encryption + * @property string smtp_local_domain + * @property boolean smtp_verify_peer * @property-read \App\Models\Account $account * @property-read \Illuminate\Database\Eloquent\Collection $activities * @property-read int|null $activities_count @@ -352,12 +359,19 @@ class Company extends BaseModel 'calculate_taxes', 'tax_data', 'e_invoice_certificate_passphrase', + 'smtp_host', + 'smtp_port', + 'smtp_encryption', + 'smtp_local_domain', + 'smtp_verify_peer', ]; protected $hidden = [ 'id', 'db', 'ip', + 'smtp_username', + 'smtp_password', ]; protected $casts = [ @@ -372,6 +386,8 @@ class Company extends BaseModel 'tax_data' => 'object', 'origin_tax_data' => 'object', 'e_invoice_certificate_passphrase' => EncryptedCast::class, + 'smtp_username' => 'encrypted', + 'smtp_password' => 'encrypted', ]; protected $with = []; diff --git a/app/Repositories/CompanyRepository.php b/app/Repositories/CompanyRepository.php index da42bd02c97f..96babe4146b7 100644 --- a/app/Repositories/CompanyRepository.php +++ b/app/Repositories/CompanyRepository.php @@ -39,6 +39,7 @@ class CompanyRepository extends BaseRepository $company->fill($data); + // nlog($data); /** Only required to handle v4 migration workloads */ if(Ninja::isHosted() && $company->isDirty('is_disabled') && !$company->is_disabled) { Ninja::triggerForwarding($company->company_key, $company->owner()->email); @@ -48,6 +49,14 @@ class CompanyRepository extends BaseRepository $company->saveSettings($data['settings'], $company); } + if(isset($data['smtp_username'])) { + $company->smtp_username = $data['smtp_username']; + } + + if(isset($data['smtp_password'])) { + $company->smtp_password = $data['smtp_password']; + } + $company->save(); return $company; diff --git a/app/Transformers/CompanyTransformer.php b/app/Transformers/CompanyTransformer.php index a52cb317b094..e8941e1111a0 100644 --- a/app/Transformers/CompanyTransformer.php +++ b/app/Transformers/CompanyTransformer.php @@ -204,6 +204,13 @@ class CompanyTransformer extends EntityTransformer 'invoice_task_project_header' => (bool) $company->invoice_task_project_header, 'invoice_task_item_description' => (bool) $company->invoice_task_item_description, 'origin_tax_data' => $company->origin_tax_data ?: new \stdClass(), + 'smtp_host' => (string)$company->smtp_host ?? '', + 'smtp_port' => (string)$company->smtp_port ?? '', + 'smtp_encryption' => (string)$company->smtp_encryption ?? 'tls', + 'smtp_username' => $company->smtp_username ? '********' : '', + 'smtp_password' => $company->smtp_password ? '********' : '', + 'smtp_local_domain' => (string)$company->smtp_local_domain ?? '', + 'smtp_verify_peer' => (bool)$company->smtp_verify_peer, ]; } diff --git a/database/migrations/2024_02_16_011055_smtp_configuration.php b/database/migrations/2024_02_16_011055_smtp_configuration.php new file mode 100644 index 000000000000..38e7ea54e53b --- /dev/null +++ b/database/migrations/2024_02_16_011055_smtp_configuration.php @@ -0,0 +1,34 @@ +string('smtp_host')->nullable(); + $table->unsignedInteger('smtp_port')->nullable(); + $table->string('smtp_encryption')->nullable(); + $table->text('smtp_username')->nullable(); + $table->text('smtp_password')->nullable(); + $table->string('smtp_local_domain')->nullable(); + $table->boolean('smtp_verify_peer')->default(0); + }); + + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + // + } +}; diff --git a/tests/Feature/CompanyTest.php b/tests/Feature/CompanyTest.php index 91e412812951..a9c02ef83045 100644 --- a/tests/Feature/CompanyTest.php +++ b/tests/Feature/CompanyTest.php @@ -50,6 +50,15 @@ class CompanyTest extends TestCase $this->makeTestData(); } + public function testEnsureStrReplace() + { + $x = '**********'; + + $new_string = str_replace("*", "", $x); + + $this->assertEquals(0, strlen($new_string)); + } + public function testCompanyTaxInit() { TaxRate::query()->delete();