Set the master password and store in the memory This password will be used to encrypt/decrypt saved server passwords
()
| 678 | @blueprint.route("/master_password", endpoint="set_master_password", |
| 679 | methods=["POST"]) |
| 680 | def set_master_password(): |
| 681 | """ |
| 682 | Set the master password and store in the memory |
| 683 | This password will be used to encrypt/decrypt saved server passwords |
| 684 | """ |
| 685 | data = None |
| 686 | if request.form: |
| 687 | data = request.form |
| 688 | elif request.data: |
| 689 | data = request.data |
| 690 | if hasattr(request.data, 'decode'): |
| 691 | data = request.data.decode('utf-8') |
| 692 | |
| 693 | if data != '': |
| 694 | data = json.loads(data) |
| 695 | |
| 696 | keyring_name = '' |
| 697 | errmsg = '' |
| 698 | master_password_hook = False |
| 699 | if not config.SERVER_MODE: |
| 700 | if config.USE_OS_SECRET_STORAGE: |
| 701 | try: |
| 702 | # Try to get master key is from local os storage |
| 703 | master_key = get_master_password_key_from_os_secret() |
| 704 | master_password = data.get('password', None) |
| 705 | keyring_name = config.KEYRING_NAME |
| 706 | if not master_key: |
| 707 | # Generate new one and migration required |
| 708 | master_key = secrets.token_urlsafe(12) |
| 709 | keyring.delete_password(KEY_RING_SERVICE_NAME, |
| 710 | 'entry_to_check_keychain_access') |
| 711 | # migrate existing server passwords |
| 712 | from pgadmin.browser.server_groups.servers.utils \ |
| 713 | import migrate_saved_passwords |
| 714 | migrated_save_passwords, error = migrate_saved_passwords( |
| 715 | master_key, master_password) |
| 716 | |
| 717 | if migrated_save_passwords: |
| 718 | # Update keyring |
| 719 | keyring.set_password(KEY_RING_SERVICE_NAME, |
| 720 | KEY_RING_USER_NAME, |
| 721 | master_key) |
| 722 | # set crypt key |
| 723 | set_crypt_key(master_key) |
| 724 | return form_master_password_response( |
| 725 | existing=True, |
| 726 | present=True, |
| 727 | keyring_name=keyring_name) |
| 728 | else: |
| 729 | if not error: |
| 730 | # Update keyring |
| 731 | keyring.set_password(KEY_RING_SERVICE_NAME, |
| 732 | KEY_RING_USER_NAME, |
| 733 | master_key) |
| 734 | set_crypt_key(master_key) |
| 735 | return form_master_password_response( |
| 736 | present=True) |
| 737 | # Migration failed |
nothing calls this directly
no test coverage detected