j#gddlmZddlmZddlmZddlZddlZddlZddlZddlZddl m Z ddl m Z ddl mZdd lmZdd lmZdd lmZdd lmZdd lmZddlmZddlmZmZmZmZmZdZ GddeZ!dS))absolute_import)print_function)divisionN)map) iteritems)ClUserExtSelect)ClSelectExcept) clcaptain)clcagefs)utils)unescape)ExternalProgramFailed) PhpConfReaderPhpConfBaseExceptionPhpConfReadErrorPhpConfLoadException!PhpConfNoSuchAlternativeExceptioncPtj|d}fd|S)zRSafely evaluate a bitwise expression containing only integers and |&~!^ operators.eval)modect|tjr|jSt|tjr!t|jt r|jSttdr!t|tjr|j St|tj rt|j tj tj frNt|j tj r|jnt |j Stdt|tjr|j}|j}t|j tjr||zSt|j tjr||zSt|j tjr||z Stdtd)NNumzunsupported unary operatorzunsupported binary operatorzunsupported expression) isinstanceast ExpressionbodyConstantvalueinthasattrrnUnaryOpopInvertNotoperand ValueErrorBinOpleftrightBitOrBitAndBitXor)noder*r+_evals O/opt/cloudlinux/venv/lib64/python3.11/site-packages/clselect/cluseroptselect.pyr0z!_eval_bitwise_expr.._eval#s dCN + + $5## # dCL ) ) jS.I.I :  3   :dCG#<#< 6M dCK ( ( ;$'CJ#899 q/9$'3:/N/Npdl++++TW\a\abfbn\o\oXoTpTpp9:: : dCI & & <5##DE$*%%E$'39-- $e|#$'3:.. $e|#$'3:.. $e|#:;; ;1222)rparse)exprtreer0s @r1_eval_bitwise_exprr6s@ 9T ' ' 'D333332 5;;r2creZdZdZejrdndZd$dZ d%d Z d&d Z d&d Z d'd Z d(d Z d)dZ d*dZdZdZdZd+dZeeZd,dZeeZd-dZeeZd+dZdZeeZdZdZeeZdZdZdZdZdZd(d 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|]\}}|| SrB).0kvs r1 z,ClUserOptSelect.__init__..Ks$Y$Y$YdaQ$Y$Y$Yr2)r __init__ _whitelistset_user_excludes_html_escape_tabler_html_unescape_table)selfitemexclude_pid_lists r1rGzClUserOptSelect.__init__Esq t-=>>>!ee(0xh(.V'#K#K$Y$Yi@W6X6X$Y$Y$Y!!!r2FTc $i} |dkr/|||d} || ||} tj|j|j|j|tj || |||S)z Inserts supplied options into current ones @param optset: string @param decoder: string @param website: Website or None for per-domain configuration Toptsetdecoderexpect_separator) _process_option_string_remove_forbidden_optionsr apply_for_at_least_one_userinsert_json_options_clpwd get_namesget_uidr UnableToSaveData) rMuserversionrSrTappendquietcreatewebsiteoptionss r1insert_optionszClUserOptSelect.insert_optionsMs R<<11w2GGG44WguMMG0  $ K ! !$+"5"5d";"; < <  + Wffg    r2c&||||||}||\}} } ||}|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 @param website: Website or None for per-domain configuration rcr=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)rMr^r_rdr`rbrc user_ini_pathcontents extensionsextensions_data options_setdataidxline line_partss r1rYz#ClUserOptSelect.insert_json_optionscs ""4(((33D'73SS #66}EE : --h77   OOG $ $ $ $H//99  :,,[99K(( _66CII&& 0 0C9DCJ:!##!} **&qMC/S   $))D//((**4/ H H H t$$$ dG[&AAAAAr2c tj|j|j|j|t j|||||S)z| Handles multiple users with same uids @param website: Website or None for per-domain configuration )r rXrYrZr[r\r r])rMr^r_rdr`rbrcs r1bulk_insert_optionsz#ClUserOptSelect.bulk_insert_optionssS 0  $ K ! !$+"5"5d";"; < <  + Wffg    r2c tj|j|j|j|t j||||S)z Deletes supplied options from current ones @param website: Website or None for per-domain configuration )r rX _delete_userrZr[r\r r])rMr^r_rSrTrarcs r1delete_optionszClUserOptSelect.delete_optionssQ 0   K ! !$+"5"5d";"; < <  + GWg    r2c|||d}||||||}||\}} } ||}|D]} || d||} || } | | | | } | |d |  dz|| ||||| dS)NFrRrgrk)rVrlrmrnrokeyspoprqrrrsrwrxryrzr{)rMr^rSrTr_rcrdr|r}r~roptrrs r1rzClUserOptSelect._delete_usersh--7U.DD ""4(((33D'73SS #66}EE : --h77<<>> $ $C LLd # # # #//99 ((55 (( _66  $))D//((**4/ @ @ @ t$$$ dG[99999r2c|s||d}|dkrtj|||||||||S)z Returns options summary for a user @param user: string @param version: string @param website: Website or None for per-domain configuration return: dict rnativerg) get_versionr UnableToGetExtensions_get_ini_defaults _get_user_ini_get_whitelist)rMr^r_rcs r1 get_optionszClUserOptSelect.get_optionss 0&&t,,Q/G h   6w?? ? w''' 4':::""7+++r2c |}|}|D]H}|r||vr |D]<}|r||vr |||ddddd|(#tj$rY9wxYwIdS)z Deletes all custom options settings @param users: list @param versions: list @param website: Website or None for per-domain configuration rQplainFT)r^r_rSrTr`rarbrcN)list_all_usersget_all_alternatives_datarrer NotCageFSUser)rMusersversionsrc all_users alternativesr_r^s r1 reset_optionszClUserOptSelect.reset_optionss'')) 5577 #((**  G G833!  T..''T7 '%t#W(6666&3H   sA00BBc Di}|D]}|dkr|ds|drFttd|dd\}}|dkrd}|||i|S)NrQz;>===z;<===c*|SN)stripxs r1z7ClUserOptSelect._prepare_options_data..sAGGIIr2rhrrj)r startswithlistrrvrp)rMr}rdrNkeyrs r1roz%ClUserOptSelect._prepare_options_datas ) )Dzz||r!!w'' 4??7+C+C c#5#5 38J8JKKLLJC{{" NNC< ( ( ( (r2cH|js|||jS)z( Returns whitelist data )rH_load_whitelist)rMr_s r1rzClUserOptSelect._get_whitelists* *   ) ) )r2cH|}|||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)r_check_alternativer rdictrr OPTIONS_PATHget_config_for_selectorctlrHrpr php_versionrrrUnableToLoadDatastr) rMr_r php_versions short_verver_data conf_reader php_conf_dictes r1rzClUserOptSelect._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 :rrQzColon as a separator expected (z)!)rvr WrongData) option_itemrU option_name option_values r1_handle_option_itemz#ClUserOptSelect._handle_option_itemso +  (3(9(9#q(A(A %K# L,7\ $..=H[[JLLL\**r2rcvddd} |||S#t$r|d|cYSwxYw)zx Decodes option item @param data: string @param decoder: string @return: string c|SrrBrs r1rz*ClUserOptSelect._decoder..)sr2cNtj|Sr)base64 b64decodedecoders r1rz*ClUserOptSelect._decoder..*s!1!!4!4!;!;!=!=r2)rrr)KeyError)rrT dispatchers r1_decoderzClUserOptSelect._decoder!sm"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 ,)rvrrpr)clsrSrTrUrdrs r1rVz&ClUserOptSelect._process_option_string1sz  8%||C00 8 8 !ll;@@ ++#%5778888r2cH||}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 )rrIrissubsetrr UnableToProcessOption)rMrdr_ra whitelistwhite_list_optionsopt_name opt_values r1rWz)ClUserOptSelect._remove_forbidden_optionsCs''00 7<<>>""++C 0@0@,A,ABB )!# '0'9'9 9 9#)9,,M ,B8LLL/8"8,,(Gr2chg}t|D]\}}||d| |S)zq Construct option item from key and value pair @param options: dict return: list rh)rr`)rdrrrs r1rqz$ClUserOptSelect._compose_options_setXsO  #,W#5#5 @ @ Hi   (((II> ? ? ? ?r2c`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`)rMr}rs r1rrzClUserOptSelect._wrap_optionsds7 AA H DEEE r2cg}|D]4}||||ddg5|||S)z Construct output @param contents: list @param extensions: list @param extensions_data: dict return: list rQ)r)r}r~rrrNs r1rsz$ClUserOptSelect._compose_output_datans_ " "D KK- . . . KKR ! ! ! ! H r2c|}|||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|Srr rs r1rz0ClUserOptSelect._check_version..s c!ffr2r_riz.0z([<>=]{1,2})?(\d+\.\d+\.\d+)\.?rc t|Srrrs r1rz0ClUserOptSelect._check_version..s 3q66r2r r?Tz<=r>z>=rhF) rrr rrrrvrurecompilematchNoSuchAlternativeVersiongroup) rMtestr_rv_arraypattmaction version_inttest_ints r1_check_versionzClUserOptSelect._check_versions 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)rMphp_verphp_error_tables r1_get_php_error_tblz"ClUserOptSelect._get_php_error_tbls!#$&!#"      x 1 1 ,$+OD !   y' 2 2 0$9OD !""8W55 0(/%   y' 2 2 1$2OD !%8OE """8W55 1)0&   y' 2 2 -%,OE "r2c~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) rrreplacerrI differencer r6 SyntaxErrorr( TypeError)rMstr_r VALID_SYMBOLSrcodename error_codes r1_php_string2errorz!ClUserOptSelect._php_string2errors"+ 11'::#O44 1 1JD$<<c$ii00DD t99  M 2 2 3 3 4 /5566JJZ3   44 sBB:9B:cBtjd|sdSg}t|}|D]!}||||kr|cS"||}|D]&}||z|kr|||'d|S)Nz ^-?\d{1,5}$rQ)rz | )rrr rrr`rx)rMrr_range_desc error_stringrerrors r1_get_error_desczClUserOptSelect._get_error_descsx.. 2E " $ $L%%lG%DDMM####N11'1BB$ 4 4E %'' OE2333{{4   r2c|}|||||}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 rSCRIPT_FILENAMEz)/usr/share/l.v.e-manager/utils/clinfo.phpz-qiSERVER_SOFTWAREN1PHP_FCGI_MAX_REQUESTS0PHP_FCGI_CHILDRENrQACCEPT_ENCODINGHTTP_ACCEPT_ENCODINGzM]*?>]*>(.*?)]*>(.*?)(?:]*>(.*?))?z<[^>]*?>) -dzopcache.enable=0r!zzlib.output_compression=Offr!zauto_append_file=noner!zextension=mbstring.sor!zauto_prepend_file=noner!zdisable_functions=noner)zopcache.enablezzlib.output_compressionauto_append_file extensionauto_prepend_filedisable_functionsrzLoaded Configuration Filerirjdefaulterror_reportingrtr)rrrospathisfile_itemr renvironexistsrrrr run_commandfindallsubrrLrrvr_get_value_from_ini_filerHrp)rMr_rrenv_data script_pathcmd tag_pattern strip_patternoutputlinesrewritten_directivesconfiguration_filel directivesr error_ranges r1rz!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"FFFFFr2r8)" __future__rrrrr(rrrMbuiltinsr future.utilsrcluserextselectr clselectexceptr clcommonr r rQr xml.sax.saxutilsrclcommon.utilsrclcommon.php_conf_readerrrrrrr6r8rBr2r1rds'&&&&&%%%%%% """""",,,,,,******%%%%%%000000NNNNNNNNNNNNNN@C FC FC FC FC FoC FC FC FC FC Fr2