Parcourir la source

Fixes #1741: Fixed Unicode support for secret plaintexts

Jeremy Stretch il y a 7 ans
Parent
commit
34d10f8db7
2 fichiers modifiés avec 7 ajouts et 6 suppressions
  1. 6 5
      netbox/secrets/models.py
  2. 1 1
      netbox/secrets/views.py

+ 6 - 5
netbox/secrets/models.py

@@ -303,6 +303,7 @@ class Secret(CreatedUpdatedModel):
         |LL|MySecret|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|
         |LL|MySecret|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|
         +--+--------+-------------------------------------------+
         +--+--------+-------------------------------------------+
         """
         """
+        s = s.encode('utf8')
         if len(s) > 65535:
         if len(s) > 65535:
             raise ValueError("Maximum plaintext size is 65535 bytes.")
             raise ValueError("Maximum plaintext size is 65535 bytes.")
         # Minimum ciphertext size is 64 bytes to conceal the length of short secrets.
         # Minimum ciphertext size is 64 bytes to conceal the length of short secrets.
@@ -315,7 +316,7 @@ class Secret(CreatedUpdatedModel):
         return (
         return (
             chr(len(s) >> 8).encode() +
             chr(len(s) >> 8).encode() +
             chr(len(s) % 256).encode() +
             chr(len(s) % 256).encode() +
-            s.encode() +
+            s +
             os.urandom(pad_length)
             os.urandom(pad_length)
         )
         )
 
 
@@ -324,11 +325,11 @@ class Secret(CreatedUpdatedModel):
         Consume the first two bytes of s as a plaintext length indicator and return only that many bytes as the
         Consume the first two bytes of s as a plaintext length indicator and return only that many bytes as the
         plaintext.
         plaintext.
         """
         """
-        if isinstance(s[0], int):
-            plaintext_length = (s[0] << 8) + s[1]
-        elif isinstance(s[0], str):
+        if isinstance(s[0], str):
             plaintext_length = (ord(s[0]) << 8) + ord(s[1])
             plaintext_length = (ord(s[0]) << 8) + ord(s[1])
-        return s[2:plaintext_length + 2].decode()
+        else:
+            plaintext_length = (s[0] << 8) + s[1]
+        return s[2:plaintext_length + 2].decode('utf8')
 
 
     def encrypt(self, secret_key):
     def encrypt(self, secret_key):
         """
         """

+ 1 - 1
netbox/secrets/views.py

@@ -166,7 +166,7 @@ def secret_edit(request, pk):
                 # Create and encrypt the new Secret
                 # Create and encrypt the new Secret
                 if master_key is not None:
                 if master_key is not None:
                     secret = form.save(commit=False)
                     secret = form.save(commit=False)
-                    secret.plaintext = str(form.cleaned_data['plaintext'])
+                    secret.plaintext = form.cleaned_data['plaintext']
                     secret.encrypt(master_key)
                     secret.encrypt(master_key)
                     secret.save()
                     secret.save()
                     messages.success(request, "Modified secret {}.".format(secret))
                     messages.success(request, "Modified secret {}.".format(secret))