Exemple #1
0
 /**
  * method to get and format the log data as needed
  * @param  array &$p
  * @return array
  */
 protected static function getLogData(&$p)
 {
     $rez = array();
     $fields = array('id' => 1, 'name' => 1, 'iconCls' => 1, 'pids' => 1, 'path' => 1, 'template_id' => 1, 'case_id' => 1, 'date' => 1, 'size' => 1, 'cid' => 1, 'oid' => 1, 'uid' => 1, 'cdate' => 1, 'udate' => 1);
     $oldData = empty($p['old']) ? array() : $p['old']->getData();
     $newData = empty($p['new']) ? array() : $p['new']->getData();
     $oldData = array_intersect_key($oldData, $fields);
     $newData = array_intersect_key($newData, $fields);
     $rez = $newData + $oldData;
     //return empty result for other than object actions (login, logout, etc)
     if (empty($rez['id'])) {
         return;
     }
     Util\unsetNullValues($rez);
     $rez['name'] = htmlspecialchars($rez['name'], ENT_COMPAT);
     if (empty($rez['iconCls'])) {
         $rez['iconCls'] = Browser::getIcon($rez);
     }
     if (!empty($p['mentioned'])) {
         $rez['mentioned'] = $p['mentioned'];
     }
     $rez['pids'] = empty($rez['pids']) ? Objects::getPids($rez['id']) : Util\toNumericArray($rez['pids']);
     $rez['path'] = htmlspecialchars(@Util\coalesce($rez['pathtext'], $rez['path']), ENT_COMPAT);
     switch ($p['type']) {
         case 'comment':
         case 'comment_update':
             $rez['comment'] = $p['comment'];
             break;
         case 'file_upload':
         case 'file_update':
             $rez['file'] = $p['file'];
             break;
         case 'completion_decline':
         case 'completion_on_behalf':
             if (!empty($p['forUserId'])) {
                 $rez['forUserId'] = $p['forUserId'];
             }
             break;
         default:
             // setting old and new properties of linear custom data
             if (!empty($p['old'])) {
                 $rez['old'] = $p['old']->getAssocLinearData();
             }
             if (!empty($p['new'])) {
                 $rez['new'] = $p['new']->getAssocLinearData();
             }
             //unset identical values
             if (!empty($rez['old']) && !empty($rez['new'])) {
                 foreach ($rez['old'] as $k => $v) {
                     if (isset($rez['new'][$k]) && $rez['new'][$k] == $v) {
                         unset($rez['old'][$k]);
                         unset($rez['new'][$k]);
                     }
                 }
             }
     }
     return $rez;
 }
