<script>
 import { getKeys, getKey, Key } from '../lib/key';
 import { user } from '../stores/user';
 import { ToastsStore } from '../stores/toasts';

 let keysP = getKeys();

 let mykey = "";
 let holdSubmit = false;

 async function submitPGPKey() {
     holdSubmit = true;
     let key = new Key({ type: 'pgp', key: mykey });
     key.save().then(() => {
         keysP = getKeys();
         holdSubmit = false;
         mykey = "";
         ToastsStore.addToast({
             msg: "Votre nouvelle clef a bien été enregistrée.",
             color: "success",
             title: "Clef PGP",
         });
     }, (error) => {
	 holdSubmit = false;
         ToastsStore.addErrorToast({
             msg: "Une erreur s'est produite durant l'envoi de votre clef : " + error,
         });
     });
 }
</script>

<h2>Ma clef PGP</h2>

<p class="lead">
    Vos rendus doivent être signés avec votre clef PGP.
</p>

{#await keysP}
    Veuillez patienter
{:then keys}
    {#if keys && keys.length > 0}
        <p>
            Vous avez actuellement enregistré {#if keys.length > 1}les clefs publiques suivantes{:else}la clef publique suivante{/if}&nbsp;:
        </p>
        {#each keys as keyid}
            {#await getKey(keyid)}
                Veuillez patienter
            {:then key}
                <div class="alert alert-dark d-flex justify-content-between">
                    <div class="d-flex">
                        <div class="d-flex flex-column justify-content-center me-3">
                            <i class="bi bi-key-fill display-4"></i>
                            <div class="text-center badge bg-light" style="font-variant: small-caps;">
                                {key.type}
                            </div>
                        </div>
                        <div>
                            Adresse électronique&nbsp;: <strong class="badge bg-secondary">{key.infos.email}</strong><br>
                            Nom&nbsp;: <strong>{key.infos.identity}</strong> {#if key.infos.comment}<span class="fst-italic">({key.infos.identity})</span>{/if}<br>
                            Key ID&nbsp;: <strong>{key.infos.keyid}</strong><br>
                            Date de la signature&nbsp;: <strong>{key.infos.creation}</strong><br>
                            Clef expirée&nbsp;: <span class="badge" class:bg-danger={key.infos.sigexpired} class:bg-info={!key.infos.sigexpired}>{key.infos.sigexpired?"oui":"non"}</span>
                        </div>
                    </div>
                    <div class="d-flex flex-column justify-content-center">
                        <button
                            type="button"
                            class="btn btn-outline-danger float-end"
                            on:click={() => key.delete().then(() => { keysP = getKeys(); })}
                        >
                            Supprimer la clef
                        </button>
                    </div>
                </div>
            {/await}
        {/each}
    {:else}
        <p>
            Afin de pouvoir les vérifier, veuillez envoyer votre clef publique dans le formulaire ci-dessous.
            Utilisez la commande <code>gpg --export --armor {#if $user}{$user.email}{:else}login_x@epita.fr{/if}</code>&nbsp;:
        </p>

        <form class="container" on:submit|preventDefault={submitPGPKey}>
            <textarea
                class="form-control"
                rows="10"
                bind:value={mykey}
                placeholder="-----BEGIN PGP PUBLIC KEY BLOCK-----

QmllbiBzw7tyIHF1ZSBjJ2VzdCB1bmUgY2hhw65uZSBxdWkgdmV1dCBkaXJlIHF1
ZWxxdWUgY2hvc2UK ...
-----END PGP PUBLIC KEY BLOCK-----"
            ></textarea>
            <button
                type="submit"
                class="mt-2 btn btn-primary"
                disable={!holdSubmit}
            >
                Enregistrer cette clef PGP
            </button>
        </form>
    {/if}
{/await}

<h3 class="mt-4">
    Comment utiliser votre clef PGP&nbsp;?
</h3>
<p>
    Votre clef PGP peut vous servir à sécuriser les échanges de courriers électroniques. Par exemple les courriels officiels sur les listes de diffusion sensibles sont systématiquement signés (pour attester que c'est le responsable du projet qui en est bien à l'origine) ou encore si vous ne voulez pas que des tiers exploitent vos communications et/ou données personnelles (dans ce cas, on chiffre le contenu pour qu'il ne soit lisible que par le(s) destinataire(s) attendus).
</p>
<p>
    Avec git, vous pouvez signer chacun de <a href="https://docs.gitlab.com/ee/user/project/repository/gpg_signed_commits/" target="_blank">vos commits</a>, ou <a href="https://dev.to/shostarsson/how-to-use-pgp-to-sign-your-commits-on-github-gitlab-bitbucket-3dae#fountainpen-sign-tags-using-your-gpg-key" target="_blank">vos tags</a>.<br>
    Si vous souhaitez contribuer au <a href="https://www.kernel.org/doc/html/latest/process/maintainer-pgp-guide.html">noyau Linux</a> (ou tout autre projet d'envergure), il est nécessaire de signer vos contributions. Cela permet d'éviter <a href="https://www.theregister.com/2021/03/29/php_repository_infected/">un certain nombre d'attaques</a>.
</p>
<p>
    Vous approchez à grand pas (si ce n'est pas déjà fait&nbsp;!) de vos premières contributions sur des projets sérieux, qu'ils appartiennent à une entreprise ou bien à la communauté. Afin de mieux vous préparer à cette transition, nous vous demandons dans le cadre de ce cours, de faire vos rendus signés avec votre clef PGP.
</p>

<div class="mb-5"></div>
