Introduzione pagina personale (#116)

Introduzione di una pagina personale per l'utente, con la possbilità di modificare la propria password (#116).
This commit is contained in:
Thomas Zilio 2018-02-20 14:23:00 +01:00
parent 90bdad2b98
commit c85bb159fa
9 changed files with 160 additions and 96 deletions

View File

@ -3,6 +3,7 @@
include_once __DIR__.'/../core.php';
$paths = App::getPaths();
$user = Auth::user();
// Istanziamento della barra di debug
if (!empty($debug)) {
@ -210,7 +211,10 @@ if (Auth::check()) {
<!-- Sidebar user panel -->
<div class="user-panel text-center info">
<div class="info">
<p>'.$_SESSION['username'].'</p>
<p><a href="'.$rootdir.'/modules/utenti/info.php">
<i class="fa fa-user"></i>
'.$user['username'].'
</a></p>
<p id="datetime"></p>
</div>

View File

@ -3,15 +3,15 @@ include_once __DIR__.'/core.php';
$pageTitle = 'Info';
if (file_exists($docroot.'/include/custom/top.php')) {
include($docroot.'/include/custom/top.php');
include $docroot.'/include/custom/top.php';
} else {
include($docroot.'/include/top.php');
include $docroot.'/include/top.php';
}
?>
<div class="box">
<div class="box-header">
<img src="<?php echo $img; ?>/logo.png" alt="<?php echo tr('OSM Logo'); ?>">
<h3 class="box-title"><?php echo tr('OpenSTAManager'); ?></h3>
<h3 class="box-title"><?php echo tr('OpenSTAManager'); ?></h3>
<div class="pull-right">
<i class="fa fa-info"></i> <?php echo tr('Informazioni'); ?>
</div>
@ -20,7 +20,7 @@ if (file_exists($docroot.'/include/custom/top.php')) {
<div class="box-body">
<?php
if (file_exists('assistenza.php')) {
include('assistenza.php');
include 'assistenza.php';
} else {
?>
<div class="row">
@ -144,9 +144,7 @@ if (file_exists('assistenza.php')) {
<?php
if (file_exists($docroot.'/include/custom/bottom.php')) {
include($docroot.'/include/custom/bottom.php');
include $docroot.'/include/custom/bottom.php';
} else {
include($docroot.'/include/bottom.php');
include $docroot.'/include/bottom.php';
}
?>

View File

@ -61,6 +61,11 @@ switch (filter('op')) {
$_SESSION['errors'][] = tr('Utente già esistente!');
}
}
if (empty($id_record)) {
redirect(ROOTDIR.'/modules/utenti/info.php');
}
break;
// Aggiunta di un nuovo utente

View File

@ -4,20 +4,7 @@ switch ($resource) {
case 'login':
// Controllo sulle credenziali
if (Auth::getInstance()->attempt($request['username'], $request['password'])) {
$user = Auth::user();
// Generazione del token per l'utente
$tokens = $database->fetchArray('SELECT `token` FROM `zz_tokens` WHERE `enabled` = 1 AND `id_utente` = '.prepare($user['id_utente']));
if (empty($tokens)) {
$token = secure_random_string();
$database->insert('zz_tokens', [
'id_utente' => $user['id_utente'],
'token' => $token,
]);
} else {
$token = $tokens[0]['token'];
}
$token = Auth::getInstance()->getToken();
// Informazioni da restituire tramite l'API
$results = $dbo->fetchArray('SELECT `ragione_sociale`, `codice`, `piva`, `codice_fiscale`, `indirizzo`, `citta`, `provincia`, (SELECT `nome` FROM `an_nazioni` WHERE `an_nazioni`.`id` = `an_anagrafiche`.`id_nazione`) AS nazione, `telefono`, `fax`, `cellulare`, `an_anagrafiche`.`email` FROM `zz_users` LEFT JOIN `an_anagrafiche` ON `an_anagrafiche`.`idanagrafica` = `zz_users`.`idanagrafica` WHERE `id` = '.prepare($user['id_utente']))[0];

View File

@ -65,7 +65,7 @@ if (!empty($utenti)) {
// Cambio password e nome utente
echo '
<a href="" data-href="'.$rootdir.'/modules/'.Modules::get($id_module)['directory'].'/user.php?id_utente='.$utente['id'].'&idgruppo='.$record['id'].'" class="text-warning tip" data-toggle="modal" data-target="#bs-popup" title="Aggiorna dati utente"" data-title="Aggiorna dati utente"><i class="fa fa-2x fa-unlock-alt"></i></a>';
<a href="" data-href="'.$rootdir.'/modules/'.Modules::get($id_module)['directory'].'/user.php?id_utente='.$utente['id'].'&idgruppo='.$record['id'].'" class="text-warning tip" data-toggle="modal" data-target="#bs-popup" title="Aggiorna dati utente" data-title="Aggiorna dati utente"><i class="fa fa-2x fa-unlock-alt"></i></a>';
// Eliminazione utente, se diverso da id_utente #1 (admin)
if ($utente['id'] != '1') {

75
modules/utenti/info.php Normal file
View File

@ -0,0 +1,75 @@
<?php
$skip_permissions = true;
include __DIR__.'/../../core.php';
$pageTitle = 'Utente';
if (file_exists($docroot.'/include/custom/top.php')) {
include $docroot.'/include/custom/top.php';
} else {
include $docroot.'/include/top.php';
}
$user = Auth::user();
$token = Auth::getInstance()->getToken();
echo '
<div class="box">
<div class="box-header">
<h3 class="box-title">'.tr("Informazioni sull'utente").'</h3>
</div>
<div class="box-body">';
// Cambio password e nome utente
echo '
<div>
<p>'.tr('Utente').':'.$user['username'].'</p>
<a class="btn btn-info" data-href="'.$rootdir.'/modules/'.Modules::get('Utenti e permessi')['directory'].'/user.php" class="text-warning tip" data-toggle="modal" data-target="#bs-popup" data-title="Cambia password">
<i class="fa fa-unlock-alt"></i> '.tr('Cambia password').'
</a>
</div>';
echo '
<div>
<h4>'.tr('Token personale').': '.$token.'</h4>
<p>'.tr("Puoi utilizzare il token per accedere all'API del gestionale e per visualizzare il calendario su applicazioni esterne").'</p>
</div>';
$link = BASEURL.'/api/?token='.$token.'&resource=sync';
echo '
<h3>'.tr('Calendario interventi').'</h3>
<div>
<p>'.tr("Per accedere al calendario eventi attraverso l'API, accedi al seguente link").':</p>
<a href="'.$link.'" target="_blank">'.$link.'</a>
</div>
<br>
<h4>'.tr('Configurazione').'</h4>
<div>
<p>'.tr('Per _ANDROID_, scarica _LINK_', [
'_ANDROID_' => '<b>'.tr('Android').'</b>',
'_LINK_' => '<a href="https://play.google.com/store/apps/details?id=org.kc.and.ical&hl=it" target="_blank"><b>'.tr('iCalSync2').'</b></a>',
]).'.</p>
<p>'.tr("Per _APPLE_, puoi configurare un nuovo calendario dall'app standard del calendario", [
'_APPLE_' => '<b>'.tr('Apple').'</b>',
]).'.</p>
<p>'.tr('Per _PC_ e altri client di posta, considerare le relative funzionalità o eventuali plugin delle relative applicazioni', [
'_PC_' => '<b>'.tr('PC').'</b>',
]).'.</p>
</div>';
echo '
</div>
</div>';
if (file_exists($docroot.'/include/custom/bottom.php')) {
include $docroot.'/include/custom/bottom.php';
} else {
include $docroot.'/include/bottom.php';
}

View File

@ -1,60 +0,0 @@
<?php
include __DIR__.'/../../core.php';
?>
<div class="text-center">
<h4>Per generare il link per visualizzare il calendario su applicazioni esterne, inserisci username e password qui sotto, poi copia il link nella tua applicazione:</h4>
</div>
<br>
<div class="row fields">
<div class="col-md-offset-3 col-md-3">
<div class="form-group">
<label>Username:</label>
<input type="text" class="form-control" id="username">
</div>
</div>
<div class="col-md-3">
<div class="form-group">
<label>Password:</label>
<input type="password" class="form-control" id="password">
</div>
</div>
</div>
<div class="row fields">
<div class="col-md-offset-3 col-md-6">
<div class="form-group">
<label>LINK:</label>
<input type="text" class="form-control text-center" id="link" value="">
</div>
</div>
</div>
<div class="row fields">
<div class="col-md-offset-3 col-md-6">
Per <b>Android</b>, scarica <a href="https://play.google.com/store/apps/details?id=org.kc.and.ical&hl=it" target="_blank"><b>iCalSync2</b></a>.<br><br>
Per <b>Apple</b>, puoi configurare un nuovo calendario dall'app standard del calendario, specificando l'URL sopra.<br><br>
Per <b>PC</b>, per altri client di posta, considerare le relative funzionalit&agrave; o eventuali plugin.
</div>
</div>
<script>
$('.fields input').on('keyup change', function(){
$('#link').val( "<?php echo $rootdir; ?>/modules/osmsync/sync_interventi.php?username="+$('#username').val()+"&password="+$('#password').val() );
});
$('#link').on('click', function(){
$(this).select();
});
$('.fields input').trigger('change');
</script>

View File

@ -6,18 +6,26 @@ include_once __DIR__.'/../../core.php';
$min_length = 8;
$min_length_username = 4;
$idgruppo = intval(filter('idgruppo'));
$id_utente = filter('id_utente');
$self_edit = Modules::getPermission('Utenti e permessi') == 'rw' && filter('id_utente') != null;
if ($self_edit) {
$idgruppo = intval(filter('idgruppo'));
$id_utente = filter('id_utente');
} else {
$user = Auth::user();
$id_utente = $user['id'];
}
if (!empty($id_utente)) {
$value = 'change_pwd';
$op = 'change_pwd';
$message = tr('Modifica');
$rs = $dbo->fetchArray('SELECT idanagrafica, idtipoanagrafica, username FROM zz_users WHERE id='.prepare($id_utente));
$username = $rs[0]['username'];
$id_anagrafica = $rs[0]['idtipoanagrafica'].'-'.$rs[0]['idanagrafica'];
} else {
$value = 'adduser';
$op = 'adduser';
$message = tr('Aggiungi');
$username = '';
@ -26,46 +34,62 @@ if (!empty($id_utente)) {
echo '
<form id="link_form" action="'.$rootdir.'/editor.php?id_module='.Modules::get('Utenti e permessi')['id'].'&id_record='.$idgruppo.'" method="post">
<input type="hidden" name="op" value="'.$value.'">
<input type="hidden" name="backto" value="record-edit">
<input type="hidden" name="op" value="'.$op.'">
<input type="hidden" name="min_length" value="'.$min_length.'">
<input type="hidden" name="min_length_username" value="'.$min_length_username.'">';
<input type="hidden" name="min_length_username" value="'.$min_length_username.'">';
if (!empty($id_utente)) {
echo '
<input type="hidden" name="id_utente" value="'.$id_utente.'">';
}
echo '
if ($self_edit) {
echo '
<input type="hidden" name="backto" value="record-edit">
<div class="row">
<div class="col-xs-12">
{[ "type": "text", "label": "'.tr('Username').'", "name": "username", "required": 1, "value": "'.$username.'" ]}
</div>
</div>
</div>';
} else {
echo '
<input type="hidden" id="username" name="username" value="'.$username.'">';
}
echo '
<div class="row">
<div class="col-xs-12">
{[ "type": "password", "label": "'.tr('Password').'", "name": "password1", "required": 1, "value": "" ]}
</div>
</div>
</div>';
echo '
<div class="row">
<div class="col-xs-12">
{[ "type": "password", "label": "'.tr('Ripeti la password').'", "name": "password2", "value": "" ]}
</div>
</div>';
echo '
if ($self_edit) {
echo '
<div class="row">
<div class="col-xs-12">
{[ "type": "select", "label": "'.tr('Collega ad una anagrafica').'", "name": "idanag", "values": "query=SELECT CONCAT(`an_tipianagrafiche`.`idtipoanagrafica`, \'-\', `an_anagrafiche`.`idanagrafica`) AS \'id\', `ragione_sociale` AS \'descrizione\', `descrizione` AS \'optgroup\' FROM `an_tipianagrafiche` INNER JOIN `an_tipianagrafiche_anagrafiche` ON `an_tipianagrafiche`.`idtipoanagrafica`=`an_tipianagrafiche_anagrafiche`.`idtipoanagrafica` INNER JOIN `an_anagrafiche` ON `an_anagrafiche`.`idanagrafica`=`an_tipianagrafiche_anagrafiche`.`idanagrafica` ORDER BY `descrizione` ASC", "value": "'.$id_anagrafica.'" ]}
</div>
</div>';
</div>';
} else {
echo '
<input type="hidden" id="idanag" name="idanag" value="'.$id_anagrafica.'">';
}
echo '
<button type="button" onclick="do_submit()" class="btn btn-primary"><i class="fa fa-plus"></i> '.$message.'</button>
</form>
<script type="text/javascript">
var min_length = '.$min_length.';
var min_length_username = '.$min_length_username.';

View File

@ -247,6 +247,37 @@ class Auth extends \Util\Singleton
return $this->infos;
}
/**
* Restituisce il token di accesso all'API per l'utente autenticato.
*
* @return string
*/
public function getToken()
{
$token = null;
if ($this->isAuthenticated()) {
$user = self::user();
$database = Database::getConnection();
$tokens = $database->fetchArray('SELECT `token` FROM `zz_tokens` WHERE `enabled` = 1 AND `id_utente` = '.prepare($user['id_utente']));
// Generazione del token per l'utente
if (empty($tokens)) {
$token = secure_random_string();
$database->insert('zz_tokens', [
'id_utente' => $user['id_utente'],
'token' => $token,
]);
} else {
$token = $tokens[0]['token'];
}
}
return $token;
}
/**
* Distrugge le informazioni riguardanti l'utente autenticato, forzando il logout.
*/