o
    Fa|                     @   s   d dl Z d dlZd dlZd dlmZ d dlmZ G dd dZG dd deZG dd	 d	eZ	G d
d deZ
G dd deZG dd deZG dd deZG dd deZG dd deZG dd dZG dd dZdS )    NUFWError)debugc                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	
UFWCommandz"Generic class for parser commands.c                 C   s,   || _ g | _|| jvr| j| || _d S N)commandtypesappendtype)selfr
   r    r   ,/usr/lib/python3/dist-packages/ufw/parser.py__init__.   s
   

zUFWCommand.__init__c                 C   s&   t |dk r	t t|d  }|S )N   r   )len
ValueErrorUFWParserResponselowerr   argvrr   r   r   parse5   s   zUFWCommand.parsec                 C   s   t d)Nz!UFWCommand.help: need to overrider   )r   argsr   r   r   help=   s   zUFWCommand.helpN)__name__
__module____qualname____doc__r   r   r   r   r   r   r   r   ,   s
    r   c                   @   s0   e Zd ZdZdd Zdd Zdd ZeeZdS )	UFWCommandRulez#Class for parsing ufw rule commandsc                 C      d}t | || d S )Nruler   r   r   r   r
   r   r   r   r   C      zUFWCommandRule.__init__c               
   C   s  d}d}d}d}d}d}d}d}	d}
d}t |dkr)|d  dkr)||d  t |dkr|d  dkrkt |dkrkd}||d  d }zt|d }W n ty]   |d }Y nw |d urjtd	| }|S n;|d  d
krt |dk r|t |d }	|	dks|	dkrtd|	 }t||d= |d= n|d  dkrd}	|d= |d }|dkr|dkr|dkr|dkrt t |}|dk rt d}|dkr|d  dks|d  dkr|d  }|dkr|d dkr|d  dks|d  dkr|d  }|d= t |}d}|dkr[|	ddks&|	ddkr[td}|d  dkr@|d  dkr@t||dk sN|d  dkrRt||d= t |}d}d}|rz|dkrz|d  dksw|d  dkrzd}n|dkr|d  dks|d  dkrd}|dkr||  }
||= t |}d|v rtd}t|d|v rtd}t|d}d|v r|
d}|t |d krtd }t|||d  }d!|v rtd"}t|||d = ||= t |}|dk s|d#krt |}|
dkr|d$|
 7 }tjj|dd|tj|d%}|r+||_n|	dkrAz||	 W n	 ty@    w |dkrtj|d rsz
