2019-01-09 22:59:03 +00:00
import http . cookies
2020-07-29 20:52:44 +00:00
import threading
2021-05-27 00:09:06 +00:00
import time
2020-07-29 20:52:44 +00:00
2020-04-22 21:00:35 +00:00
from hydrus . core import HydrusConstants as HC
from hydrus . core import HydrusData
from hydrus . core import HydrusExceptions
from hydrus . core import HydrusGlobals as HG
from hydrus . core import HydrusPaths
from hydrus . core import HydrusSerialisable
2021-10-27 21:12:33 +00:00
from hydrus . core import HydrusTemp
2021-04-07 21:26:45 +00:00
from hydrus . core . networking import HydrusNetwork
from hydrus . core . networking import HydrusNetworkVariableHandling
from hydrus . core . networking import HydrusNetworking
from hydrus . core . networking import HydrusServerRequest
from hydrus . core . networking import HydrusServerResources
2020-07-29 20:52:44 +00:00
2020-04-22 21:00:35 +00:00
from hydrus . server import ServerFiles
2015-12-02 22:32:18 +00:00
class HydrusResourceBusyCheck ( HydrusServerResources . Resource ) :
2021-04-07 21:26:45 +00:00
def render_GET ( self , request : HydrusServerRequest . HydrusRequest ) :
2015-12-02 22:32:18 +00:00
request . setResponseCode ( 200 )
2019-10-09 22:03:03 +00:00
if HG . server_busy . locked ( ) :
2019-02-06 22:41:35 +00:00
return b ' 1 '
else :
return b ' 0 '
class HydrusResourceHydrusNetwork ( HydrusServerResources . HydrusResource ) :
2019-10-09 22:03:03 +00:00
BLOCKED_WHEN_BUSY = True
2021-04-07 21:26:45 +00:00
def _callbackParseGETArgs ( self , request : HydrusServerRequest . HydrusRequest ) :
2019-02-06 22:41:35 +00:00
2021-04-07 21:26:45 +00:00
parsed_request_args = HydrusNetworkVariableHandling . ParseHydrusNetworkGETArgs ( request . args )
2019-02-06 22:41:35 +00:00
2019-02-27 23:03:30 +00:00
request . parsed_request_args = parsed_request_args
2019-02-06 22:41:35 +00:00
return request
2021-04-07 21:26:45 +00:00
def _callbackParsePOSTArgs ( self , request : HydrusServerRequest . HydrusRequest ) :
2019-02-06 22:41:35 +00:00
request . content . seek ( 0 )
if not request . requestHeaders . hasHeader ( ' Content-Type ' ) :
2021-04-07 21:26:45 +00:00
parsed_request_args = HydrusNetworkVariableHandling . ParsedRequestArguments ( )
2019-02-06 22:41:35 +00:00
else :
content_types = request . requestHeaders . getRawHeaders ( ' Content-Type ' )
content_type = content_types [ 0 ]
try :
mime = HC . mime_enum_lookup [ content_type ]
except :
2019-02-27 23:03:30 +00:00
raise HydrusExceptions . BadRequestException ( ' Did not recognise Content-Type header! ' )
2019-02-06 22:41:35 +00:00
total_bytes_read = 0
if mime == HC . APPLICATION_JSON :
json_string = request . content . read ( )
total_bytes_read + = len ( json_string )
2021-04-07 21:26:45 +00:00
parsed_request_args = HydrusNetworkVariableHandling . ParseNetworkBytesToParsedHydrusArgs ( json_string )
2019-02-06 22:41:35 +00:00
else :
2021-10-27 21:12:33 +00:00
( os_file_handle , temp_path ) = HydrusTemp . GetTempPath ( )
2019-02-06 22:41:35 +00:00
request . temp_file_info = ( os_file_handle , temp_path )
with open ( temp_path , ' wb ' ) as f :
for block in HydrusPaths . ReadFileLikeAsBlocks ( request . content ) :
f . write ( block )
total_bytes_read + = len ( block )
decompression_bombs_ok = self . _DecompressionBombsOK ( request )
2021-04-07 21:26:45 +00:00
parsed_request_args = HydrusNetworkVariableHandling . ParseFileArguments ( temp_path , decompression_bombs_ok )
2019-02-06 22:41:35 +00:00
self . _reportDataUsed ( request , total_bytes_read )
2019-02-27 23:03:30 +00:00
request . parsed_request_args = parsed_request_args
2019-02-06 22:41:35 +00:00
return request
2015-12-02 22:32:18 +00:00
2021-04-07 21:26:45 +00:00
def _checkService ( self , request : HydrusServerRequest . HydrusRequest ) :
2019-10-09 22:03:03 +00:00
if self . BLOCKED_WHEN_BUSY and HG . server_busy . locked ( ) :
raise HydrusExceptions . ServerBusyException ( ' This server is busy, please try again later. ' )
return request
2019-02-06 22:41:35 +00:00
class HydrusResourceAccessKey ( HydrusResourceHydrusNetwork ) :
2015-12-02 22:32:18 +00:00
2021-04-07 21:26:45 +00:00
def _threadDoGETJob ( self , request : HydrusServerRequest . HydrusRequest ) :
2015-12-02 22:32:18 +00:00
2019-02-27 23:03:30 +00:00
registration_key = request . parsed_request_args [ ' registration_key ' ]
2015-12-02 22:32:18 +00:00
2017-05-10 21:33:58 +00:00
access_key = HG . server_controller . Read ( ' access_key ' , self . _service_key , registration_key )
2015-12-02 22:32:18 +00:00
2021-04-07 21:26:45 +00:00
body = HydrusNetworkVariableHandling . DumpHydrusArgsToNetworkBytes ( { ' access_key ' : access_key } )
2015-12-02 22:32:18 +00:00
response_context = HydrusServerResources . ResponseContext ( 200 , body = body )
return response_context
2021-04-07 21:26:45 +00:00
class HydrusResourceAccessKeyVerification ( HydrusResourceHydrusNetwork ) :
2015-12-02 22:32:18 +00:00
2021-04-07 21:26:45 +00:00
def _threadDoGETJob ( self , request : HydrusServerRequest . HydrusRequest ) :
2015-12-02 22:32:18 +00:00
2021-04-07 21:26:45 +00:00
access_key = self . _parseHydrusNetworkAccessKey ( request )
2015-12-02 22:32:18 +00:00
2021-04-07 21:26:45 +00:00
verified = HG . server_controller . Read ( ' verify_access_key ' , self . _service_key , access_key )
body = HydrusNetworkVariableHandling . DumpHydrusArgsToNetworkBytes ( { ' verified ' : verified } )
response_context = HydrusServerResources . ResponseContext ( 200 , body = body )
2015-12-02 22:32:18 +00:00
return response_context
2021-04-07 21:26:45 +00:00
class HydrusResourceAutoCreateAccountTypes ( HydrusResourceHydrusNetwork ) :
2015-12-02 22:32:18 +00:00
2021-04-07 21:26:45 +00:00
def _threadDoGETJob ( self , request : HydrusServerRequest . HydrusRequest ) :
2015-12-02 22:32:18 +00:00
2021-04-07 21:26:45 +00:00
account_types = HG . server_controller . Read ( ' auto_create_account_types ' , self . _service_key )
2015-12-02 22:32:18 +00:00
2021-04-07 21:26:45 +00:00
body = HydrusNetworkVariableHandling . DumpHydrusArgsToNetworkBytes ( { ' account_types ' : account_types } )
response_context = HydrusServerResources . ResponseContext ( 200 , body = body )
2015-12-02 22:32:18 +00:00
2021-04-07 21:26:45 +00:00
return response_context
class HydrusResourceRestrictedAutoCreateRegistrationKey ( HydrusResourceHydrusNetwork ) :
def _threadDoGETJob ( self , request : HydrusServerRequest . HydrusRequest ) :
account_type_key = request . parsed_request_args [ ' account_type_key ' ]
registration_key = HG . server_controller . Read ( ' auto_create_registration_key ' , self . _service_key , account_type_key )
body = HydrusNetworkVariableHandling . DumpHydrusArgsToNetworkBytes ( { ' registration_key ' : registration_key } )
2015-12-02 22:32:18 +00:00
response_context = HydrusServerResources . ResponseContext ( 200 , body = body )
return response_context
2021-04-07 21:26:45 +00:00
class HydrusResourceShutdown ( HydrusResourceHydrusNetwork ) :
def _threadDoPOSTJob ( self , request : HydrusServerRequest . HydrusRequest ) :
HG . server_controller . ShutdownFromServer ( )
response_context = HydrusServerResources . ResponseContext ( 200 )
return response_context
2019-02-06 22:41:35 +00:00
class HydrusResourceSessionKey ( HydrusResourceHydrusNetwork ) :
2015-12-02 22:32:18 +00:00
2021-04-07 21:26:45 +00:00
def _threadDoGETJob ( self , request : HydrusServerRequest . HydrusRequest ) :
2015-12-02 22:32:18 +00:00
2019-02-06 22:41:35 +00:00
access_key = self . _parseHydrusNetworkAccessKey ( request )
2015-12-02 22:32:18 +00:00
2017-12-06 22:06:56 +00:00
( session_key , expires ) = HG . server_controller . server_session_manager . AddSession ( self . _service_key , access_key )
2015-12-02 22:32:18 +00:00
now = HydrusData . GetNow ( )
2017-10-25 21:45:15 +00:00
max_age = expires - now
2015-12-02 22:32:18 +00:00
2019-04-24 22:18:50 +00:00
cookies = [ ( ' session_key ' , session_key . hex ( ) , { ' max_age ' : str ( max_age ) , ' path ' : ' / ' } ) ]
2015-12-02 22:32:18 +00:00
response_context = HydrusServerResources . ResponseContext ( 200 , cookies = cookies )
return response_context
2019-02-06 22:41:35 +00:00
class HydrusResourceRestricted ( HydrusResourceHydrusNetwork ) :
2015-12-02 22:32:18 +00:00
2021-04-07 21:26:45 +00:00
def _callbackCheckAccountRestrictions ( self , request : HydrusServerRequest . HydrusRequest ) :
2015-12-02 22:32:18 +00:00
2019-06-26 21:27:18 +00:00
HydrusResourceHydrusNetwork . _callbackCheckAccountRestrictions ( self , request )
2015-12-02 22:32:18 +00:00
2019-06-26 21:27:18 +00:00
self . _checkAccount ( request )
2015-12-02 22:32:18 +00:00
2021-01-20 22:22:03 +00:00
self . _checkAccountPermissions ( request )
2015-12-02 22:32:18 +00:00
return request
2021-04-07 21:26:45 +00:00
def _callbackEstablishAccountFromHeader ( self , request : HydrusServerRequest . HydrusRequest ) :
2015-12-02 22:32:18 +00:00
2019-09-25 21:34:18 +00:00
session_key = None
if request . requestHeaders . hasHeader ( ' Cookie ' ) :
2017-03-02 02:14:56 +00:00
2019-09-25 21:34:18 +00:00
cookie_texts = request . requestHeaders . getRawHeaders ( ' Cookie ' )
cookie_text = cookie_texts [ 0 ]
try :
cookies = http . cookies . SimpleCookie ( cookie_text )
if ' session_key ' in cookies :
# Morsel, for real, ha ha ha
morsel = cookies [ ' session_key ' ]
session_key_hex = morsel . value
session_key = bytes . fromhex ( session_key_hex )
except :
2020-05-06 21:31:41 +00:00
raise HydrusExceptions . BadRequestException ( ' Problem parsing cookies for Session Cookie! ' )
2019-09-25 21:34:18 +00:00
2017-03-02 02:14:56 +00:00
2015-12-02 22:32:18 +00:00
2019-09-25 21:34:18 +00:00
if session_key is None :
2015-12-02 22:32:18 +00:00
2019-09-25 21:34:18 +00:00
access_key = self . _parseHydrusNetworkAccessKey ( request , key_required = False )
2015-12-02 22:32:18 +00:00
2019-09-25 21:34:18 +00:00
if access_key is None :
2017-03-02 02:14:56 +00:00
2019-09-25 21:34:18 +00:00
raise HydrusExceptions . MissingCredentialsException ( ' No credentials found in request! ' )
2017-03-02 02:14:56 +00:00
else :
2019-09-25 21:34:18 +00:00
account = HG . server_controller . server_session_manager . GetAccountFromAccessKey ( self . _service_key , access_key )
2017-03-02 02:14:56 +00:00
2019-09-25 21:34:18 +00:00
else :
2017-03-02 02:14:56 +00:00
2019-09-25 21:34:18 +00:00
account = HG . server_controller . server_session_manager . GetAccount ( self . _service_key , session_key )
2015-12-02 22:32:18 +00:00
request . hydrus_account = account
return request
2021-04-07 21:26:45 +00:00
def _checkAccount ( self , request : HydrusServerRequest . HydrusRequest ) :
2019-07-03 22:49:27 +00:00
request . hydrus_account . CheckFunctional ( )
return request
2021-04-07 21:26:45 +00:00
def _checkAccountPermissions ( self , request : HydrusServerRequest . HydrusRequest ) :
2021-01-20 22:22:03 +00:00
raise NotImplementedError ( )
2021-04-07 21:26:45 +00:00
def _checkBandwidth ( self , request : HydrusServerRequest . HydrusRequest ) :
2019-07-03 22:49:27 +00:00
if not self . _service . BandwidthOK ( ) :
raise HydrusExceptions . BandwidthException ( ' This service has run out of bandwidth. Please try again later. ' )
if not HG . server_controller . ServerBandwidthOK ( ) :
raise HydrusExceptions . BandwidthException ( ' This server has run out of bandwidth. Please try again later. ' )
2017-06-21 21:15:59 +00:00
def _reportDataUsed ( self , request , num_bytes ) :
2015-12-02 22:32:18 +00:00
2019-02-06 22:41:35 +00:00
HydrusResourceHydrusNetwork . _reportDataUsed ( self , request , num_bytes )
2015-12-02 22:32:18 +00:00
2017-06-21 21:15:59 +00:00
account = request . hydrus_account
if account is not None :
account . ReportDataUsed ( num_bytes )
2021-04-07 21:26:45 +00:00
def _reportRequestUsed ( self , request : HydrusServerRequest . HydrusRequest ) :
2017-06-21 21:15:59 +00:00
2019-02-06 22:41:35 +00:00
HydrusResourceHydrusNetwork . _reportRequestUsed ( self , request )
2015-12-02 22:32:18 +00:00
2017-03-02 02:14:56 +00:00
account = request . hydrus_account
if account is not None :
2015-12-02 22:32:18 +00:00
2017-06-21 21:15:59 +00:00
account . ReportRequestUsed ( )
2015-12-02 22:32:18 +00:00
2017-03-02 02:14:56 +00:00
class HydrusResourceRestrictedAccount ( HydrusResourceRestricted ) :
2015-12-02 22:32:18 +00:00
2021-04-07 21:26:45 +00:00
def _checkAccount ( self , request : HydrusServerRequest . HydrusRequest ) :
2017-03-02 02:14:56 +00:00
# you can always fetch your account (e.g. to be notified that you are banned!)
return request
2015-12-02 22:32:18 +00:00
2021-04-07 21:26:45 +00:00
def _checkAccountPermissions ( self , request : HydrusServerRequest . HydrusRequest ) :
2021-01-20 22:22:03 +00:00
# you can always fetch your account
pass
2021-04-07 21:26:45 +00:00
def _threadDoGETJob ( self , request : HydrusServerRequest . HydrusRequest ) :
2015-12-02 22:32:18 +00:00
account = request . hydrus_account
2021-04-07 21:26:45 +00:00
body = HydrusNetworkVariableHandling . DumpHydrusArgsToNetworkBytes ( { ' account ' : account } )
2015-12-02 22:32:18 +00:00
response_context = HydrusServerResources . ResponseContext ( 200 , body = body )
return response_context
2021-04-07 21:26:45 +00:00
class HydrusResourceRestrictedOptions ( HydrusResourceRestricted ) :
2017-03-02 02:14:56 +00:00
2021-04-07 21:26:45 +00:00
def _checkAccount ( self , request : HydrusServerRequest . HydrusRequest ) :
# you can always fetch the options
return request
def _checkAccountPermissions ( self , request : HydrusServerRequest . HydrusRequest ) :
# you can always fetch the options
pass
def _threadDoGETJob ( self , request : HydrusServerRequest . HydrusRequest ) :
service_options = self . _service . GetServiceOptions ( )
body = HydrusNetworkVariableHandling . DumpHydrusArgsToNetworkBytes ( { ' service_options ' : service_options } )
response_context = HydrusServerResources . ResponseContext ( 200 , body = body )
return response_context
2021-04-14 21:54:17 +00:00
class HydrusResourceRestrictedOptionsModify ( HydrusResourceRestricted ) :
def _checkAccountPermissions ( self , request : HydrusServerRequest . HydrusRequest ) :
request . hydrus_account . CheckPermission ( HC . CONTENT_TYPE_OPTIONS , HC . PERMISSION_ACTION_MODERATE )
2021-07-07 20:48:57 +00:00
class HydrusResourceRestrictedOptionsModifyNullificationPeriod ( HydrusResourceRestrictedOptionsModify ) :
def _threadDoPOSTJob ( self , request : HydrusServerRequest . HydrusRequest ) :
nullification_period = request . parsed_request_args [ ' nullification_period ' ]
if nullification_period < HydrusNetwork . MIN_NULLIFICATION_PERIOD :
raise HydrusExceptions . BadRequestException ( ' The anonymisation period was too low. It needs to be at least {} . ' . format ( HydrusData . TimeDeltaToPrettyTimeDelta ( HydrusNetwork . MIN_NULLIFICATION_PERIOD ) ) )
if nullification_period > HydrusNetwork . MAX_NULLIFICATION_PERIOD :
raise HydrusExceptions . BadRequestException ( ' The anonymisation period was too high. It needs to be lower than {} . ' . format ( HydrusData . TimeDeltaToPrettyTimeDelta ( HydrusNetwork . MAX_NULLIFICATION_PERIOD ) ) )
old_nullification_period = self . _service . GetNullificationPeriod ( )
if old_nullification_period != nullification_period :
self . _service . SetNullificationPeriod ( nullification_period )
HydrusData . Print (
' Account {} changed the anonymisation period to from " {} " to " {} " . ' . format (
request . hydrus_account . GetAccountKey ( ) . hex ( ) ,
HydrusData . TimeDeltaToPrettyTimeDelta ( old_nullification_period ) ,
HydrusData . TimeDeltaToPrettyTimeDelta ( nullification_period )
)
)
response_context = HydrusServerResources . ResponseContext ( 200 )
return response_context
2021-04-14 21:54:17 +00:00
class HydrusResourceRestrictedOptionsModifyUpdatePeriod ( HydrusResourceRestrictedOptionsModify ) :
def _threadDoPOSTJob ( self , request : HydrusServerRequest . HydrusRequest ) :
update_period = request . parsed_request_args [ ' update_period ' ]
if update_period < HydrusNetwork . MIN_UPDATE_PERIOD :
raise HydrusExceptions . BadRequestException ( ' The update period was too low. It needs to be at least {} . ' . format ( HydrusData . TimeDeltaToPrettyTimeDelta ( HydrusNetwork . MIN_UPDATE_PERIOD ) ) )
if update_period > HydrusNetwork . MAX_UPDATE_PERIOD :
raise HydrusExceptions . BadRequestException ( ' The update period was too high. It needs to be lower than {} . ' . format ( HydrusData . TimeDeltaToPrettyTimeDelta ( HydrusNetwork . MAX_UPDATE_PERIOD ) ) )
2021-04-20 22:01:22 +00:00
old_update_period = self . _service . GetUpdatePeriod ( )
if old_update_period != update_period :
self . _service . SetUpdatePeriod ( update_period )
HydrusData . Print (
' Account {} changed the update period to from " {} " to " {} " . ' . format (
request . hydrus_account . GetAccountKey ( ) . hex ( ) ,
HydrusData . TimeDeltaToPrettyTimeDelta ( old_update_period ) ,
HydrusData . TimeDeltaToPrettyTimeDelta ( update_period )
)
)
2021-04-14 21:54:17 +00:00
response_context = HydrusServerResources . ResponseContext ( 200 )
return response_context
2021-04-07 21:26:45 +00:00
class HydrusResourceRestrictedAccountModify ( HydrusResourceRestricted ) :
def _checkAccountPermissions ( self , request : HydrusServerRequest . HydrusRequest ) :
2021-01-20 22:22:03 +00:00
request . hydrus_account . CheckPermission ( HC . CONTENT_TYPE_ACCOUNTS , HC . PERMISSION_ACTION_MODERATE )
2021-04-07 21:26:45 +00:00
class HydrusResourceRestrictedAccountInfo ( HydrusResourceRestrictedAccountModify ) :
def _threadDoGETJob ( self , request : HydrusServerRequest . HydrusRequest ) :
2022-11-23 21:01:41 +00:00
subject_account_key = request . parsed_request_args [ ' subject_account_key ' ]
2018-12-05 22:35:30 +00:00
subject_account = HG . server_controller . Read ( ' account ' , self . _service_key , subject_account_key )
account_info = HG . server_controller . Read ( ' account_info ' , self . _service_key , request . hydrus_account , subject_account )
2015-12-02 22:32:18 +00:00
2021-04-07 21:26:45 +00:00
body = HydrusNetworkVariableHandling . DumpHydrusArgsToNetworkBytes ( { ' account_info ' : account_info } )
2015-12-02 22:32:18 +00:00
2017-03-02 02:14:56 +00:00
response_context = HydrusServerResources . ResponseContext ( 200 , body = body )
2015-12-02 22:32:18 +00:00
return response_context
2022-11-23 21:01:41 +00:00
class HydrusResourceRestrictedAccountKeyFromContent ( HydrusResourceRestrictedAccountModify ) :
2015-12-02 22:32:18 +00:00
2022-11-23 21:01:41 +00:00
def _threadDoGETJob ( self , request : HydrusServerRequest . HydrusRequest ) :
2015-12-02 22:32:18 +00:00
2022-11-23 21:01:41 +00:00
subject_content = request . parsed_request_args [ ' subject_content ' ]
2021-04-07 21:26:45 +00:00
2022-11-23 21:01:41 +00:00
subject_account_key = HG . server_controller . Read ( ' account_key_from_content ' , self . _service_key , subject_content )
2021-04-07 21:26:45 +00:00
2022-11-23 21:01:41 +00:00
body = HydrusNetworkVariableHandling . DumpHydrusArgsToNetworkBytes ( { ' subject_account_key ' : subject_account_key } )
response_context = HydrusServerResources . ResponseContext ( 200 , body = body )
return response_context
class HydrusResourceRestrictedAccountModifyAccountType ( HydrusResourceRestrictedAccountModify ) :
def _threadDoPOSTJob ( self , request : HydrusServerRequest . HydrusRequest ) :
subject_account_key = request . parsed_request_args [ ' subject_account_key ' ]
2021-04-07 21:26:45 +00:00
if ' account_type_key ' not in request . parsed_request_args :
raise HydrusExceptions . BadRequestException ( ' I was expecting an account type key, but did not get one! ' )
account_type_key = request . parsed_request_args [ ' account_type_key ' ]
HG . server_controller . WriteSynchronous ( ' modify_account_account_type ' , self . _service_key , request . hydrus_account , subject_account_key , account_type_key )
response_context = HydrusServerResources . ResponseContext ( 200 )
return response_context
class HydrusResourceRestrictedAccountModifyBan ( HydrusResourceRestrictedAccountModify ) :
def _threadDoPOSTJob ( self , request : HydrusServerRequest . HydrusRequest ) :
2022-11-23 21:01:41 +00:00
subject_account_key = request . parsed_request_args [ ' subject_account_key ' ]
2021-04-07 21:26:45 +00:00
if ' reason ' not in request . parsed_request_args :
raise HydrusExceptions . BadRequestException ( ' I was expecting a reason for the ban, but did not get one! ' )
if ' expires ' not in request . parsed_request_args :
raise HydrusExceptions . BadRequestException ( ' I was expecting a new expiration timestamp, but did not get one! ' )
reason = request . parsed_request_args [ ' reason ' ]
if not isinstance ( reason , str ) :
raise HydrusExceptions . BadRequestException ( ' The given ban reason was not a string! ' )
expires = request . parsed_request_args [ ' expires ' ]
expires_is_none = expires is None
expires_is_positive_integer = isinstance ( expires , int ) and expires > 0
expires_is_valid = expires_is_none or expires_is_positive_integer
if not expires_is_valid :
raise HydrusExceptions . BadRequestException ( ' The given expiration timestamp was not null or an integer! ' )
HG . server_controller . WriteSynchronous ( ' modify_account_ban ' , self . _service_key , request . hydrus_account , subject_account_key , reason , expires )
response_context = HydrusServerResources . ResponseContext ( 200 )
return response_context
class HydrusResourceRestrictedAccountModifyExpires ( HydrusResourceRestrictedAccountModify ) :
def _threadDoPOSTJob ( self , request : HydrusServerRequest . HydrusRequest ) :
2022-11-23 21:01:41 +00:00
if ' subject_account_key ' in request . parsed_request_args :
2021-04-07 21:26:45 +00:00
2022-11-23 21:01:41 +00:00
subject_account_key = request . parsed_request_args [ ' subject_account_key ' ]
2021-04-07 21:26:45 +00:00
2022-11-23 21:01:41 +00:00
elif ' subject_identifier ' in request . parsed_request_args :
2021-04-07 21:26:45 +00:00
2022-11-23 21:01:41 +00:00
subject_identifier = request . parsed_request_args [ ' subject_identifier ' ]
if subject_identifier . HasAccountKey ( ) :
subject_account_key = subject_identifier . GetAccountKey ( )
else :
raise HydrusExceptions . BadRequestException ( ' The subject \' s account identifier did not include an account id! ' )
2021-04-07 21:26:45 +00:00
else :
2022-11-23 21:01:41 +00:00
raise HydrusExceptions . BadRequestException ( ' I was expecting an account id, but did not get one! ' )
2021-04-07 21:26:45 +00:00
if ' expires ' not in request . parsed_request_args :
raise HydrusExceptions . BadRequestException ( ' I was expecting a new expiration timestamp, but did not get one! ' )
expires = request . parsed_request_args [ ' expires ' ]
expires_is_none = expires is None
expires_is_positive_integer = isinstance ( expires , int ) and expires > 0
expires_is_valid = expires_is_none or expires_is_positive_integer
if not expires_is_valid :
raise HydrusExceptions . BadRequestException ( ' The given expiration timestamp was not None or an integer! ' )
HG . server_controller . WriteSynchronous ( ' modify_account_expires ' , self . _service_key , request . hydrus_account , subject_account_key , expires )
response_context = HydrusServerResources . ResponseContext ( 200 )
return response_context
2015-12-02 22:32:18 +00:00
2021-01-20 22:22:03 +00:00
2021-04-07 21:26:45 +00:00
class HydrusResourceRestrictedAccountModifySetMessage ( HydrusResourceRestrictedAccountModify ) :
def _threadDoPOSTJob ( self , request : HydrusServerRequest . HydrusRequest ) :
2022-11-23 21:01:41 +00:00
if ' subject_account_key ' in request . parsed_request_args :
2021-04-07 21:26:45 +00:00
2022-11-23 21:01:41 +00:00
subject_account_key = request . parsed_request_args [ ' subject_account_key ' ]
2021-04-07 21:26:45 +00:00
2022-11-23 21:01:41 +00:00
elif ' subject_identifier ' in request . parsed_request_args :
2021-04-07 21:26:45 +00:00
2022-11-23 21:01:41 +00:00
subject_identifier = request . parsed_request_args [ ' subject_identifier ' ]
if subject_identifier . HasAccountKey ( ) :
subject_account_key = subject_identifier . GetAccountKey ( )
else :
raise HydrusExceptions . BadRequestException ( ' The subject \' s account identifier did not include an account id! ' )
2021-04-07 21:26:45 +00:00
else :
2022-11-23 21:01:41 +00:00
raise HydrusExceptions . BadRequestException ( ' I was expecting an account id, but did not get one! ' )
2021-04-07 21:26:45 +00:00
if ' message ' not in request . parsed_request_args :
raise HydrusExceptions . BadRequestException ( ' I was expecting a new message, but did not get one! ' )
message = request . parsed_request_args [ ' message ' ]
if not isinstance ( message , str ) :
raise HydrusExceptions . BadRequestException ( ' The given message was not a string! ' )
HG . server_controller . WriteSynchronous ( ' modify_account_set_message ' , self . _service_key , request . hydrus_account , subject_account_key , message )
2015-12-02 22:32:18 +00:00
2021-04-07 21:26:45 +00:00
response_context = HydrusServerResources . ResponseContext ( 200 )
return response_context
class HydrusResourceRestrictedAccountModifyUnban ( HydrusResourceRestrictedAccountModify ) :
def _threadDoPOSTJob ( self , request : HydrusServerRequest . HydrusRequest ) :
2022-11-23 21:01:41 +00:00
if ' subject_account_key ' in request . parsed_request_args :
2021-04-07 21:26:45 +00:00
2022-11-23 21:01:41 +00:00
subject_account_key = request . parsed_request_args [ ' subject_account_key ' ]
2021-04-07 21:26:45 +00:00
2022-11-23 21:01:41 +00:00
elif ' subject_identifier ' in request . parsed_request_args :
subject_identifier = request . parsed_request_args [ ' subject_identifier ' ]
2021-04-07 21:26:45 +00:00
2022-11-23 21:01:41 +00:00
if subject_identifier . HasAccountKey ( ) :
subject_account_key = subject_identifier . GetAccountKey ( )
else :
raise HydrusExceptions . BadRequestException ( ' The subject \' s account identifier did not include an account id! ' )
2021-04-07 21:26:45 +00:00
else :
2022-11-23 21:01:41 +00:00
raise HydrusExceptions . BadRequestException ( ' I was expecting an account id, but did not get one! ' )
2021-04-07 21:26:45 +00:00
HG . server_controller . WriteSynchronous ( ' modify_account_unban ' , self . _service_key , request . hydrus_account , subject_account_key )
response_context = HydrusServerResources . ResponseContext ( 200 )
return response_context
class HydrusResourceRestrictedAccountOtherAccount ( HydrusResourceRestrictedAccountModify ) :
def _threadDoGETJob ( self , request : HydrusServerRequest . HydrusRequest ) :
2022-11-23 21:01:41 +00:00
subject_account_key = None
2021-04-07 21:26:45 +00:00
2022-11-23 21:01:41 +00:00
if ' subject_identifier ' in request . parsed_request_args :
2021-04-07 21:26:45 +00:00
2022-11-23 21:01:41 +00:00
subject_identifier = request . parsed_request_args [ ' subject_identifier ' ]
2021-04-07 21:26:45 +00:00
2022-11-23 21:01:41 +00:00
if subject_identifier . HasAccountKey ( ) :
subject_account_key = subject_identifier . GetAccountKey ( )
elif subject_identifier . HasContent ( ) :
subject_content = subject_identifier . GetContent ( )
2021-04-07 21:26:45 +00:00
2022-11-23 21:01:41 +00:00
subject_account_key = HG . server_controller . Read ( ' account_key_from_content ' , self . _service_key , subject_content )
2021-04-07 21:26:45 +00:00
2022-11-23 21:01:41 +00:00
else :
2021-04-07 21:26:45 +00:00
2022-11-23 21:01:41 +00:00
raise HydrusExceptions . BadRequestException ( ' The subject \' s account identifier did not include an account id or content! ' )
2021-04-07 21:26:45 +00:00
2022-11-23 21:01:41 +00:00
if ' subject_account_key ' in request . parsed_request_args :
2021-04-07 21:26:45 +00:00
2022-11-23 21:01:41 +00:00
subject_account_key = request . parsed_request_args [ ' subject_account_key ' ]
2021-04-07 21:26:45 +00:00
2022-11-23 21:01:41 +00:00
if subject_account_key is None :
2021-04-07 21:26:45 +00:00
2022-11-23 21:01:41 +00:00
raise HydrusExceptions . BadRequestException ( ' I was expecting an account id, but did not get one! ' )
2021-04-07 21:26:45 +00:00
2022-11-23 21:01:41 +00:00
try :
subject_account = HG . server_controller . Read ( ' account ' , self . _service_key , subject_account_key )
except HydrusExceptions . InsufficientCredentialsException as e :
raise HydrusExceptions . NotFoundException ( e )
2021-04-07 21:26:45 +00:00
body = HydrusNetworkVariableHandling . DumpHydrusArgsToNetworkBytes ( { ' account ' : subject_account } )
2021-01-20 22:22:03 +00:00
response_context = HydrusServerResources . ResponseContext ( 200 , body = body )
2015-12-02 22:32:18 +00:00
return response_context
2021-04-07 21:26:45 +00:00
class HydrusResourceRestrictedIP ( HydrusResourceRestrictedAccountModify ) :
def _threadDoGETJob ( self , request : HydrusServerRequest . HydrusRequest ) :
2021-01-20 22:22:03 +00:00
2021-04-07 21:26:45 +00:00
hash = request . parsed_request_args [ ' hash ' ]
( ip , timestamp ) = HG . server_controller . Read ( ' ip ' , self . _service_key , request . hydrus_account , hash )
body = HydrusNetworkVariableHandling . DumpHydrusArgsToNetworkBytes ( { ' ip ' : ip , ' timestamp ' : timestamp } )
response_context = HydrusServerResources . ResponseContext ( 200 , body = body )
return response_context
class HydrusResourceRestrictedAllAccounts ( HydrusResourceRestrictedAccountModify ) :
def _threadDoGETJob ( self , request : HydrusServerRequest . HydrusRequest ) :
accounts = HG . server_controller . Read ( ' all_accounts ' , self . _service_key , request . hydrus_account )
body = HydrusNetworkVariableHandling . DumpHydrusArgsToNetworkBytes ( { ' accounts ' : accounts } )
response_context = HydrusServerResources . ResponseContext ( 200 , body = body )
return response_context
2021-01-20 22:22:03 +00:00
2017-03-02 02:14:56 +00:00
class HydrusResourceRestrictedAccountTypes ( HydrusResourceRestricted ) :
2015-12-02 22:32:18 +00:00
2021-04-07 21:26:45 +00:00
def _checkAccountPermissions ( self , request : HydrusServerRequest . HydrusRequest ) :
2021-01-20 22:22:03 +00:00
if request . IsGET ( ) :
request . hydrus_account . CheckPermission ( HC . CONTENT_TYPE_ACCOUNTS , HC . PERMISSION_ACTION_CREATE )
elif request . IsPOST ( ) :
request . hydrus_account . CheckPermission ( HC . CONTENT_TYPE_ACCOUNT_TYPES , HC . PERMISSION_ACTION_MODERATE )
2021-04-07 21:26:45 +00:00
def _threadDoGETJob ( self , request : HydrusServerRequest . HydrusRequest ) :
2015-12-02 22:32:18 +00:00
2017-05-10 21:33:58 +00:00
account_types = HG . server_controller . Read ( ' account_types ' , self . _service_key , request . hydrus_account )
2015-12-02 22:32:18 +00:00
2021-04-07 21:26:45 +00:00
body = HydrusNetworkVariableHandling . DumpHydrusArgsToNetworkBytes ( { ' account_types ' : account_types } )
2015-12-02 22:32:18 +00:00
response_context = HydrusServerResources . ResponseContext ( 200 , body = body )
return response_context
2021-04-07 21:26:45 +00:00
def _threadDoPOSTJob ( self , request : HydrusServerRequest . HydrusRequest ) :
2015-12-02 22:32:18 +00:00
2019-02-27 23:03:30 +00:00
account_types = request . parsed_request_args [ ' account_types ' ]
deletee_account_type_keys_to_new_account_type_keys = request . parsed_request_args [ ' deletee_account_type_keys_to_new_account_type_keys ' ]
2015-12-02 22:32:18 +00:00
2017-05-10 21:33:58 +00:00
HG . server_controller . WriteSynchronous ( ' account_types ' , self . _service_key , request . hydrus_account , account_types , deletee_account_type_keys_to_new_account_type_keys )
2015-12-02 22:32:18 +00:00
2017-12-06 22:06:56 +00:00
HG . server_controller . server_session_manager . RefreshAccounts ( self . _service_key )
2016-07-27 21:53:34 +00:00
2015-12-02 22:32:18 +00:00
response_context = HydrusServerResources . ResponseContext ( 200 )
return response_context
2017-03-02 02:14:56 +00:00
class HydrusResourceRestrictedBackup ( HydrusResourceRestricted ) :
2015-12-02 22:32:18 +00:00
2021-04-07 21:26:45 +00:00
def _checkAccountPermissions ( self , request : HydrusServerRequest . HydrusRequest ) :
2015-12-02 22:32:18 +00:00
2021-01-20 22:22:03 +00:00
request . hydrus_account . CheckPermission ( HC . CONTENT_TYPE_SERVICES , HC . PERMISSION_ACTION_MODERATE )
2021-04-07 21:26:45 +00:00
def _threadDoPOSTJob ( self , request : HydrusServerRequest . HydrusRequest ) :
2015-12-02 22:32:18 +00:00
2019-10-09 22:03:03 +00:00
HG . server_controller . Write ( ' backup ' )
2015-12-02 22:32:18 +00:00
response_context = HydrusServerResources . ResponseContext ( 200 )
return response_context
2019-10-09 22:03:03 +00:00
class HydrusResourceRestrictedLockOn ( HydrusResourceRestricted ) :
2021-04-07 21:26:45 +00:00
def _checkAccountPermissions ( self , request : HydrusServerRequest . HydrusRequest ) :
2019-10-09 22:03:03 +00:00
2021-01-20 22:22:03 +00:00
request . hydrus_account . CheckPermission ( HC . CONTENT_TYPE_SERVICES , HC . PERMISSION_ACTION_MODERATE )
2021-04-07 21:26:45 +00:00
def _threadDoPOSTJob ( self , request : HydrusServerRequest . HydrusRequest ) :
2019-10-09 22:03:03 +00:00
2020-04-01 21:51:42 +00:00
locked = HG . server_busy . acquire ( False ) # pylint: disable=E1111
2019-10-09 22:03:03 +00:00
if not locked :
raise HydrusExceptions . BadRequestException ( ' The server was already locked! ' )
HG . server_controller . db . PauseAndDisconnect ( True )
2021-05-27 00:09:06 +00:00
TIME_BLOCK = 0.25
for i in range ( int ( 5 / TIME_BLOCK ) ) :
if not HG . server_controller . db . IsConnected ( ) :
break
time . sleep ( TIME_BLOCK )
2019-10-09 22:03:03 +00:00
response_context = HydrusServerResources . ResponseContext ( 200 )
return response_context
class HydrusResourceRestrictedLockOff ( HydrusResourceRestricted ) :
BLOCKED_WHEN_BUSY = False
2021-04-07 21:26:45 +00:00
def _checkAccountPermissions ( self , request : HydrusServerRequest . HydrusRequest ) :
2019-10-09 22:03:03 +00:00
2021-01-20 22:22:03 +00:00
request . hydrus_account . CheckPermission ( HC . CONTENT_TYPE_SERVICES , HC . PERMISSION_ACTION_MODERATE )
2021-04-07 21:26:45 +00:00
def _threadDoPOSTJob ( self , request : HydrusServerRequest . HydrusRequest ) :
2019-10-09 22:03:03 +00:00
try :
HG . server_busy . release ( )
except threading . ThreadError :
raise HydrusExceptions . BadRequestException ( ' The server is not busy! ' )
HG . server_controller . db . PauseAndDisconnect ( False )
response_context = HydrusServerResources . ResponseContext ( 200 )
return response_context
2022-08-31 21:19:53 +00:00
class HydrusResourceRestrictedMaintenanceRegenServiceInfo ( HydrusResourceRestricted ) :
def _checkAccountPermissions ( self , request : HydrusServerRequest . HydrusRequest ) :
request . hydrus_account . CheckPermission ( HC . CONTENT_TYPE_OPTIONS , HC . PERMISSION_ACTION_MODERATE )
def _threadDoPOSTJob ( self , request : HydrusServerRequest . HydrusRequest ) :
HG . server_controller . WriteSynchronous ( ' maintenance_regen_service_info ' , self . _service_key )
response_context = HydrusServerResources . ResponseContext ( 200 )
return response_context
2017-03-02 02:14:56 +00:00
class HydrusResourceRestrictedNumPetitions ( HydrusResourceRestricted ) :
2015-12-02 22:32:18 +00:00
2021-04-07 21:26:45 +00:00
def _checkAccountPermissions ( self , request : HydrusServerRequest . HydrusRequest ) :
2021-01-20 22:22:03 +00:00
# further permissions checked in the db
2021-08-18 21:10:01 +00:00
request . hydrus_account . CheckAtLeastOnePermission ( [ ( content_type , HC . PERMISSION_ACTION_MODERATE ) for content_type in HC . SERVICE_TYPES_TO_CONTENT_TYPES [ self . _service . GetServiceType ( ) ] ] )
2021-01-20 22:22:03 +00:00
2021-04-07 21:26:45 +00:00
def _threadDoGETJob ( self , request : HydrusServerRequest . HydrusRequest ) :
2015-12-02 22:32:18 +00:00
2022-11-23 21:01:41 +00:00
subject_account_key = request . parsed_request_args . GetValue ( ' subject_account_key ' , bytes , none_on_missing = True )
petition_count_info = HG . server_controller . Read ( ' num_petitions ' , self . _service_key , request . hydrus_account , subject_account_key = subject_account_key )
2015-12-02 22:32:18 +00:00
2021-04-07 21:26:45 +00:00
body = HydrusNetworkVariableHandling . DumpHydrusArgsToNetworkBytes ( { ' num_petitions ' : petition_count_info } )
response_context = HydrusServerResources . ResponseContext ( 200 , body = body )
return response_context
class HydrusResourceRestrictedPetitionSummaryList ( HydrusResourceRestricted ) :
def _checkAccountPermissions ( self , request : HydrusServerRequest . HydrusRequest ) :
content_type = request . parsed_request_args [ ' content_type ' ]
request . hydrus_account . CheckPermission ( content_type , HC . PERMISSION_ACTION_MODERATE )
def _threadDoGETJob ( self , request : HydrusServerRequest . HydrusRequest ) :
# fetch cached summary list
# ( account_key, reason, size of petition )
petition_summary_list = [ ]
body = HydrusNetworkVariableHandling . DumpHydrusArgsToNetworkBytes ( { ' petition_summary_list ' : petition_summary_list } )
2015-12-02 22:32:18 +00:00
response_context = HydrusServerResources . ResponseContext ( 200 , body = body )
return response_context
2017-03-02 02:14:56 +00:00
class HydrusResourceRestrictedPetition ( HydrusResourceRestricted ) :
2015-12-02 22:32:18 +00:00
2021-04-07 21:26:45 +00:00
def _checkAccountPermissions ( self , request : HydrusServerRequest . HydrusRequest ) :
2021-01-20 22:22:03 +00:00
content_type = request . parsed_request_args [ ' content_type ' ]
request . hydrus_account . CheckPermission ( content_type , HC . PERMISSION_ACTION_MODERATE )
2021-04-07 21:26:45 +00:00
def _threadDoGETJob ( self , request : HydrusServerRequest . HydrusRequest ) :
2015-12-02 22:32:18 +00:00
2022-11-23 21:01:41 +00:00
subject_account_key = request . parsed_request_args . GetValue ( ' subject_account_key ' , bytes , none_on_missing = True )
# add reason to here some time, for when we eventually select petitions from a summary list of ( account, reason, size ) stuff
2019-02-27 23:03:30 +00:00
content_type = request . parsed_request_args [ ' content_type ' ]
status = request . parsed_request_args [ ' status ' ]
2015-12-02 22:32:18 +00:00
2022-11-23 21:01:41 +00:00
petition = HG . server_controller . Read ( ' petition ' , self . _service_key , request . hydrus_account , content_type , status , subject_account_key = subject_account_key )
2015-12-02 22:32:18 +00:00
2021-04-07 21:26:45 +00:00
body = HydrusNetworkVariableHandling . DumpHydrusArgsToNetworkBytes ( { ' petition ' : petition } )
2017-03-02 02:14:56 +00:00
response_context = HydrusServerResources . ResponseContext ( 200 , body = body )
2015-12-02 22:32:18 +00:00
return response_context
2017-03-02 02:14:56 +00:00
class HydrusResourceRestrictedRegistrationKeys ( HydrusResourceRestricted ) :
2015-12-02 22:32:18 +00:00
2021-04-07 21:26:45 +00:00
def _checkAccountPermissions ( self , request : HydrusServerRequest . HydrusRequest ) :
2021-01-20 22:22:03 +00:00
request . hydrus_account . CheckPermission ( HC . CONTENT_TYPE_ACCOUNTS , HC . PERMISSION_ACTION_CREATE )
2021-04-07 21:26:45 +00:00
def _threadDoGETJob ( self , request : HydrusServerRequest . HydrusRequest ) :
2015-12-02 22:32:18 +00:00
2019-02-27 23:03:30 +00:00
num = request . parsed_request_args [ ' num ' ]
account_type_key = request . parsed_request_args [ ' account_type_key ' ]
2017-03-15 20:13:04 +00:00
2019-02-27 23:03:30 +00:00
if ' expires ' in request . parsed_request_args :
2017-03-15 20:13:04 +00:00
2019-02-27 23:03:30 +00:00
expires = request . parsed_request_args [ ' expires ' ]
2017-03-15 20:13:04 +00:00
else :
expires = None
2015-12-02 22:32:18 +00:00
2017-05-10 21:33:58 +00:00
registration_keys = HG . server_controller . Read ( ' registration_keys ' , self . _service_key , request . hydrus_account , num , account_type_key , expires )
2015-12-02 22:32:18 +00:00
2021-04-07 21:26:45 +00:00
body = HydrusNetworkVariableHandling . DumpHydrusArgsToNetworkBytes ( { ' registration_keys ' : registration_keys } )
2015-12-02 22:32:18 +00:00
response_context = HydrusServerResources . ResponseContext ( 200 , body = body )
return response_context
2017-03-02 02:14:56 +00:00
class HydrusResourceRestrictedRepositoryFile ( HydrusResourceRestricted ) :
2015-12-02 22:32:18 +00:00
2021-04-07 21:26:45 +00:00
def _checkAccountPermissions ( self , request : HydrusServerRequest . HydrusRequest ) :
2021-01-20 22:22:03 +00:00
# everyone with a functional account can read files
if request . IsPOST ( ) :
request . hydrus_account . CheckPermission ( HC . CONTENT_TYPE_FILES , HC . PERMISSION_ACTION_CREATE )
2021-04-07 21:26:45 +00:00
def _DecompressionBombsOK ( self , request : HydrusServerRequest . HydrusRequest ) :
2018-06-20 20:20:22 +00:00
2019-07-03 22:49:27 +00:00
if request . hydrus_account is None :
return False
else :
return request . hydrus_account . HasPermission ( HC . CONTENT_TYPE_ACCOUNTS , HC . PERMISSION_ACTION_CREATE )
2018-06-20 20:20:22 +00:00
2021-04-07 21:26:45 +00:00
def _threadDoGETJob ( self , request : HydrusServerRequest . HydrusRequest ) :
2015-12-02 22:32:18 +00:00
2017-03-02 02:14:56 +00:00
self . _checkBandwidth ( request )
# no permission check as any functional account can get files
2019-02-27 23:03:30 +00:00
hash = request . parsed_request_args [ ' hash ' ]
2015-12-02 22:32:18 +00:00
2017-05-10 21:33:58 +00:00
( valid , mime ) = HG . server_controller . Read ( ' service_has_file ' , self . _service_key , hash )
2017-03-02 02:14:56 +00:00
if not valid :
raise HydrusExceptions . NotFoundException ( ' File not found on this service! ' )
2015-12-02 22:32:18 +00:00
2016-06-08 20:27:22 +00:00
path = ServerFiles . GetFilePath ( hash )
2015-12-02 22:32:18 +00:00
2017-03-02 02:14:56 +00:00
response_context = HydrusServerResources . ResponseContext ( 200 , mime = mime , path = path )
2015-12-02 22:32:18 +00:00
return response_context
2021-04-07 21:26:45 +00:00
def _threadDoPOSTJob ( self , request : HydrusServerRequest . HydrusRequest ) :
2015-12-02 22:32:18 +00:00
2019-02-27 23:03:30 +00:00
file_dict = request . parsed_request_args
2015-12-02 22:32:18 +00:00
2017-03-02 02:14:56 +00:00
if self . _service . LogUploaderIPs ( ) :
file_dict [ ' ip ' ] = request . getClientIP ( )
2015-12-02 22:32:18 +00:00
2019-09-18 22:40:39 +00:00
timestamp = self . _service . GetMetadata ( ) . GetNextUpdateBegin ( ) + 1
HG . server_controller . WriteSynchronous ( ' file ' , self . _service , request . hydrus_account , file_dict , timestamp )
2015-12-02 22:32:18 +00:00
response_context = HydrusServerResources . ResponseContext ( 200 )
return response_context
2017-03-02 02:14:56 +00:00
class HydrusResourceRestrictedRepositoryThumbnail ( HydrusResourceRestricted ) :
2015-12-02 22:32:18 +00:00
2021-04-07 21:26:45 +00:00
def _checkAccountPermissions ( self , request : HydrusServerRequest . HydrusRequest ) :
2021-01-20 22:22:03 +00:00
# everyone with a functional account can read thumbs
pass
2021-04-07 21:26:45 +00:00
def _threadDoGETJob ( self , request : HydrusServerRequest . HydrusRequest ) :
2015-12-02 22:32:18 +00:00
2017-03-02 02:14:56 +00:00
self . _checkBandwidth ( request )
2015-12-02 22:32:18 +00:00
2017-03-02 02:14:56 +00:00
# no permission check as any functional account can get thumbnails
2015-12-02 22:32:18 +00:00
2019-02-27 23:03:30 +00:00
hash = request . parsed_request_args [ ' hash ' ]
2015-12-02 22:32:18 +00:00
2017-05-10 21:33:58 +00:00
( valid , mime ) = HG . server_controller . Read ( ' service_has_file ' , self . _service_key , hash )
2015-12-02 22:32:18 +00:00
2017-03-02 02:14:56 +00:00
if not valid :
raise HydrusExceptions . NotFoundException ( ' Thumbnail not found on this service! ' )
2015-12-02 22:32:18 +00:00
2017-03-02 02:14:56 +00:00
if mime not in HC . MIMES_WITH_THUMBNAILS :
raise HydrusExceptions . NotFoundException ( ' That mime should not have a thumbnail! ' )
2015-12-02 22:32:18 +00:00
2017-03-02 02:14:56 +00:00
path = ServerFiles . GetThumbnailPath ( hash )
2015-12-02 22:32:18 +00:00
2017-03-02 02:14:56 +00:00
response_context = HydrusServerResources . ResponseContext ( 200 , mime = HC . APPLICATION_OCTET_STREAM , path = path )
2015-12-02 22:32:18 +00:00
return response_context
2022-08-31 21:19:53 +00:00
class HydrusResourceRestrictedServiceInfo ( HydrusResourceRestricted ) :
def _checkAccountPermissions ( self , request : HydrusServerRequest . HydrusRequest ) :
# you can always fetch the service info
pass
def _threadDoGETJob ( self , request : HydrusServerRequest . HydrusRequest ) :
service_info = HG . server_controller . Read ( ' service_info ' , self . _service_key )
body = HydrusNetworkVariableHandling . DumpHydrusArgsToNetworkBytes ( { ' service_info ' : list ( service_info . items ( ) ) } )
response_context = HydrusServerResources . ResponseContext ( 200 , body = body )
return response_context
2017-03-02 02:14:56 +00:00
class HydrusResourceRestrictedServices ( HydrusResourceRestricted ) :
2015-12-02 22:32:18 +00:00
2021-04-07 21:26:45 +00:00
def _checkAccountPermissions ( self , request : HydrusServerRequest . HydrusRequest ) :
2021-01-20 22:22:03 +00:00
request . hydrus_account . CheckPermission ( HC . CONTENT_TYPE_SERVICES , HC . PERMISSION_ACTION_MODERATE )
2021-04-07 21:26:45 +00:00
def _threadDoGETJob ( self , request : HydrusServerRequest . HydrusRequest ) :
2015-12-02 22:32:18 +00:00
2017-05-10 21:33:58 +00:00
services = HG . server_controller . Read ( ' services_from_account ' , request . hydrus_account )
2015-12-02 22:32:18 +00:00
2021-04-07 21:26:45 +00:00
body = HydrusNetworkVariableHandling . DumpHydrusArgsToNetworkBytes ( { ' services ' : services } )
2015-12-02 22:32:18 +00:00
response_context = HydrusServerResources . ResponseContext ( 200 , body = body )
return response_context
2021-04-07 21:26:45 +00:00
def _threadDoPOSTJob ( self , request : HydrusServerRequest . HydrusRequest ) :
2015-12-02 22:32:18 +00:00
2019-02-27 23:03:30 +00:00
services = request . parsed_request_args [ ' services ' ]
2017-03-02 02:14:56 +00:00
2018-03-28 21:55:58 +00:00
unique_ports = { service . GetPort ( ) for service in services }
if len ( unique_ports ) < len ( services ) :
2019-02-27 23:03:30 +00:00
raise HydrusExceptions . BadRequestException ( ' It looks like some of those services share ports! Please give them unique ports! ' )
2018-03-28 21:55:58 +00:00
2017-05-10 21:33:58 +00:00
with HG . dirty_object_lock :
2017-03-02 02:14:56 +00:00
2017-05-10 21:33:58 +00:00
HG . server_controller . SetServices ( services )
2017-03-02 02:14:56 +00:00
2019-07-24 21:39:02 +00:00
service_keys_to_access_keys = HG . server_controller . WriteSynchronous ( ' services ' , request . hydrus_account , services )
2015-12-02 22:32:18 +00:00
2021-04-07 21:26:45 +00:00
body = HydrusNetworkVariableHandling . DumpHydrusArgsToNetworkBytes ( { ' service_keys_to_access_keys ' : service_keys_to_access_keys } )
2015-12-02 22:32:18 +00:00
response_context = HydrusServerResources . ResponseContext ( 200 , body = body )
return response_context
2017-03-02 02:14:56 +00:00
class HydrusResourceRestrictedUpdate ( HydrusResourceRestricted ) :
2015-12-02 22:32:18 +00:00
2021-04-07 21:26:45 +00:00
def _checkAccountPermissions ( self , request : HydrusServerRequest . HydrusRequest ) :
2021-01-20 22:22:03 +00:00
# everyone with a functional account can read updates
if request . IsPOST ( ) :
# further permissions checked in the db
2021-08-18 21:10:01 +00:00
request . hydrus_account . CheckAtLeastOnePermission ( [ ( content_type , HC . PERMISSION_ACTION_PETITION ) for content_type in HC . SERVICE_TYPES_TO_CONTENT_TYPES [ self . _service . GetServiceType ( ) ] ] )
2021-01-20 22:22:03 +00:00
2021-04-07 21:26:45 +00:00
def _threadDoGETJob ( self , request : HydrusServerRequest . HydrusRequest ) :
2015-12-02 22:32:18 +00:00
2017-03-02 02:14:56 +00:00
self . _checkBandwidth ( request )
2015-12-02 22:32:18 +00:00
2017-03-02 02:14:56 +00:00
# no permissions check as any functional account can get updates
2015-12-02 22:32:18 +00:00
2019-02-27 23:03:30 +00:00
update_hash = request . parsed_request_args [ ' update_hash ' ]
2017-03-02 02:14:56 +00:00
if not self . _service . HasUpdateHash ( update_hash ) :
raise HydrusExceptions . NotFoundException ( ' This update hash does not exist on this service! ' )
path = ServerFiles . GetFilePath ( update_hash )
response_context = HydrusServerResources . ResponseContext ( 200 , mime = HC . APPLICATION_OCTET_STREAM , path = path )
2015-12-02 22:32:18 +00:00
return response_context
2021-04-07 21:26:45 +00:00
def _threadDoPOSTJob ( self , request : HydrusServerRequest . HydrusRequest ) :
2015-12-02 22:32:18 +00:00
2019-02-27 23:03:30 +00:00
client_to_server_update = request . parsed_request_args [ ' client_to_server_update ' ]
2015-12-02 22:32:18 +00:00
2019-09-18 22:40:39 +00:00
timestamp = self . _service . GetMetadata ( ) . GetNextUpdateBegin ( ) + 1
HG . server_controller . WriteSynchronous ( ' update ' , self . _service_key , request . hydrus_account , client_to_server_update , timestamp )
2015-12-02 22:32:18 +00:00
response_context = HydrusServerResources . ResponseContext ( 200 )
return response_context
2017-03-02 02:14:56 +00:00
class HydrusResourceRestrictedImmediateUpdate ( HydrusResourceRestricted ) :
2015-12-02 22:32:18 +00:00
2021-04-07 21:26:45 +00:00
def _checkAccountPermissions ( self , request : HydrusServerRequest . HydrusRequest ) :
2021-01-20 22:22:03 +00:00
2021-08-18 21:10:01 +00:00
request . hydrus_account . CheckAtLeastOnePermission ( [ ( content_type , HC . PERMISSION_ACTION_MODERATE ) for content_type in HC . SERVICE_TYPES_TO_CONTENT_TYPES [ self . _service . GetServiceType ( ) ] ] )
2021-01-20 22:22:03 +00:00
2021-04-07 21:26:45 +00:00
def _threadDoGETJob ( self , request : HydrusServerRequest . HydrusRequest ) :
2015-12-02 22:32:18 +00:00
2017-05-10 21:33:58 +00:00
updates = HG . server_controller . Read ( ' immediate_update ' , self . _service_key , request . hydrus_account )
2015-12-02 22:32:18 +00:00
2017-03-02 02:14:56 +00:00
updates = HydrusSerialisable . SerialisableList ( updates )
2015-12-02 22:32:18 +00:00
2021-04-07 21:26:45 +00:00
body = HydrusNetworkVariableHandling . DumpHydrusArgsToNetworkBytes ( { ' updates ' : updates } )
2017-03-02 02:14:56 +00:00
response_context = HydrusServerResources . ResponseContext ( 200 , body = body )
2015-12-02 22:32:18 +00:00
return response_context
2017-03-02 02:14:56 +00:00
class HydrusResourceRestrictedMetadataUpdate ( HydrusResourceRestricted ) :
2015-12-02 22:32:18 +00:00
2021-04-07 21:26:45 +00:00
def _checkAccountPermissions ( self , request : HydrusServerRequest . HydrusRequest ) :
2015-12-02 22:32:18 +00:00
2021-01-20 22:22:03 +00:00
pass # everyone with a functional account can get metadata slices
2021-04-07 21:26:45 +00:00
def _threadDoGETJob ( self , request : HydrusServerRequest . HydrusRequest ) :
2017-03-02 02:14:56 +00:00
2019-02-27 23:03:30 +00:00
since = request . parsed_request_args [ ' since ' ]
2015-12-02 22:32:18 +00:00
2017-03-02 02:14:56 +00:00
metadata_slice = self . _service . GetMetadataSlice ( since )
2015-12-02 22:32:18 +00:00
2021-04-07 21:26:45 +00:00
body = HydrusNetworkVariableHandling . DumpHydrusArgsToNetworkBytes ( { ' metadata_slice ' : metadata_slice } )
2017-03-02 02:14:56 +00:00
response_context = HydrusServerResources . ResponseContext ( 200 , body = body )
2015-12-02 22:32:18 +00:00
return response_context
2017-01-25 22:56:55 +00:00
2019-10-09 22:03:03 +00:00
class HydrusResourceRestrictedVacuum ( HydrusResourceRestricted ) :
2021-04-07 21:26:45 +00:00
def _checkAccountPermissions ( self , request : HydrusServerRequest . HydrusRequest ) :
2021-01-20 22:22:03 +00:00
request . hydrus_account . CheckPermission ( HC . CONTENT_TYPE_SERVICES , HC . PERMISSION_ACTION_MODERATE )
2019-10-09 22:03:03 +00:00
2021-01-20 22:22:03 +00:00
2021-04-07 21:26:45 +00:00
def _threadDoPOSTJob ( self , request : HydrusServerRequest . HydrusRequest ) :
2019-10-09 22:03:03 +00:00
HG . server_controller . Write ( ' vacuum ' )
response_context = HydrusServerResources . ResponseContext ( 200 )
return response_context