Python CSC Electronic Office
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

66 lines
1.8 KiB

import inspect
import re
from typing import Callable
class InvalidUsernameException(Exception):
class InvalidForwardingAddressException(Exception):
valid_username_re = re.compile(r'^[a-z][\w-]+$')
# Only allow usernames and email addresses to be set in ~/.forward
valid_forwarding_address_re = re.compile(r'^[\w-]+|[\w.+-]+@[\w-]+(\.[\w-]+)*$')
def is_valid_username(username: str) -> bool:
"""Returns True if the username has a valid format."""
return valid_username_re.match(username) is not None
def check_valid_username(f: Callable) -> Callable:
A decorator which raises an Exception if the username passed
to f is invalid.
f must accept `username` as a regular argument.
argspec = inspect.getfullargspec(f)
arg_idx = argspec.args.index('username')
except ValueError:
return f
def wrapper(*args, **kwargs):
username = None
if arg_idx < len(args):
username = args[arg_idx]
elif 'username' in kwargs:
username = kwargs['username']
if username is not None and not is_valid_username(username):
raise InvalidUsernameException(username)
return f(*args, **kwargs)
return wrapper
def is_valid_forwarding_address(address: str) -> bool:
"""Returns True if the address is a valid forwarding address."""
return valid_forwarding_address_re.match(address) is not None
def is_valid_shell(shell: str) -> bool:
"""Returns True if this shell is in /etc/shells, otherwise False."""
return shell in [
line.strip() for line in open('/etc/shells')
if line != '' and not line.isspace()
def is_valid_term(term: str) -> bool:
return len(term) == 5 and \
term[0] in ['s', 'f', 'w'] and \