httpsessionstore.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. /**
  2. @file
  3. @author Stefan Frings
  4. */
  5. #include "httpsessionstore.h"
  6. #include <QDateTime>
  7. #include <QUuid>
  8. using namespace stefanfrings;
  9. HttpSessionStore::HttpSessionStore(const QSettings *settings, QObject* parent)
  10. :QObject(parent)
  11. {
  12. this->settings=settings;
  13. connect(&cleanupTimer,SIGNAL(timeout()),this,SLOT(sessionTimerEvent()));
  14. cleanupTimer.start(60000);
  15. cookieName=settings->value("cookieName","sessionid").toByteArray();
  16. expirationTime=settings->value("expirationTime",3600000).toInt();
  17. qDebug("HttpSessionStore: Sessions expire after %i milliseconds",expirationTime);
  18. }
  19. HttpSessionStore::~HttpSessionStore()
  20. {
  21. cleanupTimer.stop();
  22. }
  23. QByteArray HttpSessionStore::getSessionId(HttpRequest& request, HttpResponse& response)
  24. {
  25. // The session ID in the response has priority because this one will be used in the next request.
  26. mutex.lock();
  27. // Get the session ID from the response cookie
  28. QByteArray sessionId=response.getCookies().value(cookieName).getValue();
  29. if (sessionId.isEmpty())
  30. {
  31. // Get the session ID from the request cookie
  32. sessionId=request.getCookie(cookieName);
  33. }
  34. // Clear the session ID if there is no such session in the storage.
  35. if (!sessionId.isEmpty())
  36. {
  37. if (!sessions.contains(sessionId))
  38. {
  39. qDebug("HttpSessionStore: received invalid session cookie with ID %s",sessionId.data());
  40. sessionId.clear();
  41. }
  42. }
  43. mutex.unlock();
  44. return sessionId;
  45. }
  46. HttpSession HttpSessionStore::getSession(HttpRequest& request, HttpResponse& response, bool allowCreate)
  47. {
  48. QByteArray sessionId=getSessionId(request,response);
  49. mutex.lock();
  50. if (!sessionId.isEmpty())
  51. {
  52. HttpSession session=sessions.value(sessionId);
  53. if (!session.isNull())
  54. {
  55. mutex.unlock();
  56. // Refresh the session cookie
  57. QByteArray cookieName=settings->value("cookieName","sessionid").toByteArray();
  58. QByteArray cookiePath=settings->value("cookiePath").toByteArray();
  59. QByteArray cookieComment=settings->value("cookieComment").toByteArray();
  60. QByteArray cookieDomain=settings->value("cookieDomain").toByteArray();
  61. response.setCookie(HttpCookie(cookieName,session.getId(),expirationTime/1000,
  62. cookiePath,cookieComment,cookieDomain,false,false,"Lax"));
  63. session.setLastAccess();
  64. return session;
  65. }
  66. }
  67. // Need to create a new session
  68. if (allowCreate)
  69. {
  70. QByteArray cookieName=settings->value("cookieName","sessionid").toByteArray();
  71. QByteArray cookiePath=settings->value("cookiePath").toByteArray();
  72. QByteArray cookieComment=settings->value("cookieComment").toByteArray();
  73. QByteArray cookieDomain=settings->value("cookieDomain").toByteArray();
  74. HttpSession session(true);
  75. qDebug("HttpSessionStore: create new session with ID %s",session.getId().data());
  76. sessions.insert(session.getId(),session);
  77. response.setCookie(HttpCookie(cookieName,session.getId(),expirationTime/1000,
  78. cookiePath,cookieComment,cookieDomain,false,false,"Lax"));
  79. mutex.unlock();
  80. return session;
  81. }
  82. // Return a null session
  83. mutex.unlock();
  84. return HttpSession();
  85. }
  86. HttpSession HttpSessionStore::getSession(const QByteArray id)
  87. {
  88. mutex.lock();
  89. HttpSession session=sessions.value(id);
  90. mutex.unlock();
  91. session.setLastAccess();
  92. return session;
  93. }
  94. void HttpSessionStore::sessionTimerEvent()
  95. {
  96. mutex.lock();
  97. qint64 now=QDateTime::currentMSecsSinceEpoch();
  98. QMap<QByteArray,HttpSession>::iterator i = sessions.begin();
  99. while (i != sessions.end())
  100. {
  101. QMap<QByteArray,HttpSession>::iterator prev = i;
  102. ++i;
  103. HttpSession session=prev.value();
  104. qint64 lastAccess=session.getLastAccess();
  105. if (now-lastAccess>expirationTime)
  106. {
  107. qDebug("HttpSessionStore: session %s expired",session.getId().data());
  108. emit sessionDeleted(session.getId());
  109. sessions.erase(prev);
  110. }
  111. }
  112. mutex.unlock();
  113. }
  114. /** Delete a session */
  115. void HttpSessionStore::removeSession(HttpSession session)
  116. {
  117. mutex.lock();
  118. emit sessionDeleted(session.getId());
  119. sessions.remove(session.getId());
  120. mutex.unlock();
  121. }