【问题标题】:Able to write events to read-only calendar via API能够通过 API 将事件写入只读日历
【发布时间】:2015-12-12 04:39:39
【问题描述】:

这是我认为是日历 REST API 中的错误 - 但我希望找到解决方法。

简而言之,我可以通过 API 将日历事件发布到只读日历而不会出错。奇怪的是,365 UI 知道日历是只读的,并且不允许通过 UI 进行编辑。

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

重现步骤:

  1. 获取一个公开的只读日历地址。例如this
  2. 在 365 中,右键单击“我的日历”和“打开日历”
  3. 在“互联网日历”字段中粘贴来自 (1) 的地址。日历应出现在“我的日历”下。 请注意,您无法通过用户界面为此日历创建活动
  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创建返回。惊喜!一段时间后(4-6 小时),新创建的事件将被删除。如果您正在同步此日历,这会导致问题,因为删除将传播到与该日历同步的任何客户端。

【问题讨论】:

  • 让我对此进行调查并回复您。

标签: office365 office365api


【解决方案1】:

感谢您报告此事。我对此进行了调查,不幸的是,目前对此没有一个好的答案。这是我们正在努力改进的东西,以使 API 与 Outlook 和 OWA 更加一致。很遗憾,我没有任何时间表可以分享。

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

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

作为一种解决方法,如果您愿意使用/beta 端点,您可以检索日历上的PidTagExtendedFolderFlags 属性。这是一个二进制属性,因此您需要对其进行一些解析才能获取数据。该格式记录在MS-OXOCFG 中。您需要解析sub-propertyId 等于0x01,然后测试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

0x40 位在Data 字段中设置,因此是只读的。

【讨论】:

  • 感谢您的回复。这是否意味着没有办法检测日历是否通过 API 同步到互联网日历?当然,如果 OWA 知道它是,数据一定来自某个地方(即服务器)吗?这导致了一个巨大的问题,即如果用户选择其中一个日历并且我们使用提供的端点here 进行同步,则我们这边的所有添加事件都会在同步期之后作为“删除事件”返回,从而导致数据损失情景。
  • OWA 读取的属性是二进制 MAPI 属性。我试过了,我可以通过 beta 端点访问它。在我的答案中添加详细信息。
猜你喜欢
  • 1970-01-01
  • 2016-05-28
  • 2012-10-10
  • 2019-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多