diff --git a/GameEngine/Account.php b/GameEngine/Account.php index 61221e6a..9c1fbe90 100755 --- a/GameEngine/Account.php +++ b/GameEngine/Account.php @@ -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() { diff --git a/GameEngine/Database/DatabaseUserQueries.php b/GameEngine/Database/DatabaseUserQueries.php index 459b64d4..682ec037 100644 --- a/GameEngine/Database/DatabaseUserQueries.php +++ b/GameEngine/Database/DatabaseUserQueries.php @@ -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); } diff --git a/GameEngine/Lang/en.php b/GameEngine/Lang/en.php index d7146f0a..27283f74 100755 --- a/GameEngine/Lang/en.php +++ b/GameEngine/Lang/en.php @@ -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.'); diff --git a/GameEngine/Lang/fr.php b/GameEngine/Lang/fr.php index 6354207f..f6446376 100644 --- a/GameEngine/Lang/fr.php +++ b/GameEngine/Lang/fr.php @@ -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 à d’autres joueurs'); tz_def('SITTER_P_GOLD', 'dépenser de l’or'); -tz_def('SITTER_P_DENIED', 'Vos permissions de sitter ne vous permettent pas d’effectuer cette action.'); \ No newline at end of file +tz_def('SITTER_P_DENIED', 'Vos permissions de sitter ne vous permettent pas d’effectuer cette action.'); +tz_def('SITTER_P_HINT', 'Permissions du nouveau sitter :'); +tz_def('SITTER_P_NOT_SITTING', 'Vous n\'etes sitter sur aucun compte.'); \ No newline at end of file diff --git a/GameEngine/Lang/ro.php b/GameEngine/Lang/ro.php index fc4443ce..dbe259fa 100644 --- a/GameEngine/Lang/ro.php +++ b/GameEngine/Lang/ro.php @@ -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.'); \ No newline at end of file +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.'); \ No newline at end of file diff --git a/GameEngine/Profile.php b/GameEngine/Profile.php index 355ecc6b..4f61125f 100755 --- a/GameEngine/Profile.php +++ b/GameEngine/Profile.php @@ -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: diff --git a/Templates/Profile/account.tpl b/Templates/Profile/account.tpl index 36d6d206..c8513401 100644 --- a/Templates/Profile/account.tpl +++ b/Templates/Profile/account.tpl @@ -49,8 +49,8 @@ $sitterPermList = array( ); /** - * Casutele pentru un slot. $mask = permisiunile curente, $field = numele - * campului din formular. + * Casutele editabile pentru un slot de sitter. + * $mask = permisiunile curente, $field = numele campului din formular. */ function sitterPermBoxes($mask, $field, $list) { @@ -60,19 +60,44 @@ function sitterPermBoxes($mask, $field, $list) { * Campul asta e mereu trimis, asa ca Profile.php poate deosebi cele doua * situatii si nu reseteaza permisiunile din greseala. */ - $out = ''; - $out .= '
'; + $out = ''; + $out .= '
'; + return $out . ''; +} + +/** + * Aceleasi drepturi, dar DOAR pentru citire: se foloseste in lista conturilor + * pe care esti tu sitter, ca sa vezi ce ti-a permis fiecare proprietar. + * Bifa verde = ai voie, X gri = nu ai voie. + */ +function sitterPermView($mask, $list) { + + $out = ''; } ?> @@ -153,16 +178,96 @@ if (!empty($emailError)) { ?> @@ -77,5 +89,6 @@ $sParam = isset($_GET['s']) ? (int)$_GET['s'] : null; + \ No newline at end of file diff --git a/spieler.php b/spieler.php index f0cfe1b6..c7e3477e 100644 --- a/spieler.php +++ b/spieler.php @@ -28,6 +28,30 @@ ob_start(); include_once("GameEngine/Village.php"); AccessLogger::logRequest(); +/** + * RESTRICTIE SITTER pe pagina de profil. + * + * Un sitter are voie DOAR la Overview (spieler.php?uid=...). Taburile + * Profile / Preferences / Account / Vacation / Graphic Pack (s=1..5) sunt + * interzise, inclusiv prin URL scris de mana sau POST trimis direct. + * + * De ce aici si nu la finalul fisierului, unde exista deja o verificare + * "$_GET['s'] > 5 or $session->sit == 1": + * - procProfile($_POST) ruleaza la linia urmatoare si salveaza efectiv + * setarile; verificarea de la final se executa mult dupa; + * - graphic.tpl si preference.tpl scriu direct in baza de date la include, + * tot inainte de acea verificare. + * Cu ob_start() activ, redirectul de la final ascundea doar PAGINA, nu si + * efectele - un sitter putea schimba setarile proprietarului fara sa vada + * vreun ecran. + */ +if (isset($session) && is_object($session) && method_exists($session, 'isSitterSession') + && $session->isSitterSession() && isset($_GET['s'])) { + + header("Location: " . $_SERVER['PHP_SELF'] . "?uid=" . (int) $session->uid); + exit; +} + $profile->procProfile($_POST); $profile->procSpecial($_GET); if(isset($_GET['newdid'])){ diff --git a/var/db/struct.sql b/var/db/struct.sql index 3d797dda..158e5535 100644 --- a/var/db/struct.sql +++ b/var/db/struct.sql @@ -1995,9 +1995,9 @@ CREATE TABLE IF NOT EXISTS `%PREFIX%users` ( `b3` int(11) DEFAULT '0', `b4` int(11) DEFAULT '0', `sit1` int(11) DEFAULT '0', - `sit1_perm` int(11) NOT NULL DEFAULT '31', + `sit1_perm` int(11) NOT NULL DEFAULT '31', `sit2` int(11) DEFAULT '0', - `sit2_perm` int(11) NOT NULL DEFAULT '31', + `sit2_perm` int(11) NOT NULL DEFAULT '31', `alliance` int(11) DEFAULT '0', `alliance_joined` int(11) NOT NULL DEFAULT '0', `sessid` varchar(100) DEFAULT NULL,