#64461·server

当创建者返回 ATemplate 对象 (根据接口合约) 时, DirectEditing Manager::getTemplates() 会崩溃

作者: IoSonoPiero创建于 2026年9月17日更新于 2026年9月17日
标签3. to review
  • 复制步骤
  1. Nextcloud上的服务器 34.0.4.1 有丰富的文件 11.1.1 (执行`OCP\DirectEditing\ACreate FromTemplate'并遵循PR https://GitHub.com/nextcloud/richdocuments/pul/565656,"与OCP\DirectEditing API结合").
  2. 从 Nextcloud Android app (v35.0.0),自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自自自来自来自来自来自来自来自来自来自来自自自来自自来自自自自来自来自自来自来自自来自来自来自来自来自来自来自来自来自来自自来自来自来自自自来自来自来自来自来自来自来自来自自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来
  3. App calls `GET /ocs/v2.php/apps/files/api/v1/ DirectEditing/templates/richdocuments/document ' (和 " /spreadshet " ).
  • 预期行为

模板列表返回, 模板拾取器打开 。

实际行为

500个出错,每次请求都会失败,针对每一个创建者类型(文档,电子表格——都经过测试). `nextcloud.log'中的例外:

无法在文件中使用 OCA\ Richdocuments\ DirectEditing\ OfficeTemplate 这样的对象
'/var/www/html/lib/private/DirectEditing/Manager.php' 第91行车次.

根原因

OCP\Direct Editing\ACReating from Template: getTemplates ()' 被记录为返回 ATemplate [] : https://GitHub.com/nextcloud/server/blob/v34.04.0.4/lib/public/DirectEditing/ACreate FromTemplate.php 互联网档案馆的存檔,存档日期2007-12-20.

richdocuments `bustractOfficeCreator:: getTemplates ()' 字面上跟着它,并返回一组“OfficeTemplate”对象(将“ATemplate”) : https://GitHub.com/nextcloud/richdocuments/blob/v11.1.1/lib/DirectEditing/AbstractOfficeCreator.php#L67-L75 (中文(简体) ).

但“ OC\ DirectEditing\ Manager:: getTemplates () ” (私人) 将每个元素视为一个平面关联阵列,而不是对象 :

翻译: $templades = 阵列 map(功能 (template) 使用 (creator) { $template ['extension'] = $creator- >getExtension () ; $template ['mimetype'] = $creator- >getMIMEtype (); 返回模板;

  • $templates;
https://GitHub.com/nextcloud/server/blob/v34.04.0.4/lib/private/DirectEditing/Manager.php#L75-L96 (中文(简体) ).

此数组- mutation code 似乎没有改变, 至少因为 Nextcloud 30( 检查了 `v30. 0.0' 标记, 相同的逻辑) , 所以它默默地依赖于返回原始数组的应用程序, 尽管接口自 18. 0. 0 起声明了 ` ATemplate [] 。 任何遵循有文件记载的合同的应用程序(如richdocuments现在所做的,在其最近的`OCP\DirectEditing' refactors 之后)都会以致命错误打破这个代码。

解决建议

“管理者:GetTemplates()”在变异前应称为`$template->json序列化()'(或等同),因为`ATemplate执行Json序列化',并且已经通过`json序列化()'暴露出`id'/`title'/`review':
https://GitHub.com/nextcloud/server/blob/v34.04.0.4/lib/public/DirectEditing/ATemplate.php 页面存档备份,存于互联网档案馆.

环境

- 下一个云34.0.4.1
- 丰富的文件 11.1.1
- 下一个Cloud Android app 35.0.
- 复制了 " 文件 " 和 " 传单 " 两种创建类型

内容来源: nextcloud/server