/* Copyright (c) 2010 Omat Holding B.V. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "ispdb.h" #include #include #include #include #include #include Ispdb::Ispdb( QObject *parent ) : QObject( parent ), mServerType( DataBase ) { } Ispdb::~Ispdb() { } void Ispdb::setEmail( const QString& address ) { KMime::Types::Mailbox box; box.fromUnicodeString( address ); mAddr = box.addrSpec(); } void Ispdb::start() { kDebug() << mAddr.asString(); // we should do different things in here. But lets focus in the db first. lookupInDb(); } void Ispdb::startJob( const KUrl&url ) { QMap< QString, QVariant > map; map[QLatin1String("errorPage")] = false; KIO::TransferJob* job = KIO::get( url, KIO::NoReload, KIO::HideProgressInfo ); job->setMetaData( map ); connect( job, SIGNAL(result(KJob*)), this, SLOT(slotResult(KJob*)) ); connect( job, SIGNAL(data(KIO::Job*,QByteArray)), this, SLOT(dataArrived(KIO::Job*,QByteArray)) ); } void Ispdb::lookupInDb() { KUrl url; switch( mServerType ) { case IspAutoConfig: { url = KUrl( QLatin1String("http://autoconfig.") + mAddr.domain.toLower() + QLatin1String("/mail/config-v1.1.xml?emailaddress=") + mAddr.asString().toLower() ); Q_EMIT searchType(i18n("Lookup configuration: Email provider")); break; } case IspWellKnow: { url = KUrl( QLatin1String("http://") + mAddr.domain.toLower() + QLatin1String("/.well-known/autoconfig/mail/config-v1.1.xml") ); Q_EMIT searchType(i18n("Lookup configuration: Trying common server name")); break; } case DataBase: { url = KUrl( QLatin1String("https://autoconfig.thunderbird.net/v1.1/") + mAddr.domain.toLower() ); Q_EMIT searchType(i18n("Lookup configuration: Mozilla database")); break; } } startJob( url ); } void Ispdb::slotResult( KJob* job ) { if ( job->error() ) { kDebug() << "Fetching failed" << job->errorString(); bool lookupFinished = false; switch( mServerType ) { case IspAutoConfig: { mServerType = IspWellKnow; break; } case IspWellKnow: { lookupFinished = true; break; } case DataBase: { mServerType = IspAutoConfig; break; } } if ( lookupFinished ) { emit finished( false ); return; } lookupInDb(); return; } //kDebug() << mData; QDomDocument document; bool ok = document.setContent( mData ); if ( !ok ) { kDebug() << "Could not parse xml" << mData; emit finished( false ); return; } QDomElement docElem = document.documentElement(); QDomNode m = docElem.firstChild(); // emailprovider QDomNode n = m.firstChild(); // emailprovider while ( !n.isNull() ) { QDomElement e = n.toElement(); if ( !e.isNull() ) { //kDebug() << qPrintable( e.tagName() ); const QString tagName( e.tagName() ); if ( tagName == QLatin1String( "domain" ) ) mDomains << e.text(); else if ( tagName == QLatin1String( "displayName" ) ) mDisplayName = e.text(); else if ( tagName == QLatin1String( "displayShortName" ) ) mDisplayShortName = e.text(); else if ( tagName == QLatin1String( "incomingServer" ) && e.attribute( QLatin1String("type") ) == QLatin1String( "imap" ) ) { server s = createServer( e ); if (s.isValid()) mImapServers.append( s ); } else if ( tagName == QLatin1String( "incomingServer" ) && e.attribute( QLatin1String("type") ) == QLatin1String( "pop3" ) ) { server s = createServer( e ); if (s.isValid()) mPop3Servers.append( s ); } else if ( tagName == QLatin1String( "outgoingServer" ) && e.attribute( QLatin1String("type") ) == QLatin1String( "smtp" ) ) { server s = createServer( e ); if (s.isValid()) mSmtpServers.append( s ); } } n = n.nextSibling(); } // comment this section out when you are tired of it... kDebug() << "------------------ summary --------------"; kDebug() << "Domains" << mDomains; kDebug() << "Name" << mDisplayName << "(" << mDisplayShortName << ")"; kDebug() << "Imap servers:"; foreach ( const server& s, mImapServers ) { kDebug() << s.hostname << s.port << s.socketType << s.username << s.authentication; } kDebug() << "pop3 servers:"; foreach ( const server& s, mPop3Servers ) { kDebug() << s.hostname << s.port << s.socketType << s.username << s.authentication; } kDebug() << "smtp servers:"; foreach ( const server& s, mSmtpServers ) { kDebug() << s.hostname << s.port << s.socketType << s.username << s.authentication; } // end section. emit finished( true ); } server Ispdb::createServer( const QDomElement& n ) { QDomNode o = n.firstChild(); server s; while ( !o.isNull() ) { QDomElement f = o.toElement(); if ( !f.isNull() ) { const QString tagName( f.tagName() ); if ( tagName == QLatin1String( "hostname" ) ) s.hostname = replacePlaceholders( f.text() ); else if ( tagName == QLatin1String( "port" ) ) s.port = f.text().toInt(); else if ( tagName == QLatin1String( "socketType" ) ) { const QString type( f.text() ); if ( type == QLatin1String( "plain" ) ) s.socketType = None; else if ( type == QLatin1String( "SSL" ) ) s.socketType = SSL; if ( type == QLatin1String( "STARTTLS" ) ) s.socketType = StartTLS; } else if ( tagName == QLatin1String( "username" ) ) { s.username = replacePlaceholders( f.text() ); } else if ( tagName == QLatin1String( "authentication" ) ) { const QString type( f.text() ); if ( type == QLatin1String( "password-cleartext" ) || type == QLatin1String( "plain" ) ) s.authentication = Plain; else if ( type == QLatin1String( "password-encrypted" ) || type == QLatin1String( "secure" ) ) s.authentication = CramMD5; else if ( type == QLatin1String( "NTLM" ) ) s.authentication = NTLM; else if ( type == QLatin1String( "GSSAPI" ) ) s.authentication = GSSAPI; else if ( type == QLatin1String( "client-ip-based" ) ) s.authentication = ClientIP; else if ( type == QLatin1String( "none" ) ) s.authentication = NoAuth; } } o = o.nextSibling(); } return s; } QString Ispdb::replacePlaceholders( const QString& in ) { QString out( in ); out.replace( QLatin1String("%EMAILLOCALPART%"), mAddr.localPart ); out.replace( QLatin1String("%EMAILADDRESS%"), mAddr.asString() ); out.replace( QLatin1String("%EMAILDOMAIN%"), mAddr.domain ); return out; } void Ispdb::dataArrived( KIO::Job*, const QByteArray& data ) { mData.append( data ); } // The getters QStringList Ispdb::relevantDomains() const { return mDomains; } QString Ispdb::name( length l ) const { if ( l == Long ) return mDisplayName; else if ( l == Short ) return mDisplayShortName; else return QString(); //make compiler happy. Not me. } QList< server > Ispdb::imapServers() const { return mImapServers; } QList< server > Ispdb::pop3Servers() const { return mPop3Servers; } QList< server > Ispdb::smtpServers() const { return mSmtpServers; }