hydrus/include/HydrusSessions.py

150 lines
4.5 KiB
Python
Raw Normal View History

2013-03-15 02:38:12 +00:00
import collections
import httplib
import HydrusConstants as HC
import os
import Queue
import re
import sqlite3
import sys
import threading
import time
import traceback
import wx
import yaml
class HydrusSessionManagerClient():
def __init__( self ):
existing_sessions = wx.GetApp().Read( 'hydrus_sessions' )
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:
wx.GetApp().Write( 'delete_hydrus_session_key', service_identifier )
del self._sessions[ service_identifier ]
def GetSessionKey( self, service_identifier ):
now = int( time.time() )
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
service = wx.GetApp().Read( 'service', service_identifier )
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!' )
expiry = now + 30 * 86400
self._sessions[ service_identifier ] = ( session_key, expiry )
wx.GetApp().Write( 'hydrus_session', service_identifier, session_key, expiry )
return session_key
class HydrusSessionManagerServer():
def __init__( self ):
existing_sessions = wx.GetApp().GetDB().Read( 'sessions', HC.HIGH_PRIORITY )
self._sessions = { ( session_key, service_identifier ) : ( account_identifier, expiry ) for ( session_key, service_identifier, account_identifier, expiry ) in existing_sessions }
self._lock = threading.Lock()
def AddSession( self, session_key, service_identifier, account_identifier, expiry ):
wx.GetApp().GetDB().Write( 'session', HC.HIGH_PRIORITY, session_key, service_identifier, account_identifier, expiry )
self._sessions[ ( session_key, service_identifier ) ] = ( account_identifier, expiry )
def GetAccountIdentifier( self, session_key, service_identifier ):
now = int( time.time() )
with self._lock:
if ( session_key, service_identifier ) in self._sessions:
( account_identifier, expiry ) = self._sessions[ ( session_key, service_identifier ) ]
if now > expiry: del self._sessions[ ( session_key, service_identifier ) ]
else: return account_identifier
# session not found, or expired
raise HC.SessionException()
class WebSessionManagerClient():
def __init__( self ):
existing_sessions = wx.GetApp().Read( 'web_sessions' )
self._sessions = { name : ( cookies, expiry ) for ( name, cookies, expiry ) in existing_sessions }
self._lock = threading.Lock()
def GetSessionKey( self, name ):
now = int( time.time() )
with self._lock:
if name in self._sessions:
( cookies, expiry ) = self._sessions[ name ]
if now + 300 > expiry: del self._sessions[ name ]
else: return cookies
# name not found, or expired
if name == hf: pass
elif name == pixiv: pass
( cookies, expiry ) = ( { 'PHPSESSID' : 'blah' }, now + 30 * 86400 )
self._sessions[ name ] = ( cookies, expiry )
wx.GetApp().Write( 'web_session', name, cookies, expiry )
return cookies