Page 1263 Certificate

App
Base Application
Namespace
System.Security.Encryption
Versions
17-28
Source table
1262

Versions171819202122232425262728

Source29

Source in 29

src/Layers/W1/BaseApp/System/IsolatedStorage/Certificate.Page.al264 lines, Copyright (c) Microsoft Corporation. MIT

// ------------------------------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.
// ------------------------------------------------------------------------------------------------
namespace System.Security.Encryption;

page 1263 Certificate
{
    Caption = 'Certificate';
    PageType = Card;
    SourceTable = "Isolated Certificate";

    layout
    {
        area(content)
        {
            group(General)
            {
                Caption = 'General';
                field(Name; Rec.Name)
                {
                    ApplicationArea = Basic, Suite;
                    ShowMandatory = true;
                    ToolTip = 'Specifies the name of the certificate.';
                }
                group(Control16)
                {
                    ShowCaption = false;
                    Visible = IsPasswordRequired;
                    field(Password; CertPassword)
                    {
                        ApplicationArea = Basic, Suite;
                        ShowMandatory = true;
                        ToolTip = 'Specifies the password for the certificate.';
                        Caption = 'Password';

                        trigger OnValidate()
                        begin
                            PasswordNotification.Recall();
                            CertificateManagement.SetCertPassword(CertPassword);
                            if CertificateManagement.VerifyCert(Rec) then begin
                                if Rec.IsCertificateExpired() then
                                    HandleExpiredCert()
                                else begin
                                    IsShowCertInfo := true;
                                    IsUploadedCertValid := not IsNewRecord;
                                end;

                                CurrPage.Update();
                            end else
                                Error(CertWrongPasswordErr);
                        end;
                    }
                }
                field(Scope; Rec.Scope)
                {
                    ApplicationArea = Basic, Suite;
                    Editable = IsNewRecord;
                    ToolTip = 'Specifies the availability of the certificate. Company gives all users in this specific company access to the certificate. User gives access to a specific user in any company. Company and User gives access to a specific user in the specific company.';
                }
            }
            group("Certificate Information")
            {
                Caption = 'Certificate Information';
                Visible = IsShowCertInfo;
                field("Has Private Key"; Rec."Has Private Key")
                {
                    ApplicationArea = Basic, Suite;
                    ToolTip = 'Specifies whether the certificate has a private key.';
                }
                field(ThumbPrint; Rec.ThumbPrint)
                {
                    ApplicationArea = Basic, Suite;
                    Caption = 'Thumbprint';
                    ToolTip = 'Specifies the certificate thumbprint.';
                }
                field("Expiry Date"; Rec."Expiry Date")
                {
                    ApplicationArea = Basic, Suite;
                    ToolTip = 'Specifies the date on which the certificate will expire.';
                }
                field("Issued By"; Rec."Issued By")
                {
                    ApplicationArea = Basic, Suite;
                    ToolTip = 'Specifies the certificate authority that issued the certificate.';
                }
                field("Issued To"; Rec."Issued To")
                {
                    ApplicationArea = Basic, Suite;
                    ToolTip = 'Specifies the person, organization, or domain that the certificate was issued to.';
                }
            }
        }
    }

    actions
    {
        area(processing)
        {
            action("Upload Cerificate")
            {
                ApplicationArea = Basic, Suite;
                ToolTip = 'Upload a new certificate file for the certificate. Typically, you use this when a certificate will expire soon.';
                Caption = 'Upload Certificate';

                trigger OnAction()
                begin
                    RecallNotifications();
                    IsolatedCertificate := Rec;
                    CertPassword := '';
                    CertificateManagement.SetCertPassword(CertPassword);

                    CheckEncryption();

                    if not CertificateManagement.UploadAndVerifyCert(Rec) then begin
                        IsShowCertInfo := false;
                        HandleRequirePassword();
                    end else begin
                        IsPasswordRequired := false;
                        IsShowCertInfo := true;
                        if Rec.IsCertificateExpired() then begin
                            HandleExpiredCert();

                            Rec := IsolatedCertificate;
                            if Rec.ThumbPrint = '' then
                                IsShowCertInfo := false;
                        end;
                    end;

                    CurrPage.Update();
                end;
            }
        }
        area(Promoted)
        {
            group(Category_Process)
            {
                Caption = 'Process';

                actionref("Upload Cerificate_Promoted"; "Upload Cerificate")
                {
                }
            }
        }
    }

    trigger OnNewRecord(BelowxRec: Boolean)
    begin
        Rec := IsolatedCertificate;
    end;

    trigger OnOpenPage()
    begin
        if Rec.Code = '' then begin
            IsNewRecord := true;
            CheckEncryption();
            if not CertificateManagement.UploadAndVerifyCert(Rec) then
                HandleRequirePassword()
            else begin
                IsShowCertInfo := true;
                if Rec.IsCertificateExpired() then
                    HandleExpiredCert();
            end;

            IsolatedCertificate := Rec;
        end else
            if Rec.ThumbPrint <> '' then begin
                IsShowCertInfo := true;
                if Rec.IsCertificateExpired() then
                    NotfiyExpiredCert(CertHasExpiredMsg);
            end;
    end;

    trigger OnQueryClosePage(CloseAction: Action): Boolean
    begin
        if Rec.Code <> '' then
            Rec.TestField(Name);

        if IsNewRecord then
            Rec.SetScope();

        if (IsNewRecord or IsUploadedCertValid) and not IsExpired then
            SaveCertToIsolatedStorage();
    end;

    var
        IsolatedCertificate: Record "Isolated Certificate";
        CertificateManagement: Codeunit "Certificate Management";
        PasswordNotification: Notification;
        ExpiredNotification: Notification;
        IsNewRecord: Boolean;
        CertWrongPasswordErr: Label 'The password is not correct.';
        PasswordNotificationMsg: Label 'You must enter the password for this certificate.';
        ExpiredNewCertMsg: Label 'You cannot upload the certificate%1 because it is past its expiration date.', Comment = '%1=file name, e.g. Certfile.pfx';
        IsPasswordRequired: Boolean;
        CertHasExpiredMsg: Label 'The certificate has expired. To use the certificate you must upload a new certificate file.';
        IsExpired: Boolean;
        IsUploadedCertValid: Boolean;
        IsShowCertInfo: Boolean;
        [NonDebuggable]
        CertPassword: Text;

    local procedure ClearCertInfoFields()
    begin
        Clear(Rec."Expiry Date");
        Rec.ThumbPrint := '';
        Rec."Issued By" := '';
        Rec."Issued To" := '';
        Rec."Has Private Key" := false;
    end;

    local procedure SaveCertToIsolatedStorage()
    begin
        if IsUploadedCertValid then
            CertificateManagement.DeleteCertAndPasswordFromIsolatedStorage(Rec);
        CertificateManagement.SaveCertToIsolatedStorage(Rec);

        CertificateManagement.SetCertPassword(CertPassword);
        CertificateManagement.SavePasswordToIsolatedStorage(Rec);
    end;

    local procedure HandleRequirePassword()
    begin
        IsPasswordRequired := true;
        PasswordNotification.Message(PasswordNotificationMsg);
        PasswordNotification.Send();
    end;

    local procedure HandleExpiredCert()
    begin
        NotfiyExpiredCert(StrSubstNo(ExpiredNewCertMsg, ' ' + CertificateManagement.GetUploadedCertFileName()));
        if IsNewRecord then
            ClearCertInfoFields()
        else
            Rec := IsolatedCertificate;

        IsShowCertInfo := Rec.ThumbPrint <> '';
        IsPasswordRequired := false;
    end;

    local procedure NotfiyExpiredCert(Message: Text)
    begin
        IsExpired := true;
        ExpiredNotification.Message(Message);
        ExpiredNotification.Send();
    end;

    local procedure RecallNotifications()
    begin
        if ExpiredNotification.Recall() then;
        if PasswordNotification.Recall() then;
    end;

    local procedure CheckEncryption()
    var
        CryptographyManagement: Codeunit "Cryptography Management";
    begin
        if not CryptographyManagement.IsEncryptionEnabled() then
            if Confirm(CryptographyManagement.GetEncryptionIsNotActivatedQst()) then
                PAGE.RunModal(PAGE::"Data Encryption Management");
    end;
}