tj|d  W n tyr   d&}|d |_||d d' Y nw |jdkrztj|d \}}W n ty } zt|d }~ww td(|sd)|v sd*|v rtd+}t||}z|| ||d' d&}W nc ty   td,}t|w nQ|d d dkrtd-}t|d.|vrd/|vrd|vrd|vrtd0}t|g d1}|	d/dksN|	d.dksN|	d2dksN|	d3dksN|	ddksN|	ddksN|	d4dksN|	d4dkrV|	d2dkrVtd5}t|d}d}|D ]}|d dkry|| |vrytd6||  }t||d2kr|d |k rz|||d   W n[ ty    w td7}t||dks|dkr|d |k rz"|dkr|d||d   n|dkr|d||d   W n ty    w td8| }t||d.kr1|d |k r)z&||d   }|dkr	d9}d}ntj|d:rd;}nd<}|| W n	 ty%    w d=}ntd>}t||d/krx|d |k rpz&||d   }|dkrPd9}d}ntj|d:r[d;}nd<}|| W n	 tyl    w d'}n}td?}t||d3ks|d4kr|d |k r|dkrtd@| }t|||d  }|d4kr|d=kr||_n'||_n#td(|sd)|v sd*|v rtd+}t||d=kr|}n|}z||| W n ty    w tdA}t||d7 }q\|dkr |dkr d&}n&|dkr|dkr||krtdB}t||dkr|}n|dkr&|}|dks0|dkrd}|dkrPztj|}W n tyO   tdC}t|w |dkr|dks_|dkrxztj|}W nD tyw   tdC}t|w ztj|}W n ty   tdC}t|w |dks||kr|}n|dkrntdD}t||jdkr|| n|dkr|j|krtdE|j }t||r|jtjj v r|d&krt!dF|j  d<}|"| t|}| j#|j$dG< ||j$d< ||j$dH< |S )IN anyFr   r    deleter   Tz	delete-%dinsert   0z-1z#Cannot insert rule at position '%s'prependallowdenyrejectlimit   inoutonzInvalid interface clause   logzlog-allzOption 'log' not allowed herez!Option 'log-all' not allowed herecommentz*Option 'comment' missing required argument'zComment may not contain "'"   _)	directionr6   bothdstz^\d([0-9,:]*\d+)*$,:zPort ranges must be numericzBad portzWrong number of argumentsfromtozNeed 'to' or 'from' clause)protor?   r@   portappr1   r2   rA   rB   rC   zImproper rule syntaxzInvalid token '%s'zInvalid 'proto' clausezInvalid '%s' clause	0.0.0.0/06v6v4srczInvalid 'from' clausezInvalid 'to' clausezNeed 'from' or 'to' with '%s'zInvalid 'port' clausez%Mixed IP versions for 'from' and 'to'zCould not find protocolzProtocol mismatch (from/to)z,Protocol mismatch with specified protocol %sz*Adjusting iptype to 'v4' for protocol '%s'r
   iptype)%r   r   removeint	Exceptionr   r   r9   r   countindexufwcommonUFWRuleutil
hex_encodeset_positionapplicationsvalid_profile_nameget_services_protodappset_portparse_port_protorematchset_protocolset_interfacevalid_addressset_srcset_dstsappprotocolipv4_only_protocolsr   verifyr
   data) r   r   actionr    r
   	from_typeto_typefrom_service
to_service
insert_poslogtyperJ   rule_numr   err_msgnargsrule_directionhas_interfacelog_idxr6   comment_idxrule_actionrB   rA   ekeysilocargfaddrsaddrtmpr   r   r   r   G   sj  **$"














 





















zUFWCommandRule.parsec                 C   s  | j }| jdks| jdkr| jdks| jdkr| jdkr| jdkr| jdkr| jdkr| jdkr| jdkr<|d| j 7 }| j	dkrH|d| j	 7 }| j
dkrbd| j
v rZ|d| j
 7 }n|d| j
 7 }n|d| j 7 }| jdkru|d	| j 7 }| jdkr|d
|   7 }|S | jdkr|d| j 7 }| jdkr|d| j 7 }n| jdkr|d| j 7 }| j	dkr|d| j	 7 }dD ]_}|dkr| j}| j}| j}d}n| j}| j}| j
}d}|dks|dkrd}|dks|dks|dkr|d||f 7 }|dkrd|v r|d| 7 }q|d| 7 }q|dkr|d| 7 }qd|vr1d|vr1| jdkr1| jdkr1|d7 }| jdkrJ| j
dkrJ| jdkrJ|d| j 7 }| jdkrX|d
|   7 }|S )zGet command string for rulerD   z::/0r%   r$   r2   z %s z '%s'z/%sz comment '%s'z	 in on %sz
 out on %s)rH   r<   rH   r?   r@   z %s %sz	 app '%s'z app %sz port %sz to z from z to anyz	 proto %s)rg   r<   rH   sportrb   interface_ininterface_outdportr:   rm   rX   rc   r6   get_comment)r   resrx   ry   rB   rC   dirr   r   r   get_command  sv   










2






