Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • 1708-feat-instruction-ajoute-la-possibilite-de-voir-les-prochaines-etapes
  • a11y-ci
  • chore-image-snap
  • master
  • notifications
  • preprod
  • prod
  • prolong-proc-ouvertes
  • prs-exploitant
  • sonar
  • try-better-perfs
  • upgrade-keycloak
  • vpn_rie
  • v0.1.0
  • v0.10.0
  • v0.100.0
  • v0.101.0
  • v0.102.0
  • v0.103.0
  • v0.104.0
  • v0.105.0
  • v0.106.0
  • v0.107.0
  • v0.108.0
  • v0.109.0
  • v0.11.0
  • v0.110.0
  • v0.111.0
  • v0.112.0
  • v0.113.0
  • v0.114.0
  • v0.115.0
  • v0.116.0
  • v0.117.0
  • v0.118.0
  • v0.119.0
  • v0.12.0
  • v0.12.1
  • v0.120.0
  • v0.121.0
  • v0.13.0
  • v0.14.0
  • v0.15.0
  • v0.16.0
  • v0.17.0
  • v0.18.0
  • v0.19.0
  • v0.2.0
  • v0.2.1
  • v0.20.0
  • v0.21.0
  • v0.22.0
  • v0.23.0
  • v0.24.0
  • v0.24.1
  • v0.24.10
  • v0.24.11
  • v0.24.12
  • v0.24.13
  • v0.24.14
  • v0.24.15
  • v0.24.16
  • v0.24.17
  • v0.24.18
  • v0.24.19
  • v0.24.2
  • v0.24.20
  • v0.24.21
  • v0.24.22
  • v0.24.23
  • v0.24.24
  • v0.24.25
  • v0.24.26
  • v0.24.27
  • v0.24.28
  • v0.24.29
  • v0.24.3
  • v0.24.30
  • v0.24.31
  • v0.24.32
  • v0.24.33
  • v0.24.34
  • v0.24.35
  • v0.24.36
  • v0.24.37
  • v0.24.38
  • v0.24.39
  • v0.24.4
  • v0.24.40
  • v0.24.41
  • v0.24.42
  • v0.24.43
  • v0.24.44
  • v0.24.45
  • v0.24.46
  • v0.24.47
  • v0.24.48
  • v0.24.49
  • v0.24.5
  • v0.24.50
  • v0.24.51
  • v0.24.52
  • v0.24.53
  • v0.24.54
  • v0.24.55
  • v0.24.56
  • v0.24.57
  • v0.24.58
  • v0.24.59
  • v0.24.6
  • v0.24.60
  • v0.24.61
  • v0.24.62
113 results

Target

Select target project
  • pub/pnm-public/camino
1 result
Select Git revision
  • 1708-feat-instruction-ajoute-la-possibilite-de-voir-les-prochaines-etapes
  • a11y-ci
  • chore-image-snap
  • master
  • notifications
  • preprod
  • prod
  • prolong-proc-ouvertes
  • prs-exploitant
  • sonar
  • try-better-perfs
  • upgrade-keycloak
  • vpn_rie
  • v0.1.0
  • v0.10.0
  • v0.100.0
  • v0.101.0
  • v0.102.0
  • v0.103.0
  • v0.104.0
  • v0.105.0
  • v0.106.0
  • v0.107.0
  • v0.108.0
  • v0.109.0
  • v0.11.0
  • v0.110.0
  • v0.111.0
  • v0.112.0
  • v0.113.0
  • v0.114.0
  • v0.115.0
  • v0.116.0
  • v0.117.0
  • v0.118.0
  • v0.119.0
  • v0.12.0
  • v0.12.1
  • v0.120.0
  • v0.121.0
  • v0.13.0
  • v0.14.0
  • v0.15.0
  • v0.16.0
  • v0.17.0
  • v0.18.0
  • v0.19.0
  • v0.2.0
  • v0.2.1
  • v0.20.0
  • v0.21.0
  • v0.22.0
  • v0.23.0
  • v0.24.0
  • v0.24.1
  • v0.24.10
  • v0.24.11
  • v0.24.12
  • v0.24.13
  • v0.24.14
  • v0.24.15
  • v0.24.16
  • v0.24.17
  • v0.24.18
  • v0.24.19
  • v0.24.2
  • v0.24.20
  • v0.24.21
  • v0.24.22
  • v0.24.23
  • v0.24.24
  • v0.24.25
  • v0.24.26
  • v0.24.27
  • v0.24.28
  • v0.24.29
  • v0.24.3
  • v0.24.30
  • v0.24.31
  • v0.24.32
  • v0.24.33
  • v0.24.34
  • v0.24.35
  • v0.24.36
  • v0.24.37
  • v0.24.38
  • v0.24.39
  • v0.24.4
  • v0.24.40
  • v0.24.41
  • v0.24.42
  • v0.24.43
  • v0.24.44
  • v0.24.45
  • v0.24.46
  • v0.24.47
  • v0.24.48
  • v0.24.49
  • v0.24.5
  • v0.24.50
  • v0.24.51
  • v0.24.52
  • v0.24.53
  • v0.24.54
  • v0.24.55
  • v0.24.56
  • v0.24.57
  • v0.24.58
  • v0.24.59
  • v0.24.6
  • v0.24.60
  • v0.24.61
  • v0.24.62
