// 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,
    CERT_SYMANTEC_LEGACY = 16,
    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_
