openwebrx-clone/owrxadmin/commands.py

79 lines
2.8 KiB
Python
Raw Normal View History

2021-02-06 17:15:02 +00:00
from abc import ABC, ABCMeta, abstractmethod
2021-02-06 17:04:32 +00:00
from getpass import getpass
2021-02-06 17:22:13 +00:00
from owrx.users import UserList, User, DefaultPasswordClass
2021-02-06 17:04:32 +00:00
import sys
import random
import string
class Command(ABC):
@abstractmethod
def run(self, args):
pass
2021-02-06 17:15:02 +00:00
class UserCommand(Command, metaclass=ABCMeta):
def getUser(self, args):
2021-02-06 17:04:32 +00:00
if args.user:
2021-02-06 17:15:02 +00:00
return args.user
2021-02-06 17:04:32 +00:00
else:
if args.noninteractive:
print("ERROR: User name not specified")
sys.exit(1)
else:
2021-02-06 17:15:02 +00:00
return input("Please enter the user name: ")
2021-02-06 18:12:44 +00:00
def getPassword(self, args, username):
2021-02-06 17:04:32 +00:00
if args.noninteractive:
print("Generating password for user {username}...".format(username=username))
password = self.getRandomPassword()
print('Password for {username} is "{password}".'.format(username=username, password=password))
# TODO implement this threat
print('This password is suitable for initial setup only, you will be asked to reset it on initial use.')
2021-02-06 18:01:14 +00:00
print('This password cannot be recovered from the system, please copy it now.')
2021-02-06 17:04:32 +00:00
else:
2021-02-06 18:12:44 +00:00
password = getpass("Please enter the new password for {username}: ".format(username=username))
confirm = getpass("Please confirm the new password: ")
2021-02-06 17:04:32 +00:00
if password != confirm:
print("ERROR: Password mismatch.")
sys.exit(1)
2021-02-06 18:12:44 +00:00
return password
2021-02-06 17:04:32 +00:00
def getRandomPassword(self, length=10):
printable = list(string.ascii_letters) + list(string.digits)
return ''.join(random.choices(printable, k=length))
2021-02-06 17:15:02 +00:00
2021-02-06 18:12:44 +00:00
class NewUser(UserCommand):
def run(self, args):
username = self.getUser(args)
userList = UserList()
# early test to bypass the password stuff if the user already exists
if username in userList:
raise KeyError("User {username} already exists".format(username=username))
password = self.getPassword(args, username)
print("Creating user {username}...".format(username=username))
user = User(name=username, enabled=True, password=DefaultPasswordClass(password))
userList.addUser(user)
2021-02-06 17:15:02 +00:00
class DeleteUser(UserCommand):
def run(self, args):
username = self.getUser(args)
print("Deleting user {username}...".format(username=username))
userList = UserList()
userList.deleteUser(username)
2021-02-06 18:12:44 +00:00
class ResetPassword(UserCommand):
def run(self, args):
username = self.getUser(args)
password = self.getPassword(args, username)
userList = UserList()
userList[username].setPassword(DefaultPasswordClass(password))
# this is a change to an object in the list, not the list itself
# in this case, store() is explicit
userList.store()