$zUFWCommandRule.get_commandN)r   r   r   r   r   r   r   staticmethodr   r   r   r   r   A   s       Mr   c                   @       e Zd ZdZdd Zdd ZdS )UFWCommandRouteRulez)Class for parsing ufw route rule commandsc                 C   s   t | | d| _d S )Nroute)r   r   r
   )r   r   r   r   r   r     s   
zUFWCommandRouteRule.__init__c           	      C   sh  |d dksJ d|v r3| d}d}t||kr3zt||d   td}t| ty2   Y nw d }d }d }d|}d|v rrd	|v rrd
}| d| d
krTd}|| |d  }|d| | || |d d   }ntd|std|sd|v sd|v rtd}t||}d|d< t	
| |}d|jv rd|jd _|r|r|jd || |S )Nr   r   r&   r$   r   z9'route delete NUM' unsupported. Use 'delete NUM' instead.r~   z in on z out on r2   r1   r0   r4   z (in|out) on z app (in|out) z in z out z'Invalid interface clause for route ruler    T)rN   r   rK   r9   r   r   joinr[   searchr   r   rf   forwardr^   )	r   r   idxro   	rule_argv	interfacestripsr   r   r   r   r     sH   
	
*

zUFWCommandRouteRule.parseNr   r   r   r   r   r   r   r   r   r   r         r   c                   @   r   )UFWCommandAppz*Class for parsing ufw application commandsc                 C   r   )NrC   r!   r"   r   r   r   r   Z  r#   zUFWCommandApp.__init__c                 C   sJ  d}d}d}|d dkrt  |d= t|}|d  }|dks$|dkrO|dkr9|d d	kr9d
}|d	 t|}|dk r@t  t|d d}|rO|d7 }|dkrZ|dkrZt  |dkr|dk ret  |d  dkrpd}n$|d  dkr{d}n|d  dkrd}n|d  dkrd}nt  t|}| j|jd< ||jd< |S )zParse applications command.r$   Fr   rC   infoupdater4   r   z	--add-newTr0   z[']z	-with-newlistdefaultr,   default-allowr-   default-denyr.   default-rejectskipzdefault-skipr
   name)	r   r   r   rJ   strr   r   r
   rf   )r   r   r   rg   addnewrp   r   r   r   r   r   ^  sH   

