Fix sitter

Fix sitter
This commit is contained in:
novgorodschi catalin
2026-08-12 08:11:04 +03:00
parent e7c9c61ef8
commit 7c6425578e
10 changed files with 296 additions and 34 deletions
+15 -2
View File
@@ -385,10 +385,23 @@ class Account {
}
setcookie("COOKUSR", $username, time() + COOKIE_EXPIRE, COOKIE_PATH);
$session->login($username);
// dupa Login(), ca sa nu fie suprascris de initializarea sesiunii
/**
* BUG CRITIC REPARAT: aceasta linie era DUPA $session->login().
*
* Session::Login() se termina cu header("Location: dorf1.php"); exit;
* deci tot ce urma dupa apel era cod mort. $_SESSION['sitter_uid'] nu se
* scria NICIODATA, sesiunea sitterului arata identic cu a proprietarului
* si toate verificarile de permisiuni treceau - indiferent ce bifai in
* interfata.
*
* Setarea INAINTE de Login() are si un avantaj: Login() apeleaza intern
* PopulateVar(), care citeste chiar aceasta cheie, deci permisiunile sunt
* corecte inca din prima cerere, nu de la a doua.
*/
$_SESSION['sitter_uid'] = $sitterUid;
$session->login($username);
}
private function Logout() {
+9 -1
View File
@@ -246,10 +246,18 @@ trait DatabaseUserQueries {
}
// no need to cache this method
/**
* Conturile pe care utilizatorul $uid e sitter.
*
* Intoarce si sloturile si mastile de permisiuni, ca pagina de cont sa
* poata afisa CE drepturi i-a dat fiecare proprietar. Inainte se selecta
* doar "id", deci sitterul nu avea de unde sa stie ce are voie sa faca.
* Cheia 'id' ramane neschimbata, deci codul existent nu e afectat.
*/
function getSitee($uid) {
list($uid) = $this->escape_input((int) $uid);
$q = "SELECT id from " . TB_PREFIX . "users where sit1 = $uid or sit2 = $uid";
$q = "SELECT id, sit1, sit2, sit1_perm, sit2_perm from " . TB_PREFIX . "users where sit1 = $uid or sit2 = $uid";
$result = mysqli_query($this->dblink,$q);
return $this->mysqli_fetch_all($result);
}
+2 -1
View File
@@ -4392,4 +4392,5 @@ tz_def('SITTER_P_REINF', 'send reinforcements');
tz_def('SITTER_P_RES', 'send resources to other players');
tz_def('SITTER_P_GOLD', 'spend Gold');
tz_def('SITTER_P_DENIED', 'Your sitter permissions do not allow this action.');
tz_def('SITTER_P_HINT', 'Permissions for the new sitter:');
tz_def('SITTER_P_NOT_SITTING', 'You are not a sitter on any account.');
+3 -1
View File
@@ -4334,4 +4334,6 @@ tz_def('SITTER_P_RAID', 'envoyer des raids');
tz_def('SITTER_P_REINF', 'envoyer des renforts');
tz_def('SITTER_P_RES', 'envoyer des ressources à dautres joueurs');
tz_def('SITTER_P_GOLD', 'dépenser de lor');
tz_def('SITTER_P_DENIED', 'Vos permissions de sitter ne vous permettent pas deffectuer cette action.');
tz_def('SITTER_P_DENIED', 'Vos permissions de sitter ne vous permettent pas deffectuer cette action.');
tz_def('SITTER_P_HINT', 'Permissions du nouveau sitter :');
tz_def('SITTER_P_NOT_SITTING', 'Vous n\'etes sitter sur aucun compte.');
+3 -1
View File
@@ -4129,4 +4129,6 @@ tz_def('SITTER_P_RAID', 'trimite raiduri');
tz_def('SITTER_P_REINF', 'trimite intariri');
tz_def('SITTER_P_RES', 'trimite resurse altor jucatori');
tz_def('SITTER_P_GOLD', 'cheltuie aur');
tz_def('SITTER_P_DENIED', 'Permisiunile tale de sitter nu iti permit aceasta actiune.');
tz_def('SITTER_P_DENIED', 'Permisiunile tale de sitter nu iti permit aceasta actiune.');
tz_def('SITTER_P_HINT', 'Permisiuni pentru noul sitter:');
tz_def('SITTER_P_NOT_SITTING', 'Nu esti sitter pe niciun cont.');
+43
View File
@@ -30,9 +30,37 @@ class Profile {
'villages' => []
];
/**
* Sesiunea curenta e a unui sitter?
* Verificat defensiv, ca Profile.php sa mearga si daca ajunge intr-un
* context unde $session inca nu e initializat.
*/
private function isSitter() {
global $session;
return isset($session) && is_object($session)
&& method_exists($session, 'isSitterSession')
&& $session->isSitterSession();
}
public function procProfile($post) {
global $session;
/**
* RESTRICTIE SITTER - al doilea nivel, cel care conteaza.
*
* spieler.php blocheaza deja accesul la taburi, dar aceasta metoda e
* punctul unic prin care trec TOATE formularele de profil (p1..p5:
* descriere, preferinte, cont, parola, vacanta). Un sitter putea
* trimite POST-ul direct catre spieler.php, fara sa deschida tabul.
*
* Aici se opreste definitiv: un sitter nu modifica setarile
* proprietarului, indiferent pe unde intra.
*/
if ($this->isSitter()) {
return;
}
if (isset($post['ft'])) {
switch ($post['ft']) {
case "p1":
@@ -214,6 +242,21 @@ class Profile {
}
public function procSpecial($get) {
/**
* Aceleasi motive ca la procProfile(). Actiunile de aici sunt chiar mai
* sensibile, fiindca se declanseaza prin simplu GET:
* e=2 removeMeSit - se scoate ca sitter de pe un cont
* e=3 removeSitter - sterge un sitter al proprietarului (deci un
* sitter l-ar fi putut elimina pe celalalt, sau
* pe sine, ca sa scape de urme)
* e=4 cancelDeleting - anuleaza stergerea contului proprietarului
* Niciuna nu are ce cauta intr-o sesiune de sitter.
*/
if ($this->isSitter()) {
return;
}
if (isset($get['e'])) {
switch ($get['e']) {
case 2: