2014-08-28 2 views
3

Я использую hunchentoot для создания простого веб-приложения, чтобы выставить дерево каталогов в Интернете. Проблема, с которой я столкнулась, заключается в нахождении надежного и безопасного способа определить, является ли запрошенный каталог фактически дочерним каталогом *share-root*, который является /srv/share.Common Lisp определить, является ли каталог поддиректором или другим каталогом

Я провел время cl-fad, но это не совсем то, что мне нужно (или я не использую его таким образом, чтобы решить мою проблему).

Моя цель состоит в том, чтобы иметь возможность получить такой путь, как: /srv/share/media/../../../ и реализовать запрос следует игнорировать, потому что он просит что-то за пределами общего доступа.

ответ

3

я предлагаю enough-namestring в сочетании с truename: если

(enough-namestring foo bar) 

является относительный путь к файлу, то foo находится под bar. Другими словами:

(defun pathname-under-p (under top) 
    (case (car (pathname-directory (enough-namestring (truename under) 
                (truename top)))) 
    ((nil :relative) t) 
    (t nil))) 

или просто

(defun pathname-under-p (under top) 
    (not (eq :absolute (car (pathname-directory (enough-namestring (truename under) 
                   (truename top))))))) 

Если реализация не поддерживает truename на каталог, вам придется использовать функцию реализации конкретных или directory.

Большое спасибо @Svante для отладки.

+0

'(enough-namestring #p" src /../ "#p" src/")' возвращает '' src /../ "для меня в SBCL 1.1.18 на Linux x64. – Svante

+1

@Svante: does '(truename" src /../ ")' работает? (см. править) – sds

+1

Это дает мне абсолютный каталог вместо относительного каталога, начинающегося с ': up', поэтому' pathname-under-p' возвращает всегда true. – Svante

Смежные вопросы