jgw^ddlmZddlmZddlmZddlZddlZddlZddlZddlm Z ddl m Z ddl m Z dd lmZdd lmZdd lmZdd lmZdd lmZddlmZmZmZmZmZGdde ZdS))absolute_import)print_function)divisionN)map) iteritems)ClUserExtSelect)ClSelectExcept) clcaptain)utils)unescape)ExternalProgramFailed) PhpConfReaderPhpConfBaseExceptionPhpConfReadErrorPhpConfLoadException!PhpConfNoSuchAlternativeExceptioncdeZdZdZejrdndZd$dZ d%d Zd&d Z d&d Z d'd Z d Z d(dZ d)dZdZdZdZd'dZeeZd*dZeeZd+dZeeZd'dZdZeeZdZdZeeZdZdZdZdZdZd Z d'd!Z!d"Z"d#Z#dS),ClUserOptSelectz+ Class for processing user options z /etc/cl.selector.conf.d/php.confz/etc/cl.selector/php.confphpNctj|||i|_t|_ddddddd|_dt |jD|_dS) Nz z"z'z>z<z&) "'><&ci|]\}}|| Sr).0kvs O/opt/cloudlinux/venv/lib64/python3.11/site-packages/clselect/cluseroptselect.py z,ClUserOptSelect.__init__..)s$Y$Y$YdaQ$Y$Y$Y)r __init__ _whitelistset_user_excludes_html_escape_tabler_html_unescape_table)selfitemexclude_pid_lists r#r&zClUserOptSelect.__init__#sq t-=>>>!ee(0xh(.V'#K#K$Y$Yi@W6X6X$Y$Y$Y!!!r%FTc "i}|dkr/|||d}||||}tj|j|j|j|tj ||||S)z Inserts supplied options into current ones @param optset: string @param decoder: string @param Toptsetdecoderexpect_separator) _process_option_string_remove_forbidden_optionsr apply_for_at_least_one_userinsert_json_options_clpwd get_namesget_uidr UnableToSaveData) r,userversionr2r3appendquietcreateoptionss r#insert_optionszClUserOptSelect.insert_options+s R<<11w2GGG44WguMMG0  $ K ! !$+"5"5d";"; < <  + Wff    r%c"|||||}||\}}} ||}|r||n|}||} | r|| } || || } tdt| D]M} | | } | d}t|dkr3|ddkr|ddz| | <N| |d |  dz|||||||| |dS)z Inserts supplied options into current ones @param user: string @param version: string @param options: object r=rno value N)_check_user_in_cagefs_compose_user_ini_path_load_ini_contents_prepare_options_dataupdate_compose_options_set _wrap_options_compose_output_datarangelensplit_write_to_filejoinrstrip_reload_processes_backup_settings)r,r=r>rBr?rA user_ini_pathcontents extensionsextensions_data options_setdataidxline line_partss r#r8z#ClUserOptSelect.insert_json_options@s ""4(((33D'BB #66}EE : --h77   OOG $ $ $ $H//99  :,,[99K(( _66CII&& 0 0C9DCJ:!##!} **&qMC/S   $))D//((**4/ H H H t$$$ dG[&AAAAAr%c tj|j|j|j|t j||||S)z7 Handles multiple users with same uids )r r7r8r9r:r;r r<)r,r=r>rBr?rAs r#bulk_insert_optionsz#ClUserOptSelect.bulk_insert_optionscsQ0  $ K ! !$+"5"5d";"; < <  + Wff    r%ctj|j|j|j|t j|||S)z< Deletes supplied options from current ones )r r7 _delete_userr9r:r;r r<)r,r=r>r2r3r@s r#delete_optionszClUserOptSelect.delete_optionsnsO 0   K ! !$+"5"5d";"; < <  + GW    r%c|||d}|||||}||\}}} ||}|D]} || d||} || } | | || } | |d |  dz|| ||||| dS)NFr1rH)r5rIrJrKrLkeyspoprNrOrPrTrUrVrWrX) r,r=r2r3r>rBrYrZr[r\optr]r^s r#rezClUserOptSelect._delete_userzsc--7U.DD ""4(((33D'BB #66}EE : --h77<<>> $ $C LLd # # # #//99 ((55 (( _66  $))D//((**4/ @ @ @ t$$$ dG[99999r%c|s||d}|dkrtj||||||||S)z Returns options summary for a user @param user: string @param version: string return: dict rnative) get_versionr UnableToGetExtensions_get_ini_defaults _get_user_ini_get_whitelist)r,r=r>s r# get_optionszClUserOptSelect.get_optionss~ 0&&t,,Q/G h   6w?? ? w''' 4)))""7+++r%c |}|}|D]G}|r||vr |D];}|r||vr |||ddddd'#tj$rY8wxYwHdS)zn Deletes all custom options settings @param users: list @param versions: list r0plainFT)r=r>r2r3r?r@rAN)list_all_usersget_all_alternatives_datarhrCr NotCageFSUser)r,usersversions all_users alternativesr>r=s r# reset_optionszClUserOptSelect.reset_optionss '')) 5577 #((**  G G833!  T..''T7 '%t#(%%%%&3H   sA//BBc Di}|D]}|dkr|ds|drFttd|dd\}}|dkrd}|||i|S)Nr0z;>===z;<===c*|SN)stripxs r#z7ClUserOptSelect._prepare_options_data..sAGGIIr%rErrG)r startswithlistrrSrM)r,rZrBr-keyvalues r#rLz%ClUserOptSelect._prepare_options_datas ) )Dzz||r!!w'' 4??7+C+C c#5#5 38J8JKKLLJC{{" NNC< ( ( ( (r%cH|js|||jS)z( Returns whitelist data )r'_load_whitelist)r,r>s r#rqzClUserOptSelect._get_whitelists* *   ) ) )r%cH|}|||d|vrtj|t }t |D]\}}|d||< t |j}|||}|j |dS#t$r}tj|j d}~wtttf$r,}tj|jt#|d}~wwxYw)zM Parses php config file (not php.ini!) and updates structure .r>N)rv_check_alternativer rndictrr OPTIONS_PATHget_config_for_selectorctlr'rMr php_versionrrrUnableToLoadDatastr) r,r>r{ php_versions short_verver_data conf_reader php_conf_dictes r#rzClUserOptSelect._load_whitelists9 5577  666 g   6w?? ?vv #,\#:#: : : Ix&.y&9L # # M'(9::K'BB7LYYM O " "= 1 1 1 1 10 F F F 6q}EE E "68LM M M M 1$2CSVVLL L Ms%2AB88 D!CD!5'DD!cd|vr|dd\}}n|s|d}}ntjd|d||iS)z Splits options data into key-value pair and returns it @param option_item: string @param expect_separator: bool @return: dict :rr0zColon as a separator expected (z)!)rSr WrongData) option_itemr4 option_name option_values r#_handle_option_itemz#ClUserOptSelect._handle_option_itemso +  (3(9(9#q(A(A %K# L,7\ $..=H[[JLLL\**r%rtcvddd} |||S#t$r|d|cYSwxYw)zx Decodes option item @param data: string @param decoder: string @return: string c|Srrrs r#rz*ClUserOptSelect._decoder..sr%cNtj|Sr)base64 b64decodedecoders r#rz*ClUserOptSelect._decoder..s!1!!4!4!;!;!=!=r%)rtrrt)KeyError)r^r3 dispatchers r#_decoderzClUserOptSelect._decodersm"k==@@  -&:g&t,, , - - -&:g&t,, , , , -s 88ci}|rW|dD]A}|||}||||B|S)z Wrapper around options parsing routines @param optset: string @param decoder: callback name @expect_separator: bool @return: dict ,)rSrrMr)clsr2r3r4rBrs r#r5z&ClUserOptSelect._process_option_stringsz  8%||C00 8 8 !ll;@@ ++#%5778888r%cH||}t|t|s9i}t |D]%\}}||vr|r t j||||<&|}|S)z Check if all options to process are present in white list and removes forbidden ones or raise an exception @param options: dict @param quiet: bool @return: dict )rqr(rhissubsetrr UnableToProcessOption)r,rBr>r@ whitelistwhite_list_optionsopt_name opt_values r#r6z)ClUserOptSelect._remove_forbidden_optionss''00 7<<>>""++C 0@0@,A,ABB )!# '0'9'9 9 9#)9,,M ,B8LLL/8"8,,(Gr%chg}t|D]\}}||d| |S)zq Construct option item from key and value pair @param options: dict return: list rE)rr?)rBr]rrs r#rNz$ClUserOptSelect._compose_options_set.sO  #,W#5#5 @ @ Hi   (((II> ? ? ? ?r%c`dg}|||d|S)z` Adds identifying string before and after dataset @param contents: list z.;>=== Start of PHP Selector Custom Options ===z.;<=== End of PHP Selector Custom Options =====)extendr?)r,rZr^s r#rOzClUserOptSelect._wrap_options:s7 AA H DEEE r%cg}|D]4}||||ddg5|||S)z Construct output @param contents: list @param extensions: list @param extensions_data: dict return: list r0)r)rZr[r\r^r-s r#rPz$ClUserOptSelect._compose_output_dataDs_ " "D KK- . . . KKR ! ! ! ! H r%c|}|||d|vrtj|t t d||dd}t|ddkr|dz }tj d}| |}|stj || d}t t d| dd}|d d z|dd zz|dz}|d d z|dd zz|dz} |d kr|| krd S|dkr|| krd S|dkr|| krd S|dkr|| krd S|r|dkr6|d d z|dd zz}|d d z|dd zz} || krd SdS)z~ Compares version in use and version required by PHP feature and return true if PHP feature satisfies rc t|Srintrs r#rz0ClUserOptSelect._check_version.._s c!ffr%r>rFz.0z([<>=]{1,2})?(\d+\.\d+\.\d+)\.?rc t|Srrrs r#rz0ClUserOptSelect._check_version..hs 3q66r%r rTz<=rz>=rEF) rvrr rnrrrSrRrecompilematchNoSuchAlternativeVersiongroup) r,testr>r{v_arraypattmaction version_inttest_ints r#_check_versionzClUserOptSelect._check_versionVs 5577  666 g   6w?? ?s,,|G/DY/O/U/UVY/Z/Z[[\\ tzz#  1 $ $ DLDz<== JJt   @ 9$?? ?C))AGGAJJ,<,>kH444 U??{h664 T>>kH444 U??{h664 4!!**WQZ1_=5.2.0E_RECOVERABLE_ERRORiz<5.3.0iz>=5.3.0 E_DEPRECATEDi E_USER_DEPRECATEDi@z<5.4.0iwz>=5.4.0i)r)r,php_verphp_error_tables r#_get_php_error_tblz"ClUserOptSelect._get_php_error_tblzs!#$&!#"      x 1 1 ,$+OD !   y' 2 2 0$9OD !""8W55 0(/%   y' 2 2 1$2OD !%8OE """8W55 1)0&   y' 2 2 -%,OE "r%c~d}||}t|D](\}}||t|})t |t |rdS t t|}n#tttf$rYdSwxYw|S)ad Convert php error level 'error-reporting' from string to code http://php.net/manual/ru/function.error-reporting.php #>>> ClUserOptSelect(item='php')._php_string2error('E_ALL & ~E_NOTICE', '5.4') 32759 #>>> ClUserOptSelect(item='php')._php_string2error('E_USER_ERROR | E_NOTICE', '5.4') 264 #>>> ClUserOptSelect(item='php')._php_string2error('E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR', '5.4') 71 #>>> ClUserOptSelect(item='php')._php_string2error('E_ERROR | INCORRECT', '5.4') # incorrect variable 'INCORRECT' None #>>> ClUserOptSelect(item='php')._php_string2error('E_ERROR + E_WARNING', '5.4') # incorrect operator '+' None :param str: error_reporting variable :return None|int: error_reporting error code; return None if can't convert z0123456789|&~!^ N) rrreplacerr( differencereval SyntaxError ValueError TypeError)r,str_r VALID_SYMBOLSrcodename error_codes r#_php_string2errorz!ClUserOptSelect._php_string2errors"+ 11'::#O44 1 1JD$<<c$ii00DD t99  M 2 2 3 3 4 T$ZZJJZ3   44 sBB:9B:cBtjd|sdSg}t|}|D]!}||||kr|cS"||}|D]&}||z|kr|||'d|S)Nz ^-?\d{1,5}$r0)rz | )rrrrrr?rU)r,rr>range_desc error_stringrerrors r#_get_error_desczClUserOptSelect._get_error_descsx.. 2E " $ $L%%lG%DDMM####N11'1BB$ 4 4E %'' OE2333{{4   r%c|}|||||}tj||d|jstj|tj }d|vrAd}tj |r||d<||d|jg}n1||d|jdg}| ddd|d<d |d <d |d <d |d <tj d}tj d}gd|dd<tj||} || } gd} d} | D]H} tj|d | d}d|vrKtj|d | dp| d}t%||j} ||vrtj|d | dp| d}t%||j}|dkr)d||vr||dd krd ||d<nI|dkr8||dd}||||}|||d<|| vr!| r|| |||d<J|j|dS)zQ Gets PHP defaults (calls php -i) @param version: string r^SCRIPT_FILENAMEz)/usr/share/l.v.e-manager/utils/clinfo.phpz-qiSERVER_SOFTWAREN1PHP_FCGI_MAX_REQUESTS0PHP_FCGI_CHILDRENr0ACCEPT_ENCODINGHTTP_ACCEPT_ENCODINGzM]*?>]*>(.*?)]*>(.*?)(?:]*>(.*?))?z<[^>]*?>) -dzopcache.enable_cli=0rzzlib.output_compression=Offrzauto_append_file=nonerzextension=mbstring.sorzauto_prepend_file=nonerzdisable_functions=noner)zopcache.enable_clizzlib.output_compressionauto_append_file extensionauto_prepend_filedisable_functionsrzLoaded Configuration FilerFrGdefaulterror_reportingrQr)rvrrqospathisfile_itemr renvironexistsrirrr run_commandfindallsubr r+rrSr_get_value_from_ini_filer'rM)r,r>r{renv_data script_pathcmd tag_pattern strip_patternoutputlinesrewritten_directivesconfiguration_filel directivesr error_ranges r#roz!ClUserOptSelect._get_ini_defaultss8 5577  666''00 w~~l73F;DJGHH C 9'BB B:  ) )EKw~~k** :.9*+(0<=CC(0B ! ! !C*C*C*J"====2BBB"FFFFFr%r) __future__rrrr rrr.builtinsr future.utilsrcluserextselectr clselectexceptr clcommonr r0r xml.sax.saxutilsr clcommon.utilsrclcommon.php_conf_readerrrrrrrrr%r#rEs'&&&&&%%%%%% """""",,,,,,******%%%%%%000000NNNNNNNNNNNNNNzFzFzFzFzFozFzFzFzFzFr%