mirror of
				https://github.com/f4exb/sdrangel.git
				synced 2025-10-31 04:50:29 -04:00 
			
		
		
		
	
		
			
	
	
		
			128 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			128 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
|  | /**
 | ||
|  |   @file | ||
|  |   @author Stefan Frings | ||
|  | */ | ||
|  | 
 | ||
|  | #include "httpsessionstore.h"
 | ||
|  | #include <QDateTime>
 | ||
|  | #include <QUuid>
 | ||
|  | 
 | ||
|  | using namespace stefanfrings; | ||
|  | 
 | ||
|  | HttpSessionStore::HttpSessionStore(QSettings* settings, QObject* parent) | ||
|  |     :QObject(parent) | ||
|  | { | ||
|  |     this->settings=settings; | ||
|  |     connect(&cleanupTimer,SIGNAL(timeout()),this,SLOT(sessionTimerEvent())); | ||
|  |     cleanupTimer.start(60000); | ||
|  |     cookieName=settings->value("cookieName","sessionid").toByteArray(); | ||
|  |     expirationTime=settings->value("expirationTime",3600000).toInt(); | ||
|  |     qDebug("HttpSessionStore: Sessions expire after %i milliseconds",expirationTime); | ||
|  | } | ||
|  | 
 | ||
|  | HttpSessionStore::~HttpSessionStore() | ||
|  | { | ||
|  |     cleanupTimer.stop(); | ||
|  | } | ||
|  | 
 | ||
|  | QByteArray HttpSessionStore::getSessionId(HttpRequest& request, HttpResponse& response) | ||
|  | { | ||
|  |     // The session ID in the response has priority because this one will be used in the next request.
 | ||
|  |     mutex.lock(); | ||
|  |     // Get the session ID from the response cookie
 | ||
|  |     QByteArray sessionId=response.getCookies().value(cookieName).getValue(); | ||
|  |     if (sessionId.isEmpty()) | ||
|  |     { | ||
|  |         // Get the session ID from the request cookie
 | ||
|  |         sessionId=request.getCookie(cookieName); | ||
|  |     } | ||
|  |     // Clear the session ID if there is no such session in the storage.
 | ||
|  |     if (!sessionId.isEmpty()) | ||
|  |     { | ||
|  |         if (!sessions.contains(sessionId)) | ||
|  |         { | ||
|  |             qDebug("HttpSessionStore: received invalid session cookie with ID %s",sessionId.data()); | ||
|  |             sessionId.clear(); | ||
|  |         } | ||
|  |     } | ||
|  |     mutex.unlock(); | ||
|  |     return sessionId; | ||
|  | } | ||
|  | 
 | ||
|  | HttpSession HttpSessionStore::getSession(HttpRequest& request, HttpResponse& response, bool allowCreate) | ||
|  | { | ||
|  |     QByteArray sessionId=getSessionId(request,response); | ||
|  |     mutex.lock(); | ||
|  |     if (!sessionId.isEmpty()) | ||
|  |     { | ||
|  |         HttpSession session=sessions.value(sessionId); | ||
|  |         if (!session.isNull()) | ||
|  |         { | ||
|  |             mutex.unlock(); | ||
|  |             // Refresh the session cookie
 | ||
|  |             QByteArray cookieName=settings->value("cookieName","sessionid").toByteArray(); | ||
|  |             QByteArray cookiePath=settings->value("cookiePath").toByteArray(); | ||
|  |             QByteArray cookieComment=settings->value("cookieComment").toByteArray(); | ||
|  |             QByteArray cookieDomain=settings->value("cookieDomain").toByteArray(); | ||
|  |             response.setCookie(HttpCookie(cookieName,session.getId(),expirationTime/1000,cookiePath,cookieComment,cookieDomain)); | ||
|  |             session.setLastAccess(); | ||
|  |             return session; | ||
|  |         } | ||
|  |     } | ||
|  |     // Need to create a new session
 | ||
|  |     if (allowCreate) | ||
|  |     { | ||
|  |         QByteArray cookieName=settings->value("cookieName","sessionid").toByteArray(); | ||
|  |         QByteArray cookiePath=settings->value("cookiePath").toByteArray(); | ||
|  |         QByteArray cookieComment=settings->value("cookieComment").toByteArray(); | ||
|  |         QByteArray cookieDomain=settings->value("cookieDomain").toByteArray(); | ||
|  |         HttpSession session(true); | ||
|  |         qDebug("HttpSessionStore: create new session with ID %s",session.getId().data()); | ||
|  |         sessions.insert(session.getId(),session); | ||
|  |         response.setCookie(HttpCookie(cookieName,session.getId(),expirationTime/1000,cookiePath,cookieComment,cookieDomain)); | ||
|  |         mutex.unlock(); | ||
|  |         return session; | ||
|  |     } | ||
|  |     // Return a null session
 | ||
|  |     mutex.unlock(); | ||
|  |     return HttpSession(); | ||
|  | } | ||
|  | 
 | ||
|  | HttpSession HttpSessionStore::getSession(const QByteArray id) | ||
|  | { | ||
|  |     mutex.lock(); | ||
|  |     HttpSession session=sessions.value(id); | ||
|  |     mutex.unlock(); | ||
|  |     session.setLastAccess(); | ||
|  |     return session; | ||
|  | } | ||
|  | 
 | ||
|  | void HttpSessionStore::sessionTimerEvent() | ||
|  | { | ||
|  |     mutex.lock(); | ||
|  |     qint64 now=QDateTime::currentMSecsSinceEpoch(); | ||
|  |     QMap<QByteArray,HttpSession>::iterator i = sessions.begin(); | ||
|  |     while (i != sessions.end()) | ||
|  |     { | ||
|  |         QMap<QByteArray,HttpSession>::iterator prev = i; | ||
|  |         ++i; | ||
|  |         HttpSession session=prev.value(); | ||
|  |         qint64 lastAccess=session.getLastAccess(); | ||
|  |         if (now-lastAccess>expirationTime) | ||
|  |         { | ||
|  |             qDebug("HttpSessionStore: session %s expired",session.getId().data()); | ||
|  |             sessions.erase(prev); | ||
|  |         } | ||
|  |     } | ||
|  |     mutex.unlock(); | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | /** Delete a session */ | ||
|  | void HttpSessionStore::removeSession(HttpSession session) | ||
|  | { | ||
|  |     mutex.lock(); | ||
|  |     sessions.remove(session.getId()); | ||
|  |     mutex.unlock(); | ||
|  | } |