pypush-plus-plus/sms_registration.py

120 lines
4.1 KiB
Python
Raw Normal View History

2023-08-21 16:09:35 -05:00
import requests
import random
import apns
import trio
2023-09-22 14:58:49 -05:00
import gateway_fetch
2023-08-21 16:09:35 -05:00
from base64 import b64decode, b64encode
import urllib3
urllib3.disable_warnings()
PHONE_IP = "192.168.5.120"
API_PORT = 8080
2023-09-02 18:09:41 -05:00
GATEWAY = "22223333"
2023-08-21 16:09:35 -05:00
2023-09-02 18:48:10 -05:00
def register(push_token: bytes, no_parse = False, gateway = None) -> tuple[str, bytes]:
2023-08-21 16:09:35 -05:00
"""Forwards a registration request to the phone and returns the phone number, signature for the provided push token"""
2023-09-02 18:48:10 -05:00
if gateway is None:
print("Requesting device MCC+MNC for gateway detection...")
2023-09-22 14:58:49 -05:00
mccmnc = requests.get(f"http://{PHONE_IP}:{API_PORT}/info").text
print("MCC+MNC received! " + mccmnc)
print("Determining gateway...")
2023-09-22 14:58:49 -05:00
gateway = gateway_fetch.getGatewayMCCMNC(mccmnc)
2023-09-23 22:39:17 -05:00
if gateway is not None:
2023-09-23 22:36:17 -05:00
print("Gateway found! " + str(gateway))
2023-09-23 22:39:17 -05:00
else:
2023-09-23 22:42:37 -05:00
print("No gateway was provided, and automatic gateway detection failed. Please run again with the --gateway flag.")
# gateway = GATEWAY
raise
2023-08-21 16:09:35 -05:00
token = push_token.hex().upper()
req_id = random.randint(0, 2**32)
sms = f"REG-REQ?v=3;t={token};r={req_id};"
r = requests.get(f"http://{PHONE_IP}:{API_PORT}/register", params={"sms": sms, "gateway": gateway})
2023-09-02 18:09:41 -05:00
if no_parse:
print("Now do the next part and rerun with --pdu")
exit()
2023-09-03 10:28:51 -05:00
return parse_pdu(r.text, req_id)
2023-08-21 16:09:35 -05:00
2023-09-02 18:09:41 -05:00
# if r.text.split("?")[0] != "REG-RESP":
# raise Exception(f"Failed to register: {r.text}")
# #assert r.text.split("?")[0] == "REG-RESP"
# resp_params = r.text.split("?")[1]
# resp_params = resp_params.split(";")
# resp_params = {param.split("=")[0]: param.split("=")[1] for param in resp_params}
# assert resp_params["v"] == "3"
# assert resp_params["r"] == str(req_id)
# signature = bytes.fromhex(resp_params["s"])
# return resp_params["n"], signature
def parse_pdu(r: str, req_id: int | None = None):
2023-09-02 18:20:46 -05:00
if r.split("?")[0] != "REG-RESP":
raise Exception(f"Failed to register: {r}")
2023-08-21 16:09:35 -05:00
#assert r.text.split("?")[0] == "REG-RESP"
2023-09-02 18:20:46 -05:00
resp_params = r.split("?")[1]
2023-08-21 16:09:35 -05:00
resp_params = resp_params.split(";")
resp_params = {param.split("=")[0]: param.split("=")[1] for param in resp_params}
assert resp_params["v"] == "3"
2023-09-02 18:09:41 -05:00
if req_id is not None:
assert resp_params["r"] == str(req_id)
2023-08-21 16:09:35 -05:00
signature = bytes.fromhex(resp_params["s"])
return resp_params["n"], signature
2023-09-02 18:09:41 -05:00
# async def main():
# # Open test.json
# try:
# with open("test.json", "r") as f:
# test_json = f.read()
# import json
# test_json = json.loads(test_json)
# except FileNotFoundError:
# test_json = {}
2023-08-21 16:09:35 -05:00
2023-09-02 18:09:41 -05:00
# creds = apns.PushCredentials(
# test_json.get("push_key", ""),
# test_json.get("push_cert", ""),
# b64decode(test_json["push_token"]) if "push_token" in test_json else b"",
# )
# async with apns.APNSConnection.start(creds) as connection:
# connection.credentials
# #number, sig = register(connection.credentials.token)
# if "register_sig" not in test_json:
# try:
# number, sig = register(connection.credentials.token)
# test_json["register_sig"] = sig.hex()
# test_json["number"] = number
# except Exception as e:
# print(e)
# sig = None
# number = None
# else:
# sig = bytes.fromhex(test_json["register_sig"])
# number = test_json["number"]
# if sig is not None and number is not None:
# from ids import profile
# phone_auth_keypair = profile.get_phone_cert(number, connection.credentials.token, [sig])
# test_json["auth_key"] = phone_auth_keypair.key
# test_json["auth_cert"] = phone_auth_keypair.cert
# out_json = {
# "push_key": creds.private_key,
# "push_cert": creds.cert,
# "push_token": b64encode(creds.token).decode("utf-8"),
# }
# test_json.update(out_json)
# with open("test.json", "w") as f:
# import json
# f.write(json.dumps(test_json, indent=4))
# if __name__ == "__main__":
# trio.run(main)