403Webshell
Server IP : 213.32.127.20  /  Your IP : 216.73.216.144
Web Server : Apache
System : Linux ns3.servidorneptuno.com 4.18.0-553.16.1.lve.el8.x86_64 #1 SMP Tue Aug 13 17:45:03 UTC 2024 x86_64
User : atoqsfjh ( 1072)
PHP Version : 7.4.33
Disable Function : exec,passthru,shell_exec,system
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : OFF  |  Pkexec : OFF
Directory :  /opt/cloudlinux/venv/lib/python3.11/site-packages/clcommon/cpapi/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /opt/cloudlinux/venv/lib/python3.11/site-packages/clcommon/cpapi/cpapicustombin.py
# -*- coding: utf-8 -*-

"""
common helper functions, related to processing api using custom binary
currently available for Directadmin and Plesk
"""
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import os
import json
from typing import List, Tuple, Union, Optional
from clcommon.utils import exec_utility
from clcommon.clpwd import ClPwd

USERDOMAINS = '/usr/share/python-cllib/userdomains'


def get_domains_via_custom_binary() -> Tuple[int, Union[str, List[Tuple[str, str]]]]:
    """
    Calls USERDOMAINS(userdomains.c) bin and returns rc and loaded json output
    This is equals to call `userdomains(pwd.getpwuid(os.getuid()).pw_name, as_root=True)`

    Returns: return code of USERDOMAINS and json output
        if rc == 0: `out` is out from `userdomains()`
            NB: there is no tuples in JSON so da_out's type is List[List[str, str]] instead of List[Tuple[str, str]]
        if rc != 0: `out` type is str
        error codes:
            1: diradmin/psaadmin user not found
            2: not DA/Plesk panel
            3: seteuid() syscall failed
            4: executed as root
            10: exception during `userdomains()` call
            11: no such user in panel
    """
    rc, out = exec_utility(USERDOMAINS, [])
    try:
        res = json.loads(out)
    except json.JSONDecodeError:
        pass
    else:
        if rc == 0:
            return rc, [
                (row[0], row[1])
                for row in res 
                if len(row) == 2 and all(isinstance(p, str) for p in row)
            ]

    return rc, out


def _docroot_under_user_via_custom_bin(domain: str) -> Optional[
    Tuple[str, str]]:
    """
    New method for getting doc_root for domain under user
    Method parses /usr/local/directadmin/... user's web server config
    See: _get_domains_list_as_root()
    :return: (doc_root, username) tuple
    """

    clpwd = ClPwd()
    user_pw = clpwd.get_pw_by_uid(os.getuid())[0]

    # domains type (if rc == 0): List[Tuple[str, str]]   # domain, docroot
    rc, domains = get_domains_via_custom_binary()
    if rc != 0:
        return None

    for dom, _docroot in domains:
        if dom == domain:
            return _docroot, user_pw.pw_name
    return None

Youez - 2016 - github.com/yon3zu
LinuXploit