Tidy up French GUI.
[nssm.git] / settings.cpp
index f7346cb..e72430f 100644 (file)
@@ -1074,6 +1074,7 @@ int native_set_objectname(const TCHAR *service_name, void *param, const TCHAR *n
     That means the username is actually passed in the additional parameter.\r
   */\r
   bool localsystem = false;\r
+  bool virtual_account = false;\r
   TCHAR *username = NSSM_LOCALSYSTEM_ACCOUNT;\r
   TCHAR *password = 0;\r
   if (additional) {\r
@@ -1089,6 +1090,7 @@ int native_set_objectname(const TCHAR *service_name, void *param, const TCHAR *n
     username = (TCHAR *) well_known;\r
     password = _T("");\r
   }\r
+  else if (is_virtual_account(service_name, username)) virtual_account = true;\r
   else if (! password) {\r
     /* We need a password if the account requires it. */\r
     print_message(stderr, NSSM_MESSAGE_MISSING_PASSWORD, name);\r
@@ -1112,7 +1114,7 @@ int native_set_objectname(const TCHAR *service_name, void *param, const TCHAR *n
     HeapFree(GetProcessHeap(), 0, qsc);\r
   }\r
 \r
-  if (! well_known) {\r
+  if (! well_known && ! virtual_account) {\r
     if (grant_logon_as_service(username)) {\r
       if (passwordsize) SecureZeroMemory(password, passwordsize);\r
       print_message(stderr, NSSM_MESSAGE_GRANT_LOGON_AS_SERVICE_FAILED, username);\r
@@ -1150,12 +1152,21 @@ int native_dump_objectname(const TCHAR *service_name, void *param, const TCHAR *
   int ret = native_get_objectname(service_name, param, name, default_value, value, additional);\r
   if (ret != 1) return ret;\r
 \r
-  /* Do we need to dump a dummy password? */\r
-  if (! well_known_username(value->string)) {\r
-    /* Parameters are the other way round. */\r
-    value_t inverted;\r
-    inverted.string = _T("****");\r
-    return setting_dump_string(service_name, (void *) REG_SZ, name, &inverted, value->string);\r
+  /* Properly checking for a virtual account requires the actual service name. */\r
+  if (! _tcsnicmp(NSSM_VIRTUAL_SERVICE_ACCOUNT_DOMAIN, value->string, _tcslen(NSSM_VIRTUAL_SERVICE_ACCOUNT_DOMAIN))) {\r
+    TCHAR *name = virtual_account(service_name);\r
+    if (! name) return -1;\r
+    HeapFree(GetProcessHeap(), 0, value->string);\r
+    value->string = name;\r
+  }\r
+  else {\r
+    /* Do we need to dump a dummy password? */\r
+    if (! well_known_username(value->string)) {\r
+      /* Parameters are the other way round. */\r
+      value_t inverted;\r
+      inverted.string = _T("****");\r
+      return setting_dump_string(service_name, (void *) REG_SZ, name, &inverted, value->string);\r
+    }\r
   }\r
   return setting_dump_string(service_name, (void *) REG_SZ, name, value, 0);\r
 }\r
@@ -1424,6 +1435,7 @@ settings_t settings[] = {
   { NSSM_REG_ROTATE_BYTES_LOW, REG_DWORD, 0, false, 0, setting_set_number, setting_get_number, 0 },\r
   { NSSM_REG_ROTATE_BYTES_HIGH, REG_DWORD, 0, false, 0, setting_set_number, setting_get_number, 0 },\r
   { NSSM_REG_ROTATE_DELAY, REG_DWORD, (void *) NSSM_ROTATE_DELAY, false, 0, setting_set_number, setting_get_number, 0 },\r
+  { NSSM_REG_TIMESTAMP_LOG, REG_DWORD, 0, false, 0, setting_set_number, setting_get_number, 0 },\r
   { NSSM_NATIVE_DEPENDONGROUP, REG_MULTI_SZ, NULL, true, ADDITIONAL_CRLF, native_set_dependongroup, native_get_dependongroup, native_dump_dependongroup },\r
   { NSSM_NATIVE_DEPENDONSERVICE, REG_MULTI_SZ, NULL, true, ADDITIONAL_CRLF, native_set_dependonservice, native_get_dependonservice, native_dump_dependonservice },\r
   { NSSM_NATIVE_DESCRIPTION, REG_SZ, _T(""), true, 0, native_set_description, native_get_description, 0 },\r