File indexing completed on 2024-05-12 05:58:46

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 Default_Model_MemberEmail
0026 {
0027     const CASE_INSENSITIVE = 1;
0028     /** @var string */
0029     protected $_dataTableName;
0030     /** @var  Default_Model_DbTable_MemberEmail */
0031     protected $_dataTable;
0032 
0033     /**
0034      * @inheritDoc
0035      */
0036     public function __construct($_dataTableName = 'Default_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 ? Default_Model_DbTable_MemberEmail::EMAIL_DELETED
0053             : Default_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         Default_Model_ActivityLog::logActivity($member_id, null, $member_id, Default_Model_ActivityLog::MEMBER_EMAIL_CHANGED);
0076 
0077         return true;
0078     }
0079 
0080     /**
0081      * @param $member_id
0082      *
0083      * @return bool
0084      * @throws Zend_Db_Statement_Exception
0085      */
0086     private function resetDefaultMailAddress($member_id)
0087     {
0088         $sql = "UPDATE `member_email` SET `email_primary` = 0 WHERE `email_member_id` = :member_id AND `email_primary` = 1";
0089 
0090         return $this->_dataTable->getAdapter()->query($sql, array('member_id' => $member_id))->execute();
0091     }
0092 
0093     /**
0094      * @param $member_id
0095      *
0096      * @return mixed
0097      * @throws Zend_Db_Statement_Exception
0098      * @throws Zend_Db_Table_Exception
0099      */
0100     private function updateMemberPrimaryMail($member_id)
0101     {
0102         $dataEmail = $this->fetchMemberPrimaryMail($member_id);
0103 
0104         return $this->saveMemberPrimaryMail($member_id, $dataEmail);
0105     }
0106 
0107     /**
0108      * @param $member_id
0109      *
0110      * @return mixed
0111      * @throws Zend_Db_Table_Exception
0112      */
0113     public function fetchMemberPrimaryMail($member_id)
0114     {
0115         $sql = "SELECT * FROM {$this->_dataTable->info('name')} WHERE email_member_id = :member_id AND email_primary = 1";
0116         $dataEmail = $this->_dataTable->getAdapter()->fetchRow($sql, array('member_id' => $member_id));
0117 
0118         return $dataEmail;
0119     }
0120 
0121     /**
0122      * @param $member_id
0123      * @param $dataEmail
0124      *
0125      * @return mixed
0126      * @throws Zend_Db_Statement_Exception
0127      */
0128     protected function saveMemberPrimaryMail($member_id, $dataEmail)
0129     {
0130         $modelMember = new Default_Model_Member();
0131         $dataMember = $modelMember->fetchMemberData($member_id);
0132         $dataMember->mail = $dataEmail['email_address'];
0133         $dataMember->mail_checked = isset($dataEmail['email_checked']) ? 1 : 0;
0134 
0135         return $dataMember->save();
0136     }
0137 
0138     /**
0139      * @param string $verification
0140      *
0141      * @return int count of updated rows
0142      * @throws Zend_Db_Statement_Exception
0143      */
0144     public function verificationEmail($verification)
0145     {
0146         $sql =
0147             "UPDATE `member_email` SET `email_checked` = NOW() WHERE `email_verification_value` = :verification AND `email_deleted` = 0 AND `email_checked` IS NULL";
0148         $stmnt = $this->_dataTable->getAdapter()->query($sql, array('verification' => $verification));
0149 
0150         return $stmnt->rowCount();
0151     }
0152 
0153     /**
0154      * @param int         $user_id
0155      * @param string      $user_mail
0156      * @param null|string $user_verification
0157      *
0158      * @return Zend_Db_Table_Row_Abstract
0159      * @throws Exception
0160      */
0161     public function saveEmail($user_id, $user_mail, $user_verification = null)
0162     {
0163         $data = array();
0164         $data['email_member_id'] = $user_id;
0165         $data['email_address'] = $user_mail;
0166         $data['email_hash'] = md5($user_mail);
0167         $data['email_verification_value'] =
0168             empty($user_verification) ? Default_Model_MemberEmail::getVerificationValue($user_id, $user_mail) : $user_verification;
0169 
0170         Default_Model_ActivityLog::logActivity($user_id, null, $user_id, Default_Model_ActivityLog::MEMBER_EMAIL_CHANGED,
0171             array('description' => 'user saved new mail address: ' . $user_mail));
0172 
0173         return $this->_dataTable->save($data);
0174     }
0175 
0176     /**
0177      * @param int    $user_name
0178      * @param string $member_email
0179      *
0180      * @return string
0181      */
0182     public static function getVerificationValue($user_name, $member_email)
0183     {
0184         return md5($user_name . $member_email . time());
0185     }
0186 
0187     public static function getHashForMailAddress($mail_address)
0188     {
0189         return md5($mail_address);
0190     }
0191 
0192     /**
0193      * @param int         $user_id
0194      * @param string      $user_mail
0195      * @param int         $user_mail_checked
0196      * @param null|string $user_verification
0197      *
0198      * @return Zend_Db_Table_Row_Abstract
0199      * @throws Zend_Db_Statement_Exception
0200      * @throws Zend_Db_Table_Exception
0201      * @throws Zend_Exception
0202      * @throws Exception
0203      */
0204     public function saveEmailAsPrimary($user_id, $user_mail, $user_mail_checked = 0, $user_verification = null)
0205     {
0206         if (empty($user_id) OR empty($user_mail)) {
0207             return false;
0208         }
0209 
0210         $data = array();
0211         $data['email_member_id'] = $user_id;
0212         $data['email_address'] = $user_mail;
0213         $data['email_hash'] = MD5($user_mail);
0214         $data['email_checked'] = $user_mail_checked == 1 ? new Zend_Db_Expr('Now()') : new Zend_Db_Expr('NULL');
0215         $data['email_verification_value'] =
0216             empty($user_verification) ? Default_Model_MemberEmail::getVerificationValue($user_id, $user_mail) : $user_verification;
0217         $data['email_primary'] = Default_Model_DbTable_MemberEmail::EMAIL_PRIMARY;
0218 
0219         $result = $this->_dataTable->save($data);
0220 
0221         $this->resetOtherPrimaryEmail($user_id, $user_mail);
0222 
0223         $this->updateMemberPrimaryMail($user_id);
0224 
0225         Default_Model_ActivityLog::logActivity($user_id, null, $user_id, Default_Model_ActivityLog::MEMBER_EMAIL_CHANGED,
0226             array('description' => 'user saved new primary mail address: ' . $user_mail));
0227 
0228         return $result;
0229     }
0230 
0231     private function resetOtherPrimaryEmail($user_id, $user_mail)
0232     {
0233         $sql = "
0234                 UPDATE `member_email`
0235                 SET `email_primary` = 0
0236                 WHERE `email_member_id` = :user_id AND `email_address` <> :user_mail; 
0237                 ";
0238         $result = $this->_dataTable->getAdapter()->query($sql, array('user_id' => $user_id, 'user_mail' => $user_mail));
0239 
0240     }
0241 
0242     /**
0243      * @param $member_id
0244      *
0245      * @return null
0246      * @throws Zend_Db_Table_Exception
0247      */
0248     public function getValidationValue($member_id)
0249     {
0250         $memberData = $this->fetchMemberPrimaryMail($member_id);
0251         if (count($memberData) == 0) {
0252             return null;
0253         }
0254 
0255         return $memberData['email_verification_value'];
0256     }
0257 
0258     /**
0259      * @param string $value
0260      * @param int    $test_case_sensitive
0261      *
0262      * @param array  $omitMember
0263      *
0264      * @return mixed
0265      */
0266     public function findMailAddress($value, $test_case_sensitive = self::CASE_INSENSITIVE, $omitMember = array())
0267     {
0268         $sql = "
0269             SELECT *
0270             FROM `member_email`
0271             WHERE
0272         ";
0273         if ($test_case_sensitive == self::CASE_INSENSITIVE) {
0274             $sql .= " LCASE(member_email.email_address) = LCASE(:mail_address)";
0275         } else {
0276             $sql .= " member_email.email_address = :mail_address";
0277         }
0278 
0279         if (count($omitMember) > 0) {
0280             $sql .= " AND member_email.email_member_id NOT IN (" . implode(',', $omitMember) . ")";
0281         }
0282 
0283         return $this->_dataTable->getAdapter()->fetchAll($sql, array('mail_address' => $value));
0284     }
0285 
0286     public function sendConfirmationMail($val, $verificationVal)
0287     {
0288         $confirmMail = new Default_Plugin_SendMail('tpl_verify_user');
0289         $confirmMail->setTemplateVar('servername', $this->getServerName());
0290         $confirmMail->setTemplateVar('username', $val['username']);
0291         $confirmMail->setTemplateVar('verificationlinktext',
0292             '<a href="https://' . $this->getServerName() . '/verification/' . $verificationVal
0293             . '">Click here to verify your email address</a>');
0294         $confirmMail->setTemplateVar('verificationlink',
0295             '<a href="https://' . $this->getServerName() . '/verification/' . $verificationVal . '">https://' . $this->getServerName()
0296             . '/verification/' . $verificationVal . '</a>');
0297         $confirmMail->setTemplateVar('verificationurl', 'https://' . $this->getServerName() . '/verification/' . $verificationVal);
0298         $confirmMail->setReceiverMail($val['mail']);
0299         $confirmMail->setFromMail('registration@opendesktop.org');
0300         $confirmMail->send();
0301     }
0302 
0303     private function getServerName()
0304     {
0305         /** @var Zend_Controller_Request_Http $request */
0306         $request = Zend_Controller_Front::getInstance()->getRequest();
0307 
0308         return $request->getHttpHost();
0309     }
0310 
0311 }