
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
3
Flf                 @   s  d dl Z d dlZd dlZd dlZd dlZd dlmZmZmZ d dlZd dl	Z	ddl
mZ ddl
mZ ddl
mZ ddl
mZ ddl
mZ dd	l
mZ dd
l
mZ ddl
mZ ddl
mZ ddl
mZ ddl
mZ ddl
mZ ddl
mZ ddl
mZ ddl
mZ d dljZd dljZdZy<d dlZi Z ej!dBk r:de d< ej"efddde  W nL   yd dl#Z#e$e#j%d< W n( e&k
r   d dl'Z'e(e'j%d< Y nX Y nX dd Z)dd Z*dd  Z+d!d" Z,d Z-dZ.d#Z/dZ0d$Z1d%Z2d Z3dZ4d#Z5dZ6d&Z7d'Z8d(Z9d)Z:d*Z;d+Z<d,Z=d-Z>d.Z?i Z@eAd/e@e3< eAd0e@e4< eAd1e@e5< eAd2e@e6< eAd3e@e7< eAd4e@e8< eAd5e@e9< eAd6e@e:< eAd7e@e;< eAd8e@e<< eAd9e@e=< eAd:e@e>< eAd;e@e?< d<d= ZBe3e4e5e8e6gZCe;e:e<e=e>gZDd>d? ZEG d@dA dAZFdS )C    N)get_all_typesget_all_attributesget_all_roles   )
executable)boolean)etc_rw)	unit_file)	var_cache)	var_spool)var_lib)var_log)var_run)tmp)rw)network)script)spec)userzselinux-python   Tunicodez/usr/share/localezutf-8)Z	localedirZcodeset_c             C   sF   | d }| d }| d }|d |j dd  }|j dd }|||gS )z6Given an RPM header return the package NVR as a stringnameversionrelease-.r   r   )split)Zhdrr   r   r   Zrelease_versionZ
os_version r   /usr/lib/python3.6/generate.pyget_rpm_nvr_from_headerG   s    r    c          	   C   s`   y>dd l }d }|j }|j|j| }x|D ]}t|}P q*W W n   td|   d }Y nX |S )Nr   z"Failed to retrieve rpm info for %s)rpmtsZdbMatchZRPMTAG_NAMEr    print)packager!   Znvrr"   Zmihr   r   r   get_rpm_nvr_listR   s    


r&   c              C   s   i } xzt jt jD ]j}|d dks|d dks|d dks|d dks|d dkrTq|d |jdf| |d |d	 |d
 f< qW | S )NtypeZreserved_port_tZport_tZhi_reserved_port_tZephemeral_port_tZunreserved_port_trangeZlowZhighprotocol)sepolicyinfoZPORTget)dictpr   r   r   get_all_portsb   s    ,r/   c              C   s6   dd t jt jD } | jd | jd | j  | S )Nc             S   s   g | ]}|d  qS )r   r   ).0xr   r   r   
<listcomp>p   s    z!get_all_users.<locals>.<listcomp>Zsystem_uroot)r*   r+   USERremovesort)usersr   r   r   get_all_userso   s
    

r8      z_admin$z_role$               	   
         zStandard Init DaemonzDBUS System DaemonzInternet Services DaemonzWeb Application/Script (CGI)ZSandboxzUser ApplicationzExisting Domain Typez Minimal Terminal Login User Rolez!Minimal X Windows Login User RolezDesktop Login User RolezAdministrator Login User Rolez Confined Root Administrator Rolez!Module information for a new typec              C   s>   t j } | j  td}x | D ]}|d|t | f 7 }qW |S )NzValid Types:
z%2s: %s
)poltypekeysr6   r   )rD   msgkr   r   r   get_poltype_desc   s    
rG   c             C   s   | dkrg S d	}yg }x| j dD ]}|j d}t|dkr@tt|dkrft|d }t|d }n$t|d }t|d }||krtx4t||d D ]"}|dk s||krt|j| qW q"W |S  tk
r   ttd| Y nX d S )
N r9      ,r   r   r   z8Ports must be numbers or ranges of numbers from 1 to %d i   )r   len
ValueErrorintr(   appendr   )portsZmax_porttemparbeginendr.   r   r   r   verify_ports   s.    
rU   c               @   s  e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd ZdddZd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Zd:d; Zd<d= Z d>d? Z!d@dA Z"dBdC Z#dDdE Z$dFdG Z%dHdI Z&dJdK Z'dLdM Z(dNdO Z)dPdQ Z*dRdS Z+dTdU Z,dVdW Z-dXdY Z.dZd[ Z/d\d] Z0d^d_ Z1d`da Z2dbdc Z3ddde Z4dfdg Z5dhdi Z6djdk Z7dldm Z8dndo Z9dpdq Z:drds Z;dtdu Z<dvdw Z=dxdy Z>dzd{ Z?d|d} Z@d~d ZAdd ZBdd ZCdd ZDdd ZEdd ZFdd ZGdd ZHdd ZIdd ZJdd ZKdd ZLdd ZMdd ZNdd ZOdd ZPdd ZQdd ZRdd ZSdd ZTdd ZUdd ZVdd ZWdd ZXdd ZYdd ZZdd Z[dd Z\dd Z]dd Z^dd Z_dd Z`dd Zadd ZbddÄ Zcddń ZdddǄ ZeddɄ Zfdd˄ Zgdd̈́ Zhddτ Ziddф Zjddӄ ZkddՄ Zlddׄ Zmddل Znddۄ Zodd݄ Zpdd߄ Zqdd Zrdd Zsetju fddZvdS )policyc             C   s  g | _ i | _t | _g | _|tkr.ttd|sFttdt|  yt | _W nT tk
r| } zt	d W Y d d }~X n, t
k
r } zt	d| W Y d d }~X nX i | _d| jd< d| jd< d| jd< d	| jd
< d	| jd< d	| jd< d| jd< d| jd< d| jd< d| jd< d| jd< d| jd< d| jd< d| jd< d| jd< d| jd< d| jd< d| jd< d| jd < d!| jd"< d#| jd$< d%| jd&< d'| jd(< d)| jd*< d+| jd,< d-| jd.< d/| jd0< d1| jd2< d3| jd4< d5| jd6< d7| jd8< d9| jd:< d;| jd<< d=| jd>< d?| jd@< dA| jdB< dC| jdD< dE| jdF< dG| jdH< dI| jdJ< dK| jdL< dM| jdN< dO| jdP< dQ| jdR< dS| jdT< dU| jdV< dW| jdX< dY| jdZ< d[| jd\< d]| jd^< d_| jd`< da| jdb< da| jdc< da| jdd< da| jde< df| jdg< df| jdh< df| jdi< df| jdj< df| jdg< dk| jdl< dm| jdn< do| jdp< dq| jdr< ds| jdt< du| jdv< dw| jdx< dy| jdz< d{| jd|< d}| jd~< d| jd< d| jd< d| jd< d| jd< d| jd< d| jd< d| jd< d| jd< d| jd< d| jd< d| jd< d| jd< d| jd< d| jd< d| jd< d| jd< d| jd< i | _dg tg| jd< dg tg| jd< dg tg| jd< dg tg| jd< dg tg| jd< dg tg| jd< dg tg| jd< dg tg| jd< dg tg| jd< dg tg| jd< dg tg| jd< i | _t| jd< t| jd< t| jd< t| jd< t| jd< t| jd< t| jd< t| jd< dddddddddddg| _| j| jf| j| jf| j| jf| j| j f| j!| j"f| j#| j$f| j%| j&f| j'| j(f| j)| j*f| j+| j(f| j,| j(f| j-| j.f| j/| j0ff| _1t2j3d|sttd|t4krd| | _5n|| _5|| _6g | _7g | _8|| _9d| _:d | _;dddg g| _<dddg g| _=dddg g| _>dddg g| _?d| _@d| _Ad| _Bd| _Cd| _Dd| _Ed| _Fd| _Gd| _H| j9tItJgk| _K| j9tItJgk| _L| j9tItJgk| _Md| _Nd| _Oi | _Pi | _Qi | _Rg | _Sg | _Td| _Ud| _Vg | _Wg | _Xg | _Yg | _Zg | _[d S )Nz"You must enter a valid policy typez;You must enter a name for your policy module for your '%s'.z9Can not get port types, must be root for this informationzCan not get port typeszset_use_kerberos(True)Zopenlogzset_use_kerb_rcache(True)zset_use_syslog(True)zset_use_resolve(True)Z	gethostbyZgetaddrinfoZgetnameinfoZkrbzset_manage_krb5_rcache(True)Zgss_accept_sec_contextZkrb5_verify_init_credsZkrb5_rd_reqZ__syslog_chkzset_use_uid(True)getpwnamgetpwuidzset_use_dbus(True)Zdbus_zset_use_pam(True)Zpam_zset_use_audit(True)zadd_process('fork')forkzadd_process('transition')Z
transitionzadd_process('sigchld')Zsigchldzadd_process('sigkill')Zsigkillzadd_process('sigstop')Zsigstopzadd_process('signull')Zsignullzadd_process('ptrace')Zptracezadd_process('getsched')Zgetschedzadd_process('setsched')Zsetschedzadd_process('getsession')Z
getsessionzadd_process('getpgid')getpgidzadd_process('setpgid')setpgidzadd_process('getcap')Zgetcapzadd_process('setcap')Zsetcapzadd_process('share')Zsharezadd_process('getattr')getattrzadd_process('setexec')Zsetexeczadd_process('setfscreate')Zsetfscreatezadd_process('noatsecure')Z
noatsecurezadd_process('siginh')Zsiginhzadd_process('signal_perms')killzadd_process('setrlimit')Z	setrlimitzadd_process('rlimitinh')Z	rlimitinhzadd_process('dyntransition')Zdyntransitionzadd_process('setcurrent')Z
setcurrentzadd_process('execmem')Zexecmemzadd_process('execstack')Z	execstackzadd_process('execheap')Zexecheapzadd_process('setkeycreate')Zsetkeycreatezadd_process('setsockcreate')Zsetsockcreatezadd_capability('chown')chownzadd_capability('dac_override')Zdac_overridez!add_capability('dac_read_search')Zdac_read_searchzadd_capability('fowner')Zfownerzadd_capability('fsetid')Zfsetidzadd_capability('setgid')setgidsetegid	setresgidsetregidzadd_capability('setuid')	setresuidsetuidseteuidsetreuidzadd_capability('setpcap')Zsetpcapz!add_capability('linux_immutable')Zlinux_immutablez"add_capability('net_bind_service')Znet_bind_servicezadd_capability('net_broadcast')Znet_broadcastzadd_capability('net_admin')Z	net_adminzadd_capability('net_raw')Znet_rawzadd_capability('ipc_lock')Zipc_lockzadd_capability('ipc_owner')Z	ipc_ownerzadd_capability('sys_module')
sys_modulezadd_capability('sys_rawio')Z	sys_rawiozadd_capability('sys_chroot')chrootZ
sys_chrootzadd_capability('sys_ptrace')Z
sys_ptracezadd_capability('sys_pacct')Z	sys_pacctzadd_capability('sys_admin')ZmountZunshareZ	sys_adminzadd_capability('sys_boot')Zsys_bootzadd_capability('sys_nice')Zsys_nicezadd_capability('sys_resource')Zsys_resourcezadd_capability('sys_time')Zsys_timez add_capability('sys_tty_config')Zsys_tty_configzadd_capability('mknod')mknodzadd_capability('lease')Zleasezadd_capability('audit_write')Zaudit_writezadd_capability('audit_control')Zaudit_controlzadd_capability('setfcap')Zsetfcapr   z/etcr   z/tmpr   r	   z/usr/lib/systemd/systemz/lib/systemd/systemz/etc/systemd/systemr
   z
