hydrus/include/HydrusSessions.py

150 lines
4.5 KiB
Python
Executable File

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