Compare commits

..

No commits in common. "404f29e6ea0e1b944a8c79c2a1472ddc565360f2" and "1ec71728de29660e69e12d2d8bdedec6cc57cace" have entirely different histories.

25 changed files with 63 additions and 104 deletions

View file

@ -1,4 +1,4 @@
FROM golang:1-alpine AS gobuild FROM golang:1-alpine as gobuild
RUN apk add --no-cache git RUN apk add --no-cache git

View file

@ -1,4 +1,4 @@
FROM golang:1-alpine AS gobuild FROM golang:1-alpine as gobuild
RUN apk add --no-cache git RUN apk add --no-cache git

View file

@ -1,4 +1,4 @@
FROM golang:1-alpine AS gobuild FROM golang:1-alpine as gobuild
RUN apk add --no-cache git RUN apk add --no-cache git

View file

@ -1,4 +1,4 @@
FROM golang:1-alpine AS gobuild FROM golang:1-alpine as gobuild
RUN apk add --no-cache git RUN apk add --no-cache git

View file

@ -1,4 +1,4 @@
FROM node:23-alpine AS nodebuild FROM node:23-alpine as nodebuild
WORKDIR /ui WORKDIR /ui

View file

@ -1,4 +1,4 @@
FROM golang:1-alpine AS gobuild FROM golang:1-alpine as gobuild
RUN apk add --no-cache git RUN apk add --no-cache git

View file

@ -1,4 +1,4 @@
FROM golang:1-alpine AS gobuild FROM golang:1-alpine as gobuild
RUN apk add --no-cache git RUN apk add --no-cache git

View file

@ -1,4 +1,4 @@
FROM node:23-alpine AS nodebuild FROM node:23-alpine as nodebuild
WORKDIR /ui WORKDIR /ui
@ -10,16 +10,9 @@ RUN npm install --network-timeout=100000 && \
FROM nginx:stable-alpine-slim FROM nginx:stable-alpine-slim
ENV FIC_BASEURL / ENV FIC_BASEURL=/ \
ENV HOST_RECEIVER receiver:8080 HOST_RECEIVER=receiver:8080 HOST_ADMIN=admin:8081 HOST_DASHBOARD=dashboard:8082 HOST_QA=qa:8083 \
ENV HOST_ADMIN admin:8081 PATH_FILES=/srv/FILES PATH_STARTINGBLOCK=/srv/STARTINGBLOCK PATH_STATIC=/srv/htdocs-frontend PATH_SETTINGS=/srv/SETTINGSDIST PATH_TEAMS=/srv/TEAMS
ENV HOST_DASHBOARD dashboard:8082
ENV HOST_QA qa:8083
ENV PATH_FILES /srv/FILES
ENV PATH_STARTINGBLOCK /srv/STARTINGBLOCK
ENV PATH_STATIC /srv/htdocs-frontend
ENV PATH_SETTINGS /srv/SETTINGSDIST
ENV PATH_TEAMS /srv/TEAMS
EXPOSE 80 EXPOSE 80

View file

@ -1,4 +1,4 @@
FROM node:23-alpine AS nodebuild FROM node:23-alpine as nodebuild
WORKDIR /ui WORKDIR /ui
@ -8,7 +8,7 @@ RUN npm install --network-timeout=100000 && \
npm run build npm run build
FROM golang:1-alpine AS gobuild FROM golang:1-alpine as gobuild
RUN apk add --no-cache git RUN apk add --no-cache git

View file

@ -1,4 +1,4 @@
FROM golang:1-alpine AS gobuild FROM golang:1-alpine as gobuild
RUN apk add --no-cache git RUN apk add --no-cache git

View file

@ -1,4 +1,4 @@
FROM golang:1-alpine AS gobuild FROM golang:1-alpine as gobuild
RUN apk add --no-cache git RUN apk add --no-cache git

View file

@ -1,4 +1,4 @@
FROM golang:1-alpine AS gobuild FROM golang:1-alpine as gobuild
RUN apk add --no-cache git RUN apk add --no-cache git

View file

@ -1,4 +1,4 @@
FROM golang:1-alpine AS gobuild FROM golang:1-alpine as gobuild
RUN apk add --no-cache git RUN apk add --no-cache git

View file

