/** * Returns an array of model classes for which the current user * has rights and which should be used according to his filter * * @param object $request * @param string $model_filter * @return array */ private static function determineModelClasses($request, $model_filter = 'all') { $classes = array(); if (true === IDF_Precondition::accessSource($request) && ($model_filter == 'all' || $model_filter == 'commits')) { $classes[] = '\'IDF_Commit\''; // FIXME: this looks like a hack... IDF_Scm::syncTimeline($request->project); } if (true === IDF_Precondition::accessIssues($request) && ($model_filter == 'all' || $model_filter == 'issues')) { $classes[] = '\'IDF_Issue\''; $classes[] = '\'IDF_IssueComment\''; } if (true === IDF_Precondition::accessDownloads($request) && ($model_filter == 'all' || $model_filter == 'downloads')) { $classes[] = '\'IDF_Upload\''; } if (true === IDF_Precondition::accessWiki($request) && ($model_filter == 'all' || $model_filter == 'documents')) { $classes[] = '\'IDF_WikiPage\''; $classes[] = '\'IDF_WikiRevision\''; } if (true === IDF_Precondition::accessReview($request) && ($model_filter == 'all' || $model_filter == 'reviews')) { $classes[] = '\'IDF_Review_Comment\''; $classes[] = '\'IDF_Review_Patch\''; } if (count($classes) == 0) { $classes[] = '\'IDF_Dummy\''; } return $classes; }
public function timelineFeed($request, $match) { $prj = $request->project; // Need to check the rights $rights = array(); if (true === IDF_Precondition::accessSource($request)) { $rights[] = '\'IDF_Commit\''; IDF_Scm::syncTimeline($request->project); } if (true === IDF_Precondition::accessIssues($request)) { $rights[] = '\'IDF_Issue\''; $rights[] = '\'IDF_IssueComment\''; } if (true === IDF_Precondition::accessDownloads($request)) { $rights[] = '\'IDF_Upload\''; } if (true === IDF_Precondition::accessWiki($request)) { $rights[] = '\'IDF_WikiPage\''; $rights[] = '\'IDF_WikiRevision\''; } if (true === IDF_Precondition::accessReview($request)) { $rights[] = '\'IDF_Review_Comment\''; $rights[] = '\'IDF_Review_Patch\''; } if (count($rights) == 0) { $rights[] = '\'IDF_Dummy\''; } $sqls = sprintf('model_class IN (%s)', implode(', ', $rights)); $sql = new Pluf_SQL('project=%s AND ' . $sqls, array($prj->id)); $params = array('filter' => $sql->gen(), 'order' => 'creation_dtime DESC', 'nb' => 20); $items = Pluf::factory('IDF_Timeline')->getList($params); $set = new Pluf_Model_Set($items, array('public_dtime' => 'public_dtime')); $out = array(); foreach ($set as $item) { if ($item->id) { $out[] = $item->feedFragment($request); } } if ($items->count() > 0) { $date = Pluf_Date::gmDateToGmString($items[0]->creation_dtime); } else { $date = gmdate('c'); } $out = Pluf_Template::markSafe(implode("\n", $out)); $tmpl = new Pluf_Template('idf/index.atom'); $title = __('Updates'); $feedurl = Pluf::f('url_base') . Pluf::f('idf_base') . $request->query; $viewurl = Pluf_HTTP_URL_urlForView('IDF_Views_Project::timeline', array($prj->shortname)); $context = new Pluf_Template_Context_Request($request, array('body' => $out, 'date' => $date, 'title' => $title, 'feedurl' => $feedurl, 'viewurl' => $viewurl)); return new Pluf_HTTP_Response('<?xml version="1.0" encoding="utf-8"?>' . "\n" . $tmpl->render($context), 'application/atom+xml; charset=utf-8'); }
/** * Control the access rights to the repository. * * @param string Username * @param string Path including the possible .git * @param string Type of access. 'readonly' or ('writable') * @return mixed False or array(base_git_reps, relative path to repo) */ public function haveAccess($username, $path, $mode = 'writable') { if ('.git' == substr($path, -4)) { $path = substr($path, 0, -4); } $sql = new Pluf_SQL('shortname=%s', array($path)); $projects = Pluf::factory('IDF_Project')->getList(array('filter' => $sql->gen())); if ($projects->count() != 1) { return false; } $project = $projects[0]; $conf = new IDF_Conf(); $conf->setProject($project); $scm = $conf->getVal('scm', 'git'); if ($scm != 'git') { return false; } $sql = new Pluf_SQL('login=%s', array($username)); $users = Pluf::factory('Pluf_User')->getList(array('filter' => $sql->gen())); if ($users->count() != 1 or !$users[0]->active) { return false; } $user = $users[0]; $request = new StdClass(); $request->user = $user; $request->conf = $conf; $request->project = $project; if (true === IDF_Precondition::accessSource($request)) { if ($mode == 'readonly') { return array(Pluf::f('idf_plugin_syncgit_base_repositories', '/home/git/repositories'), $project->shortname); } if (true === IDF_Precondition::projectMemberOrOwner($request)) { return array(Pluf::f('idf_plugin_syncgit_base_repositories', '/home/git/repositories'), $project->shortname); } } return false; }