1
0
mirror of https://github.com/devcode-it/openstamanager.git synced 2025-02-16 19:40:44 +01:00
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 static $passwordOptions = [
protected $first_module;
protected $passwordOptions = [
'algorithm' => PASSWORD_BCRYPT, 'algorithm' => PASSWORD_BCRYPT,
'options' => [], 'options' => [],
]; ];
protected $infos;
protected $first_module;
protected function __construct() protected function __construct()
{ {
$database = Database::getConnection(); $database = Database::getConnection();
@ -126,7 +126,7 @@ class Auth extends \Util\Singleton
// Nuova versione // Nuova versione
if (password_verify($password, $hash)) { 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; $result = true;
} }
@ -134,7 +134,7 @@ class Auth extends \Util\Singleton
// Controllo in automatico per futuri cambiamenti dell'algoritmo di password // Controllo in automatico per futuri cambiamenti dell'algoritmo di password
if ($rehash) { if ($rehash) {
$database = Database::getConnection(); $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; return $result;
@ -202,7 +202,7 @@ class Auth extends \Util\Singleton
if (empty($this->first_module)) { if (empty($this->first_module)) {
$query = 'SELECT id FROM zz_modules WHERE enabled = 1'; $query = 'SELECT id FROM zz_modules WHERE enabled = 1';
if (!$this->isAdmin()) { 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(); $database = Database::getConnection();
@ -225,6 +225,11 @@ class Auth extends \Util\Singleton
return $this->first_module; return $this->first_module;
} }
public static function hashPassword($password)
{
return password_hash($password, self::$passwordOptions['algorithm'], self::$passwordOptions['options']);
}
public static function check() public static function check()
{ {
return self::getInstance()->isAuthenticated(); return self::getInstance()->isAuthenticated();

View File

@ -337,7 +337,9 @@ class Database extends Util\Singleton
*/ */
protected function quote($string) 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. * 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); $dbo->query($query);
// Elimino la riga dal ddt // 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; return true;
} }
@ -109,7 +109,7 @@ function get_imponibile_ddt($idddt)
{ {
global $dbo; 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); $rs = $dbo->fetchArray($query);
return $rs[0]['imponibile']; return $rs[0]['imponibile'];

View File

@ -910,21 +910,9 @@ switch (post('op')) {
// Inserimento riga normale // Inserimento riga normale
elseif ($qta != 0) { 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).'))'); $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(); $idriga = $dbo->lastInsertedID();
} }
}
// Scalo la quantità dall'ordine // Scalo la quantità dall'ordine
$dbo->query('UPDATE or_righe_ordini SET qta_evasa = qta_evasa+'.$qta.' WHERE id='.prepare($idrigaordine)); $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 // 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 // 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)); $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 // Verifico che la password sia di almeno x caratteri
if (strlen($password) < $min_length) { if (strlen($password) < $min_length) {
$_SESSION['errors'][] = str_replace('_MIN_', $min_length, _('La password deve essere lunga almeno _MIN_ caratteri!')); $_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'); $_SESSION['errors'][] = _('Le password non coincidono');
} } else {
else{
$dbo->query('UPDATE zz_users SET password='.prepare(Auth::hashPassword($password)).' WHERE idutente='.prepare($id_utente)); $dbo->query('UPDATE zz_users SET password='.prepare(Auth::hashPassword($password)).' WHERE idutente='.prepare($id_utente));
$_SESSION['infos'][] = _('Password aggiornata!'); $_SESSION['infos'][] = _('Password aggiornata!');
@ -83,11 +81,9 @@ switch (filter('op')) {
// Verifico che la password sia di almeno x caratteri // Verifico che la password sia di almeno x caratteri
if (strlen($password) < $min_length) { if (strlen($password) < $min_length) {
$_SESSION['errors'][] = str_replace('_MIN_', $min_length, _('La password deve essere lunga almeno _MIN_ caratteri!')); $_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'); $_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, '')")) { 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()).')'); $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']); $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); $dbo->query($query);
ob_end_clean(); ob_end_clean();

View File

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