File indexing completed on 2024-06-16 05:27: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: 19.06.2018
0024  */
0025 class Default_Model_Ocs_OAuth
0026 {
0027     protected $messages;
0028     private $httpServer;
0029 
0030     /**
0031      * @inheritDoc
0032      */
0033     public function __construct($config = null)
0034     {
0035         $this->messages = array();
0036         if (isset($config)) {
0037             $this->config = $config;
0038         } else {
0039             $this->config = Zend_Registry::get('config')->settings->server->oauth;
0040         }
0041         $this->httpServer = new Default_Model_Ocs_HttpTransport_OAuthServer($this->config);
0042     }
0043 
0044     /**
0045      * @param $member_id
0046      *
0047      * @return bool
0048      * @throws Zend_Cache_Exception
0049      * @throws Zend_Exception
0050      * @throws Zend_Http_Client_Exception
0051      */
0052     public function createUser($member_id)
0053     {
0054         if (empty($member_id)) {
0055             return false;
0056         }
0057 
0058         $user = $this->getUserData($member_id);
0059         $data = $this->mapUserData($user);
0060 
0061         return $this->httpServer->pushHttpUserData($data);
0062     }
0063 
0064     /**
0065      * @param $member_id
0066      *
0067      * @return array
0068      * @throws Default_Model_Ocs_Exception
0069      * @throws Zend_Db_Statement_Exception
0070      */
0071     protected function getUserData($member_id)
0072     {
0073         $modelMember = new Default_Model_Member();
0074         $member = $modelMember->fetchMemberData($member_id, false)->toArray();
0075 
0076         if (empty($member)) {
0077             throw new Default_Model_Ocs_Exception('member with id ' . $member_id . ' could not found.');
0078         }
0079 
0080         return $member;
0081     }
0082 
0083     /**
0084      * @param array $user
0085      *
0086      * @return array
0087      */
0088     protected function mapUserData($user)
0089     {
0090         $data = array(
0091             'external_id'    => $user['external_id'],
0092             'ocs_user_id'    => $user['member_id'],
0093             'username'       => $user['username'],
0094             'password'       => $user['password'],
0095             'email'          => $user['mail'],
0096             'emailVerified'  => empty($user['mail_checked']) ? 'false' : 'true',
0097             'creationTime'   => strtotime($user['created_at']),
0098             'lastUpdateTime' => strtotime($user['changed_at']),
0099             'avatarUrl'      => $user['profile_image_url'],
0100             'biography'      => empty($user['biography']) ? '' : $user['biography'],
0101             'admin'          => $user['roleId'] == 100 ? 'true' : 'false',
0102             'is_hive'        => $user['password_type'] == 0 ? 'false' : 'true',
0103             'is_active'      => $user['is_active'],
0104             'is_deleted'     => $user['is_deleted']
0105         );
0106 
0107         return $data;
0108     }
0109 
0110     /**
0111      * @param $member_id
0112      *
0113      * @return bool
0114      * @throws Zend_Cache_Exception
0115      * @throws Zend_Exception
0116      * @throws Zend_Http_Client_Exception
0117      */
0118     public function updateMailForUser($member_id)
0119     {
0120         if (empty($member_id)) {
0121             return false;
0122         }
0123 
0124         $user = $this->getUserData($member_id);
0125 
0126         return $this->updateUser($user);
0127     }
0128 
0129     /**
0130      * @param array $member
0131      *
0132      * @return bool
0133      * @throws Zend_Cache_Exception
0134      * @throws Zend_Exception
0135      * @throws Zend_Http_Client_Exception
0136      */
0137     public function updateUser($member)
0138     {
0139         if (empty($member)) {
0140             return false;
0141         }
0142 
0143         if (is_int($member)) {
0144             $member = $this->getUserData($member);
0145         }
0146 
0147         $result = $this->createUserFromArray($member, $force = true);
0148 
0149         return $result;
0150     }
0151 
0152     /**
0153      * @param array $member_data
0154      * @param bool  $force
0155      *
0156      * @return bool|array
0157      * @throws Zend_Cache_Exception
0158      * @throws Zend_Exception
0159      * @throws Zend_Http_Client_Exception
0160      * @throws Zend_Json_Exception
0161      */
0162     public function createUserFromArray($member_data, $force = false)
0163     {
0164         if (empty($member_data)) {
0165             return false;
0166         }
0167 
0168         $this->messages = array();
0169         $this->httpServer->resetMessages();
0170 
0171         $data = $this->mapData($member_data, $bypassEmailCheck = false, $bypassUsernameCheck = false);
0172         $uid = $member_data['member_id'];
0173         $user = $this->getUser($member_data['external_id']);
0174 
0175         if (empty($user)) {
0176             try {
0177                 $method = Zend_Http_Client::POST;
0178                 $uri = $this->config->host . "/api/v2/users/create";
0179                 $result = $this->httpServer->httpRequest($uri, $uid, $method, $data);
0180                 if (false === $result) {
0181                     $this->messages[] = $this->httpServer->getMessages();
0182                     $this->messages[] = "Fail ";
0183 
0184                     return false;
0185                 }
0186             } catch (Zend_Exception $e) {
0187                 $this->messages[] = $this->httpServer->getMessages();
0188                 $this->messages[] = "Fail : " . $e->getMessage();
0189 
0190                 return false;
0191             }
0192             $this->messages[] = $this->httpServer->getMessages();
0193             $this->messages[] = "Create : Success";
0194 
0195             return $result;
0196         }
0197         if ($force === true) {
0198             try {
0199                 $uri = $this->config->host . "/api/v2/users/update";
0200                 $method = Zend_Http_Client::PUT;
0201                 $user = $this->httpServer->httpRequest($uri, $uid, $method, $data);
0202             } catch (Zend_Exception $e) {
0203                 $this->messages[] = "Fail : " . $e->getMessage();
0204 
0205                 return false;
0206             }
0207             $this->messages[] = $this->httpServer->getMessages();
0208             $this->messages[] = "Overwritten : " . json_encode($user);
0209 
0210             return $user;
0211         }
0212 
0213         $this->messages[] = 'Fail : user already exists.';
0214 
0215         return false;
0216     }
0217 
0218     /**
0219      * @param array $member_data
0220      * @param bool  $bypassEmailCheck
0221      * @param bool  $bypassUsernameCheck
0222      *
0223      * @return array
0224      */
0225     private function mapData($member_data, $bypassEmailCheck = false, $bypassUsernameCheck = false)
0226     {
0227         if (strpos($member_data['profile_image_url'], 'http') === false) {
0228             $urlImage = IMAGES_MEDIA_SERVER . '/img/' . $member_data['profile_image_url'];
0229         } else {
0230             $urlImage = $member_data['profile_image_url'];
0231         }
0232 
0233         $map_user_data = array(
0234             'user' => array(
0235                 'id'             => $member_data['external_id'],
0236                 'ocs_user_id'    => $member_data['member_id'],
0237                 'username'       => trim($member_data['username']),
0238                 'password'       => $member_data['password'],
0239                 'email'          => trim($member_data['mail']),
0240                 'emailVerified'  => empty($member_data['mail_checked']) ? 'false' : 'true',
0241                 'is_hive'        => $member_data['password_type'] == 0 ? 'false' : 'true',
0242                 'creationTime'   => strtotime($member_data['created_at']),
0243                 'lastUpdateTime' => strtotime($member_data['changed_at']),
0244                 'avatarUrl'      => $urlImage,
0245                 'biography'      => empty($member_data['biography']) ? '' : $member_data['biography'],
0246                 'admin'          => $member_data['roleId'] == 100 ? 'true' : 'false',
0247             )
0248         );
0249 
0250         if ((false == $member_data['is_active']) OR (true == $member_data['is_deleted'])) {
0251             $map_user_data['user']['disabledReason'] = 'user account disabled';
0252         }
0253 
0254         $map_user_data['options'] = array(
0255             'bypassEmailCheck'    => $bypassEmailCheck ? 'true' : 'false',
0256             'bypassUsernameCheck' => $bypassUsernameCheck ? 'true' : 'false'
0257         );
0258 
0259         return $map_user_data;
0260     }
0261 
0262     /**
0263      * @param string $extern_uid
0264      *
0265      * @return bool|array
0266      * @throws Zend_Cache_Exception
0267      * @throws Zend_Exception
0268      * @throws Zend_Http_Client_Exception
0269      * @throws Zend_Json_Exception
0270      */
0271     public function getUser($extern_uid)
0272     {
0273         $uri = $this->config->host . "/api/v2/users/{$extern_uid}";
0274         $method = Zend_Http_Client::GET;
0275         $uid = 'external_id';
0276 
0277         $user = $this->httpServer->httpRequest($uri, $uid, $method);
0278 
0279         if (false === $user) {
0280             return false;
0281         }
0282 
0283         return $user;
0284     }
0285 
0286     /**
0287      * @param $member_id
0288      *
0289      * @return bool
0290      * @throws Zend_Cache_Exception
0291      * @throws Zend_Exception
0292      * @throws Zend_Http_Client_Exception
0293      */
0294     public function updateAvatarForUser($member_id)
0295     {
0296         if (empty($member_id)) {
0297             return false;
0298         }
0299 
0300         $user = $this->getUserData($member_id);
0301 
0302         return $this->updateUser($user);
0303     }
0304 
0305     /**
0306      * @param $member_id
0307      *
0308      * @return bool
0309      * @throws Zend_Cache_Exception
0310      * @throws Zend_Exception
0311      * @throws Zend_Http_Client_Exception
0312      */
0313     public function updatePasswordForUser($member_id)
0314     {
0315         if (empty($member_id)) {
0316             return false;
0317         }
0318 
0319         $user = $this->getUserData($member_id);
0320 
0321         return $this->updateUser($user);
0322     }
0323 
0324     /**
0325      * @param $member_id
0326      *
0327      * @return bool
0328      * @throws Default_Model_Ocs_Exception
0329      * @throws Zend_Db_Statement_Exception
0330      */
0331     public function deleteUser($member_id)
0332     {
0333         if (empty($member_id)) {
0334             return false;
0335         }
0336 
0337         $user = $this->getUserData($member_id);
0338         $uid = $user['member_id'];
0339         $id = $user['external_id'];
0340 
0341         try {
0342             $method = Zend_Http_Client::DELETE;
0343             $uri = $this->config->host . "/api/v2/users/{$id}";
0344             $result = $this->httpServer->httpRequest($uri, $uid, $method);
0345             $this->messages[] = print_r($this->httpServer->getMessages(), true);
0346             $this->messages[] = "server response:" . is_array($result) ? print_r($result, true) : $result;
0347 
0348             if (false === $result) {
0349 
0350                 return false;
0351             }
0352         } catch (Zend_Exception $e) {
0353             $this->messages[] = $this->httpServer->getMessages();
0354             $this->messages[] = "Fail : " . $e->getMessage();
0355 
0356             return false;
0357         }
0358 
0359         return true;
0360     }
0361 
0362     /**
0363      * @return array
0364      */
0365     public function getMessages()
0366     {
0367         return $this->messages;
0368     }
0369 
0370     public function updateUserFromArray($member_data)
0371     {
0372         if (empty($member_data)) {
0373             return false;
0374         }
0375 
0376         $this->messages = array();
0377 
0378         $data = $this->mapUserData($member_data);
0379         $options = array('bypassEmailCheck' => 'true', 'bypassUsernameCheck' => 'true', 'update' => 'true');
0380 
0381         try {
0382             $this->httpServer->pushHttpUserData($data, $options);
0383         } catch (Zend_Exception $e) {
0384             $this->messages[] = "Fail " . $e->getMessage();
0385 
0386             return false;
0387         }
0388         $this->messages[] = $this->httpServer->getMessages();
0389 
0390         return $data;
0391     }
0392 
0393     public function validateUser($member_data)
0394     {
0395         if (empty($member_data)) {
0396             return false;
0397         }
0398 
0399         $result = false;
0400         $this->messages = array();
0401 
0402         try {
0403             $authUser = $this->getUser($member_data['external_id']);
0404             if (false === $authUser) {
0405                 $this->messages[] = "Not Found : " . $member_data['member_id'];
0406 
0407                 return false;
0408             }
0409             $result = $this->sameUserData($member_data, $authUser);
0410             if (false === $result) {
0411                 $this->messages[] = "Unequal : " . print_r($authUser, true);
0412             }
0413         } catch (Zend_Exception $e) {
0414             $this->messages[] = "Fail : " . $e->getMessage();
0415 
0416             return false;
0417         }
0418 
0419         return $result;
0420     }
0421 
0422     /**
0423      * @param array $user
0424      * @param array $authUser
0425      *
0426      * @return bool
0427      */
0428     private function sameUserData($user, $authUser)
0429     {
0430         if (strpos($user['profile_image_url'], 'http') === false) {
0431             $urlImage = IMAGES_MEDIA_SERVER . '/img/' . $user['profile_image_url'];
0432         } else {
0433             $urlImage = $user['profile_image_url'];
0434         }
0435 
0436         $result = false;
0437         $result = $result || ($user['member_id'] != $authUser['ocsId']);
0438         $result = $result || ($user['username'] != $authUser['username']);
0439         $result = $result || ($user['password'] != $authUser['password']);
0440         $result = $result || (strtolower($user['mail']) != $authUser['email']);
0441         $result = $result || ($user['mail_checked'] != $authUser['emailVerified']);
0442         $result = $result || (($user['password_type'] == 1) != $authUser['hiveImport']);
0443         $result = $result || ($urlImage != $authUser['avatarUrl']);
0444         $result = $result || ($user['biography'] != $authUser['biography']);
0445         $result = $result || (($user['roleId'] == 100) != $authUser['admin']);
0446         $result = $result || (($user['is_active'] == 0) != $authUser['disabled']);
0447 
0448         return !$result;
0449     }
0450 
0451 }