Сделать контекстное меню Release Def условно невидимым - PullRequest
0 голосов
/ 17 мая 2018

TFS 2018u1. Я строю расширение с помощью пользовательских команд контекстного меню для определений релизов. Мне бы хотелось, чтобы некоторые из них были условно невидимыми (на правах текущего пользователя). Есть ли способ их скрыть?

Умышленно не звонить VSS.register() не помогает; пользовательские команды все еще там, просто ничего не делайте.

Это не мера безопасности, это удобство использования (меню переполняется).

РЕДАКТИРОВАТЬ: в структуре данных Contribution есть свойство с именем constraints. Это не задокументировано, понятия не имею, откуда оно. Вероятно, манифест. Единственное упоминание об ограничениях, которые я смог найти, - в источниках инструмента TFX . По-видимому, constraints является допустимым значением в манифесте JSON (возможно, под объектом вклада), и это должен быть массив. Предполагается, что один из ContributionConstraint объектов. Последний вид документирован.

Объект ограничения имеет свойство name, которое, согласно документам, содержит ссылку на класс IContributionFilter. Я не смог найти упоминаний об этом классе ни в документах, ни в источниках TypeScript. Однако в сборке 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
  • FeatureFilter
  • SecurityFilter

Концентрируясь на последнем. Название «Безопасность». Похоже, он поддерживает следующие свойства:

  • namespaceId (GUID) - Пространство имен безопасности AKA
  • namespaceToken (строка) - токен защищаемого объекта
  • разрешение (int) - битовая маска, аналогичная маске в ACL
  • allowSystemContext (необязательно bool) - ???
  • serviceInstanceType (необязательный GUID) - имеет значение только для VSTS

Если вы укажете ограничение в манифесте JSON для объекта вклада, то по крайней мере оно распространяется через структуры данных TFS и отображается в VSS.getContribution() в скрипте расширения. Теперь перейдем к деталям проверки безопасности ...

1 Ответ

0 голосов
/ 18 мая 2018

Вклад ограничения являются ответом.В частности, ограничение «Безопасность».Он выполняет проверку разрешений для защищаемого объекта в TFS и скрывает команду, если текущий пользователь не имеет требуемого разрешения.

В моем случае я бы использовал определенный пул агентов в качестве прокси дляусловие "этот пользователь является администратором".Внутренне назначения ролей в пулах и очередях обрабатываются как ACL.GUID пространства имен для действий пула: 101EAE8C-1709-47F9-B228-0E476C35B3BA («DistributedTask»), формат токена - «AgentPools / {PoolID} /».Маска доступа 27, соответствующая Use+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...
}
* 1008Недостатком этого подхода является то, что мне нужно жестко закодировать идентификатор пула в расширении. Расширение стало специфичным для нашего конкретного экземпляра TFS. Это работает для меня, хотя, это внутреннее расширение, я не планирую публиковать или распространять его, и у него уже есть тонна зависимостей от спецификинаша настройка TFS.

Естественно, все это совершенно недокументировано и может сломаться в любое время.Но опять же, очень мало API-поверхности TFS документировано .


В манифесте также есть параметр restrictedTo, который является недавним добавлением и не упоминается вОсновной вклад, проявленный док.Это похоже на ограничение доступа посторонних пользователей, несколько отличающееся от моего случая.


РЕДАКТИРОВАТЬ: Я написал сообщение в блоге с дополнительной информацией .Помимо безопасности, есть еще 5 классов ограничений.

...