Codeunit 1755 Privacy Subscribers

App
Base Application
Namespace
System.Privacy
Versions
17-28

Versions171819202122232425262728

Source29

Source in 29

src/Layers/W1/BaseApp/PrivacySubscribers.Codeunit.al146 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.Privacy;

using Microsoft.CRM.Contact;
using Microsoft.CRM.Team;
using Microsoft.HumanResources.Employee;
using Microsoft.Projects.Resources.Resource;
using Microsoft.Purchases.Vendor;
using Microsoft.Sales.Customer;
using Microsoft.Utilities;
using System.Apps;
using System.Reflection;
using System.Security.AccessControl;
using System.Security.User;

codeunit 1755 "Privacy Subscribers"
{

    trigger OnRun()
    begin
    end;

    var
        CustomerFilterTxt: Label 'WHERE(Partner Type=FILTER(Person))', Locked = true;
        VendorFilterTxt: Label 'WHERE(Partner Type=FILTER(Person))', Locked = true;
        ContactFilterTxt: Label 'WHERE(Type=FILTER(Person))', Locked = true;
        ResourceFilterTxt: Label 'WHERE(Type=FILTER(Person))', Locked = true;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Data Classification Mgt.", 'OnCreateEvaluationData', '', false, false)]
    local procedure CreateEvaluationData()
    var
        DataClassificationEvalData: Codeunit "Data Classification Eval. Data";
    begin
        DataClassificationEvalData.CreateEvaluationData();
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Data Classification Mgt.", 'OnGetDataPrivacyEntities', '', false, false)]
    local procedure OnGetDataPrivacyEntitiesSubscriber(var DataPrivacyEntities: Record "Data Privacy Entities")
    var
        DummyCustomer: Record Customer;
        DummyVendor: Record Vendor;
        DummyContact: Record Contact;
        DummyResource: Record Resource;
        DummyUser: Record User;
        DummyEmployee: Record Employee;
        DummySalespersonPurchaser: Record "Salesperson/Purchaser";
        DataClassificationMgt: Codeunit "Data Classification Mgt.";
    begin
        DataClassificationMgt.InsertDataPrivacyEntity(DataPrivacyEntities, DATABASE::Customer, PAGE::"Customer List",
          DummyCustomer.FieldNo("No."), CustomerFilterTxt, DummyCustomer.FieldNo("Privacy Blocked"));
        DataClassificationMgt.InsertDataPrivacyEntity(DataPrivacyEntities, DATABASE::Vendor, PAGE::"Vendor List",
          DummyVendor.FieldNo("No."), VendorFilterTxt, DummyVendor.FieldNo("Privacy Blocked"));
        DataClassificationMgt.InsertDataPrivacyEntity(DataPrivacyEntities, DATABASE::"Salesperson/Purchaser",
          PAGE::"Salespersons/Purchasers", DummySalespersonPurchaser.FieldNo(Code), ContactFilterTxt,
          DummySalespersonPurchaser.FieldNo("Privacy Blocked"));
        DataClassificationMgt.InsertDataPrivacyEntity(DataPrivacyEntities, DATABASE::Contact, PAGE::"Contact List",
          DummyContact.FieldNo("No."), ContactFilterTxt, DummyContact.FieldNo("Privacy Blocked"));
        DataClassificationMgt.InsertDataPrivacyEntity(DataPrivacyEntities, DATABASE::Employee, PAGE::"Employee List",
          DummyEmployee.FieldNo("No."), '', DummyEmployee.FieldNo("Privacy Blocked"));
        DataClassificationMgt.InsertDataPrivacyEntity(DataPrivacyEntities, DATABASE::User, PAGE::Users,
          DummyUser.FieldNo("User Name"), '', 0);
        DataClassificationMgt.InsertDataPrivacyEntity(DataPrivacyEntities, DATABASE::Resource, PAGE::"Resource List",
          DummyResource.FieldNo("No."), ResourceFilterTxt, DummyResource.FieldNo("Privacy Blocked"));
    end;

    [EventSubscriber(ObjectType::Page, Page::"Extension Details", 'OnAfterActionEvent', 'Install', true, true)]
    local procedure AfterExtensionIsInstalled(var Rec: Record "Published Application")
    var
        DataSensitivity: Record "Data Sensitivity";
        ApplicationObjectMetadata: Record "Application Object Metadata";
        "Field": Record "Field";
        DataClassNotificationMgt: Codeunit "Data Class. Notification Mgt.";
        DataClassificationMgt: Codeunit "Data Classification Mgt.";
        RecRef: RecordRef;
        FilterText: Text;
    begin
        if DataClassificationMgt.IsDataSensitivityEmptyForCurrentCompany() then
            exit;

        ApplicationObjectMetadata.SetRange("Runtime Package ID", Rec."Runtime Package ID");
        ApplicationObjectMetadata.SetRange("Object Type", ApplicationObjectMetadata."Object Type"::Table);

        RecRef.GetTable(ApplicationObjectMetadata);
        FilterText := DataClassNotificationMgt.GetFilterTextForFieldValuesInTable(RecRef, ApplicationObjectMetadata.FieldNo("Object ID"));

        if FilterText <> '' then begin
            Field.SetFilter(TableNo, FilterText);
            Field.SetRange(Class, Field.Class::Normal);
            GetEnabledSensitiveFields(Field);

            if Field.FindSet() then begin
                repeat
                    if not DataSensitivity.Get(CompanyName, Field.TableNo, Field."No.") then
                        DataClassificationMgt.InsertDataSensitivityForField(Field.TableNo, Field."No.",
                          DataSensitivity."Data Sensitivity"::Unclassified);
                until Field.Next() = 0;

                DataClassNotificationMgt.ShowNotificationIfThereAreUnclassifiedFields();
            end;
        end;
    end;

    [EventSubscriber(ObjectType::Page, Page::"Extension Details", 'OnAfterActionEvent', 'Uninstall', true, true)]
    local procedure AfterExtensionIsUninstalled(var Rec: Record "Published Application")
    var
        DataSensitivity: Record "Data Sensitivity";
        ApplicationObjectMetadata: Record "Application Object Metadata";
        DataClassificationMgt: Codeunit "Data Classification Mgt.";
        DataClassNotificationMgt: Codeunit "Data Class. Notification Mgt.";
        RecRef: RecordRef;
        FilterText: Text;
    begin
        if DataClassificationMgt.IsDataSensitivityEmptyForCurrentCompany() then
            exit;

        // Remove the fields from the Data Sensitivity table without a confirmation through a notification
        ApplicationObjectMetadata.SetRange("Runtime Package ID", Rec."Runtime Package ID");
        ApplicationObjectMetadata.SetRange("Object Type", ApplicationObjectMetadata."Object Type"::Table);

        RecRef.GetTable(ApplicationObjectMetadata);
        FilterText := DataClassNotificationMgt.GetFilterTextForFieldValuesInTable(RecRef, ApplicationObjectMetadata.FieldNo("Object ID"));

        if FilterText <> '' then begin
            DataSensitivity.SetFilter("Table No", FilterText);
            DataSensitivity.SetRange("Data Sensitivity", DataSensitivity."Data Sensitivity"::Unclassified);
            DataSensitivity.DeleteAll();
        end;
    end;

    local procedure GetEnabledSensitiveFields(var "Field": Record "Field")
    begin
        Field.SetRange(Enabled, true);
        Field.SetFilter(ObsoleteState, '<>%1', Field.ObsoleteState::Removed);
        Field.SetFilter(
          DataClassification,
          StrSubstNo('%1|%2|%3',
            Field.DataClassification::CustomerContent,
            Field.DataClassification::EndUserIdentifiableInformation,
            Field.DataClassification::EndUserPseudonymousIdentifiers));
    end;
}