Thursday, 12 April 2012

Run javascript in sandbox

Run javascript in sandbox
This task use java and Rhino to run javascript in sandbox.
Run javascript in sandbox
  1. Create Machine class as following
  2. Create DataHandler class as following
  3. Create javascript as following
  4. Call Machine.run() method as following
Call Machine.run() method
1String js = loadJS();
2Map args = new HashMap();
3List links = new ArrayList();
4args.put("links", links);
5links.add("Input link 1");
6links.add("Input link 2");
7
8Machine env = new Machine(new DataHandler());
9Machine.run(env, js, args);
10
11for (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));
}
Machine class
1public 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) { }
  
    }
 
}
DataHandler class
1public 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);
    }
     
}
javascript
1function 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');
}

  Protected by Copyscape Online Copyright Protection

No comments:

Post a Comment