Viewing File: /usr/local/cpanel/base/sharedjs/email_deliverability/services/DMARCRecordProcessor.js

//                                      Copyright 2024 WebPros International, LLC
//                                                           All rights reserved.
// copyright@cpanel.net                                         http://cpanel.net
// This code is subject to the cPanel license. Unauthorized copying is prohibited

define([], function() {
    "use strict";

    /**
   *
   * @module DMARCRecordProcessor
   * @memberof cpanel.emailDeliverability
   *
   */
    function DMARCRecordProcessor() {

        /**
     * Get the Validate API call for this Record Processor
     *
     * @method getValidateAPI
     * @public
     *
     * @returns {Object} api call .module and .func
     */
        function _getValidateAPI() {
            return { module: "EmailAuth", func: "validate_current_dmarcs" };
        }

        /**
     * Get the Install API call for this Record Processor
     *
     * @method getInstallAPI
     * @public
     *
     * @returns {Object} api call .module and .func
     */
        function _getInstallAPI() {
            return { module: "EmailAuth", func: "apply_dmarc" };
        }

        /**
     * Process an Individual API result item
     *
     * @method processResultItem
     * @public
     *
     * @param {Object} resultItem API result item
     * @returns {Array<Object>} parsed records for the result item
     */
        function _processResultItem(resultItem) {
            var records = [];
            resultItem.record = [resultItem.record];

            if (resultItem) {
                records = resultItem.records.map(this.parseRecord.bind(this));
            }

            return records;
        }

        /**
     * Process the result items for an API
     *
     * @method processResultItems
     * @public
     *
     * @param {Array<Object>} resultItems
     * @returns {Array<Array>} processed records organized by domain
     */
        function _processResultItems(resultItems) {
            var domainRecords = [];
            resultItems.forEach(function(resultItem) {
                domainRecords.push(this.processResultItem(resultItem));
            }, this);
            return domainRecords;
        }

        /**
     * Parse a record of this processor's type
     *
     * @method parseRecord
     * @public
     *
     * @param {Object} record record object
     * @returns validated and parsed record
     */
        function _parseRecord(record) {
            record.recordType = "dmarc";
            return this.validateState(record);
        }

        /**
     * Validate a record of this processor's type
     *
     * @method validateState
     * @public
     *
     * @param {Object} record record object
     * @returns validated record
     */

        function _validateState(record) {
            record.valid = false;
            switch (record.state) {
                case "MALFORMED":
                case "DKIM_SPF_ERROR":
                case "DKIM_ERROR":
                case "SPF_ERROR":
                case "MISSING":
                case "DNS_ERROR":
                    break;
                case "VALID":
                    record.valid = true;
                    break;
            }
            return record;
        }

        /**
     * Preporocess result items for consistent results during processResultItems call
     *
     * @method normalizeResults
     * @public
     *
     * @param {Array<Object>} results unprocessed results
     * @returns {Array<Object>} normalized results
     */
        function _normalizeResults(results) {

            results.data.forEach((resultItem) => {
                var recordName = resultItem.domain;

                resultItem.records = [{}];
                resultItem.records.forEach((record) => {
                    record.current = {
                        name: recordName + ".",
                        value: resultItem.record,
                    };
                    record.state = resultItem.state;
                });
            });

            return results;
        }

        /**
     * Generated an expected record for this processor type
     *
     * @method generateSuggestedRecord
     * @public
     *
     * @param {Object} resultItem result item to generate a record for
     * @returns {String} expected record string
     */

        function _generateSuggestedRecord(resultItem) {
            return  { name: resultItem.domain + ".", value: resultItem.suggested };
        }

        this.generateSuggestedRecord = _generateSuggestedRecord.bind(this);
        this.normalizeResults = _normalizeResults.bind(this);
        this.getValidateAPI = _getValidateAPI.bind(this);
        this.getInstallAPI = _getInstallAPI.bind(this);
        this.processResultItem = _processResultItem.bind(this);
        this.processResultItems = _processResultItems.bind(this);
        this.parseRecord = _parseRecord.bind(this);
        this.validateState = _validateState.bind(this);
    }

    return new DMARCRecordProcessor();
});
Back to Directory File Manager