AccessGroupStorageAcl.php 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. <?php
  2. Lib::loadClass('Core_AclBase');
  3. Lib::loadClass('User');
  4. Lib::loadClass('UsersHelper');
  5. Lib::loadClass('ParseOgcFilter');
  6. Lib::loadClass('SqlQueryWhereBuilder');
  7. class Schema_AccessGroupStorageAcl extends Core_AclBase {// Read only class
  8. public function getNamespace() { return 'default_objects/' . $this->getName(); }
  9. public function getSourceName() { return 'objects'; }
  10. public function init($force = false) {}
  11. public function isInitialized() { return true; }
  12. public function getName() { return 'AccessGroup'; }
  13. public function getRootTableName() { return 'CRM_LISTA_ZASOBOW'; }
  14. public function getFieldListByIdZasob() { return $this->getRealFieldListByIdZasob(); }
  15. public function getVisibleFieldListByIdZasob() { return $this->getRealFieldListByIdZasob(); }
  16. public function getVirtualFieldListByIdZasob() { return array(); }
  17. public function getRealFieldListByIdZasob($force = false) {
  18. $cols[100000] = 'id';// CRM_LISTA_ZASOBOW.ID
  19. $cols[100001] = 'name';// CRM_LISTA_ZASOBOW.DESC
  20. $cols[100002] = 'uid';// Ldap.uid -> value stored in fields: A_ADM_COMPANY, A_CLASSIFIED
  21. return $cols;
  22. }
  23. public function getFields() { return array_values($this->getRealFieldListByIdZasob()); }
  24. public function getFieldType($fieldName) { return null; }
  25. // TODO: replace legacy functions: isAllowed, hasFieldPerm, getFieldIdByName
  26. public function canCreateField($fieldName) { return false; }
  27. public function canReadField($fieldName) { return true; }
  28. public function canReadObjectField($fieldName, $record) {return true; }
  29. public function canWriteField($fieldName) { return false; }
  30. public function canWriteObjectField($fieldName, $record) { return false; }
  31. public function getTotal($params = array()) {
  32. return count($this->getItems($params));
  33. }
  34. public function getItem($primaryKey) {
  35. $items = $this->getItems(['primaryKey'=>$primaryKey]);
  36. return (!empty($items[$primaryKey])) ? $items[$primaryKey] : null;
  37. }
  38. public function getItems($params = array()) {
  39. $DBG = V::get('DBG_DS', 0, $_GET, 'int');
  40. if($DBG>2){echo'<pre>';}
  41. if($DBG>2){echo 'C.'.get_class($this).' L.' . __LINE__ . " getItems \$params:";print_r($params);echo "\n";}
  42. $items = array();
  43. // TODO: fetch groups connectes with current user
  44. {
  45. $userLdapGroups = UsersHelper::getLDAPGroupByUserName(User::getLogin());
  46. if($DBG>4){echo 'C.'.get_class($this).' L.' . __LINE__ . " getItems \$userLdapGroups:";print_r($userLdapGroups);echo "\n";}
  47. if (empty($userLdapGroups)) throw new Exception("User groups not found", 404);
  48. foreach ($userLdapGroups as $vLdapGroup) {
  49. $allowGroup = false;
  50. if ('workgroup' == $vLdapGroup->cn) {
  51. $items[1] = ['id'=>'0', 'name'=>$vLdapGroup->name, 'uid'=>$vLdapGroup->cn];
  52. } else {
  53. $cnTest = str_replace('-', '_', $vLdapGroup->cn);
  54. $cnTest = explode('_', $cnTest);
  55. $idZasob = $cnTest[0];
  56. if (!is_numeric($idZasob)) {
  57. if($DBG>2){echo 'C.'.get_class($this).' L.' . __LINE__ . " getItems - skip cn - missing id zasob \$vLdapGroup->cn:";print_r($vLdapGroup->cn);echo "\n";}
  58. continue;
  59. }
  60. $items[$idZasob] = ['id'=>$idZasob, 'name'=>$vLdapGroup->name, 'uid'=>$vLdapGroup->cn];
  61. }
  62. }
  63. }
  64. if ($pk = V::get('primaryKey', '', $params, 'int')) {// [primaryKey] => 2948
  65. if (!array_key_exists($pk, $items)) return array();
  66. $items = array($pk => $items[$pk]);
  67. }
  68. if (!empty($params['ogc:Filter'])) {
  69. $parser = new ParseOgcFilter();
  70. $parser->loadOgcFilter($params['ogc:Filter']);
  71. $queryWhereBuilder = $parser->convertToSqlQueryWhereBuilder();
  72. DBG::_('DBG_DS', '>2', "ogc:Filter \$queryWhereBuilder", $queryWhereBuilder, __CLASS__, __FUNCTION__, __LINE__);
  73. if($DBG>2){echo 'C.'.get_class($this).' L.' . __LINE__ . " getItems \$items:";print_r($items);echo "\n";}
  74. $items = array_filter($items, array($queryWhereBuilder, 'filterRawArray'));
  75. }
  76. $filterId = trim(V::get('f_id', '', $params));
  77. if (strlen($filterId)) {// allow '0'
  78. $queryWhereBuilder = new SqlQueryWhereBuilder();
  79. if (is_numeric($filterId)) {
  80. $queryWhereBuilder->addComparisonFieldToValue('id', '=', $filterId);
  81. } else if (false !== strpos($filterId, '%') && is_numeric(trim($filterId, '%'))) {
  82. $queryWhereBuilder->addComparisonFieldToValue('id', 'like', $filterId);
  83. } else if ('>=' == substr($filterId, 0, 2) && is_numeric(substr($filterId, 2))) {
  84. $queryWhereBuilder->addComparisonFieldToValue('id', 'GreaterThenOrEqualTo', substr($filterId, 2));
  85. } else if ('<=' == substr($filterId, 0, 2) && is_numeric(substr($filterId, 2))) {
  86. $queryWhereBuilder->addComparisonFieldToValue('id', 'LessThenOrEqualTo', substr($filterId, 2));
  87. } else if ('>' == substr($filterId, 0, 1) && is_numeric(substr($filterId, 1))) {
  88. $queryWhereBuilder->addComparisonFieldToValue('id', 'GreaterThen', substr($filterId, 1));
  89. } else if ('<' == substr($filterId, 0, 1) && is_numeric(substr($filterId, 1))) {
  90. $queryWhereBuilder->addComparisonFieldToValue('id', 'LessThen', substr($filterId, 1));
  91. } else if ('=' == substr($filterId, 0, 1) && is_numeric(substr($filterId, 1))) {
  92. $queryWhereBuilder->addComparisonFieldToValue('id', '=', substr($filterId, 1));
  93. } else {
  94. $filterId = null;// TODO: BUG uniimplemented comparison sign
  95. }
  96. if ($filterId) $items = array_filter($items, array($queryWhereBuilder, 'filterRawArray'));
  97. }
  98. foreach (['name', 'uid'] as $fieldName) {
  99. $filterValue = trim(V::get("f_{$fieldName}", '', $params));
  100. if (strlen($filterValue)) {// allow '0'
  101. $queryWhereBuilder = new SqlQueryWhereBuilder();
  102. if (!is_scalar($filterValue)) {
  103. } else if ('=' == substr($filterValue, 0, 1)) {
  104. $queryWhereBuilder->addComparisonFieldToValue($fieldName, '=', substr($filterValue, 1));
  105. } else {
  106. if ('%' != substr($filterValue, 0, 1)) $filterValue = "%{$filterValue}";
  107. if ('%' != substr($filterValue, -1)) $filterValue = "{$filterValue}%";
  108. $queryWhereBuilder->addComparisonFieldToValue($fieldName, 'like', $filterValue);
  109. }
  110. $items = array_filter($items, array($queryWhereBuilder, 'filterRawArray'));
  111. }
  112. }
  113. $orderBy = strtolower(V::get('order_by', 'id', $params));
  114. $orderDir = strtolower(V::get('order_dir', 'desc', $params));
  115. if (!in_array($orderBy, ['id', 'name', 'uid'])) throw new HttpException("Bad Request - wrong or missing order by", 400);
  116. if (!in_array($orderDir, ['desc', 'asc'])) throw new HttpException("Bad Request - wrong or missing order dir", 400);
  117. usort($items, function ($a, $b) use ($orderBy, $orderDir) {
  118. if ('desc' == $orderDir) {
  119. return (V::geti($orderBy, '', $a) > V::geti($orderBy, '', $b)) ? -1 : 1;
  120. } else if ('asc' == $orderDir) {
  121. return (V::geti($orderBy, '', $a) > V::geti($orderBy, '', $b)) ? 1 : -1;
  122. }
  123. return 0;
  124. });
  125. if($DBG>2){echo 'C.'.get_class($this).' L.' . __LINE__ . " getItems \$items:";print_r($items);echo "\n";}
  126. return $items;
  127. }
  128. public function addItem($itemTodo) { throw new Exception("Insert not allowed"); }
  129. public function updateItem($itemPatch) { throw new Exception("Update not allowed"); }
  130. public function getGeomFieldType($fieldName) { return null; }
  131. public function getPrimaryKeyField() { return 'id'; }
  132. public function getID() { return 0; }
  133. public function getAttributesFromZasoby() { return array(); }
  134. public function isEnumerationField($fieldName) { return false; }
  135. public function getEnumerations($fieldName) { return null; }
  136. public function getXsdFieldType($fieldName) {
  137. if ('id' == $fieldName) return 'xsd:string';
  138. if ('name' == $fieldName) return 'xsd:string';
  139. if ('uid' == $fieldName) return 'xsd:string';
  140. }
  141. public function isGeomField($fldName) { return false; }
  142. }