/var/cacher   z/var/libr   z/var/logr   z/var/runr   z
/var/spoolZ_tmp_tZ_unit_file_tZ_var_cache_tZ
_var_lib_tZ
_var_log_tZ
_var_run_tZ_var_spool_tZ_port_tz^[a-zA-Z0-9-_]+$zQName must be alpha numberic with no spaces. Consider using option "-n MODULENAME"zhttpd_%s_scriptrH   F)\rpmsrO   r   	all_rolestypesrC   rL   r   r/   r#   RuntimeErrorsymbolsDEFAULT_DIRSr   r   r   r	   r
   r   r   r   r   DEFAULT_EXTr   DEFAULT_KEYSgenerate_daemon_typesgenerate_daemon_rulesgenerate_dbusd_typesgenerate_dbusd_rulesgenerate_inetd_typesgenerate_inetd_rulesgenerate_cgi_typesgenerate_cgi_rulesgenerate_sandbox_typesgenerate_sandbox_rulesgenerate_userapp_typesgenerate_userapp_rulesgenerate_existing_user_typesgenerate_existing_user_rulesgenerate_min_login_user_typesgenerate_login_user_rulesgenerate_x_login_user_typesgenerate_x_login_user_rulesgenerate_login_user_typesgenerate_admin_user_typesgenerate_root_user_typesgenerate_root_user_rulesgenerate_new_typesgenerate_new_rulesDEFAULT_TYPESrematchCGIr   	file_namecapabilities	processesr'   
