B
    0zfq                 @   s  d Z 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	m
Z
mZmZmZmZ ddlZejdk rvddlZejZnejZddlmZ edd eddD d	k ZerddlZnddlZd
ZdZdZ dZ!d"ddgZ#dZ$d"ddgZ%dZ&dZ'dZ(d"ddgZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0d Z1d!Z2d"Z3d#d$ Z4d%d& Z5e5Z6ej7eeee ee ef e8d'd(d)Z9ej7e8d*d+d,Z:ej7e8d*d-d.Z;d/d0 Z<d1d2 Z=ej7e8d*d3d4Z>ej7e8d*d5d6Z?ej7e8d*d7d8Z@ej7e8d*d9d:ZAejBejCejDejEejFejGiZHejIejJejKejLejMejNejOejPejQejRejSejTejUejVejWejXejYejZi	Z[d;Z\d<d= Z]d>d? Z^G d@dA dAej_Z`G dBdC dCZadS )Dz7Main file for the flake8_secure_coding_standard plugin.    N)AnyAnyStrDict	GeneratorListTupleTypeUnion)      c             c   s   | ]}t |V  qd S )N)int).0s r   `/home/ankuromar296_gmail_com/.local/lib/python3.7/site-packages/flake8_secure_coding_standard.py	<genexpr>$   s    r   flake8.)r
   r   r   i  zfSCS100 use of os.path.abspath() and os.path.relpath() should be avoided in favor of os.path.realpath()zLSCS101 `eval()` and `exec()` represent a security risk and should be avoidedz-SCS102 use of `os.system()` should be avoided zgSCS103 use of `shell=True` in subprocess functions or use of functions that internally set it should beZavoidedzPSCS104 use of `tempfile.mktemp()` should be avoided, prefer `tempfile.mkstemp()`zKSCS105 use of `yaml.load()` should be avoided, prefer `yaml.safe_load()` orz#`yaml.load(xxx, Loader=SafeLoader)`z5SCS106 use of `jsonpickle.decode()` should be avoidedzRSCS107 debugging code should not be present in production code (e.g. `import pdb`)zCSCS108 `assert` statements should not be present in production codezgSCS109 Use of builtin `open` for writing is discouraged in favor of `os.open` to allow for setting fileZpermissionszhSCS110 Use of `os.popen()` should be avoided, as it internally uses `subprocess.Popen` with `shell=True`zXSCS111 Use of `shlex.quote()` should be avoided on non-POSIX platforms (such as Windows)zCSCS112 Avoid using `os.open` with unsafe permissions (should be {})z7SCS113 Avoid using `pickle.load()` and `pickle.loads()`z9SCS114 Avoid using `marshal.load()` and `marshal.loads()`z"SCS115 Avoid using `shelve.open()`z[SCS116 Avoid using `os.mkdir` and `os.makedirs` with unsafe file permissions (should be {})zJSCS117 Avoid using `os.mkfifo` with unsafe file permissions (should be {})zISCS118 Avoid using `os.mknod` with unsafe file permissions (should be {})zWSCS119 Avoid using `os.chmod` with unsafe file permissions (W ^ X for group and others)c          
      s   dd  |  }dd |dD }t|dkry fdd|D }W n4 tk
