// Copyright 2021 The Chromium OS 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 SHILL_VPN_L2TP_CONNECTION_H_
#define SHILL_VPN_L2TP_CONNECTION_H_

#include <map>
#include <memory>
#include <string>

#include <base/callback.h>
#include <base/files/file_path.h>
#include <base/files/scoped_temp_dir.h>
#include <libpasswordprovider/password_provider.h>

#include "shill/control_interface.h"
#include "shill/device_info.h"
#include "shill/event_dispatcher.h"
#include "shill/external_task.h"
#include "shill/process_manager.h"
#include "shill/service.h"
#include "shill/vpn/vpn_connection.h"
#include "shill/vpn/vpn_util.h"

namespace shill {

// TODO(b/165170125): Document temporary files.
class L2TPConnection : public VPNConnection, public RpcTaskDelegate {
 public:
  struct Config {
    std::string remote_ip;

    // Fields for xl2tpd.
    bool refuse_pap;
    bool require_auth;
    bool require_chap;
    bool length_bit;

    // Fields for pppd.
    bool lcp_echo;  // lcp echo connection monitoring
    std::string user;
    std::string password;
    bool use_login_password;
  };

  L2TPConnection(std::unique_ptr<Config> config,
                 std::unique_ptr<Callbacks> callbacks,
                 ControlInterface* control_interface,
                 DeviceInfo* device_info,
                 EventDispatcher* dispatcher,
                 ProcessManager* process_manager);
  ~L2TPConnection();

  // Implements RpcTaskDelegate.
  void GetLogin(std::string* user, std::string* password) override;
  void Notify(const std::string& reason,
              const std::map<std::string, std::string>& dict) override;

 private:
  friend class L2TPConnectionUnderTest;  // For unit tests.

  void OnConnect() override;
  void OnDisconnect() override;

  // Writes config file for pppd. |pppd_config_path_| will be filled with the
  // path to the file. Returns true on success.
  bool WritePPPDConfig();
  // Writes config file for xl2tpd. |l2tpd_config_path_| will be filled with the
  // path to the file. Returns true on success. This function needs to be called
  // after WritePPPDConfig() since this file contains the path to the ppp config
  // file.
  bool WriteL2TPDConfig();

  // Starts the xl2tpd process. Invokes NotifyFailure() on failure. Otherwise,
  // the connect process will be continued in Notify() (callback from the pppd
  // plugin).
  void StartXl2tpd();

  // Callback registered in DeviceInfo to invoke NotifyConnected() once
  // DeviceInfo notices the ppp interface.
  void OnLinkReady(const IPConfig::Properties& ip_properties,
                   const std::string& if_name,
                   int if_index);
  void OnXl2tpdExitedUnexpectedly(pid_t pid, int exit_code);

  std::unique_ptr<Config> config_;

  base::ScopedTempDir temp_dir_;

  // Paths to the config files. All the files are stored in |temp_dir_| and thus
  // will be removed when this class is destroyed.
  base::FilePath l2tpd_config_path_;
  base::FilePath pppd_config_path_;

  std::unique_ptr<ExternalTask> external_task_;

  // External dependencies.
  ControlInterface* control_interface_;
  DeviceInfo* device_info_;
  std::unique_ptr<password_provider::PasswordProviderInterface>
      password_provider_;
  ProcessManager* process_manager_;
  std::unique_ptr<VPNUtil> vpn_util_;

  base::WeakPtrFactory<L2TPConnection> weak_factory_{this};
};

}  // namespace shill

#endif  // SHILL_VPN_L2TP_CONNECTION_H_
