SettingsCommand.cpp (9025B)
1 // Copyright (c) Microsoft Corporation. 2 // Licensed under the MIT License. 3 #include "pch.h" 4 #include "SettingsCommand.h" 5 #include "Workflows/WorkflowBase.h" 6 #include "Workflows/SettingsFlow.h" 7 8 namespace AppInstaller::CLI 9 { 10 using namespace Utility::literals; 11 using namespace AppInstaller::Settings; 12 using namespace std::string_view_literals; 13 14 namespace 15 { 16 Utility::LocIndView s_SettingsCommand_HelpLink = "https://aka.ms/winget-settings"_liv; 17 } 18 19 std::vector<std::unique_ptr<Command>> SettingsCommand::GetCommands() const 20 { 21 return InitializeFromMoveOnly<std::vector<std::unique_ptr<Command>>>({ 22 std::make_unique<SettingsExportCommand>(FullName()), 23 std::make_unique<SettingsSetCommand>(FullName()), 24 std::make_unique<SettingsResetCommand>(FullName()), 25 }); 26 } 27 28 std::vector<Argument> SettingsCommand::GetArguments() const 29 { 30 return { 31 Argument{ Execution::Args::Type::AdminSettingEnable, Resource::String::AdminSettingEnableDescription, ArgumentType::Standard, Argument::Visibility::Help }, 32 Argument{ Execution::Args::Type::AdminSettingDisable, Resource::String::AdminSettingDisableDescription, ArgumentType::Standard, Argument::Visibility::Help }, 33 }; 34 } 35 36 Resource::LocString SettingsCommand::ShortDescription() const 37 { 38 return { Resource::String::SettingsCommandShortDescription }; 39 } 40 41 Resource::LocString SettingsCommand::LongDescription() const 42 { 43 return { Resource::String::SettingsCommandLongDescription }; 44 } 45 46 Utility::LocIndView SettingsCommand::HelpLink() const 47 { 48 return s_SettingsCommand_HelpLink; 49 } 50 51 void SettingsCommand::ValidateArgumentsInternal(Execution::Args& execArgs) const 52 { 53 // Get admin setting string for all available options except Unknown 54 std::vector<Utility::LocIndString> adminSettingList; 55 for (auto setting : GetAllSequentialEnumValues(BoolAdminSetting::Unknown)) 56 { 57 adminSettingList.emplace_back(AdminSettingToString(setting)); 58 } 59 60 Utility::LocIndString validOptions = Join(", "_liv, adminSettingList); 61 62 if (execArgs.Contains(Execution::Args::Type::AdminSettingEnable) && BoolAdminSetting::Unknown == StringToBoolAdminSetting(execArgs.GetArg(Execution::Args::Type::AdminSettingEnable))) 63 { 64 throw CommandException(Resource::String::InvalidArgumentValueError(ArgumentCommon::ForType(Execution::Args::Type::AdminSettingEnable).Name, validOptions)); 65 } 66 67 if (execArgs.Contains(Execution::Args::Type::AdminSettingDisable) && BoolAdminSetting::Unknown == StringToBoolAdminSetting(execArgs.GetArg(Execution::Args::Type::AdminSettingDisable))) 68 { 69 throw CommandException(Resource::String::InvalidArgumentValueError(ArgumentCommon::ForType(Execution::Args::Type::AdminSettingDisable).Name, validOptions)); 70 } 71 } 72 73 void SettingsCommand::ExecuteInternal(Execution::Context& context) const 74 { 75 if (context.Args.Contains(Execution::Args::Type::AdminSettingEnable)) 76 { 77 context << 78 Workflow::EnsureRunningAsAdmin << 79 Workflow::EnableAdminSetting; 80 81 } 82 else if (context.Args.Contains(Execution::Args::Type::AdminSettingDisable)) 83 { 84 context << 85 Workflow::EnsureRunningAsAdmin << 86 Workflow::DisableAdminSetting; 87 } 88 else 89 { 90 context << Workflow::OpenUserSetting; 91 } 92 } 93 94 Resource::LocString SettingsExportCommand::ShortDescription() const 95 { 96 return { Resource::String::SettingsExportCommandShortDescription }; 97 } 98 99 Resource::LocString SettingsExportCommand::LongDescription() const 100 { 101 return { Resource::String::SettingsExportCommandLongDescription }; 102 } 103 104 Utility::LocIndView SettingsExportCommand::HelpLink() const 105 { 106 return s_SettingsCommand_HelpLink; 107 } 108 109 void SettingsExportCommand::ExecuteInternal(Execution::Context& context) const 110 { 111 context << 112 Workflow::ExportSettings; 113 } 114 115 std::vector<Argument> SettingsSetCommand::GetArguments() const 116 { 117 return { 118 Argument { Execution::Args::Type::SettingName, Resource::String::SettingNameArgumentDescription, ArgumentType::Positional, true }, 119 Argument { Execution::Args::Type::SettingValue, Resource::String::SettingValueArgumentDescription, ArgumentType::Positional, true }, 120 }; 121 } 122 123 Resource::LocString SettingsSetCommand::ShortDescription() const 124 { 125 return { Resource::String::SettingsSetCommandShortDescription }; 126 } 127 128 Resource::LocString SettingsSetCommand::LongDescription() const 129 { 130 return { Resource::String::SettingsSetCommandLongDescription }; 131 } 132 133 Utility::LocIndView SettingsSetCommand::HelpLink() const 134 { 135 return s_SettingsCommand_HelpLink; 136 } 137 138 void SettingsSetCommand::ValidateArgumentsInternal(Execution::Args& execArgs) const 139 { 140 // Get admin setting string for all available options except Unknown 141 std::vector<Utility::LocIndString> adminSettingList; 142 for (auto setting : GetAllSequentialEnumValues(StringAdminSetting::Unknown)) 143 { 144 adminSettingList.emplace_back(AdminSettingToString(setting)); 145 } 146 147 Utility::LocIndString validOptions = Join(", "_liv, adminSettingList); 148 149 if (StringAdminSetting::Unknown == StringToStringAdminSetting(execArgs.GetArg(Execution::Args::Type::SettingName))) 150 { 151 throw CommandException(Resource::String::InvalidArgumentValueError(ArgumentCommon::ForType(Execution::Args::Type::SettingName).Name, validOptions)); 152 } 153 } 154 155 void SettingsSetCommand::ExecuteInternal(Execution::Context& context) const 156 { 157 context << 158 Workflow::EnsureRunningAsAdmin << 159 Workflow::SetAdminSetting; 160 } 161 162 std::vector<Argument> SettingsResetCommand::GetArguments() const 163 { 164 return { 165 Argument { Execution::Args::Type::SettingName, Resource::String::SettingNameArgumentDescription, ArgumentType::Positional }, 166 Argument { Execution::Args::Type::All, Resource::String::ResetAllAdminSettingsArgumentDescription, ArgumentType::Flag }, 167 }; 168 } 169 170 Resource::LocString SettingsResetCommand::ShortDescription() const 171 { 172 return { Resource::String::SettingsResetCommandShortDescription }; 173 } 174 175 Resource::LocString SettingsResetCommand::LongDescription() const 176 { 177 return { Resource::String::SettingsResetCommandLongDescription }; 178 } 179 180 Utility::LocIndView SettingsResetCommand::HelpLink() const 181 { 182 return s_SettingsCommand_HelpLink; 183 } 184 185 void SettingsResetCommand::ValidateArgumentsInternal(Execution::Args& execArgs) const 186 { 187 if (execArgs.Contains(Execution::Args::Type::All)) 188 { 189 if (execArgs.Contains(Execution::Args::Type::SettingName)) 190 { 191 throw CommandException(Resource::String::MultipleExclusiveArgumentsProvided("all|setting"_liv)); 192 } 193 194 return; 195 } 196 197 if (!execArgs.Contains(Execution::Args::Type::SettingName)) 198 { 199 throw CommandException(Resource::String::RequiredArgError(ArgumentCommon::ForType(Execution::Args::Type::SettingName).Name)); 200 } 201 202 // Get admin setting string for all available options except Unknown. 203 // We accept both bool and string settings 204 std::vector<Utility::LocIndString> adminSettingList; 205 for (auto setting : GetAllSequentialEnumValues(BoolAdminSetting::Unknown)) 206 { 207 adminSettingList.emplace_back(AdminSettingToString(setting)); 208 } 209 for (auto setting : GetAllSequentialEnumValues(StringAdminSetting::Unknown)) 210 { 211 adminSettingList.emplace_back(AdminSettingToString(setting)); 212 } 213 214 Utility::LocIndString validOptions = Join(", "_liv, adminSettingList); 215 216 if (StringAdminSetting::Unknown == StringToStringAdminSetting(execArgs.GetArg(Execution::Args::Type::SettingName)) 217 && BoolAdminSetting::Unknown == StringToBoolAdminSetting(execArgs.GetArg(Execution::Args::Type::SettingName))) 218 { 219 throw CommandException(Resource::String::InvalidArgumentValueError(ArgumentCommon::ForType(Execution::Args::Type::SettingName).Name, validOptions)); 220 } 221 } 222 223 void SettingsResetCommand::ExecuteInternal(Execution::Context& context) const 224 { 225 context << 226 Workflow::EnsureRunningAsAdmin << 227 (context.Args.Contains(Execution::Args::Type::All) ? Workflow::ResetAllAdminSettings : Workflow::ResetAdminSetting); 228 } 229 }