File indexing completed on 2024-05-19 05:59:03

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 }