Skip to content

Per-widget-template authorization via provider pattern (mirrors Actions)#72

Draft
Copilot wants to merge 4 commits intomainfrom
copilot/add-permissions-for-widget-templates
Draft

Per-widget-template authorization via provider pattern (mirrors Actions)#72
Copilot wants to merge 4 commits intomainfrom
copilot/add-permissions-for-widget-templates

Conversation

Copy link

Copilot AI commented Mar 13, 2026

Each widget template needed its own specific authorization(s) instead of a single global set. The implementation now mirrors exactly how ActionsProvider handles per-action permissions.

Changes

  • IWidgetTemplateAuthorizationsProvider — replaced sync Definitions property with Task<IEnumerable<WidgetTemplateInfos>> FilterAsync(IEnumerable<WidgetTemplateInfos>). Permission logic lives in the provider, not the handler.
  • WidgetTemplatesQueryHandler — simplified to fetch from DB then delegate to provider.FilterAsync(). Removed IPermissionProvider injection from the handler.
  • Foundation default WidgetTemplateAuthorizationsProvider — identity pass-through (no restrictions).
  • Template WidgetTemplateAuthorizationsProvider — injects IPermissionProvider, implements FilterAsync using per-template WidgetTemplateDefinition entries. Uses HashSet<string> for O(1) permission lookups.
  • WidgetTemplateDefinition — kept in Foundation.Extension.Core.Models as a shared helper for template implementations.

Usage (template-side)

public class WidgetTemplateAuthorizationsProvider : IWidgetTemplateAuthorizationsProvider
{
    private readonly IPermissionProvider _permissionProvider;

    public WidgetTemplateAuthorizationsProvider(IPermissionProvider permissionProvider)
        => _permissionProvider = permissionProvider;

    private static IEnumerable<WidgetTemplateDefinition> Definitions => new List<WidgetTemplateDefinition>()
    {
        new WidgetTemplateDefinition()
        {
            Code = "ui.widgets.my-widget",
            Authorizations = new List<string>() { Authorizations.MY_PERMISSION }
        }
    };

    public async Task<IEnumerable<WidgetTemplateInfos>> FilterAsync(IEnumerable<WidgetTemplateInfos> widgetTemplates)
    {
        if (!Definitions.Any()) return widgetTemplates;
        var permissions = new HashSet<string>(await _permissionProvider.GetPermissions());
        return widgetTemplates.Where(wt => HasPermissions(wt, permissions));
    }
    // ...
}

Templates with no definition entry, or with an empty Authorizations list, are accessible to all users.

Original prompt

/create-agent Fait en sorte que les widget templates proposé par une extension soient soumis à des permissions de l'extension.
Pour cela il faudra utiliser le PermissionsMiddleware qui est déjà implémenter par la plateforme. Attention. La tache ne s'nnonce pas facile car la WidgetTemplatesQuery qui spécifie normalement les Authorizations nécessaires se trouve dans la librairie foundation extension core tandis que ce que nous voulons c'est pouvoir spécifier les permissions nécessaires dans l'extension elle même (idéalement proche du widget-teamplate-dto.json).

Nous n'avions pas réussi à trouver de solution propre pour laisser le handler dans la librairie tout en ayant la définition des permissions pour la partie Action. C'est pour cette raison que le actionController est dans l'extension XXXXX. Si tu ne trouves pas de bonne solution propre fait la même chose que les actions.

Created from VS Code.


💡 You can make Copilot smarter by setting up custom instructions, customizing its development environment and configuring Model Context Protocol (MCP) servers. Learn more Copilot coding agent tips in the docs.

… permissions for widget templates

Co-authored-by: peyronth <76468954+peyronth@users.noreply.github.com>
Copilot AI changed the title [WIP] Add permissions for widget templates from extension Add extension-defined permission support for widget templates Mar 13, 2026
Copilot AI requested a review from peyronth March 13, 2026 08:22
…ions

Co-authored-by: peyronth <76468954+peyronth@users.noreply.github.com>
Copilot AI changed the title Add extension-defined permission support for widget templates Per-widget-template permission support Mar 13, 2026
… FilterAsync in provider)

Co-authored-by: peyronth <76468954+peyronth@users.noreply.github.com>
Copilot AI changed the title Per-widget-template permission support Per-widget-template authorization via provider pattern (mirrors Actions) Mar 13, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants