1<!DOCTYPE html> 2<!--[if lt IE 7]> <html class="lt-ie9 lt-ie8 lt-ie7" lang="en"> <![endif]--> 3<!--[if IE 7]> <html class="lt-ie9 lt-ie8" lang="en"> <![endif]--> 4<!--[if IE 8]> <html class="lt-ie9" lang="en"> <![endif]--> 5<!--[if gt IE 8]><!--> <html lang="fr"> <!--<![endif]--> 6 7<html xmlns="http://www.w3.org/1999/xhtml"> 8<head> 9 10<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 11<meta http-equiv="pragma" content=no-cache"> 12<meta charset="utf-8"> 13<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> 14<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" /> 15<title>Connexion - Billetweb</title> 16<link rel="stylesheet" href="/css/prismic/style.css?v=16"> 17<!--[if lt IE 9]>
17<script src="//html5shim.googlecode.com/svn/trunk/html5.js"></script>
17<![endif]-->
18<script src="/js/public/jquery.js" type="00fac84f55f8b96fd720f295-text/javascript"></script>
vendor: 1 bytes, line 18
18
19<script data-cfasync='true' src="/js/public/jquery-ui.js" type="00fac84f55f8b96fd720f295-text/javascript"></script>
19 20 21<link rel="shortcut icon" class="favicon_replace" href="/images/front/favicon.ico"> 22<link rel="icon" class="favicon_replace" type="image/png" href="/images/front/favicon-32x32.png" sizes="32x32" /> 23<link rel="icon" class="favicon_replace" type="image/png" href="/images/front/favicon-16x16.png" sizes="16x16" /> 24<link rel="apple-touch-icon" class="favicon_replace" href="/images/front/apple-touch-icon.png"> 25<link rel="icon" class="favicon_replace" sizes="192x192" href="/images/front/android-chrome-192x192.png"> 26<link rel="icon" class="favicon_replace" sizes="512x512" href="/images/front/android-chrome-512x512.png"> 27 28</head> 29 30<link href='//fonts.googleapis.com/css?family=Montserrat:thin,extra-light,light,100,200,300,400,500,600,700,800' 31rel='stylesheet' type='text/css'> 32 33<link href='//fonts.googleapis.com/css?family=Barlow:thin,extra-light,light,100,200,300,400,500,600,700,800' 34rel='stylesheet' type='text/css'> 35 36<style> 37 38body, button, input { 39 font-family: 'Montserrat'; 40 font-weight: 500; 41} 42 43input:-webkit-autofill, 44input:-webkit-autofill:hover, 45input:-webkit-autofill:focus, 46input:-webkit-autofill:active{ 47 -webkit-box-shadow: 0 0 0 30px white inset !important; 48} 49 50section#login .submit button:disabled{ 51 opacity: 0.5; 52 cursor: not-allowed; 53} 54 55section#login #reset{ 56 padding: 0.8em 2em; 57} 58 59section#login .submit .forgot-password{ 60 text-align: center; 61 margin-top: 15px; 62} 63 64section#login #passkey_container{ 65 display: block; 66} 67 68section#login #passkey_container .passkey-separator{ 69 display: flex; 70 align-items: center; 71 gap: 12px; 72 font-size: 13px; 73 color: #666; 74 margin: 5px 0px 18px 0px; 75} 76 77section#login #passkey_container .passkey-separator:before, 78section#login #passkey_container .passkey-separator:after{ 79 content: ""; 80 flex: 1; 81 height: 1px; 82 background: #e0e0e0; 83} 84 85section#login .submit button.passkey-button{ 86 background: #FFF; 87 border: 1px solid #635BFF; 88 color: #635BFF; 89 margin-top: 0px; 90} 91 92section#login #passkey_error{ 93 display: block; 94 color: #b00020; 95 font-weight: bold; 96 margin: 12px 0px 20px 0px; 97} 98 99section#login .submit button.loading{ 100 opacity: 0.8; 101 cursor: default; 102} 103 104section#login .passkey-spinner{ 105 display: inline-block; 106 width: 14px; 107 height: 14px; 108 margin-right: 8px; 109 vertical-align: -2px; 110 border: 2px solid rgba(255, 255, 255, 0.35); 111 border-top-color: #FFF; 112 border-radius: 50%; 113 animation: passkey-spin 0.8s linear infinite; 114} 115 116section#login .submit button.passkey-button .passkey-spinner{ 117 border-color: rgba(99, 91, 255, 0.25); 118 border-top-color: #635BFF; 119} 120 121@keyframes passkey-spin{ 122 to { transform: rotate(360deg); } 123} 124 125</style>
126<script type="00fac84f55f8b96fd720f295-text/javascript"> 127 128function are_cookies_enabled(){ 129 document.cookie="testcookie"; 130 cookieEnabled = (document.cookie.indexOf("testcookie") != -1) ? true : false; 131 return (cookieEnabled); 132} 133 134function getURLParameter(name) { 135 return decodeURI( 136 (RegExp(name + '=' + '(.+?)(&|$)').exec(location.search)||[,null])[1] 137 ); 138} 139 140$(function(){ 141 142 $("#submit").click(function(e) { 143 $("body").addClass("back").fadeIn(300); 144 }); 145 146 $(".next").click(function(e) { 147 if($(".news_image").length>2){ 148 $(".news_image").first().remove(); 149 $(".news_image").first().remove(); 150 } 151 else{ 152 $(".next").hide(); 153 } 154 }); 155 156 if(!are_cookies_enabled()){ 157 $("#cookies").show(); 158 } 159 160 161 try { 162 $saved_parameters=localStorage.getItem('billetweb'); 163 164 if(getURLParameter('version')!=false && getURLParameter('version')=='3'){ 165 $saved_parameters=null; 166 } 167 168 if($saved_parameters!=null || getURLParameter('version')=='2'){ 169 170 $("#login").addClass('visited'); 171 172 if(getURLParameter('version')!=false && getURLParameter('version')=='2'){ 173 $saved_parameters=1; 174 } 175 176 $.ajax({ 177 type: "GET", 178 url: '/search.php?news='+$saved_parameters, 179 dataType: 'json', 180 success: function (response) { 181 if(response.cards && response.cards.length>0){ 182 /*var features=response.features; 183 for(i in features){ 184 var data = features[i]; 185 html = data['url'].length>0?'<a href="'+data['url']+'" target="_blank">'+data['title']+'</a>':data['title']; 186 var html = '<div class="news_item" title="'+data['details']+'">'+html+'<span class="label">'+data['date']+'</span><span ></span></div>'; 187 188 $("#features .news_text").append(html); 189 }*/ 190 191 var cards=response.cards; 192 for(i in cards){ 193 var data = cards[i]; 194 var html = '<div class="news_row url_item" data-url="'+data['url']+'"><div class="news_image" style="background-image: url('+data['image']+');"></div><div class="news_label '+data['label_class']+'">'+data['label_text']+'</div><div class="news_image_title">'+data['title']+'</div>'; 195 /*if(data['url'].length>0){ 196 html += '<div class="news_link"><a href="'+data['url']+'" target="_blank">Lire plus </a><div></div>'; 197 } 198 else{ 199 html +='</div>'; 200 }*/ 201 $("#cards .news_text").append(html); 202 if(i<cards.length-1){ 203 $("#cards .news_text").append('<div class="separator"></div>'); 204 } 205 } 206 if(cards.length==0) 207 $("#cards").hide(); 208 209 //$("#features").hide(); 210 $("#cards").hide(); 211 $(".tips_container").show(); 212 213 //$("#features").fadeIn(100); 214 $("#cards").fadeIn(300); 215 216 /*var bottom = $(window).outerHeight() - $("#cards").offset().top - $("#cards").outerHeight() + $("#header_image").height(); 217 var top = $("#features").offset().top; 218 $(".news_image_container").height($(".news_image_container").height()-(top-bottom)); 219 220 $(".news_image_title").each(function(){ 221 while ($(this).height()>$(this).parent().height()-15) { 222 var fontSize = parseInt($(this).css("font-size")); 223 fontSize = fontSize - 3 + "px"; 224 $(this).css('font-size',fontSize) 225 } 226 }); */ 227 228 $(".url_item").click(function(e) { 229 e.preventDefault(); 230 let url = $(this).data("url"); 231 if (url) { 232 window.open(url, "_blank"); // "_blank" = nouvel onglet/fenêtre 233 } 234 }); 235 236 237 238 } 239 240 } 241 }); 242 } 243 } 244 catch (e) { 245 246 } 247}) 248 249 250 251</script>
251 252 253
254<script type="00fac84f55f8b96fd720f295-text/javascript"> 255 256var passkey_auto = ''; 257 258function bwB64ToBuf(str){ 259 var bin = window.atob(str.replace(/-/g, '+').replace(/_/g, '/')); 260 var bytes = new Uint8Array(bin.length); 261 for (var i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i); 262 return bytes.buffer; 263} 264 265function bwBufToB64(buf){ 266 var bytes = new Uint8Array(buf); 267 var bin = ''; 268 for (var i = 0; i < bytes.length; i++) bin += String.fromCharCode(bytes[i]); 269 return window.btoa(bin); 270} 271 272// la lib serialise les binaires sous la forme =?BINARY?B?....?= 273function bwRecursiveToBuffer(obj){ 274 var prefix = '=?BINARY?B?'; 275 var suffix = '?='; 276 if (typeof obj === 'object' && obj !== null) { 277 for (var key in obj) { 278 if (typeof obj[key] === 'string') { 279 var str = obj[key]; 280 if (str.substring(0, prefix.length) === prefix && str.substring(str.length - suffix.length) === suffix) { 281 obj[key] = bwB64ToBuf(str.substring(prefix.length, str.length - suffix.length)); 282 } 283 } else { 284 bwRecursiveToBuffer(obj[key]); 285 } 286 } 287 } 288} 289 290function bwPasskeyError(code){ 291 bwPasskeyBusy(false); 292 var messages = { 293 'wait': "Trop de tentatives, réessayez dans 3 minutes", 294 'unknown': "Passkey non reconnu", 295 'invalid': "La vérification du passkey a échoué", 296 'expired': "Délai dépassé, réessayez", 297 'no_passkey': "Aucun passkey enregistré sur ce compte", 298 'disabled': "Votre compte est désactivé", 299 'locked': "Votre compte est verrouillé" 300 }; 301 if (code === 'cancel') return; 302 $("#passkey_error").text(messages[code] ? messages[code] : "Une erreur s'est produite").show(); 303} 304 305var bwConditionalCtrl = null; 306 307// état "connexion en cours" : après validation du passkey, le temps de la vérification serveur et de la redirection. 308// porté par les deux boutons : sur mobile la feuille passkey iOS masque le bas de l'écran, seul "Connexion" reste visible 309function bwPasskeyBusy(busy){ 310 $("#passkey_button, #submit").each(function(){ 311 var btn = $(this); 312 if (busy) { 313 if (btn.hasClass('loading')) { return; } 314 btn.data('label', btn.html()); 315 btn.prop('disabled', true).addClass('loading').html('<span class="passkey-spinner"></span>Connexion en cours...'); 316 } 317 else if (btn.hasClass('loading')) { 318 btn.html(btn.data('label')).removeClass('loading'); 319 // le bouton "Connexion" reste verrouillé tant que le captcha n'a pas fourni de jeton 320 var captcha = btn.closest('form').find('.cf-turnstile'); 321 var token = btn.closest('form').find("[name='cf-turnstile-response']").val(); 322 btn.prop('disabled', btn.is('#submit') && captcha.length > 0 && !(token && token !== '')); 323 } 324 }); 325} 326 327function bwPasskeyVerify(cred, fromConditional){ 328 bwPasskeyBusy(true); 329 var params = { 330 action: 'verify', 331 id: cred.rawId ? bwBufToB64(cred.rawId) : '', 332 clientDataJSON: cred.response.clientDataJSON ? bwBufToB64(cred.response.clientDataJSON) : '', 333 authenticatorData: cred.response.authenticatorData ? bwBufToB64(cred.response.authenticatorData) : '', 334 signature: cred.response.signature ? bwBufToB64(cred.response.signature) : '', 335 userHandle: cred.response.userHandle ? bwBufToB64(cred.response.userHandle) : '', 336 url: $("input[name=url]").val() 337 }; 338 $.ajax({ 339 type: 'POST', 340 url: '/bo/passkey.php', 341 data: params, 342 dataType: 'json' 343 }).done(function(response){ 344 if (response.success) { 345 // marqueur local : les prochaines visites déclencheront la popup passkey automatiquement 346 try { localStorage.setItem('bw_passkey', '1'); } catch(e) { } 347 window.location.href = response.url; 348 } 349 else if (fromConditional && response.error === 'expired') { bwPasskeyConditional(); } 350 else { 351 if (response.error === 'unknown') { try { localStorage.removeItem('bw_passkey'); } catch(e) { } } 352 bwPasskeyError(response.error); 353 } 354 }).fail(function(){ bwPasskeyError('error'); }); 355} 356 357function bwPasskeyLogin(auto){ 358 if (bwConditionalCtrl) { bwConditionalCtrl.abort(); bwConditionalCtrl = null; } 359 if (!auto) { bwPasskeyBusy(true); } 360 $("#passkey_error").hide(); 361 $.ajax({ 362 type: 'POST', 363 url: '/bo/passkey.php', 364 data: { action: 'options' }, 365 dataType: 'json' 366 }).done(function(getArgs){ 367 if (getArgs.error) { bwPasskeyError(getArgs.error); return; } 368 bwRecursiveToBuffer(getArgs); 369 navigator.credentials.get(getArgs).then(function(cred){ 370 bwPasskeyVerify(cred, false); 371 }).catch(function(err){ 372 // annulation d'une popup automatique : on retombe sur l'autofill du champ email 373 if (auto) { bwPasskeyConditional(); } 374 else { bwPasskeyError('cancel'); } 375 }); 376 }).fail(function(){ bwPasskeyError('error'); }); 377} 378 379// conditional UI : le passkey apparaît dans l'autocomplétion du champ email, sans clic sur le bouton 380function bwPasskeyConditional(){ 381 bwPasskeyBusy(false); 382 $.ajax({ 383 type: 'POST', 384 url: '/bo/passkey.php', 385 data: { action: 'options', conditional: 1 }, 386 dataType: 'json' 387 }).done(function(getArgs){ 388 if (getArgs.error) { console.debug('passkey conditional options: ' + getArgs.error); return; } 389 bwRecursiveToBuffer(getArgs); 390 bwConditionalCtrl = new AbortController(); 391 navigator.credentials.get({ 392 mediation: 'conditional', 393 signal: bwConditionalCtrl.signal, 394 publicKey: getArgs.publicKey 395 }).then(function(cred){ 396 bwPasskeyVerify(cred, true); 397 }).catch(function(err){ console.debug('passkey conditional: ' + err.name + ' ' + err.message); }); 398 }); 399} 400 401$(function(){ 402 if (window.PublicKeyCredential && document.getElementById('passkey_button')) { 403 $("#passkey_button").on('click', function(){ bwPasskeyLogin(false); }); 404 405 var hint = ''; 406 try { hint = localStorage.getItem('bw_passkey'); } catch(e) { } 407 408 if (passkey_auto === '1' || hint === '1') { 409 // étape mfa après mot de passe, ou navigateur déjà utilisé avec un passkey : 410 // popup directe + bouton visible pour relancer en cas d'annulation. 411 // les autres (organisateurs, ou admin sur un navigateur neuf) ne voient rien et n'appellent pas le serveur : 412 // le premier login par mot de passe déclenche l'étape mfa qui pose le marqueur local. 413 $("#passkey_container").show(); 414 bwPasskeyLogin(true); 415 } 416 } 417}); 418 419</script>
419 420 421<section id="login" class="white_background"> 422 423 424 425 <div class="tips_container"> 426 427 <a href="/"> 428 <div class="image_panel"> 429 <img class="logo" src="/images/bo/billetweb-prismic-light.svg?v=1"> 430 </div> 431 </a> 432 433 <div class="tips_panel"> 434 435 <a href="/"> 436 <img class="logo" src="/images/bo/billetweb-prismic-light.svg?v=1"> 437 <img id="header_image" src="/images/bo/billetweb_connexion_crop.png?v=1"> 438 </a> 439 <!-- <div id="features" class="news_container" > 440 <div class="news_title">Nouveautés <span style="float:right;font-size:0.7em;margin-top: 3px;"><a href="https://billetweb.featureupvote.com/">Suggérer une idée</a></span></div> 441 <div class="news_text"></div> 442 <div class="fade" style="background: linear-gradient(180deg, rgba(2,0,36,0) 0%, rgba(255,255,255,0.5326505602240896) 33%, rgba(255,255,255,1) 67%); height: 70px; position: absolute; bottom: 0px; z-index: 1000; width: 100%;"></div> 443 </div>!--> 444 <div id="highlight" class="news_container url_item" data-url="https://newsletter.billetweb.fr"> 445 <div class="col_1"> 446 <div class="highlight_label">Newsletter </div> 447 <div class="highlight_title">La co-construction au coeur de lâinnovation</div> 448 <div class="highlight_link">Découvrez nos nouveautés</div> 449 </div> 450 <img src="/images/bo/newsletter_2025.png"> 451 </div> 452 <div id="cards" class="news_container" > 453 <!--<div class="news_title">Améliorer votre expérience</div>!--> 454 <div class="news_text news_image_container"></div> 455 <div class="fade" ></div> 456 <div class="news_footer" style=""></div> 457 </div> 458 459 </div> 460 461 </div> 462 463 <div id="signup_container"> 464 465 <form method="post" action="login.php" class="login"> 466 467 <input type="hidden" name="url" value=""> 468 469 <!--<div id="logo" style="min-height:70px;"> 470 <a href="/fr/"> 471 <img src="/images/front/billetweb_blue.svg" > 472 </a> 473 </div> --> 474 475 <h1>Se connecter</h1> 476 477 <div class="container" style="padding-bottom:30px;"> 478 479 <div id="cookies" style="display:none;" class="parameters"> 480 <div style="border:solid 1px #b00020;padding:12px;border-radius:5px;"> Votre navigateur n'autorise pas les cookies. Ceux ci sont nécéssaires pour utiliser le backoffice.</div> 481 </div> 482 483 484 <p> 485 <input type="email" autocomplete="username webauthn" name="login" id="login" value="" placeholder="Adresse email"> 486 </p> 487 <p> 488 <input type="password" name="password" id="password" value="" placeholder="Mot de passe" autocomplete="current-password"> 489 <p class="forgot-password" style=""><a href="login.php?reset=yes&language=fr">Mot de passe oublié ?</a></p> 490 </p> 491 492 <div class="submit"> 493 <p> 494 <button id="submit" type="submit" class="btn-primary button medium"> 495 Connexion 496 </button> 497 <span id="passkey_container" style="display:none;"> 498 <span class="passkey-separator">Ou connectez-vous avec</span> 499 <button id="passkey_button" type="button" class="btn-primary button medium passkey-button"> 500 Clé d'accès 501 </button> 502 <div id="passkey_error" style="display:none;"></div> 503 </span> 504 <p class="create-account"><span class="">Pas encore inscrit ?</span> <a href="/fr-fr/devenir-organisateur">Créer un compte</a></p> 505 </div> 506 </div> 507 508 509 510 511 512 </div> 513 514 </form> 515 516 </section> 517 518</body>
vendor: 143 bytes, lines 518-519
518 519<script src="/cdn-cgi/scripts/7d0fa10a/cloudflare-static/rocket-loader.min.js" data-cf-settings="00fac84f55f8b96fd720f295-|49" defer></script>
519</html>
520<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"77d572fed8794033a3fb6d1b9a0eadb0","spa":2}' crossorigin="anonymous"></script>
vendor: 1 bytes, line 520
520
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.