使 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
- ExtensionLicensedFilter
- FeatureFlagFilter
- LegacyFeatureEnabledFilter
- ActiveExtensionFilter
- 特征过滤器
- 安全过滤器
专注于后者。名字是"Security"。看起来它支持以下属性:
- namespaceId (GUID) - 又名安全命名空间
- namespaceToken(字符串)- 安全对象令牌
- permission (int) - 位掩码,类似于 ACL
- allowSystemContext(可选布尔值)- ???
- serviceInstanceType(可选 GUID)- 仅对 VSTS 重要
如果您在贡献对象下的清单 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 类.
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
:
- ExtensionLicensedFilter
- FeatureFlagFilter
- LegacyFeatureEnabledFilter
- ActiveExtensionFilter
- 特征过滤器
- 安全过滤器
专注于后者。名字是"Security"。看起来它支持以下属性:
- namespaceId (GUID) - 又名安全命名空间
- namespaceToken(字符串)- 安全对象令牌
- permission (int) - 位掩码,类似于 ACL
- allowSystemContext(可选布尔值)- ???
- serviceInstanceType(可选 GUID)- 仅对 VSTS 重要
如果您在贡献对象下的清单 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 类.