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> <script src="/js/d3.v3.min.js"></script>
</head> </head>
<body> <body>
<nav class="navbar navbar-inverse navbar-static-top"> <nav class="navbar sticky-top navbar-expand-lg navbar-light bg-light" style="margin-bottom: 5px;">
<div class="container">
<div class="navbar-header">
<a class="navbar-brand" href="{{.urlbase}}"> <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> </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> </div>
<ul class="nav navbar-nav"> <span id="clock" class="navbar-text" ng-controller="CountdownController" ng-cloak>
<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 ng-show="startIn > 0"> <span ng-show="startIn > 0">
Démarrage dans : Démarrage dans :
<span>{{"{{ startIn }}"}}</span>" <span>{{"{{ startIn }}"}}</span>"
@ -39,13 +40,10 @@ const indextpl = `<!DOCTYPE html>
<span id="min">{{"{{ time.minutes | time }}"}}</span> <span id="min">{{"{{ time.minutes | time }}"}}</span>
<span class="point">:</span> <span class="point">:</span>
<span id="sec">{{"{{ time.seconds | time }}"}}</span> <span id="sec">{{"{{ time.seconds | time }}"}}</span>
</p> </span>
</div>
</nav> </nav>
<div class="container"> <div class="container" ng-controller="DIWEBoxController">
<div class="row" ng-controller="DIWEBoxController">
<div ng-repeat="box in boxes" class="alert alert-dismissible alert-{{"{{ box.kind }}"}}" ng-cloak> <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> <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 }}"}} <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> <button class="btn btn-sm btn-danger" ng-if="box.yes || box.no" ng-click="box.no()">No</button>
</div> </div>
</div> </div>
<div class="row">
<div class="col-sm-12" ng-view></div> <div class="container" ng-view></div>
</div>
</div>
<script src="/js/jquery.min.js"></script> <script src="/js/jquery.min.js"></script>
<script src="/js/popper.min.js"></script>
<script src="/js/bootstrap.min.js"></script> <script src="/js/bootstrap.min.js"></script>
<script src="/js/angular.min.js"></script> <script src="/js/angular.min.js"></script>
<script src="{{.urlbase}}js/angular-resource.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> <script src="/js/d3.v3.min.js"></script>
</head> </head>
<body> <body>
<nav class="navbar navbar-inverse navbar-static-top"> <nav class="navbar sticky-top navbar-expand-lg navbar-light bg-light" style="margin-bottom: 5px;">
<div class="container">
<div class="navbar-header">
<a class="navbar-brand" href="/"> <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> </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> </div>
<ul class="nav navbar-nav"> <span id="clock" class="navbar-text" ng-controller="CountdownController" ng-cloak>
<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 ng-show="startIn > 0"> <span ng-show="startIn > 0">
Démarrage dans : Démarrage dans :
<span>{{ startIn }}</span>" <span>{{ startIn }}</span>"
@ -37,13 +38,10 @@
<span id="min">{{ time.minutes | time }}</span> <span id="min">{{ time.minutes | time }}</span>
<span class="point">:</span> <span class="point">:</span>
<span id="sec">{{ time.seconds | time }}</span> <span id="sec">{{ time.seconds | time }}</span>
</p> </span>
</div>
</nav> </nav>
<div class="container"> <div class="container" ng-controller="DIWEBoxController">
<div class="row" ng-controller="DIWEBoxController">
<div ng-repeat="box in boxes" class="alert alert-dismissible alert-{{ box.kind }}" ng-cloak> <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> <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 }} <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> <button class="btn btn-sm btn-danger" ng-if="box.yes || box.no" ng-click="box.no()">No</button>
</div> </div>
</div> </div>
<div class="row">
<div class="col-sm-12" ng-view></div> <div class="container" ng-view></div>
</div>
</div>
<script src="/js/jquery.min.js"></script> <script src="/js/jquery.min.js"></script>
<script src="/js/popper.min.js"></script>
<script src="/js/bootstrap.min.js"></script> <script src="/js/bootstrap.min.js"></script>
<script src="/js/angular.min.js"></script> <script src="/js/angular.min.js"></script>
<script src="/js/angular-resource.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"> <div class="jumbotron text-light bg-primary">
<h3>Interface d'administration du challenge</h3> <h1 class="display-4">Interface d'administration du challenge</h1>
<p> <p class="lead">
Sélectionnez une action dans le menu ci-dessus. Sélectionnez une action dans le menu ci-dessus.
</p> </p>
<hr class="my-4">
<p ng-controller="VersionController"> <p ng-controller="VersionController">
Version de l'API : {{ v.version }} Version de l'API : {{ v.version }}
</p> </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"> <div class="form-group row">
<label for="challengeName" class="col-sm-2 control-label">Nom du challenge</label> <label for="challengeName" class="col-sm-2 col-form-label col-form-label-sm">Nom du challenge</label>
<div class="col-sm-10"> <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> </div>
<div class="form-group"> <div class="form-group row">
<label for="challengeAuthors" class="col-sm-2 control-label">Auteurs du challenge</label> <label for="challengeAuthors" class="col-sm-2 col-form-label col-form-label-sm">Auteurs du challenge</label>
<div class="col-sm-10"> <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> </div>
<div class="form-group"> <div class="form-group row">
<label for="startTime" class="col-sm-2 control-label">Début du challenge</label> <label for="startTime" class="col-sm-2 col-form-label col-form-label-sm">Début du challenge</label>
<div class="col-sm-8"> <div class="col-sm-10">
<input type="text" class="form-control" id="startTime" ng-model="config.start"> <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>
<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> </div>
<div class="form-group"> <div class="form-group row">
<label for="endTime" class="col-sm-2 control-label">Fin du challenge</label> <label for="endTime" class="col-sm-2 col-form-label col-form-label-sm">Fin du challenge</label>
<div class="col-sm-7"> <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>
<div class="col-sm-1 text-right"> <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>
<div class="col-sm-2"> <div class="col-sm-2">
<div class="input-group"> <div class="input-group input-group-sm">
<input type="text" class="form-control" id="duration" ng-model="duration" integer> <input type="text" class="form-control form-control-sm" id="duration" ng-model="duration" integer>
<div class="input-group-addon">min</div> <span class="input-group-addon">min</span>
</div> </div>
</div> </div>
</div> </div>
<hr> <hr>
<div class="form-group"> <div class="form-group row">
<label for="firstBlood" class="col-sm-2 control-label">Bonus premier sang</label> <label for="firstBlood" class="col-sm-2 col-form-label col-form-label-sm">Bonus premier sang</label>
<div class="col-sm-1"> <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> </div>
<div class="form-group"> <div class="form-group row">
<label for="submissionCostBase" class="col-sm-2 control-label">Coût de base d'une soumission</label> <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"> <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>
</div> </div>
<hr> <hr>
<div class="form-group"> <fieldset class="form-group">
<div class="col-sm-offset-2 col-sm-10"> <div class="row">
<div class="checkbox"> <legend class="col-form-legend col-sm-2">Options</legend>
<label>
<input type="checkbox" ng-model="config.allowRegistration"> Activer les inscriptions <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> </label>
</div> </div>
</div>
</div>
<div class="form-group"> <div class="form-check">
<div class="col-sm-offset-2 col-sm-10"> <label class="form-check-label">
<div class="checkbox"> <input class="form-check-input" type="checkbox" ng-model="config.denyNameChange"> Interdire les changements de nom d'équipe
<label>
<input type="checkbox" ng-model="config.denyNameChange"> Interdire les changements de nom d'équipe
</label> </label>
</div> </div>
</div>
</div>
<div class="form-group"> <div class="form-check">
<div class="col-sm-offset-2 col-sm-10"> <label class="form-check-label">
<div class="checkbox"> <input class="form-check-input" type="checkbox" ng-model="config.enableResolutionRoute"> Activer la route montrant les solutions
<label>
<input type="checkbox" ng-model="config.enableResolutionRoute"> Activer la route montrant les solutions
</label> </label>
</div> </div>
</div>
</div>
<div class="form-group"> <div class="form-check">
<div class="col-sm-offset-2 col-sm-10"> <label class="form-check-label">
<div class="checkbox"> <input class="form-check-input" type="checkbox" ng-model="config.partialValidation"> Activer la validation partielle des challenges
<label>
<input type="checkbox" ng-model="config.partialValidation"> Activer la validation partielle des challenges
</label> </label>
</div> </div>
</div>
</div>
<div class="form-group"> <div class="form-check">
<div class="col-sm-offset-2 col-sm-10"> <label class="form-check-label">
<div class="checkbox"> <input class="form-check-input" type="checkbox" ng-model="config.enableExerciceDepend"> Activer les dépendances des exercices
<label>
<input type="checkbox" ng-model="config.enableExerciceDepend"> Activer les dépendances des exercices
</label> </label>
</div> </div>
</div> </div>
</div> </div>
</fieldset>
<hr> <hr>
<div class="form-group"> <div class="form-group row">
<label class="col-sm-2 control-label">Synchronisation</label> <label class="col-sm-2 col-form-label col-form-label-sm">Synchronisation</label>
<div class="col-sm-10">{{ configro.sync }}</div> <div class="col-sm-10">{{ configro.sync }}</div>
</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> <button type="submit" class="btn btn-primary"><span class="glyphicon glyphicon-save" aria-hidden="true"></span> Propager ces paramètres</button>
</div> </div>
</form> </form>
</div>
<div class="well">
<div class="col-sm-4 center"> <div class="card-deck">
<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 class="card">
</div> <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 class="col-sm-4 center"> </div>
<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 class="card">
</div> <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 class="col-sm-4 center"> </div>
<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 class="card">
</div> <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 class="clearfix"></div> </div>
</div> </div>

File diff suppressed because one or more lines are too long

View file

@ -17,6 +17,10 @@
display:none !important; display:none !important;
} }
.popover.bs-popover-left .arrow::after {
border-left-color: #7A8288;
}
body { body {
overflow-y: scroll; overflow-y: scroll;
} }
@ -86,13 +90,12 @@ keyframes clockanim {
100% { opacity: 1.0; }; 100% { opacity: 1.0; };
} }
.well { samp.cksum {
text-align: justify; overflow-x: hidden;
}
.samp {
overflow-x: auto;
text-overflow: ellipsis; text-overflow: ellipsis;
max-width: 20vw;
display: inline-block;
vertical-align: middle;
} }
h1 small.authors { h1 small.authors {
@ -195,3 +198,10 @@ th.rotated div span {
text-align: left; text-align: left;
text-overflow: ellipsis; 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> <!DOCTYPE html>
<html> <html lang="fr">
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<title>Challenge Forensic</title> <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"> <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"> <link rel="shortcut icon" type="image/x-icon" href="/favicon.ico">
<meta name="author" content="EPITA Laboratoire SRS"> <meta name="author" content="EPITA Laboratoire SRS">
<meta name="robots" content="all"> <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> </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="container">
<div class="row"> <div class="col-md-auto">
<div class="navbar-header col-sm-3">
<a href="/"> <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> </a>
</div> </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/"> <a href="http://www.epita.fr/">
<img src="/img/epita.png" alt="Epita" class="center-block"> <img src="/img/epita.png" alt="Epita">
</a> </a>
</div> </div>
<div id="clock" class="col-sm-7">
Challenge forensic
</div>
</div>
</div> </div>
</div> </div>
<div class="container" style="margin-top:20px;"> <div class="container" style="margin-top:20px;">
<div class="jumbotron"> <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> <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. 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>
<p> <p>

View file

@ -1,52 +1,39 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html lang="fr">
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<title>Challenge Forensic</title> <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"> <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"> <link rel="shortcut icon" type="image/x-icon" href="/favicon.ico">
<meta name="author" content="EPITA Laboratoire SRS"> <meta name="author" content="EPITA Laboratoire SRS">
<meta name="robots" content="all"> <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> </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="container">
<div class="row"> <div class="col-md-auto">
<div class="navbar-header col-sm-3">
<a href="/"> <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> </a>
</div> </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/"> <a href="http://www.epita.fr/">
<img src="/img/epita.png" alt="Epita" class="center-block"> <img src="/img/epita.png" alt="Epita">
</a> </a>
</div> </div>
<div id="clock" class="col-sm-7">
Challenge forensic
</div>
</div>
</div> </div>
</div> </div>
<div class="container" style="margin-top:20px;"> <div class="container" style="margin-top:20px;">
<div class="jumbotron"> <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> <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. La quantité de données que vous souhaitez envoyer au serveur est trop importante pour qu'il accepte de la traiter.
</p> </p>
</div> </div>

View file

@ -1,52 +1,39 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html lang="fr">
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<title>Challenge Forensic</title> <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"> <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"> <link rel="shortcut icon" type="image/x-icon" href="/favicon.ico">
<meta name="author" content="EPITA Laboratoire SRS"> <meta name="author" content="EPITA Laboratoire SRS">
<meta name="robots" content="all"> <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> </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="container">
<div class="row"> <div class="col-md-auto">
<div class="navbar-header col-sm-3">
<a href="/"> <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> </a>
</div> </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/"> <a href="http://www.epita.fr/">
<img src="/img/epita.png" alt="Epita" class="center-block"> <img src="/img/epita.png" alt="Epita">
</a> </a>
</div> </div>
<div id="clock" class="col-sm-7">
Challenge forensic
</div>
</div>
</div> </div>
</div> </div>
<div class="container" style="margin-top:20px;"> <div class="container" style="margin-top:20px;">
<div class="jumbotron"> <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> <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. Notre serveur est actuellement dans l'incapacit&eacute; de repondre &agrave; votre requ&ecirc;te.<br>Veuillez recommencer dans quelques instants.
</p> </p>
<p> <p>

View file

@ -1,31 +1,23 @@
<!DOCTYPE html> <!DOCTYPE html>
<html ng-app="FICApp"> <html lang="fr" ng-app="FICApp">
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<title>Challenge Forensic</title> <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"> <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"> <link rel="shortcut icon" type="image/x-icon" href="/favicon.ico">
<meta name="author" content="EPITA Laboratoire SRS"> <meta name="author" content="EPITA Laboratoire SRS">
<meta name="robots" content="all"> <meta name="robots" content="all">
<base href="/"> <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> <script src="/js/angular.min.js"></script>
</head> </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="container">
<div class="row"> <div class="col-md-auto">
<div class="navbar-left col-md-3">
<a href="https://www.forum-fic.com/" ng-if="!(time.start || my.team_id)"> <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"> <img src="/img/fic.png" alt="Forum International de la Cybersécurité" class="center-block">
</a> </a>
@ -33,81 +25,75 @@
<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é" class="center-block">
</a> </a>
</div> </div>
<div id="clock" class="col-md-6 text-center" ng-hide="1">Chargement...</div> <div id="clock" class="col-md-auto 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-class="{expired: time.expired, end: time.end}" ng-if="time.start || my.team_id" ng-cloak>
<span id="hours">{{ time.hours | time }}</span> <span id="hours">{{ time.hours | time }}</span>
<span class="point">:</span> <span class="point">:</span>
<span id="min">{{ time.minutes | time }}</span> <span id="min">{{ time.minutes | time }}</span>
<span class="point">:</span> <span class="point">:</span>
<span id="sec">{{ time.seconds | time }}</span> <span id="sec">{{ time.seconds | time }}</span>
</div> </div>
<div id="clock" class="col-md-6" ng-if="!(time.start || my.team_id)" style="padding: 25px" ng-cloak> <div id="clock" class="col-md-auto btn-group btn-group-lg" ng-if="!(time.start || my.team_id)" ng-cloak>
<div class="btn-group btn-group-justified btn-group-lg"> <a class="btn btn-light" href="/">
<a class="btn btn-default" href="/">
<span class="glyphicon glyphicon-home"></span> Accueil <span class="glyphicon glyphicon-home"></span> Accueil
</a> </a>
<a class="btn btn-default" href="/rank"> <a class="btn btn-light" href="/rank">
<span class="glyphicon glyphicon-list"></span> Classement <span class="glyphicon glyphicon-list"></span> Classement
</a> </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 <span class="glyphicon glyphicon-blackboard"></span> Vidéos
</a> </a>
</div> </div>
</div> <div class="col-md-auto">
<div class="col-md-3 text-right"> <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/"> <a href="http://www.epita.fr/">
<img src="/img/epita.png" alt="Epita" class="center-block"> <img src="/img/epita.png" alt="Epita">
</a> </a>
</div> </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>
</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>
</div> </div>
<div class="col-sm-9"> <div ng-controller="DataController">
<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> <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)" 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> <h1 ng-if="(!current_theme && !title)">{{ settings.title }} <small class="authors">{{ settings.authors }}</small></h1>
</div> </div>
</div>
</div> <div style="clear: both"></div>
<div class="row"> <div ng-view>
<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>
<noscript> <noscript>
<div class="alert alert-danger"> <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. <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> </div>
</div>
<script src="/js/jquery.min.js"></script> <script src="/js/jquery.min.js"></script>
<script src="/js/popper.min.js"></script>
<script src="/js/bootstrap.min.js"></script> <script src="/js/bootstrap.min.js"></script>
<script src="/js/angular-route.min.js"></script> <script src="/js/angular-route.min.js"></script>
<script src="/js/angular-sanitize.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> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<title>Challenge Forensic</title> <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"> <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"> <link rel="shortcut icon" type="image/x-icon" href="/favicon.ico">
<meta name="author" content="EPITA Laboratoire SRS"> <meta name="author" content="EPITA Laboratoire SRS">
<meta name="robots" content="all"> <meta name="robots" content="all">
<base href="/"> <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> <script src="/js/angular.min.js"></script>
</head> </head>
<body style="overflow: hidden;" class="container-fluid" ng-controller="DataController"> <body class="bg-light" style="overflow: hidden;" class="container-fluid" ng-controller="DataController">
<div class="row" style="margin-top: 10px"> <div class="row" style="margin:10px 0">
<div class="col-xs-8"> <div class="col-8">
<noscript> <noscript>
<div class="alert alert-danger"> <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. <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 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> <h1>Bienvenue au challenge forensic&nbsp;!</h1>
<p class="lead text-justify"> <p class="lead text-justify">
Avant de vous installer, venez récupérer votre clef USB auprès Avant de vous installer, venez récupérer votre clef USB auprès
@ -45,49 +39,55 @@
</span> </span>
</p> </p>
</div> </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>
<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> <h1>Bienvenue au challenge forensic&nbsp;!</h1>
<p class="lead text-justify"> <p class="lead text-justify">
Durant ce challenge, les équipes doivent remonter des scénarii Durant ce challenge, les équipes doivent <strong>remonter des scénarii
d'attaques auxquels nos systèmes d'information font faces d'attaques</strong> auxquels nos systèmes d'information <strong>font faces
chaque jour : fuite de données, compromission d'un poste de chaque jour</strong> : fuite de données, compromission d'un poste de
travail, exploitation de vulnérabilités d'un site web, ... travail, exploitation de vulnérabilités d'un site web, ...
</p> </p>
<p class="lead text-justify"> <p class="lead text-justify">
Pour valider un challenge, chaque participant va télécharger : Pour valider un challenge, chaque participant va télécharger :
soit des journaux d'évènements, des extraits de trafic réseau soit des <strong>journaux d'évènements</strong>, des extraits de trafic réseau
ou même des copies figées de la mémoire vive de machines ou même des <strong>copies</strong> figées <strong>de la mémoire vive</strong> de machines
malveillantes, pour essayer de comprendre comment l'attaquant a malveillantes, pour <strong>essayer de comprendre</strong> comment l'attaquant a
contourné la sécurité de la machine et quelles actions hostiles <strong>contourné la sécurité</strong> de la machine et quelles actions hostiles
ont été effectuées. ont été effectuées.
</p> </p>
</div> </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> <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-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-bind-html="s.params.html" ng-if="s.params.html"></p>
<p ng-if="s.params.text">{{ s.params.text }}</p> <p ng-if="s.params.text">{{ s.params.text }}</p>
</div> </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>
<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"> <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> <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> <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> <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> </ul>
</div> </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"> <table class="table table-bordered table-striped table-condensed">
<thead> <thead>
<tr> <tr>
@ -147,7 +148,7 @@
</table> </table>
</div> </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"> <table class="table table-bordered table-striped table-condensed">
<thead> <thead>
<tr> <tr>
@ -169,7 +170,7 @@
</div> </div>
</div> </div>
<div class="col-xs-4"> <div class="col-4">
<div ng-controller="EventsController"> <div ng-controller="EventsController">
<div ng-repeat="e in events | limitTo: 7" class="repeated-item"> <div ng-repeat="e in events | limitTo: 7" class="repeated-item">
@ -179,7 +180,7 @@
</div> </div>
</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 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> <div id="clock" ng-class="{expired: time.expired, end: time.end}" style="font-size: 50px" ng-cloak>
<span id="hours">{{ time.hours | time }}</span> <span id="hours">{{ time.hours | time }}</span>
@ -199,30 +200,29 @@
</div> </div>
</div> </div>
<div style="position: fixed; bottom: 0; right: 0; width: 33vw; height: 14vh" class="navbar navbar-inverse"> <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"> <div class="carousel slide" id="carousel-logos" data-ride="carousel" data-interval="10500">
<div class="carousel-inner"> <div class="carousel-inner">
<div class="item active"> <div class="carousel-item active">
<div class="carousel-caption"> <div class="carousel-caption">
<a href="http://www.epita.fr/"><img src="/img/epita.png" alt="Epita" style="width:30%"></a> <a href="http://www.epita.fr/"><img src="/img/epita.png" alt="Epita" style="max-height:14vh"></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="height:14vh">
<img src="/img/rcc.png" alt="Réserve Citoyenne Cyberdéfense" style="width:30%">
</div> </div>
</div> </div>
<div class="item"> <div class="carousel-item">
<div class="carousel-caption" style="padding: 0 10px"> <div class="carousel-caption">
<h2>Bienvenue au challenge forensic&nbsp;!</h2> <h2>Bienvenue au challenge forensic&nbsp;!</h2>
</div> </div>
</div> </div>
<div class="item"> <div class="carousel-item">
<div class="carousel-caption"> <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 Ce challenge met en scène des scénarii d'attaques auxquels
nos systèmes d'information font faces chaque jour. nos systèmes d'information font faces chaque jour.
</p> </p>
</div> </div>
</div> </div>
<div class="item"> <div class="carousel-item">
<div class="carousel-caption"> <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: 20px 16px; font-size: 111%">
Les 42 équipes doivent, en 4 heures, retracer les attaques à la Les 42 équipes doivent, en 4 heures, retracer les attaques à la
@ -230,28 +230,28 @@
</p> </p>
</div> </div>
</div> </div>
<div class="item"> <div class="carousel-item">
<div class="carousel-caption row" style="padding: 12px"> <div class="carousel-caption row" style="padding: 10px">
<div class="col-xs-4"> <div class="col-4">
<a href="https://www.epita.fr/"><img src="/img/epita.png" alt="Épita" style="height: 10vh"></a> <a href="https://srs.epita.fr/"><img src="/img/srs.png" alt="Laboratoire SRS" style="height:12vh"></a>
</div> </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 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> </p>
</div> </div>
</div> </div>
<div class="item"> <div class="carousel-item">
<div class="carousel-caption row" style="padding: 12px"> <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"> <img src="/img/rcc.png" alt="Réserve Citoyenne Cyberdéfense" style="max-width:100%; max-height: 11vh">
</div> </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 Avec le parrainage du réseau de la Réserve Citoyenne Cyberdéfense
</p> </p>
</div> </div>
</div> </div>
<div class="item"> <div class="carousel-item">
<div class="carousel-caption" style="padding: 3px 25px; width: 32vw;"> <div class="carousel-caption" style="padding: 3px 25px; width: 32vw;">
<table class="table table-bordered table-condensed table-striped"> <table class="table table-bordered table-condensed table-striped">
<tbody> <tbody>
@ -275,10 +275,10 @@
</table> </table>
</div> </div>
</div> </div>
<div class="item"> <div class="carousel-item">
<div class="carousel-caption row" style="padding: 12px"> <div class="carousel-caption row" style="padding: 12px">
<p class="text-bold" style="padding: 5px; font-size: 105%"> <p class="text-bold" style="padding: 5px;">
Retrouvez la correction des challenges dès demain sur : Retrouvez les solutions des challenges dès demain sur :
<span style="display: block; font-size: 150%" class="text-center"> <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> <a style="font-family: mono" href="https://fic.srs.epita.fr/"><span class="text-info">https://fic.srs.epita.fr/</span></a>
</span> </span>
@ -295,6 +295,7 @@
</div> </div>
<script src="/js/jquery.min.js"></script> <script src="/js/jquery.min.js"></script>
<script src="/js/popper.min.js"></script>
<script src="/js/bootstrap.min.js"></script> <script src="/js/bootstrap.min.js"></script>
<script src="/js/angular-animate.min.js"></script> <script src="/js/angular-animate.min.js"></script>
<script src="/js/angular-route.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/i18n/angular-locale_fr-fr.js"></script>
<script src="/js/public.js"></script> <script src="/js/public.js"></script>
<script src="/js/common.js"></script> <script src="/js/common.js"></script>
<script>
$(".carousel").carousel({
interval: 21000
});
</script>
</body> </body>
</html> </html>

View file

@ -1,5 +1,8 @@
<div class="well well-lg" style="text-indent: 1em"> <div class="row">
<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="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)"> <p ng-if="(my.team_id)">
Félicitations ! vous êtes maintenant connecté à l'espace de votre Félicitations ! vous êtes maintenant connecté à l'espace de votre
équipe <em>{{ teams[my.team_id].name }}</em>. Vous pouvez changer ce nom é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 <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 but de découvrir si des actes malveillants ont été commis sur différents
systèmes d'information, les contenus qui sont 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>
<div class="panel panel-default" ng-if="(my.team_id)"> </div>
<div class="panel-heading">
<h3 class="panel-title">Progression</h3> <div class="col-md-3" ng-if="(my.team_id)">
<div class="card text-white bg-primary">
<div class="card-header">
Progression
</div> </div>
<div class="panel-body"> <div class="card-body">
<strong>Vous</strong> <strong>Vous</strong>
<div class="progress progress-striped"> <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 }}%;"> aria-valuemin="0" aria-valuemax="100" style="width: {{ my.score * 100 / max_gain }}%;">
<span class="sr-only">{{ my.score * 100 / max_gain }}% Complete</span> <span class="sr-only">{{ my.score * 100 / max_gain }}% Complete</span>
</div> </div>
@ -45,7 +51,7 @@
<strong>Le temps</strong> <strong>Le temps</strong>
<div class="progress"> <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 }}%;"> aria-valuemin="0" aria-valuemax="100" style="width: {{ 100 - time.remaining / time.duration * 100 }}%;">
<span class="sr-only">{{ time.remaining }} secondes restantes</span> <span class="sr-only">{{ time.remaining }} secondes restantes</span>
</div> </div>
@ -54,7 +60,7 @@
<div ng-if="rank.length && rank[0].id != my.team_id"> <div ng-if="rank.length && rank[0].id != my.team_id">
<strong>La meilleure équipe ({{ rank[0].name }})</strong> <strong>La meilleure équipe ({{ rank[0].name }})</strong>
<div class="progress"> <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 }}%;"> 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> <span class="sr-only">{{ rank[0].score * 100 / max_gain }}% Complete</span>
</div> </div>
@ -64,7 +70,7 @@
<div ng-if="rank[0].id == my.team_id && rank.length > 1"> <div ng-if="rank[0].id == my.team_id && rank.length > 1">
<strong>La seconde équipe ({{ rank[1].name }})</strong> <strong>La seconde équipe ({{ rank[1].name }})</strong>
<div class="progress"> <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 }}%;"> 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> <span class="sr-only">{{ rank[1].score * 100 / max_gain }}% Complete</span>
</div> </div>

View file

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

View file

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

View file

@ -1,38 +1,45 @@
<ul class="nav nav-tabs nav-justified"> <nav role="navigation">
<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> <ol class="breadcrumb">
</ul> <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])"> <div class="alert alert-warning" style="margin-top:15px;" ng-if="!(my.exercices[current_exercice])">
Vous n'avez pas encore accès à cet exercice. Vous n'avez pas encore accès à cet exercice.
</div> </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> <p ng-bind-html="my.exercices[current_exercice].statement"></p>
<ul> <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>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 :</strong> <ng-pluralize count="themes[current_theme].exercices[current_exercice].solved" when="{'0': 'aucune équipe', 'one': '{} équipe', 'other': '{} équipes'}"></ng-pluralize>.</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> </ul>
</div> </div>
<div class="panel panel-default" ng-if="(my.exercices[current_exercice] && my.exercices[current_exercice].files.length)"> <div class="row">
<div class="panel-heading">
<div class="panel-title"><span class="glyphicon glyphicon-download-alt" aria-hidden="true"></span> Téléchargements</div> <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>
<div class="list-group"> <div class="list-group">
<a ng-href="{{ file.path }}" target="_self" class="list-group-item" ng-repeat="file in my.exercices[current_exercice].files"> <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> <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> <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> </a>
</div> </div>
</div> </div>
</div>
<div class="panel panel-info" ng-if="(my.exercices[current_exercice] && my.exercices[current_exercice].hints.length)"> <div class="col-xl" ng-if="(my.exercices[current_exercice] && my.exercices[current_exercice].hints.length)">
<div class="panel-heading"> <div class="card border-info">
<div class="panel-title"><span class="glyphicon glyphicon-lamp" aria-hidden="true"></span> Indices</div> <div class="card-header bg-info text-white">
<span class="glyphicon glyphicon-lamp" aria-hidden="true"></span> Indices
</div> </div>
<div class="list-group"> <div class="list-group">
<a target="_self" class="list-group-item" ng-repeat="hint in my.exercices[current_exercice].hints" ng-href="{{ hint.file }}"> <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> <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> <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> <h4 class="list-group-item-heading">{{ hint.title }}</h4>
@ -42,19 +49,21 @@
</a> </a>
</div> </div>
</div> </div>
</div>
<div class="panel panel-danger" ng-if="my.team_id && my.exercices[current_exercice] && !(my.exercices[current_exercice].solved)"> <div class="col-xl" style="margin-bottom: 25px">
<div class="panel-heading"> <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="panel-title"><span class="glyphicon glyphicon-flag" aria-hidden="true"></span> Soumettre une solution</div> <div class="card-header bg-danger text-white">
<span class="glyphicon glyphicon-flag" aria-hidden="true"></span> Soumettre une solution
</div> </div>
<ul class="list-group" ng-if="(my.exercices[current_exercice].tries || my.exercices[current_exercice].submitted || sberr)"> <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 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> <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> </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()"> <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}"> <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"> <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> <span class="glyphicon glyphicon-ok form-control-feedback" aria-hidden="true" ng-if="key.found"></span>
</div> </div>
@ -65,22 +74,22 @@
</div> </div>
</div> </div>
<div class="panel panel-success" ng-if="(my.team_id && my.exercices[current_exercice].solved)"> <div class="card border-success" ng-if="(my.team_id && my.exercices[current_exercice].solved)">
<div class="panel-heading"> <div class="card-header bg-success text-white">
<div class="panel-title"><span class="glyphicon glyphicon-flag" aria-hidden="true"></span> Challenge réussi !</div> <span class="glyphicon glyphicon-flag" aria-hidden="true"></span> Challenge réussi !
</div> </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> ! 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> </div>
<div class="panel panel-success" ng-if="(!my.team_id && my.exercices[current_exercice].keys)"> <div class="card border-success" ng-if="(!my.team_id && my.exercices[current_exercice].keys)">
<div class="panel-heading"> <div class="card-heading bg-success text-white">
<div class="panel-title"><span class="glyphicon glyphicon-flag" aria-hidden="true"></span> Solution du challenge</div> <span class="glyphicon glyphicon-flag" aria-hidden="true"></span> Solution du challenge
</div> </div>
<div class="panel-body"> <div class="card-body">
<p> <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> </p>
<dl class="dl-horizontal" ng-repeat="key in my.exercices[current_exercice].keys"> <dl class="dl-horizontal" ng-repeat="key in my.exercices[current_exercice].keys">
<dt title="{{ key.slice(128) }}">{{ key.slice(128) }}</dt> <dt title="{{ key.slice(128) }}">{{ key.slice(128) }}</dt>
@ -88,8 +97,10 @@
</dl> </dl>
<div class="embed-responsive"> <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"> <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> </iframe>
</div> </div>
</div> </div>
</div> </div>
</div>
</div>

View file

@ -1,54 +1,43 @@
<!DOCTYPE html> <!DOCTYPE html>
<html ng-app="FICApp"> <html lang="fr">
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<title>Challenge Forensic</title> <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"> <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"> <link rel="shortcut icon" type="image/x-icon" href="/favicon.ico">
<meta name="author" content="EPITA Laboratoire SRS"> <meta name="author" content="EPITA Laboratoire SRS">
<meta name="robots" content="all"> <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> </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="container">
<div class="row"> <div class="col-md-auto">
<div class="navbar-header col-sm-2 text-left">
<a href="/"> <a href="/">
<img src="/img/fic.png" alt="Forum International de la Cybersécurité"> <img src="/img/fic.png" alt="Forum International de la Cybersécurité">
</a> </a>
</div> </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/"> <a href="http://www.epita.fr/">
<img src="/img/epita.png" alt="Epita"> <img src="/img/epita.png" alt="Epita">
</a> </a>
</div> </div>
<div id="clock" class="col-sm-8 text-center">
Challenge forensic
</div>
</div>
</div> </div>
</div> </div>
<div class="container" style="margin-top:20px;"> <div class="container text-justify" style="margin-top:20px; text-indent: 1.5em">
<div class="jumbotron text-justify" style="text-indent: 1.5em"> <div class="jumbotron">
<h1 style="text-indent: 0">Bienvenue !</h1> <h1 style="text-indent: 0">Bienvenue !</h1>
<p style="text-indent: 0"> <p style="text-indent: 0" class="alert alert-primary">
<strong> <strong>
Vous n'êtes pas encore connecté en tant qu'équipe sur notre serveur. Vous n'êtes pas encore connecté en tant qu'équipe sur notre serveur.
</strong> </strong>
</p><hr> </p><hr>
<p> <p class="lead">
Bienvenue dans cette première épreuve du challenge forensic&nbsp;! Bienvenue dans cette première épreuve du challenge forensic&nbsp;!
Votre première activité consiste à accéder au site dédié à cet Votre première activité consiste à accéder au site dédié à cet
événement ; ce guide est là pour vous y aider. événement ; ce guide est là pour vous y aider.
@ -59,10 +48,13 @@
contient des fichiers permettant votre authentification auprès de contient des fichiers permettant votre authentification auprès de
nos serveurs. Ne la laissez pas sans surveillance ! nos serveurs. Ne la laissez pas sans surveillance !
</p> </p>
<br> </div>
<h2>Installation du certificat client</h2>
<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> <p>
Le certificat <em>client</em> est envoyé à notre serveur pour vous Le certificat <em>client</em> est envoyé à notre serveur pour vous
identifier et vous authentifier. Votre certificat et votre clef 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-ie">Internet Explorer/Edge</a></li>
<li><a href="#cert-client-safari">Safari</a></li> <li><a href="#cert-client-safari">Safari</a></li>
</ol> </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> <ol>
<li>Ouvrez la fenêtre des préférences du navigateur.</li> <li>Ouvrez la fenêtre des préférences du navigateur.</li>
<li>Choisissez la catégorie <strong>Avancé</strong>.</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>Sélectionnez l'onglet <strong>Vos certificats</strong>.</li>
<li>Cliquez sur <strong>Importer…</strong> et sélectionnez votre certificat client.</li> <li>Cliquez sur <strong>Importer…</strong> et sélectionnez votre certificat client.</li>
</ol> </ol>
<br>
<h2 id="cert-client-chromium">Chromium/Google Chrome</h2> </div>
<h3 id="cert-client-chromium-windows">Sous Microsoft Windows</h3> </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> <p>
Le navigateur utilise les paramètres du système ; suivez les Le navigateur utilise les paramètres du système ; suivez les
instructions concernant <a href="#cert-client-ie">Internet instructions concernant <a href="#cert-client-ie">Internet
Explorer</a>. Explorer</a>.
</p> </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> <ol>
<li>Ouvrez le menu des préférences du navigateur.</li> <li>Ouvrez le menu des préférences du navigateur.</li>
<li>Cliquez sur <strong>Afficher les paramètres avancés</strong>.</li> <li>Cliquez sur <strong>Afficher les paramètres avancés</strong>.</li>
@ -116,7 +130,7 @@
<li>Choisissez un trousseau.</li> <li>Choisissez un trousseau.</li>
</ol> </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> <ol>
<li>Ouvrez le menu des préférences du navigateur.</li> <li>Ouvrez le menu des préférences du navigateur.</li>
<li>Cliquez sur <strong>Afficher les paramètres avancés</strong>.</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>Sélectionnez l'onglet <strong>Vos certificats</strong>.</li>
<li>Cliquez sur <strong>Importer…</strong> et sélectionnez votre certificat client.</li> <li>Cliquez sur <strong>Importer…</strong> et sélectionnez votre certificat client.</li>
</ol> </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> <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>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> <li>Cliquez sur <strong>Suivant</strong>.</li>
@ -146,24 +165,19 @@
de <em>Microsoft Internet Explorer</em> (nom d'« Internet Explorer » de <em>Microsoft Internet Explorer</em> (nom d'« Internet Explorer »
jusqu'à sa version 9 comprise) n'est supportée par notre serveur. jusqu'à sa version 9 comprise) n'est supportée par notre serveur.
</p> </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> <ol>
<li><strong>Double-cliquez</strong> sur le fichier <samp>.p12</samp> présent sur votre clef USB.</li> <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> <li>Entrez le mot de passe fourni sur papier puis cliquez sur <strong>Suivant</strong>.</li>
</ol> </ol>
<hr> </div>
<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> </div>