Viewing File: /usr/local/cpanel/whostmgr/docroot/templates/mod_security/views/rulesListView.ptt

[%
    USE Whostmgr;
    SET easy_apache_url = Whostmgr.ENV.cp_security_token _ '/scripts7/EasyApache4';
%]
<div class="row">
    <!-- The 'sm' size uses only 11 total columns to compensate for the 1 column spacer from the spinner -->
    <div class="col-xs-12 col-sm-3">
        <h2>[% locale.maketext('Rules List') %]</h2>
    </div>
    <div class="col-xs-12 col-sm-9 text-left-xs text-right-sm">
        <div class="navigation-controls">
            <button id="btnTopHitList"
                    type="button"
                    class="btn btn-default"
                    ng-click="loadView('hitList', null, { clearAlerts: true })">
                [% locale.maketext('Hits List') %]
            </button>
            <div class="button-group">
                <button id="btnTopEditCustomRules"
                        type="button"
                        class="btn btn-default"
                        ng-click="loadView('editCustomRules')">
                    [% locale.maketext('Edit Rules') %]
                </button>
                <button id="btnTopAddRule"
                        type="button"
                        class="btn btn-primary"
                        ng-click="loadView('addCustomRule')">
                    [% locale.maketext('Add Rule') %]
                </button>
            </div>
        </div>
    </div>
</div>

