Guest User

Untitled

a guest
Dec 6th, 2018
185
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 41.21 KB | None | 0 0
  1. <?php
  2. class User_Model_Mapper_User extends Qliff_Model_Mapper_Db
  3. {
  4. /**
  5. *
  6. * @var Qliff_Event_Observable
  7. */
  8. protected $_observable;
  9. protected $_messages = array();
  10.  
  11. protected static $_users = array();
  12. protected static $_userRoles = array();
  13. protected static $_userInvitee = array();
  14.  
  15. public function init() {
  16. $this->_observable = new User_Model_Observer_ObservableUser('user_permissions');
  17. $this->_observable->setMapper($this);
  18. $this->_observable->attach(new User_Model_Observer_Access());
  19. $this->_message = Zend_Registry::get('messages');
  20. }
  21.  
  22. public function setDefaultTable() {
  23. $this->setDbTable(new User_Model_DbTable_Users());
  24. }
  25.  
  26. /**
  27. * Login user to the system and start user session
  28. *
  29. * @param string $email
  30. * @param string $password
  31. * @return User_Model_User
  32. * @throws User_Model_Exception
  33. */
  34. public function login($email, $password, $hashed = false, $loadFromSession = true) {
  35. if (Zend_Auth::getInstance()->hasIdentity() && $loadFromSession) {
  36. //Get user data from session
  37. return Zend_Auth::getInstance()->getStorage()->read();
  38. }
  39.  
  40. $adapter = new Zend_Auth_Adapter_DbTable(
  41. $this->getDbTable()->getAdapter(),
  42. 'users',
  43. 'email', 'password', $hashed ? null :'MD5(?)'
  44. );
  45.  
  46. $adapter->setIdentity($email)
  47. ->setCredential($password);
  48.  
  49. $result = Zend_Auth::getInstance()->authenticate($adapter);
  50.  
  51. if (!$result->isValid()) {
  52. throw new User_Model_Exception($this->_message['user_login_invalid']);
  53. }
  54.  
  55. $user = $this->fetchByEmail(Zend_Auth::getInstance()->getIdentity(), new User_Model_User());
  56.  
  57. if ($user->status == 0) {
  58. //If user is blocked (status == 0)
  59. Zend_Auth::getInstance()->clearIdentity();
  60. throw new User_Model_Exception(sprintf($this->_message['user_blocked'], $email));
  61. }
  62.  
  63. //Update last login timestamp
  64. $user->setTimestampLogin(time());
  65.  
  66. $user = $this->save($user);
  67.  
  68. Zend_Auth::getInstance()->getStorage()->write($user);
  69.  
  70. $userId = $user->getId();
  71. $userName = $user->getName();
  72. Zend_Registry::get('logger')->info("User: $userName <$userId>. Session started");
  73. return $user;
  74. }
  75.  
  76. public function addRule($rule, Qliff_Model_ModelAbstract $model, $type, User_Model_Model $user) {
  77. $db = $this->getDbTable()->getAdapter();
  78. $db->insert('collaborate_rules', array(
  79. 'entry_id' => $model->getId(),
  80. 'entry_type' => $type,
  81. 'user_id' => $user->getId(),
  82. 'rule' => $rule
  83. ));
  84. }
  85.  
  86. public function hasRule(Qliff_Model_ModelAbstract $model, $type, User_Model_Model $user) {
  87. $db = $this->getDbTable()->getAdapter();
  88. $entryId = (int)$model->getId();
  89. $userId = (int)$user->getId();
  90. $result = $db->fetchRow('collaborate_rules', "entry_id=$entryId AND entry_type=$type AND user_id=$userId");
  91. if ($result) {
  92. return $result->rule;
  93. }
  94.  
  95. return false;
  96. }
  97.  
  98. /**
  99. *
  100. * @param User_Model_User $user
  101. * @return array
  102. */
  103. public function getInviterRules(User_Model_User $user) {
  104. $invitees = $this->getUsersInvitedBy($user);
  105. $inviteeList = array();
  106.  
  107. foreach($invitees as $invitee) {
  108. $inviteeList[] = $invitee['user']->getId();
  109. }
  110.  
  111. $result = array();
  112. if (!empty($inviteeList)) {
  113. $select = $this->getDbTable()->getAdapter()->select()->from(array('cr' => 'collaborate_rules'))
  114. ->where('cr.user_id IN ('.implode(',', $inviteeList).')');
  115.  
  116. $rules = $select->query()->fetchAll(Zend_Db::INT_TYPE);
  117. if ($rules) {
  118. $result = $rules;
  119. }
  120. }
  121.  
  122. return $result;
  123. }
  124.  
  125. /**
  126. * Be careful to use this function. Very expensive
  127. *
  128. * @param User_Model_User $user
  129. * @return array
  130. */
  131. public function getUsersInvitedBy(User_Model_User $user) {
  132. $id = (int)$user->getId();
  133. if (isset(self::$_userInvitee[$id])) {
  134. return self::$_userInvitee[$id];
  135. }
  136.  
  137. $email = (string)$user->getEmail();
  138. $select = $this->getDbTable()->getAdapter()->select()->from(array('u' => 'users'))
  139. ->join(array('i' => 'invites'), 'u.email=i.email', array())
  140. ->where("i.user_id = $id AND i.email <> '$email'")
  141. ->distinct(true);
  142.  
  143. $result = $select->query()->fetchAll();
  144.  
  145. $folderMapper = new Views_Model_Mapper_Folders();
  146.  
  147. $users = array();
  148. foreach($result as $row) {
  149. $user = new User_Model_User();
  150. $user->setId($row['id']);
  151. $user->setEmail($row['email'])
  152. ->setName($row['username'])
  153. ->setFirstName($row['first_name'])
  154. ->setLastName($row['last_name'])
  155. ->setTimestampReg($row['timestamp_reg'])
  156. ->setTimestampLogin($row['timestamp_login'])
  157. ->setCountry($row['country'])
  158. ->setStatus($row['status'])
  159. ->setPassword($row['password'])
  160. ->setActivationCode($row['activation_code'])
  161. ->setNotify($row['notify']);
  162. $this->initPermissions($user);
  163. $users[$row['id']]['user'] = $user;
  164. $users[$row['id']]['docs'] = array();
  165. $users[$row['id']]['docs']['folders'] = $users[$row['id']]['docs']['discussions']
  166. = $users[$row['id']]['docs']['files'] = array();
  167.  
  168. $userRoot = $folderMapper->userRoot($user);
  169.  
  170. foreach($userRoot->getFolders() as $folder) {
  171. if ($folder->getOwner()->getId() != $id) {
  172. continue;
  173. }
  174.  
  175. $users[$row['id']]['docs']['folders'][$folder->getId()] = $folder;
  176. }
  177.  
  178. foreach($userRoot->getDiscussions() as $discussion) {
  179. if ($discussion->getOwner()->getId() != $id) {
  180. continue;
  181. }
  182.  
  183. $users[$row['id']]['docs']['discussions'][$discussion->getId()] = $discussion;
  184. }
  185.  
  186. foreach($userRoot->getFiles() as $file) {
  187. if ($file->getOwner()->getId() != $id) {
  188. continue;
  189. }
  190.  
  191. $users[$row['id']]['docs']['files'][$file->getId()] = $file;
  192. }
  193. }
  194.  
  195. self::$_userInvitee[$id] = $users;
  196. return $users;
  197. }
  198.  
  199. public function updateInvitees($action, array $data) {
  200. $validData = array();
  201.  
  202. foreach($data as $userId => $userData) {
  203. foreach($userData as $type => $docData) {
  204. foreach($docData as $docId => $checked) {
  205. if ($checked == '1') {
  206. $validData[] = array(
  207. 'entry_id' => $docId,
  208. 'entry_type' => $type,
  209. 'user_id' => $userId,
  210. 'rule' => null
  211. );
  212. }
  213. }
  214. }
  215. }
  216.  
  217. switch ($action) {
  218. case 'remove':
  219. $users = array();
  220. foreach($validData as $record) {
  221. if (!in_array($record['user_id'], $users)) {
  222. $user = $this->fetch($record['user_id'], new User_Model_User());
  223. $users[$record['user_id']] = $user;
  224. }
  225. $user = $users[$record['user_id']];
  226. $model = Views_Model_Mapper_Factory::factoryModel(
  227. $record['entry_id'],
  228. $record['entry_type'],
  229. $user
  230. );
  231. $this->unsubscribe($model, $record['entry_type'], $user);
  232. }
  233. case 'allow':
  234. foreach($validData as $record) {
  235. $entryId = $record['entry_id'];
  236. $entryType = $record['entry_type'];
  237. $userId = $record['user_id'];
  238. $this->getDbTable()->getAdapter()->delete('collaborate_rules',
  239. "entry_id=$entryId AND entry_type='$entryType' AND user_id=$userId");
  240. }
  241. break;
  242. case 'deny':
  243. $rule = 'deny see owner document';
  244. foreach($validData as $record) {
  245. $entryId = $record['entry_id'];
  246. $entryType = $record['entry_type'];
  247. $userId = $record['user_id'];
  248. $this->getDbTable()->getAdapter()->delete('collaborate_rules',
  249. "entry_id=$entryId AND entry_type='$entryType' AND user_id=$userId");
  250. $record['rule'] = $rule;
  251. $this->getDbTable()->getAdapter()->insert('collaborate_rules', $record);
  252. }
  253. break;
  254. default:
  255. break;
  256. }
  257. }
  258.  
  259. /**
  260. *
  261. * @param mixed $where
  262. * @param mixed $order
  263. * @return array
  264. */
  265. public function getActionList($where = null, $order = null) {
  266. $select = $this->getDbTable()->getAdapter()->select()->from('action_list')
  267. ->order($order);
  268. if ($where) {
  269. $select->where($where);
  270. }
  271.  
  272. $result = $select->query()->fetchAll(Zend_Db::FETCH_ASSOC);
  273.  
  274. $items = array();
  275. foreach($result as $row) {
  276. $items[] = $row['action'];
  277. }
  278.  
  279. return $items;
  280. }
  281.  
  282. public function getRoles($where = null, $order = null) {
  283. $select = $this->getDbTable()->getAdapter()->select()->from('roles')
  284. ->order($order);
  285. if ($where) {
  286. $select->where($where);
  287. }
  288.  
  289. $result = $select->query()->fetchAll(Zend_Db::FETCH_ASSOC);
  290.  
  291. $items = array();
  292. foreach($result as $row) {
  293. $items[$row['id']] = array(
  294. 'id' => $row['id'],
  295. 'role' => $row['role']
  296. );
  297.  
  298. if ($row['perm']) {
  299. $items[$row['id']]['perm'] = explode(',', $row['perm']);
  300. }
  301. }
  302.  
  303. return $items;
  304. }
  305.  
  306. public function updateRolePermissions($roleId, array $roleData) {
  307. $roleId = (int)$roleId;
  308. $actions = array_keys($roleData, '1');
  309. if ($actions) {
  310. $perm = implode(',', $actions);
  311. } else {
  312. $perm = '';
  313. }
  314.  
  315. $select = $this->getDbTable()->getAdapter()->select()->from('user_roles')
  316. ->where("role_id=$roleId");
  317.  
  318. $result = $select->query()->fetchAll(Zend_Db::FETCH_ASSOC);
  319.  
  320. $userIds = array();
  321. foreach($result as $row) {
  322. $userIds[] = $row['user_id'];
  323. }
  324.  
  325. if (!empty($userIds)) {
  326. $this->getDbTable()->update(array('rebuild' => 1), "id IN (" . implode(', ', $userIds) .")");
  327. }
  328.  
  329. $this->getDbTable()->getAdapter()->update('roles', array('perm' => $perm), "id=$roleId");
  330. }
  331.  
  332. protected function _getActionPermissionsByRole($roleId) {
  333. if (empty(self::$_userRoles)) {
  334. $select = $this->getDbTable()->getAdapter()->select()->from('roles', array('id', 'perm'));
  335. $result = $select->query()->fetchAll(Zend_Db::FETCH_ASSOC);
  336.  
  337. foreach($result as $row) {
  338. if (!empty($row['perm'])) {
  339. self::$_userRoles[$row['id']] = explode(',', $row['perm']);
  340. }
  341. }
  342. }
  343.  
  344. return isset(self::$_userRoles[$roleId]) ? self::$_userRoles[$roleId] : array();
  345. }
  346.  
  347. public function actionUsers($action, $userIds) {
  348. if (empty($userIds)) {
  349. return;
  350. }
  351. switch($action) {
  352. case 'activate':
  353. $this->activateUsers($userIds);
  354. break;
  355. case 'block':
  356. $this->blockUsers($userIds);
  357. break;
  358. case 'delete':
  359. $this->deleteUsers($userIds);
  360. break;
  361. default:
  362. throw new InvalidArgumentException("Invalid action: $action was provided");
  363. }
  364. }
  365.  
  366. public function activateUsers($userIds) {
  367. $this->getDbTable()->update(array('status' => 1), "id IN (" . implode(', ', $userIds) . ')');
  368. }
  369.  
  370. public function blockUsers($userIds) {
  371. $this->getDbTable()->update(array('status' => 0), "id IN (" . implode(', ', $userIds) . ')');
  372. }
  373.  
  374. public function deleteUsers($userIds) {
  375. foreach($userIds as $userId) {
  376. $this->removeUser($userId);
  377. }
  378.  
  379. //TODO remove all documents, permissions tied with these users
  380. }
  381.  
  382. /**
  383. *
  384. * @param string $where
  385. * @param mixed $order
  386. * @param int $count
  387. * @param int $offset
  388. * @return array
  389. */
  390. public function getUsers($where = null, $order = null) {
  391. $db = $this->getDbTable()->getAdapter();
  392.  
  393. $select = $db->select()->from(array('u' => 'users'))
  394. ->join(array('ur' => 'user_roles'), 'u.id=ur.user_id', array('role_id'))
  395. ->order($order);
  396.  
  397. if ($where) {
  398. $select->where($where);
  399. }
  400.  
  401. $result = $select->query()->fetchAll(Zend_Db::FETCH_ASSOC);
  402. if (!$result) {
  403. return array();
  404. }
  405.  
  406. $users = array();
  407.  
  408. foreach($result as $row) {
  409. $id = $row['id'];
  410. if (isset($users[$id])) {
  411. $users[$id]->addRole($row['role_id']);
  412. $users[$id]->setActionPermissions($this->_getActionPermissionsByRole($row['role_id']));
  413. } else {
  414. $user = new User_Model_User();
  415. $user->setId($id);
  416. $user->addRole($row['role_id']);
  417. $user->setEmail($row['email'])
  418. ->setName($row['username'])
  419. ->setFirstName($row['first_name'])
  420. ->setLastName($row['last_name'])
  421. ->setTimestampReg($row['timestamp_reg'])
  422. ->setTimestampLogin($row['timestamp_login'])
  423. ->setCountry($row['country'])
  424. ->setStatus($row['status'])
  425. ->setPassword($row['password'])
  426. ->setActivationCode($row['activation_code'])
  427. ->setNotify($row['notify']);
  428. $user->setActionPermissions($this->_getActionPermissionsByRole($row['role_id']));
  429. $users[$id] = $user;
  430. }
  431. }
  432.  
  433. return $users;
  434. }
  435.  
  436. public function getUserFileCount(User_Model_User $user) {
  437. $id = $this->getDbTable()->getAdapter()->quote($user->getId(), Zend_Db::INT_TYPE);
  438.  
  439. $db = $this->getDbTable()->getAdapter();
  440.  
  441. $select = $db->select()->from(
  442. array('f' => 'files'),
  443. array('file_count' => new Zend_Db_Expr("COUNT(*)")))
  444. ->where("user_id = $id");
  445.  
  446. $result = $select->query()->fetch();
  447. return $result['file_count'];
  448. }
  449.  
  450. public function getStorageSize(User_Model_User $user) {
  451. $id = $this->getDbTable()->getAdapter()->quote($user->getId(), Zend_Db::INT_TYPE);
  452.  
  453. $db = $this->getDbTable()->getAdapter();
  454.  
  455. $select = $db->select()->from(
  456. array('f' => 'files'),
  457. array('total_size' => new Zend_Db_Expr("SUM(size)")))
  458. ->where("user_id = $id");
  459.  
  460. $result = $select->query()->fetch();
  461. return $result['total_size'];
  462. }
  463.  
  464. /**
  465. * Set new password for user and send email notification with new data
  466. * @param string $email
  467. */
  468. public function forget($email) {
  469. $user = $this->fetchByEmail($email, new User_Model_User());
  470. if (!$user) {
  471. throw new Zend_Exception($this->_messages['user_doesnt_exist']);
  472. } else {
  473. $newPassword = substr(md5(time() . srand() . 'salT'), 0, 8);
  474.  
  475. $user->setPassword($newPassword, false);
  476. $this->save($user);
  477. User_Model_Mail::forget($email, $newPassword);
  478. $userId = $user->getId();
  479. Zend_Registry::get('logger')->info("User: $userId. New password requested");
  480. }
  481. }
  482.  
  483. /**
  484. * Register user in the system
  485. * @param array $data
  486. * @return User_Model_User
  487. */
  488. public function register(array $data) {
  489. $user = new User_Model_User();
  490. $user->setEmail($data['email'])
  491. ->setName($data['username'])
  492. ->setFirstName($data['firstname'])
  493. ->setLastName($data['lastname'])
  494. ->setTimestampReg(time())
  495. ->setTimestampLogin(0)
  496. ->setCountry(0)
  497. ->setStatus(0) //blocked
  498. ->setPassword($data['password'], false) //false to make md5
  499. ->setActivationCode($this->_generateActivationCode($data['email']))
  500. ->setNotify(1)
  501. ->addRole(2); //authenticated user
  502.  
  503. $db = $this->getDbTable()->getAdapter();
  504. $email = $db->quote($data['email']);
  505. $select = $db->select()->from(array('i' => 'invites'))
  506. ->where("email=$email")
  507. ->where("accepted=0");
  508.  
  509. $result = $select->query()->fetchAll();
  510.  
  511. if ($result) {
  512. $user->addRole(User_Model_User::ROLE_INVITEE); //Invitee role
  513. } else {
  514. $user->addRole(User_Model_User::ROLE_FULL_USER); //Full user role
  515. }
  516.  
  517. $user = $this->save($user);
  518.  
  519. //If user have invites to folders we should add access to these folders for this user
  520. $this->resolveInvites($user);
  521.  
  522.  
  523. $config = Zend_Controller_Front::getInstance()->getParam('bootstrap')->getApplication()->getOptions();
  524. $options = array(
  525. 'from' => $config['emails']['noreply'],
  526. 'noreply' => $config['emails']['noreply']
  527. );
  528.  
  529. User_Model_Mail::register($user, $options);
  530.  
  531. $userId = $user->getId();
  532. $userEmail = $user->getEmail();
  533. Zend_Registry::get('logger')->info("User: $userId <$userEmail>. New registration");
  534. return $user;
  535. }
  536.  
  537. /**
  538. * Unsubscribe user from document $entryType with id $entryId. If its folder it also unsubscribes from children items
  539. * @param int $entryId
  540. * @param string $entryType
  541. * @param User_Model_User $user
  542. */
  543. public function unsubscribe(Qliff_Model_ModelAbstract $model, $entryType, User_Model_User $user) {
  544. $entryId = $model->getId();
  545. $userId = $user->getId();
  546. $userEmail = $user->getEmail();
  547. $accessMapper = new User_Model_Mapper_Access();
  548. $permTable = new Views_Model_DbTable_Permissions();
  549. $permTable->delete("entry_id = '$entryId' AND entry_type='$entryType' AND user_id='$userId'");
  550.  
  551. $cache = Zend_Registry::get('cache_default');
  552.  
  553. if ($entryType == 'folder') {
  554. $accessMapper->remove($entryId, $entryType, $userId);
  555. foreach($model->getLinearFolders() as $folder) {
  556. $accessMapper->remove($folder->getId(), 'folder', $userId);
  557. foreach($folder->getDiscussions() as $discussion) {
  558. $accessMapper->remove($discussion->getId(), 'discussion', $userId);
  559. }
  560. foreach($folder->getFiles() as $file) {
  561. $accessMapper->remove($file->getId(), 'file', $userId);
  562. }
  563. }
  564.  
  565. foreach($model->getDiscussions() as $discussion) {
  566. $accessMapper->remove($discussion->getId(), 'discussion', $userId);
  567. }
  568.  
  569. foreach($model->getFiles() as $file) {
  570. $accessMapper->remove($file->getId(), 'file', $userId);
  571. }
  572.  
  573. $cache->clean(
  574. Zend_Cache::CLEANING_MODE_MATCHING_TAG,
  575. array('tag_folder_' . $model->getRootId())
  576. );
  577.  
  578. } else {
  579. $accessMapper->remove($entryId, $entryType, $userId);
  580. $cache->clean(
  581. Zend_Cache::CLEANING_MODE_MATCHING_TAG,
  582. array('tag_folder_' . $model->getFolder()->getRootId())
  583. );
  584. }
  585.  
  586. $this->getDbTable()->update(array("rebuild_perms" => 1), "id=" . $userId);
  587. Zend_Registry::get('logger')->info("User: $userId <$userEmail> unsubscribed from $entryType: $entryId");
  588. }
  589.  
  590. /**
  591. * If user was invited and now he is in the system then resolve all access
  592. * data to documents for him
  593. *
  594. * @param User_Model_User $user
  595. */
  596. public function resolveInvites(User_Model_User $user) {
  597. $db = $this->getDbTable()->getAdapter();
  598. $email = $db->quote($user->getEmail());
  599.  
  600. $this->initPermissions($user);
  601.  
  602. $cache = Zend_Registry::get('cache_default');
  603.  
  604. $select = $db->select()->from(array('i' => 'invites'))
  605. ->where("email=$email")
  606. ->where("accepted=0");
  607.  
  608. $result = $select->query()->fetchAll(Zend_Db::FETCH_OBJ);
  609.  
  610. if (is_array($result)) {
  611. foreach($result as $row) {
  612. try {
  613. $permTable = new Views_Model_DbTable_Permissions();
  614. $permTable->insert(array(
  615. 'entry_id' => $row->entry_id,
  616. 'entry_type' => $row->entry_type,
  617. 'user_id' => $user->getId(),
  618. 'access' => $row->access
  619. ));
  620. if ($row->entry_type == 'folder') {
  621. $cache->clean(
  622. Zend_Cache::CLEANING_MODE_MATCHING_TAG,
  623. array('tag_folder_' . $row->entry_id)
  624. );
  625. }
  626. $user->setPermission($row->entry_id, $row->entry_type, $row->access);
  627. } catch (Zend_Db_Exception $e) {
  628. //Can be double record
  629. }
  630. }
  631. }
  632.  
  633. $id = (int)$user->getId();
  634.  
  635. $cache->clean(
  636. Zend_Cache::CLEANING_MODE_MATCHING_TAG,
  637. array('user_document_' . $user->getId())
  638. );
  639.  
  640. $this->_observable->setUser($user);
  641. $this->_observable->notify();
  642. $user = $this->_observable->getUser();
  643.  
  644.  
  645. $db->update('users', array('rebuild_perms' => 1), "id=$id");
  646. $db->update('invites', array('accepted' => 1), "email=$email");
  647. }
  648.  
  649. /**
  650. * Resolve all access data for all users
  651. * @deprecated
  652. */
  653. public function resolveAllAccess() {
  654. $users = $this->getDbTable()->fetchAll();
  655. foreach($users as $user) {
  656. $u = new User_Model_User();
  657. $u = $this->fetch($user->id, $u);
  658. $this->initPermissions($u);
  659. $this->_observable->setUser($u);
  660. $this->_observable->notify();
  661. $user = $this->_observable->getUser();
  662. }
  663. }
  664.  
  665. /**
  666. * Invite user to collaborate document $model with access $access
  667. *
  668. * @param User_Model_User $inviter
  669. * @param string $email
  670. * @param string $entryType
  671. * @param Qliff_Model_ModelAbstract $model
  672. * @param string $access edit|view
  673. */
  674. public function invite(User_Model_User $inviter, $email, $entryType, Qliff_Model_ModelAbstract $model, $access) {
  675. $options = array();
  676. $entryId = $model->getId();
  677.  
  678. $db = $this->getDbTable()->getAdapter();
  679.  
  680. if (is_string($email)) {
  681. if (null !== ($user = $this->fetchByEmail($email, new User_Model_User()))) {
  682. //BlackList
  683.  
  684. $mapper = new User_Model_Mapper_BlackList();
  685. $blackList = $mapper->fetchByUser($user);
  686. foreach($blackList as $blEmail) {
  687. if ($blEmail['email'] == $inviter->getEmail()) {
  688. //can't be invited
  689. return;
  690. }
  691. }
  692.  
  693.  
  694. $this->resolveInvites($user);
  695. $cache = Zend_Registry::get('cache_default');
  696. $cache->clean(
  697. Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG,
  698. array('user_document_' . $user->getId())
  699. );
  700. $cleanTag = null;
  701. switch (get_class($model)) {
  702. case 'Views_Model_Folder':
  703. $cleanTag = 'tag_folder_' . $model->getRootId();
  704. $cache->remove('access_fetchUsers_' . $model->getId() . '_folder');
  705. break;
  706. case 'Views_Model_File':
  707. $cache->remove('access_fetchUsers_' . $model->getId() . '_file');
  708. $cleanTag = 'tag_folder_' . $model->getFolder()->getRootId();
  709. break;
  710. case 'Views_Model_Discussion':
  711. $cache->remove('access_fetchUsers_' . $model->getId() . '_discussion');
  712. $cleanTag = 'tag_folder_' . $model->getFolder()->getRootId();
  713. break;
  714. }
  715. if ($cleanTag) {
  716. $cache->clean(
  717. Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG,
  718. array($cleanTag)
  719. );
  720. }
  721.  
  722. $options['user'] = $user;
  723. }
  724.  
  725. $db->insert('invites', array(
  726. 'email' => $email,
  727. 'entry_id' => (int)$entryId,
  728. 'entry_type' => $entryType,
  729. 'user_id' => $inviter->getId(),
  730. 'timestamp_sent' => time(),
  731. 'access' => $access,
  732. 'accepted' => 0
  733. ));
  734.  
  735. User_Model_Mail::invite($inviter, $model, $email, $options);
  736. $userId = $inviter->getId();
  737. Zend_Registry::get('logger')->info("User: $userId. Invite sent to: $email");
  738. } else if (is_array($email)) {
  739. $inviteList = array();
  740. $options = array();
  741. $cache = Zend_Registry::get('cache_default');
  742. $cleanTag = null;
  743. switch (get_class($model)) {
  744. case 'Views_Model_Folder':
  745. $cleanTag = 'tag_folder_' . $model->getRootId();
  746. $cache->remove('access_fetchUsers_' . $model->getId() . '_folder');
  747. break;
  748. case 'Views_Model_File':
  749. $cache->remove('access_fetchUsers_' . $model->getId() . '_file');
  750. $cleanTag = 'tag_folder_' . $model->getFolder()->getRootId();
  751. break;
  752. case 'Views_Model_Discussion':
  753. $cache->remove('access_fetchUsers_' . $model->getId() . '_discussion');
  754. $cleanTag = 'tag_folder_' . $model->getFolder()->getRootId();
  755. break;
  756. }
  757. if ($cleanTag) {
  758. $cache->clean(
  759. Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG,
  760. array($cleanTag)
  761. );
  762. }
  763. foreach ($email as $e) {
  764. $db->insert('invites', array(
  765. 'email' => $e,
  766. 'entry_id' => (int)$entryId,
  767. 'entry_type' => $entryType,
  768. 'user_id' => $inviter->getId(),
  769. 'timestamp_sent' => time(),
  770. 'access' => $access,
  771. 'accepted' => 0
  772. ));
  773. if (null !== ($user = $this->fetchByEmail($e, new User_Model_User()))) {
  774. $mapper = new User_Model_Mapper_BlackList();
  775. $blackList = $mapper->fetchByUser($user);
  776. $found = false;
  777. foreach($blackList as $blEmail) {
  778. if ($blEmail['email'] == $inviter->getEmail()) {
  779. $found = true;
  780. }
  781. }
  782.  
  783. if ($found) {
  784. //Means in blacklist
  785. break;
  786. }
  787.  
  788. $this->resolveInvites($user);
  789.  
  790. $cache->clean(
  791. Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG,
  792. array('user_document_' . $user->getId())
  793. );
  794.  
  795. $options['users'][] = $user;
  796. }
  797. $inviteList[] = $e;
  798. }
  799. User_Model_Mail::massInvite($inviter, $model, $inviteList, $options);
  800. $userId = $inviter->getId();
  801. $emailsList = implode(', ', $inviteList);
  802. Zend_Registry::get('logger')->info("User: $userId. Invites sent to: $emailsList");
  803. }
  804. }
  805.  
  806. public function inviteSuggest(User_Model_User $inviter, $email, $entryType, Qliff_Model_ModelAbstract $model, $access) {
  807. $options = array();
  808. $entryId = $model->getId();
  809.  
  810. $db = $this->getDbTable()->getAdapter();
  811.  
  812. switch (get_class($model)) {
  813. case 'Views_Model_Folder':
  814. $ownerId = $model->getRootFolder()->getOwner()->getId();
  815. break;
  816. case 'Views_Model_File':
  817. case 'Views_Model_Discussion':
  818. $ownerId = $model->getFolder()->getRootFolder()->getOwner()->getId();
  819. break;
  820. }
  821.  
  822. if (is_string($email)) {
  823. $db->insert('invitee_suggest', array(
  824. 'emails' => $email,
  825. 'entry_id' => (int)$entryId,
  826. 'entry_type' => $entryType,
  827. 'user_id' => $inviter->getId(),
  828. 'timestamp_sent' => time(),
  829. 'access' => $access,
  830. 'to_user_id' => $ownerId
  831. ));
  832. } else if (is_array($email)) {
  833. $db->insert('invitee_suggest', array(
  834. 'emails' => implode(',', $email),
  835. 'entry_id' => (int) $entryId,
  836. 'entry_type' => $entryType,
  837. 'user_id' => $inviter->getId(),
  838. 'timestamp_sent' => time(),
  839. 'access' => $access,
  840. 'to_user_id' => $ownerId
  841. ));
  842. }
  843. }
  844.  
  845. public function getSuggestions(User_Model_User $user) {
  846. $db = $this->getDbTable()->getAdapter();
  847.  
  848. $select = $db->select()->from('invitee_suggest')->where("to_user_id=?", $user->getId(), Zend_Db::INT_TYPE);
  849.  
  850. $result = $select->query()->fetchAll();
  851.  
  852. $suggestions = array();
  853. if ($result) {
  854. foreach($result as $row) {
  855. $suggestions[$row['id']] = $row;
  856. }
  857. }
  858.  
  859. return $suggestions;
  860. }
  861.  
  862. public function actionSuggestions(User_Model_User $user, $action, array $ids) {
  863. $suggestions = $this->getSuggestions($user);
  864. $db = $this->getDbTable()->getAdapter();
  865.  
  866. switch($action) {
  867. case 'approve':
  868. foreach($ids as $id) {
  869. $model = Views_Model_Mapper_Factory::factoryModel(
  870. $suggestions[$id]['entry_id'],
  871. $suggestions[$id]['entry_type'],
  872. $user
  873. );
  874.  
  875. $this->invite($user,
  876. explode(',', $suggestions[$id]['emails']),
  877. $suggestions[$id]['entry_type'],
  878. $model,
  879. $suggestions[$id]['access']);
  880. }
  881. if (!empty ($ids)) {
  882. $db->delete('invitee_suggest', 'id IN (' . implode(',', $ids) . ')');
  883. }
  884. break;
  885. case 'decline':
  886. if (!empty ($ids)) {
  887. $db->delete('invitee_suggest', 'id IN (' . implode(',', $ids) . ')');
  888. }
  889. break;
  890. }
  891. }
  892.  
  893. /**
  894. * Initialize permissions for user $user
  895. *
  896. * @param User_Model_User $user
  897. */
  898. public function initPermissions(User_Model_User &$user) {
  899. $user->unsetPermissions();
  900. $db = $this->getDbTable()->getAdapter();
  901. $select = $db->select()
  902. ->from(array('p' => 'permissions'))
  903. ->where("p.user_id = " . (int)$user->getId());
  904.  
  905. $result = $select->query()->fetchAll();
  906.  
  907. $permissions = array();
  908. foreach($result as $row) {
  909. $permissions[] = array(
  910. 'id' => $row['entry_id'],
  911. 'type' => $row['entry_type'],
  912. 'access' => $row['access']
  913. );
  914. }
  915.  
  916. $user->setPermissions($permissions);
  917. }
  918.  
  919. /**
  920. * Activate user and set status to 1 (active)
  921. * @param string $email
  922. * @param string $code
  923. * @return User_Model_User if success and null otherwise
  924. */
  925. public function activate($email, $code) {
  926. if (null === ($user = $this->fetchByEmail($email, new User_Model_User()))) {
  927. throw new User_Model_Exception(sprintf($this->_messages['user_not_found'], $email));
  928. } else {
  929. if ($user->getActivationCode() == '' || $user->getStatus() == 1) {
  930. throw new User_Model_Exception($this->_messages['user_activated_already']);
  931. } else {
  932. //Activation code is not empty and user is blocked
  933. $user->setActivationCode('');
  934. $user->setStatus(1);
  935. $this->save($user);
  936.  
  937. $userId = $user->getId();
  938. Zend_Registry::get('logger')->info("User: $userId. Activation success");
  939.  
  940. return $user;
  941. }
  942. }
  943. return null;
  944. }
  945.  
  946. /**
  947. * Generates activation code based on user email and random data
  948. *
  949. * @param string $email
  950. * @return string
  951. */
  952. protected function _generateActivationCode($email) {
  953. return substr(md5($email . time() . srand()), 0, 16);
  954. }
  955.  
  956. /**
  957. * Get user by email (its unique)
  958. *
  959. * @param string $email
  960. * @param User_Model_User $user
  961. * @return User_Model_User
  962. */
  963. public function fetchByEmail($email, User_Model_User $user) {
  964. $email = $this->getDbTable()->getAdapter()->quote($email);
  965. $users = $this->getUsers('u.email = ' . $email);
  966.  
  967. if (empty($users)) {
  968. return null;
  969. }
  970.  
  971. $user = current($users);
  972. $this->initPermissions($user);
  973. $this->initUpdates($user);
  974.  
  975. return $user;
  976. }
  977.  
  978. public function initUpdates(User_Model_User &$user) {
  979. $mapper = new User_Model_Mapper_UserUpdate();
  980. $user = $mapper->loadUpdates($user);
  981. }
  982.  
  983. /**
  984. * Get user by unique id $id
  985. *
  986. * @param int $id
  987. * @param User_Model_User $user
  988. * @param bool $cached Use cache or not
  989. * @return User_Model_User
  990. */
  991. public function fetch($id, User_Model_User $user, $cached = true) {
  992. if (isset(self::$_users[$id]) && $cached) {
  993. return self::$_users[$id];
  994. }
  995.  
  996. $cacheId = 'user_' . $id;
  997. $cache = Zend_Registry::get('cache_default');
  998.  
  999. if (false !== ($u = $cache->load($cacheId)) && $cached) {
  1000. self::$_users[$id] = $u;
  1001. return $u;
  1002. }
  1003.  
  1004. $id = $this->getDbTable()->getAdapter()->quote($id, Zend_Db::INT_TYPE);
  1005. $users = $this->getUsers('u.id = ' . $id);
  1006. if (empty($users)) {
  1007. return null;
  1008. }
  1009.  
  1010. $user = current($users);
  1011.  
  1012. $this->initPermissions($user);
  1013. $this->initUpdates($user);
  1014.  
  1015. self::$_users[$id] = $user;
  1016. $cache->save($user, $cacheId);
  1017. return $user;
  1018. }
  1019.  
  1020. /**
  1021. * Save user to database. If user model have id then update it, otherwise insert
  1022. *
  1023. * @param User_Model_User $user
  1024. * @return User_Model_User
  1025. */
  1026. public function save(User_Model_User $user) {
  1027. $data = array(
  1028. 'email' => $user->getEmail(),
  1029. 'password' => $user->getPassword(),
  1030. 'status' => $user->getStatus(),
  1031. 'username' => $user->getName(),
  1032. 'first_name' => $user->getFirstName(),
  1033. 'last_name' => $user->getLastName(),
  1034. 'country' => $user->getCountry(),
  1035. 'timestamp_login' => $user->getTimestampLogin(),
  1036. 'activation_code' => $user->getActivationCode(),
  1037. 'notify' => $user->getNotify(),
  1038. 'rebuild' => 1
  1039. );
  1040.  
  1041. $roles = $user->getRoles();
  1042. unset($roles[1]); //unset anonymous
  1043.  
  1044. if (null === ($id = $user->getId())) {
  1045. $data['timestamp_reg'] = $user->getTimestampReg();
  1046. $data['status'] = $user->getStatus() ? 1 : 0;
  1047. $data['timestamp_login'] = 0;
  1048. $newId = $this->getDbTable()->insert($data);
  1049. $user->setId($newId);
  1050. foreach($roles as $role => $roleName) {
  1051. $this->getDbTable()->getAdapter()->insert('user_roles',
  1052. array('user_id' => $newId, 'role_id' => $role)
  1053. );
  1054. }
  1055. } else {
  1056. $id = $this->getDbTable()->getAdapter()->quote($id, Zend_Db::INT_TYPE);
  1057. $this->getDbTable()->update($data, array("id = $id"));
  1058.  
  1059. $dbRolesResult = $this->getDbTable()->getAdapter()->fetchAll("SELECT role_id FROM user_roles WHERE user_id='$id'");
  1060. $dbRoles = array();
  1061. if ($dbRolesResult) {
  1062. foreach($dbRolesResult as $role) {
  1063. $dbRoles[$role['role_id']] = $role['role_id'];
  1064. }
  1065. }
  1066.  
  1067. $unusedRoles = $dbRoles;
  1068. foreach($roles as $role => $roleName) {
  1069. if (!in_array($role, $dbRoles)) {
  1070. $this->getDbTable()->getAdapter()->insert('user_roles',
  1071. array('user_id' => $id, 'role_id' => $role)
  1072. );
  1073. }
  1074. unset($unusedRoles[$role]);
  1075. }
  1076.  
  1077. foreach($unusedRoles as $roleId) {
  1078. $this->getDbTable()->getAdapter()->delete('user_roles', "user_id='$id' AND role_id='$roleId'");
  1079. }
  1080. }
  1081.  
  1082. unset(self::$_users[$user->getId()]);
  1083. $cache = Zend_Registry::get('cache_default');
  1084. $cache->remove('user_' . $user->getId());
  1085.  
  1086. return $user;
  1087. }
  1088.  
  1089. /**
  1090. * Fully remove user with all ties and his files from the system
  1091. *
  1092. * @param int $id User ID
  1093. */
  1094. public function removeUser($id) {
  1095. $db = $this->getDbTable()->getAdapter();
  1096. $id = $db->quote($id, Zend_Db::INT_TYPE);
  1097. $files = $db->fetchAll("SELECT id, path FROM files WHERE user_id=$id");
  1098.  
  1099. $config = Zend_Registry::get('config');
  1100. $basePathFiles = $config['site']['filepath'];
  1101.  
  1102. $fileIds = array();
  1103. foreach($files as $file) {
  1104. $filepath = $basePathFiles . '/' . $file['path'];
  1105. if (file_exists($filepath) && is_writable($filepath)) {
  1106. unlink($filepath);
  1107. }
  1108. $fileIds[] = $file['id'];
  1109. }
  1110.  
  1111. if ($fileIds) {
  1112. $fileIdsString = implode(', ', $fileIds);
  1113. $db->delete('files', "id IN (". $fileIdsString .")");
  1114. $db->delete('access', "entry_id IN (". $fileIdsString .") AND entry_type='file'");
  1115. $db->delete('collaborate_rules', "entry_id IN (". $fileIdsString .") AND entry_type='file'");
  1116. $db->delete('comments', "entry_id IN (". $fileIdsString .") AND entry_type='file'");
  1117. $db->delete('image_notes', "file_id IN (". $fileIdsString .")");
  1118. $db->delete('permissions', "entry_id IN (". $fileIdsString .") AND entry_type='file'");
  1119. }
  1120.  
  1121. $db->delete('access', "user_id=$id");
  1122. $db->delete('permissions', "user_id=$id");
  1123. $db->delete('comments', "user_id=$id");
  1124. $db->delete('image_notes', "user_id=$id");
  1125. $db->delete('user_blacklist', "user_id=$id");
  1126. $db->delete('user_roles', "user_id=$id");
  1127. $db->delete('user_updates', "user_id=$id");
  1128. $db->delete('invitee_suggest', "to_user_id=$id");
  1129. $db->delete('collaborate_rules', "user_id=$id");
  1130.  
  1131. $this->getDbTable()->delete("id=$id");
  1132.  
  1133. $cache = Zend_Registry::get('cache_default');
  1134. $cache->remove('user_' . $id);
  1135. $cache->clean(
  1136. Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG,
  1137. array('user_document_' . $id)
  1138. );
  1139. }
  1140. }
Add Comment
Please, Sign In to add comment