diff --git a/app/Console/Commands/SendRecurringInvoices.php b/app/Console/Commands/SendRecurringInvoices.php index 96b8aa9c2b72..abf493d1ca54 100644 --- a/app/Console/Commands/SendRecurringInvoices.php +++ b/app/Console/Commands/SendRecurringInvoices.php @@ -42,10 +42,8 @@ class SendRecurringInvoices extends Command if (!$recurInvoice->user->confirmed) { continue; } - + $recurInvoice->account->loadLocalizationSettings($recurInvoice->client); - //date_default_timezone_set(session(SESSION_TIMEZONE)); - $this->info('Processing Invoice '.$recurInvoice->id.' - Should send '.($recurInvoice->shouldSendToday() ? 'YES' : 'NO')); $invoice = $this->invoiceRepo->createRecurringInvoice($recurInvoice); diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index ca6e43efd3b1..2885957d2b37 100644 --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -47,7 +47,7 @@ class Handler extends ExceptionHandler { if ($e instanceof ModelNotFoundException) { return Redirect::to('/'); } - + // In production, except for maintenance mode, we'll show a custom error screen if (Utils::isNinjaProd() && !Utils::isDownForMaintenance()) { $data = [ diff --git a/app/Http/Controllers/AppController.php b/app/Http/Controllers/AppController.php index 7d186e29c37b..41e20efe0b02 100644 --- a/app/Http/Controllers/AppController.php +++ b/app/Http/Controllers/AppController.php @@ -56,7 +56,7 @@ class AppController extends BaseController $test = Input::get('test'); $app = Input::get('app'); - $app['key'] = str_random(RANDOM_KEY_LENGTH); + $app['key'] = env('APP_KEY') ?: str_random(RANDOM_KEY_LENGTH); $database = Input::get('database'); $dbType = $database['default']; diff --git a/app/Http/Controllers/InvoiceController.php b/app/Http/Controllers/InvoiceController.php index 886a96619ca3..6ff0d57512e4 100644 --- a/app/Http/Controllers/InvoiceController.php +++ b/app/Http/Controllers/InvoiceController.php @@ -131,13 +131,22 @@ class InvoiceController extends BaseController public function view($invitationKey) { - $invitation = $this->invoiceRepo->findInvoiceByInvitation($invitationKey); + if (!$invitation = $this->invoiceRepo->findInvoiceByInvitation($invitationKey)) { + return response()->view('error', [ + 'error' => trans('texts.invoice_not_found'), + 'hideHeader' => true, + ]); + } + $invoice = $invitation->invoice; $client = $invoice->client; $account = $invoice->account; if (!$account->checkSubdomain(Request::server('HTTP_HOST'))) { - app()->abort(404, trans('texts.invoice_not_found')); + return response()->view('error', [ + 'error' => trans('texts.invoice_not_found'), + 'hideHeader' => true, + ]); } if (!Input::has('phantomjs') && !Session::has($invitationKey) && (!Auth::check() || Auth::user()->account_id != $invoice->account_id)) { diff --git a/app/Http/Controllers/PublicClientController.php b/app/Http/Controllers/PublicClientController.php index 904424d98488..fdf9fa36e033 100644 --- a/app/Http/Controllers/PublicClientController.php +++ b/app/Http/Controllers/PublicClientController.php @@ -22,7 +22,9 @@ class PublicClientController extends BaseController public function dashboard() { - $invitation = $this->getInvitation(); + if (!$invitation = $this->getInvitation()) { + return $this->returnError(); + } $account = $invitation->account; $invoice = $invitation->invoice; $client = $invoice->client; @@ -40,7 +42,9 @@ class PublicClientController extends BaseController public function activityDatatable() { - $invitation = $this->getInvitation(); + if (!$invitation = $this->getInvitation()) { + return false; + } $invoice = $invitation->invoice; $query = DB::table('activities') @@ -59,7 +63,9 @@ class PublicClientController extends BaseController public function invoiceIndex() { - $invitation = $this->getInvitation(); + if (!$invitation = $this->getInvitation()) { + return $this->returnError(); + } $account = $invitation->account; $color = $account->primary_color ? $account->primary_color : '#0b4d78'; @@ -76,7 +82,9 @@ class PublicClientController extends BaseController public function invoiceDatatable() { - $invitation = $this->getInvitation(); + if (!$invitation = $this->getInvitation()) { + return false; + } return $this->invoiceRepo->getClientDatatable($invitation->contact_id, ENTITY_INVOICE, Input::get('sSearch')); } @@ -84,7 +92,9 @@ class PublicClientController extends BaseController public function paymentIndex() { - $invitation = $this->getInvitation(); + if (!$invitation = $this->getInvitation()) { + return $this->returnError(); + } $account = $invitation->account; $color = $account->primary_color ? $account->primary_color : '#0b4d78'; @@ -101,7 +111,9 @@ class PublicClientController extends BaseController public function paymentDatatable() { - $invitation = $this->getInvitation(); + if (!$invitation = $this->getInvitation()) { + return false; + } $payments = $this->paymentRepo->findForContact($invitation->contact->id, Input::get('sSearch')); return Datatable::query($payments) @@ -115,7 +127,9 @@ class PublicClientController extends BaseController public function quoteIndex() { - $invitation = $this->getInvitation(); + if (!$invitation = $this->getInvitation()) { + return $this->returnError(); + } $account = $invitation->account; $color = $account->primary_color ? $account->primary_color : '#0b4d78'; @@ -133,29 +147,39 @@ class PublicClientController extends BaseController public function quoteDatatable() { - $invitation = $this->getInvitation(); + if (!$invitation = $this->getInvitation()) { + return false; + } return $this->invoiceRepo->getClientDatatable($invitation->contact_id, ENTITY_QUOTE, Input::get('sSearch')); } + private function returnError() + { + return response()->view('error', [ + 'error' => trans('texts.invoice_not_found'), + 'hideHeader' => true, + ]); + } + private function getInvitation() { $invitationKey = session('invitation_key'); if (!$invitationKey) { - app()->abort(404); + return false; } $invitation = Invitation::where('invitation_key', '=', $invitationKey)->first(); if (!$invitation || $invitation->is_deleted) { - app()->abort(404); + return false; } $invoice = $invitation->invoice; if (!$invoice || $invoice->is_deleted) { - app()->abort(404); + return false; } return $invitation; diff --git a/app/Ninja/Mailers/Mailer.php b/app/Ninja/Mailers/Mailer.php index db65799a3dea..f129eefb6b03 100644 --- a/app/Ninja/Mailers/Mailer.php +++ b/app/Ninja/Mailers/Mailer.php @@ -9,6 +9,10 @@ class Mailer { public function sendTo($toEmail, $fromEmail, $fromName, $subject, $view, $data = []) { + if (stristr($toEmail, '@example.com')) { + return true; + } + if (isset($_ENV['POSTMARK_API_TOKEN'])) { $views = 'emails.'.$view.'_html'; } else { diff --git a/app/Ninja/Repositories/InvoiceRepository.php b/app/Ninja/Repositories/InvoiceRepository.php index 69a9b137d929..dcebc1858f1a 100644 --- a/app/Ninja/Repositories/InvoiceRepository.php +++ b/app/Ninja/Repositories/InvoiceRepository.php @@ -579,20 +579,21 @@ class InvoiceRepository public function findInvoiceByInvitation($invitationKey) { $invitation = Invitation::where('invitation_key', '=', $invitationKey)->first(); + if (!$invitation) { - app()->abort(404, trans('texts.invoice_not_found')); + return false; } $invoice = $invitation->invoice; if (!$invoice || $invoice->is_deleted) { - app()->abort(404, trans('texts.invoice_not_found')); + return false; } $invoice->load('user', 'invoice_items', 'invoice_design', 'account.country', 'client.contacts', 'client.country'); $client = $invoice->client; if (!$client || $client->is_deleted) { - app()->abort(404, trans('texts.invoice_not_found')); + return false; } return $invitation; diff --git a/resources/views/error.blade.php b/resources/views/error.blade.php index 13ef9e95dd10..c82d792f5993 100644 --- a/resources/views/error.blade.php +++ b/resources/views/error.blade.php @@ -8,7 +8,7 @@

Something went wrong...

- {{ $error }} +

{{ $error }}

If you'd like help please email us at contact@invoiceninja.com.

diff --git a/resources/views/header.blade.php b/resources/views/header.blade.php index c41847594eb4..a196d84f5b51 100644 --- a/resources/views/header.blade.php +++ b/resources/views/header.blade.php @@ -439,7 +439,7 @@