// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "chrome/browser/policy/enterprise_install_attributes.h" #include "base/logging.h" #include "chrome/browser/chromeos/cros/cryptohome_library.h" static const char kAttrEnterpriseOwned[] = "enterprise.owned"; static const char kAttrEnterpriseUser[] = "enterprise.user"; namespace policy { EnterpriseInstallAttributes::EnterpriseInstallAttributes( chromeos::CryptohomeLibrary* cryptohome) : cryptohome_(cryptohome), device_locked_(false) {} EnterpriseInstallAttributes::LockResult EnterpriseInstallAttributes::LockDevice( const std::string& user) { // Check for existing lock first. if (device_locked_) { return !registration_user_.empty() && user == registration_user_ ? LOCK_SUCCESS : LOCK_WRONG_USER; } if (!cryptohome_->InstallAttributesIsReady()) return LOCK_NOT_READY; // Clearing the TPM password seems to be always a good deal. if (cryptohome_->TpmIsEnabled() && !cryptohome_->TpmIsBeingOwned() && cryptohome_->TpmIsOwned()) { cryptohome_->TpmClearStoredPassword(); } // Make sure we really have a working InstallAttrs. if (cryptohome_->InstallAttributesIsInvalid()) { LOG(ERROR) << "Install attributes invalid."; return LOCK_BACKEND_ERROR; } if (!cryptohome_->InstallAttributesIsFirstInstall()) return LOCK_WRONG_USER; // Set values in the InstallAttrs and lock it. if (!cryptohome_->InstallAttributesSet(kAttrEnterpriseOwned, "true") || !cryptohome_->InstallAttributesSet(kAttrEnterpriseUser, user)) { LOG(ERROR) << "Failed writing attributes"; return LOCK_BACKEND_ERROR; } if (!cryptohome_->InstallAttributesFinalize() || cryptohome_->InstallAttributesIsFirstInstall() || GetRegistrationUser() != user) { LOG(ERROR) << "Failed locking."; return LOCK_BACKEND_ERROR; } return LOCK_SUCCESS; } bool EnterpriseInstallAttributes::IsEnterpriseDevice() { ReadImmutableAttributes(); return device_locked_ && !registration_user_.empty(); } std::string EnterpriseInstallAttributes::GetRegistrationUser() { ReadImmutableAttributes(); if (!device_locked_) return std::string(); return registration_user_; } std::string EnterpriseInstallAttributes::GetDomain() { if (!IsEnterpriseDevice()) return std::string(); std::string domain; size_t pos = registration_user_.find('@'); if (pos != std::string::npos) domain = registration_user_.substr(pos + 1); return domain; } void EnterpriseInstallAttributes::ReadImmutableAttributes() { if (device_locked_) return; if (cryptohome_ && cryptohome_->InstallAttributesIsReady() && !cryptohome_->InstallAttributesIsInvalid() && !cryptohome_->InstallAttributesIsFirstInstall()) { device_locked_ = true; std::string enterprise_owned; std::string enterprise_user; if (cryptohome_->InstallAttributesGet(kAttrEnterpriseOwned, &enterprise_owned) && cryptohome_->InstallAttributesGet(kAttrEnterpriseUser, &enterprise_user) && enterprise_owned == "true" && !enterprise_user.empty()) { registration_user_ = enterprise_user; } } } } // namespace policy