@ -44,7 +44,7 @@
style:filter={theme.locked ? "grayscale(60%)":null} style:filter={theme.locked ? "grayscale(60%)":null}
></div> ></div>
{/if} {/if}
<CardBody> <CardBody class="text-indent">
{#if exercice} {#if exercice}
{#if $exercices_idx[exercice.id].tags.includes("Reverse") || $exercices_idx[exercice.id].tags.includes("Reverse Engineering")} {#if $exercices_idx[exercice.id].tags.includes("Reverse") || $exercices_idx[exercice.id].tags.includes("Reverse Engineering")}
<Badge class="float-end">#Reverse</Badge> <Badge class="float-end">#Reverse</Badge>

View file

@ -29,8 +29,8 @@
bind:value={filter} bind:value={filter}
> >
<div> <div>
{#each Object.keys($tags).sort(function (a, b) { return a.normalize("NFD").replace(/[\u0300-\u036f]/g, "").toLowerCase().localeCompare(b.normalize("NFD").replace(/[\u0300-\u036f]/g, "").toLowerCase()); }) as itag, index} {#each Object.keys($tags).sort(function (a, b) { return a.toLowerCase().localeCompare(b.toLowerCase()); }) as itag, index}
{#if (filter === "" && $tags[itag].count > 1) || (filter !== "" && itag.normalize("NFD").replace(/[\u0300-\u036f]/g, "").toLowerCase().indexOf(filter.normalize("NFD").replace(/[\u0300-\u036f]/g, "").toLowerCase()) >= 0)} {#if (filter === "" && $tags[itag].count > 1) || (filter !== "" && itag.toLowerCase().indexOf(filter.toLowerCase()) >= 0)}
<DropdownItem href="tags/{itag}"> <DropdownItem href="tags/{itag}">
#{itag} #{itag}
<Badge> <Badge>

View file

@ -30,12 +30,6 @@
partJ = true; partJ = true;
} }
function JchangeTeam() {
value = { };
partJ = false;
}
function submit(event) { function submit(event) {
if (!partJ) { if (!partJ) {
JvalidateTeam(); JvalidateTeam();
@ -68,11 +62,7 @@
</option> </option>
{/each} {/each}
</select> </select>
{#if partJ} <Button color="info" type="button" on:click={JvalidateTeam} disabled={partJ}>Valider</Button>
<Button color="info" type="button" on:click={JchangeTeam}>Changer</Button>
{:else}
<Button color="info" type="button" on:click={JvalidateTeam} disabled={partJ}>Valider</Button>
{/if}
<div class="invalid-feedback"> <div class="invalid-feedback">
Veuillez indiquer une équipe valide. Veuillez indiquer une équipe valide.
</div> </div>

View file

@ -37,9 +37,6 @@ function createMyStore() {
}); });
} else if (res_my.status === 404) { } else if (res_my.status === 404) {
update((m) => (null)); update((m) => (null));
if (cb) {
cb(null);
}
} }
} }

View file

