diff --git a/src/cascadia/TerminalApp/AdminWarningPlaceholder.cpp b/src/cascadia/TerminalApp/AdminWarningPlaceholder.cpp index 422d575fa..22ea4bfdf 100644 --- a/src/cascadia/TerminalApp/AdminWarningPlaceholder.cpp +++ b/src/cascadia/TerminalApp/AdminWarningPlaceholder.cpp @@ -30,5 +30,6 @@ namespace winrt::TerminalApp::implementation { return _control; } + winrt::hstring AdminWarningPlaceholder::Commandline() { return _cmdline; } } diff --git a/src/cascadia/TerminalApp/AdminWarningPlaceholder.h b/src/cascadia/TerminalApp/AdminWarningPlaceholder.h index cfb23e480..9970ec214 100644 --- a/src/cascadia/TerminalApp/AdminWarningPlaceholder.h +++ b/src/cascadia/TerminalApp/AdminWarningPlaceholder.h @@ -13,6 +13,7 @@ namespace winrt::TerminalApp::implementation AdminWarningPlaceholder(const winrt::Microsoft::Terminal::Control::TermControl& control, const winrt::hstring& cmdline); winrt::Windows::UI::Xaml::Controls::UserControl Control(); + winrt::hstring Commandline(); TYPED_EVENT(PrimaryButtonClicked, TerminalApp::AdminWarningPlaceholder, winrt::Windows::UI::Xaml::RoutedEventArgs); TYPED_EVENT(CancelButtonClicked, TerminalApp::AdminWarningPlaceholder, winrt::Windows::UI::Xaml::RoutedEventArgs); diff --git a/src/cascadia/TerminalApp/TabManagement.cpp b/src/cascadia/TerminalApp/TabManagement.cpp index 16c6ac242..5cd6beaab 100644 --- a/src/cascadia/TerminalApp/TabManagement.cpp +++ b/src/cascadia/TerminalApp/TabManagement.cpp @@ -251,7 +251,8 @@ namespace winrt::TerminalApp::implementation // - existingConnection: optionally receives a connection from the outside world instead of attempting to create one void TerminalPage::_CreateNewTabWithProfileAndSettings(Microsoft::Terminal::Settings::Model::Profile profile, Microsoft::Terminal::Settings::Model::TerminalSettingsCreateResult settings, TerminalConnection::ITerminalConnection existingConnection) { - bool doAdminWarning = true;; + bool doAdminWarning = true; + ; const auto& cmdline{ settings.DefaultSettings().Commandline() }; if (_isElevated()) { @@ -322,25 +323,8 @@ namespace winrt::TerminalApp::implementation if (doAdminWarning) { auto warningControl{ winrt::make_self(term, cmdline) }; - warningControl->PrimaryButtonClicked([weakThis = get_weak(), warningControl](auto&&, auto&&) { - if (auto page{ weakThis.get() }) - { - for (const auto& tab : page->_tabs) - { - if (const auto& tabImpl{ _GetTerminalTabImpl(tab) }) - { - tabImpl->GetRootPane()->WalkTree([warningControl](std::shared_ptr pane) -> bool { - if (pane->GetUserControl() == *warningControl) - { - pane->ReplaceControl(warningControl->Control()); - return true; - } - return false; - }); - } - } - } - }); + warningControl->PrimaryButtonClicked({ get_weak(), &TerminalPage::_adminWarningPrimaryClicked }); + warningControl->CancelButtonClicked({ get_weak(), &TerminalPage::_adminWarningCancelClicked }); controlToAdd = *warningControl; } @@ -357,6 +341,56 @@ namespace winrt::TerminalApp::implementation } } + void TerminalPage::_adminWarningPrimaryClicked(const TerminalApp::AdminWarningPlaceholder& sender, + const winrt::Windows::UI::Xaml::RoutedEventArgs& /*args*/) + { + auto warningControl{ winrt::get_self(sender) }; + + for (const auto& tab : _tabs) + { + if (const auto& tabImpl{ _GetTerminalTabImpl(tab) }) + { + tabImpl->GetRootPane()->WalkTree([warningControl](std::shared_ptr pane) -> bool { + if (pane->GetUserControl() == *warningControl) + { + pane->ReplaceControl(warningControl->Control()); + return true; + } + return false; + }); + } + } + + auto allowedCommandlines{ ElevatedState::SharedInstance().AllowedCommandlines() }; + if (!allowedCommandlines) + { + allowedCommandlines = winrt::single_threaded_vector(); + } + allowedCommandlines.Append(warningControl->Commandline()); + ElevatedState::SharedInstance().AllowedCommandlines(allowedCommandlines); + } + + void TerminalPage::_adminWarningCancelClicked(const TerminalApp::AdminWarningPlaceholder& sender, + const winrt::Windows::UI::Xaml::RoutedEventArgs& /*args*/) + { + auto warningControl{ winrt::get_self(sender) }; + + for (const auto& tab : _tabs) + { + if (const auto& tabImpl{ _GetTerminalTabImpl(tab) }) + { + tabImpl->GetRootPane()->WalkTree([warningControl](std::shared_ptr pane) -> bool { + if (pane->GetUserControl() == *warningControl) + { + pane->Close(); + return true; + } + return false; + }); + } + } + } + // Method Description: // - Get the icon of the currently focused terminal control, and set its // tab's icon to that icon. diff --git a/src/cascadia/TerminalApp/TerminalPage.h b/src/cascadia/TerminalApp/TerminalPage.h index 71a47cd81..5924811d7 100644 --- a/src/cascadia/TerminalApp/TerminalPage.h +++ b/src/cascadia/TerminalApp/TerminalPage.h @@ -363,6 +363,10 @@ namespace winrt::TerminalApp::implementation winrt::Microsoft::Terminal::Settings::Model::Profile GetClosestProfileForDuplicationOfProfile(const winrt::Microsoft::Terminal::Settings::Model::Profile& profile) const noexcept; + void _adminWarningPrimaryClicked(const winrt::TerminalApp::AdminWarningPlaceholder& sender, + const winrt::Windows::UI::Xaml::RoutedEventArgs& args); + void _adminWarningCancelClicked(const winrt::TerminalApp::AdminWarningPlaceholder& sender, + const winrt::Windows::UI::Xaml::RoutedEventArgs& args); #pragma region ActionHandlers // These are all defined in AppActionHandlers.cpp #define ON_ALL_ACTIONS(action) DECLARE_ACTION_HANDLER(action);