X-Git-Url: http://www.privoxy.org/gitweb/?p=privoxy.git;a=blobdiff_plain;f=ssl_common.c;h=879111e9bc2fc47bbe4ddb858f422a480f3b01dd;hp=add68a2861d4509778ad72fe4bec42455df5f567;hb=873efe14859c0fb3f53a905eb346c36cf5fe7eda;hpb=6235cc02e3f789fd39b1d72fadeb776ec3920572 diff --git a/ssl_common.c b/ssl_common.c index add68a28..879111e9 100644 --- a/ssl_common.c +++ b/ssl_common.c @@ -7,7 +7,7 @@ * 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 + * Copyright (C) 2018-2021 by Fabian Keil * * This program is free software; you can redistribute it * and/or modify it under the terms of the GNU General @@ -31,6 +31,7 @@ #include #include +#include #include "config.h" #include "project.h" #include "miscutil.h" @@ -407,13 +408,13 @@ extern void ssl_send_certificate_error(struct client_state *csp) /* * Sending final message to client */ - ssl_send_data(ssl_attr, (const unsigned char *)message, strlen(message)); + (void)ssl_send_data(ssl_attr, (const unsigned char *)message, strlen(message)); free_certificate_chain(csp); log_error(LOG_LEVEL_CRUNCH, "Certificate error: %s: https://%s%s", reason, csp->http->hostport, csp->http->path); - log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s https://%s%s %s\" 200 %u", + log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s https://%s%s %s\" 200 %lu", csp->ip_addr_str, csp->http->gpc, csp->http->hostport, csp->http->path, csp->http->version, message_len-head_length); @@ -487,12 +488,12 @@ extern char *make_certs_path(const char *conf_dir, const char *file_name, + strlen(file_name) + strlen(suffix) + 2; /* Setting delimiter and editing path length */ -#if defined(_WIN32) || defined(__OS2__) +#if defined(_WIN32) char delim[] = "\\"; path_size += 1; -#else /* ifndef _WIN32 || __OS2__ */ +#else /* ifndef _WIN32 */ char delim[] = "/"; -#endif /* ifndef _WIN32 || __OS2__ */ +#endif /* ifndef _WIN32 */ /* * Building up path from many parts @@ -698,3 +699,52 @@ extern int host_is_ip_address(const char *host) return 1; } + + +/********************************************************************* + * + * Function : enforce_sane_certificate_state + * + * Description : Makes sure the certificate state is sane. + * + * Parameters : + * 1 : certificate = Path to the potentionally existing certifcate. + * 2 : key = Path to the potentionally existing key. + * + * Returns : -1 => Error + * 0 => Certificate state is sane + * + *********************************************************************/ +extern int enforce_sane_certificate_state(const char *certificate, const char *key) +{ + 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. " + "Removing %s before creating a new key and certificate.", key); + if (unlink(key)) + { + log_error(LOG_LEVEL_ERROR, "Failed to unlink %s: %E", key); + + 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; + +}