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

#include <map>
#include <string>

#include <base/macros.h>

namespace authpolicy {

enum class Path {
  // Invalid path, not set, triggers a DCHECK in PathService::Get().
  INVALID,

  // Base directories.
  TEMP_DIR,          // Files here are wiped on authpolicyd restart.
  STATE_DIR,         // Files here are persistent and globally accessible.
  RUN_DIR,           // Files here are wiped on reboot.
  DAEMON_STORE_DIR,  // Files here are persistent in the user's cryptohome and
                     // hence accessible only for the logged-in user.

  // Samba directories.
  SAMBA_DIR,
  SAMBA_LOCK_DIR,
  SAMBA_CACHE_DIR,
  SAMBA_STATE_DIR,
  SAMBA_PRIVATE_DIR,
  GPO_LOCAL_DIR,  // Location of downloaded GPOs.

  // Configuration files.
  CONFIG_DAT,        // Authpolicy configuration.
  USER_SMB_CONF,     // Samba configuration for user account.
  DEVICE_SMB_CONF,   // Samba configuration for device/machine account.
  USER_KRB5_CONF,    // Kerberos configuration for user account.
  DEVICE_KRB5_CONF,  // Kerberos configuration for device/machine account.

  // Credential cache paths.
  USER_CREDENTIAL_CACHE,
  DEVICE_CREDENTIAL_CACHE,

  // Machine credentials. Authpolicy uses EITHER password OR keytab. Newly
  // enrolled devices use passwords, older devices use keytabs.
  MACHINE_PASS,       // Current machine password.
  PREV_MACHINE_PASS,  // Previous machine password.
  NEW_MACHINE_PASS,   // New machine password.
  MACHINE_KEYTAB,     // Kerberos machine keytab file.

  // Files that are wiped on reboot.
  FLAGS_DEFAULT_LEVEL,  // File with flags default level (as integer), see
                        // AuthPolicyFlags::DefaultLevel.
  AUTH_DATA_CACHE,      // Cached authentication data.

  // Samba/Kerberos/parser executables.
  KINIT,
  KLIST,
  KPASSWD,
  NET,
  SMBCLIENT,
  PARSER,

  // Seccomp filter policies.
  KINIT_SECCOMP,
  KLIST_SECCOMP,
  KPASSWD_SECCOMP,
  NET_ADS_SECCOMP,
  PARSER_SECCOMP,
  SMBCLIENT_SECCOMP,

  // Misc.
  DEBUG_FLAGS,  // File with debug flags, see AuthPolicyFlags.
  KRB5_TRACE,   // kinit and kpasswd trace log.
};

// Simple path service.
class PathService {
 public:
  // Calls Initialize().
  PathService();
  virtual ~PathService();

  // Retrieves the file or directory path for the given |path_key|.
  const std::string& Get(Path path_key) const;

 protected:
  // Calls Initialize() if |initialize| is true.
  explicit PathService(bool initialize);

  // Should be called at some point during construction to initialize all paths.
  // Derived classes can override paths by specifying a constuctor that calls
  // PathService(false), inserts paths and then calls Initialize() to initialize
  // paths not set yet.
  void Initialize();

  // Inserts |path| at key |path_key| into |path_map_| if the key is not
  // already set.
  void Insert(Path path_key, const std::string& path);

 private:
  std::map<Path, std::string> paths_;

  DISALLOW_COPY_AND_ASSIGN(PathService);
};

}  // namespace authpolicy

#endif  // AUTHPOLICY_PATH_SERVICE_H_
