"""
Generic error hierarchy
Leap/EIP exceptions used for exception handling,
logging, and notifying user of errors
during leap operation.
Exception hierarchy
-------------------
All EIP Errors must inherit from EIPClientError (note: move that to
a more generic LEAPClientBaseError).
Exception attributes and their meaning/uses
-------------------------------------------
* critical: if True, will abort execution prematurely,
after attempting any cleaning
action.
* failfirst: breaks any error_check loop that is examining
the error queue.
* message: the message that will be used in the __repr__ of the exception.
* usermessage: the message that will be passed to user in ErrorDialogs
in Qt-land.
TODO:
* EIPClientError:
Should inherit from LeapException
* gettext / i18n for user messages.
"""
from leap.base.exceptions import LeapException
from leap.util.translations import translate
# This should inherit from LeapException
class EIPClientError(Exception):
"""
base EIPClient exception
"""
critical = False
failfirst = False
warning = False
class CriticalError(EIPClientError):
"""
we cannot do anything about it, sorry
"""
critical = True
failfirst = True
class Warning(EIPClientError):
"""
just that, warnings
"""
warning = True
class EIPNoPolkitAuthAgentAvailable(CriticalError):
message = "No polkit authentication agent could be found"
usermessage = translate(
"EIPErrors",
"We could not find any authentication "
"agent in your system.
"
"Make sure you have "
"polkit-gnome-authentication-agent-1 "
"running and try again.")
class EIPNoPkexecAvailable(Warning):
message = "No pkexec binary found"
usermessage = translate(
"EIPErrors",
"We could not find pkexec in your "
"system.
Do you want to try "
"setuid workaround? "
"(DOES NOTHING YET)")
failfirst = True
class EIPNoCommandError(EIPClientError):
message = "no suitable openvpn command found"
usermessage = translate(
"EIPErrors",
"No suitable openvpn command found. "
"
(Might be a permissions problem)")
class EIPBadCertError(Warning):
# XXX this should be critical and fail close
message = "cert verification failed"
usermessage = translate(
"EIPErrors",
"there is a problem with provider certificate")
class LeapBadConfigFetchedError(Warning):
message = "provider sent a malformed json file"
usermessage = translate(
"EIPErrors",
"an error occurred during configuratio of leap services")
class OpenVPNAlreadyRunning(CriticalError):
message = "Another OpenVPN Process is already running."
usermessage = translate(
"EIPErrors",
"Another OpenVPN Process has been detected. "
"Please close it before starting leap-client")
class HttpsNotSupported(LeapException):
message = "connection refused while accessing via https"
usermessage = translate(
"EIPErrors",
"Server does not allow secure connections")
class HttpsBadCertError(LeapException):
message = "verification error on cert"
usermessage = translate(
"EIPErrors",
"Server certificate could not be verified")
#
# errors still needing some love
#
class EIPInitNoKeyFileError(CriticalError):
message = "No vpn keys found in the expected path"
usermessage = translate(
"EIPErrors",
"We could not find your eip certs in the expected path")
class EIPInitBadKeyFilePermError(Warning):
# I don't know if we should be telling user or not,
# we try to fix permissions and should only re-raise
# if permission check failed.
pass
class EIPInitNoProviderError(EIPClientError):
pass
class EIPInitBadProviderError(EIPClientError):
pass
class EIPConfigurationError(EIPClientError):
pass
#
# Errors that probably we don't need anymore
# chase down for them and check.
#
class MissingSocketError(Exception):
pass
class ConnectionRefusedError(Exception):
pass
class EIPMissingDefaultProvider(Exception):
pass