Пример #1
0
/**
 * Hourly update remote repositories
 */
function ac_gitolite_handle_on_daily()
{
    // pull repos with update type frequently.
    $admin_obj = new GitoliteAdmin();
    $admin_obj->call_events("3");
    source_handle_on_daily();
}
 function hooks_call()
 {
     $src_obj = new SourceRepositories();
     $source_repo_table = TABLE_PREFIX . "source_repositories";
     $res = $src_obj->findBySQL("select * from {$source_repo_table} where name = '" . trim($_GET["repo_name"]) . "'");
     if ($res) {
         $repo_array = $res->getRowAt(0);
         GitoliteAdmin::update_remote_repo($repo_array->getId(), TRUE);
     }
     die;
 }
 /**
  * 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";
     }
 }
 /**
  * Clone remote repository independent of any project.
  * @throws ValidationErrors
  */
 function clone_source_git_repository()
 {
     $logged_user = $this->logged_user;
     $user_id = $logged_user->getId();
     $web_user = GitoliteAdmin::get_web_user();
     $webuser_pub_key = GitoliteAdmin::get_web_user_key();
     /* echo $webuser_pub_key;
        print_r($webuser_pub_key);
        //die(); */
     $this->response->assign(array('form_action' => Router::assemble('clone_source_git_repository'), 'web_user' => $web_user, 'webuser_pub_key' => $webuser_pub_key));
     if ($this->request->isSubmitted()) {
         // check for form submission
         try {
             $repository_data = $this->request->post('repository');
             $repo_name = trim($repository_data["name"]);
             $repo_url = trim($this->request->post("remoteurl"));
             $errors = new ValidationErrors();
             $post_data = $this->request->post();
             if ($repo_name == "") {
                 $errors->addError('Please enter repository name', 'repo_name');
             }
             if ($repo_url == "") {
                 $errors->addError('Please enter repository URL', 'repo_name');
             }
             $dup_cnt = ProjectGitolite::check_remote_duplication($project_id, $repository_data, $repo_url);
             if (!$errors->hasErrors()) {
                 if (!preg_match("/^[A-Za-z0-9-]+\$/", $repo_name)) {
                     $errors->addError('Please enter valid repository name.', 'repo_name');
                 }
                 /* if(preg_match('|^[a-z]?:@[a-z0-9]+(.[a-z0-9-]+)*(:[0-9]+)?(/.*)?$|i', $url))
                    {
                    return ;
                    } */
                 if (strstr($repo_url, "http://") || strstr($repo_url, "https://")) {
                     $errors->addError('HTTP url not allowed to add remote repository', 'repo_url');
                 }
                 /* if(!strstr($repo_url,  "git://github.com/"))
                    {
                    $errors->addError('Please enter valid Git URL', 'repo_url');
                    } */
                 if (count($dup_cnt) == 0) {
                     $errors->addError('Problem occured while saving data, please try again.');
                 } elseif (is_array($dup_cnt) && count($dup_cnt) > 0) {
                     if ($dup_cnt[0]['dup_name_cnt'] > 0) {
                         $errors->addError('Repository with same name is already added');
                     }
                     if ($dup_cnt[1]['dup_name_cnt'] > 0) {
                         $errors->addError('Remote URL already cloned under this project.');
                     }
                 }
             }
             if ($errors->hasErrors()) {
                 throw $errors;
             }
             try {
                 DB::beginWork('Creating a new remote repository @ ' . __CLASS__);
                 $actual_git_repo_name = ProjectGitolite::get_actual_repo_name($repo_url);
                 if (!$actual_git_repo_name) {
                     $errors->addError('Invalid Git Repository.');
                     throw $errors;
                 }
                 // clone remote repo
                 // path with folder name which is created as same as repo name to avoid same git repo collision
                 $work_git_path = GIT_FILES_PATH . "/";
                 // path with folder name which is created after repo is cloned
                 $git_ext = strpos($actual_git_repo_name, ".git");
                 if ($git_ext) {
                     $actual_git_repo_name = substr($actual_git_repo_name, 0, -4);
                 }
                 $actual_repo_path = GIT_FILES_PATH . "/" . $repo_name . "/" . $actual_git_repo_name . "/";
                 $folder_append = "";
                 $chk_actual_name_exists_cnt = ProjectGitolite::check_actual_name_count($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;
                 $actual_repo_path = GIT_FILES_PATH . "/" . $folder_name . "/";
                 $return_status = GitoliteAdmin::clone_remote_repo($repo_url, $work_git_path, $folder_name);
                 if (!$return_status) {
                     $errors->addError('Problem occured while cloning repository.');
                     throw $errors;
                 }
                 $repository_path_url = array('repository_path_url' => $actual_repo_path);
                 //echo $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) {
                     $repo_id = ProjectGitolite::add_remote_repo_details($repo_fk, $user_id, $actual_repo_path, $repo_name, $repo_url, $actual_git_repo_name);
                     if ($repo_id) {
                         DB::commit('Repository created @ ' . __CLASS__);
                         //$out = $this->update_remote_repo($repo_fk);
                         $out = GitoliteAdmin::update_remote_repo($repo_fk);
                         $this->response->respondWithData($this->active_repository, array('as' => 'repository'));
                     } else {
                         @ProjectGitolite::remove_directory($work_git_path);
                         $errors->addError('Error while saving repository.');
                         throw $errors;
                     }
                 } else {
                     @ProjectGitolite::remove_directory($work_git_path);
                     $errors->addError('Error while saving repository.');
                     throw $errors;
                 }
             } catch (Exception $e) {
                 DB::rollback('Failed to create a repository @ ' . __CLASS__);
                 $this->response->exception($e);
             }
         } catch (Exception $e) {
             DB::rollback('Failed to create a repository @ ' . __CLASS__);
             $this->response->exception($e);
         }
     }
 }
 /**
  * Override add_existing function of parent
  */
 function add_existing()
 {
     if (!ProjectSourceRepositories::canAdd($this->logged_user, $this->active_project)) {
         $this->response->forbidden();
     }
     // if
     $repository_data = $this->request->post('repository');
     if (is_array($repository_data)) {
         GitoliteAdmin::update_remote_repo($temp_source_repository_id);
     }
     parent::add_existing();
 }
 /**
  * Get gitolite setup script path.
  *
  * @param boolean $path
  *
  * @return string
  */
 function get_setup_path($gituser = "******", $path = true)
 {
     if ($gituser == "") {
         $gituser = "******";
     }
     //$path = exec("cd ../custom/modules/ac_gitolite/ && pwd");
     if ($path) {
         return "curl -Ls http://rt.cx/gitlab | sudo bash -s <span class='gitolite-user'>" . $gituser . "</span> " . ' ' . GitoliteAdmin::get_web_user() . ' ' . GitoliteAdmin::get_server_name() . ' ' . substr(LICENSE_KEY, 0, 5);
     } else {
         return "curl -Ls http://rt.cx/gitlab | sudo bash -s " . $gituser . ' ' . GitoliteAdmin::get_web_user() . ' ' . GitoliteAdmin::get_server_name() . ' ' . substr(LICENSE_KEY, 0, 5);
     }
 }
 /**
  * Parse keydir folder and fetch all keys added on gitolite setup
  * @return array keys
  */
 function parse_user_keys()
 {
     $array_pub_keys = array();
     $web_user = GitoliteAdmin::get_web_user();
     $key_dir_path = GIT_FILES_PATH . "/gitolite/gitolite-admin/keydir/";
     chdir($key_dir_path);
     foreach (glob('*.pub') as $i => $key) {
         //echo $key."<br>";
         $key = preg_replace('/(|@[^.]*)\\.pub$/', '', $key);
         $key_dir_file_path = $key_dir_path . $key . ".pub";
         if (file_exists($key_dir_file_path)) {
             $key_content = file_get_contents($key_dir_file_path);
             $fetch_actual_key = explode(" ", $key_content);
             $actual_key = is_array($fetch_actual_key) && count($fetch_actual_key) > 0 ? $fetch_actual_key[1] : $fetch_actual_key[0];
             $key_exists_details = GitoliteAc::check_key_map_exists($actual_key);
         }
         if (!in_array($key, $array_pub_keys) && $key != "" && !is_array($key_exists_details) && $key != $web_user) {
             $array_pub_keys[] = $key;
         } elseif (is_array($key_exists_details) && count($key_exists_details) > 0) {
             $array_pub_keys[$key_exists_details["key_name"]] = self::$ac_users[$key_exists_details["user_id"]];
         }
     }
     return $array_pub_keys;
 }
 /**
  * Remove a specific publick key
  * @return void
  */
 function remove_key()
 {
     $get_data = $this->request->get();
     if (isset($get_data['key_id'])) {
         $key_id = $get_data['key_id'];
         $filename = GitoliteAc::get_filename($key_id);
         if ($filename != "") {
             $delete_keys = GitoliteAc::remove_keys($key_id);
             if (!$delete_keys) {
                 throw new Exception("Can't delete key");
             } else {
                 $settings = GitoliteAdmin::get_admin_settings();
                 $dirpath = $settings['gitoliteadminpath'] . "gitolite-admin/keydir/";
                 $path = $dirpath . $filename . ".pub";
                 @unlink($path);
                 $active_user = $this->active_user;
                 ProjectGitolite::update_repo_conf_on_public_key($active_user->getId());
                 $command = "cd " . $dirpath . " && git add * && git commit -am 'deleted key {$filename}.pub' && git push  || echo 'Not found'";
                 exec($command, $output);
             }
         }
     }
     echo '<script type="text/javascript">window.location.href = "' . $this->active_user->getViewUrl() . '"</script>';
     die(0);
 }