blob: adc0c47f743117d31275d768f79122b83b4e08a3 [file] [log] [blame] [edit]
// 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 "cryptohome/user_session/user_session.h"
#include <string>
#include <utility>
#include <vector>
#include "cryptohome/credential_verifier.h"
namespace cryptohome {
void UserSession::AddCredentialVerifier(
std::unique_ptr<CredentialVerifier> verifier) {
if (verifier->auth_factor_label().empty()) {
AuthFactorType type = verifier->auth_factor_type();
type_to_credential_verifier_[type] = std::move(verifier);
} else {
std::string label = verifier->auth_factor_label();
label_to_credential_verifier_[std::move(label)] = std::move(verifier);
}
}
bool UserSession::HasCredentialVerifier() const {
return !label_to_credential_verifier_.empty() ||
!type_to_credential_verifier_.empty();
}
bool UserSession::HasCredentialVerifier(const std::string& label) const {
return label_to_credential_verifier_.find(label) !=
label_to_credential_verifier_.end();
}
bool UserSession::HasCredentialVerifier(AuthFactorType type) const {
return type_to_credential_verifier_.find(type) !=
type_to_credential_verifier_.end();
}
const CredentialVerifier* UserSession::FindCredentialVerifier(
const std::string& label) const {
auto iter = label_to_credential_verifier_.find(label);
if (iter != label_to_credential_verifier_.end()) {
return iter->second.get();
}
return nullptr;
}
const CredentialVerifier* UserSession::FindCredentialVerifier(
AuthFactorType type) const {
auto iter = type_to_credential_verifier_.find(type);
if (iter != type_to_credential_verifier_.end()) {
return iter->second.get();
}
return nullptr;
}
std::vector<const CredentialVerifier*> UserSession::GetCredentialVerifiers()
const {
std::vector<const CredentialVerifier*> verifiers;
verifiers.reserve(label_to_credential_verifier_.size() +
type_to_credential_verifier_.size());
for (const auto& [unused, verifier] : label_to_credential_verifier_) {
verifiers.push_back(verifier.get());
}
for (const auto& [unused, verifier] : type_to_credential_verifier_) {
verifiers.push_back(verifier.get());
}
return verifiers;
}
std::unique_ptr<CredentialVerifier> UserSession::ReleaseCredentialVerifier(
const std::string& key_label) {
auto iter = label_to_credential_verifier_.find(key_label);
if (iter != label_to_credential_verifier_.end()) {
auto verifier = std::move(iter->second);
label_to_credential_verifier_.erase(iter);
return verifier;
}
return nullptr;
}
std::unique_ptr<CredentialVerifier> UserSession::ReleaseCredentialVerifier(
AuthFactorType type) {
auto iter = type_to_credential_verifier_.find(type);
if (iter != type_to_credential_verifier_.end()) {
auto verifier = std::move(iter->second);
type_to_credential_verifier_.erase(iter);
return verifier;
}
return nullptr;
}
} // namespace cryptohome