d(
j d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZ d dlm Z m
Z
d dlmZ d dl
mZ d dlmZ d dlmZmZmZmZ d dlmZmZ d d lmZ d d
lmZmZmZm Z d dlm!Z! d dl"m#Z#m$Z$ d d
l%m&Z&m'Z' d dl(m)Z) d dl*m+Z+m,Z, d dl-m.Z. d dl/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z: d dl;mZ>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZH d dlImJZJ ejK eL ZMdZNdZOdZPdeQfdZRdeQfdZSdeTfdZUdeTdeQfdZVdeTdeQfdZW ed ZXdeTdefd ZYd!edeZdz fd"Z[d# Z\d$eZd%ej] deZfd&Z^d%ej] defd'Z_d(e j` fd)Zaddd+ebfd,Zcd- Zdd. Zed/ ZfdeTfd0Zgd1 Zhd2e'fd3Zid2e'dejfd4Zkd5 Zld6 Zm ded7ene' fd8Zod9ebe' fd:Zpd2e'd;eTdeZfd?Zrd2e'd@eZddfdAZsd9ebe' dejfdBZtd2e'd%ej] dCeTdDendEenddfdFZu dfd9ebe' dGe
e'ej] enenge d f dHeTdIeTdJeQddfdKZvdedCeTddfdLZwd!edMeQddfdNZx e jy Zzda{dgdOZ|d9ebe' ddfdPZ}deTddfdQZ~deTddfdRZdgdSZdTeTdUedeTfdVZd2e'd%ej] dUedDendEenddfdWZ dhdXebeT dz ddfdYZdedZZd[ Zd2e'deQfd\Zd2e'd]ejdeQfd^Zd_ Z G d` da Z G db dce ZdS )i N)defaultdict) AwaitableCallable)LooseVersion)Path)
inactivity)MalwareScanScheduleIntervalSystemConfigANTIVIRUS_MODEchoose_value_from_config)IndexWP_RULES)log_message)open_dir_no_symlinks
open_nofollow rmtree_fdsafe_dir) Wordpress)get_wp_rules_dataget_wp_ruleset_version)
WordpressSiteWPSite)WPDisabledRule)cli telemetry)PLUGIN_VERSION_FILE)_validate_presetcalculate_next_scan_timestamp$clear_get_cagefs_enabled_users_cacheensure_site_data_directoryformat_php_with_embedded_jsonget_imunify_package_versions
get_last_scanget_malware_historyprepare_plugin_configprepare_scan_data!write_plugin_data_file_atomically)
clear_manually_deleted_flagdelete_siteget_installed_sites_by_domainsget_outdated_sitesget_sites_for_userget_sites_to_adoptget_sites_to_install%get_sites_to_mark_as_manually_deletedget_installed_sitesinsert_installed_sitesmark_site_as_manually_deletedupdate_site_identityupdate_site_version)setup_site_authenticationTFbalancedreturnc d t t j S # t $ r
t cY S w xY w)u Read WORDPRESS.waf_enabled from config, defaulting to True.
Returns _WAF_ENABLED_DEFAULT when the config key is missing (old
schema without waf_enabled), so WAF stays enabled — no behavior
change on upgrade.
)boolr WAF_ENABLEDKeyError_WAF_ENABLED_DEFAULT U/opt/imunify360/venv/lib/python3.11/site-packages/defence360agent/wordpress/plugin.py_get_global_waf_enabledr@ S s? $I)*** $ $ $####$ //c d t t j S # t $ r
t cY S w xY w)uS Read WORDPRESS.ai_bot_protection from config, defaulting to False.
Returns _AI_BOT_PROTECTION_DEFAULT when the config key is missing
— e.g. the ai_bot_protection field hasn't rolled out to this
install's imunify360 yet, or a sibling package is still on an
older schema. Keeps the feature off in all ambiguous cases.
)r9 r AI_BOT_PROTECTIONr; _AI_BOT_PROTECTION_DEFAULTr= r> r? _get_global_ai_bot_protectionrE ` s? *I/000 * * *))))*rA c j t j } n# t $ r
t cY S w xY wt | S )u Read WORDPRESS.ai_bot_protection_preset from config, defaulting to
"balanced".
Two layers of safety: KeyError on a missing key (older schema, agent
upgrade in progress) and _validate_preset() on the value itself
(hand-edited override file, future preset rolled in via a sibling
package this version doesn't recognise). Both fall back to the same
canonical default so all layers — schema, agent, plugin — agree.
)r AI_BOT_PROTECTION_PRESETr; !_AI_BOT_PROTECTION_PRESET_DEFAULTr )raws r? $_get_global_ai_bot_protection_presetrJ n sF 10 1 1 100001C s ##usernamec t sdS t dd| \ }}n# t $ r
t cY S w xY w|t nt | S )zECheck if WAF is enabled for a user, respecting global-off precedence.F WORDPRESSwaf_enabled)rK )r@ r r; r<