initscriptprogramin_tcpin_udpout_tcpout_udpuse_resolveuse_tmpuse_uid
use_sysloguse_kerberosmanage_krb5_rcacheuse_pamuse_dbus	use_auditEUSERNEWTYPEuse_etcuse_localizationuse_fduse_terminaluse_mailbooleansfilesdirsfound_tcp_portsfound_udp_portsneed_tcp_typeneed_udp_typeadmin_domainsexisting_domainstransition_domainstransition_usersroles)selfr   r'   er   r   r   __init__   sd   











































































































zpolicy.__init__c             C   s(   |t  p&|t p&|t p&t|t dkS )Nr   )ALLRESERVED
UNRESERVEDrK   PORTS)r   lr   r   r   Z
__isnetset  s    zpolicy.__isnetsetc             C   s
   || _ d S )N)r   )r   r   r   r   r   set_admin_domains  s    zpolicy.set_admin_domainsc             C   s
   || _ d S )N)r   )r   r   r   r   r   set_existing_domains  s    zpolicy.set_existing_domainsc             C   s
   || _ d S )N)r   )r   r   r   r   r   set_admin_roles  s    zpolicy.set_admin_rolesc             C   s
   || _ d S )N)r   )r   r   r   r   r   set_transition_domains  s    zpolicy.set_transition_domainsc             C   s
   || _ d S )N)r   )r   r   r   r   r   set_transition_users  s    zpolicy.set_transition_usersc             C   s   | j | jS )N)_policy__isnetsetr   )r   r   r   r   
use_in_udp  s    zpolicy.use_in_udpc             C   s   | j | jS )N)r   r   )r   r   r   r   use_out_udp  s    zpolicy.use_out_udpc             C   s   | j  p| j S )N)r   r   )r   r   r   r   use_udp  s    zpolicy.use_udpc             C   s   | j | jS )N)r   r   )r   r   r   r   
use_in_tcp  s    zpolicy.use_in_tcpc             C   s   | j | jS )N)r   r   )r   r   r   r   use_out_tcp  s    zpolicy.use_out_tcpc             C   s   | j  p| j S )N)r   r   )r   r   r   r   use_tcp  s    zpolicy.use_tcpc             C   s   | j  p| j S )N)r   r   )r   r   r   r   use_network  s    zpolicy.use_networktcpc             C   sF   x@| j j D ]2\}}}||kr||kr||kr| j |||f S qW d S )N)rO   rD   )r   Zportr)   rS   rT   r.   r   r   r   	find_port  s    zpolicy.find_portc             C   s    | j tkrttd|| _d S )Nz0User Role types can not be assigned executables.)r'   APPLICATIONSrL   r   r   )r   r   r   r   r   set_program  s    
zpolicy.set_programc             C   s    | j tkrttd|| _d S )Nz)Only Daemon apps can use an init script..)r'   DAEMONrL   r   r   )r   r   r   r   r   set_init_script  s    
zpolicy.set_init_scriptc             C   s   |||t |g| _d S )N)rU   r   )r   allreserved
unreservedrO   r   r   r   
set_in_tcp  s    zpolicy.set_in_tcpc             C   s   |||t |g| _d S )N)rU   r   )r   r   r   r   rO   r   r   r   
set_in_udp  s    zpolicy.set_in_udpc             C   s   |ddt |g| _d S )NF)rU   r   )r   r   rO   r   r   r   set_out_tcp  s    zpolicy.set_out_tcpc             C   s   |ddt |g| _d S )NF)rU   r   )r   r   rO   r   r   r   set_out_udp  s    zpolicy.set_out_udpc             C   s"   t |tk	rttd|| _d S )Nz$use_resolve must be a boolean value )r'   boolrL   r   r   )r   valr   r   r   set_use_resolve  s    zpolicy.set_use_resolvec             C   s"   t |tk	rttd|| _d S )Nz#use_syslog must be a boolean value )r'   r   rL   r   r   )r   r   r   r   r   set_use_syslog  s    zpolicy.set_use_syslogc             C   s"   t |tk	rttd|| _d S )Nz%use_kerberos must be a boolean value )r'   r   rL   r   r   )r   r   r   r   r   set_use_kerberos  s    zpolicy.set_use_kerberosc             C   s"   t |tk	rttd|| _d S )Nz+manage_krb5_rcache must be a boolean value )r'   r   rL   r   r   )r   r   r   r   r   set_manage_krb5_rcache  s    zpolicy.set_manage_krb5_rcachec             C   s   |dk| _ d S )NT)r   )r   r   r   r   r   set_use_pam  s    zpolicy.set_use_pamc             C   s   |dk| _ d S )NT)r   )r   r   r   r   r   set_use_dbus  s    zpolicy.set_use_dbusc             C   s   |dk| _ d S )NT)r   )r   r   r   r   r   set_use_audit  s    zpolicy.set_use_auditc             C   s   |dk| _ d S )NT)r   )r   r   r   r   r   set_use_etc  s    zpolicy.set_use_etcc             C   s   |dk| _ d S )NT)r   )r   r   r   r   r   set_use_localization  s    zpolicy.set_use_localizationc             C   s   |dk| _ d S )NT)r   )r   r   r   r   r   
set_use_fd  s    zpolicy.set_use_fdc             C   s   |dk| _ d S )NT)r   )r   r   r   r   r   set_use_terminal  s    zpolicy.set_use_terminalc             C   s   |dk| _ d S )NT)r   )r   r   r   r   r   set_use_mail  s    zpolicy.set_use_mailc             C   sB   | j tkrttd|r0| jd d jd ng | jd d< d S )Nz'USER Types automatically get a tmp typez/tmpr   )r'   USERSrL   r   ro   rN   )r   r   r   r   r   set_use_tmp  s
    
