// Copyright (c) 2011 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 VPN_MANAGER_L2TP_MANAGER_H_
#define VPN_MANAGER_L2TP_MANAGER_H_

#include <sys/socket.h>

#include <memory>
#include <optional>
#include <string>

#include <base/files/file_path.h>
#include <base/files/file_util.h>
#include <base/time/time.h>
#include <gtest/gtest_prod.h>  // for FRIEND_TEST

#include "vpn-manager/service_manager.h"

namespace brillo {
class Process;
}

namespace vpn_manager {

// Manages the L2TP daemon.  This manager orchestrates configuring and
// launching the L2TP daemon, initiating the L2TP connection, and
// detecting when PPP has been set up.  It also sends user credentials
// to PPP through the L2TP control fifo unless the user has specified
// a PPP plugin should be used, which it will defer to.  Current
// implementation assumes a connection that has been stopped will not
// be started again with the same object.
class L2tpManager : public ServiceManager {
 public:
  L2tpManager(bool default_route,
              bool length_bit,
              bool require_chap,
              bool refuse_pap,
              bool require_authentication,
              const std::string& password,
              bool ppp_lcp_echo,
              int ppp_setup_timeout,
              const std::string& pppd_plugin,
              bool use_peer_dns,
              const std::string& user,
              bool system_config,
              const base::FilePath& temp_path);
  ~L2tpManager() override = default;

  // Getters for private values, needed for unit tests.
  int GetPppSetupTimeoutForTesting();

  // Setters for private values, needed for unit tests.
  void SetDefaultRouteForTesting(bool default_route);
  void SetPasswordForTesting(const std::string& password);
  void SetPppdPluginForTesting(const std::string& pppd_plugin);
  void SetPppLcpEchoForTesting(bool ppp_lcp_echo);
  void SetUsePeerDnsForTesting(bool use_peer_dns);
  void SetUserForTesting(const std::string& user);
  void SetSystemConfigForTesting(bool system_config);

  // Initialize the object using |remote_host|.  Returns false if
  // an illegal set of parameters has been given.  Has no side effects
  // other than setting up the object.
  bool Initialize(const sockaddr_storage& remote_address);

  bool Start() override;
  void Stop() override;
  int Poll() override;
  void ProcessOutput() override;
  void ProcessPppOutput();
  bool IsChild(pid_t pid) override;
  void OnSyslogOutput(const std::string& prefix,
                      const std::string& line) override;

  // Returns the stderr output file descriptor of our child process.
  int output_fd() const { return output_fd_; }

  // Returns the log output file descriptor of the ppp daemon.
  int ppp_output_fd() const { return ppp_output_fd_; }

 private:
  friend class L2tpManagerTest;
  FRIEND_TEST(L2tpManagerTest, FormatL2tpdConfiguration);
  FRIEND_TEST(L2tpManagerTest, FormatPppdConfiguration);
  FRIEND_TEST(L2tpManagerTest, Initiate);
  FRIEND_TEST(L2tpManagerTest, PollInitiateConnection);
  FRIEND_TEST(L2tpManagerTest, PollNothingIfRunning);
  FRIEND_TEST(L2tpManagerTest, PollTimeoutWaitingForControl);
  FRIEND_TEST(L2tpManagerTest, PollTimeoutWaitingForUp);
  FRIEND_TEST(L2tpManagerTest, PollTransitionToUp);
  FRIEND_TEST(L2tpManagerTest, PollWaitIfNotUpYet);
  FRIEND_TEST(L2tpManagerTest, Start);
  FRIEND_TEST(L2tpManagerTest, Terminate);

  bool CreatePppLogFifo();
  std::optional<std::string> FormatL2tpdConfiguration(
      const std::string& ppp_config_path);
  std::string FormatPppdConfiguration();
  bool Initiate();
  bool Terminate();

  // Command line flags.
  bool default_route_;
  bool length_bit_;
  bool require_chap_;
  bool refuse_pap_;
  bool require_authentication_;
  std::string password_;
  bool ppp_lcp_echo_;
  int ppp_setup_timeout_;
  std::string pppd_plugin_;
  bool use_peer_dns_;
  std::string user_;
  bool system_config_;

  // Has the L2TP connection been initiated yet.
  bool was_initiated_;
  // l2tp daemon stderr pipe file descriptor.
  int output_fd_;
  // ppp daemon log pipe file descriptor.
  int ppp_output_fd_;
  // Start time of the l2tp daemon.
  base::TimeTicks start_ticks_;
  // Remote address for L2TP connection.
  sockaddr_storage remote_address_;
  // Remote address for L2TP connection (as a string).
  std::string remote_address_text_;
  // Last partial line read from output_fd_.
  std::string partial_output_line_;
  // Last partial line read from ppp_output_fd_.
  std::string partial_ppp_output_line_;
  // Path to a file whose existence indicates the ppp device is up.
  base::FilePath ppp_interface_path_;
  // Path to ppp daemon's log file.
  base::FilePath ppp_output_path_;
  // Path to l2tp daemon's control file.
  base::FilePath l2tpd_control_path_;
  // Running l2tp process.
  std::unique_ptr<brillo::Process> l2tpd_;
};

}  // namespace vpn_manager

#endif  // VPN_MANAGER_L2TP_MANAGER_H_
