Hi, Please find the attached patch which will fix the password encryption/decryption for python3. I have modified the fix suggested by Ladislav to work with both python2 and python3.
Thanks, Khushboo On Tue, Jun 27, 2017 at 4:41 PM, Ladislav Jech <archenr...@gmail.com> wrote: > Hi, > It will be good if you support fully github or any GIT repository for > managing pull requests. Is there any or you wan't me to generate *.patch > file? I am new to pgadmin 4, so not sure how this works. Let me know. > Ladislav > > 2017-06-27 11:52 GMT+02:00 Khushboo Vashi <khushboo.va...@enterprisedb.com > >: > >> Hi, >> >> Can you send the patch for the same. I think this is the valid fix. >> >> Thanks, >> Khushboo >> >> On Tue, Jun 27, 2017 at 3:02 PM, Ladislav Jech <archenr...@gmail.com> >> wrote: >> >>> I am running on following Gentoo system with Python 3.5 as default >>> (although i have 2.7 and 3.4 available to switch as well). >>> >>> I compiled from source code via github: >>> commit 15cb9fc35b41736a331a452b9303a79e8f13ee36 (HEAD -> master, >>> origin/master, origin/HEAD) >>> >>> The error appears when I want to click on Save while adding new server >>> to the list, I put few lines into the code to detect the times: >>> 2017-06-27 13:21:48,329: DEBUG pgadmin: Not running under the desktop >>> runtime, port: 5050 >>> Starting pgAdmin 4. Please navigate to http://127.0.0.1:5050 in your >>> browser. >>> str var python type is <class 'str'> >>> str var object's type is str >>> padding_string var python type is <class 'bytes'> >>> padding_string var object's type is bytes >>> 2017-06-27 13:21:53,028: ERROR pgadmin: Can't convert 'bytes' object to >>> str implicitly >>> Traceback (most recent call last): >>> File >>> "/home/zangetsu/devel/tmp/pgadmin4/web/pgadmin/browser/server_groups/servers/__init__.py", >>> line 619, in create >>> password = encrypt(password, current_user.password) >>> File "/home/zangetsu/devel/tmp/pgadmin4/web/pgadmin/utils/crypto.py", >>> line 31, in encrypt >>> cipher = AES.new(pad(key), AES.MODE_CFB, iv) >>> File "/home/zangetsu/devel/tmp/pgadmin4/web/pgadmin/utils/crypto.py", >>> line 80, in pad >>> return str + ((32 - len(str) % 32) * padding_string) >>> TypeError: Can't convert 'bytes' object to str implicitly >>> 2017-06-27 13:21:53,031: INFO werkzeug: 127.0.0.1 - - [27/Jun/2017 >>> 13:21:53] "POST /browser/server/obj/2/ HTTP/1.1" 410 - >>> 2017-06-27 13:22:49,936: INFO werkzeug: * Detected change in >>> '/home/zangetsu/devel/tmp/pgadmin4/web/pgadmin/utils/crypto.py', >>> reloading >>> 2017-06-27 13:22:50,138: INFO werkzeug: * Restarting with reloader >>> >>> So this is the error: >>> Can't convert 'bytes' object to str implicitly >>> >>> To fix this on Python 3.5 I simply changed in >>> pgadmin4/web/pgadmin/utils/crypto.py file this line: >>> return str + ((32 - len(str) % 32) * padding_string) >>> to >>> return str + ((32 - len(str) % 32) * padding_string.decode()) >>> >>> Another solution could be to change whole str into bytes. Not sure what >>> is better, but now it works. >>> >> >> >
diff --git a/web/pgadmin/utils/crypto.py b/web/pgadmin/utils/crypto.py index 5d8bb50..1c16e6d 100644 --- a/web/pgadmin/utils/crypto.py +++ b/web/pgadmin/utils/crypto.py @@ -71,6 +71,10 @@ def pad(str): if str_len == 16 or str_len == 24 or str_len == 32: return str + # Convert bytes to string (python3) + if not hasattr(str, 'decode'): + padding_string = padding_string.decode() + # Add padding to make key 32 bytes long return str + ((32 - len(str) % 32) * padding_string)