<div class="row list-header" ng-hide="dbException">
    <div class="col-xs-12 col-sm-5 col-md-6">
        <div class="form-group">
            <div class="row">
                <div class="col-xs-11">
                    <div class="input-group filter-controls">
                        <input  id="ruleListFilter"
                                class="form-control"
                                placeholder="[% locale.maketext('Search') %]"
                                title="[% locale.maketext('Type in your search filter.') %]"
                                ng-model="meta.filterValue"
                                autocomplete="off"
                                auto-focus
                                ng-keyup="triggerToggleSearch($event)">
                        <span class="input-group-btn" uib-dropdown auto-close="outsideClick" event-handler="fixMenuClipping" is-open="advancedSearchOpen">
                            <button id="btnSearch"
                                    type="button"
                                    class="btn btn-default"
                                    ng-click="toggleSearch(true)">
                                <span class="glyphicon" ng-class="{ 'glyphicon-search': !activeSearch, 'glyphicon-remove': activeSearch }"></span>
                            </button>
                            <button id="btnAdvanceSearch"
                                    type="button"
                                    class="btn btn-default dropdown-toggle"
                                    title="[% locale.maketext('Advanced Search') %]"
                                    uib-dropdown-toggle>
                                <span class="caret"></span>
                                <span class="sr-only">[% locale.maketext('Advanced Search') %]</span>
                            </button>
                            <ul class="dropdown-menu advanced-filter-menu" role="menu" ng-click="$event.stopPropagation()">
                                <li>
                                    <div class="radio">
                                        <label>
                                            <input id="chkShowStagedAndDeployed"
                                                   type="radio"
                                                   name="radioPublishState"
                                                   ng-model="meta.advanced.showStagedDeployed"
                                                   ng-checked="meta.advanced.showStagedDeployed === 'both'"
                                                   ng-change="onAdvancedChanged('staged-and-deployed')"
                                                   value="both">
                                            [% locale.maketext('Show published and unpublished rules.') %]
                                        </label>
                                    </div>
                                    <div class="radio">
                                        <label>
                                            <input id="chkShowStaged"
                                                   type="radio"
                                                   name="radioPublishState"
                                                   ng-model="meta.advanced.showStagedDeployed"
                                                   ng-checked="meta.advanced.showStagedDeployed === 'staged'"
                                                   ng-change="onAdvancedChanged('staged')"
                                                   value="staged">
                                            [% locale.maketext('Show unpublished rules.') %]
                                        </label>
                                    </div>
                                    <div class="radio">
                                        <label>
                                            <input id="chkShowDeployed"
                                                   type="radio"
                                                   name="radioPublishState"
                                                   ng-model="meta.advanced.showStagedDeployed"
                                                   ng-checked="meta.advanced.showStagedDeployed === 'deployed'"
                                                   ng-change="onAdvancedChanged('deployed')"
                                                   value="deployed">
                                            [% locale.maketext('Show published rules.') %]
                                        </label>
                                    </div>
                                </li>
                                <li>
                                    <hr>
                                </li>
                                <li>
                                    <div class="radio">
                                        <label>
                                            <input id="chkShowEnabledAndDisabled"
                                                   type="radio"
                                                   name="radioEnableState"
                                                   ng-model="meta.advanced.showEnabledDisabled"
                                                   ng-checked="meta.advanced.showEnabledDisabled === 'both'"
                                                   ng-change="onAdvancedChanged('enabled-and-disabled')"
                                                   value="both">
                                            [% locale.maketext('Show enabled and disabled rules.') %]
                                        </label>
                                    </div>
                                    <div class="radio">
                                        <label>
                                            <input id="chkShowEnabled"
                                                   type="radio"
                                                   name="radioEnableState"
                                                   ng-model="meta.advanced.showEnabledDisabled"
                                                   ng-checked="meta.advanced.showEnabledDisabled === 'enabled'"
                                                   ng-change="onAdvancedChanged('enabled')"
                                                   value="enabled">
                                            [% locale.maketext('Show enabled rules.') %]
                                        </label>
                                    </div>
                                    <div class="radio">
                                        <label>
                                            <input id="chkShowDisabled"
                                                   type="radio"
                                                   name="radioEnableState"
                                                   ng-model="meta.advanced.showEnabledDisabled"
                                                   ng-checked="meta.advanced.showEnabledDisabled === 'disabled'"
                                                   ng-change="onAdvancedChanged('disabled')"
                                                   value="disabled">
                                            [% locale.maketext('Show disabled rules.') %]
                                        </label>
                                    </div>
                                </li>
                                <li>
                                    <hr>
                                </li>
                                <li>
                                    <div class="form-group">
                                        <div class="row">
                                            <div class="col-xs-12">
                                                <label for="ddlVendorSelect">[% locale.maketext('Vendors:') %]</label>
                                            </div>
                                        </div>
                                        <div class="row">
                                            <div class="col-xs-12">
                                                <select id="ddlVendorSelect"
                                                        class="form-control"
                                                        ng-show="vendors.length > 0"
                                                        size="2"
                                                        multiple
                                                        ng-model="selectedVendors"
                                                        ng-click="onAdvancedChanged('vendor')"
                                                        ng-options="vendor as vendor.name for vendor in vendors">
                                                </select>
                                                <span id="no-vendors-installed"
                                                      ng-show="vendors.length === 0">
                                                    [% locale.maketext('There are no vendor rule sets installed on your system.') %]
                                                </span>
                                            </div>
                                        </div>
                                    </div>
                                </li>
                                <li>
                                    <div class="checkbox">
                                        <label>
                                            <input id="chkShowUserRules"
                                                   type="checkbox"
                                                   ng-model="meta.advanced.includeUserRules"
                                                   ng-checked="meta.advanced.includeUserRules"
                                                   ng-change="onAdvancedChanged('userDefined')">
                                            [% locale.maketext('Show user-defined rules.') %]
                                        </label>
                                    </div>
                                </li>
                                <li>
                                    <div class="form-group action-group">
                                        <button id="btnApplyFilter"
                                                type="button"
                                                class="btn btn-default"
                                                ng-click="applyAdvancedFilter($event)"
                                                ng-disable="!$scope.meta.advanced.changed"
                                                title="[% locale.maketext('Apply the advanced filters.') %]">
                                            [% locale.maketext('Apply') %]
                                        </button>
                                        <button id="btnResetFilter"
                                                type="button"
                                                class="btn btn-link"
                                                ng-click="resetAdvancedFilter($event)"
                                                title="[% locale.maketext('Reset to remove advanced filters.') %]">
                                            [% locale.maketext('Reset') %]
                                        </button>
                                    </div>
                                </li>
                            </ul>
                        </span>
                    </div>
                </div>
                <div class="col-xs-1">
                    <span spinner id="ruleListSpinner" class="headerSpinner" title="[% locale.maketext('Loading …') %]"></span>
                </div>
            </div>
        </div>
    </div>
    <div class="col-xs-12 col-sm-7 col-md-6 form-inline text-left-xs text-right-sm">
        <div class="form-group page-size-container">
            <label for="ddlPageSize">[% locale.maketext('Page Size') %]
                <select id="ddlPageSize"
                        class="form-control page-size-control"
                        ng-model="meta.pageSize"
                        ng-options="size for size in meta.pageSizes">
                </select>
            </label>
        </div>
        <uib-pagination id="topPager"
                    ng-change="selectPage()"
                    ng-model="meta.pageNumber"
                    items-per-page="meta.pageSize"
                    total-items="totalItems"
                    max-size="5"
                    direction-links="false"
                    boundary-links="true"
                    first-text="[% locale.maketext('First') %]"
                    last-text="[% locale.maketext('Last') %]"
                    previous-text="[% locale.maketext('Previous') %]"
                    next-text="[% locale.maketext('Next') %]"
                    class="pagination-small">
        </uib-pagination>
    </div>
