wo4h!ddlZddlmZmZddlmZddlmZddlm Z ddl m Z m Z m Z mZddlmZmZddlmZgd Zd ZGd d eZGd deZGddeZGddeZdZGddeZdS)N)ABCabstractmethod) defaultdict)IntEnum)Path)DictListOptionalSet) IPEchoAPIAPIError) MalwareTune) 202122255380110443587993995z generic panelceZdZdZdZdZdS) UserLevelN)__name__ __module__ __qualname__ADMINRESSELER REGULAR_USERW/opt/imunify360/venv/lib/python3.11/site-packages/defence360agent/subsys/panels/base.pyrrs EHLLLr&rceZdZdS)PanelExceptionNrr r!r%r&r'r)r)#Dr&r)ceZdZdS)InvalidTokenExceptionNr*r%r&r'r-r-'r+r&r-c:eZdZdZdZdgezdgezdgdgdddZeZgZ e e d Z e d Z e d Ze d Ze d(dZe d(dZe dZe deefdZe deeeeffdZe deeeeffdZe defdZdeeeeefffdZdefdZdefdZe dZde fdZ!e de"efdZ#e dede$fdZ%e dede&efdZ'e defd Z(e d d!d"Z)e deeeffd#Z*e d$e dd fd%Z+deeeeffd&Z,d'Z-d S)) AbstractPanelzTAbstract class that provides only basic hosting panel integration functionality.MINIMAL465113)inout)rrrr)rrrr2123)tcpudpcdS)z\ Checks if hosting panel installed on the known path :return: bool: Nr%clss r' is_installedzAbstractPanel.is_installed=s  r&cL tjS#t$rYdSwxYw)zb Stub with external IP as currently only implementation for cPanel needed )r server_ipr r9s r' get_server_ipzAbstractPanel.get_server_ipFs8  &(( (   22 s  ##c KdSNr%r9s r'versionzAbstractPanel.versionQs tr&cK|jSrA)NAMEr9s r'namezAbstractPanel.nameUs xr&Nc KdS)zM Registers and enables Imunify360 UI plugin in hosting panel Nr%selfrEs r'enable_imunify360_pluginz&AbstractPanel.enable_imunify360_pluginY r&c KdS)zC UnRegisters Imunify360 UI plugin in hosting panel Nr%rGs r'disable_imunify360_pluginz'AbstractPanel.disable_imunify360_plugin`rJr&c KdS)zP Returns domains hosted via control panel :return: list Nr%rHs r'get_user_domainszAbstractPanel.get_user_domainsg r&returnc KdS)zO Returns system users from hosting panel :return: list Nr%rNs r' get_userszAbstractPanel.get_usersorPr&c KdS)zA Returns dict with domain to list of users pairs Nr%rNs r'get_domain_to_ownerz!AbstractPanel.get_domain_to_ownerwrJr&c KdS)zA Returns dict with user to list of domains pairs Nr%rNs r'get_domains_per_userz"AbstractPanel.get_domains_per_user~rJr&c KdS)z# Returns panel url Nr%)rHusernames r'panel_user_linkzAbstractPanel.panel_user_linkrJr&cNKd|d{VDS)z7 Returns dict with user to email pairs ci|]}|ddd S)r=)emaillocaler%).0users r' z2AbstractPanel.get_user_details..s2    B"--   r&N)rSrNs r'get_user_detailszAbstractPanel.get_user_detailssC   "nn........    r&cnKtt|d{VSrA)lenlistrSrNs r' users_countzAbstractPanel.users_counts84dnn........//000r&datacnd}|jdkr tj|j}|j}|j|fS)z Performs actions to distinguish endusers from admins :param protocol: _RpcServerProtocol :param data: parsed params :returns (user_type, user_name) Nr)_uidpwdgetpwuidpw_namer`)rHprotocolrgrEpws r' authenticatezAbstractPanel.authenticates= =A  hm,,B:D}d""r&ctrANotImplementedErrorr9s r'get_modsec_config_pathz$AbstractPanel.get_modsec_config_paths!!r&cdS)z( Return Conflict status Fr%rNs r'get_SMTP_conflict_statusz&AbstractPanel.get_SMTP_conflict_statuss ur&cdSrAr%rNs r'basedirszAbstractPanel.basedirss r&home_dircRt|j}|SrA)rresolveparent)r:rxbase_dirs r' base_home_dirzAbstractPanel.base_home_dirs!>>))++2r&c* ||}t|}||}n#tt f$rYdSwxYwt tddx}r|}t|dz |z S)NRAPID_SCAN_BASEDIR_OVERRIDEz.rapid-scan-db) r}rrz relative_to ValueError RuntimeErrorgetattrrstr)r:rxr| resolved_hometailrapid_scan_basedir_overrides r'get_rapid_scan_db_dirz#AbstractPanel.get_rapid_scan_db_dirs ((22H NN2244M ,,X66DDL)   44 +2 6+ +  & 33H8..5666sA AA#"A#cKt)z Returns registration key from panel, if possible, raise PanelException if not successful (or wrong panel key provided), or NoImplemented if method not supported by the panel. rqr9s r' retrieve_keyzAbstractPanel.retrieve_keys"!r&)r`c KdS)zD Notify a customer using the panel internal tooling Nr%)r: message_typeparamsr`s r'notifyzAbstractPanel.notify tr&c KdS)z5 :return dict with docroot to domain Nr%rNs r' list_docrootszAbstractPanel.list_docrootsrJr&myimunify_enabledc KdS)zK Switch UI panel configuration between Im360 and MyImunify Nr%)r:rs r'switch_ui_configzAbstractPanel.switch_ui_configrr&cK|d{V}tt}|D] \}}|||!|S)z Domain to docroot list mapping Patchman expects a subdomain to be listed separately from main domain :return: dict with domain to list of docroots N)rrreitemsappend)rH doc_roots domain_pathsdoc_root domain_names r'get_domain_pathszAbstractPanel.get_domain_pathssx,,........ "4(( %.__%6%6 7 7 !Hk  % , ,X 6 6 6 6r&c K|d{V}|d{V}|d{V}|d{V}g}|D]}||}|d}|d} |dd} |dt t j} |dd} ||g} g}| D]0}||g}|||d1|||| | | | |d |S) Nr]r^r{r=level suspendedF)domainpaths)rYr]languager{rrdomains) rSrrWrbgetintrr$r)rH panel_usersr user_domains user_detailsusers user_namedetailsr]r^r{rrruser_domain_pathsrrs r'patchman_userszAbstractPanel.patchman_userss NN,,,,,,,, !2244444444 !6688888888 !2244444444 $  I"9-GG$EX&F[[2..FKKY-C)D)DEEE K77I"&&y"55G " &   $((b99!(("-!& LL )" &$"!*0     r&rA).rr r!__doc__rDTCP_PORTS_COMMON OPEN_PORTSr) exceptionsmtp_allow_users classmethodrr;r?rBrErIrLrOr rrSrrUrWrZrbrrfdictrorsboolrur rwrr}r rrrrrrrr%r&r'r/r/+s D',,7--  ,++333   JI  ^[ [[[   ^    ^   ^  c   ^  4T#Y+?   ^  Dd3i,@   ^     ^  S$sCx.-@(A    131111#4####(""["$  #c(   ^ ST[7S7Xc]777[7 "3"""["8<[  T#s(^   ^ t[ S$s)^(<    &&&&&r&r/c fd}|S)a" Run function only if hosting panel is installed, elsewhere raise PanelException This method is intended to be used as a decorator on AbstractPanel instance methods. :raise PanelException: :param dec_kwargs: kwargs passed to is_installed function :return: cfd}|S)z& :param fn: coroutine cK|jdis"|d|jjz|g|Ri|d{VS)Nz%s is not valid!r%)r;r __class__r)rHargskwargs dec_kwargsfns r'wrapperz;ensure_valid_panel..real_decorator..wrapper9sy$4$22z22 nn&)@@D24222622222222 2r&r%)rrrs` r'real_decoratorz*ensure_valid_panel..real_decorator4s)  3 3 3 3 3 3r&r%)rrs` r'ensure_valid_panelr's$      r&ceZdZdZdS)ModsecVendorsErrorz9 Raises when its impossible to get modsec vendor N)rr r!rr%r&r'rrEs Dr&r)rjabcrr collectionsrenumrpathlibrtypingrr r r defence360agent.utils.ipechor r imav.contracts.configrrGENERIC_PANEL_NAMEr Exceptionr)r-r/rrr%r&r'rs ##############,,,,,,,,,,,,<<<<<<<<------   %      Y        I   yyyyyCyyyx<          r&