hydrus/include/HydrusSessions.py

133 lines
3.9 KiB
Python
Raw Normal View History

2013-03-15 02:38:12 +00:00
import collections
import httplib
import HydrusConstants as HC
2013-07-24 20:26:00 +00:00
import HydrusExceptions
2013-03-15 02:38:12 +00:00
import os
import Queue
import re
import sqlite3
import sys
import threading
import time
import traceback
import wx
import yaml
2013-10-02 22:06:06 +00:00
HYDRUS_SESSION_EXPIRY_TIME = 30 * 86400
2013-03-15 02:38:12 +00:00
class HydrusSessionManagerClient():
def __init__( self ):
2013-07-10 20:25:57 +00:00
existing_sessions = HC.app.Read( 'hydrus_sessions' )
2013-03-15 02:38:12 +00:00
self._sessions = { service_identifier : ( session_key, expiry ) for ( service_identifier, session_key, expiry ) in existing_sessions }
self._lock = threading.Lock()
def DeleteSessionKey( self, service_identifier ):
with self._lock:
2013-07-10 20:25:57 +00:00
HC.app.Write( 'delete_hydrus_session_key', service_identifier )
2013-03-15 02:38:12 +00:00
del self._sessions[ service_identifier ]
def GetSessionKey( self, service_identifier ):
2013-07-31 21:26:38 +00:00
now = HC.GetNow()
2013-03-15 02:38:12 +00:00
with self._lock:
if service_identifier in self._sessions:
( session_key, expiry ) = self._sessions[ service_identifier ]
if now + 600 > expiry: del self._sessions[ service_identifier ]
else: return session_key
# session key expired or not found
2013-07-10 20:25:57 +00:00
service = HC.app.Read( 'service', service_identifier )
2013-03-15 02:38:12 +00:00
connection = service.GetConnection()
connection.Get( 'session_key' )
cookies = connection.GetCookies()
try: session_key = cookies[ 'session_key' ].decode( 'hex' )
except: raise Exception( 'Service did not return a session key!' )
2013-10-02 22:06:06 +00:00
expiry = now + HYDRUS_SESSION_EXPIRY_TIME
2013-03-15 02:38:12 +00:00
self._sessions[ service_identifier ] = ( session_key, expiry )
2013-07-10 20:25:57 +00:00
HC.app.Write( 'hydrus_session', service_identifier, session_key, expiry )
2013-03-15 02:38:12 +00:00
return session_key
class HydrusSessionManagerServer():
def __init__( self ):
2013-10-02 22:06:06 +00:00
existing_sessions = HC.app.Read( 'sessions' )
2013-03-15 02:38:12 +00:00
2013-10-30 22:28:06 +00:00
self._account_cache = dict()
2013-10-02 22:06:06 +00:00
self._sessions = { ( session_key, service_identifier ) : ( account, expiry ) for ( session_key, service_identifier, account, expiry ) in existing_sessions }
2013-03-15 02:38:12 +00:00
self._lock = threading.Lock()
2013-10-30 22:28:06 +00:00
def AddSession( self, service_identifier, account_identifier ):
if ( service_identifier, account_identifier ) not in self._account_cache:
account = HC.app.Read( 'account', service_identifier, account_identifier )
self._account_cache[ ( service_identifier, account_identifier ) ] = account
account = self._account_cache[ ( service_identifier, account_identifier ) ]
2013-10-02 22:06:06 +00:00
session_key = os.urandom( 32 )
now = HC.GetNow()
expiry = now + HYDRUS_SESSION_EXPIRY_TIME
2013-03-15 02:38:12 +00:00
2013-10-02 22:06:06 +00:00
HC.app.Write( 'session', session_key, service_identifier, account, expiry )
2013-03-15 02:38:12 +00:00
2013-10-02 22:06:06 +00:00
with self._lock:
self._sessions[ ( session_key, service_identifier ) ] = ( account, expiry )
return ( session_key, expiry )
2013-03-15 02:38:12 +00:00
2013-10-02 22:06:06 +00:00
def GetAccount( self, session_key, service_identifier ):
2013-03-15 02:38:12 +00:00
2013-07-31 21:26:38 +00:00
now = HC.GetNow()
2013-03-15 02:38:12 +00:00
with self._lock:
if ( session_key, service_identifier ) in self._sessions:
2013-10-02 22:06:06 +00:00
( account, expiry ) = self._sessions[ ( session_key, service_identifier ) ]
2013-03-15 02:38:12 +00:00
if now > expiry: del self._sessions[ ( session_key, service_identifier ) ]
2013-10-02 22:06:06 +00:00
else: return account
2013-03-15 02:38:12 +00:00
2013-07-24 20:26:00 +00:00
raise HydrusExceptions.SessionException()
2013-03-15 02:38:12 +00:00