kopia lustrzana https://gitlab.com/marnanel/chapeau
108 wiersze
2.5 KiB
Python
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]
|