Javascript 如何在outlook.com web mail中使用Firefox XUL扩展拦截电子邮件附件的上载

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版本)中执行此操作 我知道这是一个远大的目标,但是有人知道从

我有一个XUL扩展,它使用本机Windows DLL和js ctypes对本地文件系统中的文件进行加密。我已经测试了一个菜单驱动的版本,它似乎工作得很好

现在,我想做以下工作:当创建一封带有附件的新电子邮件时,能够“捕获”附件文件并在上传到合成的电子邮件之前对其进行处理(意思是:加密)。我想以一种透明的方式来做这件事,这样用户就不必经历菜单驱动的过程,只需提供密码进行加密

我想在outlook.com基于web的电子邮件(非Office版本)中执行此操作

我知道这是一个远大的目标,但是有人知道从哪里开始寻找吗?过去有人做过这样的事吗


提前谢谢

一个很好的开始是一个插件,它已经完成了你想要的(以一种通用的方式):

在下载页面上显示
使用tamperdata查看和修改HTTP/HTTPS标题和post参数
。您对更改“post参数”感兴趣,因此这是一个很好的开始


但如果你只是想自己实现这一点

为了在开发过程中构建解决方案,我已经按顺序回答了这个问题

在最后一个扩展中,您需要:

  • 拦截请求
  • 以正确的请求为目标
  • 获取对POST请求主体的访问权限
  • 解析POST请求主体的表单数据(以获取真正的二进制文件数据)
  • 执行加密步骤
  • 重新编码二进制文件数据,重新组装表单数据,并修改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);