Table 9009 Permission Set Buffer, source in 29

Source29

src/Layers/W1/BaseApp/System/Permissions/PermissionSetBuffer.Table.al145 lines, Copyright (c) Microsoft Corporation. MIT

namespace System.Security.AccessControl;

table 9009 "Permission Set Buffer"
{
    Caption = 'Permission Set Buffer';
    DataPerCompany = false;
    ReplicateData = false;
    DataClassification = CustomerContent;

    fields
    {
        field(1; Scope; Option)
        {
            Caption = 'Scope';
            DataClassification = SystemMetadata;
            OptionCaption = 'System,Tenant';
            OptionMembers = System,Tenant;
        }
        field(2; "App ID"; Guid)
        {
            Caption = 'App ID';
            DataClassification = SystemMetadata;
        }
        field(3; "Role ID"; Code[20])
        {
            Caption = 'Role ID';
            DataClassification = SystemMetadata;
            ToolTip = 'Specifies the name of the permission set.';
        }
        field(4; Name; Text[30])
        {
            Caption = 'Name';
            DataClassification = SystemMetadata;
            ToolTip = 'Specifies the description of the record.';
        }
        field(5; "App Name"; Text[250])
        {
            Caption = 'App Name';
            DataClassification = SystemMetadata;
            ToolTip = 'Specifies the name of the extension.';
        }
        field(6; Type; Option)
        {
            Caption = 'Type';
            DataClassification = SystemMetadata;
            OptionCaption = 'User-Defined,Extension,System';
            OptionMembers = "User-Defined",Extension,System;
            ToolTip = 'Specifies if the permission set is defined by your organization, the base application, or an extension. You can only edit or delete permission sets that you have created.';
        }
    }

    keys
    {
        key(Key1; Type, "Role ID")
        {
            Clustered = true;
        }
    }

    fieldgroups
    {
    }

    var
        IsTempErr: Label '%1 should only be used as a temporary record.', Comment = '%1 table caption';
        CannotRenameTenantPermissionSetHavingUsageErr: Label 'You cannot rename a tenant permission set while it is used elsewhere, for example, in permission settings for a user or security group.';
        PermissionSetCategoryTxt: Label 'AL PermissionSet', Locked = true;
        DuplicatePermissionSetTelemetryTxt: Label 'Two apps define a permission set with the same type and role: %1, %2. Apps: %3, %4', Comment = '%1 = type, %2 = role, %3 = first app name, %4 = second app name', Locked = true;

    procedure SetType()
    begin
        Type := GetType(Scope, "App ID");
    end;

    procedure GetType(ScopeOpt: Option; AppID: Guid): Integer
    begin
        case true of
            (ScopeOpt = Scope::Tenant) and IsNullGuid(AppID):
                exit(Type::"User-Defined");
            ScopeOpt = Scope::Tenant:
                exit(Type::Extension);
            else
                exit(Type::System);
        end;
    end;

    procedure FillRecordBuffer()
    var
        AggregatePermissionSet: Record "Aggregate Permission Set";
        PermissionSetBuffer: Record "Permission Set Buffer";
    begin
        if not IsTemporary then
            Error(IsTempErr, TableCaption);

        PermissionSetBuffer.CopyFilters(Rec);
        Reset();
        DeleteAll();

        if AggregatePermissionSet.FindSet() then
            repeat
                // do not show permission sets for hidden extensions                
                if StrPos(UpperCase(AggregatePermissionSet."App Name"), UpperCase('_Exclude_')) <> 1 then begin
                    Init();
                    "App ID" := AggregatePermissionSet."App ID";
                    "Role ID" := AggregatePermissionSet."Role ID";
                    Name := AggregatePermissionSet.Name;
                    "App Name" := AggregatePermissionSet."App Name";
                    Scope := AggregatePermissionSet.Scope;
                    SetType();

                    if Get(Type, "Role ID") then // If permission set is already added to the permission set buffer only add the one
                        Session.LogMessage('0000EF6', StrSubstNo(DuplicatePermissionSetTelemetryTxt, Type, "Role ID", "App Name", AggregatePermissionSet."App Name"), Verbosity::Error, DataClassification::SystemMetadata, TelemetryScope::ExtensionPublisher, 'Category', PermissionSetCategoryTxt)
                    else
                        Insert();
                end;
            until AggregatePermissionSet.Next() = 0;

        CopyFilters(PermissionSetBuffer);
    end;

    [Scope('OnPrem')]
    procedure RenameTenantPermissionSet()
    var
        TenantPermissionSet: Record "Tenant Permission Set";
        AccessControl: Record "Access Control";
        PermissionPagesMgt: Codeunit "Permission Pages Mgt.";
    begin
        if xRec."Role ID" = '' then
            exit;
        if xRec."Role ID" = "Role ID" then
            exit;
        PermissionPagesMgt.DisallowEditingPermissionSetsForNonAdminUsers();
        if Type = Type::"User-Defined" then begin
            AccessControl.SetRange("App ID", xRec."App ID");
            AccessControl.SetRange("Role ID", xRec."Role ID");
            if not AccessControl.IsEmpty() then
                Error(CannotRenameTenantPermissionSetHavingUsageErr);

            TenantPermissionSet.Get(xRec."App ID", xRec."Role ID");
            TenantPermissionSet.Rename(xRec."App ID", "Role ID");
        end;
    end;
}