File indexing completed on 2025-02-09 07:14:37
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 }