1
0
mirror of https://github.com/devcode-it/openstamanager.git synced 2025-02-16 19:40:44 +01:00

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'; include_once __DIR__.'/../core.php';
$paths = App::getPaths(); $paths = App::getPaths();
$user = Auth::user();
// Istanziamento della barra di debug // Istanziamento della barra di debug
if (!empty($debug)) { if (!empty($debug)) {
@ -210,7 +211,10 @@ if (Auth::check()) {
<!-- Sidebar user panel --> <!-- Sidebar user panel -->
<div class="user-panel text-center info"> <div class="user-panel text-center info">
<div class="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> <p id="datetime"></p>
</div> </div>

View File

@ -3,9 +3,9 @@ include_once __DIR__.'/core.php';
$pageTitle = 'Info'; $pageTitle = 'Info';
if (file_exists($docroot.'/include/custom/top.php')) { if (file_exists($docroot.'/include/custom/top.php')) {
include($docroot.'/include/custom/top.php'); include $docroot.'/include/custom/top.php';
} else { } else {
include($docroot.'/include/top.php'); include $docroot.'/include/top.php';
} }
?> ?>
<div class="box"> <div class="box">
@ -20,7 +20,7 @@ if (file_exists($docroot.'/include/custom/top.php')) {
<div class="box-body"> <div class="box-body">
<?php <?php
if (file_exists('assistenza.php')) { if (file_exists('assistenza.php')) {
include('assistenza.php'); include 'assistenza.php';
} else { } else {
?> ?>
<div class="row"> <div class="row">
@ -144,9 +144,7 @@ if (file_exists('assistenza.php')) {
<?php <?php
if (file_exists($docroot.'/include/custom/bottom.php')) { if (file_exists($docroot.'/include/custom/bottom.php')) {
include($docroot.'/include/custom/bottom.php'); include $docroot.'/include/custom/bottom.php';
} else { } 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!'); $_SESSION['errors'][] = tr('Utente già esistente!');
} }
} }
if (empty($id_record)) {
redirect(ROOTDIR.'/modules/utenti/info.php');
}
break; break;
// Aggiunta di un nuovo utente // Aggiunta di un nuovo utente

View File

@ -4,20 +4,7 @@ switch ($resource) {
case 'login': case 'login':
// Controllo sulle credenziali // Controllo sulle credenziali
if (Auth::getInstance()->attempt($request['username'], $request['password'])) { if (Auth::getInstance()->attempt($request['username'], $request['password'])) {
$user = Auth::user(); $token = Auth::getInstance()->getToken();
// 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'];
}
// Informazioni da restituire tramite l'API // 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]; $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 // Cambio password e nome utente
echo ' 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) // Eliminazione utente, se diverso da id_utente #1 (admin)
if ($utente['id'] != '1') { 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 = 8;
$min_length_username = 4; $min_length_username = 4;
$idgruppo = intval(filter('idgruppo')); $self_edit = Modules::getPermission('Utenti e permessi') == 'rw' && filter('id_utente') != null;
$id_utente = filter('id_utente');
if ($self_edit) {
$idgruppo = intval(filter('idgruppo'));
$id_utente = filter('id_utente');
} else {
$user = Auth::user();
$id_utente = $user['id'];
}
if (!empty($id_utente)) { if (!empty($id_utente)) {
$value = 'change_pwd'; $op = 'change_pwd';
$message = tr('Modifica'); $message = tr('Modifica');
$rs = $dbo->fetchArray('SELECT idanagrafica, idtipoanagrafica, username FROM zz_users WHERE id='.prepare($id_utente)); $rs = $dbo->fetchArray('SELECT idanagrafica, idtipoanagrafica, username FROM zz_users WHERE id='.prepare($id_utente));
$username = $rs[0]['username']; $username = $rs[0]['username'];
$id_anagrafica = $rs[0]['idtipoanagrafica'].'-'.$rs[0]['idanagrafica']; $id_anagrafica = $rs[0]['idtipoanagrafica'].'-'.$rs[0]['idanagrafica'];
} else { } else {
$value = 'adduser'; $op = 'adduser';
$message = tr('Aggiungi'); $message = tr('Aggiungi');
$username = ''; $username = '';
@ -26,46 +34,62 @@ if (!empty($id_utente)) {
echo ' echo '
<form id="link_form" action="'.$rootdir.'/editor.php?id_module='.Modules::get('Utenti e permessi')['id'].'&id_record='.$idgruppo.'" method="post"> <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="op" value="'.$op.'">
<input type="hidden" name="backto" value="record-edit">
<input type="hidden" name="min_length" value="'.$min_length.'"> <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)) { if (!empty($id_utente)) {
echo ' echo '
<input type="hidden" name="id_utente" value="'.$id_utente.'">'; <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="row">
<div class="col-xs-12"> <div class="col-xs-12">
{[ "type": "text", "label": "'.tr('Username').'", "name": "username", "required": 1, "value": "'.$username.'" ]} {[ "type": "text", "label": "'.tr('Username').'", "name": "username", "required": 1, "value": "'.$username.'" ]}
</div> </div>
</div> </div>';
} else {
echo '
<input type="hidden" id="username" name="username" value="'.$username.'">';
}
echo '
<div class="row"> <div class="row">
<div class="col-xs-12"> <div class="col-xs-12">
{[ "type": "password", "label": "'.tr('Password').'", "name": "password1", "required": 1, "value": "" ]} {[ "type": "password", "label": "'.tr('Password').'", "name": "password1", "required": 1, "value": "" ]}
</div> </div>
</div> </div>';
echo '
<div class="row"> <div class="row">
<div class="col-xs-12"> <div class="col-xs-12">
{[ "type": "password", "label": "'.tr('Ripeti la password').'", "name": "password2", "value": "" ]} {[ "type": "password", "label": "'.tr('Ripeti la password').'", "name": "password2", "value": "" ]}
</div> </div>
</div>'; </div>';
echo ' if ($self_edit) {
echo '
<div class="row"> <div class="row">
<div class="col-xs-12"> <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.'" ]} {[ "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>'; </div>';
} else {
echo '
<input type="hidden" id="idanag" name="idanag" value="'.$id_anagrafica.'">';
}
echo ' echo '
<button type="button" onclick="do_submit()" class="btn btn-primary"><i class="fa fa-plus"></i> '.$message.'</button> <button type="button" onclick="do_submit()" class="btn btn-primary"><i class="fa fa-plus"></i> '.$message.'</button>
</form> </form>
<script type="text/javascript"> <script type="text/javascript">
var min_length = '.$min_length.'; var min_length = '.$min_length.';
var min_length_username = '.$min_length_username.'; var min_length_username = '.$min_length_username.';

View File

@ -247,6 +247,37 @@ class Auth extends \Util\Singleton
return $this->infos; 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. * Distrugge le informazioni riguardanti l'utente autenticato, forzando il logout.
*/ */