File indexing completed on 2025-02-09 07:14:39
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 }