blob: 7f81e57e1b3e018567ceba2c9afe7567ba3fbcd3 [file] [log] [blame]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/win/limited_access_features.h"
#include <inspectable.h>
#include <roapi.h>
#include <windows.foundation.h>
#include <windows.services.store.h>
#include <wrl.h>
#include <string>
#include "base/strings/strcat.h"
#include "base/win/core_winrt_util.h"
#include "base/win/hstring_reference.h"
#include "build/branding_buildflags.h"
#include "build/build_config.h"
using ABI::Windows::ApplicationModel::IID_ILimitedAccessFeaturesStatics;
using ABI::Windows::ApplicationModel::ILimitedAccessFeatureRequestResult;
using ABI::Windows::ApplicationModel::ILimitedAccessFeaturesStatics;
using ABI::Windows::ApplicationModel::LimitedAccessFeatureStatus;
using ABI::Windows::ApplicationModel::LimitedAccessFeatureStatus_Available;
using ABI::Windows::ApplicationModel::
LimitedAccessFeatureStatus_AvailableWithoutToken;
using base::win::HStringReference;
using Microsoft::WRL::ComPtr;
// Microsoft provided these values. They are used to unlock and access limited
// access features.
#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
const wchar_t kLimitedAccessFeatureIdentity[] = L"0qgpfzgh1edfy";
#else
const wchar_t kLimitedAccessFeatureIdentity[] = L"b06a12530me7r";
#endif // BUILDFLAG(GOOGLE_CHROME_BRANDING)
bool TryToUnlockLimitedAccessFeature(const std::wstring& feature,
const std::wstring& token) {
ComPtr<ILimitedAccessFeaturesStatics> limited_access_features;
ComPtr<ILimitedAccessFeatureRequestResult> limited_access_features_result;
HRESULT hr = base::win::RoGetActivationFactory(
HStringReference(
RuntimeClass_Windows_ApplicationModel_LimitedAccessFeatures)
.Get(),
IID_ILimitedAccessFeaturesStatics, &limited_access_features);
if (!SUCCEEDED(hr)) {
return false;
}
// Required to unlock feature.
const std::wstring attestation = base::StrCat(
{kLimitedAccessFeatureIdentity, L" has registered their use of ", feature,
L" with Microsoft and agrees to the terms of use."});
hr = limited_access_features->TryUnlockFeature(
HStringReference(feature.c_str()).Get(),
HStringReference(token.c_str()).Get(),
HStringReference(attestation.c_str()).Get(),
&limited_access_features_result);
if (!SUCCEEDED(hr)) {
return false;
}
LimitedAccessFeatureStatus status;
hr = limited_access_features_result->get_Status(&status);
if (!SUCCEEDED(hr)) {
return false;
}
if ((status != LimitedAccessFeatureStatus_Available) &&
(status != LimitedAccessFeatureStatus_AvailableWithoutToken)) {
return false;
}
return true;
}