17.1.3 Un esempio

Mettiamo di voler imporre una condotta un pò meno rigida rispetto alla classe RExec predefinita. Per esempio, se vogliamo permettere la scrittura di file in /tmp, possiamo derivare la classe RExec:

class TmpWriterRExec(rexec.RExec):
    def r_open(self, file, mode='r', buf=-1):
        if mode in ('r', 'rb'):
            pass
        elif mode in ('w', 'wb', 'a', 'ab'):
            # controlla il nome del file: deve iniziare con /tmp/
            if file[:5]!='/tmp/': 
                raise IOError, "can't write outside /tmp"
            elif (string.find(file, '/../') >= 0 or
                 file[:3] == '../' or file[-3:] == '/..'):
                raise IOError, "'..' in filename forbidden"
        else: raise IOError, "Illegal open() mode"
        return open(file, mode, buf)
Notate che il codice sopra proibirà occasionalmente l'apertura di un nome di file perfettamente valido; per esempio, il codice in un ambiente limitato non sarà in grado di aprire un file chiamato /tmp/foo/../bar. Per correggere questo difetto, il metodo r_open() dovrebbe semplificare il nome del file a /tmp/bar, che richiederebbe l'estrazione del nome del file e l'esecuzione di varie operazioni su questo. Nei casi in cui è in gioco la sicurezza, può essere preferibile scrivere codice più semplice che sia qualche volta particolarmente restrittivo, invece di un codice più generale ma anche molto complesso che possa contenere un subdolo problema di sicurezza.
Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.