Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 8 additions & 9 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,12 +4,12 @@

$git clone https://github.com/Pitenager/passbolt-python-api.git
$cd passbolt-python-api.git/
$pip install passbolt-python-api
$pip install passbolt-python-api

## Dependencies

- Python3
- GPG (also known as GnuPG) software
- Python3
- GPG (also known as GnuPG) software

## Configuration

Expand All@@ -23,8 +23,8 @@ Fill the config.ini file with the following contents.
USER_PRIVATE_KEY_FILE = <optional: passbolt_private.asc>
PASSPHRASE = <passbolt_password>


## CLI usage

usage: passbolt_manager.py [-h] [-c CHANGE] [-u UPLOAD] [-d DELETE] [-r READ]

Client to operate Stratio's Passbolt server
Expand All@@ -40,11 +40,11 @@ Fill the config.ini file with the following contents.

>>>import passboltapi
>>>passbolt = passboltapi.PassboltAPI(config_path="config.ini")

# Now you may do any get, post, put and delete request.
>>>r = passbolt.get(url="/resources.json?api-version=v2")
>>>r = passbolt.post(self.server_url + url, json=data)

# One can also use it as context manager
>>>with passboltapi.PassboltAPI(config_path="config.ini") as passbolt:

Expand All@@ -57,19 +57,18 @@ To import new keys:

>>>import passboltapi
>>>passbolt = passboltapi.PassboltAPI(config_path="config.ini", new_keys=True)

To delete old keys and import only the new ones.

>>>import passboltapi
>>>passbolt = passboltapi.PassboltAPI(config_path="config.ini", new_keys=True, delete_old_keys=True)

Recommended to do: Do not keep private and public files.
Recommended to do: Do not keep private and public files.
Rather just import them using gpg command one time and delete those files.

$gpg --import public.asc
$gpg --batch --import private.asc


### Passbolt API

For more API related questions, visit Passbolt API documentation:
Expand Down
133 changes: 90 additions & 43 deletions passbolt_manager.py
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
import passboltapi
from colorama import Fore, init
import sys
import time
import argparse
import string
import random
import string
import sys
import time

from colorama import Fore, init

import passboltapi


def banner():
Expand All@@ -27,76 +29,85 @@ def banner():

def login():
try:
print(Fore.CYAN + "[*] Trying to authenticate against Passbolt server...")
print(Fore.CYAN +
"[*] Trying to authenticate against Passbolt server...")

passbolt = passboltapi.PassboltAPI(config_path="config.ini", new_keys=True, delete_old_keys=True)
uuid = passbolt.get(url="/resources.json?api-version=v2")["header"]["id"]
passbolt = passboltapi.PassboltAPI(config_path="config.ini",
new_keys=True,
delete_old_keys=True)
uuid = passbolt.get(
url="/resources.json?api-version=v2")["header"]["id"]

print(Fore.GREEN + "[-] Authenticated")
return passbolt,uuid
return passbolt,uuid

except Exception as e:
print(Fore.RED + "[!] Error: " + str(e))
sys.exit(1)


def generate_password():
try:
print(Fore.CYAN + "[*] Generating random password...")

#Create alphanumerical from string constants
printable = f'{string.ascii_letters}{string.digits}{string.punctuation}'
#Create alphanumerical from string constants
printable = f"{string.ascii_letters}{string.digits}{string.punctuation}"

#Convert printable from string to list and shuffle
#Convert printable from string to list and shuffle
printable = list(printable)
random.shuffle(printable)

#Generate random password and convert to string
#Generate random password and convert to string
random_password = random.choices(printable, k=16)
random_password = ''.join(random_password)
random_password = "".join(random_password)

return random_password

except Exception as e:
print(Fore.RED + "[!] Error: " + str(e))
sys.exit(1)

def read(passbolt,name):

def read(passbolt, name):
try:
print(Fore.CYAN + f"[*] Reading resource {name}...")

for i in passbolt.get(url="/resources.json?api-version=v2")["body"]:
if i["name"] == name:
resource = passbolt.get("/secrets/resource/{}.json?api-version=v2".format(i["id"]))
resource = passbolt.get(
"/secrets/resource/{}.json?api-version=v2".format(i["id"]))
i["password"] = passbolt.decrypt(resource["body"]["data"])
print(i)
break

except Exception as e:
print(Fore.RED + "[!] Error: " + str(e))
sys.exit(1)

