diff options
author | S. Solomon Darnell | 2025-03-28 21:52:21 -0500 |
---|---|---|
committer | S. Solomon Darnell | 2025-03-28 21:52:21 -0500 |
commit | 4a52a71956a8d46fcb7294ac71734504bb09bcc2 (patch) | |
tree | ee3dc5af3b6313e921cd920906356f5d4febc4ed /.venv/lib/python3.12/site-packages/msg_parser/properties/ms_props_generator.py | |
parent | cc961e04ba734dd72309fb548a2f97d67d578813 (diff) | |
download | gn-ai-master.tar.gz |
Diffstat (limited to '.venv/lib/python3.12/site-packages/msg_parser/properties/ms_props_generator.py')
-rw-r--r-- | .venv/lib/python3.12/site-packages/msg_parser/properties/ms_props_generator.py | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/.venv/lib/python3.12/site-packages/msg_parser/properties/ms_props_generator.py b/.venv/lib/python3.12/site-packages/msg_parser/properties/ms_props_generator.py new file mode 100644 index 00000000..17e39af2 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/msg_parser/properties/ms_props_generator.py @@ -0,0 +1,132 @@ +# coding=utf-8 +# generate Exchange Server Protocols Master Property List. +# input text file source : https://interoperability.blob.core.windows.net/files/MS-OXPROPS/[MS-OXPROPS].pdf +# protocol version: 22.0 +# protocol Date: 10/1/2018 + +import json +import os + +txt_file_path = "ms_exchange_props.txt" +json_file_path = "ms_props_master.json" +id_map_file_path = "ms_props_id_map_autogenerated.py" +data_type_map_file_path = "ms_props_date_type_map.py" +python_file_header = """# coding=utf-8 +# autogenerated using ms_props_generator.py\n\n""" + + +def generate_master_properties(): + if not os.path.exists(txt_file_path): + return None + + with open(txt_file_path, "r") as _file: + file_content = _file.read() + + file_records = file_content.split("\n\n") + + master_map = { + "list_name": "Exchange Server Protocols Master Property List", + "reference": "https://msdn.microsoft.com/en-us/library/cc433490(v=exchg.80).aspx", + } + properties_list = [] + for record in file_records: + record_lines = record.splitlines() + record_map = {} + for line in record_lines: + if ":" in line: + try: + key, value = line.split(":", 2) + value = value.strip() + key = key.strip() + # change key name for Long Id + if key == "Property long ID (LID)": + key = "Property long ID" + + # format canonical naming + if value.startswith("PidTag"): + record_map["name"] = value.replace("PidTag", "").strip() + record_map["canonical_type"] = "PidTag" + + if value.startswith("PidLid"): + record_map["name"] = value.replace("PidLid", "").strip() + record_map["canonical_type"] = "PidLid" + + if value.startswith("PidName"): + record_map["name"] = value.replace("PidName", "").strip() + record_map["canonical_type"] = "PidName" + + # format entry data type + if key == "Data type": + name, code = value.split(",", 1) + record_map["data_type_name"] = name.strip() + record_map["data_type"] = code.strip() + else: + key = key.replace(" ", "_").lower().strip() + record_map[key] = value.strip() + + except Exception as exp: + print(str(exp) + " " + line) + continue + + if record_map: + properties_list.append(record_map) + + if properties_list: + master_map["properties_list"] = properties_list + with open(json_file_path, "wb+") as json_file: + json_file.write(json.dumps(master_map, sort_keys=True, indent=4)) + + return master_map + + +def generate_id_name_mapping(master_map): + if not master_map: + return None + + properties_list = master_map.get("properties_list") + + id_map = {} + for prop in properties_list: + if "property_id" in prop: + id_map[prop["property_id"]] = { + "name": prop["name"], + "data_type": prop["data_type"], + } + + if id_map: + with open(id_map_file_path, "wb+") as py_file: + py_file.write(python_file_header) + py_file.write( + "PROPS_ID_MAP = {}".format(json.dumps(id_map, sort_keys=True, indent=4)) + ) + + return id_map + + +def generate_data_id_type_mapping(master_map): + if not master_map: + return None + + properties_list = master_map.get("properties_list") + + id_map = {} + for prop in properties_list: + if "data_type" in prop: + id_map[prop["data_type"]] = prop["data_type_name"] + + if id_map: + with open(data_type_map_file_path, "wb+") as py_file: + py_file.write(python_file_header) + py_file.write( + "DATA_TYPE_MAP = {}".format( + json.dumps(id_map, sort_keys=True, indent=4) + ) + ) + + return id_map + + +if __name__ == "__main__": + master_map_results = generate_master_properties() + id_map_results = generate_id_name_mapping(master_map_results) + data_type_map_results = generate_data_id_type_mapping(master_map_results) |