X-Git-Url: http://git.pjr.cc/?p=gwvp.git;a=blobdiff_plain;f=gwvplib%2Fgwvpgitcontrol.php;h=a949fabdcab66683148c3e95df679eb47b6eec20;hp=b5c7c490561c2fdbb34dea5813a2468bc268b3b5;hb=c7bb18886251e5187afbdb8d2101e200eb895ab6;hpb=eafd2fd6a4a6a3f5866780e0b9e07e1b83ea6be7 diff --git a/gwvplib/gwvpgitcontrol.php b/gwvplib/gwvpgitcontrol.php index b5c7c49..a949fab 100644 --- a/gwvplib/gwvpgitcontrol.php +++ b/gwvplib/gwvpgitcontrol.php @@ -22,8 +22,49 @@ function gwvp_gitControlCallMe() } +function gwvp_repoPermissionCheck() +{ + return true; +} + function gwvp_gitBackendInterface() { + global $repo_base, $BASE_URL; + + $repo = ""; + $newloc = "/"; + if(isset($_REQUEST["q"])) { + $query = $_REQUEST["q"]; + $qspl = explode("/", $query); + $repo = $qspl[1]; + for($i=2; $i < count($qspl); $i++) { + $newloc .= "/".$qspl[$i]; + } + } + + $actual_repo_name = preg_replace("/\.git$/", "", $repo); + + $user = gwvp_checkBasicAuthLogin(); + + if(!$user) { + error_log("User is set to false, so its anonymouse"); + } else { + error_log("user is $user"); + } + + // must remember that $user of false is anonymous when we code gwvp_repoPerm'sCheck() + if(!gwvp_repoPermissionCheck($actual_repo_name, $user)) { + error_log("perms check fails - start auth"); + if(isset($_SERVER["PHP_AUTH_USER"])) { + error_log("have auth - push 403"); + gwvp_fourZeroThree(); + } else { + error_log("push auth"); + gwvp_AskForBasicAuth(); + return; + } + } + // we need to quite a bit of parsing in here. The "repo" will always be /git/repo.git // but if we get here from a browser, we need to forward back to a normal repo viewer // the only way i can think of doing this is to check the useragent for the word "git" @@ -40,25 +81,44 @@ function gwvp_gitBackendInterface() */ $agent = "git-unknown"; $isgitagent = false; + + // tested the user agent bit with jgit from eclipse and normal git... seems to work if(isset($_SERVER["HTTP_USER_AGENT"])) { $agent = $_SERVER["HTTP_USER_AGENT"]; - error_log("in git backend with user agent"); + error_log("in git backend with user agent $agent"); if(stristr($agent, "git")!==false) { $isgitagent = true; } } - $repo = ""; - if(isset($_REQUEST["q"])) { - $query = $_REQUEST["q"]; - $qspl = explode("/", $query); - $repo = $qspl[1]; - } + + /* dont need this code right now if($isgitagent) echo "GIT: i am a git backened interface for a repo $repo, agent $agent"; else echo "NOT GIT: i am a git backened interface for a repo $repo, agent $agent"; + */ + + // now we need to rebuild the actual request or do we? + //$basegit = "$BASE_URL/git/something.git"; + //$newloc = preg_replace("/^$basegit/", "", $_SERVER["REQUEST_URI"]); + + if(file_exists("$repo_base/$repo/$newloc")) { + error_log("would ask $repo,$actual_repo_name for $repo/$newloc from $repo_base/$repo/$newloc"); + $fh = fopen("$repo_base/$repo/$newloc", "rb"); + + error_log("pushing file"); + while(!feof($fh)) { + echo fread($fh, 8192); + } + } else { + echo "would ask $repo,$actual_repo_name for $repo/$newloc from $repo_base/$repo/$newloc, NE"; + header('HTTP/1.0 404 No Such Thing'); + return; + } } + + function gwvp_repoExists($name) { global $repo_base;