zUFWCommandApp.parseNr   r   r   r   r   r   X  r   r   c                   @   r   )UFWCommandBasicz$Class for parsing ufw basic commandsc                 C   r   )Nbasicr!   r"   r   r   r   r     r#   zUFWCommandBasic.__init__c                 C   s   t |dkr	t t| |S )Nr   )r   r   r   r   )r   r   r   r   r   r     s   zUFWCommandBasic.parseNr   r   r   r   r   r     r   r   c                   @   r   )UFWCommandDefaultz&Class for parsing ufw default commandsc                 C   r   )Nr   r!   r"   r   r   r   r     r#   zUFWCommandDefault.__init__c                 C   sJ  t |dk r	t d}d}t |dkrw|d  dkrF|d  dkrF|d  dkrF|d  dkrF|d  dkrF|d  dkrFt |d  d	rRd}n%|d  d
r^d}n|d  dksn|d  dkrqd}n|d  }|d  dkrd}n|d  dkrd}n|d  dkrd}nt |d| 7 }t|S )Nr0   r$   incominginputroutedr   outputoutgoingr1   r2   r   r-   r   r,   r   r.   r   z-%s)r   r   r   
startswithr   )r   r   rg   r:   r   r   r   r     s8    zUFWCommandDefault.parseNr   r   r   r   r   r     r   r   c                   @   r   )UFWCommandLoggingz&Class for parsing ufw logging commandsc                 C   r   )Nloggingr!   r"   r   r   r   r     r#   zUFWCommandLogging.__init__c                 C   s   d}t |dk rt |d  dkrd}t|S |d  dksA|d  dksA|d  dksA|d  d	ksA|d  d
krYd}|d  dkrU|d|d   7 }t|S t )Nr$   r0   r   offzlogging-offr3   lowmediumhighfullz
logging-onr9   r   r   r   r   r   r   rg   r   r   r   r     s   
  zUFWCommandLogging.parseNr   r   r   r   r   r     r   r   c                   @   r   )UFWCommandStatusz%Class for parsing ufw status commandsc                 C   r   )Nstatusr!   r"   r   r   r   r     r#   zUFWCommandStatus.__init__c                 C   sl   t | |}t|dkrd|_|S t|dkr4|d  dkr$d|_|S |d  dkr1d|_|S t |S )Nr   r   verbosezstatus-verbosenumberedzstatus-numbered)r   r   r   rg   r   r   r   r   r   r   r     s   zUFWCommandStatus.parseNr   r   r   r   r   r     r   r   c                   @   r   )UFWCommandShowz#Class for parsing ufw show commandsc                 C   r   )Nshowr!   r"   r   r   r   r     r#   zUFWCommandShow.__init__c                 C   s   d}t |dkrt |d  dkrd}t|S |d  dkr'd}t|S |d  dkr5d}t|S |d  d	krCd
}t|S |d  dkrQd}t|S |d  dkr_d}t|S |d  dkrmd}t|S |d  dkr{d}t|S t )Nr$   r   rawzshow-rawzbefore-ruleszshow-beforez
user-rulesz	show-userzafter-rulesz
show-afterzlogging-ruleszshow-loggingbuiltinszshow-builtins	listeningzshow-listeningaddedz
show-addedr   r   r   r   r   r     s8   
zUFWCommandShow.parseNr   r   r   r   r   r     r   r   c                   @   r   )r   zClass for ufw parser responsec                 C   s    |  | _d| _d| _i | _d S )NF)r   rg   dryrunforcerf   )r   rg   r   r   r   r     s   

zUFWParserResponse.__init__c                 C   sP   d| j  }t| j }|  |D ]}|d|| j| f 7 }q|d7 }t|S )Nzaction='%s'z,%s='%s'
)rg   r   rf   rw   sortrepr)r   r   rw   rx   r   r   r   __str__!  s   
zUFWParserResponse.__str__N)r   r   r   r   r   r   r   r   r   r   r     s    r   c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )	UFWParserzClass for ufw parserc                 C   s
   i | _ d S r   )commands)r   r   r   r   r   .  s   
zUFWParser.__init__c                 C   sD   |  t| j vrt |  t| j|  vrt |  S )z=Return command if it is allowed, otherwise raise an exception)r   r   r   rw   r   )r   r
   cmdr   r   r   allowed_command1  s
   zUFWParser.allowed_commandc           
      C   sr  d}t |dkr|d  dkrd}||d  d}t |dkr:|d  dks1|d  dkr:d}||d  d}d}|d  }t |dkrk|t| j v rk|d  t| j|  v rk|}|d  }n4|}t| j D ]$}|| j| v rt| j| | trt| j| | d	d
krqt|} nqt|dkrd
}| 	||}| j| | }|
|}	||	_||	_|	S )z(Parse command. Returns a UFWParserActionFr   z	--dry-runTz--forcez-fr$   r   r
   r    )r   r   rJ   r   r   rw   
isinstancer   getattrr   r   r   r   )
r   r   r   r   r   r
   r}   rx   rg   responser   r   r   parse_command;  sB   	
zUFWParser.parse_commandc                 C   sz   |j du s
|j dkrd|j }nd|j  }|j| jvr!i | j|j< || j|j v r3td| }t||| j|j |< dS )z"Register a command with the parserNr$   z%szCommand '%s' already exists)r   r
   r   r9   r   )r   ckeyro   r   r   r   register_commandi  s   
zUFWParser.register_commandN)r   r   r   r   r   r   r   r   r   r   r   r   r   ,  s    
.r   )r[   ufw.utilrO   ufw.applications
ufw.commonr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s&   $   YA;. 