2025-11-28 00:35:46 +09:00

98 lines
4.0 KiB
C++

// Copyright (c) Microsoft Corporation and Contributors.
// Licensed under the MIT License.
#pragma once
#include "App.xaml.g.h"
#include "MainWindow.xaml.h"
#include "MakeCredentialPage.xaml.h"
#include <synchapi.h>
#include <include/webauthn/pluginauthenticator.h>
namespace winrt::PasskeyManager::implementation
{
struct PluginOperationStatus
{
PluginOperationStatus() :
performOperationStatus(S_OK),
uvSignatureVerificationStatus(S_OK),
requestSignatureVerificationStatus(S_OK)
{};
HRESULT performOperationStatus;
HRESULT uvSignatureVerificationStatus;
HRESULT requestSignatureVerificationStatus;
};
// define a typedefed enum of operation type with two value for make credential and get assertion
typedef enum _PluginOperationType
{
PLUGIN_OPERATION_TYPE_MAKE_CREDENTIAL = 0,
PLUGIN_OPERATION_TYPE_GET_ASSERTION = 1
} PluginOperationType;
struct PluginOpertaionOptions
{
// define default constructor
PluginOpertaionOptions() :
hWnd(nullptr),
operationType(PluginOperationType::PLUGIN_OPERATION_TYPE_MAKE_CREDENTIAL),
selectedCredential(nullptr)
{};
HWND hWnd;
std::wstring rpName;
std::wstring userName;
PluginOperationType operationType;
std::vector<const WEBAUTHN_CREDENTIAL_DETAILS*> matchingCredentials;
const WEBAUTHN_CREDENTIAL_DETAILS* selectedCredential;
};
struct App : AppT<App>
{
App();
App(PWSTR args);
inline static wil::unique_event s_pluginOpRequestRecievedEvent { wil::EventOptions::ManualReset };
inline static wil::unique_event s_hAppReadyForPluginOpEvent { wil::EventOptions::ManualReset };
inline static wil::unique_event s_hPluginOpCompletedEvent{ wil::EventOptions::ManualReset };
inline static wil::unique_com_class_object_cookie m_registration;
Microsoft::UI::Xaml::Controls::Frame CreateRootFrame();
void InitializeAppWindTitleBar();
void OnLaunched(Microsoft::UI::Xaml::LaunchActivatedEventArgs const&);
void OnNavigationFailed(IInspectable const&, Microsoft::UI::Xaml::Navigation::NavigationFailedEventArgs const&);
HWND GetNativeWindowHandle();
bool SetPluginPerformOperationOptions(HWND hWnd, PluginOperationType operationType, std::wstring rpName, std::wstring userName);
bool SetMatchingCredentials(std::wstring_view rpName, const std::vector<const WEBAUTHN_CREDENTIAL_DETAILS*>& matchedCreds, HWND hwnd);
bool SetSelectedCredentialId(Windows::Storage::Streams::IBuffer credentialId);
auto GetDispatcherQueue() { return m_dispatcherQueue; }
Microsoft::UI::Dispatching::DispatcherQueue m_dispatcherQueue = Microsoft::UI::Dispatching::DispatcherQueue::GetForCurrentThread();
wil::unique_event m_hPluginProceedButtonEvent{ wil::EventOptions::ManualReset };
wil::unique_event m_hPluginUserCancelEvent{ wil::EventOptions::ManualReset };
wil::unique_event m_hPluginOpReqDisplayInfoParsedEvent{ wil::EventOptions::ManualReset };
wil::unique_event m_hWindowReady{ wil::EventOptions::ManualReset };
wil::unique_event m_hPluginCredentialSelected{ wil::EventOptions::ManualReset };
wil::unique_event m_hVaultConsentComplete{ wil::EventOptions::ManualReset };
wil::unique_event m_hVaultConsentFailed{ wil::EventOptions::ManualReset };
winrt::fire_and_forget SimulateUnLockVaultUsingConsentVerifier();
bool m_silentMode = false;
bool GetSilentMode() const
{
return m_silentMode;
}
static void register_plugin_class_factory();
bool PluginCompleteAction();
bool PluginCancelAction();
public:
PluginOperationStatus m_pluginOperationStatus;
winrt::Microsoft::UI::Xaml::Window m_window{ nullptr };
hstring m_args;
std::mutex m_pluginOperationOptionsMutex;
_Guarded_by_(m_pluginOperationOptionsMutex) PluginOpertaionOptions m_pluginOperationOptions;
};
}