mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2025-07-09 03:14:30 -04:00
validator for ExpenseMailbox property
This commit is contained in:
parent
dd9727a701
commit
36279be694
@ -11,10 +11,17 @@
|
||||
|
||||
namespace App\Helpers\Mail\Webhook;
|
||||
|
||||
use App\Models\Company;
|
||||
|
||||
interface BaseWebhookHandler
|
||||
{
|
||||
public function process()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
protected function matchCompany(string $email)
|
||||
{
|
||||
return Company::where("expense_mailbox", $email)->first();
|
||||
}
|
||||
}
|
||||
|
@ -11,12 +11,21 @@
|
||||
|
||||
namespace App\Helpers\Mail\Webhook\Postmark;
|
||||
|
||||
use App\Factory\ExpenseFactory;
|
||||
use App\Helpers\Mail\Webhook\BaseWebhookHandler;
|
||||
|
||||
interface PostmarkWebhookHandler extends BaseWebhookHandler
|
||||
{
|
||||
public function process()
|
||||
public function process($data)
|
||||
{
|
||||
|
||||
$email = '';
|
||||
|
||||
$company = $this->matchCompany($email);
|
||||
if (!$company)
|
||||
return false;
|
||||
|
||||
$expense = ExpenseFactory::create($company->id, $company->owner()->id);
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -13,6 +13,7 @@ namespace App\Http\Requests\Company;
|
||||
|
||||
use App\Http\Requests\Request;
|
||||
use App\Http\ValidationRules\Company\ValidCompanyQuantity;
|
||||
use App\Http\ValidationRules\Company\ValidExpenseMailbox;
|
||||
use App\Http\ValidationRules\Company\ValidSubdomain;
|
||||
use App\Http\ValidationRules\ValidSettingsRule;
|
||||
use App\Models\Company;
|
||||
@ -55,6 +56,8 @@ class StoreCompanyRequest extends Request
|
||||
}
|
||||
}
|
||||
|
||||
$rules['expense_mailbox'] = new ValidExpenseMailbox($this->company->key, $this->company->account->isPaid() && $this->company->account->plan == 'enterprise'); // @turbo124 check if this is right
|
||||
|
||||
return $rules;
|
||||
}
|
||||
|
||||
|
@ -13,6 +13,7 @@ namespace App\Http\Requests\Company;
|
||||
|
||||
use App\DataMapper\CompanySettings;
|
||||
use App\Http\Requests\Request;
|
||||
use App\Http\ValidationRules\Company\ValidExpenseMailbox;
|
||||
use App\Http\ValidationRules\Company\ValidSubdomain;
|
||||
use App\Http\ValidationRules\ValidSettingsRule;
|
||||
use App\Utils\Ninja;
|
||||
@ -67,6 +68,8 @@ class UpdateCompanyRequest extends Request
|
||||
$rules['subdomain'] = ['nullable', 'regex:/^[a-zA-Z0-9.-]+[a-zA-Z0-9]$/', new ValidSubdomain()];
|
||||
}
|
||||
|
||||
$rules['expense_mailbox'] = new ValidExpenseMailbox($this->company->key, $this->company->account->isPaid() && $this->company->account->plan == 'enterprise'); // @turbo124 check if this is right
|
||||
|
||||
return $rules;
|
||||
}
|
||||
|
||||
|
64
app/Http/ValidationRules/Company/ValidExpenseMailbox.php
Normal file
64
app/Http/ValidationRules/Company/ValidExpenseMailbox.php
Normal file
@ -0,0 +1,64 @@
|
||||
<?php
|
||||
/**
|
||||
* Invoice Ninja (https://invoiceninja.com).
|
||||
*
|
||||
* @link https://github.com/invoiceninja/invoiceninja source repository
|
||||
*
|
||||
* @copyright Copyright (c) 2023. Invoice Ninja LLC (https://invoiceninja.com)
|
||||
*
|
||||
* @license https://www.elastic.co/licensing/elastic-license
|
||||
*/
|
||||
|
||||
namespace App\Http\ValidationRules\Company;
|
||||
|
||||
use App\Libraries\MultiDB;
|
||||
use App\Utils\Ninja;
|
||||
use Illuminate\Contracts\Validation\Rule;
|
||||
|
||||
/**
|
||||
* Class ValidCompanyQuantity.
|
||||
*/
|
||||
class ValidExpenseMailbox implements Rule
|
||||
{
|
||||
|
||||
private $validated_schema = false;
|
||||
private $company_key = false;
|
||||
private $isEnterprise = false;
|
||||
|
||||
public function __construct(string $company_key, bool $isEnterprise = false)
|
||||
{
|
||||
$this->company_key = $company_key;
|
||||
$this->isEnterprise = $isEnterprise;
|
||||
}
|
||||
|
||||
public function passes($attribute, $value)
|
||||
{
|
||||
if (empty($value)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// early return, if we dont have any additional validation
|
||||
if (!config('ninja.inbound_expense.webhook.mailbox_schema') && !(Ninja::isHosted() && config('ninja.inbound_expense.webhook.mailbox_schema_enterprise'))) {
|
||||
$this->validated_schema = true;
|
||||
return MultiDB::checkExpenseMailboxAvailable($value);
|
||||
}
|
||||
|
||||
// Validate Schema
|
||||
$validated = !config('ninja.inbound_expense.webhook.mailbox_schema') || (preg_match(config('ninja.inbound_expense.webhook.mailbox_schema'), $value) && (!config('ninja.inbound_expense.webhook.mailbox_schema_hascompanykey') || str_contains($value, $this->company_key))) ? true : false;
|
||||
$validated_enterprise = !config('ninja.inbound_expense.webhook.mailbox_schema_enterprise') || (Ninja::isHosted() && $this->isEnterprise && preg_match(config('ninja.inbound_expense.webhook.mailbox_schema_enterprise'), $value));
|
||||
|
||||
if (!$validated && !$validated_enterprise)
|
||||
return false;
|
||||
|
||||
$this->validated_schema = true;
|
||||
return MultiDB::checkExpenseMailboxAvailable($value);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function message()
|
||||
{
|
||||
return $this->validated_schema ? ctrans('texts.expense_mailbox_taken') : ctrans('texts.expense_mailbox_invalid');
|
||||
}
|
||||
}
|
@ -71,6 +71,8 @@ class MultiDB
|
||||
'socket',
|
||||
];
|
||||
|
||||
private static $protected_expense_mailboxes = [];
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
@ -105,6 +107,32 @@ class MultiDB
|
||||
return true;
|
||||
}
|
||||
|
||||
public static function checkExpenseMailboxAvailable($expense_mailbox): bool
|
||||
{
|
||||
|
||||
if (!config('ninja.db.multi_db_enabled')) {
|
||||
return Company::where("expense_mailbox", $expense_mailbox)->withTrashed()->exists();
|
||||
}
|
||||
|
||||
if (in_array($expense_mailbox, self::$protected_expense_mailboxes)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$current_db = config('database.default');
|
||||
|
||||
foreach (self::$dbs as $db) {
|
||||
if (Company::on($db)->where("expense_mailbox", $expense_mailbox)->withTrashed()->exists()) {
|
||||
self::setDb($current_db);
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
self::setDb($current_db);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public static function checkUserEmailExists($email): bool
|
||||
{
|
||||
if (!config('ninja.db.multi_db_enabled')) {
|
||||
|
@ -204,6 +204,7 @@ 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,
|
||||
'expense_mailbox' => $company->expense_mailbox,
|
||||
];
|
||||
}
|
||||
|
||||
|
@ -238,7 +238,9 @@ return [
|
||||
],
|
||||
'webhook' => [
|
||||
'mailbox_template' => env('INBOUND_EXPENSE_WEBHOOK_MAILBOXTEMPLATE', null),
|
||||
'mailbox_template_enterprise' => env('INBOUND_EXPENSE_WEBHOOK_MAILBOXTEMPLATE_ENTERPRISE', '{{input}}@expense.invoicing.co'),
|
||||
'mailbox_schema' => env('INBOUND_EXPENSE_WEBHOOK_MAILBOX_SCHEMA', null),
|
||||
'mailbox_schema_hascompanykey' => env('INBOUND_EXPENSE_WEBHOOK_MAILBOX_SCHEMA_HASCOMPANYKEY', false),
|
||||
'mailbox_schema_enterprise' => env('INBOUND_EXPENSE_WEBHOOK_MAILBOX_SCHEMA_ENTERPRISE', '.*@expense\.invoicing\.co$'),
|
||||
],
|
||||
],
|
||||
];
|
||||
|
@ -2534,6 +2534,8 @@ $lang = array(
|
||||
'local_storage_required' => 'Error: local storage is not available.',
|
||||
'your_password_reset_link' => 'Your Password Reset Link',
|
||||
'subdomain_taken' => 'The subdomain is already in use',
|
||||
'expense_mailbox_taken' => 'The mailbox is already in use',
|
||||
'expense_mailbox_invalid' => 'The mailbox does not match the required schema',
|
||||
'client_login' => 'Client Login',
|
||||
'converted_amount' => 'Converted Amount',
|
||||
'default' => 'Default',
|
||||
|
Loading…
x
Reference in New Issue
Block a user