jw-pkg/scripts/git-srv-admin.sh
Jan Lindemann d504aa21cd git-srv-admin.sh: Only allow manipulating own repos
Disallow attempts to manipulate other user's repositories.

Signed-off-by: Jan Lindemann <jan@janware.com>
2016-11-26 12:18:37 +00:00

166 lines
2.5 KiB
Bash

#!/bin/sh
myname=`basename $0`
usage()
{
cat << EOT | sed 's/^ |//'
|
| $myname [global options] cmd [cmd-arguments] ...
|
| global options are:
|
| -j : project is a jannet-project (default is a private project)
|
| commands are:
|
| create-personal-project name
| list-personal-projects
|
EOT
[ "$1" ] && exit $1
}
log()
{
echo $@
}
err()
{
echo $@ >&2
}
fatal()
{
err $@
exit 1
}
md()
{
local dir=$1
local mode=$2
local owner=$3
local group=$4
[ -d $dir ] || {
log "creating $dir as $owner.$group with mode $mode"
/usr/bin/install -m $mode -o $owner -g $group -d $dir || {
fatal "failed to create directory $dir"
}
}
}
check_user_is_self()
{
[ "$id" != "$user" ] && fatal "User $id is not allowed to do this to user $user's repositories."
}
# ----------------- commands
md_p()
{
if [ -d "$1" ]; then
return
fi
md_p `dirname $1` $2 $3 $4
md $@
}
create_project_dir()
{
if [ "$UID" != 0 ]; then
fatal "tried to create directory \"$dir\" as `whoami`, needs to be done as root"
fi
md_p /srv/git 750 root cvs
md_p /srv/git/$id 750 root cvs
md_p `dirname $dir` 750 $id jannet
md_p $dir 02750 $id `id -g $id`
}
create_personal_project()
{
[ -e $dir ] && {
err "$dir already exists"
test $no_error_if_exists -eq 0
exit $?
}
/usr/bin/sudo `readlink -f $0` create-project-dir $dir || fatal "failed to create [$dir] as root"
cd $dir || fatal "failed to change to $dir"
git init --bare --shared=0640 || fatal "git init failed"
}
list_personal_projects()
{
cd $pdir || return 1
ls */HEAD | sed 's%/HEAD%%' 2>/dev/null
return $?
}
# ----------------- here we go
no_error_if_exists=0
jannet_project=0
id=`whoami`
#user=$id
OPTIND=1
while getopts jhu: flag; do
case $flag in
h)
usage 0;;
u)
user=$OPTARG
;;
j)
jannet_project=1;;
p)
no_error_if_exist=1;;
*)
usage 1;;
esac
done
shift $(($OPTIND - 1))
if [ "$user" ]; then
id=$user
else
if [ "$SUDO_UID" ]; then
id=`/opt/ytools/bin/getpwuid $SUDO_UID | sed '/^name *=/ !d; s/^name *= *//'`
[ "$id" ] || fatal "failed to find uid $SUDO_UID in user database"
fi
user=$id
fi
git_home=/srv/git/$id
pdir=$git_home/priv
[ "$jannet_project" = 1 ] && pdir=$git_home/proj
cmd=$1
shift
p=$1
dir=$pdir/$p
case $cmd in
create-personal-project)
check_user_is_self
create_personal_project "$@"
;;
list-personal-projects)
list_personal_projects "$@"
;;
create-project-dir)
dir=$1 # this is all a horrible variable and usage mess
check_user_is_self
create_project_dir "$@"
;;
*)
usage 1
;;
esac