mirror of
https://github.com/devcode-it/openstamanager.git
synced 2025-02-02 08:56:48 +01:00
Miglioramento supporto OAuth2
Correzione per funzionamento con sistemi Microsoft.
This commit is contained in:
parent
ceb86b13bc
commit
8108b70b6f
@ -34,6 +34,10 @@ class Account extends Model
|
||||
|
||||
protected $table = 'em_accounts';
|
||||
|
||||
protected $casts = [
|
||||
'oauth2_config' => 'array',
|
||||
];
|
||||
|
||||
/** @var OAuth2 */
|
||||
protected $gestoreOAuth2;
|
||||
|
||||
|
@ -4,32 +4,21 @@ namespace Modules\Emails;
|
||||
|
||||
use InvalidArgumentException;
|
||||
use League\OAuth2\Client\Provider\Exception\IdentityProviderException;
|
||||
use League\OAuth2\Client\Provider\Google;
|
||||
use League\OAuth2\Client\Token\AccessToken;
|
||||
use TheNetworg\OAuth2\Client\Provider\Azure;
|
||||
use Modules\Emails\OAuth2\Google;
|
||||
use Modules\Emails\OAuth2\Microsoft;
|
||||
|
||||
class OAuth2
|
||||
{
|
||||
public static $providers = [
|
||||
'microsoft' => [
|
||||
'name' => 'Microsoft',
|
||||
'class' => Azure::class,
|
||||
'options' => [
|
||||
'scope' => [
|
||||
'offline_access',
|
||||
'https://graph.microsoft.com/SMTP.Send',
|
||||
//'https://outlook.office.com/IMAP.AccessAsUser.All'
|
||||
],
|
||||
],
|
||||
'class' => Microsoft::class,
|
||||
'help' => 'https://docs.openstamanager.com/faq/configurazione-oauth2#microsoft',
|
||||
],
|
||||
'google' => [
|
||||
'name' => 'Google',
|
||||
'class' => Google::class,
|
||||
'options' => [
|
||||
'scope' => ['https://mail.google.com/'],
|
||||
'accessType' => 'offline',
|
||||
],
|
||||
'help' => 'https://docs.openstamanager.com/faq/configurazione-oauth2#google',
|
||||
],
|
||||
];
|
||||
@ -41,31 +30,11 @@ class OAuth2
|
||||
{
|
||||
$this->account = $account;
|
||||
|
||||
$this->init();
|
||||
}
|
||||
|
||||
/**
|
||||
* Inizializza il provider per l'autenticazione OAuth2.
|
||||
*/
|
||||
public function init()
|
||||
{
|
||||
// Inizializza il provider per l'autenticazione OAuth2.
|
||||
$redirect_uri = base_url().'/oauth2.php';
|
||||
|
||||
$class = $this->getProviderConfiguration()['class'];
|
||||
|
||||
// Authorization
|
||||
$this->provider = new $class([
|
||||
'clientId' => $this->account->client_id,
|
||||
'clientSecret' => $this->account->client_secret,
|
||||
'redirectUri' => $redirect_uri,
|
||||
'accessType' => 'offline',
|
||||
]);
|
||||
|
||||
// Configurazioni specifiche per il provider di Microsoft Azure
|
||||
if ($this->provider instanceof Azure) {
|
||||
$this->provider->defaultEndPointVersion = Azure::ENDPOINT_VERSION_2_0;
|
||||
$this->provider->tenant = 'consumers';
|
||||
}
|
||||
$this->provider = new $class($this->account, $redirect_uri);
|
||||
}
|
||||
|
||||
public function getProvider()
|
||||
@ -109,7 +78,7 @@ class OAuth2
|
||||
}
|
||||
|
||||
$provider = $this->getProvider();
|
||||
$options = $this->getProviderConfiguration()['options'];
|
||||
$options = $provider->getOptions();
|
||||
if (empty($code)) {
|
||||
// Fetch the authorization URL from the provider; this returns the
|
||||
// urlAuthorize option and generates and applies any necessary parameters
|
||||
|
34
modules/emails/src/OAuth2/Google.php
Normal file
34
modules/emails/src/OAuth2/Google.php
Normal file
@ -0,0 +1,34 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Emails\OAuth2;
|
||||
|
||||
use League\OAuth2\Client\Provider\Google as OriginalProvider;
|
||||
use Modules\Emails\Account;
|
||||
|
||||
class Google extends OriginalProvider implements ProviderInterface
|
||||
{
|
||||
protected static $options = [
|
||||
'scope' => ['https://mail.google.com/'],
|
||||
'accessType' => 'offline',
|
||||
];
|
||||
|
||||
public function __construct(Account $account, $redirect_uri)
|
||||
{
|
||||
parent::__construct([
|
||||
'clientId' => $account->client_id,
|
||||
'clientSecret' => $account->client_secret,
|
||||
'redirectUri' => $redirect_uri,
|
||||
'accessType' => 'offline',
|
||||
]);
|
||||
}
|
||||
|
||||
public function getOptions()
|
||||
{
|
||||
return self::$options;
|
||||
}
|
||||
|
||||
public static function getConfigInputs()
|
||||
{
|
||||
return [];
|
||||
}
|
||||
}
|
56
modules/emails/src/OAuth2/Microsoft.php
Normal file
56
modules/emails/src/OAuth2/Microsoft.php
Normal file
@ -0,0 +1,56 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Emails\OAuth2;
|
||||
|
||||
use Modules\Emails\Account;
|
||||
use TheNetworg\OAuth2\Client\Provider\Azure;
|
||||
|
||||
class Microsoft extends Azure implements ProviderInterface
|
||||
{
|
||||
/**
|
||||
* Impostazioni native per la connessione.
|
||||
*
|
||||
* Ufficialmente lo scope dovrebbe comprendere 'https://graph.microsoft.com/SMTP.Send', a causa di un quirk interno bisogna utilizzare 'https://outlook.office.com/SMTP.Send'.
|
||||
*
|
||||
* @source https://github.com/decomplexity/SendOauth2/blob/main/MSFT%20OAuth2%20quirks.md
|
||||
*
|
||||
* @var \string[][]
|
||||
*/
|
||||
protected static $options = [
|
||||
'scope' => [
|
||||
'offline_access',
|
||||
'https://outlook.office.com/SMTP.Send',
|
||||
//'https://outlook.office.com/IMAP.AccessAsUser.All'
|
||||
],
|
||||
];
|
||||
|
||||
public function __construct(Account $account, $redirect_uri)
|
||||
{
|
||||
parent::__construct([
|
||||
'clientId' => $account->client_id,
|
||||
'clientSecret' => $account->client_secret,
|
||||
'redirectUri' => $redirect_uri,
|
||||
'accessType' => 'offline',
|
||||
]);
|
||||
|
||||
// Configurazioni specifiche per il provider di Microsoft Azure
|
||||
$this->defaultEndPointVersion = parent::ENDPOINT_VERSION_2_0;
|
||||
$this->tenant = $account->oauth2_config['tenant_id'];
|
||||
}
|
||||
|
||||
public function getOptions()
|
||||
{
|
||||
return self::$options;
|
||||
}
|
||||
|
||||
public static function getConfigInputs()
|
||||
{
|
||||
return [
|
||||
'tenant_id' => [
|
||||
'label' => 'Tenant ID',
|
||||
'type' => 'text',
|
||||
'required' => true,
|
||||
],
|
||||
];
|
||||
}
|
||||
}
|
24
modules/emails/src/OAuth2/ProviderInterface.php
Normal file
24
modules/emails/src/OAuth2/ProviderInterface.php
Normal file
@ -0,0 +1,24 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Emails\OAuth2;
|
||||
|
||||
use Modules\Emails\Account;
|
||||
|
||||
interface ProviderInterface
|
||||
{
|
||||
public function __construct(Account $account, $redirect_uri);
|
||||
|
||||
/**
|
||||
* Restituisce l'array di configurazione per la connessione remota al servizio del provider.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getOptions();
|
||||
|
||||
/**
|
||||
* Restituisce un insieme di campi aggiuntivi richiesti per la configurazione del provider.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function getConfigInputs();
|
||||
}
|
@ -19,7 +19,6 @@
|
||||
|
||||
namespace Modules\Partitario\Import;
|
||||
|
||||
use Carbon\Carbon;
|
||||
use Importer\CSVImporter;
|
||||
|
||||
/**
|
||||
@ -62,36 +61,34 @@ class CSV extends CSVImporter
|
||||
$database = database();
|
||||
$primary_key = $this->getPrimaryKey();
|
||||
|
||||
$numero = explode('.',$record['numero']);
|
||||
$numero = explode('.', $record['numero']);
|
||||
$codice_conto2 = $numero[0];
|
||||
$codice_conto3 = $numero[1];
|
||||
|
||||
//Estraggo il conto1
|
||||
$idpianodeiconti1 = $database->fetchOne("SELECT id FROM co_pianodeiconti1 WHERE LOWER(descrizione)=LOWER(".prepare($record['idpianodeiconti1']).")")['id'];
|
||||
$idpianodeiconti1 = $database->fetchOne('SELECT id FROM co_pianodeiconti1 WHERE LOWER(descrizione)=LOWER('.prepare($record['idpianodeiconti1']).')')['id'];
|
||||
|
||||
//Estraggo il conto,
|
||||
$idpianodeiconti2 = $database->fetchOne("SELECT id FROM co_pianodeiconti2 WHERE numero=".prepare($codice_conto2))['id'];
|
||||
$idpianodeiconti2 = $database->fetchOne('SELECT id FROM co_pianodeiconti2 WHERE numero='.prepare($codice_conto2))['id'];
|
||||
|
||||
if( empty($idpianodeiconti2) && empty($codice_conto3) ){
|
||||
$database->insert('co_pianodeiconti2',[
|
||||
if (empty($idpianodeiconti2) && empty($codice_conto3)) {
|
||||
$database->insert('co_pianodeiconti2', [
|
||||
'numero' => $codice_conto2,
|
||||
'descrizione' => $record['descrizione'],
|
||||
'idpianodeiconti1' => $idpianodeiconti1,
|
||||
'dir' => $record['dir'],
|
||||
]);
|
||||
}elseif( !empty($idpianodeiconti2) && !empty($codice_conto3) ){
|
||||
} elseif (!empty($idpianodeiconti2) && !empty($codice_conto3)) {
|
||||
$idpianodeiconti3 = $database->fetchOne('SELECT id FROM co_pianodeiconti3 WHERE numero='.prepare($codice_conto3).' AND idpianodeiconti2='.prepare($idpianodeiconti2))['id'];
|
||||
|
||||
$idpianodeiconti3 = $database->fetchOne("SELECT id FROM co_pianodeiconti3 WHERE numero=".prepare($codice_conto3)." AND idpianodeiconti2=".prepare($idpianodeiconti2))['id'];
|
||||
|
||||
if( empty($idpianodeiconti3) ){
|
||||
$database->insert('co_pianodeiconti3',[
|
||||
if (empty($idpianodeiconti3)) {
|
||||
$database->insert('co_pianodeiconti3', [
|
||||
'numero' => $codice_conto3,
|
||||
'descrizione' => $record['descrizione'],
|
||||
'idpianodeiconti2' => $idpianodeiconti2,
|
||||
'dir' => $record['dir'],
|
||||
]);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -103,7 +100,4 @@ class CSV extends CSVImporter
|
||||
['Patrimoniale', '110.000010', 'Riepilogativo clienti', ''],
|
||||
];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
@ -55,9 +55,12 @@ switch (filter('op')) {
|
||||
'timeout' => post('timeout'),
|
||||
'ssl_no_verify' => post('ssl_no_verify'),
|
||||
'predefined' => $predefined,
|
||||
|
||||
// OAuth2
|
||||
'provider' => post('provider'),
|
||||
'client_id' => post('client_id'),
|
||||
'client_secret' => post('client_secret'),
|
||||
'oauth2_config' => json_encode(post('config')),
|
||||
], ['id' => $id_record]);
|
||||
|
||||
flash()->info(tr('Informazioni salvate correttamente!'));
|
||||
@ -70,6 +73,7 @@ switch (filter('op')) {
|
||||
'client_secret' => null,
|
||||
'access_token' => null,
|
||||
'refresh_token' => null,
|
||||
'oauth2_config' => null,
|
||||
], ['id' => $id_record]);
|
||||
}
|
||||
|
||||
|
@ -142,6 +142,8 @@ echo '
|
||||
<div class="col-md-6">
|
||||
{[ "type": "text", "label": "'.tr('Client Secret').'", "name": "client_secret", "value": "$client_secret$", "disabled": "'.intval(empty($account->provider)).'" ]}
|
||||
</div>
|
||||
|
||||
<div id="config-provider"></div>
|
||||
</div>
|
||||
|
||||
<div class="alert alert-info">
|
||||
@ -149,14 +151,34 @@ echo '
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</form>';
|
||||
|
||||
// Inizializzazione dei form per campi personalizzati
|
||||
foreach ($providers as $key => $provider) {
|
||||
echo '
|
||||
<div class="hidden" id="provider-'.$key.'">';
|
||||
|
||||
$config = $provider['class']::getConfigInputs();
|
||||
foreach ($config as $name => $field) {
|
||||
$field['name'] = 'config['.$name.']';
|
||||
$field['value'] = $account->oauth2_config[$name];
|
||||
|
||||
echo '
|
||||
<div class="col-md-6">'.input($field).'</div>';
|
||||
}
|
||||
|
||||
echo '
|
||||
</div>';
|
||||
}
|
||||
|
||||
echo '
|
||||
<script>
|
||||
var abilita_oauth2 = input("abilita_oauth2");
|
||||
var provider = input("provider");
|
||||
var client_id = input("client_id");
|
||||
var client_secret = input("client_secret");
|
||||
var guida = $("#guida-configurazione");
|
||||
var config = $("#config-provider");
|
||||
|
||||
abilita_oauth2.change(function() {
|
||||
const disable = !abilita_oauth2.get();
|
||||
@ -175,6 +197,10 @@ provider.change(function() {
|
||||
} else {
|
||||
guida.addClass("hidden");
|
||||
}
|
||||
|
||||
// Impostazione dei dati aggiuntivi da configurare
|
||||
config.html("")
|
||||
aggiungiContenuto(config, "#provider-" + data.id);
|
||||
})
|
||||
|
||||
$(document).ready(function() {
|
||||
|
@ -51,7 +51,7 @@ echo '
|
||||
|
||||
foreach ($liv3_patrimoniale as $liv3_p) {
|
||||
// Visualizzo solo i conti di livello 3 relativi al conto di livello 2
|
||||
if ($liv2_p['id'] == $liv3_p['idpianodeiconti2'] && $liv3_p['totale']!=0) {
|
||||
if ($liv2_p['id'] == $liv3_p['idpianodeiconti2'] && $liv3_p['totale'] != 0) {
|
||||
echo '
|
||||
<tr>
|
||||
<td>'.$liv3_p['numero'].'</td>
|
||||
@ -61,7 +61,7 @@ echo '
|
||||
}
|
||||
}
|
||||
|
||||
if(empty(get('elenco_analitico'))){
|
||||
if (empty(get('elenco_analitico'))) {
|
||||
if ($liv2_p['descrizione'] == 'Crediti clienti e crediti diversi') {
|
||||
echo '
|
||||
<tr>
|
||||
@ -129,7 +129,7 @@ echo '
|
||||
</tr>';
|
||||
|
||||
foreach ($liv3_patrimoniale as $liv3_p) {
|
||||
if ($liv2_p['id'] == $liv3_p['idpianodeiconti2'] && $liv3_p['totale']!=0) {
|
||||
if ($liv2_p['id'] == $liv3_p['idpianodeiconti2'] && $liv3_p['totale'] != 0) {
|
||||
echo '
|
||||
<tr>
|
||||
<td>'.$liv3_p['numero'].'</td>
|
||||
@ -139,7 +139,7 @@ echo '
|
||||
}
|
||||
}
|
||||
|
||||
if(empty(get('elenco_analitico'))){
|
||||
if (empty(get('elenco_analitico'))) {
|
||||
if ($liv2_p['descrizione'] == 'Crediti clienti e crediti diversi') {
|
||||
echo '
|
||||
<tr>
|
||||
@ -216,7 +216,7 @@ echo '
|
||||
</tr>';
|
||||
|
||||
foreach ($liv3_economico as $liv3_e) {
|
||||
if ($liv2_e['id'] == $liv3_e['idpianodeiconti2'] && $liv3_e['totale']!=0) {
|
||||
if ($liv2_e['id'] == $liv3_e['idpianodeiconti2'] && $liv3_e['totale'] != 0) {
|
||||
echo '
|
||||
<tr>
|
||||
<td>'.$liv3_e['numero'].'</td>
|
||||
@ -280,7 +280,7 @@ echo '
|
||||
</tr>';
|
||||
|
||||
foreach ($liv3_economico as $liv3_e) {
|
||||
if ($liv2_e['id'] == $liv3_e['idpianodeiconti2'] && $liv3_e['totale']!=0) {
|
||||
if ($liv2_e['id'] == $liv3_e['idpianodeiconti2'] && $liv3_e['totale'] != 0) {
|
||||
echo '
|
||||
<tr>
|
||||
<td>'.$liv3_e['numero'].'</td>
|
||||
|
@ -9,7 +9,6 @@ WHERE `id_componente_vecchio` IS NOT NULL');
|
||||
foreach ($componenti_interessati as $componente) {
|
||||
$note = '';
|
||||
|
||||
|
||||
// Lettura da impostazioni INI
|
||||
$array = Ini::read($componente['contenuto']);
|
||||
foreach ($array as $nome => $c) {
|
||||
|
@ -63,3 +63,6 @@ ALTER TABLE `my_componenti` ADD FOREIGN KEY (`id_intervento`) REFERENCES `in_int
|
||||
INSERT INTO `zz_views` (`id`, `id_module`, `name`, `query`, `order`, `search`, `slow`, `format`, `search_inside`, `order_by`, `visible`, `summable`, `default`) VALUES
|
||||
(NULL, (SELECT `id` FROM `zz_modules` WHERE name = 'Anagrafiche'), 'Referenti', '(SELECT GROUP_CONCAT(nome SEPARATOR '', '') FROM an_referenti WHERE an_referenti .idanagrafica = an_anagrafiche.idanagrafica)', 11, 0, 0, 0, '', '', 1, 0, 1),
|
||||
(NULL, (SELECT `id` FROM `zz_modules` WHERE name = 'Anagrafiche'), 'Sedi', '(SELECT GROUP_CONCAT(nomesede SEPARATOR '', '') FROM an_sedi WHERE an_sedi.idanagrafica = an_anagrafiche.idanagrafica)', 10, 0, 0, 0, '', '', 1, 0, 1);
|
||||
|
||||
-- Miglioramento supporto autenticazione OAuth 2
|
||||
ALTER TABLE `em_accounts` ADD `oauth2_config` TEXT;
|
||||
|
Loading…
x
Reference in New Issue
Block a user