
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
3
Yj1                 @   s   d dl jZd dlZd dlZd dlZd dlmZ d dlmZm	Z	m
Z
mZ d dlmZ d dlmZmZmZmZmZmZ d dlmZ d dlmZ G dd	 d	e
ZG d
d de	ZdS )    N)config)PY2	IO_ObjectIO_Object_ContentHandlerIO_Object_XMLGenerator)log)uniqify	checkUsercheckUidcheckCommandcheckContext
u2b_if_py2)errors)FirewallErrorc               @   s   e Zd Zdd Zdd ZdS )!lockdown_whitelist_ContentHandlerc             C   s   t j| | d| _d S )NF)r   __init__	whitelist)selfitem r   (/usr/lib/python3.6/lockdown_whitelist.pyr   %   s    z*lockdown_whitelist_ContentHandler.__init__c             C   sV  t j| || | jj|| |dkr@| jr6ttjdd| _n|dkrr| js\tj	d d S |d }| jj
| n|dkr| jstj	d d S d	|kryt|d	 }W n& tk
r   tj	d
|d	   d S X | jj| nd|kr| jj|d  n\|dkr@| jstj	d d S d|kr.tj	d d S | jj|d  ntj	d|  d S d S )Nr   zMore than one whitelist.Tcommandz)Parse Error: command outside of whitelistnameuserz&Parse Error: user outside of whitelistidz"Parse Error: %s is not a valid uidselinuxz)Parse Error: selinux outside of whitelistcontextzParse Error: no contextzUnknown XML element %s)r   startElementr   Zparser_check_element_attrsr   r   r   ZPARSE_ERRORr   erroradd_commandint
ValueErroradd_uidadd_useradd_context)r   r   Zattrsr   uidr   r   r   r   )   sJ    






z.lockdown_whitelist_ContentHandler.startElementN)__name__
__module____qualname__r   r   r   r   r   r   r   $   s   r   c                   s4  e Zd ZdZddgfddgfddgfddgffZdZd	gZd
dgd
dgdZdddgiZ f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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"  Z#S )DLockdownWhitelistz LockdownWhitelist class commands contextsusersuidsr   z
(asasasai)_Nr   r   )r   r   r   r   r   r   c                s6   t t| j  || _d | _g | _g | _g | _g | _d S )N)	superr)   r   filenameparserr*   r,   r-   r.   )r   r1   )	__class__r   r   r   n   s    zLockdownWhitelist.__init__c             C   s   |d
kr.x|D ]}| j ||d d | qW nv|dkrLt|sttj|nX|dkrjt|sttj|n:|dkrt|sttj|n|d	krt	|sttj
|d S )Nr*   r,   r-   r.      r   r   r   r%   )r*   r,   r-   r.   )_check_configr   r   r   INVALID_COMMANDr   INVALID_CONTEXTr	   INVALID_USERr
   INVALID_UID)r   r   r   Z
all_configxr   r   r   r6   y   s    
zLockdownWhitelist._check_configc             C   s4   | j d d = | jd d = | jd d = | jd d = d S )N)r*   r,   r-   r.   )r   r   r   r   cleanup   s    zLockdownWhitelist.cleanupc             C   s:   dd | j D | _ dd | jD | _dd | jD | _dS )z HACK. I haven't been able to make sax parser return
            strings encoded (because of python 2) instead of in unicode.
            Get rid of it once we throw out python 2 support.c             S   s   g | ]}t |qS r   )r   ).0r;   r   r   r   
<listcomp>   s    z4LockdownWhitelist.encode_strings.<locals>.<listcomp>c             S   s   g | ]}t |qS r   )r   )r=   r;   r   r   r   r>      s    c             S   s   g | ]}t |qS r   )r   )r=   r;   r   r   r   r>      s    N)r*   r,   r-   )r   r   r   r   encode_strings   s    z LockdownWhitelist.encode_stringsc             C   s@   t |sttj||| jkr,| jj| nttjd| d S )Nz!Command "%s" already in whitelist)r   r   r   r7   r*   appendALREADY_ENABLED)r   r   r   r   r   r      s    
zLockdownWhitelist.add_commandc             C   s,   || j kr| j j| nttjd| d S )NzCommand "%s" not in whitelist.)r*   remover   r   NOT_ENABLED)r   r   r   r   r   remove_command   s    
z LockdownWhitelist.remove_commandc             C   s
   || j kS )N)r*   )r   r   r   r   r   has_command   s    zLockdownWhitelist.has_commandc             C   sB   x<| j D ]2}|jdr.|j|d d r:dS q||krdS qW dS )N*r4   TFr5   )r*   endswith
startswith)r   r   Z_commandr   r   r   match_command   s    
zLockdownWhitelist.match_commandc             C   s   | j S )N)r*   )r   r   r   r   get_commands   s    zLockdownWhitelist.get_commandsc             C   sD   t |sttjt||| jkr0| jj| nttjd| d S )NzUid "%s" already in whitelist)r
   r   r   r:   strr.   r@   rA   )r   r%   r   r   r   r"      s    
