#!/usr/bin/php
<?php
error_reporting(0);
$auth = new JabberAuth();
$auth->dbhost = "";
$auth->dbuser = "";
$auth->dbpass = "";
$auth->dbbase = "";
$auth->allow_setpass = true;
$auth->play();
class JabberAuth {
var $dbhost;
var $dbuser;
var $dbpass;
var $dbbase;
var $allow_setpass;
var $debug = false;
var $debugfile = "/var/log/pipe-debug.log";
var $logging = false;
var $logfile = "/var/log/pipe-log.log" ;
var $jabber_user;
var $jabber_pass;
var $jabber_server;
var $jid;
var $data;
var $dateformat = "M d H:i:s";
var $command;
var $mysock;
var $stdin;
var $stdout;
function JabberAuth()
{
@define_syslog_variables();
@openlog("pipe-auth", LOG_NDELAY, LOG_SYSLOG);
if($this->debug) {
@error_reporting(E_ALL);
@ini_set("log_errors", "1");
@ini_set("error_log", $this->debugfile);
}
$this->logg("Starting pipe-auth ...");
$this->openstd();
}
function stop()
{
$this->logg("Shutting down ...");
closelog();
$this->closestd();
exit(0);
}
function openstd()
{
$this->stdout = @fopen("php://stdout", "w");
$this->stdin = @fopen("php://stdin", "r");
}
function readstdin()
{
$l = @fgets($this->stdin, 3);
$length = @unpack("n", $l);
$len = $length["1"];
if($len > 0) {
$this->logg("Reading $len bytes ... ");
$data = @fgets($this->stdin, $len+1);
$this->data = $data;
$this->logg("IN: ".$data);
}
}
function closestd()
{
@fclose($this->stdin);
@fclose($this->stdout);
}
function out($message)
{
@fwrite($this->stdout, $message);
$dump = @unpack("nn", $message);
$dump = $dump["n"];
$this->logg("OUT: ". $dump);
}
function myalive()
{
if(!is_resource($this->mysock) || !@mysql_ping($this->mysock)) {
$this->mysql();
return @mysql_ping($this->mysock);
} else {
return true;
}
}
function gen_pass($cleartext_password)
{
$salt="$1$";
$base64_alphabet='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
for ($n=0;$n<8;$n++)
{
$salt.=$base64_alphabet[mt_rand(0,63)];
}
$salt.="$";
return crypt($cleartext_password,$salt);
}
function play()
{
do {
$this->readstdin();
$length = strlen($this->data);
if($length > 0 ) {
$this->logg("GO: ".$this->data);
$this->logg("data length is : ".$length);
}
$ret = $this->command();
$this->logg("RE: " . $ret);
$this->out($ret);
$this->data = NULL;
} while (true);
}
function command()
{
$data = $this->splitcomm();
if($this->myalive()) {
if(strlen($data[0]) > 0 ) {
$this->logg("Command was : ".$data[0]);
}
switch($data[0]) {
case "isuser":
$this->jabber_user = $data[1];
$parms = $data[1];
$return = $this->checkuser();
break;
case "auth":
$this->jabber_user = $data[1];
$this->jabber_pass = $data[3];
$parms = $data[1].":".$data[2].":".md5($data[3]);
$return = $this->checkpass();
break;
case "setpass":
if ($this->allow_setpass === true) {
$return = $this->setpass();
} else {
$return = false;
}
break;
default:
$this->stop();
break;
}
$return = ($return) ? 1 : 0;
if(strlen($data[0]) > 0 && strlen($parms) > 0) {
$this->logg("Command : ".$data[0].":".$parms." ==> ".$return." ");
}
return @pack("nn", 2, $return);
} else {
return @pack("nn", 2, 0);
}
}
function setpass()
{
$password = $this->gen_pass($this->jabber_pass);
$result = mysql_query("UPDATE `mail_user`
SET `password` = '".$password."'
WHERE `login` = '".$this->jabber_user."'", $this->mysock);
if (mysql_affected_rows() != 0) {
return true;
} else {
return false;
}
}
function checkpass()
{
$result = mysql_query("SELECT password
FROM `mail_user`
WHERE `login` = '".$this->jabber_user."' LIMIT 1"
, $this->mysock);
$password = mysql_result($result, 0);
if (crypt($this->jabber_pass, $password) == $password) {
return true;
} else {
return false;
}
}
function checkuser()
{
$result = mysql_query("SELECT mailuser_id
FROM `mail_user`
WHERE `login` = '".$this->jabber_user."' LIMIT 1"
, $this->mysock);
if(mysql_num_rows($result) != 0) {
return true;
} else {
return false;
}
}
function splitcomm()
{
return explode(":", $this->data);
}
function mysql()
{
$this->mysock = @mysql_pconnect($this->dbhost, $this->dbuser, $this->dbpass);
@mysql_select_db($this->dbbase, $this->mysock);
$this->logg("MySQL :: ". (is_resource($this->mysock) ? "Connected"));
}
function logg($message) // pretty simple, using syslog.
// some says it doesn't work ? perhaps, but AFAIR, it was working.
{
if($this->logging) {
@syslog(LOG_INFO, $message);
}
}
}
?>