# $Id$
#
# Copyright (C) 2014  Dragon Research Labs ("DRL")
# Portions copyright (C) 2009--2013  Internet Systems Consortium ("ISC")
# Portions copyright (C) 2007--2008  American Registry for Internet Numbers ("ARIN")
#
# Permission to use, copy, modify, and distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notices and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND DRL, ISC, AND ARIN DISCLAIM ALL
# WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL DRL,
# ISC, OR ARIN BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR
# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
# OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
# WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

"""
Exception definitions for RPKI modules.
"""

class RPKI_Exception(Exception):
  """
  Base class for RPKI exceptions.
  """

class NotInDatabase(RPKI_Exception):
  """
  Lookup failed for an object expected to be in the database.
  """

class BadURISyntax(RPKI_Exception):
  """
  Illegal syntax for a URI.
  """

class BadStatusCode(RPKI_Exception):
  """
  Unrecognized protocol status code.
  """

class BadQuery(RPKI_Exception):
  """
  Unexpected protocol query.
  """

class DBConsistancyError(RPKI_Exception):
  """
  Found multiple matches for a database query that shouldn't ever
  return that.
  """

class CMSVerificationFailed(RPKI_Exception):
  """
  Verification of a CMS message failed.
  """

class HTTPRequestFailed(RPKI_Exception):
  """
  HTTP request failed.
  """

class DERObjectConversionError(RPKI_Exception):
  """
  Error trying to convert a DER-based object from one representation
  to another.
  """

class NotACertificateChain(RPKI_Exception):
  """
  Certificates don't form a proper chain.
  """

class BadContactURL(RPKI_Exception):
  """
  Error trying to parse contact URL.
  """

class BadClassNameSyntax(RPKI_Exception):
  """
  Illegal syntax for a class_name.
  """

class BadIssueResponse(RPKI_Exception):
  """
  issue_response PDU with wrong number of classes or certificates.
  """

class NotImplementedYet(RPKI_Exception):
  """
  Internal error -- not implemented yet.
  """

class BadPKCS10(RPKI_Exception):
  """
  Bad PKCS #10 object.
  """

class UpstreamError(RPKI_Exception):
  """
  Received an error from upstream.
  """

class ChildNotFound(RPKI_Exception):
  """
  Could not find specified child in database.
  """

class BSCNotFound(RPKI_Exception):
  """
  Could not find specified BSC in database.
  """

class BadSender(RPKI_Exception):
  """
  Unexpected XML sender value.
  """

class ClassNameMismatch(RPKI_Exception):
  """
  class_name does not match child context.
  """

class ClassNameUnknown(RPKI_Exception):
  """
  Unknown class_name.
  """

class SKIMismatch(RPKI_Exception):
  """
  SKI value in response does not match request.
  """

class SubprocessError(RPKI_Exception):
  """
  Subprocess returned unexpected error.
  """

class BadIRDBReply(RPKI_Exception):
  """
  Unexpected reply to IRDB query.
  """

class NotFound(RPKI_Exception):
  """
  Object not found in database.
  """

class MustBePrefix(RPKI_Exception):
  """
  Resource range cannot be expressed as a prefix.
  """

class TLSValidationError(RPKI_Exception):
  """
  TLS certificate validation error.
  """

class MultipleTLSEECert(TLSValidationError):
  """
  Received more than one TLS EE certificate.
  """

class ReceivedTLSCACert(TLSValidationError):
  """
  Received CA certificate via TLS.
  """

class WrongEContentType(RPKI_Exception):
  """
  Received wrong CMS eContentType.
  """

class EmptyPEM(RPKI_Exception):
  """
  Couldn't find PEM block to convert.
  """

class UnexpectedCMSCerts(RPKI_Exception):
  """
  Received CMS certs when not expecting any.
  """

class UnexpectedCMSCRLs(RPKI_Exception):
  """
  Received CMS CRLs when not expecting any.
  """