zpolicy.set_use_tmpc             C   s   |dk| _ d S )NT)r   )r   r   r   r   r   set_use_uid  s    zpolicy.set_use_uidc             C   s    | j rtjd| jtjS dS d S )NTEMPLATETYPErH   )r   r   subr   r   Zte_uid_rules)r   r   r   r   generate_uid_rules  s    zpolicy.generate_uid_rulesc             C   s    | j rtjd| jtjS dS d S )Nr   rH   )r   r   r   r   r   Zte_syslog_rules)r   r   r   r   generate_syslog_rules  s    zpolicy.generate_syslog_rulesc             C   s    | j rtjd| jtjS dS d S )Nr   rH   )r   r   r   r   r   Zte_resolve_rules)r   r   r   r   generate_resolve_rules  s    zpolicy.generate_resolve_rulesc             C   s    | j rtjd| jtjS dS d S )Nr   rH   )r   r   r   r   r   Zte_kerberos_rules)r   r   r   r   generate_kerberos_rules  s    zpolicy.generate_kerberos_rulesc             C   s    | j rtjd| jtjS dS d S )Nr   rH   )r   r   r   r   r   Zte_manage_krb5_rcache_rules)r   r   r   r   !generate_manage_krb5_rcache_rules   s    z(policy.generate_manage_krb5_rcache_rulesc             C   s    d}| j rtjd| jtj}|S )NrH   r   )r   r   r   r   r   Zte_pam_rules)r   newter   r   r   generate_pam_rules&  s    zpolicy.generate_pam_rulesc             C   s    d}| j rtjd| jtj}|S )NrH   r   )r   r   r   r   r   Zte_audit_rules)r   r   r   r   r   generate_audit_rules,  s    zpolicy.generate_audit_rulesc             C   s    d}| j rtjd| jtj}|S )NrH   r   )r   r   r   r   r   Zte_etc_rules)r   r   r   r   r   generate_etc_rules2  s    zpolicy.generate_etc_rulesc             C   s    d}| j rtjd| jtj}|S )NrH   r   )r   r   r   r   r   Zte_fd_rules)r   r   r   r   r   generate_fd_rules8  s    zpolicy.generate_fd_rulesc             C   s    d}| j rtjd| jtj}|S )NrH   r   )r   r   r   r   r   Zte_localization_rules)r   r   r   r   r   generate_localization_rules>  s    z"policy.generate_localization_rulesc             C   s*   d}| j tkr&| jr&tjd| jtj}|S )NrH   r   )r'   DBUSr   r   r   r   r   Zte_dbus_rules)r   r   r   r   r   generate_dbus_rulesD  s    zpolicy.generate_dbus_rulesc             C   s    d}| j rtjd| jtj}|S )NrH   r   )r   r   r   r   r   Zte_mail_rules)r   r   r   r   r   generate_mail_rulesJ  s    zpolicy.generate_mail_rulesc             C   sF   d}d|||f }|t j kr.d|| jf }nd|| j|||f }|S )NrH   zcorenet_%s_%s_%sz	%s(%s_t)
zD
gen_require(`
    type %s_t;
')
allow %s_t %s_t:%s_socket name_%s;
)r*   Zget_methodsr   )r   r)   action	port_namelinemethodr   r   r   generate_network_actionP  s    zpolicy.generate_network_actionc             C   sh  xf| j t D ]X}| jt|d}|d kr0d| _q|d d d
 }| jdd|}|| jkr| jj| qW xf| jt D ]X}| jt|d}|d krd| _qt|d d d }| jdd|}|| jkrt| jj| qtW xh| j	t D ]Z}| jt|d}|d krd| _
q|d d d }| jdd|}|| jkr| jj| qW | j
dksR| jdkrdtjd| jtjS d	S )Nr   Tr   r9   ZbindZconnectudpr   rH   r   r   )r   r   r   rM   r   r   r   rN   r   r   r   r   r   r   r   r   te_types)r   iZrecr   r   r   r   r   generate_network_types^  s6    



zpolicy.generate_network_typesc             C   sZ   x:| j D ]0}|j|dkr| j | d j| | j | S qW | j d d j| | j d S )Nr   r   r   )ro   findrN   )r   filedr   r   r   Z__find_path  s    zpolicy.__find_pathc             C   s   || j kr| j j| d S )N)r   rN   )r   Z
capabilityr   r   r   add_capability  s    
zpolicy.add_capabilityc             C   s
   || _ d S )N)rl   )r   rl   r   r   r   	set_types  s    zpolicy.set_typesc             C   s   || j kr| j j| d S )N)r   rN   )r   Zprocessr   r   r   add_process  s    
zpolicy.add_processc             C   s   || j |< d S )N)r   )r   r   descriptionr   r   r   add_boolean  s    zpolicy.add_booleanc             C   s   | j || j|< d S )N)_policy__find_pathr   )r   r  r   r   r   add_file  s    zpolicy.add_filec             C   s   | j || j|< d S )N)r  r   )r   r  r   r   r   add_dir  s    zpolicy.add_dirc             C   s6   d}| j j  t| j dkr2d| jdj| j f }|S )NrH   r   z#allow %s_t self:capability { %s };
 )r   r6   rK   r   join)r   r   r   r   r   generate_capabilities  s
    
zpolicy.generate_capabilitiesc             C   s6   d}| j j  t| j dkr2d| jdj| j f }|S )NrH   r   z allow %s_t self:process { %s };
r  )r   r6   rK   r   r  )r   r   r   r   r   generate_process  s
    
zpolicy.generate_processc             C   s  d}| j  rd}|tjd| jtj7 }| j r|d7 }|tjd| jtj7 }| j r|tjd| jtj	7 }| j
rt| jt dkr|tjd| jtj7 }| j
rt| jt dkr|tjd| jtj7 }| jt r|tjd| jtj7 }| jt r|tjd| jtj7 }| jt r.|tjd| jtj7 }| jt rP|tjd| jtj7 }| jt rr|tjd| jtj7 }| jt r|tjd| jtj7 }x| jD ]}||7 }qW | j r|d7 }|tjd| jtj7 }| jr|tjd| jtj7 }| j r|tjd| jtj 7 }| j!t r6|tjd| jtj"7 }| j!t rX|tjd| jtj#7 }| j!t rz|tjd| jtj$7 }x| j%D ]}||7 }qW |S )NrH   
r   r   )&r   r   r   r   r   Z
te_networkr   Zte_tcpr   Z	te_in_tcpr   rK   r   r   Zte_in_need_port_tcpr   Zte_out_need_port_tcpr   Zte_in_all_ports_tcpr   Zte_in_reserved_ports_tcpr   Zte_in_unreserved_ports_tcpZte_out_all_ports_tcpZte_out_reserved_ports_tcpZte_out_unreserved_ports_tcpr   r   Zte_udpr   Zte_in_need_port_udpr   Z	te_in_udpr   Zte_in_all_ports_udpZte_in_reserved_ports_udpZte_in_unreserved_ports_udpr   )r   r   r   r   r   r   generate_network_rules  sV    




zpolicy.generate_network_rulesc             C   s   d}x2| j D ](}tjd| jtj}|tjd||7 }qW | jtkrx<| jD ]2}tjd| jt	j
}|tjd|jdd |7 }qJW |S )NrH   r   APPLICATIONr4   _ur   )r   r   r   r   r   Zte_transition_rulesr'   r4   r   r   Zte_run_rulesr   )r   r   appr   urP   r   r   r   generate_transition_rules  s    
 z policy.generate_transition_rulesc             C   s,  d}| j tkrxn| jD ]d}|jdd }|d }xH| jD ]>}tjd|tj}|| j	krdtj|d|}|tjd||7 }q8W qW |S | j t
kr(|tjd| jtj7 }x2| jD ](}tjd| jtj}|tjd||7 }qW xN| jD ]D}|jdd }|d | j	krtjd| jtj}|tjd	||7 }qW |S )
NrH   _tr   _rr   Zsystem_rr  r  r4   )r'   r   r   r   r   r   r   r   Zte_admin_domain_rulesrk   RUSERr   Zte_admin_rulesr   Zte_admin_trans_rules)r   r   r  r   roler  r   r  r   r   r   generate_admin_rules  s,    

zpolicy.generate_admin_rulesc             C   s    d}| j rtjd| jtj}|S )NrH   r   )r   r   r   r   r   Zif_dbus_rules)r   newifr   r   r   generate_dbus_if  s    zpolicy.generate_dbus_ifc             C   s(   d}| j tkr|S tjd| jtj}|S )NrH   r   )r'   SANDBOXr   r   r   r   Zif_sandbox_rules)r   r  r   r   r   generate_sandbox_if  s
    
zpolicy.generate_sandbox_ifc             C   s  d}d}| j dkr>|tjd| jtj7 }|tjd| jtj7 }xd| jD ]Z}t| j	| d dkrF|tjd| j| j	| d j
7 }|tjd| j| j	| d j7 }qFW |dkrtjd| jtj}||7 }|tjd| jtj7 }||7 }|tjd| jtj7 }|S dS )NrH   r   r   r   r9   )r   r   r   r   r   Zif_initscript_admin_typesZif_initscript_adminrq   rK   ro   Zif_admin_typesZif_admin_rulesZif_begin_adminZif_middle_adminZif_end_admin)r   r  Znewtypesr  retr   r   r   generate_admin_if  s"    
 $zpolicy.generate_admin_ifc             C   s   t jd| jtjS )Nr   )r   r   r   r   te_cgi_types)r   r   r   r   rx   5  s    zpolicy.generate_cgi_typesc             C   s   t jd| jtjS )Nr   )r   r   r   r   te_sandbox_types)r   r   r   r   rz   8  s    zpolicy.generate_sandbox_typesc             C   s   t jd| jtjS )Nr   )r   r   r   r   Zte_userapp_types)r   r   r   r   r|   ;  s    zpolicy.generate_userapp_typesc             C   s   t jd| jtjS )Nr   )r   r   r   r   Zte_inetd_types)r   r   r   r   rv   >  s    zpolicy.generate_inetd_typesc             C   s   t jd| jtjS )Nr   )r   r   r   r   Zte_dbusd_types)r   r   r   r   rt   A  s    zpolicy.generate_dbusd_typesc             C   s   t jd| jtjS )Nr   )r   r   r   r   Zte_min_login_user_types)r   r   r   r   r   D  s    z$policy.generate_min_login_user_typesc             C   s   t jd| jtjS )Nr   )r   r   r   r   Zte_login_user_types)r   r   r   r   r   G  s    z policy.generate_login_user_typesc             C   s   t jd| jtjS )Nr   )r   r   r   r   Zte_admin_user_types)r   r   r   r   r   J  s    z policy.generate_admin_user_typesc             C   s   t | jdkr$ttdt| j  tjd| jt	j
}|d7 }xB| jD ]8}|d| 7 }|jdd d }|| jkrF|d| 7 }qFW |d	7 }|S )
Nr   z,'%s' policy modules require existing domainsr   zgen_require(`z
        type %s;r  r  z

	role %s;z
')
)rK   r   rL   r   rC   r'   r   r   r   r   Zte_existing_user_typesr   rk   )r   r   r  r  r   r   r   r~   M  s    

