def __init__(self, value, level=None): """ Initialize a secure value. If the value is not yet secured, secure it :param value: the secure value :param level: the level to encrypt the value if it is still unencrypted """ if not is_encrypted(value): assert level is not None, "Missing level to encrypt the given value" value = None if value._string is None else str(value) value = encrypt(value, level=level) super().__init__(value)
def test_is_encrypted(self): self.assertFalse(is_encrypted("any string")) self.assertFalse(is_encrypted(0)) self.assertFalse(is_encrypted(True)) self.assertFalse(is_encrypted({})) self.assertFalse(is_encrypted({"i": 0})) self.assertFalse(is_encrypted({"i": 0, "l": 0})) self.assertFalse( is_encrypted({ "i": 0, "l": 0, "v": "value", "any": "other" })) self.assertTrue( is_encrypted(json.dumps({ "i": 0, "l": 0, "v": "value" })))
def from_value(cls, value, **kwargs): """ Initialize a secure value from a read value (import or database) If the date is read via an import, a confidence level should be supplied to encrypt the data. Also the data should first be unprotected, as all data that is read from any external source is protected upon retrieval. :param value: a value read via an import or from the database :param kwargs: :return: an instance of a Secure datatype """ if is_encrypted(value): return cls(value) else: assert "level" in kwargs, "Missing level to encrypt the given value" level = kwargs["level"] del kwargs["level"] value = read_unprotect(value) value = cls.BaseType.from_value(value, **kwargs) return cls(value, level)