Die Daten für die Anzeige stehen in der Sessions Tabelle. Jede Seite trägt theoretisch einen anderen Wert ein, das Handling übernimmt dabei $user beim Aufruf von
$user->session_begin()
. Hierfür gibt es eine Methode namens
extract_current_page
, die die Seiteninformationen erzeugt (auf Basis des Aufrufpfads). Bei jedem Seitenaufruf wird
$user->session_begin()
aufgerufen. Hierbei wird der aktuelle Pfad in die Session Tabelle geschrieben.
Die viewonline.php liest diese Tabelle dann wieder aus und interpretiert die Daten. Dabei werden die Einträge ausgefiltert, die der User nicht sehen darf. Ein Eintrag in der Tabelle könnte z.B.
adm/index.php?i=acp_board&mode=server
sein. Aus der URL sieht man, dass der User sich im ACP befindet. phpBB muss das aber anhand der URL erst noch rausfinden. Hierfür wird die URL in der viewonline_helper zerlegt:
Code: Alles auswählen
preg_match('#^((\.\./)*([a-z0-9/_-]+))#i', $session_page, $on_page);
Der Wert in $on_page wird zurückggegeben. Er schneidet von den Seiteninformationen alles außer den in der eckigen Klammer angegebenen Zeichen ab. Aus obiger Zeile müsste so:
Code: Alles auswählen
$on_page = array(
0 => 'adm/index',
1 => 'adm/index',
2 => '',
3 => 'adm/index',
);
werden. Das sieht aus nach 3x der gleichen Info, aber wenn eine URL oberhalb des Forums eingeht, z.B.
../adm/index.php?x=...
, dann sind die Einträge verschieden.
Der Eintrag bei Index 1 wird dann verwendet um die eigentliche Seite zu bestimmen. Dieser enthält immer den gesamten Treffer, in unserem Fall also
adm/index
. Hierfür wird in einer Liste nachgesehen die direkte unter der Stelle ist, die du ja schon gefunden hast. Wird der Eintrag gefunden (in unserem Fall der zweite
case
in der Liste), dann werden die Variablen
$location
und
$location_url
gefüllt.
Bei Foren- und Themenseiten wird noch überprüft, ob der anzeigende User das Forum betrachten kann. Hierzu legt die Funktion
session_create
(wird von
session_begin
aufgerufen) beim Eintragen der Daten auch die ID des besuchten Forums in der DB ab. Wenn nein, wird stattdessen der Foren-Index eingetragen, sonst wird das konkrete Forum aufgelistet. Sprich: Wenn ich hier in einem unserer internen Foren einen Beitrag lese oder schreibe, dann wird dir angezeigt, ich sei auf dem Index.
Wenn du die Liste durchgehst wirst du feststellen, dass es für so ziemlich jede Standardseite einen Eintrag gibt. Alles was nicht erfasst wird, wird als Index angezeigt (womit eine Menge Leute auf dem Foren-Index sind). Damit Erweiterungen ihre Location auch richtig anzeigen können gibt es direkt nach der Liste das Event
core.viewonline_overwrite_location
. Hiermit können die Erweiterungen prüfen, auf welcher Seite man so ist.
Wenn dir also sehr viele Leute auf dem Index angezeigt werden, dann sollte das normalerweise entweder daran liegen, dass du keine ausreichenden Rechte hast, um auf die entsprechenden Seiten zuzugreifen, oder dass sehr viele User Erweiterungen nutzen, die ihre Angaben nicht korrigieren.