晋太元中,武陵人捕鱼为业。缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷。渔人甚异之,复前行,欲穷其林。 林尽水源,便得一山,山有小口,仿佛若有光。便舍船,从口入。初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍俨然,有良田、美池、桑竹之属。阡陌交通,鸡犬相闻。其中往来种作,男女衣着,悉如外人。黄发垂髫,并怡然自乐。 见渔人,乃大惊,问所从来。具答之。便要还家,设酒杀鸡作食。村中闻有此人,咸来问讯。自云先世避秦时乱,率妻子邑人来此绝境,不复出焉,遂与外人间隔。问今是何世,乃不知有汉,无论魏晋。此人一一为具言所闻,皆叹惋。余人各复延至其家,皆出酒食。停数日,辞去。此中人语云:“不足为外人道也。”(间隔 一作:隔绝) 既出,得其船,便扶向路,处处志之。及郡下,诣太守,说如此。太守即遣人随其往,寻向所志,遂迷,不复得路。 南阳刘子骥,高尚士也,闻之,欣然规往。未果,寻病终。后遂无问津者。
|
Server : Apache System : Linux srv.rainic.com 4.18.0-553.47.1.el8_10.x86_64 #1 SMP Wed Apr 2 05:45:37 EDT 2025 x86_64 User : rainic ( 1014) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /opt/imunify360/venv/lib64/python3.11/site-packages/defence360agent/myimunify/ |
Upload File : |
import asyncio
import itertools
import logging
from typing import List, Optional
from peewee import BooleanField, CharField
import defence360agent.subsys.panels.hosting_panel as hp
from defence360agent.model import Model, instance
from defence360agent.model.simplification import run_in_executor
from defence360agent.utils import execute_iterable_expression
from defence360agent.utils.config import update_config
logger = logging.getLogger(__name__)
class MyImunify(Model):
"""Secure-site related settings"""
class Meta:
database = instance.db
db_table = "myimunify"
#: The username of the end-user, or an empty string for the default value
#: for all new users.
user = CharField(unique=True)
#: Is MyImunify protection enabled/disabled to the end-user.
protection = BooleanField(null=False, default=False)
@classmethod
def get_protection(cls, user: Optional[str]) -> bool:
"""Get SecureSite protection by username"""
if user is None or user == "root":
# root
return True
perm, _ = cls.get_or_create(user=user, defaults={"protection": False})
return perm.protection
@classmethod
def update_users_protection(cls, users: List[str], status: bool):
cls.insert_many(
[{"user": user, "protection": status} for user in users]
).on_conflict(
conflict_target=[cls.user],
preserve=[],
update={cls.protection: status},
).execute()
async def update_users_protection(sink, users: List[str], status: bool):
await run_in_executor(
None,
lambda: MyImunify.update_users_protection(users, status),
)
proactive_mode = None
if not status:
proactive_mode = "LOG"
tasks = [
update_config(
sink,
{"PROACTIVE_DEFENCE": {"mode": proactive_mode}},
user,
)
for user in users
]
await asyncio.gather(*tasks)
async def set_protection_status_for_all_users(sink, status: bool):
"""Set protection status for all users"""
panel_users = await hp.HostingPanel().get_users()
await update_users_protection(sink, panel_users, status)
async def sync_users(sink, users: List[str]) -> bool:
"""Synchronize existing permissions with myimunify users"""
panel_users = set(users)
myimunify_users = MyImunify.select(MyImunify.user)
myimunify_users = set(itertools.chain(*myimunify_users.tuples()))
users_to_remove = myimunify_users - panel_users
if users_to_remove:
logger.info("Remove myimunify users %s", users_to_remove)
def expression(users_to_remove):
return MyImunify.delete().where(
MyImunify.user.in_(users_to_remove)
)
execute_iterable_expression(expression, list(users_to_remove))
users_to_add = panel_users - myimunify_users
if users_to_add:
logger.info("Add permissions to users %s", users_to_add)
await update_users_protection(sink, users, False)
return bool(users_to_add) or bool(users_to_remove)