HEX
Server: Apache/2.4.65 (Unix) OpenSSL/1.1.1k
System: Linux vps109042.inmotionhosting.com 4.18.0 #1 SMP Mon Sep 30 15:36:27 MSK 2024 x86_64
User: cisa (1010)
PHP: 8.2.30
Disabled: NONE
Upload Files
File: //opt/cwprads/update_user_pw
#!/usr/lib/cwprads/venv/bin/python3
import argparse
import secrets
from subprocess import PIPE, Popen
from email.mime.text import MIMEText

PASSWORD_ALLOWED_CHARS = (
    "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
)


def runCommand(args, input=""):
    args_string = []
    for i in range(len(args)):
        if type(args[i]) == str:
            args_string.append(args[i])
        else:
            args_string.append(str(args[i]))
    process = Popen(args_string, stdin=PIPE, stdout=PIPE, stderr=PIPE)
    output = {"stdout": "", "stderr": "", "returncode": -1}
    output["stdout"], output["stderr"] = process.communicate(
        bytes(input, 'utf-8')
    )
    process.poll()
    if not process.returncode == 0:
        command = " ".join(args_string)
        print(f"System call failed with error code {process.returncode}")
        print("Command:")
        print(command)
        print("stdout:")
        print(output["stdout"])
        print("stderr:")
        print(output["stderr"])
        raise Exception(f"Command {command} failed to run")
    else:
        return str(output["stdout"], "UTF-8").strip()


def randomPassword(length):
    return "".join(
        secrets.choice(PASSWORD_ALLOWED_CHARS) for i in range(length)
    )


def mailUser(email, username, password):
    hostname = runCommand(["/usr/bin/hostname", "--fqdn"])
    mailbody = f"""Hello {username},
    Your CWP password for {username} has been reset.

     Your username is: {username}
    Your password is: {password}"""

    msg = MIMEText(mailbody)
    msg['Subject'] = f"CWP Password Change on {hostname}"
    msg['From'] = f"root@{hostname}"
    msg['To'] = email

    p = Popen(["/usr/sbin/sendmail", "-t"], stdin=PIPE)

    p.communicate(msg.as_bytes())


def updateUserPW(username, email):
    newpw = randomPassword(16)
    runCommand(["/usr/bin/passwd", username, "--stdin"], newpw)
    mailUser(email, username, newpw)


parser = argparse.ArgumentParser(description="Reset User Password")
parser.add_argument("username", type=str, help="Username")
parser.add_argument("email", type=str, help="E-mail to send password to")

args = parser.parse_args()

updateUserPW(args.username, args.email)