16 "MIIBETCBuAIJAImY2B4ODlQuMAoGCCqGSM49BAMCMBExDzANBgNVBAMMBnNlcnZl\n"
17 "cjAeFw0yMjA4MzAxNTA3NDJaFw0zMjA4MjcxNTA3NDJaMBExDzANBgNVBAMMBnNl\n"
18 "cnZlcjBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABDwU0GWKxTxYXP/L448OlaQr\n"
19 "fhF2p83eg/55LJB7Aiq7xckQImGa3w2heo01hFQXQ/4mK3wsLZr7ZZl7IDC4hhMw\n"
20 "CgYIKoZIzj0EAwIDSAAwRQIhAKDmwivsD4qjRtbaXmUNc3src6oFOCus32ZRZw0p\n"
21 "Oz9zAiBZ47YdsJ985ID5COg1+nCKk+0d7jWjICbPcODHyzH4fg==\n"
22 "-----END CERTIFICATE-----\n";
25 "MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgbzZUYL0jZM05vB2O\n"
26 "kIKcA1OxSKw9ZVQ8UnlUCf6l/8ChRANCAAQ8FNBlisU8WFz/y+OPDpWkK34RdqfN\n"
27 "3oP+eSyQewIqu8XJECJhmt8NoXqNNYRUF0P+Jit8LC2a+2WZeyAwuIYT\n"
28 "-----END PRIVATE KEY-----\n";
39 "remote wooden.box\n";
80 EXPECT_EQ(conf.
error(),
true);
81 EXPECT_TRUE(conf.
message().find(
"option_error: remote option not specified") != std::string::npos);
88 config_error{std::string(
"remote wooden.box\n") +
"mode server"
90 "option 'cert' not found"},
101 "UNKNOWN/UNSUPPORTED OPTIONS");
111 minimalConfig +
"ignore-unknown-option bikeshed-colour bikeshed-color\n"
112 "ignore-unknown-option danish axe phk\n"
113 "bikeshed-colour green",
114 minimalConfig +
"setenv opt bikeshed-paint silver with sparkling",
124 "OpenVPN management interface is not supported by this client");
129 "OpenVPN management interface is not supported by this client");
148 std::vector<std::unordered_set<std::string>> allsets = {
158 std::unordered_set<std::string> allOptions;
160 for (
auto set : allsets)
162 for (
const auto &
optname : set)
166 if (allOptions.contains(
optname))
167 throw std::runtime_error(
"duplicate element: " +
optname);
182 optname =
"proto tcp\nhttp-proxy 1.1.1.1 8080";
184 api_config.
dco =
true;
189 EXPECT_FALSE(eval.dcoCompatible);
194 "ERR_INVALID_CONFIG: option_error: dco_compatibility: config/options are not compatible with dco");
206 EXPECT_FALSE(eval.vpnCa.empty());
212 std::vector<std::string> server_options = {
"server 10.0.0.0 255.255.255.0",
215 for (
auto &option : server_options)
217 auto optname = option.substr(0, option.find(
' '));
218 auto expected_error_string =
"Server only option: " +
optname;
223 expected_error_string);
229 std::vector<std::string> server_options = {
"make-a-lot-of-noise",
"water-the-plants"};
231 for (
auto &option : server_options)
233 auto optname = option.substr(0, option.find(
' '));
234 auto expected_error_string =
"UNKNOWN/UNSUPPORTED OPTIONS: " +
optname;
239 expected_error_string);
245 std::ostringstream
os;
246 os <<
"OpenVPN management interface is not supported by this client: management\n";
247 os <<
"UNKNOWN/UNSUPPORTED OPTIONS: lol,lal";
260 certconfig +
"\nremote 1.2.3.4\ntls-client\npull\n",
262 certconfig +
"\nremote 1.2.3.4\ntls-client\npull\nclient\n",
263 certconfig +
"\nremote 1.2.3.4\npull\nclient\n",
264 certconfig +
"\nremote 1.2.3.4\nclient\ntls-client\n"));
271 "option_error: Neither 'client' nor both 'tls-client' and 'pull' options declared. OpenVPN3 client only supports --client mode."},
273 "option_error: Neither 'client' nor both 'tls-client' and 'pull' options declared. OpenVPN3 client only supports --client mode."},
275 "option_error: Neither 'client' nor both 'tls-client' and 'pull' options declared. OpenVPN3 client only supports --client mode."}));
292 auto opt = options.
get(
"AAA");
293 ASSERT_TRUE(opt.meta());
294 ASSERT_EQ(opt.get(1, 256),
"BBB");
296 opt = options.
get(
"CCC");
297 ASSERT_TRUE(opt.meta());
298 ASSERT_EQ(opt.get(1, 256),
"DDD");
EvalConfig eval_config(const Config &config)
std::unordered_set< std::string > settings_standalone_options
std::unordered_set< std::string > settings_ignoreSilently
std::unordered_set< std::string > settings_feature_not_implemented_warn
std::unordered_set< std::string > settings_ignoreWithWarning
std::unordered_set< std::string > settings_removedOptions
std::unordered_set< std::string > settings_serverOnlyOptions
static std::unordered_set< std::string > dco_incompatible_opts
std::unordered_set< std::string > settings_pushonlyoptions
std::unordered_set< std::string > settings_feature_not_implemented_fatal
const Option & get(const std::string &name) const
static ParseClientConfig parse(const std::string &content)
const std::string & message() const
ClientConfigParsed clientconf
INSTANTIATE_TEST_SUITE_P(optionError, InvalidConfigs, testing::Values(config_error{std::string("remote wooden.box\n")+"mode server"+"\n<ca>\n"+dummysecp256cert+"</ca>\n", "option 'cert' not found"}, config_error{minimalConfig+"mode", "Only 'mode p2p' supported"}, config_error{minimalConfig+"mode server", "Only 'mode p2p' supported"}, config_error{minimalConfig+"key-method 1", "Only 'key-method 2' is supported"}, config_error{minimalConfig+"fragment", "sorry, 'fragment' directive is not supported"}))
TEST_P(ValidConfigs, valid_config)
std::string dummysecp256key
void load_client_config(const std::string &config_content)
std::string dummysecp256cert
std::string minimalConfig
TEST(config, missingRequiredOption)
std::pair< std::string, std::string > config_error
#define OVPN_EXPECT_THROW(statement, expected_exception, expected_text)
static const char config[]
const std::string optname