Exemple #2
0
 /**
  * remove security rules from child items
  *
  * @param array json request
  * @return array json  response
  */
 public function removeChildPermissions($p)
 {
     if (!Security::isAdmin()) {
         throw new \Exception(L\get('Access_denied'));
     }
     $pids = Objects::getPids($p['id'], false);
     $pids = implode(',', $pids);
     $child_ids = array();
     // selecting childs with accesses
     $res = DB\dbQuery('SELECT id
         FROM tree_info
         WHERE pids like $1 and acl_count > 0', $pids . ',%');
     while ($r = $res->fetch_assoc()) {
         $child_ids[] = $r['id'];
     }
     $res->close();
     //remove security rules for childs
     if (!empty($child_ids)) {
         DB\dbQuery('DELETE FROM tree_acl WHERE node_id in (' . implode(',', $child_ids) . ')');
         // update inherit flag
         DB\dbQuery('UPDATE tree SET inherit_acl = 1 WHERE id in (' . implode(',', $child_ids) . ')');
     }
     Solr\Client::runBackgroundCron();
     return array('success' => true);
 }
Exemple #3
0
 /**
  * return records for an objects field based on its config
  * @param  array $p
  * @return json  repsponce
  */
 public function getObjectsForField($p)
 {
     // ,"scope": 'tree' //project, parent, self, $node_id
     // ,"field": <field_name> //for field type
     // ,"descendants": true
     // /* filter used for objects */
     // ,+"tags": []
     // ,+"types": []
     // ,+"templates": []
     // ,"templateGroups": []
     //,+query - user query
     //unset restricted query params from user input
     unset($p['fq']);
     $ids = array();
     $fieldConfig = array();
     // get field config from database
     if (!empty($p['fieldId']) && is_numeric($p['fieldId'])) {
         $r = DM\TemplatesStructure::read($p['fieldId']);
         if (!empty($r['cfg'])) {
             $fieldConfig = $r['cfg'];
             if (!empty($r['cfg']['fq'])) {
                 $p['fq'] = $r['cfg']['fq'];
             }
         }
     }
     if (!empty($p['source'])) {
         if (is_array($p['source'])) {
             // a custom source
             $rez = array();
             if (empty($p['fieldId'])) {
                 return $rez;
             }
             //get custom method from config
             if (empty($fieldConfig['source']['fn'])) {
                 return $rez;
             }
             $method = explode('.', $fieldConfig['source']['fn']);
             $class = new $method[0]();
             $rez = $class->{$method}[1]($p);
             if (!empty($rez)) {
                 return $rez;
             }
         }
         switch ($p['source']) {
             case 'field':
                 switch ($p['scope']) {
                     case 'project':
                         $ids = DM\Tree::getCaseId(Path::detectRealTargetId($p['path']));
                         break;
                     case 'parent':
                         $ids = Path::detectRealTargetId($p['path']);
                         break;
                     default:
                         if (empty($p['pidValue']) || empty($p['field'])) {
                             break 2;
                         }
                         $ids = $p['pidValue'];
                 }
                 $ids = Util\toNumericArray($ids);
                 if (empty($ids)) {
                     break;
                 }
                 /*get distinct target field values for selected objects in parent field */
                 $obj = new Objects\Object();
                 $values = array();
                 foreach ($ids as $id) {
                     $obj->load($id);
                     $fv = $obj->getFieldValue($p['field'], 0);
                     $fv = Util\toNumericArray(@$fv['value']);
                     $values = array_merge($values, $fv);
                 }
                 $values = array_unique($values);
                 if (empty($values)) {
                     return array('success' => true, 'data' => array());
                 }
                 $p['ids'] = $values;
                 break;
         }
     }
     $pids = false;
     if (!empty($fieldConfig['scope'])) {
         $scope = $fieldConfig['scope'];
         switch ($scope) {
             case 'project':
                 /* limiting pid to project. If not in a project then to parent directory */
                 if (!empty($p['objectId']) && is_numeric($p['objectId'])) {
                     $pids = DM\Tree::getCaseId($p['objectId']);
                 } elseif (!empty($p['path'])) {
                     $pids = DM\Tree::getCaseId(Path::detectRealTargetId($p['path']));
                 }
                 break;
             case 'parent':
                 if (!empty($p['objectId']) && is_numeric($p['objectId'])) {
                     $pids = Objects::getPids($p['objectId']);
                     if (!empty($pids)) {
                         $p['pids'] = array_pop($pids);
                     }
                 } elseif (!empty($p['path'])) {
                     $pids = Path::detectRealTargetId($p['path']);
                 }
                 break;
             case 'self':
                 if (!empty($p['objectId']) && is_numeric($p['objectId'])) {
                     $p['pids'] = $p['objectId'];
                 } elseif (!empty($p['path'])) {
                     $pids = Path::detectRealTargetId($p['path']);
                 }
                 break;
             case 'variable':
                 $pids = empty($p['pidValue']) ? Path::detectRealTargetId($p['path']) : Util\toNumericArray($p['pidValue']);
                 break;
             default:
                 $pids = Util\toNumericArray($scope);
                 break;
         }
     }
     if (!empty($pids)) {
         if (empty($p['descendants'])) {
             $p['pid'] = $pids;
         } elseif (@$p['source'] !== 'field') {
             $p['pids'] = $pids;
         }
     }
     $p['fl'] = 'id,name,type,template_id,status';
     if (!empty($p['fields'])) {
         if (!is_array($p['fields'])) {
             $p['fields'] = explode(',', $p['fields']);
         }
         for ($i = 0; $i < sizeof($p['fields']); $i++) {
             $fieldName = trim($p['fields'][$i]);
             if ($fieldName == 'project') {
                 $fieldName = 'case';
             }
             if (in_array($fieldName, array('date', 'path', 'case', 'size', 'cid', 'oid', 'cdate', 'udate'))) {
                 $p['fl'] .= ',' . $fieldName;
             }
         }
     }
     //increase number of returned items
     if (empty($p['rows'])) {
         if (empty($p['limit'])) {
             if (empty($p['pageSize'])) {
                 $p['rows'] = 50;
             } else {
                 $p['rows'] = $p['pageSize'];
             }
         } else {
             $p['rows'] = $p['limit'];
         }
     }
     if (!is_numeric($p['rows'])) {
         $p['rows'] = 50;
     }
     $search = new Search();
     // temporary: Don't use permissions for Objects fields
     // it can be later reinforced per field in config
     $p['skipSecurity'] = true;
     $rez = $search->query($p);
     foreach ($rez['data'] as &$doc) {
         $ids[] = $doc['id'];
     }
     $recs = DM\Tree::readByIds($ids, true);
     foreach ($rez['data'] as &$doc) {
         if (!empty($recs[$doc['id']]['cfg']['iconCls'])) {
             $doc['iconCls'] = $recs[$doc['id']]['cfg']['iconCls'];
         }
     }
     if (empty($rez['DC'])) {
         $rez['DC'] = array('name' => array('solr_column_name' => "name", 'idx' => 0));
     }
     return $rez;
 }