107 lines
3.5 KiB
Python
107 lines
3.5 KiB
Python
|
from pipenv.patched.safety.constants import EXIT_CODE_FAILURE, EXIT_CODE_INVALID_API_KEY, EXIT_CODE_TOO_MANY_REQUESTS, \
|
||
|
EXIT_CODE_UNABLE_TO_FETCH_VULNERABILITY_DB, EXIT_CODE_UNABLE_TO_LOAD_LOCAL_VULNERABILITY_DB, EXIT_CODE_MALFORMED_DB
|
||
|
|
||
|
|
||
|
class SafetyException(Exception):
|
||
|
|
||
|
def __init__(self, message="Unhandled exception happened: {info}", info=""):
|
||
|
self.message = message.format(info=info)
|
||
|
super().__init__(self.message)
|
||
|
|
||
|
def get_exit_code(self):
|
||
|
return EXIT_CODE_FAILURE
|
||
|
|
||
|
|
||
|
class SafetyError(Exception):
|
||
|
|
||
|
def __init__(self, message="Unhandled Safety generic error"):
|
||
|
self.message = message
|
||
|
super().__init__(self.message)
|
||
|
|
||
|
def get_exit_code(self):
|
||
|
return EXIT_CODE_FAILURE
|
||
|
|
||
|
|
||
|
class MalformedDatabase(SafetyError):
|
||
|
|
||
|
def __init__(self, reason=None, fetched_from="server",
|
||
|
message="Sorry, something went wrong.\n" +
|
||
|
"Safety CLI can not read the data fetched from {fetched_from} because is malformed.\n"):
|
||
|
info = "Reason, {reason}".format(reason=reason)
|
||
|
self.message = message.format(fetched_from=fetched_from) + (info if reason else "")
|
||
|
super().__init__(self.message)
|
||
|
|
||
|
def get_exit_code(self):
|
||
|
return EXIT_CODE_MALFORMED_DB
|
||
|
|
||
|
|
||
|
class DatabaseFetchError(SafetyError):
|
||
|
|
||
|
def __init__(self, message="Unable to load vulnerability database"):
|
||
|
self.message = message
|
||
|
super().__init__(self.message)
|
||
|
|
||
|
def get_exit_code(self):
|
||
|
return EXIT_CODE_UNABLE_TO_FETCH_VULNERABILITY_DB
|
||
|
|
||
|
|
||
|
class DatabaseFileNotFoundError(DatabaseFetchError):
|
||
|
|
||
|
def __init__(self, db=None, message="Unable to find vulnerability database in {db}"):
|
||
|
self.db = db
|
||
|
self.message = message.format(db=db)
|
||
|
super().__init__(self.message)
|
||
|
|
||
|
def get_exit_code(self):
|
||
|
return EXIT_CODE_UNABLE_TO_LOAD_LOCAL_VULNERABILITY_DB
|
||
|
|
||
|
|
||
|
class InvalidKeyError(DatabaseFetchError):
|
||
|
|
||
|
def __init__(self, key=None, message="Your API Key '{key}' is invalid. See {link}.", reason=None):
|
||
|
self.key = key
|
||
|
self.link = 'https://bit.ly/3OY2wEI'
|
||
|
self.message = message.format(key=key, link=self.link) if key else message
|
||
|
info = f" Reason: {reason}"
|
||
|
self.message = self.message + (info if reason else "")
|
||
|
super().__init__(self.message)
|
||
|
|
||
|
def get_exit_code(self):
|
||
|
return EXIT_CODE_INVALID_API_KEY
|
||
|
|
||
|
|
||
|
class TooManyRequestsError(DatabaseFetchError):
|
||
|
|
||
|
def __init__(self, reason=None,
|
||
|
message="Too many requests."):
|
||
|
info = f" Reason: {reason}"
|
||
|
self.message = message + (info if reason else "")
|
||
|
super().__init__(self.message)
|
||
|
|
||
|
def get_exit_code(self):
|
||
|
return EXIT_CODE_TOO_MANY_REQUESTS
|
||
|
|
||
|
|
||
|
class NetworkConnectionError(DatabaseFetchError):
|
||
|
|
||
|
def __init__(self, message="Check your network connection, unable to reach the server."):
|
||
|
self.message = message
|
||
|
super().__init__(self.message)
|
||
|
|
||
|
|
||
|
class RequestTimeoutError(DatabaseFetchError):
|
||
|
|
||
|
def __init__(self, message="Check your network connection, the request timed out."):
|
||
|
self.message = message
|
||
|
super().__init__(self.message)
|
||
|
|
||
|
|
||
|
class ServerError(DatabaseFetchError):
|
||
|
|
||
|
def __init__(self, reason=None,
|
||
|
message="Sorry, something went wrong.\n" + "Safety CLI can not connect to the server.\n" +
|
||
|
"Our engineers are working quickly to resolve the issue."):
|
||
|
info = f" Reason: {reason}"
|
||
|
self.message = message + (info if reason else "")
|
||
|
super().__init__(self.message)
|