author | alwin <alwin> | 2004-02-12 22:24:30 (UTC) |
---|---|---|
committer | alwin <alwin> | 2004-02-12 22:24:30 (UTC) |
commit | c7f102b944a5172ca330dfc3c0f83cf0b9c65100 (patch) (side-by-side diff) | |
tree | b4bdfea3a7eeb6a46f949cfdaa7052ac25e1c128 /noncore | |
parent | 596d87e16d593cbc52d510973ece99ffe26cd4c4 (diff) | |
download | opie-c7f102b944a5172ca330dfc3c0f83cf0b9c65100.zip opie-c7f102b944a5172ca330dfc3c0f83cf0b9c65100.tar.gz opie-c7f102b944a5172ca330dfc3c0f83cf0b9c65100.tar.bz2 |
TLS support for SMTP
-rw-r--r-- | noncore/net/mail/libmailwrapper/smtpwrapper.cpp | 55 | ||||
-rw-r--r-- | noncore/net/mail/libmailwrapper/smtpwrapper.h | 13 |
2 files changed, 60 insertions, 8 deletions
diff --git a/noncore/net/mail/libmailwrapper/smtpwrapper.cpp b/noncore/net/mail/libmailwrapper/smtpwrapper.cpp index e8db9ca..3ab6b77 100644 --- a/noncore/net/mail/libmailwrapper/smtpwrapper.cpp +++ b/noncore/net/mail/libmailwrapper/smtpwrapper.cpp @@ -60,4 +60,6 @@ QString SMTPwrapper::mailsmtpError( int errnum ) { case MAILSMTP_ERROR_IN_PROCESSING: return tr( "Error in processing" ); + case MAILSMTP_ERROR_STARTTLS_NOT_SUPPORTED: + return tr( "Starttls not supported" ); // case MAILSMTP_ERROR_INSUFFISANT_SYSTEM_STORAGE: // return tr( "Insufficient system storage" ); @@ -566,4 +568,27 @@ void SMTPwrapper::storeFailedMail(const char*data,unsigned int size, const char* } +int SMTPwrapper::start_smtp_tls(mailsmtp *session) +{ + if (!session) { + return MAILSMTP_ERROR_IN_PROCESSING; + } + int err = mailesmtp_starttls(session); + if (err != MAILSMTP_NO_ERROR) return err; + mailstream_low * low; + mailstream_low * new_low; + low = mailstream_get_low(session->stream); + if (!low) { + return MAILSMTP_ERROR_IN_PROCESSING; + } + int fd = mailstream_low_get_fd(low); + if (fd > -1 && (new_low = mailstream_low_ssl_open(fd))!=0) { + mailstream_low_free(low); + mailstream_set_low(session->stream, new_low); + } else { + return MAILSMTP_ERROR_IN_PROCESSING; + } + return err; +} + int SMTPwrapper::smtpSend(char*from,clist*rcpts,const char*data,size_t size, SMTPaccount *smtp ) { const char *server, *user, *pass; @@ -581,7 +606,12 @@ int SMTPwrapper::smtpSend(char*from,clist*rcpts,const char*data,size_t size, SMT ssl = false; + bool try_tls = true; + bool force_tls=false; if ( smtp->ConnectionType() == 2 ) { ssl = true; + try_tls = false; + } else if (smtp->ConnectionType() == 1) { + force_tls = true; } @@ -609,4 +639,5 @@ int SMTPwrapper::smtpSend(char*from,clist*rcpts,const char*data,size_t size, SMT } + /* switch to tls after init 'cause there it will send the ehlo */ if (result) { err = mailsmtp_init( session ); @@ -617,4 +648,18 @@ int SMTPwrapper::smtpSend(char*from,clist*rcpts,const char*data,size_t size, SMT } + if (try_tls) { + err = start_smtp_tls(session); + if (err != MAILSMTP_NO_ERROR) { + try_tls = false; + } else { + err = mailesmtp_ehlo(session); + } + } + + if (!try_tls && force_tls) { + result = 0; + failuretext = tr("Error init SMTP tls: %1").arg(mailsmtpError(err)); + } + if (result==1 && smtp->getLogin() ) { qDebug("smtp with auth"); @@ -738,6 +783,9 @@ bool SMTPwrapper::flushOutbox(SMTPaccount*smtp) { bool returnValue = true; - if (!smtp) + qDebug("Sending the queue"); + if (!smtp) { + qDebug("No smtp account given"); return false; + } bool reset_user_value = false; @@ -755,7 +803,8 @@ bool SMTPwrapper::flushOutbox(SMTPaccount*smtp) { if (mailsToSend.count()==0) { delete wrap; + qDebug("No mails to send"); return false; } - + oldPw = smtp->getPassword(); oldUser = smtp->getUser(); @@ -777,5 +826,5 @@ bool SMTPwrapper::flushOutbox(SMTPaccount*smtp) { } - + mailsToSend.setAutoDelete(false); sendProgress = new progressMailSend(); diff --git a/noncore/net/mail/libmailwrapper/smtpwrapper.h b/noncore/net/mail/libmailwrapper/smtpwrapper.h index 89826d9..75e4891 100644 --- a/noncore/net/mail/libmailwrapper/smtpwrapper.h +++ b/noncore/net/mail/libmailwrapper/smtpwrapper.h @@ -20,4 +20,5 @@ struct mailmime; struct mailimf_address_list; class progressMailSend; +struct mailsmtp; class SMTPwrapper : public QObject @@ -26,5 +27,5 @@ class SMTPwrapper : public QObject public: - SMTPwrapper( Settings *s ); + SMTPwrapper( Settings *s ); virtual ~SMTPwrapper(){} void sendMail(const Mail& mail,SMTPaccount*smtp,bool later=false ); @@ -34,5 +35,5 @@ public: signals: - void queuedMails( int ); + void queuedMails( int ); protected: @@ -40,5 +41,5 @@ protected: mailimf_fields *createImfFields(const Mail &mail ); mailmime *createMimeMail(const Mail&mail ); - + mailimf_address_list *parseAddresses(const QString&addr ); void addFileParts( mailmime *message,const QList<Attachment>&files ); @@ -47,5 +48,5 @@ protected: void smtpSend( mailmime *mail,bool later, SMTPaccount *smtp ); clist *createRcptList( mailimf_fields *fields ); - + static void storeMail(const char*mail, size_t length, const QString&box); static QString mailsmtpError( int err ); @@ -55,9 +56,11 @@ protected: static char *getFrom( mailimf_field *ffrom); static mailimf_field *getField( mailimf_fields *fields, int type ); + static int start_smtp_tls(mailsmtp *session); + int smtpSend(char*from,clist*rcpts,const char*data,size_t size, SMTPaccount *smtp ); void storeMail(mailmime*mail, const QString&box); Settings *settings; - + int sendQueuedMail(AbstractMail*wrap,SMTPaccount*smtp,RecMail*which); void storeFailedMail(const char*data,unsigned int size, const char*failuremessage); |