Miglioramento supporto OAuth2

Correzione per funzionamento con sistemi Microsoft.
This commit is contained in:
Dasc3er 2021-08-30 16:01:25 +02:00
parent ceb86b13bc
commit 8108b70b6f
11 changed files with 173 additions and 60 deletions

View File

@ -34,6 +34,10 @@ class Account extends Model
protected $table = 'em_accounts';
protected $casts = [
'oauth2_config' => 'array',
];
/** @var OAuth2 */
protected $gestoreOAuth2;

View File

@ -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

View 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 [];
}
}

View 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,
],
];
}
}

View 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();
}

View File

@ -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', ''],
];
}
}

View File

@ -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]);
}

View File

@ -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() {

View File

@ -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>

View File

@ -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) {

View File

@ -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;