Example #1
0
 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();
     }
 }
Example #2
0
 /**
  * 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.");
         }
         /**/
     }
 }