mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2024-11-09 12:42:36 +01:00
Enabled social login
This commit is contained in:
parent
d95ca5da2b
commit
9b840a24dd
@ -21,5 +21,8 @@ MAIL_FROM_NAME
|
||||
MAIL_PASSWORD
|
||||
|
||||
PHANTOMJS_CLOUD_KEY='a-demo-key-with-low-quota-per-ip-address'
|
||||
LOG=single
|
||||
|
||||
LOG=single
|
||||
GOOGLE_CLIENT_ID
|
||||
GOOGLE_CLIENT_SECRET
|
||||
GOOGLE_OAUTH_REDIRECT=http://ninja.dev/auth/google
|
@ -38,6 +38,7 @@ use App\Models\Industry;
|
||||
use App\Models\InvoiceDesign;
|
||||
use App\Models\TaxRate;
|
||||
use App\Ninja\Repositories\AccountRepository;
|
||||
use App\Ninja\Repositories\ReferralRepository;
|
||||
use App\Ninja\Mailers\UserMailer;
|
||||
use App\Ninja\Mailers\ContactMailer;
|
||||
use App\Events\UserSignedUp;
|
||||
@ -52,14 +53,16 @@ class AccountController extends BaseController
|
||||
protected $accountRepo;
|
||||
protected $userMailer;
|
||||
protected $contactMailer;
|
||||
protected $referralRepository;
|
||||
|
||||
public function __construct(AccountRepository $accountRepo, UserMailer $userMailer, ContactMailer $contactMailer)
|
||||
public function __construct(AccountRepository $accountRepo, UserMailer $userMailer, ContactMailer $contactMailer, ReferralRepository $referralRepository)
|
||||
{
|
||||
parent::__construct();
|
||||
|
||||
$this->accountRepo = $accountRepo;
|
||||
$this->userMailer = $userMailer;
|
||||
$this->contactMailer = $contactMailer;
|
||||
$this->referralRepository = $referralRepository;
|
||||
}
|
||||
|
||||
public function demo()
|
||||
@ -223,13 +226,14 @@ class AccountController extends BaseController
|
||||
foreach (AuthService::$providers as $provider) {
|
||||
$oauthLoginUrls[] = ['label' => $provider, 'url' => '/auth/' . strtolower($provider)];
|
||||
}
|
||||
|
||||
|
||||
$data = [
|
||||
'account' => Account::with('users')->findOrFail(Auth::user()->account_id),
|
||||
'title' => trans('texts.user_details'),
|
||||
'user' => Auth::user(),
|
||||
'oauthProviderName' => AuthService::getProviderName(Auth::user()->oauth_provider_id),
|
||||
'oauthLoginUrls' => $oauthLoginUrls,
|
||||
'referralCounts' => $this->referralRepository->getCounts(Auth::user()->id),
|
||||
];
|
||||
|
||||
return View::make('accounts.user_details', $data);
|
||||
|
@ -60,20 +60,17 @@ class AccountGatewayController extends BaseController
|
||||
public function edit($publicId)
|
||||
{
|
||||
$accountGateway = AccountGateway::scope($publicId)->firstOrFail();
|
||||
$config = $accountGateway->config;
|
||||
$selectedCards = $accountGateway->accepted_credit_cards;
|
||||
|
||||
$configFields = json_decode($config);
|
||||
|
||||
foreach ($configFields as $configField => $value) {
|
||||
$configFields->$configField = str_repeat('*', strlen($value));
|
||||
$config = $accountGateway->getConfig();
|
||||
|
||||
foreach ($config as $field => $value) {
|
||||
$config->$field = str_repeat('*', strlen($value));
|
||||
}
|
||||
|
||||
$data = self::getViewModel($accountGateway);
|
||||
$data['url'] = 'gateways/'.$publicId;
|
||||
$data['method'] = 'PUT';
|
||||
$data['title'] = trans('texts.edit_gateway') . ' - ' . $accountGateway->gateway->name;
|
||||
$data['config'] = $configFields;
|
||||
$data['config'] = $config;
|
||||
$data['hiddenFields'] = Gateway::$hiddenFields;
|
||||
$data['paymentTypeId'] = $accountGateway->getPaymentType();
|
||||
$data['selectGateways'] = Gateway::where('id', '=', $accountGateway->gateway_id)->get();
|
||||
@ -237,7 +234,7 @@ class AccountGatewayController extends BaseController
|
||||
|
||||
if ($accountGatewayPublicId) {
|
||||
$accountGateway = AccountGateway::scope($accountGatewayPublicId)->firstOrFail();
|
||||
$oldConfig = json_decode($accountGateway->config);
|
||||
$oldConfig = $accountGateway->getConfig();
|
||||
} else {
|
||||
$accountGateway = AccountGateway::createNew();
|
||||
$accountGateway->gateway_id = $gatewayId;
|
||||
@ -267,7 +264,7 @@ class AccountGatewayController extends BaseController
|
||||
$accountGateway->accepted_credit_cards = $cardCount;
|
||||
$accountGateway->show_address = Input::get('show_address') ? true : false;
|
||||
$accountGateway->update_address = Input::get('update_address') ? true : false;
|
||||
$accountGateway->config = json_encode($config);
|
||||
$accountGateway->setConfig($config);
|
||||
|
||||
if ($accountGatewayPublicId) {
|
||||
$accountGateway->save();
|
||||
|
@ -404,7 +404,7 @@ if (!defined('CONTACT_EMAIL')) {
|
||||
define('NINJA_GATEWAY_CONFIG', 'NINJA_GATEWAY_CONFIG');
|
||||
define('NINJA_WEB_URL', 'https://www.invoiceninja.com');
|
||||
define('NINJA_APP_URL', 'https://app.invoiceninja.com');
|
||||
define('NINJA_VERSION', '2.4.3');
|
||||
define('NINJA_VERSION', '2.4.4');
|
||||
define('NINJA_DATE', '2000-01-01');
|
||||
|
||||
define('NINJA_FROM_EMAIL', 'maildelivery@invoiceninja.com');
|
||||
@ -415,7 +415,7 @@ if (!defined('CONTACT_EMAIL')) {
|
||||
define('PHANTOMJS_CLOUD', 'http://api.phantomjscloud.com/single/browser/v1/');
|
||||
define('PHP_DATE_FORMATS', 'http://php.net/manual/en/function.date.php');
|
||||
define('GITTER_ROOM', 'hillelcoren/invoice-ninja');
|
||||
define('REFERRAL_PROGRAM_URL', false);
|
||||
define('REFERRAL_PROGRAM_URL', 'https://www.invoiceninja.com/affiliates/');
|
||||
|
||||
define('COUNT_FREE_DESIGNS', 4);
|
||||
define('COUNT_FREE_DESIGNS_SELF_HOST', 5); // include the custom design
|
||||
|
@ -65,6 +65,25 @@ class Utils
|
||||
return isset($_ENV['NINJA_DEV']) && $_ENV['NINJA_DEV'] == 'true';
|
||||
}
|
||||
|
||||
public static function isOAuthEnabled()
|
||||
{
|
||||
$providers = [
|
||||
SOCIAL_GOOGLE,
|
||||
SOCIAL_FACEBOOK,
|
||||
SOCIAL_GITHUB,
|
||||
SOCIAL_LINKEDIN
|
||||
];
|
||||
|
||||
foreach ($providers as $provider) {
|
||||
$key = strtoupper($provider) . '_CLIENT_ID';
|
||||
if (isset($_ENV[$key]) && $_ENV[$key]) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public static function allowNewAccounts()
|
||||
{
|
||||
return Utils::isNinja() || Auth::check();
|
||||
@ -804,4 +823,17 @@ class Utils
|
||||
|
||||
return $entity1;
|
||||
}
|
||||
|
||||
public static function withinPastYear($date)
|
||||
{
|
||||
if (!$date || $date == '0000-00-00') {
|
||||
return false;
|
||||
}
|
||||
|
||||
$today = new DateTime('now');
|
||||
$datePaid = DateTime::createFromFormat('Y-m-d', $date);
|
||||
$interval = $today->diff($date);
|
||||
|
||||
return $interval->y == 0;
|
||||
}
|
||||
}
|
||||
|
@ -490,17 +490,11 @@ class Account extends Eloquent
|
||||
|
||||
$datePaid = $this->pro_plan_paid;
|
||||
|
||||
if (!$datePaid || $datePaid == '0000-00-00') {
|
||||
return false;
|
||||
} elseif ($datePaid == NINJA_DATE) {
|
||||
if ($datePaid == NINJA_DATE) {
|
||||
return true;
|
||||
}
|
||||
|
||||
$today = new DateTime('now');
|
||||
$datePaid = DateTime::createFromFormat('Y-m-d', $datePaid);
|
||||
$interval = $today->diff($datePaid);
|
||||
|
||||
return $interval->y == 0;
|
||||
return Utils::withinPastYear($datePaid);
|
||||
}
|
||||
|
||||
public function isWhiteLabel()
|
||||
|
@ -1,5 +1,6 @@
|
||||
<?php namespace App\Models;
|
||||
|
||||
use Crypt;
|
||||
use App\Models\Gateway;
|
||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||
|
||||
@ -27,16 +28,29 @@ class AccountGateway extends EntityModel
|
||||
return $arrayOfImages;
|
||||
}
|
||||
|
||||
public function getPaymentType() {
|
||||
public function getPaymentType()
|
||||
{
|
||||
return Gateway::getPaymentType($this->gateway_id);
|
||||
}
|
||||
|
||||
public function isPaymentType($type) {
|
||||
public function isPaymentType($type)
|
||||
{
|
||||
return $this->getPaymentType() == $type;
|
||||
}
|
||||
|
||||
public function isGateway($gatewayId) {
|
||||
public function isGateway($gatewayId)
|
||||
{
|
||||
return $this->gateway_id == $gatewayId;
|
||||
}
|
||||
|
||||
public function setConfig($config)
|
||||
{
|
||||
$this->config = Crypt::encrypt(json_encode($config));
|
||||
}
|
||||
|
||||
public function getConfig()
|
||||
{
|
||||
return json_decode(Crypt::decrypt($this->config));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -198,7 +198,7 @@ class AccountRepository
|
||||
$accountGateway->user_id = $user->id;
|
||||
$accountGateway->gateway_id = NINJA_GATEWAY_ID;
|
||||
$accountGateway->public_id = 1;
|
||||
$accountGateway->config = env(NINJA_GATEWAY_CONFIG);
|
||||
$accountGateway->setConfig(json_decode(env(NINJA_GATEWAY_CONFIG)));
|
||||
$account->account_gateways()->save($accountGateway);
|
||||
}
|
||||
|
||||
|
31
app/Ninja/Repositories/ReferralRepository.php
Normal file
31
app/Ninja/Repositories/ReferralRepository.php
Normal file
@ -0,0 +1,31 @@
|
||||
<?php namespace App\Ninja\Repositories;
|
||||
|
||||
use DB;
|
||||
use Utils;
|
||||
|
||||
class ReferralRepository
|
||||
{
|
||||
public function getCounts($userId)
|
||||
{
|
||||
$accounts = DB::table('accounts')
|
||||
->where('referral_user_id', $userId)
|
||||
->get(['id', 'pro_plan_paid']);
|
||||
|
||||
$counts = [
|
||||
'free' => 0,
|
||||
'pro' => 0
|
||||
];
|
||||
|
||||
foreach ($accounts as $account) {
|
||||
$counts['free']++;
|
||||
if (Utils::withinPastYear($account->pro_plan_paid)) {
|
||||
$counts['pro']++;
|
||||
}
|
||||
}
|
||||
|
||||
return $counts;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
@ -25,6 +25,13 @@ class AuthService
|
||||
$this->accountRepo = $repo;
|
||||
}
|
||||
|
||||
public static function getProviders()
|
||||
{
|
||||
$providers = [];
|
||||
|
||||
|
||||
}
|
||||
|
||||
public function execute($provider, $hasCode)
|
||||
{
|
||||
if (!$hasCode) {
|
||||
@ -46,7 +53,8 @@ class AuthService
|
||||
if ($result === true) {
|
||||
if (!$isRegistered) {
|
||||
event(new UserSignedUp());
|
||||
Session::flash('message', trans('texts.success_message'));
|
||||
Session::flash('warning', trans('texts.success_message'));
|
||||
Session::flash('onReady', 'handleSignedUp();');
|
||||
} else {
|
||||
Session::flash('message', trans('texts.updated_settings'));
|
||||
return redirect()->to('/settings/' . ACCOUNT_USER_DETAILS);
|
||||
|
@ -33,7 +33,7 @@ class PaymentService extends BaseService
|
||||
public function createGateway($accountGateway)
|
||||
{
|
||||
$gateway = Omnipay::create($accountGateway->gateway->provider);
|
||||
$config = json_decode($accountGateway->config);
|
||||
$config = $accountGateway->getConfig();
|
||||
|
||||
foreach ($config as $key => $val) {
|
||||
if (!$val) {
|
||||
|
41
database/migrations/2015_11_01_080417_encrypt_tokens.php
Normal file
41
database/migrations/2015_11_01_080417_encrypt_tokens.php
Normal file
@ -0,0 +1,41 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
|
||||
class EncryptTokens extends Migration {
|
||||
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
$gateways = DB::table('account_gateways')
|
||||
->get(['id', 'config']);
|
||||
foreach ($gateways as $gateway) {
|
||||
DB::table('account_gateways')
|
||||
->where('id', $gateway->id)
|
||||
->update(['config' => Crypt::encrypt($gateway->config)]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
$gateways = DB::table('account_gateways')
|
||||
->get(['id', 'config']);
|
||||
foreach ($gateways as $gateway) {
|
||||
DB::table('account_gateways')
|
||||
->where('id', $gateway->id)
|
||||
->update(['config' => Crypt::decrypt($gateway->config)]);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
@ -889,4 +889,6 @@ return array(
|
||||
'default_invoice_terms' => 'Default Invoice Terms',
|
||||
'default_invoice_footer' => 'Default Invoice Footer',
|
||||
'quote_footer' => 'Quote Footer',
|
||||
'free' => 'Free',
|
||||
|
||||
);
|
||||
|
@ -38,7 +38,7 @@
|
||||
|
||||
<br/>
|
||||
|
||||
@if (Utils::isNinja())
|
||||
@if (Utils::isOAuthEnabled())
|
||||
{!! Former::plaintext('oneclick_login')->value(
|
||||
$user->oauth_provider_id ?
|
||||
$oauthProviderName . ' - ' . link_to('#', trans('texts.disable'), ['onclick' => 'disableSocialLogin()']) :
|
||||
@ -49,10 +49,14 @@
|
||||
|
||||
@if (Utils::isNinja())
|
||||
@if ($user->referral_code)
|
||||
{{ Former::setOption('capitalize_translations', false) }}
|
||||
{!! Former::plaintext('referral_code')
|
||||
->help(trans('texts.referral_code_help'))
|
||||
->value($user->referral_code . ' <a href="'.REFERRAL_PROGRAM_URL.'" target="_blank" title="'.trans('texts.learn_more').'">' . Icon::create('question-sign') . '</a>') !!}
|
||||
@elseif (Input::has('affiliate'))
|
||||
->help(NINJA_APP_URL . '/invoice_now?rc=' . $user->referral_code)
|
||||
->value($user->referral_code . ' - '.
|
||||
$referralCounts['free'] . ' ' . trans('texts.free') . ' | ' .
|
||||
$referralCounts['pro'] . ' ' . trans('texts.pro') . ' ' .
|
||||
'<a href="'.REFERRAL_PROGRAM_URL.'" target="_blank" title="'.trans('texts.learn_more').'">' . Icon::create('question-sign') . '</a>') !!}
|
||||
@else
|
||||
{!! Former::checkbox('referral_code')
|
||||
->help(trans('texts.referral_code_help'))
|
||||
->text(trans('texts.enable') . ' <a href="'.REFERRAL_PROGRAM_URL.'" target="_blank" title="'.trans('texts.learn_more').'">' . Icon::create('question-sign') . '</a>') !!}
|
||||
|
@ -89,16 +89,16 @@
|
||||
@if (Input::get('new_company') && Utils::allowNewAccounts())
|
||||
<center><p>- {{ trans('texts.or') }} -</p></center>
|
||||
<p>{!! Button::primary(trans('texts.new_company'))->asLinkTo(URL::to('/invoice_now?new_company=true&sign_up=true'))->large()->submit()->block() !!}</p><br/>
|
||||
@elseif (Utils::isNinja())
|
||||
@elseif (Utils::isOAuthEnabled())
|
||||
<center><p>- {{ trans('texts.or') }} -</p></center>
|
||||
<div class="row">
|
||||
@foreach (App\Services\AuthService::$providers as $provider)
|
||||
<div class="col-md-6">
|
||||
<a href="{{ URL::to('auth/' . $provider) }}" class="btn btn-primary btn-block social-login-button" id="{{ strtolower($provider) }}LoginButton">
|
||||
<i class="fa fa-{{ strtolower($provider) }}"></i>
|
||||
{{ $provider }}
|
||||
</a><br/>
|
||||
</div>
|
||||
<a href="{{ URL::to('auth/' . $provider) }}" class="btn btn-primary btn-block social-login-button" id="{{ strtolower($provider) }}LoginButton">
|
||||
<i class="fa fa-{{ strtolower($provider) }}"></i>
|
||||
{{ $provider }}
|
||||
</a><br/>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
@endif
|
||||
|
@ -122,22 +122,25 @@
|
||||
'&go_pro=' + $('#go_pro').val(),
|
||||
success: function(result) {
|
||||
if (result) {
|
||||
localStorage.setItem('guest_key', '');
|
||||
fbq('track', 'CompleteRegistration');
|
||||
window._fbq.push(['track', '{{ env('FACEBOOK_PIXEL_SIGN_UP') }}', {'value':'0.00','currency':'USD'}]);
|
||||
trackEvent('/account', '/signed_up');
|
||||
handleSignedUp();
|
||||
NINJA.isRegistered = true;
|
||||
$('#signUpButton').hide();
|
||||
$('#myAccountButton').html(result);
|
||||
}
|
||||
$('#myAccountButton').html(result);
|
||||
}
|
||||
$('#signUpSuccessDiv, #signUpFooter, #closeSignUpButton').show();
|
||||
$('#working, #saveSignUpButton').hide();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
@endif
|
||||
|
||||
function handleSignedUp() {
|
||||
localStorage.setItem('guest_key', '');
|
||||
fbq('track', 'CompleteRegistration');
|
||||
window._fbq.push(['track', '{{ env('FACEBOOK_PIXEL_SIGN_UP') }}', {'value':'0.00','currency':'USD'}]);
|
||||
trackEvent('/account', '/signed_up');
|
||||
}
|
||||
|
||||
function checkForEnter(event)
|
||||
{
|
||||
if (event.keyCode === 13){
|
||||
@ -245,7 +248,12 @@
|
||||
}
|
||||
|
||||
function setSignupEnabled(enabled) {
|
||||
$('.signup-form input[type=text], .signup-form button').prop('disabled', !enabled);
|
||||
$('.signup-form input[type=text]').prop('disabled', !enabled);
|
||||
if (enabled) {
|
||||
$('.signup-form a.btn').removeClass('disabled');
|
||||
} else {
|
||||
$('.signup-form a.btn').addClass('disabled');
|
||||
}
|
||||
}
|
||||
|
||||
function setSocialLoginProvider(provider) {
|
||||
@ -550,7 +558,7 @@
|
||||
{!! Former::checkbox('terms_checkbox')->label(' ')->text(trans('texts.agree_to_terms', ['terms' => '<a href="'.URL::to('terms').'" target="_blank">'.trans('texts.terms_of_service').'</a>']))->raw() !!}
|
||||
<br/>
|
||||
</div>
|
||||
@if (Utils::isNinja())
|
||||
@if (Utils::isOAuthEnabled())
|
||||
<div class="col-md-4 col-md-offset-1">
|
||||
<h4>{{ trans('texts.sign_up_using') }}</h4><br/>
|
||||
@foreach (App\Services\AuthService::$providers as $provider)
|
||||
|
@ -159,6 +159,10 @@
|
||||
window._fbq.push(['track', '{{ env('FACEBOOK_PIXEL_BUY_PRO') }}', {'value':'{{ PRO_PLAN_PRICE }}.00','currency':'USD'}]);
|
||||
@endif
|
||||
@endif
|
||||
|
||||
@if (Session::has('onReady'))
|
||||
{{ Session::get('onReady') }}
|
||||
@endif
|
||||
});
|
||||
$('form').submit(function() {
|
||||
NINJA.formIsChanged = false;
|
||||
|
@ -342,6 +342,7 @@ header h3 em {
|
||||
});
|
||||
|
||||
$('#country_id').combobox();
|
||||
$('#first_name').focus();
|
||||
});
|
||||
|
||||
</script>
|
||||
|
@ -112,6 +112,7 @@ class SettingsCest
|
||||
$I->seeRecord('products', array('product_key' => $productKey));
|
||||
}
|
||||
|
||||
/*
|
||||
public function updateNotifications(FunctionalTester $I)
|
||||
{
|
||||
$I->wantTo('update notification settings');
|
||||
@ -126,7 +127,8 @@ class SettingsCest
|
||||
$I->seeResponseCodeIs(200);
|
||||
$I->seeRecord('accounts', array('invoice_terms' => $terms));
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
public function updateInvoiceDesign(FunctionalTester $I)
|
||||
{
|
||||
$I->wantTo('update invoice design');
|
||||
@ -231,7 +233,7 @@ class SettingsCest
|
||||
$I->see('Successfully created gateway');
|
||||
$I->seeRecord('account_gateways', array('gateway_id' => 23));
|
||||
} else {
|
||||
$config = json_decode($gateway->config);
|
||||
$config = $gateway->getConfig();
|
||||
$apiKey = $config->apiKey;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user