diff options
Diffstat (limited to 'src/server_register.c')
| -rw-r--r-- | src/server_register.c | 145 |
1 files changed, 84 insertions, 61 deletions
diff --git a/src/server_register.c b/src/server_register.c index 60a4998..ae8e959 100644 --- a/src/server_register.c +++ b/src/server_register.c @@ -9,6 +9,7 @@ */ #include "common.h" +#include "config.h" #include <open62541/client.h> #include <open62541/client_config_default.h> @@ -41,59 +42,73 @@ main (int argc, char **argv) signal (SIGINT, stopHandler); signal (SIGTERM, stopHandler); - if (argc < 13) + if (argc != 2) { UA_LOG_FATAL (UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, - "Usage: %s\n" - " <port> <applicationUri>\n" - " <server-certificate.der> <server-private-key.der>\n" - " <client-certificate.der> <client-private-key.der>\n" - " <discovery-server-endpoint>\n" - " <register-interval-seconds>\n" - " <security-mode> <security-policy>\n" - " <server-auth-mode> [<server-user> <server-pass>]\n" - " <client-auth-mode> [<client-user> <client-pass>]\n" - " [<trustlist1.der>, ...]\n" - "\n" - "Security modes : None, Sign, SignAndEncrypt\n" - "Security policies: None, Basic256Sha256, " - "Aes256_Sha256_RsaPss,\n" - " Aes128_Sha256_RsaOaep, ECC_nistP256\n" - "Auth modes : anonymous, user", - argv[0]); + "Usage: %s <config-file>", argv[0]); return EXIT_FAILURE; } - UA_UInt16 port = (UA_UInt16)atoi (argv[1]); - const char *applicationUri = argv[2]; - const char *clientCertPath = argv[5]; - const char *clientKeyPath = argv[6]; - const char *discoveryEndpoint = argv[7]; - int registerInterval = atoi (argv[8]); + Config cfg; + if (configLoad (argv[1], &cfg) != 0) + return EXIT_FAILURE; + + int port = configRequireInt (&cfg, "port", "ServerRegister"); + const char *applicationUri + = configRequire (&cfg, "applicationUri", "ServerRegister"); + const char *serverCertPath + = configRequire (&cfg, "serverCertificate", "ServerRegister"); + const char *serverKeyPath + = configRequire (&cfg, "serverPrivateKey", "ServerRegister"); + const char *clientCertPath + = configRequire (&cfg, "clientCertificate", "ServerRegister"); + const char *clientKeyPath + = configRequire (&cfg, "clientPrivateKey", "ServerRegister"); + const char *discoveryEndpoint + = configRequire (&cfg, "discoveryEndpoint", "ServerRegister"); + int registerInterval + = configRequireInt (&cfg, "registerInterval", "ServerRegister"); + const char *securityModeStr + = configRequire (&cfg, "securityMode", "ServerRegister"); + const char *securityPolicyStr + = configRequire (&cfg, "securityPolicy", "ServerRegister"); + const char *serverAuthMode + = configRequire (&cfg, "serverAuthMode", "ServerRegister"); + const char *clientAuthMode + = configRequire (&cfg, "clientAuthMode", "ServerRegister"); + + if (!applicationUri || !serverCertPath || !serverKeyPath || !clientCertPath + || !clientKeyPath || !discoveryEndpoint || !securityModeStr + || !securityPolicyStr || !serverAuthMode || !clientAuthMode || port < 0 + || registerInterval < 0) + { + configFree (&cfg); + return EXIT_FAILURE; + } - UA_MessageSecurityMode securityMode = parseSecurityMode (argv[9]); + UA_MessageSecurityMode securityMode = parseSecurityMode (securityModeStr); if (securityMode == UA_MESSAGESECURITYMODE_INVALID) { UA_LOG_FATAL (UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, - "Unknown security mode: %s", argv[9]); + "Unknown security mode: %s", securityModeStr); + configFree (&cfg); return EXIT_FAILURE; } - const char *securityPolicyUri = resolveSecurityPolicyUri (argv[10]); + const char *securityPolicyUri = resolveSecurityPolicyUri (securityPolicyStr); if (!securityPolicyUri) { UA_LOG_FATAL (UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, - "Unknown security policy: %s", argv[10]); + "Unknown security policy: %s", securityPolicyStr); + configFree (&cfg); return EXIT_FAILURE; } /* Parse server-side auth mode (what clients connecting to this server need). "anonymous" allows unauthenticated sessions; "user" requires a username/password pair. */ - int idx = 11; - const char *serverAuthMode = argv[idx++]; UA_Boolean serverAllowAnonymous; - char *serverUsername = NULL, *serverPassword = NULL; + const char *serverUsername = NULL, *serverPassword = NULL; if (strcmp (serverAuthMode, "anonymous") == 0) { @@ -101,16 +116,16 @@ main (int argc, char **argv) } else if (strcmp (serverAuthMode, "user") == 0) { - if (idx + 2 > argc) + serverAllowAnonymous = false; + serverUsername + = configRequire (&cfg, "serverUsername", "ServerRegister"); + serverPassword + = configRequire (&cfg, "serverPassword", "ServerRegister"); + if (!serverUsername || !serverPassword) { - UA_LOG_FATAL (UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, - "Server auth mode 'user' requires " - "<username> <password>"); + configFree (&cfg); return EXIT_FAILURE; } - serverAllowAnonymous = false; - serverUsername = argv[idx++]; - serverPassword = argv[idx++]; } else { @@ -118,34 +133,28 @@ main (int argc, char **argv) "Unknown server auth mode: %s " "(expected 'anonymous' or 'user')", serverAuthMode); + configFree (&cfg); return EXIT_FAILURE; } /* Parse client-side auth mode (how this server authenticates to the LDS when registering). */ - if (idx >= argc) - { - UA_LOG_FATAL (UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, - "Missing client auth mode"); - return EXIT_FAILURE; - } - const char *clientAuthMode = argv[idx++]; - char *clientUsername = NULL, *clientPassword = NULL; + const char *clientUsername = NULL, *clientPassword = NULL; if (strcmp (clientAuthMode, "anonymous") == 0) { } else if (strcmp (clientAuthMode, "user") == 0) { - if (idx + 2 > argc) + clientUsername + = configRequire (&cfg, "clientUsername", "ServerRegister"); + clientPassword + = configRequire (&cfg, "clientPassword", "ServerRegister"); + if (!clientUsername || !clientPassword) { - UA_LOG_FATAL (UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, - "Client auth mode 'user' requires " - "<username> <password>"); + configFree (&cfg); return EXIT_FAILURE; } - clientUsername = argv[idx++]; - clientPassword = argv[idx++]; } else { @@ -153,16 +162,24 @@ main (int argc, char **argv) "Unknown client auth mode: %s " "(expected 'anonymous' or 'user')", clientAuthMode); + configFree (&cfg); return EXIT_FAILURE; } - size_t trustSize = (idx < argc) ? (size_t)(argc - idx) : 0; + char **trustPaths = NULL; + size_t trustSize = 0; + configGetAll (&cfg, "trustList", &trustPaths, &trustSize); UA_StatusCode retval; - UA_Server *server = createSecureServer ( - port, applicationUri, argv[3], argv[4], argv + idx, trustSize, &retval); + UA_Server *server + = createSecureServer ((UA_UInt16)port, applicationUri, serverCertPath, + serverKeyPath, trustPaths, trustSize, &retval); if (!server) - return EXIT_FAILURE; + { + free (trustPaths); + configFree (&cfg); + return EXIT_FAILURE; + } UA_ServerConfig *serverConfig = UA_Server_getConfig (server); @@ -173,12 +190,14 @@ main (int argc, char **argv) if (!serverAllowAnonymous) { UA_UsernamePasswordLogin logins[1]; - logins[0].username = UA_STRING (serverUsername); - logins[0].password = UA_STRING (serverPassword); + logins[0].username = UA_STRING ((char *)serverUsername); + logins[0].password = UA_STRING ((char *)serverPassword); retval = UA_AccessControl_default (serverConfig, false, NULL, 1, logins); if (retval != UA_STATUSCODE_GOOD) { UA_Server_delete (server); + free (trustPaths); + configFree (&cfg); return EXIT_FAILURE; } } @@ -195,12 +214,14 @@ main (int argc, char **argv) UA_ClientConfig clientConfig; memset (&clientConfig, 0, sizeof (UA_ClientConfig)); retval = createSecureClientConfig ( - &clientConfig, applicationUri, clientCertPath, clientKeyPath, argv + idx, + &clientConfig, applicationUri, clientCertPath, clientKeyPath, trustPaths, trustSize, securityMode, securityPolicyUri); if (retval != UA_STATUSCODE_GOOD) { UA_Server_run_shutdown (server); UA_Server_delete (server); + free (trustPaths); + configFree (&cfg); return EXIT_FAILURE; } if (clientUsername) @@ -230,7 +251,7 @@ main (int argc, char **argv) memset (&clientConfig, 0, sizeof (UA_ClientConfig)); retval = createSecureClientConfig ( &clientConfig, applicationUri, clientCertPath, clientKeyPath, - argv + idx, trustSize, securityMode, securityPolicyUri); + trustPaths, trustSize, securityMode, securityPolicyUri); if (retval == UA_STATUSCODE_GOOD) { if (clientUsername) @@ -253,7 +274,7 @@ main (int argc, char **argv) our entry immediately rather than waiting for the cleanup timeout. */ memset (&clientConfig, 0, sizeof (UA_ClientConfig)); retval = createSecureClientConfig ( - &clientConfig, applicationUri, clientCertPath, clientKeyPath, argv + idx, + &clientConfig, applicationUri, clientCertPath, clientKeyPath, trustPaths, trustSize, securityMode, securityPolicyUri); if (retval == UA_STATUSCODE_GOOD) { @@ -271,5 +292,7 @@ main (int argc, char **argv) UA_Server_run_shutdown (server); UA_Server_delete (server); + free (trustPaths); + configFree (&cfg); return EXIT_SUCCESS; } |
