chapeau/kepi/users.py

108 wiersze
2.5 KiB
Python

import os
import glob
import json
import copy
JSON_EXT = '.json'
TEMP_EXT = '.1'
PRIVATE_KEY_FIELD = 'private-key'
class User:
def __init__(self,
filename):
self.filename = filename
self.details = None
self.private_key = None
@property
def name(self):
return os.path.splitext(os.path.basename(self.filename))[0]
def _load_details(self):
if self.details is not None:
return
with open(self.filename, 'r') as f:
self.details = json.load(f)
def _save_details(self):
if self.details is not None:
return
with open(self.filename+TEMP_EXT, 'w') as f:
json.dump(self.details, f)
os.path.move(
self.filename+TEMP_EXT,
self.filename,
)
def __getitem__(self, name):
if name==PRIVATE_KEY_FIELD:
if self.private_key is None:
username = os.path.splitext(
os.path.basename(self.filename))[1]
with open(os.path.join(
os.path.basename(self.filename),
'private',
'username',
), 'r') as f:
self.private_key = f.read()
return self.private_key
self._load_details()
return self.details[name]
def __setitem__(self, name, value):
if name==PRIVATE_KEY_FIELD:
raise KeyError(f"You can't set {PRIVATE_KEY_FIELD}")
self._load_details()
self.details[name] = value
self._save_details()
def as_dict(self):
self._load_details()
result = copy.copy(self.details)
return result
class Users:
def __init__(self,
users_dir,
):
self.users_dir = users_dir
def __getitem__(self, name):
if '/' in name or '\\' in name:
raise ValueError("Forbidden characters in name.")
filename = os.path.join(
self.users_dir,
name,
) + JSON_EXT
try:
os.stat(filename)
except FileNotFoundError:
raise KeyError()
return User(filename)
def __iter__(self):
for someone in glob.glob(os.path.join(
self.users_dir,
'*'+JSON_EXT,
)):
name = os.path.splitext(
os.path.basename(someone)
)[0]
yield self[name]