z#policy.generate_existing_user_typesc             C   s   t jd| jtjS )Nr   )r   r   r   r   Zte_x_login_user_types)r   r   r   r   r   _  s    z"policy.generate_x_login_user_typesc             C   s   t jd| jtjS )Nr   )r   r   r   r   Zte_root_user_types)r   r   r   r   r   b  s    zpolicy.generate_root_user_typesc          	   C   s   d}t | jdkrttdxj| jD ]`}xZ| jD ]P}|j|r2t||d t |   |tjd|d t |  | j| j	7 }P q2W q&W t
r|dkrg }x| jD ]}|j| qW ttddj| |S )NrH   r   zType field requiredr   z3You need to define a new type which ends with: 
 %sz
 )rK   rl   rL   r   rp   endswithr#   r   r   r   r   rN   r  )r   r   tr   Zdefault_extr   r   r   r   e  s    
(
zpolicy.generate_new_typesc             C   s   dS )NrH   r   )r   r   r   r   r   y  s    zpolicy.generate_new_rulesc             C   s6   t jd| jtj}| jdkr2|t jd| jtj7 }|S )Nr   rH   )r   r   r   r   Zte_daemon_typesr   Zte_initscript_types)r   r   r   r   r   rr   |  s    
zpolicy.generate_daemon_typesc             C   s    | j rtjd| jtjS dS d S )Nr   rH   )r   r   r   r   r   r   )r   r   r   r   generate_tmp_types  s    zpolicy.generate_tmp_typesc             C   s@   d}x6| j D ],}tjd|tj}|tjd| j | |7 }qW |S )NrH   BOOLEANZDESCRIPTION)r   r   r   r   Z
te_boolean)r   r   br   r   r   r   generate_booleans  s
    zpolicy.generate_booleansc             C   s,   d}x"| j D ]}|tjd|tj7 }qW |S )NrH   r&  )r   r   r   r   te_rules)r   r   r'  r   r   r   generate_boolean_rules  s    zpolicy.generate_boolean_rulesc             C   s   t jd| jtjS )Nr   )r   r   r   r   r"  )r   r   r   r   generate_sandbox_te  s    zpolicy.generate_sandbox_tec             C   s   t jd| jtjS )Nr   )r   r   r   r   r!  )r   r   r   r   generate_cgi_te  s    zpolicy.generate_cgi_tec             C   s   t jd| jtj}|S )Nr   )r   r   r   r   Zte_daemon_rules)r   r  r   r   r   rs     s    zpolicy.generate_daemon_rulesc          	   C   sr   d}xh| j D ]^}xX| jD ]N}|j|r|d t|  d }|tjd|d t|  | j| j7 }P qW qW |S )NrH   r  r   )rl   rp   r#  rK   r   r   if_rules)r   r  r$  r   Zreqtyper   r   r   generate_new_type_if  s    
