tfs - 使 release def 上下文菜单项有条件地不可见
问题描述
TFS 2018u1。我正在为发布定义构建一个带有自定义上下文菜单命令的扩展。我希望其中一些有条件地不可见(根据当前用户的权限)。有什么办法可以隐藏它们?
故意不打电话VSS.register()
没有帮助;自定义命令仍然存在,只是什么都不做。
这不是安全措施,而是可用性问题(菜单越来越拥挤)。
编辑:在贡献数据结构中有一个名为constraints
. 它没有记录,不知道它来自哪里。应该是清单。我能找到的唯一提到的约束是在TFX 工具源中。显然,constraints
是清单 JSON 中的一个有效值(可能在贡献对象下),它应该是一个数组。一个假设,一个ContributionConstraint
对象。后者是有记录的。
根据文档,约束对象具有一个name
属性,该属性包含对IContributionFilter
类的引用。我在文档和 TypeScript 源代码中都找不到该类的任何提及。但是,Microsoft.VisualStudio.Services.ExtensionManagement.Sdk.Server.IContributionFilter
在 assembly 中有一个接口Microsoft.VisualStudio.Services.ExtensionManagement.Sdk.Server.dll
,它有一个Name
属性。有派生类bin\Plugins\Microsoft.VisualStudio.Services.ExtensionManagement.Sdk.Plugins.dll
:
- ExtensionLicensedFilter
- 特征标志过滤器
- LegacyFeatureEnabledFilter
- 主动扩展过滤器
- 特征过滤器
- 安全过滤器
专注于后者。名称是“安全”。看起来它支持以下属性:
- namespaceId (GUID) - AKA 安全命名空间
- namespaceToken (string) - 安全对象令牌
- 权限 (int) - 位掩码,类似于 ACL 中的掩码
- allowSystemContext (可选布尔) - ???
- serviceInstanceType(可选 GUID)- 仅对 VSTS 重要
如果您在贡献对象下的清单 JSON 中指定约束,至少它会通过 TFS 数据结构传播并显示VSS.getContribution()
在扩展脚本的下方。现在,关于安全检查的详细信息......
解决方案
贡献约束就是答案。具体来说,“安全”约束。它对 TFS 中的安全对象执行权限检查,如果当前用户没有所需的权限,则隐藏命令。
就我而言,我会使用某个代理池作为“此用户是管理员”条件的代理。在内部,池和队列上的角色分配被视为 ACL。池操作的命名空间 GUID 为 101EAE8C-1709-47F9-B228-0E476C35B3BA(“DistributedTask”),令牌格式为“AgentPools/{PoolID}/”。对应于 的访问掩码 27Use+Administer Permissions+Manage+View
是与池管理员角色对应的掩码。
约束在清单中的贡献对象下指定:
{
"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
参数,这是最近添加的,在主要贡献清单文档中未提及。这似乎是为了限制对未经授权的用户的访问,与我的情况有些不同。
编辑:我写了一篇包含更多信息的博客文章。除了 Security 之外,还有 5 个约束类。
推荐阅读
- hadoop - Hadoop DataNode 未在从机中运行
- r - 根据计算多列中的非 NA 值创建新列
- visual-studio-code - 如何使用 Visual Studio Code 添加和配置 Web 性能和负载测试?
- mysql - 在node.js、express和jade中使用mysql值填充选择菜单
- servicestack - 在 NETStandard Assembly 中使用哪个版本的 ServiceStack?
- ruby-on-rails - Heroku:无法通过 Bundler 安装 gem - 无法部署到 Heroku
- javascript - 如何使用 url 形式的编码结构体发出请求?
- java - FireBase 身份验证错误与意图
- android - 如何通过蓝牙处理语音命令意图?
- bash - 使用 awk 从第 1 列获取唯一值,并对第 2 列中的对应值求和?