@ -59,7 +59,6 @@ export const tags = derived([my, themesStore], ([$my, $themesStore]) => {
for (const key in $themesStore) { for (const key in $themesStore) {
for (const exercice of $themesStore[key].exercices) { for (const exercice of $themesStore[key].exercices) {
exercice.tags.forEach((tag) => { exercice.tags.forEach((tag) => {
tag = tag.normalize("NFD").replace(/[\u0300-\u036f]/g, "").toLowerCase();
if (!tags[tag]) if (!tags[tag])
tags[tag] = {count: 1, solved: 0}; tags[tag] = {count: 1, solved: 0};
else else

View file

@ -3,9 +3,7 @@
import "bootstrap-icons/font/bootstrap-icons.css"; import "bootstrap-icons/font/bootstrap-icons.css";
import { base } from '$app/paths'; import { base } from '$app/paths';
import { page } from '$app/stores';
import { import {
Alert,
Container, Container,
//Styles, //Styles,
} from '@sveltestrap/sveltestrap'; } from '@sveltestrap/sveltestrap';
@ -13,7 +11,6 @@
import Header from '$lib/components/Header.svelte'; import Header from '$lib/components/Header.svelte';
import { challengeInfo } from '$lib/stores/challengeinfo'; import { challengeInfo } from '$lib/stores/challengeinfo';
import { my } from '$lib/stores/my.js';
import { settings } from '$lib/stores/settings'; import { settings } from '$lib/stores/settings';
</script> </script>
@ -35,21 +32,6 @@
</div> </div>
{/if} {/if}
<Header /> <Header />
{#if !$my && $page.route.id != "/register"}
<Container class="mt-3 mb-3">
{#if $settings.allowRegistration}
<Alert color="warning" class="text-justify" fade={false}>
<strong>Votre équipe n'est pas encore enregistrée.</strong> Rendez-vous sur <a href="register">cette page</a> pour procéder à votre inscription.
</Alert>
{:else}
<Alert color="danger" class="text-justify" fade={false}>
<strong>Il semblerait qu'il y ait eu un problème lors de l'attribution de votre certificat.</strong> Veuillez vous signaler auprès de notre équipe afin de corriger ce problème.
</Alert>
{/if}
</Container>
{/if}
<slot></slot> <slot></slot>
<style> <style>

View file

@ -77,12 +77,21 @@
</script> </script>
<Container class="mt-3 mb-5"> <Container class="mt-3 mb-5">
{#if $my} {#if !$my}
{#if !($my.team_id)} {#if $settings.allowRegistration}
<Alert color="warning" class="text-justify" fade={false}>
<strong>Votre équipe n'est pas encore enregistrée.</strong> Rendez-vous sur <a href="register">cette page</a> pour procéder à votre inscription.
</Alert>
{:else}
<Alert color="danger" class="text-justify" fade={false}>
<strong>Il semblerait qu'il y ait eu un problème lors de l'attribution de votre certificat.</strong> Veuillez vous signaler auprès de notre équipe afin de corriger ce problème.
</Alert>
{/if}
{:else if !($my.team_id)}
<Alert color="danger" fade={false}> <Alert color="danger" fade={false}>
<strong>Attention&nbsp;:</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&nbsp;! <strong>Attention&nbsp;:</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&nbsp;!
</Alert> </Alert>
{:else if $teams[$my.team_id]} {:else if $teams[$my.team_id]}
<Alert color="info" class="text-justify" fade={false}> <Alert color="info" class="text-justify" fade={false}>
<strong>Félicitations {#if $my.members}{#each $my.members as member, index (member.id)}{#if member.id !== $my.members[0].id}{#if member.id === $my.members[$my.members.length - 1].id}&nbsp;et {:else}, {/if}{/if}{member.firstname} {member.lastname}{/each}&nbsp;{/if}!</strong> vous êtes maintenant connecté à l'espace de votre équipe <em>{$teams[$my.team_id].name}</em>. <strong>Félicitations {#if $my.members}{#each $my.members as member, index (member.id)}{#if member.id !== $my.members[0].id}{#if member.id === $my.members[$my.members.length - 1].id}&nbsp;et {:else}, {/if}{/if}{member.firstname} {member.lastname}{/each}&nbsp;{/if}!</strong> vous êtes maintenant connecté à l'espace de votre équipe <em>{$teams[$my.team_id].name}</em>.
{#if !$settings.denyNameChange}Vous pouvez changer ce nom dès maintenant en vous rendant sur la page de <a href="edit">votre équipe</a>.{/if} {#if !$settings.denyNameChange}Vous pouvez changer ce nom dès maintenant en vous rendant sur la page de <a href="edit">votre équipe</a>.{/if}
@ -93,9 +102,9 @@
<strong>Les membres de votre équipe ne sont pas encore enregistrés.</strong> Passez voir l'équipe serveur pour corriger cela. <strong>Les membres de votre équipe ne sont pas encore enregistrés.</strong> Passez voir l'équipe serveur pour corriger cela.
</Alert> </Alert>
{/if} {/if}
{/if}
{/if} {/if}
<Masonry <Masonry
{items} {items}
let:item let:item

View file

@ -84,27 +84,24 @@
</Col> </Col>
<Col lg={6} xl={5}> <Col lg={6} xl={5}>
{#if $current_theme.exercices && $current_theme.exercices.length} {#if $current_theme.exercices && $current_theme.exercices.length}
<ul class="list-group h-100 d-flex flex-column"> <ul class="list-group">
{#each $current_theme.exercices as exercice, index} {#each $current_theme.exercices as exercice, index}
<li <li
class="list-group-item flex-fill border-0 rounded-0" class="list-group-item"
class:list-group-item-action={$my && $my.exercices[exercice.id]} class:list-group-item-action={$my && $my.exercices[exercice.id]}
on:click={goto(`${$current_theme.urlid}/${exercice.urlid}`)} on:click={goto(`${$current_theme.urlid}/${exercice.urlid}`)}
on:keypress={goto(`${$current_theme.urlid}/${exercice.urlid}`)} on:keypress={goto(`${$current_theme.urlid}/${exercice.urlid}`)}
> >
<div class="row h-100"> <div class="row">
{#if index + 1 == $current_theme.exercices.length} <div class="col-1" style="margin-top: -0.5rem; margin-bottom: -0.5rem; text-align: right; border-right: 5px solid #{$my && $my.exercices[exercice.id] && $my.exercices[exercice.id].solved_rank ? '62c462' : 'bbb'}">
<div class="col-1"></div> </div>
{:else}
<div class="col-1" style="margin-top: -0.5rem; margin-bottom: -0.5rem; text-align: right; border-right: 5px solid #{$my && $my.exercices[exercice.id] && $my.exercices[exercice.id].solved_rank ? '62c462' : 'bbb'}"></div>
{/if}
<div class="col-10"> <div class="col-10">
<div style="position: absolute; margin-left: calc(var(--bs-gutter-x) * -.5 - 15px); margin-top: -0.5rem;"> <div style="position: absolute; margin-left: calc(var(--bs-gutter-x) * -.5 - 15px); margin-top: -0.5rem;">
<svg style="height: 50px; width: 23px;"> <svg style="height: 50px; width: 23px;">
<rect <rect
style="fill:#{$my && $my.exercices[exercice.id] && (index < 1 || ($my.exercices[$current_theme.exercices[index-1].id] && $my.exercices[$current_theme.exercices[index-1].id].solved_rank)) ? '62c462' : 'bbb'}" style="fill:#{$my && $my.exercices[exercice.id] && (index < 1 || ($my.exercices[$current_theme.exercices[index-1].id] && $my.exercices[$current_theme.exercices[index-1].id].solved_rank)) ? '62c462' : 'bbb'}"
width="5" width="5"
height="27" height="30"
x="10" x="10"
y="0" /> y="0" />
<path <path
@ -114,17 +111,24 @@
</div> </div>
<div class="d-flex justify-content-between flex-wrap"> <div class="d-flex justify-content-between flex-wrap">
<h5 class="fw-bold text-truncate"> <h5 class="fw-bold text-truncate">
<span style="white-space: nowrap"> {#if $my && $my.exercices[exercice.id]}
{#if $my && $my.exercices[exercice.id] && $my.exercices[exercice.id].wip} <span style="white-space: nowrap">
<Icon name="cone-striped" aria-hidden="true" title="Cette étape est encore en construction." /> {#if $my.exercices[exercice.id].wip}
{/if} <Icon name="cone-striped" aria-hidden="true" title="Cette étape est encore en construction." />
{exercice.title} {/if}
</span> {exercice.title}
</span>
{:else}
<span style="white-space: nowrap">
<Icon name="lock-fill" aria-hidden="true" title="Vous n'avez pas encore accès à ce défi" />
{exercice.title}
</span>
{/if}
{#if exercice.curcoeff > 1.0} {#if exercice.curcoeff > 1.0}
<Icon name="gift" aria-hidden="true" title="Un bonus est actuellement appliqué lors de la résolution de ce défi" /> <Icon name="gift" aria-hidden="true" title="Un bonus est actuellement appliqué lors de la résolution de ce défi" />
{/if} {/if}
</h5> </h5>
<div class="mb-2"> <div>
{#each exercice.tags as tag, idx} {#each exercice.tags as tag, idx}
<Badge href="tags/{tag}" pill color="secondary" class="mx-1 float-end">#{tag}</Badge> <Badge href="tags/{tag}" pill color="secondary" class="mx-1 float-end">#{tag}</Badge>
{/each} {/each}
@ -132,14 +136,14 @@
</div> </div>
<p>{@html exercice.headline}</p> <p>{@html exercice.headline}</p>
</div> </div>
<div class="d-none d-md-flex flex-column h-100 justify-content-center align-items-end col-1 pe-0"> <div class="d-none d-md-block col-1 pe-0">
{#if $my && $my.exercices[exercice.id]} {#if $my && $my.exercices[exercice.id]}
<a href="{$current_theme.urlid}/{exercice.urlid}" style="font-size: 3rem"> <a class="float-end" href="{$current_theme.urlid}/{exercice.urlid}" style="font-size: 3rem">
<Icon name="chevron-right" aria-hidden="true" /> <Icon name="chevron-right" aria-hidden="true" />
</a> </a>
{:else} {:else}
<span style="font-size: 3rem"> <span class="float-end" style="font-size: 3rem">
<Icon name="lock-fill" aria-hidden="true" title="Vous n'avez pas encore accès à ce défi" /> <Icon name="chevron-right" aria-hidden="true" />
</span> </span>
{/if} {/if}
</div> </div>

View file

@ -7,7 +7,6 @@
Container, Container,
Icon, Icon,
Row, Row,
Spinner,
} from '@sveltestrap/sveltestrap'; } from '@sveltestrap/sveltestrap';
import { goto } from '$app/navigation'; import { goto } from '$app/navigation';
@ -24,10 +23,8 @@
let partJ = false; let partJ = false;
let messageClass; let messageClass;
let message; let message;
let registrationInProgress = false;
function gotoHomeOnDiff(i) { function gotoHomeOnDiff(i) {
registrationInProgress = true;
my.refresh((my) => { my.refresh((my) => {
if (my && my.team_id) { if (my && my.team_id) {
themesStore.refresh(() => { themesStore.refresh(() => {
@ -35,10 +32,6 @@
}); });
} else if (i > 0) { } else if (i > 0) {
setTimeout(gotoHomeOnDiff, 650, i-1); setTimeout(gotoHomeOnDiff, 650, i-1);
} else {
registrationInProgress = false;
messageClass = 'danger';
message = "Temps d'attente dépassé.";
} }
}) })
} }
@ -113,13 +106,9 @@
<strong>Oups, il semblerait qu'il y ait eu un problème lors de l'attribution de votre certificat.</strong> <strong>Oups, il semblerait qu'il y ait eu un problème lors de l'attribution de votre certificat.</strong>
Veuillez vous signaler auprès de notre équipe afin de corriger ce problème. Veuillez vous signaler auprès de notre équipe afin de corriger ce problème.
</Alert> </Alert>
{:else if registrationInProgress}
<div class="d-flex justify-content-center align-items-center gap-4 mt-5 fw-bold text-primary">
<Spinner size="lg" color="primary" /> Inscription en cours&hellip;
</div>
{:else} {:else}
{#if !$settings.denyTeamCreation && !partJ} {#if !$settings.denyTeamCreation && !partJ}
<Card body class="niceborder my-3 text-white"> <Card body class="niceborder my-3">
<p> <p>
Votre équipe n'est pas encore enregistrée sur notre serveur. Afin de Votre équipe n'est pas encore enregistrée sur notre serveur. Afin de
pouvoir participer au challenge, nous vous remercions de bien vouloir pouvoir participer au challenge, nous vous remercions de bien vouloir
@ -129,7 +118,7 @@
</Card> </Card>
{/if} {/if}
{#if $settings.canJoinTeam && !partR} {#if $settings.canJoinTeam && !partR}
<Card body class="niceborder my-3 text-white"> <Card body class="niceborder my-3">
<p> <p>
{#if !$settings.denyTeamCreation} {#if !$settings.denyTeamCreation}
Si votre équipe est déjà créée, rejoignez-là&nbsp;! Si votre équipe est déjà créée, rejoignez-là&nbsp;!

View file

@ -1,8 +1,4 @@
import { set_current_theme } from '$lib/stores/themes';
export async function load({ params }) { export async function load({ params }) {
set_current_theme.set(null);
return { return {
tag: params.tag, tag: params.tag,
}; };

View file

@ -25,8 +25,8 @@
for (let k in $themes) { for (let k in $themes) {
const th = $themes[k]; const th = $themes[k];
for (const ex of th.exercices) { for (const ex of th.exercices) {
if (ex.tags.map(t => t.normalize("NFD").replace(/[\u0300-\u036f]/g, "").toLowerCase()).indexOf(data.tag.normalize("NFD").replace(/[\u0300-\u036f]/g, "").toLowerCase()) >= 0) { if (ex.tags.indexOf(data.tag) >= 0) {
tmp_exercices.push({theme: th, exercice: ex, index: k + "," + ex.id}); tmp_exercices.push({theme: th, exercice: ex, index: k + "," + ex});
} }
} }
} }

View file

@ -7,7 +7,7 @@ const config = {
fallback: 'index.html' fallback: 'index.html'
}), }),
paths: { paths: {
relative: false relative: true
}, },
} }
}; };