policy_module(dirsrv-admin,1.0.0) 

########################################
#
# Declarations for the daemon
#

type dirsrvadmin_t;
type dirsrvadmin_exec_t;
init_daemon_domain(dirsrvadmin_t, dirsrvadmin_exec_t)
role system_r types dirsrvadmin_t;

type dirsrvadmin_config_t;
files_type(dirsrvadmin_config_t)

type dirsrvadmin_lock_t;
files_lock_file(dirsrvadmin_lock_t)

type dirsrvadmin_tmp_t;
files_tmp_file(dirsrvadmin_tmp_t)

type dirsrvadmin_unit_file_t;
systemd_unit_file(dirsrvadmin_unit_file_t)

type dirsrvadmin_unconfined_script_t;
type dirsrvadmin_unconfined_script_exec_t;
domain_type(dirsrvadmin_unconfined_script_t)
domain_entry_file(dirsrvadmin_unconfined_script_t, dirsrvadmin_unconfined_script_exec_t)
corecmd_shell_entry_type(dirsrvadmin_unconfined_script_t)
role system_r types dirsrvadmin_unconfined_script_t;

########################################
#
# Local policy for the daemon
#

allow dirsrvadmin_t self:fifo_file rw_fifo_file_perms;
allow dirsrvadmin_t self:capability { dac_read_search  sys_tty_config sys_resource };
allow dirsrvadmin_t self:process { setrlimit signal_perms };

manage_files_pattern(dirsrvadmin_t, dirsrvadmin_tmp_t, dirsrvadmin_tmp_t)
manage_dirs_pattern(dirsrvadmin_t, dirsrvadmin_tmp_t, dirsrvadmin_tmp_t)
files_tmp_filetrans(dirsrvadmin_t, dirsrvadmin_tmp_t, { file dir })

kernel_read_system_state(dirsrvadmin_t)

corecmd_exec_bin(dirsrvadmin_t)
corecmd_read_bin_symlinks(dirsrvadmin_t)
corecmd_search_bin(dirsrvadmin_t)
corecmd_shell_entry_type(dirsrvadmin_t)

files_exec_etc_files(dirsrvadmin_t)

libs_exec_ld_so(dirsrvadmin_t)

logging_search_logs(dirsrvadmin_t)

# Needed for stop and restart scripts
dirsrv_read_var_run(dirsrvadmin_t)