</div>

<div class="callout callout-warning" ng-hide="dbException || !stagedChanges">
    <div ng-show="discardConfirm">
        <div>[% locale.maketext('Are you sure that you want to discard the unpublished changes?') %]</div>
        <button id="btnTopConfirmDiscard"
                type="button"
                cp-action="discardChanges()"
                button-class="btn-default"
                ng-disabled="pendingChanges">
            [% locale.maketext('Discard Changes') %]
        </button>
        <button id="btnTopCancelDiscard"
                type="button"
                class="btn btn-link"
                ng-click="discardConfirm = false"
                ng-disabled="pendingChanges">
            [% locale.maketext('Cancel') %]
        </button>
    </div>
    <div ng-hide="discardConfirm">
        <div ng-show="loadingPageData == 'error'">[% locale.maketext('You have unpublished and invalid changes in your [asis,ModSecurity™] configuration.') %]</div>
        <div ng-show="loadingPageData != 'error'">[% locale.maketext('You have unpublished changes for your [asis,ModSecurity™] configuration. You must save these changes for them to take effect.') %]</div>
        <button id="btnTopDeployChanges"
                type="button"
                cp-action="deployChanges()"
                ng-show="loadingPageData != 'error'"
                ng-disabled="pendingChanges">
            [% locale.maketext('Deploy and Restart [asis,Apache]') %]
        </button>
        <button id="btnTopDiscardChanges"
                type="button"
                class="btn btn-default"
                ng-click="discardConfirm = true"
                ng-disabled="pendingChanges">
            [% locale.maketext('Discard Changes') %]
        </button>
    </div>
</div>

