Skip to content

Commit

Permalink
Merge pull request #39 from smswithoutborders/feature/grpc-api
Browse files Browse the repository at this point in the history
feat: Support phone number as user identifier
  • Loading branch information
PromiseFru authored Aug 7, 2024
2 parents 8042076 + 693fb2d commit 3308c05
Show file tree
Hide file tree
Showing 3 changed files with 83 additions and 33 deletions.
24 changes: 19 additions & 5 deletions docs/grpc.md
Original file line number Diff line number Diff line change
Expand Up @@ -675,9 +675,10 @@ This method handles publishing a relaysms payload.
> The table lists only the required fields for this step. Other fields will be
> ignored.
| Field | Type | Description |
| ------- | ------ | ------------------------------------ |
| content | string | The content payload to be published. |
| Field | Type | Description |
| -------- | ------------------- | ------------------------------------ |
| content | string | The content payload to be published. |
| metadata | map<string, string> | Metadata about the content. |
---
Expand Down Expand Up @@ -711,9 +712,22 @@ This method handles publishing a relaysms payload.
```bash
grpcurl -plaintext \
-d '{"content": "encoded_relay_sms_payload"}' \
-d @ \
-proto protos/v1/publisher.proto \
localhost:6000 publisher.v1.Publisher/PublishContent
localhost:6000 publisher.v1.Publisher/PublishContent <payload.json
```
---
**Sample payload.json**
```json
{
"content": "encoded_relay_sms_payload",
"metadata": {
"From": "+1234567890"
}
}
```
---
Expand Down
60 changes: 39 additions & 21 deletions grpc_publisher_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,8 @@ def create_token_update_handler(self, response_cls, grpc_context, **kwargs):
Returns:
function: A function `handle_token_update(token)` that updates the token information.
"""
device_id = kwargs["device_id"]
device_id = kwargs.get("device_id")
phone_number = kwargs.get("phone_number")
account_id = kwargs["account_id"]
platform = kwargs["platform"]

Expand All @@ -131,9 +132,11 @@ def handle_token_update(token, **kwargs):
Args:
token (dict or object): The token information containing access and refresh tokens.
"""
logger.debug(kwargs)

update_response, update_error = update_entity_token(
device_id=device_id,
phone_number=phone_number,
token=json.dumps(token),
account_identifier=account_id,
platform=platform,
Expand Down Expand Up @@ -488,9 +491,12 @@ def get_platform_info(platform_letter):
)
return platform_info, None

def get_access_token(device_id, platform_name, account_identifier):
def get_access_token(
device_id, phone_number, platform_name, account_identifier
):
get_access_token_response, get_access_token_error = get_entity_access_token(
device_id=device_id.hex(),
device_id=device_id,
phone_number=phone_number,
platform=platform_name,
account_identifier=account_identifier,
)
Expand All @@ -508,9 +514,11 @@ def get_access_token(device_id, platform_name, account_identifier):
)
return get_access_token_response.token, None

