能够通过API将事件写入只读日历 [英] Able to write events to read-only calendar via API

查看:27
本文介绍了能够通过API将事件写入只读日历的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

以下是我认为日历睡觉应用编程接口中存在的错误,但我希望找到解决方法。

简而言之,我能够通过API将日历事件发布到只读日历,而不会出错。奇怪的是,365用户界面知道日历是只读的,不允许通过用户界面进行编辑。

这会导致同步出现问题,因为当原始日历再次发布时,所有新事件都会被删除。我的问题是,我如何确定我要写入的日历具有适当的写入权限(就像UI一样),其次,我可以通过API写入,但不能通过UI写入,这是一个错误吗?

复制步骤:

  1. 获取公开的只读日历地址。例如this
  2. 在365中,右键单击"我的日历"和"打开日历"
  3. 将(1)中的地址粘贴到"Internet日历"字段中。日历应显示在"我的日历"下。请注意,您无法通过UI为此日历创建事件
  4. 使用GET https://outlook.office.com/api/v1.0/me/calendars获取新添加的日历ID
  5. 使用POST https://outlook.office.com/api/v1.0/me/calendars/[CALENDAR_ID]/events在新日历中创建事件。

预期行为 与UI一样,API不允许您写入此日历。

实际行为 创建成功,返回201 Created。惊喜吧!一段时间(4-6小时)后,新创建的事件将被删除。如果您正在同步此日历,这会导致问题,因为删除操作将传播到与该日历同步的任何客户端。

推荐答案

感谢您报道此消息。我研究过这个问题,不幸的是,目前没有一个好的答案。这是我们正在努力改进的东西,以使API与Outlook和OWA更加一致。很遗憾,我没有任何时间线可供共享。

基本上,当您订阅Internet日历时,邮箱中会创建一个辅助日历。它不是真正的只读,但Outlook和OWA知道它是为了与Internet日历同步,不允许您在那里创建项目。该逻辑都在客户端上,而不是在服务器上,这就是它今天的行为方式的原因。

该事件在下次启动与Webcal URL的同步过程时被删除,因为它不存在于从Webcal链接下拉的ICS中。

作为一种解决办法,如果您愿意使用/beta端点,您可以检索日历上的PidTagExtendedFolderFlags属性。这是一个二进制属性,因此您需要对其进行一些解析才能获得数据。MS-OXOCFG中记录了该格式。您需要解析Id等于0x01的sub-property,然后测试Data作为0x40位的位掩码。如果已设置,则应将该文件夹视为只读。

要获得此属性,您需要展开Calendar实体上的SingleValueExtendedProperties,如下所示:

GET https://outlook.office.com/api/beta/me/calendars?
$expand=SingleValueExtendedProperties($filter=PropertyId eq 'Binary 0x36da')

这将返回如下内容:

{
  "value": [
    {
      "Id": "AAMkAGRm...AAA=",
      "Name": "Calendar",
      "Color": "Auto",
      "ChangeKey": "nxdFEDVaMUqvOVUO3592PQAAFmsEKg==",
      "SingleValueExtendedProperties": [
        {
          "PropertyId": "Binary 0x36da",
          "Value": "AQQAABAA"
        }
      ]
    },
    {
      "Id": "AAMkAGRm...AAA=",
      "Name": "Internet Calendar",
      "Color": "Auto",
      "ChangeKey": "nxdFEDVaMUqvOVUO3592PQAAFmsELQ==",
      "SingleValueExtendedProperties": [
        {
          "PropertyId": "Binary 0x36da",
          "Value": "AQRAJRAC"
        }
      ]
    }
  ]
}
这些属性的值是Base64编码的二进制BLOB。如果您对它们进行解码,则会得到如下内容:

  • 日历:010400001000
  • 互联网日历:010440251002

按照格式解释,我们有:

Id: 0x01
Cb: 0x04
Data: 0x02102540

Data字段中设置了0x40位,因此其中一个是只读的。

这篇关于能够通过API将事件写入只读日历的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