X-Git-Url: https://mudpy.org/gitweb?p=mudpy.git;a=blobdiff_plain;f=lib%2Fmudpy%2Fdata.py;h=02a913981f9b5b2ce5747e2e1503d288d2619c16;hp=f254dc6dc67a057871f8f79870bd566dbea8a4f5;hb=f2e017445df6026bcde0000b2490caee4ae1e7e3;hpb=b30249dada13540bf31fcd8b442efa3802717626 diff --git a/lib/mudpy/data.py b/lib/mudpy/data.py index f254dc6..02a9139 100644 --- a/lib/mudpy/data.py +++ b/lib/mudpy/data.py @@ -1,6 +1,6 @@ """Data interface functions for the mudpy engine.""" -# Copyright (c) 2004-2015 Jeremy Stanley . Permission +# Copyright (c) 2004-2016 Jeremy Stanley . Permission # to use, copy, modify, and distribute this software is granted under # terms provided in the LICENSE file distributed with this software. @@ -14,7 +14,7 @@ import yaml class DataFile: - """A file containing universe elements.""" + """A file containing universe elements and their facets.""" def __init__(self, filename, universe): self.filename = filename @@ -23,10 +23,10 @@ class DataFile: self.load() def load(self): - """Read a file and create elements accordingly.""" + """Read a file, create elements and poplulate facets accordingly.""" self.modified = False try: - self.data = yaml.load(open(self.filename)) + self.data = yaml.safe_load(open(self.filename)) except FileNotFoundError: # it's normal if the file is one which doesn't exist yet log_entry = ("File %s is unavailable." % self.filename, 6) @@ -84,9 +84,21 @@ class DataFile: includes.append(item) if item not in self.universe.private_files: self.universe.private_files.append(item) - for element in self.data: - if element != "__control__": - mudpy.misc.Element(element, self.universe, self.filename) + for node in list(self.data): + if node == "__control__": + continue + facet_pos = node.rfind(".") + 1 + if not facet_pos: + mudpy.misc.Element(node, self.universe, self.filename, + old_style=True) + else: + prefix = node[:facet_pos].strip(".") + try: + element = self.universe.contents[prefix] + except KeyError: + element = mudpy.misc.Element(prefix, self.universe, + self.filename) + element.set(node[facet_pos:], self.data[node]) for include_file in includes: if not os.path.isabs(include_file): include_file = find_file( @@ -100,6 +112,9 @@ class DataFile: def save(self): """Write the data, if necessary.""" + normal_umask = 0o0022 + private_umask = 0o0077 + private_file_mode = 0o0600 # when modified, writeable and has content or the file exists if self.modified and self.is_writeable() and ( @@ -108,18 +123,17 @@ class DataFile: # make parent directories if necessary if not os.path.exists(os.path.dirname(self.filename)): + old_umask = os.umask(normal_umask) os.makedirs(os.path.dirname(self.filename)) + os.umask(old_umask) # backup the file if "__control__" in self.data and "backup_count" in self.data[ "__control__"]: max_count = self.data["__control__"]["backup_count"] else: - max_count = self.universe.categories[ - "internal" - ][ - "limits" - ].get("default_backup_count") + max_count = self.universe.contents["mudpy.limit"].get( + "backups") if os.path.exists(self.filename) and max_count: backups = [] for candidate in os.listdir(os.path.dirname(self.filename)): @@ -144,17 +158,21 @@ class DataFile: os.rename(self.filename, self.filename + ".0") # our data file - file_descriptor = open(self.filename, "w") - - # if it's marked private, chmod it appropriately - if self.filename in self.universe.private_files and oct( - stat.S_IMODE(os.stat(self.filename)[stat.ST_MODE]) - ) != 0o0600: - os.chmod(self.filename, 0o0600) + if self.filename in self.universe.private_files: + old_umask = os.umask(private_umask) + file_descriptor = open(self.filename, "w") + if oct(stat.S_IMODE(os.stat( + self.filename)[stat.ST_MODE])) != private_file_mode: + # if it's marked private, chmod it appropriately + os.chmod(self.filename, private_file_mode) + else: + old_umask = os.umask(normal_umask) + file_descriptor = open(self.filename, "w") + os.umask(old_umask) # write and close the file - yaml.dump(self.data, allow_unicode=True, default_flow_style=False, - stream=file_descriptor) + yaml.safe_dump(self.data, allow_unicode=True, + default_flow_style=False, stream=file_descriptor) file_descriptor.close() # unset the modified flag @@ -243,7 +261,7 @@ def find_file( else: search_path = search_path[:] - # if there's no default path, use the last element of the search path + # if there's no default path, use the last component of the search path if not default_dir: default_dir = search_path[-1]