Checking code reworked to be more robust. master
authorLadislav Láska <ladislav.laska@gmail.com>
Wed, 6 Apr 2011 14:00:10 +0000 (16:00 +0200)
committerLadislav Láska <ladislav.laska@gmail.com>
Wed, 6 Apr 2011 14:00:10 +0000 (16:00 +0200)
main.c
smtp.c
smtp.h

diff --git a/main.c b/main.c
index 9f184d12fa45d368de5229ef4f55d7b9554f621c..98fc36edb68e8a60cecaa9d4882a22bc89042130 100644 (file)
--- a/main.c
+++ b/main.c
@@ -121,6 +121,10 @@ int check( char * hostname, char *service ) {
                case P_IMAP:
                        die("STARTTLS for IMAP not implemented yet.");
                        break;
+               case 0:
+                       /* Don't use STARTTLS */
+                       starttls_ok = 0;
+                       break;
                default:
                        die("Unknown STARTTLS protocol requested.");
        }
@@ -151,7 +155,7 @@ int check( char * hostname, char *service ) {
        cert_list = gnutls_certificate_get_peers( session, &cert_list_size );
 
        today = time(NULL);
-
+       
        for (int i = 0; i < cert_list_size; i++) {
                gnutls_x509_crt_init( &cert );
                gnutls_x509_crt_import( cert, &cert_list[0], GNUTLS_X509_FMT_DER );
@@ -175,9 +179,21 @@ int check( char * hostname, char *service ) {
        }
 
        /* Clean up */
-       err = gnutls_bye( session, GNUTLS_SHUT_WR );
-       if (err < 0) gnutls_die(err);
-       close( fd );
+       
+       /* This could use some other parameter. */
+       switch (use_starttls) {
+               case P_SMTP:
+                       smtp_quit(session);
+                       break;
+               case P_IMAP:
+                       die("IMAP not implemented yet.");
+                       break;
+               default:;
+       }
+
+//     err = gnutls_bye( session, GNUTLS_SHUT_WR );
+//     if (err < 0) gnutls_die(err);
+//     close( fd );
 cleanup:
        gnutls_deinit( session );
        gnutls_certificate_free_credentials( xcred );
diff --git a/smtp.c b/smtp.c
index 4adb179a87beaebd2241af145948592b9d2218aa..db8aacd6b81f3f1e3bd2db47a8fb35bece6fb8cc 100644 (file)
--- a/smtp.c
+++ b/smtp.c
@@ -13,6 +13,8 @@
 
 #define _XOPEN_SOURCE 500
 
+#include <gnutls/gnutls.h>
+
 #include <unistd.h>
 #include <string.h>
 
@@ -37,6 +39,20 @@ char* smtp_expect(int fd, char *str) {
        return ptr;
 }
 
+/* Expect status code. This can be done better. */
+char* ssl_smtp_expect(gnutls_session_t session, char *str) {
+       char buffer[BUFFER_SIZE];
+       int len = strlen(str);
+       int bytes = gnutls_record_recv(session, buffer, BUFFER_SIZE);
+       if (bytes < len) goto fail;
+       if (!strncmp(buffer,str,len)) {
+               return NULL;
+       }
+
+       fail:;
+       return strdup(buffer);
+}
+
 /* Send EHLO and check for STARTTLS extension. */
 int smtp_ehlo(int fd) {
        return 0;
@@ -52,3 +68,15 @@ int smtp_starttls(int fd) {
        }
        return 0;
 }
+
+/* Ugly, sending could fail and  other horrible things may happen. */
+int smtp_quit(gnutls_session_t session) {
+       char buffer[] = "QUIT\n";
+       int sent = GNUTLS_E_AGAIN;
+       sent = gnutls_record_send(session, buffer, sizeof(buffer));
+       
+       ssl_smtp_expect(session, "221 ");
+
+       /* TODO: Better (read: some) error handling. */
+       return 0;
+}
diff --git a/smtp.h b/smtp.h
index 3c5634e650ef3f677ccc3766c7c94d3d8ae5937a..048761ce1a66f091e1a593c48fd1c73cd7926a2e 100644 (file)
--- a/smtp.h
+++ b/smtp.h
@@ -16,5 +16,6 @@
 int smtp_ehlo(int fd);
 char* smtp_expect(int fd, char *str);
 int smtp_starttls(int fd);
+int smtp_quit(gnutls_session_t session);
 
 #endif