## Fixes a bug caused by https://github.com/microsoft/calculator/pull/1426#. ### Description of the changes: - The PR #1426 can cause a crash when no users are returned via `User::FindAllAsync(UserType::LocalUser)` when subsequently trying to access the first user. The existing code also does not guarantee that the returned user is the currently active user. - This fix retrieves the user that opened the app and passes this user into a function to check if this user has the proper permissions to access the graphing mode. This makes sense since the active user is indistinguishable (at least from the app's perspective) to the user who opened the app. This user's permissions are then propagated downwards to properly set up the navigation menu of the app. - Implementation detail worth pointing out: `s_categoryManifest` is what is used to populate the navigation menu of the app, but this variable is static by design, so a separate function was written to override the appropriate `isEnabled` value in `s_categoryManifest`. This function is called by `onLaunched`. ### How changes were validated: - Manual testing
This commit is contained in:
parent
d4be50490f
commit
fd2367d483
@ -60,7 +60,7 @@ bool IsGraphingModeAvailable()
|
||||
}
|
||||
|
||||
Box<bool> ^ _isGraphingModeEnabledCached = nullptr;
|
||||
bool IsGraphingModeEnabled()
|
||||
bool IsGraphingModeEnabled(User ^ currentUser = nullptr)
|
||||
{
|
||||
if (!IsGraphingModeAvailable())
|
||||
{
|
||||
@ -72,17 +72,19 @@ bool IsGraphingModeEnabled()
|
||||
return _isGraphingModeEnabledCached->Value;
|
||||
}
|
||||
|
||||
User ^ firstUser;
|
||||
create_task(User::FindAllAsync(UserType::LocalUser)).then([&firstUser](IVectorView<User ^> ^ users) {
|
||||
firstUser = users->GetAt(0); }).wait();
|
||||
auto namedPolicyData = NamedPolicy::GetPolicyFromPathForUser(firstUser, L"Education", L"AllowGraphingCalculator");
|
||||
_isGraphingModeEnabledCached = namedPolicyData->GetBoolean() == true;
|
||||
if (!currentUser)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
auto namedPolicyData = NamedPolicy::GetPolicyFromPathForUser(currentUser, L"Education", L"AllowGraphingCalculator");
|
||||
_isGraphingModeEnabledCached = namedPolicyData->GetBoolean() == true;
|
||||
|
||||
return _isGraphingModeEnabledCached->Value;
|
||||
}
|
||||
|
||||
// The order of items in this list determines the order of items in the menu.
|
||||
static const list<NavCategoryInitializer> s_categoryManifest = [] {
|
||||
static list<NavCategoryInitializer> s_categoryManifest = [] {
|
||||
auto res = list<NavCategoryInitializer>{ NavCategoryInitializer{ ViewMode::Standard,
|
||||
STANDARD_ID,
|
||||
L"Standard",
|
||||
@ -108,7 +110,7 @@ static const list<NavCategoryInitializer> s_categoryManifest = [] {
|
||||
bool supportGraphingCalculator = IsGraphingModeAvailable();
|
||||
if (supportGraphingCalculator)
|
||||
{
|
||||
const bool isEnabled = IsGraphingModeEnabled();
|
||||
bool isEnabled = IsGraphingModeEnabled();
|
||||
res.push_back(NavCategoryInitializer{ ViewMode::Graphing,
|
||||
GRAPHING_ID,
|
||||
L"Graphing",
|
||||
@ -276,6 +278,25 @@ static const list<NavCategoryInitializer> s_categoryManifest = [] {
|
||||
return res;
|
||||
}();
|
||||
|
||||
void NavCategory::InitializeCategoryManifest(User ^ user)
|
||||
{
|
||||
int i = 0;
|
||||
for (NavCategoryInitializer category : s_categoryManifest)
|
||||
{
|
||||
if (category.viewMode == ViewMode::Graphing)
|
||||
{
|
||||
auto navCatInit = s_categoryManifest.begin();
|
||||
std::advance(navCatInit, i);
|
||||
(*navCatInit).isEnabled = IsGraphingModeEnabled(user);
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// This function should only be used when storing the mode to app data.
|
||||
int NavCategory::Serialize(ViewMode mode)
|
||||
{
|
||||
|
@ -92,7 +92,7 @@ namespace CalculatorApp
|
||||
const MyVirtualKey virtualKey;
|
||||
const wchar_t* const accessKey;
|
||||
const bool supportsNegative;
|
||||
const bool isEnabled;
|
||||
bool isEnabled;
|
||||
};
|
||||
|
||||
private
|
||||
@ -140,6 +140,8 @@ namespace CalculatorApp
|
||||
static bool IsDateCalculatorViewMode(ViewMode mode);
|
||||
static bool IsConverterViewMode(ViewMode mode);
|
||||
|
||||
static void InitializeCategoryManifest(Windows::System::User ^ user);
|
||||
|
||||
static Platform::String ^ GetFriendlyName(ViewMode mode);
|
||||
static Platform::String ^ GetNameResourceKey(ViewMode mode);
|
||||
static CategoryGroupType GetGroupType(ViewMode mode);
|
||||
|
@ -198,12 +198,12 @@ void App::OnLaunched(LaunchActivatedEventArgs ^ args)
|
||||
// If the app got pre-launch activated, then save that state in a flag
|
||||
m_preLaunched = true;
|
||||
}
|
||||
NavCategory::InitializeCategoryManifest(args->User);
|
||||
OnAppLaunch(args, args->Arguments);
|
||||
}
|
||||
|
||||
void App::OnAppLaunch(IActivatedEventArgs ^ args, String ^ argument)
|
||||
{
|
||||
|
||||
// Uncomment the following lines to display frame-rate and per-frame CPU usage info.
|
||||
//#if _DEBUG
|
||||
// if (IsDebuggerPresent())
|
||||
|
Loading…
Reference in New Issue
Block a user