hydrus/include/ServerServerResources.py

623 lines
20 KiB
Python
Raw Normal View History

2019-01-09 22:59:03 +00:00
import http.cookies
from . import HydrusConstants as HC
from . import HydrusData
from . import HydrusExceptions
from . import HydrusGlobals as HG
from . import HydrusNetwork
2019-02-06 22:41:35 +00:00
from . import HydrusPaths
2019-01-09 22:59:03 +00:00
from . import HydrusSerialisable
from . import HydrusServerResources
from . import ServerFiles
2015-12-02 22:32:18 +00:00
class HydrusResourceBusyCheck( HydrusServerResources.Resource ):
def __init__( self ):
HydrusServerResources.Resource.__init__( self )
self._server_version_string = HC.service_string_lookup[ HC.SERVER_ADMIN ] + '/' + str( HC.NETWORK_VERSION )
def render_GET( self, request ):
request.setResponseCode( 200 )
request.setHeader( 'Server', self._server_version_string )
2019-02-06 22:41:35 +00:00
if HG.server_busy:
return b'1'
else:
return b'0'
class HydrusResourceHydrusNetwork( HydrusServerResources.HydrusResource ):
def _callbackParseGETArgs( self, request ):
hydrus_args = HydrusNetwork.ParseHydrusNetworkGETArgs( request.args )
request.hydrus_args = hydrus_args
return request
def _callbackParsePOSTArgs( self, request ):
request.content.seek( 0 )
if not request.requestHeaders.hasHeader( 'Content-Type' ):
hydrus_args = {}
else:
content_types = request.requestHeaders.getRawHeaders( 'Content-Type' )
content_type = content_types[0]
try:
mime = HC.mime_enum_lookup[ content_type ]
except:
raise HydrusExceptions.InsufficientCredentialsException( 'Did not recognise Content-Type header!' )
total_bytes_read = 0
if mime == HC.APPLICATION_JSON:
json_string = request.content.read()
total_bytes_read += len( json_string )
hydrus_args = HydrusNetwork.ParseNetworkBytesToHydrusArgs( json_string )
else:
( os_file_handle, temp_path ) = HydrusPaths.GetTempPath()
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 )
hydrus_args = HydrusServerResources.ParseFileArguments( temp_path, decompression_bombs_ok )
self._reportDataUsed( request, total_bytes_read )
request.hydrus_args = hydrus_args
return request
2015-12-02 22:32:18 +00:00
2019-02-06 22:41:35 +00:00
class HydrusResourceAccessKey( HydrusResourceHydrusNetwork ):
2015-12-02 22:32:18 +00:00
def _threadDoGETJob( self, request ):
2017-03-02 02:14:56 +00:00
registration_key = request.hydrus_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
2019-01-09 22:59:03 +00:00
body = HydrusNetwork.DumpHydrusArgsToNetworkBytes( { 'access_key' : access_key } )
2015-12-02 22:32:18 +00:00
response_context = HydrusServerResources.ResponseContext( 200, body = body )
return response_context
2019-02-06 22:41:35 +00:00
class HydrusResourceShutdown( HydrusResourceHydrusNetwork ):
2015-12-02 22:32:18 +00:00
def _threadDoPOSTJob( self, request ):
2017-05-10 21:33:58 +00:00
HG.server_controller.ShutdownFromServer()
2015-12-02 22:32:18 +00:00
response_context = HydrusServerResources.ResponseContext( 200 )
return response_context
2019-02-06 22:41:35 +00:00
class HydrusResourceAccessKeyVerification( HydrusResourceHydrusNetwork ):
2015-12-02 22:32:18 +00:00
def _threadDoGETJob( self, request ):
2019-02-06 22:41:35 +00:00
access_key = self._parseHydrusNetworkAccessKey( request )
2015-12-02 22:32:18 +00:00
2017-05-10 21:33:58 +00:00
verified = HG.server_controller.Read( 'verify_access_key', self._service_key, access_key )
2015-12-02 22:32:18 +00:00
2019-01-09 22:59:03 +00:00
body = HydrusNetwork.DumpHydrusArgsToNetworkBytes( { 'verified' : verified } )
2015-12-02 22:32:18 +00:00
response_context = HydrusServerResources.ResponseContext( 200, body = body )
return response_context
2019-02-06 22:41:35 +00:00
class HydrusResourceSessionKey( HydrusResourceHydrusNetwork ):
2015-12-02 22:32:18 +00:00
def _threadDoGETJob( self, request ):
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-01-09 22:59:03 +00:00
cookies = [ ( 'session_key', session_key.hex(), { 'max_age' : 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
def _callbackCheckRestrictions( self, request ):
2019-02-06 22:41:35 +00:00
HydrusResourceHydrusNetwork._callbackCheckRestrictions( self, request )
2015-12-02 22:32:18 +00:00
self._checkSession( request )
2017-03-02 02:14:56 +00:00
self._checkAccount( request )
2015-12-02 22:32:18 +00:00
return request
2017-03-02 02:14:56 +00:00
def _checkAccount( self, request ):
2015-12-02 22:32:18 +00:00
2017-03-02 02:14:56 +00:00
request.hydrus_account.CheckFunctional()
2015-12-02 22:32:18 +00:00
2017-03-02 02:14:56 +00:00
return request
2015-12-02 22:32:18 +00:00
2017-03-02 02:14:56 +00:00
def _checkBandwidth( self, request ):
2015-12-02 22:32:18 +00:00
2017-06-07 22:05:15 +00:00
if not self._service.BandwidthOK():
2017-03-02 02:14:56 +00:00
raise HydrusExceptions.BandwidthException( 'This service has run out of bandwidth. Please try again later.' )
2015-12-02 22:32:18 +00:00
2017-06-07 22:05:15 +00:00
if not HG.server_controller.ServerBandwidthOK():
2017-03-02 02:14:56 +00:00
raise HydrusExceptions.BandwidthException( 'This server has run out of bandwidth. Please try again later.' )
2015-12-02 22:32:18 +00:00
def _checkSession( self, request ):
2017-03-02 02:14:56 +00:00
if not request.requestHeaders.hasHeader( 'Cookie' ):
2019-02-06 22:41:35 +00:00
raise HydrusExceptions.MissingCredentialsException( 'No cookies found!' )
2017-03-02 02:14:56 +00:00
2015-12-02 22:32:18 +00:00
cookie_texts = request.requestHeaders.getRawHeaders( 'Cookie' )
cookie_text = cookie_texts[0]
try:
2019-01-09 22:59:03 +00:00
cookies = http.cookies.SimpleCookie( cookie_text )
2015-12-02 22:32:18 +00:00
2017-03-02 02:14:56 +00:00
if 'session_key' not in cookies:
session_key = None
else:
2019-01-09 22:59:03 +00:00
# Morsel, for real, ha ha ha
morsel = cookies[ 'session_key' ]
session_key_hex = morsel.value
session_key = bytes.fromhex( session_key_hex )
2017-03-02 02:14:56 +00:00
except:
raise Exception( 'Problem parsing cookies!' )
2015-12-02 22:32:18 +00:00
2017-12-06 22:06:56 +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
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 )
def _reportRequestUsed( self, request ):
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
2017-03-02 02:14:56 +00:00
def _checkAccount( self, request ):
# 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
def _threadDoGETJob( self, request ):
account = request.hydrus_account
2019-01-09 22:59:03 +00:00
body = HydrusNetwork.DumpHydrusArgsToNetworkBytes( { 'account' : account } )
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 HydrusResourceRestrictedAccountInfo( HydrusResourceRestricted ):
def _threadDoGETJob( self, request ):
2015-12-02 22:32:18 +00:00
2017-03-02 02:14:56 +00:00
subject_identifier = request.hydrus_args[ 'subject_identifier' ]
2015-12-02 22:32:18 +00:00
2018-12-05 22:35:30 +00:00
if subject_identifier.HasAccountKey():
subject_account_key = subject_identifier.GetData()
else:
2019-02-06 22:41:35 +00:00
raise HydrusExceptions.MissingCredentialsException( 'I was expecting an account key, but did not get one!' )
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
2019-01-09 22:59:03 +00:00
body = HydrusNetwork.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
2017-03-02 02:14:56 +00:00
class HydrusResourceRestrictedAccountModification( HydrusResourceRestricted ):
2015-12-02 22:32:18 +00:00
2017-03-02 02:14:56 +00:00
def _threadDoPOSTJob( self, request ):
2015-12-02 22:32:18 +00:00
2017-03-02 02:14:56 +00:00
action = request.hydrus_args[ 'action' ]
2015-12-02 22:32:18 +00:00
2017-03-02 02:14:56 +00:00
subject_accounts = request.hydrus_args[ 'accounts' ]
2015-12-02 22:32:18 +00:00
2017-03-02 02:14:56 +00:00
kwargs = request.hydrus_args # for things like expires, title, and so on
2015-12-02 22:32:18 +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.WriteSynchronous( 'account_modification', self._service_key, request.hydrus_account, action, subject_accounts, **kwargs )
2017-03-02 02:14:56 +00:00
2017-12-06 22:06:56 +00:00
HG.server_controller.server_session_manager.UpdateAccounts( self._service_key, subject_accounts )
2017-03-02 02:14:56 +00:00
2015-12-02 22:32:18 +00:00
2017-03-02 02:14:56 +00:00
response_context = HydrusServerResources.ResponseContext( 200 )
2015-12-02 22:32:18 +00:00
return response_context
2017-03-02 02:14:56 +00:00
class HydrusResourceRestrictedAccountTypes( HydrusResourceRestricted ):
2015-12-02 22:32:18 +00:00
def _threadDoGETJob( self, request ):
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
2019-01-09 22:59:03 +00:00
body = HydrusNetwork.DumpHydrusArgsToNetworkBytes( { 'account_types' : account_types } )
2015-12-02 22:32:18 +00:00
response_context = HydrusServerResources.ResponseContext( 200, body = body )
return response_context
def _threadDoPOSTJob( self, request ):
2017-03-02 02:14:56 +00:00
account_types = request.hydrus_args[ 'account_types' ]
deletee_account_type_keys_to_new_account_type_keys = request.hydrus_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
def _threadDoPOSTJob( self, request ):
2017-03-02 02:14:56 +00:00
# check permission here since this is an asynchronous job
request.hydrus_account.CheckPermission( HC.CONTENT_TYPE_SERVICES, HC.PERMISSION_ACTION_OVERRULE )
2015-12-02 22:32:18 +00:00
2017-05-10 21:33:58 +00:00
HG.server_controller.Write( 'backup' )
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 HydrusResourceRestrictedIP( HydrusResourceRestricted ):
2015-12-02 22:32:18 +00:00
def _threadDoGETJob( self, request ):
hash = request.hydrus_args[ 'hash' ]
2017-05-10 21:33:58 +00:00
( ip, timestamp ) = HG.server_controller.Read( 'ip', self._service_key, request.hydrus_account, hash )
2015-12-02 22:32:18 +00:00
2019-01-09 22:59:03 +00:00
body = HydrusNetwork.DumpHydrusArgsToNetworkBytes( { 'ip' : ip, 'timestamp' : timestamp } )
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 HydrusResourceRestrictedNumPetitions( HydrusResourceRestricted ):
2015-12-02 22:32:18 +00:00
def _threadDoGETJob( self, request ):
2017-05-10 21:33:58 +00:00
petition_count_info = HG.server_controller.Read( 'num_petitions', self._service_key, request.hydrus_account )
2015-12-02 22:32:18 +00:00
2019-01-09 22:59:03 +00:00
body = HydrusNetwork.DumpHydrusArgsToNetworkBytes( { 'num_petitions' : petition_count_info } )
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
def _threadDoGETJob( self, request ):
2017-03-15 20:13:04 +00:00
content_type = request.hydrus_args[ 'content_type' ]
status = request.hydrus_args[ 'status' ]
2015-12-02 22:32:18 +00:00
2017-05-10 21:33:58 +00:00
petition = HG.server_controller.Read( 'petition', self._service_key, request.hydrus_account, content_type, status )
2015-12-02 22:32:18 +00:00
2019-01-09 22:59:03 +00:00
body = HydrusNetwork.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
def _threadDoGETJob( self, request ):
num = request.hydrus_args[ 'num' ]
2017-03-02 02:14:56 +00:00
account_type_key = request.hydrus_args[ 'account_type_key' ]
2017-03-15 20:13:04 +00:00
if 'expires' in request.hydrus_args:
expires = request.hydrus_args[ 'expires' ]
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
2019-01-09 22:59:03 +00:00
body = HydrusNetwork.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
2018-06-20 20:20:22 +00:00
def _DecompressionBombsOK( self, request ):
return request.hydrus_account.HasPermission( HC.CONTENT_TYPE_ACCOUNTS, HC.PERMISSION_ACTION_CREATE )
2015-12-02 22:32:18 +00:00
def _threadDoGETJob( self, request ):
2017-03-02 02:14:56 +00:00
self._checkBandwidth( request )
# no permission check as any functional account can get files
2015-12-02 22:32:18 +00:00
hash = request.hydrus_args[ 'hash' ]
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
def _threadDoPOSTJob( self, request ):
file_dict = request.hydrus_args
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
2017-05-10 21:33:58 +00:00
HG.server_controller.WriteSynchronous( 'file', self._service, request.hydrus_account, file_dict )
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
def _threadDoGETJob( self, request ):
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
2017-03-02 02:14:56 +00:00
hash = request.hydrus_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
2017-03-02 02:14:56 +00:00
class HydrusResourceRestrictedServices( HydrusResourceRestricted ):
2015-12-02 22:32:18 +00:00
def _threadDoGETJob( self, request ):
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
2019-01-09 22:59:03 +00:00
body = HydrusNetwork.DumpHydrusArgsToNetworkBytes( { 'services' : services } )
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
def _threadDoPOSTJob( self, request ):
2015-12-02 22:32:18 +00:00
2017-03-02 02:14:56 +00:00
services = request.hydrus_args[ 'services' ]
2018-03-28 21:55:58 +00:00
unique_ports = { service.GetPort() for service in services }
if len( unique_ports ) < len( services ):
2019-02-06 22:41:35 +00:00
raise HydrusExceptions.InsufficientCredentialsException( '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
service_keys_to_access_keys = HG.server_controller.WriteSynchronous( 'services', request.hydrus_account, services )
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
2015-12-02 22:32:18 +00:00
2019-01-09 22:59:03 +00:00
body = HydrusNetwork.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
def _threadDoGETJob( self, request ):
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
2017-03-02 02:14:56 +00:00
update_hash = request.hydrus_args[ 'update_hash' ]
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
def _threadDoPOSTJob( self, request ):
2017-03-02 02:14:56 +00:00
client_to_server_update = request.hydrus_args[ 'client_to_server_update' ]
2015-12-02 22:32:18 +00:00
2017-05-10 21:33:58 +00:00
HG.server_controller.WriteSynchronous( 'update', self._service_key, request.hydrus_account, client_to_server_update )
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
def _threadDoGETJob( self, request ):
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
2019-01-09 22:59:03 +00:00
body = HydrusNetwork.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
def _threadDoGETJob( self, request ):
2017-03-02 02:14:56 +00:00
# no permissions check as any functional account can get metadata slices
since = request.hydrus_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
2019-01-09 22:59:03 +00:00
body = HydrusNetwork.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