diff --git a/extensions/export-to-libmutton/export-to-libmutton.py b/extensions/export-to-libmutton/export-to-libmutton.py index f78adbe..f6b201e 100755 --- a/extensions/export-to-libmutton/export-to-libmutton.py +++ b/extensions/export-to-libmutton/export-to-libmutton.py @@ -5,8 +5,6 @@ from pathlib import Path from shutil import rmtree from sshyp import decrypt -# TODO extract and move MFA data to dedicated field, if present - if __name__ == "__main__": _pasture = path.expanduser('~/.local/share/sshyp') @@ -18,7 +16,7 @@ if __name__ == "__main__": # prompt for unlock and display do not close warning decrypt(None) - print('\nentry conversion may take some time (especially on slower devices)\ndo not terminate this process!\n') + print('\nentry conversion may take some time (especially on slower devices) - do not terminate this process!\n') # iterate over entires, exporting them in the libmutton format if path.isdir(_pasture): @@ -36,20 +34,37 @@ if __name__ == "__main__": system(f"gpg -d '{_dirPath}/{_filename}.gpg' > '{_dirPath.replace(_pasture, _pasture + '.export')}/{_filename}.gpg'") _old_contents, _new_contents = open(f"{_dirPath.replace(_pasture, _pasture + '.export')}/{_filename}.gpg", 'r').readlines(), '' + _old_contents_length = len(_old_contents) + + # extract sshyp-mfa data for new reserved line + if _old_contents_length >= 5: + if _old_contents[4].startswith('otpauth://'): + # check if sshyp-mfa data is standard TOTP or Steam + if _old_contents[4][10:].startswith('steam'): + print("\n\u001b[38;5;3mlibmutton uses a different form of secret key for Steam, and as such, your Steam TOTP secret will not be migrated\u001b[0m\n") + _secret = '\n' + else: + # extract TOTP secret + _secret = _old_contents[4].split('?secret=')[1].split('&issuer=')[0]+'\n' + else: + _secret = '\n' # add a new line reserved for libmutton's TOTP support (between username and URL) for _num in range(len(_old_contents)): - match _num: - case 0: - _new_contents += _old_contents[0] - case 1: - _new_contents += _old_contents[1] - case 2: - _new_contents += '' - case 3: - _new_contents += _old_contents[2] - case _: + if _num == 0: + _new_contents += _old_contents[0] + elif _num == 1: + _new_contents += _old_contents[1] + elif _num == 2: + _new_contents += _secret + elif _num == 3: + _new_contents += _old_contents[2] + elif _num == 4: + # append as normal notes line if no sshyp-mfa data was found + if _secret == '\n': _new_contents += _old_contents[_num] + else: + _new_contents += _old_contents[_num] # remove any trailing whitespace for _num in reversed(range(len(_new_contents))): diff --git a/pointers/v1.5.2 b/pointers/v1.5.2 index 6435a94..fce5cc4 100644 --- a/pointers/v1.5.2 +++ b/pointers/v1.5.2 @@ -5,7 +5,7 @@ exe = https://raw.githubusercontent.com/rwinkhart/sshyp-labs/v1.5.1.3/extensions ini = https://raw.githubusercontent.com/rwinkhart/sshyp-labs/v1.5.1.3/extensions/sshyp-mfa/sshyp-mfa.ini [export-to-libmutton] -desc = ALPHA - DO NOT USE - exports sshyp entries to ~/.local/share/sshyp.export for use with libmutton v0.2.0 +desc = exports sshyp entries to ~/.local/share/sshyp.export for use with libmutton v0.2.0 usage = sshyp export exe = https://raw.githubusercontent.com/rwinkhart/sshyp-labs/main/extensions/export-to-libmutton/export-to-libmutton.py ini = https://raw.githubusercontent.com/rwinkhart/sshyp-labs/main/extensions/export-to-libmutton/export-to-libmutton.ini