Bugfix
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:
parent
c25aff729f
commit
d47fbd3fcc
|
@ -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();
|
||||
|
|
|
@ -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.
|
||||
*
|
||||
|
|
|
@ -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'];
|
||||
|
|
|
@ -910,20 +910,8 @@ 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();
|
||||
}
|
||||
$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
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -29,13 +29,11 @@ switch (filter('op')) {
|
|||
$password_rep = filter('password2');
|
||||
|
||||
// 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!'));
|
||||
}
|
||||
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!');
|
||||
|
@ -81,13 +79,11 @@ switch (filter('op')) {
|
|||
|
||||
if ($n == 0) {
|
||||
// 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!'));
|
||||
}
|
||||
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();
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue