]> git.immae.eu Git - perso/Immae/Config/Nix.git/blobdiff - scripts/anonymize
Anonymize names in files
[perso/Immae/Config/Nix.git] / scripts / anonymize
diff --git a/scripts/anonymize b/scripts/anonymize
new file mode 100755 (executable)
index 0000000..e93e1ed
--- /dev/null
@@ -0,0 +1,56 @@
+#!/usr/bin/env python3
+
+import sys
+import argparse
+import os
+import json
+import re
+
+parser = argparse.ArgumentParser()
+parser.add_argument("words_file", help="File that contains the words to (de)anonymize")
+parser.add_argument("--ignore-missing", "-i", action="store_true", help="treat missing file as empty list")
+parser.add_argument("--deanonymize", "-d", action="store_true", help="deanonymize")
+config = parser.parse_args()
+
+alphabet="abcdefghijklmnopqrstuvwxyz"
+
+try:
+    key = os.environ["ANONYMIZE_KEY"].lower()
+    assert all([k in alphabet for k in key])
+except KeyError:
+    print("Please set ANONYMIZE_KEY as environment variable with only letters", file=sys.stderr)
+    sys.exit(1)
+
+if not os.path.isfile(config.words_file):
+    if config.ignore_missing:
+        print(sys.stdin.read(), end="")
+        sys.exit(0)
+    else:
+        print("Could not find words file", file=sys.stderr)
+        sys.exit(1)
+
+words = json.load(open(config.words_file))
+
+if any([len(word) > len(key) for word in words]):
+    print("The key needs to be at least as long as the longest word in the list (append to existing one to keep already mangled words)", file=sys.stderr)
+    sys.exit(1)
+
+order = -1 if config.deanonymize else 1
+
+def replace(match):
+    name = match.group()
+    result = []
+    for k in range(len(name)):
+        if name[k].lower() not in alphabet:
+            result.append(name[k])
+        else:
+            key_index = alphabet.index(key[k])
+            letter_index = alphabet.index(name[k].lower())
+            new_letter = alphabet[(letter_index + order * key_index) % len(alphabet)]
+            if name[k].lower() != name[k]:
+                new_letter = new_letter.upper()
+            result.append(new_letter)
+    return ''.join(result)
+
+regexp = re.compile("(" + '|'.join([r'(\b' + w + r'\b)' for w in words]) + ")")
+print(regexp.sub(replace, sys.stdin.read()), end="")