rz } ztd| d	|W d
d
}~X Y nX |std|  d|S n|r|d ry |S  tk
r } z4|dkr|S |dkrd
S td|  d| d|W d
d
}~X Y nX ntd|  d| dd
S )a  
    Read an integer or list of integer configuration option.

    Args:
        name (str): Name of option
        value (str): Value of option from the configuration file or on the CLI. Its value can be any of:
            - 'yes', 'y', 'true' (case-insensitive)
                The maximum mode value is then set to self.DEFAULT_MAX_MODE
            - a single octal or decimal integer
                The maximum mode value is then set to that integer value
            - a comma-separated list of integers (octal or decimal)
                The allowed mode values are then those found in the list
            - anything else will count as a falseful value
        default (int,list): Default value for option if set to one of
            ('y', 'yes', 'true') in the configuration file or on the CLI

    Returns:
        A single integer or a (possibly empty) list of integers

    Raises:
        ValueError: if the value of the option is not valid
    c             S   s(   y
t | dS  tk
r"   t | S X d S )Nr   )r   
ValueError)argr   r   r   _str_to_intp   s    
z,_read_octal_mode_option.<locals>._str_to_intc             S   s   g | ]}|  qS r   )strip)r   moder   r   r   
<listcomp>w   s    z+_read_octal_mode_option.<locals>.<listcomp>,   c                s   g | ]}|r |qS r   r   )r   r   )r   r   r   r   |   s    zUnable to convert z elements to integers!NzCalculated empty value for `z`!r   )yyestrue)nnofalsezInvalid value for `z`: !)lowersplitlenr   )namevaluedefaultmodesallowed_modeserrorr   )r   r   _read_octal_mode_optionX   s*    $,r-   c               C   s   t  dkS )z6Return True if the current system is POSIX-compatible.)LinuxDarwin)platformsystemr   r   r   r   	_is_posix   s    r2   )nodemodulefunctionreturnc             C   sL   t |ttfs|f}t | jtjoJt | jjtjoJ| jjj|koJ| jj	|kS )N)

isinstancelisttuplefuncast	Attributer(   Nameidattr)r3   r4   r5   r   r   r   _is_function_call   s    r@   )r3   r6   c             C   sx   t | jtjovt | jjtjr,| jjjdkslt | jjtjov| jjjdkovt | jjjtjov| jjjjdkov| jjdkS )Noppathos)abspathrelpath)r7   r:   r;   r<   r(   r=   r>   r?   )r3   r   r   r   _is_os_path_call   s    rF   c                s   t | jtjr| jjdkrd t| jdkr~t | jd tjrBdS t | jd tr^| jd j t | jd tj	r| jd j
 n4x2| jD ](}|jdkrt |jtsdS |jj P qW t fdddD rdS d	S )
Nopen r   Tr   c             3   s   | ]}| kV  qd S )Nr   )r   m)r   r   r   r      s    z/_is_builtin_open_for_writing.<locals>.<genexpr>awxF)r7   r:   r;   r=   r>   r&   argsast_Constantr(   Strr   keywordsr   any)r3   keywordr   )r   r   _is_builtin_open_for_writing   s$    
rQ   c             C   sv   d }d }t | j|kr"| j| }n(| jrJx | jD ]}|jdkr0|j}P q0W |rrt|tr`|j}nt|tjrr|j	}|S )Nr   )
r&   rK   rN   r   r(   r7   rL   r;   Numr    )r3   args_idxr   Znode_internrP   r   r   r   _get_mode_arg   s    

rT   c             C   s$   t | |d}|d k	r |r ||kS dS )N)rS   T)rT   )r3   r+   rS   r   r   r   r   _is_allowed_mode   s    rU   c             C   s   t | jtjrt | jjtjs"dS | jjjdkr| jjdkrx4| jD ]*}|j	dkrDt |jt
rDt|jjrDdS qDW t| jdkrt | jd t
rt| jd jrdS | jjdkrdS | jjjdkr| jjd	ks| jjjd
kr| jjdkrdS dS )NF)
subprocesssp)call
check_callcheck_outputPopenrunshellTr   )	getoutputgetstatusoutputasynciocreate_subprocess_shellloopsubprocess_shell)r7   r:   r;   r<   r(   r=   r>   r?   rN   r   rL   boolr&   rK   )r3   rP   r   r   r   _is_shell_true_call   s    ".re   c             C   sR   t | jtjr0t | jjtjr0| jjjdkr0dS t | jtjrN| jjdkrNdS dS )NpdbTZPdbF)r7   r:   r;   r<   r(   r=   r>   )r3   r   r   r   _is_pdb_call  s    rg   c             C   s@   t | jtjr| jjdkrdS t | jtjr<| jjdkr<dS dS )NmktempTF)r7   r:   r;   r<   r?   r=   r>   )r3   r   r   r   _is_mktemp_call  s    ri   c             C   s8  d}d}t | jtjrt | jjtjr| jjjdkr| jjdkrJdS | jjdkrxF| jD ]<}|j	dkr`t |jtjr`|jj|krdS |jj|kr`dS q`W t
| jd	k st | jd
 tjr| jd
 j|kst | jd
 tjr| jd
 jjdkr| jd
 j|krdS t | jtjr4| jjdkr4dS dS )N)Z
