X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=ctdlphp%2Fsessionproxy.php;h=22f4d4a0eddc1272e5e210b17088de6b85c2bc6e;hb=fa2dd842abb5feedea3e2253255722fcaecc3c6f;hp=8d544270b7552a89cd2e3725e551a26567493729;hpb=fe46648bc882772998b30f3de4b4d13f4108ed49;p=citadel.git diff --git a/ctdlphp/sessionproxy.php b/ctdlphp/sessionproxy.php index 8d544270b..22f4d4a0e 100755 --- a/ctdlphp/sessionproxy.php +++ b/ctdlphp/sessionproxy.php @@ -1,23 +1,37 @@ #!/usr/bin/php -q // This program is released under the terms of the GNU General Public License. -// +global $msgsock; // sock_gets() -- reads one line of text from a socket // +if (CITADEL_DEBUG_PROXY) +{ + define_syslog_variables(); + openlog("sessionproxylog", LOG_PID | LOG_PERROR, LOG_LOCAL0); +} function sock_gets($sock) { + global $msgsock; + socket_clear_error($msgsock); $buf = socket_read($sock, 4096, PHP_NORMAL_READ); - if ($buf == false) return false; + if (CITADEL_DEBUG_PROXY) + { + syslog(LOG_DEBUG, "gets Read: ".$buf); + } + if (socket_last_error($sock)) return false; if (preg_match("'\n$'s", $buf)) { $buf = substr($buf, 0, strpos($buf, "\n")); @@ -29,7 +43,6 @@ function sock_gets($sock) { - // *** Start of main program *** error_reporting(E_ALL); @@ -58,21 +71,21 @@ if ($sockname == "/tmp/") { system("/bin/rm -f " . $sockname); $sock = socket_create(AF_UNIX, SOCK_STREAM, 0); -if ($sock < 0) { +if (!$sock) { echo "socket_create() failed: ", socket_strerror($sock), "\n"; system("/bin/rm -f " . $sockname); exit(2); } $ret = socket_bind($sock, $sockname); -if ($ret < 0) { +if (!$ret) { echo "socket_bind() failed: ", socket_strerror($ret), "\n"; system("/bin/rm -f " . $sockname); exit(3); } $ret = socket_listen($sock, 5); -if ($ret < 0) { +if (!$ret) { echo "socket_listen() failed: ", socket_strerror($ret), "\n"; system("/bin/rm -f " . $sockname); exit(4); @@ -83,8 +96,7 @@ chmod($sockname, 0600); // We need to get a connection to the Citadel server going now. -$ctdlsock = fsockopen("uncensored.citadel.org", 504, $errno, $errstr, 30); -// $ctdlsock = fsockopen("/appl/citadel/citadel.socket", 0, $errno, $errstr, 30); +$ctdlsock = fsockopen(CITADEL_HOSTNAME, CITADEL_TCP_PORTNO, $errno, $errstr, 30); if (!$ctdlsock) { socket_close ($sock); system("/bin/rm -f " . $sockname); @@ -106,25 +118,67 @@ if (substr($buf, 0, 1) != "2") { } do { + // Wait for connections, but time out after 15 minutes. + // socket_select() is completely b0rken in PHP 4.1, which is why + // this program requires PHP 4.3 or newer. + // + if (socket_select($readsock = array($sock), + $writesock = NULL, + $exceptsock = NULL, + 900, 0 + ) == 0) { + // Timing out. + socket_close ($sock); + system("/bin/rm -f " . $sockname); + exit(8); + } + + // Ok, there's a valid connection coming in. Accept it. $msgsock = socket_accept($sock); if ($msgsock >= 0) do { $buf = sock_gets($msgsock); if ($buf !== false) { +// fwrite($logfd, ">>"); +// fwride($logfd, $buf); if (!fwrite($ctdlsock, $buf . "\n")) { fclose($ctdlsock); socket_close($sock); system("/bin/rm -f " . $sockname); - exit(8); + exit(9); } $talkback = fgets($ctdlsock, 4096); + if (CITADEL_DEBUG_PROXY) + { + syslog(LOG_DEBUG, "talkback: ".$talkback); + } if (!$talkback) { + if (CITADEL_DEBUG_PROXY) + { + syslog(LOG_ERROR, "closing socket."); + } fclose($ctdlsock); socket_close($sock); system("/bin/rm -f " . $sockname); - exit(9); + exit(10); } socket_write($msgsock, $talkback, strlen($talkback)); + // BINARY_FOLLOWS mode + if (substr($talkback, 0, 1) == "6") { + $bytes = intval(substr($talkback, 4)); + if (CITADEL_DEBUG_PROXY) + { + syslog(LOG_DEBUG, "reading ".$bytes." bytes from server"); + } + $buf = fread($ctdlsock, $bytes); + if (CITADEL_DEBUG_PROXY) + { + syslog(LOG_DEBUG, "Read: ".$buf); + } + socket_write($msgsock, $buf, $bytes); + } + + // LISTING_FOLLOWS mode if (substr($talkback, 0, 1) == "1") do { $buf = fgets($ctdlsock, 4096); if (!$buf) { @@ -136,6 +190,21 @@ do { } } while ($buf != "000\n"); + // SEND_LISTING mode + if (substr($talkback, 0, 1) == "4") do { + socket_clear_error($msgsock); + $buf = sock_gets($msgsock); + if (socket_last_error($msgsock)) { + $buf = "000" ; + } + if (!fwrite($ctdlsock, $buf . "\n")) { + fclose($ctdlsock); + socket_close($sock); + system("/bin/rm -f " . $sockname); + exit(11); + } + } while ($buf != "000"); + } } while($buf !== false);