hydrus/hydrus/server/networking/ServerServerResources.py

1264 lines
47 KiB
Python
Raw Normal View History

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
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:
( 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