BaseLoaderZ
SafeLoader)LoaderZUnsafeLoaderZ
FullLoaderyaml)Zunsafe_loadZ	full_loadTloadrj   F   r   )r7   r:   r;   r<   r(   r=   r>   r?   rN   r   r&   rK   )r3   Z_safe_loadersZ_unsafe_loadersrP   r   r   r   _is_yaml_unsafe_call)  s,    2$rn   )S_ISUIDS_ISGIDS_ENFMTS_ISVTXS_IREADS_IWRITES_IEXECS_IRWXUS_IRUSRS_IWUSRS_IXUSRS_IRWXGS_IRGRPS_IWGRPS_IXGRPS_IRWXOS_IROTHS_IWOTHS_IXOTHc             C   s   t | tjr"| jtkr"tt| jS t | tjr^t | jtjr^| j	tkr^| jjdkr^tt| j	S t | tj
rtt| j t| jS t | tjrtt| j t| jt| jS tdt|  dS )z
    Extract the mode constant of a node.

    Args:
        node: an AST node

    Raises:
        ValueError: if a node is encountered that cannot be processed
    statz!Do not know how to process node: N)r7   r;   r=   r>   _chmod_known_mode_valuesgetattrr   r<   r(   r?   UnaryOp_unoptyperA   _chmod_get_modeoperandBinOp_binopleftrightr   dump)r3   r   r   r   r     s    

 r   c             C   s   t  dkrdS yRd }t| jdkr4t| jd }n,| jr`x$| jD ]}|jdkrBt|j}P qBW W n tk
rv   dS X |d krt	dt
|tjtjB tjB tjB @ S d S )NWindowsFr   r   z5Unable to extract `mode` argument from function call!)r0   r1   r&   rK   r   rN   r   r(   r   RuntimeErrorrd   r   r|   r}   r   r   )r3   r*   rP   r   r   r   _chmod_has_wx_for_go  s     


r   c               @   s   e Zd ZdZg ZdZg ZdZg ZdZ	g Z
dZedededediZdd Zed	d
 ZddddZejddddZejddddZejddddZejddddZejddddZdS )Visitorz!AST visitor class for the plugin.rH   rG   mkdirmkfifomknodc             C   s   | j |S )zFormat a mode message.)	__class__format_mode_msg)selfmsg_idr   r   r   _format_mode_msg  s    zVisitor._format_mode_msgc             C   s   | t| d| j|  dS )zFormat a mode message.os__modes_msg_arg)formatr   mode_msg_map)clsr   r   r   r   r     s    zVisitor.format_mode_msgN)r6   c             C   s   g | _ i | _dS )zInitialize a Visitor object.N)errorsZ_from_imports)r   r   r   r   __init__  s    zVisitor.__init__)r3   r6   c             C   s  t |r"| j|j|jtf njt|rD| j|j|jtf nHt|rf| j|j|jt	f n&t
|dddr| j|j|jtf nt
|dddr| j|j|jtf nt|r| j|j|jtf nt
|dddr| j|j|jtf nt|r&| j|j|jtf nft|rJ| j|j|jtf nBt|jtjr|jjdkr| j|j|jtf n
t st
|dd	dr| j|j|jtf nt
|dd
dr| jrt|| jdds| j|j|j| tf nt
|dddr(| j|j|jt f ndt
|dddrR| j|j|jt!f n:t
|dd
dr|| j|j|jt"f nt
|dddrt#|r| j|j|jt$f nt% rt
|dddr| j&rt|| j&dds| j|j|j| t'f nt
|dddrF| j(rFt|| j(ddsF| j|j|j| t)f nFt
|dddr| j*rt|| j*dds| j|j|j| t+f | ,| dS )z)Visitor method called for ast.Call nodes.Z
jsonpickledecode)r4   r5   rC   r1   popen)evalexecshlexquoterG   rm   )rS   pickle)rl   loadsmarshalshelvechmod)r   makedirsr   r   r   N)-rg   r   appendlineno
col_offsetSCS107ri   SCS104rn   SCS105r@   SCS106SCS102rF   SCS100SCS110re   SCS103rQ   SCS109r7   r:   r;   r=   r>   SCS101r2   SCS111os_open_modes_allowedrU   r   SCS112SCS113SCS114SCS115r   SCS119_is_unixos_mkdir_modes_allowedSCS116os_mkfifo_modes_allowedSCS117os_mknod_modes_allowedSCS118generic_visit)r   r3   r   r   r   
visit_Call  s`    

 zVisitor.visit_Callc             C   s>   x.|j D ]$}|jdkr| j|j|jtf qW | | dS )z+Visitor method called for ast.Import nodes.rf   N)namesr'   r   r   r   r   r   r   )r   r3   aliasr   r   r   visit_Import  s    
