A simple python script for an encrypted journal
0
khat.py
edited
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())