Run javascript in sandbox
This task use java and Rhino to run javascript in sandbox.
Run javascript in sandbox
- Create Machine class as following
- Create DataHandler class as following
- Create javascript as following
- Call Machine.run() method as following
Call Machine.run() method
Machine class
DataHandler class
javascript
1 | String js = loadJS(); |
2 | Map args = new HashMap(); |
3 | List links = new ArrayList(); |
4 | args.put("links", links); |
5 | links.add("Input link 1"); |
6 | links.add("Input link 2"); |
7 | |
8 | Machine env = new Machine(new DataHandler()); |
9 | Machine.run(env, js, args); |
10 | |
11 | for (int i = 0; i < links.size(); i++) { |
12 | logger.info(links.get(i)); |
13 | } |
String js = loadJS(); Map args = new HashMap(); List links = new ArrayList(); args.put("links", links); links.add("Input link 1"); links.add("Input link 2"); Machine env = new Machine(new DataHandler()); Machine.run(env, js, args); for (int i = 0; i < links.size(); i++) { logger.info(links.get(i)); }
1 | public class Machine { |
2 | |
3 | private Handler handler; |
4 | |
5 | public static void run(Machine env, String js, Map args) throws Exception { |
6 | try { |
7 | Context cx = Context.enter(); |
8 | cx.setClassShutter(new ClassShutter() { |
9 | public boolean visibleToScripts(String className) { |
10 | if ("com.paesia.schema.script.Machine".equals(className)) return true; |
11 | if ("java.lang.String".equals(className)) return true; |
12 | if ("java.lang.Object".equals(className)) return true; |
13 | if ("java.util.HashMap".equals(className)) return true; |
14 | if ("java.util.ArrayList".equals(className)) return true; |
15 | if ("java.lang.Byte".equals(className)) return true; |
16 | if ("java.lang.Short".equals(className)) return true; |
17 | if ("java.lang.Integer".equals(className)) return true; |
18 | if ("java.lang.Long".equals(className)) return true; |
19 | if ("java.lang.Float".equals(className)) return true; |
20 | if ("java.lang.Double".equals(className)) return true; |
21 | if ("java.lang.Boolean".equals(className)) return true; |
22 | if ("java.lang.Character".equals(className)) return true; |
23 | if (className.startsWith("com.paesia.schema.script.safe.")) return true; |
24 | return false; |
25 | } |
26 | }); |
27 | Scriptable scope = cx.initStandardObjects(); |
28 | Object result = cx.evaluateString(scope, js, "<js>", 1, null); |
29 | Object fObj = scope.get("main", scope); |
30 | if (!(fObj instanceof Function)) { |
31 | throw new Exception("main() is undefined or not a function."); |
32 | } else { |
33 | Object functionArgs[] = { env, args }; |
34 | Function f = (Function)fObj; |
35 | result = f.call(cx, scope, scope, functionArgs); |
36 | } |
37 | } catch (Exception e) { |
38 | throw e; |
39 | } finally { |
40 | Context.exit(); |
41 | } |
42 | } |
43 | |
44 | public String newString(String src) { |
45 | return src; |
46 | } |
47 | |
48 | public String newString(byte[] src, String charset) throws Exception { |
49 | return new String(src, charset); |
50 | } |
51 | |
52 | public HashMap newHashMap() { |
53 | return new HashMap(); |
54 | } |
55 | |
56 | public ArrayList newArrayList() { |
57 | return new ArrayList(); |
58 | } |
59 | |
60 | public Byte newByte(byte src) { |
61 | return (Byte)src; |
62 | } |
63 | |
64 | public Short newShort(short src) { |
65 | return (Short)src; |
66 | } |
67 | |
68 | public Integer newInteger(int src) { |
69 | return (Integer)src; |
70 | } |
71 | |
72 | public Long newLong(long src) { |
73 | return (Long)src; |
74 | } |
75 | |
76 | public Float newFloat(float src) { |
77 | return (Float)src; |
78 | } |
79 | |
80 | public Double newDouble(double src) { |
81 | return (Double)src; |
82 | } |
83 | |
84 | public Boolean newBoolean(boolean src) { |
85 | return (Boolean)src; |
86 | } |
87 | |
88 | public Character newCharacter(char src) { |
89 | return (Character)src; |
90 | } |
91 | |
92 | public Machine(Handler handler) { |
93 | this.handler = handler; |
94 | } |
95 | |
96 | public void debug(String message) { |
97 | if (handler != null) { |
98 | handler.debug(message); |
99 | } |
100 | } |
101 | |
102 | public void error(String message) { |
103 | if (handler != null) { |
104 | handler.error(message); |
105 | } |
106 | } |
107 | |
108 | public void fatal(String message) { |
109 | if (handler != null) { |
110 | handler.fatal(message); |
111 | } |
112 | } |
113 | |
114 | public void info(String message) { |
115 | if (handler != null) { |
116 | handler.info(message); |
117 | } |
118 | } |
119 | |
120 | public static class Handler { |
121 | |
122 | public void debug(String message) { } |
123 | public void error(String message) { } |
124 | public void fatal(String message) { } |
125 | public void info(String message) { } |
126 | |
127 | } |
128 | |
129 | } |
public class Machine { private Handler handler; public static void run(Machine env, String js, Map args) throws Exception { try { Context cx = Context.enter(); cx.setClassShutter(new ClassShutter() { public boolean visibleToScripts(String className) { if ("com.paesia.schema.script.Machine".equals(className)) return true; if ("java.lang.String".equals(className)) return true; if ("java.lang.Object".equals(className)) return true; if ("java.util.HashMap".equals(className)) return true; if ("java.util.ArrayList".equals(className)) return true; if ("java.lang.Byte".equals(className)) return true; if ("java.lang.Short".equals(className)) return true; if ("java.lang.Integer".equals(className)) return true; if ("java.lang.Long".equals(className)) return true; if ("java.lang.Float".equals(className)) return true; if ("java.lang.Double".equals(className)) return true; if ("java.lang.Boolean".equals(className)) return true; if ("java.lang.Character".equals(className)) return true; if (className.startsWith("com.paesia.schema.script.safe.")) return true; return false; } }); Scriptable scope = cx.initStandardObjects(); Object result = cx.evaluateString(scope, js, "<js>", 1, null); Object fObj = scope.get("main", scope); if (!(fObj instanceof Function)) { throw new Exception("main() is undefined or not a function."); } else { Object functionArgs[] = { env, args }; Function f = (Function)fObj; result = f.call(cx, scope, scope, functionArgs); } } catch (Exception e) { throw e; } finally { Context.exit(); } } public String newString(String src) { return src; } public String newString(byte[] src, String charset) throws Exception { return new String(src, charset); } public HashMap newHashMap() { return new HashMap(); } public ArrayList newArrayList() { return new ArrayList(); } public Byte newByte(byte src) { return (Byte)src; } public Short newShort(short src) { return (Short)src; } public Integer newInteger(int src) { return (Integer)src; } public Long newLong(long src) { return (Long)src; } public Float newFloat(float src) { return (Float)src; } public Double newDouble(double src) { return (Double)src; } public Boolean newBoolean(boolean src) { return (Boolean)src; } public Character newCharacter(char src) { return (Character)src; } public Machine(Handler handler) { this.handler = handler; } public void debug(String message) { if (handler != null) { handler.debug(message); } } public void error(String message) { if (handler != null) { handler.error(message); } } public void fatal(String message) { if (handler != null) { handler.fatal(message); } } public void info(String message) { if (handler != null) { handler.info(message); } } public static class Handler { public void debug(String message) { } public void error(String message) { } public void fatal(String message) { } public void info(String message) { } } }
1 | public static class DataHandler extends Machine.Handler { |
2 | |
3 | public void debug(String message) { |
4 | logger.debug(message); |
5 | } |
6 | |
7 | public void error(String message) { |
8 | logger.error(message); |
9 | } |
10 | |
11 | public void fatal(String message) { |
12 | logger.fatal(message); |
13 | } |
14 | |
15 | public void info(String message) { |
16 | logger.info(message); |
17 | } |
18 | |
19 | } |
public static class DataHandler extends Machine.Handler { public void debug(String message) { logger.debug(message); } public void error(String message) { logger.error(message); } public void fatal(String message) { logger.fatal(message); } public void info(String message) { logger.info(message); } }
1 | function main(env, args) { |
2 | var links = args.get('links'); |
3 | for (var i = 0; i < links.size(); i++) { |
4 | env.info(links.get(i)); |
5 | } |
6 | links.clear(); |
7 | links.add('Output link 1'); |
8 | links.add('Output link 2'); |
9 | } |
function main(env, args) { var links = args.get('links'); for (var i = 0; i < links.size(); i++) { env.info(links.get(i)); } links.clear(); links.add('Output link 1'); links.add('Output link 2'); }
No comments:
Post a Comment