Coverage for /home/runner/work/viur-core/viur-core/viur/src/viur/core/bones/credential.py: 26%
25 statements
« prev ^ index » next coverage.py v7.6.3, created at 2024-10-16 22:16 +0000
« prev ^ index » next coverage.py v7.6.3, created at 2024-10-16 22:16 +0000
1from viur.core.bones.base import ReadFromClientError, ReadFromClientErrorSeverity
2from viur.core.bones.string import StringBone
5class CredentialBone(StringBone):
6 """
7 A bone for storing credentials. This bone is designed to store sensitive information like
8 passwords, API keys, or other secret strings.
9 This is always empty if read from the database.
10 If it's saved, its ignored if its values is still empty.
11 If its value is not empty, it will update the value in the database
13 :ivar str type: The type identifier of the bone, set to "str.credential".
14 """
15 type = "str.credential"
17 def __init__(
18 self,
19 *,
20 max_length: int = None, # Unlimited length
21 **kwargs
22 ):
24 super().__init__(max_length=max_length, **kwargs)
25 if self.multiple or self.languages:
26 raise ValueError("CredentialBone cannot be multiple or translated")
28 def isInvalid(self, value):
29 """
30 Returns None if the value would be valid for
31 this bone, an error-message otherwise.
32 """
33 if value is None:
34 return False
35 if self.max_length is not None and len(value) > self.max_length:
36 return "Maximum length exceeded"
38 def serialize(self, skel: 'SkeletonInstance', name: str, parentIndexed: bool) -> bool:
39 """
40 Serializes the bone's value for the database.
42 Updates the value in the entity only if a new value is supplied. Ensures the value is
43 never indexed.
45 :param skel: The skeleton instance that the bone is part of.
46 :type skel: SkeletonInstance
47 :param str name: The name of the bone attribute.
48 :param bool parentIndexed: Indicates whether the parent entity is indexed.
49 :return: True if the value was updated in the database, False otherwise.
50 :rtype: bool
51 """
52 skel.dbEntity.exclude_from_indexes.add(name) # Ensure we are never indexed
53 if name in skel.accessedValues and skel.accessedValues[name]:
54 skel.dbEntity[name] = skel.accessedValues[name]
55 return True
56 return False
58 def unserialize(self, valuesCache, name):
59 """
60 Unserializes the bone's value from the database.
62 This method always returns an empty dictionary as the CredentialBone's value is always empty when read from
63 the database.
65 :param dict valuesCache: A dictionary containing the serialized values from the datastore.
66 :param str name: The name of the bone attribute.
67 :return: An empty dictionary, as the CredentialBone's value is always empty when read from the database.
68 :rtype: dict
69 """
70 return {}
72 def singleValueFromClient(self, value, skel, bone_name, client_data):
73 if not (err := self.isInvalid(value)):
74 return value, None
76 return self.getEmptyValue(), [ReadFromClientError(ReadFromClientErrorSeverity.Invalid, err)]