Skip to content

Lafripouille

My feedback

1 result found

  1. 212 votes

    We're glad you're here

    Please sign in to leave feedback

    Signed in as (Sign out)

    We’ll send you updates on this idea

    How important is this to you?

    We're glad you're here

    Please sign in to leave feedback

    Signed in as (Sign out)
    An error occurred while saving the comment
    Lafripouille commented  · 

    To take care of the notes also.
    Use llms to correct the identations. (Soory but it breaks when I post it)
    Then use : python3 convert.py -i norton_export.csv -o proton_import.csv -v "Personal"

    import argparse
    import csv

    def transform_norton_to_proton(input_file, output_file, vault_name):
    transformed_rows = []

    # En-tête standard Proton Pass
    header = [
    "type",
    "name",
    "url",
    "email",
    "username",
    "password",
    "note",
    "totp",
    "vault",
    ]
    transformed_rows.append(header)

    logins_count = 0
    notes_count = 0

    try:
    with open(input_file, mode="r", encoding="utf-8") as infile:
    reader = csv.reader(infile)

    for row in reader:
    if not row or len(row) == 0:
    continue

    format_type = row[0].strip().lower()

    # 1. TRAITEMENT DES IDENTIFIANTS (login)
    if format_type == "login":
    email_or_user = row[1] if len(row) > 1 else ""
    password = row[2] if len(row) > 2 else ""
    service_name = row[3] if len(row) > 3 else ""
    url = row[4] if len(row) > 4 else ""
    note = row[5] if len(row) > 5 else ""

    transformed_rows.append(
    [
    "login", # type
    service_name, # name
    url, # url
    email_or_user, # email
    "", # username
    password, # password
    note, # note
    "", # totp
    vault_name, # vault
    ]
    )
    logins_count += 1

    # 2. TRAITEMENT DES NOTES SÉCURISÉES (notes)
    elif format_type in ["notes", "note"]:
    # Dans l'export Norton :
    # row[0] = "notes"
    # row[1] = Titre de la note
    # row[2] = Contenu / Texte de la note
    note_title = row[1] if len(row) > 1 and row[1] else "Note sans titre"
    note_content = row[2] if len(row) > 2 else ""

    transformed_rows.append(
    [
    "note", # type
    note_title, # name
    "", # url
    "", # email
    "", # username
    "", # password
    note_content, # note
    "", # totp
    vault_name, # vault
    ]
    )
    notes_count += 1

    # Écriture du fichier pour Proton Pass
    with open(output_file, mode="w", encoding="utf-8", newline="") as outfile:
    writer = csv.writer(outfile)
    writer.writerows(transformed_rows)

    print(f" Conversion terminée avec succès !")
    print(f" - Identifiants traités : {logins_count}")
    print(f" - Notes traitées : {notes_count}")
    print(f" Fichier généré : {output_file}")

    except FileNotFoundError:
    print(f"Erreur : Fichier '{input_file}' introuvable.")
    except Exception as e:
    print(f"Erreur lors de la conversion : {e}")

    if __name__ == "__main__":
    parser = argparse.ArgumentParser(
    description="Convertit un export Norton CSV vers le format Proton Pass."
    )
    parser.add_argument(
    "-i",
    "--input",
    default="input.csv",
    help="Fichier CSV source Norton (par défaut : input.csv)",
    )
    parser.add_argument(
    "-o",
    "--output",
    default="proton_import.csv",
    help="Fichier CSV de sortie (par défaut : proton_import.csv)",
    )
    parser.add_argument(
    "-v",
    "--vault",
    default="Personal",
    help="Nom du coffre-fort Proton Pass (ex: Personal ou Principal)",
    )

    args = parser.parse_args()
    transform_norton_to_proton(args.input, args.output, args.vault)

    Lafripouille supported this idea  ·