database: make protected namespaces persistent

This fixes a bug where it is protected namespace can be modified in an optional component if that component is disabled.

Signed-off-by:  Eric Callahan <arksine.code@gmail.com>
This commit is contained in:
Arksine 2021-03-30 14:32:17 -04:00
parent 85b1b44e20
commit da9401dd1a
1 changed files with 6 additions and 4 deletions

View File

@ -46,7 +46,6 @@ class MoonrakerDatabase:
def __init__(self, config): def __init__(self, config):
self.server = config.get_server() self.server = config.get_server()
self.namespaces = {} self.namespaces = {}
self.protected_namespaces = {"moonraker"}
self.database_path = os.path.expanduser(config.get( self.database_path = os.path.expanduser(config.get(
'database_path', "~/.moonraker_database")) 'database_path', "~/.moonraker_database"))
if not os.path.isdir(self.database_path): if not os.path.isdir(self.database_path):
@ -68,7 +67,8 @@ class MoonrakerDatabase:
txn.put(b'database_version', txn.put(b'database_version',
self._encode_value(DATABASE_VERSION), self._encode_value(DATABASE_VERSION),
db=mrdb) db=mrdb)
self.protected_namespaces = set(self.get_item(
"moonraker", "database.protected_namespaces", ["moonraker"]))
self.server.register_endpoint( self.server.register_endpoint(
"/server/database/list", ['GET'], self._handle_list_request) "/server/database/list", ['GET'], self._handle_list_request)
self.server.register_endpoint( self.server.register_endpoint(
@ -195,13 +195,15 @@ class MoonrakerDatabase:
if namespace not in self.namespaces: if namespace not in self.namespaces:
self.namespaces[namespace] = self.lmdb_env.open_db( self.namespaces[namespace] = self.lmdb_env.open_db(
namespace.encode()) namespace.encode())
if namespace not in self.protected_namespaces:
self.protected_namespaces.add(namespace) self.protected_namespaces.add(namespace)
self.insert_item("moonraker", "database.protected_namespaces",
list(self.protected_namespaces))
def wrap_namespace(self, namespace, parse_keys=True): def wrap_namespace(self, namespace, parse_keys=True):
if namespace not in self.namespaces: if namespace not in self.namespaces:
raise self.server.error( raise self.server.error(
f"Namespace '{namespace}' not found", 404) f"Namespace '{namespace}' not found", 404)
self.protected_namespaces.add(namespace)
return NamespaceWrapper(namespace, self, parse_keys) return NamespaceWrapper(namespace, self, parse_keys)
def _process_key(self, key): def _process_key(self, key):