# Copyright (c) 2020, 2021 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_qcc_app mlstrustedsubject;

app_domain(vendor_qcc_app)
net_domain(vendor_qcc_app)
binder_use(vendor_qcc_app)

allow vendor_qcc_app radio_service:service_manager find;
# for vendor_perf_service
allow vendor_qcc_app app_api_service:service_manager find;

# allow access to qdma dropbox (/data/misc/qdma)
allow vendor_qcc_app vendor_qcc_data_file:dir create_dir_perms;
allow vendor_qcc_app vendor_qcc_data_file:file create_file_perms;

# allow access to socket
unix_socket_connect(vendor_qcc_app, vendor_dpmtcm, vendor_dpmd)
# allow access to mediadrmserver for qdmastats/wvstats
allow vendor_qcc_app mediadrmserver_service:service_manager find;

# allow vendor_qcc_app to access system_app_data_file
# necessary for read and write /data/user_de/0/com.---.qti.qdma subdirectory.
allow vendor_qcc_app system_app_data_file:dir create_dir_perms;
allow vendor_qcc_app system_app_data_file:file create_file_perms;

# allow cgroup access
allow vendor_qcc_app cgroup:file rw_file_perms;

#allow mediametrics_service
allow vendor_qcc_app mediametrics_service:service_manager find;

# Allow read-write permissions to qdma sockets under vendor_qcc_app_socket.
allow vendor_qcc_app vendor_qcc_app_socket:dir rw_dir_perms;
allow vendor_qcc_app vendor_qcc_app_socket:sock_file create_file_perms;


