* added api.html
[citadel.git] / ctdlphp / ctdlsession.php
1 <?PHP
2
3 // $Id$
4 //
5 // This gets called from within the header functions.  It establishes or
6 // connects to a PHP session, and then connects to Citadel if necessary.
7 //
8
9 function establish_citadel_session() {
10
11         global $session, $clientsocket;
12
13         session_start();
14
15         if ($_SESSION["ctdlsession"]) {
16                 $session = $_SESSION["ctdlsession"];
17         }
18         else {
19                 $session = "CtdlSession." . time() . rand(1000,9999) ;
20                 $_SESSION["ctdlsession"] = $session;
21         }
22
23         // See if there's a Citadel connection proxy open for this session.
24         // The name of the socket is identical to the name of the
25         // session, and it's found in the /tmp directory.
26
27         $sockname = "/tmp/" . $session . ".socket" ;
28
29         $clientsocket = fsockopen($sockname, 0, $errno, $errstr, 5);
30         if (!$clientsocket) {
31                 // It ain't there, dude.  Open up the proxy. (C version)
32                 //$cmd = "./sessionproxy " . $sockname ;
33                 //exec($cmd);
34
35                 // It ain't there, dude.  Open up the proxy.  (PHP version)
36                 $cmd = "./sessionproxy.php " . $sockname .
37                         " </dev/null >/dev/null 2>&1 " .
38                         " 3>&1 4>&1 5>&1 6>&1 7>&1 8>&1 & " ;
39                 exec($cmd);
40                 sleep(2);
41
42                 // Ok, now try again.
43                 $clientsocket = fsockopen($sockname, 0, $errno, $errstr, 5);
44
45                 // Try to log the user back in.
46                 if ($clientsocket) {
47
48                         ctdl_iden();    // Identify client
49
50                         if ($_SESSION["username"]) {
51                                 login_existing_user(
52                                         $_SESSION["username"],
53                                         $_SESSION["password"]
54                                 );
55                         }
56                 }
57         }
58
59         if ($clientsocket) {
60                 if (!$_SESSION["serv_humannode"]) {
61                         ctdl_get_serv_info();
62                 }
63         }
64         else {
65                 echo "ERROR: no Citadel socket!<BR>\n";
66                 flush();
67         }
68         
69 }
70
71
72 //
73 // Clear out both our Citadel session and our PHP session.  We're done.
74 //
75 function ctdl_end_session() {
76         global $clientsocket, $session;
77
78         // Tell the Citadel server to terminate our connection.
79         // (The extra newlines force it to see that the Citadel session
80         // ended, and the proxy will quit.)
81         //
82         fwrite($clientsocket, "QUIT\n\n\n\n\n\n\n\n\n\n\n");
83         $response = fgets($clientsocket, 4096);         // IGnore response
84         fclose($clientsocket);
85         unset($clientsocket);
86
87         // Now clear our PHP session.
88         $_SESSION = array();
89         session_write_close();
90 }
91
92 ?>