The great bump
This commit is contained in:
@@ -1,46 +1,10 @@
|
||||
# standard imports
|
||||
|
||||
# third-party imports
|
||||
import requests
|
||||
from chainlib.eth.address import to_checksum
|
||||
from hexathon import (
|
||||
add_0x,
|
||||
strip_0x,
|
||||
)
|
||||
# external imports
|
||||
|
||||
# local imports
|
||||
from cic_ussd.error import UnsupportedMethodError
|
||||
|
||||
|
||||
def make_request(method: str, url: str, data: any = None, headers: dict = None):
|
||||
"""
|
||||
:param method:
|
||||
:type method:
|
||||
:param url:
|
||||
:type url:
|
||||
:param data:
|
||||
:type data:
|
||||
:param headers:
|
||||
:type headers:
|
||||
:return:
|
||||
:rtype:
|
||||
"""
|
||||
if method == 'GET':
|
||||
result = requests.get(url=url)
|
||||
elif method == 'POST':
|
||||
result = requests.post(url=url, data=data, headers=headers)
|
||||
elif method == 'PUT':
|
||||
result = requests.put(url=url, data=data, headers=headers)
|
||||
else:
|
||||
raise UnsupportedMethodError(f'Unsupported method: {method}')
|
||||
return result
|
||||
|
||||
|
||||
def blockchain_address_to_metadata_pointer(blockchain_address: str):
|
||||
"""
|
||||
:param blockchain_address:
|
||||
:type blockchain_address:
|
||||
:return:
|
||||
:rtype:
|
||||
"""
|
||||
return bytes.fromhex(strip_0x(blockchain_address))
|
||||
from .base import Metadata
|
||||
from .custom import CustomMetadata
|
||||
from .person import PersonMetadata
|
||||
from .phone import PhonePointerMetadata
|
||||
from .preferences import PreferencesMetadata
|
||||
|
||||
@@ -5,17 +5,14 @@ import os
|
||||
from typing import Dict, Union
|
||||
|
||||
# third-part imports
|
||||
import requests
|
||||
from cic_types.models.person import generate_metadata_pointer, Person
|
||||
|
||||
# local imports
|
||||
from cic_ussd.metadata import make_request
|
||||
from cic_ussd.cache import cache_data, get_cached_data
|
||||
from cic_ussd.http.requests import error_handler, make_request
|
||||
from cic_ussd.metadata.signer import Signer
|
||||
from cic_ussd.redis import cache_data
|
||||
from cic_ussd.error import MetadataStoreError
|
||||
|
||||
|
||||
logg = logging.getLogger().getChild(__name__)
|
||||
logg = logging.getLogger(__file__)
|
||||
|
||||
|
||||
class Metadata:
|
||||
@@ -27,37 +24,10 @@ class Metadata:
|
||||
base_url = None
|
||||
|
||||
|
||||
def metadata_http_error_handler(result: requests.Response):
|
||||
""" This function handles and appropriately raises errors from http requests interacting with the metadata server.
|
||||
:param result: The response object from a http request.
|
||||
:type result: requests.Response
|
||||
"""
|
||||
status_code = result.status_code
|
||||
|
||||
if 100 <= status_code < 200:
|
||||
raise MetadataStoreError(f'Informational errors: {status_code}, reason: {result.reason}')
|
||||
|
||||
elif 300 <= status_code < 400:
|
||||
raise MetadataStoreError(f'Redirect Issues: {status_code}, reason: {result.reason}')
|
||||
|
||||
elif 400 <= status_code < 500:
|
||||
raise MetadataStoreError(f'Client Error: {status_code}, reason: {result.reason}')
|
||||
|
||||
elif 500 <= status_code < 600:
|
||||
raise MetadataStoreError(f'Server Error: {status_code}, reason: {result.reason}')
|
||||
|
||||
|
||||
class MetadataRequestsHandler(Metadata):
|
||||
|
||||
def __init__(self, cic_type: str, identifier: bytes, engine: str = 'pgp'):
|
||||
"""
|
||||
:param cic_type: The salt value with which to hash a specific metadata identifier.
|
||||
:type cic_type: str
|
||||
:param engine: Encryption used for sending data to the metadata server.
|
||||
:type engine: str
|
||||
:param identifier: A unique element of data in bytes necessary for creating a metadata pointer.
|
||||
:type identifier: bytes
|
||||
"""
|
||||
""""""
|
||||
self.cic_type = cic_type
|
||||
self.engine = engine
|
||||
self.headers = {
|
||||
@@ -73,22 +43,16 @@ class MetadataRequestsHandler(Metadata):
|
||||
self.url = os.path.join(self.base_url, self.metadata_pointer)
|
||||
|
||||
def create(self, data: Union[Dict, str]):
|
||||
""" This function is responsible for posting data to the metadata server with a corresponding metadata pointer
|
||||
for storage.
|
||||
:param data: The data to be stored in the metadata server.
|
||||
:type data: dict|str
|
||||
"""
|
||||
""""""
|
||||
data = json.dumps(data)
|
||||
result = make_request(method='POST', url=self.url, data=data, headers=self.headers)
|
||||
metadata_http_error_handler(result=result)
|
||||
|
||||
error_handler(result=result)
|
||||
metadata = result.json()
|
||||
self.edit(data=metadata)
|
||||
return self.edit(data=metadata)
|
||||
|
||||
def edit(self, data: Union[Dict, str]):
|
||||
""" This function is responsible for editing data in the metadata server corresponding to a unique pointer.
|
||||
:param data: The data to be edited in the metadata server.
|
||||
:type data: dict
|
||||
"""
|
||||
""""""
|
||||
cic_meta_signer = Signer()
|
||||
signature = cic_meta_signer.sign_digest(data=data)
|
||||
algorithm = cic_meta_signer.get_operational_key().get('algo')
|
||||
@@ -104,42 +68,34 @@ class MetadataRequestsHandler(Metadata):
|
||||
formatted_data = json.dumps(formatted_data)
|
||||
result = make_request(method='PUT', url=self.url, data=formatted_data, headers=self.headers)
|
||||
logg.info(f'signed metadata submission status: {result.status_code}.')
|
||||
metadata_http_error_handler(result=result)
|
||||
error_handler(result=result)
|
||||
try:
|
||||
decoded_identifier = self.identifier.decode("utf-8")
|
||||
except UnicodeDecodeError:
|
||||
decoded_identifier = self.identifier.hex()
|
||||
logg.info(f'identifier: {decoded_identifier}. metadata pointer: {self.metadata_pointer} set to: {data}.')
|
||||
return result
|
||||
|
||||
def query(self):
|
||||
"""
|
||||
:return:
|
||||
:rtype:
|
||||
"""
|
||||
# retrieve the metadata
|
||||
""""""
|
||||
result = make_request(method='GET', url=self.url)
|
||||
metadata_http_error_handler(result=result)
|
||||
|
||||
# json serialize retrieved data
|
||||
error_handler(result=result)
|
||||
result_data = result.json()
|
||||
|
||||
# validate result data format
|
||||
if not isinstance(result_data, dict):
|
||||
raise ValueError(f'Invalid result data object: {result_data}.')
|
||||
|
||||
if result.status_code == 200:
|
||||
if self.cic_type == ':cic.person':
|
||||
# validate person metadata
|
||||
person = Person()
|
||||
person_data = person.deserialize(person_data=result_data)
|
||||
|
||||
# format new person data for caching
|
||||
serialized_person_data = person_data.serialize()
|
||||
data = json.dumps(serialized_person_data)
|
||||
else:
|
||||
data = json.dumps(result_data)
|
||||
|
||||
# cache metadata
|
||||
cache_data(key=self.metadata_pointer, data=data)
|
||||
logg.debug(f'caching: {data} with key: {self.metadata_pointer}')
|
||||
return result_data
|
||||
|
||||
def get_cached_metadata(self):
|
||||
""""""
|
||||
key = generate_metadata_pointer(self.identifier, self.cic_type)
|
||||
return get_cached_data(key)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# standard imports
|
||||
|
||||
# third-party imports
|
||||
# external imports
|
||||
|
||||
# local imports
|
||||
from .base import MetadataRequestsHandler
|
||||
|
||||
@@ -29,10 +29,8 @@ class Signer:
|
||||
def __init__(self):
|
||||
self.gpg = gnupg.GPG(gnupghome=self.gpg_path)
|
||||
|
||||
# parse key file data
|
||||
key_file = open(self.key_file_path, 'r')
|
||||
self.key_data = key_file.read()
|
||||
key_file.close()
|
||||
with open(self.key_file_path, 'r') as key_file:
|
||||
self.key_data = key_file.read()
|
||||
|
||||
def get_operational_key(self):
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user