class MissingCMSEEcert(RPKI_Exception):
  """
  Didn't receive CMS EE cert when expecting one.
  """

class MissingCMSCRL(RPKI_Exception):
  """
  Didn't receive CMS CRL when expecting one.
  """

class UnparsableCMSDER(RPKI_Exception):
  """
  Alleged CMS DER wasn't parsable.
  """

class CMSCRLNotSet(RPKI_Exception):
  """
  CMS CRL has not been configured.
  """

class ServerShuttingDown(RPKI_Exception):
  """
  Server is shutting down.
  """

class NoActiveCA(RPKI_Exception):
  """
  No active ca_detail for specified class.
  """

class BadClientURL(RPKI_Exception):
  """
  URL given to HTTP client does not match profile.
  """

class ClientNotFound(RPKI_Exception):
  """
  Could not find specified client in database.
  """

class BadExtension(RPKI_Exception):
  """
  Forbidden X.509 extension.
  """

class ForbiddenURI(RPKI_Exception):
  """
  Forbidden URI, does not start with correct base URI.
  """

class HTTPClientAborted(RPKI_Exception):
  """
  HTTP client connection closed while in request-sent state.
  """

class BadPublicationReply(RPKI_Exception):
  """
  Unexpected reply to publication query.
  """

class DuplicateObject(RPKI_Exception):
  """
  Attempt to create an object that already exists.
  """

class EmptyROAPrefixList(RPKI_Exception):
  """
  Can't create ROA with an empty prefix list.
  """

class NoCoveringCertForROA(RPKI_Exception):
  """
  Couldn't find a covering certificate to generate ROA.
  """

class BSCNotReady(RPKI_Exception):
  """
  BSC not yet in a usable state, signing_cert not set.
  """

class HTTPUnexpectedState(RPKI_Exception):
  """
  HTTP event occurred in an unexpected state.
  """

class HTTPBadVersion(RPKI_Exception):
  """
  HTTP couldn't parse HTTP version.
  """

class HandleTranslationError(RPKI_Exception):
  """
  Internal error translating protocol handle -> SQL id.
  """

class NoObjectAtURI(RPKI_Exception):
  """
  No object published at specified URI.
  """

class CMSContentNotSet(RPKI_Exception):
  """
  Inner content of a CMS_object has not been set.  If object is known
  to be valid, the .extract() method should be able to set the
  content; otherwise, only the .verify() method (which checks
  signatures) is safe.
  """

class HTTPTimeout(RPKI_Exception):
  """
  HTTP connection timed out.
  """

class BadIPResource(RPKI_Exception):
  """
  Parse failure for alleged IP resource string.
  """

class BadROAPrefix(RPKI_Exception):
  """
  Parse failure for alleged ROA prefix string.
  """

class CommandParseFailure(RPKI_Exception):
  """
  Failed to parse command line.
  """

class CMSCertHasExpired(RPKI_Exception):
  """
  CMS certificate has expired.
  """

class TrustedCMSCertHasExpired(RPKI_Exception):
  """
  Trusted CMS certificate has expired.
  """

class MultipleCMSEECert(RPKI_Exception):
  """
  Can't have more than one CMS EE certificate in validation chain.
  """

class ResourceOverlap(RPKI_Exception):
  """
  Overlapping resources in resource_set.
  """

class CMSReplay(RPKI_Exception):
  """
  Possible CMS replay attack detected.
  """

class PastNotAfter(RPKI_Exception):
  """
  Requested notAfter value is already in the past.
  """

class NullValidityInterval(RPKI_Exception):
  """
  Requested validity interval is null.
  """

class BadX510DN(RPKI_Exception):
  """
  X.510 distinguished name does not match profile.
  """

class BadAutonomousSystemNumber(RPKI_Exception):
  """
  Bad AutonomousSystem number.
  """

class WrongEKU(RPKI_Exception):
  """
  Extended Key Usage extension does not match profile.
  """