diff --git a/YACReaderLibrary/server/controllers/v2/comiccontroller_v2.cpp b/YACReaderLibrary/server/controllers/v2/comiccontroller_v2.cpp index 02ecc249..9a43a6a2 100644 --- a/YACReaderLibrary/server/controllers/v2/comiccontroller_v2.cpp +++ b/YACReaderLibrary/server/controllers/v2/comiccontroller_v2.cpp @@ -17,10 +17,16 @@ ComicControllerV2::ComicControllerV2() {} void ComicControllerV2::service(HttpRequest& request, HttpResponse& response) -{ - HttpSession session=Static::sessionStore->getSession(request,response,false); - YACReaderHttpSession *ySession = Static::yacreaderSessionStore->getYACReaderSessionHttpSession(session.getId()); - +{ + QByteArray token = request.getHeader("x-request-id"); + YACReaderHttpSession *ySession = Static::yacreaderSessionStore->getYACReaderSessionHttpSession(token); + + if (ySession == nullptr) { + response.setStatus(404,"not found"); + response.write("404 not found",true); + return; + } + QString path = QUrl::fromPercentEncoding(request.getPath()).toUtf8(); QStringList pathElements = path.split('/'); qulonglong libraryId = pathElements.at(3).toLongLong(); @@ -45,9 +51,6 @@ void ComicControllerV2::service(HttpRequest& request, HttpResponse& response) ComicDB comic = DBHelper::getComicInfo(libraryId, comicId); - if(!remoteComic) - ySession->setDownloadedComic(comic.info.hash); - Comic * comicFile = FactoryComic::newComic(libraries.getPath(libraryId)+comic.path); if(comicFile != NULL) diff --git a/YACReaderLibrary/server/controllers/v2/covercontroller_v2.cpp b/YACReaderLibrary/server/controllers/v2/covercontroller_v2.cpp index e83c65ef..da6a2001 100644 --- a/YACReaderLibrary/server/controllers/v2/covercontroller_v2.cpp +++ b/YACReaderLibrary/server/controllers/v2/covercontroller_v2.cpp @@ -10,9 +10,6 @@ CoverControllerV2::CoverControllerV2() {} void CoverControllerV2::service(HttpRequest& request, HttpResponse& response) { - HttpSession session=Static::sessionStore->getSession(request,response,false); - YACReaderHttpSession *ySession = Static::yacreaderSessionStore->getYACReaderSessionHttpSession(session.getId()); - response.setHeader("Content-Type", "image/jpeg"); response.setHeader("Connection","close"); //response.setHeader("Content-Type", "plain/text; charset=ISO-8859-1"); @@ -24,8 +21,6 @@ void CoverControllerV2::service(HttpRequest& request, HttpResponse& response) QString libraryName = DBHelper::getLibraryName(pathElements.at(3).toInt()); QString fileName = pathElements.at(5); - bool folderCover = request.getParameter("folderCover").length()>0; - //response.writeText(path+"
"); //response.writeText(libraryName+"
"); //response.writeText(libraries.value(libraryName)+"/.yacreaderlibrary/covers/"+fileName+"
"); diff --git a/YACReaderLibrary/server/controllers/v2/librariescontroller_v2.cpp b/YACReaderLibrary/server/controllers/v2/librariescontroller_v2.cpp index bd803e44..ac75f432 100644 --- a/YACReaderLibrary/server/controllers/v2/librariescontroller_v2.cpp +++ b/YACReaderLibrary/server/controllers/v2/librariescontroller_v2.cpp @@ -11,8 +11,6 @@ LibrariesControllerV2::LibrariesControllerV2() {} void LibrariesControllerV2::service(HttpRequest& request, HttpResponse& response) { - HttpSession session=Static::sessionStore->getSession(request,response,false); - response.setHeader("Content-Type", "application/json"); response.setHeader("Connection","close"); diff --git a/YACReaderLibrary/server/controllers/v2/pagecontroller_v2.cpp b/YACReaderLibrary/server/controllers/v2/pagecontroller_v2.cpp index 668f352b..79279865 100644 --- a/YACReaderLibrary/server/controllers/v2/pagecontroller_v2.cpp +++ b/YACReaderLibrary/server/controllers/v2/pagecontroller_v2.cpp @@ -16,10 +16,16 @@ PageControllerV2::PageControllerV2() {} void PageControllerV2::service(HttpRequest& request, HttpResponse& response) -{ - HttpSession session=Static::sessionStore->getSession(request,response,false); - YACReaderHttpSession *ySession = Static::yacreaderSessionStore->getYACReaderSessionHttpSession(session.getId()); - +{ + QByteArray token = request.getHeader("x-request-id"); + YACReaderHttpSession *ySession = Static::yacreaderSessionStore->getYACReaderSessionHttpSession(token); + + if (ySession == nullptr) { + response.setStatus(404,"not found"); + response.write("404 not found",true); + return; + } + QString path = QUrl::fromPercentEncoding(request.getPath()).toUtf8(); bool remote = path.endsWith("remote"); diff --git a/YACReaderLibrary/server/controllers/v2/updatecomiccontroller_v2.cpp b/YACReaderLibrary/server/controllers/v2/updatecomiccontroller_v2.cpp index a683f16e..df9d363f 100644 --- a/YACReaderLibrary/server/controllers/v2/updatecomiccontroller_v2.cpp +++ b/YACReaderLibrary/server/controllers/v2/updatecomiccontroller_v2.cpp @@ -15,8 +15,6 @@ UpdateComicControllerV2::UpdateComicControllerV2(){} void UpdateComicControllerV2::service(HttpRequest &request, HttpResponse &response) { - HttpSession session=Static::sessionStore->getSession(request,response,false); - QString path = QUrl::fromPercentEncoding(request.getPath()).toUtf8(); QStringList pathElements = path.split('/'); qulonglong libraryId = pathElements.at(3).toULongLong(); diff --git a/YACReaderLibrary/server/lib/httpserver/staticfilecontroller.cpp b/YACReaderLibrary/server/lib/httpserver/staticfilecontroller.cpp index dd940d3e..090580d4 100644 --- a/YACReaderLibrary/server/lib/httpserver/staticfilecontroller.cpp +++ b/YACReaderLibrary/server/lib/httpserver/staticfilecontroller.cpp @@ -68,9 +68,14 @@ void StaticFileController::service(HttpRequest& request, HttpResponse& response) QString fileName = paths.last(); stringPath.remove(fileName); HttpSession session=Static::sessionStore->getSession(request,response,false); - YACReaderHttpSession *ySession = Static::yacreaderSessionStore->getYACReaderSessionHttpSession(session.getId()); - QString device = ySession->getDeviceType(); - QString display = ySession->getDisplayType(); + YACReaderHttpSession *ySession = Static::yacreaderSessionStore->getYACReaderSessionHttpSession(session.getId()); + QString device = "ipad"; + QString display = "@2x"; + if (ySession != nullptr) { + device = ySession->getDeviceType(); + display = ySession->getDisplayType(); + } + if(fileName.endsWith(".png")) fileName = getDeviceAwareFileName(fileName, device, display, request.getHeader("Accept-Language"), stringPath); else diff --git a/YACReaderLibrary/server/requestmapper.cpp b/YACReaderLibrary/server/requestmapper.cpp index 8bc9f912..f38d77f1 100644 --- a/YACReaderLibrary/server/requestmapper.cpp +++ b/YACReaderLibrary/server/requestmapper.cpp @@ -44,12 +44,17 @@ #include "yacreader_http_session.h" #include "QsLog.h" + +QMutex RequestMapper::mutex; + RequestMapper::RequestMapper(QObject* parent) :HttpRequestHandler(parent) {} -void RequestMapper::loadSession(HttpRequest & request, HttpResponse& response) -{ +void RequestMapper::loadSessionV1(HttpRequest & request, HttpResponse& response) +{ + QMutexLocker locker(&mutex); + HttpSession session=Static::sessionStore->getSession(request,response); if(session.contains("ySession")) //session is already alive check if it is needed to update comics { @@ -112,11 +117,33 @@ void RequestMapper::loadSession(HttpRequest & request, HttpResponse& response) } } +} + +void RequestMapper::loadSessionV2(HttpRequest & request, HttpResponse& response) +{ + QMutexLocker locker(&mutex); + + QByteArray token = request.getHeader("x-request-id"); + + if (token.isEmpty()) { + return; + } + + YACReaderHttpSession *yRecoveredSession = Static::yacreaderSessionStore->getYACReaderSessionHttpSession(token); + + if(yRecoveredSession == nullptr) //session is already alive check if it is needed to update comics + { + YACReaderHttpSession *ySession = new YACReaderHttpSession(this); + + Static::yacreaderSessionStore->addYACReaderHttpSession(token, ySession); + } } void RequestMapper::service(HttpRequest& request, HttpResponse& response) { - QByteArray path=request.getPath(); - qDebug("RequestMapper: path=%s",path.data()); + QByteArray path=request.getPath(); + + QLOG_TRACE() << "RequestMapper: path=" << path.data(); + QLOG_TRACE() << "X-Request-Id: " << request.getHeader("x-request-id"); if (path.startsWith("/v2")) { @@ -150,7 +177,7 @@ void RequestMapper::serviceV1(HttpRequest& request, HttpResponse& response) path = QUrl::fromPercentEncoding(path).toUtf8(); if(!sync.exactMatch(path)) //no session is needed for syncback info, until security will be added - loadSession(request, response); + loadSessionV1(request, response); //primera petición, se ha hecho un post, se sirven las bibliotecas si la seguridad mediante login no está habilitada if(path == "/") //Don't send data to the server using '/' !!!! @@ -221,7 +248,7 @@ void RequestMapper::serviceV2(HttpRequest& request, HttpResponse& response) QRegExp comicDownloadInfo("/v2/library/.+/comic/[0-9]+/?"); //get comic info (basic/download info) QRegExp comicOpenForDownloading("/v2/library/.+/comic/[0-9]+/info/?"); //get comic info (full info + opening) QRegExp comicOpenForRemoteReading("/v2/library/.+/comic/[0-9]+/remote/?"); //the server will open for reading the comic - QRegExp comicFullInfo("/v2/library/.+/comic/[0-9]+/fullinfo/?"); //get comic info (full info + opening) + QRegExp comicFullInfo("/v2/library/.+/comic/[0-9]+/fullinfo/?"); //get comic info QRegExp comicUpdate("/v2/library/.+/comic/[0-9]+/update/?"); //get comic info QRegExp comicClose("/v2/library/.+/comic/[0-9]+/close/?"); //the server will close the comic and free memory QRegExp cover("/v2/library/.+/cover/[0-9a-f]+.jpg"); //get comic cover (navigation) @@ -243,7 +270,7 @@ void RequestMapper::serviceV2(HttpRequest& request, HttpResponse& response) path = QUrl::fromPercentEncoding(path).toUtf8(); if(!sync.exactMatch(path)) //no session is needed for syncback info, until security will be added - loadSession(request, response); + loadSessionV2(request, response); //primera petición, se ha hecho un post, se sirven las bibliotecas si la seguridad mediante login no está habilitada if(path == "/v2/libraries") //Don't send data to the server using '/' !!!! @@ -262,10 +289,6 @@ void RequestMapper::serviceV2(HttpRequest& request, HttpResponse& response) } else { - //se comprueba que la sesión sea la correcta con el fin de evitar accesos no autorizados - HttpSession session=Static::sessionStore->getSession(request,response,false); - if(!session.isNull() && session.contains("ySession")) - { if(library.indexIn(path)!=-1 && DBHelper::getLibraries().contains(library.cap(1).toInt()) ) { if (folderInfo.exactMatch(path)) @@ -328,11 +351,6 @@ void RequestMapper::serviceV2(HttpRequest& request, HttpResponse& response) //response.writeText(library.cap(1)); Static::staticFileController->service(request, response); } - } - else //acceso no autorizado, redirección - { - ErrorControllerV2(300).service(request,response); - } } } } diff --git a/YACReaderLibrary/server/requestmapper.h b/YACReaderLibrary/server/requestmapper.h index 6ab0f92e..4bccc45b 100644 --- a/YACReaderLibrary/server/requestmapper.h +++ b/YACReaderLibrary/server/requestmapper.h @@ -17,11 +17,14 @@ public: RequestMapper(QObject* parent=0); void service(HttpRequest& request, HttpResponse& response); - void loadSession(HttpRequest & request, HttpResponse& response); + void loadSessionV1(HttpRequest & request, HttpResponse& response); + void loadSessionV2(HttpRequest & request, HttpResponse& response); private: void serviceV1(HttpRequest& request, HttpResponse& response); void serviceV2(HttpRequest& request, HttpResponse& response); + + static QMutex mutex; }; #endif // REQUESTMAPPER_H diff --git a/YACReaderLibrary/server/yacreader_http_session_store.cpp b/YACReaderLibrary/server/yacreader_http_session_store.cpp index 52a55bd3..df523f08 100644 --- a/YACReaderLibrary/server/yacreader_http_session_store.cpp +++ b/YACReaderLibrary/server/yacreader_http_session_store.cpp @@ -8,9 +8,11 @@ YACReaderHttpSessionStore::YACReaderHttpSessionStore(HttpSessionStore *sessionStore, QObject *parent) : QObject(parent), sessionStore(sessionStore) -{ - connect(&cleanupTimer,SIGNAL(timeout()),this,SLOT(sessionTimerEvent())); - cleanupTimer.start(60000); +{ + //sessions are no longer http sessions in v2, we need another mechanism for cleaning + + //connect(&cleanupTimer,SIGNAL(timeout()),this,SLOT(sessionTimerEvent())); + //cleanupTimer.start(60000); } void YACReaderHttpSessionStore::addYACReaderHttpSession(const QByteArray &httpSessionId, YACReaderHttpSession *yacreaderHttpSession) @@ -28,8 +30,9 @@ YACReaderHttpSession *YACReaderHttpSessionStore::getYACReaderSessionHttpSession( } void YACReaderHttpSessionStore::sessionTimerEvent() -{ - QMutexLocker locker(&mutex); +{ + //sessions are no longer http sessions in v2, we are using a token, so sessionStore->getSession(id).isNull() is always true. + /*QMutexLocker locker(&mutex); for(const QByteArray &id : sessions.keys()) { if(sessionStore->getSession(id).isNull()) @@ -40,5 +43,5 @@ void YACReaderHttpSessionStore::sessionTimerEvent() sessions.remove(id); } - } + }*/ }