<ul class="list-unstyled list-table list-table-striped rules-list" ng-hide="dbException">
    <li class="list-table-header row" cp-responsive-sort>
        <span class="visible-xs col-xs-8">
            <cp-responsive-sort-insert id-suffix="rules" label="[% locale.maketext('Sort by') %]"></cp-responsive-sort-insert>
        </span>
        <span class="hidden-xs col-sm-2 col-lg-1 rule-status">
            <toggle-sort id="sortStatus"
                         class="nowrap"
                         onsort="sortList"
                         sort-meta="meta"
                         sort-field="disabled"
                         sort-reverse>
                [% locale.maketext('Status') %]
            </toggle-sort>
        </span>
        <span class="hidden-xs col-sm-2 col-lg-1 rule-published">
            <toggle-sort id="sortPublished"
                         class="nowrap"
                         onsort="sortList"
                         sort-meta="meta"
                         sort-field="staged">
                [% locale.maketext('Staging') %]
            </toggle-sort>
        </span>
        <span class="hidden-xs col-sm-2 rule-vendor">
            <toggle-sort id="sortVendor"
                         class="nowrap"
                         onsort="sortList"
                         sort-meta="meta"
                         sort-field="vendor_id">
                [% locale.maketext('Vendor') %]
            </toggle-sort>
        </span>
        <span class="hidden-xs col-sm-2 rule-id">
            <toggle-sort id="sortID"
                         class="nowrap"
                         onsort="sortList"
                         sort-meta="meta"
                         sort-type="numeric"
                         sort-field="id">
                [% locale.maketext('ID') %]
            </toggle-sort>
        </span>
        <span class="hidden-xs col-sm-2 col-lg-4 rule-message">
            <toggle-sort id="sortMessage"
                         class="nowrap"
                         onsort="sortList"
                         sort-meta="meta"
                         sort-field="meta_msg">
                [% locale.maketext('Message') %]
            </toggle-sort>
        </span>
        <span class="col-xs-4 col-sm-2 text-right rule-included">
            <div class="btn-group btn-group-nowrap" ng-click="openAdvancedSearch($event)">
                <button id="btnUserRules"
                        class="btn btn-primary"
                        type="button"
                        title="{{ generateIndicatorText('user-title') }}"
                        uib-popover="{{ generateIndicatorText('user-title') }}"
                        popover-trigger="mouseenter"
                        popover-append-to-body="true"
                        popover-placement="bottom">
                    <span ng-class="{ 'glyphicon glyphicon-minus-sign' : !appliedIncludeUserRules, 'fas fa-user' : appliedIncludeUserRules }"></span>
                    <span class="sr-only">[% locale.maketext('User rule sets included.') %]</span>
                </button>
                <button id="btnVendorCount"
                        class="btn btn-primary"
                        type="button"
                        title="{{ generateIndicatorText('vendor-title') }}"
                        uib-popover="{{ generateIndicatorText('vendor-title') }}"
                        popover-trigger="mouseenter"
                        popover-append-to-body="true"
                        popover-placement="bottom">
                    <span class="hidden-md hidden-lg">{{ generateIndicatorText('vendor-short') }}</span>
                    <span class="hidden-xs hidden-sm">{{ generateIndicatorText('vendor-long') }}</span>
                    <span class="sr-only">[% locale.maketext('Vendor rule set count.') %]</span>
                </button>
            </div>
        </span>
    </li>
    <li class="row"
        ng-class="{ 'disabled' : rule.disabled, 'warning' : rule.staged}"
        ng-repeat="rule in rules">
        <span class="col-xs-6 col-sm-2 col-lg-1 rule-status" id="statusData{{$index}}">
            <strong class="hidden-sm hidden-md hidden-lg">[% locale.maketext('Status:') %]</strong>
            <span class="label label-{{rule.disabled ? 'default' : 'success' }}">
                {{rule.disabled ? [% locale.maketext('Disabled').json() %] : [% locale.maketext('Enabled').json() %] }}
            </span>
        </span>
        <span class="col-xs-6 col-sm-2 col-lg-1 rule-published" id="publishedData{{$index}}">
            <strong class="hidden-sm hidden-md hidden-lg">[% locale.maketext('Staging:') %]</strong>
            <span class="label label-warning" ng-show="rule.staged">
                [% locale.maketext('Unpublished') %]
            </span>
            <span class="label label-primary" ng-show="!rule.staged">
                [% locale.maketext('Published') %]
            </span>
        </span>
        <span class="col-xs-6 col-sm-2 rule-vendor">
            <strong class="hidden-sm hidden-md hidden-lg">[% locale.maketext('Vendor:') %]</strong>
            <span id="vendorIdData{{$index}}" title="{{getVendorName(rule)}}">{{rule.vendor_id === "" ? "[% locale.maketext('Custom') %]" : rule.vendor_id}}</span>
        </span>
        <span class="col-xs-6 col-sm-2 rule-id">
            <strong class="hidden-sm hidden-md hidden-lg">[% locale.maketext('ID:') %]</strong>
            <span id="idData{{$index}}">{{rule.id || 0}}</span>
        </span>
        <span class="col-xs-12 col-sm-4 col-lg-6 rule-message">
            <strong class="hidden-sm hidden-md hidden-lg" ng-show="rule.meta_msg">[% locale.maketext('Message:') %]</strong>
            <span id="messageData{{$index}}" ng-bind-html="rule.meta_msg | encodeHtml | wrap:'':40"></span>
        </span>
        <span   id="contentData{{$index}}"
                class="col-xs-12 col-sm-10 col-md-10 rule-content"
                ng-hide="rule.showDeleteConfirm">
            <div ng-repeat="part in rule.rule | split track by $index">
                <span ng-bind-html="part | encodeHtml | wrap:'':40"></span>
            </div>
        </span>
        <span   id="actionsSwitch{{$index}}"
                class="col-xs-12 rule-actions"
                ng-class="{ 'text-center': rule.showDeleteConfirm, 'col-sm-1 col-md-1': !rule.showDeleteConfirm }"
                ng-switch="rule.showDeleteConfirm">
            <span id="actionsContainer{{$index}}" ng-switch-default>
                <button id="btnEdit{{$index}}"
                        type="button"
                        class="btn btn-link"
                        title="[% locale.maketext('Edit Rule') %]"
                        ng-show="isCustomVendor(rule)"
                        ng-click="loadView('editCustomRule', { ruleId : rule.id })">
                    <span class='glyphicon glyphicon-pencil'></span>
                    [% locale.maketext('Edit') %]
                </button>
                <button id="btnCopy{{$index}}"
                        type="button"
                        class="btn btn-link"
                        title="[% locale.maketext('Copy Rule') %]"
                        ng-click="loadView('copyCustomRule', { config: rule.config, id : rule.id, disabled: rule.disabled })">
                    <span class='fas fa-copy fa-lg'></span>
                    [% locale.maketext('Copy') %]
                </button>
                <span ng-hide="rule.disabled">
                    <button id="btnDisable{{$index}}"
                            type="button"
                            title="[% locale.maketext('Disable Rule') %]"
                            button-class="btn-link"
                            cp-action="disable(rule)">
                        <span class='glyphicon glyphicon-ban-circle'></span>
                        [% locale.maketext('Disable') %]
                    </button>
                </span>
                <span ng-show="rule.disabled">
                    <button id="btnEnable{{$index}}"
                            type="button"
                            title="[% locale.maketext('Enable Rule') %]"
                            button-class="btn-link"
                            cp-action="enable(rule)">
                        <span class='fas fa-check fa-lg'></span>
                        [% locale.maketext('Enable') %]
                    </button>
                </span>
                <button id="btnDelete{{$index}}"
                        type="button"
                        class="btn btn-link"
                        title="[% locale.maketext('Delete Rule') %]"
                        ng-show="isCustomVendor(rule)"
                        ng-click="rule.showDeleteConfirm = true">
                    <span class="glyphicon glyphicon-trash"></span>
                    [% locale.maketext('Delete') %]
                </button>
            </span>
            <div   id="deleteConfirmContainer{{$index}}"
                    class="confirm-dialog"
                    ng-switch-when="true">
                <div class="confirm-message">[% locale.maketext('Are you sure that you want to delete this rule?') %]</div>
                <div class="form-group action-group">
                    <button id="btnConfirmDelete{{$index}}"
                            type="button"
                            title="[% locale.maketext('Delete Rule') %]"
                            spinner-id="spinnerDelete{{$index}}"
                            cp-action="delete(rule)">
                        [% locale.maketext('Delete') %]
                    </button>
                    <button id="btnCancelDelete{{$index}}"
                            type="button"
                            class="btn btn-link"
                            title="[% locale.maketext('Cancel Rule Deletion') %]"
                            ng-click="rule.showDeleteConfirm = false"
                            ng-disabled="rule.deleting">
                        [% locale.maketext('Cancel') %]
                    </button>
                </div>
            </div>
        </span>
    </li>
    <li class="row info" ng-show="!rules.length" ng-switch="loadingPageData">
        <span class="col-xs-12" id="loadingRecords" ng-switch-when="true">[% locale.maketext('The system is loading your rules.') %]</span>
        <span class="col-xs-12" id="unsure" ng-switch-when="error">[% locale.maketext('The system is not able to load your rules.') %]</span>
        <span class="col-xs-12" ng-switch-default>
            <span ng-hide="hasSearchFilter()" id="noRecords">[% locale.maketext('You have no rules.') %]</span>
            <span ng-show="hasSearchFilter()" id="noMatchingRecords">[% locale.maketext('No rules matched your search criteria.') %]</span>
        </span>
    </li>
