diff -r 000000000000 -r 6f7a81934006 php/vmail.inc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/php/vmail.inc Wed Jan 16 22:39:43 2008 +0100 @@ -0,0 +1,275 @@ + +// +// Examples available at http://mailtest.mikebell.org/ +// Latest version will be included in each vmailmgr release +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +function vm_daemon_raw($arg) +{ + $vmailfile = "/tmp/.vmailmgrd"; + if (file_exists("/etc/vmailmgr/socket-file")) + $socketfile = (file ("/etc/vmailmgr/socket-file")); + $socketfile = trim($socketfile[0]); + if ($socketfile != "") + $vmailfile = $socketfile; + + + $vmailsock = fsockopen ($vmailfile, 0, $errno, $errstr, 4); + if (!$vmailsock) die("Failed to open socket file, is daemon running?"); + +/* Parse $arg, which should be an array of arguments to pass to the + daemon, into a glob consisting of each argument proceeded by a + two-byte representation of its length. */ + + for ($x=0; $x < sizeof($arg); $x++ ) + { + $commandlength = strlen($arg[$x]); + $high=(($commandlength & (0xFF << 8)) >> 8); + $low=($commandlength & 0xFF); + $command .= sprintf("%c%c%s", $high, $low, $arg[$x]); + }; + + +/* Create the header, which consists of another two byte length + representation, the number of arguments being passed, and the + command string created above. */ + + $args=$x-1; + $commandlength=strlen($command); + $high=(($commandlength & (255 << 8)) >> 8); + $low=($commandlength & 255); + $commandstr = sprintf("\002%c%c%c", $high, $low+1, $args).$command; + +/* Pass it all to the daemon */ + + fputs($vmailsock, $commandstr); + +/* Get the response */ + + $value = ord( fgetc ($vmailsock)); + $length = (ord(fgetc($vmailsock)) << 8) + ord(fgetc($vmailsock)); + + if ($length == 0) { + while (!feof($vmailsock)) + $out=fread($vmailsock, 65535); + fclose($vmailsock); + return $out; + } + + $message = fread ($vmailsock, $length); + +/* Close the socket */ + fclose($vmailsock); + +return array($value, $message); + +} + +function listdomain_parse_userdata($line, $username){ + //Grab the protocol version + $ver=ord(substr($line, 0, 1)); + if ($ver != 2) die("Protocol version is $ver, not the 2 as this script expects."); + //Chop off the version + $line=substr($line, 1); + //Grab the flags + while (substr($line, 0, 1) != chr(0)){ + $flags[ord(substr($line, 0, 1))]=ord(substr($line, 1, 1)); + $line=substr($line, 2); + }; + //Explode the remainder into an array based on the NULs used to end the fields + $user=explode(chr(0), $line); + $x=1; + if ($user[$x++]!=("*")) $password="Set"; + $mailbox=$user[$x++]; + while($user[$x]!="") + $aliases[]=$user[$x++]; + $x++; + $PersonalInfo=$user[$x++]; + $HardQuota=$user[$x++]; + $SoftQuota=$user[$x++]; + $SizeLimit=$user[$x++]; + $CountLimit=$user[$x++]; + $CreationTime=$user[$x++]; + $ExpiryTime=$user[$x++]; + + return array($username, $password, $mailbox, $aliases, +$PersonalInfo, $HardQuota, $SoftQuota, $SizeLimit, $CountLimit, +$CreationTime, $ExpiryTime, $flags); +} + +/* Parses the lines from listdomain into fields. */ + +function listdomain_parse_line($line){ + //Grab the user's name + $data_position = strpos($line, chr(0)); + $username=substr($line, 0, $data_position); + // Send that user's data to be parsed. The $username is nessesary because array manipulation in PHP3 is so limited. + return listdomain_parse_userdata(substr($line, $data_position+1), $username); +} + +/* Does the ugly stuff for listdomain, and calls listdomain_parse_line once + for each user */ + +function listdomain_parse($output){ + $cur=1; + do { + $linelength=(ord(substr($output, $cur++, 1)) << 8 ) + ord(substr($output, $cur++, 1)); + if ($linelength == 0) break; + $array[] = listdomain_parse_line(substr($output, $cur, $linelength)); + $cur+=$linelength+1; + } while (1); + return $array; +} + +/* listdomain, takes domain name and password, returns listdomain output + parsed as stated in listdomain_parse_userdata */ + +function listdomain($domain, $password){ +if ($domain=="") return array(1, "Empty domain"); +if ($password=="") return array(1, "Empty domain password"); + $command=array("listdomain",$domain, $password); + $temp=vm_daemon_raw(array("listdomain", $domain, $password)); + if (is_array($temp)) return $temp; +return listdomain_parse($temp); +} + +/* Lookup, returns for a single virtual user what listdomain does for an entire domain. */ + +function lookup($domain, $user, $password){ + $command=array("lookup", $domain, $user, $password); + $tmp = vm_daemon_raw($command); + return listdomain_parse_userdata($tmp[1], $user); +} + +/* vadduser, takes domain name, password, username, userpassword, and an + array of forwarding desinations, returns an array consisting of an + integer exit code and message. */ + +function vadduser($domain, $password, $username, $userpass, $forwards){ +if ($domain=="") return array(1, "Empty domain"); +if ($password=="") return array(1, "Empty domain password"); +if ($username=="") return array(1, "Empty username"); +if ($userpass=="") return array(1, "No user password supplied"); + $command=array("adduser2", $domain, $username, $password, + $userpass, $username); + for ($x=0; $x < sizeof($forwards); $x++) + if ($forwards[$x]!="") $command[]=$forwards[$x]; +return vm_daemon_raw($command); +} + +/* vaddalias, takes domain name, password, username, userpassword, and an + array of forwarding desinations, returns an array consisting of an + integer exit code and message. If the user's password is left empty an + alias with no password will be created. */ + +function vaddalias($domain, $password, $username, $userpass, $forwards){ +if ($domain=="") return array(1, "Empty domain"); +if ($password=="") return array(1, "Empty domain password"); +if ($username=="") return array(1, "Empty username"); + $command=array("adduser2", $domain, $username, $password, + $userpass, ""); + for ($x=0; $x < sizeof($forwards); $x++) + if ($forwards[$x]!="") + $command[]=$forwards[$x]; +return vm_daemon_raw($command); +} + +/* vdeluser, takes domain name, password, and username, returns an array + consisting of an integer exit code and message. */ + +function vdeluser($domain, $password, $username){ +if ($domain=="") return array(1, "Empty domain"); +if ($password=="") return array(1, "Empty domain password"); +if ($username=="") return array(1, "Empty username"); + $command=array("deluser", $domain, $username, $password); +return vm_daemon_raw($command); +} + +/* vchpass, takes domain name, password, username and a new password, + returns an array consisting of an integer exit code and message. Scripts + allowing users to change their own passwords should check the password + was entered correctly by having the user enter it twice and checking + these are equal*/ + +function vchpass($domain, $password, $username, $newpass){ +if ($domain=="") return array(1, "Empty domain"); +if ($password=="") return array(1, "Empty domain password"); +if ($username=="") return array(1, "Empty username"); +if ($newpass=="") return array(1, "Empty new password"); + $command=array("chattr", $domain, $username, $password, "1", $newpass); +return vm_daemon_raw($command); +} + +/* vchforward, takes domain name, password, username and an array of + forwarding addresses, returns an array consisting of an integer exit code + and message. */ + +function vchforward($domain, $password, $username, $forwards){ +if ($domain=="") return array(1, "Empty domain"); +if ($password=="") return array(1, "Empty domain password"); +if ($username=="") return array(1, "Empty username"); + $command=array("chattr", $domain, $username, $password, "2"); + for ($x=0; $x< sizeof($forwards); $x++) + if ($forwards[$x] != "") $command[]=$forwards[$x]; + if (sizeof($forwards) == 0) $command[] = ""; +return vm_daemon_raw($command); +} + +/* v*/ + +function vchattr($domain, $password, $username, $attr, $value){ + $ATTR = array( + "PASS" => "1", + "DEST" => "2", + "HARDQUOTA" => "3", + "SOFTQUOTA" => "4", + "MSGSIZE" => "5", + "MSGCOUNT" => "6", + "EXPIRY" => "7", + "MAILBOX_ENABLED" => "8", + "PERSONAL" => "9" + ); + $command = array ("chattr", $domain, $username, $password, $ATTR[$attr], $value); +return vm_daemon_raw($command); +} + +function vwriteautoresponse($domain, $password, $username, $message){ + $command = array("autoresponse", $domain, $username, $password, "write", $message); + return vm_daemon_raw($command); +} + +function vreadautoresponse($domain, $password, $username){ + $command = array("autoresponse", $domain, $username, $password, "read"); + return vm_daemon_raw($command); +} + +function vdisableautoresponse($domain, $password, $username){ + $command = array("autoresponse", $domain, $username, $password, "disable"); + return vm_daemon_raw($command); +} + +function venableautoresponse($domain, $password, $username){ + $command = array("autoresponse", $domain, $username, $password, "enable"); + return vm_daemon_raw($command); +} + +function vautoresponsestatus($domain, $password, $username){ + $command = array("autoresponse", $domain, $username, $password, "status"); + return vm_daemon_raw($command); +} + +?>