def decrypt_message(device_id, encrypted_content):
def decrypt_message(device_id, phone_number, encrypted_content):
decrypt_payload_response, decrypt_payload_error = decrypt_payload(
device_id.hex(), base64.b64encode(encrypted_content).decode("utf-8")
device_id=device_id,
phone_number=phone_number,
payload_ciphertext=base64.b64encode(encrypted_content).decode("utf-8"),
)
if decrypt_payload_error:
return None, self.handle_create_grpc_error_response(
Expand Down Expand Up @@ -544,7 +552,7 @@ def decrypt_message(device_id, encrypted_content):
# )
# return encrypt_payload_response.payload_ciphertext, None

def handle_oauth2_email(device_id, platform_name, service_type, payload, token):
def handle_oauth2_email(platform_name, service_type, payload, token, **kwargs):
content_parts, parse_error = parse_content(service_type, payload)

if parse_error:
Expand All @@ -568,7 +576,8 @@ def handle_oauth2_email(device_id, platform_name, service_type, payload, token):
platform_name,
json.loads(token),
self.create_token_update_handler(
device_id=device_id.hex(),
device_id=kwargs.get("device_id"),
phone_number=kwargs.get("phone_number"),
account_id=from_email,
platform=platform_name,
response_cls=response,
Expand All @@ -577,7 +586,7 @@ def handle_oauth2_email(device_id, platform_name, service_type, payload, token):
)
return oauth2_client.send_message(email_message, from_email)

def handle_oauth2_text(device_id, platform_name, service_type, payload, token):
def handle_oauth2_text(platform_name, service_type, payload, token, **kwargs):
content_parts, parse_error = parse_content(service_type, payload)

if parse_error:
Expand All @@ -593,7 +602,8 @@ def handle_oauth2_text(device_id, platform_name, service_type, payload, token):
platform_name,
json.loads(token),
self.create_token_update_handler(
device_id=device_id.hex(),
device_id=kwargs.get("device_id"),
phone_number=kwargs.get("phone_number"),
account_id=sender,
platform=platform_name,
response_cls=response,
Expand All @@ -617,35 +627,43 @@ def handle_oauth2_text(device_id, platform_name, service_type, payload, token):
if platform_info_error:
return platform_info_error

device_id_hex = device_id.hex() if device_id else None
decrypted_content, decrypt_error = decrypt_message(
device_id, encrypted_content
device_id=device_id_hex,
phone_number=request.metadata["From"],
encrypted_content=encrypted_content,
)

if decrypt_error:
return decrypt_error

access_token, access_token_error = get_access_token(
device_id, platform_info["name"], decrypted_content.split(":")[0]
device_id=device_id_hex,
phone_number=request.metadata["From"],
platform_name=platform_info["name"],
account_identifier=decrypted_content.split(":")[0],
)
if access_token_error:
return access_token_error

message_response = None
if platform_info["service_type"] == "email":
message_response = handle_oauth2_email(
device_id,
platform_info["name"],
platform_info["service_type"],
decrypted_content,
access_token,
device_id=device_id_hex,
phone_number=request.metadata["From"],
platform_name=platform_info["name"],
service_type=platform_info["service_type"],
payload=decrypted_content,
token=access_token,
)
elif platform_info["service_type"] == "text":
message_response = handle_oauth2_text(
device_id,
platform_info["name"],
platform_info["service_type"],
decrypted_content,
access_token,
device_id=device_id_hex,
phone_number=request.metadata["From"],
platform_name=platform_info["name"],
service_type=platform_info["service_type"],
payload=decrypted_content,
token=access_token,
)

# payload_ciphertext, encrypt_payload_error = encrypt_message(
Expand Down
32 changes: 25 additions & 7 deletions grpc_vault_entity_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -148,37 +148,46 @@ def get_entity_access_token(platform, account_identifier, **kwargs):
stub = kwargs["stub"]
device_id = kwargs.get("device_id")
long_lived_token = kwargs.get("long_lived_token")
phone_number = kwargs.get("phone_number")

request = vault_pb2.GetEntityAccessTokenRequest(
device_id=device_id,
long_lived_token=long_lived_token,
platform=platform,
account_identifier=account_identifier,
phone_number=phone_number,
)

identifier = device_id or long_lived_token
identifier = device_id or long_lived_token or phone_number
logger.debug(
"Requesting access tokens for %s '%s'...",
"device_id" if device_id else "long_lived_token",
(
"device_id"
if device_id
else "long_lived_token" if long_lived_token else "phone_number"
),
identifier,
)
response = stub.GetEntityAccessToken(request)

logger.info(
"Successfully retrieved access token for %s '%s'.",
"device_id" if device_id else "long_lived_token",
(
"device_id"
if device_id
else "long_lived_token" if long_lived_token else "phone_number"
),
identifier,
)
return response, None


@grpc_call()
def decrypt_payload(device_id, payload_ciphertext, **kwargs):
def decrypt_payload(payload_ciphertext, **kwargs):
"""
Decrypts the payload.
Args:
device_id (str): The ID of the device.
payload_ciphertext (bytes): The ciphertext of the payload to be decrypted.
Returns:
Expand All @@ -187,8 +196,13 @@ def decrypt_payload(device_id, payload_ciphertext, **kwargs):
- error (Exception): The error encountered if the request fails, otherwise None.
"""
stub = kwargs["stub"]
device_id = kwargs.get("device_id")
phone_number = kwargs.get("phone_number")

request = vault_pb2.DecryptPayloadRequest(
device_id=device_id, payload_ciphertext=payload_ciphertext
device_id=device_id,
payload_ciphertext=payload_ciphertext,
phone_number=phone_number,
)

logger.debug(
Expand Down Expand Up @@ -229,7 +243,7 @@ def encrypt_payload(device_id, payload_plaintext, **kwargs):


@grpc_call()
def update_entity_token(device_id, token, platform, account_identifier, **kwargs):
def update_entity_token(token, platform, account_identifier, **kwargs):
"""Update an entity's token in the vault.
Args:
Expand All @@ -244,11 +258,15 @@ def update_entity_token(device_id, token, platform, account_identifier, **kwargs
- error (Exception): The error encountered if the request fails, otherwise None.
"""
stub = kwargs["stub"]
device_id = kwargs.get("device_id")
phone_number = kwargs.get("phone_number")

request = vault_pb2.UpdateEntityTokenRequest(
device_id=device_id,
token=token,
platform=platform,
account_identifier=account_identifier,
phone_number=phone_number,
)

logger.debug("Updating token for platform '%s'", platform)
Expand Down

0 comments on commit 3308c05

Please sign in to comment.