optional_policy(`
	apache_domtrans(dirsrvadmin_t)
	apache_signal(dirsrvadmin_t)
')

########################################
#
# Local policy for the CGIs
#
#
#
# Create a domain for the CGI scripts

optional_policy(`
	apache_content_template(dirsrvadmin)
	apache_content_alias_template(dirsrvadmin, dirsrvadmin)

	allow dirsrvadmin_script_t self:process { getsched getpgid };
	allow dirsrvadmin_script_t self:capability { fowner fsetid setuid net_bind_service setgid chown sys_nice kill dac_read_search  };
	allow dirsrvadmin_script_t self:tcp_socket create_stream_socket_perms;
	allow dirsrvadmin_script_t self:udp_socket create_socket_perms;
	allow dirsrvadmin_script_t self:unix_dgram_socket create_socket_perms;
	allow dirsrvadmin_script_t self:netlink_route_socket r_netlink_socket_perms;
	allow dirsrvadmin_script_t self:sem create_sem_perms;


	manage_files_pattern(dirsrvadmin_script_t, dirsrvadmin_lock_t, dirsrvadmin_lock_t)
	files_lock_filetrans(dirsrvadmin_script_t, dirsrvadmin_lock_t, { file })

	kernel_read_kernel_sysctls(dirsrvadmin_script_t)

    auth_read_passwd(dirsrvadmin_script_t)

	corenet_tcp_bind_generic_node(dirsrvadmin_script_t)
	corenet_udp_bind_generic_node(dirsrvadmin_script_t)
	corenet_all_recvfrom_netlabel(dirsrvadmin_script_t)

	corenet_tcp_bind_http_port(dirsrvadmin_script_t)
	corenet_tcp_connect_generic_port(dirsrvadmin_script_t)
	corenet_tcp_connect_ldap_port(dirsrvadmin_script_t)
	corenet_tcp_connect_http_port(dirsrvadmin_script_t)

	files_search_var_lib(dirsrvadmin_script_t)

	sysnet_read_config(dirsrvadmin_script_t)

	manage_files_pattern(dirsrvadmin_script_t, dirsrvadmin_tmp_t, dirsrvadmin_tmp_t)
	manage_lnk_files_pattern(dirsrvadmin_script_t, dirsrvadmin_tmp_t, dirsrvadmin_tmp_t)
	manage_dirs_pattern(dirsrvadmin_script_t, dirsrvadmin_tmp_t, dirsrvadmin_tmp_t)
	files_tmp_filetrans(dirsrvadmin_script_t, dirsrvadmin_tmp_t, { file dir })
    
    miscfiles_read_certs(dirsrvadmin_script_t)

    optional_policy(`
        dirsrvadmin_systemctl(dirsrvadmin_script_t)
    ')

	optional_policy(`
		apache_read_modules(dirsrvadmin_script_t)
		apache_read_config(dirsrvadmin_script_t)
        apache_read_pid_files(dirsrvadmin_script_t)
        apache_read_tmp_symlinks(dirsrvadmin_script_t)
        apache_read_tmp_files(dirsrvadmin_script_t)
        apache_read_tmp_dirs(dirsrvadmin_script_t)
		apache_signal(dirsrvadmin_script_t)
		apache_signull(dirsrvadmin_script_t)
	')

	optional_policy(`
		# The CGI scripts must be able to manage dirsrv-admin
		dirsrvadmin_run_exec(dirsrvadmin_script_t)
		dirsrvadmin_manage_config(dirsrvadmin_script_t)
		dirsrv_domtrans(dirsrvadmin_script_t)
		dirsrv_signal(dirsrvadmin_script_t)
		dirsrv_signull(dirsrvadmin_script_t)
		dirsrv_manage_log(dirsrvadmin_script_t)
		dirsrv_manage_var_lib(dirsrvadmin_script_t)
		dirsrv_pid_filetrans(dirsrvadmin_script_t)
		dirsrv_manage_var_run(dirsrvadmin_script_t)
		dirsrv_manage_config(dirsrvadmin_script_t)
		dirsrv_read_share(dirsrvadmin_script_t)
	')
')

#######################################
#
# Local policy for the admin CGIs
#
#


manage_files_pattern(dirsrvadmin_unconfined_script_t, dirsrvadmin_tmp_t, dirsrvadmin_tmp_t)
manage_dirs_pattern(dirsrvadmin_unconfined_script_t, dirsrvadmin_tmp_t, dirsrvadmin_tmp_t)
files_tmp_filetrans(dirsrvadmin_unconfined_script_t, dirsrvadmin_tmp_t, { file dir })

# needed because of filetrans rules
dirsrvadmin_run_exec(dirsrvadmin_unconfined_script_t)
dirsrvadmin_manage_config(dirsrvadmin_unconfined_script_t)
dirsrv_domtrans(dirsrvadmin_unconfined_script_t)
dirsrv_signal(dirsrvadmin_unconfined_script_t)
dirsrv_signull(dirsrvadmin_unconfined_script_t)
dirsrv_manage_log(dirsrvadmin_unconfined_script_t)
dirsrv_manage_var_lib(dirsrvadmin_unconfined_script_t)
dirsrv_pid_filetrans(dirsrvadmin_unconfined_script_t)
dirsrv_manage_var_run(dirsrvadmin_unconfined_script_t)
dirsrv_manage_config(dirsrvadmin_unconfined_script_t)
dirsrv_read_share(dirsrvadmin_unconfined_script_t)

optional_policy(`
   unconfined_domain(dirsrvadmin_unconfined_script_t)
')


