我是.NET开发人员,但对于我目前的项目,我需要使用Google Caja,这是一个Java项目.嗯,哦!
我在Windows机器上的http://code.google.com/p/google-caja/wiki/RunningCaja上按照指南操作,但无法运行程序.他们建议的命令行不起作用,所以我进入ant-jars目录并尝试运行plugin.jar:
D:\java\caja\svn-changes\pristine\ant-jars>java -cp . -jar pluginc.jar -i test.htm
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/cli/ParseException
at com.google.caja.plugin.PluginCompilerMain.<init>(PluginCompilerMain.java:78)
at com.google.caja.plugin.PluginCompilerMain.main(PluginCompilerMain.java:368)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.cli.ParseException
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
... 2 more
Run Code Online (Sandbox Code Playgroud)
那是怎么回事?
我也尝试过file:/// d:/java/caja/svn-changes/pristine/ant-jars/test.htm而不是test.htm.看来源,似乎文件参数是一个Uri ......
我也尝试在pluginc上运行IKVM,然后不用担心java,但是它也提出了ClassDefNotFoundException ......
谢谢!
编辑:感谢大家的帮助到目前为止:)仍然卡住了.请坚持下去,这可能是.net开发人员转向美丽的OSS技术的开始!
d:\java\caja\svn-changes\pristine\ant-jars>java -cp .\*.* com.google.caja.plugin.PluginCompilerMain
=> NoClassDefFoundError: /\commons-cli/jar
D:\java\caja\svn-changes\pristine\ant-jars>java -cp .\*.*;..\third_party\java\jakarta_commons\*.* com.google.caja.plugin.PluginCompilerMain
=> Could not find the main class: com.google.caja.plugin.PluginCompilerMain
Run Code Online (Sandbox Code Playgroud)
鉴于build.xml文件中的代码,有什么方法可以让它运行吗?
假设我有一个页面,我想允许第三方将小应用程序/ iframe嵌入到我的页面中.为了在我的页面上使用caja来保护第三方小应用程序/ iframe.我需要添加任何额外的javascript /服务器端代码才能使用caja吗?通过代理或直接iframe获取第三方小应用程序?
我想允许我的应用程序的用户在Javascript中编写扩展其功能的插件,而不允许访问除我提供的插件API对象之外的任何内容.例如,插件可能如下所示:
plugin.hookSomeUserAction(function() {
plugin.doSomethingWickedAwesome();
document.title = 'hacked!'; //shouldn't work
});
Run Code Online (Sandbox Code Playgroud)
Caja看起来应该能够完成工作,但文档可能是我见过的任何开源项目中最糟糕的(非常成就!).我需要一些帮助来设置系统.
我已经在命令行上使用了cajoler,并且我已经将一个这样的插件哄骗到某种有希望被清理的Javascript中.困惑的Javascript看起来像是期待提供一个"IMPORTS___"对象,它应该包含插件可以访问的所有东西.到目前为止很有前途!
不幸的是,让那个惹恼Javascript的文件实际加载并运行已经变成了一个真正的混乱.不幸的是,文档中的源代码段完全错误,因为函数loadCaja实际上并没有出现在google-caja的当前主干中的任何位置.我找到了一些代码,至少做了些什么:
<div id="plugin"></div>
<script>
caja.configure({
cajaServer: "/js/caja"
}, function(frameGroup) {
frameGroup.makeES5Frame(document.getElementById('plugin'),
{ /* No network access */ },
function(frame) {
frame.url('/js/plugins/test.js')
.run({});
}
);
});
</script>
Run Code Online (Sandbox Code Playgroud)
不幸的是,它的作用是尝试让cajoler重新调整我已经哄骗过的javascript.我绝对不想让服务器在每个请求上重新调用每个插件; 我只是在上传时将其哄骗并将其存储起来以备使用.
我也找不到任何关于如何或在何处指定IMPORTS___内容的文档(鉴于这是整个安全模型,它似乎是文档中的一个奇怪的疏忽).是传递给.run()的对象吗?
我想使用appscript htmlservice和appscript,html服务似乎工作,但可视化不起作用.这是代码供参考.Code.GS:
// Script-as-app template.
function doGet() {
return HtmlService.createHtmlOutputFromFile('html_visualization');
}
Run Code Online (Sandbox Code Playgroud)
html_visualization.html
<html>
<head>
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
<script type="text/javascript">
google.load('visualization', '1.0', {'packages':['corechart']});
google.setOnLoadCallback(drawChart);
function drawChart() {
var data = new google.visualization.DataTable();
data.addColumn('string', 'Topping');
data.addColumn('number', 'Slices');
data.addRows([
['Mushrooms', 3],
['Onions', 1],
['Olives', 1],
['Zucchini', 1],
['Pepperoni', 2]
]);
var options = {'title':'How Much Pizza I Ate Last Night','width':400, 'height':300};
var chart = new google.visualization.PieChart(document.getElementById ('chart_div') );
chart.draw(data, options);
}
</script>
</head>
<body>
<div id="chart_div"></div>
Hello World
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
发布Hello world时出现但没有图表的迹象.
google-visualization google-sites google-caja google-apps-script
我的网站上需要安全的HTML.
我读了caja指南,但我不确定我是否理解了这个概念.
https://developers.google.com/caja/docs/gettingstarted/
我认为它是这样的:
但是如何通过caja渲染呢?他们没有在他们的页面上解释这一点,他们只展示了如何替换代码.
<script type="text/javascript">
document.getElementById('dynamicContent').innerHTML = 'Dynamic hello world';
</script>
Run Code Online (Sandbox Code Playgroud)
假设我们的文档看起来像这样
<body>
<div class="input">
<h3>User Input </h3>
<script> alert("I am really bad!"); </script>
</div>
<div class="input">
<h3>User Input </h3>
<p> I am safe HTML!</p>
</div>
</body>
Run Code Online (Sandbox Code Playgroud)
我怎么告诉caja阻止脚本标记?
背景:我已经在Google应用程序脚本的HTML服务中准备了一个表单,我使用Code.gs中的DoGet函数调用该表单.
my doget function
function doGet() {
return HtmlService.createTemplateFromFile('HTMLUI').evaluate();
}
Run Code Online (Sandbox Code Playgroud)
一旦发布,它将呈现一个简单的浏览器表单,其中包含一些标签,输入框,提交,重置和查找按钮.用户将输入信息点击提交,数据将存储在电子表格(背景)中. - 工作正常,直到这里.
现在,当用户点击查找按钮时 - 需要填充弹出窗口类型,在此弹出窗口中,用户可以输入信息(来自下拉列表),所选条目将填入输入框中,可以修改并再次提交.
题:
在浏览器上如何在GAS中使用POP up kind窗口.
我在HTML服务中的查找按钮如下:
<div><input type="button" onclick="createPopup()" value="Find"></div>
Run Code Online (Sandbox Code Playgroud)
最后调用javascript:
<script type="text/javascript">
function createPopup() {
google.script.run.popup(document.forms[0]);
}
</script>
Run Code Online (Sandbox Code Playgroud)
CreatePopup()javascript代码:
function popup(form){
Logger.log("I am first called");
//Mycode should probably go here I think...
Logger.log("I am last called");
}
Run Code Online (Sandbox Code Playgroud)
查看日志时,它显示"我第一次被呼叫"和"我最后被呼叫".
我的研究:我发现Spreadsheet.toast(类似的东西)适用于电子表格,但我如何在浏览器上获得小窗口..
html javascript google-caja google-apps-script google-spreadsheet-api
我在node.js下使用npm包Caja-HTML-Sanitizer.
我可以使用sanitizer()函数清理html输入,但是如何使用白名单只允许某些标签(例如p br strong)?
谢谢!
google-caja ×7
javascript ×5
html ×2
google-sites ×1
java ×1
node.js ×1
opensocial ×1
portlet ×1
security ×1
xss ×1