@@ -121,6 +121,15 @@ class BasicOptions(TypedDict, total=False):
121121 slidingtime : Optional [str ]
122122
123123
124+ class FileOptions (TypedDict , total = False ):
125+ """Options for storing a file."""
126+
127+ mimetype : Optional [str ]
128+ tags : Optional [Union [List [str ], str ]]
129+ finaltime : Optional [str ]
130+ slidingtime : Optional [str ]
131+
132+
124133class TokenOptions (TypedDict , total = False ):
125134 """Options for token operations."""
126135
@@ -493,45 +502,6 @@ def list_user_versions(
493502 }
494503 return self ._make_request ("UserListVersions" , data , request_metadata )
495504
496- # User Authentication
497- def prelogin_user (
498- self ,
499- mode : str ,
500- identity : str ,
501- code : str ,
502- captchacode : str ,
503- request_metadata : Optional [Dict [str , Any ]] = None ,
504- ) -> Dict [str , Any ]:
505- """Perform pre-login operations for a user."""
506- data = {
507- "mode" : mode ,
508- "identity" : identity ,
509- "code" : code ,
510- "captchacode" : captchacode ,
511- }
512- return self ._make_request ("UserPrelogin" , data , request_metadata )
513-
514- def login_user (
515- self ,
516- mode : str ,
517- identity : str ,
518- smscode : str ,
519- request_metadata : Optional [Dict [str , Any ]] = None ,
520- ) -> Dict [str , Any ]:
521- """Log in a user with SMS verification."""
522- data = {
523- "mode" : mode ,
524- "identity" : identity ,
525- "smscode" : smscode ,
526- }
527- return self ._make_request ("UserLogin" , data , request_metadata )
528-
529- def create_captcha (
530- self , request_metadata : Optional [Dict [str , Any ]] = None
531- ) -> Dict [str , Any ]:
532- """Create a captcha for user verification."""
533- return self ._make_request ("CaptchaCreate" , None , request_metadata )
534-
535505 def create_user_x_token (
536506 self ,
537507 mode : str ,
@@ -713,6 +683,132 @@ def list_app_data_versions(
713683 }
714684 return self ._make_request ("AppdataListVersions" , data , request_metadata )
715685
686+ def delete_app_data (
687+ self ,
688+ mode : str ,
689+ identity : str ,
690+ appname : str ,
691+ request_metadata : Optional [Dict [str , Any ]] = None ,
692+ ) -> Dict [str , Any ]:
693+ """Delete application data for a user."""
694+ data = {
695+ "mode" : mode ,
696+ "identity" : identity ,
697+ "appname" : appname ,
698+ }
699+ return self ._make_request ("AppdataDelete" , data , request_metadata )
700+
701+ # File Storage
702+ def create_file (
703+ self ,
704+ mode : str ,
705+ identity : str ,
706+ filename : str ,
707+ filedata : str ,
708+ options : Optional [FileOptions ] = None ,
709+ request_metadata : Optional [Dict [str , Any ]] = None ,
710+ ) -> Dict [str , Any ]:
711+ """Store an encrypted file for a user.
712+
713+ Args:
714+ mode: User identification mode (login, token, email, phone, custom)
715+ identity: User identifier corresponding to the mode
716+ filename: Name of the file
717+ filedata: File content, base64-encoded
718+ options: Optional mimetype, tags, slidingtime, finaltime
719+ request_metadata: Additional metadata to include with the request
720+
721+ Returns:
722+ The stored file information, including its fileuuid
723+ """
724+ data : Dict [str , Any ] = {
725+ "mode" : mode ,
726+ "identity" : identity ,
727+ "filename" : filename ,
728+ "filedata" : filedata ,
729+ }
730+ if options :
731+ for key in ("mimetype" , "tags" , "slidingtime" , "finaltime" ):
732+ if key in options :
733+ data [key ] = options [key ]
734+ return self ._make_request ("FileCreate" , data , request_metadata )
735+
736+ def get_file (
737+ self ,
738+ mode : str ,
739+ identity : str ,
740+ fileuuid : Optional [str ] = None ,
741+ filename : Optional [str ] = None ,
742+ raw : Optional [bool ] = None ,
743+ request_metadata : Optional [Dict [str , Any ]] = None ,
744+ ) -> Dict [str , Any ]:
745+ """Get a user file, selected by fileuuid or filename.
746+
747+ At least one of fileuuid or filename is required. When selecting by
748+ filename, the most recently created file with that name is returned.
749+ """
750+ data : Dict [str , Any ] = {
751+ "mode" : mode ,
752+ "identity" : identity ,
753+ }
754+ if fileuuid is not None :
755+ data ["fileuuid" ] = fileuuid
756+ if filename is not None :
757+ data ["filename" ] = filename
758+ if raw is not None :
759+ data ["raw" ] = raw
760+ return self ._make_request ("FileGet" , data , request_metadata )
761+
762+ def list_user_files (
763+ self ,
764+ mode : str ,
765+ identity : str ,
766+ request_metadata : Optional [Dict [str , Any ]] = None ,
767+ ) -> Dict [str , Any ]:
768+ """List the metadata of all files owned by a user."""
769+ data = {
770+ "mode" : mode ,
771+ "identity" : identity ,
772+ }
773+ return self ._make_request ("FileListUserFiles" , data , request_metadata )
774+
775+ def replace_file_tags (
776+ self ,
777+ mode : str ,
778+ identity : str ,
779+ fileuuid : str ,
780+ tags : Union [List [str ], str ],
781+ request_metadata : Optional [Dict [str , Any ]] = None ,
782+ ) -> Dict [str , Any ]:
783+ """Replace the complete tag set on a file.
784+
785+ The supplied list is authoritative — tags not included are removed.
786+ Tags are lowercased and de-duplicated, must match
787+ ^[a-z0-9][a-z0-9._-]{0,49}$, and at most 16 are kept.
788+ """
789+ data : Dict [str , Any ] = {
790+ "mode" : mode ,
791+ "identity" : identity ,
792+ "fileuuid" : fileuuid ,
793+ "tags" : tags ,
794+ }
795+ return self ._make_request ("FileReplaceTags" , data , request_metadata )
796+
797+ def delete_file (
798+ self ,
799+ mode : str ,
800+ identity : str ,
801+ fileuuid : str ,
802+ request_metadata : Optional [Dict [str , Any ]] = None ,
803+ ) -> Dict [str , Any ]:
804+ """Delete a user file."""
805+ data = {
806+ "mode" : mode ,
807+ "identity" : identity ,
808+ "fileuuid" : fileuuid ,
809+ }
810+ return self ._make_request ("FileDelete" , data , request_metadata )
811+
716812 # Legal Basis Management
717813 def create_legal_basis (
718814 self ,
@@ -1377,15 +1473,6 @@ def bulk_delete_tokens(
13771473 }
13781474 return self ._make_request ("BulkDeleteTokens" , data , request_metadata )
13791475
1380- # System Configuration
1381- def get_ui_conf (self ) -> Dict [str , Any ]:
1382- """Get UI configuration."""
1383- return self ._make_request ("TenantGetUIConf" )
1384-
1385- def get_tenant_conf (self ) -> Dict [str , Any ]:
1386- """Get tenant configuration."""
1387- return self ._make_request ("TenantGetUIConf" )
1388-
13891476 def get_user_html_report (
13901477 self ,
13911478 mode : str ,
0 commit comments