# Copyright (c) 2018, The Linux Foundation. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#     * Redistributions of source code must retain the above copyright
#       notice, this list of conditions and the following disclaimer.
#     * Redistributions in binary form must reproduce the above
#       copyright notice, this list of conditions and the following
#       disclaimer in the documentation and/or other materials provided
#       with the distribution.
#     * Neither the name of The Linux Foundation nor the names of its
#       contributors may be used to endorse or promote products derived
#       from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
# ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.


typeattribute vendor_dpmd coredomain;
typeattribute vendor_dpmd mlstrustedsubject;
type vendor_dpmd_exec, exec_type, system_file_type, file_type;

init_daemon_domain(vendor_dpmd)

net_domain(vendor_dpmd)

allow vendor_dpmd {
    vendor_dpmd_exec
    system_file
}:file x_file_perms;

allow vendor_dpmd vendor_dpmd_data_file:file create_file_perms;
allow vendor_dpmd vendor_dpmd_data_file:dir create_dir_perms;
r_dir_file(vendor_dpmd,proc_net)

allow vendor_dpmd self:capability {
    setuid
    net_raw
    net_admin
};

allow vendor_dpmd netutils_wrapper:process sigkill;
allow vendor_dpmd self:capability2 wake_alarm;

r_dir_file(vendor_dpmd, appdomain)

wakelock_use(vendor_dpmd)
allow vendor_dpmd shell_exec:file rx_file_perms;
dontaudit vendor_dpmd self:capability sys_module;
set_prop(vendor_dpmd, vendor_persist_dpm_prop)
get_prop(vendor_dpmd, vendor_persist_dpm_prop)
#allow vendor_dpmd to create socket
allow vendor_dpmd self:socket create_socket_perms_no_ioctl;
allow vendor_dpmd self:{ netlink_socket netlink_generic_socket } create_socket_perms_no_ioctl;
vendor_dpmd_socket_perm(priv_app)
vendor_dpmd_socket_perm(system_server)
vendor_dpmd_socket_perm(system_app)
vendor_dpmd_socket_perm(untrusted_app)
vendor_dpmd_socket_perm(untrusted_app_25)
vendor_dpmd_socket_perm(platform_app)
#allow vendor_dpmd to write to /proc/net/sys
allow vendor_dpmd proc_net:file write;
#self kill rule to kill vendor_dpmd child process which executes iptable commands
allow vendor_dpmd self:capability kill;
set_prop(vendor_dpmd, ctl_dpmd_prop)
