Coverage for src/couchers/servicers/media.py: 96%

Shortcuts on this page

r m x   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

24 statements  

1import logging 

2 

3import grpc 

4from google.protobuf import empty_pb2 

5 

6from couchers.crypto import secure_compare 

7from couchers.db import session_scope 

8from couchers.interceptors import ManualAuthValidatorInterceptor 

9from couchers.models import InitiatedUpload, Upload 

10from couchers.sql import couchers_select as select 

11from proto import media_pb2_grpc 

12 

13logger = logging.getLogger(__name__) 

14 

15 

16def get_media_auth_interceptor(secret_token): 

17 def is_authorized(token): 

18 return secure_compare(token.encode("ascii"), secret_token.encode("ascii")) 

19 

20 return ManualAuthValidatorInterceptor(is_authorized) 

21 

22 

23class Media(media_pb2_grpc.MediaServicer): 

24 def UploadConfirmation(self, request, context): 

25 with session_scope() as session: 

26 initiated_upload = session.execute( 

27 select(InitiatedUpload).where(InitiatedUpload.key == request.key).where(InitiatedUpload.is_valid) 

28 ).scalar_one_or_none() 

29 

30 if not initiated_upload: 

31 context.abort(grpc.StatusCode.NOT_FOUND, "Upload not found.") 

32 

33 # move it to a completed upload 

34 upload = Upload( 

35 key=request.key, 

36 filename=request.filename, 

37 creator_user_id=initiated_upload.initiator_user_id, 

38 ) 

39 session.add(upload) 

40 

41 # delete the old upload 

42 session.delete(initiated_upload) 

43 

44 return empty_pb2.Empty()