From c3505e533fc1369961bf21ef1caa5e5a6620974c Mon Sep 17 00:00:00 2001 From: Oscar Quiloulou Date: Mon, 18 May 2026 09:42:13 +0200 Subject: [PATCH] fix(render): update Render provider to use validateEmail instead of signUp Render deprecated the signUp mutation and now enforces hCaptcha, breaking email existence detection. This commit switches to validateEmail, which returns {valid, exists} and restores correct behavior. --- user_scanner/email_scan/hosting/render.py | 57 ++++++++++++----------- 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/user_scanner/email_scan/hosting/render.py b/user_scanner/email_scan/hosting/render.py index 6de39860..b6f1b370 100644 --- a/user_scanner/email_scan/hosting/render.py +++ b/user_scanner/email_scan/hosting/render.py @@ -7,23 +7,16 @@ async def _check(email: str) -> Result: show_url = "https://render.com" payload = { - "operationName": "signUp", - "variables": { - "signup": { - "email": email, - "githubId": "", - "name": "", - "githubToken": "", - "googleId": "", - "gitlabId": "", - "bitbucketId": "", - "inviteCode": "", - "password": "StandardPassword123!", - "newsletterOptIn": False, - "next": "" + "operationName": "validateEmail", + "variables": {"email": email}, + "query": """ + mutation validateEmail($email: String!) { + validateEmail(email: $email) { + valid + exists } - }, - "query": "mutation signUp($signup: SignupInput!) {\n signUp(signup: $signup) {\n idToken\n __typename\n }\n}\n" + } + """ } headers = { @@ -42,18 +35,26 @@ async def _check(email: str) -> Result: return Result.error("Rate limited, use '-d' flag to avoid bot detection") data = response.json() - errors = data.get("errors", []) - - if errors: - msg = errors[0].get("message", "") - if '"email":"exists"' in msg: - return Result.taken(url=show_url) - elif '"hcaptcha_token":"invalid"' in msg: - return Result.available(url=show_url) - else: - return Result.error(f"Render Error: {msg}") - - return Result.error("Unexpected error, report it via GitHub issues") + + if "errors" in data: + msg = data["errors"][0].get("message", "") + return Result.error(f"Render Error: {msg}") + + result = data.get("data", {}).get("validateEmail") + + if not result: + return Result.error("Unexpected response format from Render") + + + if result.get("exists"): + return Result.taken(url=show_url) + + + if result.get("valid"): + return Result.available(url=show_url) + + + return Result.error("Invalid email format") except Exception as e: return Result.error(e)