Woran liegt der folgende Fehler in phpGroupWare 0.9.16.000: »fopen(“/tmp/sess_[…]”, “r”) – Permission denied in […]/phpgwapi/inc/class.sessions_php4.inc«?

How to reproduce this error: Use phpgroupware 0.9.16.000, her with PHP 4.2.3; register_globals = on for all apps except notes, projects, qmailldap, stocks, todo.

  1. Install phpGroupWare correctly, including the apps
  2. Point your browser to /setup below your phpGroupware Installation URL
  3. Choose “Click here to setup an admin account and (optionally) 3 demo accounts.*” Then only setup the admin account. This is how to recover from the phpgw crash (step 6), too.
  4. Login as admin user into phpgw and choose “Preferences > Change Your Settings > Your Preferences”. Or, choose “… > Default Preferences > Your Preferences”.
  5. Choose these Options and then “Save”: Language: German and Show number of current users: Yes
  6. Now, phpGroupWare outputs approx some 100 kB of error messages. This is reproducible for me. See below for the kind of error messages I get, all the time jumping between lines 208, 209, 210 in the specified script.
  7. Workaround: use a Forced Preference for language or number of current user information that prohibits the above mentioned combination of settings to be done by your users.

Here are the error messages that are generated:

Warning: fopen("/tmp/sess_66bb6b04ba1ddd84eec30c9665360181", "r") - Permission denied in /homepages/24/d70284365/htdocs/www.ansorgs.de/groups.ansorgs.de/phpgwapi/inc/class.sessions_php4.inc.php on line 208
Warning: fread(): supplied argument is not a valid File-Handle resource in /homepages/24/d70284365/htdocs/www.ansorgs.de/groups.ansorgs.de/phpgwapi/inc/class.sessions_php4.inc.php on line 209
Warning: fclose(): supplied argument is not a valid File-Handle resource in /homepages/24/d70284365/htdocs/www.ansorgs.de/groups.ansorgs.de/phpgwapi/inc/class.sessions_php4.inc.php on line 210
Warning: fopen("/tmp/sess_e46ac33657b1d69993c7fc104a9cf71a", "r") - Permission denied in /homepages/24/d70284365/htdocs/www.ansorgs.de/groups.ansorgs.de/phpgwapi/inc/class.sessions_php4.inc.php on line 208
Warning: fread(): supplied argument is not a valid File-Handle resource in /homepages/24/d70284365/htdocs/www.ansorgs.de/groups.ansorgs.de/phpgwapi/inc/class.sessions_php4.inc.php on line 209
Warning: fclose(): supplied argument is not a valid File-Handle resource in /homepages/24/d70284365/htdocs/www.ansorgs.de/groups.ansorgs.de/phpgwapi/inc/class.sessions_php4.inc.php on line 2101.
Install phpGroupWare correctly, including the apps

And now, something about the same error when installing.

Problematisch ist: in der Konfiguration von PHP4 (php.ini an unbekanntem Ort) steht session.save_path = /tmp . Das gilt für alle User. Der Webserver läuft aus der Sicht jedes Users unter seinem eigenen Benutzernamen, etwa p3002017. Es ist nun möglich, dass phpGroupWare-Installationen verschiedener Benutzer in /tmp Session-Dateien mit gleichem Namen anlegen, also einander überschreiben. Sie beginnen mit sess_ und haben danach eine lange hexadezimale Zeichenkette. Wenn dies ein Hashwert ist, könnte es das Überschreiben erklären. Somit werden Session-Dateien also ungültig. Erkennbar ist das daran, dass sie für den eigenen Benutzer nicht mehr lesbar ist und phpGroupWare etwa folgende Meldungen ausgibt:

Warning: fopen("/tmp/sess_dc4886a4eec5f", "r") - Permission denied 
in /somepath/phpgwapi/inc/class.sessions_php4.inc.php 
on line 208

Diese Problemanalyse wird dadurch bestätigt, dass die Fehlermeldungen in phpGroupWare verschwinden, wenn man einen neuen Benutzer anlegt und sich als solcher einloggt: klar, denn es wurden neue Session-Dateien angelegt statt dass alte gesucht wurden, und es ist sehr unwahrscheinlich, dass die neuen Dateien bereits von anderen phpGroupWare-Installationen überschrieben wurden. Das Prefix sess_ wird von phpGroupWare generiert, so dass nur phpGroupWare-Installationen miteinander im Konflikt stehen. Das Problem tritt selten auf, wenn die Server wenig genutzt werden, z.B. nachts. Es ist möglich, dieses Problem durch eine eigene php.ini zu beheben. Man lege sie ins Webserver-Rootverzeichnis der Domain oder Subdomain. Sie enthalte den vollständigen Pfad zum persönlichen tmp-Verzeichnis (mit entspr. Zugriffsrechten). Beispielinhalt:

session.save_path = /somepath/mytmpdir

Das Problem wird nicht gelöst, indem man Einstellungen in »Admin :: Site configuration :: Use cookies to pass sessionid:« und »Admin :: Site configuration :: check ip address of all sessions:« macht.

Eine weitere Möglichkeit sind evtl. Einstellungen in der .htaccess wie beschrieben in phpGroupware Mailingliste, 2003-09, Nachricht 241.

Dort steht auch ein möglicher Grund des Folgeproblems »Your session could not be verified.«: Cookies werden neben phpGroupWare noch von sitemgr verwaltet und abgelegt in /tmp wie bisher. Das muss noch umgestellt werden.

Tatsächlich wird auch nach Umstellung des /tmp-Verzeichnisses sowohl dort als auch am neuen Ort eine sess_-Datei zur aktuellen Session angelegt. Die session-ID der aktuellen Session kann man im Source-Code der HTML-Seite nach dem Einloggen nachlesen.

Aber: das Problem mit nicht lesbaren sess_*-Dateien tritt nur auf (dann aber für alle Benutzer) wenn man als Admin die Default-Preferences (oder einen bestimmten Teil davon) ändert. Und zwar tritt es dann unabhängig von der Serverbenutzung auf. Bisher hilft dann nur, im Setup-Bereich alle Benutzer zu löschen und einen neuen Admin-Benutzer anzulegen. Löschen der Cookies hilft nur, um zum Login-Screen zu gelangen wenn man nur den Domain-Namen eingibt.


Posted

in

,

by

Tags:

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.