A simple python script for an encrypted journal
0
khat.py edited
93 lines 3.2 kB view raw
1#!/usr/bin/env python 2import os 3import sys 4import subprocess 5import tempfile 6import shlex 7import glob 8from datetime import datetime 9 10def edit_encrypted_file(filename): 11 editor = os.environ.get('EDITOR', 'vi') 12 13 with tempfile.NamedTemporaryFile(mode='w+', delete=True, suffix='.key') as id_file: 14 try: 15 result = subprocess.run( 16 ['age', '-d', '.khat'], 17 capture_output=True, 18 check=True 19 ) 20 id_file.write(result.stdout.decode()) 21 id_file.flush() 22 except subprocess.CalledProcessError as e: 23 print(f"Error decrypting .khat: {e}", file=sys.stderr) 24 sys.exit(1) 25 26 with tempfile.NamedTemporaryFile(mode='w+', delete=True, suffix='.txt') as tmp_file: 27 if os.path.isfile(filename): 28 try: 29 result = subprocess.run( 30 ['age', '-i', id_file.name, '-d', filename], 31 capture_output=True, 32 check=True 33 ) 34 tmp_file.write(result.stdout.decode()) 35 tmp_file.flush() 36 except subprocess.CalledProcessError as e: 37 print(f"Error decrypting {filename}: {e}", file=sys.stderr) 38 sys.exit(1) 39 else: 40 tmp_file.write("""Hey. 41# What's on your mind? 42 43# What're you grateful for? 44 45 """) 46 tmp_file.flush() 47 try: 48 subprocess.run(shlex.split(editor) + [tmp_file.name], check=True) 49 except subprocess.CalledProcessError as e: 50 sys.exit(1) 51 52 tmp_file.seek(0) 53 try: 54 subprocess.run( 55 ['age', '-e', '-i', id_file.name, '-a', '-o', filename], 56 input=tmp_file.read().encode(), 57 check=True 58 ) 59 except subprocess.CalledProcessError as e: 60 print(f"Error re-encrypting {filename}: {e}", file=sys.stderr) 61 sys.exit(1) 62 63def create_identity(): 64 print("No .khat file found. Creating new identity.") 65 try: 66 # Generate key 67 keygen = subprocess.run( 68 ['age-keygen'], 69 capture_output=True, 70 check=True 71 ) 72 73 # Encrypt with passphrase 74 subprocess.run( 75 ['age', '-a', '-p', '-o', '.khat'], 76 input=keygen.stdout, 77 check=True 78 ) 79 print("Identity created successfully in .khat") 80 except subprocess.CalledProcessError as e: 81 print(f"Error creating identity: {e}", file=sys.stderr) 82 sys.exit(1) 83 84if __name__ == "__main__": 85 if not os.path.isfile('.khat'): 86 create_identity() 87 if len(sys.argv) == 1: 88 edit_encrypted_file(datetime.now().strftime("%Y_%m_%d.age")) 89 elif len(sys.argv) == 2 and sys.argv[1] != "choose": 90 edit_encrypted_file(sys.argv[1]) 91 elif len(sys.argv) == 2 and sys.argv[1] == "choose": 92 result = subprocess.run('fzf', input=('\n'.join(glob.glob("*.age"))), capture_output=True, text=True) 93 edit_encrypted_file(result.stdout.strip())