</ul>

<div class="callout callout-warning" ng-show="stagedChanges && rules.length">
    <div ng-show="discardConfirm">
        <div>[% locale.maketext('Are you sure that you want to discard the unpublished changes?') %]</div>
        <button id="btnBottomConfirmDiscard"
                type="button"
                cp-action="discardChanges()"
                button-class="btn-default"
                ng-disabled="pendingChanges">
            [% locale.maketext('Discard Changes') %]
        </button>
        <button id="btnBottomCancelDiscard"
                type="button"
                class="btn btn-link"
                ng-click="discardConfirm = false"
                ng-disabled="pendingChanges">
            [% locale.maketext('Cancel') %]
        </button>
    </div>
    <div ng-hide="discardConfirm">
        <div ng-show="loadingPageData == 'error'">[% locale.maketext('You have unpublished and invalid changes in your [asis,ModSecurity™] configuration.') %]</div>
        <div ng-show="loadingPageData != 'error'">[% locale.maketext('You have unpublished changes for your [asis,ModSecurity™] configuration. You must save these changes for them to take effect.') %]</div>
        <button id="btnBottomDeployChanges"
                type="button"
                cp-action="deployChanges()"
                ng-show="loadingPageData != 'error'"
                ng-disabled="pendingChanges">
            [% locale.maketext('Deploy and Restart [asis,Apache]') %]
        </button>
        <button id="btnBottomDiscardChanges"
                type="button"
                class="btn btn-default"
                ng-click="discardConfirm = true"
                ng-disabled="pendingChanges">
            [% locale.maketext('Discard Changes') %]
        </button>
    </div>
