File indexing completed on 2024-04-21 05:54:20

0001 <?php
0002 
0003 /**
0004  *  ocs-webserver
0005  *
0006  *  Copyright 2016 by pling GmbH.
0007  *
0008  *    This file is part of ocs-webserver.
0009  *
0010  *    This program is free software: you can redistribute it and/or modify
0011  *    it under the terms of the GNU Affero General Public License as
0012  *    published by the Free Software Foundation, either version 3 of the
0013  *    License, or (at your option) any later version.
0014  *
0015  *    This program is distributed in the hope that it will be useful,
0016  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
0017  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
0018  *    GNU Affero General Public License for more details.
0019  *
0020  *    You should have received a copy of the GNU Affero General Public License
0021  *    along with this program.  If not, see <http://www.gnu.org/licenses/>.
0022  *
0023  *    Created: 22.09.2016
0024  **/
0025 class Application_Model_MemberEmail
0026 {
0027     const CASE_INSENSITIVE = 1;
0028     /** @var string */
0029     protected $_dataTableName;
0030     /** @var  Application_Model_DbTable_MemberEmail */
0031     protected $_dataTable;
0032 
0033     /**
0034      * @inheritDoc
0035      */
0036     public function __construct($_dataTableName = 'Application_Model_DbTable_MemberEmail')
0037     {
0038         $this->_dataTableName = $_dataTableName;
0039         $this->_dataTable = new $this->_dataTableName;
0040     }
0041 
0042     /**
0043      * @param int  $member_id
0044      * @param bool $email_deleted
0045      *
0046      * @return array
0047      * @throws Zend_Db_Statement_Exception
0048      * @throws Zend_Db_Table_Exception
0049      */
0050     public function fetchAllMailAddresses($member_id, $email_deleted = false)
0051     {
0052         $deleted = $email_deleted === true ? Application_Model_DbTable_MemberEmail::EMAIL_DELETED
0053             : Application_Model_DbTable_MemberEmail::EMAIL_NOT_DELETED;
0054         $sql =
0055             "SELECT * FROM {$this->_dataTable->info('name')} WHERE `email_member_id` = :memberId AND `email_deleted` = :emailDeleted";
0056         $stmnt = $this->_dataTable->getAdapter()->query($sql, array('memberId' => $member_id, 'emailDeleted' => $deleted));
0057 
0058         return $stmnt->fetchAll();
0059     }
0060 
0061     /**
0062      * @param $emailId
0063      * @param $member_id
0064      *
0065      * @return bool
0066      * @throws Zend_Db_Statement_Exception
0067      * @throws Zend_Db_Table_Exception
0068      * @throws Zend_Exception
0069      */
0070     public function setDefaultEmail($emailId, $member_id)
0071     {
0072         $result = $this->resetDefaultMailAddress($member_id);
0073         $this->_dataTable->setPrimary($emailId);
0074         $this->updateMemberPrimaryMail($member_id); /* if we change the mail in member table, we change the login. */
0075 
0076         return true;
0077     }
0078 
0079     /**
0080      * @param $member_id
0081      *
0082      * @return bool
0083      * @throws Zend_Db_Statement_Exception
0084      */
0085     private function resetDefaultMailAddress($member_id)
0086     {
0087         $sql = "UPDATE `member_email` SET `email_primary` = 0 WHERE `email_member_id` = :member_id AND `email_primary` = 1";
0088 
0089         return $this->_dataTable->getAdapter()->query($sql, array('member_id' => $member_id))->execute();
0090     }
0091 
0092     /**
0093      * @param $member_id
0094      *
0095      * @return mixed
0096      * @throws Zend_Db_Statement_Exception
0097      * @throws Zend_Db_Table_Exception
0098      */
0099     private function updateMemberPrimaryMail($member_id)
0100     {
0101         $dataEmail = $this->fetchMemberPrimaryMail($member_id);
0102 
0103         return $this->saveMemberPrimaryMail($member_id, $dataEmail);
0104     }
0105 
0106     /**
0107      * @param $member_id
0108      *
0109      * @return mixed
0110      * @throws Zend_Db_Table_Exception
0111      */
0112     public function fetchMemberPrimaryMail($member_id)
0113     {
0114         $sql = "SELECT * FROM {$this->_dataTable->info('name')} WHERE email_member_id = :member_id AND email_primary = 1";
0115         $dataEmail = $this->_dataTable->getAdapter()->fetchRow($sql, array('member_id' => $member_id));
0116 
0117         return $dataEmail;
0118     }
0119 
0120     /**
0121      * @param $member_id
0122      * @param $dataEmail
0123      *
0124      * @return mixed
0125      * @throws Zend_Db_Statement_Exception
0126      */
0127     protected function saveMemberPrimaryMail($member_id, $dataEmail)
0128     {
0129         $modelMember = new Application_Model_Member();
0130         $dataMember = $modelMember->fetchMemberData($member_id);
0131         $dataMember->mail = $dataEmail['email_address'];
0132         $dataMember->mail_checked = isset($dataEmail['email_checked']) ? 1 : 0;
0133 
0134         return $dataMember->save();
0135     }
0136 
0137     /**
0138      * @param string $verification
0139      *
0140      * @return int count of updated rows
0141      * @throws Zend_Db_Statement_Exception
0142      */
0143     public function verificationEmail($verification)
0144     {
0145         $sql =
0146             "UPDATE `member_email` SET `email_checked` = NOW() WHERE `email_verification_value` = :verification AND `email_deleted` = 0 AND `email_checked` IS NULL";
0147         $stmnt = $this->_dataTable->getAdapter()->query($sql, array('verification' => $verification));
0148 
0149         return $stmnt->rowCount();
0150     }
0151 
0152     /**
0153      * @param int         $user_id
0154      * @param string      $user_mail
0155      * @param null|string $user_verification
0156      *
0157      * @return Zend_Db_Table_Row_Abstract
0158      * @throws Exception
0159      */
0160     public function saveEmail($user_id, $user_mail, $user_verification = null)
0161     {
0162         $data = array();
0163         $data['email_member_id'] = $user_id;
0164         $data['email_address'] = $user_mail;
0165         $data['email_hash'] = md5($user_mail);
0166         $data['email_verification_value'] =
0167             empty($user_verification) ? Application_Model_MemberEmail::getVerificationValue($user_id, $user_mail) : $user_verification;
0168 
0169         return $this->_dataTable->save($data);
0170     }
0171 
0172     /**
0173      * @param int    $user_name
0174      * @param string $member_email
0175      *
0176      * @return string
0177      */
0178     public static function getVerificationValue($user_name, $member_email)
0179     {
0180         return md5($user_name . $member_email . time());
0181     }
0182 
0183     public static function getHashForMailAddress($mail_address)
0184     {
0185         return md5($mail_address);
0186     }
0187 
0188     /**
0189      * @param int         $user_id
0190      * @param string      $user_mail
0191      * @param int         $user_mail_checked
0192      * @param null|string $user_verification
0193      *
0194      * @return Zend_Db_Table_Row_Abstract
0195      * @throws Zend_Db_Statement_Exception
0196      * @throws Zend_Db_Table_Exception
0197      * @throws Zend_Exception
0198      * @throws Exception
0199      */
0200     public function saveEmailAsPrimary($user_id, $user_mail, $user_mail_checked = 0, $user_verification = null)
0201     {
0202         if (empty($user_id) OR empty($user_mail)) {
0203             return false;
0204         }
0205 
0206         $data = array();
0207         $data['email_member_id'] = $user_id;
0208         $data['email_address'] = $user_mail;
0209         $data['email_hash'] = MD5($user_mail);
0210         $data['email_checked'] = $user_mail_checked == 1 ? new Zend_Db_Expr('Now()') : new Zend_Db_Expr('NULL');
0211         $data['email_verification_value'] =
0212             empty($user_verification) ? Application_Model_MemberEmail::getVerificationValue($user_id, $user_mail) : $user_verification;
0213         $data['email_primary'] = Application_Model_DbTable_MemberEmail::EMAIL_PRIMARY;
0214 
0215         $result = $this->_dataTable->save($data);
0216 
0217         $this->resetOtherPrimaryEmail($user_id, $user_mail);
0218 
0219         $this->updateMemberPrimaryMail($user_id);
0220 
0221         return $result;
0222     }
0223 
0224     private function resetOtherPrimaryEmail($user_id, $user_mail)
0225     {
0226         $sql = "
0227                 UPDATE `member_email`
0228                 SET `email_primary` = 0
0229                 WHERE `email_member_id` = :user_id AND `email_address` <> :user_mail; 
0230                 ";
0231         $result = $this->_dataTable->getAdapter()->query($sql, array('user_id' => $user_id, 'user_mail' => $user_mail));
0232 
0233     }
0234 
0235     /**
0236      * @param $member_id
0237      *
0238      * @return null
0239      * @throws Zend_Db_Table_Exception
0240      */
0241     public function getValidationValue($member_id)
0242     {
0243         $memberData = $this->fetchMemberPrimaryMail($member_id);
0244         if (count($memberData) == 0) {
0245             return null;
0246         }
0247 
0248         return $memberData['email_verification_value'];
0249     }
0250 
0251     /**
0252      * @param string $value
0253      * @param int    $test_case_sensitive
0254      *
0255      * @param array  $omitMember
0256      *
0257      * @return mixed
0258      */
0259     public function findMailAddress($value, $test_case_sensitive = self::CASE_INSENSITIVE, $omitMember = array())
0260     {
0261         $sql = "
0262             SELECT *
0263             FROM `member_email`
0264             WHERE
0265         ";
0266         if ($test_case_sensitive == self::CASE_INSENSITIVE) {
0267             $sql .= " LCASE(member_email.email_address) = LCASE(:mail_address)";
0268         } else {
0269             $sql .= " member_email.email_address = :mail_address";
0270         }
0271 
0272         if (count($omitMember) > 0) {
0273             $sql .= " AND member_email.email_member_id NOT IN (" . implode(',', $omitMember) . ")";
0274         }
0275 
0276         return $this->_dataTable->getAdapter()->fetchAll($sql, array('mail_address' => $value));
0277     }
0278 
0279     public function sendConfirmationMail($val, $verificationVal)
0280     {
0281         $confirmMail = new Default_Plugin_SendMail('tpl_verify_user');
0282         $confirmMail->setTemplateVar('servername', $this->getServerName());
0283         $confirmMail->setTemplateVar('username', $val['username']);
0284         $confirmMail->setTemplateVar('verificationlinktext',
0285             '<a href="https://' . $this->getServerName() . '/verification/' . $verificationVal
0286             . '">Click here to verify your email address</a>');
0287         $confirmMail->setTemplateVar('verificationlink',
0288             '<a href="https://' . $this->getServerName() . '/verification/' . $verificationVal . '">https://' . $this->getServerName()
0289             . '/verification/' . $verificationVal . '</a>');
0290         $confirmMail->setTemplateVar('verificationurl', 'https://' . $this->getServerName() . '/verification/' . $verificationVal);
0291         $confirmMail->setReceiverMail($val['mail']);
0292         $confirmMail->setFromMail('registration@opendesktop.org');
0293         $confirmMail->send();
0294     }
0295 
0296     private function getServerName()
0297     {
0298         /** @var Zend_Controller_Request_Http $request */
0299         $request = Zend_Controller_Front::getInstance()->getRequest();
0300 
0301         return $request->getHttpHost();
0302     }
0303 
0304 }