zVisitor.visit_Importc             C   s  x |j D ]}|jdkr$|jdks.|jdkrF| j|j|jtf q
|jdkrr|jdkrr| j|j|jtf q
|jdkr|jdkr| j|j|jt	f q
|jdkr|jdks|jd	kr|jd
kr| j|j|jt
f q
|jdkr|jdkr| j|j|jtf q
|jdkr>|jdkr>| j|j|jtf q
t sv|jdkrv|jdkrv| j|j|jtf q
|jdkr|jdkr| j|j|jtf q
|jdkr|jdkr| j|j|jtf q
|jdkr
|jdkr
| j|j|jtf q
W | | dS )z/Visitor method called for ast.ImportFrom nodes.Nrf   tempfilerh   )zos.pathrA   )rE   rD   rV   )r^   r_   r`   ra   rC   r1   r   r   r   r   )rl   r   r   r   rG   )r   r4   r'   r   r   r   r   r   r   r   r   r   r   r2   r   r   r   r   r   )r   r3   r   r   r   r   visit_ImportFrom  s.     zVisitor.visit_ImportFromc             C   s   x|j D ]}t|jtjrt|jr<| j|j|j	t
f qt|jdddr|t|j| jdds|| j|j|j	| tf qt|jdddr| j|j|j	tf qW dS )z)Visitor method called for ast.With nodes.rC   rG   )r4   r5   rm   )rS   r   N)itemsr7   Zcontext_exprr;   CallrQ   r   r   r   r   r   r@   rU   r   r   r   r   )r   r3   itemr   r   r   
visit_WithT  s    
zVisitor.visit_Withc             C   s$   | j |j|jtf | | dS )z+Visitor method called for ast.Assert nodes.N)r   r   r   r   SCS108r   )r   r3   r   r   r   visit_Asserta  s    zVisitor.visit_Assert) __name__
__module____qualname____doc__r   Zos_mkdir_modes_msg_argr   Zos_mkfifo_modes_msg_argr   Zos_mknod_modes_msg_argr   Zos_open_modes_msg_argr   r   r   r   r   r   classmethodr   r   r;   r   r   Importr   
ImportFromr   Withr   Assertr   r   r   r   r   r     s*   <5r   c               @   s   e Zd ZdZe Zee ZejdddZ	e
ejjjddddZe
ejjjddd	d
Ze
ejjjddddZe
ddddZeeeeeee f ddf dddZdS )PluginzPlugin class.)treec             C   s
   || _ dS )zInitialize a Plugin object.N)_tree)r   r   r   r   r   r   m  s    zPlugin.__init__N)option_managerr6   c          
   C   sn   dt dddddfdt dddd	dfd
t dddddfdt dddddff}tr^| || n| || dS )zAdd command line options.z--os-mkdir-modeTFos_mkdir_modezRIf provided, configure how 'mode' parameter of the os.mkdir() function are handled)r   Zparse_from_configr)   desthelpz--os-mkfifo-modeos_mkfifo_modezSIf provided, configure how 'mode' parameter of the os.mkfifo() function are handledz--os-mknod-modeos_mknod_modezRIf provided, configure how 'mode' parameter of the os.mknod() function are handledz--os-open-modeos_open_modezQIf provided, configure how 'mode' parameter of the os.open() function are handledN)str_use_optparseadd_options_optparseadd_options_argparse)r   r   options_datar   r   r   add_optionsq  s6    zPlugin.add_optionsc             C   s:   dd }d|d}x"|D ]\}}|j |f|| qW dS )z(Add command line options using optparse.c             S   s    t |j| j t| j|t dS )zOctal mode option callback.N)setattrvaluesr   r-   _DEFAULT_MAX_MODE)option_r(   parserr   r   r   octal_mode_option_callback  s    z?Plugin.add_options_optparse.<locals>.octal_mode_option_callbackcallback)actionr   N)
add_option)r   r   r   r   r   opt_strkwargsr   r   r   r     s    
zPlugin.add_options_optparsec             C   sB   G dd dt j}d|i}x"|D ]\}}|j|f|| q W dS )z(Add command line options using argparse.c               @   s   e Zd ZdZdddZdS )z4Plugin.add_options_argparse.<locals>.OctalModeActionz$Action class for octal mode options.Nc             S   s   t || jt| j|t d S )N)r   r   r-   r   )r   r   	namespacer   option_stringr   r   r   __call__  s    z=Plugin.add_options_argparse.<locals>.OctalModeAction.__call__)N)r   r   r   r   r   r   r   r   r   OctalModeAction  s   r   r   N)argparseActionr   )r   r   r   r   r   r   r   r   r   r   r     s    zPlugin.add_options_argparse)r6   c             C   s<   dd }|d|j  |d|j |d|j |d|j dS )zParse command line options.c             S   s   t |trT|dkrTttd|  dttd|d  ttd|  ddt|  nT|rttd|  d| ttd|  dddd	 |D   nttd|  d  d S )
Nr   r   Z_modes_allowedr   r   z0 < mode < zmode in c             S   s   g | ]}t |qS r   )oct)r   r   r   r   r   r     s    zBPlugin.parse_options.<locals>._set_mode_option.<locals>.<listcomp>)	r7   r   r   r   r8   ranger  r   clear)r'   r*   r   r   r   _set_mode_option  s    " &z.Plugin.parse_options.<locals>._set_mode_optionr   r   r   rG   N)r   r   r   r   )r   optionsr  r   r   r   parse_options  s
    
zPlugin.parse_optionsc             c   s>   t  }|| j x&|jD ]\}}}|||t| fV  qW dS )zEntry point for flake8.N)r   visitr   r   r   )r   visitorlinecolmsgr   r   r   r\     s    z
Plugin.run)r   r   r   r   r'   importlib_metadataversionr;   ASTr   r   r   r  managerZOptionManagerr   r   r   r  r   r   r   r   r   r   r\   r   r   r   r   r   g  s   
2r   )br   r;   operatorr0   r   systypingr   r   r   r   r   r   r   r	   Zflake8.options.managerr   version_infor  NameConstantrL   Constantimportlib.metadatametadatar9   r  r%   r   optparser   r   r   r   r   joinr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r-   r2   r   r   rd   r@   rF   rQ   rT   rU   re   rg   ri   rn   USubnegNotnot_Invertinvr   AddaddSubsubMultmulDivtruedivFloorDivfloordivModmodBitXorxorBitOror_BitAndand_r   r   r   r   NodeVisitorr   r   r   r   r   r   <module>   s   (
"
<(	6 1