Updating readme with install instructions
[gwvp-mini.git] / gwvpmini / gwvpmini_gitbackend.php
index 19f695f..a184213 100644 (file)
@@ -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");\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");
        
@@ -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\"");