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*/