Permessi forum gdrcd
Permessi forum gdrcd postato il 06/07/2021 16:44:47 nel forum programmazione, open source e hosting e modificato da haruka il 06/07/2021 16:45:08
Il forum è la cosa peggiore di gdrcd. By the way...
Vorrei poter creare un forum comune a due gilde. Le sto provando tutte ma non ne vengo a capo.
Dunque, in land un pg può far parte di max due corporazioni.
Quindi al momento ho un pg che fa parte della corporazione 4 e della corporazione 24.
In database ho modificato la tabella araldo, al campo "proprietari", per essere varchar e l'araldo in questione (il forum per intenderci) al momento riporta "4, 24".
In visit.inc.php avevo già messo delle limitazioni. Al momento il codice è:
//Il codice a seguire interessa tutte le bacheche non gestionegilda.
else if((($row['tipo'] == SOLORAZZA) && ($_SESSION['id_razza'] != $row['proprietari']) && ($_SESSION['permessi'] < MODERATOR)) || (($row['tipo'] == SOLOGILDA) && (strpos($_SESSION['gilda'], '*'.$row['proprietari'].'*') === false) && ($_SESSION['permessi'] < MODERATOR)) || (($row['tipo'] >= SOLOSUPPORTO) && ($_SESSION['permessi'] < VICEMASTER)) || (($row['tipo'] >= SOLOMASTERS) && ($_SESSION['permessi'] < GAMEMASTER)) || (($row['tipo'] >= SOLOMODERATORS) && ($_SESSION['permessi'] < MODERATOR))) {
/*Restrizione di visualizzazione solo master e admin*/
echo '<div class="error">Errore: non puoi visualizzare questa bacheca perché non fai parte di questa corporazione</div>';
?>
<div class="link_back">
<a href="main.php?page=forum">
<?php echo gdrcd_filter('out', $MESSAGE['interface']['forums']['link']['back']); ?>
</a>
</div>
<?php
}]
In pratica, mi restituisce l'errore se il pg non fa parte di una data corporazione o se non è almeno moderator.
Il problema, mi pare di capire ma ci sto diventando scema, è tutto qua:
(($row['tipo'] == SOLOGILDA) && (strpos($_SESSION['gilda'], '*'.$row['proprietari'].'*') === false) && ($_SESSION['permessi'] < MODERATOR)) ||
perché se al posto di "4,24" io metto solo 4, o solo 24, il pg accede tranquillamente alla bacheca. In altre parole, sono una capretta io nel non riuscire a comparare quei i due valori: i proprietari della bacheca e le gilde nella sessione del personaggio.
Qualche suggerimento su come far funzionare quella parte di codice? Vorrei, semplicemente, che i due valori venissero comparati e non vedermi spuntare l'errore di corporazione se uno dei due possibili valori di ($_SESSION['gilda'] è presente nel campo proprietari della tabella.
Pagine → 1 2
06/07/2021 17:34:30 e modificato da quod il 06/07/2021 17:37:06
haruka ha scritto:
In database ho modificato la tabella araldo, al campo "proprietari", per essere varchar
Uhmmm... non era meglio un SET?
A ogni modo, da quanto hai scritto direi che il controllo che fallisce è palesemente questo:
(strpos($_SESSION['gilda'], '*'.$row['proprietari'].'*') === false)
La prima cosa che proverei a fare è stampare quello che stai confrontando:
var_dump($_SESSION['gilda']);
var_dump($row['proprietari']);
Cosa ti esce?
06/07/2021 17:38:07 e modificato da haruka il 06/07/2021 17:38:42
quod ha scritto:
...
Cosa ti esce?
Sì in effetti (per il set).
Allora, viene fuori questo:
string(9) ",*24*,*4*" string(1) "4"
06/07/2021 17:43:00 e modificato da quod il 06/07/2021 17:48:55
Allora il problema sono gli asterischi.
Nella stringa proprietario (del controllo che fallisce) avrai "24,4", ma nella stringa di sessione hai "*24*,*4*"... e chiaramente la prima stringa non è una sottostringa della seconda (per cui il controllo fallisce).
Peggio ancora, anche senza gli asterischi potresti avere "4,24" che non è una sottostringa di "24,4" (perchè a quel punto anche l'ordine è importante).
06/07/2021 17:56:03 e modificato da haruka il 06/07/2021 17:56:28
Provo un attimo a raddrizzare il tiro. Fermo restando che i proprietari dell'araldo sono 4, 24; Per far coincidere il var_dump con il codice che ho nel controllo ho messo
var_dump($_SESSION['gilda']);
var_dump('*'.$row['proprietari'].'*');
che mi restituisce
string(9) ",*24*,*4*" string(7) "*4, 24*"
Quindi mi sto avvicinando ma non ci sono ancora.
Quasi quasi provo con explode...
06/07/2021 18:07:38 e modificato da kasa il 06/07/2021 18:09:27
Allora...
In realtà i problemi sono molteplici.
Oltre agli asterischi, che nonostante vengano poi messi nel momento del controllo,
'*'.$row['proprietari'].'*'
Il problema è proprio legato a come vengono valorizzate le due variabili.
La variabile $_SESSION['gilda'] assume, in fase di login, i valori delle Corporazioni a cui appartiene il Personaggio, in questo caso la 4 e la 24, ma non vengono concatenate bene e, di fatto, c'è una fastidiosa ',' che potrebbe dare fastidio in qualsiasi controllo. In ogni caso, viene valorizzata appunto come ',*4*,*24*'.
La stringa su cui viene effettuato il controllo con il metodo strpos() (questo non fa altro che controllare se nella prima variabile passata, in questo caso, $_SESSION['gilda'], è presente il valore '*'.$row['proprietari'].'*') è tendenzialmente formata da *4,24*. Ci sono, diciamo, degli asterischi di troppo... ed anche se non ci fossero, ci sarebbe il problema, come giustamente ha detto @quod, dei valori invertiti, che non garantirebbe l'accesso.
Credo che la soluzione migliore sia quella di prevedere una sorta di controllo fatto ad hoc per queste occasioni.
Una cosa del genere, da mettere in function.inc.php o dove si vuole.
function gdrcd_controllo_permessi_gilda_bacheche($proprietari) {
// Inizializzo il controllo
$result = FALSE;
// Metto i proprietari in un array
$arrayProprietari = explode(',', $proprietari);
foreach($arrayProprietari AS $proprietario) {
// Se ho già ottenuto un controllo positivo, proseguo
if($result === TRUE) continue;
// Controllo che il proprietario sia presente nelle Gilde del Personaggio
$result = (bool)strpos($_SESSION['gilda'], '*' . $proprietario . '*');
}
return $result;
}
Non è elegantissima, ma dovrebbe fare il suo lavoro.
E a quel punto, la sostituisci al punto di controllo delle gilde.
Ossia, al posto di questo:
(strpos($_SESSION['gilda'], '*'.$row['proprietari'].'*') === false)
Metti questo:
gdrcd_controllo_permessi_gilda_bacheche($row['proprietari'])
Il controllo DOVREBBE (non ho testato proprio su GDRCD, al massimo apro la versione vanilla e ti dico) funzionare, poiché al posto di fare un controllo superficiale CICLA tutti i proprietari che hai inserito (separati SOLO da virgola) e va a matcharli con quelli della sessione dell'utente.
P.S.:
In generale, la gestione dei permessi è molto un casotto. Bacheche e tanto altro sono quasi una conseguenza a questo.
Kasa.
06/07/2021 18:29:08 e modificato da haruka il 06/07/2021 18:32:01
Intanto grazie ad entrambi.
Procedo per tentativi.
Ho inserito il tuo codice, kasa, e il controllo è diventato
else if((($row['tipo'] == SOLORAZZA) && ($_SESSION['id_razza'] != $row['proprietari']) && ($_SESSION['permessi'] < MODERATOR)) || (($row['tipo'] == SOLOGILDA) && (gdrcd_controllo_permessi_gilda_bacheche($row['proprietari'])) && ($_SESSION['permessi'] < MODERATOR)) || (($row['tipo'] >= SOLOSUPPORTO) && ($_SESSION['permessi'] < VICEMASTER)) || (($row['tipo'] >= SOLOMASTERS) && ($_SESSION['permessi'] < GAMEMASTER)) || (($row['tipo'] >= SOLOMODERATORS) && ($_SESSION['permessi'] < MODERATOR))) {
/*Restrizione di visualizzazione solo master e admin*/
echo '<div class="error">Errore: non puoi visualizzare questa bacheca perché non fai parte di questa corporazione</div>';
?>
<div class="link_back">
<a href="main.php?page=forum">
<?php echo gdrcd_filter('out', $MESSAGE['interface']['forums']['link']['back']); ?>
</a>
</div>
Ma ancora niente, non passa oltre il controllo, sicuramente sbaglio io qualcosa.
Seguendo invece il discorso di quod, ho provato a usare explode così:
$string = $row['proprietari'];
$pieces = explode(",", $string);
var_dump ('*'.$pieces[0].'*'); // piece0
var_dump ('*'.$pieces[1].'*'); // piece1
e i var_dump mi restituiscono
string(9) ",*24*,*4*" string(4) "*24*" string(4) "* 4*"
Il controllo è diventato
else if((($row['tipo'] == SOLORAZZA) && ($_SESSION['id_razza'] != $row['proprietari']) && ($_SESSION['permessi'] < MODERATOR)) || (($row['tipo'] == SOLOGILDA) && (strpos($_SESSION['gilda'], '*'.$pieces[0].'*') === false) && ($_SESSION['permessi'] < MODERATOR)) || (($row['tipo'] == SOLOGILDA) && (strpos($_SESSION['gilda'], '*'.$pieces[1].'*') === false) && ($_SESSION['permessi'] < MODERATOR)) || (($row['tipo'] >= SOLOSUPPORTO) && ($_SESSION['permessi'] < VICEMASTER)) || (($row['tipo'] >= SOLOMASTERS) && ($_SESSION['permessi'] < GAMEMASTER)) || (($row['tipo'] >= SOLOMODERATORS) && ($_SESSION['permessi'] < MODERATOR))) {
/*Restrizione di visualizzazione solo master e admin*/
echo '<div class="error">Errore: non puoi visualizzare questa bacheca perché non fai parte di questa corporazione</div>';
?>
<div class="link_back">
<a href="main.php?page=forum">
<?php echo gdrcd_filter('out', $MESSAGE['interface']['forums']['link']['back']); ?>
</a>
</div>
Ma ancora niente, visualizzo sempre l'avviso che non mi fa procedere..
06/07/2021 18:43:16
Prova a vedere cosa ti restituisce la funzione.
Prima di tutto il controllo fai un:
var_dump(gdrcd_controllo_permessi_gilda_bacheche($row['proprietari']);
Kasa.
06/07/2021 18:48:31
kasa ha scritto: Prova a vedere cosa ti restituisce la funzione.
Prima di tutto il controllo fai un:
var_dump(gdrcd_controllo_permessi_gilda_bacheche($row['proprietari']);
Kasa.
Credo manchi una (
Con
var_dump((gdrcd_controllo_permessi_gilda_bacheche($row['proprietari']);
ottengo
bool(true)
06/07/2021 21:35:28
haruka ha scritto:
i var_dump mi restituiscono
string(9) ",*24*,*4*" string(4) "*24*" string(4) "* 4*"
Occhio a quel * 4*... lo spazio è un carattere anche lui, quindi " 4" non è una sottostringa di "4".
07/07/2021 00:21:05
haruka ha scritto: ...
Dati i permessi, se il metodo gdrcd_controllo_permessi_gilda_bacheche() ritorna TRUE allora l'utente appartiene correttamente ai proprietari e il metodo funziona.
Ora...
Credo che il problema non sia legato alla funzione in sè, bensì al controllo intero: di fatto, in quel punto viene eseguita una verifica per determinare se l'utente NON POSSIEDE i permessi per visualizzare la bacheca e, appunto, se NON LI HA (l'intero if in quel punto di visit.inc.php da un ritorno TRUE ) allora mostro il messaggio di errore.
A questo punto, è sufficiente considerare solo quei casi per cui il metodo gdrcd_controllo_permessi_gilda_bacheche() ritorna FALSE, ossia quando l'utente non possiede i permessi.
Quindi, sostituisci:
gdrcd_controllo_permessi_gilda_bacheche($row['proprietari'])
Con:
gdrcd_controllo_permessi_gilda_bacheche($row['proprietari']) === false
E dovrebbe andare.
Kasa.
Discussione seguita da
Pagine → 1 2
Rispondi alla Discussione Segui Discussione Inoltra Discussione Forum Programmazione, Open Source e Hosting Elenco Forum
Articoli, Interviste e altre Risorse!
Sea of Conquest ↗
Seconda Era ↗
Project Entropy ↗
AlterEgo ↗
The Coven ↗
RAID Shadow Legends ↗
State of Survival ↗
World of the Sea Battle ↗
New Orleans ↗