| // 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 |