Javascript 如何在outlook.com web mail中使用Firefox XUL扩展拦截电子邮件附件的上载
我有一个XUL扩展,它使用本机Windows DLL和js ctypes对本地文件系统中的文件进行加密。我已经测试了一个菜单驱动的版本,它似乎工作得很好 现在,我想做以下工作:当创建一封带有附件的新电子邮件时,能够“捕获”附件文件并在上传到合成的电子邮件之前对其进行处理(意思是:加密)。我想以一种透明的方式来做这件事,这样用户就不必经历菜单驱动的过程,只需提供密码进行加密 我想在outlook.com基于web的电子邮件(非Office版本)中执行此操作 我知道这是一个远大的目标,但是有人知道从哪里开始寻找吗?过去有人做过这样的事吗Javascript 如何在outlook.com web mail中使用Firefox XUL扩展拦截电子邮件附件的上载,javascript,dom,encryption,outlook,xul,Javascript,Dom,Encryption,Outlook,Xul,我有一个XUL扩展,它使用本机Windows DLL和js ctypes对本地文件系统中的文件进行加密。我已经测试了一个菜单驱动的版本,它似乎工作得很好 现在,我想做以下工作:当创建一封带有附件的新电子邮件时,能够“捕获”附件文件并在上传到合成的电子邮件之前对其进行处理(意思是:加密)。我想以一种透明的方式来做这件事,这样用户就不必经历菜单驱动的过程,只需提供密码进行加密 我想在outlook.com基于web的电子邮件(非Office版本)中执行此操作 我知道这是一个远大的目标,但是有人知道从
提前谢谢 一个很好的开始是一个插件,它已经完成了你想要的(以一种通用的方式): 在下载页面上显示
使用tamperdata查看和修改HTTP/HTTPS标题和post参数
。您对更改“post参数”感兴趣,因此这是一个很好的开始
但如果你只是想自己实现这一点 为了在开发过程中构建解决方案,我已经按顺序回答了这个问题 在最后一个扩展中,您需要:
拦截请求并替换现有帖子内容 最基本的是,您需要实现一个passing-an作为观察的“主题”。您希望观察的“通知”称为http on modify request 在
http on modify request
的文档中,有一些拦截GET
请求的简单示例(,),但是拦截POST
请求更为复杂
在POST请求机构获取:
有一种方法可以解决这个问题<代码>
Kamelot9在该线程中的第二篇帖子详细介绍了如何(1)访问帖子正文:
var httpChannel = aSubject.QueryInterface(Ci.nsIHttpChannel);
var uploadChannel = httpChannel.QueryInterface(Ci.nsIUploadChannel);
var uploadChannelStream = uploadChannel.uploadStream;
uploadChannelStream
.QueryInterface(Ci.nsISeekableStream)
.seek(Ci.nsISeekableStream.NS_SEEK_SET, 0);
var stream = Cc["@mozilla.org/binaryinputstream;1"]
.createInstance(Ci.nsIBinaryInputStream);
stream.setInputStream(uploadChannelStream);
var postBytes = stream.readByteArray(stream.available());
var poststr = String.fromCharCode.apply(null, postBytes);
其中,a对象
这里是您的http on modify request
通知的参数。然后您可以只修改poststr
。根据服务器的不同,您可能还需要修改内容长度
标题(或者您的文章可能会被截断)
替换请求后内容:
获得修改后的帖子正文后,您需要(2)用自己的内容替换uploadChannel
中inputStream
的现有内容:
var inputStream = Cc["@mozilla.org/io/string-input-stream;1"]
.createInstance(Ci.nsIStringInputStream);
inputStream.setData(poststr, poststr.length);
uploadChannel.setUploadStream(
inputStream,
"application/x-www-form-urlencoded",
-1);
// do this last - setUploadStream resets requestMethod to PUT
httpChannel.requestMethod = "POST";
上面的Cc
和Ci
分别是组件、类和组件、接口的缩写。这些速记变量可能已经设置好了,或者您可以自己定义它们
解析表单数据:
我认为通常对于文件上载,内容类型:
将是多部分/表单数据
要深入了解您感兴趣的特定“附件”,您需要:
解析mime信封以获取文件附件
查找您的文件附件
删除已使用的任何文本编码(例如:BASE64
)
在文章标题中,您将看到如下内容:
Content-Type: multipart/form-data; boundary=JGUOAeGT3Fjgjcdk6s35F2mPVVyTdzgR
其中'JGUOAeGT3Fjgjcdk6s35F2mPVVyTdzgR'是MIME边界。在文章正文中,内容将以如下格式开始:
--[boundary]
CONTENT-PART #1
--[boundary]
CONTENT-PART #2
--[boundary]
上面的每个CONTENT-PART
都将有一些HTTP头、一个空行,然后是特定CONTENT-PART
的主体
另一个例子:
在本例中,内容传输编码是二进制(原始,编码)UTF8,因此您无需再做任何工作就可以读取内容部分
主体中的JSON
在您的情况下,浏览器将发送一个二进制文件,因此它可能已将内容传输编码设置为base64
,这意味着您需要对内容部分的主体进行base64解码,以获得真正的二进制文件。如果base64data
包含编码的内容,则这将为您提供原始二进制数据:
var rawData = atob(base64data);
此时,您可以对rawData
执行任何加密操作
请记住,加密后(使用btoa
)必须对二进制数据重新编码,然后在重新构建POST请求主体之前,需要重新组装多部分信封。(不要忘记获取最终请求正文的.length
,以便您可以在请求标题的内容长度中替换。)
以请求为目标:
这是修改POST请求的基本机制。但是您仍然需要挑出您的特定POST请求(检查观察者通知中的POST请求URL),以便允许其他POST请求正常进行,而无需调用修改代码。一个好的开始是一个已经完成了您想要的功能(以通用方式)的插件:
在下载页面上显示使用tamperdata查看和修改HTTP/HTTPS标题和post参数
。您对更改“post参数”感兴趣,因此这是一个很好的开始
但如果你只是想自己实现这一点
为了在开发过程中构建解决方案,我已经按顺序回答了这个问题
在最后一个扩展中,您需要:
拦截请求
瞄准畜栏
var rawData = atob(base64data);