Update bootstrap to 4.0-beta

This commit is contained in:
nemunaire 2017-12-14 04:08:43 +01:00
parent 978f260c64
commit 73080d7d0d
23 changed files with 616 additions and 649 deletions

View file

@ -10,25 +10,26 @@ const indextpl = `<!DOCTYPE html>
<script src="/js/d3.v3.min.js"></script>
</head>
<body>
<nav class="navbar navbar-inverse navbar-static-top">
<div class="container">
<div class="navbar-header">
<nav class="navbar sticky-top navbar-expand-lg navbar-light bg-light" style="margin-bottom: 5px;">
<a class="navbar-brand" href="{{.urlbase}}">
<img alt="FIC" src="{{.urlbase}}img/fic.png" style="height: 100%">
<img alt="FIC" src="{{.urlbase}}img/fic.png" style="height: 30px">
</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#adminMenu" aria-controls="adminMenu" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="adminMenu">
<ul class="navbar-nav mr-auto">
<li class="nav-item"><a class="nav-link" href="{{.urlbase}}teams">&Eacute;quipes</a></li>
<li class="nav-item"><a class="nav-link" href="{{.urlbase}}themes">Thèmes</a></li>
<li class="nav-item"><a class="nav-link" href="{{.urlbase}}exercices">Exercices</a></li>
<li class="nav-item"><a class="nav-link" href="{{.urlbase}}public">Public</a></li>
<li class="nav-item"><a class="nav-link" href="{{.urlbase}}events">&Eacute;vénements</a></li>
<li class="nav-item"><a class="nav-link" href="{{.urlbase}}settings">Paramètres</a></li>
</ul>
</div>
<ul class="nav navbar-nav">
<li><a href="{{.urlbase}}teams">&Eacute;quipes</a></li>
<li><a href="{{.urlbase}}themes">Thèmes</a></li>
<li><a href="{{.urlbase}}exercices">Exercices</a></li>
<li><a href="{{.urlbase}}public">Public</a></li>
<li><a href="{{.urlbase}}events">&Eacute;vénements</a></li>
<li><a href="{{.urlbase}}settings">Paramètres</a></li>
</ul>
<p id="clock" class="navbar-text navbar-right" ng-controller="CountdownController">
<span id="clock" class="navbar-text" ng-controller="CountdownController" ng-cloak>
<span ng-show="startIn > 0">
Démarrage dans :
<span>{{"{{ startIn }}"}}</span>"
@ -39,13 +40,10 @@ const indextpl = `<!DOCTYPE html>
<span id="min">{{"{{ time.minutes | time }}"}}</span>
<span class="point">:</span>
<span id="sec">{{"{{ time.seconds | time }}"}}</span>
</p>
</div>
</span>
</nav>
<div class="container">
<div class="row" ng-controller="DIWEBoxController">
<div class="container" ng-controller="DIWEBoxController">
<div ng-repeat="box in boxes" class="alert alert-dismissible alert-{{"{{ box.kind }}"}}" ng-cloak>
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<strong ng-if="box.title">{{"{{ box.title }}"}}</strong> {{"{{ box.msg }}"}}
@ -53,12 +51,11 @@ const indextpl = `<!DOCTYPE html>
<button class="btn btn-sm btn-danger" ng-if="box.yes || box.no" ng-click="box.no()">No</button>
</div>
</div>
<div class="row">
<div class="col-sm-12" ng-view></div>
</div>
</div>
<div class="container" ng-view></div>
<script src="/js/jquery.min.js"></script>
<script src="/js/popper.min.js"></script>
<script src="/js/bootstrap.min.js"></script>
<script src="/js/angular.min.js"></script>
<script src="{{.urlbase}}js/angular-resource.min.js"></script>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -8,25 +8,26 @@
<script src="/js/d3.v3.min.js"></script>
</head>
<body>
<nav class="navbar navbar-inverse navbar-static-top">
<div class="container">
<div class="navbar-header">
<nav class="navbar sticky-top navbar-expand-lg navbar-light bg-light" style="margin-bottom: 5px;">
<a class="navbar-brand" href="/">
<img alt="FIC" src="/img/fic.png" style="height: 100%">
<img alt="FIC" src="/img/fic.png" style="height: 30px">
</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#adminMenu" aria-controls="adminMenu" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="adminMenu">
<ul class="navbar-nav mr-auto">
<li class="nav-item"><a class="nav-link" href="/teams">&Eacute;quipes</a></li>
<li class="nav-item"><a class="nav-link" href="/themes">Thèmes</a></li>
<li class="nav-item"><a class="nav-link" href="/exercices">Exercices</a></li>
<li class="nav-item"><a class="nav-link" href="/public">Public</a></li>
<li class="nav-item"><a class="nav-link" href="/events">&Eacute;vénements</a></li>
<li class="nav-item"><a class="nav-link" href="/settings">Paramètres</a></li>
</ul>
</div>
<ul class="nav navbar-nav">
<li><a href="/teams">&Eacute;quipes</a></li>
<li><a href="/themes">Thèmes</a></li>
<li><a href="/exercices">Exercices</a></li>
<li><a href="/public">Public</a></li>
<li><a href="/events">&Eacute;vénements</a></li>
<li><a href="/settings">Paramètres</a></li>
</ul>
<p id="clock" class="navbar-text navbar-right" ng-controller="CountdownController">
<span id="clock" class="navbar-text" ng-controller="CountdownController" ng-cloak>
<span ng-show="startIn > 0">
Démarrage dans :
<span>{{ startIn }}</span>"
@ -37,13 +38,10 @@
<span id="min">{{ time.minutes | time }}</span>
<span class="point">:</span>
<span id="sec">{{ time.seconds | time }}</span>
</p>
</div>
</span>
</nav>
<div class="container">
<div class="row" ng-controller="DIWEBoxController">
<div class="container" ng-controller="DIWEBoxController">
<div ng-repeat="box in boxes" class="alert alert-dismissible alert-{{ box.kind }}" ng-cloak>
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<strong ng-if="box.title">{{ box.title }}</strong> {{ box.msg }}
@ -51,12 +49,11 @@
<button class="btn btn-sm btn-danger" ng-if="box.yes || box.no" ng-click="box.no()">No</button>
</div>
</div>
<div class="row">
<div class="col-sm-12" ng-view></div>
</div>
</div>
<div class="container" ng-view></div>
<script src="/js/jquery.min.js"></script>
<script src="/js/popper.min.js"></script>
<script src="/js/bootstrap.min.js"></script>
<script src="/js/angular.min.js"></script>
<script src="/js/angular-resource.min.js"></script>

1
admin/static/js/popper.min.js vendored Symbolic link
View file

@ -0,0 +1 @@
../../../frontend/static/js/popper.min.js

View file

@ -1,8 +1,9 @@
<div class="well well-lg">
<h3>Interface d'administration du challenge</h3>
<p>
<div class="jumbotron text-light bg-primary">
<h1 class="display-4">Interface d'administration du challenge</h1>
<p class="lead">
Sélectionnez une action dans le menu ci-dessus.
</p>
<hr class="my-4">
<p ng-controller="VersionController">
Version de l'API : {{ v.version }}
</p>

View file

@ -1,121 +1,114 @@
<h2>Paramètres<a ng-click="regenerate()" class="pull-right btn btn-info" role="button"><span class="glyphicon glyphicon-refresh" aria-hidden="true"></span> Regénérer les fichiers statiques</a></h2>
<div class="jumbotron text-light bg-primary">
<h2>Paramètres<button ng-click="regenerate()" class="float-right btn btn-info" type="button"><span class="glyphicon glyphicon-refresh" aria-hidden="true"></span> Regénérer les fichiers statiques</a></h2>
<hr>
<form ng-submit="saveSettings()" class="form-horizontal well">
<form ng-submit="saveSettings()">
<input type="hidden" class="form-control" id="lastRegeneration" ng-model="config.generation">
<input type="hidden" class="form-control form-control-sm" id="lastRegeneration" ng-model="config.generation">
<div class="form-group">
<label for="challengeName" class="col-sm-2 control-label">Nom du challenge</label>
<div class="form-group row">
<label for="challengeName" class="col-sm-2 col-form-label col-form-label-sm">Nom du challenge</label>
<div class="col-sm-10">
<input type="text" class="form-control" id="challengeName" ng-model="config.title">
<input type="text" class="form-control form-control-sm" id="challengeName" ng-model="config.title">
</div>
</div>
<div class="form-group">
<label for="challengeAuthors" class="col-sm-2 control-label">Auteurs du challenge</label>
<div class="form-group row">
<label for="challengeAuthors" class="col-sm-2 col-form-label col-form-label-sm">Auteurs du challenge</label>
<div class="col-sm-10">
<input type="text" class="form-control" id="challengeAuthors" ng-model="config.authors">
<input type="text" class="form-control form-control-sm" id="challengeAuthors" ng-model="config.authors">
</div>
</div>
<div class="form-group">
<label for="startTime" class="col-sm-2 control-label">Début du challenge</label>
<div class="col-sm-8">
<input type="text" class="form-control" id="startTime" ng-model="config.start">
<div class="form-group row">
<label for="startTime" class="col-sm-2 col-form-label col-form-label-sm">Début du challenge</label>
<div class="col-sm-10">
<div class="input-group">
<input type="text" class="form-control form-control-sm" id="startTime" ng-model="config.start">
<span class="input-group-btn">
<button ng-click="launchChallenge()" class="btn btn-sm btn-secondary" type="button"><span class="glyphicon glyphicon-play" aria-hidden="true"></span> Lancer le challenge</button>
</span>
</div>
<div class="col-sm-2 text-right">
<a ng-click="launchChallenge()" class="btn btn-warning" role="button"><span class="glyphicon glyphicon-play" aria-hidden="true"></span> Lancer le challenge</a>
</div>
</div>
<div class="form-group">
<label for="endTime" class="col-sm-2 control-label">Fin du challenge</label>
<div class="form-group row">
<label for="endTime" class="col-sm-2 col-form-label col-form-label-sm">Fin du challenge</label>
<div class="col-sm-7">
<input type="text" class="form-control" id="endTime" ng-model="config.end">
<input type="text" class="form-control form-control-sm" id="endTime" ng-model="config.end">
</div>
<div class="col-sm-1 text-right">
<label for="duration" class="control-label">Durée</label>
<label for="duration" class="col-form-label col-form-label-sm">Durée</label>
</div>
<div class="col-sm-2">
<div class="input-group">
<input type="text" class="form-control" id="duration" ng-model="duration" integer>
<div class="input-group-addon">min</div>
<div class="input-group input-group-sm">
<input type="text" class="form-control form-control-sm" id="duration" ng-model="duration" integer>
<span class="input-group-addon">min</span>
</div>
</div>
</div>
<hr>
<div class="form-group">
<label for="firstBlood" class="col-sm-2 control-label">Bonus premier sang</label>
<div class="form-group row">
<label for="firstBlood" class="col-sm-2 col-form-label col-form-label-sm">Bonus premier sang</label>
<div class="col-sm-1">
<input type="text" class="form-control" id="firstBlood" ng-model="config.firstBlood" float>
<input type="text" class="form-control form-control-sm" id="firstBlood" ng-model="config.firstBlood" float>
</div>
</div>
<div class="form-group">
<label for="submissionCostBase" class="col-sm-2 control-label">Coût de base d'une soumission</label>
<div class="form-group row">
<label for="submissionCostBase" class="col-sm-2 col-form-label col-form-label-sm">Coût de base d'une soumission</label>
<div class="col-sm-1">
<input type="text" class="form-control" id="submissionCostBase" ng-model="config.submissionCostBase" float>
<input type="text" class="form-control form-control-sm" id="submissionCostBase" ng-model="config.submissionCostBase" float>
</div>
</div>
<hr>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<div class="checkbox">
<label>
<input type="checkbox" ng-model="config.allowRegistration"> Activer les inscriptions
<fieldset class="form-group">
<div class="row">
<legend class="col-form-legend col-sm-2">Options</legend>
<div class="col-sm-10">
<div class="form-check">
<label class="form-check-label">
<input class="form-check-input" type="checkbox" ng-model="config.allowRegistration"> Activer les inscriptions
</label>
</div>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<div class="checkbox">
<label>
<input type="checkbox" ng-model="config.denyNameChange"> Interdire les changements de nom d'équipe
<div class="form-check">
<label class="form-check-label">
<input class="form-check-input" type="checkbox" ng-model="config.denyNameChange"> Interdire les changements de nom d'équipe
</label>
</div>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<div class="checkbox">
<label>
<input type="checkbox" ng-model="config.enableResolutionRoute"> Activer la route montrant les solutions
<div class="form-check">
<label class="form-check-label">
<input class="form-check-input" type="checkbox" ng-model="config.enableResolutionRoute"> Activer la route montrant les solutions
</label>
</div>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<div class="checkbox">
<label>
<input type="checkbox" ng-model="config.partialValidation"> Activer la validation partielle des challenges
<div class="form-check">
<label class="form-check-label">
<input class="form-check-input" type="checkbox" ng-model="config.partialValidation"> Activer la validation partielle des challenges
</label>
</div>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<div class="checkbox">
<label>
<input type="checkbox" ng-model="config.enableExerciceDepend"> Activer les dépendances des exercices
<div class="form-check">
<label class="form-check-label">
<input class="form-check-input" type="checkbox" ng-model="config.enableExerciceDepend"> Activer les dépendances des exercices
</label>
</div>
</div>
</div>
</fieldset>
<hr>
<div class="form-group">
<label class="col-sm-2 control-label">Synchronisation</label>
<div class="form-group row">
<label class="col-sm-2 col-form-label col-form-label-sm">Synchronisation</label>
<div class="col-sm-10">{{ configro.sync }}</div>
</div>
@ -123,16 +116,16 @@
<button type="submit" class="btn btn-primary"><span class="glyphicon glyphicon-save" aria-hidden="true"></span> Propager ces paramètres</button>
</div>
</form>
<div class="well">
<div class="col-sm-4 center">
<a ng-click="reset('challenges')" class="btn btn-warning" role="button"><span class="glyphicon glyphicon-trash" aria-hidden="true"></span> Effacer les challenges et les thèmes</a>
</div>
<div class="col-sm-4 center">
<a ng-click="reset('teams');" class="btn btn-warning" role="button"><span class="glyphicon glyphicon-trash" aria-hidden="true"></span> Effacer les équipes</a>
</div>
<div class="col-sm-4 center">
<a ng-click="reset('game');" class="btn btn-warning" role="button"><span class="glyphicon glyphicon-trash" aria-hidden="true"></span> Effacer la partie (tentatives, indices, ...)</a>
</div>
<div class="clearfix"></div>
</div>
<div class="card-deck">
<div class="card">
<button ng-click="reset('challenges')" class="btn btn-secondary" type="button"><span class="glyphicon glyphicon-trash" aria-hidden="true"></span> Effacer les challenges et les thèmes</button>
</div>
<div class="card">
<button ng-click="reset('teams');" class="btn btn-secondary" type="button"><span class="glyphicon glyphicon-trash" aria-hidden="true"></span> Effacer les équipes</button>
</div>
<div class="card">
<button ng-click="reset('game');" class="btn btn-secondary" type="button"><span class="glyphicon glyphicon-trash" aria-hidden="true"></span> Effacer la partie (tentatives, indices, ...)</button>
</div>
</div>

File diff suppressed because one or more lines are too long

View file

@ -17,6 +17,10 @@
display:none !important;
}
.popover.bs-popover-left .arrow::after {
border-left-color: #7A8288;
}
body {
overflow-y: scroll;
}
@ -86,13 +90,12 @@ keyframes clockanim {
100% { opacity: 1.0; };
}
.well {
text-align: justify;
}
.samp {
overflow-x: auto;
samp.cksum {
overflow-x: hidden;
text-overflow: ellipsis;
max-width: 20vw;
display: inline-block;
vertical-align: middle;
}
h1 small.authors {
@ -195,3 +198,10 @@ th.rotated div span {
text-align: left;
text-overflow: ellipsis;
}
ul.list-inline li {
display: inline;
}
ul.list-inline li:not(:last-child)::after {
content: " ● "
}

View file

@ -1,52 +1,39 @@
<!DOCTYPE html>
<html>
<html lang="fr">
<head>
<meta charset="utf-8">
<title>Challenge Forensic</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link href="/css/bootstrap.min.css" type="text/css" rel="stylesheet" media="screen">
<link href="/css/fic.css" type="text/css" rel="stylesheet" media="screen">
<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="/assets/js/html5shiv.js"></script>
<script src="/assets/js/respond.min.js"></script>
<![endif]-->
<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico">
<meta name="author" content="EPITA Laboratoire SRS">
<meta name="robots" content="all">
<link href="/css/bootstrap.min.css" type="text/css" rel="stylesheet" media="screen">
<link href="/css/fic.css" type="text/css" rel="stylesheet" media="screen">
</head>
<body>
<body class="bg-light">
<div class="navbar navbar-default">
<div class="navbar navbar-expand-lg navbar-dark bg-dark text-light">
<div class="container">
<div class="row">
<div class="navbar-header col-sm-3">
<div class="col-md-auto">
<a href="/">
<img src="/img/fic.png" alt="Forum International de la Cybersécurité" class="center-block">
<img src="/img/fic.png" alt="Forum International de la Cybersécurité">
</a>
</div>
<div class="navbar-right col-sm-2">
<div id="clock" class="col-md-auto text-center">Challenge Forensic</div>
<div class="col-md-auto">
<a href="http://www.epita.fr/">
<img src="/img/epita.png" alt="Epita" class="center-block">
<img src="/img/epita.png" alt="Epita">
</a>
</div>
<div id="clock" class="col-sm-7">
Challenge forensic
</div>
</div>
</div>
</div>
<div class="container" style="margin-top:20px;">
<div class="jumbotron">
<div class="text-center">
<img src="http://http.cat/404" alt="cat not found!">
</div>
<h1>Page introuvable <small>Erreur 404</small></h1>
<p>
<hr>
<p class="lead">
La page &agrave; laquelle vous tentez d'acc&eacute;der n'existe pas ou l'adresse que vous avez tap&eacute;e est incorrecte.
</p>
<p>

View file

@ -1,52 +1,39 @@
<!DOCTYPE html>
<html>
<html lang="fr">
<head>
<meta charset="utf-8">
<title>Challenge Forensic</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link href="/css/bootstrap.min.css" type="text/css" rel="stylesheet" media="screen">
<link href="/css/fic.css" type="text/css" rel="stylesheet" media="screen">
<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="/assets/js/html5shiv.js"></script>
<script src="/assets/js/respond.min.js"></script>
<![endif]-->
<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico">
<meta name="author" content="EPITA Laboratoire SRS">
<meta name="robots" content="all">
<link href="/css/bootstrap.min.css" type="text/css" rel="stylesheet" media="screen">
<link href="/css/fic.css" type="text/css" rel="stylesheet" media="screen">
</head>
<body>
<body class="bg-light">
<div class="navbar navbar-default">
<div class="navbar navbar-expand-lg navbar-dark bg-dark text-light">
<div class="container">
<div class="row">
<div class="navbar-header col-sm-3">
<div class="col-md-auto">
<a href="/">
<img src="/img/fic.png" alt="Forum International de la Cybersécurité" class="center-block">
<img src="/img/fic.png" alt="Forum International de la Cybersécurité">
</a>
</div>
<div class="navbar-right col-sm-2">
<div id="clock" class="col-md-auto text-center">Challenge Forensic</div>
<div class="col-md-auto">
<a href="http://www.epita.fr/">
<img src="/img/epita.png" alt="Epita" class="center-block">
<img src="/img/epita.png" alt="Epita">
</a>
</div>
<div id="clock" class="col-sm-7">
Challenge forensic
</div>
</div>
</div>
</div>
<div class="container" style="margin-top:20px;">
<div class="jumbotron">
<div class="text-center">
<img src="http://http.cat/413" alt="cat not found!">
</div>
<h1>Requête trop grosse <small>Erreur 413</small></h1>
<p>
<hr>
<p class="lead">
La quantité de données que vous souhaitez envoyer au serveur est trop importante pour qu'il accepte de la traiter.
</p>
</div>

View file

@ -1,52 +1,39 @@
<!DOCTYPE html>
<html>
<html lang="fr">
<head>
<meta charset="utf-8">
<title>Challenge Forensic</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link href="/css/bootstrap.min.css" type="text/css" rel="stylesheet" media="screen">
<link href="/css/fic.css" type="text/css" rel="stylesheet" media="screen">
<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="/assets/js/html5shiv.js"></script>
<script src="/assets/js/respond.min.js"></script>
<![endif]-->
<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico">
<meta name="author" content="EPITA Laboratoire SRS">
<meta name="robots" content="all">
<link href="/css/bootstrap.min.css" type="text/css" rel="stylesheet" media="screen">
<link href="/css/fic.css" type="text/css" rel="stylesheet" media="screen">
</head>
<body>
<body class="bg-light">
<div class="navbar navbar-default">
<div class="navbar navbar-expand-lg navbar-dark bg-dark text-light">
<div class="container">
<div class="row">
<div class="navbar-header col-sm-3">
<div class="col-md-auto">
<a href="/">
<img src="/img/fic.png" alt="Forum International de la Cybersécurité" class="center-block">
<img src="/img/fic.png" alt="Forum International de la Cybersécurité">
</a>
</div>
<div class="navbar-right col-sm-2">
<div id="clock" class="col-md-auto text-center">Challenge Forensic</div>
<div class="col-md-auto">
<a href="http://www.epita.fr/">
<img src="/img/epita.png" alt="Epita" class="center-block">
<img src="/img/epita.png" alt="Epita">
</a>
</div>
<div id="clock" class="col-sm-7">
Challenge forensic
</div>
</div>
</div>
</div>
<div class="container" style="margin-top:20px;">
<div class="jumbotron">
<div class="text-center">
<img src="http://http.cat/500" alt="cat not found!">
</div>
<h1>Erreur interne <small>Erreur 500</small></h1>
<p>
<hr>
<p class="lead">
Notre serveur est actuellement dans l'incapacit&eacute; de repondre &agrave; votre requ&ecirc;te.<br>Veuillez recommencer dans quelques instants.
</p>
<p>

View file

@ -1,31 +1,23 @@
<!DOCTYPE html>
<html ng-app="FICApp">
<html lang="fr" ng-app="FICApp">
<head>
<meta charset="utf-8">
<title>Challenge Forensic</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link href="/css/bootstrap.min.css" type="text/css" rel="stylesheet" media="screen">
<link href="/css/fic.css" type="text/css" rel="stylesheet" media="screen">
<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="/assets/js/html5shiv.js"></script>
<script src="/assets/js/respond.min.js"></script>
<![endif]-->
<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico">
<meta name="author" content="EPITA Laboratoire SRS">
<meta name="robots" content="all">
<base href="/">
<link href="/css/bootstrap.min.css" type="text/css" rel="stylesheet" media="screen">
<link href="/css/fic.css" type="text/css" rel="stylesheet" media="screen">
<script src="/js/angular.min.js"></script>
</head>
<body>
<body class="bg-light">
<div class="navbar navbar-default">
<div class="navbar navbar-expand-lg navbar-dark bg-dark text-light">
<div class="container">
<div class="row">
<div class="navbar-left col-md-3">
<div class="col-md-auto">
<a href="https://www.forum-fic.com/" ng-if="!(time.start || my.team_id)">
<img src="/img/fic.png" alt="Forum International de la Cybersécurité" class="center-block">
</a>
@ -33,81 +25,75 @@
<img src="/img/fic.png" alt="Forum International de la Cybersécurité" class="center-block">
</a>
</div>
<div id="clock" class="col-md-6 text-center" ng-hide="1">Chargement...</div>
<div id="clock" class="col-md-6 text-center" ng-class="{expired: time.expired, end: time.end}" ng-if="time.start || my.team_id" ng-cloak>
<div id="clock" class="col-md-auto text-center" ng-hide="1">Chargement...</div>
<div id="clock" class="col-md-auto text-center" ng-class="{expired: time.expired, end: time.end}" ng-if="time.start || my.team_id" ng-cloak>
<span id="hours">{{ time.hours | time }}</span>
<span class="point">:</span>
<span id="min">{{ time.minutes | time }}</span>
<span class="point">:</span>
<span id="sec">{{ time.seconds | time }}</span>
</div>
<div id="clock" class="col-md-6" ng-if="!(time.start || my.team_id)" style="padding: 25px" ng-cloak>
<div class="btn-group btn-group-justified btn-group-lg">
<a class="btn btn-default" href="/">
<div id="clock" class="col-md-auto btn-group btn-group-lg" ng-if="!(time.start || my.team_id)" ng-cloak>
<a class="btn btn-light" href="/">
<span class="glyphicon glyphicon-home"></span> Accueil
</a>
<a class="btn btn-default" href="/rank">
<a class="btn btn-light" href="/rank">
<span class="glyphicon glyphicon-list"></span> Classement
</a>
<a class="btn btn-default disabled" href="https://www.youtube.com/playlist?list=PLSJ8QLhKMtQv7jRhdAn9wXSMYTsvqfieX">
<a class="btn btn-light disabled" href="https://www.youtube.com/playlist?list=PLSJ8QLhKMtQv7jRhdAn9wXSMYTsvqfieX">
<span class="glyphicon glyphicon-blackboard"></span> Vidéos
</a>
</div>
</div>
<div class="col-md-3 text-right">
<div class="col-md-auto">
<div class="carousel slide" data-ride="carousel" data-interval="30000" style="width: 150px">
<div class="carousel-inner text-center">
<div class="carousel-item active">
<a href="http://www.epita.fr/">
<img src="/img/epita.png" alt="Epita" class="center-block">
<img src="/img/epita.png" alt="Epita">
</a>
</div>
<div class="carousel-item">
<a href="https://srs.epita.fr/">
<img src="/img/srs.png" alt="Laboratoire SRS Épita">
</a>
</div>
<div class="carousel-item">
<img src="/img/rcc.png" alt="Réserve Citoyenne Cyberdéfense">
</div>
</div>
</div>
<div class="container" ng-controller="DataController">
<div class="row">
<div class="col-sm-3">
<div class="panel panel-default" ng-if="(my.team_id)" style="margin-top: 10px; margin-bottom: 0px;" ng-cloak>
<div class="panel-heading" style="background-color: {{ teams[my.team_id].color }}; color: {{ teams[my.team_id].color }};">
<a style="margin: -8px -13px; color: {{ teams[my.team_id].color }};" class="pull-right btn btn-default" href="/edit"><span class="glyphicon glyphicon-user" aria-hidden="true"></span></a>
<div class="panel-title">
<strong class="teamname">{{ my.name }}</strong>
</div>
</div>
<div class="panel-body">
<span ng-if="teams[my.team_id].rank">{{ teams[my.team_id].rank }}<sup><sup><ng-pluralize count="teams[my.team_id].rank" when="{'one': 're', 'other': 'e'}"></ng-pluralize></sup></sup> sur {{ teams_count }} &ndash;</span>
<ng-pluralize count="my.score" when="{'one': '{} point', 'other': '{} points'}"></ng-pluralize>
<div style="margin: -8px -10px;" class="pull-right btn-group">
<a class="btn btn-default" href="/rules"><span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span></a>
<a class="btn btn-default" href="/rank"><span class="glyphicon glyphicon-list-alt" aria-hidden="true"></span></a>
</div>
</div>
</div>
</div>
<div class="col-sm-9">
<div class="page-header">
<h1 ng-if="(current_theme)" ng-cloak>{{ themes[current_theme].name }} <small class="authors" ng-if="themes[current_theme].authors">{{ themes[current_theme].authors }}</small></h1>
<div ng-controller="DataController">
<nav class="navbar navbar-expand-lg bg-primary" ng-cloak>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#themesMenu" aria-controls="themesMenu" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="themesMenu">
<ul class="navbar-nav mr-auto">
<li ng-repeat="(k,theme) in themes"><a ng-class="{active: k == current_theme}" class="nav-link" ng-href="/{{ k }}" data-toggle="tab">{{ theme.name }} <span class="badge badge-light"><span class="glyphicon glyphicon-fire" aria-hidden="true" ng-if="max_solved > 1 && theme.solved == max_solved" alt="Déjà {{ theme.solved }} challenges résolus dans ce thème"></span> <span class="glyphicon glyphicon-gift" aria-hidden="true" ng-if="theme.exercice_coeff_max > 1" alt="Des bonus existent pour au moins un challenge de ce thème"></span> <span ng-if="(my.team_id)">{{ theme.exercice_solved }}/</span>{{ theme.exercice_count }}</span></a></li>
</ul>
</div>
<span class="navbar-text text-light" ng-show="(my.team_id)" ng-cloak>
<a tabindex="0" class="badge" role="button" style="background-color: {{ teams[my.team_id].color }}; color: {{ teams[my.team_id].color }};" data-toggle="popover" data-trigger="focus" data-template="<div class='popover' role='tooltip'><div class='arrow'></div><h3 class='popover-header bg-light text-dark'></h3><div class='popover-body bg-secondary text-dark'></div></div>" title="{{ my.name }}<a class='btn btn-sm btn-info float-right' href='/edit'>Édit.</a>" data-html="true" data-content="{{ teams[my.team_id].rank }}<sup>e</sup> sur {{ teams_count }} &ndash; {{ my.score }} points<br><div class='btn-group'><a class='btn btn-sm btn-primary' href='/rules'>Règles</a><a class='btn btn-sm btn-primary' href='/rank'>Classement</a></div>">
{{ my.name }}
</a>
</span>
</nav>
<div class="container">
<div class="page-header text-primary" ng-cloak>
<h1 ng-if="(current_theme)">{{ themes[current_theme].name }} <small class="authors" ng-if="themes[current_theme].authors">{{ themes[current_theme].authors }}</small></h1>
<h1 ng-if="(!current_theme && title)" ng-cloak>{{ title }} <small class="authors" ng-if="authors">{{ authors }}</small></h1>
<h1 ng-if="(!current_theme && !title)">{{ settings.title }} <small class="authors">{{ settings.authors }}</small></h1>
</div>
</div>
</div>
<div style="clear: both"></div>
<div class="row">
<div class="col-sm-3">
<div class="list-group" ng-cloak>
<a ng-repeat="(k,theme) in themes" ng-class="{active: k == current_theme}" class="list-group-item" ng-href="/{{ k }}"><span class="badge"><span class="glyphicon glyphicon-fire" aria-hidden="true" ng-if="max_solved > 1 && theme.solved == max_solved" alt="Déjà {{ theme.solved }} challenges résolus dans ce thème"></span> <span class="glyphicon glyphicon-gift" aria-hidden="true" ng-if="theme.exercice_coeff_max > 1" alt="Des bonus existent pour au moins un challenge de ce thème"></span> <span ng-if="(my.team_id)">{{ theme.exercice_solved }}/</span>{{ theme.exercice_count }}</span>{{ theme.name }}</a>
</div>
<a href="https://srs.epita.fr/"><img src="/img/srs.png" alt="Laboratoire SRS Épita" style="width: 48%; max-width: 200px;"></a>
<img src="/img/rcc.png" alt="Réserve Citoyenne Cyberdéfense" style="width: 48%; max-width: 200px;">
</div>
<div class="col-sm-9" ng-view>
<div ng-view>
<noscript>
<div class="alert alert-danger">
<strong>Veuillez activer le JavaScript.</strong> Ce site requiert un navigateur interprêtant le JavaScript pour fonctionner. Veuillez l'activer ou en télécharger un supportant cette technologie.
@ -116,9 +102,9 @@
</div>
</div>
</div>
<script src="/js/jquery.min.js"></script>
<script src="/js/popper.min.js"></script>
<script src="/js/bootstrap.min.js"></script>
<script src="/js/angular-route.min.js"></script>
<script src="/js/angular-sanitize.min.js"></script>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

5
frontend/static/js/popper.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View file

@ -3,26 +3,19 @@
<head>
<meta charset="utf-8">
<title>Challenge Forensic</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link href="/css/bootstrap.min.css" type="text/css" rel="stylesheet" media="screen">
<link href="/css/fic.css" type="text/css" rel="stylesheet" media="screen">
<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="/assets/js/html5shiv.js"></script>
<script src="/assets/js/respond.min.js"></script>
<![endif]-->
<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico">
<meta name="author" content="EPITA Laboratoire SRS">
<meta name="robots" content="all">
<base href="/">
<link href="/css/bootstrap.min.css" type="text/css" rel="stylesheet" media="screen">
<link href="/css/fic.css" type="text/css" rel="stylesheet" media="screen">
<script src="/js/angular.min.js"></script>
</head>
<body style="overflow: hidden;" class="container-fluid" ng-controller="DataController">
<div class="row" style="margin-top: 10px">
<div class="col-xs-8">
<body class="bg-light" style="overflow: hidden;" class="container-fluid" ng-controller="DataController">
<div class="row" style="margin:10px 0">
<div class="col-8">
<noscript>
<div class="alert alert-danger">
<strong>Veuillez activer le JavaScript.</strong> Ce site requiert un navigateur interprêtant le JavaScript pour fonctionner. Veuillez l'activer ou en télécharger un supportant cette technologie.
@ -31,7 +24,8 @@
<div ng-repeat="(k,s) in scene" class="repeatedd-item">
<div class="well" ng-if="s.type == 'welcome' && !s.params.hide && s.params.kind == 'init'">
<div class="card" ng-if="s.type == 'welcome' && !s.params.hide && s.params.kind == 'init'">
<div class="card-body">
<h1>Bienvenue au challenge forensic&nbsp;!</h1>
<p class="lead text-justify">
Avant de vous installer, venez récupérer votre clef USB auprès
@ -45,49 +39,55 @@
</span>
</p>
</div>
<div class="panel panel-success" ng-if="s.type == 'welcome' && !s.params.hide && s.params.kind == 'countdown'">
<div class="panel-heading">
<h3 class="panel-title"><strong>Le {{ settings.title }} est sur le point de commencer&nbsp;!</strong></h3>
</div>
<div class="panel-body text-center" style="font-size: 450%;" ng-if="startIn">{{ startIn }}</div>
<div class="panel-body text-center" style="font-size: 450%;" ng-if="!startIn">Go, go, go&nbsp;!</div>
</div>
<div class="well" ng-if="s.type == 'welcome' && !s.params.hide && s.params.kind == 'public'">
<div class="card border-success" ng-if="s.type == 'welcome' && !s.params.hide && s.params.kind == 'countdown'">
<div class="card-header bg-success text-white">
<h3 style="margin:0"><strong>Le {{ settings.title }} est sur le point de commencer&nbsp;!</strong></h3>
</div>
<div class="card-body text-center" style="font-size: 450%;" ng-if="startIn">{{ startIn }}</div>
<div class="card-body text-center" style="font-size: 450%;" ng-if="!startIn">Go, go, go&nbsp;!</div>
</div>
<div class="card" ng-if="s.type == 'welcome' && !s.params.hide && s.params.kind == 'public'">
<div class="card-body">
<h1>Bienvenue au challenge forensic&nbsp;!</h1>
<p class="lead text-justify">
Durant ce challenge, les équipes doivent remonter des scénarii
d'attaques auxquels nos systèmes d'information font faces
chaque jour : fuite de données, compromission d'un poste de
Durant ce challenge, les équipes doivent <strong>remonter des scénarii
d'attaques</strong> auxquels nos systèmes d'information <strong>font faces
chaque jour</strong> : fuite de données, compromission d'un poste de
travail, exploitation de vulnérabilités d'un site web, ...
</p>
<p class="lead text-justify">
Pour valider un challenge, chaque participant va télécharger :
soit des journaux d'évènements, des extraits de trafic réseau
ou même des copies figées de la mémoire vive de machines
malveillantes, pour essayer de comprendre comment l'attaquant a
contourné la sécurité de la machine et quelles actions hostiles
soit des <strong>journaux d'évènements</strong>, des extraits de trafic réseau
ou même des <strong>copies</strong> figées <strong>de la mémoire vive</strong> de machines
malveillantes, pour <strong>essayer de comprendre</strong> comment l'attaquant a
<strong>contourné la sécurité</strong> de la machine et quelles actions hostiles
ont été effectuées.
</p>
</div>
</div>
<div class="well" ng-if="s.type == 'message' && !s.params.hide">
<div class="card" ng-if="s.type == 'message' && !s.params.hide">
<div class="card-body">
<h1 ng-if="s.params.title"><strong>{{ s.params.title }}</strong></h1>
<p ng-if="s.params.lead" class="lead text-justify">{{ s.params.lead }}</p>
<p ng-bind-html="s.params.html" ng-if="s.params.html"></p>
<p ng-if="s.params.text">{{ s.params.text }}</p>
</div>
<div class="panel {{ s.params.kind }}" ng-if="s.type == 'panel' && !s.params.hide">
<div class="panel-heading" ng-if="s.params.title">
<h3 class="panel-title">{{ s.params.title }}</h3>
</div>
<div class="panel-body" ng-if="s.params.text">{{ s.params.text }}</div>
<div class="panel-body" ng-if="s.params.html" ng-bind-html="s.params.html"></div>
</div>
<div class="well" ng-if="s.type == 'exercice' && !s.params.hide">
<div class="card" ng-if="s.type == 'panel' && !s.params.hide">
<div class="card-header {{ s.params.kind }}" ng-if="s.params.title">
<h3 style="margin:0">{{ s.params.title }}</h3>
</div>
<div class="card-body" ng-if="s.params.text">{{ s.params.text }}</div>
<div class="card-body" ng-if="s.params.html" ng-bind-html="s.params.html"></div>
</div>
<div class="card" ng-if="s.type == 'exercice' && !s.params.hide">
<div class="card-body">
<p class="lead">
<strong>Challenge <em>{{ themes[my.exercices[s.params.exercice].theme_id].exercices[s.params.exercice].title }}</em> du thème {{ themes[my.exercices[s.params.exercice].theme_id].name }}</strong>
<small class="authors" ng-if="themes[my.exercices[s.params.exercice].theme_id].authors">par {{ themes[my.exercices[s.params.exercice].theme_id].authors }}</small>
@ -102,8 +102,9 @@
<li>Résolu par <ng-pluralize count="themes[my.exercices[s.params.exercice].theme_id].exercices[s.params.exercice].solved" when="{'0': 'aucune équipe', 'one': '{} équipe', 'other': '{} équipes'}"></ng-pluralize></li>
</ul>
</div>
</div>
<div class="panel" ng-if="s.type == 'table' && !s.params.hide">
<div class="card" ng-if="s.type == 'table' && !s.params.hide">
<table class="table table-bordered table-striped table-condensed">
<thead>
<tr>
@ -147,7 +148,7 @@
</table>
</div>
<div class="panel" ng-if="s.type == 'rank' && !s.params.hide">
<div class="card" ng-if="s.type == 'rank' && !s.params.hide">
<table class="table table-bordered table-striped table-condensed">
<thead>
<tr>
@ -169,7 +170,7 @@
</div>
</div>
<div class="col-xs-4">
<div class="col-4">
<div ng-controller="EventsController">
<div ng-repeat="e in events | limitTo: 7" class="repeated-item">
@ -179,7 +180,7 @@
</div>
</div>
<div style="box-shadow: 0px -5px 5px 5px #272b30; position: fixed; bottom: calc(14vh - 1px); right: 0; width: 33vw;" class="navbar navbar-inverse" ng-controller="TimeController">
<div style="box-shadow: 0px -5px 5px 5px #e9ecef; position: fixed; bottom: calc(14vh - 1px); right: 0; width: 33vw;" class="navbar navbar-inverse" ng-controller="TimeController">
<div class="text-center" ng-if="time.hours === 0 || time.hours" style="margin-top: -5px;">
<div id="clock" ng-class="{expired: time.expired, end: time.end}" style="font-size: 50px" ng-cloak>
<span id="hours">{{ time.hours | time }}</span>
@ -199,30 +200,29 @@
</div>
</div>
<div style="position: fixed; bottom: 0; right: 0; width: 33vw; height: 14vh" class="navbar navbar-inverse">
<div class="carousel slide" id="carousel-logos" data-ride="carousel">
<div style="position: fixed; bottom: 0; right: 0; width: 33vw; height: 14vh" class="bg-primary">
<div class="carousel slide" id="carousel-logos" data-ride="carousel" data-interval="10500">
<div class="carousel-inner">
<div class="item active">
<div class="carousel-item active">
<div class="carousel-caption">
<a href="http://www.epita.fr/"><img src="/img/epita.png" alt="Epita" style="width:30%"></a>
<a href="https://srs.epita.fr/"><img src="/img/srs.png" alt="Laboratoire SRS" style="width:30%"></a>
<img src="/img/rcc.png" alt="Réserve Citoyenne Cyberdéfense" style="width:30%">
<a href="http://www.epita.fr/"><img src="/img/epita.png" alt="Epita" style="max-height:14vh"></a>
<img src="/img/rcc.png" alt="Réserve Citoyenne Cyberdéfense" style="height:14vh">
</div>
</div>
<div class="item">
<div class="carousel-caption" style="padding: 0 10px">
<div class="carousel-item">
<div class="carousel-caption">
<h2>Bienvenue au challenge forensic&nbsp;!</h2>
</div>
</div>
<div class="item">
<div class="carousel-item">
<div class="carousel-caption">
<p class="text-justify text-bold" style="padding: 20px 16px; font-size: 111%">
<p class="text-justify text-bold" style="padding: 5px 16px; font-size: 111%">
Ce challenge met en scène des scénarii d'attaques auxquels
nos systèmes d'information font faces chaque jour.
</p>
</div>
</div>
<div class="item">
<div class="carousel-item">
<div class="carousel-caption">
<p class="text-justify text-bold" style="padding: 20px 16px; font-size: 111%">
Les 42 équipes doivent, en 4 heures, retracer les attaques à la
@ -230,28 +230,28 @@
</p>
</div>
</div>
<div class="item">
<div class="carousel-caption row" style="padding: 12px">
<div class="col-xs-4">
<a href="https://www.epita.fr/"><img src="/img/epita.png" alt="Épita" style="height: 10vh"></a>
<div class="carousel-item">
<div class="carousel-caption row" style="padding: 10px">
<div class="col-4">
<a href="https://srs.epita.fr/"><img src="/img/srs.png" alt="Laboratoire SRS" style="height:12vh"></a>
</div>
<p class="col-xs-8 text-bold" style="font-size: 111%">
<p class="col-8 text-bold" style="font-size: 111%">
Les challenges ont été réalisés par les étudiants de la
spécialisation SRS de l'Épita
spécialisation SRS de l'Épita.
</p>
</div>
</div>
<div class="item">
<div class="carousel-item">
<div class="carousel-caption row" style="padding: 12px">
<div class="col-xs-4">
<div class="col-4">
<img src="/img/rcc.png" alt="Réserve Citoyenne Cyberdéfense" style="max-width:100%; max-height: 11vh">
</div>
<p class="col-xs-8 text-bold" style="padding: 10px 10px 10px 0; font-size: 111%">
<p class="col-8 text-bold" style="padding: 10px 10px 10px 0; font-size: 111%">
Avec le parrainage du réseau de la Réserve Citoyenne Cyberdéfense
</p>
</div>
</div>
<div class="item">
<div class="carousel-item">
<div class="carousel-caption" style="padding: 3px 25px; width: 32vw;">
<table class="table table-bordered table-condensed table-striped">
<tbody>
@ -275,10 +275,10 @@
</table>
</div>
</div>
<div class="item">
<div class="carousel-item">
<div class="carousel-caption row" style="padding: 12px">
<p class="text-bold" style="padding: 5px; font-size: 105%">
Retrouvez la correction des challenges dès demain sur :
<p class="text-bold" style="padding: 5px;">
Retrouvez les solutions des challenges dès demain sur :
<span style="display: block; font-size: 150%" class="text-center">
<a style="font-family: mono" href="https://fic.srs.epita.fr/"><span class="text-info">https://fic.srs.epita.fr/</span></a>
</span>
@ -295,6 +295,7 @@
</div>
<script src="/js/jquery.min.js"></script>
<script src="/js/popper.min.js"></script>
<script src="/js/bootstrap.min.js"></script>
<script src="/js/angular-animate.min.js"></script>
<script src="/js/angular-route.min.js"></script>
@ -302,10 +303,5 @@
<script src="/js/i18n/angular-locale_fr-fr.js"></script>
<script src="/js/public.js"></script>
<script src="/js/common.js"></script>
<script>
$(".carousel").carousel({
interval: 21000
});
</script>
</body>
</html>

View file

@ -1,5 +1,8 @@
<div class="well well-lg" style="text-indent: 1em">
<h3 style="text-indent: 0">Bienvenue <span ng-repeat="member in my.members"><span ng-if="$last && !$first"> et </span><span ng-if="$middle">, </span>{{ member.firstname | capitalize }} {{ member.lastname | capitalize }}</span> !</h3>
<div class="row">
<div class="col text-justify">
<div class="jumbotron" style="text-indent: 1em">
<h2 style="text-indent: 0">Bienvenue <span ng-repeat="member in my.members"><span ng-if="$last && !$first"> et </span><span ng-if="$middle">, </span>{{ member.firstname | capitalize }} {{ member.lastname | capitalize }}</span> !</h2>
<hr>
<p ng-if="(my.team_id)">
Félicitations ! vous êtes maintenant connecté à l'espace de votre
équipe <em>{{ teams[my.team_id].name }}</em>. Vous pouvez changer ce nom
@ -27,17 +30,20 @@
<strong>Attention :</strong> puisqu'il s'agit de captures effectuées dans le
but de découvrir si des actes malveillants ont été commis sur différents
systèmes d'information, les contenus qui sont
téléchargeables <em>peuvent</em> contenir du contenu malveillant !
téléchargeables <em>peuvent</em> contenir du contenu malveillant&nbsp;!
</div>
<div class="panel panel-default" ng-if="(my.team_id)">
<div class="panel-heading">
<h3 class="panel-title">Progression</h3>
</div>
<div class="col-md-3" ng-if="(my.team_id)">
<div class="card text-white bg-primary">
<div class="card-header">
Progression
</div>
<div class="panel-body">
<div class="card-body">
<strong>Vous</strong>
<div class="progress progress-striped">
<div class="progress-bar progress-bar-success" role="progressbar" aria-valuenow="60"
<div class="progress-bar bg-success" role="progressbar" aria-valuenow="60"
aria-valuemin="0" aria-valuemax="100" style="width: {{ my.score * 100 / max_gain }}%;">
<span class="sr-only">{{ my.score * 100 / max_gain }}% Complete</span>
</div>
@ -45,7 +51,7 @@
<strong>Le temps</strong>
<div class="progress">
<div class="progress-bar progress-bar-info" role="progressbar" aria-valuenow="60"
<div class="progress-bar bg-info" role="progressbar" aria-valuenow="60"
aria-valuemin="0" aria-valuemax="100" style="width: {{ 100 - time.remaining / time.duration * 100 }}%;">
<span class="sr-only">{{ time.remaining }} secondes restantes</span>
</div>
@ -54,7 +60,7 @@
<div ng-if="rank.length && rank[0].id != my.team_id">
<strong>La meilleure équipe ({{ rank[0].name }})</strong>
<div class="progress">
<div class="progress-bar progress-bar-success" role="progressbar" aria-valuenow="60"
<div class="progress-bar bg-success" role="progressbar" aria-valuenow="60"
aria-valuemin="0" aria-valuemax="100" style="width: {{ rank[0].score * 100 / max_gain }}%;">
<span class="sr-only">{{ rank[0].score * 100 / max_gain }}% Complete</span>
</div>
@ -64,7 +70,7 @@
<div ng-if="rank[0].id == my.team_id && rank.length > 1">
<strong>La seconde équipe ({{ rank[1].name }})</strong>
<div class="progress">
<div class="progress-bar progress-bar-success" role="progressbar" aria-valuenow="60"
<div class="progress-bar bg-success" role="progressbar" aria-valuenow="60"
aria-valuemin="0" aria-valuemax="100" style="width: {{ rank[1].score * 100 / max_gain }}%;">
<span class="sr-only">{{ rank[1].score * 100 / max_gain }}% Complete</span>
</div>

View file

@ -1,5 +1,5 @@
<div class="panel panel-success">
<div class="panel-body">
<div class="card bg-primary text-light">
<div class="card-body">
<input type="search" class="form-control" placeholder="Rechercher" ng-model="query">
</div>
<table class="table table-hover table-striped">

View file

@ -1,12 +1,14 @@
<div class="well well-lg text-indent">
<div class="card-group">
<div class="card">
<div class="card-body text-indent">
<h2>Débloquage des challenges</h2>
<p>
Au début, seul le premier challenge de chaque thème est
accessible. Les challenges de niveau supérieur sont débloqués en
validant le challenge du niveau qui les précéde.
</p>
<hr>
<h2>Le classement</h2>
<p>
Pour figurer dans le classement, il faut avoir réalisé au moins une action :
@ -23,8 +25,6 @@
Pour gagner des points, vous devez résoudre les challenges qui vous sont
proposés. Plus l'exercice est compliqué, plus il rapporte de points.
</p>
<div class="row">
<div class="col-sm-offset-3 col-sm-6">
<table class="table table-condensed table-striped">
<thead>
<tr>
@ -55,8 +55,6 @@
</tr>
</tbody>
</table>
</div>
</div>
<h3>Coût des indices</h3>
<p>
@ -65,14 +63,16 @@
points, la valeur de points perdue est indiquée pour chaque indice.
</p>
</div>
</div>
<div class="card">
<div class="card-body text-indent">
<h3>Coût de soumission</h3>
<p>
Vous disposez de 9 tentatives pour trouver la/les solutions d'un
challenge. Au delà, chaque tentative vous fait perdre une petite quantité
de points comme suit :
</p>
<div class="row">
<div class="col-sm-offset-2 col-sm-8">
<table class="table table-condensed table-striped">
<thead>
<tr>
@ -107,8 +107,6 @@
</tr>
</tbody>
</table>
</div>
</div>
<p>
Par exemple :
</p>
@ -122,6 +120,7 @@
La dernière soumission (lorsque tous les flags sont bons) est comptabilisée
parmi ce nombre de tentatives.
</p>
<hr>
<h3>Bonus</h3>
<p>
@ -146,3 +145,5 @@
thème"></span>
</p>
</div>
</div>
</div>

View file

@ -1,6 +1,6 @@
<div class="panel panel-default">
<div class="panel-heading">Votre équipe est composée de :</div>
<div class="panel-body" ng-if="!my.members.length">
<div class="card">
<div class="card-header">Votre équipe est composée de :</div>
<div class="card-body" ng-if="!my.members.length">
Passez voir l'équipe serveur pour compléter ces informations.
</div>
<ul class="list-group" ng-if="my.members.length">
@ -13,22 +13,20 @@
</ul>
</div>
<div class="panel panel-info">
<div class="panel-heading">Changer de nom d'équipe</div>
<div class="panel-body">
<div class="card border-info" style="margin-top: 10px">
<div class="card-header bg-info text-light">Changer de nom d'équipe</div>
<div class="card-body">
<p ng-class="messageClass" ng-if="message || sberr"><strong ng-if="!sberr">Votre demande a bien été envoyée !</strong><strong ng-if="sberr">{{ sberr }}</strong> {{ message }}</p>
<form class="form-horizontal" ng-submit="tsubmit()">
<div class="form-group">
<label for="newName" class="col-sm-2 control-label">Nouveau nom</label>
<form ng-submit="tsubmit()">
<div class="form-group row">
<label for="newName" class="col col-form-label">Nouveau nom</label>
<div class="col-sm-10">
<div class="input-group">
<input type="text" class="form-control" id="newName" ng-model="newName" placeholder="{{ my.name }}">
</div>
</div>
<div class="row form-group">
<div class="col-sm-offset-3">
<span class="input-group-btn">
<button class="btn btn-info">Valider</button>
</span>
</div>
</div>
</div>

View file

@ -1,38 +1,45 @@
<ul class="nav nav-tabs nav-justified">
<li ng-repeat="(k,exercice) in themes[current_theme].exercices" ng-class="{active: k == current_exercice, disabled: !my.exercices[k]}"><a ng-if="(!my.exercices[k])">{{ exercice.title }}</a><a ng-href="/{{ current_theme }}/{{ k }}" ng-if="(my.exercices[k])">{{ exercice.title }} <span class="glyphicon glyphicon-gift" aria-hidden="true" ng-if="themes[current_theme].exercices[k].curcoeff > 1.0"></span> <span class="glyphicon glyphicon-ok" aria-hidden="true" ng-if="(my.team_id && my.exercices[k].solved)"></span></a></li>
</ul>
<nav role="navigation">
<ol class="breadcrumb">
<li ng-repeat="(k,exercice) in themes[current_theme].exercices" class="breadcrumb-item" ng-class="{active: k == current_exercice, disabled: !my.exercices[k]}"><a ng-if="(!my.exercices[k])">{{ exercice.title }}</a><a ng-href="/{{ current_theme }}/{{ k }}" ng-if="(my.exercices[k])">{{ exercice.title }} <span class="glyphicon glyphicon-gift" aria-hidden="true" ng-if="themes[current_theme].exercices[k].curcoeff > 1.0"></span> <span class="glyphicon glyphicon-ok" aria-hidden="true" ng-if="(my.team_id && my.exercices[k].solved)"></span></a></li>
</ol>
</nav>
<div class="alert alert-warning" style="margin-top:15px;" ng-if="!(my.exercices[current_exercice])">
Vous n'avez pas encore accès à cet exercice.
</div>
<div style="margin-top: 15px" class="well well-lg" ng-if="(my.exercices[current_exercice])">
<div class="jumbotron" style="margin-top: 15px" class="well well-lg" ng-if="(my.exercices[current_exercice])">
<p ng-bind-html="my.exercices[current_exercice].statement"></p>
<ul>
<li><strong>Gain :</strong> <ng-pluralize count="themes[current_theme].exercices[current_exercice].gain" when="{'one': '{} point', 'other': '{} points'}"></ng-pluralize> <em ng-if="themes[current_theme].exercices[current_exercice].solved < 1">{{ 1 + settings.firstBlood | coeff }} prem's</em> <em ng-if="themes[current_theme].exercices[current_exercice].curcoeff != 1.0">{{ themes[current_theme].exercices[current_exercice].curcoeff | coeff }} bonus</em></li>
<li><strong>Résolu par :</strong> <ng-pluralize count="themes[current_theme].exercices[current_exercice].solved" when="{'0': 'aucune équipe', 'one': '{} équipe', 'other': '{} équipes'}"></ng-pluralize>.</li>
<li><strong>Gain&nbsp;:</strong> <ng-pluralize count="themes[current_theme].exercices[current_exercice].gain" when="{'one': '{} point', 'other': '{} points'}"></ng-pluralize> <em ng-if="themes[current_theme].exercices[current_exercice].solved < 1">{{ 1 + settings.firstBlood | coeff }} prem's</em> <em ng-if="themes[current_theme].exercices[current_exercice].curcoeff != 1.0">{{ themes[current_theme].exercices[current_exercice].curcoeff | coeff }} bonus</em></li>
<li><strong>Résolu par&nbsp;:</strong> <ng-pluralize count="themes[current_theme].exercices[current_exercice].solved" when="{'0': 'aucune équipe', 'one': '{} équipe', 'other': '{} équipes'}"></ng-pluralize>.</li>
</ul>
</div>
<div class="panel panel-default" ng-if="(my.exercices[current_exercice] && my.exercices[current_exercice].files.length)">
<div class="panel-heading">
<div class="panel-title"><span class="glyphicon glyphicon-download-alt" aria-hidden="true"></span> Téléchargements</div>
<div class="row">
<div class="col-xl" ng-if="(my.exercices[current_exercice] && my.exercices[current_exercice].files.length)">
<div class="card" style="margin-bottom: 15px">
<div class="card-header text-white">
<span class="glyphicon glyphicon-download-alt" aria-hidden="true"></span> Téléchargements
</div>
<div class="list-group">
<a ng-href="{{ file.path }}" target="_self" class="list-group-item" ng-repeat="file in my.exercices[current_exercice].files">
<h1 class="pull-left" style="margin: 7px 7px 5px -5px"><span class="glyphicon glyphicon-download" aria-hidden="true"></span></h1>
<h4 class="list-group-item-heading"><strong><samp>{{ file.name }}</samp></strong></h4>
<p class="list-group-item-text">Taille : <span title="{{ file.size }} octets">{{ file.size | size }}</span> &ndash; <a href="https://blake2.net/">b2sum</a> : <samp>{{ file.checksum }}</samp></p>
<p class="list-group-item-text"><nobr>Taille&nbsp;: <span title="{{ file.size }} octets">{{ file.size | size }}</span></nobr> &ndash; <nobr><span title="blake2.net">b2sum</span>&nbsp;: <samp class="cksum" title="{{ file.checksum }}">{{ file.checksum }}</samp></nobr></p>
</a>
</div>
</div>
</div>
<div class="panel panel-info" ng-if="(my.exercices[current_exercice] && my.exercices[current_exercice].hints.length)">
<div class="panel-heading">
<div class="panel-title"><span class="glyphicon glyphicon-lamp" aria-hidden="true"></span> Indices</div>
<div class="col-xl" ng-if="(my.exercices[current_exercice] && my.exercices[current_exercice].hints.length)">
<div class="card border-info">
<div class="card-header bg-info text-white">
<span class="glyphicon glyphicon-lamp" aria-hidden="true"></span> Indices
</div>
<div class="list-group">
<a target="_self" class="list-group-item" ng-repeat="hint in my.exercices[current_exercice].hints" ng-href="{{ hint.file }}">
<button ng-click="hsubmit(hint)" class="pull-right btn btn-info" ng-if="!(hint.content || hint.file)" ng-class="{disabled: hint.submitted}"><span class="glyphicon glyphicon-lock" aria-hidden="true"></span> Débloquer</button>
<button ng-click="hsubmit(hint)" class="float-right btn btn-info" ng-if="!(hint.content || hint.file)" ng-class="{disabled: hint.submitted}"><span class="glyphicon glyphicon-lock" aria-hidden="true"></span> Débloquer</button>
<button ng-click="hint.hidden = false;" class="pull-right btn btn-info" ng-if="hint.content && hint.hidden"><span class="glyphicon glyphicon-lock" aria-hidden="true"></span> Afficher</button>
<h1 class="pull-left" style="margin: 5px 7px 5px -5px" ng-if="hint.file"><span class="glyphicon glyphicon-download" aria-hidden="true"></span></h1>
<h4 class="list-group-item-heading">{{ hint.title }}</h4>
@ -42,19 +49,21 @@
</a>
</div>
</div>
</div>
<div class="panel panel-danger" ng-if="my.team_id && my.exercices[current_exercice] && !(my.exercices[current_exercice].solved)">
<div class="panel-heading">
<div class="panel-title"><span class="glyphicon glyphicon-flag" aria-hidden="true"></span> Soumettre une solution</div>
<div class="col-xl" style="margin-bottom: 25px">
<div class="card border-danger" ng-if="my.team_id && my.exercices[current_exercice] && !(my.exercices[current_exercice].solved)" style="margin-bottom: 15px">
<div class="card-header bg-danger text-white">
<span class="glyphicon glyphicon-flag" aria-hidden="true"></span> Soumettre une solution
</div>
<ul class="list-group" ng-if="(my.exercices[current_exercice].tries || my.exercices[current_exercice].submitted || sberr)">
<li class="list-group-item text-warning" ng-if="my.exercices[current_exercice].tries"><ng-pluralize count="my.exercices[current_exercice].tries" when="{'one': '{} tentative effectuée', 'other': '{} tentatives effectuées'}"></ng-pluralize>. Dernière solution envoyée à {{ my.exercices[current_exercice].solved_time | date:"mediumTime" }}.</li>
<li class="list-group-item" ng-class="messageClass" ng-if="my.exercices[current_exercice].submitted || sberr"><strong ng-if="!sberr">Votre solution a bien été envoyée !</strong><strong ng-if="sberr">{{ sberr }}</strong> {{ message }}</li>
</ul>
<div class="panel-body" ng-if="!my.exercices[current_exercice].submitted || sberr">
<div class="card-body" ng-if="!my.exercices[current_exercice].submitted || sberr">
<form ng-controller="SubmissionController" ng-submit="ssubmit()">
<div class="form-group" ng-repeat="key in flags" ng-class="{'has-success': key.found, 'has-feedback': key.found}">
<label for="sol_{{ key.id }}">{{ key.name }} :</label>
<label for="sol_{{ key.id }}">{{ key.name }}&nbsp;:</label>
<input type="text" class="form-control" id="sol_{{ key.id }}" name="sol_{{ key.id }}" ng-model="key.value" ng-disabled="key.found">
<span class="glyphicon glyphicon-ok form-control-feedback" aria-hidden="true" ng-if="key.found"></span>
</div>
@ -65,22 +74,22 @@
</div>
</div>
<div class="panel panel-success" ng-if="(my.team_id && my.exercices[current_exercice].solved)">
<div class="panel-heading">
<div class="panel-title"><span class="glyphicon glyphicon-flag" aria-hidden="true"></span> Challenge réussi !</div>
<div class="card border-success" ng-if="(my.team_id && my.exercices[current_exercice].solved)">
<div class="card-header bg-success text-white">
<span class="glyphicon glyphicon-flag" aria-hidden="true"></span> Challenge réussi !
</div>
<div class="panel-body">
<div class="card-body">
Vous êtes la {{ my.exercices[current_exercice].solved_rank }}<sup><ng-pluralize count="my.exercices[current_exercice].solved_rank" when="{'one': 're', 'other': 'e'}"></ng-pluralize></sup> équipe à avoir résolu ce challenge à {{ my.exercices[current_exercice].solved_time | date:"mediumTime" }}. Vous avez marqué <ng-pluralize count="my.exercices[current_exercice].gain" when="{'one': '{} point', 'other': '{} points'}"></ng-pluralize> !
</div>
</div>
<div class="panel panel-success" ng-if="(!my.team_id && my.exercices[current_exercice].keys)">
<div class="panel-heading">
<div class="panel-title"><span class="glyphicon glyphicon-flag" aria-hidden="true"></span> Solution du challenge</div>
<div class="card border-success" ng-if="(!my.team_id && my.exercices[current_exercice].keys)">
<div class="card-heading bg-success text-white">
<span class="glyphicon glyphicon-flag" aria-hidden="true"></span> Solution du challenge
</div>
<div class="panel-body">
<div class="card-body">
<p>
Vérifiez les clefs que vous trouvez en comparant leur <a href="https://blake2.net/">BLAKE2b</a> :
Vérifiez les clefs que vous trouvez en comparant leur <a href="https://blake2.net/">BLAKE2b</a>&nbsp;:
</p>
<dl class="dl-horizontal" ng-repeat="key in my.exercices[current_exercice].keys">
<dt title="{{ key.slice(128) }}">{{ key.slice(128) }}</dt>
@ -88,8 +97,10 @@
</dl>
<div class="embed-responsive">
<iframe type="text/html" ng-if="my.exercices[current_exercice].video_uri" ng-src="{{ my.exercices[current_exercice].video_uri }}" class="embed-responsive-item">
Regardez la vidéo de résolution de cet exercice : <a ng-href="{{ my.exercices[current_exercice].video_uri }}">{{ my.exercices[current_exercice].video_uri }}</a>.
Regardez la vidéo de résolution de cet exercice&nbsp;: <a ng-href="{{ my.exercices[current_exercice].video_uri }}">{{ my.exercices[current_exercice].video_uri }}</a>.
</iframe>
</div>
</div>
</div>
</div>
</div>

View file

@ -1,54 +1,43 @@
<!DOCTYPE html>
<html ng-app="FICApp">
<html lang="fr">
<head>
<meta charset="utf-8">
<title>Challenge Forensic</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link href="/css/bootstrap.min.css" type="text/css" rel="stylesheet" media="screen">
<link href="/css/fic.css" type="text/css" rel="stylesheet" media="screen">
<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="/assets/js/html5shiv.js"></script>
<script src="/assets/js/respond.min.js"></script>
<![endif]-->
<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico">
<meta name="author" content="EPITA Laboratoire SRS">
<meta name="robots" content="all">
<link href="/css/bootstrap.min.css" type="text/css" rel="stylesheet" media="screen">
<link href="/css/fic.css" type="text/css" rel="stylesheet" media="screen">
</head>
<body class="beautiful">
<body class="bg-light beautiful">
<div class="navbar navbar-inverse">
<div class="navbar navbar-expand-lg navbar-dark bg-dark text-light">
<div class="container">
<div class="row">
<div class="navbar-header col-sm-2 text-left">
<div class="col-md-auto">
<a href="/">
<img src="/img/fic.png" alt="Forum International de la Cybersécurité">
</a>
</div>
<div class="navbar-right col-sm-2 text-right">
<div id="clock" class="col-md-auto text-center">Challenge Forensic</div>
<div class="col-md-auto">
<a href="http://www.epita.fr/">
<img src="/img/epita.png" alt="Epita">
</a>
</div>
<div id="clock" class="col-sm-8 text-center">
Challenge forensic
</div>
</div>
</div>
</div>
<div class="container" style="margin-top:20px;">
<div class="jumbotron text-justify" style="text-indent: 1.5em">
<div class="container text-justify" style="margin-top:20px; text-indent: 1.5em">
<div class="jumbotron">
<h1 style="text-indent: 0">Bienvenue !</h1>
<p style="text-indent: 0">
<p style="text-indent: 0" class="alert alert-primary">
<strong>
Vous n'êtes pas encore connecté en tant qu'équipe sur notre serveur.
</strong>
</p><hr>
<p>
<p class="lead">
Bienvenue dans cette première épreuve du challenge forensic&nbsp;!
Votre première activité consiste à accéder au site dédié à cet
événement ; ce guide est là pour vous y aider.
@ -59,10 +48,13 @@
contient des fichiers permettant votre authentification auprès de
nos serveurs. Ne la laissez pas sans surveillance !
</p>
<br>
<h2>Installation du certificat client</h2>
</div>
<div class="card" style="margin-bottom:20px;">
<div class="card-header bg-dark">
<h2 style="margin: 0">Installation du certificat client</h2>
</div>
<div class="card-body">
<p>
Le certificat <em>client</em> est envoyé à notre serveur pour vous
identifier et vous authentifier. Votre certificat et votre clef
@ -86,9 +78,25 @@
<li><a href="#cert-client-ie">Internet Explorer/Edge</a></li>
<li><a href="#cert-client-safari">Safari</a></li>
</ol>
<br>
<hr>
<h2 id="cert-client-mozilla-firefox">Mozilla Firefox</h2>
<p>
Si malgré tout, vous n'arrivez pas à accéder à l'espace de votre
équipe ou si votre clef USB est illisible, n'hésitez pas à nous
solliciter !
</p>
<p>
Bon courage&nbsp;!
</p>
</div>
</div>
<div class="card" style="margin-bottom:20px;">
<div class="card-header bg-dark">
<h2 id="cert-client-mozilla-firefox" style="margin: 0">Mozilla Firefox</h2>
</div>
<div class="card-body">
<ol>
<li>Ouvrez la fenêtre des préférences du navigateur.</li>
<li>Choisissez la catégorie <strong>Avancé</strong>.</li>
@ -97,17 +105,23 @@
<li>Sélectionnez l'onglet <strong>Vos certificats</strong>.</li>
<li>Cliquez sur <strong>Importer…</strong> et sélectionnez votre certificat client.</li>
</ol>
<br>
<h2 id="cert-client-chromium">Chromium/Google Chrome</h2>
<h3 id="cert-client-chromium-windows">Sous Microsoft Windows</h3>
</div>
</div>
<div class="card" style="margin-bottom:20px;">
<div class="card-header bg-dark">
<h2 id="cert-client-chromium" style="margin: 0">Chromium/Google Chrome</h2>
</div>
<div class="card-body">
<h3 class="card-title" id="cert-client-chromium-windows">Sous Microsoft Windows</h3>
<p>
Le navigateur utilise les paramètres du système ; suivez les
instructions concernant <a href="#cert-client-ie">Internet
Explorer</a>.
</p>
<h3 id="cert-client-chromium-macos">Sous Mac OS</h3>
<h3 class="card-title" id="cert-client-chromium-macos">Sous Mac OS</h3>
<ol>
<li>Ouvrez le menu des préférences du navigateur.</li>
<li>Cliquez sur <strong>Afficher les paramètres avancés</strong>.</li>
@ -116,7 +130,7 @@
<li>Choisissez un trousseau.</li>
</ol>
<h3 id="cert-client-chromium-gnu-linux">Sous GNU/Linux, FreeBSD ou OpenBSD</h3>
<h3 class="card-title" id="cert-client-chromium-gnu-linux">Sous GNU/Linux, FreeBSD ou OpenBSD</h3>
<ol>
<li>Ouvrez le menu des préférences du navigateur.</li>
<li>Cliquez sur <strong>Afficher les paramètres avancés</strong>.</li>
@ -124,9 +138,14 @@
<li>Sélectionnez l'onglet <strong>Vos certificats</strong>.</li>
<li>Cliquez sur <strong>Importer…</strong> et sélectionnez votre certificat client.</li>
</ol>
<br>
</div>
</div>
<h2 id="cert-client-ie">Internet Explorer</h2>
<div class="card" style="margin-bottom:20px;">
<div class="card-header bg-dark">
<h2 id="cert-client-ie" style="margin: 0">Internet Explorer</h2>
</div>
<div class="card-body">
<ol>
<li>Double-cliquez sur le fichier <samp>.p12</samp> présent sur votre clef USB. L'<em>assistant d'importation du certificat</em> apparaît.</li>
<li>Cliquez sur <strong>Suivant</strong>.</li>
@ -146,24 +165,19 @@
de <em>Microsoft Internet Explorer</em> (nom d'« Internet Explorer »
jusqu'à sa version 9 comprise) n'est supportée par notre serveur.
</p>
<br>
</div>
</div>
<h2 id="cert-client-safari">Safari</h2>
<div class="card" style="margin-bottom:20px;">
<div class="card-header bg-dark">
<h2 id="cert-client-safari" style="margin: 0">Safari</h2>
</div>
<div class="card-body">
<ol>
<li><strong>Double-cliquez</strong> sur le fichier <samp>.p12</samp> présent sur votre clef USB.</li>
<li>Entrez le mot de passe fourni sur papier puis cliquez sur <strong>Suivant</strong>.</li>
</ol>
<hr>
<p>
Si malgré tout, vous n'arrivez pas à accéder à l'espace de votre
équipe ou si votre clef USB est illisible, n'hésitez pas à nous
solliciter !
</p>
<p>
Bon courage&nbsp;!
</p>
</div>
</div>
</div>