[Commits] [SCM] claws branch, master, updated. 3.17.2-10-g83bb40f
wwp at claws-mail.org
wwp at claws-mail.org
Mon Dec 17 21:11:42 CET 2018
The branch, master has been updated
via 83bb40f2f47b825ce2a5390590ac1977e3e7fda0 (commit)
from c120bdcd44aad8d270d7f46d66293d6c5a8c0029 (commit)
Summary of changes:
src/common/utils.c | 57 ++++++++++++++++++++++++++++++++++++
src/common/utils.h | 2 ++
src/ssl_manager.c | 81 ++++++++++------------------------------------------
3 files changed, 74 insertions(+), 66 deletions(-)
- Log -----------------------------------------------------------------
commit 83bb40f2f47b825ce2a5390590ac1977e3e7fda0
Author: wwp <subscript at free.fr>
Date: Mon Dec 17 21:11:19 2018 +0100
Fix parsing of cert filename, prevent the Tools / SSL/TLS Certificates dialog from crashing when cert filenames contain a fingerprint. Move the parser func to utils.[ch].
diff --git a/src/common/utils.c b/src/common/utils.c
index b9a6f95..0e6e674 100644
--- a/src/common/utils.c
+++ b/src/common/utils.c
@@ -4611,3 +4611,60 @@ get_random_bytes(void *buf, size_t count)
return TRUE;
}
+
+/* returns FALSE if parsing failed, otherwise returns TRUE and sets *server, *port
+ and eventually *fp from filename (if not NULL, they must be free'd by caller after
+ user.
+ filenames we expect: 'host.name.port.cert' or 'host.name.port.f:i:n:g:e:r:p:r:i:n:t.cert' */
+gboolean get_serverportfp_from_filename(const gchar *str, gchar **server, gchar **port, gchar **fp)
+{
+ const gchar *pos, *dotport_pos = NULL, *dotcert_pos = NULL, *dotfp_pos = NULL;
+
+ g_return_val_if_fail(str != NULL, FALSE);
+
+ pos = str + strlen(str) - 1;
+ while ((pos > str) && !dotport_pos) {
+ if (*pos == '.') {
+ if (!dotcert_pos) {
+ /* match the .cert suffix */
+ if (strcmp(pos, ".cert") == 0) {
+ dotcert_pos = pos;
+ }
+ } else {
+ if (!dotfp_pos) {
+ /* match an eventual fingerprint */
+ /* or the port number */
+ if (strncmp(pos + 3, ":", 1) == 0) {
+ dotfp_pos = pos;
+ } else {
+ dotport_pos = pos;
+ }
+ } else {
+ /* match the port number */
+ dotport_pos = pos;
+ }
+ }
+ }
+ pos--;
+ }
+ if (!dotport_pos || !dotcert_pos) {
+ g_warning("could not parse filename %s", str);
+ return FALSE;
+ }
+
+ *server = g_strndup(str, dotport_pos - str);
+ if (dotfp_pos) {
+ *port = g_strndup(dotport_pos + 1, dotfp_pos - dotport_pos - 1);
+ *fp = g_strndup(dotfp_pos + 1, dotcert_pos - dotfp_pos - 1);
+ } else {
+ *port = g_strndup(dotport_pos + 1, dotcert_pos - dotport_pos - 1);
+ *fp = NULL;
+ }
+
+ debug_print("filename='%s' => server='%s' port='%s' fp='%s'\n", str, *server, *port, *fp);
+ if (!*server || !*port)
+ return FALSE;
+ else
+ return TRUE;
+}
+
diff --git a/src/common/utils.h b/src/common/utils.h
index 40c3576..1799935 100644
--- a/src/common/utils.h
+++ b/src/common/utils.h
@@ -541,4 +541,6 @@ gboolean get_random_bytes(void *buf, size_t count);
}
#endif
+gboolean get_serverportfp_from_filename(const gchar *str, gchar **server, gchar **port, gchar **fp);
+
#endif /* __UTILS_H__ */
diff --git a/src/ssl_manager.c b/src/ssl_manager.c
index 495edf7..f51ca33 100644
--- a/src/ssl_manager.c
+++ b/src/ssl_manager.c
@@ -164,7 +164,6 @@ static GtkWidget *ssl_manager_list_view_create (void)
ssl_manager_create_list_view_columns(GTK_WIDGET(list_view));
return GTK_WIDGET(list_view);
-
}
void ssl_manager_create(void)
@@ -240,58 +239,6 @@ void ssl_manager_create(void)
gtk_widget_show(window);
}
-static gboolean get_serverport(const gchar *str, gchar **server, gchar **port)
-{
- const gchar *pos, *prevpos;
-
- g_return_val_if_fail(str != NULL, FALSE);
-
- /* We expect 'host.name.port.cert' here, only set
- * server and port if we find that.
- * Validity of string in port should be checked by caller. */
- for (prevpos = str, pos = strstr(str, ".");
- pos != NULL;
- prevpos = pos, pos = strstr(pos+1, ".")) {
- if (!strcmp(pos, ".cert")) {
- if (prevpos > str) {
- *server = g_strndup(str, prevpos - str);
- *port = g_strndup(prevpos+1, pos - prevpos - 1);
- } else {
- *server = *port = NULL;
- }
-
- return TRUE;
- }
- }
-
- return FALSE;
-}
-
-static char *get_fingerprint(const char *str)
-{
- char *ret = NULL, *tmp = g_strdup(str), *tmp2 = tmp;
- char *previous_pos = NULL, *last_pos = NULL;
-
- if (!strchr(tmp, ':')) {
- /* no fingerprint */
- if (strstr(tmp, ".cert"))
- *(strstr(tmp, ".cert")+1) = '.';
- }
-
- while (tmp2 && (tmp2 = strstr(tmp2,".")) != NULL) {
- tmp2++;
- previous_pos = last_pos;
- last_pos = tmp2;
- }
- if (last_pos && previous_pos && (int)(last_pos - previous_pos - 1) > 0)
- ret = g_strndup(previous_pos, (int)(last_pos - previous_pos - 1));
- else
- ret = NULL;
- g_free(tmp);
- return ret;
-
-}
-
static void ssl_manager_list_view_insert_cert(GtkWidget *list_view,
GtkTreeIter *row_iter,
gchar *host,
@@ -307,6 +254,8 @@ static void ssl_manager_list_view_insert_cert(GtkWidget *list_view,
GtkListStore *list_store = GTK_LIST_STORE(gtk_tree_view_get_model
(GTK_TREE_VIEW(list_view)));
+ g_return_if_fail(cert != NULL);
+
exp_time_t = gnutls_x509_crt_get_expiration_time(cert->x509_cert);
memset(buf, 0, sizeof(buf));
@@ -321,7 +270,7 @@ static void ssl_manager_list_view_insert_cert(GtkWidget *list_view,
sig_status = ssl_certificate_check_signer(cert, cert->status);
- if (sig_status==NULL)
+ if (sig_status == NULL)
sig_status = g_strdup_printf(_("Correct%s"),exp_time_t < time(NULL)? _(" (expired)"): "");
else {
weight = PANGO_WEIGHT_BOLD;
@@ -380,21 +329,21 @@ static void ssl_manager_load_certs (void)
if(strstr(d, ".cert") != d + (strlen(d) - strlen(".cert")))
continue;
- get_serverport(d, &server, &port);
- fp = get_fingerprint(d);
+ if (get_serverportfp_from_filename(d, &server, &port, &fp)) {
- if (server != NULL && port != NULL) {
- gint portnum = atoi(port);
- if (portnum > 0 && portnum <= 65535) {
- cert = ssl_certificate_find(server, portnum, fp);
- ssl_manager_list_view_insert_cert(manager.certlist, NULL,
- server, port, cert);
+ if (server != NULL && port != NULL) {
+ gint portnum = atoi(port);
+ if (portnum > 0 && portnum <= 65535) {
+ cert = ssl_certificate_find(server, portnum, fp);
+ ssl_manager_list_view_insert_cert(manager.certlist, NULL,
+ server, port, cert);
+ }
}
- }
- g_free(server);
- g_free(port);
- g_free(fp);
+ g_free(server);
+ g_free(port);
+ g_free(fp);
+ }
row++;
}
g_dir_close(dir);
-----------------------------------------------------------------------
hooks/post-receive
--
Claws Mail
More information about the Commits
mailing list