summaryrefslogtreecommitdiff
authoralwin <alwin>2004-02-12 22:24:30 (UTC)
committer alwin <alwin>2004-02-12 22:24:30 (UTC)
commitc7f102b944a5172ca330dfc3c0f83cf0b9c65100 (patch) (side-by-side diff)
treeb4bdfea3a7eeb6a46f949cfdaa7052ac25e1c128
parent596d87e16d593cbc52d510973ece99ffe26cd4c4 (diff)
downloadopie-c7f102b944a5172ca330dfc3c0f83cf0b9c65100.zip
opie-c7f102b944a5172ca330dfc3c0f83cf0b9c65100.tar.gz
opie-c7f102b944a5172ca330dfc3c0f83cf0b9c65100.tar.bz2
TLS support for SMTP
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/net/mail/libmailwrapper/smtpwrapper.cpp55
-rw-r--r--noncore/net/mail/libmailwrapper/smtpwrapper.h13
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);