88from ...common import Object , DateTimeUtils
99from ...core .enum import ProtectionLevel , CollaboratorType , SearchType , PortalAccountType , FileAccessMode , \
1010 UploadError , ResourceScope , ResourceError , Context , Administrators
11- from ...core .types import PortalAccount , UserAccount , GroupAccount , Collaborator
11+ from ...core .types import PortalAccount , UserAccount , GroupAccount , Collaborator , PortalInvitation
1212from ... import exceptions
1313from ...lib .storage import synfs , asynfs , commonfs
1414from .types import SrcDstParam , CreateShareParam , ActionResourcesParam , FetchResourcesError , \
@@ -47,15 +47,16 @@ def ensure_user_access(user_session, path):
4747 The target path to validate.
4848 """
4949 relative = path .relative
50- if user_session .account .role .name in Administrators :
51- if user_session .context == Context .admin :
52- if not administrator_namespace (path ):
53- return False , exceptions .io .core .ContextError (relative )
54- if not user_session .account .role .access_end_user_folders and is_password_protected (path ):
55- return False , exceptions .io .core .PrivilegeError (relative )
56- elif user_session .context == Context .ServicesPortal :
57- if not user_session .account .role .access_end_user_folders and is_password_protected (path ):
58- return False , exceptions .io .core .PrivilegeError (relative )
50+ if not user_session .context == Context .Invitations :
51+ if user_session .account .role .name in Administrators :
52+ if user_session .context == Context .admin :
53+ if not administrator_namespace (path ):
54+ return False , exceptions .io .core .ContextError (relative )
55+ if not user_session .account .role .access_end_user_folders and is_password_protected (path ):
56+ return False , exceptions .io .core .PrivilegeError (relative )
57+ elif user_session .context == Context .ServicesPortal :
58+ if not user_session .account .role .access_end_user_folders and is_password_protected (path ):
59+ return False , exceptions .io .core .PrivilegeError (relative )
5960 return True , None
6061
6162
@@ -412,7 +413,7 @@ class OpenMany(PortalCommand):
412413
413414 def __init__ (self , function , receiver , resource , directory , * objects ):
414415 super ().__init__ (function , receiver )
415- self .uid = str (resource .cloudFolderInfo .uid )
416+ self .uid = str (resource .cloudFolderInfo .uid ) if receiver . context != Context . Invitations else f'share/ { receiver . invite } '
416417 self .directory = automatic_resolution (directory , receiver .context )
417418 self .objects = objects
418419
@@ -589,7 +590,6 @@ def _generator(self):
589590 def generate (self ):
590591 for path in self ._generator ():
591592 try :
592- print ('Enumerating: ' , path or '.' )
593593 for o in ResourceIterator (self ._function , self ._receiver , path , None , self .include_deleted , None , None ).execute ():
594594 yield self ._process_object (o )
595595 except (exceptions .io .core .ListDirectoryError , exceptions .io .core .PrivilegeError ) as e :
@@ -605,7 +605,7 @@ async def a_generate(self):
605605
606606 def _process_object (self , o ):
607607 if o .is_dir :
608- self .tree .append (o .path . relative )
608+ self .tree .append (o .path )
609609 return o
610610
611611 @staticmethod
@@ -668,7 +668,7 @@ def _parents_generator(self):
668668 if self .parents :
669669 parts = self .path .parts
670670 for i in range (1 , len (parts )):
671- yield automatic_resolution ( '/' . join ( parts [:i ]), self . _receiver . context )
671+ yield self . path [:i ]
672672 else :
673673 yield self .path
674674
@@ -712,7 +712,7 @@ def _handle_response(self, r):
712712 if r == ResourceError .InvalidName :
713713 cause = exceptions .io .core .FilenameError (path )
714714 if r == ResourceError .PermissionDenied :
715- cause = exceptions .io .core .ReservedNameError (path )
715+ cause = exceptions .io .core .PrivilegeError (path )
716716
717717 raise error from cause
718718
@@ -745,6 +745,36 @@ def _handle_exception(self, e):
745745 raise exceptions .io .core .GetShareMetadataError (path ) from e
746746
747747
748+ class GetExternalShareInfo (PortalCommand ):
749+
750+ def __init__ (self , function , receiver , invite ):
751+ super ().__init__ (function , receiver )
752+ self .invite = invite
753+
754+ def _before_command (self ):
755+ logger .info ('Querying external share details: %s' , self .invite )
756+
757+ def get_parameter (self ):
758+ return self .invite
759+
760+ def _execute (self ):
761+ with self .trace_execution ():
762+ return self ._function (self ._receiver , self .get_parameter ())
763+
764+ async def _a_execute (self ):
765+ with self .trace_execution ():
766+ return await self ._function (self ._receiver , self .get_parameter ())
767+
768+ def _handle_response (self , r ):
769+ return PortalInvitation .from_server_object (r )
770+
771+ def _handle_exception (self , e ):
772+ error = exceptions .io .core .ExternalShareError (self ._receiver .uri )
773+ if 'no longer valid' in e .error .response .error .msg :
774+ raise error from exceptions .io .core .InvalidShareError (self .invite )
775+ raise error
776+
777+
748778class Link (PortalCommand ):
749779
750780 def __init__ (self , function , receiver , path , access , expire_in ):
0 commit comments