Page 9816 Permission Set by User

App
Base Application
Namespace
System.Security.AccessControl
Versions
17-28
Source table
2000000167

Procedures, 1

Versions171819202122232425262728

Source29

Source in 29

src/Layers/W1/BaseApp/System/Permissions/PermissionSetbyUser.Page.al473 lines, Copyright (c) Microsoft Corporation. MIT

namespace System.Security.AccessControl;

using System.Environment;
using System.Security.User;

page 9816 "Permission Set by User"
{
    ApplicationArea = Basic, Suite;
    Caption = 'Permission Set by User';
    AboutTitle = 'About Permission Set by User';
    AboutText = 'Get an overview of how permission sets are assigned to your users within a company. Tip: If you go into analysis mode, you can analyze data in other ways than what you see in the list.';
    DataCaptionExpression = SelectedCompany;
    DeleteAllowed = false;
    InsertAllowed = false;
    LinksAllowed = false;
    ModifyAllowed = false;
    UsageCategory = Lists;
    PageType = Worksheet;
    Permissions = TableData "Access Control" = rimd;
    SourceTable = "Aggregate Permission Set";

    layout
    {
        area(content)
        {
            group(General)
            {
                Caption = 'General';
                field(SelectedCompany; SelectedCompany)
                {
                    ApplicationArea = Basic, Suite;
                    Caption = 'Company Name';
                    TableRelation = Company;
                    ToolTip = 'Specifies the name of the company.';

                    trigger OnValidate()
                    begin
                        UpdateCompany();
                    end;
                }
                field(ShowDomainName; ShowDomainName)
                {
                    ApplicationArea = Basic, Suite;
                    Caption = 'Show Domain Name';
                    ToolTip = 'Specifies the domain name together with the user name for Windows user accounts, for example, DOMAIN\UserName.';

                    trigger OnValidate()
                    begin
                        CurrPage.Update(false);
                    end;
                }
            }
            repeater(Group)
            {
                Caption = 'Permission Set';
                field("Role ID"; Rec."Role ID")
                {
                    ApplicationArea = Basic, Suite;
                    Caption = 'Permission Set';
                    ToolTip = 'Specifies the permission set.';
                }
                field(Name; Rec.Name)
                {
                    ApplicationArea = Basic, Suite;
                    ToolTip = 'Specifies the name of the record.';
                }
                field("App ID"; Rec."App ID")
                {
                    ApplicationArea = Basic, Suite;
                    Caption = 'Extension ID';
                    ToolTip = 'Specifies the unique identifier for the extension. A unique identifier will be generated if a value is not provided.';
                    Visible = false;
                }
                field("App Name"; Rec."App Name")
                {
                    ApplicationArea = Basic, Suite;
                    Caption = 'Extension Name';
                    ToolTip = 'Specifies the name of the extension.';
                }
                field(AllUsersHavePermission; AllUsersHavePermission)
                {
                    ApplicationArea = Basic, Suite;
                    Caption = 'All Users';
                    ToolTip = 'Specifies that the permission set will be assigned to all users.';

                    trigger OnValidate()
                    begin
                        SetColumnPermission(0, AllUsersHavePermission);
                        CurrPage.Update(false);
                    end;
                }
                field(Column1; UserHasPermissionSet[1])
                {
                    ApplicationArea = All;
                    CaptionClass = '3,' + UserNameCode[1];
                    Visible = NoOfRecords >= 1;

                    trigger OnValidate()
                    begin
                        SetColumnPermission(1, UserHasPermissionSet[1]);
                    end;
                }
                field(Column2; UserHasPermissionSet[2])
                {
                    ApplicationArea = All;
                    CaptionClass = '3,' + UserNameCode[2];
                    Visible = NoOfRecords >= 2;

                    trigger OnValidate()
                    begin
                        SetColumnPermission(2, UserHasPermissionSet[2]);
                    end;
                }
                field(Column3; UserHasPermissionSet[3])
                {
                    ApplicationArea = All;
                    CaptionClass = '3,' + UserNameCode[3];
                    Visible = NoOfRecords >= 3;

                    trigger OnValidate()
                    begin
                        SetColumnPermission(3, UserHasPermissionSet[3]);
                    end;
                }
                field(Column4; UserHasPermissionSet[4])
                {
                    ApplicationArea = All;
                    CaptionClass = '3,' + UserNameCode[4];
                    Visible = NoOfRecords >= 4;

                    trigger OnValidate()
                    begin
                        SetColumnPermission(4, UserHasPermissionSet[4]);
                    end;
                }
                field(Column5; UserHasPermissionSet[5])
                {
                    ApplicationArea = All;
                    CaptionClass = '3,' + UserNameCode[5];
                    Visible = NoOfRecords >= 5;

                    trigger OnValidate()
                    begin
                        SetColumnPermission(5, UserHasPermissionSet[5]);
                    end;
                }
                field(Column6; UserHasPermissionSet[6])
                {
                    ApplicationArea = All;
                    CaptionClass = '3,' + UserNameCode[6];
                    Visible = NoOfRecords >= 6;

                    trigger OnValidate()
                    begin
                        SetColumnPermission(6, UserHasPermissionSet[6]);
                    end;
                }
                field(Column7; UserHasPermissionSet[7])
                {
                    ApplicationArea = All;
                    CaptionClass = '3,' + UserNameCode[7];
                    Visible = NoOfRecords >= 7;

                    trigger OnValidate()
                    begin
                        SetColumnPermission(7, UserHasPermissionSet[7]);
                    end;
                }
                field(Column8; UserHasPermissionSet[8])
                {
                    ApplicationArea = All;
                    CaptionClass = '3,' + UserNameCode[8];
                    Visible = NoOfRecords >= 8;

                    trigger OnValidate()
                    begin
                        SetColumnPermission(8, UserHasPermissionSet[8]);
                    end;
                }
                field(Column9; UserHasPermissionSet[9])
                {
                    ApplicationArea = All;
                    CaptionClass = '3,' + UserNameCode[9];
                    Visible = NoOfRecords >= 9;

                    trigger OnValidate()
                    begin
                        SetColumnPermission(9, UserHasPermissionSet[9]);
                    end;
                }
                field(Column10; UserHasPermissionSet[10])
                {
                    ApplicationArea = All;
                    CaptionClass = '3,' + UserNameCode[10];
                    Visible = NoOfRecords >= 10;

                    trigger OnValidate()
                    begin
                        SetColumnPermission(10, UserHasPermissionSet[10]);
                    end;
                }
            }
        }
        area(factboxes)
        {
            part(ExpandedPermissions; "Expanded Permissions FactBox")
            {
                ApplicationArea = Basic, Suite;
                Caption = 'Permissions';
                Editable = false;
                SubPageLink = "Role ID" = field("Role ID"),
                              "App ID" = field("App ID");
            }
        }
    }

    actions
    {
        area(navigation)
        {
            action(Permissions)
            {
                ApplicationArea = Basic, Suite;
                Caption = 'Permissions';
                Image = Permission;
                ToolTip = 'View or edit which feature objects that users need to access and set up the related permissions in permission sets that you can assign to the users of the database.';

                trigger OnAction()
                var
                    PermissionSetRelation: Codeunit "Permission Set Relation";
                begin
                    PermissionSetRelation.OpenPermissionSetPage(Rec.Name, Rec."Role ID", Rec."App ID", Rec.Scope);
                end;
            }
        }
        area(processing)
        {
            action(CopyPermissionSet)
            {
                ApplicationArea = Basic, Suite;
                Caption = 'Copy Permission Set';
                Ellipsis = true;
                Image = Copy;
                ToolTip = 'Create a copy of the selected permission set with a name that you specify.';

                trigger OnAction()
                var
                    AggregatePermissionSet: Record "Aggregate Permission Set";
                begin
                    AggregatePermissionSet.SetRange(Scope, Rec.Scope);
                    AggregatePermissionSet.SetRange("App ID", Rec."App ID");
                    AggregatePermissionSet.SetRange("Role ID", Rec."Role ID");

                    REPORT.RunModal(REPORT::"Copy Permission Set", true, true, AggregatePermissionSet);
                end;
            }
            action(AllColumnsLeft)
            {
                ApplicationArea = Basic, Suite;
                Caption = 'All Columns Left';
                Image = PreviousSet;
                ToolTip = 'Jump to the left-most column.';

                trigger OnAction()
                begin
                    PermissionPagesMgt.AllColumnsLeft();
                end;
            }
            action(ColumnLeft)
            {
                ApplicationArea = Basic, Suite;
                Caption = 'Column Left';
                Image = PreviousRecord;
                ToolTip = 'Jump one column to the left.';

                trigger OnAction()
                begin
                    PermissionPagesMgt.ColumnLeft();
                end;
            }
            action(ColumnRight)
            {
                ApplicationArea = Basic, Suite;
                Caption = 'Column Right';
                Image = NextRecord;
                ToolTip = 'Jump one column to the right.';

                trigger OnAction()
                begin
                    PermissionPagesMgt.ColumnRight();
                end;
            }
            action(AllColumnsRight)
            {
                ApplicationArea = Basic, Suite;
                Caption = 'All Columns Right';
                Image = NextSet;
                ToolTip = 'Jump to the right-most column.';

                trigger OnAction()
                begin
                    PermissionPagesMgt.AllColumnsRight();
                end;
            }
        }
        area(Promoted)
        {
            group(Category_Process)
            {
                Caption = 'Process', Comment = 'Generated from the PromotedActionCategories property index 1.';

                actionref(Permissions_Promoted; Permissions)
                {
                }
                actionref(CopyPermissionSet_Promoted; CopyPermissionSet)
                {
                }
            }
            group(Category_Report)
            {
                Caption = 'Report', Comment = 'Generated from the PromotedActionCategories property index 2.';
            }
            group(Category_Category4)
            {
                Caption = 'Browse', Comment = 'Generated from the PromotedActionCategories property index 3.';

                actionref(AllColumnsLeft_Promoted; AllColumnsLeft)
                {
                }
                actionref(ColumnLeft_Promoted; ColumnLeft)
                {
                }
                actionref(ColumnRight_Promoted; ColumnRight)
                {
                }
                actionref(AllColumnsRight_Promoted; AllColumnsRight)
                {
                }
            }
        }
    }

    trigger OnAfterGetCurrRecord()
    begin
        FindUsers();
    end;

    trigger OnAfterGetRecord()
    begin
        FindUsers();
    end;

    trigger OnInit()
    begin
        PermissionPagesMgt.DisallowEditingPermissionSetsForNonAdminUsers();
    end;

    trigger OnOpenPage()
    var
        User: Record User;
    begin
        SelectedCompany := CompanyName();
        UpdateCompany();
        UserSelection.FilterSystemUserAndGroupUsers(User);
        NoOfRecords := User.Count();
        PermissionPagesMgt.Init(NoOfRecords, ArrayLen(UserNameCode));
    end;

    protected var
        AllUsersHavePermission: Boolean;

    var
        Company: Record Company;
        PermissionPagesMgt: Codeunit "Permission Pages Mgt.";
        UserSelection: Codeunit "User Selection";
        UserSecurityIDArr: array[10] of Guid;
        NoOfRecords: Integer;
        SelectedCompany: Text[30];
        ShowDomainName: Boolean;
        UserNameCode: array[10] of Code[50];
        UserHasPermissionSet: array[10] of Boolean;

    protected procedure SetUserPermission(UserSecurityID: Guid; UserHasPermission: Boolean)
    var
        AccessControl: Record "Access Control";
    begin
        if AccessControl.Get(UserSecurityID, Rec."Role ID", '', Rec.Scope, Rec."App ID") or
           AccessControl.Get(UserSecurityID, Rec."Role ID", Company.Name, Rec.Scope, Rec."App ID")
        then begin
            if not UserHasPermission then
                AccessControl.Delete(true);
            exit;
        end;
        if not UserHasPermission then
            exit;
        AccessControl.Init();
        AccessControl."User Security ID" := UserSecurityID;
        AccessControl."Role ID" := Rec."Role ID";
        AccessControl."Company Name" := Company.Name;
        AccessControl.Scope := Rec.Scope;
        AccessControl."App ID" := Rec."App ID";
        AccessControl.Insert();
    end;

    local procedure FindUsers()
    var
        User: Record User;
        i: Integer;
        j: Integer;
    begin
        Clear(UserNameCode);
        Clear(UserHasPermissionSet);
        User.SetCurrentKey("User Name");
        AllUsersHavePermission := true;
        UserSelection.FilterSystemUserAndGroupUsers(User);
        if User.FindSet() then
            repeat
                i += 1;
                if PermissionPagesMgt.IsInColumnsRange(i) then begin
                    UserSecurityIDArr[i - PermissionPagesMgt.GetOffset()] := User."User Security ID";
                    j := 0;
                    if not ShowDomainName then begin
                        j := StrPos(User."User Name", '\');
                        if j < 0 then
                            j := 0;
                    end;
                    UserNameCode[i - PermissionPagesMgt.GetOffset()] := CopyStr(User."User Name", j + 1, MaxStrLen(UserNameCode[1]));
                    UserHasPermissionSet[i - PermissionPagesMgt.GetOffset()] := UserHasPermission(Rec, User);
                    AllUsersHavePermission := AllUsersHavePermission and UserHasPermissionSet[i - PermissionPagesMgt.GetOffset()];
                end else
                    if AllUsersHavePermission then
                        AllUsersHavePermission := UserHasPermission(Rec, User);
            until (User.Next() = 0) or (PermissionPagesMgt.IsPastColumnRange(i) and not AllUsersHavePermission);
    end;

    local procedure UserHasPermission(var AggregatePermissionSet: Record "Aggregate Permission Set"; var User: Record User): Boolean
    var
        AccessControl: Record "Access Control";
    begin
        AccessControl.SetRange("User Security ID", User."User Security ID");
        AccessControl.SetRange("Role ID", AggregatePermissionSet."Role ID");
        AccessControl.SetFilter("Company Name", '%1|%2', '', Company.Name);
        AccessControl.SetRange(Scope, AggregatePermissionSet.Scope);
        AccessControl.SetRange("App ID", AggregatePermissionSet."App ID");
        exit(not AccessControl.IsEmpty);
    end;

    local procedure SetColumnPermission(ColumnNo: Integer; UserHasPermission: Boolean)
    var
        User: Record User;
    begin
        if ColumnNo > 0 then begin
            SetUserPermission(UserSecurityIDArr[ColumnNo], UserHasPermission);
            AllUsersHavePermission := AllUsersHavePermission and UserHasPermission;
        end else begin
            UserSelection.FilterSystemUserAndGroupUsers(User);
            if User.FindSet() then
                repeat
                    SetUserPermission(User."User Security ID", UserHasPermission);
                until User.Next() = 0;
        end;
    end;

    local procedure UpdateCompany()
    begin
        Company.Name := SelectedCompany;
        if SelectedCompany <> '' then begin
            Company.Find('=<>');
            SelectedCompany := Company.Name;
        end;
        CurrPage.Update(false);
    end;
}