diff --git a/app/Http/Middleware/SetDomainNameDb.php b/app/Http/Middleware/SetDomainNameDb.php index eea4928b3528..edc91ff0f26e 100644 --- a/app/Http/Middleware/SetDomainNameDb.php +++ b/app/Http/Middleware/SetDomainNameDb.php @@ -34,13 +34,46 @@ class SetDomainNameDb /* * Use the host name to set the active DB **/ - if ($request->getSchemeAndHttpHost() && config('ninja.db.multi_db_enabled') && ! MultiDB::findAndSetDbByDomain($request->getSchemeAndHttpHost())) { - if (request()->json) { - return response()->json($error, 403); - } else { - abort(404); + + if(!config('ninja.db.multi_db_enabled')) + return $next($request); + + + if (strpos($request->getHost(), 'invoicing.co') !== false) + { + $subdomain = array_first(explode('.', $request->getHost())); + + $query = [ + 'subdomain' => $subdomain, + 'portal_mode' => 'subdomain', + ]; + + if(!MultiDB::findAndSetDbByDomain($query)){ + if ($request->json) { + return response()->json($error, 403); + } else { + abort(400, 'Domain not found'); + } } + } + else { + + $query = [ + 'portal_domain' => $request->getHost(), + 'portal_mode' => 'domain', + ]; + + if(!MultiDB::findAndSetDbByDomain($query)){ + if ($request->json) { + return response()->json($error, 403); + } else { + abort(400, 'Domain not found'); + } + } + + } + return $next($request); } diff --git a/app/Jobs/Company/CompanyExport.php b/app/Jobs/Company/CompanyExport.php index 5a410a070c34..3383afddf9d3 100644 --- a/app/Jobs/Company/CompanyExport.php +++ b/app/Jobs/Company/CompanyExport.php @@ -431,7 +431,6 @@ class CompanyExport implements ShouldQueue private function zipAndSend() { - nlog("zipping"); $tempStream = fopen('php://memory', 'w+'); @@ -450,11 +449,8 @@ class CompanyExport implements ShouldQueue $zip->finish(); $path = 'backups/'; - - nlog($path.$file_name); Storage::disk(config('filesystems.default'))->put($path.$file_name, $tempStream); - // fclose($fp); fclose($tempStream); diff --git a/app/Jobs/Mail/NinjaMailerJob.php b/app/Jobs/Mail/NinjaMailerJob.php index ee42f619cc54..8278b7eecb25 100644 --- a/app/Jobs/Mail/NinjaMailerJob.php +++ b/app/Jobs/Mail/NinjaMailerJob.php @@ -57,6 +57,8 @@ class NinjaMailerJob implements ShouldQueue public $override; + public $company; + public function __construct(NinjaMailerObject $nmo, bool $override = false) { @@ -73,7 +75,8 @@ class NinjaMailerJob implements ShouldQueue /*Set the correct database*/ MultiDB::setDb($this->nmo->company->db); - $company = Company::where('company_key', $this->nmo->company->company_key)->first(); + /* Serializing models from other jobs wipes the primary key */ + $this->company = Company::where('company_key', $this->nmo->company->company_key)->first(); /* Set the email driver */ $this->setMailDriver(); @@ -89,7 +92,7 @@ class NinjaMailerJob implements ShouldQueue } else { - $this->nmo->mailable->replyTo($company->owner()->email, $company->owner()->present()->name()); + $this->nmo->mailable->replyTo($this->company->owner()->email, $this->company->owner()->present()->name()); } @@ -178,7 +181,15 @@ class NinjaMailerJob implements ShouldQueue nlog("Sending via {$user->name()}"); $google = (new Google())->init(); - $google->getClient()->setAccessToken(json_encode($user->oauth_user_token)); + + try{ + $google->getClient()->setAccessToken(json_encode($user->oauth_user_token)); + } + catch(\Exception $e) { + $this->logMailError('Gmail Token Invalid', $this->company->clients()->first()); + $this->nmo->settings->email_sending_method = 'default'; + return $this->setMailDriver(); + } if ($google->getClient()->isAccessTokenExpired()) { $google->refreshToken($user); diff --git a/app/Libraries/MultiDB.php b/app/Libraries/MultiDB.php index 59ddc7ec1e49..17210c89c20d 100644 --- a/app/Libraries/MultiDB.php +++ b/app/Libraries/MultiDB.php @@ -253,14 +253,14 @@ class MultiDB return false; } - public static function findAndSetDbByDomain($subdomain) :bool + public static function findAndSetDbByDomain($query_array) :bool { if (! config('ninja.db.multi_db_enabled')) - return (Company::whereSubdomain($subdomain)->exists() === true); + return (Company::where($query_array)->exists() === true); foreach (self::$dbs as $db) { - if ($company = Company::on($db)->whereSubdomain($subdomain)->first()) { + if ($company = Company::on($db)->where($query_array)->first()) { self::setDb($company->db); return true; } diff --git a/app/Mail/DownloadBackup.php b/app/Mail/DownloadBackup.php index 0dee339dda10..6f74ae419f55 100644 --- a/app/Mail/DownloadBackup.php +++ b/app/Mail/DownloadBackup.php @@ -30,14 +30,15 @@ class DownloadBackup extends Mailable $company = Company::where('company_key', $this->company->company_key)->first(); return $this->from(config('mail.from.address'), config('mail.from.name')) - ->subject(ctrans('texts.download_backup_subject')) + ->subject(ctrans('texts.download_backup_subject', ['company' => $company->present()->name()])) ->markdown( 'email.admin.download_files', [ 'url' => $this->file_path, 'logo' => $company->present()->logo, 'whitelabel' => $company->account->isPaid() ? true : false, - 'settings' => $company->settings + 'settings' => $company->settings, + 'greeting' => $company->present()->name(), ] ); } diff --git a/resources/lang/en/texts.php b/resources/lang/en/texts.php index 7f1174d56bf1..9147006f7b8f 100644 --- a/resources/lang/en/texts.php +++ b/resources/lang/en/texts.php @@ -4248,7 +4248,7 @@ $LANG = array( 'activity_104' => ':user restored recurring invoice :recurring_invoice', 'new_login_detected' => 'New login detected for your account.', 'new_login_description' => 'You recently logged in to your Invoice Ninja account from a new location or device:

IP: :ip
Time: :time
Email: :email', - 'download_backup_subject' => 'Your company backup is ready for download', + 'download_backup_subject' => ':company backup is ready for download', ); return $LANG; diff --git a/resources/views/email/admin/download_files.blade.php b/resources/views/email/admin/download_files.blade.php index f1ca9d417c62..a73eace603fb 100644 --- a/resources/views/email/admin/download_files.blade.php +++ b/resources/views/email/admin/download_files.blade.php @@ -7,15 +7,20 @@ @endslot -@slot('greeting') -@endslot +@if(isset($greeting)) +

{{ $greeting }}

+@endif + +

@lang('texts.download_timeframe') +

- +

@component('email.components.button', ['url' => $url]) @lang('texts.download') @endcomponent +

@slot('signature') InvoiceNinja (contact@invoiceninja.com) diff --git a/routes/client.php b/routes/client.php index f0602b260e30..759bd5580e84 100644 --- a/routes/client.php +++ b/routes/client.php @@ -26,8 +26,7 @@ Route::get('client/magic_link/{magic_link}', 'ClientPortal\ContactHashLoginContr Route::get('documents/{document_hash}', 'ClientPortal\DocumentController@publicDownload')->name('documents.public_download'); Route::get('error', 'ClientPortal\ContactHashLoginController@errorPage')->name('client.error'); -//todo implement domain DB -Route::group(['middleware' => ['auth:contact', 'locale', 'check_client_existence'], 'prefix' => 'client', 'as' => 'client.'], function () { +Route::group(['middleware' => ['auth:contact', 'locale', 'check_client_existence','domain_db'], 'prefix' => 'client', 'as' => 'client.'], function () { Route::get('dashboard', 'ClientPortal\DashboardController@index')->name('dashboard'); // name = (dashboard. index / create / show / update / destroy / edit Route::get('invoices', 'ClientPortal\InvoiceController@index')->name('invoices.index')->middleware('portal_enabled'); @@ -81,7 +80,7 @@ Route::group(['middleware' => ['auth:contact', 'locale', 'check_client_existence Route::get('logout', 'Auth\ContactLoginController@logout')->name('logout'); }); -Route::get('client/subscription/{subscription}/purchase/', 'ClientPortal\SubscriptionPurchaseController@index')->name('client.subscription.purchase'); +Route::get('client/subscription/{subscription}/purchase', 'ClientPortal\SubscriptionPurchaseController@index')->name('client.subscription.purchase')->middleware('domain_db'); Route::group(['middleware' => ['invite_db'], 'prefix' => 'client', 'as' => 'client.'], function () { /*Invitation catches*/