2011-04-09 2 views
0

Я пытаюсь получить clj-sandbox, чтобы разрешить def и defn.Ошибка Clj-Sandbox?

У меня не было никаких проблем с получением def работы:

(use 'net.licenser.sandbox 
    'net.licenser.sandbox.tester 
    'net.licenser.sandbox.matcher) 

(def my-tester 
    (extend-tester secure-tester (whitelist (function-matcher 'def)))) 
(def my-sandbox 
    (stringify-sandbox (new-sandbox :tester my-tester))) 

(my-sandbox 
    "(def a (clojure.core/fn a ([b] (inc b))))") 
(println (my-sandbox "(a 5)")) 

Однако defn дает мне проблемы. Похоже, мой код передает принципы песочницы, но терпит неудачу во время исполнения:

; (macroexpand '(defn y [z] (inc z))) 
(my-sandbox 
    "(def y (.withMeta (clojure.core/fn y ([z] (inc z))) (.meta (var y))))") 
; java.lang.SecurityException: Exception in sandboxed code. 

Является ли это ошибка, или я делаю что-то не так?

ответ

2

clj-sandbox - это немного багги. Были некоторые дизайнерские решения, которые в конечном итоге оказались плохими идеями.

Alan Malloy и я написал новую библиотеку песочницы под названием clojail, чтобы заменить clj-sandbox в наших собственных проектах. Я не уверен, что есть проекты, которые все еще используют clj-sandbox в производстве, и они больше не поддерживаются.

К сожалению, clojail не поддерживает def/defn, что и у clj-sandbox. Смысл, вы можете разрешить def/defn, но они вообще не будут изолированы. Они могут использоваться для вытеснения ошибок памяти. http://try-clojure.org не имеет этой проблемы, потому что в любом случае она должна иметь свою небольшую def/defn sandbox (которая хранится в файле cookie). Вы должны иметь возможность в основном копировать/вставлять с try-clojure's version, если вам нужно такое поведение.

В любом случае, я действительно забыл о том, как def/defn ведет себя в clj-sandbox, и, вероятно, поэтому мы еще не добавили его в clojail. Я позабочусь об этом позже и внедрю его как можно скорее.

В любом случае, clojail является единственной активной библиотекой песочницы, которую я знаю прямо сейчас. Он используется в sexpbot и try-clojure, и у нас есть канал для него и другие проекты, связанные с sexpbot, на Freenode. Хоп в #sexpbot, если вам нужна помощь!

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