diff --git a/.github/workflows/phpunit.yml b/.github/workflows/phpunit.yml index 59e4b797b1..74964b3386 100644 --- a/.github/workflows/phpunit.yml +++ b/.github/workflows/phpunit.yml @@ -30,7 +30,7 @@ jobs: MULTI_DB_ENABLED: false NINJA_LICENSE: 123456 TRAVIS: true - MAIL_DRIVER: log + MAIL_MAILER: log services: mariadb: diff --git a/app/Console/Commands/PostUpdate.php b/app/Console/Commands/PostUpdate.php index a675503c70..def9f4237c 100644 --- a/app/Console/Commands/PostUpdate.php +++ b/app/Console/Commands/PostUpdate.php @@ -51,49 +51,62 @@ class PostUpdate extends Command \Log::error("I wasn't able to optimize."); } - $composer_data = [ - 'url' => 'https://getcomposer.org/composer.phar', - 'dir' => __DIR__.'/.code', - 'bin' => __DIR__.'/.code/composer.phar', - 'json' => __DIR__.'/.code/composer.json', - 'conf' => [ - 'autoload' => [ - 'psr-4' => [ - '' => 'local/', - ], - ], - ], - ]; +// Composer\Factory::getHomeDir() method +// needs COMPOSER_HOME environment variable set + putenv('COMPOSER_HOME=' . __DIR__ . '/vendor/bin/composer'); - if (! is_dir($composer_data['dir'])) { - mkdir($composer_data['dir'], 0777, true); - } + // call `composer install` command programmatically + $input = new ArrayInput(array('command' => 'install')); + $application = new Application(); + $application->setAutoExit(false); + $out = $application->run($input); - if (! is_dir("{$composer_data['dir']}/local")) { - mkdir("{$composer_data['dir']}/local", 0777, true); - } + print_r($out); + echo "Done."; - copy($composer_data['url'], $composer_data['bin']); - require_once "phar://{$composer_data['bin']}/src/bootstrap.php"; + // $composer_data = [ + // 'url' => 'https://getcomposer.org/composer.phar', + // 'dir' => __DIR__.'/.code', + // 'bin' => __DIR__.'/.code/composer.phar', + // 'json' => __DIR__.'/.code/composer.json', + // 'conf' => [ + // 'autoload' => [ + // 'psr-4' => [ + // '' => 'local/', + // ], + // ], + // ], + // ]; - $conf_json = json_encode($composer_data['conf'], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); - file_put_contents($composer_data['json'], $conf_json); - chdir($composer_data['dir']); - putenv("COMPOSER_HOME={$composer_data['dir']}"); - putenv('OSTYPE=OS400'); - $app = new \Composer\Console\Application(); + // if (! is_dir($composer_data['dir'])) { + // mkdir($composer_data['dir'], 0777, true); + // } - $factory = new \Composer\Factory(); - $output = $factory->createOutput(); + // if (! is_dir("{$composer_data['dir']}/local")) { + // mkdir("{$composer_data['dir']}/local", 0777, true); + // } - $input = new \Symfony\Component\Console\Input\ArrayInput([ - 'command' => 'install', - ]); - $input->setInteractive(false); - echo '
'; - $cmdret = $app->doRun($input, $output); - echo 'end!'; + // copy($composer_data['url'], $composer_data['bin']); + // require_once "phar://{$composer_data['bin']}/src/bootstrap.php"; - \Log::error(print_r($cmdret, 1)); + // $conf_json = json_encode($composer_data['conf'], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); + // file_put_contents($composer_data['json'], $conf_json); + // chdir($composer_data['dir']); + // putenv("COMPOSER_HOME={$composer_data['dir']}"); + // putenv('OSTYPE=OS400'); + // $app = new \Composer\Console\Application(); + + // $factory = new \Composer\Factory(); + // $output = $factory->createOutput(); + + // $input = new \Symfony\Component\Console\Input\ArrayInput([ + // 'command' => 'install', + // ]); + // $input->setInteractive(false); + // echo ''; + // $cmdret = $app->doRun($input, $output); + // echo 'end!'; + + // \Log::error(print_r($cmdret, 1)); } } diff --git a/app/Http/Controllers/ClientPortal/EntityViewController.php b/app/Http/Controllers/ClientPortal/EntityViewController.php index e16b0c7f5a..f65230ca4d 100644 --- a/app/Http/Controllers/ClientPortal/EntityViewController.php +++ b/app/Http/Controllers/ClientPortal/EntityViewController.php @@ -33,17 +33,18 @@ class EntityViewController extends Controller $key = $entity_type.'_id'; - $invitation = $invitation_entity::whereRaw('BINARY `key`= ?', [$invitation_key])->firstOrFail(); + $invitation = $invitation_entity::whereRaw('BINARY `key`= ?', [$invitation_key]) + ->with('contact.client') + ->firstOrFail(); $contact = $invitation->contact; + $client = $contact->client; + $entity = $invitation->{$entity_type}; if (is_null($contact->password) || empty($contact->password)) { return redirect("/client/password/reset?email={$contact->email}"); } - $entity_class = sprintf('App\\Models\\%s', ucfirst($entity_type)); - $entity = $entity_class::findOrFail($invitation->{$key}); - if ((bool) $invitation->contact->client->getSetting('enable_client_portal_password') !== false) { session()->flash("{$entity_type}_VIEW_{$entity->hashed_id}", true); } diff --git a/app/Http/Controllers/ClientPortal/InvitationController.php b/app/Http/Controllers/ClientPortal/InvitationController.php index aba552eed1..e891f57691 100644 --- a/app/Http/Controllers/ClientPortal/InvitationController.php +++ b/app/Http/Controllers/ClientPortal/InvitationController.php @@ -37,29 +37,34 @@ class InvitationController extends Controller $entity_obj = 'App\Models\\'.ucfirst($entity).'Invitation'; - $invitation = $entity_obj::whereRaw('BINARY `key`= ?', [$invitation_key])->first(); + $invitation = $entity_obj::whereRaw('BINARY `key`= ?', [$invitation_key]) + ->with('contact.client') + ->firstOrFail(); - if ($invitation) { - if ((bool) $invitation->contact->client->getSetting('enable_client_portal_password') !== false) { - $this->middleware('auth:contact'); - } else { - auth()->guard('contact')->login($invitation->contact, true); - } + /* Return early if we have the correct client_hash embedded */ - if (! request()->has('silent') && ! $invitation->viewed_date) { -// if (!request()->has('silent')) { - - $invitation->markViewed(); - - event(new InvitationWasViewed($invitation->{$entity}, $invitation, $invitation->{$entity}->company, Ninja::eventVars())); - - $this->fireEntityViewedEvent($invitation, $entity); - } - - return redirect()->route('client.'.$entity.'.show', [$entity => $this->encodePrimaryKey($invitation->{$key})]); - } else { - abort(404); + if(request()->has('client_hash') && request()->input('client_hash') == $invitation->contact->client->client_hash) { + auth()->guard('contact')->login($invitation->contact, true); } + else if ((bool) $invitation->contact->client->getSetting('enable_client_portal_password') !== false) { + $this->middleware('auth:contact'); + } + else { + auth()->guard('contact')->login($invitation->contact, true); + } + + if (auth()->guard('contact') && ! request()->has('silent') && ! $invitation->viewed_date) { + + $invitation->markViewed(); + + event(new InvitationWasViewed($invitation->{$entity}, $invitation, $invitation->{$entity}->company, Ninja::eventVars())); + + $this->fireEntityViewedEvent($invitation, $entity); + } + + return redirect()->route('client.'.$entity.'.show', [$entity => $this->encodePrimaryKey($invitation->{$key})]); + + } private function fireEntityViewedEvent($invitation, $entity_string) diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index 9365e1d547..4f69d563d3 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -29,8 +29,8 @@ class Kernel extends HttpKernel \App\Http\Middleware\TrimStrings::class, \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, \App\Http\Middleware\TrustProxies::class, - \Fruitcake\Cors\HandleCors::class, - \App\Http\Middleware\Cors::class, + //\Fruitcake\Cors\HandleCors::class, + \App\Http\Middleware\Cors::class, ]; diff --git a/app/Http/Middleware/QueryLogging.php b/app/Http/Middleware/QueryLogging.php index 64f8742da0..4841c12bbc 100644 --- a/app/Http/Middleware/QueryLogging.php +++ b/app/Http/Middleware/QueryLogging.php @@ -31,10 +31,12 @@ class QueryLogging */ public function handle(Request $request, Closure $next) { + + $timeStart = microtime(true); + // Enable query logging for development if (config('ninja.app_env') != 'production') { DB::enableQueryLog(); - $timeStart = microtime(true); } $response = $next($request); diff --git a/app/Jobs/Invoice/CreateInvoicePdf.php b/app/Jobs/Invoice/CreateInvoicePdf.php index b85b3309d6..acc644594a 100644 --- a/app/Jobs/Invoice/CreateInvoicePdf.php +++ b/app/Jobs/Invoice/CreateInvoicePdf.php @@ -111,7 +111,7 @@ class CreateInvoicePdf implements ShouldQueue //todo - move this to the client creation stage so we don't keep hitting this unnecessarily Storage::makeDirectory($path, 0775); - info($maker->getCompiledHTML(true)); + //info($maker->getCompiledHTML(true)); $pdf = $this->makePdf(null, null, $maker->getCompiledHTML(true)); diff --git a/app/PaymentDrivers/PayPalExpressPaymentDriver.php b/app/PaymentDrivers/PayPalExpressPaymentDriver.php index 76f6d0a817..76b8600efd 100644 --- a/app/PaymentDrivers/PayPalExpressPaymentDriver.php +++ b/app/PaymentDrivers/PayPalExpressPaymentDriver.php @@ -262,6 +262,13 @@ class PayPalExpressPaymentDriver extends BasePaymentDriver public function createPayment($data, $status = Payment::STATUS_COMPLETED): Payment { + $payment_meta = new \stdClass; + $payment_meta->exp_month = 'xx'; + $payment_meta->exp_year = 'xx'; + $payment_meta->brand = 'PayPal'; + $payment_meta->last4 = 'xxxx'; + $payment_meta->type = GatewayType::PAYPAL; + $payment = parent::createPayment($data, $status); $client_contact = $this->getContact(); @@ -271,6 +278,7 @@ class PayPalExpressPaymentDriver extends BasePaymentDriver $payment->type_id = PaymentType::PAYPAL; $payment->transaction_reference = $data['PAYMENTINFO_0_TRANSACTIONID']; $payment->client_contact_id = $client_contact_id; + $payment->meta = $payment_meta; $payment->save(); return $payment; diff --git a/composer.lock b/composer.lock index e8f87a8c76..88e234c822 100644 --- a/composer.lock +++ b/composer.lock @@ -1541,16 +1541,16 @@ }, { "name": "egulias/email-validator", - "version": "2.1.19", + "version": "2.1.20", "source": { "type": "git", "url": "https://github.com/egulias/EmailValidator.git", - "reference": "840d5603eb84cc81a6a0382adac3293e57c1c64c" + "reference": "f46887bc48db66c7f38f668eb7d6ae54583617ff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/840d5603eb84cc81a6a0382adac3293e57c1c64c", - "reference": "840d5603eb84cc81a6a0382adac3293e57c1c64c", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/f46887bc48db66c7f38f668eb7d6ae54583617ff", + "reference": "f46887bc48db66c7f38f668eb7d6ae54583617ff", "shasum": "" }, "require": { @@ -1595,7 +1595,7 @@ "validation", "validator" ], - "time": "2020-08-08T21:28:19+00:00" + "time": "2020-09-06T13:44:32+00:00" }, { "name": "fedeisas/laravel-mail-css-inliner", @@ -4364,16 +4364,16 @@ }, { "name": "opis/closure", - "version": "3.5.6", + "version": "3.5.7", "source": { "type": "git", "url": "https://github.com/opis/closure.git", - "reference": "e8d34df855b0a0549a300cb8cb4db472556e8aa9" + "reference": "4531e53afe2fc660403e76fb7644e95998bff7bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/opis/closure/zipball/e8d34df855b0a0549a300cb8cb4db472556e8aa9", - "reference": "e8d34df855b0a0549a300cb8cb4db472556e8aa9", + "url": "https://api.github.com/repos/opis/closure/zipball/4531e53afe2fc660403e76fb7644e95998bff7bf", + "reference": "4531e53afe2fc660403e76fb7644e95998bff7bf", "shasum": "" }, "require": { @@ -4421,7 +4421,7 @@ "serialization", "serialize" ], - "time": "2020-08-11T08:46:50+00:00" + "time": "2020-09-06T17:02:15+00:00" }, { "name": "paragonie/random_compat", @@ -11053,7 +11053,6 @@ "keywords": [ "tokenizer" ], - "abandoned": true, "time": "2019-09-17T06:23:10+00:00" }, { diff --git a/config/filesystems.php b/config/filesystems.php index 88314fa612..816d65b2b3 100644 --- a/config/filesystems.php +++ b/config/filesystems.php @@ -13,7 +13,7 @@ return [ | */ - 'default' => env('FILESYSTEM_DRIVER', 'local'), + 'default' => env('FILESYSTEM_DRIVER', 'public'), /* |--------------------------------------------------------------------------