/** * KQOAuth - An OAuth authentication library for Qt. * * Author: Johan Paul (johan.paul@d-pointer.com) * http://www.d-pointer.com * * KQOAuth is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * KQOAuth 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with KQOAuth. If not, see . */ #include #include #include #include #include #include #include "kqoauthauthreplyserver.h" #include "kqoauthauthreplyserver_p.h" KQOAuthAuthReplyServerPrivate::KQOAuthAuthReplyServerPrivate(KQOAuthAuthReplyServer *parent): q_ptr(parent) { } KQOAuthAuthReplyServerPrivate::~KQOAuthAuthReplyServerPrivate() { } void KQOAuthAuthReplyServerPrivate::onIncomingConnection() { Q_Q(KQOAuthAuthReplyServer); qDebug() << "Incoming Connection"; socket = q->nextPendingConnection(); connect(socket, SIGNAL(readyRead()), this, SLOT(onBytesReady()), Qt::UniqueConnection); } void KQOAuthAuthReplyServerPrivate::onBytesReady() { Q_Q(KQOAuthAuthReplyServer); qDebug() << "Socket peer host address: " << socket->peerAddress(); QByteArray reply; QByteArray content; QByteArray data = socket->readAll(); qDebug()<< "Query Data: " << data; QMultiMap queryParams = parseQueryParams(&data); if(queryParams.size() == 0 && !handlingRedirect) { //assume theres a hash and do the redirect hack handlingRedirect = true; content.append("

Account authorized, go ahead back to the tumblr app and start your experience!

"); } else { handlingRedirect = false; QFile file("app/native/assets/" + localFile); QString fileData; if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { qDebug() << "file worked"; QTextStream in(&file); while (!in.atEnd()) { fileData += in.readLine(); } file.close(); } if(fileData.isEmpty()) { content.append("

Account linked, go ahead back to the app and check the status!

"); } else { content.append(fileData); } } reply.append("HTTP/1.0 200 OK \r\n"); reply.append("Content-Type: text/html; charset=\"utf-8\"\r\n"); reply.append(QString("Content-Length: %1\r\n").arg(content.size())); reply.append("\r\n"); reply.append(content); socket->write(reply); if(!handlingRedirect) { socket->disconnectFromHost(); q->close(); emit q->verificationReceived(queryParams); } } QMultiMap KQOAuthAuthReplyServerPrivate::parseQueryParams(QByteArray *data) { QString splitGetLine = QString(*data).split("\r\n").first(); // Retrieve the first line with query params. splitGetLine.remove("GET "); // Clean the line from GET splitGetLine.remove("HTTP/1.1"); // From HTTP splitGetLine.remove("\r\n"); // And from rest. splitGetLine.prepend("http://localhost"); // Now, make it a URL QUrl getTokenUrl(splitGetLine); QList< QPair > tokens = getTokenUrl.queryItems(); // Ask QUrl to do our work. QMultiMap queryParams; QPair tokenPair; foreach (tokenPair, tokens) { queryParams.insert(tokenPair.first.trimmed(), tokenPair.second.trimmed()); } return queryParams; } KQOAuthAuthReplyServer::KQOAuthAuthReplyServer(QObject *parent) : QTcpServer(parent), d_ptr( new KQOAuthAuthReplyServerPrivate(this) ) { Q_D(KQOAuthAuthReplyServer); connect(this, SIGNAL(newConnection()), d, SLOT(onIncomingConnection())); } KQOAuthAuthReplyServer::~KQOAuthAuthReplyServer() { delete d_ptr; } void KQOAuthAuthReplyServer::setSuccessHtmlFile(QString filePath) { Q_D(KQOAuthAuthReplyServer); d->localFile = filePath; }