// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef COMPONENTS_SSL_ERRORS_SSL_ERROR_INFO_H_
#define COMPONENTS_SSL_ERRORS_SSL_ERROR_INFO_H_

#include <string>
#include <vector>

#include "base/macros.h"
#include "base/strings/string16.h"
#include "net/cert/cert_status_flags.h"
#include "net/cert/x509_certificate.h"

class GURL;

namespace ssl_errors {

// This class describes an error that happened while showing a page over SSL.
// An ErrorInfo object only exists on the UI thread and only contains
// information about an error (type of error and text details).
// Note no DISALLOW_COPY_AND_ASSIGN as we want the copy constructor.
class ErrorInfo {
 public:
  // This enum is being histogrammed; please only add new values at the end.
  enum ErrorType {
    CERT_COMMON_NAME_INVALID = 0,
    CERT_DATE_INVALID = 1,
    CERT_AUTHORITY_INVALID = 2,
    CERT_CONTAINS_ERRORS = 3,
    CERT_NO_REVOCATION_MECHANISM = 4,
    CERT_UNABLE_TO_CHECK_REVOCATION = 5,
    CERT_REVOKED = 6,
    CERT_INVALID = 7,
    CERT_WEAK_SIGNATURE_ALGORITHM = 8,
    CERT_WEAK_KEY = 9,
    CERT_NAME_CONSTRAINT_VIOLATION = 10,
    UNKNOWN = 11,
    // CERT_WEAK_KEY_DH = 12,
    CERT_PINNED_KEY_MISSING = 13,
    CERT_VALIDITY_TOO_LONG = 14,
    CERTIFICATE_TRANSPARENCY_REQUIRED = 15,
    END_OF_ENUM
  };

  virtual ~ErrorInfo();

  // Converts a network error code to an ErrorType.
  static ErrorType NetErrorToErrorType(int net_error);

  static ErrorInfo CreateError(ErrorType error_type,
                               net::X509Certificate* cert,
                               const GURL& request_url);

  // Populates the specified |errors| vector with the errors contained in
  // |cert_status| for |cert|.  Returns the number of errors found.
  // Callers only interested in the error count can pass NULL for |errors|.
  static void GetErrorsForCertStatus(
      const scoped_refptr<net::X509Certificate>& cert,
      net::CertStatus cert_status,
      const GURL& url,
      std::vector<ErrorInfo>* errors);

  // A description of the error.
  const base::string16& details() const { return details_; }

  // A short message describing the error (1 line).
  const base::string16& short_description() const { return short_description_; }

 private:
  ErrorInfo(const base::string16& details,
            const base::string16& short_description);

  base::string16 details_;
  base::string16 short_description_;
};

}  // namespace ssl_errors

#endif  // COMPONENTS_SSL_ERRORS_SSL_ERROR_INFO_H_
