mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2025-07-09 03:14:30 -04:00
Allow login using contact_key or client_hash
This commit is contained in:
parent
9b546e66ac
commit
8756a89885
@ -589,7 +589,7 @@ class CompanySettings extends BaseSettings
|
|||||||
'$credit.po_number',
|
'$credit.po_number',
|
||||||
'$credit.date',
|
'$credit.date',
|
||||||
'$credit.balance',
|
'$credit.balance',
|
||||||
'$credit.amount',
|
'$credit.total',
|
||||||
],
|
],
|
||||||
'product_columns' => [
|
'product_columns' => [
|
||||||
'$product.product_key',
|
'$product.product_key',
|
||||||
|
@ -336,7 +336,7 @@ class Designer
|
|||||||
'$credit.po_number' => '<span class="flex justify-between items-center">$credit.po_number_label<span></span><span>$credit.po_number</span></span>',
|
'$credit.po_number' => '<span class="flex justify-between items-center">$credit.po_number_label<span></span><span>$credit.po_number</span></span>',
|
||||||
'$credit.date' => '<span class="flex justify-between items-center">$credit.date_label<span></span><span>$credit.date</span></span>',
|
'$credit.date' => '<span class="flex justify-between items-center">$credit.date_label<span></span><span>$credit.date</span></span>',
|
||||||
'$credit.balance' => '<span class="flex justify-between items-center">$credit.balance_label<span></span><span>$credit.balance</span></span>',
|
'$credit.balance' => '<span class="flex justify-between items-center">$credit.balance_label<span></span><span>$credit.balance</span></span>',
|
||||||
'$credit.amount' => '<span class="flex justify-between items-center">$credit.amount_label<span></span><span>$credit.amount</span></span>',
|
'$credit.total' => '<span class="flex justify-between items-center">$credit.total_label<span></span><span>$credit.total</span></span>',
|
||||||
'$credit.partial_due' => '<span class="flex justify-between items-center">$credit.partial_due_label<span></span><span>$credit.partial_due</span></span>',
|
'$credit.partial_due' => '<span class="flex justify-between items-center">$credit.partial_due_label<span></span><span>$credit.partial_due</span></span>',
|
||||||
'$credit.custom1' => '<span class="flex justify-between items-center">$credit.custom1_label<span></span><span>$credit.custom1</span></span>',
|
'$credit.custom1' => '<span class="flex justify-between items-center">$credit.custom1_label<span></span><span>$credit.custom1</span></span>',
|
||||||
'$credit.custom2' => '<span class="flex justify-between items-center">$credit.custom2_label<span></span><span>$credit.custom2</span></span>',
|
'$credit.custom2' => '<span class="flex justify-between items-center">$credit.custom2_label<span></span><span>$credit.custom2</span></span>',
|
||||||
|
@ -12,16 +12,21 @@
|
|||||||
namespace App\Http\Middleware;
|
namespace App\Http\Middleware;
|
||||||
|
|
||||||
use App\Libraries\MultiDB;
|
use App\Libraries\MultiDB;
|
||||||
|
use App\Models\Client;
|
||||||
use App\Models\ClientContact;
|
use App\Models\ClientContact;
|
||||||
use App\Models\CompanyToken;
|
use App\Models\CompanyToken;
|
||||||
use Closure;
|
|
||||||
use Auth;
|
use Auth;
|
||||||
|
use Closure;
|
||||||
|
|
||||||
class ContactKeyLogin
|
class ContactKeyLogin
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Handle an incoming request.
|
* Handle an incoming request.
|
||||||
*
|
*
|
||||||
|
* Sets a contact LOGGED IN if an appropriate client_hash is provided as a query parameter
|
||||||
|
* OR
|
||||||
|
* If the contact_key is provided in the route
|
||||||
|
*
|
||||||
* @param \Illuminate\Http\Request $request
|
* @param \Illuminate\Http\Request $request
|
||||||
* @param \Closure $next
|
* @param \Closure $next
|
||||||
* @return mixed
|
* @return mixed
|
||||||
@ -47,6 +52,25 @@ class ContactKeyLogin
|
|||||||
return redirect()->to('client/dashboard');
|
return redirect()->to('client/dashboard');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else if($request->has('client_hash') && config('ninja.db.multi_db_enabled')){
|
||||||
|
|
||||||
|
if (MultiDB::findAndSetDbByClientHash($request->input('client_hash'))) {
|
||||||
|
|
||||||
|
$client = Client::where('client_hash', $request->input('client_hash'))->first();
|
||||||
|
Auth::guard('contact')->login($client->primary_contact()->first(), true);
|
||||||
|
return redirect()->to('client/dashboard');
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else if($request->has('client_hash')){
|
||||||
|
|
||||||
|
if($client = Client::where('client_hash', $request->input('client_hash'))->first()){
|
||||||
|
Auth::guard('contact')->login($client->primary_contact()->first(), true);
|
||||||
|
return redirect()->to('client/dashboard');
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return $next($request);
|
return $next($request);
|
||||||
|
@ -100,7 +100,7 @@ class StoreRecurringInvoiceRequest extends Request
|
|||||||
if(isset($input['auto_bill']))
|
if(isset($input['auto_bill']))
|
||||||
$input['auto_bill_enabled'] = $this->setAutoBillFlag($input['auto_bill']);
|
$input['auto_bill_enabled'] = $this->setAutoBillFlag($input['auto_bill']);
|
||||||
else{
|
else{
|
||||||
$client = Client::find($this->decodePrimaryKey($input['client_id']));
|
$client = Client::find($input['client_id']);
|
||||||
$input['auto_bill'] = $client->getSetting('auto_bill');
|
$input['auto_bill'] = $client->getSetting('auto_bill');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
|
|
||||||
namespace App\Libraries;
|
namespace App\Libraries;
|
||||||
|
|
||||||
|
use App\Models\Client;
|
||||||
use App\Models\ClientContact;
|
use App\Models\ClientContact;
|
||||||
use App\Models\Company;
|
use App\Models\Company;
|
||||||
use App\Models\CompanyToken;
|
use App\Models\CompanyToken;
|
||||||
@ -200,7 +201,6 @@ class MultiDB
|
|||||||
foreach (self::$dbs as $db) {
|
foreach (self::$dbs as $db) {
|
||||||
if ($client_contact = ClientContact::on($db)->where('contact_key', $contact_key)->first()) {
|
if ($client_contact = ClientContact::on($db)->where('contact_key', $contact_key)->first()) {
|
||||||
self::setDb($client_contact->company->db);
|
self::setDb($client_contact->company->db);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -208,6 +208,17 @@ class MultiDB
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function findAndSetDbByClientHash($client_hash) :bool
|
||||||
|
{
|
||||||
|
foreach (self::$dbs as $db) {
|
||||||
|
if ($client = Client::on($db)->where('client_hash', $client_hash)->first()) {
|
||||||
|
self::setDb($client->company->db);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
public static function findAndSetDbByDomain($subdomain) :bool
|
public static function findAndSetDbByDomain($subdomain) :bool
|
||||||
{
|
{
|
||||||
|
@ -198,4 +198,20 @@ class ClientContact extends Authenticatable implements HasLocalePreference
|
|||||||
|
|
||||||
return asset('images/svg/user.svg');
|
return asset('images/svg/user.svg');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides a convenience login click for contacts to bypass the
|
||||||
|
* contact authentication layer
|
||||||
|
*
|
||||||
|
* @return string URL
|
||||||
|
*/
|
||||||
|
public function getLoginLink()
|
||||||
|
{
|
||||||
|
|
||||||
|
$domain = isset($this->company->portal_domain) ?: $this->company->domain();
|
||||||
|
|
||||||
|
return $domain . 'client/key_login/' . $this->contact_key;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -426,7 +426,7 @@ class Company extends BaseModel
|
|||||||
public function domain()
|
public function domain()
|
||||||
{
|
{
|
||||||
if (Ninja::isNinja()) {
|
if (Ninja::isNinja()) {
|
||||||
return $this->subdomain.config('ninja.app_domain');
|
return $this->subdomain . config('ninja.app_domain');
|
||||||
}
|
}
|
||||||
|
|
||||||
return config('ninja.app_url');
|
return config('ninja.app_url');
|
||||||
|
@ -47,6 +47,7 @@ class ClientContactTransformer extends EntityTransformer
|
|||||||
'send_email' => (bool) $contact->send_email,
|
'send_email' => (bool) $contact->send_email,
|
||||||
'last_login' => (int) $contact->last_login,
|
'last_login' => (int) $contact->last_login,
|
||||||
'password' => empty($contact->password) ? '' : '**********',
|
'password' => empty($contact->password) ? '' : '**********',
|
||||||
|
'link' => $contact->getLoginLink(),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -162,7 +162,7 @@ class HtmlEngine
|
|||||||
$data['$quote.amount'] = ['value' => Number::formatMoney($this->entity_calc->getTotal(), $this->client) ?: ' ', 'label' => ctrans('texts.quote_total')];
|
$data['$quote.amount'] = ['value' => Number::formatMoney($this->entity_calc->getTotal(), $this->client) ?: ' ', 'label' => ctrans('texts.quote_total')];
|
||||||
$data['$credit.total'] = ['value' => Number::formatMoney($this->entity_calc->getTotal(), $this->client) ?: ' ', 'label' => ctrans('texts.credit_total')];
|
$data['$credit.total'] = ['value' => Number::formatMoney($this->entity_calc->getTotal(), $this->client) ?: ' ', 'label' => ctrans('texts.credit_total')];
|
||||||
$data['$credit.number'] = ['value' => $this->entity->number ?: ' ', 'label' => ctrans('texts.credit_number')];
|
$data['$credit.number'] = ['value' => $this->entity->number ?: ' ', 'label' => ctrans('texts.credit_number')];
|
||||||
$data['$credit.amount'] = &$data['$credit.total'];
|
$data['$credit.total'] = &$data['$credit.total'];
|
||||||
$data['$credit.po_number'] = &$data['$invoice.po_number'];
|
$data['$credit.po_number'] = &$data['$invoice.po_number'];
|
||||||
$data['$credit.date'] = ['value' => $this->entity->date, 'label' => ctrans('texts.credit_date')];
|
$data['$credit.date'] = ['value' => $this->entity->date, 'label' => ctrans('texts.credit_date')];
|
||||||
$data['$balance'] = ['value' => Number::formatMoney($this->entity_calc->getBalance(), $this->client) ?: ' ', 'label' => ctrans('texts.balance')];
|
$data['$balance'] = ['value' => Number::formatMoney($this->entity_calc->getBalance(), $this->client) ?: ' ', 'label' => ctrans('texts.balance')];
|
||||||
|
@ -253,7 +253,7 @@ trait MakesInvoiceValues
|
|||||||
$data['$quote.amount'] = ['value' => Number::formatMoney($calc->getTotal(), $this->client) ?: ' ', 'label' => ctrans('texts.quote_total')];
|
$data['$quote.amount'] = ['value' => Number::formatMoney($calc->getTotal(), $this->client) ?: ' ', 'label' => ctrans('texts.quote_total')];
|
||||||
$data['$credit.total'] = ['value' => Number::formatMoney($calc->getTotal(), $this->client) ?: ' ', 'label' => ctrans('texts.credit_total')];
|
$data['$credit.total'] = ['value' => Number::formatMoney($calc->getTotal(), $this->client) ?: ' ', 'label' => ctrans('texts.credit_total')];
|
||||||
$data['$credit.number'] = ['value' => $this->number ?: ' ', 'label' => ctrans('texts.credit_number')];
|
$data['$credit.number'] = ['value' => $this->number ?: ' ', 'label' => ctrans('texts.credit_number')];
|
||||||
$data['$credit.amount'] = &$data['$credit.total'];
|
$data['$credit.total'] = &$data['$credit.total'];
|
||||||
$data['$credit.po_number'] = &$data['$invoice.po_number'];
|
$data['$credit.po_number'] = &$data['$invoice.po_number'];
|
||||||
$data['$credit.date'] = ['value' => $this->date, 'label' => ctrans('texts.credit_date')];
|
$data['$credit.date'] = ['value' => $this->date, 'label' => ctrans('texts.credit_date')];
|
||||||
$data['$balance'] = ['value' => Number::formatMoney($calc->getBalance(), $this->client) ?: ' ', 'label' => ctrans('texts.balance')];
|
$data['$balance'] = ['value' => Number::formatMoney($calc->getBalance(), $this->client) ?: ' ', 'label' => ctrans('texts.balance')];
|
||||||
|
@ -96,7 +96,7 @@ trait MakesTemplateData
|
|||||||
$data['$quote_total'] = ['value' => '$100.00', 'label' => ctrans('texts.quote_total')];
|
$data['$quote_total'] = ['value' => '$100.00', 'label' => ctrans('texts.quote_total')];
|
||||||
$data['$quote.amount'] = &$data['$quote_total'];
|
$data['$quote.amount'] = &$data['$quote_total'];
|
||||||
$data['$credit_total'] = ['value' => '$100.00', 'label' => ctrans('texts.credit_total')];
|
$data['$credit_total'] = ['value' => '$100.00', 'label' => ctrans('texts.credit_total')];
|
||||||
$data['$credit.amount'] = &$data['$credit_total'];
|
$data['$credit.total'] = &$data['$credit_total'];
|
||||||
$data['$balance'] = ['value' => '$100.00', 'label' => ctrans('texts.balance')];
|
$data['$balance'] = ['value' => '$100.00', 'label' => ctrans('texts.balance')];
|
||||||
$data['$invoice.balance'] = &$data['$balance'];
|
$data['$invoice.balance'] = &$data['$balance'];
|
||||||
$data['$taxes'] = ['value' => '$10.00', 'label' => ctrans('texts.taxes')];
|
$data['$taxes'] = ['value' => '$10.00', 'label' => ctrans('texts.taxes')];
|
||||||
|
Loading…
x
Reference in New Issue
Block a user