/** * 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; }
/** * 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); }
/** * 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; }