arrAccepted (an array of IDs of accepted mailinglists) // comment: a message could be sent into more than one mailinglist class CValidator { // new email message to validate var $emailMessage; // mime mail parser var $emailParser; // parser for line containing one or more email addreses; var $lineParser; // final array of all recievers ( TO and CC ) // in regular format @ . var $arrAddressesToValidate = Array(); //final array of accepted emails var $arrAccepted = Array(); // opens and reads the content of // email message identified by its filename function openEmailMessage($msgFilename) { // {{{ $this->emailMessage = new CEmailMessage(); $this->emailMessage->filename = $msgFilename; $this->emailMessage->readEmailFile(); } // }}} // parses email message using mime parser function parseEmail($decodeHeader = true, $decodeBody = false) { // {{{ $this->emailParser = new Mail_mimeDecode($this->emailMessage->content, "\r\n"); $params['include_bodies'] = true; $params['decode_bodies'] = true; $params['decode_headers'] = true; $this->emailMessage->structure = $this->emailParser->decode($params); $this->emailMessage->header = $this->emailParser->_header; $this->emailMessage->body = $this->emailMessage->structure->body; $this->emailMessage->subject = Trim($this->emailMessage->structure->headers['subject']); $this->emailMessage->all_body = $this->emailParser->_body; } // }}} // reads array of recievers from parsed message // uses header "x-original-to" as default // or header "to" function getRecievers() { // {{{ $this->lineParser = new CLine2Emails(); $this->lineParser->inputLine = $this->emailMessage->structure->headers["to"]; if (isset($this->emailMessage->structure->headers["x-original-to"])) $this->lineParser->inputLine .= ", ".$this->emailMessage->structure->headers["x-original-to"]; /*if (isset($this->emailMessage->structure->headers["x-original-to"])) if ( 0 ) // chcem ignorovat x-originalt0 .. docasne { $this->lineParser->inputLine = $this->emailMessage->structure->headers["x-original-to"]; $this->emailMessage->X_ORIGINAL_TO = true; } else if (isset($this->emailMessage->structure->headers["to"])) $this->lineParser->inputLine = $this->emailMessage->structure->headers["to"]; else return; */ $this->lineParser->processLine(); $this->emailMessage->arrRecievers = $this->lineParser->arr_valid_emails; } // }}} // reads the sender of parsed message // uses header "from" function getSender() { // {{{ $this->lineParser = new CLine2Emails(); if (isset($this->emailMessage->structure->headers["from"])) $this->lineParser->inputLine = $this->emailMessage->structure->headers["from"]; else return; $this->lineParser->processLine(); $this->emailMessage->sender = $this->lineParser->arr_valid_emails[0]; } // }}} // reads the list of cc recievers // uses header "cc"; function getCCRecievers() { // {{{ $this->lineParser = new CLine2Emails(); if (isset($this->emailMessage->structure->headers["cc"])) $this->lineParser->inputLine = $this->emailMessage->structure->headers["cc"]; else return; $this->lineParser->processLine(); $this->emailMessage->arrCCRecievers = $this->lineParser->arr_valid_emails; } // }}} // union of [TO|X-ORIGINAL-TO] and [CC] addresses function addressesToValidate() { // {{{ for ($i =0; $i< Count($this->emailMessage->arrRecievers); $i++) { $addThis = true; for($j=0; $j < Count($this->arrAddressesToValidate); $j++) { if ($this->arrAddressesToValidate[$j] == $this->emailMessage->arrRecievers[$i]) { $addThis = false; break; } } if ( $addThis == true ) { $this->arrAddressesToValidate[Count($this->arrAddressesToValidate)] = $this->emailMessage->arrRecievers[$i]; } } for ($i =0; $i< Count($this->emailMessage->arrCCRecievers); $i++) { $addThis = true; for($j=0; $j < Count($this->arrAddressesToValidate); $j++) { if ($this->arrAddressesToValidate[$j] == $this->emailMessage->arrCCRecievers[$i]) { $addThis = false; break; } } if ( $addThis == true ) { $this->arrAddressesToValidate[Count($this->arrAddressesToValidate)] = $this->emailMessage->arrCCRecievers[$i]; } } } // }}} function getAllNeccessaryEmails() { // {{{ $this->getRecievers(); // if ($this->emailMessage->X_ORIGINAL_TO != true ) $this->getCCRecievers(); $this->addressesToValidate(); $this->getSender(); } // }}} // validates appropriate email message // checks whether the recivers address is a mailing list // and whether the senders is allowed to send a message to // selected mailing list function validateEmail() { // {{{ global $dbh; global $tb_users, $cl_users_id, $cl_users_email; for($i=0; $iarrAddressesToValidate); $i++) { $sql = "SELECT mylist_lists.id, mylist_lists.name, "; $sql .= "mylist_lists.f_members_only_post, "; $sql .= "mylist_lists.max_message_size, "; $sql .= "Count(mylist_senders.list_id) as numAllowed "; $sql .= "FROM mylist_lists "; $sql .= "LEFT JOIN mylist_senders "; $sql .= "ON mylist_senders.list_id = mylist_lists.id "; $sql .= "AND mylist_senders.permission = 'allow' "; $sql .= "WHERE mylist_lists.name = "; $sql .= "'".$this->arrAddressesToValidate[$i]."' "; $sql .= "AND mylist_lists.f_valid = 1 "; $sql .= "GROUP BY mylist_senders.list_id;"; $res =& $dbh->query($sql); if (PEAR::isError($res)) die($res->isError()); $res->fetchInto($row); // there exists a mailing list with this address if (isset($row["id"])) { while (1) { //compare the message with max message size if ($row["max_message_size"] != 0) if ($row["max_message_size"] * 1024 < $this->emailMessage->messageSize) { $this->rejectMessage($i,"mlist existuje, ale filesize spravy je vacsia ako max message size-".$row["max_message_size"]); // reject response $rr = new CResponse(); $params['type'] = "MSG_FILESIZE"; $params['list_name'] = $this->arrAddressesToValidate[$i]; $params['subject'] = $this->emailMessage->subject; $params['max_size'] = $row["max_message_size"] * 1024; $params['msg_size'] = $this->emailMessage->messageSize; $rr->setType($params); $rr->send($this->emailMessage->sender); break; } // is sender of this message allowed // or not allowed to post $sql = "SELECT permission FROM "; $sql .= "mylist_senders "; $sql .= "WHERE "; $sql .= "list_id = ".$row["id"]; $sql .= " AND "; $sql .= "user_email = "; $sql .= "'".$this->emailMessage->sender."';"; $res2 =& $dbh->query($sql); if (PEAR::isError($res2)) die($res2->getMessage()); $res2->fetchInto($row2, DB_FETCHMODE_ASSOC); if ($row2["permission"] == "deny") { $this->rejectMessage($i,"mlist existuje, ale permission pre sendera je deny"); // reject response $rr = new CResponse(); $params['type'] = "SENDER_DENY"; $params['subject'] = $this->emailMessage->subject; $params['list_name'] = $this->arrAddressesToValidate[$i]; $rr->setType($params); $rr->send($this->emailMessage->sender); break; } else if ($row["numAllowed"] > 0 && $row2["permission"] != "allow") { $this->rejectMessage($i,"mlist existuje, ale je nenulovy pocet allowed senderov a tento tam nie je"); // reject response $rr = new CResponse(); $params['type'] = "SENDER_NOT_ALLOWED"; $params['list_name'] = $this->arrAddressesToValidate[$i]; $params['subject'] = $this->emailMessage->subject; $rr->setType($params); $rr->send($this->emailMessage->sender); break; } // only members may post a message if ($row["f_members_only_post"] == 1 ) { $sql = "SELECT 1 as member FROM mylist_list_users "; $sql .= "LEFT JOIN $tb_users "; $sql .= "ON $tb_users.$cl_users_id = mylist_list_users.user_id "; $sql .= "WHERE mylist_list_users.list_id="; $sql .= $row["id"]; $sql .= " AND "; $sql .= "( "; $sql .= "mylist_list_users.email = "; $sql .= "'".$this->emailMessage->sender."'"; $sql .= " OR "; $sql .= "$tb_users.$cl_users_email = "; $sql .= "'".$this->emailMessage->sender."')"; $res3 =& $dbh->query($sql); if (PEAR::isError($res3)) die($res3->getMessage()); $res3->fetchInto($row3); if ($row3["member"] == 1 ) { $this->acceptMessage($i, "f_members_only =1 a sender je member", $row["id"]); } else { $this->rejectMessage($i,"mlist existuje, f_members_only_post=1, ale user nie je member"); // reject response $rr = new CResponse(); $params['type'] = "SENDER_NOT_MEMBER"; $params['subject'] = $this->emailMessage->subject; $params['list_name'] = $this->arrAddressesToValidate[$i]; $rr->setType($params); $rr->send($this->emailMessage->sender); } } else { $this->acceptMessage($i,"f_members_only = 0", $row["id"]); } break; } // end of while } else { $this->rejectMessage($i, "mlist neexistuje"); } } } // }}} function acceptMessage($id, $reason, $id_mlist) { // {{{ $this->arrAccepted[Count($this->arrAccepted)] = $id_mlist; echo "+++++++++++++++++++++++\n\n"; echo "accept: ".$this->arrAddressesToValidate[$id]."\n"; echo "reason: $reason \n"; echo "id_mlist: $id_mlist\n"; echo "+++++++++++++++++++++++\n\n"; } // }}} function rejectMessage($id, $reason) { // {{{ echo "***********************\n"; echo "reject: ".$this->arrAddressesToValidate[$id]."\n"; echo "reason: $reason \n"; echo "***********************\n\n"; } // }}} } // vim: fdm=marker fdl=0 fdc=3 ?>