* @license http://www.contenido.org/license/LIZENZ.txt * @link http://www.4fb.de * @link http://www.contenido.org * @since file available since contenido release <= 4.6 * * {@internal * created 2004-08-01 * modified 2008-06-30, Dominik Ziegler, add security fix * modified 2011-03-14, Murat Purc, adapted to new GenericDB, partly ported to PHP 5, formatting * * $Id: class.newsletter.recipients.php 128 2019-07-03 11:58:28Z oldperl $: * }} * */ if (!defined('CON_FRAMEWORK')) { die('Illegal call'); } /** * Recipient management class */ class RecipientCollection extends ItemCollection { /** * Constructor Function * @param none */ public function __construct() { global $cfg; parent::__construct($cfg["tab"]["news_rcp"], "idnewsrcp"); $this->_setItemClass("Recipient"); } /** * Creates a new recipient * @param string $sEMail Specifies the e-mail adress * @param string $sName Specifies the recipient name (optional) * @param int $iConfirmed Specifies, if the recipient is confirmed (optional) * @param string $sJoinID Specifies additional recipient group ids to join (optional, e.g. 47,12,...) * @param int $iMessageType Specifies the message type for the recipient (0 = text, 1 = html) */ public function create($sEMail, $sName = "", $iConfirmed = 0, $sJoinID = "", $iMessageType = 0) { global $client, $lang, $auth; $iConfirmed = (int) $iConfirmed; $iMessageType = (int) $iMessageType; /* Check if the e-mail adress already exists */ $email = strtolower($email); // e-mail always lower case $this->setWhere("idclient", $client); $this->setWhere("idlang", $lang); $this->setWhere("email", $sEMail); $this->query(); if ($this->next()) { return $this->create($sEMail . "_" . substr(md5(rand()), 0, 10), $sName, 0, $sJoinID, $iMessageType); // 0: Deactivate 'confirmed' } $oItem = parent::createNewItem(); $oItem->set("idclient", $client); $oItem->set("idlang", $lang); $oItem->set("name", $sName); $oItem->set("email", $sEMail); $oItem->set("hash", substr(md5(rand()), 0, 17) . uniqid("")); // Generating UID, 30 characters $oItem->set("confirmed", $iConfirmed); $oItem->set("news_type", $iMessageType); if ($iConfirmed) { $oItem->set("confirmeddate", date("Y-m-d H:i:s"), false); } $oItem->set("deactivated", 0); $oItem->set("created", date("Y-m-d H:i:s"), false); $oItem->set("author", $auth->auth["uid"]); $oItem->store(); $iIDRcp = $oItem->get("idnewsrcp"); // Getting internal id of new recipient // Add this recipient to the default recipient group (if available) $oGroups = new RecipientGroupCollection(); $oGroupMembers = new RecipientGroupMemberCollection(); $oGroups->setWhere("idclient", $client); $oGroups->setWhere("idlang", $lang); $oGroups->setWhere("defaultgroup", 1); $oGroups->query(); while ($oGroup = $oGroups->next()) { $iIDGroup = $oGroup->get("idnewsgroup"); $oGroupMembers->create($iIDGroup, $iIDRcp); } // Add to other recipient groups as well? Do so! if ($sJoinID != "") { $aJoinID = explode(",", $sJoinID); if (count($aJoinID) > 0) { foreach ($aJoinID as $iIDGroup) { $oGroupMembers->create($iIDGroup, $iIDRcp); } } } return $oItem; } /** * Overridden delete method to remove recipient from groupmember table * before deleting recipient * * @param $itemID int specifies the recipient */ public function delete($itemID) { $oAssociations = new RecipientGroupMemberCollection(); $oAssociations->setWhere("idnewsrcp", $itemID); $oAssociations->query(); While ($oItem = $oAssociations->next()) { $oAssociations->delete($oItem->get("idnewsgroupmember")); } parent::delete($itemID); } /** * Purge method to delete recipients which hasn't been confirmed since over a month * @param $timeframe int Days after creation a not confirmed recipient will be removed * @return int Count of deleted recipients */ public function purge($timeframe) { global $client, $lang; $oRecipientCollection = new RecipientCollection(); // DATEDIFF(created, NOW()) > 30 would be better, but it's only available in MySQL V4.1.1 and above // Note, that, TO_DAYS or NOW may not be available in other database systems than MySQL $oRecipientCollection->setWhere("idclient", $client); $oRecipientCollection->setWhere("idlang", $lang); $oRecipientCollection->setWhere("confirmed", 0); $oRecipientCollection->setWhere("(TO_DAYS(NOW()) - TO_DAYS(created))", $timeframe, ">"); $oRecipientCollection->query(); while ($oItem = $oRecipientCollection->next()) { $oRecipientCollection->delete($oItem->get("idnewsrcp")); } return $oRecipientCollection->count(); } /** * checkEMail returns true, if there is no recipient with the same e-mail address; otherwise false * @param $email string e-mail * @return recpient item if item with e-mail exists, false otherwise */ public function emailExists($sEmail) { global $client, $lang; $oRecipientCollection = new RecipientCollection(); $oRecipientCollection->setWhere("idclient", $client); $oRecipientCollection->setWhere("idlang", $lang); $oRecipientCollection->setWhere("email", strtolower($sEmail)); $oRecipientCollection->query(); if ($oItem = $oRecipientCollection->next()) { return $oItem; } else { return false; } } /** * Sets a key for all recipients without key or an old key (len(key) <> 30) * @param none */ public function updateKeys() { $this->setWhere("LENGTH(hash)", 30, "<>"); $this->query(); $iUpdated = $this->count(); while ($oItem = $this->next()) { $oItem->set("hash", substr(md5(rand()), 0, 17) . uniqid("")); /* Generating UID, 30 characters */ $oItem->store(); } return $iUpdated; } } /** * Single Recipient Item */ class Recipient extends Item { /** * Constructor Function * @param mixed $mId Specifies the ID of item to load */ public function __construct($mId = false) { global $cfg; parent::__construct($cfg["tab"]["news_rcp"], "idnewsrcp"); if ($mId !== false) { $this->loadByPrimaryKey($mId); } } public function store() { global $auth; $this->set("lastmodified", date("Y-m-d H:i:s"), false); $this->set("modifiedby", $auth->auth["uid"]); parent::store(); // Update name, email and newsletter type for recipients in pending newsletter jobs $sName = $this->get("name"); $sEmail = $this->get("email"); if ($sName == "") { $sName = $sEmail; } $iNewsType = $this->get("news_type"); $oLogs = new cNewsletterLogCollection(); $oLogs->setWhere("idnewsrcp", $this->get($this->primaryKey)); $oLogs->setWhere("status", "pending"); $oLogs->query(); while ($oLog = $oLogs->next()) { $oLog->set("rcpname", $sName); $oLog->set("rcpemail", $sEmail); $oLog->set("rcpnewstype", $iNewsType); $oLog->store(); } } }