def upload(passbolt,uuid,name):

def upload(passbolt, uuid, name):
try:
pwd = generate_password()
encrypted_pass = passbolt.encrypt(pwd)

json_data = {
json_data = {
"name": name,
"description": f"(Automated) {name} password",
"secrets": [{
"user_id": uuid,
"data": encrypted_pass
}]
}],
}

print(Fore.CYAN + "[*] Uploading new password...")
passbolt.post(url="/resources.json?api-version=v2",data=json_data)
passbolt.post(url="/resources.json?api-version=v2",data=json_data)
print(Fore.GREEN + "[-] Password uploaded")

except Exception as e:
print(Fore.RED + "[!] Error: " + str(e))
sys.exit(1)


def change(passbolt, name):
try:
pwd = generate_password()
Expand All@@ -106,50 +117,56 @@ def change(passbolt, name):

for i in passbolt.get(url="/resources.json?api-version=v2")["body"]:
if i["name"] == name:
json_data = {
"name": name,
"description": f"(Automated) {name} password",
json_data = {
"name":
name,
"description":
f"(Automated) {name} password",
"secrets": [{
"user_id": i["created_by"],
"data": encrypted_pass
}]
}],
}
resourceId = i["id"]
passbolt.put(url=f"/resources/{resourceId}.json?api-version=v2",data=json_data)
passbolt.put(
url=f"/resources/{resourceId}.json?api-version=v2",
data=json_data)

print(Fore.GREEN + f"[-] Password changed")

except Exception as e:
print(Fore.RED + "[!] Error: " + str(e))
sys.exit(1)

def delete(passbolt,name):

def delete(passbolt, name):
try:
print(Fore.CYAN + f"[*] Deleting resource {name}...")
for i in passbolt.get(url="/resources.json?api-version=v2")["body"]:
if i["name"] == name:
resourceId = i["id"]
break
break
passbolt.delete(url=f"/resources/{resourceId}.json?api-version=v2")
print(Fore.GREEN + f"[-] Resource {name} deleted")
except Exception as e:
print(Fore.RED + "[!] Error: " + str(e))
sys.exit(1)


def main(args):
try:
if (len(sys.argv) <= 1):
print(Fore.RED+"[!] Error: Should specify at least one argument")
if len(sys.argv) <= 1:
print(Fore.RED + "[!] Error: Should specify at least one argument")
sys.exit(1)
else:
passbolt,uuid = login()
if (args.change):
passbolt,uuid = login()
if args.change:
change(passbolt, args.change)
elif (args.upload):
elif args.upload:
upload(passbolt, uuid, args.upload)
elif (args.delete):
elif args.delete:
delete(passbolt, args.delete)
elif (args.read):
elif args.read:
read(passbolt, args.read)
else:
print(Fore.RED + "[!] Error: Invalid argument")
Expand All@@ -164,16 +181,46 @@ def main(args):
print(Fore.RED + "[!] Error: " + str(e))
sys.exit(1)

if __name__== "__main__":

if __name__ == "__main__":
init(autoreset=True)
banner()

#Parameters
parser = argparse.ArgumentParser(description="Client to operate Stratio's Passbolt server")
parser.add_argument('-c', '--change', metavar="CHANGE", dest='change', default=False, help="Change an existing password in Passbolt")
parser.add_argument('-u', '--upload', metavar="UPLOAD", dest='upload', default=False, help="Upload new password to Passbolt")
parser.add_argument('-d', '--delete', metavar="DELETE", dest='delete', default=False, help="Delete an existing password in Passbolt")
parser.add_argument('-r', '--read', metavar="READ", dest='read', default=False, help="Read an existing password in Passbolt")
# Parameters
parser = argparse.ArgumentParser(
description="Client to operate Stratio's Passbolt server")
parser.add_argument(
"-c",
"--change",
metavar="CHANGE",
dest="change",
default=False,
help="Change an existing password in Passbolt",
)
parser.add_argument(
"-u",
"--upload",
metavar="UPLOAD",
dest="upload",
default=False,
help="Upload new password to Passbolt",
)
parser.add_argument(
"-d",
"--delete",
metavar="DELETE",
dest="delete",
default=False,
help="Delete an existing password in Passbolt",
)
parser.add_argument(
"-r",
"--read",
metavar="READ",
dest="read",
default=False,
help="Read an existing password in Passbolt",
)
args = parser.parse_args()

main(args)
main(args)
Loading