| [304] | 1 | #!/bin/sh |
|---|
| 2 | |
|---|
| 3 | set -e |
|---|
| 4 | |
|---|
| 5 | # Ceci créé un hack php pour chacun des domaines hébergés par alternc |
|---|
| 6 | # ce hack consiste à restreindre chaque usager à son propre répertoire |
|---|
| 7 | # dans alternc/html/u/user avec open_base_dir |
|---|
| 8 | |
|---|
| 9 | # ce script a les dépendances suivantes: |
|---|
| 10 | # (mysql, /etc/alternc/local.sh) OR /usr/bin/get_account_by_domain dans |
|---|
| 11 | # alternc-admintools |
|---|
| 12 | # cut, awk, sort |
|---|
| 13 | |
|---|
| [378] | 14 | override_d=/var/alternc/apacheconf/ |
|---|
| 15 | override_f=${override_d}override_php.conf |
|---|
| [304] | 16 | |
|---|
| 17 | . /etc/alternc/local.sh |
|---|
| 18 | if [ -z "$MYSQL_HOST" ] |
|---|
| 19 | then |
|---|
| 20 | MYSQL_HOST="localhost" |
|---|
| 21 | fi |
|---|
| 22 | |
|---|
| 23 | # imprime le nom d'usager associé au domaine |
|---|
| 24 | get_account_by_domain() { |
|---|
| 25 | # les admintools ne sont peut-être pas là |
|---|
| 26 | if [ -x "/usr/bin/get_account_by_domain" ] |
|---|
| 27 | then |
|---|
| 28 | # only first field, only first line |
|---|
| 29 | /usr/bin/get_account_by_domain $1 | cut -d\ -f1 | cut -d' |
|---|
| 30 | ' -f 1 |
|---|
| 31 | else |
|---|
| 32 | # implantons localement ce que nous avons besoin, puisque admintools |
|---|
| 33 | # n'est pas là |
|---|
| 34 | mysql -h$MYSQL_HOST -u$MYSQL_USER -p$MYSQL_PASS -D$MYSQL_DATABASE -B -N -e \ |
|---|
| 35 | 'SELECT a.login FROM membres a, sub_domaines b WHERE a.uid = b.compte AND \ |
|---|
| 36 | CONCAT(IF(sub="", "", CONCAT(sub, ".")), domaine) = "'$1'" LIMIT 1;' |
|---|
| 37 | fi |
|---|
| 38 | } |
|---|
| 39 | |
|---|
| 40 | # add the standard input to a given file, only if not already present |
|---|
| 41 | append_no_dupe() { |
|---|
| 42 | realfile=$1 |
|---|
| 43 | tmpfile=`mktemp` |
|---|
| 44 | trap "rm -f $tmpfile; exit 1" 1 2 15 |
|---|
| 45 | cat > $tmpfile |
|---|
| 46 | if [ -r $realfile ] && |
|---|
| 47 | (diff -q $tmpfile $realfile > /dev/null || \ |
|---|
| 48 | diff -u $tmpfile $realfile | grep '^ ' | sed 's/^ //' | diff -q - $tmpfile > /dev/null) |
|---|
| 49 | then |
|---|
| 50 | ret=0 |
|---|
| 51 | else |
|---|
| 52 | ret=1 |
|---|
| 53 | cat $tmpfile >> $realfile |
|---|
| 54 | fi |
|---|
| 55 | rm -f $tmpfile |
|---|
| 56 | return $ret |
|---|
| 57 | } |
|---|
| 58 | |
|---|
| 59 | add_dom_entry() { |
|---|
| 60 | # protect ourselves from interrupts |
|---|
| 61 | trap "rm -f ${override_f}.new; exit 1" 1 2 15 |
|---|
| 62 | # ajouter une entrée, seulement s'il n'y en pas déjà, pour ce domaine |
|---|
| 63 | (echo $1; [ -r $override_f ] && cat $override_f) | \ |
|---|
| 64 | sort -u > ${override_f}.new && \ |
|---|
| 65 | cp ${override_f}.new ${override_f} && \ |
|---|
| 66 | rm ${override_f}.new |
|---|
| 67 | } |
|---|
| 68 | |
|---|
| 69 | echo -n "adding open_base_dir protection for:" |
|---|
| 70 | # boucle sur tous les domaines hébergés, ou sur les arguments de la |
|---|
| 71 | # ligne de commande |
|---|
| 72 | if [ $# -gt 0 ]; then |
|---|
| 73 | for i in $* |
|---|
| 74 | do |
|---|
| 75 | if echo $i | grep -q /var/alternc/dns > /dev/null; then |
|---|
| [316] | 76 | dom="$i" |
|---|
| [304] | 77 | else |
|---|
| [378] | 78 | initial_domain=`echo $i | awk '{z=split($NF, a, ".") ; print substr(a[z-1], 1, 1)}'` |
|---|
| 79 | dom="/var/alternc/dns/$initial_domain/$i" |
|---|
| [304] | 80 | fi |
|---|
| [316] | 81 | if [ -e $dom ]; then |
|---|
| 82 | doms="$doms $dom" |
|---|
| 83 | else |
|---|
| 84 | echo skipping non-existent domain $dom >&2 |
|---|
| 85 | fi |
|---|
| [304] | 86 | done |
|---|
| 87 | else |
|---|
| 88 | doms=`find /var/alternc/dns -type l` |
|---|
| 89 | fi |
|---|
| 90 | |
|---|
| 91 | for i in $doms |
|---|
| 92 | do |
|---|
| 93 | # don't "protect" squirrelmail, it legitimatly needs to consult |
|---|
| 94 | # files out of its own directory |
|---|
| 95 | if readlink $i | grep -q '^/var/alternc/bureau/admin/webmail/*$' || \ |
|---|
| 96 | readlink $i | grep -q '^/var/alternc/bureau/*$' |
|---|
| 97 | then |
|---|
| 98 | continue |
|---|
| 99 | fi |
|---|
| 100 | domain=`basename $i` |
|---|
| 101 | account=`get_account_by_domain $domain` |
|---|
| 102 | if [ "X$account" == "X" ]; then |
|---|
| 103 | continue |
|---|
| 104 | fi |
|---|
| 105 | # la première lettre de l'avant-dernière partie du domaine (e.g. |
|---|
| 106 | # www.alternc.org -> a) |
|---|
| 107 | initial_domain=`echo $domain | awk '{z=split($NF, a, ".") ; print substr(a[z-1], 1, 1)}'` |
|---|
| 108 | # la première lettre du username |
|---|
| 109 | initial_account=`echo $account | cut -c1` |
|---|
| 110 | path1=/var/alternc/dns/$initial_domain/$domain |
|---|
| 111 | path2=/var/alternc/html/$initial_account/$account |
|---|
| 112 | |
|---|
| 113 | mkdir -p $override_d/$initial_domain |
|---|
| 114 | if append_no_dupe "$override_d/$initial_domain/$domain" <<EOF |
|---|
| 115 | <Directory ${path1}> |
|---|
| 116 | php_admin_value open_basedir ${path2}/:/var/alternc/tmp/:/tmp/ |
|---|
| 117 | </Directory> |
|---|
| 118 | EOF |
|---|
| 119 | then |
|---|
| 120 | true |
|---|
| 121 | else |
|---|
| 122 | echo -n " $domain" |
|---|
| 123 | add_dom_entry "Include $override_d/$initial_domain/$domain" |
|---|
| 124 | fi |
|---|
| 125 | done |
|---|
| 126 | |
|---|
| 127 | echo . |
|---|