diff options
author | Silvio Rhatto <rhatto@riseup.net> | 2017-09-16 18:57:16 -0300 |
---|---|---|
committer | Silvio Rhatto <rhatto@riseup.net> | 2017-09-16 18:57:16 -0300 |
commit | f353440268647fc4d600ac71f0706cc9e54c2168 (patch) | |
tree | a198d27aaa08698dbee369866a4a4221393adaa2 | |
parent | 7d889c0767d44d070628ad708ed640f1f8d9a7ce (diff) | |
download | utils-git-f353440268647fc4d600ac71f0706cc9e54c2168.tar.gz utils-git-f353440268647fc4d600ac71f0706cc9e54c2168.tar.bz2 |
Adds hit, the git interceptor
-rwxr-xr-x | commit | 17 | ||||
-rwxr-xr-x | commit-updates | 5 | ||||
l--------- | git | 1 | ||||
-rwxr-xr-x | hit | 56 |
4 files changed, 71 insertions, 8 deletions
@@ -6,6 +6,9 @@ # Parameters ARGS="$*" +# Git application we use +GIT="hit" + # Check if a file is inside a git repository # Usage: git_folder <file> function git_folder { @@ -51,7 +54,7 @@ function is_git { elif [ -d "$1/.git" ]; then return else - ( cd "$1" && git status &> /dev/null ) + ( cd "$1" && $GIT status &> /dev/null ) if [ "$?" != "128" ]; then return @@ -77,12 +80,12 @@ function is_svn { function git_push { if [ "`git remote | wc -l`" == "0" ]; then return - elif git remote | grep -q 'all'; then - git push all --all + elif $GIT remote | grep -q 'all'; then + $GIT push all --all #elif git remote | grep -q 'origin'; then # echo "Please configure the 'all' remote first." # exit 1 - # #git push --all + # #$GIT push --all fi } @@ -130,13 +133,13 @@ function git_commit { # If there are no staged files, commit everything. # Otherwise commit just what was staged - if git status --short | grep -q "^[AM]"; then + if $GIT status --short | grep -q "^[AM]"; then flag="" else flag="-a" fi - git commit $flag -m "$params" + $GIT commit $flag -m "$params" } # Main @@ -150,6 +153,6 @@ if [ ! -z "$1" ]; then git_user git_commit $* git_push - git fetch --all + $GIT fetch --all fi fi diff --git a/commit-updates b/commit-updates index 93faf12..2a71c1d 100755 --- a/commit-updates +++ b/commit-updates @@ -6,6 +6,9 @@ # Parameters PROJECT="$1" +# Git application we use +GIT="hit" + # Check if param is a project if [ ! -z "$PROJECT" ] && [ -z "$2" ] && ( cd $PROJECT &> /dev/null ); then if ! git status &> /dev/null; then @@ -21,7 +24,7 @@ fi ARGS="$*" # Simply update commit -if git status &> /dev/null; then +if $GIT status &> /dev/null; then if [ ! -z "$ARGS" ]; then commit "Updates $ARGS" else @@ -0,0 +1 @@ +hit
\ No newline at end of file @@ -0,0 +1,56 @@ +#!/bin/bash +# +# hit: the git interceptor +# +# Main features: +# +# * Disables/mitigates hooks by changing permission and ownership on `~/.git/hooks`. +# +# Other features to consider: +# +# * Checks proper user/email config. +# * Automatically sets git-flow when initializing a repository. +# * Automatically sets git-hooks integration. +# * Implements global hooks. +# * Checks remote configuration. +# * Checks hook tampering before doing anything in the repository, like removing hook permissions + +# Parameters +BASENAME="`basename $0`" + +# Ensure we run a system-wide git installation and not any other script or alias +GIT="/usr/bin/git" + +# Check for firejail +if which firejail &> /dev/null; then + GIT="firejail $GIT" +fi + +# +# Disable git hooks +# +# A malicious software that is being tested might put arbitrary scripts as git hooks. +# This can be an attack vector if you're testing the software inside a virtual machine but is +# handling git commands from the host machine (like when running vagrant). +# +# By disabling any hooks from being execute we mitigate a possible attack vector. +# +# References: +# +# https://stackoverflow.com/questions/35997624/how-to-disable-git-hooks-for-security-reason +# https://www.mehmetince.net/one-git-command-may-cause-you-hacked-cve-2014-9390-exploitation-for-shell/ +if [ -d ".git/hooks" ]; then + # Remove all exec permissions + chmod -x .git/hooks/* + + # Rename all non-default hook files + for file in `ls -1 .git/hooks/ | grep -v '.sample$'`; do + echo "hit: renaming .git/hook/$file to .git/hook/$file.sample" + mv .git/hooks/$file .git/hooks/$file.sample + done +fi + +# +# Call git +# +$GIT $* |