Add gtkut_tree_view_get_selected_pointer() helper function.
[claws.git] / src / ssl_manager.c
index fb6c4c5642d602f858c078df787c286250b95b96..1792b35f28acc94bca10fcf748e49f88635df48d 100644 (file)
@@ -219,12 +219,20 @@ static gboolean get_serverport(const gchar *str, gchar **server, gchar **port)
 
        g_return_val_if_fail(str != NULL, FALSE);
 
-       for (prevpos = str, pos = strstr(str, ".") + 1;
+       /* 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") || !strcmp(pos, "cert.chain")) {
-                       *server = strndup(str, prevpos - str - 1);
-                       *port = strndup(prevpos, pos - prevpos - 1);
+                       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;
                }
        }
@@ -232,30 +240,9 @@ static gboolean get_serverport(const gchar *str, gchar **server, gchar **port)
        return FALSE;
 }
 
-static char *get_port(const char *str)
-{
-       const char *pos, *prevpos;
-       char *port;
-
-       g_return_val_if_fail(str != NULL, NULL);
-
-       /* Iterate through all '.'-separated chunks, and the last one
-        * before the .cert or .cert.chain suffix is the port number. */
-       for (prevpos = str, pos = strstr(str, ".") + 1;
-                       pos != NULL;
-                       prevpos = pos, pos = strstr(pos, ".") + 1) {
-               if (!strcmp(pos, "cert") || !strcmp(pos, "cert.chain")) {
-                       port = strndup(prevpos, pos - prevpos - 1);
-                       return port;
-               }
-       }
-
-       return NULL;
-}
-
 static char *get_fingerprint(const char *str)
 {
-       char *ret = NULL, *tmp = g_strdup(str);
+       char *ret = NULL, *tmp = g_strdup(str), *tmp2 = tmp;
        char *previous_pos = NULL, *last_pos = NULL;
 
        if (!strchr(tmp, ':')) {
@@ -264,10 +251,10 @@ static char *get_fingerprint(const char *str)
                        *(strstr(tmp, ".cert")+1) = '.';
        }
 
-       while (tmp && (tmp = strstr(tmp,".")) != NULL) {
-               tmp++;
+       while (tmp2 && (tmp2 = strstr(tmp2,".")) != NULL) {
+               tmp2++;
                previous_pos = last_pos;
-               last_pos = tmp;
+               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));
@@ -338,11 +325,15 @@ static void ssl_manager_load_certs (void)
 
                get_serverport(d, &server, &port);
                fp = get_fingerprint(d);
-               
-               cert = ssl_certificate_find(server, atoi(port), 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);
@@ -418,8 +409,8 @@ static void ssl_manager_delete_cb(GtkWidget *widget,
 
        val = alertpanel_full(_("Delete certificate"),
                              _("Do you really want to delete this certificate?"),
-                             GTK_STOCK_CANCEL, GTK_STOCK_DELETE, NULL, FALSE,
-                             NULL, ALERT_WARNING, G_ALERTDEFAULT);
+                             GTK_STOCK_CANCEL, GTK_STOCK_DELETE, NULL, ALERTFOCUS_FIRST,
+                                               FALSE, NULL, ALERT_WARNING);
 
                             
        if (val != G_ALERTALTERNATE)
@@ -434,17 +425,10 @@ static void ssl_manager_view_cb(GtkWidget *widget,
                                gpointer data) 
 {
        SSLCertificate *cert;
-       GtkTreeIter sel;
-       GtkTreeModel *model;
 
-       if (!gtk_tree_selection_get_selected(gtk_tree_view_get_selection
-                               (GTK_TREE_VIEW(manager.certlist)),
-                               &model, &sel))
-               return;
-       
-       gtk_tree_model_get(model, &sel,
-                          SSL_MANAGER_CERT, &cert,
-                          -1);
+       cert = gtkut_tree_view_get_selected_pointer(
+                       GTK_TREE_VIEW(manager.certlist), SSL_MANAGER_CERT);
+
        if (!cert)
                return;