/
eval.clj
40 lines (34 loc) · 1.26 KB
/
eval.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
(ns tryclojure.models.eval
(:require [clojail.testers :refer [secure-tester-without-def blanket]]
[clojail.core :refer [sandbox]]
[clojure.stacktrace :refer [root-cause]]
[noir.session :as session])
(:import java.io.StringWriter
java.util.concurrent.TimeoutException))
(defn eval-form [form sbox]
(with-open [out (StringWriter.)]
(let [result (sbox form {#'*out* out})]
{:expr form
:result [out result]})))
(defn eval-string [expr sbox]
(let [form (binding [*read-eval* false] (read-string expr))]
(eval-form form sbox)))
(def try-clojure-tester
(conj secure-tester-without-def (blanket "tryclojure" "noir")))
(defn make-sandbox []
(sandbox try-clojure-tester
:timeout 2000
:init '(do (require '[clojure.repl :refer [doc source]])
(future (Thread/sleep 600000)
(-> *ns* .getName remove-ns)))))
(defn find-sb [old]
(if-let [sb (get old "sb")]
old
(assoc old "sb" (make-sandbox))))
(defn eval-request [expr]
(try
(eval-string expr (get (session/swap! find-sb) "sb"))
(catch TimeoutException _
{:error true :message "Execution Timed Out!"})
(catch Exception e
{:error true :message (str (root-cause e))})))