X-Git-Url: http://git.pjr.cc/?a=blobdiff_plain;f=gwvpmini%2Fgwvpmini_gitbackend.php;h=a18421337f181c51cb4316246394d144f4883157;hb=26a8a9033c1f6f3f801fd2be4b82134df1258dc1;hp=19f695fdba3ec410e4a548ab9baf1e4ba947a8e6;hpb=d76aa228c79718838a8874fc10a21163e31b732e;p=gwvp-mini.git diff --git a/gwvpmini/gwvpmini_gitbackend.php b/gwvpmini/gwvpmini_gitbackend.php index 19f695f..a184213 100644 --- a/gwvpmini/gwvpmini_gitbackend.php +++ b/gwvpmini/gwvpmini_gitbackend.php @@ -26,10 +26,50 @@ function gwvpmini_gitControlCallMe() } +function gwvpmini_CreateRepoHooks($repopath, $cmdpath) +{ + $fp = fopen("$repopath/hooks/pre-receive", "w"); + + if(!$fp) error_log("could not create pre-receive hook"); + + // TODO: think about this one + $script = '#!/bin/bash'."\n\n".'DCOMMIT=`cat`'."\n".'START=`echo $DCOMMIT|cut -d " " -f 1`'."\n".'END=`echo $DCOMMIT|cut -d " " -f 2`'."\n".'REF=`echo $DCOMMIT|cut -d " " -f 3`'."\n\n"; + $script .= "php $cmdpath pre-receive "; + $script .= '$START $END $REF'."\n\n"; + fwrite($fp, $script); + + fclose($fp); + + chmod("$repopath/hooks/pre-receive", 0755); + + + $fp = fopen("$repopath/hooks/update", "w"); + + if(!$fp) error_log("could not create update hook"); + + // TODO: think about this one + $script = "#!/bin/bash\n\n"; + $script .= "php $cmdpath update "; + $script .= '$1 $2 $3'."\n\n"; + fwrite($fp, $script); + + fclose($fp); + + chmod("$repopath/hooks/update", 0755); +} + function gwvpmini_gitBackendInterface() { // and this is where i re-code the git backend interface from scratch - global $BASE_URL; + global $BASE_URL, $cmd_line_tool; + + header_remove("Pragma"); + header_remove("Cache-Control"); + header_remove("Set-Cookie"); + header_remove("Expires"); + header_remove("X-Powered-By"); + header_remove("Vary"); + $repo_base = gwvpmini_getConfigVal("repodir"); @@ -71,9 +111,16 @@ function gwvpmini_gitBackendInterface() chdir("$repo_base/$repo.git"); exec("/usr/bin/git update-server-info"); + if(!file_exists("$repo_base/$repo.git/hooks/pre-receive") || !file_exists("$repo_base/$repo.git/hooks/update")) { + error_log("WRITING HOOKS"); + gwvpmini_CreateRepoHooks("$repo_base/$repo.git", $cmd_line_tool); + } + // so now we have the repo // next we determine if this is a read or a write + + // TODO: WE NEED TO FIX THIS, IT DOESNT ALWAYS DETECT a "WRITE" $write = false; if(isset($_REQUEST["service"])) { if($_REQUEST["service"] == "git-receive-pack") { @@ -81,9 +128,6 @@ function gwvpmini_gitBackendInterface() $write = true; } } - if($_SERVER["REQUEST_METHOD"] == "POST") { - $write = true; - } //$write = true; // THIS MAY CAUSE ISSUES LATER ON but we do it cause the git client ignores our 403 when it uses git-receive-pack after an auth @@ -92,42 +136,64 @@ function gwvpmini_gitBackendInterface() //$write = true; //} - $perms = 5; - $write = true; + $person = gwvpmini_checkBasicAuthLogin(); + //$write = true; + // next, figure out permissions for repo + $rid = gwvpmini_GetRepoId($repo); + $uid = -1; + error_log("AT THIS POINT WE HAVE $uid, $rid, $repo $person"); - // if its a write, we push for authentication - if($write) { - error_log("is write attempt, ask for login"); - $person = gwvpmini_checkBasicAuthLogin(); - if($person == false) { - error_log("person is false, push auth"); + if(!$person) { + if($write) { + error_log("ASK FOR BASIC AUTH"); gwvpmini_AskForBasicAuth(); - echo "Login"; return; } else { - error_log("checking perms for $person against $repoid for repo $repo"); - // here we pass to the git backend - error_log("perms are $perms and im allowed"); - gwvpmini_callGitBackend($person["username"], $repo); + $perm = gwvpmini_GetRepoPerm($rid, "a"); + if($perm < 1) { + error_log("ASK FOR BASIC AUTH 2"); + gwvpmini_AskForBasicAuth(); + return; + } + } + } else { + $uid = gwvpmini_GetUserId($person); + $perm = gwvpmini_GetRepoPerm($rid, $uid); + if($write) { + if($perm < 2) { + error_log("SEND FOFF"); + gwvpmini_fourZeroThree(); + return; + } + } else { + if($perm < 1) { + gwvpmini_fourZeroThree(); + return; + } } - return; } + // if its a write, we push for authentication - // if they're less then read, we need to then check the user auth permissions - if($perms < 2) { - // we ask for auth - $person = gwvpmini_checkBasicAuthLogin(); - if($person == false) { - gwvpmini_AskForBasicAuth(); - return; - } else { - } + //if($write) { + if(!$person) { + $person = "anonymous"; } + // if its a write, we check (before and after) the branch/tag info to see if they were updated + //if($write) { + //} + + gwvpmini_callGitBackend($person, $repo); + + //if($write) { + //} + return; + //} + // if we made it this far, we a read and we have permissions to do so, just search the file from the repo - if(file_exists("$repo_base/$repo.git/$newloc")) { + /*if(file_exists("$repo_base/$repo.git/$newloc")) { error_log("would ask $repo for $repo.git/$newloc from $repo_base/$repo.git/$newloc"); $fh = fopen("$repo_base/$repo.git/$newloc", "rb"); @@ -136,10 +202,10 @@ function gwvpmini_gitBackendInterface() echo fread($fh, 8192); } } else { - //echo "would ask $repo,$actual_repo_name for $repo/$newloc from $repo_base/$repo/$newloc, NE"; + error_log("would ask $repo for $repo/$newloc from $repo_base/$repo/$newloc, NE"); gwvpmini_fourZeroFour(); return; - } + }*/ } @@ -181,7 +247,7 @@ function gwvpmini_callGitBackend($username, $repo) //sleep(2); - + $userdets = gwvpmini_getUser($username); // this is where the fun, it ends. $myoutput = ""; @@ -194,6 +260,8 @@ function gwvpmini_callGitBackend($username, $repo) $procenv["GATEWAY_INTERFACE"] = "CGI/1.1"; $procenv["PATH_TRANSLATED"] = "/$repo_base/$repo.git/$euri"; $procenv["REQUEST_METHOD"] = "$rmeth"; + $procenv["GIT_COMMITTER_NAME"] = $userdets["fullname"]; + $procenv["GIT_COMMITTER_EMAIL"] = $userdets["email"]; $procenv["GIT_HTTP_EXPORT_ALL"] = "1"; $procenv["QUERY_STRING"] = "$qs"; $procenv["HTTP_USER_AGENT"] = "git/1.7.1"; @@ -201,6 +269,8 @@ function gwvpmini_callGitBackend($username, $repo) $procenv["REMOTE_ADDR"] = $_SERVER["REMOTE_ADDR"]; $procenv["AUTH_TYPE"] = "Basic"; + //error_log("PROCENV: ".print_r($procenv,true)); + if(isset($_SERVER["CONTENT_TYPE"])) { $procenv["CONTENT_TYPE"] = $_SERVER["CONTENT_TYPE"]; } else { @@ -247,18 +317,25 @@ function gwvpmini_callGitBackend($username, $repo) error_log("cant set pipe1 non-blocking"); } + + $stlimit = 0; + $fp = fopen("/tmp/gitup.".rand(0,4000000), "w"); // i was going to use stream_select, but i feel this works better like this while($continue) { // do client if(!feof($fh)) { $from_client_data = fread($fh,8192); - if($from_client_data !== false) fwrite($pipes[0], $from_client_data); + if($from_client_data !== false) { + fwrite($pipes[0], $from_client_data); + fwrite($fp, $from_client_data); + } fflush($pipes[0]); //fwrite($fl, $from_client_data); $client_len = strlen($from_client_data); } else { error_log("client end"); $client_len = 0; + //$continue = false; } // do cgi @@ -301,7 +378,10 @@ function gwvpmini_callGitBackend($username, $repo) if($client_len == 0 && $cgi_len == 0) { usleep(200000); error_log("sleep tick"); + $stlimit++; + if($stlimit > 2) $continue = false; } else { + $stlimit = 0; error_log("sizes: $client_len, $cgi_len"); if($cgi_len > 0) { error_log("from cgi: \"$from_cgi_data\"");