使 release def 上下文菜单项有条件地不可见

Make release def context menu item conditionally invisible

TFS 2018u1。我正在为发布定义构建一个带有自定义上下文菜单命令的扩展。我希望其中一些有条件地不可见(根据当前用户的权利)。有什么方法可以隐藏它们吗?

故意不打电话 VSS.register() 没有用;自定义命令仍然存在,只是什么也不做。

这不是安全措施,而是可用性问题(菜单越来越拥挤)。

编辑:在 Contribution data structure there's a property called constraints. It's not documented, no idea where it comes from. Probably the manifest. The only mention of constraints I could find is in the TFX tool sources 中。显然,constraints 是清单 JSON 中的有效值(可能在贡献对象下),它应该是一个数组。假设是 ContributionConstraint 个对象之一。后者有点记录。

A constraint object 有一个 name 属性,根据文档,它包含对 IContributionFilter class 的引用。我在文档和 TypeScript 源代码中都找不到关于 class 的任何提及。但是,在程序集 Microsoft.VisualStudio.Services.ExtensionManagement.Sdk.Server.dll 中有一个接口 Microsoft.VisualStudio.Services.ExtensionManagement.Sdk.Server.IContributionFilter,并且它有一个 Name 属性。 bin\Plugins\Microsoft.VisualStudio.Services.ExtensionManagement.Sdk.Plugins.dll:

中有派生的classes

专注于后者。名字是"Security"。看起来它支持以下属性:

如果您在贡献对象下的清单 JSON 中指定约束,至少它会通过 TFS 数据结构传播并显示在扩展脚本的 VSS.getContribution() 下。现在,关于安全检查的详细信息...

贡献限制就是答案。具体来说,"Security" 约束。它对 TFS 中的安全对象执行权限检查,如果当前用户不持有所需权限,则隐藏该命令。

在我的例子中,我会使用某个代理池作为 "this user is an admin" 条件的代理。在内部,池和队列上的角色分配被视为 ACL。池操作的命名空间 GUID 是 101EAE8C-1709-47F9-B228-0E476C35B3BA ("DistributedTask"),令牌格式是 "AgentPools/{PoolID}/"。对应于 Use+Administer Permissions+Manage+View 的访问掩码 27 对应于池管理员角色。

约束在清单中指定,在贡献对象下:

{
    "contributions": [
    {
        "id": "mycommand",
        "type": "ms.vss-web.action",
        "constraints": [
        {
            "name": "Security",
            "properties": {
                "namespaceId":"101EAE8C-1709-47F9-B228-0E476C35B3BA",
                "namespaceToken":"AgentPools/17/",
                "permission": 27
            }
        }],
        // More contribution stuff...
    }],
    // More extension stuff...
}

这种方法的缺点是我必须在扩展中硬编码池的 ID。 该扩展特定于我们特定的 TFS 实例。它对我有用,它是一个内部扩展,我不打算发布或分发它,而且它已经有大量的依赖项关于我们的 TFS 设置的细节。

当然,所有这些都完全没有记录在案,随时可能崩溃。但话又说回来,很少有 TFS 的 API 表面 记录。


清单中还有 restrictedTo 参数,这是最近添加的,在主要贡献清单文档中没有提到。这似乎是为了限制未授权用户的访问,与我的情况有些不同。


编辑:I wrote a blog post with some more info。除了Security,还有5个constraint 类.