Bugfix vari (#16, #17) e aggiunta dei metodi semplificati per gestire le relazioni tra tabelle (sync, attach, detach - esempio di utilizzo nell'aggiornamento dei permessi per le Viste).
This commit is contained in:
Thomas Zilio 2017-08-24 10:39:32 +02:00
parent c25aff729f
commit d47fbd3fcc
7 changed files with 109 additions and 41 deletions

View File

@ -26,14 +26,14 @@ class Auth extends \Util\Singleton
],
];
protected $infos;
protected $first_module;
protected $passwordOptions = [
protected static $passwordOptions = [
'algorithm' => PASSWORD_BCRYPT,
'options' => [],
];
protected $infos;
protected $first_module;
protected function __construct()
{
$database = Database::getConnection();
@ -126,7 +126,7 @@ class Auth extends \Util\Singleton
// Nuova versione
if (password_verify($password, $hash)) {
$rehash = password_needs_rehash($hash, $this->passwordOptions['algorithm'], $this->passwordOptions['options']);
$rehash = password_needs_rehash($hash, self::$passwordOptions['algorithm'], self::$passwordOptions['options']);
$result = true;
}
@ -134,7 +134,7 @@ class Auth extends \Util\Singleton
// Controllo in automatico per futuri cambiamenti dell'algoritmo di password
if ($rehash) {
$database = Database::getConnection();
$database->update('zz_users', ['password' => password_hash($password, $this->passwordOptions['algorithm'], $this->passwordOptions['options'])], ['idutente' => $user_id]);
$database->update('zz_users', ['password' => self::hashPassword($password)], ['idutente' => $user_id]);
}
return $result;
@ -202,7 +202,7 @@ class Auth extends \Util\Singleton
if (empty($this->first_module)) {
$query = 'SELECT id FROM zz_modules WHERE enabled = 1';
if (!$this->isAdmin()) {
$query .= ' AND id IN (SELECT idmodule FROM zz_permissions WHERE idgruppo = (SELECT id FROM zz_groups WHERE nome = '.prepare($_SESSION['gruppo']).") AND permessi IN ('r', 'rw'))";
$query .= ' AND id IN (SELECT idmodule FROM zz_permissions WHERE idgruppo = (SELECT id FROM zz_groups WHERE nome = '.prepare($this->getUser()['gruppo']).") AND permessi IN ('r', 'rw'))";
}
$database = Database::getConnection();
@ -225,6 +225,11 @@ class Auth extends \Util\Singleton
return $this->first_module;
}
public static function hashPassword($password)
{
return password_hash($password, self::$passwordOptions['algorithm'], self::$passwordOptions['options']);
}
public static function check()
{
return self::getInstance()->isAuthenticated();

View File

@ -337,7 +337,9 @@ class Database extends Util\Singleton
*/
protected function quote($string)
{
return '`'.str_replace('`', '', $string).'`';
$char = '`';
return $char.str_replace($char, '', $string).$char;
}
/**
@ -486,6 +488,77 @@ class Database extends Util\Singleton
}
}
public function sync($table, $conditions, $list)
{
if (
!is_string($table) ||
!is_array($conditions) ||
!is_array($list)
) {
throw new UnexpectedValueException();
}
$field = key($list);
$sync = array_unique((array) current($list));
if (!empty($field)) {
$results = array_column($this->fetchArray('SELECT '.$this->quote($field).' FROM '.$this->quote($table).' WHERE '.$this->whereStatement($conditions)), $field);
$detachs = array_unique(array_diff($results, $sync));
$this->detach($table, $conditions, [$field => $detachs]);
$this->attach($table, $conditions, $list);
}
}
public function attach($table, $conditions, $list)
{
if (
!is_string($table) ||
!is_array($conditions) ||
!is_array($list)
) {
throw new UnexpectedValueException();
}
$field = key($list);
$sync = array_unique((array) current($list));
if (!empty($field)) {
$results = array_column($this->fetchArray('SELECT '.$this->quote($field).' FROM '.$this->quote($table).' WHERE '.$this->whereStatement($conditions)), $field);
$inserts = array_unique(array_diff($sync, $results));
foreach ($inserts as $insert) {
$this->insert($table, array_merge($conditions, [$field => $insert]));
}
}
}
public function detach($table, $conditions, $list)
{
if (
!is_string($table) ||
!is_array($conditions) ||
!is_array($list)
) {
throw new UnexpectedValueException();
}
$field = key($list);
$sync = array_unique((array) current($list));
if (!empty($field) && !empty($sync)) {
$where = $this->whereStatement($conditions);
$in = [];
foreach ($sync as $value) {
$in[] = $this->prepare($value);
}
$this->query('DELETE FROM '.$this->quote($table).' WHERE '.$where.(!empty($where) ? ' AND ' : '').$this->quote($field).' IN ('.implode(', ', $in).')');
}
}
/**
* Predispone una variabile per il relativo inserimento all'interno di uno statement SQL.
*

View File

@ -97,7 +97,7 @@ function rimuovi_articolo_daddt($idarticolo, $idddt, $idrigaddt)
$dbo->query($query);
// Elimino la riga dal ddt
$dbo->query('DELETE FROM `dt_righe_ddt` WHERE idgruppo='.prepare($idgruppo));
$dbo->query('DELETE FROM `dt_righe_ddt` WHERE idgruppo='.prepare($idgruppo).' AND idddt='.prepare($idddt));
return true;
}
@ -109,7 +109,7 @@ function get_imponibile_ddt($idddt)
{
global $dbo;
$query = "SELECT SUM(subtotale-sconto) AS imponibile FROM dt_righe_ddt GROUP BY idddt HAVING idddt='".$idddt."'";
$query = 'SELECT SUM(subtotale-sconto) AS imponibile FROM dt_righe_ddt GROUP BY idddt HAVING idddt='.prepare($idddt);
$rs = $dbo->fetchArray($query);
return $rs[0]['imponibile'];

View File

@ -910,21 +910,9 @@ switch (post('op')) {
// Inserimento riga normale
elseif ($qta != 0) {
// Se la riga che sto inserendo è simile ad altre già inserite, aggiorno solo la quantità...
$query = 'SELECT id FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).' AND descrizione='.prepare($descrizione).' AND (subtotale/qta)='.($subtot / $qta).' AND um='.prepare($um).' AND sconto='.prepare($sconto / $qta).' AND idiva='.prepare($idiva);
$rs = $dbo->fetchArray($query);
if (sizeof($rs) > 0) {
$dbo->query('UPDATE co_righe_documenti SET qta=qta+'.$qta.' WHERE id='.prepare($rs[0]['id']));
$idriga = $rs[0]['id'];
}
// ...altrimenti aggiungo una nuova riga
else {
$dbo->query('INSERT INTO co_righe_documenti(iddocumento, idarticolo, idordine, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, um, qta, idgruppo, `order`) VALUES('.prepare($id_record).', '.prepare($idarticolo).', '.prepare($idordine).', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($um).', '.prepare($qta).', (SELECT IFNULL(MAX(`idgruppo`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'), (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))');
$idriga = $dbo->lastInsertedID();
}
}
// Scalo la quantità dall'ordine
$dbo->query('UPDATE or_righe_ordini SET qta_evasa = qta_evasa+'.$qta.' WHERE id='.prepare($idrigaordine));

View File

@ -735,7 +735,7 @@ function rimuovi_articolo_dafattura($idarticolo, $iddocumento, $idrigadocumento)
}
// Elimino la riga dal documento
$dbo->query('DELETE FROM `co_righe_documenti` WHERE idgruppo='.prepare($idgruppo));
$dbo->query('DELETE FROM `co_righe_documenti` WHERE idgruppo='.prepare($idgruppo).' AND iddocumento='.prepare($iddocumento));
// Elimino i movimenti avvenuti nel magazzino per questo articolo lotto, serial, altro
$dbo->query('DELETE FROM `mg_movimenti` WHERE idarticolo = '.prepare($idarticolo).' AND iddocumento = '.prepare($iddocumento).' AND id = '.prepare($idrigadocumento));

View File

@ -31,11 +31,9 @@ switch (filter('op')) {
// Verifico che la password sia di almeno x caratteri
if (strlen($password) < $min_length) {
$_SESSION['errors'][] = str_replace('_MIN_', $min_length, _('La password deve essere lunga almeno _MIN_ caratteri!'));
}
elseif($password != $password_rep){
} elseif ($password != $password_rep) {
$_SESSION['errors'][] = _('Le password non coincidono');
}
else{
} else {
$dbo->query('UPDATE zz_users SET password='.prepare(Auth::hashPassword($password)).' WHERE idutente='.prepare($id_utente));
$_SESSION['infos'][] = _('Password aggiornata!');
@ -83,11 +81,9 @@ switch (filter('op')) {
// Verifico che la password sia di almeno x caratteri
if (strlen($password) < $min_length) {
$_SESSION['errors'][] = str_replace('_MIN_', $min_length, _('La password deve essere lunga almeno _MIN_ caratteri!'));
}
elseif($password != $password_rep){
} elseif ($password != $password_rep) {
$_SESSION['errors'][] = _('Le password non coincidono');
}
else{
} else {
if ($dbo->query('INSERT INTO zz_users(idgruppo, username, password, idanagrafica, idtipoanagrafica, enabled, email) VALUES('.prepare($id_record).', '.prepare($username).', '.prepare(Auth::hashPassword($password)).', '.prepare($idanagrafica).', '.prepare($idtipoanagrafica).", 1, '')")) {
$dbo->query('INSERT INTO `zz_tokens` (`id_utente`, `token`) VALUES ('.prepare($dbo->lastInsertedID()).', '.prepare(secure_random_string()).')');
@ -151,6 +147,16 @@ switch (filter('op')) {
$query = 'UPDATE zz_permissions SET permessi='.prepare($permessi).' WHERE id='.prepare($rs[0]['id']);
}
// Aggiunta dei permessi relativi alle viste
$count = $dbo->fetchArray('SELECT COUNT(*) AS count FROM `zz_group_view` WHERE `id_gruppo` = '.prepare($id_record).' AND `id_vista` IN (SELECT `id` FROM `zz_views` WHERE `id_module`='.prepare($idmodulo).')');
if (empty($count[0]['count'])) {
$results = $dbo->fetchArray('SELECT `id_vista` FROM `zz_group_view` WHERE `id_vista` IN (SELECT `id` FROM `zz_views` WHERE `id_module`='.prepare($idmodulo).')');
foreach ($results as $result) {
$dbo->attach('zz_group_view', ['id_vista' => $result['id_vista']], ['id_gruppo' => $id_record]);
}
}
$dbo->query($query);
ob_end_clean();

View File

@ -39,7 +39,6 @@ switch (filter('op')) {
case 'fields':
$rs = true;
$dbo->query('DELETE FROM `zz_group_view` WHERE `id_vista` IN (SELECT `id` FROM `zz_views` WHERE `id_module`='.prepare($id_record).')');
foreach ((array) $post['query'] as $c => $k) {
// Fix per la protezone contro XSS
$post['query'][$c] = htmlspecialchars_decode($post['query'][$c], ENT_QUOTES);
@ -70,11 +69,8 @@ switch (filter('op')) {
$id = $dbo->lastInsertedID();
}
// Aggiunta dei permessi relativi
$gruppi = array_unique((array) $post['gruppi'][$c]);
foreach ($gruppi as $gruppo) {
$dbo->query('INSERT INTO `zz_group_view` (`id_gruppo`, `id_vista`) VALUES ('.prepare($gruppo).', '.prepare($id).')');
}
// Aggiornamento dei permessi relativi
$dbo->sync('zz_group_view', ['id_vista' => $id], ['id_gruppo' => (array) $post['gruppi'][$c]]);
} else {
$rs = false;
}