</div>

<div class="row list-footer clearfix">
    <div class="col-xs-12 col-md-6 text-left-xs text-right-md form-inline pull-right">
        <div class="form-group page-size-container">
            <label for="ddlBottomPageSize">[% locale.maketext('Page Size') %]
                <select id="ddlBottomPageSize"
                        class="form-control page-size-control"
                        ng-model="meta.pageSize"
                        ng-options="size for size in meta.pageSizes">
                </select>
            </label>
        </div>
        <uib-pagination id="bottomPager"
                    ng-change="selectPage()"
                    ng-model="meta.pageNumber"
                    items-per-page="meta.pageSize"
                    total-items="totalItems"
                    max-size="5"
                    direction-links="false"
                    boundary-links="true"
                    first-text="[% locale.maketext('First') %]"
                    last-text="[% locale.maketext('Last') %]"
                    previous-text="[% locale.maketext('Previous') %]"
                    next-text="[% locale.maketext('Next') %]"
                    class="pagination-small">
        </uib-pagination>
    </div>
    <div class="col-xs-12 col-md-6 pull-left">
        <div class="form-group">
            <div class="row">
                <div class="col-xs-12">
                    <div class="navigation-controls">
                        <button id="btnTop"
                                type="button"
                                class="btn btn-link"
                                ng-click="scrollTo('top')">
                            <span class="glyphicon glyphicon-chevron-up"></span>
                            [% locale.maketext('Back To Top') %]
                        </button>
                        <div class="button-group">
                            <button id="btnBottomHitList"
                                    type="button"
                                    class="btn btn-default"
                                    ng-click="loadView('hitList')">
                                [% locale.maketext('Hits List') %]
                            </button>
                            <div class="button-group">
                                <button id="btnBottomEditCustomRules"
                                        type="button"
                                        class="btn btn-default"
                                        ng-click="loadView('editCustomRules')">
                                    [% locale.maketext('Edit Rules') %]
                                </button>
                                <button id="btnBottomAddRule"
                                        type="button"
                                        class="btn btn-primary"
                                        ng-click="loadView('addCustomRule')">
                                    [% locale.maketext('Add Rule') %]
                                </button>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
Back to Directory File Manager