Rebuild docs
[privoxy.git] / ssl_common.c
index 6d2e11f..879111e 100644 (file)
@@ -7,7 +7,7 @@
  *                not depend on particular TLS/SSL library.
  *
  * Copyright   :  Written by and Copyright (c) 2017 Vaclav Svec. FIT CVUT.
  *                not depend on particular TLS/SSL library.
  *
  * Copyright   :  Written by and Copyright (c) 2017 Vaclav Svec. FIT CVUT.
- *                Copyright (C) 2018-2020 by Fabian Keil <fk@fabiankeil.de>
+ *                Copyright (C) 2018-2021 by Fabian Keil <fk@fabiankeil.de>
  *
  *                This program is free software; you can redistribute it
  *                and/or modify it under the terms of the GNU General
  *
  *                This program is free software; you can redistribute it
  *                and/or modify it under the terms of the GNU General
@@ -717,7 +717,10 @@ extern int host_is_ip_address(const char *host)
  *********************************************************************/
 extern int enforce_sane_certificate_state(const char *certificate, const char *key)
 {
  *********************************************************************/
 extern int enforce_sane_certificate_state(const char *certificate, const char *key)
 {
-   if (file_exists(certificate) == 0 && file_exists(key) == 1)
+   const int certificate_exists = file_exists(certificate);
+   const int key_exists = file_exists(key);
+
+   if (!certificate_exists && key_exists)
    {
       log_error(LOG_LEVEL_ERROR,
          "A website key already exists but there's no matching certificate. "
    {
       log_error(LOG_LEVEL_ERROR,
          "A website key already exists but there's no matching certificate. "
@@ -729,6 +732,18 @@ extern int enforce_sane_certificate_state(const char *certificate, const char *k
          return -1;
       }
    }
          return -1;
       }
    }
+   if (certificate_exists && !key_exists)
+   {
+      log_error(LOG_LEVEL_ERROR,
+         "A certificate exists but there's no matching key. "
+         "Removing %s before creating a new key and certificate.", certificate);
+      if (unlink(certificate))
+      {
+         log_error(LOG_LEVEL_ERROR, "Failed to unlink %s: %E", certificate);
+
+         return -1;
+      }
+   }
 
    return 0;
 
 
    return 0;