File indexing completed on 2025-05-04 05:28:59
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: 06.08.2018 0024 */ 0025 class Backend_CmatrixController extends Local_Controller_Action_CliAbstract 0026 { 0027 0028 const filename = "member"; 0029 const filename_errors = "member_error"; 0030 0031 protected $logfile; 0032 protected $errorlogfile; 0033 /** @var Zend_Config */ 0034 protected $config; 0035 protected $log; 0036 0037 /** 0038 * @inheritDoc 0039 */ 0040 public function __construct( 0041 Zend_Controller_Request_Abstract $request, 0042 Zend_Controller_Response_Abstract $response, 0043 array $invokeArgs = array() 0044 ) { 0045 parent::__construct($request, $response, $invokeArgs); 0046 $this->config = Zend_Registry::get('config')->settings->server->chat; 0047 $this->log = Zend_Registry::get('logger'); 0048 $this->_helper->viewRenderer->setNoRender(false); 0049 } 0050 0051 0052 /** 0053 * @throws Zend_Db_Statement_Exception 0054 * @throws Zend_Exception 0055 */ 0056 public function runAction() 0057 { 0058 ini_set('memory_limit', '1024M'); 0059 0060 $force = (boolean)$this->getParam('force', false); 0061 $method = $this->getParam('method', 'create'); 0062 0063 $this->log->info("--------------" . PHP_EOL . "METHOD: {$method}" . PHP_EOL); 0064 0065 if ('create' == $method) { 0066 if ($this->hasParam('member_id')) { 0067 $memberId = $this->getParam('member_id'); 0068 $operator = $this->getParam('op', null); 0069 $members = $this->getMemberList($memberId, $operator); 0070 } else { 0071 $members = $this->getMemberList(); 0072 } 0073 $this->exportMembers($members, $force); 0074 0075 return; 0076 } 0077 if ('avatar' == $method) { 0078 $members = $this->getNewChatUser(); 0079 $this->updateAvatar($members); 0080 0081 return; 0082 } 0083 if ('update' == $method) { 0084 //$this->updateMembers($members); 0085 echo "not implemented"; 0086 0087 return; 0088 } 0089 if ('validate' == $method) { 0090 //$this->validateMembers($members); 0091 echo "not implemented"; 0092 0093 return; 0094 } 0095 } 0096 0097 /** 0098 * @param null $member_id 0099 * @param string $operator 0100 * 0101 * @return Zend_Db_Statement_Interface 0102 * @throws Zend_Db_Statement_Exception 0103 */ 0104 private function getMemberList($member_id = null, $operator = "=") 0105 { 0106 $filter = ""; 0107 if (empty($operator)) { 0108 $operator = "="; 0109 } 0110 if ($operator == "gt") { 0111 $operator = ">"; 0112 } 0113 if ($operator == "lt") { 0114 $operator = "<"; 0115 } 0116 if (isset($member_id)) { 0117 $filter = " AND `m`.`member_id` {$operator} " . $member_id; 0118 } 0119 0120 $sql = " 0121 SELECT `mei`.`external_id`,`m`.`member_id`, `m`.`username`, `me`.`email_address`, `m`.`password`, `m`.`roleId`, `m`.`firstname`, `m`.`lastname`, `m`.`profile_image_url`, `m`.`created_at`, `m`.`changed_at`, `m`.`source_id`, `m`.`biography`, `me`.`email_address` AS `mail`, IF(ISNULL(`me`.`email_checked`),0,1) AS `mail_checked`, `m`.`password_type`, `m`.`is_active`, `m`.`is_deleted` 0122 FROM `member` AS `m` 0123 LEFT JOIN `member_email` AS `me` ON `me`.`email_member_id` = `m`.`member_id` AND `me`.`email_primary` = 1 0124 LEFT JOIN `member_external_id` AS `mei` ON `mei`.`member_id` = `m`.`member_id` 0125 WHERE `m`.`is_active` = 1 0126 AND `m`.`is_deleted` = 0 0127 AND `me`.`email_checked` IS NOT NULL 0128 AND `me`.`email_deleted` = 0 0129 AND LOCATE('_double', `m`.`username`) = 0 0130 AND LOCATE('_double', `me`.`email_address`) = 0 0131 " . $filter . " 0132 ORDER BY `m`.`member_id` ASC 0133 "; 0134 0135 $result = Zend_Db_Table::getDefaultAdapter()->query($sql); 0136 0137 $this->log->info("Load : " . $result->rowCount() . " members..."); 0138 0139 return $result; 0140 } 0141 0142 /** 0143 * @param Zend_Db_Statement_Interface $members 0144 * 0145 * @param bool $force 0146 * 0147 * @return bool 0148 * @throws Zend_Db_Statement_Exception 0149 * @throws Zend_Exception 0150 */ 0151 private function exportMembers($members, $force = false) 0152 { 0153 // only usernames which are valid in github/gitlab 0154 $usernameValidChars = new Local_Validate_UsernameValid(); 0155 $emailValidate = new Zend_Validate_EmailAddress(); 0156 $modelOcs = new Default_Model_Ocs_Matrix($this->config); 0157 0158 while ($member = $members->fetch()) { 0159 $this->log->info("process " . Zend_Json::encode($member)); 0160 0161 //if (false === $usernameValidChars->isValid($member['username'])) { 0162 // file_put_contents($this->errorlogfile, print_r($member, true) . "user name validation error" . "\n\n", FILE_APPEND); 0163 // continue; 0164 //} 0165 if (false === $emailValidate->isValid($member["email_address"])) { 0166 $this->log->info("messages [\"email address validation error\"] "); 0167 continue; 0168 } 0169 try { 0170 //Export User, if he not exists 0171 $modelOcs->createUserFromArray($member, $force); 0172 } catch (Exception $e) { 0173 $this->log->info($e->getMessage() . PHP_EOL . $e->getTraceAsString()); 0174 } 0175 $messages = $modelOcs->getMessages(); 0176 $this->log->info("messages " . Zend_Json::encode($messages)); 0177 } 0178 0179 return true; 0180 } 0181 0182 private function getNewChatUser() 0183 { 0184 $home_server = $this->config->home_server; 0185 0186 $sql = " 0187 SELECT `user_id`, `username`, `profile_image_url`, `member_id` 0188 FROM `member_matrix_data` 0189 JOIN `member` ON `member_matrix_data`.`user_id` = concat('@',lower(`member`.`username`),':','{$home_server}') 0190 WHERE `member_matrix_data`.`is_imported` = 0 AND `member`.`is_active` = 1 0191 "; 0192 0193 $result = Zend_Db_Table::getDefaultAdapter()->query($sql); 0194 0195 $this->log->info("Load : " . $result->rowCount() . " members..."); 0196 0197 return $result; 0198 } 0199 0200 /** 0201 * @param Zend_Db_Statement_Interface $members 0202 * 0203 * @return bool 0204 * @throws Zend_Db_Statement_Exception 0205 * @throws Zend_Exception 0206 */ 0207 private function updateAvatar($members) 0208 { 0209 $model = new Default_Model_Ocs_Matrix($this->config); 0210 0211 while ($member = $members->fetch()) { 0212 $this->log->info("process " . Zend_Json::encode($member)); 0213 try { 0214 $successful = $model->setAvatarFromArray($member); 0215 if ($successful) { 0216 $this->setAvatarUpdated($member['user_id']); 0217 } 0218 } catch (Exception $e) { 0219 $this->log->info($e->getMessage() . PHP_EOL . $e->getTraceAsString()); 0220 } 0221 $messages = $model->getMessages(); 0222 $this->log->info("messages " . Zend_Json::encode($messages)); 0223 } 0224 0225 return true; 0226 } 0227 0228 private function setAvatarUpdated($user_id) 0229 { 0230 $sql = " 0231 UPDATE `member_matrix_data` 0232 SET `is_imported` = 1, `imported_at` = NOW() 0233 WHERE `user_id` = '{$user_id}' 0234 "; 0235 0236 $result = Zend_Db_Table::getDefaultAdapter()->query($sql); 0237 0238 return $result; 0239 } 0240 0241 }