// Copyright 2022 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "secanomalyd/system_context.h"

#include <ios>  // std::boolalpha
#include <map>
#include <string>

#include <sys/syscall.h>

#include "secanomalyd/landlock.h"
#include "secanomalyd/mount_entry.h"

SystemContext::SystemContext(SessionManagerProxyInterface* session_manager)
    : session_manager_{session_manager} {
  std::ignore = UpdateLoggedInState();
  UpdateLandlockState();
}

void SystemContext::Refresh(bool skip_known_mount_refresh) {
  std::ignore = UpdateLoggedInState();
  if (!skip_known_mount_refresh)
    UpdateKnownMountsState();
}

bool SystemContext::UpdateLoggedInState() {
  brillo::ErrorPtr error;
  std::map<std::string, std::string> sessions;
  session_manager_->RetrieveActiveSessions(&sessions, &error);

  if (error) {
    LOG(ERROR) << "Error making D-Bus proxy call to interface "
               << "'" << session_manager_->GetObjectPath().value()
               << "': " << error->GetMessage();
    logged_in_ = false;
    return false;
  }
  logged_in_ = sessions.size() > 0;
  VLOG(1) << "logged_in_ -> " << std::boolalpha << logged_in_;
  return true;
}

void SystemContext::UpdateLandlockState() {
  int landlock_version =
      landlock_create_ruleset(NULL, 0, LANDLOCK_CREATE_RULESET_VERSION);
  if (landlock_version <= 0) {
    const int err = errno;
    switch (err) {
      case ENOSYS: {
        LOG(WARNING) << "Landlock is not supported by the kernel.";
        landlock_state_ = LandlockState::kNotSupported;
        break;
      }
      case EOPNOTSUPP: {
        LOG(WARNING)
            << "Landlock is supported by the kernel but disabled at boot time.";
        landlock_state_ = LandlockState::kDisabled;
        break;
      }
      default: {
        LOG(WARNING) << "Could not determine Landlock state.";
        landlock_state_ = LandlockState::kUnknown;
        break;
      }
    }
  } else {
    VLOG(1) << "Landlock is enabled; Version " << landlock_version;
    landlock_state_ = LandlockState::kEnabled;
  }
}

void SystemContext::UpdateKnownMountsState() {
  previous_known_mounts_.clear();
  previous_known_mounts_.merge(current_known_mounts_);
}

bool SystemContext::IsMountPersistent(const base::FilePath& known_mount) const {
  return (previous_known_mounts_.count(known_mount) == 1);
}

void SystemContext::RecordKnownMountObservation(
    const base::FilePath& known_mount) {
  // Ensures `known_mount` is indeed a predefined known mount.
  if (secanomalyd::kKnownMounts.count(known_mount) == 0) {
    return;
  }
  current_known_mounts_.insert(known_mount);
}
