wadebug/wa_actions/wabiz_api.py (127 lines of code) (raw):
# Copyright (c) Facebook, Inc. and its affiliates.
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.
from __future__ import absolute_import, division, print_function, unicode_literals
import base64
import warnings
import requests
from requests.packages.urllib3.exceptions import InsecureRequestWarning
from wadebug import exceptions
try:
from urllib.parse import urljoin
except ImportError:
from urlparse import urljoin
class WABizAPI:
LOGIN_USER_ENDPOINT = "/v1/users/login"
SUPPORT_INFO_ENDPOINT = "/v1/support"
APP_SETTINGS_ENDPOINT = "/v1/settings/application"
WEBHOOK_CERTS_ENDPOINT = "/v1/certificates/webhooks/ca"
def __init__(self, **kwargs):
baseUrl = kwargs.get("baseUrl")
user = kwargs.get("user")
password = kwargs.get("password")
if baseUrl and user and password:
self.api_baseUrl = baseUrl
self.api_user = user
self.api_password = password
# suppress unverified https request warnings
warnings.simplefilter("ignore", InsecureRequestWarning)
self.api_header = self.__gen_req_header()
else:
raise ValueError(
"One or more required params (baseUrl, user, password) are missing."
)
def __gen_req_header(self):
# encode(): string -> byte, to use in b64encode()
# decode(): byte -> string, to use in header
encoded = base64.b64encode(
"{}:{}".format(self.api_user, self.api_password).encode()
).decode()
try:
res = requests.post(
url=urljoin(self.api_baseUrl, self.LOGIN_USER_ENDPOINT),
headers={"AUTHORIZATION": "Basic {}".format(encoded)},
verify=False, # disable ssl verification
)
if res.status_code == 401:
raise exceptions.WABizAuthError(
"API authentication error. Please check your "
"configuration file (wadebug.conf.yml "
"in current directory)."
)
res = res.json()
except requests.exceptions.RequestException as e:
raise exceptions.WABizNetworkError(
"Network request error. Please check your "
"configuration (wadebug.conf.yml in current directory)."
"\n{}".format(e)
)
token = res["users"][0]["token"]
return {
"AUTHORIZATION": "Bearer {}".format(token),
"CONTENT_TYPE": "application/json",
}
def __get(self, endpoint):
try:
res = requests.get(
url=urljoin(self.api_baseUrl, endpoint),
headers=self.api_header,
verify=False, # disable ssl verification
)
if res.status_code == 401:
raise exceptions.WABizAuthError(
"API authentication error. Please check your configuration."
)
res_json = res.json()
if res.status_code < 200 or res.status_code > 299:
self.__checkForErrors(res_json, endpoint)
return res_json
except requests.exceptions.RequestException as e:
raise exceptions.WABizNetworkError(
"Network request error. Please check your "
"configuration (wadebug.conf.yml in current directory)."
"\n{}".format(e)
)
def __get_raw(self, endpoint):
res = requests.get(
url=urljoin(self.api_baseUrl, endpoint),
headers=self.api_header,
verify=False, # disable ssl verification
)
if res.status_code == 401:
raise exceptions.WABizAuthError(
"API authentication error. Please check your configuration."
)
if res.status_code < 200 or res.status_code > 299:
res_json = res.json()
self.__checkForErrors(res_json, endpoint)
# res.status = 200 OK
return res.content
def __checkForErrors(self, res_json, src_endpoint):
errors = res_json.get("errors")
if errors is not None:
err = errors[0]
if "code" in err and err["code"] == 1005:
raise exceptions.WABizAccessError(
"This endpoint ({}) requires Admin role. "
"Please update the credentials in your "
"configuration (wadebug.conf.yml in current directory).".format(
src_endpoint
)
)
elif "code" in err and err["code"] == 1006:
raise exceptions.WABizResourceNotFound(
"The requested resource at endpoint ({}) could not be found."
"\n{}".format(src_endpoint, err["details"])
)
else:
raise exceptions.WABizGeneralError(
"The endpoint ({}) returned an errorneous response."
"\n{}".format(src_endpoint, err["details"])
)
def get_support_info(self):
return self.__get(self.SUPPORT_INFO_ENDPOINT)
def get_phone_number(self):
res = self.get_support_info()
return res["support"]["debug_info"]
def get_webhook_url(self):
res = self.__get(self.APP_SETTINGS_ENDPOINT)
return res["settings"]["application"]["webhooks"]["url"]
def get_webhook_cert(self):
try:
return self.__get_raw(self.WEBHOOK_CERTS_ENDPOINT)
except exceptions.WABizResourceNotFound:
return None