fix for bug 421645 use of quotes in email_sig preferences

This commit is contained in:
angles 2001-05-30 19:47:13 +00:00
parent 0c0264ccdd
commit 2a381e6dd4

View File

@ -27,27 +27,29 @@
/* $Id$ */ /* $Id$ */
class send { class send
var $err = array("code","msg","desc"); {
var $to_res = array(); var $err = array("code","msg","desc");
var $to_res = array();
function send() { function send()
$this->err["code"] = " "; {
$this->err["msg"] = " "; $this->err["code"] = " ";
$this->err["desc"] = " "; $this->err["msg"] = " ";
} $this->err["desc"] = " ";
}
function msg($service, $to, $subject, $body, $msgtype='', $cc='', $bcc='', $from='', $sender='') function msg($service, $to, $subject, $body, $msgtype='', $cc='', $bcc='', $from='', $sender='')
{ {
global $phpgw_info, $phpgw, $attach_sig; global $phpgw_info, $phpgw, $attach_sig;
if ($from == '') if ($from == '')
{ {
$from = $phpgw_info['user']['fullname'].' <'.$phpgw_info['user']['preferences']['email']['address'].'>'; $from = $phpgw_info['user']['fullname'].' <'.$phpgw_info['user']['preferences']['email']['address'].'>';
} }
if ($sender == '') if ($sender == '')
{ {
$sender = $phpgw_info['user']['fullname'].' <'.$phpgw_info['user']['preferences']['email']['address'].'>'; $sender = $phpgw_info['user']['fullname'].' <'.$phpgw_info['user']['preferences']['email']['address'].'>';
} }
if ($service == "email") if ($service == "email")
{ {
@ -76,7 +78,9 @@ class send {
if ($phpgw_info['user']['preferences']['email']['email_sig'] && $attach_sig) if ($phpgw_info['user']['preferences']['email']['email_sig'] && $attach_sig)
{ {
$body .= "\n-----\n".$phpgw_info['user']['preferences']['email']['email_sig']; //$body .= "\n-----\n".$phpgw_info['user']['preferences']['email']['email_sig'];
$get_sig = $this->sig_html_to_text($phpgw_info['user']['preferences']['email']['email_sig']);
$body .= "\n-----\n" .$get_sig;
} }
if (ereg('Message-Boundary', $body)) if (ereg('Message-Boundary', $body))
@ -130,163 +134,259 @@ class send {
} }
elseif ($type == 'nntp') elseif ($type == 'nntp')
{ {
} // nothing is here?
} }
}
// ==================================================[ some sub-functions ]=== // ==================================================[ some sub-functions ]===
function socket2msg($socket) { function socket2msg($socket)
$followme = "-"; $this->err["msg"] = ""; {
do { $followme = "-";
$rmsg = fgets($socket,255); $this->err["msg"] = "";
// echo "< $rmsg<BR>\n"; do
$this->err["code"] = substr($rmsg,0,3); {
$followme = substr($rmsg,3,1); $rmsg = fgets($socket,255);
$this->err["msg"] = substr($rmsg,4); // echo "< $rmsg<BR>\n";
if (substr($this->err["code"],0,1) != 2 && substr($this->err["code"],0,1) != 3) { $this->err["code"] = substr($rmsg,0,3);
$rc = fclose($socket); $followme = substr($rmsg,3,1);
return false; $this->err["msg"] = substr($rmsg,4);
} if (substr($this->err["code"],0,1) != 2 && substr($this->err["code"],0,1) != 3)
if ($followme = " ") { break; } {
} while ($followme = "-"); $rc = fclose($socket);
return true; return false;
}
if ($followme = " ")
{
break;
}
}
while ($followme = "-");
return true;
} }
function msg2socket($socket,$message) { // send single line\n function msg2socket($socket,$message)
// echo "raw> $message<BR>\n"; {
// echo "hex> ".bin2hex($message)."<BR>\n"; // send single line\n
$rc = fputs($socket,"$message"); // echo "raw> $message<BR>\n";
if (!$rc) { // echo "hex> ".bin2hex($message)."<BR>\n";
$this->err["code"] = "420"; $rc = fputs($socket,"$message");
$this->err["msg"] = "lost connection"; if (!$rc)
$this->err["desc"] = "Lost connection to smtp server."; {
$rc = fclose($socket); $this->err["code"] = "420";
return false; $this->err["msg"] = "lost connection";
} $this->err["desc"] = "Lost connection to smtp server.";
return true; $rc = fclose($socket);
return false;
}
return true;
} }
function put2socket($socket,$message) { // check for multiple lines 1st function put2socket($socket,$message)
$pos = strpos($message,"\n"); {
if (!is_int($pos)) { // no new line found // check for multiple lines 1st
$message .= "\r\n"; $pos = strpos($message,"\n");
$this->msg2socket($socket,$message); if (!is_int($pos))
} else { // multiple lines, we have to split it {
do { // no new line found
$msglen = $pos + 1; $message .= "\r\n";
$msg = substr($message,0,$msglen); $this->msg2socket($socket,$message);
$message = substr($message,$msglen); }
$pos = strpos($msg,"\r\n"); else
if (!is_int($pos)) { // line not terminated {
$msg = chop($msg)."\r\n"; // multiple lines, we have to split it
} do
$pos = strpos($msg,"."); // escape leading periods {
if (is_int($pos) && !$pos) { $msglen = $pos + 1;
$msg = "." . $msg; $msg = substr($message,0,$msglen);
} $message = substr($message,$msglen);
if (!$this->msg2socket($socket,$msg)) { return false; } $pos = strpos($msg,"\r\n");
$pos = strpos($message,"\n"); if (!is_int($pos))
} while (strlen($message)>0); {
} // line not terminated
return true; $msg = chop($msg)."\r\n";
}
$pos = strpos($msg,"."); // escape leading periods
if (is_int($pos) && !$pos)
{
$msg = "." . $msg;
}
if (!$this->msg2socket($socket,$msg))
{
return false;
}
$pos = strpos($message,"\n");
}
while (strlen($message)>0);
}
return true;
} }
function check_header($subject,$header) { // check if header contains subject function check_header($subject,$header)
// and is correctly terminated {
$header = chop($header); // check if header contains subject and is correctly terminated
$header .= "\n"; $header = chop($header);
if (is_string($subject) && !$subject) { // no subject specified $header .= "\n";
return $header; if (is_string($subject) && !$subject)
} {
$theader = strtolower($header); // no subject specified
$pos = strpos($theader,"\nsubject:"); return $header;
if (is_int($pos)) { // found after a new line }
return $header; $theader = strtolower($header);
} $pos = strpos($theader,"\nsubject:");
$pos = strpos($theader,"subject:"); if (is_int($pos))
if (is_int($pos) && !$pos) { // found at start {
return $header; // found after a new line
} return $header;
$pos = substr($subject,"\n"); }
if (!is_int($pos)) $subject .= "\n"; $pos = strpos($theader,"subject:");
$subject = "Subject: " .$subject; if (is_int($pos) && !$pos)
$header .= $subject; {
return $header; // found at start
return $header;
}
$pos = substr($subject,"\n");
if (!is_int($pos)) $subject .= "\n";
$subject = "Subject: " .$subject;
$header .= $subject;
return $header;
}
function sig_html_to_text($sig)
{
// convert HTML chars in the email sig to normal text
// note: initially include a "magic_quote" like escape slash with the single and double quotes
$sig_clean = $sig;
$sig_clean = ereg_replace('&gt;', '>', $sig_clean);
$sig_clean = ereg_replace('&lt;', '<', $sig_clean);
$sig_clean = ereg_replace('&quot;', '\"', $sig_clean);
$sig_clean = ereg_replace('&#039;', '\'', $sig_clean);
$sig_clean = ereg_replace('&amp;', '&', $sig_clean);
// now strip the "magic_quote" like escape slashs
$sig_clean = stripslashes($sig_clean);
return $sig_clean;
} }
// ==============================================[ main function: smail() ]=== // ==============================================[ main function: smail() ]===
function smail($to,$subject,$message,$header) { function smail($to,$subject,$message,$header)
global $phpgw_info; {
global $phpgw_info;
$fromuser = $phpgw_info["user"]["preferences"]["email"]["address"]; $fromuser = $phpgw_info["user"]["preferences"]["email"]["address"];
$mymachine = $phpgw_info["server"]["hostname"]; $mymachine = $phpgw_info["server"]["hostname"];
$errcode = ""; $errmsg = ""; // error code and message of failed connection // error code and message of failed connection
$timeout = 5; // timeout in secs $errcode = "";
$errmsg = "";
// timeout in secs
$timeout = 5;
// now we try to open the socket and check, if any smtp server responds // now we try to open the socket and check, if any smtp server responds
$socket = fsockopen($phpgw_info["server"]["smtp_server"],$phpgw_info["server"]["smtp_port"],$errcode,$errmsg,$timeout); $socket = fsockopen($phpgw_info["server"]["smtp_server"],$phpgw_info["server"]["smtp_port"],$errcode,$errmsg,$timeout);
if (!$socket) { if (!$socket)
$this->err["code"] = "420"; {
$this->err["msg"] = "$errcode:$errmsg"; $this->err["code"] = "420";
$this->err["desc"] = "Connection to ".$phpgw_info["server"]["smtp_server"].":".$phpgw_info["server"]["smtp_port"]." failed - could not open socket."; $this->err["msg"] = "$errcode:$errmsg";
return false; $this->err["desc"] = "Connection to ".$phpgw_info["server"]["smtp_server"].":".$phpgw_info["server"]["smtp_port"]." failed - could not open socket.";
} else { return false;
$rrc = $this->socket2msg($socket); }
} else
{
$rrc = $this->socket2msg($socket);
}
// now we can send our message. 1st we identify ourselves and the sender // now we can send our message. 1st we identify ourselves and the sender
$cmds = array ( $cmds = array (
"\$src = \$this->msg2socket(\$socket,\"HELO \$mymachine\r\n\");", "\$src = \$this->msg2socket(\$socket,\"HELO \$mymachine\r\n\");",
"\$rrc = \$this->socket2msg(\$socket);", "\$rrc = \$this->socket2msg(\$socket);",
"\$src = \$this->msg2socket(\$socket,\"MAIL FROM:<\$fromuser>\r\n\");", "\$src = \$this->msg2socket(\$socket,\"MAIL FROM:<\$fromuser>\r\n\");",
"\$rrc = \$this->socket2msg(\$socket);" "\$rrc = \$this->socket2msg(\$socket);"
); );
for ($src=true,$rrc=true,$i=0; $i<count($cmds);$i++) { for ($src=true,$rrc=true,$i=0; $i<count($cmds);$i++)
eval ($cmds[$i]); {
if (!$src || !$rrc) return false; eval ($cmds[$i]);
} if (!$src || !$rrc)
{
return false;
}
}
// now we've got to evaluate the $to's // now we've got to evaluate the $to's
$toaddr = explode(",",$to); $toaddr = explode(",",$to);
$numaddr = count($toaddr); $numaddr = count($toaddr);
for ($i=0; $i<$numaddr; $i++) { for ($i=0; $i<$numaddr; $i++)
$src = $this->msg2socket($socket,'RCPT TO:<'.$toaddr[$i].">\r\n"); {
$rrc = $this->socket2msg($socket); $src = $this->msg2socket($socket,'RCPT TO:<'.$toaddr[$i].">\r\n");
$this->to_res[$i][addr] = $toaddr[$i]; // for lateron validation $rrc = $this->socket2msg($socket);
$this->to_res[$i][code] = $this->err["code"]; // for lateron validation
$this->to_res[$i][msg] = $this->err["msg"]; $this->to_res[$i][addr] = $toaddr[$i];
$this->to_res[$i][desc] = $this->err["desc"]; $this->to_res[$i][code] = $this->err["code"];
} $this->to_res[$i][msg] = $this->err["msg"];
$this->to_res[$i][desc] = $this->err["desc"];
}
//now we have to make sure that at least one $to-address was accepted //now we have to make sure that at least one $to-address was accepted
$stop = 1; $stop = 1;
for ($i=0;$i<count($this->to_res);$i++) { for ($i=0;$i<count($this->to_res);$i++)
$rc = substr($this->to_res[$i][code],0,1); {
if ($rc == 2) { // at least to this address we can deliver $rc = substr($this->to_res[$i][code],0,1);
$stop = 0; if ($rc == 2)
} {
} // at least to this address we can deliver
if ($stop) return false; // no address found we can deliver to $stop = 0;
}
}
if ($stop)
{
// no address found we can deliver to
return false;
}
// now we can go to deliver the message! // now we can go to deliver the message!
if (!$this->msg2socket($socket,"DATA\r\n")) return false; if (!$this->msg2socket($socket,"DATA\r\n"))
if (!$this->socket2msg($socket)) return false; {
if ($header != "") { return false;
$header = $this->check_header($subject,$header); }
if (!$this->put2socket($socket,$header)) return false; if (!$this->socket2msg($socket))
if (!$this->put2socket($socket,"\r\n")) return false; {
} return false;
$message = chop($message); }
$message .= "\n"; if ($header != "")
if (!$this->put2socket($socket,$message)) return false; {
if (!$this->msg2socket($socket,".\r\n")) return false; $header = $this->check_header($subject,$header);
if (!$this->socket2msg($socket)) return false; if (!$this->put2socket($socket,$header))
if (!$this->msg2socket($socket,"QUIT\r\n")) return false; {
Do { return false;
$closing = $this->socket2msg($socket); }
} while ($closing); if (!$this->put2socket($socket,"\r\n"))
return true; {
return false;
}
}
$message = chop($message);
$message .= "\n";
if (!$this->put2socket($socket,$message))
{
return false;
}
if (!$this->msg2socket($socket,".\r\n"))
{
return false;
}
if (!$this->socket2msg($socket))
{
return false;
}
if (!$this->msg2socket($socket,"QUIT\r\n"))
{
return false;
}
do
{
$closing = $this->socket2msg($socket);
}
while ($closing);
return true;
} }
// end of class // end of class