File indexing completed on 2025-02-09 07:14:36
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: 10.09.2018 0024 */ 0025 class Default_Model_Ocs_Forum 0026 { 0027 protected $config; 0028 protected $messages; 0029 protected $httpClient; 0030 protected $isRateLimitError; 0031 protected $rateLimitWaitSeconds; 0032 0033 /** 0034 * @inheritDoc 0035 * @param array|null $config 0036 * @throws Default_Model_Ocs_Gitlab_Exception 0037 * @throws Zend_Exception 0038 */ 0039 public function __construct($config = null) 0040 { 0041 if (isset($config)) { 0042 $this->config = $config; 0043 } else { 0044 $this->config = Zend_Registry::get('config')->settings->server->forum; 0045 } 0046 $uri = $this->config->host; 0047 $this->httpClient = $this->getHttpClient($uri); 0048 } 0049 0050 /** 0051 * @param $uri 0052 * @return Zend_Http_Client 0053 * @throws Default_Model_Ocs_Gitlab_Exception 0054 */ 0055 protected function getHttpClient($uri) 0056 { 0057 try { 0058 if (empty($uri)) { 0059 return new Zend_Http_Client(null, array('keepalive' => true, 'strictredirects' => true)); 0060 } 0061 0062 return new Zend_Http_Client($uri, array('keepalive' => true, 'strictredirects' => true)); 0063 } catch (Zend_Exception $e) { 0064 throw new Default_Model_Ocs_Gitlab_Exception('Can not create http client for uri: ' . $uri, 0, $e); 0065 } 0066 } 0067 0068 /** 0069 * @param array $member_data 0070 * 0071 * @param bool $force 0072 * 0073 * @return array|bool 0074 */ 0075 public function createUserFromArray($member_data, $force = false) 0076 { 0077 if (empty($member_data)) { 0078 return false; 0079 } 0080 0081 $this->messages = array(); 0082 0083 $data = $this->mapUserData($member_data); 0084 0085 try { 0086 $user = $this->getUser($member_data['external_id'], $member_data['username']); 0087 } catch (Zend_Exception $e) { 0088 $this->messages[] = "Fail " . $e->getMessage(); 0089 0090 return false; 0091 } 0092 $uid = $data['username']; 0093 0094 if (empty($user)) { 0095 try { 0096 $uri = $this->config->host . "/users"; 0097 $method = Zend_Http_Client::POST; 0098 $result = $this->httpRequest($uri, $uid, $method, $data); 0099 if (false === $result) { 0100 $this->messages[] = "Fail "; 0101 0102 return false; 0103 } 0104 } catch (Zend_Exception $e) { 0105 $this->messages[] = "Fail " . $e->getMessage(); 0106 0107 return false; 0108 } 0109 $this->messages[] = "Success"; 0110 0111 return $data; 0112 } 0113 0114 if ($force === true) { 0115 $uid = $user['user']['username']; 0116 unset($data['password']); 0117 0118 try { 0119 $uri = $this->config->host . "/users/{$uid}.json"; 0120 $method = Zend_Http_Client::PUT; 0121 $result = $this->httpRequest($uri, $uid, $method, $data); 0122 } catch (Zend_Exception $e) { 0123 $this->messages[] = "Fail " . $e->getMessage(); 0124 0125 return false; 0126 } 0127 $this->messages[] = "overwritten : " . json_encode($result); 0128 0129 return $user; 0130 } 0131 0132 $this->messages[] = 'user already exists.'; 0133 0134 return false; 0135 } 0136 0137 /** 0138 * @param array $user 0139 * 0140 * @return array 0141 */ 0142 protected function mapUserData($user) 0143 { 0144 $paramEmail = ''; 0145 if (isset($user['email_address'])) { 0146 $paramEmail = $user['email_address']; 0147 } else { 0148 if (isset($user['mail'])) { 0149 $paramEmail = $user['mail']; 0150 } 0151 } 0152 0153 $data = array( 0154 'name' => (false == empty($user['lastname'])) ? trim($user['firstname'] . ' ' . $user['lastname']) 0155 : $user['username'], 0156 'email' => $paramEmail, 0157 'password' => $user['password'], 0158 'username' => strtolower($user['username']), 0159 'active' => $user['is_active'] ? true : false, 0160 'approved' => (false == empty($user['email_checked'])) ? true : false, 0161 'user_fields' => array('2' => $user['external_id']) 0162 ); 0163 0164 return $data; 0165 } 0166 0167 /** 0168 * @param $extern_uid 0169 * @param $username 0170 * 0171 * @return array|null 0172 * @throws Zend_Exception 0173 */ 0174 private function getUser($extern_uid, $username) 0175 { 0176 $user_by_uid = $this->getUserByExternUid($extern_uid); 0177 if (false === empty($user_by_uid)) { 0178 return $user_by_uid; 0179 } 0180 0181 $user_by_dn = $this->getUserByUsername($username); 0182 if (false === empty($user_by_dn)) { 0183 return $user_by_dn; 0184 } 0185 0186 return null; 0187 } 0188 0189 /** 0190 * @param string $extern_uid 0191 * 0192 * @return bool|array 0193 * @throws Zend_Exception 0194 */ 0195 public function getUserByExternUid($extern_uid) 0196 { 0197 $uri = $this->config->host . "/u/by-external/{$extern_uid}.json"; 0198 $method = Zend_Http_Client::GET; 0199 $uid = 'external_id'; 0200 0201 $user = $this->httpRequest($uri, $uid, $method); 0202 0203 if (false === $user) { 0204 return false; 0205 } 0206 0207 return $user; 0208 } 0209 0210 /** 0211 * @param string $uri 0212 * @param string $uid 0213 * @param string $method 0214 * @param array|null $post_param 0215 * 0216 * @return bool|array 0217 * @throws Zend_Exception 0218 */ 0219 protected function httpRequest($uri, $uid, $method = Zend_Http_Client::GET, $post_param = null) 0220 { 0221 $this->isRateLimitError = false; 0222 $this->rateLimitWaitSeconds = 0; 0223 0224 $this->httpClient->resetParameters(); 0225 try { 0226 $this->httpClient->setUri($uri); 0227 $this->httpClient->setHeaders('User-Agent', $this->config->user_agent); 0228 $this->httpClient->setMethod($method); 0229 } catch (Zend_Http_Client_Exception $e) { 0230 $this->messages[] = 'Request failed.(' . $uri . ') httpClient error message: ' . $e->getMessage(); 0231 0232 return false; 0233 } catch (Zend_Uri_Exception $e) { 0234 $this->messages[] = 'Request failed.(' . $uri . ') httpClient error message: ' . $e->getMessage(); 0235 0236 return false; 0237 } 0238 $this->httpClient->setParameterGet('api_key', $this->config->private_token); 0239 $this->httpClient->setParameterGet('api_username', $this->config->user_sudo); 0240 if (isset($post_param)) { 0241 $this->httpClient->setParameterPost($post_param); 0242 } 0243 0244 try { 0245 $response = $this->httpClient->request(); 0246 } catch (Zend_Http_Client_Exception $e) { 0247 $this->messages[] = 'Request failed.(' . $uri . ') httpClient error message: ' . $e->getMessage(); 0248 0249 return false; 0250 } 0251 if ($response->getStatus() < 200 OR $response->getStatus() >= 500) { 0252 $this->messages[] = 'Request failed.(' . $uri . ') OCS Forum server send message: ' . $response->getBody(); 0253 0254 return false; 0255 } 0256 0257 $body = $response->getRawBody(); 0258 $content_encoding = $response->getHeader('Content-encoding'); 0259 $transfer_encoding = $response->getHeader('Transfer-encoding'); 0260 if ($transfer_encoding == 'chunked') { 0261 $body = Zend_Http_Response::decodeChunkedBody($body); 0262 } 0263 if ($content_encoding == 'gzip') { 0264 $body = Zend_Http_Response::decodeGzip($body); 0265 } 0266 if (substr($body, 0, strlen('<html>')) === '<html>') { 0267 $this->messages[] = $body; 0268 0269 return false; 0270 } 0271 try { 0272 $body = Zend_Json::decode($body); 0273 } catch (Zend_Json_Exception $e) { 0274 $this->messages[] = 'Request failed.(' . $uri . ') Zend_Json::decode error message: ' . $e->getMessage(); 0275 0276 return false; 0277 } 0278 0279 if (empty($body)) { 0280 return array('message' => 'empty body received'); 0281 } 0282 0283 if (array_key_exists("error_type", $body) OR array_key_exists("errors", $body)) { 0284 $this->messages[] = "id: {$uid} ($uri) - " . $response->getBody(); 0285 0286 if (isset($body['error_type']) AND ($body['error_type'] == "rate_limit")) { 0287 0288 $this->isRateLimitError = true; 0289 $this->rateLimitWaitSeconds = $body['extras']['wait_seconds']; 0290 0291 throw new Zend_Exception($body['errors'][0]); 0292 } 0293 0294 return false; 0295 } 0296 0297 if (array_key_exists('success', $body) AND $body['success'] == false) { 0298 $this->messages[] = "id: {$uid} ($uri) - " . $body['message']; 0299 0300 return false; 0301 } 0302 0303 return $body; 0304 } 0305 0306 /** 0307 * @param string $username 0308 * 0309 * @return bool|array 0310 * @throws Zend_Exception 0311 */ 0312 public function getUserByUsername($username) 0313 { 0314 $encoded_username = urlencode($username); 0315 $uri = $this->config->host . "/users/{$encoded_username}.json"; 0316 $method = Zend_Http_Client::GET; 0317 $uid = $username; 0318 0319 $user = $this->httpRequest($uri, $uid, $method); 0320 0321 if (false === $user) { 0322 return false; 0323 } 0324 0325 return $user; 0326 } 0327 0328 /** 0329 * @param string $member_id 0330 * 0331 * @return bool|array 0332 * @throws Default_Model_Ocs_Exception 0333 * @throws Zend_Exception 0334 */ 0335 public function getUserNotifications($member_id) 0336 { 0337 $member_data = $this->getMemberData($member_id); 0338 $forum_member = $this->getUser($member_data['external_id'], $member_data['username']); 0339 if (empty($forum_member)) { 0340 return false; 0341 } 0342 $username = $forum_member['user']['username']; 0343 0344 $uri = $this->config->host . "/notifications.json?username=" . $username; 0345 $method = Zend_Http_Client::GET; 0346 $uid = 'external_id'; 0347 0348 $user = $this->httpRequest($uri, $uid, $method); 0349 0350 if (false === $user) { 0351 return false; 0352 } 0353 0354 return $user; 0355 } 0356 0357 /** 0358 * @param $member_id 0359 * @param bool $onlyActive 0360 * 0361 * @return mixed 0362 * @throws Default_Model_Ocs_Exception 0363 */ 0364 private function getMemberData($member_id, $onlyActive = true) 0365 { 0366 $onlyActiveFilter = ''; 0367 if ($onlyActive) { 0368 $onlyActiveFilter = 0369 " AND `m`.`is_active` = 1 AND `m`.`is_deleted` = 0 AND `me`.`email_checked` IS NOT NULL AND `me`.`email_deleted` = 0"; 0370 } 0371 $sql = " 0372 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`.`biography`, `m`.`created_at`, `m`.`changed_at`, `m`.`source_id` 0373 FROM `member` AS `m` 0374 LEFT JOIN `member_email` AS `me` ON `me`.`email_member_id` = `m`.`member_id` AND `me`.`email_primary` = 1 0375 LEFT JOIN `member_external_id` AS `mei` ON `mei`.`member_id` = `m`.`member_id` 0376 WHERE `m`.`member_id` = :memberId {$onlyActiveFilter} 0377 ORDER BY `m`.`member_id` DESC 0378 "; 0379 0380 $result = Zend_Db_Table::getDefaultAdapter()->fetchRow($sql, array('memberId' => $member_id)); 0381 if (count($result) == 0) { 0382 throw new Default_Model_Ocs_Exception('member with id ' . $member_id . ' could not found.'); 0383 } 0384 0385 return $result; 0386 } 0387 0388 /** 0389 * @param string $email 0390 * 0391 * @return bool|array 0392 * @throws Zend_Exception 0393 */ 0394 public function getUserByEmail($email) 0395 { 0396 $uri = $this->config->host . "/admin/users/list/all.json?email={$email}"; 0397 $method = Zend_Http_Client::GET; 0398 0399 $user = $this->httpRequest($uri, $email, $method); 0400 0401 if (false === $user) { 0402 return false; 0403 } 0404 0405 return $user[0]; 0406 } 0407 0408 /** 0409 * @return array|null 0410 */ 0411 public function getMessages() 0412 { 0413 return $this->messages; 0414 } 0415 0416 /** 0417 * @param $member_id 0418 * 0419 * @return bool 0420 * @throws Default_Model_Ocs_Exception 0421 * @throws Zend_Exception 0422 */ 0423 public function deleteUser($member_id) 0424 { 0425 if (empty($member_id)) { 0426 return false; 0427 } 0428 0429 $member_data = $this->getMemberData($member_id, false); 0430 if (empty($member_data)) { 0431 return false; 0432 } 0433 0434 $forum_member = $this->getUser($member_data['external_id'], $member_data['username']); 0435 if (empty($forum_member)) { 0436 return false; 0437 } 0438 $uri = $this->config->host . '/admin/users/' . $forum_member['user']['id'] . '.json'; 0439 $method = Zend_Http_Client::DELETE; 0440 $uid = $member_id; 0441 0442 $user = $this->httpRequest($uri, $uid, $method); 0443 0444 if (false === $user) { 0445 return false; 0446 } 0447 0448 return $user; 0449 } 0450 0451 /** 0452 * @return bool|array 0453 */ 0454 public function getGroups() 0455 { 0456 $uri = $this->config->host . '/groups.json'; 0457 $uid = 'get groups'; 0458 $method = Zend_Http_Client::GET; 0459 0460 try { 0461 $result = $this->httpRequest($uri, $uid, $method); 0462 } catch (Zend_Exception $e) { 0463 $this->messages[] = "Fail " . $e->getMessage(); 0464 0465 return false; 0466 } 0467 0468 if (false === $result) { 0469 $this->messages[] = "Fail "; 0470 0471 return false; 0472 } 0473 0474 $this->messages[] = "Success"; 0475 0476 return $result; 0477 } 0478 0479 /** 0480 * @param string $name 0481 * 0482 * @return bool|array 0483 */ 0484 public function createGroup($name) 0485 { 0486 $uri = $this->config->host . '/admin/groups'; 0487 $method = Zend_Http_Client::POST; 0488 $data = array( 0489 "group[name]" => $name 0490 ); 0491 0492 try { 0493 $result = $this->httpRequest($uri, $name, $method, $data); 0494 } catch (Zend_Exception $e) { 0495 $this->messages[] = "Fail " . $e->getMessage(); 0496 0497 return false; 0498 } 0499 0500 if (false === $result) { 0501 $this->messages[] = "Fail "; 0502 0503 return false; 0504 } 0505 0506 $this->messages[] = "Success"; 0507 0508 return $result['basic_group']; 0509 } 0510 0511 public function deleteGroup($group_id) 0512 { 0513 $uri = $this->config->host . '/admin/groups/' . $group_id . '.json'; 0514 $method = Zend_Http_Client::DELETE; 0515 0516 try { 0517 $result = $this->httpRequest($uri, $group_id, $method); 0518 } catch (Zend_Exception $e) { 0519 $this->messages[] = "Fail " . $e->getMessage(); 0520 0521 return false; 0522 } 0523 0524 if (false === $result) { 0525 $this->messages[] = "Fail "; 0526 0527 return false; 0528 } 0529 0530 $this->messages[] = "Success"; 0531 0532 return $result; 0533 } 0534 0535 public function addGroupMember($groupname, $members) 0536 { 0537 0538 } 0539 0540 /** 0541 * @param $member_data 0542 * @param $oldUsername 0543 * 0544 * @return array|bool|null 0545 * @throws Zend_Exception 0546 */ 0547 public function updateUserFromArray($member_data, $oldUsername) 0548 { 0549 if (empty($member_data)) { 0550 return false; 0551 } 0552 0553 $this->messages = array(); 0554 0555 $data = $this->mapUserData($member_data); 0556 0557 $user = $this->getUser($member_data['external_id'], $oldUsername); 0558 0559 if (empty($user)) { 0560 $this->messages[] = "Fail "; 0561 0562 return false; 0563 } 0564 0565 $uid = $user['user']['username']; 0566 unset($data['password']); 0567 0568 try { 0569 $uri = $this->config->host . "/users/{$uid}.json"; 0570 $method = Zend_Http_Client::PUT; 0571 $this->httpRequest($uri, $uid, $method, $data); 0572 } catch (Zend_Exception $e) { 0573 $this->messages[] = "Fail " . $e->getMessage(); 0574 0575 return false; 0576 } 0577 $this->messages[] = "overwritten : " . json_encode($user); 0578 0579 return $user; 0580 } 0581 0582 /** 0583 * @param array $member_data 0584 * 0585 * @return array|bool 0586 * @throws Zend_Exception 0587 */ 0588 public function deleteUserWithArray($member_data) 0589 { 0590 if (empty($member_data)) { 0591 return false; 0592 } 0593 0594 $forum_member = $this->getUserByExternUid($member_data['external_id']); 0595 if (empty($forum_member)) { 0596 return false; 0597 } 0598 $uri = $this->config->host . '/admin/users/' . $forum_member['id'] . '.json'; 0599 $method = Zend_Http_Client::DELETE; 0600 $uid = $member_data['member_id']; 0601 0602 $user = $this->httpRequest($uri, $uid, $method); 0603 0604 if (false === $user) { 0605 return false; 0606 } 0607 0608 return $user; 0609 } 0610 0611 /** 0612 * @param int|array $member_data 0613 * 0614 * @return array|bool 0615 * @throws Default_Model_Ocs_Exception 0616 * @throws Zend_Exception 0617 */ 0618 public function blockUser($member_data) 0619 { 0620 if (is_int($member_data)) { 0621 $member_data = $this->getMemberData($member_data, false); 0622 } 0623 0624 if (empty($member_data)) { 0625 return false; 0626 } 0627 0628 $forum_member = $this->getUser($member_data['external_id'], $member_data['username']); 0629 if (empty($forum_member)) { 0630 return false; 0631 } 0632 0633 $uri = $this->config->host . '/admin/users/' . $forum_member['user']['id'] . '/suspend'; 0634 $method = Zend_Http_Client::PUT; 0635 $uid = $member_data['member_id']; 0636 $suspend_until = new DateTime(); 0637 $suspend_until->add(new DateInterval('P1Y')); 0638 $data = array('suspend_until' => $suspend_until->format("Y-m-d"), "reason" => ""); 0639 0640 try { 0641 $user = $this->httpRequest($uri, $uid, $method, $data); 0642 if (false === $user) { 0643 $this->messages[] = "Fail " . json_encode($this->messages); 0644 0645 return false; 0646 } 0647 } catch (Zend_Exception $e) { 0648 $this->messages[] = "Fail " . $e->getMessage(); 0649 0650 return false; 0651 } 0652 0653 $this->messages[] = 'Forum user suspended: ' . json_encode($user); 0654 0655 $memberLog = new Default_Model_MemberDeactivationLog(); 0656 $memberLog->addLog($member_data['member_id'], Default_Model_MemberDeactivationLog::OBJ_TYPE_DISCOURSE_USER, 0657 $forum_member['user']['id']); 0658 0659 return $user; 0660 } 0661 0662 public function blockUserPosts($member_data) 0663 { 0664 if (is_int($member_data)) { 0665 $member_data = $this->getMemberData($member_data, false); 0666 } 0667 0668 if (empty($member_data)) { 0669 return false; 0670 } 0671 0672 $posts = $this->getPostsFromUser($member_data); 0673 0674 if (false == $posts) { 0675 $this->messages[] = "Fail. No posts for user {$member_data['username']} received"; 0676 } 0677 0678 $memberLog = new Default_Model_MemberDeactivationLog(); 0679 if (array_key_exists('posts', $posts) && is_array($posts['posts'])) { 0680 foreach ($posts['posts'] as $id => $item) { 0681 $result = $this->deletePostFromUser($id); 0682 if (false === $result) { 0683 continue; 0684 } 0685 $this->messages[] = 'Forum user post deleted: ' . json_encode($id); 0686 $memberLog->addLog($member_data['member_id'], 0687 Default_Model_MemberDeactivationLog::OBJ_TYPE_DISCOURSE_POST, $id); 0688 } 0689 } 0690 0691 //handle topics 0692 if (array_key_exists('topics', $posts) && is_array($posts['topics'])) { 0693 foreach ($posts['topics'] as $id => $topic) { 0694 $result = $this->deleteTopicFromUser($id); 0695 if (false === $result) { 0696 continue; 0697 } 0698 $this->messages[] = 'Forum user topic deleted: ' . json_encode($id); 0699 $memberLog->addLog($member_data['member_id'], 0700 Default_Model_MemberDeactivationLog::OBJ_TYPE_DISCOURSE_TOPIC, $id); 0701 } 0702 } 0703 0704 return true; 0705 } 0706 0707 public function getPostsFromUser($member_data) 0708 { 0709 if (empty($member_data)) { 0710 return false; 0711 } 0712 0713 if (is_int($member_data)) { 0714 $member_data = $this->getMemberData($member_data, false); 0715 } 0716 0717 //$forum_member = $this->getUser($member_data['external_id'], $member_data['username']); 0718 //if (empty($forum_member)) { 0719 // return false; 0720 //} 0721 0722 $username = substr($member_data['username'], 0, 20); 0723 $uri = $this->config->host . "/user_actions.json?offset=0&username={$username}&filter=4,5&no_results_help_key=user_activity.no_default"; 0724 $method = Zend_Http_Client::GET; 0725 $uid = $member_data['member_id']; 0726 0727 $result = $this->httpRequest($uri, $uid, $method); 0728 0729 if (false === is_array($result)) { 0730 return false; 0731 } 0732 0733 $posts = array(); 0734 0735 foreach ($result['user_actions'] as $user_action) { 0736 if ($user_action['action_type'] == 4) { 0737 $posts['topics'][$user_action['topic_id']] = $user_action; 0738 } 0739 if ($user_action['action_type'] == 5) { 0740 $posts['posts'][$user_action['post_id']] = $user_action; 0741 } 0742 } 0743 0744 return $posts; 0745 } 0746 0747 /** 0748 * @param int $post_id 0749 * 0750 * @return array|bool 0751 */ 0752 public function deletePostFromUser($post_id) 0753 { 0754 if (empty($post_id)) { 0755 return false; 0756 } 0757 0758 $uri = $this->config->host . '/posts/' . $post_id; 0759 $method = Zend_Http_Client::DELETE; 0760 $uid = $post_id; 0761 0762 try { 0763 $result = $this->httpRequest($uri, $uid, $method); 0764 } catch (Zend_Exception $e) { 0765 $this->httpClient->getAdapter()->close(); 0766 $this->messages[] = "Fail " . $e->getMessage(); 0767 0768 return false; 0769 } 0770 0771 return $result; 0772 } 0773 0774 /** 0775 * @param int $topic_id 0776 * 0777 * @return array|bool 0778 */ 0779 public function deleteTopicFromUser($topic_id) 0780 { 0781 if (empty($topic_id)) { 0782 return false; 0783 } 0784 0785 $uri = $this->config->host . '/t/' . $topic_id; 0786 $method = Zend_Http_Client::DELETE; 0787 $uid = $topic_id; 0788 0789 try { 0790 $result = $this->httpRequest($uri, $uid, $method); 0791 } catch (Zend_Exception $e) { 0792 $this->httpClient->getAdapter()->close(); 0793 $this->messages[] = "Fail " . $e->getMessage(); 0794 0795 return false; 0796 } 0797 0798 return $result; 0799 } 0800 0801 public function silenceUser($member_data) 0802 { 0803 if (is_int($member_data)) { 0804 $member_data = $this->getMemberData($member_data, false); 0805 } 0806 0807 if (empty($member_data)) { 0808 return false; 0809 } 0810 0811 $forum_member = $this->getUser($member_data['external_id'], $member_data['username']); 0812 if (empty($forum_member)) { 0813 return false; 0814 } 0815 0816 $uri = $this->config->host . '/admin/users/' . $forum_member['user']['id'] . '/silence'; 0817 $method = Zend_Http_Client::PUT; 0818 $uid = $member_data['member_id']; 0819 $suspend_until = new DateTime(); 0820 $suspend_until->add(new DateInterval('PT5M')); 0821 $data = array( 0822 'silenced_till' => $suspend_until->format(DateTime::ATOM), 0823 "reason" => "probably a spam user", 0824 "post_action" => "delete" 0825 ); 0826 0827 $user = $this->httpRequest($uri, $uid, $method, $data); 0828 0829 $this->messages[] = 'Forum user silenced: ' . json_encode($user); 0830 0831 return $user; 0832 } 0833 0834 public function unblockUser($member_data) 0835 { 0836 if (empty($member_data)) { 0837 return false; 0838 } 0839 0840 if (is_int($member_data)) { 0841 $member_data = $this->getMemberData($member_data, false); 0842 } 0843 0844 $forum_member = $this->getUser($member_data['external_id'], $member_data['username']); 0845 if (empty($forum_member)) { 0846 return false; 0847 } 0848 0849 $uri = $this->config->host . '/admin/users/' . $forum_member['user']['id'] . '/unsuspend'; 0850 $method = Zend_Http_Client::PUT; 0851 $uid = $member_data['member_id']; 0852 0853 try { 0854 $user = $this->httpRequest($uri, $uid, $method); 0855 if (false === $user) { 0856 $this->messages[] = "Fail " . json_encode($this->messages); 0857 0858 return false; 0859 } 0860 } catch (Zend_Exception $e) { 0861 $this->messages[] = "Fail " . $e->getMessage(); 0862 0863 return false; 0864 } 0865 0866 $this->messages[] = 'Forum user unsuspend: ' . json_encode($user); 0867 0868 $memberLog = new Default_Model_MemberDeactivationLog(); 0869 $memberLog->deleteLog($member_data['member_id'], Default_Model_MemberDeactivationLog::OBJ_TYPE_DISCOURSE_USER, 0870 $forum_member['user']['id']); 0871 0872 return $user; 0873 } 0874 0875 public function unblockUserPosts($member_data) 0876 { 0877 if (empty($member_data)) { 0878 return false; 0879 } 0880 0881 if (is_int($member_data)) { 0882 $member_data = $this->getMemberData($member_data, false); 0883 } 0884 0885 $forum_member = $this->getUser($member_data['external_id'], $member_data['username']); 0886 if (empty($forum_member)) { 0887 return false; 0888 } 0889 $memberLog = new Default_Model_MemberDeactivationLog(); 0890 $deletedPosts = $memberLog->getLogForumPosts($member_data['member_id']); 0891 0892 foreach ($deletedPosts['topics'] as $deleted_post) { 0893 $result = $this->undeleteTopicFromUser($deleted_post['object_id']); 0894 if (false === $result) { 0895 continue; 0896 } 0897 $this->messages[] = 'Forum user topic undeleted: ' . json_encode($deleted_post['object_id']); 0898 $memberLog->deleteLog($member_data['member_id'], 0899 Default_Model_MemberDeactivationLog::OBJ_TYPE_DISCOURSE_TOPIC, $deleted_post['object_id']); 0900 } 0901 foreach ($deletedPosts['posts'] as $deleted_post) { 0902 $result = $this->undeletePostFromUser($deleted_post['object_id']); 0903 if (false === $result) { 0904 continue; 0905 } 0906 $this->messages[] = 'Forum user post undeleted: ' . json_encode($deleted_post['object_id']); 0907 $memberLog->deleteLog($member_data['member_id'], 0908 Default_Model_MemberDeactivationLog::OBJ_TYPE_DISCOURSE_POST, $deleted_post['object_id']); 0909 } 0910 0911 return true; 0912 } 0913 0914 /** 0915 * @param int $topic_id 0916 * 0917 * @return array|bool 0918 */ 0919 public function undeleteTopicFromUser($topic_id) 0920 { 0921 if (empty($topic_id)) { 0922 return false; 0923 } 0924 0925 $uri = $this->config->host . '/t/' . $topic_id . '/recover'; 0926 $method = Zend_Http_Client::PUT; 0927 $uid = $topic_id; 0928 0929 try { 0930 $result = $this->httpRequest($uri, $uid, $method); 0931 } catch (Zend_Exception $e) { 0932 $this->httpClient->getAdapter()->close(); 0933 $this->messages[] = "Fail " . $e->getMessage(); 0934 0935 return false; 0936 } 0937 0938 return $result; 0939 } 0940 0941 public function undeletePostFromUser($post_id) 0942 { 0943 if (empty($post_id)) { 0944 return false; 0945 } 0946 0947 $uri = $this->config->host . '/posts/' . $post_id . '/recover'; 0948 $method = Zend_Http_Client::PUT; 0949 $uid = $post_id; 0950 0951 try { 0952 $result = $this->httpRequest($uri, $uid, $method); 0953 } catch (Zend_Exception $e) { 0954 $this->httpClient->getAdapter()->close(); 0955 $this->messages[] = "Fail " . $e->getMessage(); 0956 0957 return false; 0958 } 0959 0960 return $result; 0961 } 0962 0963 /** 0964 * @return mixed 0965 */ 0966 public function hasRateLimitError() 0967 { 0968 return $this->isRateLimitError; 0969 } 0970 0971 /** 0972 * @return mixed 0973 */ 0974 public function getRateLimitWaitSeconds() 0975 { 0976 return $this->rateLimitWaitSeconds; 0977 } 0978 0979 public function getTopic($id) 0980 { 0981 if (empty($id)) { 0982 return false; 0983 } 0984 0985 $uri = $this->config->host . '/t/' . $id . '.json'; 0986 $method = Zend_Http_Client::GET; 0987 $uid = $id; 0988 0989 try { 0990 $result = $this->httpRequest($uri, $uid, $method); 0991 } catch (Zend_Exception $e) { 0992 $this->httpClient->getAdapter()->close(); 0993 $this->messages[] = "Fail " . $e->getMessage(); 0994 0995 return false; 0996 } 0997 0998 return $result; 0999 } 1000 1001 }