Skip to content

Commit 03cf3a3

Browse files
authored
Merge pull request #5 from securitybunker/sdk-file-api-and-internal-cleanup
Sdk file api and internal cleanup
2 parents af4976c + 9149509 commit 03cf3a3

3 files changed

Lines changed: 137 additions & 50 deletions

File tree

databunkerpro/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,5 @@
55

66
from .api import DatabunkerproAPI
77

8-
__version__ = "0.1.1"
8+
__version__ = "0.1.5"
99
__all__ = ["DatabunkerproAPI"]

databunkerpro/api.py

Lines changed: 135 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
124133
class 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,

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
setup(
77
name="databunkerpro",
8-
version="0.1.4",
8+
version="0.1.5",
99
author="Databunker team",
1010
author_email="hello@databunker.org",
1111
description="Python client library for DatabunkerPro API",

0 commit comments

Comments
 (0)