zLockdownWhitelist.add_uidc             C   s,   || j kr| j j| nttjd| d S )NzUid "%s" not in whitelist.)r.   rB   r   r   rC   )r   r%   r   r   r   
remove_uid   s    
zLockdownWhitelist.remove_uidc             C   s
   || j kS )N)r.   )r   r%   r   r   r   has_uid   s    zLockdownWhitelist.has_uidc             C   s
   || j kS )N)r.   )r   r%   r   r   r   	match_uid   s    zLockdownWhitelist.match_uidc             C   s   | j S )N)r.   )r   r   r   r   get_uids   s    zLockdownWhitelist.get_uidsc             C   s@   t |sttj||| jkr,| jj| nttjd| d S )NzUser "%s" already in whitelist)r	   r   r   r9   r-   r@   rA   )r   r   r   r   r   r#      s    
zLockdownWhitelist.add_userc             C   s,   || j kr| j j| nttjd| d S )NzUser "%s" not in whitelist.)r-   rB   r   r   rC   )r   r   r   r   r   remove_user   s    
zLockdownWhitelist.remove_userc             C   s
   || j kS )N)r-   )r   r   r   r   r   has_user   s    zLockdownWhitelist.has_userc             C   s
   || j kS )N)r-   )r   r   r   r   r   
match_user   s    zLockdownWhitelist.match_userc             C   s   | j S )N)r-   )r   r   r   r   	get_users   s    zLockdownWhitelist.get_usersc             C   s@   t |sttj||| jkr,| jj| nttjd| d S )Nz!Context "%s" already in whitelist)r   r   r   r8   r,   r@   rA   )r   r   r   r   r   r$   "  s    
zLockdownWhitelist.add_contextc             C   s,   || j kr| j j| nttjd| d S )NzContext "%s" not in whitelist.)r,   rB   r   r   rC   )r   r   r   r   r   remove_context,  s    
z LockdownWhitelist.remove_contextc             C   s
   || j kS )N)r,   )r   r   r   r   r   has_context3  s    zLockdownWhitelist.has_contextc             C   s
   || j kS )N)r,   )r   r   r   r   r   match_context6  s    zLockdownWhitelist.match_contextc             C   s   | j S )N)r,   )r   r   r   r   get_contexts9  s    zLockdownWhitelist.get_contextsc             C   s   | j   | jjds&ttjd| j t| }tj }|j	| y|j
| j W n8 tjk
r } zttjd|j  W Y d d }~X nX ~~tr| j  d S )Nz.xmlz'%s' is missing .xml suffixzNot a valid file: %s)r<   r1   rG   r   r   ZINVALID_NAMEr   saxZmake_parserZsetContentHandlerparseZSAXParseExceptionZINVALID_TYPEZgetExceptionr   r?   )r   handlerr2   msgr   r   r   read>  s"    
zLockdownWhitelist.readc             C   s  t jj| jr\ytj| jd| j  W n4 tk
rZ } ztd| j|f W Y d d }~X nX t jjtj	sxt j
tj	d tj| jddd}t|}|j  |jdi  |jd x6t| jD ](}|jd	 |jd
d|i |jd qW x:t| jD ],}|jd	 |jddt|i |jd qW x8t| jD ]*}|jd	 |jdd|i |jd q0W x8t| jD ]*}|jd	 |jdd|i |jd qjW |jd |jd |j  |j  ~d S )Nz%s.oldzBackup of '%s' failed: %si  ZwtzUTF-8)modeencodingr   
z  r   r   r   r   r   r   )ospathexistsr1   shutilZcopy2	ExceptionIOErrorr   ZETC_FIREWALLDmkdirioopenr   ZstartDocumentr   ZignorableWhitespacer   r*   ZsimpleElementr.   rK   r-   r,   Z
endElementZendDocumentclose)r   r[   frZ   r   r%   r   r   r   r   r   writeQ  sB    $






zLockdownWhitelist.write)$r&   r'   r(   __doc__ZIMPORT_EXPORT_STRUCTUREZDBUS_SIGNATUREZADDITIONAL_ALNUM_CHARSZPARSER_REQUIRED_ELEMENT_ATTRSZPARSER_OPTIONAL_ELEMENT_ATTRSr   r6   r<   r?   r   rD   rE   rI   rJ   r"   rL   rM   rN   rO   r#   rP   rQ   rR   rS   r$   rT   rU   rV   rW   r\   rk   __classcell__r   r   )r3   r   r)   W   sL   

	


1
r)   )Zxml.saxrX   r`   rg   rc   Zfirewallr   Zfirewall.core.io.io_objectr   r   r   r   Zfirewall.core.loggerr   Zfirewall.functionsr   r	   r
   r   r   r   r   Zfirewall.errorsr   r   r)   r   r   r   r   <module>   s   
 3