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 }