Skip to content

Commit

Permalink
SM-874: Add a ProjectsClient and address PR comments
Browse files Browse the repository at this point in the history
  • Loading branch information
coltonhurst committed Sep 15, 2023
1 parent 82f0fe1 commit 8c6b527
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 6 deletions.
48 changes: 47 additions & 1 deletion languages/python/BitwardenClient/bitwarden_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from typing import Any, List, Optional
from uuid import UUID
import bitwarden_py
from .schemas import ClientSettings, Command, PasswordLoginRequest, PasswordLoginResponse, ResponseForPasswordLoginResponse, ResponseForSecretIdentifiersResponse, ResponseForSecretResponse, ResponseForSecretsDeleteResponse, ResponseForSyncResponse, ResponseForUserAPIKeyResponse, SecretCreateRequest, SecretGetRequest, SecretIdentifiersRequest, SecretIdentifiersResponse, SecretPutRequest, SecretResponse, SecretVerificationRequest, SecretsCommand, SecretsDeleteRequest, SecretsDeleteResponse, SyncRequest, SyncResponse, UserAPIKeyResponse, AccessTokenLoginRequest, AccessTokenLoginResponse, ResponseForAccessTokenLoginResponse
from .schemas import ClientSettings, Command, PasswordLoginRequest, PasswordLoginResponse, ResponseForPasswordLoginResponse, ResponseForSecretIdentifiersResponse, ResponseForSecretResponse, ResponseForSecretsDeleteResponse, ResponseForSyncResponse, ResponseForUserAPIKeyResponse, SecretCreateRequest, SecretGetRequest, SecretIdentifiersRequest, SecretIdentifiersResponse, SecretPutRequest, SecretResponse, SecretVerificationRequest, SecretsCommand, SecretsDeleteRequest, SecretsDeleteResponse, SyncRequest, SyncResponse, UserAPIKeyResponse, AccessTokenLoginRequest, AccessTokenLoginResponse, ResponseForAccessTokenLoginResponse, ResponseForProjectResponse, ProjectsCommand, ProjectCreateRequest, ProjectGetRequest, ProjectPutRequest, ProjectsListRequest, ResponseForProjectsResponse, ResponseForProjectsDeleteResponse, ProjectsDeleteRequest

class BitwardenClient:
def __init__(self, settings: ClientSettings = None):
Expand Down Expand Up @@ -40,6 +40,9 @@ def sync(self, exclude_subdomains: bool = False) -> ResponseForSyncResponse:
def secrets(self):
return SecretsClient(self)

def projects(self):
return ProjectsClient(self)

def _run_command(self, command: Command) -> Any:
response_json = self.inner.run_command(json.dumps(command.to_dict()))
return json.loads(response_json)
Expand Down Expand Up @@ -91,3 +94,46 @@ def delete(self, ids: List[str]) -> ResponseForSecretsDeleteResponse:
Command(secrets=SecretsCommand(delete=SecretsDeleteRequest(ids)))
)
return ResponseForSecretsDeleteResponse.from_dict(result)

class ProjectsClient:
def __init__(self, client: BitwardenClient):
self.client = client

def get(self, id: str) -> ResponseForProjectResponse:
result = self.client._run_command(
Command(projects=ProjectsCommand(get=ProjectGetRequest(id)))
)
return ResponseForProjectResponse.from_dict(result)

def create(self,
name: str,
organization_id: str,
) -> ResponseForProjectResponse:
result = self.client._run_command(
Command(projects=ProjectsCommand(
create=ProjectCreateRequest(name, organization_id)))
)
return ResponseForProjectResponse.from_dict(result)

def list(self, organization_id: str) -> ResponseForProjectsResponse:
result = self.client._run_command(
Command(projects=ProjectsCommand(
list=ProjectsListRequest(organization_id)))
)
return ResponseForProjectsResponse.from_dict(result)

def update(self, id: str,
name: str,
organization_id: str,
) -> ResponseForProjectResponse:
result = self.client._run_command(
Command(projects=ProjectsCommand(update=ProjectPutRequest(
id, name, organization_id)))
)
return ResponseForProjectResponse.from_dict(result)

def delete(self, ids: List[str]) -> ResponseForProjectsDeleteResponse:
result = self.client._run_command(
Command(projects=ProjectsCommand(delete=ProjectsDeleteRequest(ids)))
)
return ResponseForProjectsDeleteResponse.from_dict(result)
35 changes: 30 additions & 5 deletions languages/python/login.py
Original file line number Diff line number Diff line change
@@ -1,21 +1,46 @@
import json
import logging
from BitwardenClient.bitwarden_client import BitwardenClient
from BitwardenClient.schemas import client_settings_from_dict
from BitwardenClient.schemas import client_settings_from_dict, DeviceType

# Create the BitwardenClient, which is used to interact with the SDK
client = BitwardenClient(client_settings_from_dict({
"apiUrl": "http://localhost:4000",
"deviceType": "SDK",
"deviceType": DeviceType.SDK,
"identityUrl": "http://localhost:33656",
"userAgent": "Python",
}))

# Add some logging & set the org id
logging.basicConfig(level=logging.DEBUG)
organization_id = "org_id_here"

result = client.access_token_login("access token here")
# Attempt to authenticate with the Secrets Manager Access Token
result = client.access_token_login("access_token_here")

secret = client.secrets().create("TEST_SECRET", "This is a test secret", "organization id here", "Secret1234!", ["project id here"])
if result.success == False:
sys.exit(result.error_message)

input("Press Enter to delete the secret...")
# -- Example Project Commands --

project = client.projects().create("ProjectName", organization_id)
project2 = client.projects().create("Project - Don't Delete Me!", organization_id)
updated_project = client.projects().update(project.data.id, "Cool New Project Name", organization_id)
get_that_project = client.projects().get(project.data.id)

input("Press Enter to delete the project...")
client.projects().delete([project.data.id])

print(client.projects().list(organization_id))

# -- Example Secret Commands --

secret = client.secrets().create("TEST_SECRET", "This is a test secret", organization_id, "Secret1234!", [project2.data.id])
secret2 = client.secrets().create("Secret - Don't Delete Me!", "This is a test secret that will stay", organization_id, "Secret1234!", [project2.data.id])
secret_updated = client.secrets().update(secret.data.id, "TEST_SECRET_UPDATED", "This as an updated test secret", organization_id, "Secret1234!_updated", [project2.data.id])
secret_retrieved = client.secrets().get([secret.data.id])

input("Press Enter to delete the secret...")
client.secrets().delete([secret.data.id])

print(client.secrets().list(organization_id))

0 comments on commit 8c6b527

Please sign in to comment.