From 9a0f55ab18b0bb2c33d5c41eeb7a9a0defc5f121 Mon Sep 17 00:00:00 2001 From: Kasherpete <119694008+Kasherpete@users.noreply.github.com> Date: Mon, 23 Oct 2023 18:28:36 -0500 Subject: [PATCH] Fix ignoring gateway parameter (#34) * Add custom exceptions and fix logging * Fix "done" message * Fix gateway stuff * Fix `P:` * Fix cscook's `--reg-notify` code --- demo.py | 24 +++++++++++-------- exceptions.py | 31 ++++++++++++++++++++++++ sms_registration.py | 57 +++++++++++++++++++++++++++++++++++---------- 3 files changed, 90 insertions(+), 22 deletions(-) create mode 100644 exceptions.py diff --git a/demo.py b/demo.py index a4f1051..aba0901 100644 --- a/demo.py +++ b/demo.py @@ -16,6 +16,8 @@ import imessage import trio import argparse +from exceptions import * + logging.basicConfig( level=logging.NOTSET, format="%(message)s", datefmt="[%X]", handlers=[RichHandler()] ) @@ -107,10 +109,9 @@ async def main(args: argparse.Namespace): print("Would you like to register a phone number? (y/n)") if input("> ").lower() == "y": import sms_registration - if args.gateway is not None: - sms_registration.GATEWAY = args.gateway - if args.phone is not None: - sms_registration.PHONE_IP = args.phone + + if args.phone is None: + raise GatewayConnectionError("You did not supply an IP address.") if "phone" in CONFIG: phone_sig = b64decode(CONFIG["phone"].get("sig")) @@ -119,7 +120,9 @@ async def main(args: argparse.Namespace): phone_number, phone_sig = sms_registration.parse_pdu(args.pdu, None) else: import sms_registration - phone_number, phone_sig = sms_registration.register(conn.credentials.token, args.trigger_pdu) + phone_number, phone_sig = sms_registration.register(push_token=conn.credentials.token, + no_parse=args.trigger_pdu, gateway=args.gateway, + phone_ip=args.phone) CONFIG["phone"] = { "number": phone_number, "sig": b64encode(phone_sig).decode(), @@ -152,7 +155,7 @@ async def main(args: argparse.Namespace): if args.reregister: print("Re-registering...") - users = register(conn, users) + register(conn, users) CONFIG["users"] = [] for user in users: @@ -165,10 +168,11 @@ async def main(args: argparse.Namespace): "id_cert": user.id_cert, "handles": user.handles, }) + if "P:" in str(user.user_id): expiration = get_not_valid_after_timestamp(user.id_cert) expiration = str(expiration) + " UTC" - print("Number registration is valid until "+ expiration) + print(f"Number registration is valid until {expiration}. (YYYY/MM/DD)") else: email_user = user for n in range(len(user.handles)): @@ -178,9 +182,10 @@ async def main(args: argparse.Namespace): safe_config() if args.reg_notify: im = imessage.iMessageUser(conn, email_user) + im.current_handle = email_addr await im.send(imessage.iMessage.create(im, "Number registration is valid until " + expiration, [email_addr])) - print(f"Done?") + print("Done!") if args.alive: logging.getLogger("apns").setLevel(logging.DEBUG) @@ -313,7 +318,6 @@ if __name__ == "__main__": args = parser.parse_args() if args.pdu is not None and not args.pdu.startswith("REG-RESP"): - print("Invalid REG-RESP PDU") - exit(1) + raise InvalidResponseError("Received invalid REG-RESP PDU from Gateway Client.") trio.run(main, args) diff --git a/exceptions.py b/exceptions.py new file mode 100644 index 0000000..e641d3b --- /dev/null +++ b/exceptions.py @@ -0,0 +1,31 @@ + +class GatewayError(Exception): + def __init__(self, reason): + self.reason = reason + + def __str__(self): + return self.reason + + +class GatewayConnectionError(Exception): + def __init__(self, reason): + self.reason = reason + + def __str__(self): + return self.reason + + +class DecodeError(Exception): + def __init__(self, reason): + self.reason = reason + + def __str__(self): + return self.reason + + +class InvalidResponseError(Exception): + def __init__(self, reason): + self.reason = reason + + def __str__(self): + return self.reason \ No newline at end of file diff --git a/sms_registration.py b/sms_registration.py index a8d3e6b..000b77f 100644 --- a/sms_registration.py +++ b/sms_registration.py @@ -1,37 +1,70 @@ import requests +from requests.exceptions import ConnectionError import random import apns import trio import gateway_fetch from base64 import b64decode, b64encode + +from exceptions import * + import urllib3 urllib3.disable_warnings() -PHONE_IP = "192.168.5.120" API_PORT = 8080 -GATEWAY = "22223333" -def register(push_token: bytes, no_parse = False, gateway = None) -> tuple[str, bytes]: +def register(push_token: bytes, no_parse, gateway: str | None, phone_ip: str) -> tuple[str, bytes]: """Forwards a registration request to the phone and returns the phone number, signature for the provided push token""" if gateway is None: print("Requesting device MCC+MNC for gateway detection...") - mccmnc = requests.get(f"http://{PHONE_IP}:{API_PORT}/info", timeout=30).text + + try: + mccmnc = requests.get(f"http://{phone_ip}:{API_PORT}/info", timeout=30).text + except ConnectionError: + + raise GatewayConnectionError("Could not connect to device! Please open the Pypush SMS Helper App.") + + except Exception as e: + + raise GatewayError(f"ERROR: An unknown error occurred: '{e}'") + print("MCC+MNC received! " + mccmnc) print("Determining gateway...") + print(mccmnc) gateway = gateway_fetch.getGatewayMCCMNC(mccmnc) - if gateway is not None: - print("Gateway found! " + str(gateway)) - else: - print("No gateway was provided, and automatic gateway detection failed. Please run again with the --gateway flag.") - # gateway = GATEWAY - raise + if gateway is not None: + print("Gateway found! " + str(gateway)) + else: + + raise GatewayError(f"No gateway was provided, and automatic gateway detection failed. Please run again with the --gateway flag.") + token = push_token.hex().upper() req_id = random.randint(0, 2**32) sms = f"REG-REQ?v=3;t={token};r={req_id};" print("Sending message and waiting for response...") - r = requests.get(f"http://{PHONE_IP}:{API_PORT}/register", params={"sms": sms, "gateway": gateway}, timeout=30) - print("Received response from device!") + + try: + r = requests.get(f"http://{phone_ip}:{API_PORT}/register", params={"sms": sms, "gateway": gateway}, timeout=30) + except Exception as e: + raise GatewayError(f"ERROR: An unknown error occurred: '{e}'") + + if 'error' in r.text.lower(): + + if 'permission.SEND_SMS' in r.text.lower(): + raise GatewayError(f"Please allow the SMS permission!") + + raise GatewayError(f"An error was thrown from PNRgateway Client: '{r.text}'") + + # POSSIBLE ERRORS FROM APP: + + # Error: timeout waiting for response from gateway (unlikely, timeout is implemented here too) + # Error sending SMS + # Error: sms parameter not found + # Error: gateway parameter not found + + print('\033[92m', "Received response from device!", '\033[0m') + if no_parse: print("Now do the next part and rerun with --pdu") exit()