// Copyright 2017 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 CHROMEOS_NETWORK_NETWORK_CERTIFICATE_HANDLER_H_
#define CHROMEOS_NETWORK_NETWORK_CERTIFICATE_HANDLER_H_

#include <string>
#include <vector>

#include "base/component_export.h"
#include "base/macros.h"
#include "chromeos/network/network_cert_loader.h"

namespace chromeos {

// This class maintains user and server CA certificate lists for network
// configuration UI.
class COMPONENT_EXPORT(CHROMEOS_NETWORK) NetworkCertificateHandler
    : public NetworkCertLoader::Observer {
 public:
  class Observer {
   public:
    virtual ~Observer() {}

    // Called for any Observers whenever the certificates are loaded and any
    // time the certificate lists change.
    virtual void OnCertificatesChanged() = 0;

   protected:
    Observer() {}

   private:
    DISALLOW_COPY_AND_ASSIGN(Observer);
  };

  struct Certificate {
    Certificate();
    ~Certificate();
    Certificate(const Certificate& other);

    // A net::HashValue result used to uniquely identify certificates.
    std::string hash;

    // The X509 certificate issuer common name.
    std::string issued_by;

    // The X509 certificate common name or nickname.
    std::string issued_to;

    // The common name or nickname in Internationalized Domain Name format.
    std::string issued_to_ascii;

    // The PEM for Server CA certificates.
    std::string pem;

    // The PKCS#11 identifier in slot:id format for user certificates.
    std::string pkcs11_id;

    // True if a user certificate is stored in a hardware slot.
    bool hardware_backed = false;

    // True if the certificate is device-wide.
    bool device_wide = false;
  };

  NetworkCertificateHandler();
  ~NetworkCertificateHandler() override;

  void AddObserver(Observer* observer);
  void RemoveObserver(Observer* observer);

  const std::vector<Certificate>& server_ca_certificates() const {
    return server_ca_certificates_;
  }
  const std::vector<Certificate>& client_certificates() const {
    return client_certificates_;
  }

  // Adds a testing certificate to the list of authority ceritificates and
  // notifies observers that certificates have been updated.
  void AddAuthorityCertificateForTest(const std::string& issued_to);

 private:
  // NetworkCertLoader::Observer
  void OnCertificatesLoaded() override;

  void ProcessCertificates(
      const NetworkCertLoader::NetworkCertList& authority_certs,
      const NetworkCertLoader::NetworkCertList& client_certs);

  base::ObserverList<NetworkCertificateHandler::Observer>::Unchecked
      observer_list_;

  std::vector<Certificate> server_ca_certificates_;
  std::vector<Certificate> client_certificates_;

  DISALLOW_COPY_AND_ASSIGN(NetworkCertificateHandler);
};

}  // namespace chromeos

#endif  // CHROMEOS_NETWORK_NETWORK_CERTIFICATE_HANDLER_H_