113 results
Show changes
Commits on Source (23)
Showing
with 1109 additions and 40 deletions
ENV=ENC[AES256_GCM,data:wo80,iv:KTiTD6K0zzarG5SfXMv8MYOHbaxBhRpAWrNYLjO8CuA=,tag:F40SGZqrt7+LBEYlPi7x7g==,type:str]
#ENC[AES256_GCM,data:FQbnHuo=,iv:whMNIziAx6SieHJLuCaZzp6YouQQm/y9peu+CDib51I=,tag:plLEZwL3eL4Tz0oBevGaDA==,type:comment]
NODE_ENV=ENC[AES256_GCM,data:WsY3mdb/0IAy8g==,iv:qsRfjqnWBu59ndQmkFDSgBTEcoz5cgLACXVB9/SDfjY=,tag:omu6dgcdAOatq9NqhFDEcA==,type:str]
API_PORT=ENC[AES256_GCM,data:SkusJA==,iv:rlGM12T/ZpqZV0NXrRJxEavmT/9EXwWl6RWj9q6I+xg=,tag:1tYhYrjxpp1m187mE0sV9w==,type:str]
UI_PORT=ENC[AES256_GCM,data:zY3byQ==,iv:tiE2sHRBWlHNGDk7TLPWR/UBz1eghyIUneraZL9E0E0=,tag:328JR5vyic7K9Y4EJioYDA==,type:str]
DOC_PORT=ENC[AES256_GCM,data:6Q0=,iv:bf9ZrFQZgV0KAUxMDOuxGsmoX25U7nE//eNtrCLlKiE=,tag:hW9TNvg87XtjfjaLtoxL0w==,type:str]
STORYBOOK_PORT=ENC[AES256_GCM,data:A4U=,iv:kX8VcAWCIY5JAMU67c/H9PUUDtKw+fQCq5HyKcYTIXw=,tag:KNsFsQcDP/+wxicjFCctww==,type:str]
OAUTH_PORT=ENC[AES256_GCM,data:b9IRig==,iv:Nzk37lcwpSKxMx5ccMsOFOrlBa+Vugeg/Oa4Zpx5Qw4=,tag:dnZRLIAUb3BF/j2xtWq+LQ==,type:str]
KEYCLOAK_PORT=ENC[AES256_GCM,data:ABxBGA==,iv:veeqIgzc7phEsAn3XdlsaOzH1GTbIg225bPF/xs2Jho=,tag:NZ/+jnjoC7cO/xAjcfqgIA==,type:str]
#ENC[AES256_GCM,data:n7AjF8rjywSw9ZfdmA8be4hHR9P5gvA03jh9nJRGm9c=,iv:pz6Z9VSYZMBlT7ib8mUPchfTcRrDXpoP8WuSgzvLFLU=,tag:oNMDmqpALhHDE+9WT2QvGA==,type:comment]
API_HOST=ENC[AES256_GCM,data:BtrlbrB1/zi7ulhYqrB3xE95j1mGLAPfh9sz,iv:BnvAwM+2f7sJ6CVL6NeZnNWRkqX9fYhO8Hthbf7Polc=,tag:nI9AIe/qNUIfkQRklWXgmw==,type:str]
API_URL=ENC[AES256_GCM,data:UhCyQKeCO8qvj7clORjQoUR5H8DqkJUsviCI4rnII4PHQqs=,iv:qnBD0XFhNc1PLp0EhUbNUlkhUV6VPRimvEB6+ez/S6U=,tag:3fS+Hv2tnhjnp79z/sbbAw==,type:str]
OAUTH_HOST=ENC[AES256_GCM,data:M9/SH8mc0GLyW/O6bxuuwln9iGZxveQ=,iv:jmRfBe9T8qOIMQdJRmru2YY+1jl8jZU0iF1EezseCoU=,tag:NZP7dyoKouwYf9ml5h3sRQ==,type:str]
OAUTH_URL=ENC[AES256_GCM,data:LF5ZIRXG6U0omwSdF2UcJlIqqkkOUmuVJaZ1MfpE0Q==,iv:hNPjmW7KxZ4E/WEqGiZXy/7p/0PXinwQGWsJjnuFOV0=,tag:UNxjuvhNYA1moAtfUDxdAw==,type:str]
KEYCLOAK_HOST=ENC[AES256_GCM,data:+JQMmo2jx2rQps4igh7waNzB30SZJ4uQ4gu+ZQ==,iv:lnbcjSnbmgxdgGl1dLq+bT3Z0u/WiLfCJf0U/xbIgNo=,tag:5cz3UK+Wib/0OGFrvhJYOQ==,type:str]
KEYCLOAK_LOGOUT_URL=ENC[AES256_GCM,data:MK22PJRrPOItah05shIQjL162iwimz6Riv/dJQCH3HOr5IxgxdlpO0LphQdidl8Mq5/kXPDjSF97zndKJSGYT5tYzDIw+WYKH8XFVCdJSn+4,iv:ZHYTkZfX2d/Xm45adzVx+kivOQQOSOLe+Qx4KGKxUe0=,tag:TPQz9q+UqdWe5DmmsdNOtw==,type:str]
KEYCLOAK_RESET_PASSWORD_URL=ENC[AES256_GCM,data:5n1tmpOq8sp4JByFMaXg4MFPuTcg1vzkkkwsOSeC0vap2YTbk8zLTq9hKBIq8se5Xu4+U5IAH/NJ6y9ZnlOTxErbfVyYqyUYhOjJlpRN1A==,iv:I9OZpeUCGG8AoS4mlKCysRbkGKOpa9E4W4XPwy52x8o=,tag:S4J2YxycYmcNA7vm3MYPXQ==,type:str]
#ENC[AES256_GCM,data:N9lt1ku0kWezOzU=,iv:5LexmCvP6OURTVL6h4AIhvMJ2N36A4zmS5INVP3c0Zg=,tag:014R0t4JdmD4b+Y3eInTAw==,type:comment]
#ENC[AES256_GCM,data:gRq6YCJi2PBbXL6tfT1BiRCTEmhBNvUjJlOb9W4gHXy5UdiG+t9nEd16454fK0IAs1hMtPQR4CM6vOS1IMOwSs6SH49jbsNMYfj0VFJbQ/0vIemCnBxXxirQDcsnteA=,iv:CzY3YXa/OeovbpPm9W6fl4dHWN6qQ7d7rRdOirSfFmA=,tag:6/SqZW/B5wzApINeGNricA==,type:comment]
JWT_SECRET=ENC[AES256_GCM,data:6ZVN1QdhLGD1XvT1nBqQ0krTJZzMvBYco3L9avPGPSKI5Je9LEZPobmmduB7M+huEr6Pf78Cwjtco4c8YPzlCJy5UGKPmVCcbKRW28lg2SEOkFfX2EGgnH8+gQI3FwqVhSh+Ytvxa1SbYki4Vxt/JSNAEye4IkPOVy6pJsGacXKIlxpW0/t2elFd4opN5AXyIz10DpKh0l4BcJyPclJwBf2xrhevBtImFQAOhMnKzNC4d1v1H0MOkk582Divhqy+6LyqcuLnViKVeGW80C5PAkgTl0b40ICiv9wbEx95zs5GHubAkTvr55Of/j9QCJVAqgcQbyZ4kvVhepmH59lPOBIQmo9LbYIXeatvuL3eXWbg30pKMr138iyveHvZKqD4C+1nQpyGP8j0oTVHLwoDaVYE8Zci5zmAye/IlbmiIo4kJ7nJ/+01P/naDJ3VN1JAQh0l+tAJL0ljjaI5z08RDELYmHjX85EoTQE2lK3JcrPsRxFpweOyZ0URnsSi8S6GScUsNsS9p4PxYyPm9qHTA883Vf8ynazSDwUORrLNdkDYYD//J6E7TH/0+rzCr1+6NoKuVJQa3w+JpmvOalo=,iv:R2mo7zgN6qFWHOtAS6edRhG4rqzqWPMPZhZW6aiPR08=,tag:+aHl7jALGJIRV6O+PdZ4jQ==,type:str]
JWT_SECRET_ALGORITHM=ENC[AES256_GCM,data:XDRz9iIE3g==,iv:Cc5MgIzqrEaurbf+Le5j6uIxJHgMpIJUxZXGJXskxPg=,tag:qSrIC+a/4vTjHV2rfWqWFw==,type:str]
KEYCLOAK_CLIENT_ID=ENC[AES256_GCM,data:m8H4GoIpRUkaLg==,iv:8OCwpszD+hZB9vlg6YadjbVH54vGoUgsOf2o6ddxxSU=,tag:vdL40B4IFkKmJiTfZZOssg==,type:str]
KEYCLOAK_CLIENT_SECRET=ENC[AES256_GCM,data:+HdIXIiufW46r4jStwDYowB4bzrh5qHCKQctVeeSrAQ=,iv:Rv3yGiE5V0iwIJGYQtFLEWalsOVNYDGyJrvVJJhyKZs=,tag:KIPXVmor/7ZT75vUvf7Cjw==,type:str]
KEYCLOAK_API_CLIENT_ID=ENC[AES256_GCM,data:l57fjJriIsm0Kw==,iv:crO5L4M2QjqeaXjreHHkBlMXQcdakvEd/Bk06Msx54Y=,tag:0vsbeUMe6h7CoPa3gqW5tg==,type:str]
KEYCLOAK_API_CLIENT_SECRET=ENC[AES256_GCM,data:MOjNv+b+Y/opn1x2+XbNQUQxWGjqX6boe6edB32WO68=,iv:4FQlIJYyLesJ6s5V4jkmAnmGrnvNZr40bFuZDgKusFY=,tag:Flg+z9lxYqK4Sfgjkszbqw==,type:str]
KEYCLOAK_URL=ENC[AES256_GCM,data:ULHj2RkmWInX2NXUyejyWKFnEVQ/KogImeMBf7FhloIN47wn,iv:ASPZ8TQEPhP0eEMSgqWLaptuPVghVNuC/zrcMbQdMJw=,tag:qOddEqa3r3qwFmNf7X2zlg==,type:str]
OAUTH2_COOKIE_SECRET=ENC[AES256_GCM,data:soU8zuT0NGuUvvya/IHN+trz/rYuTPd6zSYuLO+X8X+183CU5ucc0OyRlQI=,iv:COHi9/CfFTTLZsCbtiFzr1GmgmwYCWzwxq+mtihzdXU=,tag:mLPEdVTAgRo2fw28O20/nA==,type:str]
DOC_HOST=ENC[AES256_GCM,data:Texra/onfGrk0ZzVEGnPpouNEfN8ARpN2nm+gw==,iv:yMTTLdp08cM79/LAxg4IAx8jfsZpdmhEEGNtvvyI+aI=,tag:pIYU2jLaBF/ghqqlqcOrkw==,type:str]
DOC_URL=ENC[AES256_GCM,data:JSopzUEWEUqlriyChx7l71ytx2Qo/E5hIJyQ6gvKAfNXhY+p,iv:pI+fRxhkj8XNdBQD3vQtYeEufJiOHyYBTaU1EfKN1k0=,tag:Qi3k+wgc7+0J8bZonbf6Lw==,type:str]
#ENC[AES256_GCM,data:S90vOmHJTHvS,iv:f4+I/J76teIcKhOAf+FynNAEgwazfbE2KG6XTnPMIWY=,tag:xTT2JyLi5cClaMoBQPvEnA==,type:comment]
PGHOST=ENC[AES256_GCM,data:wCdK7rAREeaR,iv:4ib2xK5XvJGf0ey6SFxLhd6rD8OrAgnptcWsfASZ9o4=,tag:VEUg0SeIZyywih1rS8KnvQ==,type:str]
PGPORT=ENC[AES256_GCM,data:NwsRQw==,iv:lZvNtghMe69nq8QihKLGD9UO/WNWim+zCv4uwJd6ifI=,tag:lNavbqN7jsvGHckSYo39xA==,type:str]
PGDATABASE=ENC[AES256_GCM,data:oD436Mfh,iv:wf8lpQje1Y2HQhC7WJNoN/fSsGKoCbgxcSBWLhqO8yE=,tag:1nViiB69qsoX6kyNWxZDlg==,type:str]
PGUSER=ENC[AES256_GCM,data:Txu3icEoJDI=,iv:kRB+0UuphXHQyD2rrI91acvrkIiyuY6rpZVXve2VVzo=,tag:sTkEyUNaEULY8j8ORIKAuQ==,type:str]
PGPASSWORD=ENC[AES256_GCM,data:iU8I6bmY+Fw=,iv:FFkKhmV3y8CMlcEXI3xH65eAEaHfrHSVSLFKxwxDHBE=,tag:jwJ53i8utKEW6dRDS6alpg==,type:str]
#ENC[AES256_GCM,data:td44/NdM,iv:IinYlBRhaqHH6f4Z74E3YLmo+bNHICvxmlf4GtUd7KU=,tag:XKyJhY3NZn2j2/d98pSg4A==,type:comment]
ADMIN_EMAIL=ENC[AES256_GCM,data:dDLl601wvPiv7qJpJA4lcX3oyA==,iv:7JH9gTtMh2si9zllW9jv8+ZIttN6G/MpdrPNGyXFgws=,tag:OKSJbnqs6OiVInXjYnkUKA==,type:str]
#ENC[AES256_GCM,data:iPvUezMqJ50XFKAk,iv:kK64crlHqHFKLiaIeaxYLUUrYuoYiJ0MbZzPgsgvk2I=,tag:lIwhh+KyvKZXGH/ou2DPRA==,type:comment]
API_MAILJET_REPLY_TO_EMAIL=ENC[AES256_GCM,data:rFEUjqXVctv06K7bSiNPbzfERQ==,iv:R/nhYKG75n7z671I8eXCsK0nSIZ23SJgB0Y2QiG9nJc=,tag:OodzfMsk36Qq9TVFnh1GKg==,type:str]
API_MAILJET_EMAIL=ENC[AES256_GCM,data:beS46BHcIcfeVFXzQ8x4WoankZ94rGpVDV5t,iv:7mThXDLURvNsccrq6vpvO8EHts044KcI/HvmVH2jqKo=,tag:x3iMT5tPCAjwi9XThspf2w==,type:str]
API_MAILJET_KEY=ENC[AES256_GCM,data:R10dswVdPyZR9uSB2WvU6nofVZL5QeiotNNtJSIh96U=,iv:ttS7Lh550WdJJoQTKUCnrwQDsCG5KciCIPIIeeZ4dCQ=,tag:mthQFM0Mpmh9szU1IwOX5g==,type:str]
API_MAILJET_SECRET=ENC[AES256_GCM,data:S5eyfuwqchmk/KaYPXUKBiO6kQQUYleaAXd60CE6fZk=,iv:GOeGt+teA//u12CJ8d8SS4j5cDuj3fqMEv03giqCm8Y=,tag:tvsEsBg5MoWdE/lj0f3iKA==,type:str]
API_MAILJET_SERVER=ENC[AES256_GCM,data:ImbAdFHdvdT8FrVBrEzrgtg=,iv:YhIZvkysQayurmw8kwc4MtzLvQFIW4Eg1b7MSW4nvL0=,tag:xI8Sz0RbHTOB92tlJPGagg==,type:str]
API_MAILJET_CONTACTS_LIST_ID=ENC[AES256_GCM,data:CSet5r7yuo8=,iv:LitklZZraH7HHKpzQG3SwI9GVHs5rtNDw2zOsgsRiq4=,tag:cW6N72PCPRVFSzzylMSTIQ==,type:str]
API_MAILJET_EXPLOITANTS_GUYANE_LIST_ID=ENC[AES256_GCM,data:SQih7xecTxo=,iv:fGsQT3BbgGvcvh4VKepKeT4cRpuznScnry47/NrKG70=,tag:FzU4108utxTw7zLPfBaIfA==,type:str]
#ENC[AES256_GCM,data:zMa3/6vIVKCtHd40lO5a4qdy0Q==,iv:vwaTetd4NQCewMwXYjprhYfbsZp4TcDwIQKScK4mt1s=,tag:TT7gXNeUOB5v2XeqpuK+cQ==,type:comment]
API_ADMINISTRATION_URL=ENC[AES256_GCM,data:xVZo2FCPbMD78cHOhu8f64p6Q4cOnlFzPZ4iUlF2kAwDd65AcnmD4ofLSP0=,iv:XCo/32mUUc0MVBaZF7TfGoLdIRCZMs/38q53e1gcyxo=,tag:Ffo0FjKCcODj4BXa5sOR6g==,type:str]
#ENC[AES256_GCM,data:/wV9P1nOIPKRBA==,iv:ygqkC6U4NqKQpFqwhGWRmxE00VniCNdA1aJ9trsbohs=,tag:tnEjXU6+GgHXNuBkq4/cFg==,type:comment]
API_INSEE_KEY=ENC[AES256_GCM,data:WS5baZ02ZU/bpyQ2YkgWquD8rAhmydYSxipmmQ==,iv:vh9kOBKlov2NzpK5bzEEyPDb0VralVjEgwVrmFjTsic=,tag:Fn1DWOFEQjQvZdgx5Utm2w==,type:str]
API_INSEE_SECRET=ENC[AES256_GCM,data:j8sbpzNx25yFIcSzOVbghNuNH/wC4wKNcpjTOA==,iv:Km6N284lAWppFZoBvHo97t+Y8WxA+4mlvku+zT/oOwU=,tag:XZU9vfXZYhrgFfKEviZ9vA==,type:str]
API_INSEE_URL=ENC[AES256_GCM,data:C5q29yRp3luk04KCnHbnAC/G8vsfqg==,iv:FdJyGrdACpRT6m+jjJ7MbF4RmRSZ7QONdcnGFwGgjDc=,tag:BMa9FfNaVgyjJGZvao10Xg==,type:str]
#ENC[AES256_GCM,data:rPVjfWEdGaltqFU=,iv:brvmIBHlHugODEW/gv2gCPf3TD54Nqr9DpzusH3iBhQ=,tag:MgnCgB2CTiGrjgEVX9aa0w==,type:comment]
API_MATOMO_URL=ENC[AES256_GCM,data:E0PYMVISt5Uh9YVjWW+CXJ389xnzOS0878mnYSARFufMfR6tNioy6XQJXvRojHLVq0L1TSkz/VqHxA==,iv:nsQdPfee8Mr8RQY/sYDLdKD5ZNbuu7DIyky1tk+wXY8=,tag:sS57EumrgCuk4jFcgRIgxg==,type:str]
API_MATOMO_ID=ENC[AES256_GCM,data:KHEjUQ==,iv:uDP2/XAp8SFnzngZ+IPuiFETpNCy0elzqFD0koJXwq0=,tag:sL98l8vjH3DC5Zn0EMzRuQ==,type:str]
API_SENTRY_URL=ENC[AES256_GCM,data:AX/qmOey1LhQgoZT/HtTuEJuAVWDMzmTWAyC2v0ai8Lz2zqJE5zI71VxMD4CEgksFQvVkbWrDWrO7LW3Nz4of4M=,iv:uLknqApzdYDe4lUJynYTONRfGeXVick2XyHB5ewRyCY=,tag:qv3su4VKCHJSPvWYsfFP5A==,type:str]
#ENC[AES256_GCM,data:lpwwbAt7EA==,iv:otZ1UbTLgaC7IBc0BbhQbPjPvHZbqDf1P0XhqHiTBQ8=,tag:eVeDHCtES+y6f8swGkw/+A==,type:comment]
RESTIC_REPOSITORY=ENC[AES256_GCM,data:613maV9BpmfqX1CzsxZ3KCCKKIVdJikYzHeImifeX081AtCkhCqOAZVnaZpj1Y/rIMYr835p5Afp2uOCWFBE5x8BBaWQY7AwuY00Q/G3uszV39uhEy45,iv:UmiNCq9gJYSYXM7iqYmoLDkje5mv8+u26q43WzVndVI=,tag:CNBWbzKoOJabPD8+vsxxXQ==,type:str]
RESTIC_PASSWORD=ENC[AES256_GCM,data:0JMrOZHcl1O73gjszMiNgJgivWC+SM/9bKXskXfRNX+o067sR+lK3Kbwc71tANvsNuEBUo72v1OBwT0O0v9NnoXkGgCEx/Frv0ZKSgedEnL5if1i3Ei+F+ZiKq2SgUFP8bu/uBXFWccC0p+5EoXH8++Gg5r1uNzvSMF7C5lSnxc=,iv:ThSxl1SUCZn4f7cqQnLwv9YFnM9br+dKwLRZ9S+Wf/I=,tag:nLtU8pzV4H0LHxW1VU2oxg==,type:str]
AWS_ACCESS_KEY_ID=ENC[AES256_GCM,data:VNOivS/vFrj5Z5A2Tsqp27xV6VUMFG+3jq6ODjOeuuY=,iv:akcXpNsgIwYHfadXQ91kYOf5v2X9xuyDOlnLIkrFgcY=,tag:4vNUgkLSIBQe8VH7qAp6/A==,type:str]
AWS_SECRET_ACCESS_KEY=ENC[AES256_GCM,data:CF7DrPZaAU8AydLQaT9nuqHVLYHhmnpcn8h1qP0IBug=,iv:nTSgI1Tw2djoZ3jQyfUffKofqJ0lqqEXPYGL6ruTTjk=,tag:RzNaonM872eac9GSYM76RQ==,type:str]
TCHAP_HOOK=ENC[AES256_GCM,data:VEL2aatRIwVKveanTSg6l8cRaPkTg8iHB0799yGmITopnMqkuzmEAUt/69PGAayykdjkw2DS04sW68Wv1nty7oU8DCFV7t4Mw1nm7zn/3nshKjXTi4qX/aghNSQ8ewvRiw5pIJsjQpXa7FOZTqFDrQ8QhAWmOF1n5/OSdZ8+poYIcMWvdggffWwbw7bIkla0HHuyHslWwOb0Yw==,iv:7NPlWwxeq9oIJHw8LxvyGQygf0Rdfx8IjZHrHsajX7I=,tag:yKQ53RDHVO/6ahb7bh5aJQ==,type:str]
sops_age__list_0__map_enc=-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB1WS9NZTk3L2l2ZGpIbTFE\nL0s5R21Pd1FFZnEwYTgrUFFlNnlqbU9pNWprCjFKajFUa0t5ZW5UalZ0SFpMRFFa\nZDBKNFRIMXhkV1hqVWlRNnpqTUI3Z0EKLS0tIGtnZlpQWnlTWjZpaDBrRytKSlhO\nUENPS3pKenIvSG5PN1NaazI0c05xUkkKHdBa/RdOrUzmRNLCz18T3HukuEvlWRUU\n5Vb7mm5LEqEy694R7c+u0rM0y5fVyXTf9QEtrRLnBJNqE+LJxVhatg==\n-----END AGE ENCRYPTED FILE-----\n
sops_age__list_0__map_recipient=age1m0v4x0c32qjqs6rl3y6h2vee3sdm5y6rvzwyccl306n48d8lzvhse52hp4
sops_age__list_1__map_enc=-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBhT0MzUkhOWldCNmZuUnpi\nNVp6U1VOREEyclkzUlNmSXRnc3NOZWQ4NEZZCmdLTThVNm55aGswYUo1UkNoVERQ\nR0FVaHk0VElSOFd5UnFxeFA4ZFBPVFUKLS0tIC9ETUQxUjFhTHUzMWxIY2JGcUg3\nTVJjaGlBd0FPN0dlSXhhNzJzRit0RGMKY6jgyXgRioXPFhe9lSZhipBtNl9p3ssm\niN2GL1YJkwTP51GjaRS3SkbkzV498SC+EwRSE6rufNj4ykzFejLaTQ==\n-----END AGE ENCRYPTED FILE-----\n
sops_age__list_1__map_recipient=age1z4cm6tk86r05u84w8rxf4c04ndnuc7wj03psqugfwy03uwqutv0s88wz6f
sops_lastmodified=2024-10-17T15:39:24Z
sops_mac=ENC[AES256_GCM,data:A4Jy/QlZhG1kQ55R2sh0WHT2zTsxD7WVZ8m8ceyd13dH0KNi4H1gxtQSZwAN1zo/vwFWKYWPzbgOOwcTFrqrG9dDTVNCmMefQSnbn/r/D5uA8DEab98kLi7TOvs1S+GeU7++ec2bBpLIclK1cUh/GGSPdViG/svlifvzAgPBMLk=,iv:eZZXxEfv9//2CCvDoU0x7ZoZRJCi97visHgjGzVzKDc=,tag:8y6bFDn/OPSKVK14m5Leeg==,type:str]
sops_unencrypted_suffix=_unencrypted
sops_version=3.9.1
......@@ -12,3 +12,5 @@ packages/ui/storybook-static/
.vscode
**/coverage
.cargo
team.age
*.no-commit.env
......@@ -2,27 +2,49 @@ default:
tags: [global, shared]
interruptible: true
stages:
- prepare
- test
- build
- deploy
include:
- project: 'share/devops/squelettes/gitlab/eco'
file: 'deploy_eco_compose.yaml'
ref: 'main'
build-ci-image:
stage: prepare
image:
name: gcr.io/kaniko-project/executor:debug
entrypoint: [""]
script: .gitlab/build-ci-image.sh
get_camino_tag:
stage: deploy
# FIXME
# script: echo "CAMINO_TAG=${CI_COMMIT_SHA}" > out.env
script: echo "CAMINO_TAG=267ad27021581c7c23b1d7c1dff0e61cbc18649e" > out.env
artifacts:
reports:
dotenv: out.env
retry:
max: 2
deploy_app_via_compose:
tags: [dnum-paas-eco]
needs: [get_camino_tag]
extends: .deploy_eco_compose
stage: deploy
script:
- paas-docker-down-and-up --compose-path docker-compose.yml --dotenv-path .dev.env --vars CAMINO_TAG
include:
- local: .gitlab/global.yml
- local: .gitlab/deploy.yml
- local: .gitlab/ci/*.yml
rules:
- if: $CI_COMMIT_BRANCH && $CI_COMMIT_BRANCH != "prod" && $CI_COMMIT_BRANCH != "preprod"
stages:
# - prepare
# - test
# - build
- deploy
# build-ci-image:
# stage: prepare
# image:
# name: gcr.io/kaniko-project/executor:debug
# entrypoint: [""]
# script: .gitlab/build-ci-image.sh
# artifacts:
# reports:
# dotenv: out.env
# retry:
# max: 2
# include:
# - local: .gitlab/global.yml
# - local: .gitlab/deploy.yml
# - local: .gitlab/ci/*.yml
# rules:
# - if: $CI_COMMIT_BRANCH && $CI_COMMIT_BRANCH != "prod" && $CI_COMMIT_BRANCH != "preprod"
FROM mcuadros/ofelia:0.3.13
RUN apk add -U restic postgresql16-client postgresql16-contrib docker-cli bash
COPY restore-last-backup /
COPY config.ini /etc/ofelia/config.ini
FROM quay.io/keycloak/keycloak:25.0.5
# Utiliser le makefile, mettre à jour la version à la main
COPY keycloak-franceconnect-6.2.0.jar /opt/keycloak/providers/keycloak-franceconnect-6.2.0.jar
COPY keycloak-bcrypt-1.6.0.jar /opt/keycloak/providers/keycloak-bcrypt-1.6.0.jar
COPY keycloak_theme/ /opt/keycloak/themes/camino/
FROM nginxproxy/nginx-proxy:1.6.1
# Utiliser le makefile, mettre à jour la version à la main
COPY proxy.conf /etc/nginx/proxy.conf
......@@ -21,6 +21,7 @@ docs/generate-schema:
daily:
ifdef CAMINO_STAGE
npm run daily -w packages/api
@curl -i -X POST -H 'Content-Type: application/json' -d "{\"message\": \":tada: daily fini sur ${ENV} :tada:\"}" ${TCHAP_HOOK}
else
@echo 'lancement du daily en mode local avec la migration'
npm run db:migrate -w packages/api
......@@ -240,3 +241,29 @@ graphql/check:
echo $$f; \
graphql-inspector validate --noStrictFragments "$$f" packages/api/src/api/graphql/schemas/index.graphql || exit 1; \
done
dev/chiffre:
SOPS_AGE_RECIPIENTS=$$(cat team.age.pub ecocompose.age.pub | sed -z 's/\n/,/g;s/,$$/\n/') sops --encrypt --input-type dotenv --output-type dotenv .dev.no-commit.env > .dev.env
dev/dechiffre:
SOPS_AGE_KEY_FILE=team.age sops -d --input-type dotenv --output-type dotenv .dev.env
# TOTO 2024-10-21 une fois tout migré sur ecoCompose, il faudra supprimer tout ce qu'il y a dans infra sauf le dossier ecocompose
keycloak/build:
docker build -t caminofr/camino-keycloak:25.0.5 -f Dockerfile.keycloak infra/ecocompose/keycloak/
keycloak/push:
docker push caminofr/camino-keycloak:25.0.5
nginx-proxy/build:
docker build -t caminofr/camino-nginx-proxy:1.6.1 -f Dockerfile.nginx-proxy infra/ecocompose/nginx-proxy/
nginx-proxy/push:
docker push caminofr/camino-nginx-proxy:1.6.1
cron/build:
docker build -t caminofr/cron:1.0.0 -f Dockerfile.cron infra/ecocompose/crons/
cron/push:
docker push caminofr/cron:1.0.0
......@@ -11,13 +11,11 @@ services:
APPLICATION_VERSION: ${CAMINO_TAG}
VIRTUAL_HOST: ${API_HOST}
VIRTUAL_PORT: ${API_PORT}
LETSENCRYPT_HOST: ${API_HOST}
LETSENCRYPT_EMAIL: ${LETSENCRYPT_EMAIL}
PGHOST: db
expose:
- ${API_PORT}
volumes:
- ./files:/project/packages/api/files
- $EDCS_DATA_STACK/files:/project/packages/api/files
- ./.env:/project/.env
networks:
- default
......@@ -31,13 +29,16 @@ services:
POSTGRES_USER: ${PGUSER}
POSTGRES_PASSWORD: ${PGPASSWORD}
POSTGRES_DB: ${PGDATABASE}
# from https://github.com/docker-library/docs/blob/master/postgres/README.md
# On autorise tout, on part du principe que la vm est sécurisée et que les conteneurs qui ont accès à cette VM ne peuvent être que les notres
POSTGRES_HOST_AUTH_METHOD: trust
expose:
- ${PGPORT}
networks:
- default
volumes:
- ./postgresql:/var/lib/postgresql/data
- /srv/backups/dump/:/dump/
- $EDCS_DATA_STACK/postgresql:/var/lib/postgresql/data
- $EDCS_DATA_STACK/backups/dump/:/dump/
restart: unless-stopped
docs:
container_name: camino_docs
......@@ -45,8 +46,6 @@ services:
environment:
VIRTUAL_HOST: ${DOC_HOST}
VIRTUAL_PORT: ${DOC_PORT}
LETSENCRYPT_HOST: ${DOC_HOST}
LETSENCRYPT_EMAIL: ${LETSENCRYPT_EMAIL}
expose:
- ${DOC_PORT}
networks:
......@@ -68,6 +67,23 @@ services:
- default
- nginx-proxy
restart: unless-stopped
cron:
container_name: camino_cron
image: caminofr/cron:1.0.0
environment:
ENV: ${ENV}
TCHAP_HOOK: ${TCHAP_HOOK}
DOCKER_HOST: unix://tmp/docker.sock
RESTIC_REPOSITORY: ${RESTIC_REPOSITORY}
RESTIC_PASSWORD: ${RESTIC_PASSWORD}
AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
networks:
- default
restart: unless-stopped
volumes:
- $EDCS_DATA_STACK/backups/:/srv/backups/
- /var/run/docker.sock:/tmp/docker.sock:ro
oauth2:
container_name: camino_oauth2
image: quay.io/oauth2-proxy/oauth2-proxy:v7.6.0
......@@ -77,8 +93,6 @@ services:
environment:
VIRTUAL_HOST: ${OAUTH_HOST}
VIRTUAL_PORT: ${OAUTH_PORT}
LETSENCRYPT_HOST: ${OAUTH_HOST}
LETSENCRYPT_EMAIL: ${LETSENCRYPT_EMAIL}
OAUTH2_PROXY_PROVIDER: 'keycloak-oidc'
OAUTH2_PROXY_CLIENT_ID: ${KEYCLOAK_CLIENT_ID}
OAUTH2_PROXY_CLIENT_SECRET: ${KEYCLOAK_CLIENT_SECRET}
......@@ -86,11 +100,13 @@ services:
OAUTH2_PROXY_OIDC_ISSUER_URL: https://${KEYCLOAK_HOST}/realms/Camino
OAUTH2_PROXY_REDIRECT_URL: https://${OAUTH_HOST}
OAUTH2_PROXY_HTTP_ADDRESS: 0.0.0.0:${OAUTH_PORT}
OAUTH2_PROXY_UPSTREAMS: http://ui:${UI_PORT}
OAUTH2_PROXY_UPSTREAMS: http://camino_ui_app:${UI_PORT}
OAUTH2_PROXY_EMAIL_DOMAINS: "*"
OAUTH2_PROXY_SKIP_PROVIDER_BUTTON: true
OAUTH2_PROXY_PASS_ACCESS_TOKEN: true
OAUTH2_PROXY_SKIP_AUTH_ROUTES: "/*"
NO_PROXY: ${EDCS_PROXY_NO},camino_ui_app
no_proxy: ${EDCS_PROXY_NO},camino_ui_app
# nécessaire pour garder le basic auth
OAUTH2_PROXY_PASS_BASIC_AUTH: true
OAUTH2_PROXY_SKIP_AUTH_STRIP_HEADERS: false
......@@ -108,7 +124,7 @@ services:
- nginx-proxy
keycloak:
container_name: camino_keycloak
image: quay.io/keycloak/keycloak:25.0.5
image: caminofr/camino-keycloak:25.0.5
depends_on:
- db
environment:
......@@ -121,14 +137,6 @@ services:
KC_PROXY: "edge"
VIRTUAL_HOST: ${KEYCLOAK_HOST}
VIRTUAL_PORT: ${KEYCLOAK_PORT}
LETSENCRYPT_HOST: ${KEYCLOAK_HOST}
LETSENCRYPT_EMAIL: ${LETSENCRYPT_EMAIL}
volumes:
# A Synchroniser avec ansible infra/roles/camino/tasks
- ./keycloak-franceconnect-6.2.0.jar:/opt/keycloak/providers/keycloak-franceconnect-6.2.0.jar
# FROM https://github.com/leroyguillaume/keycloak-bcrypt
- ./keycloak-bcrypt-1.6.0.jar:/opt/keycloak/providers/keycloak-bcrypt-1.6.0.jar
- ./keycloak_theme/:/opt/keycloak/themes/camino/
command: "start"
expose:
- ${KEYCLOAK_PORT}
......@@ -136,7 +144,19 @@ services:
networks:
- default
- nginx-proxy
nginx-proxy:
image: caminofr/camino-nginx-proxy:1.6.1
container_name: nginx-proxy
restart: unless-stopped
logging:
options:
max-size: "10m"
max-file: "3"
ports:
- "80:80"
volumes:
- $EDCS_DATA_STACK/nginx_vhost:/etc/nginx/vhost.d
- $EDCS_DATA_STACK/nginx_html:/usr/share/nginx/html
- /var/run/docker.sock:/tmp/docker.sock:ro
networks:
nginx-proxy:
external: true
age1z4cm6tk86r05u84w8rxf4c04ndnuc7wj03psqugfwy03uwqutv0s88wz6f
#!/bin/bash
set -eufo pipefail
source /srv/scripts/restic_data
if [ "$(id -u)" != "{{camino_user_uid}}" ]; then
echo "This script must be run as user 'camino'" 1>&2
exit 1
fi
# backup
USER_GROUP_ID=$(getent group users | cut -d: -f3)
docker exec camino_api_db pg_dump --clean --if-exists --no-owner --no-privileges -B --dbname=camino --format c > /srv/backups/dump_without_files.backup
docker exec camino_api_db /bin/bash -c 'rm -rf /dump/*'
docker exec camino_api_db vacuumlo camino
docker exec camino_api_db pg_dump --clean --if-exists --format=d --no-owner --no-privileges --dbname=camino -f /dump
docker exec camino_api_db chown -R "{{camino_user_uid}}:${USER_GROUP_ID}" /dump
chown camino:users -R /srv/backups/
restic backup /srv/backups/
[job-exec "daily"]
schedule = 0 0 4 * * *
container = camino_api_app
command = make daily
tty = true
[job-exec "monthly"]
schedule = 0 0 6 1 * *
container = camino_api_app
command = make monthly
tty = true
[job-exec "cleanup_downloads"]
schedule = 0 0 5 * * *
container = camino_api_app
command = rm -rf /project/packages/api/files/downloads/*
tty = true
[job-exec "cleanup_temp_files"]
schedule = 0 30 5 * * *
container = camino_api_app
command = find /project/packages/api/files/tmp/ -mtime +7 -type f -delete
tty = true
[job-local "restore_backup"]
schedule = 0 0 6 * * 0
command = /restore-last-backup
#!/bin/bash
set -eufo pipefail
if [ "${ENV}" = "prod" ]; then
echo "This script must not run in production" 1>&2
exit 1
fi
echo 'Mise en place des fichiers de prod'
restic restore latest --no-lock -t /
echo "Arrêt de l'api et de keycloak"
docker stop camino_api_app camino_keycloak
echo "Insertion du dump de la BDD"
docker exec -i camino_api_db dropdb --username=postgres camino
docker exec -i camino_api_db createdb --username=postgres camino
docker exec -i camino_api_db pg_restore --clean --if-exists --no-owner --no-privileges --dbname=camino /dump
echo "Redémarrage de l'api et de keycloak"
docker restart camino_api_app camino_keycloak camino_ui_app
curl -i -X POST -H 'Content-Type: application/json' -d "{\"message\": \":tada: Dernier backup appliqué sur ${ENV} $(restic snapshots --no-lock | tail -3 | head -1 | cut -d' ' -f3) :tada:\"}" ${TCHAP_HOOK}
File added
File added
<#import "template.ftl" as layout>
<@layout.registrationLayout displayInfo=true displayMessage=!messagesPerField.existsError('username'); section>
<#if section = "form">
<main class="fr-pt-md-14v" role="main" id="content">
<div class="fr-container fr-container--fluid fr-mb-md-14v">
<div class="fr-grid-row fr-grid-row-gutters fr-grid-row--center">
<div class="fr-col-12 fr-col-md-8 fr-col-lg-6">
<div class="fr-container">
<h1>Récupération de mot de passe sur Camino</h1>
</div>
<div class="fr-container fr-background-alt--grey fr-px-md-0 fr-py-10v fr-py-md-14v">
<div class="fr-grid-row fr-grid-row-gutters fr-grid-row--center">
<div class="fr-col-12 fr-col-md-9 fr-col-lg-8">
<div>
<form id="login-1760" onsubmit="login.disabled = true; return true;" action="${url.loginAction}" method="post">
<fieldset class="fr-fieldset" id="login-1760-fieldset" aria-labelledby="login-1760-fieldset-legend">
<legend class="fr-fieldset__legend" id="login-1760-fieldset-legend">
<h2>Récupérer le mot de passe de votre compte</h2>
</legend>
<div class="fr-fieldset__element">
<p class="fr-text--sm">Description — Veuillez saisir l’adresse électronique associée à votre compte. Nous vous enverrons plus d’informations pour réinitialiser votre mot de passe.</p>
</div>
<div class="fr-fieldset__element">
<#if messagesPerField.existsError('username')>
<div class="fr-alert fr-alert--error fr-mb-3w">
<h3 class="fr-alert__title">${kcSanitize(messagesPerField.getFirstError('username'))?no_esc}</h3>
</div>
</#if>
<fieldset class="fr-fieldset" id="credentials">
<div class="fr-fieldset__element">
<div class="fr-input-group">
<label class="fr-label" for="username-1757">
${msg("email")}
<span class="fr-hint-text">Format attendu : nom@domaine.fr</span>
</label>
<input tabindex="1" autofocus class="fr-input" autocomplete="username" aria-required="true" name="username" id="username-1757" type="text" value="${(login.username!'')}" aria-invalid="<#if messagesPerField.existsError('username')>true</#if>">
</div>
</div>
</fieldset>
</div>
<div class="fr-fieldset__element">
<ul class="fr-btns-group">
<li>
<button tabindex="2" class="fr-mt-2v fr-btn" name="login" type="submit">
Valider
</button>
</li>
</ul>
</div>
<div class="fr-fieldset__element">
<a class='fr-link fr-link--icon-left fr-icon-arrow-left-line' href="${url.loginUrl}">${kcSanitize(msg("backToLogin"))?no_esc}</a>
</div>
</fieldset>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</main>
</#if>
</@layout.registrationLayout>
<#import "template.ftl" as layout>
<#import "password-commons.ftl" as passwordCommons>
<@layout.registrationLayout displayMessage=!messagesPerField.existsError('password','password-confirm'); section>
<#if section = "form">
<main class="fr-pt-md-14v" role="main" id="content">
<div class="fr-container fr-container--fluid fr-mb-md-14v">
<div class="fr-grid-row fr-grid-row-gutters fr-grid-row--center">
<div class="fr-col-12 fr-col-md-8 fr-col-lg-6">
<div class="fr-container">
<h1>Mise à jour du mot de passe</h1>
</div>
<div class="fr-container fr-background-alt--grey fr-px-md-0 fr-py-10v fr-py-md-14v">
<div class="fr-grid-row fr-grid-row-gutters fr-grid-row--center">
<div class="fr-col-12 fr-col-md-9 fr-col-lg-8">
<div>
<form id="login-1760" action="${url.loginAction}" method="post">
<input type="text" id="username" name="username" value="${username}" autocomplete="username" readonly="readonly" style="display:none;"/>
<input type="password" id="password" name="password" autocomplete="current-password" style="display:none;"/>
<fieldset class="fr-fieldset" id="login-1760-fieldset" aria-labelledby="login-1760-fieldset-legend">
<legend class="fr-fieldset__legend" id="login-1760-fieldset-legend">
<h2>Changer votre mot de passe</h2>
</legend>
<div class="fr-fieldset__element">
<#if messagesPerField.existsError('password', 'password-confirm')>
<div class="fr-alert fr-alert--error fr-mb-3w">
<h3 class="fr-alert__title">${kcSanitize(messagesPerField.getFirstError('password', 'password-confirm'))?no_esc}</h3>
</div>
</#if>
<fieldset class="fr-fieldset" id="credentials">
<div class="fr-fieldset__element">
<div class="fr-input-group">
<label class="fr-label" for="password-new-1757">
${msg("passwordNew")}
</label>
<input tabindex="1" class="fr-input" id="password-new-1757" type="password" name="password-new"
autofocus autocomplete="new-password"
aria-invalid="<#if messagesPerField.existsError('password','password-confirm')>true</#if>"
>
</div>
</div>
</fieldset>
<fieldset class="fr-fieldset" id="credentials">
<div class="fr-fieldset__element">
<div class="fr-input-group">
<label class="fr-label" for="password-confirm-1201">
${msg("passwordConfirm")}
</label>
<input tabindex="2" class="fr-input" id="password-confirm-1201" type="password" name="password-confirm"
autocomplete="new-password"
aria-invalid="<#if messagesPerField.existsError('password-confirm')>true</#if>"
>
</div>
</div>
</fieldset>
</div>
<div class="fr-fieldset__element">
<ul class="fr-btns-group">
<li>
<button tabindex="3" class="fr-mt-2v fr-btn" name="login" type="submit">
Valider
</button>
</li>
<#if isAppInitiatedAction??>
<li>
<button type="submit" tabindex="4" class="fr-mt-2v fr-btn fr-btn--secondary" name="cancel-aia">
${msg("doCancel")}
</button>
</li>
</#if>
</ul>
</div>
</fieldset>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</main>
</#if>
</@layout.registrationLayout>
<#import "template.ftl" as layout>
<@layout.registrationLayout displayInfo=true; section>
<#if section = "form">
<div class="fr-alert fr-alert--info fr-mt-3w">
<h3 class="fr-alert__title">${msg("emailVerifyInstruction1",user.email)}</h3>
</div>
</#if>
</@layout.registrationLayout>
\ No newline at end of file
<#import "template.ftl" as layout>
<@layout.registrationLayout displayMessage=!messagesPerField.existsError('username','password') displayInfo=realm.password && realm.registrationAllowed && !registrationDisabled??; section>
<#if section = "form">
<main class="fr-pt-md-14v" role="main" id="content">
<div class="fr-container fr-container--fluid fr-mb-md-14v">
<div class="fr-grid-row fr-grid-row-gutters fr-grid-row--center">
<div class="fr-col-12 fr-col-md-8 fr-col-lg-6">
<div class="fr-container">
<h1>Connexion à Camino</h1>
</div>
<div class="fr-container fr-background-alt--grey fr-px-md-0 fr-py-10v fr-py-md-14v">
<div class="fr-grid-row fr-grid-row-gutters fr-grid-row--center">
<div class="fr-col-12 fr-col-md-9 fr-col-lg-8">
<div>
<form id="login-1760" onsubmit="login.disabled = true; return true;" action="${url.loginAction}" method="post">
<fieldset class="fr-fieldset" id="login-1760-fieldset" aria-labelledby="login-1760-fieldset-legend">
<legend class="fr-fieldset__legend" id="login-1760-fieldset-legend">
<h2>Se connecter avec son compte</h2>
</legend>
<div class="fr-fieldset__element">
<#if messagesPerField.existsError('username','password')>
<div class="fr-alert fr-alert--error fr-mb-3w">
<h3 class="fr-alert__title">${kcSanitize(messagesPerField.getFirstError('username','password'))?no_esc}</h3>
</div>
</#if>
<fieldset class="fr-fieldset" id="credentials">
<div class="fr-fieldset__element">
<div class="fr-input-group">
<label class="fr-label" for="username-1757">
${msg("email")}
<span class="fr-hint-text">Format attendu : nom@domaine.fr</span>
</label>
<input tabindex="1" autofocus class="fr-input" autocomplete="username" aria-required="true" name="username" id="username-1757" type="text" value="${(login.username!'')}" aria-invalid="<#if messagesPerField.existsError('username','password')>true</#if>">
</div>
</div>
<div class="fr-fieldset__element">
<div class="fr-password" id="password-1758">
<label class="fr-label" for="password-1758-input">
Mot de passe
</label>
<div class="fr-input-wrap">
<input tabindex="2" class="fr-password__input fr-input" aria-required="true" name="password" autocomplete="current-password" id="password-1758-input" type="password" aria-invalid="<#if messagesPerField.existsError('username','password')>true</#if>">
</div>
<p>
<a tabindex="4" href="${url.loginResetCredentialsUrl}" class="fr-link">${msg("doForgotPassword")}</a>
</p>
</div>
</div>
</fieldset>
</div>
<div class="fr-fieldset__element">
<ul class="fr-btns-group">
<li>
<button tabindex="3" class="fr-mt-2v fr-btn" name="login" type="submit">
Se connecter
</button>
</li>
</ul>
</div>
</fieldset>
</form>
</div>
<#if social.providers??>
<div class="${properties.kcFormSocialAccountSectionClass!} fr-mb-3w">
<p class="fr-hr-or">ou</p>
<h3>Se connecter avec Cerbère</h3>
<#list social.providers as p>
<a title="Se connecter avec Cerbère - Lien externe" id="social-${p.alias}" class="fr-link fr-link--lg fr-link--icon-right fr-icon-external-link-line fr-grid-row--right" rel="noopener"
href="${p.loginUrl}">${p.displayName!}</a>
</#list>
</div>
</#if>
<hr>
<h2>Vous n’avez pas de compte ?</h2>
<ul class="fr-btns-group">
<li>
<a tabindex="6" class="fr-btn fr-btn--secondary"
href="${url.registrationUrl}">${msg("doRegister")}</a>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
</main>
</#if>
</@layout.registrationLayout>
doLogIn=Connexion
doRegister=Cr\u00e9er un compte
doCancel=Annuler
doSubmit=Soumettre
doBack=Retour
doYes=Oui
doNo=Non
doContinue=Continuer
doIgnore=Ignorer
doAccept=Accepter
doDecline=D\u00e9cliner
doForgotPassword=Mot de passe oubli\u00e9 ?
doClickHere=Cliquez ici
doImpersonate=Usurper l''identit\u00e9
doTryAgain=R\u00e9essayer
doTryAnotherWay=Essayer une autre m\u00e9thode
doConfirmDelete=Confirmer la suppression
errorDeletingAccount=Erreur lors de la suppression du compte
deletingAccountForbidden=Permissions insuffisantes pour supprimer votre propre compte, contactez un administrateur.
kerberosNotConfigured=Kerberos non configur\u00e9
kerberosNotConfiguredTitle=Kerberos non configur\u00e9
bypassKerberosDetail=Si vous n''\u00eates pas connect\u00e9 via Kerberos ou bien que votre navigateur n''est pas configur\u00e9 pour la connexion via Kerberos. Veuillez cliquer pour vous connecter via un autre moyen.
kerberosNotSetUp=Kerberos n''est pas configur\u00e9. Connexion impossible.
registerTitle=S''enregistrer
loginAccountTitle=Connectez-vous \u00e0 votre compte
registerWithTitle=Enregistrement avec {0}
registerWithTitleHtml={0}
loginTitle=Se connecter \u00e0 {0}
loginTitleHtml={0}
impersonateTitle={0} utilisateur usurp\u00e9
impersonateTitleHtml=<strong>{0}</strong> utilisateur usurp\u00e9
realmChoice=Domaine
unknownUser=Utilisateur inconnu
loginTotpTitle=Configuration de l''authentification par mobile
loginProfileTitle=Mise \u00e0 jour du compte
loginIdpReviewProfileTitle=V\u00e9rifiez vos informations de profil
loginTimeout=Le temps imparti pour la connexion est \u00e9coul\u00e9. Le processus de connexion red\u00e9marre depuis le d\u00e9but.
oauthGrantTitle=OAuth Grant
oauthGrantTitleHtml={0}
oauthGrantInformation=Assurez-vous de faire confiance \u00e0 {0} en apprenant comment {0} traitera vos donn\u00e9es.
oauthGrantReview=Vous pourriez examiner
oauthGrantTos=les conditions g\u00e9n\u00e9rales d''utilisation.
oauthGrantPolicy=la politique de confidentialit\u00e9.
errorTitle=Nous sommes d\u00e9sol\u00e9s...
errorTitleHtml=Nous sommes <strong>d\u00e9sol\u00e9s</strong>...
emailVerifyTitle=V\u00e9rification du courriel
emailForgotTitle=Mot de passe oubli\u00e9 ?
updateEmailTitle=Mise \u00e0 jour du courriel
emailUpdateConfirmationSentTitle=Courriel de confirmation envoy\u00e9
emailUpdateConfirmationSent=Un courriel de confirmation a \u00e9t\u00e9 envoy\u00e9 \u00e0 {0}. Vous devez suivre les instructions de ce dernier afin de compl\u00e9ter la mise \u00e0 jour.
emailUpdatedTitle=Adresse courriel mis \u00e0 jour
emailUpdated=La mise \u00e0 jour de votre adresse courriel vers {0} a \u00e9t\u00e9 compl\u00e9t\u00e9e avec succ\u00e8s.
updatePasswordTitle=Mise \u00e0 jour du mot de passe
codeSuccessTitle=Code succ\u00e8s
codeErrorTitle=Code d''erreur \: {0}
displayUnsupported=Type d''affichage demand\u00e9 non support\u00e9
browserRequired=Navigateur requis pour se connecter
browserContinue=Navigateur requis pour continuer la connexion
browserContinuePrompt=Ouvrir le navigateur et continuer la connexion? [y/n]:
browserContinueAnswer=y
termsTitle=Termes et Conditions
termsTitleHtml=Termes et Conditions
termsText=<p>Termes et conditions \u00e0 d\u00e9finir</p>
termsPlainText=Termes et conditions \u00e0 d\u00e9finir
termsAcceptanceRequired=Vous devez accepter les termes et conditions.
acceptTerms=J''accepte les termes et conditions
recaptchaFailed=Re-captcha invalide
recaptchaNotConfigured=Re-captcha est requis, mais il n''est pas configur\u00e9
consentDenied=Consentement refus\u00e9.
noAccount=Nouvel utilisateur ?
username=Nom d''utilisateur
usernameOrEmail=Nom d''utilisateur ou courriel
firstName=Pr\u00e9nom
givenName=Pr\u00e9nom
fullName=Nom complet
lastName=Nom
familyName=Nom de famille
email=Courriel
password=Mot de passe
passwordConfirm=Confirmation du mot de passe
passwordNew=Nouveau mot de passe
passwordNewConfirm=Confirmation du nouveau mot de passe
rememberMe=Se souvenir de moi
authenticatorCode=Code \u00e0 usage unique
address=Adresse
street=Rue
locality=Ville ou Localit\u00e9
region=\u00c9tat, Province ou R\u00e9gion
postal_code=Code postal
country=Pays
emailVerified=Courriel v\u00e9rifi\u00e9
website=Page web
phoneNumber=Num\u00e9ro de t\u00e9l\u00e9phone
phoneNumberVerified=Num\u00e9ro de t\u00e9l\u00e9phone v\u00e9rifi\u00e9
gender=Sexe
birthday=Date de naissance
zoneinfo=Fuseau horaire
gssDelegationCredential=Accr\u00e9ditation de d\u00e9l\u00e9gation GSS
logoutOtherSessions=Se d\u00e9connecter des autres appareils
profileScopeConsentText=Profil utilisateur
emailScopeConsentText=Courriel
addressScopeConsentText=Adresse
phoneScopeConsentText=Num\u00e9ro de t\u00e9l\u00e9phone
offlineAccessScopeConsentText=Acc\u00e8s hors-ligne
samlRoleListScopeConsentText=Mes r\u00f4les
rolesScopeConsentText=R\u00f4les utilisateur
restartLoginTooltip=Red\u00e9marrer la connexion
loginTotpIntro=Il est n\u00e9cessaire de configurer un g\u00e9n\u00e9rateur One Time Password pour acc\u00e9der \u00e0 ce compte
loginTotpStep1=Installez une des applications suivantes sur votre mobile:
loginTotpStep2=Ouvrez l''application et scannez le code-barres ou entrez la clef.
loginTotpStep3=Entrez le code \u00e0 usage unique fourni par l''application et cliquez sur Sauvegarder pour terminer.
loginTotpStep3DeviceName=Renseignez un nom d''appareil pour vous aider \u00e0 g\u00e9rer vos a appareils OTP.
loginTotpManualStep2=Ouvrez l''application et saisissez la cl\u00e9
loginTotpManualStep3=Utilisez la configuration de valeur suivante si l''application permet son \u00e9dition
loginTotpUnableToScan=Impossible de scanner?
loginTotpScanBarcode=Scanner le code barre ?
loginCredential=Accr\u00e9ditation
loginOtpOneTime=Code \u00e0 usage unique
loginTotpType=Type
loginTotpAlgorithm=Algorithme
loginTotpDigits=Chiffres
loginTotpInterval=Intervalle
loginTotpCounter=Compteur
loginTotpDeviceName=Nom d''appareil
loginTotp.totp=Bas\u00e9 sur le temps
loginTotp.hotp=Bas\u00e9 sur les compteurs
loginChooseAuthenticator=S\u00e9lectionnez une m\u00e9thode de connexion
oauthGrantRequest=Voulez-vous accorder ces privil\u00e8ges d''acc\u00e8s ?
inResource=dans
oauth2DeviceVerificationTitle=Connexion de l''appareil
verifyOAuth2DeviceUserCode=Entrez le code \u00e0 usage unique fourni par votre appareil et cliquez sur Soumettre.
oauth2DeviceInvalidUserCodeMessage=Code invalide, veuillez r\u00e9essayer.
oauth2DeviceExpiredUserCodeMessage=Le code a expir\u00e9. Veuillez r\u00e9essayer de vous connecter depuis votre appareil.
oauth2DeviceVerificationCompleteHeader=Connexion de l''appareil r\u00e9ussie
oauth2DeviceVerificationCompleteMessage=Vous pouvez fermer cette fen\u00eatre de navigateur et retourner sur votre appareil.
oauth2DeviceVerificationFailedHeader=\u00c9chec de la connexion au dispositif
oauth2DeviceVerificationFailedMessage=Vous pouvez fermer cette fen\u00eatre de navigateur et retourner sur votre appareil, puis r\u00e9essayer de vous connecter.
oauth2DeviceConsentDeniedMessage=Consentement refus\u00e9 pour connecter l''appareil.
oauth2DeviceAuthorizationGrantDisabledMessage=Le client n''est pas autoris\u00e9 \u00e0 initier OAuth 2.0 Device Authorization Grant. Le flux est d\u00e9sactiv\u00e9 pour ce client.
emailVerifyInstruction1=Un courriel avec des instructions \u00e0 suivre vous a \u00e9t\u00e9 envoy\u00e9 \u00e0 l''adresse {0}.
emailVerifyInstruction2=Vous n''avez pas re\u00e7u de code dans le courriel ?
emailVerifyInstruction3=pour renvoyer le courriel.
emailLinkIdpTitle=Association avec {0}
emailLinkIdp1=Un courriel avec des instructions pour associer le compte {1} sur {0} avec votre compte {2} vous a \u00e9t\u00e9 envoy\u00e9.
emailLinkIdp2=Vous n''avez pas re\u00e7u de code dans le courriel ?
emailLinkIdp3=pour renvoyer le courriel.
emailLinkIdp4=Si vous avez d\u00e9j\u00e0 v\u00e9rifi\u00e9 votre courriel dans un autre navigateur
emailLinkIdp5=pour continuer.
backToLogin=Retour \u00e0 la connexion
emailInstruction=Entrez votre nom d''utilisateur ou votre courriel ; un courriel va vous \u00eatre envoy\u00e9 vous permettant de cr\u00e9er un nouveau mot de passe.
emailInstructionUsername=Entrez votre nom d''utilisateur ; un courriel va vous \u00eatre envoy\u00e9 vous permettant de cr\u00e9er un nouveau mot de passe.
copyCodeInstruction=Copiez le code et recopiez le dans votre application :
pageExpiredTitle=La page a expir\u00e9
pageExpiredMsg1=Pour recommencer le processus d''authentification
pageExpiredMsg2=Pour continuer le processus d''authentification
personalInfo=Information personnelle :
role_admin=Administrateur
role_realm-admin=Administrateur du domaine
role_create-realm=Cr\u00e9er un domaine
role_create-client=Cr\u00e9er un client
role_view-realm=Voir un domaine
role_view-users=Voir les utilisateurs
role_view-applications=Voir les applications
role_view-clients=Voir les clients
role_view-events=Voir les \u00e9v\u00e9nements
role_view-identity-providers=Voir les fournisseurs d''identit\u00e9
role_manage-realm=G\u00e9rer le domaine
role_manage-users=G\u00e9rer les utilisateurs
role_manage-applications=G\u00e9rer les applications
role_manage-identity-providers=G\u00e9rer les fournisseurs d''identit\u00e9
role_manage-clients=G\u00e9rer les clients
role_manage-events=G\u00e9rer les \u00e9v\u00e9nements
role_view-profile=Voir le profil
role_manage-account=G\u00e9rer le compte
role_manage-account-links=G\u00e9rer les liens de compte
role_read-token=Lire le jeton d''authentification
role_offline-access=Acc\u00e8s hors-ligne
client_account=Compte
client_account-console=Console de gestion du compte
client_security-admin-console=Console d''administration de la s\u00e9curit\u00e9
client_admin-cli=Admin CLI
client_realm-management=Gestion du domaine
client_broker=Broker
requiredFields=Champs requis
invalidUserMessage=Nom d''utilisateur ou mot de passe invalide.
invalidUsernameMessage=Nom d''utilisateur invalide.
invalidUsernameOrEmailMessage=Nom d''utilisateur ou courriel invalide.
invalidPasswordMessage=Mot de passe invalide.
invalidEmailMessage=Courriel invalide.
accountDisabledMessage=Compte d\u00e9sactiv\u00e9, contactez votre administrateur.
accountTemporarilyDisabledMessage=Ce compte est temporairement d\u00e9sactiv\u00e9, contactez votre administrateur ou bien r\u00e9essayez plus tard.
expiredCodeMessage=Connexion expir\u00e9e. Veuillez vous reconnecter.
expiredActionMessage=Action expir\u00e9e. Merci de continuer la connexion.
expiredActionTokenNoSessionMessage=Action expir\u00e9e.
expiredActionTokenSessionExistsMessage=Action expir\u00e9e. Merci de recommencer.
missingFirstNameMessage=Veuillez entrer votre pr\u00e9nom.
missingLastNameMessage=Veuillez entrer votre nom.
missingEmailMessage=Veuillez entrer votre courriel.
missingUsernameMessage=Veuillez entrer votre courriel.
missingPasswordMessage=Veuillez entrer votre mot de passe.
missingTotpMessage=Veuillez entrer votre code d''authentification.
missingTotpDeviceNameMessage=Veuillez entrer le nom de votre appareil.
notMatchPasswordMessage=Les mots de passe ne sont pas identiques.
error-invalid-value=Valeur invalide.
error-invalid-blank=Veuillez entrer une valeur.
error-empty=Veuillez entrer une valeur.
error-invalid-length=La longueur doit \u00eatre entre {1} et {2}.
error-invalid-length-too-short=La longueur minimale est {1}.
error-invalid-length-too-long=La longueur maximale est {2}.
error-invalid-email=Courriel invalide.
error-invalid-number=Nombre invalide.
error-number-out-of-range=Le nombre doit \u00eatre entre {1} et {2}.
error-number-out-of-range-too-small=Le nombre doit avoir une valeur minimale de {1}.
error-number-out-of-range-too-big=Le nombre doit avoir une valeur maximale de {2}.
error-pattern-no-match=Valeur invalide.
error-invalid-uri=URL invalide.
error-invalid-uri-scheme=Sch\u00e9ma d''URL invalide.
error-invalid-uri-fragment=Fragment d''URL invalide.
error-user-attribute-required=Veuillez renseigner ce champ.
error-invalid-date=Date invalide.
error-user-attribute-read-only=Ce champ est en lecture seule.
error-username-invalid-character=La valeur contient des caract\u00e8res invalides.
error-person-name-invalid-character=La valeur contient des caract\u00e8res invalides.
invalidPasswordExistingMessage=Mot de passe existant invalide.
invalidPasswordBlacklistedMessage=Mot de passe invalide : ce mot de passe est blacklist\u00e9.
invalidPasswordConfirmMessage=Le mot de passe de confirmation ne correspond pas.
invalidTotpMessage=Le code d''authentification est invalide.
usernameExistsMessage=Le nom d''utilisateur existe d\u00e9j\u00e0.
emailExistsMessage=Le courriel existe d\u00e9j\u00e0.
federatedIdentityExistsMessage=L''utilisateur avec {0} {1} existe d\u00e9j\u00e0. Veuillez acc\u00e9der \u00e0 au gestionnaire de compte pour lier le compte.
federatedIdentityEmailExistsMessage=Cet utilisateur avec ce courriel existe d\u00e9j\u00e0. Veuillez vous connecter au gestionnaire de compte pour lier le compte.
confirmLinkIdpTitle=Ce compte existe d\u00e9j\u00e0
federatedIdentityConfirmLinkMessage=L''utilisateur {0} {1} existe d\u00e9j\u00e0. Que souhaitez-vous faire ?
federatedIdentityConfirmReauthenticateMessage=Identifiez vous afin de lier votre compte avec {0}
nestedFirstBrokerFlowMessage=L''utilisateur {0} {1} n''est li\u00e9 \u00e0 aucun utilisateur connu.
confirmLinkIdpReviewProfile=V\u00e9rifiez vos informations de profil
confirmLinkIdpContinue=Souhaitez-vous lier {0} \u00e0 votre compte existant
configureTotpMessage=Vous devez configurer l''authentification par mobile pour activer votre compte.
updateProfileMessage=Vous devez mettre \u00e0 jour votre profil pour activer votre compte.
updatePasswordMessage=Vous devez changer votre mot de passe pour activer votre compte.
updateEmailMessage=Vous devez mettre \u00e0 votre addresse de courriel pour activer votre compte.
resetPasswordMessage=Vous devez changer votre mot de passe.
verifyEmailMessage=Vous devez v\u00e9rifier votre courriel pour activer votre compte.
linkIdpMessage=Vous devez v\u00e9rifier votre courriel pour lier votre compte avec {0}.
emailSentMessage=Vous devriez recevoir rapidement un courriel avec de plus amples instructions.
emailSendErrorMessage=Erreur lors de l''envoi du courriel, veuillez essayer plus tard.
accountUpdatedMessage=Votre compte a \u00e9t\u00e9 mis \u00e0 jour.
accountPasswordUpdatedMessage=Votre mot de passe a \u00e9t\u00e9 mis \u00e0 jour.
delegationCompleteHeader=Connexion r\u00e9ussie
delegationCompleteMessage=Vous pouvez fermer cette fen\u00eatre de navigateur et retourner sur votre application console.
delegationFailedHeader=Connexion \u00e9chou\u00e9e
delegationFailedMessage=Vous pouvez fermer cette fen\u00eatre de navigateur et retourner sur votre application console, puis r\u00e9essayer de vous connecter.
noAccessMessage=Aucun acc\u00e8s
invalidPasswordMinLengthMessage=Mot de passe invalide : longueur minimale requise de {0}.
invalidPasswordMaxLengthMessage=Mot de passe invalide : longueur maximale de {0}.
invalidPasswordMinDigitsMessage=Mot de passe invalide : doit contenir au moins {0} chiffre(s).
invalidPasswordMinLowerCaseCharsMessage=Mot de passe invalide : doit contenir au moins {0} lettre(s) en minuscule.
invalidPasswordMinUpperCaseCharsMessage=Mot de passe invalide : doit contenir au moins {0} lettre(s) en majuscule.
invalidPasswordMinSpecialCharsMessage=Mot de passe invalide : doit contenir au moins {0} caract\u00e8re(s) sp\u00e9ciaux.
invalidPasswordNotUsernameMessage=Mot de passe invalide : ne doit pas \u00eatre identique au nom d''utilisateur.
invalidPasswordNotEmailMessage=Mot de passe invalide: ne doit pas \u00eatre identique au courriel.
invalidPasswordRegexPatternMessage=Mot de passe invalide : ne valide pas l''expression rationnelle.
invalidPasswordHistoryMessage=Mot de passe invalide : ne doit pas \u00eatre \u00e9gal aux {0} derniers mots de passe.
invalidPasswordGenericMessage=Mot de passe invalide : le nouveau mot de passe ne r\u00e9pond pas \u00e0 la politique de mot de passe.
failedToProcessResponseMessage=Erreur lors du traitement de la r\u00e9ponse
httpsRequiredMessage=Le protocole HTTPS est requis
realmNotEnabledMessage=Le domaine n''est pas activ\u00e9
invalidRequestMessage=Requ\u00eate invalide
successLogout=Vous \u00eates d\u00e9connect\u00e9
failedLogout=La d\u00e9connexion a \u00e9chou\u00e9e
unknownLoginRequesterMessage=Compte inconnu du demandeur
loginRequesterNotEnabledMessage=La connexion du demandeur n''est pas active
bearerOnlyMessage=Les applications Bearer-only ne sont pas autoris\u00e9es \u00e0 initier la connexion par navigateur.
standardFlowDisabledMessage=Le client n''est pas autoris\u00e9 \u00e0 initier une connexion avec le navigateur avec ce response_type. Le flux standard est d\u00e9sactiv\u00e9 pour le client.
implicitFlowDisabledMessage=Le client n''est pas autoris\u00e9 \u00e0 initier une connexion avec le navigateur avec ce response_type. Le flux implicite est d\u00e9sactiv\u00e9 pour le client.
invalidRedirectUriMessage=L''URI de redirection est invalide
unsupportedNameIdFormatMessage=NameIDFormat non support\u00e9
invalidRequesterMessage=Demandeur invalide
registrationNotAllowedMessage=L''enregistrement n''est pas autoris\u00e9
resetCredentialNotAllowedMessage=La remise \u00e0 z\u00e9ro n''est pas autoris\u00e9e
permissionNotApprovedMessage=La permission n''est pas approuv\u00e9e.
noRelayStateInResponseMessage=Aucun \u00e9tat de relais dans la r\u00e9ponse du fournisseur d''identit\u00e9.
insufficientPermissionMessage=Permissions insuffisantes pour lier les identit\u00e9s.
couldNotProceedWithAuthenticationRequestMessage=Impossible de continuer avec la requ\u00eate d''authentification vers le fournisseur d''identit\u00e9.
couldNotObtainTokenMessage=Impossible de r\u00e9cup\u00e9rer le jeton du fournisseur d''identit\u00e9.
unexpectedErrorRetrievingTokenMessage=Erreur inattendue lors de la r\u00e9cup\u00e9ration du jeton provenant du fournisseur d''identit\u00e9.
unexpectedErrorHandlingResponseMessage=Erreur inattendue lors du traitement de la r\u00e9ponse provenant du fournisseur d''identit\u00e9.
identityProviderAuthenticationFailedMessage=L''authentification a \u00e9chou\u00e9e. Impossible de s''authentifier avec le fournisseur d''identit\u00e9.
couldNotSendAuthenticationRequestMessage=Impossible d''envoyer la requ\u00eate d''authentification vers le fournisseur d''identit\u00e9.
unexpectedErrorHandlingRequestMessage=Erreur inattendue lors du traitement de la requ\u00eate vers le fournisseur d''identit\u00e9.
invalidAccessCodeMessage=Code d''acc\u00e8s invalide.
sessionNotActiveMessage=La session n''est pas active.
invalidCodeMessage=Une erreur est survenue, veuillez vous reconnecter \u00e0 votre application.
cookieNotFoundMessage=Cookie introuvable. Assurez-vous que les cookies soient activ\u00e9s dans votre navigateur.
identityProviderUnexpectedErrorMessage=Erreur inattendue lors de l''authentification avec fournisseur d''identit\u00e9.
identityProviderMissingStateMessage=Param\u00e8tre d''\u00e9tat manquant dans la r\u00e9ponse du fournisseur d''identit\u00e9.
identityProviderNotFoundMessage=Impossible de trouver le fournisseur d''identit\u00e9 avec cet identifiant.
identityProviderLinkSuccess=Votre compte a \u00e9t\u00e9 correctement li\u00e9 avec {0} compte {1} .
staleCodeMessage=Cette page n''est plus valide, merci de retourner \u00e0 votre application et de vous connecter \u00e0 nouveau.
realmSupportsNoCredentialsMessage=Ce domaine ne supporte aucun type d''accr\u00e9ditation.
credentialSetupRequired=Connexion impossible, configuration d''accr\u00e9ditation requise.
identityProviderNotUniqueMessage=Ce domaine autorise plusieurs fournisseurs d''identit\u00e9. Impossible de d\u00e9terminer le fournisseur d''identit\u00e9 avec lequel s''authentifier.
emailVerifiedMessage=Votre courriel a \u00e9t\u00e9 v\u00e9rifi\u00e9.
staleEmailVerificationLink=Le lien que vous avez cliqu\u00e9 est p\u00e9rim\u00e9 et n''est plus valide. Peut-\u00eatre avez vous d\u00e9j\u00e0 v\u00e9rifi\u00e9 votre mot de passe ?
identityProviderAlreadyLinkedMessage=L''identit\u00e9 f\u00e9d\u00e9r\u00e9e retourn\u00e9e par {0} est d\u00e9j\u00e0 li\u00e9e \u00e0 un autre utilisateur.
confirmAccountLinking=Confirmez la liaison du compte {0} du fournisseur d''entit\u00e9 {1} avec votre compte.
confirmEmailAddressVerification=Confirmez la validit\u00e9 de l''adresse courriel {0}.
confirmExecutionOfActions=Suivez les instructions suivantes
backToApplication=&laquo; Revenir \u00e0 l''application
missingParameterMessage=Param\u00e8tres manquants \: {0}
clientNotFoundMessage=Client inconnu.
clientDisabledMessage=Client d\u00e9sactiv\u00e9.
invalidParameterMessage=Param\u00e8tre invalide \: {0}
alreadyLoggedIn=Vous \u00eates d\u00e9j\u00e0 connect\u00e9.
differentUserAuthenticated=Vous \u00eates d\u00e9j\u00e0 authentifi\u00e9 avec un autre utilisateur ''{0}'' dans cette session. Merci de vous d\u00e9connecter.
brokerLinkingSessionExpired=La liaison entre comptes broker a \u00e9t\u00e9 demand\u00e9e, mais la session n''est plus valide.
proceedWithAction=&raquo; Cliquez ici
requiredAction.CONFIGURE_TOTP=Configurer OTP
requiredAction.TERMS_AND_CONDITIONS=Termes et conditions
requiredAction.UPDATE_PASSWORD=Mettre \u00e0 jour votre mot de passe
requiredAction.UPDATE_PROFILE=Mettre \u00e0 jour votre profil
requiredAction.VERIFY_EMAIL=Valider votre adresse email
doX509Login=Vous allez \u00eatre connect\u00e9 en tant que\:
clientCertificate=X509 certificat client\:
noCertificate=[Pas de certificat]
pageNotFound=Page non trouv\u00e9e
internalServerError=Une erreur interne du serveur s''est produite
# Identity provider
identity-provider-redirector=Connexion avec un autre fournisseur d''identit\u00e9
identity-provider-login-label=Se connecter avec
idp-email-verification-display-name=V\u00e9rification du courriel
idp-email-verification-help-text=Lier votre compte en validant votre courriel.
idp-username-password-form-display-name=Nom d''utilisateur et mot de passe
idp-username-password-form-help-text=Lier votre compte en vous connectant.
console-username=Nom d''utilisateur:
console-password=Mot de passe:
console-otp=Code \u00e0 usage unique:
console-new-password=Nouveau mot de passe:
console-confirm-password=Confirmez les mot de passe:
console-update-password=La mise \u00e0 jour de votre mot de passe est requise.
console-verify-email=Vous devez v\u00e9rifier votre adresse courriel. Nous avons envoy\u00e9 un courriel \u00e0 {0} contenant un code de v\u00e9rification. Veuillez saisir ce code ci-dessous.
console-email-code=Code courriel:
console-accept-terms=Accepter les conditions? [o/n]:
console-accept=o
#authenticators
password-display-name=Mot de passe
password-help-text=Connectez-vous en saisissant votre mot de passe.
auth-username-form-display-name=Nom d''utilisateur
auth-username-form-help-text=Commencez la connexion en saisissant votre nom d''utilisateur.
auth-username-password-form-display-name=Nom d''utilisateur et mot de passe
auth-username-password-form-help-text=Connectez-vous en saisissant votre nom d''utilisateur et votre mot de passe.
# WebAuthn
webauthn-display-name=Cl\u00e9 de S\u00e9curit\u00e9
webauthn-help-text=Utilisez votre cl\u00e9 de s\u00e9curit\u00e9 pour vous connecter.
webauthn-passwordless-display-name=Cl\u00e9 de S\u00e9curit\u00e9
webauthn-passwordless-help-text=Utilisez votre cl\u00e9 de s\u00e9curit\u00e9 pour vous connecter sans mot de passe.
webauthn-login-title=Connexion avec une Cl\u00e9 de S\u00e9curit\u00e9
webauthn-registration-title=Enregistrement d''une Cl\u00e9 de S\u00e9curit\u00e9
webauthn-available-authenticators=Cl\u00e9s de S\u00e9curit\u00e9 disponibles
webauthn-unsupported-browser-text=WebAuthn n''est pas support\u00e9 par ce navigateur. Essayez une autre m\u00e9thode ou contactez votre administrateur.
webauthn-doAuthenticate=Se connecter avec une Cl\u00e9 de S\u00e9curit\u00e9
webauthn-createdAt-label=Cr\u00e9\u00e9 le
# WebAuthn Error
webauthn-error-title=Erreur lors de l''utilisation de la Cl\u00e9 de S\u00e9curit\u00e9
webauthn-error-registration=L''enregistrement de la Cl\u00e9 de S\u00e9curit\u00e9 a \u00e9chou\u00e9.<br/> {0}
webauthn-error-api-get=L''authentification via la Cl\u00e9 de S\u00e9curit\u00e9 a \u00e9chou\u00e9.<br/> {0}
webauthn-error-different-user=Le premier utilisateur authentifi\u00e9 ne correspond pas \u00e0 celui qui est authentifi\u00e9 par la Cl\u00e9 de S\u00e9curit\u00e9.
webauthn-error-auth-verification=Le r\u00e9sultat de l''authentification produite par la cl\u00e9 de s\u00e9curit\u00e9 est invalide.<br/> {0}
webauthn-error-register-verification=Le r\u00e9sultat de l''enregistrement de la cl\u00e9 de s\u00e9curit\u00e9 est invalide.<br/> {0}
webauthn-error-user-not-found=La Cl\u00e9 de S\u00e9curit\u00e9 a authentifi\u00e9 un utilisateur inconnu.
finalDeletionConfirmation=Si vous supprimez votre compte, il ne pourra pas \u00eatre restaur\u00e9. Pour conserver votre compte, cliquez sur Annuler.
irreversibleAction=Cette action est irr\u00e9versible
deleteAccountConfirm=Confirmation de suppression de compte
deletingImplies=Supprimer votre compte implique:
errasingData=Supprimer toutes vos donn\u00e9es
loggingOutImmediately=Vous d\u00e9connecter imm\u00e9diatement
accountUnusable=Toute utilisation future de l''application sera impossible avec ce compte
userDeletedSuccessfully=Utilisateur supprim\u00e9 avec succ\u00e8s
access-denied=Acc\u00e8s refus\u00e9
frontchannel-logout.title=D\u00e9connexion
frontchannel-logout.message=Vous \u00eates d\u00e9connect\u00e9 des applications suivantes
logoutConfirmTitle=D\u00e9connexion
logoutConfirmHeader=\u00cates-vous s\u00fbr de vouloir vous d\u00e9connecter ?
doLogout=Se d\u00e9connecter
<#import "template.ftl" as layout>
<#import "register-commons.ftl" as registerCommons>
<@layout.registrationLayout displayMessage=!messagesPerField.existsError('firstName','lastName','email','password','password-confirm'); section>
<#if section = "form">
<#if messagesPerField.existsError('email')>
<div class="fr-alert fr-alert--info fr-mt-3w">
<h3 class="fr-alert__title">${msg("emailVerifyInstruction1",(register.formData.email!''))}</h3>
<p>Si vous pensez avoir déjà créé votre compte sur Camino, utilisez la fonctionnalité "Mot de passe oublié"</p>
</div>
<#else>
<main class="fr-pt-md-14v" role="main" id="content">
<div class="fr-container fr-container--fluid fr-mb-md-14v">
<div class="fr-grid-row fr-grid-row-gutters fr-grid-row--center">
<div class="fr-col-12 fr-col-md-8 fr-col-lg-6">
<div class="fr-container">
<h1>Création de compte sur Camino</h1>
</div>
<div class="fr-container fr-background-alt--grey fr-px-md-0 fr-py-10v fr-py-md-14v">
<div class="fr-grid-row fr-grid-row-gutters fr-grid-row--center">
<div class="fr-col-12 fr-col-md-9 fr-col-lg-8">
<div>
<form action="${url.registrationAction}" method="post">
<fieldset class="fr-fieldset" aria-labelledby="register-1760-fieldset-legend">
<legend class="fr-fieldset__legend" id="register-1760-fieldset-legend">
<h2>Coordonnées personnelles</h2>
</legend>
<div class="fr-fieldset__element">
<fieldset class="fr-fieldset" id="credentials">
<div class="fr-fieldset__element">
<div class="fr-input-group <#if messagesPerField.existsError('firstName')>fr-input-group--error</#if>" aria-describedby="<#if messagesPerField.existsError('firstName')>text-input-firstName-error-desc-error</#if>">
<label class="fr-label" for="firstName">
${msg("firstName")}
</label>
<input tabindex="1"
class="fr-input" autocomplete="firstName" aria-required="true"
type="text" id="firstName" name="firstName"
value="${(register.formData.firstName!'')}"
aria-invalid="<#if messagesPerField.existsError('firstName')>true</#if>">
<#if messagesPerField.existsError('firstName')>
<p id="text-input-firstName-error-desc-error" class="fr-error-text">
${kcSanitize(messagesPerField.getFirstError('firstName'))?no_esc}
</p>
</#if>
</div>
</div>
<div class="fr-fieldset__element">
<div class="fr-input-group <#if messagesPerField.existsError('lastName')>fr-input-group--error</#if>" aria-describedby="<#if messagesPerField.existsError('lastName')>text-input-lastName-error-desc-error</#if>">
<label class="fr-label" for="lastName">
${msg("lastName")}
</label>
<input tabindex="2"
class="fr-input" autocomplete="lastName" aria-required="true"
type="text" id="lastName" name="lastName"
value="${(register.formData.lastName!'')}"
aria-invalid="<#if messagesPerField.existsError('lastName')>true</#if>">
<#if messagesPerField.existsError('lastName')>
<p id="text-input-lastName-error-desc-error" class="fr-error-text">
${kcSanitize(messagesPerField.getFirstError('lastName'))?no_esc}
</p>
</#if>
</div>
</div>
<div class="fr-fieldset__element">
<div class="fr-input-group <#if messagesPerField.existsError('email')>fr-input-group--error</#if>" aria-describedby="<#if messagesPerField.existsError('email')>text-input-email-error-desc-error</#if>">
<label class="fr-label" for="email">
${msg("email")}
</label>
<input tabindex="3"
class="fr-input" autocomplete="email" aria-required="true"
type="text" id="email" name="email"
value="${(register.formData.email!'')}"
aria-invalid="<#if messagesPerField.existsError('email')>true</#if>">
<#if messagesPerField.existsError('email')>
<p id="text-input-email-error-desc-error" class="fr-error-text">
${kcSanitize(messagesPerField.getFirstError('email'))?no_esc}
</p>
</#if>
</div>
</div>
<div class="fr-fieldset__element">
<div class="fr-input-group <#if messagesPerField.existsError('password')>fr-input-group--error</#if>" aria-describedby="<#if messagesPerField.existsError('password')>text-input-password-error-desc-error</#if>">
<label class="fr-label" for="password">
${msg("password")}
</label>
<input tabindex="4"
class="fr-input" autocomplete="off" aria-required="true"
type="password" id="password" name="password"
aria-invalid="<#if messagesPerField.existsError('password')>true</#if>">
<#if messagesPerField.existsError('password')>
<p id="text-input-password-error-desc-error" class="fr-error-text">
${kcSanitize(messagesPerField.getFirstError('password'))?no_esc}
</p>
</#if>
</div>
</div>
<div class="fr-fieldset__element">
<div class="fr-input-group <#if messagesPerField.existsError('password-confirm')>fr-input-group--error</#if>" aria-describedby="<#if messagesPerField.existsError('password-confirm')>text-input-password-confirm-error-desc-error</#if>">
<label class="fr-label" for="password-confirm">
${msg("passwordConfirm")}
</label>
<input tabindex="5"
class="fr-input" autocomplete="off" aria-required="true"
type="password" id="password-confirm" name="password-confirm"
aria-invalid="<#if messagesPerField.existsError('password-confirm')>true</#if>">
<#if messagesPerField.existsError('password-confirm')>
<p id="text-input-password-confirm-error-desc-error" class="fr-error-text">
${kcSanitize(messagesPerField.getFirstError('password-confirm'))?no_esc}
</p>
</#if>
</div>
</div>
</fieldset>
</div>
<div class="fr-fieldset__element">
<ul class="fr-btns-group">
<li>
<button tabindex="3" class="fr-mt-2v fr-btn" name="login" type="submit">
Créer mon compte
</button>
</li>
</ul>
</div>
<div class="fr-fieldset__element">
<a class='fr-link fr-link--icon-left fr-icon-arrow-left-line' href="${url.loginUrl}">${kcSanitize(msg("backToLogin"))?no_esc}</a>
</div>
</fieldset>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</main>
</#if>
</#if>
</@layout.registrationLayout>