public function store() { $input = Input::all(); $company = User::find(Auth::id())->company; $project = new Project(); $project->project_name = $input['project_name']; $project->cost_center = $input['cost_center']; $project->company_id = $company->id; $rules = array('cost_center' => 'unique:projects||required', 'project_name' => 'required'); $validation = Validator::make($input, $rules); if ($validation->passes()) { $project->save(); $project->users()->attach(Auth::user()->id); $user = User::find(Auth::id()); $user->project_id = $project->id; $user->save(); return Redirect::action('ProjectController@index'); } else { return Redirect::to('projectCreate')->withErrors($validation)->withInput(); } }
/** * Remove a user from a project * * @param Project $project * @param User $user */ public function unassign($project, $user) { $project->users()->detach($user); return Redirect::to('/admin/project/' . $project->id . '/edit')->with('info', 'The user has been removed from the project.'); }
/** * render_conf_file * Write repository and access levels in conf file * * @return boolean|string */ function render_conf_file() { $settings = GitoliteAdmin::get_admin_settings(); $conf_path = $settings['gitoliteadminpath'] . "/gitolite-admin/conf/gitolite.conf"; $webuser = exec("whoami"); $conf_file = $conf_path; // create access array $access_array = array(GITOLITE_READACCESS => 'R', GITOLITE_MANAGEACCESS => 'RW+'); $fh = fopen($conf_file, 'w'); if (file_exists($conf_path) && $fh) { $repo_table_name = TABLE_PREFIX . 'rt_gitolite_repomaster'; $access_table_name = TABLE_PREFIX . 'rt_gitolite_access_master'; $public_key_table_name = TABLE_PREFIX . 'rt_gitolite_user_public_keys'; $source_table_name = TABLE_PREFIX . 'source_repositories'; $admin_settings_table_name = TABLE_PREFIX . 'rt_config_settings'; /** Defalut access to gitolite admin * */ $get_git_admins = DB::execute("SELECT * FROM " . $admin_settings_table_name); fwrite($fh, "repo " . "@all" . "\n"); fwrite($fh, "RW+" . "\t" . "=" . "\t" . $webuser . "\n"); fwrite($fh, "repo " . "gitolite-admin" . "\n"); fwrite($fh, "RW+" . "\t" . "=" . "\t" . $webuser . "\n"); if ($get_git_admins) { $admins_rec = $get_git_admins[0]; if (is_array($admins_rec)) { $admins = @unserialize($admins_rec['gitoliteadmins']); if ($admins !== false || $admins === 'b:0;') { $admins_array = $admins; } else { $admins_array = array(); } if (is_foreachable($admins_array)) { foreach ($admins_array as $keyadmin => $valadmin) { $pubkeys = DB::execute("SELECT * FROM " . $public_key_table_name . " where user_id = '" . $valadmin . "' and is_deleted = '0'"); if ($pubkeys) { foreach ($pubkeys as $rowkeys) { if ($rowkeys['pub_file_name'] != "") { fwrite($fh, $access_array[GITOLITE_MANAGEACCESS] . "\t" . "=" . "\t" . $rowkeys['pub_file_name'] . "\n"); } } } } } } } $sql = "SELECT a.* ,b.id FROM " . $repo_table_name . " a JOIN " . $source_table_name . " b ON a.repo_fk = b.id where gitolite_config is null limit 1"; $result_gitconfig_empty = DB::execute($sql); $file_name = "/tmp/gitolite_" . microtime(); $file_name = str_replace(" ", "-", $file_name); $file_name = str_replace(".", "_", $file_name); $mysqlACLFlag = true; if (!$result_gitconfig_empty) { $sql = "SELECT CONCAT('repo ', repo_name),gitolite_config INTO OUTFILE '{$file_name}'\n FIELDS ESCAPED BY '' TERMINATED BY '\n' OPTIONALLY ENCLOSED BY ''\n LINES TERMINATED BY '\n' \n FROM {$repo_table_name} "; try { $result = DB::execute($sql); } catch (Exception $e) { $mysqlACLFlag = false; } if ($mysqlACLFlag && file_exists($file_name)) { $conf_content = file_get_contents($file_name); fwrite($fh, $conf_content); fclose($fh); @unlink($file_name); return true; } else { $sql = "SELECT CONCAT('repo ', repo_name) as 'repo_name',gitolite_config FROM {$repo_table_name}"; $result = DB::execute($sql); if ($result) { foreach ($result as $row) { $conf_content = "\n" . $row['repo_name'] . "\n" . $row['gitolite_config']; fwrite($fh, $conf_content); } } fclose($fh); return true; } } $result = DB::execute("SELECT a.* ,b.id FROM " . $repo_table_name . " a JOIN " . $source_table_name . " b ON a.repo_fk = b.id"); try { if ($result) { //fetch all gitolite repositories foreach ($result as $row) { $prjobj = new Project($row['project_id']); // get project users $prjusers = $prjobj->users()->getIdNameMap(); // get permissions $permissions = DB::execute("SELECT * FROM " . $access_table_name . " where repo_id = '" . $row['repo_id'] . "'"); if ($permissions) { // get repository permissions $perm_row = $permissions["0"]; $permissions = @unserialize($perm_row['permissions']); if ($permissions !== false || $permissions === 'b:0;') { $permissions_array = $permissions; } else { $permissions_array = array(); } } else { $permissions_array = array(); } // write repository name in conf file fwrite($fh, "repo " . $row['repo_name'] . "\n"); $str_repo_conf = ""; if (is_foreachable($prjusers)) { foreach ($prjusers as $keyusers => $valueusers) { $pubkeys = DB::execute("SELECT * FROM " . $public_key_table_name . " where user_id = '" . $keyusers . "' and is_deleted = '0'"); if (is_array($pubkeys)) { foreach ($pubkeys as $rowkeys) { $access = isset($access_array[$permissions_array[$keyusers]]) ? $access_array[$permissions_array[$keyusers]] : ""; if ($access != "" && $rowkeys['pub_file_name'] != "") { fwrite($fh, $access . "\t" . "=" . "\t" . $rowkeys['pub_file_name'] . "\n"); $str_repo_conf .= "\t" . $access . "\t" . "=" . "\t" . $rowkeys['pub_file_name'] . "\n"; } } // while } // if public keys added } // foreach } // if project user exists $sql = "update " . $repo_table_name . " set gitolite_config='" . $str_repo_conf . "' where repo_id =" . $row['repo_id']; DB::execute($sql); } // while } // repo exists } catch (Exception $e) { echo $e; } return true; } else { return "can't write file"; } }
/** * Map conf Repositories with activecollab projects * @return string message */ function map_conf_repos() { $repo_array = array(); if (count($repo_array) == 0) { $conf_file_path = GIT_FILES_PATH . "/gitolite/gitolite-admin/conf/gitolite.conf"; if (file_exists($conf_file_path)) { $conf_file_contents = file($conf_file_path); foreach ($conf_file_contents as $key => $value) { if (preg_match('/^repo\\s+(.+)/', $value, $matches) && !preg_match('/^repo\\s+(gitolite-admin)/', $value) && !preg_match('/^repo\\s+(@all)/', $value)) { $repo_name = trim($matches[1]); if (!array_key_exists($repo_name, $conf_parsed)) { $repo_array[$repo_name] = array(); } } elseif (preg_match('/(.*)=\\s(.*)/', $value, $matches)) { $pub_key = trim($matches[2]); $pub_key_access = trim($matches[1]); $repo_array[$repo_name][] = array("key_name" => $pub_key, "pub_key_access" => $pub_key_access); } } } } if (isset($_GET["prj_name"])) { $prj_id = $_GET["prj_name"]; $repo_name = $_GET["repo_name"]; $user_id = $this->logged_user->getId(); $project_obj = new Project($prj_id); $users_details = $project_obj->users()->describe($this->logged_user, true, true, STATE_VISIBLE); $users_array = array(); if (is_foreachable($users_details)) { foreach ($users_details as $key => $value) { $users_array[] = $value['user']['id']; } } $access_array = array(); try { DB::beginWork('Mapping Repositories @ ' . __CLASS__); $selected_prj = new Project($prj_id); $repository_data = array('name' => $repo_name, 'update_type' => 1, 'visibility' => 0); $settings = GitoliteAdmin::get_admin_settings(); $clone_url = $settings['gitoliteuser'] . "@" . $settings['gitoliteserveradd'] . ":" . $repo_name; $dup_cnt = ProjectGitolite::check_remote_duplication($prj_id, $repository_data, $clone_url); if ($dup_cnt[1]['dup_name_cnt'] > 0) { die('Remote URL already cloned under this project.'); } /** * Create access data * */ /* define('GITOLITE_NOACCESS', '1'); define('GITOLITE_READACCESS', '2'); define('GITOLITE_MANAGEACCESS', '3'); */ if (is_array($repo_array) && count($repo_array) > 0) { if (array_key_exists($repo_name, $repo_array)) { if (is_foreachable($repo_array[$repo_name])) { foreach ($repo_array[$repo_name] as $key => $value) { //echo $value["key_name"]."====".$value["pub_key_access"]; $key_details = GitoliteAc::get_key_details($value["key_name"]); if (is_array($key_details) && in_array($key_details["user_id"], $users_array)) { $access_array[$key_details["user_id"]] = $value["pub_key_access"] == "RW+" ? 3 : 2; } } } } } /** * Add rrepositories */ $actual_git_repo_name = $repo_name; $chk_actual_name_exists_cnt = ProjectGitolite::check_actual_name_count_gitolite($actual_git_repo_name); if (is_array($chk_actual_name_exists_cnt) && isset($chk_actual_name_exists_cnt["actual_name_cnt"])) { $cnt = $chk_actual_name_exists_cnt["actual_name_cnt"] > 0 ? $chk_actual_name_exists_cnt["actual_name_cnt"] + 1 : ""; $folder_append = $cnt != "" ? "-{$cnt}" : ""; } else { $folder_append = "-1"; } // if git repsitory name is same , we need to change the folder name while cloning the repository $folder_name = $actual_git_repo_name . $folder_append; $work_git_path = GIT_FILES_PATH . "/" . $folder_name . "/"; $repository_path_url = array('repository_path_url' => $work_git_path); $repository_data = array_merge($repository_data, $repository_path_url); $this->active_repository = new GitRepository(); $this->active_repository->setAttributes($repository_data); $this->active_repository->setCreatedBy($this->logged_user); $this->active_repository->save(); $repo_fk = $this->active_repository->getId(); if ($repo_fk) { $clone_url = $settings['gitoliteuser'] . "@" . $settings['gitoliteserveradd'] . ":" . $repo_name; $body = $clone_url; $prj_obj = new ProjectSourceRepository(); $prj_obj->setName($this->active_repository->getName()); $prj_obj->setBody($body); $prj_obj->setVisibility($repository_data['visibility']); $prj_obj->setProjectId($prj_id); $prj_obj->setCreatedBy($this->logged_user); $prj_obj->setType("ProjectSourceRepository"); $prj_obj->setModule("source"); $prj_obj->setState(STATE_VISIBLE); $prj_obj->setParentId($this->active_repository->getId()); $prj_obj->save(); $repo_id = ProjectGitolite::add_repo_details($repo_fk, $prj_id, $user_id, $work_git_path, $repository_data, $clone_url); if ($repo_id) { $add_access = ProjectGitolite::add_access_levels($repo_id, serialize($access_array), $user_id, 1); if ($add_access) { DB::commit('Repository mapped @ ' . __CLASS__); $git_server = $settings['git_clone_url']; chdir(GIT_FILES_PATH); //cd ".GIT_FILES_PATH." && $command = "git clone " . $git_server . $repo_name . " {$folder_name}"; //$command = "git clone ".$git_server.":".$repo_name; exec($command, $output, $return_var); $out = GitoliteAdmin::update_remote_repo($repo_fk); ini_set('max_execution_time', 500); $pull_all_branches = ProjectGitolite::pull_branches($actual_repo_path); if (!$pull_all_branches) { @ProjectGitolite::remove_directory($work_git_path); die("Error while saving branches."); throw $errors; } die("ok"); } else { DB::rollback('Failed to map repository @ ' . __CLASS__); echo "Error while saving access levels."; } } else { DB::rollback('Failed to map repository @ ' . __CLASS__); echo "Error while saving repository"; } } } catch (Exception $e) { DB::rollback('Mapping repositories @ ' . __CLASS__); die("Cannot map repository, try again."); } /**/ } }