(
zpolicy.generate_new_type_ifc             C   s   t jd| jtjS )Nr   )r   r   r   r   Zte_login_user_rules)r   r   r   r   r     s    z policy.generate_login_user_rulesc             C   s   t jd| jtj}|S )Nr   )r   r   r   r   Zte_existing_user_rules)r   Znerulesr   r   r   r     s    z#policy.generate_existing_user_rulesc             C   s   t jd| jtjS )Nr   )r   r   r   r   Zte_x_login_user_rules)r   r   r   r   r     s    z"policy.generate_x_login_user_rulesc             C   s   t jd| jtj}|S )Nr   )r   r   r   r   Zte_root_user_rules)r   r   r   r   r   r     s    zpolicy.generate_root_user_rulesc             C   s   t jd| jtjS )Nr   )r   r   r   r   Zte_userapp_rules)r   r   r   r   r}     s    zpolicy.generate_userapp_rulesc             C   s   t jd| jtjS )Nr   )r   r   r   r   Zte_inetd_rules)r   r   r   r   rw     s    zpolicy.generate_inetd_rulesc             C   s   t jd| jtjS )Nr   )r   r   r   r   Zte_dbusd_rules)r   r   r   r   ru     s    zpolicy.generate_dbusd_rulesc             C   s    | j rtjd| jtjS dS d S )Nr   rH   )r   r   r   r   r   r)  )r   r   r   r   generate_tmp_rules  s    zpolicy.generate_tmp_rulesc             C   s   d}|t jd| jtj7 }|S )NrH   r   )r   r   r   r   Zte_cgi_rules)r   r   r   r   r   ry     s    zpolicy.generate_cgi_rulesc             C   s   d}|t jd| jtj7 }|S )NrH   r   )r   r   r   r   Zte_sandbox_rules)r   r   r   r   r   r{     s    zpolicy.generate_sandbox_rulesc             C   sR   d}| j s| jtkr&tjd| jtj}| jtt	t
tfkrN|tjd| jtj7 }|S )NrH   r   )r   r'   r4   r   r   r   r   Zif_user_program_rulesTUSERXUSERAUSERLUSERZif_role_change_rules)r   r  r   r   r   generate_user_if  s    zpolicy.generate_user_ifc             C   sD  d}|t jd| jtj7 }| jr6|t jd| jtj7 }| jdkrV|t jd| jtj7 }x| j	D ]}t
| j| d dkr^|t jd| j| j| d j7 }xZ| j| d D ]H}tjj|rtjtj|tj r|t jd| j| j| d j7 }P qW q^W || j 7 }|| j 7 }|| j 7 }|| j 7 }|| j 7 }|| j 7 }|S )NrH   r   r   r   r9   )r   r   r   r   Zif_heading_rulesr   Zif_program_rulesr   Zif_initscript_rulesrq   rK   ro   r-  ospathexistsstatS_ISSOCKST_MODEZif_stream_rulesr4  r  r   r  r.  r   )r   r  r  r   r   r   r   generate_if  s(    
 " 
zpolicy.generate_ifc             C   s   | j | j d  S )Nr   )r   r'   )r   r   r   r   generate_default_types  s    zpolicy.generate_default_typesc             C   s&   | j | j d r"| j | j d  S dS )Nr   rH   )r   r'   )r   r   r   r   generate_default_rules  s    zpolicy.generate_default_rulesc             C   s   d}| j ttttfkrd}t| jdkr|tjd| j	t
j7 }|tjd| j	t
j7 }x2| jD ](}tjd| j	t
j}|tjd||7 }q\W |S )NrH   r   r   ZROLE)r'   r0  r1  r2  r3  rK   r   r   r   r   r   Zte_sudo_rulesZte_newrole_rulesZte_roles_rules)r   r   r   r  r   r   r   r   generate_roles_rules  s    zpolicy.generate_roles_rulesc          	   C   s  | j  }xV| jD ]L}t| j| d dkr| jtks<|dkr|tjd| j| j| d j	7 }qW | jt
krx|d| j 7 }|| j 7 }|| j 7 }|| j 7 }|| j 7 }|| j 7 }|| j 7 }|| j 7 }xT| jD ]H}t| j| d dkr| jt
krXd}xt| jD ]H}|tjd|d d d	 | j| d j7 }|tjd
| jd |7 }q
W n |tjd| j| j| d j7 }x| j| d D ]}tjj|rtjtj|tj r| jt
krxX| jD ],}|tjd|d d | j| d j7 }qW n |tjd| j| j| d j7 }P qW qW || j 7 }|| j 7 }|| j 7 }|| j 7 }|| j 7 }|| j  7 }|| j! 7 }|| j" 7 }|| j# 7 }|| j$ 7 }|| j% 7 }|| j& 7 }|| j' 7 }|| j( 7 }|| j) 7 }|| j* 7 }|| j+ 7 }|S )Nr   r   r   r   r9   z@
########################################
#
# %s local policy
#
rH   ZTEMPLATETYPE_tr  ZTEMPLATETYPE_rw_tZ_rw_tr   r   ),r<  rq   rK   ro   r'   r   r   r   r   r   r   r  r  r   r%  r(  r=  r*  r   r)  r5  r6  r7  r8  r9  r:  Zte_stream_rulesr/  r  r   r   r   r   r   r   r   r   r>  r   r  r  r   r   r   )r   r   r  Z	newte_tmpZdomainr   r   r   r   generate_te  s`    $
*  &. zpolicy.generate_tec             C   s  d}g }x| j j D ]}tjj|rXtjtj|tj rXtj	d| j
| j | d j}ntj	d| j
| j | d j}tj	d||}|jtj	d| j | d | qW xZ| jj D ]L}tj	d| j
| j| d j}tj	d||}|jtj	d| j| d | qW | jttg kr&t|dkr&tjS | jttttg krR| j rRttd| jrtj	d| jtj}|jtj	d| j
| | jdkrtj	d| jtj}|jtj	d| j
| |j  d	j|}|S )
NrH   r   r9   FILENAMEZFILETYPEr   z<You must enter the executable path for your confined processZ
EXECUTABLEr  ) r   rD   r5  r6  r7  r8  r9  r:  r   r   r   Zfc_sock_fileZfc_filerN   r   Zfc_dirr'   r   r  rK   r   Zfc_userr   r   r   rL   r   Z
fc_programr   Zfc_initscriptr6   r  )r   ZnewfcZfclistr   t1Zt2r   r   r   generate_fcD  s4    """ 
zpolicy.generate_fcc             C   s   d}| j tttttfkr|S d}x| jD ]}|d| 7 }q(W |dkrL|d7 }tjd| j	t
j}|tjd||7 }| j tks| j tkrx2| jD ](}tjd| j	t
j}|tjd||7 }qW | j tkr|tjd| j	t
j7 }n|tjd| j	t
j7 }|S )NrH   z %s_rz	 system_rr   ZROLESr4   )r'   r0  r1  r2  r3  r  r   r   r   r   r   r7   r   Zadmin_transZmin_login_user_default_contextZx_login_user_default_context)r   newshr   r  r   r  r   r   r   generate_user_shg  s$    
zpolicy.generate_user_shc             C   s  t jd| jtj}t jd| j|}| jtkrBt jdd| j |}n&t jd| j|}|t jd| jtj7 }| j	r|t jd| j	tj
7 }| jdkr|t jd| jtj
7 }x&| jj D ]}|t jd|tj
7 }qW x&| jj D ]}|t jd|tj
7 }qW xX| jt | jt  D ]@}| j|dd kr
t jdd	| tj}|t jd| j|7 }q
W xN| jt D ]@}| j|d
d krZt jdd	| tj}|t jd| j|7 }qZW || j 7 }tjddd dkr|t jd| jtj7 }|S )Nr   Z
DOMAINTYPEZTEMPLATEFILEz%sr@  rH   r   ZPORTNUMz%dr   r   )full_distribution_nameredhatcentosSuSEfedoramandrakemandriva)rF  rG  rH  rI  rJ  rK  )r   r   r   r   compiler   r'   r   Zmanpager   Z
restoreconr   r   rD   r   r   r   r   r   Z	tcp_portsr   Z	udp_portsrD  platformlinux_distributionr!   )r   rP   rC  r   rA  r   r   r   generate_sh  s4    

zpolicy.generate_shc             C   s  d}t d}|d krd}n|d }|tj7 }| jtkr|tj7 }| jr\|tjd| jtj	7 }| j
dkr||tjd| j
tj	7 }x&| jj D ]}|tjd|tj	7 }qW x&| jj D ]}|tjd|tj	7 }qW |tjd|tj7 }tjd| j|}tjd| j|}t| jd	kr$|d
dj| j 7 }|tjd| jtj7 }tjd| j|}tjdtjd|}| jtkrxtjdd|}| jtkrtjd| j d|}| jtttttfkrtjd| j d|}|S )NrH   zselinux-policyz0.0.0r   r@  VERSIONZ
MODULENAMEZ
DOMAINNAMEr   zRequires(post): %s
z, Z
TODAYSDATEz%a %b %e %Yz%relabel_filesz.*%s_selinux.8.*z.*%s_u.*)r&   r   Zheader_comment_sectionr'   r   Zdefine_relabel_files_beginr   r   r   Zdefine_relabel_files_endr   r   rD   r   Zbase_sectionr   r   rK   rj   r  Zmid_sectiontimeZstrftimer   r0  r1  r2  r3  r  )r   ZnewspecZselinux_policynvrZselinux_policyverr   r   r   r   generate_spec  s>    



zpolicy.generate_specc             C   s2   d|| j f }t|d}|j| j  |j  |S )Nz%s/%s_selinux.specw)r   openwriterR  close)r   out_dirZspecfilefdr   r   r   
write_spec  s
    
zpolicy.write_specc             C   s2   d|| j f }t|d}|j| j  |j  |S )Nz%s/%s.terS  )r   rT  rU  r?  rV  )r   rW  ZtefilerX  r   r   r   write_te  s
    
zpolicy.write_tec             C   s>   d|| j f }t|d}|j| j  |j  tj|d |S )Nz%s/%s.shrS  i  )r   rT  rU  rO  rV  r5  chmod)r   rW  ZshfilerX  r   r   r   write_sh  s    
zpolicy.write_shc             C   s2   d|| j f }t|d}|j| j  |j  |S )Nz%s/%s.ifrS  )r   rT  rU  r;  rV  )r   rW  ZiffilerX  r   r   r   write_if  s
    
zpolicy.write_ifc             C   s2   d|| j f }t|d}|j| j  |j  |S )Nz%s/%s.fcrS  )r   rT  rU  rB  rV  )r   rW  ZfcfilerX  r   r   r   write_fc  s
    
zpolicy.write_fcc       
      C   sD  dd l }|j (}|j  |jdd |jj }|j }|j| jd}x|D ]}| j	j
|j xT|jD ]J}xD| jD ]:}|dkrqt|j|rttjj|r| j| qt| j| qtW qhW |j }|j|jd}xd|D ]\}	xV|	jD ]L}xF| jD ]<}|dkrq|j|rtjj|r| j| q| j| qW qW qW qNW W d Q R X d S )Nr   T)Zload_system_repo)r  z/etc)Zprovides)dnfZBaseZread_all_reposZ	fill_sackZsackqueryZ	availablefilterr   rj   rN   r   r   ro   
startswithr5  r6  isfiler	  r
  Zsource_name)
r   r_  baser`  ZpqZpkgZfnamer'  ZsqZbpkgr   r   r   Z__extract_rpms  s8    




zpolicy.__extract_rpmsc             C   s  y| j   W n tk
r    Y nX tjjd| j rD| jd| j  tjjd| j rf| jd| j  tjjd| j r| jd| j  tjjd| j r| jd| j  tjjd| j r| jd| j  tjjd| j r| j	d| j  g }x| j
j D ]}g }y| j
| d d	 d
 }W n tk
r8   wY nX x4| j
| d D ]"}|j|rJ|j| nqJqJW t|d	krxF|D ]>}|| jj kr| j|= n|| jj kr| j|= nqqW tt| j
| d t| | j
| d< qW d S )Nz/var/run/%s.pidz/var/run/%sz/var/log/%sz/var/log/%s.logz/var/lib/%sz/etc/rc.d/init.d/%sz/etc/rc\.d/init\.d/%sr   r   /)_policy__extract_rpmsImportErrorr5  r6  rc  r   r	  isdirr
  r   ro   rD   
IndexErrorrb  rN   rK   r   r   listset)r   Ztemp_basepathr.   Z	temp_dirsr   r   r   r   gen_writeable  sF    




zpolicy.gen_writeablec             C   s   | j tkrd S tjj| js2tjjd| j  d S tj	d| j }x@|j
 j D ]0}x*| jD ] }|j|r\td| j|   q\W qPW |j  d S )Nzl
***************************************
Warning %s does not exist
***************************************

znm -D %s | grep Uzself.%s)r'   r   r5  r6  r7  r   sysstderrrU  popenreadr   rn   rb  execrV  )r   rX  sr'  r   r   r   gen_symbolsJ  s    

zpolicy.gen_symbolsc             C   s   d}|d| j |tdf 7 }|d| j|tdf 7 }|d| j|tdf 7 }| jtkrtjddd dkr|d| j|tdf 7 }|d| j	|tdf 7 }|S )NzCreated the following files:
z%s # %s
zType Enforcement filezInterface filezFile Contexts filer   )rE  rF  rG  rH  rI  rJ  rK  z	Spec filezSetup Script)rF  rG  rH  rI  rJ  rK  )
rZ  r   r]  r^  r'   r   rM  rN  rY  r\  )r   rW  outr   r   r   generate\  s    
zpolicy.generateN)r   )w__name__
__module____qualname__r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r	  r
  r  r  r  r  r  r  r  r   rx   rz   r|   rv   rt   r   r   r   r~   r   r   r   r   rr   r%  r(  r*  r+  r,  rs   r.  r   r   r   r   r}   rw   ru   r/  ry   r{   r4  r;  r<  r=  r>  r?  rB  rD  rO  rR  rY  rZ  r\  r]  r^  rf  rl  rs  r5  getcwdru  r   r   r   r   rV      s    B
	&8
	>#$*$3rV   )r   )Gr5  rm  r8  r   r*   r   r   r   rQ  rM  Z	templatesr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   Zsepolgen.interfacesZ
interfacesZsepolgen.defaultsZdefaultsZPROGNAMEgettextkwargsversion_infoZinstallbuiltinsstr__dict__rg  Z__builtin__r   r    r&   r/   r8   r   r   r   r   ZADMIN_TRANSITION_INTERFACEZUSER_TRANSITION_INTERFACEr   r   ZINETDr   r  r4   r   r0  r1  r3  r2  r  r   rC   r   rG   r   r   rU   rV   r   r   r   r   <module>   s   

