source: src/basedir_prot.sh @ 378

Revision 378, 3.4 KB checked in by anarcat, 7 years ago (diff)

[project @ alternc: changeset 2004-08-27 13:04:59 by anonymous]
Déplacement de override_php dans /var/alternc/apacheconf (données
variables partageables en nfs...) corrections dans les fichiers
correspondants.

Original author: anonymous
Date: 2004-08-27 13:05:00

RevLine 
[304]1#!/bin/sh
2
3set -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]14override_d=/var/alternc/apacheconf/
15override_f=${override_d}override_php.conf
[304]16
17. /etc/alternc/local.sh
18if [ -z "$MYSQL_HOST" ]
19then
20    MYSQL_HOST="localhost"
21fi
22
23# imprime le nom d'usager associé au domaine
24get_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
41append_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
59add_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
69echo -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
72if [ $# -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
87else
88        doms=`find /var/alternc/dns -type l`
89fi
90
91for i in $doms
92do
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>
118EOF
119        then
120                true
121        else
122                echo -n " $domain"
123                add_dom_entry "Include $override_d/$initial_domain/$domain"
124        fi
125done
126
127echo .
Note: See TracBrowser for help on using the repository browser.