}
+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");\r
+ header_remove("Cache-Control");\r
+ header_remove("Set-Cookie");\r
+ header_remove("Expires");\r
+ header_remove("X-Powered-By");\r
+ header_remove("Vary");\r
+
$repo_base = gwvpmini_getConfigVal("repodir");
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") {
$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
//$write = true;
//}
- $perms = 5;
+ $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");
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;
- }
+ }*/
}
//sleep(2);
-
+ $userdets = gwvpmini_getUser($username);
// this is where the fun, it ends.
$myoutput = "";
$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";
$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 {
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
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\"");