""" mSecure6 CSV export file ^.*?,.*?,.*?,.*?, name|id,type de l'entree,tag,note, dynamic """ from os import curdir import re def line_split(line): new_line = [] s = "" inString = False while len(line) != 0: current_car = line[0] if current_car == '"' and inString == False: line = line[1:] inString = True continue if current_car == '"' and inString == True: line = line[1:] inString = False continue if current_car == "," and inString != True: new_line.append(s) s = "" line = line[1:] continue s+=current_car line = line[1:] return new_line class Entry: def __init__(self,line = None): self.name = '' self.display_type = '' self.tag = '' self.note = '' self.licence_user = '' self.email = '' self.url = '' self.text_field = '' self.phone_number = '' self.unknown = '' self.number = '' self.username = '' self.passwrd = '' self.pin = '' self.date = '' self.expiration_date = '' self.carte_bleu = '' if line is not None: self.from_line(line) def from_line(self, line: str): """ Parse a line of text into an Entry object. Args: line (str): The line of text to parse. """ # Split the line into individual fields print(line) lsplit = line_split(line) print(lsplit) # Extract the first field as the name self.name = lsplit[0].split("|")[0].strip() # Extract the second and third fields as the display type and tag self.display_type = lsplit[1] self.tag = lsplit[2] # Extract the fourth field as the note self.note = lsplit[3] if len(lsplit) > 3 else '' # Split the fifth line into individual fields lsplit = lsplit[4:] while lsplit: col = lsplit.pop(0) # If there are no more lines, stop parsing if not col or len(col) == 1 : continue # Split the column into a type and value col_parts = col.split("|") # Extract the type and value as an integer type_val = int(col_parts[1]) val = col_parts[2] # Remove leading/trailing spaces match type_val: case 0: # Licence User self.licence_user = val case 1: # Email self.email = val case 2: # Phone Number self.url = val case 3: # Unknown Field self.text_field = val case 4: # URL self.phone_number = val case 5: self.unknown = val case 6: # Username self.number = val case 7: # Password self.username = val case 8: # PIN self.passwrd = val print(self.passwrd) case 9: # Date self.pin = val case 10: # Expiration Date self.date = val case 11: # Blue Card self.expiration_date = val # Set default values for missing fields if self.name == '': self.name = 'Unknown' if self.display_type == '': self.display_type = 'Unknown' if self.tag == '': self.tag = 'Unknown' def to_password(self): return f"{self.name},{self.url},{self.username},{self.passwrd},{self.note},," entrs = [] with open("ms.csv","r") as file: with open("test.txt","w+") as export: export.write("Title,URL,Username,Password,Notes,OTPAuth\n") for line in file.readlines(): entry = Entry(line) print(entry.to_password()) export.write(entry.to_password()+"\n") print(50 * "-")