Compare commits

...

114 Commits

Author SHA1 Message Date
Danhia 23529b3b07 added english version of news contents 2022-02-09 12:39:12 +01:00
Danhia cb9bc7cc56 news content is now out of the db for languages other than english 2022-02-09 12:22:12 +01:00
Danhia af4912837f Merge pull request #5 from Miliviu/main
All Spanish strings translated
2022-02-09 11:12:32 +01:00
Miliviu 187579e61c Add trasnlator references and date of translation 2022-02-09 10:58:12 +01:00
Miliviu fabe417fe2 Add Spanish to availible languages in the Settings.py file 2022-02-09 10:53:11 +01:00
Miliviu a6a5e424df Added spanish translation to both django files 2022-02-09 10:44:40 +01:00
Danhia bcf0c51ba5 added option to open team to automatching 2022-02-08 15:36:06 +01:00
Danhia 241a3f2bc1 added japanese empty files 2022-02-06 23:39:46 +01:00
Danhia cb46708e5c fixed redirection when leaving team + few details in html 2022-02-04 19:28:09 +01:00
Danhia 3c166f3834 updated .po files for last modifications 2022-02-04 19:05:11 +01:00
Danhia 92a1dca27c Merge branch 'main' into events 2022-02-04 19:04:20 +01:00
Danhia 96121e401e fixed redirection in events 2022-02-04 19:04:17 +01:00
ix 97f6b99133 fix event html 2022-02-04 17:13:50 +01:00
Danhia c45cfed8d4 fixed centering flag vertically 2022-02-04 16:04:56 +01:00
ix 5dc04f888b fix flags 2022-02-04 15:43:56 +01:00
Danhia 993e1fa998 beginning of lang flag refacto 2022-02-04 15:28:06 +01:00
Danhia 9d33985fa4 Merge pull request #4 from ClemaX/translation/de
locale: de: Translate all existing messages
2022-02-04 13:05:05 +01:00
Clément Hamada 0cd862734e resources: locale: de: Translate all existing messages 2022-02-04 06:02:00 +01:00
Clément Hamada aed129b4b9 locale: de: Spellcheck 2022-02-04 05:58:07 +01:00
Clément Hamada d1ab64885e resources: locale: de: Update messages 2022-02-04 03:34:01 +01:00
Clément Hamada b2cf802ab5 locale: de: Update file references 2022-02-04 03:30:49 +01:00
Clément Hamada 266e018d83 locale: de: Translate all existing messages 2022-02-04 03:13:51 +01:00
Danhia 8fd25d8fa6 changed position of logos in footer for mobile devices + added helloasso button in resources 2022-02-04 00:27:29 +01:00
ix 53fe69aa09 Merge branch 'main' of github.com:Danhia/42CTF into main 2022-02-03 21:03:18 +01:00
Danhia aadb2ac858 hotfix for dynamic scoring 2022-02-03 21:02:55 +01:00
ix 34b8829797 Fix resources page 2022-02-03 21:00:04 +01:00
ix 619ddf3d07 fix spaces between nav elements 2022-02-03 20:49:24 +01:00
ix 5d00c5733f Fix resources page 2022-02-03 20:49:02 +01:00
ix 248cdc54d5 Fix unused html 2022-02-03 20:45:56 +01:00
Danhia f8eef0ef3d added dynamic scoring for permanent platform, let's hope nothing breaks 2022-02-03 20:27:55 +01:00
Danhia e806b23812 fixed latest flags when chall is disabled + fixed recompute_scoreboard 2022-02-03 18:46:37 +01:00
Danhia 0fbf7b77c3 added disabled attribute for challenge + fixed recomputescoreboard 2022-02-03 18:37:24 +01:00
Danhia 985f440ede hotfix for 0 division when there is an empty category in profile page 2022-02-02 19:34:22 +01:00
Danhia 29dc697bdc added different color for members almost everywhere 2022-02-02 19:23:13 +01:00
Danhia 29835348f5 replaced flags counter by flag because css is broken on medium devices 2022-01-31 19:27:20 +01:00
Danhia 04925ed5b5 you can now delete your account 2022-01-31 19:21:14 +01:00
Danhia 14763469df hotfix for command recompute_scoreboard 2022-01-31 18:46:34 +01:00
Danhia 2495de137b Merge branch 'home-refacto' into main 2022-01-30 21:43:20 +01:00
Danhia 37525bb50a fixed links css for challenges in home 2022-01-30 19:22:58 +01:00
Danhia 52893b17d0 changed timezone in settings.py 2022-01-30 18:22:59 +01:00
Danhia 9ff4e7e36b added weekly top 5 + latest flags to home page 2022-01-30 17:59:02 +01:00
Danhia 33763a13a4 hotfix for too long pseudos breaking top10 css 2022-01-24 21:11:30 +01:00
Danhia f9535dcae3 fixed broken responsive design for footer 2022-01-24 17:20:23 +01:00
Danhia 6522982975 hotfix for duplicate messages in .po files 2022-01-24 16:16:25 +01:00
Danhia 6c0cc7d5c8 replaced subscribe by register for events 2022-01-24 16:11:03 +01:00
Danhia 1081fb35b2 added event filter for teams in admin panel 2022-01-24 12:59:09 +01:00
Danhia 1258096220 added event filter for teams in admin panel 2022-01-24 12:57:14 +01:00
Danhia fb0d844781 updtaed footer with twitter and linkedin 2022-01-24 10:27:38 +01:00
Danhia 2654c87f0b fixed missing og_img for page preview 2022-01-24 09:57:03 +01:00
Danhia c5858400ba corrected typo in no solves message 2022-01-23 18:48:55 +01:00
Danhia 7e4a2a30d9 changed color in top 10 + updated resources 2022-01-23 18:45:10 +01:00
Danhia bb97f1adc1 added member and visitor status + different colors in scoreboard 2022-01-23 18:40:57 +01:00
Danhia 52b3a71caf finished first version of resources, let's deploy ! 2022-01-23 17:08:13 +01:00
Danhia 0e41087f6a Merge branch 'main' into ressources 2022-01-23 15:48:57 +01:00
Danhia e4352ccc9a Merge branch 'events' into main 2022-01-16 22:19:38 +01:00
Danhia 8fbbd2d953 split views.py in events + new field in events model for automatching 2022-01-16 22:18:39 +01:00
Danhia cd5dcd9093 added auto matching for teams in event 2022-01-15 00:44:25 +01:00
Danhia 206cdd8edb Merge branch 'events' into main 2022-01-14 23:42:53 +01:00
Danhia c360457152 removed 500 when user is not connected and want to access public event 2022-01-14 23:41:59 +01:00
Danhia 3fcd85124b first draft of resources 2022-01-08 14:12:09 +01:00
Danhia 69e245dce1 updated fr translations for events 2022-01-08 11:23:20 +01:00
Danhia 97aac9140a updated translation files 2022-01-08 10:55:57 +01:00
Danhia 39d10437f8 fixed error when displaying challenge info in solo mode 2022-01-02 21:53:38 +01:00
Danhia eb23c9fac8 fixed starting date for graph on event's profile 2022-01-02 21:46:23 +01:00
Danhia afbe7f2430 fixed case where a category has no challenge in an event and profile crash 2022-01-02 21:41:32 +01:00
Danhia 8a2dd4dc80 fixed missing team when event is not password protected 2022-01-02 21:00:02 +01:00
Danhia 36ab01765e it's possible to modify and leave team 2022-01-02 20:42:10 +01:00
Danhia ba38df3b33 you can create and join team + eventplayer and team profile 2021-12-28 20:17:39 +01:00
Danhia 46dbc7182d first draft for team events 2021-12-17 19:02:19 +01:00
Danhia caf494ca98 Merge branch 'main' of https://github.com/Danhia/42CTF into main 2021-12-14 21:22:03 +01:00
Danhia e1e6449751 added rank on profile page 2021-12-14 21:21:29 +01:00
Danhia 56c9cb62c1 Update README.md 2021-12-14 20:38:03 +01:00
Danhia e774921c52 little fix for flag length + restrict access for unpublished challenges 2021-12-14 20:35:59 +01:00
ix 8ae6d83450 fix access to event challenges when event not begun or user not connected 2021-12-10 09:47:45 +01:00
Danhia 98350ad0d7 Merge pull request #3 from Lindoriel/main
correcting syntax error
2021-10-25 21:01:04 +02:00
Maxime ROTH 5039389cbc correcting ". error 2021-10-25 20:58:59 +02:00
Danhia ca023e77ad Merge pull request #2 from Lindoriel/main
adding french translation
2021-10-25 20:52:14 +02:00
Maxime ROTH 5280139f2d adding french translation 2021-10-25 20:22:11 +02:00
ix 8e481f603c update patreon link 2021-10-25 13:22:07 +02:00
Danhia 6ee81db3b6 first draft for cgu 2021-10-24 20:26:26 +02:00
ix dd2c60a3a4 footer reworked, patreon link added, messages recompiled and cgu view added 2021-10-24 16:25:46 +02:00
ix 48f9021839 fix solve list for event challenges, fix link color 2021-10-23 11:13:02 +02:00
ix a8b5e7f61d fix template profile 2021-10-22 16:09:05 +02:00
ix 6c85d9871c fix template profile 2021-10-22 16:08:22 +02:00
ix 5ea11f9951 Merge branch 'events' into main 2021-10-22 14:21:16 +02:00
ix 0469a140cb Merge branch 'main' of github.com:Danhia/42CTF into main 2021-10-22 14:21:12 +02:00
ix 71b612babe Update fix 2021-10-22 14:21:05 +02:00
Ix 1730f1048e Merge pull request #1 from Danhia/events
Update fix
2021-10-22 13:59:27 +02:00
ix 7c5c33b31a Merge branch 'main' of github.com:Danhia/42CTF into main 2021-10-22 13:58:40 +02:00
ix fca47da223 Update fix 2021-10-22 13:58:23 +02:00
Ix f914c27a28 Update README.md 2021-10-22 11:48:28 +02:00
ix 8728d5cd3e Update todo 2021-10-22 11:46:48 +02:00
ix 6997aaf93b Events done 2021-10-22 11:45:50 +02:00
ix 06dc8188a0 events added, need to smooth html and css 2021-10-21 15:02:02 +02:00
Ix 0f231a4988 Update README.md 2021-09-21 21:42:55 +02:00
ix 2b49c995a0 category challenges listed by point decrease 2021-09-08 21:50:28 +02:00
ix 4a2504be73 Discord button removed, css fix when 0 at category stat, messages recompiled 2021-09-08 21:36:15 +02:00
ix 0f92cf3da1 Categories stats added, css modified, fix responsive display of profile page 2021-09-08 16:53:00 +02:00
ix 8a203161ed Merge branch 'graph' into main 2021-09-08 04:00:39 +02:00
ix c5dedbfc26 Charts changed to highcharts 2021-09-08 03:59:35 +02:00
ix c5713d3887 Charts added 2021-09-08 00:32:44 +02:00
Danhia 299b47f598 fixed missing translation header in password reset templates 2021-09-07 20:42:18 +00:00
ix 9f431ac4fa internationalization for news 2021-09-07 21:13:30 +02:00
ix 2f7d96ed03 Merge remote-tracking branch 'origin/traduction-fr' into main 2021-09-07 19:54:05 +02:00
ix 1caccc6428 internationalization fixed, templates url fixed, messages recompiled 2021-09-07 19:52:40 +02:00
Danhia b84349b414 changed translation for sign up 2021-09-06 21:34:45 +02:00
Danhia 04cbde8326 french translation 2021-09-06 21:04:42 +02:00
ix ebb3712702 last 2021-09-06 20:15:03 +02:00
ix 58947f2b89 local settings 2021-09-06 20:14:23 +02:00
ix f53eb4d924 local settings 2021-09-06 20:12:03 +02:00
ix f453512f4b okay it's done i think 2021-09-06 19:59:13 +02:00
ix 9e24750a1b okay it's done i think 2021-09-06 19:42:13 +02:00
Ix 8cf4c891e8 Create settings.py 2021-07-10 12:34:42 +02:00
Ix 1b112cfd45 Update .gitignore 2021-07-10 12:29:40 +02:00
221 changed files with 16915 additions and 5631 deletions

3
.gitignore vendored
View File

@ -1,3 +1,4 @@
local_settings.py
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
@ -108,7 +109,7 @@ media/
*.pid
*.json
settings.py
local-settings.py
/data
/config

View File

@ -9,16 +9,16 @@ CTF by 42 students
- [x] Section "Intro"
- [x] Section Treasure Hunt
- [x] Edition de profil
- [ ] Ajouter de la Doc
- [x] Ajouter de la Doc
- [x] Infrastructure de pwn
- [x] Organiser une session découverte
- [x] Compteur de flags
- [ ] Graphiques statistiques
- [x] Graphiques statistiques
- [x] Création d'un discord linkable
- [ ] Refonte du linkage discord -> 42ctf
- [ ] Traduction du site
- [x] Traduction du site
- [x] Anglais
- [ ] Français
- [x] Français
- [ ] Russe
- [ ] Espagnol
- [ ] Italien
@ -26,3 +26,25 @@ CTF by 42 students
- [ ] Feature proposer une solution à un challenge
- [ ] Système de badge/succès
- [ ] Génération d'une page résumant le profil d'un utilisateur (ex: show resume sur intra.42.fr)
#### Event feature
- [X] make relation between user and events
- [X] make scoreboard for events
- [X] make access mod for events :
- [X] Sub button for public events
- [X] Access by password
- [X] Begin date for display challenges
- [X] Ending date for stop flag submission
- [ ] Access by invite link
- [X] Admin rights
- [X] Admin can access to events pages without password
- [X] Admin can subscribe to event without password
- [X] process flag submission
- [X] increment user score in Scores model
- [X] add filters for admin dashboard
- [X] add search in fields in admin dashboard
- [X] display more information in admin dashboard
- [X] Smooth display of events listing
- [X] Event info page with background and noice display
- [ ] Create teams for events

3
requirements.txt Normal file
View File

@ -0,0 +1,3 @@
Django
requests
authlib

23
src/TODO Normal file
View File

@ -0,0 +1,23 @@
[X] make relation between user and events
[X] make scoreboard for events
[X] make access mod for events :
[X] Sub button for public events
[X] Access by password
[X] Begin date for display challenges
[X] Ending date for stop flag submission
[X] Admin rights
[X] Admin can access to events pages without password
[X] Admin can subscribe to event without password
[X] process flag submission
[X] increment user score in Scores model
[X] add filters for admin dashboard
[X] add search in fields in admin dashboard
[X] display more information in admin dashboard
Front End :
[X] Smooth display of events listing
[X] Nice page with background, logo etc for event detail

View File

@ -1,5 +1,12 @@
from .models import UserProfileInfo
from django.contrib import admin
admin.site.register(UserProfileInfo)
#admin.site.register(UserProfileInfo)
# Register your models here.
@admin.register(UserProfileInfo)
class userprofile(admin.ModelAdmin):
#list display
list_display = ['user', 'score', 'last_submission_date']
# search list
search_fields = ['score', 'user__username']

View File

@ -0,0 +1,29 @@
# Generated by Django 3.1.5 on 2022-01-23 17:04
from django.db import migrations, models
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
('accounts', '0006_auto_20210608_2229'),
]
operations = [
migrations.AddField(
model_name='userprofileinfo',
name='member',
field=models.BooleanField(default=False),
),
migrations.AddField(
model_name='userprofileinfo',
name='member_since',
field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='Member since'),
),
migrations.AddField(
model_name='userprofileinfo',
name='member_until',
field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='Member until'),
),
]

View File

@ -12,6 +12,9 @@ class UserProfileInfo(models.Model):
last_submission_date = models.DateTimeField('Last Submission Date', default=timezone.now)
token = models.CharField(max_length=200, blank=True)
discord_id = models.CharField(max_length=20, null=True, blank=True, unique=True)
member = models.BooleanField(default=False)
member_since = models.DateTimeField('Member since', default=timezone.now)
member_until = models.DateTimeField('Member until', default=timezone.now)
def __str__(self):
return self.user.username
class Meta:

View File

@ -0,0 +1,33 @@
{% extends 'base.html' %}
{% block content %}
{% load i18n %}
<div class="row">
<div class="col-sm-12 col-md-9">
<div class="ctf-block">
<div class="ctf-head">
<h3>{% trans "Delete account" %}</h3>
</div>
<div class="ctf-body">
{% trans "Please confirm your password to delete your account." %}<br>
{% trans "Deleted accounts cannot be recovered." %}<br><br>
<div class="col-sm-8 col-md-6 mx-auto">
{% if bad_password %}
<span class="message error-msg">{% trans "Password inccorect." %}</span>
{% elif deleted %}
<span class="message success-msg">{% trans "Your account has been deleted." %}</span>
{% endif %}
<form method="post">
{% csrf_token %}
<div class="form-group">
<input class="form-control" type="password" name="password" placeholder="{% trans "Password" %}"></br>
<input class="form-control" type="submit" value="Delete">
</div>
</form>
</div>
</div>
</div>
</div>
</div>
{% endblock %}

View File

@ -39,26 +39,7 @@
</div>
</div>
</div>
<div class="ctf-block">
<div class="ctf-head">
<h3>{% trans "Connected accounts" %}</h3>
</div>
<div class="bloc-body">
<div class="d-flex">
{% if user.userprofileinfo.discord_id|length > 0 %}
<form action="{% url 'accounts:connections-disconnect-discord' %}" method='POST' class="form-inline p-2">
{%csrf_token%}
<button class="btn btn-dark" type="submit">{% trans "Disconnect Discord" %}</button>
</form>
{% else %}
<form action="{% url 'accounts:connections-connect-discord' %}" method='POST' class="form-inline p-2">
{%csrf_token%}
<button class="btn btn-dark" type="submit">{% trans "Connect Discord" %}</button>
</form>
{% endif %}
</div>
</div>
</div>
</div>
<div class="d-none d-md-block col-10 col-md-3 right-sidebar">
<ul class="list-group">
@ -71,8 +52,16 @@
</a>
</li>
{% endif %}
<li class="list-group-item">{% trans "Member since" %} {{ user.date_joined|date:"Y-m-d" }}</li>
<li class="list-group-item">{% trans "Registered since" %} {{ user.date_joined|date:"Y-m-d" }}</li>
</ul>
<ul class="list-group">
<form method='GET' action="{% url 'accounts:delete_account' %}">
{%csrf_token%}
<li class="list-group-item">
<input class="form-control" type="submit" value="{% trans "Delete my account" %}">
</li>
</form>
</ul>
</div>
</div>
{% endblock %}

View File

@ -8,28 +8,28 @@
<h3>Login</h3>
</div>
<div class="ctf-body">
<div class="col-sm-8 col-md-6 mx-auto">
{% if error %}
<span class="message error-msg">{% trans "Please, verify your infos." %}</span>
{% endif %}
<form method="post">
{% csrf_token %}
<div class="form-group">
<input class="form-control" type="text" name="username" placeholder="{% trans "Username" %}"></br>
<input class="form-control" type="password" name="password" placeholder="{% trans "Password" %}"></br>
<input class="form-control" type="submit" value="login">
</div>
<a href="{% url 'password_reset' %}">{% trans "Reset password" %}</a>
</form>
</div>
<div class="col-sm-8 col-md-6 mx-auto">
{% if error %}
<span class="message error-msg">{% trans "Please, verify your infos." %}</span>
{% endif %}
<form method="post">
{% csrf_token %}
<div class="form-group">
<input class="form-control" type="text" name="username" placeholder="{% trans "Username" %}"></br>
<input class="form-control" type="password" name="password" placeholder="{% trans "Password" %}"></br>
<input class="form-control" type="submit" value="login">
</div>
<a href="{% url 'password_reset' %}">{% trans "Reset password" %}</a>
</form>
</div>
</div>
</div>
</div>
<div class="col-sm-12 col-md-3 right-sidebar">
<ul class="list-group">
<a href="/accounts/signin" class="list-group-item">{% trans "Login" %}</a>
<a href="/accounts/signup" class="list-group-item">{% trans "Sign up" %}</a>
<a href="/accounts/signin" class="list-group-item">{% trans "Login" %}</a>
<a href="/accounts/signup" class="list-group-item">{% trans "Sign up" %}</a>
</ul>
</div>
</div>

View File

@ -1,13 +1,22 @@
{% extends 'base.html' %}
{% block content %}
{% load i18n %}
{% load key_value %}
{% load is_member %}
{% ismember user.userprofileinfo as is_member %}
<div class="row">
<div class="col-sm-12 col-md-9">
<div>
<h4>Challenges Solved by {{ user.username }}</h4>
{% if solves%}
<table class="table table-dark">
<thead>
<h4>{% trans "Challenges Solved by" %} <span class="{{ is_member }}">{{ user.username }}</span></h4>
{% if solves%}
<div class="table table-dark">
<div class="card-body">
<div id="time-chart"></div>
</div>
</div>
<table class="table table-dark">
<thead>
<tr>
<th scope="col">{% trans "Challenge Name" %}</th>
<th scope="col">{% trans "Category" %}</th>
@ -18,7 +27,7 @@
<tbody>
{% for s in solves %}
<tr>
<th scope="row"><a href="/ctfs/{{ s.ctf.category.slug }}/{{ s.ctf.slug }}">{{ s.ctf.name }}</a></th>
<th scope="row"><a href="{% url 'ctf' cat_slug=s.ctf.category.slug ctf_slug=s.ctf.slug %}">{{ s.ctf.name }}</a></th>
<td>{{ s.ctf.category.name}}</td>
<td>{{ s.ctf.points }}</td>
<td>{{ s.flag_date|date:"Y-m-d H:i:s" }}</td>
@ -27,14 +36,15 @@
</tbody>
</table>
{% else %}
<p>{% trans "It's seem {{ user.username }} have never solved any CTF yet..." %}</p>
<p>{% trans "It seems that this user has not solved any challenge yet..." %}</p>
{% endif %}
</div>
</div>
<div class="d-none d-md-block col-10 col-md-3 right-sidebar">
<ul class="list-group">
<li class="list-group-item">{{ user.username }}</li>
<li class="list-group-item">{% trans "Score" %} : {{ user.userprofileinfo.score }}</li>
<li class="list-group-item {{ is_member }}">{{ user.username }}</li>
<li class="list-group-item">{% trans "Score" %} : {{ score }}</li>
<li class="list-group-item">{% trans "Rank" %} : {{ rank }}</li>
{% if user.userprofileinfo.portfolio_site %}
<li class="list-group-item">
<a href="{{ user.userprofileinfo.portfolio_site }}" target="_blank">
@ -42,9 +52,101 @@
</a>
</li>
{% endif %}
<li class="list-group-item">{% trans "Member since" %} {{ user.date_joined|date:"Y-m-d" }}</li>
{% if member %}
<li class="list-group-item is-member">{% trans "Status: Member" %}</li>
{% else %}
<li class="list-group-item">{% trans "Status: Visitor" %}</li>
{% endif %}
<li class="list-group-item">{% trans "Registered since" %} {{ user.date_joined|date:"d-m-Y" }}</li>
</ul>
<ul class="list-group">
<li class="list-group-item">{% trans "Categories stats" %}</li>
{% for cat in catsDatas %}
<li class="list-group-item" style="padding-bottom: 3;padding-top: 0;">
<span>{{ cat.0 }}</span>
<div class="progress">
{% if cat.3 == '0' %}
<div class="progress-bar bg-success" role="progressbar" style="width: 0%;color:#d9d9d9;" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100">0 %</div>
{% else %}
<div class="progress-bar bg-success" role="progressbar" style="width: {{ cat.3 }}%" aria-valuenow="{{ cat.3 }}" aria-valuemin="0" aria-valuemax="100">{{ cat.3 }} %</div>
{% endif %}
</div>
</li>
{% endfor %}
</ul>
</div>
</div>
<script src="https://code.highcharts.com/highcharts.src.js"></script>
<script>
Highcharts.theme={colors:["#2b908f","#90ee7e","#f45b5b","#7798BF","#aaeeee","#ff0066","#eeaaee","#55BF3B","#DF5353","#7798BF","#aaeeee"],chart:{backgroundColor:{linearGradient:{x1:0,y1:0,x2:1,y2:1},stops:[[0,"#1D1D1D"],[1,"#1D1D1D"]]},style:{fontFamily:"'Unica One', sans-serif"},plotBorderColor:"#606063"},title:{style:{color:"#E0E0E3",textTransform:"uppercase",fontSize:"20px"}},subtitle:{style:{color:"#E0E0E3",textTransform:"uppercase"}},xAxis:{gridLineColor:"#707073",labels:{style:{color:"#E0E0E3"}},lineColor:"#707073",minorGridLineColor:"#505053",tickColor:"#707073",title:{style:{color:"#A0A0A3"}}},yAxis:{gridLineColor:"#707073",labels:{style:{color:"#E0E0E3"}},lineColor:"#707073",minorGridLineColor:"#505053",tickColor:"#707073",tickWidth:1,title:{style:{color:"#A0A0A3"}}},tooltip:{backgroundColor:"rgba(0, 0, 0, 0.85)",style:{color:"#F0F0F0"}},plotOptions:{series:{dataLabels:{color:"#F0F0F3",style:{fontSize:"13px"}},marker:{lineColor:"#333"}},boxplot:{fillColor:"#505053"},candlestick:{lineColor:"white"},errorbar:{color:"white"}},legend:{backgroundColor:"#1D1D1D",itemStyle:{color:"#E0E0E3"},itemHoverStyle:{color:"#FFF"},itemHiddenStyle:{color:"#606063"},title:{style:{color:"#C0C0C0"}}},credits:{style:{color:"#666"}},labels:{style:{color:"#707073"}},drilldown:{activeAxisLabelStyle:{color:"#F0F0F3"},activeDataLabelStyle:{color:"#F0F0F3"}},navigation:{buttonOptions:{symbolStroke:"#DDDDDD",theme:{fill:"#505053"}}},rangeSelector:{buttonTheme:{fill:"#505053",stroke:"#000000",style:{color:"#CCC"},states:{hover:{fill:"#707073",stroke:"#000000",style:{color:"white"}},select:{fill:"#000003",stroke:"#000000",style:{color:"white"}}}},inputBoxBorderColor:"#505053",inputStyle:{backgroundColor:"#333",color:"silver"},labelStyle:{color:"silver"}},navigator:{handles:{backgroundColor:"#666",borderColor:"#AAA"},outlineColor:"#CCC",maskFill:"rgba(255,255,255,0.1)",series:{color:"#7798BF",lineColor:"#A6C7ED"},xAxis:{gridLineColor:"#505053"}},scrollbar:{barBackgroundColor:"#808083",barBorderColor:"#808083",buttonArrowColor:"#CCC",buttonBackgroundColor:"#606063",buttonBorderColor:"#606063",rifleColor:"#FFF",trackBackgroundColor:"#404043",trackBorderColor:"#404043"}};
Highcharts.setOptions(Highcharts.theme);
Highcharts.chart('time-chart', {
title: {
text: 'Points earned for each category'
},
yAxis: {
title: {
text: 'Points earned'
}
},
xAxis: {
type: 'datetime',
labels: {
formatter: function() {
return Highcharts.dateFormat('%d.%b %Y',
this.value);
}
}
},
legend: {
layout: 'vertical',
align: 'right',
verticalAlign: 'middle'
},
plotOptions: {
pointStart: {{ user.date_joined|timestamp_fromdate }},
series: {
label: {
connectorAllowed: false
},
allowPointSelect: true,
marker: {
enabled: true
}
}
},
series: [
{
name: 'Total',
data: {{ solved|safe }}
},
{% for cat in cats %}
{
name: '{{ cat.name }}',
data: {{ pointDatas|keyvalue:cat.name|safe }},
visible: false,
},
{% endfor %}
],
responsive: {
rules: [{
condition: {
maxWidth: 500
},
chartOptions: {
legend: {
layout: 'horizontal',
align: 'center',
verticalAlign: 'bottom'
}
}
}]
}
});
</script>
{% endblock %}

View File

View File

@ -0,0 +1,11 @@
from django import template
register = template.Library()
@register.filter
def keyvalue(dict, key):
return dict[key]
@register.filter
def timestamp_fromdate(date):
return str(date.timestamp() * 1000).replace(',','.')

View File

@ -12,5 +12,6 @@ urlpatterns = [
path('rank/<str:token>', views.rank, name='rank'),
path('connections/connect/discord', views.connection.connect, name='connections-connect-discord'),
path('connections/connect/discord/authorize', views.connection.authorize, name='connections-connect-discord-authorize'),
path('connections/disconnect/discord', views.connection.disconnect, name='connections-disconnect-discord')
path('connections/disconnect/discord', views.connection.disconnect, name='connections-disconnect-discord'),
path('delete_account/', views.delete_account, name='delete_account'),
]

View File

@ -2,7 +2,7 @@ from django.shortcuts import render, redirect, get_object_or_404
from django.utils.translation import gettext_lazy as _
from django import forms
from ctfs.models import CTF_flags
from ctfs.models import Category, CTF_flags, CTF
from ..forms import UserForm,UserProfileInfoForm, UserInfosUpdateForm, UserUpdateForm
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.models import User
@ -15,116 +15,170 @@ from django.urls import reverse
from secrets import token_hex
from accounts.models import UserProfileInfo
from django.contrib.auth.models import timezone
from . import connection
def signin(request):
if not request.user.is_authenticated:
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
user = authenticate(username=username, password=password)
if user:
if user.is_active:
login(request,user)
return HttpResponseRedirect(reverse('home'))
else:
return HttpResponse(_("Your account was inactive."))
else:
return render(request, 'accounts/login.html', {'error': True})
else:
return render(request, 'accounts/login.html', {})
else:
return HttpResponseRedirect(reverse('home'))
if not request.user.is_authenticated:
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
user = authenticate(username=username, password=password)
if user:
if user.is_active:
login(request,user)
return HttpResponseRedirect(reverse('home'))
else:
return HttpResponse(_("Your account was inactive."))
else:
return render(request, 'accounts/login.html', {'error': True})
else:
return render(request, 'accounts/login.html', {})
else:
return HttpResponseRedirect(reverse('home'))
def signup(request):
if not request.user.is_authenticated:
user_form = UserForm()
profile_form = UserProfileInfoForm()
registered = False
if request.method == 'POST':
pass1 = request.POST.get('password')
if len(pass1) < 8:
return render(request,'accounts/register.html', {'user_form':user_form, 'profile_form':profile_form, 'registered_failed':"The new password must be at least %d characters long." % 8})
first_isalpha = pass1[0].isalpha()
if not any(c.isdigit() for c in pass1) or not any(c.isalpha() for c in pass1):
return render(request,'accounts/register.html', {'user_form':user_form, 'profile_form':profile_form, 'registered_failed':_("The password must contain at least one letter and at least one digit or punctuation character.")})
if User.objects.filter(email=request.POST.get('email')).exists():
return render(request,'accounts/register.html', {'user_form':user_form, 'profile_form':profile_form, 'registered_failed':_("A user with that email already exists.")})
user_form = UserForm(data=request.POST)
profile_form = UserProfileInfoForm(data=request.POST)
if user_form.is_valid() and profile_form.is_valid():
user = user_form.save()
user.set_password(user.password)
user.save()
profile = profile_form.save(commit=False)
profile.user = user
profile.token = token_hex(16)
profile.save()
registered = True
else:
return render(request,'accounts/register.html', {'user_form':user_form, 'profile_form':profile_form, 'registered_failed':_("A user with that username already exists.")})
return render(request,'accounts/register.html',
{'user_form':user_form,
'profile_form':profile_form,
'registered':registered})
else:
return HttpResponseRedirect(reverse('home'))
if not request.user.is_authenticated:
user_form = UserForm()
profile_form = UserProfileInfoForm()
registered = False
if request.method == 'POST':
pass1 = request.POST.get('password')
if len(pass1) < 8:
return render(request,'accounts/register.html', {'user_form':user_form, 'profile_form':profile_form, 'registered_failed':"The new password must be at least %d characters long." % 8})
first_isalpha = pass1[0].isalpha()
if not any(c.isdigit() for c in pass1) or not any(c.isalpha() for c in pass1):
return render(request,'accounts/register.html', {'user_form':user_form, 'profile_form':profile_form, 'registered_failed':_("The password must contain at least one letter and at least one digit or punctuation character.")})
if User.objects.filter(email=request.POST.get('email')).exists():
return render(request,'accounts/register.html', {'user_form':user_form, 'profile_form':profile_form, 'registered_failed':_("A user with that email already exists.")})
user_form = UserForm(data=request.POST)
profile_form = UserProfileInfoForm(data=request.POST)
if user_form.is_valid() and profile_form.is_valid():
user = user_form.save()
user.set_password(user.password)
user.save()
profile = profile_form.save(commit=False)
profile.user = user
profile.token = token_hex(16)
profile.save()
registered = True
else:
return render(request,'accounts/register.html', {'user_form':user_form, 'profile_form':profile_form, 'registered_failed':_("A user with that username already exists.")})
return render(request,'accounts/register.html',
{'user_form':user_form,
'profile_form':profile_form,
'registered':registered})
else:
return HttpResponseRedirect(reverse('home'))
@login_required
def out(request):
logout(request)
return HttpResponseRedirect(reverse('home'))
logout(request)
return HttpResponseRedirect(reverse('home'))
@login_required
def edit(request):
if request.method == 'POST':
umail = request.user.email
uuser = request.user.username
p_form = UserInfosUpdateForm(request.POST, instance=request.user.userprofileinfo)
u_form = UserUpdateForm(request.POST, instance=request.user)
error = None
success = None
if p_form.is_valid() and u_form.is_valid():
pmail = u_form.cleaned_data['email']
if pmail == umail:
pass
else:
if User.objects.filter(email=pmail).exists():
error = _("Email already taken.")
puser = u_form.cleaned_data['username']
if puser == uuser:
pass
else:
if User.objects.filter(username=puser).exists():
error = _("Username already taken.")
if error is None:
u_form.save()
p_form.save()
success = _("Updated.")
request.user.username = uuser
if request.method == 'POST':
umail = request.user.email
uuser = request.user.username
p_form = UserInfosUpdateForm(request.POST, instance=request.user.userprofileinfo)
u_form = UserUpdateForm(request.POST, instance=request.user)
error = None
success = None
if p_form.is_valid() and u_form.is_valid():
pmail = u_form.cleaned_data['email']
if pmail == umail:
pass
else:
if User.objects.filter(email=pmail).exists():
error = _("Email already taken.")
puser = u_form.cleaned_data['username']
if puser == uuser:
pass
else:
if User.objects.filter(username=puser).exists():
error = _("Username already taken.")
if error is None:
u_form.save()
p_form.save()
success = _("Updated.")
request.user.username = uuser
context={'p_form': p_form, 'u_form': u_form, 'error':error, 'success' : success}
return render(request, 'accounts/edit.html', context)
else:
p_form = UserInfosUpdateForm(instance=request.user.userprofileinfo)
u_form = UserUpdateForm(instance=request.user)
context={'p_form': p_form, 'u_form': u_form, 'token': request.user.userprofileinfo.token}
return render(request, 'accounts/edit.html',context )
context={'p_form': p_form, 'u_form': u_form, 'error':error, 'success' : success}
return render(request, 'accounts/edit.html', context)
else:
p_form = UserInfosUpdateForm(instance=request.user.userprofileinfo)
u_form = UserUpdateForm(instance=request.user)
context={'p_form': p_form, 'u_form': u_form, 'token': request.user.userprofileinfo.token}
return render(request, 'accounts/edit.html',context )
@login_required
def profile(request, user_name):
user_obj = get_object_or_404(User, username=user_name)
solves = CTF_flags.objects.filter(user=user_obj).order_by('-flag_date')
return render(request,'accounts/profile.html', {'user':user_obj, 'solves':solves})
# Create your views here.
catsDatas = []
user_obj = get_object_or_404(User, username=user_name)
all_users = list(UserProfileInfo.objects.select_related().order_by('-score', 'last_submission_date', 'user__username'))
rank = all_users.index(get_object_or_404(UserProfileInfo, user=user_obj)) + 1
if (user_obj.userprofileinfo.member and user_obj.userprofileinfo.member_until > timezone.now()):
member = True
else:
member = False
all_cats = Category.objects.all()
cats = [cat for cat in all_cats if CTF.objects.filter(category__name=cat.name, event=None, disabled=False)]
pointDatas = {}
for cat in cats:
# prepare categories
solved = CTF_flags.objects.filter(user=user_obj, ctf__category__name=cat.name, ctf__event=None, ctf__disabled=False).order_by('flag_date')
max_count = CTF.objects.filter(category__name=cat.name, event=None, disabled=False).count()
# get datas
somme = 0
solved_count = len(solved)
pointDatas[cat.name] = []
pointDatas[cat.name].append([user_obj.date_joined.timestamp() * 1000, 0])
percent = (solved_count / max_count) * 100
catsDatas.append([cat.name, solved_count, max_count, '{:.0f}'.format(percent)])
for flag in solved:
somme += flag.ctf.points
pointDatas[cat.name].append([flag.flag_date.timestamp() * 1000, somme])
solves = CTF_flags.objects.filter(user=user_obj, ctf__event=None, ctf__disabled=False).order_by('-flag_date')
solved = []
somme = 0
solved.append([user_obj.date_joined.timestamp() * 1000, 0])
for s in solves.reverse():
somme += s.ctf.points
solved.append([s.flag_date.timestamp() * 1000,somme])
return render(request,'accounts/profile.html', {'user':user_obj, 'solves':solves,'solved':solved,'catsDatas': catsDatas, 'pointDatas': pointDatas,
'rank': rank, 'score' : somme, 'member' : member, 'cats':cats})
def rank(request, token):
all_users = UserProfileInfo.objects.filter(score__gt=0).select_related().order_by('-score', 'last_submission_date', 'user__username')
all_users = UserProfileInfo.objects.filter(score__gt=0).select_related().order_by('-score', 'last_submission_date', 'user__username')
rank = 1
for elem in all_users:
if elem.token == token:
break
rank += 1
data = {"rank": rank}
return JsonResponse(data)
rank = 1
for elem in all_users:
if elem.token == token:
break
rank += 1
data = {"rank": rank}
return JsonResponse(data)
@login_required
def delete_account(request):
if request.method == 'POST':
user = request.user
password = request.POST.get('password')
if user.check_password(password):
logout(request)
user.delete()
return render(request, 'accounts/delete.html', {'deleted': True, 'bad_password': False})
else:
return render(request, 'accounts/delete.html', {'deleted': False, 'bad_password': True})
else:
return render(request, 'accounts/delete.html', {'deleted': False, 'bad_password': False} )

26
src/change_lang.py Normal file
View File

@ -0,0 +1,26 @@
from django.template import Library
from django.core.urlresolvers import resolve, reverse
from django.utils.translation import activate, get_language
register = Library()
@register.simple_tag(takes_context=True)
def change_lang(context, lang=None, *args, **kwargs):
"""
Get active page's url by a specified language
Usage: {% change_lang 'en' %}
"""
path = context['request'].path
url_parts = resolve( path )
url = path
cur_language = get_language()
try:
activate(lang)
url = reverse( url_parts.view_name, kwargs=url_parts.kwargs )
finally:
activate(cur_language)
return "%s" % url

View File

@ -2,7 +2,24 @@ from django.contrib import admin
from .models import Category, CTF, CTF_flags
admin.site.register(Category)
admin.site.register(CTF)
admin.site.register(CTF_flags)
#admin.site.register(CTF)
#admin.site.register(CTF_flags)
@admin.register(CTF_flags)
class ctf_flags(admin.ModelAdmin):
#list display
list_display = ['user', 'ctf', 'flag_date']
#list Filter
list_filter = ('ctf__category', 'ctf', 'user','flag_date')
# search list
search_fields = ['ctf__category__name', 'ctf__name', 'user__username']
@admin.register(CTF)
class ctf(admin.ModelAdmin):
#list display
list_display = ['name', 'event', 'category']
#list Filter
list_filter = ('category', 'event')
# search list
search_fields = ['category__name', 'name', 'author__username']
# Register your models here.

View File

View File

View File

@ -0,0 +1,28 @@
from collections import defaultdict
from django.core.management.base import BaseCommand, CommandError
from accounts.models import UserProfileInfo
from ctfs.models import CTF_flags, CTF
from math import log
class Command(BaseCommand):
help = 'Actualize challenges points based on number of solves'
def handle(self, *args, **options):
challenges = CTF.objects.filter(event=None, disabled=False).exclude(category__name="-Intro-")
for ctf in challenges:
solves = CTF_flags.objects.filter(ctf=ctf)
nb_solves = len(solves)
if nb_solves > 0:
new_points = max(200 - int(log(nb_solves)*8.5)*5, 5)
else:
new_points = 200
if new_points != ctf.points:
diff = ctf.points - new_points
ctf.points = new_points
ctf.save()
for s in solves:
s.user.userprofileinfo.score -= diff
s.user.userprofileinfo.save()

View File

@ -0,0 +1,28 @@
# Generated by Django 3.2.7 on 2021-09-07 14:07
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('ctfs', '0003_auto_20191003_1947'),
]
operations = [
migrations.AddField(
model_name='ctf',
name='description_de',
field=models.TextField(blank=True),
),
migrations.AddField(
model_name='ctf',
name='description_en',
field=models.TextField(blank=True),
),
migrations.AddField(
model_name='ctf',
name='description_ru',
field=models.TextField(blank=True),
),
]

View File

@ -0,0 +1,20 @@
# Generated by Django 3.2.7 on 2021-10-18 14:23
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('events', '0001_initial'),
('ctfs', '0004_auto_20210907_1407'),
]
operations = [
migrations.AddField(
model_name='ctf',
name='event',
field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='events.event'),
),
]

View File

@ -0,0 +1,20 @@
# Generated by Django 3.2.7 on 2021-10-19 15:03
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('events', '0002_alter_event_password'),
('ctfs', '0005_ctf_event'),
]
operations = [
migrations.AlterField(
model_name='ctf',
name='event',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='events.event'),
),
]

View File

@ -0,0 +1,18 @@
# Generated by Django 3.1.5 on 2022-02-03 17:19
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('ctfs', '0006_alter_ctf_event'),
]
operations = [
migrations.AddField(
model_name='ctf',
name='disabled',
field=models.BooleanField(default=False),
),
]

View File

@ -1,5 +1,6 @@
from django.db import models
from django.contrib.auth.models import User
from events.models import Event
class Category(models.Model):
name = models.CharField(max_length=200)
@ -11,9 +12,14 @@ class Category(models.Model):
class CTF(models.Model):
name = models.CharField(max_length=200)
flag = models.CharField(max_length=100)
disabled = models.BooleanField(default=False)
description = models.TextField(blank=True)
description_en = models.TextField(blank=True)
description_ru = models.TextField(blank=True)
description_de = models.TextField(blank=True)
file = models.FileField(blank=True, upload_to='challenges')
ctf_url = models.URLField(blank=True)
event = models.ForeignKey(Event, null=True, blank=True, on_delete=models.CASCADE)
points = models.PositiveSmallIntegerField()
slug = models.SlugField(max_length=55)
pub_date = models.DateTimeField('Date published')

View File

@ -1,80 +1,93 @@
{% extends 'base.html' %}
{% block content %}
{% load i18n %}
{% load is_member %}
<div class="row">
<div class="col-sm-12 col-md-9">
<div class="ctf-block">
<div class="ctf-head">
<h3>{{ ctf.name }}</h3>
<small>{% trans "Published date" %} : {{ ctf.pub_date }}</small>
<small>{% trans "Published date" %} : {{ ctf.pub_date }}</small>
</div>
{% if date < ctf.pub_date %}
<div class="ctf-body">
{{ ctf.description|safe }}
{% trans "Challenge is not yet available." %}
</div>
{% else %}
<div class="ctf-body">
{% if description %}
{{ description|safe }}
{% else %}
{% trans "No translation available. Please try another language (English or French)." %}
{% endif %}
</div>
<div class="ctf-footer">
{% if request.user.is_authenticated %}
{% if valitated == True %}
<p>{% trans "Congratulation !" %}</p>
{% elif alvalitated == True %}
<p>{% trans "Already flagged" %}</p>
{% if ctf.ctf_url %}
<a class="begin-ctf-link" target="_blank" href="{{ ctf.ctf_url }}">{% trans "Start the challenge" %}</a></br>
{% elif ctf.file %}
<a class="begin-ctf-link" target="_blank" href="{{ ctf.file.url }}">{% trans "Download" %}</a></br>
{% endif %}
{% else %}
{% if failed %}
<p>{% trans "Wrong flag ! You can do it !" %}</p>
{% endif %}
{% if ctf.ctf_url %}
<a class="begin-ctf-link" target="_blank" href="{{ ctf.ctf_url }}">{% trans "Start the challenge" %}</a></br>
{% elif ctf.file %}
<a class="begin-ctf-link" target="_blank" href="{{ ctf.file.url }}">{% trans "Download" %}</a></br>
{% endif %}
<form method="post" class="submitflag-form">
{% csrf_token %}
<input type="text" name="flag" maxlength="48" required="" id="id_flag">
<input class="form-control" type="submit" value=">">
</form>
{% if request.user.is_authenticated %}
{% if valitated == True %}
<p>{% trans "Congratulation !" %}</p>
{% elif alvalitated == True %}
<p>{% trans "Already flagged" %}</p>
{% if ctf.ctf_url %}
<a class="begin-ctf-link" target="_blank" href="{{ ctf.ctf_url }}">{% trans "Start the challenge" %}</a></br>
{% elif ctf.file %}
<a class="begin-ctf-link" target="_blank" href="{{ ctf.file.url }}">{% trans "Download" %}</a></br>
{% endif %}
{% else %}
{% if failed %}
<p>{% trans "Wrong flag ! You can do it !" %}</p>
{% endif %}
{% if ctf.ctf_url %}
<a class="begin-ctf-link" target="_blank" href="{{ ctf.ctf_url }}">{% trans "Start the challenge" %}</a></br>
{% elif ctf.file %}
<a class="begin-ctf-link" target="_blank" href="{{ ctf.file.url }}">{% trans "Download" %}</a></br>
{% endif %}
<form method="post" class="submitflag-form">
{% csrf_token %}
<input type="text" name="flag" maxlength="100" required="" id="id_flag">
<input class="form-control" type="submit" value=">">
</form>
{% endif %}
{% endif %}
{% endif %}
{% endif %}
</div>
{% endif %}
</div>
<div>
<h4>{% trans "Solved by" %}</h4>
{% if solved_list %}
<table class="table table-dark">
<h4>{% trans "Solved by" %}</h4>
{% if solved_list %}
<table class="table table-dark">
<thead>
<tr>
<th scope="col">{% trans "Username" %}</th>
<th scope="col">{% trans "Website" %}</th>
<th scope="col">{% trans "Score" %}</th>
<th scope="col">{% trans "Date" %}</th>
<th scope="col">{% trans "Username" %}</th>
<th scope="col">{% trans "Website" %}</th>
<th scope="col">{% trans "Score" %}</th>
<th scope="col">{% trans "Date" %}</th>
</tr>
</thead>
<tbody>
{% for s in solved_list %}
<tr>
<th scope="row"><a class="profile_link" href="/accounts/profile/{{ s.user.username }}"> {{ s.user.username }}</a></th>
<td>{{ s.user.userprofileinfo.portfolio_site }}</td>
<td>{{ s.user.userprofileinfo.score }}</td>
<td>{{ s.flag_date }}</td>
{% for s in solved_list %}
<tr>
{% ismember s.user.userprofileinfo as is_member %}
<th scope="row"><a class="profile_link {{is_member}}" href="{% url 'accounts:profile' user_name=s.user.username %}"> {{ s.user.username }}</a></th>
<td>{{ s.user.userprofileinfo.portfolio_site }}</td>
<td>{{ s.user.userprofileinfo.score }}</td>
<td>{{ s.flag_date }}</td>
</tr>
{% endfor %}
{% endfor %}
</tbody>
</table>
{% else %}
<p>{% trans "Nobody have solved this CTF." %}</p>
{% endif %}
{% else %}
<p>{% trans "Nobody has solved this challenge yet." %}</p>
{% endif %}
</div>
</div>
<div class="d-none d-md-block col-10 col-md-3 right-sidebar">
<ul class="list-group">
<li class="list-group-item">{% trans "Author" %} : {{ ctf.author.username }}</li>
<li class="list-group-item">{% trans "Point reward" %} : {{ ctf.points }}</li>
{% ismember ctf.author.userprofileinfo as is_member %}
<li class="list-group-item">{% trans "Author" %} : <a style="position:absolute;right: 15px;" class="profile_link {{is_member}}" href="{% url 'accounts:profile' user_name=ctf.author.username %}">{{ ctf.author.username }}</a></li>
<li class="list-group-item">{% trans "Point reward" %} : <span style="position:absolute;right: 15px;">{{ ctf.points }}</span></li>
</ul>
</ul>
</div>
</div>
{% endblock %}

4
src/ctfs/templates/ctfs/ctfs_list.html Normal file → Executable file
View File

@ -26,7 +26,7 @@
{% else %}
<th scope="row"> </th>
{% endif %}
<td><a href="/ctfs/{{ cat.slug }}/{{ ctf.slug }}">{{ ctf.name }}</td>
<td><a href="{% url 'ctf' cat_slug=ctf.category.slug ctf_slug=ctf.slug %}">{{ ctf.name }}</td>
<td>{{ ctf.points }}</td>
<td>{{ ctf.solved_num }}</td>
</tr>
@ -42,7 +42,7 @@
<li class="list-group-item active">{% trans "Categories" %}</li>
{% if cats %}
{% for c in cats %}
<a class="list-group-item" href="/ctfs/{{ c.slug }}">{{ c.name }}</a>
<a class="list-group-item" href="{% url 'category' cat_slug=c.slug %}">{{ c.name }}</a>
{% endfor %}
{% else %}
<li class="list-group-item">{% trans "No category available." %}</li>

View File

@ -4,19 +4,53 @@ from django.contrib.auth.models import timezone
from .models import Category, CTF, CTF_flags
from .forms import submit_flag
from accounts.models import UserProfileInfo
from django.utils.translation import get_language
from math import log
from accounts.models import UserProfileInfo
def get_description_by_lang(ctf):
lang = get_language()
ret = None
if lang == "fr":
ret = ctf.description
elif lang == "en":
ret = ctf.description_en
elif lang == "de":
ret = ctf.description_de
elif lang == "ru":
ret = ctf.description_ru
return ret
def actualize_points(ctf):
if ctf.category.name == "-Intro-":
return
solves = CTF_flags.objects.filter(ctf=ctf)
nb_solves = len(solves)
new_points = max(200 - int(log(nb_solves)*8.5)*5, 5)
if new_points != ctf.points:
diff = ctf.points - new_points
ctf.points = new_points
ctf.save()
for s in solves:
s.user.userprofileinfo.score -= diff
s.user.userprofileinfo.save()
def category(request, cat_slug):
cat = get_object_or_404(Category, slug=cat_slug)
ctfs = CTF.objects.filter(category=cat).order_by('-points')
ctfs = CTF.objects.filter(category=cat, event=None, disabled=False).order_by('points')
for ex in ctfs:
ex.solved_num = CTF_flags.objects.filter(ctf=ex).count()
ex.solved = ex.solved_by(request.user)
ex.solved_num = CTF_flags.objects.filter(ctf=ex).count()
ex.solved = ex.solved_by(request.user)
return render(request, 'ctfs/ctfs_list.html', {'ctfs' : ctfs, 'cat' : cat})
def ctf(request, cat_slug, ctf_slug):
ctf_info = get_object_or_404(CTF, slug=ctf_slug)
ctf_info = get_object_or_404(CTF, slug=ctf_slug, event=None)
flagged = False
solved_list = CTF_flags.objects.filter(ctf=ctf_info).order_by('flag_date')
description = get_description_by_lang(ctf_info)
if request.user.is_authenticated:
if CTF_flags.objects.filter(user=request.user, ctf=ctf_info):
flagged = True
@ -24,25 +58,20 @@ def ctf(request, cat_slug, ctf_slug):
if request.user.is_authenticated:
form = submit_flag(data=request.POST)
if flagged == False and form.is_valid():
if CTF.objects.filter(flag=request.POST.get('flag'), slug=ctf_slug):
if CTF.objects.filter(flag=request.POST.get('flag'), slug=ctf_slug, event=None):
new = CTF_flags(user = request.user, ctf = ctf_info, flag_date = timezone.now())
new.save()
profil = UserProfileInfo.objects.get(user=request.user)
profil.last_submission_date = timezone.now()
profil.score += ctf_info.points
profil.save()
return render(request, 'ctfs/ctf_info.html', {'form' : form, 'ctf' : ctf_info, 'solved_list': solved_list, 'valitated': True})
actualize_points(ctf_info)
return render(request, 'ctfs/ctf_info.html', { 'ctf' : ctf_info, 'solved_list': solved_list, 'valitated': True, 'description': description, 'date': timezone.now()})
else:
return render(request, 'ctfs/ctf_info.html', {'form' : form, 'ctf' : ctf_info, 'solved_list': solved_list, 'failed': True})
return render(request, 'ctfs/ctf_info.html', { 'ctf' : ctf_info, 'solved_list': solved_list, 'failed': True, 'description': description, 'date': timezone.now()})
else:
form = submit_flag()
return render(request, 'ctfs/ctf_info.html', {'form' : form, 'ctf' : ctf_info, 'solved_list': solved_list, 'alvalitated': True})
return render(request, 'ctfs/ctf_info.html', { 'ctf' : ctf_info, 'solved_list': solved_list, 'alvalitated': True, 'description': description, 'date': timezone.now()})
else:
form = submit_flag()
return render(request, 'ctfs/ctf_info.html', {'form' : form, 'ctf' : ctf_info, 'solved_list': solved_list})
return render(request, 'ctfs/ctf_info.html', { 'ctf' : ctf_info, 'solved_list': solved_list, 'description': description, 'date': timezone.now()})
else:
form = submit_flag()
return render(request, 'ctfs/ctf_info.html', {'form' : form, 'ctf' : ctf_info, 'solved_list': solved_list, 'alvalitated': flagged})
# Create your views here.
return render(request, 'ctfs/ctf_info.html', { 'ctf' : ctf_info, 'solved_list': solved_list, 'alvalitated': flagged, 'description': description, 'date': timezone.now()})

0
src/events/__init__.py Normal file
View File

29
src/events/admin.py Normal file
View File

@ -0,0 +1,29 @@
from django.contrib import admin
from .models import Event, EventPlayer, Team
@admin.register(Event)
class event(admin.ModelAdmin):
#list display
list_display = ['name', 'start_date', 'end_date']
# search list
search_fields = ['name', 'slug', 'description', 'password']
@admin.register(EventPlayer)
class score(admin.ModelAdmin):
#list display
list_display = ['user', 'event', 'score']
#list Filter
list_filter = ('event',)
# search list
search_fields = ['user__username', 'score', 'event__name']
# Register your models here.
@admin.register(Team)
class team(admin.ModelAdmin):
#list display
list_display = ['name', 'event']
#list Filter
list_filter = ('event',)
# search list
search_fields = ['name']

6
src/events/apps.py Normal file
View File

@ -0,0 +1,6 @@
from django.apps import AppConfig
class EventsConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'events'

20
src/events/forms.py Normal file
View File

@ -0,0 +1,20 @@
from django import forms
from .models import Team
class submit_flag(forms.Form):
flag = forms.CharField(label="Flag", max_length=100)
class create_team(forms.ModelForm):
password = forms.CharField(widget=forms.PasswordInput())
class Meta():
model = Team
fields = ('name','password')
class TeamUpdateForm(forms.ModelForm):
class Meta:
model = Team
fields=('name', 'password',)
def __init__(self, *args, **kwargs):
super(TeamUpdateForm, self).__init__(*args, **kwargs)
for key in self.fields:
self.fields[key].required = True

View File

@ -0,0 +1,46 @@
# Generated by Django 3.2.7 on 2021-10-18 14:19
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
import uuid
class Migration(migrations.Migration):
initial = True
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name='Event',
fields=[
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
('name', models.CharField(max_length=200)),
('logo', models.CharField(max_length=200)),
('img', models.CharField(max_length=200)),
('description', models.TextField()),
('start_date', models.DateTimeField()),
('end_date', models.DateTimeField()),
('password', models.CharField(max_length=200)),
('slug', models.SlugField(max_length=55)),
],
),
migrations.CreateModel(
name='Scores',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('score', models.PositiveIntegerField(db_index=True, default=0)),
('last_submission_date', models.DateTimeField(default=django.utils.timezone.now, verbose_name='Last Submission Date')),
('event', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='events.event')),
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
options={
'ordering': ['-score', 'last_submission_date', 'user__username'],
},
),
]

View File

@ -0,0 +1,18 @@
# Generated by Django 3.2.7 on 2021-10-18 14:43
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('events', '0001_initial'),
]
operations = [
migrations.AlterField(
model_name='event',
name='password',
field=models.CharField(blank=True, max_length=200),
),
]

View File

@ -0,0 +1,26 @@
# Generated by Django 3.2.7 on 2021-10-19 15:19
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('events', '0002_alter_event_password'),
]
operations = [
migrations.AlterField(
model_name='scores',
name='event',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='events.event'),
),
migrations.AlterField(
model_name='scores',
name='user',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
),
]

View File

@ -0,0 +1,30 @@
# Generated by Django 3.1.5 on 2021-12-27 15:40
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('events', '0003_auto_20211019_1519'),
]
operations = [
migrations.RenameModel('Scores', 'EventPlayer'),
migrations.CreateModel(
name='Team',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=200)),
('password', models.CharField(max_length=200)),
('size', models.PositiveIntegerField(default=1)),
('score', models.PositiveIntegerField(db_index=True, default=0)),
('last_submission_date', models.DateTimeField(default=django.utils.timezone.now, verbose_name='Last Submission Date')),
('event', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='events.event')),
],
),
]

View File

@ -0,0 +1,29 @@
# Generated by Django 3.1.5 on 2021-12-27 15:56
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('events', '0004_auto_20211227_1540'),
]
operations = [
migrations.AddField(
model_name='event',
name='team_size',
field=models.PositiveIntegerField(default=1),
),
migrations.AddField(
model_name='eventplayer',
name='team',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='events.team'),
),
migrations.AlterField(
model_name='eventplayer',
name='id',
field=models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
]

View File

@ -0,0 +1,22 @@
# Generated by Django 3.1.5 on 2022-01-14 23:19
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('events', '0005_auto_20211227_1556'),
]
operations = [
migrations.RemoveField(
model_name='team',
name='size',
),
migrations.AddField(
model_name='team',
name='auto',
field=models.BooleanField(default=False),
),
]

View File

@ -0,0 +1,18 @@
# Generated by Django 3.1.5 on 2022-01-16 21:09
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('events', '0006_auto_20220114_2319'),
]
operations = [
migrations.AddField(
model_name='event',
name='auto_match',
field=models.BooleanField(default=False),
),
]

View File

41
src/events/models.py Normal file
View File

@ -0,0 +1,41 @@
from django.db import models
from django.contrib.auth.models import User
from django.contrib.auth.models import timezone
import uuid
# Create your models here.
class Event(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
name = models.CharField(max_length=200)
logo = models.CharField(max_length=200)
img = models.CharField(max_length=200)
description = models.TextField()
start_date = models.DateTimeField()
end_date = models.DateTimeField()
password = models.CharField(max_length=200, blank=True)
slug = models.SlugField(max_length=55)
team_size = models.PositiveIntegerField(default=1)
auto_match = models.BooleanField(default=False)
def __str__(self):
return self.name
class Team(models.Model):
name = models.CharField(max_length=200)
password = models.CharField(max_length=200)
event = models.ForeignKey(Event, on_delete=models.CASCADE, null=True)
score = models.PositiveIntegerField(default=0, db_index=True)
last_submission_date = models.DateTimeField('Last Submission Date', default=timezone.now)
auto = models.BooleanField(default=False)
def __str__(self):
return self.name
class EventPlayer(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
event = models.ForeignKey(Event, on_delete=models.CASCADE)
score = models.PositiveIntegerField(default=0, db_index=True)
last_submission_date = models.DateTimeField('Last Submission Date', default=timezone.now)
team = models.ForeignKey(Team, on_delete=models.CASCADE, null=True)
class Meta:
ordering = ['-score', 'last_submission_date', 'user__username']

View File

@ -0,0 +1,64 @@
{% extends 'base.html' %}
{% block content %}
{% load i18n %}
<div class="row">
<div class="col-sm-12 col-md-9">
<div class="ctf-block">
<a href="{% url 'events:event_info' event_slug=event.slug %}">< Back to event</a>
<div class="ctf-head">
<h3>{{ event.name }}</h3>
<small>{% trans "This event starts at" %} : {{ event.start_date }}</small>
</div>
<div class="ctf-footer">
<div class="col-sm-8 col-md-6 mx-auto">
{% if logged == True%}
{% if registered == False %}
<span class="message error-msg">{% trans "You need to be registered to the event." %}</span>
{% else %}
{% if exist == True %}
<span class="message error-msg">{% trans "Name already taken." %}</span>
{% endif %}
<h2>Create Team</h2>
<form method="post" action="{% url 'events:create_team' event_slug=event.slug %}" class="create-team-form">
{% csrf_token %}
<div class="form-group">
<input class="form-control" type="text" name="teamname" placeholder="{% trans "Team name" %} *" maxlength="150" required="" id="id_teamname"></br>
<input class="form-control" type="password" name="password" placeholder="{% trans "Password" %} *" required="" id="id_password"></br>
<input type="submit" name="" class="form-control" value="{% trans "Create Team" %}">
</div>
</form>
{% endif %}
{% else %}
<h4>{% trans "You need to be logged to access this event." %}</h4>
{% endif %}
</div>
</div>
</div>
</div>
<div class="d-none d-md-block col-10 col-md-3 right-sidebar">
<ul class="list-group">
<li class="list-group-item">{{ event.name }}</li>
<li class="list-group-item">{% trans "Starts at" %} : <span style="position:absolute;right: 15px;">{{ event.start_date | date:'H:i d-m-y'}}</span></li>
<li class="list-group-item">{% trans "Ends at" %} : <span style="position:absolute;right: 15px;">{{ event.end_date | date:'H:i d-m-y'}}</span></li>
</ul>
<ul class="list-group">
<li class="list-group-item">{% trans "Manage my team" %}</li>
<a href="{% url 'events:join_team' event_slug=event.slug %}" class="list-group-item">→{% trans "Join Team" %}</a>
<a href="{% url 'events:create_team' event_slug=event.slug %}" class="list-group-item">{% trans "Create Team" %}</a>
</ul>
{% if event.auto_match %}
<ul class="list-group">
<li class="list-group-item">{% trans "Auto-matching" %}</li>
<form method='GET' action="{% url 'events:find_team' event_slug=event.slug %}">
{%csrf_token%}
<li class="list-group-item">
<input class="form-control" type="submit" value="{% trans "Find me a team !" %}">
</li>
</form>
</ul>
{% endif %}
</div>
</div>
{% endblock %}

View File

@ -0,0 +1,104 @@
{% extends 'base.html' %}
{% block content %}
{% load i18n %}
{% load is_member %}
<div class="row">
<div class="col-sm-12 col-md-9">
<div class="ctf-block">
<a href="{% url 'events:event_info' event_slug=event.slug %}">< Back to event</a>
<div class="ctf-head">
<h2>{% trans "Event" %} - {{ event.name }}</h2>
<h4>{{ ctf.name }}</h4>
<small>{% trans "Published date" %} : {{ ctf.pub_date }}</small>
</div>
<div class="ctf-body">
{% if description %}
{{ description|safe }}
{% else %}
{% trans "No translation available. Please try another language (English or French)." %}
{% endif %}
</div>
<div class="ctf-footer">
{% if request.user.is_authenticated %}
{% if congrat == True %}
<p>{% trans "Congratulation !" %}</p>
{% elif alreadyflag == True %}
<p>{% trans "Already flagged" %}</p>
{% elif eventisover == True %}
<p>{% trans "This event is over." %}</p>
{% elif errorform == True %}
<p>{% trans "Error while processing your request. (Invalid Form)" %}</p>
{% elif notsub == True %}
<span class="message error-msg">{% trans "Error: you're not registered to this event, so you can't register scores, fucking logic." %}</span>
{% elif noteam == True %}
<span class="message error-msg">{% trans "This is a team event, please create or join a team before submitting flags." %}</span>
{% if ctf.ctf_url %}
<a class="begin-ctf-link" target="_blank" href="{{ ctf.ctf_url }}">{% trans "Start the challenge" %}</a></br>
{% elif ctf.file %}
<a class="begin-ctf-link" target="_blank" href="{{ ctf.file.url }}">{% trans "Download" %}</a></br>
{% endif %}
{% else %}
{% if wrongflag == True %}
<p>{% trans "Wrong flag ! You can do it !" %}</p>
{% endif %}
{% if ctf.ctf_url %}
<a class="begin-ctf-link" target="_blank" href="{{ ctf.ctf_url }}">{% trans "Start the challenge" %}</a></br>
{% elif ctf.file %}
<a class="begin-ctf-link" target="_blank" href="{{ ctf.file.url }}">{% trans "Download" %}</a></br>
{% endif %}
<form method="post" action="{% url 'events:submit_event_flag' event_slug=event.slug chall_slug=ctf.slug %}" class="submitflag-form">
{% csrf_token %}
<input type="text" name="flag" maxlength="100" required="" id="id_flag">
<input class="form-control" type="submit" value=">">
</form>
{% endif %}
{% endif %}
</div>
</div>
<div>
<h4>{% trans "Solved by" %}</h4>
{% if solved_list %}
<table class="table table-dark">
<thead>
<tr>
<th scope="col">{% trans "Username" %}</th>
<th scope="col">{% trans "Website" %}</th>
<th scope="col">{% trans "Date" %}</th>
</tr>
</thead>
<tbody>
{% for s in solved_list %}
{% if event.team_size == 1%}
{% ismember s.0.userprofileinfo as is_member %}
<tr>
<th scope="row"><a class="profile_link {{is_member}}" href="{% url 'events:profile' user_name=s.0.username event_slug=event.slug %}"> {{ s.0.username }}</a></th>
<td>{{ s.0.userprofileinfo.portfolio_site }}</td>
<td>{{ s.1 }}</td>
</tr>
{% else %}
<tr>
<th scope="row"><a class="profile_link" href="{% url 'events:team_info' name=s.2 event_slug=event.slug %}"> {{ s.2 }}</a></th>
<td></td>
<td>{{ s.1 }}</td>
</tr>
{% endif %}
{% endfor %}
</tbody>
</table>
{% else %}
<p>{% trans "Nobody has solved this challenge yet." %}</p>
{% endif %}
</div>
</div>
<div class="d-none d-md-block col-10 col-md-3 right-sidebar">
{% ismember ctf.author.userprofileinfo as is_member %}
<ul class="list-group">
<li class="list-group-item">{% trans "Author" %} : <a style="position:absolute;right: 15px;" class="profile_link {{is_member}}" href="{% url 'accounts:profile' user_name=ctf.author.username %}">{{ ctf.author.username }}</a></li>
<li class="list-group-item">{% trans "Point reward" %} : <span style="position:absolute;right: 15px;">{{ ctf.points }}</span></li>
</ul>
</div>
</div>
{% endblock %}

View File

@ -0,0 +1,137 @@
{% extends 'base.html' %}
{% block content %}
{% load i18n %}
{% load is_flagged %}
{% load is_member %}
<div class="row">
<div class="col-sm-12 col-md-9">
{% if subisover == True %}
<span class="message error-msg">{% trans "Subscriptions is over." %}</span>
{% endif %}
{% if alreadyregistered == True %}
<span class="message error-msg">{% trans "You're already registered to this event." %}</span>
{% endif %}
<div class="event-block">
<div class="event-head" style="background-image:linear-gradient(180deg, rgba(102,102,102,0.3) 100%, rgba(29,29,29,1) 100%),url('{{ event.img }}');">
<h3>{{ event.name }}</h3>
{% if ended == True %}
<small>{% trans "This event is over." %}</small>
{% else %}
<small>{% trans "This event start at" %} : {{ event.start_date }}</small>
{% endif %}
</div>
<div class="event-body">
{% if event.description %}
{{ event.description|safe }}
{% endif %}
</div>
<div class="event-footer">
{% if begun == True %}
<h4>{% trans "Challenges" %}</h4>
{% if ctfs %}
<div class="row">
{% for ctf in ctfs %}
<div class="col-md-4">
{% isflagged request.user ctf as flagged%}
<a href="{% url 'events:event_chall_info' event_slug=event.slug chall_slug=ctf.slug %}">
<div class="chall-card {{flagged}}">
<p>{{ ctf.category }}</p>
<p>{{ ctf.name }} - {{ ctf.points }}</p>
</div>
</a>
</div>
{% endfor %}
</div>
{% else %}
<small>{% trans "No challenges available." %}</small>
{% endif %}
{% else %}
<h4>{% trans "The event has not started yet." %}</h4>
{% endif %}
</div>
</div>
<div>
<h4>{% trans "ScoreBoard" %}</h4>
{% if solved_list %}
{% if event.team_size == 1 %}
<table class="table table-dark">
<thead>
<tr>
<th scope="col">{% trans "Rank" %}</th>
<th scope="col">{% trans "Username" %}</th>
<th scope="col">{% trans "Website" %}</th>
<th scope="col">{% trans "Score" %}</th>
</tr>
</thead>
<tbody>
{% for s in solved_list %}
<tr>
{% ismember s.user.userprofileinfo as is_member %}
<th scope="row"># {{ forloop.counter0|add:1 }}</th>
<th scope="row">
<a class="profile_link {{is_member}}" href="{% url 'events:profile' user_name=s.user.username event_slug=event.slug %}"> {{ s.user.username }}</a>
</th>
<td>{{ s.user.userprofileinfo.site }}</td>
<td>{{ s.score }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% else %}
<table class="table table-dark">
<thead>
<tr>
<th scope="col">{% trans "Rank" %}</th>
<th scope="col">{% trans "Team" %}</th>
<th scope="col">{% trans "Score" %}</th>
</tr>
</thead>
<tbody>
{% for s in solved_list %}
<tr>
<th scope="row"># {{ forloop.counter0|add:1 }}</th>
<th scope="row">
<a class="profile_link" href="{% url 'events:team_info' name=s.name event_slug=event.slug %}"> {{ s.name }}</a>
</th>
<td>{{ s.score }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endif %}
{% else %}
<p>{% trans "No one have earn point yet, you gonna be the first ?" %}</p>
{% endif %}
</div>
</div>
<div class="d-none d-md-block col-10 col-md-3 right-sidebar">
<ul class="list-group">
<li class="list-group-item">{{ event.name }}</li>
<li class="list-group-item">{% trans "Starts at" %} : <span style="position:absolute;right: 15px;">{{ event.start_date | date:'H:i d-m-y'}}</span></li>
<li class="list-group-item">{% trans "Ends at" %} : <span style="position:absolute;right: 15px;">{{ event.end_date | date:'H:i d-m-y'}}</span></li>
{% if ended == False and IsRegistered == False %}
<form method='POST' action="{% url 'events:register_event' event_slug=event.slug %}">
{%csrf_token%}
<li class="list-group-item">
<input class="form-control" type="submit" value="{% trans "Register" %}">
</li>
</form>
{% endif %}
</ul>
{% if event.team_size > 1 and IsRegistered == True and ended == False %}
<ul class="list-group">
<form method='GET' action="{% url 'events:manage_team' event_slug=event.slug %}">
{%csrf_token%}
<li class="list-group-item">
<input class="form-control" type="submit" value="{% trans "Manage my team" %}">
</li>
</form>
</ul>
{% endif %}
</div>
</div>
{% endblock %}

View File

@ -0,0 +1,43 @@
{% extends 'base.html' %}
{% block content %}
{% load i18n %}
<div class="row">
<div class="col-sm-12 col-md-9">
<div class="ctf-block">
<div class="ctf-head">
<h3>{{ event.name }}</h3>
<small>{% trans "This event start at" %} : {{ event.start_date }}</small>
</div>
<div class="ctf-footer">
{% if logged == True %}
{% if wrongpwd == True %}
<span class="message error-msg">{% trans "Wrong password submited." %}</span>
{% endif %}
{% if alreadyregistered == True %}
<span class="message error-msg">{% trans "You're already registered to this event." %}</span>
{% endif %}
<h4>{% trans "This event is password protected" %}</h4>
<small>{% trans "You need to submit the event password to gain access to this event." %}</small>
<form method="post" action="{% url 'events:submit_pwd' event_slug=event.slug %}" class="submitflag-form">
{% csrf_token %}
<input type="text" name="password" maxlength="48" required="">
<input class="form-control" type="submit" value=">">
</form>
{% else %}
<h4>{% trans "You need to be logged to access this event." %}</h4>
{% endif %}
</div>
</div>
</div>
<div class="d-none d-md-block col-10 col-md-3 right-sidebar">
<ul class="list-group">
<li class="list-group-item">{{ event.name }}</li>
<li class="list-group-item">{% trans "Starts at" %} : {{ event.start_date | date:'H:i d-m-y'}}</li>
<li class="list-group-item">{% trans "Ends at" %} : {{ event.end_date | date:'H:i d-m-y'}}</li>
</ul>
</div>
</div>
{% endblock %}

View File

@ -0,0 +1,49 @@
{% extends 'base.html' %}
{% block content %}
{% load i18n %}
<div class="row">
<div class="col-12">
<h3>{% trans "Events" %}</h3>
</div>
{% if events %}
{% for ev in events %}
{% if curdate > ev.end_date %}
<div class="col-md-3 is-over">
{% else %}
<div class="col-md-3">
{% endif %}
<div class="event-card">
<img
src="{{ev.logo}}"
class="card-img-top"
alt="{{ ev.name }}"
/>
<div class="card-body">
<h5 class="card-title">
{{ ev.name }}
</h5>
</div>
<ul class="list-group list-group-flush text-center">
<li class="list-group-item">
{{ ev.start_date }} <br> - <br> {{ ev.end_date }}
<br>
{% if curdate > ev.end_date %}
<span class="badge badge-pill badge-secondary">Finished</span>
{% else %}
<span class="badge badge-pill badge-success">Open</span>
{% endif %}
</li>
</ul>
<div class="card-body text-center">
<a href="{% url 'events:event_info' event_slug=ev.slug %}" class="card-link">{% trans "See more" %}</a>
</div>
</div>
</div>
{% endfor %}
{% else %}
<p>{% trans "No events available." %}</p>
{% endif %}
</div>
</div>
{% endblock %}

View File

@ -0,0 +1,69 @@
{% extends 'base.html' %}
{% block content %}
{% load i18n %}
<div class="row">
<div class="col-sm-12 col-md-9">
<div class="ctf-block">
<a href="{% url 'events:event_info' event_slug=event.slug %}">< Back to event</a>
<div class="ctf-head">
<h3>{{ event.name }}</h3>
<small>{% trans "This event starts at" %} : {{ event.start_date }}</small>
</div>
<div class="ctf-footer">
<div class="col-sm-8 col-md-6 mx-auto">
{% if logged == True%}
{% if registered == False %}
<span class="message error-msg">{% trans "You need to be registered to the event." %}</span>
{% else %}
{% if notexist == True %}
<span class="message error-msg">{% trans "Team does not exist." %}</span>
{% elif wrongpwd == True %}
<span class="message error-msg">{% trans "Wrong password submited." %}</span>
{% elif max == True %}
<span class="message error-msg">{% trans "Maximum size reached." %}</span>
{% elif exist == True %}
{% endif %}
<h2>Join Team</h2>
<form method="post" action="{% url 'events:join_team' event_slug=event.slug %}" class="join-team-form">
{% csrf_token %}
<div class="form-group">
<input class="form-control" type="text" name="teamname" placeholder="{% trans "Team name" %} *" maxlength="150" required="" id="id_teamname"></br>
<input class="form-control" type="password" name="password" placeholder="{% trans "Password" %} *" required="" id="id_password"></br>
<input type="submit" name="" class="form-control" value="{% trans "Join Team" %}">
</div>
</form>
{% endif %}
{% else %}
<h4>{% trans "You need to be logged to access this event." %}</h4>
{% endif %}
</div>
</div>
</div>
</div>
<div class="d-none d-md-block col-10 col-md-3 right-sidebar">
<ul class="list-group">
<li class="list-group-item">{{ event.name }}</li>
<li class="list-group-item">{% trans "Starts at" %} : <span style="position:absolute;right: 15px;">{{ event.start_date | date:'H:i d-m-y'}}</span></li>
<li class="list-group-item">{% trans "Ends at" %} : <span style="position:absolute;right: 15px;">{{ event.end_date | date:'H:i d-m-y'}}</span></li>
</ul>
<ul class="list-group">
<li class="list-group-item">{% trans "Manage my team" %}</li>
<a href="{% url 'events:join_team' event_slug=event.slug %}" class="list-group-item">{% trans "Join Team" %}</a>
<a href="{% url 'events:create_team' event_slug=event.slug %}" class="list-group-item">{% trans "Create Team" %}</a>
</ul>
{% if event.auto_match %}
<ul class="list-group">
<li class="list-group-item">{% trans "Auto-matching" %}</li>
<form method='GET' action="{% url 'events:find_team' event_slug=event.slug %}">
{%csrf_token%}
<li class="list-group-item">
<input class="form-control" type="submit" value="{% trans "Find me a team !" %}">
</li>
</form>
</ul>
{% endif %}
</div>
</div>
{% endblock %}

View File

@ -0,0 +1,73 @@
{% extends 'base.html' %}
{% block content %}
{% load i18n %}
<div class="row">
<div class="col-sm-12 col-md-9">
<div class="ctf-block">
<a href="{% url 'events:event_info' event_slug=player.event.slug %}">< Back to event</a>
<div class="ctf-head">
<h3>Edit info</h3>
</div>
<div class="bloc-body">
<div class="col-sm-12 col-md-12 mx-auto">
<!-- {{ u_form.non_field_errors }} -->
{% if error is not None %}
<span class="message error-msg">{{ error }}</span>
{% elif success is not None %}
<span class="message success-msg">{{ success }}</span>
{% endif %}
<form method='POST'>
<div class="edit-infos-grp">
{%csrf_token%}
<label for="{{ p_form.name.id_for_label }}">{% trans "Team name" %} *</label>
{{ p_form.name.errors}}
{{p_form.name}}
</br>
<label for="{{ p_form.password.id_for_label }}">{% trans "Team password" %} *</label>
{{p_form.password}}
</br>
<input class="form-control" type="submit" value="{% trans "Apply" %}">
</div>
</form>
</div>
</div>
</div>
</div>
<div class="d-none d-md-block col-10 col-md-3 right-sidebar">
<ul class="list-group">
<li class="list-group-item">{{ player.team.name }}</li>
<li class="list-group-item">{% trans "Score" %} : {{ player.team.score }}</li>
<!-- <li class="list-group-item">{% trans "Rank" %} : {{ rank }}</li> -->
</ul>
<ul class="list-group">
<li class="list-group-item">{% trans "Members" %}</li>
{% for p in members %}
<li class="list-group-item"><a class="profile_link" href="{% url 'accounts:profile' user_name=p.user.username %}">{{ p.user.username }}</a></li>
{% endfor %}
</ul>
<form method='POST' action="{% url 'events:leave_team' event_slug=player.event.slug %}">
{%csrf_token%}
<li class="list-group-item">
<input class="form-control" type="submit" value="{% trans "Leave Team" %}">
</li>
</form>
{% if player.team.auto == False and player.event.auto_match == True %}
<form method='POST' action="{% url 'events:open_team' event_slug=player.event.slug %}">
{%csrf_token%}
<li class="list-group-item">
<input class="form-control" type="submit" value="{% trans "Open to automatching" %}">
</li>
</form>
{% elif player.event.auto_match == True %}
<form method='POST' action="{% url 'events:close_team' event_slug=player.event.slug %}">
{%csrf_token%}
<li class="list-group-item">
<input class="form-control" type="submit" value="{% trans "Close to automatching" %}">
</li>
</form>
{% endif %}
</div>
</div>
{% endblock %}

View File

@ -0,0 +1,145 @@
{% extends 'base.html' %}
{% block content %}
{% load i18n %}
{% load key_value %}
<div class="row">
<div class="col-sm-12 col-md-9">
<a href="{% url 'events:event_info' event_slug=event.slug %}">< Back to event</a>
<div>
<h4>Challenges Solved by {{ team.name }} - {{ event.name }}</h4>
{% if solves%}
<div class="table table-dark">
<div class="card-body">
<div id="time-chart"></div>
</div>
</div>
<table class="table table-dark">
<thead>
<tr>
<th scope="col">{% trans "Challenge Name" %}</th>
<th scope="col">{% trans "Category" %}</th>
<th scope="col">{% trans "Points" %}</th>
<th scope="col">{% trans "Date" %}</th>
</tr>
</thead>
<tbody>
{% for s in solves %}
<tr>
<th scope="row"><a href="{% url 'events:event_chall_info' event_slug=event.slug chall_slug=s.ctf.slug %}">{{ s.ctf.name }}</a></th>
<td>{{ s.ctf.category.name}}</td>
<td>{{ s.ctf.points }}</td>
<td>{{ s.flag_date|date:"Y-m-d H:i:s" }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% else %}
<p>{% trans "It seems that this team has not solved any challenge yet..." %}</p>
{% endif %}
</div>
</div>
<div class="d-none d-md-block col-10 col-md-3 right-sidebar">
<ul class="list-group">
<li class="list-group-item">{{ team.name }}</li>
<li class="list-group-item">{% trans "Score" %} : {{ score }}</li>
<li class="list-group-item">{% trans "Rank" %} : {{ rank }}</li>
</ul>
<ul class="list-group">
<li class="list-group-item">{% trans "Members" %}</li>
{% for user in users %}
<li class="list-group-item"><a class="profile_link" href="{% url 'accounts:profile' user_name=user.username %}">{{ user.username }}</a></li>
{% endfor %}
</ul>
<ul class="list-group">
<li class="list-group-item">{% trans "Categories stats" %}</li>
{% for cat in catsDatas %}
<li class="list-group-item" style="padding-bottom: 3;padding-top: 0;">
<span>{{ cat.0 }}</span>
<div class="progress">
{% if cat.3 == '0' %}
<div class="progress-bar bg-success" role="progressbar" style="width: 0%;color:#d9d9d9;" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100">0 %</div>
{% else %}
<div class="progress-bar bg-success" role="progressbar" style="width: {{ cat.3 }}%" aria-valuenow="{{ cat.3 }}" aria-valuemin="0" aria-valuemax="100">{{ cat.3 }} %</div>
{% endif %}
</div>
</li>
{% endfor %}
</ul>
</div>
</div>
<script src="https://code.highcharts.com/highcharts.src.js"></script>
<script>
Highcharts.theme={colors:["#2b908f","#90ee7e","#f45b5b","#7798BF","#aaeeee","#ff0066","#eeaaee","#55BF3B","#DF5353","#7798BF","#aaeeee"],chart:{backgroundColor:{linearGradient:{x1:0,y1:0,x2:1,y2:1},stops:[[0,"#1D1D1D"],[1,"#1D1D1D"]]},style:{fontFamily:"'Unica One', sans-serif"},plotBorderColor:"#606063"},title:{style:{color:"#E0E0E3",textTransform:"uppercase",fontSize:"20px"}},subtitle:{style:{color:"#E0E0E3",textTransform:"uppercase"}},xAxis:{gridLineColor:"#707073",labels:{style:{color:"#E0E0E3"}},lineColor:"#707073",minorGridLineColor:"#505053",tickColor:"#707073",title:{style:{color:"#A0A0A3"}}},yAxis:{gridLineColor:"#707073",labels:{style:{color:"#E0E0E3"}},lineColor:"#707073",minorGridLineColor:"#505053",tickColor:"#707073",tickWidth:1,title:{style:{color:"#A0A0A3"}}},tooltip:{backgroundColor:"rgba(0, 0, 0, 0.85)",style:{color:"#F0F0F0"}},plotOptions:{series:{dataLabels:{color:"#F0F0F3",style:{fontSize:"13px"}},marker:{lineColor:"#333"}},boxplot:{fillColor:"#505053"},candlestick:{lineColor:"white"},errorbar:{color:"white"}},legend:{backgroundColor:"#1D1D1D",itemStyle:{color:"#E0E0E3"},itemHoverStyle:{color:"#FFF"},itemHiddenStyle:{color:"#606063"},title:{style:{color:"#C0C0C0"}}},credits:{style:{color:"#666"}},labels:{style:{color:"#707073"}},drilldown:{activeAxisLabelStyle:{color:"#F0F0F3"},activeDataLabelStyle:{color:"#F0F0F3"}},navigation:{buttonOptions:{symbolStroke:"#DDDDDD",theme:{fill:"#505053"}}},rangeSelector:{buttonTheme:{fill:"#505053",stroke:"#000000",style:{color:"#CCC"},states:{hover:{fill:"#707073",stroke:"#000000",style:{color:"white"}},select:{fill:"#000003",stroke:"#000000",style:{color:"white"}}}},inputBoxBorderColor:"#505053",inputStyle:{backgroundColor:"#333",color:"silver"},labelStyle:{color:"silver"}},navigator:{handles:{backgroundColor:"#666",borderColor:"#AAA"},outlineColor:"#CCC",maskFill:"rgba(255,255,255,0.1)",series:{color:"#7798BF",lineColor:"#A6C7ED"},xAxis:{gridLineColor:"#505053"}},scrollbar:{barBackgroundColor:"#808083",barBorderColor:"#808083",buttonArrowColor:"#CCC",buttonBackgroundColor:"#606063",buttonBorderColor:"#606063",rifleColor:"#FFF",trackBackgroundColor:"#404043",trackBorderColor:"#404043"}};
Highcharts.setOptions(Highcharts.theme);
Highcharts.chart('time-chart', {
title: {
text: 'Points earned for each category'
},
yAxis: {
title: {
text: 'Points earned'
}
},
xAxis: {
type: 'datetime',
labels: {
formatter: function() {
return Highcharts.dateFormat('%d.%b %Y',
this.value);
}
}
},
legend: {
layout: 'vertical',
align: 'right',
verticalAlign: 'middle'
},
plotOptions: {
pointStart: {{ event.start_date|timestamp_fromdate }},
series: {
label: {
connectorAllowed: false
},
allowPointSelect: true,
marker: {
enabled: true
}
}
},
series: [
{
name: 'Total',
data: {{ solved|safe }}
},
{% for cat in cats %}
{
name: '{{ cat.name }}',
data: {{ pointDatas|keyvalue:cat.name|safe }},
visible: false,
},
{% endfor %}
],
responsive: {
rules: [{
condition: {
maxWidth: 500
},
chartOptions: {
legend: {
layout: 'horizontal',
align: 'center',
verticalAlign: 'bottom'
}
}
}]
}
});
</script>
{% endblock %}

View File

View File

@ -0,0 +1,27 @@
from django import template
from ctfs.models import CTF_flags
from events.models import EventPlayer
register = template.Library()
@register.simple_tag
def isflagged(user, ctf):
flagged = False
event_info = ctf.event
if user.is_authenticated == False:
return ""
if event_info.team_size == 1:
if CTF_flags.objects.filter(user=user, ctf=ctf):
flagged = True
elif EventPlayer.objects.filter(user=user, event=event_info):
player = EventPlayer.objects.get(user=user, event=event_info)
solved_list = CTF_flags.objects.filter(ctf=ctf)
for s in solved_list:
tmp = EventPlayer.objects.get(user=s.user, event=event_info)
if tmp.team == player.team:
flagged = True
if flagged:
return "success-msg"
return ""

3
src/events/tests.py Normal file
View File

@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

22
src/events/urls.py Normal file
View File

@ -0,0 +1,22 @@
from django.urls import path
from . import views
app_name = "events"
urlpatterns = [
path('', views.events, name='events'),
path('<str:event_slug>', views.event, name='event_info'),
path('<str:event_slug>/challenge/<str:chall_slug>', views.chall_event_info, name='event_chall_info'),
path('pwd/<str:event_slug>', views.submit_pwd, name='submit_pwd'),
path('submitEventFlag/<str:event_slug>/<str:chall_slug>', views.submit_event_flag, name='submit_event_flag'),
path('register/<str:event_slug>', views.register_to_event, name='register_event'),
path('create_team/<str:event_slug>', views.create_team, name='create_team'),
path('join_team/<str:event_slug>', views.join_team, name='join_team'),
path('<str:event_slug>/profile/<str:user_name>', views.profile, name='profile'),
path('<str:event_slug>/team/<str:name>', views.team_info, name='team_info'),
path('<str:event_slug>/manage_team', views.manage_team, name='manage_team'),
path('<str:event_slug>/leave_team', views.leave_team, name='leave_team'),
path('find_team/<str:event_slug>', views.find_team, name='find_team'),
path('<str:event_slug>/open_team', views.open_team, name='open_team'),
path('<str:event_slug>/close_team', views.close_team, name='close_team'),
]

10
src/events/utils.py Normal file
View File

@ -0,0 +1,10 @@
from random import choice, randint
colors = ['blue', 'red', 'yellow', 'green', 'black', 'white', 'purple', 'orange', 'brown', 'fuchsia', 'gold', 'pink', 'cyan',
'magenta', 'pearl']
animals = ['tiger', 'bee', 'dog', 'cat', 'otter', 'lizard', 'horse', 'mouse', 'butterfly', 'dolphin', 'elephant', 'falcon', 'goat',
'cow', 'lion', 'ostrich']
def get_random_name():
return choice(colors) + choice(animals) + str(randint(0, 100))

View File

@ -0,0 +1,2 @@
from .events import *
from .teams import *

259
src/events/views/events.py Normal file
View File

@ -0,0 +1,259 @@
from django.shortcuts import render, get_object_or_404, redirect
from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import timezone
from ..forms import submit_flag
from ..models import Event, EventPlayer, Team
from ctfs.models import CTF, CTF_flags, Category
from django.utils.translation import get_language
from django.contrib.auth.models import User
from django.utils.translation import gettext_lazy as _
def get_description_by_lang(ctf):
lang = get_language()
ret = None
if lang == "fr":
ret = ctf.description
elif lang == "en":
ret = ctf.description_en
elif lang == "de":
ret = ctf.description_de
elif lang == "ru":
ret = ctf.description_ru
return ret
# Create your views here.
def events(request):
list_events = Event.objects.filter().order_by('-end_date', 'start_date')
return render(request, 'events/events_list.html', {'events' : list_events, 'curdate': timezone.now()})
def chall_event_info(request, event_slug, chall_slug):
event_info = get_object_or_404(Event, slug=event_slug)
ctf_info = get_object_or_404(CTF, event__slug=event_info.slug, slug=chall_slug)
if timezone.now() < ctf_info.pub_date:
return redirect('events:event_info', event_slug=event_slug)
eventisover = False
alreadyflag = False
congrat = False
wrongflag = False
errorform = False
notsub = False
noteam = False
player = None
if request.user.is_authenticated and not request.user.is_staff:
player = EventPlayer.objects.filter(event=event_info, user=request.user)
if not player:
return redirect('events:event_info', event_slug=event_slug)
elif not request.user.is_authenticated:
return redirect('accounts:signin')
if request.GET.get('EventIsOver'):
eventisover = True
if request.GET.get('AlreadyFlagged'):
alreadyflag = True
if request.GET.get('Congrat'):
congrat = True
if request.GET.get('WrongFlag'):
wrongflag = True
if request.GET.get('ErrorInForm'):
errorform = True
if request.GET.get('NotRegistered'):
notsub = True
if request.GET.get('NoTeam'):
noteam = True
solved_challs = CTF_flags.objects.filter(ctf=ctf_info).order_by('flag_date')
solved_list = []
for s in solved_challs:
if event_info.team_size > 1:
solved_list.append([s.user, s.flag_date, EventPlayer.objects.get(event=event_info, user=s.user).team.name])
else:
solved_list.append([s.user, s.flag_date])
description = get_description_by_lang(ctf_info)
return render(request, 'events/ctf_info.html', { 'ctf' : ctf_info, 'event':event_info, 'solved_list': solved_list, 'description': description, 'eventisover': eventisover, 'alreadyflag': alreadyflag,
'congrat': congrat, 'wrongflag': wrongflag, 'errorform': errorform, 'notsub': notsub, 'noteam':noteam})
def event(request, event_slug):
event_info = get_object_or_404(Event, slug=event_slug)
IsRegistered = False
wrongpwd = False
alreadyregistered = False
subisover = False
if request.GET.get('WrongPassword'):
wrongpwd = True
if request.GET.get('AlreadyRegistered'):
alreadyregistered = True
if request.GET.get('SubscriptionIsOver'):
subisover = True
if request.user.is_authenticated:
try:
player = EventPlayer.objects.get(event=event_info, user=request.user)
except:
player = None
if player:
IsRegistered = True
if event_info.password:
if request.user.is_authenticated:
if request.user.is_staff is False:
if not player:
return render(request, 'events/event_pwd.html', {'event' : event_info, 'logged': True, 'wrongpwd': wrongpwd, 'alreadyregistered': alreadyregistered})
else:
return render(request, 'events/event_pwd.html', {'event' : event_info, 'logged': False, 'wrongpwd': wrongpwd, 'alreadyregistered': alreadyregistered})
ended = False
if timezone.now() >= event_info.end_date:
ended = True
begun = False
if timezone.now() >= event_info.start_date:
begun = True
challenges = CTF.objects.filter(event=event_info).order_by('category', 'points')
if event_info.team_size == 1:
solved_list = EventPlayer.objects.filter(event=event_info).order_by('-score', 'last_submission_date', 'user__username')
else:
solved_list = Team.objects.filter(event=event_info).order_by('-score', 'last_submission_date', 'name')
return render(request, 'events/event_info.html', {'event' : event_info, 'IsRegistered': IsRegistered, 'ctfs': challenges, 'solved_list':solved_list,
'ended': ended, 'begun': begun, 'wrongpwd': wrongpwd, 'alreadyregistered': alreadyregistered, 'subisover': subisover})
@login_required
def submit_event_flag(request, event_slug, chall_slug):
ev = get_object_or_404(Event, slug=event_slug)
response = redirect('events:event_chall_info', event_slug=event_slug, chall_slug=chall_slug)
if timezone.now() >= ev.end_date:
response['Location'] += '?EventIsOver=1'
return response
if request.method == 'POST':
ctf_info = CTF.objects.get(event=ev, slug=chall_slug)
if not ctf_info:
response['Location'] += '?ChallengeNotFound=1'
return response
flagged = False
player = EventPlayer.objects.get(user=request.user, event=ev)
if player:
if ev.team_size > 1 and player.team is None:
response['Location'] += '?NoTeam=1'
return response
if ev.team_size == 1 and CTF_flags.objects.filter(user=request.user, ctf=ctf_info):
flagged = True
else:
solved_list = CTF_flags.objects.filter(ctf=ctf_info)
for s in solved_list:
tmp = EventPlayer.objects.get(user=s.user, event=ev)
if tmp.team == player.team:
flagged = True
if flagged == True:
response['Location'] += '?AlreadyFlagged=1'
return response
form = submit_flag(data=request.POST)
if form.is_valid():
if ctf_info.flag == request.POST.get('flag'):
new = CTF_flags(user = request.user, ctf = ctf_info, flag_date = timezone.now())
new.save()
if ctf_info.points > 0:
player.last_submission_date = timezone.now()
player.score += ctf_info.points
player.save()
if player.team:
if ctf_info.points > 0:
player.team.last_submission_date = timezone.now()
player.team.score += ctf_info.points
player.team.save()
response['Location'] += '?Congrat=1'
return response
else:
response['Location'] += '?WrongFlag=1'
return response
else:
response['Location'] += '?ErrorInForm=1'
return response
else:
response['Location'] += '?NotRegistered=1'
return response
return response
@login_required
def submit_pwd(request, event_slug):
response = redirect('events:event_info', event_slug=event_slug)
event_info = get_object_or_404(Event, slug=event_slug)
if request.method == 'POST':
if request.user.is_authenticated:
ev = get_object_or_404(Event, slug=event_slug)
if ev == False:
response['Location'] += '?NoEventFound=1'
return response
if request.POST.get('password') != ev.password:
response['Location'] += '?WrongPassword=1'
return response
if EventPlayer.objects.filter(user=request.user, event=ev).exists() or EventPlayer.objects.filter(user=request.user, event=ev).exists():
response['Location'] += '?AlreadyRegistered=1'
return response
else:
new = EventPlayer(user=request.user, event=ev)
new.save()
return redirect('events:event_info', event_slug=event_slug)
@login_required
def register_to_event(request, event_slug):
response = redirect('events:event_info', event_slug=event_slug)
if request.method == 'POST':
if request.user.is_authenticated:
ev = get_object_or_404(Event, slug=event_slug)
if ev == False:
response['Location'] += '?NoEventFound=1'
return response
if timezone.now() >= ev.end_date:
response['Location'] += '?SubscriptionIsOver=1'
return response
if EventPlayer.objects.filter(user=request.user, event=ev).exists():
response['Location'] += '?AlreadyRegistered=1'
return response
else:
new = EventPlayer(user=request.user, event=ev, score=0)
new.save()
return redirect('events:event_info', event_slug=event_slug)
@login_required
def profile(request, user_name, event_slug):
catsDatas = []
event_info = get_object_or_404(Event, slug=event_slug)
user_obj = get_object_or_404(User, username=user_name)
player = EventPlayer.objects.get(user=user_obj, event=event_info)
all_players = list(EventPlayer.objects.filter(event=event_info).order_by('-score', 'last_submission_date', 'user__username'))
rank = all_players.index(get_object_or_404(EventPlayer, user=user_obj, event=event_info)) + 1
all_cats = Category.objects.all()
cats = [cat for cat in all_cats if CTF.objects.filter(category__name=cat.name, event=event_info)]
pointDatas = {}
for cat in cats:
# prepare categories
solved_count = CTF_flags.objects.filter(user=user_obj, ctf__event=event_info , ctf__category__name=cat.name).count()
max_count = CTF.objects.filter(category__name=cat.name, event=event_info).count()
# get datas
somme = 0
solved = CTF_flags.objects.filter(user=user_obj, ctf__category__name=cat.name, ctf__event=event_info).order_by('flag_date')
pointDatas[cat.name] = []
pointDatas[cat.name].append([event_info.start_date.timestamp() * 1000, 0])
percent = (solved_count / max_count) * 100
catsDatas.append([cat.name, solved_count, max_count, '{:.0f}'.format(percent)])
for flag in solved:
somme += flag.ctf.points
pointDatas[cat.name].append([flag.flag_date.timestamp() * 1000, somme])
solves = CTF_flags.objects.filter(user=user_obj, ctf__event=event_info).order_by('-flag_date')
solved = []
somme = 0
solved.append([event_info.start_date.timestamp() * 1000, 0])
for s in solves.reverse():
somme += s.ctf.points
solved.append([s.flag_date.timestamp() * 1000,somme])
return render(request,'accounts/profile.html', {'user':user_obj, 'solves':solves,'solved':solved,'catsDatas': catsDatas, 'pointDatas': pointDatas,
'rank': rank, 'score' : somme, 'cats':cats})

201
src/events/views/teams.py Normal file
View File

@ -0,0 +1,201 @@
from django.shortcuts import render, get_object_or_404, redirect
from django.contrib.auth.decorators import login_required
from ..forms import TeamUpdateForm
from ..models import Event, EventPlayer, Team
from ctfs.models import CTF, CTF_flags, Category
from django.contrib.auth.models import User
from django.db.models import Q
from django.utils.translation import gettext_lazy as _
from ..utils import get_random_name
from random import randint
@login_required
def create_team(request, event_slug):
ev = get_object_or_404(Event, slug=event_slug)
if request.method == 'POST':
if request.user.is_authenticated and ev.team_size > 1:
if Team.objects.filter(name=request.POST.get('teamname'), event=ev).exists():
return render(request, 'events/create_team.html', {'event' : ev, 'logged': True, 'wrongpwd': False, 'registered' : True, 'exist' : True})
new = Team(name=request.POST.get('teamname'), password=request.POST.get('password'), event=ev)
new.save()
player = EventPlayer.objects.get(user=request.user, event=ev)
player.team = new
player.save()
return redirect('events:event_info', event_slug=event_slug)
else:
return render(request, 'events/create_team.html', {'event' : ev, 'logged': True, 'wrongpwd': False, 'registered' : True, 'exist' : False})
@login_required
def join_team(request, event_slug):
ev = get_object_or_404(Event, slug=event_slug)
if request.method == 'POST':
if request.user.is_authenticated and ev.team_size > 1:
try:
team = Team.objects.get(name=request.POST.get('teamname'), event=ev)
except:
team = None
if team is None:
return render(request, 'events/join_team.html', {'event' : ev, 'logged': True, 'wrongpwd': True, 'registered' : True, 'notexist' : True})
else:
members = EventPlayer.objects.filter(team=team)
if request.POST.get('password') != team.password:
return render(request, 'events/join_team.html', {'event' : ev, 'logged': True, 'wrongpwd': True, 'registered' : True, 'notexist' : False})
if members.count() >= ev.team_size:
return render(request, 'events/join_team.html', {'event' : ev, 'logged': True, 'wrongpwd': False, 'registered' : True, 'notexist' : False, 'max' : True})
else:
player = EventPlayer.objects.get(user=request.user, event=ev)
player.team = team
player.save()
else:
return render(request, 'events/join_team.html', {'event' : ev, 'logged': True, 'wrongpwd': False, 'registered' : True, 'notexist' : False})
@login_required
def team_info(request, name, event_slug):
event_info = get_object_or_404(Event, slug=event_slug)
team = Team.objects.get(name=name, event=event_info)
catsDatas = []
players = EventPlayer.objects.filter(team=team, event=event_info)
users = [p.user for p in players]
all_teams = list(Team.objects.filter(event=event_info).order_by('-score', 'last_submission_date', 'name'))
rank = all_teams.index(get_object_or_404(Team, id=team.id, event=event_info)) + 1
all_cats = Category.objects.all()
cats = [cat for cat in all_cats if CTF.objects.filter(category__name=cat.name, event=event_info)]
pointDatas = {}
for cat in cats:
# prepare categories
solved_count = 0
solved = []
max_count = CTF.objects.filter(category__name=cat.name, event=event_info).count()
somme = 0
pointDatas[cat.name] = [[event_info.start_date.timestamp()*1000, 0]]
for user_obj in users:
# get datas
solved_count += CTF_flags.objects.filter(user=user_obj, ctf__event=event_info , ctf__category__name=cat.name).count()
solved += CTF_flags.objects.filter(user=user_obj, ctf__category__name=cat.name, ctf__event=event_info).order_by('flag_date')
percent = (solved_count / max_count) * 100
catsDatas.append([cat.name, solved_count, max_count, '{:.0f}'.format(percent)])
for flag in solved:
somme += flag.ctf.points
pointDatas[cat.name].append([flag.flag_date.timestamp() * 1000, somme])
query = Q()
for user_obj in users:
query |= Q(user=user_obj)
query &= Q(ctf__event=event_info)
solves = CTF_flags.objects.filter(query).order_by('-flag_date')
solved = []
somme = 0
solved.append([event_info.start_date.timestamp() * 1000, 0])
for s in solves.reverse():
somme += s.ctf.points
solved.append([s.flag_date.timestamp() * 1000,somme])
return render(request,'events/team.html', {'users':users, 'solves':solves,'solved':solved,'catsDatas': catsDatas, 'pointDatas': pointDatas,
'rank': rank, 'team':team, 'score':somme, 'event':event_info, 'cats':cats})
@login_required
def manage_team(request, event_slug):
event_info = get_object_or_404(Event, slug=event_slug)
player = EventPlayer.objects.get(user=request.user, event=event_info)
if not player.team:
return render(request, 'events/create_team.html', {'event' : event_info, 'logged': True, 'wrongpwd': False, 'registered' : True, 'notexist' : False})
members = EventPlayer.objects.filter(team=player.team, event=event_info)
if request.method == 'POST':
tname = player.team.name
p_form = TeamUpdateForm(request.POST, instance=player.team)
error = None
success = None
if p_form.is_valid():
pname = p_form.cleaned_data['name']
if pname == tname:
pass
else:
if Team.objects.filter(name=pname, event=event_info).exists():
error = _("Name already taken.")
ppassword = p_form.cleaned_data['password']
if error is None:
p_form.save()
success = _("Updated.")
context={'p_form': p_form, 'error':error, 'success' : success, 'player':player, 'members':members}
return render(request, 'events/manage_team.html', context)
else:
p_form = TeamUpdateForm(instance=player.team)
context={'p_form': p_form, 'player':player, 'members':members}
return render(request, 'events/manage_team.html',context)
@login_required
def leave_team(request, event_slug):
event_info = get_object_or_404(Event, slug=event_slug)
player = EventPlayer.objects.get(user=request.user, event=event_info)
team = Team.objects.get(event=event_info, name=player.team.name)
team.score -= player.score
team.save()
player.team = None
solved = CTF_flags.objects.filter(user=player.user, ctf__event=event_info)
player.score = 0
solved.delete()
player.save()
members = EventPlayer.objects.filter(team=team, event=event_info)
if members.count() == 0:
team.delete()
return redirect('events:event_info', event_slug=event_slug)
@login_required
def find_team(request, event_slug):
event_info = get_object_or_404(Event, slug=event_slug)
teams = Team.objects.filter(event=event_info, auto=True)
team = None
player = EventPlayer.objects.get(user=request.user, event=event_info)
if event_info.auto_match == False:
return redirect('events:event_info', event_slug=event_slug)
for t in teams:
if EventPlayer.objects.filter(team=t, event=event_info).count() < event_info.team_size:
team = t
break
if team is None:
teamname = get_random_name()
while Team.objects.filter(name=teamname, event=event_info).exists():
teamname = get_random_name()
team = Team(name=teamname, password="".join([str(randint(0,10)) for _ in range(16)]), event=event_info, auto=True)
team.save()
player.team = team
player.save()
return redirect('events:event_info', event_slug=event_slug)
@login_required
def open_team(request, event_slug):
event_info = get_object_or_404(Event, slug=event_slug)
player = EventPlayer.objects.get(user=request.user, event=event_info)
if not player.team:
return render(request, 'events/create_team.html', {'event' : event_info, 'logged': True, 'wrongpwd': False, 'registered' : True, 'notexist' : False})
player.team.auto = True
player.team.save()
return redirect('events:manage_team', event_slug=event_slug)
@login_required
def close_team(request, event_slug):
event_info = get_object_or_404(Event, slug=event_slug)
player = EventPlayer.objects.get(user=request.user, event=event_info)
if not player.team:
return render(request, 'events/create_team.html', {'event' : event_info, 'logged': True, 'wrongpwd': False, 'registered' : True, 'notexist' : False})
player.team.auto = False
player.team.save()
return redirect('events:manage_team', event_slug=event_slug)

View File

@ -0,0 +1,33 @@
# Generated by Django 3.2.7 on 2021-09-07 19:12
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('home', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='new',
name='content_de',
field=models.TextField(blank=True),
),
migrations.AddField(
model_name='new',
name='content_en',
field=models.TextField(blank=True),
),
migrations.AddField(
model_name='new',
name='content_ru',
field=models.TextField(blank=True),
),
migrations.AlterField(
model_name='new',
name='content',
field=models.TextField(blank=True),
),
]

View File

@ -2,7 +2,10 @@ from django.db import models
class new(models.Model):
name = models.CharField(max_length=100)
content = models.TextField()
content = models.TextField(blank=True)
content_en = models.TextField(blank=True)
content_ru = models.TextField(blank=True)
content_de = models.TextField(blank=True)
slug = models.SlugField(max_length=55)
pub_date = models.DateTimeField('Date published')
def __str__(self):

View File

@ -0,0 +1,68 @@
{% extends 'base.html' %}
{% block content %}
{% load i18n %}
{% get_current_language as lang %}
<div class="row">
<div class="col-12 news-card">
<h2>Conditions générales d'utilisation du site 42CTF</h2>
<h5>Article 1 : Objet</h5>
Les présentes CGU ou Conditions Générales dUtilisation encadrent juridiquement lutilisation des services du site 42CTF (ci-après dénommé « le site »). <br><br>
Constituant le contrat entre les éditeurs de 42CTF et lUtilisateur, laccès au site doit être précédé de lacceptation de ces CGU. Laccès à cette plateforme signifie lacceptation des présentes CGU. <br><br>
<h5>Article 2 : Mentions légales</h5>
Lhébergeur du site 42ctf.org est la société Google LLC, sise au 1600 Amphitheatre Parkway à Mountain View, États Unis.<br><br>
<h5>Article 3 : Accès au site</h5>
Le site 42CTF permet daccéder gratuitement aux services suivants : <br>
- challenges en sécurité informatique disponibles de manière permanente<br>
- compétitions en sécurité informatique à durée limitée<br><br>
Le site est accessible gratuitement depuis nimporte où par tout utilisateur disposant dun accès à Internet. Tous les frais nécessaires pour laccès aux services (matériel informatique, connexion Internet…) sont à la charge de lutilisateur.<br>
Laccès aux services dédiés aux membres seffectue à laide dun identifiant et dun mot de passe.<br>
Pour des raisons de maintenance ou autres, laccès au site peut être interrompu ou suspendu par léditeur sans préavis ni justification.<br><br>
<h5>Article 4 : Collecte des données</h5>
Pour la création du compte de lUtilisateur, la collecte des informations au moment de linscription sur le site est nécessaire et obligatoire. Conformément à la loi n°78-17 du 6 janvier relative à linformatique, aux fichiers et aux libertés, la collecte et le traitement dinformations personnelles seffectuent dans le respect de la vie privée.<br>
Suivant la loi Informatique et Libertés en date du 6 janvier 1978, articles 39 et 40, lUtilisateur dispose du droit daccéder, de rectifier, de supprimer et dopposer ses données personnelles. Lexercice de ce droit seffectue par :<br>
- Son espace utilisateur ;<br>
- Demande écrite par mail à 42ctf@protonmail.com .<br><br>
<h5>Article 5 : Propriété intellectuelle</h5>
Les marques, logos ainsi que les contenus du site 42CTF (illustrations graphiques, textes…) sont protégés par le Code de la propriété intellectuelle et par le droit dauteur.<br>
La reproduction et la copie des contenus par lUtilisateur requièrent une autorisation préalable du site. Dans ce cas, toute utilisation à des usages commerciaux ou à des fins publicitaires est proscrite.<br><br>
<h5>Article 6 : Responsabilité</h5>
Bien que les informations publiées sur le site soient réputées fiables, le site se réserve la faculté dune non-garantie de la fiabilité des sources.<br>
Les informations diffusées sur le site 42CTF sont présentées à titre purement informatif et sont sans valeur contractuelle. En dépit des mises à jour régulières, la responsabilité du site ne peut être engagée en cas de modification des dispositions administratives et juridiques apparaissant après la publication. Il en est de même pour lutilisation et linterprétation des informations communiquées sur la plateforme.<br><br>
Le site décline toute responsabilité concernant les éventuels virus pouvant infecter le matériel informatique de lUtilisateur après lutilisation ou laccès à ce site.
Le site ne peut être tenu pour responsable en cas de force majeure ou du fait imprévisible et insurmontable dun tiers.<br>
La garantie totale de la sécurité et la confidentialité des données nest pas assurée par le site. Cependant, le site sengage à mettre en œuvre toutes les méthodes requises pour le faire au mieux.<br><br>
<h5>Article 7 : Liens hypertextes</h5>
Le site peut être constitué de liens hypertextes. En cliquant sur ces derniers, lUtilisateur sortira de la plateforme. Cette dernière na pas de contrôle et ne peut pas être tenue responsable du contenu des pages web relatives à ces liens.<br><br>
<h5>Article 8 : Cookies</h5>
En naviguant sur le site, lUtilisateur accepte les cookies. <br><br>
<h5>Article 9 : Durée du contrat</h5>
Le présent contrat est valable pour une durée indéterminée. Le début de lutilisation des services du site marque lapplication du contrat à légard de lUtilisateur.<br><br>
<h5>Article 10 : Droit applicable et juridiction compétente</h5>
Le présent contrat est soumis à la législation française. Labsence de résolution à lamiable des cas de litige entre les parties implique le recours aux tribunaux français compétents pour régler le contentieux.
</div>
</div>
{% endblock %}

View File

@ -1,14 +1,43 @@
{% extends 'base.html' %}
{% block content %}
{% load i18n %}
{% get_current_language as lang %}
{% load is_member %}
{% load get_news %}
<div class="row">
<div class="col-lg-9 col-sm-12 news-card">
<div class="col-lg-3 col-sm-12 right-sidebar middle-sm">
<ul class="list-group">
<li class="list-group-item">Top 10</li>
{% for t in top %}
{% ismember t.user.userprofileinfo as is_member %}
<li class="list-group-item text-truncate"># {{ forloop.counter }}
<a class="profile_link {{is_member}}" href="{% url 'accounts:profile' user_name=t.user.username %}"> {{ t.user.username }}</a>
<span style="position:absolute;right: 15px;">{{ t.score }}</span></li>
{% endfor %}
</ul>
<ul class="list-group">
<li class="list-group-item">{% trans "Weekly Top 5" %}</li>
{% for user, score in top_weekly %}
{% ismember user as is_member %}
<li class="list-group-item text-truncate"># {{ forloop.counter }}
<a class="profile_link {{is_member}}" href="{% url 'accounts:profile' user_name=user %}"> {{ user }}</a>
<span style="position:absolute;right: 15px;">{{ score }}</span></li>
{% endfor %}
</ul>
</div>
<div class="col-lg-6 col-sm-12 news-card top-sm">
{% if news %}
{% for n in news %}
<div class="card text-center news-card">
<div class="card-body">
<h5 class="card-title">{{ n.name|safe }}</h5>
<p class="card-text">{{ n.content|safe }}</p>
<p class="card-text">
{% get_news_by_lang n lang as content %}
{{ content | safe }}
</p>
</div>
<div class="card-footer text-muted">
{{ n.pub_date }}
@ -19,27 +48,46 @@
<p class="text-center">{% trans "No article available." %}</p>
{% endif %}
</div>
<div class="col-lg-3 col-sm-12 right-sidebar">
<div class="col-lg-3 col-sm-12 right-sidebar bottom-sm">
<ul class="list-group">
<li class="list-group-item active">{% trans "Latest challenges added" %}</li>
{% if ctfs %}
{% for ctf in ctfs %}
<a class="list-group-item" href="/ctfs/{{ ctf.category.slug }}/{{ ctf.slug }}">{{ ctf.name }}</a>
<li class="list-group-item">
<a class="ctf-link" href="{% url 'ctf' cat_slug=ctf.category.slug ctf_slug=ctf.slug %}">{{ ctf.name }}</a>
<span style="position:absolute;right: 15px;">{{ctf.points}} {% trans "points" %}</span>
</li>
{% endfor %}
{% else %}
<li class="list-group-item">{% trans "No ctf available." %}</li>
<li class="list-group-item">{% trans "No ctf available." %}</li>
{% endif %}
</ul>
<ul class="list-group">
<li class="list-group-item active">Top 10</li>
{% for t in top %}
<li class="list-group-item"># {{ forloop.counter }} <a class="profile_link" href="/accounts/profile/{{ t.user.username }}"> {{ t.user.username }}</a> <span style="position:absolute;right: 15px;">{{ t.score }}</span></li>
<li class="list-group-item">{% trans "Latest Flags" %}</li>
{% for f in latest_flags %}
{% ismember f.user.userprofileinfo as is_member %}
<li class="list-group-item text-truncate">
<a class="ctf-link" href="{% url 'ctf' cat_slug=f.ctf.category.slug ctf_slug=f.ctf.slug %}"> {{f.ctf}}</a>
<span style="position:absolute;right: 15px;">
<a class="profile_link {{is_member}}" href="{% url 'accounts:profile' user_name=f.user.username %}">{{ f.user.username }}</a>
</span>
</li>
{% endfor %}
</ul>
<div class="row flex-nowrap">
<div class="col-lg-6 col-md-6">
<ul class="list-group">
<li class="list-group-item active">{% trans "Flags counter" %}</li>
<li class="list-group-item active">{% trans "Flags" %}</li>
<li class="list-group-item"><span>{{ flags }}</span></li>
</ul>
</div>
<div class="col-lg-6 col-md-6">
<ul class="list-group">
<li class="list-group-item active">{% trans "Users" %}</li>
<li class="list-group-item"><span>{{ nb_users }}</span></li>
</ul>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,4 @@
As you may already be aware, solving CTF challenges require a lot of tools and it may be difficult to find out which ones you need to install. </br>
We've made a VM with everything you need for 42CTF challenges so that you can focus on what is really important: flag ! </br>
All you need to do is download this <b><a href="/media/xubuntu-42ctf.ova">OVA</a></b> and import it in <b><a href="https://www.virtualbox.org/wiki/Downloads">Virtual Box</a>.<br></b>
So, what are you waiting for ?

View File

@ -0,0 +1,7 @@
You noticed a little change in the 42CTF scoreboard ?<br><br>
Don't panic, all your flags are safe and sound. We just switched to dynamic scoring. It means that challenges points are not fixed anymore: they will now decrease with each solve.<br>
Challenges points start at 200, and cannot go below than 5.<br><br>
We hope that this will allow better reflecting of the actual difficulty of the challenges. Limited-time events are not affected by this change.

View File

@ -0,0 +1,9 @@
Looking for your soul mate, a new friend, or just a decent CTF companion ?<br><br>
We at 42CTF have what you need: the <a href="/events/speed_dating_2022">Speed Dating CTF</a> !<br><br>
Come alone or in good company for this very short competition, which will last only 4 hours.<br>
You will be able to count on only one other player for this team CTF.<br>
You can either choose your partner or you can let the fate decide for you.<br><br>
Good luck !

View File

@ -0,0 +1,8 @@
Always wanted to learn about SQL injections ? <br>
<br>
We offer you three brand new challenges created by <b><a class=profile_link href=https://www.42ctf.org/accounts/profile/aldubar>aldubar</a></b>:<br>
- <b><a href='https://www.42ctf.org/ctfs/web/simple_question_1'>Simple Question of Logic 1</a></b> (10 points)<br>
- <b><a href='https://www.42ctf.org/ctfs/web/simple_question_2'>Simple Question of Logic 2</a></b> (30 points)<br>
- <b><a href='https://www.42ctf.org/ctfs/web/simple_question_3'>Simple Question of Logic 3</a></b> (40 points)<br>
<br>
Don't forget that you can always reach out on <a class="footer_imgs" href="https://discord.gg/DwZqPpA" target="_blank"><img src="/static/img/discord.png" width="30"></a> to propose new challenges !

View File

@ -0,0 +1,9 @@
New limited-time event : <b>Welcome CTF 2021</b> !<br><br>
Dates: from 10/12/2021 8pm to 12/12/2021 8pm (Paris time).<br>
This is a CTF to welcome the new students who join us at 42.<br>
It will be accessible only for the persons who started their cursus <b>after</b> the 01/09/2021.<br><br>
For the others, you can still solve the challenges already available on the website and try to reach the top 10 ! <br><br>
Registration <a href=https://forms.42l.fr/apps/forms/SooTbnT4PCs9na7C>here</a>

View File

@ -0,0 +1,7 @@
Comme vous le savez surement déjà, résoudre des challenges nécessite beaucoup d'outils et il peut être difficile de savoir lesquels sont vraiment nécessaires. <br>
Nous avons créé une VM avec tout ce dont vous avez besoin pour 42CTF afin que vous vous concentriez sur ce qui compte vraiment : flag ! <br>
Tout ce dont vous avez besoin est de télécharger cet <b><a href="/media/xubuntu-42ctf.ova">OVA</a></b> et de l'importer dans <b><a href="https://www.virtualbox.org/wiki/Downloads">Virtual Box</a></b>.<br>
Alors, qu'est ce que vous attendez ?

View File

@ -0,0 +1,7 @@
Vous avez remarqué un petit changement sur le scoreboard de 42CTF ?<br><br>
Pas de panique, tous vos flags sont sains et saufs. Nous avons juste basculé sur du scoring dynamique. Cela signifie que les points des challenges ne sont plus fixes : ils diminueront désormais à chaque nouvelle résolution.<br>
Un challenge démarre à 200 points, et ne peut pas descendre en dessous de 5 points.<br><br>
Nous espérons que cela permettra de mieux refléter la véritable difficulté des challenges. Les événements à durée limitée ne sont pas concernés par ce changement.

View File

@ -0,0 +1,9 @@
À la recherche de l'âme soeur, d'un nouvel ami, ou juste d'un compagnon de CTF ?<br><br>
Nous avons ce dont vous avez besoin : le <a href="/events/speed_dating_2022">Speed Dating CTF</a> !<br><br>
Venez seul ou bien accompagné pour cette très courte compétition, qui ne durera que 4 heures.<br>
Vous ne pourrez compter que sur une seule autre personne pour ce CTF en équipe.<br>
Vous pouvez soit choisir votre partenaire, soit laisser laisser le destin décider pour vous.<br><br>
Bonne chance !

View File

@ -0,0 +1,8 @@
Vous avez toujours voulu en apprendre plus sur les injections SQL ? <br>
<br>
On vous propose trois nouveaux challenges créés par <b><a class=profile_link href=https://www.42ctf.org/accounts/profile/aldubar>aldubar</a></b>:<br>
- <b><a href='https://www.42ctf.org/ctfs/web/simple_question_1'>Simple Question of Logic 1</a></b> (10 points)<br>
- <b><a href='https://www.42ctf.org/ctfs/web/simple_question_2'>Simple Question of Logic 2</a></b> (30 points)<br>
- <b><a href='https://www.42ctf.org/ctfs/web/simple_question_3'>Simple Question of Logic 3</a></b> (40 points)<br>
<br>
N'oubliez pas que vous pouvez toujours nous contacter sur <a class="footer_imgs" href="https://discord.gg/DwZqPpA" target="_blank"><img src="/static/img/discord.png" width="30"></a> pour proposer des nouveaux challenges !

View File

@ -0,0 +1,9 @@
Nouvel évènement en temps limité : <b>Welcome CTF 2021</b> !<br><br>
Dates : du 10/12/2021 20h au 12/12/2021 20h. <br>
Il s'agit d'un CTF pour souhaiter la bienvenue aux nouveaux étudiants qui nous rejoignent à 42.<br>
Il ne sera donc accessible qu'aux personnes ayant effectué leur rentrée <b>après</b> le 01/09/2021.<br><br>
Pour les autres, vous pouvez toujours résoudre les challenges déjà disponibles sur le site et tenter de vous hisser dans le top 10 ! <br><br>
Inscriptions <a href=https://forms.42l.fr/apps/forms/SooTbnT4PCs9na7C>ici</a>

View File

View File

@ -0,0 +1,13 @@
from django import template
from django.core.files.storage import default_storage
register = template.Library()
@register.simple_tag
def get_news_by_lang(news, lang):
filepath = "home/templates/news/"+ lang + "/" + news.slug + ".html"
try:
with open(filepath) as fp:
return fp.read()
except:
return news.content_en

View File

@ -3,4 +3,5 @@ from . import views
urlpatterns = [
path('', views.home, name='home'),
path('CGU', views.cgu, name='cgu'),
]

View File

@ -1,4 +1,4 @@
from django.shortcuts import render
from django.shortcuts import render, redirect
from django.conf import settings
from django.http import HttpResponse, HttpResponseRedirect
from .models import new
@ -8,6 +8,23 @@ from django.urls import translate_url
from django.utils.translation import (
LANGUAGE_SESSION_KEY, check_for_language, get_language,
)
from django.core.files.storage import default_storage
import datetime
from collections import defaultdict
import operator
def get_weekly_top():
week_ago = datetime.datetime.now() - datetime.timedelta(days=7)
weekly_flags = CTF_flags.objects.filter(flag_date__gt=week_ago, ctf__disabled=False, ctf__event=None)
scores = defaultdict(int)
for sol in weekly_flags:
scores[sol.user] += sol.ctf.points
users = sorted(scores.items(), key=operator.itemgetter(1), reverse=True)
users = [(u[0].userprofileinfo, u[1]) for u in users]
return(users[:5])
def home(request):
lang_code = get_language()
@ -19,14 +36,24 @@ def home(request):
response = HttpResponseRedirect(url_translated)
return response
news = new.objects.order_by('-pub_date')[:5]
latest_ctfs = CTF.objects.order_by('-pub_date')[:5]
latest_ctfs = CTF.objects.filter(event=None, disabled=False).order_by('-pub_date')[:5]
top10 = UserProfileInfo.objects.select_related().order_by('-score', 'last_submission_date', 'user__username')[:10]
nb_flags = CTF_flags.objects.count()
nb_users = UserProfileInfo.objects.count()
return render(request, 'home/home.html', {'news' : news, 'ctfs' : latest_ctfs, 'top' : top10, 'flags' : nb_flags})
latest_flags = CTF_flags.objects.filter(ctf__event = None, ctf__disabled=False).order_by('-flag_date')[:5]
top_weekly = get_weekly_top()
return render(request, 'home/home.html', {'news' : news, 'ctfs' : latest_ctfs, 'top' : top10, 'flags' : nb_flags,
'latest_flags':latest_flags, 'top_weekly': top_weekly, 'nb_users': nb_users})
def cgu(request):
return render(request, 'cgu.html')
def set_language(request, lang_code):
next = '/'
if request.GET.get('next'):
next = request.GET.get('next')
response = HttpResponseRedirect(next)
if lang_code and check_for_language(lang_code):
if next:
@ -42,6 +69,7 @@ def set_language(request, lang_code):
path=settings.LANGUAGE_COOKIE_PATH,
domain=settings.LANGUAGE_COOKIE_DOMAIN,
)
return response
return redirect('/'+lang_code+next)
# Create your views here.

View File

@ -3,331 +3,611 @@
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-05-10 19:28+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"POT-Creation-Date: 2022-02-04 19:27+0100\n"
"PO-Revision-Date: 2022-02-04 05:56+0100\n"
"Last-Translator: Clément Hamada <clementhamada@pm.me>\n"
"Language-Team: \n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 3.0\n"
#: accounts/templates/accounts/delete.html:8
msgid "Delete account"
msgstr "Account löschen"
#: accounts/templates/accounts/delete.html:11
msgid "Please confirm your password to delete your account."
msgstr "Bitte bestätigen sie ihr Passwort, um ihren Account zu löschen."
#: accounts/templates/accounts/delete.html:12
msgid "Deleted accounts cannot be recovered."
msgstr "Gelöschte Accounts können nicht wiederhergestellt werden."
#: accounts/templates/accounts/delete.html:15
msgid "Password inccorect."
msgstr "Falsches Passwort."
#: accounts/templates/accounts/delete.html:17
msgid "Your account has been deleted."
msgstr "Ihr Account wurde gelöscht."
#: accounts/templates/accounts/delete.html:22
#: accounts/templates/accounts/login.html:19
#: accounts/templates/accounts/register.html:23
#: events/templates/events/create_team.html:27
#: events/templates/events/join_team.html:32
msgid "Password"
msgstr "Passwort"
#: accounts/templates/accounts/edit.html:21
#: accounts/templates/accounts/login.html:18
#: accounts/templates/accounts/register.html:22
#: ctfs/templates/ctfs/ctf_info.html:50 ctfs/templates/ctfs/ctfs_list.html:12
#: scoreboard/templates/scoreboard/scoreboard.html:12
#: ctfs/templates/ctfs/ctf_info.html:61 ctfs/templates/ctfs/ctfs_list.html:12
#: events/templates/events/ctf_info.html:71
#: events/templates/events/event_info.html:64
#: scoreboard/templates/scoreboard/scoreboard.html:13
msgid "Username"
msgstr ""
msgstr "Nutzername"
#: accounts/templates/accounts/edit.html:25
msgid "Email"
msgstr ""
msgstr "Email"
#: accounts/templates/accounts/edit.html:30
#: ctfs/templates/ctfs/ctf_info.html:51
#: scoreboard/templates/scoreboard/scoreboard.html:13
#: ctfs/templates/ctfs/ctf_info.html:62
#: events/templates/events/ctf_info.html:72
#: events/templates/events/event_info.html:65
#: scoreboard/templates/scoreboard/scoreboard.html:14
msgid "Website"
msgstr ""
msgstr "Webseite"
#: accounts/templates/accounts/edit.html:36
#: events/templates/events/manage_team.html:29
msgid "Apply"
msgstr ""
msgstr "Anwenden"
#: accounts/templates/accounts/edit.html:44
msgid "Connected accounts"
msgstr ""
#: accounts/templates/accounts/edit.html:51
msgid "Disconnect Discord"
msgstr ""
#: accounts/templates/accounts/edit.html:56
msgid "Connect Discord"
msgstr ""
#: accounts/templates/accounts/edit.html:66
#: accounts/templates/accounts/profile.html:37
#: ctfs/templates/ctfs/ctf_info.html:52 ctfs/templates/ctfs/ctfs_list.html:13
#: scoreboard/templates/scoreboard/scoreboard.html:14
#: accounts/templates/accounts/edit.html:47
#: accounts/templates/accounts/profile.html:46
#: ctfs/templates/ctfs/ctf_info.html:63 ctfs/templates/ctfs/ctfs_list.html:13
#: events/templates/events/event_info.html:66
#: events/templates/events/event_info.html:89
#: events/templates/events/manage_team.html:40
#: events/templates/events/team.html:45
#: scoreboard/templates/scoreboard/scoreboard.html:15
msgid "Score"
msgstr ""
msgstr "Punktzahl"
#: accounts/templates/accounts/edit.html:74
#: accounts/templates/accounts/profile.html:45
msgid "Member since"
msgstr ""
#: accounts/templates/accounts/edit.html:55
#: accounts/templates/accounts/profile.html:60
msgid "Registered since"
msgstr "Registriert seit"
#: accounts/templates/accounts/edit.html:61
msgid "Delete my account"
msgstr "Meinen Account löschen"
#: accounts/templates/accounts/login.html:13
msgid "Please, verify your infos."
msgstr ""
#: accounts/templates/accounts/login.html:19
#: accounts/templates/accounts/register.html:23
msgid "Password"
msgstr ""
msgstr "Überprüfen Sie bitte ihre Daten."
#: accounts/templates/accounts/login.html:22
msgid "Reset password"
msgstr ""
msgstr "Passwort zurücksetzen"
#: accounts/templates/accounts/login.html:31
#: accounts/templates/accounts/register.html:38 templates/base.html:90
#: accounts/templates/accounts/register.html:38 templates/base.html:97
#: templates/registration/password_reset_complete.html:18
#: templates/registration/password_reset_confirm.html:37
#: templates/registration/password_reset_done.html:17
#: templates/registration/password_reset_form.html:25
#: templates/registration/password_reset_confirm.html:38
#: templates/registration/password_reset_done.html:18
#: templates/registration/password_reset_form.html:26
msgid "Login"
msgstr ""
msgstr "Anmelden"
#: accounts/templates/accounts/login.html:32
#: accounts/templates/accounts/register.html:37
#: templates/registration/password_reset_complete.html:19
#: templates/registration/password_reset_confirm.html:38
#: templates/registration/password_reset_done.html:18
#: templates/registration/password_reset_form.html:26
#: templates/registration/password_reset_confirm.html:39
#: templates/registration/password_reset_done.html:19
#: templates/registration/password_reset_form.html:27
msgid "Sign up"
msgstr ""
msgstr "Registrieren"
#: accounts/templates/accounts/profile.html:12
#: accounts/templates/accounts/profile.html:10
msgid "Challenges Solved by"
msgstr "Herausforderung gelöst von"
#: accounts/templates/accounts/profile.html:21
#: events/templates/events/team.html:20
msgid "Challenge Name"
msgstr ""
msgstr "Name der Herausforderung"
#: accounts/templates/accounts/profile.html:13
#: accounts/templates/accounts/profile.html:22
#: events/templates/events/team.html:21
msgid "Category"
msgstr ""
msgstr "Kategorie"
#: accounts/templates/accounts/profile.html:14
#: accounts/templates/accounts/profile.html:23
#: events/templates/events/team.html:22
msgid "Points"
msgstr ""
msgstr "Punkte"
#: accounts/templates/accounts/profile.html:15
#: ctfs/templates/ctfs/ctf_info.html:53
#: accounts/templates/accounts/profile.html:24
#: ctfs/templates/ctfs/ctf_info.html:64
#: events/templates/events/ctf_info.html:73
#: events/templates/events/team.html:23
msgid "Date"
msgstr ""
msgstr "Datum"
#: accounts/templates/accounts/profile.html:30
msgid "It's seem {{ user.username }} have never solved any CTF yet..."
msgstr ""
#: accounts/templates/accounts/profile.html:39
msgid "It seems that this user has not solved any challenge yet..."
msgstr "Es scheint bisher noch keiner diese Herausforderung gelöst zu haben..."
#: accounts/templates/accounts/profile.html:47
#: events/templates/events/event_info.html:63
#: events/templates/events/event_info.html:87
#: events/templates/events/manage_team.html:41
#: events/templates/events/team.html:46
#: scoreboard/templates/scoreboard/scoreboard.html:12
msgid "Rank"
msgstr "Rang"
#: accounts/templates/accounts/profile.html:56
msgid "Status: Member"
msgstr "Status: Mitglied"
#: accounts/templates/accounts/profile.html:58
msgid "Status: Visitor"
msgstr "Status: Gast"
#: accounts/templates/accounts/profile.html:64
#: events/templates/events/team.html:57
msgid "Categories stats"
msgstr "Kategorie Statistiken"
#: accounts/templates/accounts/register.html:13
msgid "Welcome !"
msgstr ""
msgstr "Willkommen!"
#: accounts/templates/accounts/register.html:14
msgid "Your account has been created."
msgstr ""
msgstr "Ihr Account wurde erstellt."
#: accounts/templates/accounts/register.html:25
msgid "Personal website"
msgstr ""
msgstr "Persönliche Webseite"
#: accounts/templates/accounts/register.html:26
#: events/templates/events/event_info.html:119
msgid "Register"
msgstr ""
msgstr "Registrieren"
#: accounts/views/views.py:31
#: accounts/views/views.py:33
msgid "Your account was inactive."
msgstr ""
msgstr "Ihr Account war inaktiv."
#: accounts/views/views.py:50
#: accounts/views/views.py:52
msgid ""
"The password must contain at least one letter and at least one digit or "
"punctuation character."
msgstr ""
"Das Passwort muss mindestens einen Buchstaben und eine Ziffer oder einen "
"Satzzeichen enthalten."
#: accounts/views/views.py:52
#: accounts/views/views.py:54
msgid "A user with that email already exists."
msgstr ""
msgstr "Ein Nutzer mit dieser Email existiert bereits."
#: accounts/views/views.py:65
#: accounts/views/views.py:67
msgid "A user with that username already exists."
msgstr ""
msgstr "Ein Nutzer mit diesem Nutzernamen existiert bereits."
#: accounts/views/views.py:93
#: accounts/views/views.py:95
msgid "Email already taken."
msgstr ""
msgstr "Email bereits vergeben."
#: accounts/views/views.py:99
#: accounts/views/views.py:101
msgid "Username already taken."
msgstr ""
msgstr "Nutzername bereits vergeben."
#: accounts/views/views.py:103
#: accounts/views/views.py:105 events/views/teams.py:124
msgid "Updated."
msgstr ""
msgstr "Aktualisiert."
#: ctfs/templates/ctfs/ctf_info.html:9
#: ctfs/templates/ctfs/ctf_info.html:10
#: events/templates/events/ctf_info.html:12
msgid "Published date"
msgstr ""
msgstr "Veröffentlichungsdatum"
#: ctfs/templates/ctfs/ctf_info.html:17
msgid "Congratulation !"
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:14
msgid "Challenge is not yet available."
msgstr "Herausforderung ist noch nicht verfügbar."
#: ctfs/templates/ctfs/ctf_info.html:19
msgid "Already flagged"
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:21 ctfs/templates/ctfs/ctf_info.html:30
msgid "Start the challenge"
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:23 ctfs/templates/ctfs/ctf_info.html:32
msgid "Download"
#: ctfs/templates/ctfs/ctf_info.html:21
#: events/templates/events/ctf_info.html:18 home/templates/home/home.html:46
msgid ""
"No translation available. Please try another language (English or French)."
msgstr ""
"Keine Übersetzung verfügbar. Bitte versuchen Sie es auf einer anderen "
"Sprache noch einmal (Englisch oder Französisch)."
#: ctfs/templates/ctfs/ctf_info.html:27
#: events/templates/events/ctf_info.html:32
msgid "Congratulation !"
msgstr "Herzlichen Glückwunsch!"
#: ctfs/templates/ctfs/ctf_info.html:29
#: events/templates/events/ctf_info.html:34
msgid "Already flagged"
msgstr "Schon gelöst"
#: ctfs/templates/ctfs/ctf_info.html:31 ctfs/templates/ctfs/ctf_info.html:40
#: events/templates/events/ctf_info.html:42
#: events/templates/events/ctf_info.html:51
msgid "Start the challenge"
msgstr "Herausforderung beginnen"
#: ctfs/templates/ctfs/ctf_info.html:33 ctfs/templates/ctfs/ctf_info.html:42
#: events/templates/events/ctf_info.html:44
#: events/templates/events/ctf_info.html:53
msgid "Download"
msgstr "Herunterladen"
#: ctfs/templates/ctfs/ctf_info.html:37
#: events/templates/events/ctf_info.html:48
msgid "Wrong flag ! You can do it !"
msgstr ""
msgstr "Falsche flagge! Sie können es schaffen!"
#: ctfs/templates/ctfs/ctf_info.html:45
#: ctfs/templates/ctfs/ctf_info.html:56
#: events/templates/events/ctf_info.html:66
msgid "Solved by"
msgstr ""
msgstr "Gelöst von"
#: ctfs/templates/ctfs/ctf_info.html:68
msgid "Nobody have solved this CTF."
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:80
#: events/templates/events/ctf_info.html:96
msgid "Nobody has solved this challenge yet."
msgstr "Bisher hat noch niemand diese Herausforderung gelöst."
#: ctfs/templates/ctfs/ctf_info.html:74
#: ctfs/templates/ctfs/ctf_info.html:87
#: events/templates/events/ctf_info.html:103
msgid "Author"
msgstr ""
msgstr "Autor/-in"
#: ctfs/templates/ctfs/ctf_info.html:75
#: ctfs/templates/ctfs/ctf_info.html:88
#: events/templates/events/ctf_info.html:104
msgid "Point reward"
msgstr ""
msgstr "Belohnungspunkte"
#: ctfs/templates/ctfs/ctfs_list.html:14
msgid "Solved"
msgstr ""
msgstr "Gelöst"
#: ctfs/templates/ctfs/ctfs_list.html:37
msgid "No ctf available for this category."
msgstr ""
msgstr "Kein CTF in dieser Kategorie verfügbar."
#: ctfs/templates/ctfs/ctfs_list.html:42
msgid "Categories"
msgstr ""
msgstr "Kategorien"
#: ctfs/templates/ctfs/ctfs_list.html:48 templates/base.html:54
msgid "No category available."
msgstr "Keine Kategorie verfügbar."
#: events/templates/events/create_team.html:10
#: events/templates/events/join_team.html:10
msgid "This event starts at"
msgstr "Dieses Ereignis beginnt am"
#: events/templates/events/create_team.html:17
#: events/templates/events/join_team.html:17
msgid "You need to be registered to the event."
msgstr "Sie müssen am Ereignis teilnehmen."
#: events/templates/events/create_team.html:20 events/views/teams.py:120
msgid "Name already taken."
msgstr "Name schon vergeben."
#: events/templates/events/create_team.html:26
#: events/templates/events/join_team.html:31
#: events/templates/events/manage_team.html:22
msgid "Team name"
msgstr "Teamname"
#: events/templates/events/create_team.html:28
#: events/templates/events/create_team.html:49
#: events/templates/events/join_team.html:54
msgid "Create Team"
msgstr "Team erstellen"
#: events/templates/events/create_team.html:33
#: events/templates/events/event_pwd.html:28
#: events/templates/events/join_team.html:38
msgid "You need to be logged to access this event."
msgstr "Sie müssen angemeldet sein um auf dieses Ereignis zuzugreifen."
#: events/templates/events/create_team.html:42
#: events/templates/events/event_info.html:113
#: events/templates/events/event_pwd.html:36
#: events/templates/events/join_team.html:47
msgid "Starts at"
msgstr "Beginnt am"
#: events/templates/events/create_team.html:43
#: events/templates/events/event_info.html:114
#: events/templates/events/event_pwd.html:37
#: events/templates/events/join_team.html:48
msgid "Ends at"
msgstr "Endet am"
#: events/templates/events/create_team.html:47
#: events/templates/events/event_info.html:129
#: events/templates/events/join_team.html:52
msgid "Manage my team"
msgstr "Team verwalten"
#: events/templates/events/create_team.html:48
#: events/templates/events/join_team.html:33
#: events/templates/events/join_team.html:53
msgid "Join Team"
msgstr "Team beitreten"
#: events/templates/events/create_team.html:53
#: events/templates/events/join_team.html:58
msgid "Auto-matching"
msgstr ""
#: home/templates/home/home.html:19
#: events/templates/events/create_team.html:57
#: events/templates/events/join_team.html:62
msgid "Find me a team !"
msgstr "Finde mir einen Team!"
#: events/templates/events/ctf_info.html:10
msgid "Event"
msgstr "Ereignis"
#: events/templates/events/ctf_info.html:25
#: events/templates/events/event_info.html:9
msgid "Subscriptions is over."
msgstr "Die Registrierung hat geendet."
#: events/templates/events/ctf_info.html:28
#: events/templates/events/event_info.html:12
#: events/templates/events/event_pwd.html:18
msgid "You're already registered to this event."
msgstr "Sie haben sich schon für dieses Ereignis registriert."
#: events/templates/events/ctf_info.html:36
#: events/templates/events/event_info.html:18
msgid "This event is over."
msgstr "Dieses Ereignis hat bereits geendet."
#: events/templates/events/ctf_info.html:38
msgid "Error while processing your request. (Invalid Form)"
msgstr "Fehler während der Verarbeitung ihrer Anfrage. (Ungültiges Formular)"
#: events/templates/events/ctf_info.html:40
msgid ""
"Error: you're not registered to this event, so you can't register scores, "
"fucking logic."
msgstr ""
"Fehler: Sie nehmen an diesem Ereignis nicht teil, und können deshalb keinen "
"Punktestand registrieren."
#: events/templates/events/event_info.html:20
#: events/templates/events/event_pwd.html:9
msgid "This event start at"
msgstr "Dieses Ereignis startet am"
#: events/templates/events/event_info.html:30
msgid "Challenges"
msgstr "Herausforderungen"
#: events/templates/events/event_info.html:47
msgid "No challenges available."
msgstr "Keine Herausforderung verfügbar."
#: events/templates/events/event_info.html:51
msgid "The event has not started yet."
msgstr "Das Ereignis hat noch nicht begonnen."
#: events/templates/events/event_info.html:57
msgid "ScoreBoard"
msgstr "Punktestand"
#: events/templates/events/event_info.html:88
msgid "Team"
msgstr "Team"
#: events/templates/events/event_info.html:106
msgid "No one have earn point yet, you gonna be the first ?"
msgstr "Niemand hat bisher Punkte verdient, werden Sie der erste sein?"
#: events/templates/events/event_pwd.html:15
#: events/templates/events/join_team.html:22
msgid "Wrong password submited."
msgstr "Falsches Passwort eingetragen."
#: events/templates/events/event_pwd.html:20
msgid "This event is password protected"
msgstr "Dieses Ereignis ist passwortgeschützt"
#: events/templates/events/event_pwd.html:21
msgid "You need to submit the event password to gain access to this event."
msgstr "Sie müssen das Ereignispasswort eintragen um darauf zuzugreifen."
#: events/templates/events/events_list.html:6 templates/base.html:61
msgid "Events"
msgstr "Ereignisse"
#: events/templates/events/events_list.html:38
msgid "See more"
msgstr "Weiter"
#: events/templates/events/events_list.html:44
msgid "No events available."
msgstr "Keine Ereignisse verfügbar."
#: events/templates/events/join_team.html:20
msgid "Team does not exist."
msgstr "Team existiert nicht."
#: events/templates/events/join_team.html:24
msgid "Maximum size reached."
msgstr "Maximale Mitgliederanzahl erreicht."
#: events/templates/events/manage_team.html:26
msgid "Team password"
msgstr "Teampasswort"
#: events/templates/events/manage_team.html:44
#: events/templates/events/team.html:49
msgid "Members"
msgstr "Mitgliede"
#: events/templates/events/manage_team.html:51
msgid "Leave Team"
msgstr "Team verlassen"
#: events/templates/events/team.html:38
msgid "It seems that this team has not solved any challenge yet..."
msgstr "Dieses Team scheint noch keine Herausforderung gelöst zu haben..."
#: home/templates/home/home.html:20
msgid "Weekly Top 5"
msgstr "Top 5 der Woche"
#: home/templates/home/home.html:56
msgid "No article available."
msgstr ""
msgstr "Kein Artikel verfügbar."
#: home/templates/home/home.html:24
#: home/templates/home/home.html:61
msgid "Latest challenges added"
msgstr ""
msgstr "Letzte Herausforderung hinzugefügt"
#: home/templates/home/home.html:30
#: home/templates/home/home.html:66
msgid "points"
msgstr "Punkte"
#: home/templates/home/home.html:70
msgid "No ctf available."
msgstr ""
msgstr "Kein CTF verfügbar."
#: home/templates/home/home.html:40
msgid "Flags counter"
msgstr ""
#: home/templates/home/home.html:74
msgid "Latest Flags"
msgstr "Letzte Flaggen"
#: project/settings.py:120
msgid "Global Site"
msgstr ""
#: home/templates/home/home.html:88
msgid "Flags"
msgstr "Flaggen"
#: project/settings.py:121
msgid "Italian"
msgstr ""
#: home/templates/home/home.html:94
msgid "Users"
msgstr "Nutzer"
#: project/settings.py:122
#: project/settings.py:115
msgid "English"
msgstr "Englisch"
#: project/settings.py:116
msgid "German"
msgstr ""
msgstr "Deutsch"
#: project/settings.py:123
#: project/settings.py:117
msgid "French"
msgstr ""
msgstr "Französisch"
#: project/settings.py:124
msgid "Spanish"
msgstr ""
#: project/settings.py:125
#: project/settings.py:118
msgid "Russian"
msgstr ""
msgstr "Russisch"
#: scoreboard/templates/scoreboard/scoreboard.html:11
msgid "Rank"
msgstr ""
#: scoreboard/templates/scoreboard/scoreboard.html:36
#: scoreboard/templates/scoreboard/scoreboard.html:38
msgid "First"
msgstr ""
msgstr "Erste"
#: scoreboard/templates/scoreboard/scoreboard.html:37
#: scoreboard/templates/scoreboard/scoreboard.html:39
msgid "Previous"
msgstr ""
msgstr "Vorherige"
#: scoreboard/templates/scoreboard/scoreboard.html:41
#: scoreboard/templates/scoreboard/scoreboard.html:43
msgid "Page "
msgstr ""
msgstr "Seite "
#: scoreboard/templates/scoreboard/scoreboard.html:45
#: scoreboard/templates/scoreboard/scoreboard.html:47
msgid "Next"
msgstr ""
msgstr "Nächste"
#: scoreboard/templates/scoreboard/scoreboard.html:46
#: scoreboard/templates/scoreboard/scoreboard.html:48
msgid "Last"
msgstr ""
msgstr "Letzte"
#: templates/base.html:59
msgid "Scoreboard"
msgstr ""
msgstr "Punktestand"
#: templates/base.html:86
msgid "Logout"
msgstr ""
#: templates/base.html:64
msgid "Resources"
msgstr "Ressourcen"
#: templates/base.html:93
msgid "Logout"
msgstr "Abmelden"
#: templates/base.html:100
msgid "Sign Up"
msgstr ""
msgstr "Registrieren"
#: templates/base.html:135
msgid "Become a Patron!"
msgstr "Unterstützen Sie uns!"
#: templates/registration/password_reset_complete.html:11
msgid "Your new password has been set."
msgstr ""
#: templates/registration/password_reset_confirm.html:19
msgid "Your password cant be too similar to your other personal information."
msgstr ""
msgstr "Ihr neues Passwort wurde festgelegt."
#: templates/registration/password_reset_confirm.html:20
msgid "Your password must contain at least 8 characters."
msgstr ""
msgid "Your password cant be too similar to your other personal information."
msgstr "Ihr Passwort kann nicht zu ähnlich zu ihren persönlichen Daten sein."
#: templates/registration/password_reset_confirm.html:21
msgid "Your password cant be a commonly used password."
msgstr ""
msgid "Your password must contain at least 8 characters."
msgstr "Ihr Passwort muss mindestens 8 Zeichen enthalten."
#: templates/registration/password_reset_confirm.html:22
msgid "Your password cant be a commonly used password."
msgstr "Ihr Passwort kann nicht ein häufig benutztes Passwort sein."
#: templates/registration/password_reset_confirm.html:23
msgid "Your password cant be entirely numeric."
msgstr ""
msgstr "Ihr Passwort kann nicht nur Ziffern enthalten."
#: templates/registration/password_reset_confirm.html:25
#: templates/registration/password_reset_confirm.html:26
msgid "Confirm"
msgstr ""
msgstr "Bestätigen"
#: templates/registration/password_reset_confirm.html:27
#: templates/registration/password_reset_confirm.html:28
msgid "Submit"
msgstr ""
msgstr "Einreichen"
#: templates/registration/password_reset_done.html:10
#: templates/registration/password_reset_done.html:11
msgid ""
"We've emailed you instructions for setting your password. You should receive "
"the email shortly!"
msgstr ""
"Wir haben Ihnen eine Anleitung um Ihren Passwort zurückzusetzen per Email "
"geschickt. Sie sollten sie in Kürze empfangen!"
#: templates/registration/password_reset_form.html:15
#: templates/registration/password_reset_form.html:16
msgid "Reset"
msgstr ""
msgstr "Zurücksetzen"
#, fuzzy
#~| msgid "Manage my team"
#~ msgid "Manage team"
#~ msgstr "Team verwalten"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-05-10 19:28+0000\n"
"POT-Creation-Date: 2022-02-04 19:27+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -18,11 +18,41 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: accounts/templates/accounts/delete.html:8
msgid "Delete account"
msgstr ""
#: accounts/templates/accounts/delete.html:11
msgid "Please confirm your password to delete your account."
msgstr ""
#: accounts/templates/accounts/delete.html:12
msgid "Deleted accounts cannot be recovered."
msgstr ""
#: accounts/templates/accounts/delete.html:15
msgid "Password inccorect."
msgstr ""
#: accounts/templates/accounts/delete.html:17
msgid "Your account has been deleted."
msgstr ""
#: accounts/templates/accounts/delete.html:22
#: accounts/templates/accounts/login.html:19
#: accounts/templates/accounts/register.html:23
#: events/templates/events/create_team.html:27
#: events/templates/events/join_team.html:32
msgid "Password"
msgstr ""
#: accounts/templates/accounts/edit.html:21
#: accounts/templates/accounts/login.html:18
#: accounts/templates/accounts/register.html:22
#: ctfs/templates/ctfs/ctf_info.html:50 ctfs/templates/ctfs/ctfs_list.html:12
#: scoreboard/templates/scoreboard/scoreboard.html:12
#: ctfs/templates/ctfs/ctf_info.html:61 ctfs/templates/ctfs/ctfs_list.html:12
#: events/templates/events/ctf_info.html:71
#: events/templates/events/event_info.html:64
#: scoreboard/templates/scoreboard/scoreboard.html:13
msgid "Username"
msgstr ""
@ -31,89 +61,114 @@ msgid "Email"
msgstr ""
#: accounts/templates/accounts/edit.html:30
#: ctfs/templates/ctfs/ctf_info.html:51
#: scoreboard/templates/scoreboard/scoreboard.html:13
#: ctfs/templates/ctfs/ctf_info.html:62
#: events/templates/events/ctf_info.html:72
#: events/templates/events/event_info.html:65
#: scoreboard/templates/scoreboard/scoreboard.html:14
msgid "Website"
msgstr ""
#: accounts/templates/accounts/edit.html:36
#: events/templates/events/manage_team.html:29
msgid "Apply"
msgstr ""
#: accounts/templates/accounts/edit.html:44
msgid "Connected accounts"
msgstr ""
#: accounts/templates/accounts/edit.html:51
msgid "Disconnect Discord"
msgstr ""
#: accounts/templates/accounts/edit.html:56
msgid "Connect Discord"
msgstr ""
#: accounts/templates/accounts/edit.html:66
#: accounts/templates/accounts/profile.html:37
#: ctfs/templates/ctfs/ctf_info.html:52 ctfs/templates/ctfs/ctfs_list.html:13
#: scoreboard/templates/scoreboard/scoreboard.html:14
#: accounts/templates/accounts/edit.html:47
#: accounts/templates/accounts/profile.html:46
#: ctfs/templates/ctfs/ctf_info.html:63 ctfs/templates/ctfs/ctfs_list.html:13
#: events/templates/events/event_info.html:66
#: events/templates/events/event_info.html:89
#: events/templates/events/manage_team.html:40
#: events/templates/events/team.html:45
#: scoreboard/templates/scoreboard/scoreboard.html:15
msgid "Score"
msgstr ""
#: accounts/templates/accounts/edit.html:74
#: accounts/templates/accounts/profile.html:45
msgid "Member since"
#: accounts/templates/accounts/edit.html:55
#: accounts/templates/accounts/profile.html:60
msgid "Registered since"
msgstr ""
#: accounts/templates/accounts/edit.html:61
msgid "Delete my account"
msgstr ""
#: accounts/templates/accounts/login.html:13
msgid "Please, verify your infos."
msgstr ""
#: accounts/templates/accounts/login.html:19
#: accounts/templates/accounts/register.html:23
msgid "Password"
msgstr ""
#: accounts/templates/accounts/login.html:22
msgid "Reset password"
msgstr ""
#: accounts/templates/accounts/login.html:31
#: accounts/templates/accounts/register.html:38 templates/base.html:90
#: accounts/templates/accounts/register.html:38 templates/base.html:97
#: templates/registration/password_reset_complete.html:18
#: templates/registration/password_reset_confirm.html:37
#: templates/registration/password_reset_done.html:17
#: templates/registration/password_reset_form.html:25
#: templates/registration/password_reset_confirm.html:38
#: templates/registration/password_reset_done.html:18
#: templates/registration/password_reset_form.html:26
msgid "Login"
msgstr ""
#: accounts/templates/accounts/login.html:32
#: accounts/templates/accounts/register.html:37
#: templates/registration/password_reset_complete.html:19
#: templates/registration/password_reset_confirm.html:38
#: templates/registration/password_reset_done.html:18
#: templates/registration/password_reset_form.html:26
#: templates/registration/password_reset_confirm.html:39
#: templates/registration/password_reset_done.html:19
#: templates/registration/password_reset_form.html:27
msgid "Sign up"
msgstr ""
#: accounts/templates/accounts/profile.html:12
#: accounts/templates/accounts/profile.html:10
msgid "Challenges Solved by"
msgstr ""
#: accounts/templates/accounts/profile.html:21
#: events/templates/events/team.html:20
msgid "Challenge Name"
msgstr ""
#: accounts/templates/accounts/profile.html:13
#: accounts/templates/accounts/profile.html:22
#: events/templates/events/team.html:21
msgid "Category"
msgstr ""
#: accounts/templates/accounts/profile.html:14
#: accounts/templates/accounts/profile.html:23
#: events/templates/events/team.html:22
msgid "Points"
msgstr ""
#: accounts/templates/accounts/profile.html:15
#: ctfs/templates/ctfs/ctf_info.html:53
#: accounts/templates/accounts/profile.html:24
#: ctfs/templates/ctfs/ctf_info.html:64
#: events/templates/events/ctf_info.html:73
#: events/templates/events/team.html:23
msgid "Date"
msgstr ""
#: accounts/templates/accounts/profile.html:30
msgid "It's seem {{ user.username }} have never solved any CTF yet..."
#: accounts/templates/accounts/profile.html:39
msgid "It seems that this user has not solved any challenge yet..."
msgstr ""
#: accounts/templates/accounts/profile.html:47
#: events/templates/events/event_info.html:63
#: events/templates/events/event_info.html:87
#: events/templates/events/manage_team.html:41
#: events/templates/events/team.html:46
#: scoreboard/templates/scoreboard/scoreboard.html:12
msgid "Rank"
msgstr ""
#: accounts/templates/accounts/profile.html:56
msgid "Status: Member"
msgstr ""
#: accounts/templates/accounts/profile.html:58
msgid "Status: Visitor"
msgstr ""
#: accounts/templates/accounts/profile.html:64
#: events/templates/events/team.html:57
msgid "Categories stats"
msgstr ""
#: accounts/templates/accounts/register.html:13
@ -129,76 +184,99 @@ msgid "Personal website"
msgstr ""
#: accounts/templates/accounts/register.html:26
#: events/templates/events/event_info.html:119
msgid "Register"
msgstr ""
#: accounts/views/views.py:31
#: accounts/views/views.py:33
msgid "Your account was inactive."
msgstr ""
#: accounts/views/views.py:50
#: accounts/views/views.py:52
msgid ""
"The password must contain at least one letter and at least one digit or "
"punctuation character."
msgstr ""
#: accounts/views/views.py:52
#: accounts/views/views.py:54
msgid "A user with that email already exists."
msgstr ""
#: accounts/views/views.py:65
#: accounts/views/views.py:67
msgid "A user with that username already exists."
msgstr ""
#: accounts/views/views.py:93
#: accounts/views/views.py:95
msgid "Email already taken."
msgstr ""
#: accounts/views/views.py:99
#: accounts/views/views.py:101
msgid "Username already taken."
msgstr ""
#: accounts/views/views.py:103
#: accounts/views/views.py:105 events/views/teams.py:124
msgid "Updated."
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:9
#: ctfs/templates/ctfs/ctf_info.html:10
#: events/templates/events/ctf_info.html:12
msgid "Published date"
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:17
msgid "Congratulation !"
#: ctfs/templates/ctfs/ctf_info.html:14
msgid "Challenge is not yet available."
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:19
msgid "Already flagged"
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:21 ctfs/templates/ctfs/ctf_info.html:30
msgid "Start the challenge"
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:23 ctfs/templates/ctfs/ctf_info.html:32
msgid "Download"
#: ctfs/templates/ctfs/ctf_info.html:21
#: events/templates/events/ctf_info.html:18 home/templates/home/home.html:46
msgid ""
"No translation available. Please try another language (English or French)."
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:27
#: events/templates/events/ctf_info.html:32
msgid "Congratulation !"
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:29
#: events/templates/events/ctf_info.html:34
msgid "Already flagged"
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:31 ctfs/templates/ctfs/ctf_info.html:40
#: events/templates/events/ctf_info.html:42
#: events/templates/events/ctf_info.html:51
msgid "Start the challenge"
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:33 ctfs/templates/ctfs/ctf_info.html:42
#: events/templates/events/ctf_info.html:44
#: events/templates/events/ctf_info.html:53
msgid "Download"
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:37
#: events/templates/events/ctf_info.html:48
msgid "Wrong flag ! You can do it !"
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:45
#: ctfs/templates/ctfs/ctf_info.html:56
#: events/templates/events/ctf_info.html:66
msgid "Solved by"
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:68
msgid "Nobody have solved this CTF."
#: ctfs/templates/ctfs/ctf_info.html:80
#: events/templates/events/ctf_info.html:96
msgid "Nobody has solved this challenge yet."
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:74
#: ctfs/templates/ctfs/ctf_info.html:87
#: events/templates/events/ctf_info.html:103
msgid "Author"
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:75
#: ctfs/templates/ctfs/ctf_info.html:88
#: events/templates/events/ctf_info.html:104
msgid "Point reward"
msgstr ""
@ -218,67 +296,248 @@ msgstr ""
msgid "No category available."
msgstr ""
#: home/templates/home/home.html:19
#: events/templates/events/create_team.html:10
#: events/templates/events/join_team.html:10
msgid "This event starts at"
msgstr ""
#: events/templates/events/create_team.html:17
#: events/templates/events/join_team.html:17
msgid "You need to be registered to the event."
msgstr ""
#: events/templates/events/create_team.html:20 events/views/teams.py:120
msgid "Name already taken."
msgstr ""
#: events/templates/events/create_team.html:26
#: events/templates/events/join_team.html:31
#: events/templates/events/manage_team.html:22
msgid "Team name"
msgstr ""
#: events/templates/events/create_team.html:28
#: events/templates/events/create_team.html:49
#: events/templates/events/join_team.html:54
msgid "Create Team"
msgstr ""
#: events/templates/events/create_team.html:33
#: events/templates/events/event_pwd.html:28
#: events/templates/events/join_team.html:38
msgid "You need to be logged to access this event."
msgstr ""
#: events/templates/events/create_team.html:42
#: events/templates/events/event_info.html:113
#: events/templates/events/event_pwd.html:36
#: events/templates/events/join_team.html:47
msgid "Starts at"
msgstr ""
#: events/templates/events/create_team.html:43
#: events/templates/events/event_info.html:114
#: events/templates/events/event_pwd.html:37
#: events/templates/events/join_team.html:48
msgid "Ends at"
msgstr ""
#: events/templates/events/create_team.html:47
#: events/templates/events/event_info.html:129
#: events/templates/events/join_team.html:52
msgid "Manage my team"
msgstr ""
#: events/templates/events/create_team.html:48
#: events/templates/events/join_team.html:33
#: events/templates/events/join_team.html:53
msgid "Join Team"
msgstr ""
#: events/templates/events/create_team.html:53
#: events/templates/events/join_team.html:58
msgid "Auto-matching"
msgstr ""
#: events/templates/events/create_team.html:57
#: events/templates/events/join_team.html:62
msgid "Find me a team !"
msgstr ""
#: events/templates/events/ctf_info.html:10
msgid "Event"
msgstr ""
#: events/templates/events/ctf_info.html:25
#: events/templates/events/event_info.html:9
msgid "Subscriptions is over."
msgstr ""
#: events/templates/events/ctf_info.html:28
#: events/templates/events/event_info.html:12
#: events/templates/events/event_pwd.html:18
msgid "You're already registered to this event."
msgstr ""
#: events/templates/events/ctf_info.html:36
#: events/templates/events/event_info.html:18
msgid "This event is over."
msgstr ""
#: events/templates/events/ctf_info.html:38
msgid "Error while processing your request. (Invalid Form)"
msgstr ""
#: events/templates/events/ctf_info.html:40
msgid ""
"Error: you're not registered to this event, so you can't register scores, "
"fucking logic."
msgstr ""
#: events/templates/events/event_info.html:20
#: events/templates/events/event_pwd.html:9
msgid "This event start at"
msgstr ""
#: events/templates/events/event_info.html:30
msgid "Challenges"
msgstr ""
#: events/templates/events/event_info.html:47
msgid "No challenges available."
msgstr ""
#: events/templates/events/event_info.html:51
msgid "The event has not started yet."
msgstr ""
#: events/templates/events/event_info.html:57
msgid "ScoreBoard"
msgstr ""
#: events/templates/events/event_info.html:88
msgid "Team"
msgstr ""
#: events/templates/events/event_info.html:106
msgid "No one have earn point yet, you gonna be the first ?"
msgstr ""
#: events/templates/events/event_pwd.html:15
#: events/templates/events/join_team.html:22
msgid "Wrong password submited."
msgstr ""
#: events/templates/events/event_pwd.html:20
msgid "This event is password protected"
msgstr ""
#: events/templates/events/event_pwd.html:21
msgid "You need to submit the event password to gain access to this event."
msgstr ""
#: events/templates/events/events_list.html:6 templates/base.html:61
msgid "Events"
msgstr ""
#: events/templates/events/events_list.html:38
msgid "See more"
msgstr ""
#: events/templates/events/events_list.html:44
msgid "No events available."
msgstr ""
#: events/templates/events/join_team.html:20
msgid "Team does not exist."
msgstr ""
#: events/templates/events/join_team.html:24
msgid "Maximum size reached."
msgstr ""
#: events/templates/events/manage_team.html:26
msgid "Team password"
msgstr ""
#: events/templates/events/manage_team.html:44
#: events/templates/events/team.html:49
msgid "Members"
msgstr ""
#: events/templates/events/manage_team.html:51
msgid "Leave Team"
msgstr ""
#: events/templates/events/team.html:38
msgid "It seems that this team has not solved any challenge yet..."
msgstr ""
#: home/templates/home/home.html:20
msgid "Weekly Top 5"
msgstr ""
#: home/templates/home/home.html:56
msgid "No article available."
msgstr ""
#: home/templates/home/home.html:24
#: home/templates/home/home.html:61
msgid "Latest challenges added"
msgstr ""
#: home/templates/home/home.html:30
#: home/templates/home/home.html:66
msgid "points"
msgstr ""
#: home/templates/home/home.html:70
msgid "No ctf available."
msgstr ""
#: home/templates/home/home.html:40
msgid "Flags counter"
#: home/templates/home/home.html:74
msgid "Latest Flags"
msgstr ""
#: project/settings.py:120
msgid "Global Site"
#: home/templates/home/home.html:88
msgid "Flags"
msgstr ""
#: project/settings.py:121
msgid "Italian"
#: home/templates/home/home.html:94
msgid "Users"
msgstr ""
#: project/settings.py:122
#: project/settings.py:115
msgid "English"
msgstr ""
#: project/settings.py:116
msgid "German"
msgstr ""
#: project/settings.py:123
#: project/settings.py:117
msgid "French"
msgstr ""
#: project/settings.py:124
msgid "Spanish"
msgstr ""
#: project/settings.py:125
#: project/settings.py:118
msgid "Russian"
msgstr ""
#: scoreboard/templates/scoreboard/scoreboard.html:11
msgid "Rank"
msgstr ""
#: scoreboard/templates/scoreboard/scoreboard.html:36
#: scoreboard/templates/scoreboard/scoreboard.html:38
msgid "First"
msgstr ""
#: scoreboard/templates/scoreboard/scoreboard.html:37
#: scoreboard/templates/scoreboard/scoreboard.html:39
msgid "Previous"
msgstr ""
#: scoreboard/templates/scoreboard/scoreboard.html:41
#: scoreboard/templates/scoreboard/scoreboard.html:43
msgid "Page "
msgstr ""
#: scoreboard/templates/scoreboard/scoreboard.html:45
#: scoreboard/templates/scoreboard/scoreboard.html:47
msgid "Next"
msgstr ""
#: scoreboard/templates/scoreboard/scoreboard.html:46
#: scoreboard/templates/scoreboard/scoreboard.html:48
msgid "Last"
msgstr ""
@ -286,48 +545,56 @@ msgstr ""
msgid "Scoreboard"
msgstr ""
#: templates/base.html:86
msgid "Logout"
#: templates/base.html:64
msgid "Resources"
msgstr ""
#: templates/base.html:93
msgid "Logout"
msgstr ""
#: templates/base.html:100
msgid "Sign Up"
msgstr ""
#: templates/base.html:135
msgid "Become a Patron!"
msgstr ""
#: templates/registration/password_reset_complete.html:11
msgid "Your new password has been set."
msgstr ""
#: templates/registration/password_reset_confirm.html:19
#: templates/registration/password_reset_confirm.html:20
msgid "Your password cant be too similar to your other personal information."
msgstr ""
#: templates/registration/password_reset_confirm.html:20
#: templates/registration/password_reset_confirm.html:21
msgid "Your password must contain at least 8 characters."
msgstr ""
#: templates/registration/password_reset_confirm.html:21
#: templates/registration/password_reset_confirm.html:22
msgid "Your password cant be a commonly used password."
msgstr ""
#: templates/registration/password_reset_confirm.html:22
#: templates/registration/password_reset_confirm.html:23
msgid "Your password cant be entirely numeric."
msgstr ""
#: templates/registration/password_reset_confirm.html:25
#: templates/registration/password_reset_confirm.html:26
msgid "Confirm"
msgstr ""
#: templates/registration/password_reset_confirm.html:27
#: templates/registration/password_reset_confirm.html:28
msgid "Submit"
msgstr ""
#: templates/registration/password_reset_done.html:10
#: templates/registration/password_reset_done.html:11
msgid ""
"We've emailed you instructions for setting your password. You should receive "
"the email shortly!"
msgstr ""
#: templates/registration/password_reset_form.html:15
#: templates/registration/password_reset_form.html:16
msgid "Reset"
msgstr ""

View File

@ -8,326 +8,600 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-05-10 19:28+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"POT-Creation-Date: 2022-02-04 19:27+0100\n"
"PO-Revision-Date: 2022-02-09 10:55+0100\n"
"Last-Translator: Javier Uhagón (uhagontorralvojavier@gmail.com)\n"
"Language-Team: \n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: accounts/templates/accounts/delete.html:8
msgid "Delete account"
msgstr "Borrar cuenta"
#: accounts/templates/accounts/delete.html:11
msgid "Please confirm your password to delete your account."
msgstr "Por favor confirme su contraseña para borrar su cuenta."
#: accounts/templates/accounts/delete.html:12
msgid "Deleted accounts cannot be recovered."
msgstr "Las cuentas borradas no pueden ser recuperadas."
#: accounts/templates/accounts/delete.html:15
msgid "Password inccorect."
msgstr "Contraseña incorrecta."
#: accounts/templates/accounts/delete.html:17
msgid "Your account has been deleted."
msgstr "Su cuenta ha sido borrada."
#: accounts/templates/accounts/delete.html:22
#: accounts/templates/accounts/login.html:19
#: accounts/templates/accounts/register.html:23
#: events/templates/events/create_team.html:27
#: events/templates/events/join_team.html:32
msgid "Password"
msgstr "Contraseña"
#: accounts/templates/accounts/edit.html:21
#: accounts/templates/accounts/login.html:18
#: accounts/templates/accounts/register.html:22
#: ctfs/templates/ctfs/ctf_info.html:50 ctfs/templates/ctfs/ctfs_list.html:12
#: scoreboard/templates/scoreboard/scoreboard.html:12
#: ctfs/templates/ctfs/ctf_info.html:61 ctfs/templates/ctfs/ctfs_list.html:12
#: events/templates/events/ctf_info.html:71
#: events/templates/events/event_info.html:64
#: scoreboard/templates/scoreboard/scoreboard.html:13
msgid "Username"
msgstr ""
msgstr "Usuario"
#: accounts/templates/accounts/edit.html:25
msgid "Email"
msgstr ""
msgstr "Email"
#: accounts/templates/accounts/edit.html:30
#: ctfs/templates/ctfs/ctf_info.html:51
#: scoreboard/templates/scoreboard/scoreboard.html:13
#: ctfs/templates/ctfs/ctf_info.html:62
#: events/templates/events/ctf_info.html:72
#: events/templates/events/event_info.html:65
#: scoreboard/templates/scoreboard/scoreboard.html:14
msgid "Website"
msgstr ""
msgstr "Página Web"
#: accounts/templates/accounts/edit.html:36
#: events/templates/events/manage_team.html:29
msgid "Apply"
msgstr ""
msgstr "Aplicar"
#: accounts/templates/accounts/edit.html:44
msgid "Connected accounts"
msgstr ""
#: accounts/templates/accounts/edit.html:51
msgid "Disconnect Discord"
msgstr ""
#: accounts/templates/accounts/edit.html:56
msgid "Connect Discord"
msgstr ""
#: accounts/templates/accounts/edit.html:66
#: accounts/templates/accounts/profile.html:37
#: ctfs/templates/ctfs/ctf_info.html:52 ctfs/templates/ctfs/ctfs_list.html:13
#: scoreboard/templates/scoreboard/scoreboard.html:14
#: accounts/templates/accounts/edit.html:47
#: accounts/templates/accounts/profile.html:46
#: ctfs/templates/ctfs/ctf_info.html:63 ctfs/templates/ctfs/ctfs_list.html:13
#: events/templates/events/event_info.html:66
#: events/templates/events/event_info.html:89
#: events/templates/events/manage_team.html:40
#: events/templates/events/team.html:45
#: scoreboard/templates/scoreboard/scoreboard.html:15
msgid "Score"
msgstr ""
msgstr "Puntuación"
#: accounts/templates/accounts/edit.html:74
#: accounts/templates/accounts/profile.html:45
msgid "Member since"
msgstr ""
#: accounts/templates/accounts/edit.html:55
#: accounts/templates/accounts/profile.html:60
msgid "Registered since"
msgstr "Registrado desde"
#: accounts/templates/accounts/edit.html:61
msgid "Delete my account"
msgstr "Borrar mi cuenta"
#: accounts/templates/accounts/login.html:13
msgid "Please, verify your infos."
msgstr ""
#: accounts/templates/accounts/login.html:19
#: accounts/templates/accounts/register.html:23
msgid "Password"
msgstr ""
msgstr "Por favor, verifique su información."
#: accounts/templates/accounts/login.html:22
msgid "Reset password"
msgstr ""
msgstr "Cambiar contraseña"
#: accounts/templates/accounts/login.html:31
#: accounts/templates/accounts/register.html:38 templates/base.html:90
#: accounts/templates/accounts/register.html:38 templates/base.html:97
#: templates/registration/password_reset_complete.html:18
#: templates/registration/password_reset_confirm.html:37
#: templates/registration/password_reset_done.html:17
#: templates/registration/password_reset_form.html:25
#: templates/registration/password_reset_confirm.html:38
#: templates/registration/password_reset_done.html:18
#: templates/registration/password_reset_form.html:26
msgid "Login"
msgstr ""
msgstr "Iniciar Sesión"
#: accounts/templates/accounts/login.html:32
#: accounts/templates/accounts/register.html:37
#: templates/registration/password_reset_complete.html:19
#: templates/registration/password_reset_confirm.html:38
#: templates/registration/password_reset_done.html:18
#: templates/registration/password_reset_form.html:26
#: templates/registration/password_reset_confirm.html:39
#: templates/registration/password_reset_done.html:19
#: templates/registration/password_reset_form.html:27
msgid "Sign up"
msgstr ""
msgstr "Registrarse"
#: accounts/templates/accounts/profile.html:12
#: accounts/templates/accounts/profile.html:10
msgid "Challenges Solved by"
msgstr "Retos resueltos por"
#: accounts/templates/accounts/profile.html:21
#: events/templates/events/team.html:20
msgid "Challenge Name"
msgstr ""
msgstr "Nombre del reto"
#: accounts/templates/accounts/profile.html:13
#: accounts/templates/accounts/profile.html:22
#: events/templates/events/team.html:21
msgid "Category"
msgstr ""
msgstr "Categoría"
#: accounts/templates/accounts/profile.html:14
#: accounts/templates/accounts/profile.html:23
#: events/templates/events/team.html:22
msgid "Points"
msgstr ""
msgstr "Puntos"
#: accounts/templates/accounts/profile.html:15
#: ctfs/templates/ctfs/ctf_info.html:53
#: accounts/templates/accounts/profile.html:24
#: ctfs/templates/ctfs/ctf_info.html:64
#: events/templates/events/ctf_info.html:73
#: events/templates/events/team.html:23
msgid "Date"
msgstr ""
msgstr "Fecha"
#: accounts/templates/accounts/profile.html:30
msgid "It's seem {{ user.username }} have never solved any CTF yet..."
msgstr ""
#: accounts/templates/accounts/profile.html:39
msgid "It seems that this user has not solved any challenge yet..."
msgstr "Parece que este usuario no ha resuelto ningún reto aún..."
#: accounts/templates/accounts/profile.html:47
#: events/templates/events/event_info.html:63
#: events/templates/events/event_info.html:87
#: events/templates/events/manage_team.html:41
#: events/templates/events/team.html:46
#: scoreboard/templates/scoreboard/scoreboard.html:12
msgid "Rank"
msgstr "Rango"
#: accounts/templates/accounts/profile.html:56
msgid "Status: Member"
msgstr "Estatus: Miembro"
#: accounts/templates/accounts/profile.html:58
msgid "Status: Visitor"
msgstr "Estatus: Visitante"
#: accounts/templates/accounts/profile.html:64
#: events/templates/events/team.html:57
msgid "Categories stats"
msgstr "Estádisticas de las categorías"
#: accounts/templates/accounts/register.html:13
msgid "Welcome !"
msgstr ""
msgstr "¡ Bienvenid@ !"
#: accounts/templates/accounts/register.html:14
msgid "Your account has been created."
msgstr ""
msgstr "Tu cuenta ha sido creada."
#: accounts/templates/accounts/register.html:25
msgid "Personal website"
msgstr ""
msgstr "Web personal"
#: accounts/templates/accounts/register.html:26
#: events/templates/events/event_info.html:119
msgid "Register"
msgstr ""
msgstr "Registrarse"
#: accounts/views/views.py:31
#: accounts/views/views.py:33
msgid "Your account was inactive."
msgstr ""
msgstr "Tu cuenta estaba inactiva."
#: accounts/views/views.py:50
#: accounts/views/views.py:52
msgid ""
"The password must contain at least one letter and at least one digit or "
"punctuation character."
msgstr ""
"La contraseña debe contener al menos una letra y un dígito o "
"un signo de puntuación."
#: accounts/views/views.py:52
#: accounts/views/views.py:54
msgid "A user with that email already exists."
msgstr ""
msgstr "Ya existe un usuario con este email."
#: accounts/views/views.py:65
#: accounts/views/views.py:67
msgid "A user with that username already exists."
msgstr ""
msgstr "Ese nombre de usuario ya está en uso."
#: accounts/views/views.py:93
#: accounts/views/views.py:95
msgid "Email already taken."
msgstr ""
msgstr "Email ya usado."
#: accounts/views/views.py:99
#: accounts/views/views.py:101
msgid "Username already taken."
msgstr ""
msgstr "Nombre de usuario ya usado."
#: accounts/views/views.py:103
#: accounts/views/views.py:105 events/views/teams.py:124
msgid "Updated."
msgstr ""
msgstr "Actualizado."
#: ctfs/templates/ctfs/ctf_info.html:9
#: ctfs/templates/ctfs/ctf_info.html:10
#: events/templates/events/ctf_info.html:12
msgid "Published date"
msgstr ""
msgstr "Fecha de publicación"
#: ctfs/templates/ctfs/ctf_info.html:17
msgid "Congratulation !"
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:14
msgid "Challenge is not yet available."
msgstr "El reto aún no está disponible."
#: ctfs/templates/ctfs/ctf_info.html:19
msgid "Already flagged"
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:21 ctfs/templates/ctfs/ctf_info.html:30
msgid "Start the challenge"
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:23 ctfs/templates/ctfs/ctf_info.html:32
msgid "Download"
#: ctfs/templates/ctfs/ctf_info.html:21
#: events/templates/events/ctf_info.html:18 home/templates/home/home.html:46
msgid ""
"No translation available. Please try another language (English or French)."
msgstr ""
"Traducción no disponible. Por favor pruebe otro idioma (inglés o francés)."
#: ctfs/templates/ctfs/ctf_info.html:27
#: events/templates/events/ctf_info.html:32
msgid "Congratulation !"
msgstr "¡ Felicidades !"
#: ctfs/templates/ctfs/ctf_info.html:29
#: events/templates/events/ctf_info.html:34
msgid "Already flagged"
msgstr "Flag ya conseguida"
#: ctfs/templates/ctfs/ctf_info.html:31 ctfs/templates/ctfs/ctf_info.html:40
#: events/templates/events/ctf_info.html:42
#: events/templates/events/ctf_info.html:51
msgid "Start the challenge"
msgstr "Comenzar el reto"
#: ctfs/templates/ctfs/ctf_info.html:33 ctfs/templates/ctfs/ctf_info.html:42
#: events/templates/events/ctf_info.html:44
#: events/templates/events/ctf_info.html:53
msgid "Download"
msgstr "Descargar"
#: ctfs/templates/ctfs/ctf_info.html:37
#: events/templates/events/ctf_info.html:48
msgid "Wrong flag ! You can do it !"
msgstr ""
msgstr "¡ Flag incorrecta ! ¡ Puedes hacerlo !"
#: ctfs/templates/ctfs/ctf_info.html:45
#: ctfs/templates/ctfs/ctf_info.html:56
#: events/templates/events/ctf_info.html:66
msgid "Solved by"
msgstr ""
msgstr "Resuelto por"
#: ctfs/templates/ctfs/ctf_info.html:68
msgid "Nobody have solved this CTF."
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:80
#: events/templates/events/ctf_info.html:96
msgid "Nobody has solved this challenge yet."
msgstr "Nadie ha resuelto este reto aún."
#: ctfs/templates/ctfs/ctf_info.html:74
#: ctfs/templates/ctfs/ctf_info.html:87
#: events/templates/events/ctf_info.html:103
msgid "Author"
msgstr ""
msgstr "Autor"
#: ctfs/templates/ctfs/ctf_info.html:75
#: ctfs/templates/ctfs/ctf_info.html:88
#: events/templates/events/ctf_info.html:104
msgid "Point reward"
msgstr ""
msgstr "Recompensa de puntos"
#: ctfs/templates/ctfs/ctfs_list.html:14
msgid "Solved"
msgstr ""
msgstr "Resuelto"
#: ctfs/templates/ctfs/ctfs_list.html:37
msgid "No ctf available for this category."
msgstr ""
msgstr "No hay un ctf disponible para esta categoría."
#: ctfs/templates/ctfs/ctfs_list.html:42
msgid "Categories"
msgstr ""
msgstr "Categorías"
#: ctfs/templates/ctfs/ctfs_list.html:48 templates/base.html:54
msgid "No category available."
msgstr ""
msgstr "No hay categoría disponible."
#: home/templates/home/home.html:19
#: events/templates/events/create_team.html:10
#: events/templates/events/join_team.html:10
msgid "This event starts at"
msgstr "Este evento empieza"
#: events/templates/events/create_team.html:17
#: events/templates/events/join_team.html:17
msgid "You need to be registered to the event."
msgstr "Necesitas estar registrado al evento."
#: events/templates/events/create_team.html:20 events/views/teams.py:120
msgid "Name already taken."
msgstr "Nombre ya elegido."
#: events/templates/events/create_team.html:26
#: events/templates/events/join_team.html:31
#: events/templates/events/manage_team.html:22
msgid "Team name"
msgstr "Nombre de equipo"
#: events/templates/events/create_team.html:28
#: events/templates/events/create_team.html:49
#: events/templates/events/join_team.html:54
msgid "Create Team"
msgstr "Crear equipo"
#: events/templates/events/create_team.html:33
#: events/templates/events/event_pwd.html:28
#: events/templates/events/join_team.html:38
msgid "You need to be logged to access this event."
msgstr "Necesitas tener una sesión iniciada para acceder a este evento."
#: events/templates/events/create_team.html:42
#: events/templates/events/event_info.html:113
#: events/templates/events/event_pwd.html:36
#: events/templates/events/join_team.html:47
msgid "Starts at"
msgstr "Empieza a las"
#: events/templates/events/create_team.html:43
#: events/templates/events/event_info.html:114
#: events/templates/events/event_pwd.html:37
#: events/templates/events/join_team.html:48
msgid "Ends at"
msgstr "Acaba a las"
#: events/templates/events/create_team.html:47
#: events/templates/events/event_info.html:129
#: events/templates/events/join_team.html:52
msgid "Manage my team"
msgstr "Gestionar mi equipo"
#: events/templates/events/create_team.html:48
#: events/templates/events/join_team.html:33
#: events/templates/events/join_team.html:53
msgid "Join Team"
msgstr "Unirse a un equipo"
#: events/templates/events/create_team.html:53
#: events/templates/events/join_team.html:58
msgid "Auto-matching"
msgstr "Auto-matching"
#: events/templates/events/create_team.html:57
#: events/templates/events/join_team.html:62
msgid "Find me a team !"
msgstr "¡ Encuentrame un equipo !"
#: events/templates/events/ctf_info.html:10
msgid "Event"
msgstr "Evento"
#: events/templates/events/ctf_info.html:25
#: events/templates/events/event_info.html:9
msgid "Subscriptions is over."
msgstr "El periodo de suscripción ha acabado."
#: events/templates/events/ctf_info.html:28
#: events/templates/events/event_info.html:12
#: events/templates/events/event_pwd.html:18
msgid "You're already registered to this event."
msgstr "Ya estás registrado a este evento."
#: events/templates/events/ctf_info.html:36
#: events/templates/events/event_info.html:18
msgid "This event is over."
msgstr "Este evento ya ha acabado."
#: events/templates/events/ctf_info.html:38
msgid "Error while processing your request. (Invalid Form)"
msgstr "Error al procesar tu solicitud. (Formulario incorrecto)"
#: events/templates/events/ctf_info.html:40
msgid ""
"Error: you're not registered to this event, so you can't register scores, "
"fucking logic."
msgstr ""
"Error: No estás registrado a este evento, por lo que no puedes ganar puntos, "
"Maldita lógica."
#: events/templates/events/event_info.html:20
#: events/templates/events/event_pwd.html:9
msgid "This event start at"
msgstr "Este evento empieza"
#: events/templates/events/event_info.html:30
msgid "Challenges"
msgstr "Retos"
#: events/templates/events/event_info.html:47
msgid "No challenges available."
msgstr "No hay retos disponibles."
#: events/templates/events/event_info.html:51
msgid "The event has not started yet."
msgstr "El evento no ha empezado aún."
#: events/templates/events/event_info.html:57
msgid "ScoreBoard"
msgstr "Tabla de puntuaciones"
#: events/templates/events/event_info.html:88
msgid "Team"
msgstr "Equipo"
#: events/templates/events/event_info.html:106
msgid "No one have earn point yet, you gonna be the first ?"
msgstr "Nadie ha conseguido puntos aún, ¿Vas a ser el primero?"
#: events/templates/events/event_pwd.html:15
#: events/templates/events/join_team.html:22
msgid "Wrong password submited."
msgstr "Contraseña incorrecta."
#: events/templates/events/event_pwd.html:20
msgid "This event is password protected"
msgstr "Este evento está protegido con contraseña"
#: events/templates/events/event_pwd.html:21
msgid "You need to submit the event password to gain access to this event."
msgstr "Necesitas introducir la contraseña del evento para participar."
#: events/templates/events/events_list.html:6 templates/base.html:61
msgid "Events"
msgstr "Eventos"
#: events/templates/events/events_list.html:38
msgid "See more"
msgstr "Ver más"
#: events/templates/events/events_list.html:44
msgid "No events available."
msgstr "No hay eventos disponibles."
#: events/templates/events/join_team.html:20
msgid "Team does not exist."
msgstr "El equipo no existe."
#: events/templates/events/join_team.html:24
msgid "Maximum size reached."
msgstr "Tamaño máximo alcanzado."
#: events/templates/events/manage_team.html:26
msgid "Team password"
msgstr "Contraseña del equipo"
#: events/templates/events/manage_team.html:44
#: events/templates/events/team.html:49
msgid "Members"
msgstr "Miembros"
#: events/templates/events/manage_team.html:51
msgid "Leave Team"
msgstr "Salir del equipo"
#: events/templates/events/team.html:38
msgid "It seems that this team has not solved any challenge yet..."
msgstr "Parece que este equipo aún no ha resuelto ningún reto..."
#: home/templates/home/home.html:20
msgid "Weekly Top 5"
msgstr "Top 5 semanal"
#: home/templates/home/home.html:56
msgid "No article available."
msgstr ""
msgstr "Articulos no disponibles."
#: home/templates/home/home.html:24
#: home/templates/home/home.html:61
msgid "Latest challenges added"
msgstr ""
msgstr "Ultimos retos añadidos"
#: home/templates/home/home.html:30
#: home/templates/home/home.html:66
msgid "points"
msgstr "puntos"
#: home/templates/home/home.html:70
msgid "No ctf available."
msgstr ""
msgstr "ctf no disponible."
#: home/templates/home/home.html:40
msgid "Flags counter"
msgstr ""
#: home/templates/home/home.html:74
msgid "Latest Flags"
msgstr "Ultimas Flags."
#: project/settings.py:120
msgid "Global Site"
msgstr ""
#: home/templates/home/home.html:88
msgid "Flags"
msgstr "Flags"
#: project/settings.py:121
msgid "Italian"
msgstr ""
#: home/templates/home/home.html:94
msgid "Users"
msgstr "Usuarios"
#: project/settings.py:122
#: project/settings.py:115
msgid "English"
msgstr "Inglés"
#: project/settings.py:116
msgid "German"
msgstr ""
msgstr "Alemán"
#: project/settings.py:123
#: project/settings.py:117
msgid "French"
msgstr ""
msgstr "Francés"
#: project/settings.py:124
msgid "Spanish"
msgstr ""
#: project/settings.py:125
#: project/settings.py:118
msgid "Russian"
msgstr ""
msgstr "Ruso"
#: scoreboard/templates/scoreboard/scoreboard.html:11
msgid "Rank"
msgstr ""
#: scoreboard/templates/scoreboard/scoreboard.html:36
#: scoreboard/templates/scoreboard/scoreboard.html:38
msgid "First"
msgstr ""
msgstr "Primero"
#: scoreboard/templates/scoreboard/scoreboard.html:37
#: scoreboard/templates/scoreboard/scoreboard.html:39
msgid "Previous"
msgstr ""
msgstr "Anterior"
#: scoreboard/templates/scoreboard/scoreboard.html:41
#: scoreboard/templates/scoreboard/scoreboard.html:43
msgid "Page "
msgstr ""
msgstr "Pagina "
#: scoreboard/templates/scoreboard/scoreboard.html:45
#: scoreboard/templates/scoreboard/scoreboard.html:47
msgid "Next"
msgstr ""
msgstr "Siguiente"
#: scoreboard/templates/scoreboard/scoreboard.html:46
#: scoreboard/templates/scoreboard/scoreboard.html:48
msgid "Last"
msgstr ""
msgstr "Último"
#: templates/base.html:59
msgid "Scoreboard"
msgstr ""
msgstr "Tabla de puntuaciones"
#: templates/base.html:86
msgid "Logout"
msgstr ""
#: templates/base.html:64
msgid "Resources"
msgstr "Recursos"
#: templates/base.html:93
msgid "Logout"
msgstr "Cerrar sesión"
#: templates/base.html:100
msgid "Sign Up"
msgstr ""
msgstr "Registrarse"
#: templates/base.html:135
msgid "Become a Patron!"
msgstr "¡Conviertete en un Mecenas!"
#: templates/registration/password_reset_complete.html:11
msgid "Your new password has been set."
msgstr ""
#: templates/registration/password_reset_confirm.html:19
msgid "Your password cant be too similar to your other personal information."
msgstr ""
msgstr "Contraseña cambiada correctamente."
#: templates/registration/password_reset_confirm.html:20
msgid "Your password must contain at least 8 characters."
msgstr ""
msgid "Your password cant be too similar to your other personal information."
msgstr "Tu contraseña no puede ser tan similar al resto de tu información personal."
#: templates/registration/password_reset_confirm.html:21
msgid "Your password cant be a commonly used password."
msgstr ""
msgid "Your password must contain at least 8 characters."
msgstr "Tu contraseña debe tener al menos 8 carácteres."
#: templates/registration/password_reset_confirm.html:22
msgid "Your password cant be a commonly used password."
msgstr "Tu contraseña no puede ser una contraseña tan común."
#: templates/registration/password_reset_confirm.html:23
msgid "Your password cant be entirely numeric."
msgstr ""
msgstr "Tu contraseña no puede ser solo numérica."
#: templates/registration/password_reset_confirm.html:25
#: templates/registration/password_reset_confirm.html:26
msgid "Confirm"
msgstr ""
msgstr "Confirmar"
#: templates/registration/password_reset_confirm.html:27
#: templates/registration/password_reset_confirm.html:28
msgid "Submit"
msgstr ""
msgstr "Enviar"
#: templates/registration/password_reset_done.html:10
#: templates/registration/password_reset_done.html:11
msgid ""
"We've emailed you instructions for setting your password. You should receive "
"the email shortly!"
msgstr ""
"Te hemos enviado por email las instrucciones para cambiar tu contraseña. ¡Deberías recibir "
"el email pronto!"
#: templates/registration/password_reset_form.html:15
#: templates/registration/password_reset_form.html:16
msgid "Reset"
msgstr ""
msgstr "Restablecer"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-05-10 19:28+0000\n"
"POT-Creation-Date: 2022-02-04 19:27+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -18,316 +18,632 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: accounts/templates/accounts/delete.html:8
#, fuzzy
#| msgid "Connected accounts"
msgid "Delete account"
msgstr "Comptes connectés"
#: accounts/templates/accounts/delete.html:11
msgid "Please confirm your password to delete your account."
msgstr ""
#: accounts/templates/accounts/delete.html:12
msgid "Deleted accounts cannot be recovered."
msgstr ""
#: accounts/templates/accounts/delete.html:15
msgid "Password inccorect."
msgstr ""
#: accounts/templates/accounts/delete.html:17
#, fuzzy
#| msgid "Your account has been created."
msgid "Your account has been deleted."
msgstr "Votre compte a été créé."
#: accounts/templates/accounts/delete.html:22
#: accounts/templates/accounts/login.html:19
#: accounts/templates/accounts/register.html:23
#: events/templates/events/create_team.html:27
#: events/templates/events/join_team.html:32
msgid "Password"
msgstr "Mot de passe"
#: accounts/templates/accounts/edit.html:21
#: accounts/templates/accounts/login.html:18
#: accounts/templates/accounts/register.html:22
#: ctfs/templates/ctfs/ctf_info.html:50 ctfs/templates/ctfs/ctfs_list.html:12
#: scoreboard/templates/scoreboard/scoreboard.html:12
#: ctfs/templates/ctfs/ctf_info.html:61 ctfs/templates/ctfs/ctfs_list.html:12
#: events/templates/events/ctf_info.html:71
#: events/templates/events/event_info.html:64
#: scoreboard/templates/scoreboard/scoreboard.html:13
msgid "Username"
msgstr ""
msgstr "Pseudo"
#: accounts/templates/accounts/edit.html:25
msgid "Email"
msgstr ""
msgstr "Email"
#: accounts/templates/accounts/edit.html:30
#: ctfs/templates/ctfs/ctf_info.html:51
#: scoreboard/templates/scoreboard/scoreboard.html:13
#: ctfs/templates/ctfs/ctf_info.html:62
#: events/templates/events/ctf_info.html:72
#: events/templates/events/event_info.html:65
#: scoreboard/templates/scoreboard/scoreboard.html:14
msgid "Website"
msgstr ""
msgstr "Site internet"
#: accounts/templates/accounts/edit.html:36
#: events/templates/events/manage_team.html:29
msgid "Apply"
msgstr ""
msgstr "Appliquer"
#: accounts/templates/accounts/edit.html:44
msgid "Connected accounts"
msgstr ""
#: accounts/templates/accounts/edit.html:51
msgid "Disconnect Discord"
msgstr ""
#: accounts/templates/accounts/edit.html:56
msgid "Connect Discord"
msgstr ""
#: accounts/templates/accounts/edit.html:66
#: accounts/templates/accounts/profile.html:37
#: ctfs/templates/ctfs/ctf_info.html:52 ctfs/templates/ctfs/ctfs_list.html:13
#: scoreboard/templates/scoreboard/scoreboard.html:14
#: accounts/templates/accounts/edit.html:47
#: accounts/templates/accounts/profile.html:46
#: ctfs/templates/ctfs/ctf_info.html:63 ctfs/templates/ctfs/ctfs_list.html:13
#: events/templates/events/event_info.html:66
#: events/templates/events/event_info.html:89
#: events/templates/events/manage_team.html:40
#: events/templates/events/team.html:45
#: scoreboard/templates/scoreboard/scoreboard.html:15
msgid "Score"
msgstr ""
msgstr "Score"
#: accounts/templates/accounts/edit.html:74
#: accounts/templates/accounts/profile.html:45
msgid "Member since"
msgstr ""
#: accounts/templates/accounts/edit.html:55
#: accounts/templates/accounts/profile.html:60
msgid "Registered since"
msgstr "Inscrit depuis"
#: accounts/templates/accounts/edit.html:61
#, fuzzy
#| msgid "Connected accounts"
msgid "Delete my account"
msgstr "Comptes connectés"
#: accounts/templates/accounts/login.html:13
msgid "Please, verify your infos."
msgstr ""
#: accounts/templates/accounts/login.html:19
#: accounts/templates/accounts/register.html:23
msgid "Password"
msgstr ""
msgstr "Merci de vérifier vos informations."
#: accounts/templates/accounts/login.html:22
msgid "Reset password"
msgstr ""
msgstr "Réinitialiser le mot de passe"
#: accounts/templates/accounts/login.html:31
#: accounts/templates/accounts/register.html:38 templates/base.html:90
#: accounts/templates/accounts/register.html:38 templates/base.html:97
#: templates/registration/password_reset_complete.html:18
#: templates/registration/password_reset_confirm.html:37
#: templates/registration/password_reset_done.html:17
#: templates/registration/password_reset_form.html:25
#: templates/registration/password_reset_confirm.html:38
#: templates/registration/password_reset_done.html:18
#: templates/registration/password_reset_form.html:26
msgid "Login"
msgstr ""
msgstr "Connexion"
#: accounts/templates/accounts/login.html:32
#: accounts/templates/accounts/register.html:37
#: templates/registration/password_reset_complete.html:19
#: templates/registration/password_reset_confirm.html:38
#: templates/registration/password_reset_done.html:18
#: templates/registration/password_reset_form.html:26
#: templates/registration/password_reset_confirm.html:39
#: templates/registration/password_reset_done.html:19
#: templates/registration/password_reset_form.html:27
msgid "Sign up"
msgstr ""
msgstr "Inscription"
#: accounts/templates/accounts/profile.html:12
#: accounts/templates/accounts/profile.html:10
msgid "Challenges Solved by"
msgstr "Challenges résolus par"
#: accounts/templates/accounts/profile.html:21
#: events/templates/events/team.html:20
msgid "Challenge Name"
msgstr ""
msgstr "Nom du challenge"
#: accounts/templates/accounts/profile.html:13
#: accounts/templates/accounts/profile.html:22
#: events/templates/events/team.html:21
msgid "Category"
msgstr ""
msgstr "Catégorie"
#: accounts/templates/accounts/profile.html:14
#: accounts/templates/accounts/profile.html:23
#: events/templates/events/team.html:22
msgid "Points"
msgstr ""
msgstr "Points"
#: accounts/templates/accounts/profile.html:15
#: ctfs/templates/ctfs/ctf_info.html:53
#: accounts/templates/accounts/profile.html:24
#: ctfs/templates/ctfs/ctf_info.html:64
#: events/templates/events/ctf_info.html:73
#: events/templates/events/team.html:23
msgid "Date"
msgstr ""
msgstr "Date"
#: accounts/templates/accounts/profile.html:30
msgid "It's seem {{ user.username }} have never solved any CTF yet..."
msgstr ""
#: accounts/templates/accounts/profile.html:39
msgid "It seems that this user has not solved any challenge yet..."
msgstr "Il semble que cet utilisateur n'a pas encore résolu de CTF..."
#: accounts/templates/accounts/profile.html:47
#: events/templates/events/event_info.html:63
#: events/templates/events/event_info.html:87
#: events/templates/events/manage_team.html:41
#: events/templates/events/team.html:46
#: scoreboard/templates/scoreboard/scoreboard.html:12
msgid "Rank"
msgstr "Rang"
#: accounts/templates/accounts/profile.html:56
msgid "Status: Member"
msgstr "Status : Membre"
#: accounts/templates/accounts/profile.html:58
msgid "Status: Visitor"
msgstr "Status : Visiteur"
#: accounts/templates/accounts/profile.html:64
#: events/templates/events/team.html:57
#, fuzzy
#| msgid "Categories"
msgid "Categories stats"
msgstr "Catégories"
#: accounts/templates/accounts/register.html:13
msgid "Welcome !"
msgstr ""
msgstr "Bienvenue !"
#: accounts/templates/accounts/register.html:14
msgid "Your account has been created."
msgstr ""
msgstr "Votre compte a été créé."
#: accounts/templates/accounts/register.html:25
msgid "Personal website"
msgstr ""
msgstr "Site personnel"
#: accounts/templates/accounts/register.html:26
#: events/templates/events/event_info.html:119
msgid "Register"
msgstr ""
msgstr "Inscription"
#: accounts/views/views.py:31
#: accounts/views/views.py:33
msgid "Your account was inactive."
msgstr ""
msgstr "Votre compte était inactif."
#: accounts/views/views.py:50
#: accounts/views/views.py:52
msgid ""
"The password must contain at least one letter and at least one digit or "
"punctuation character."
msgstr ""
"Le mot de passe doit contenir au moins une lettre, un chiffre et un signe de "
"ponctuation."
#: accounts/views/views.py:52
#: accounts/views/views.py:54
msgid "A user with that email already exists."
msgstr ""
msgstr "Un utilisateur avec cet email existe déjà."
#: accounts/views/views.py:65
#: accounts/views/views.py:67
msgid "A user with that username already exists."
msgstr ""
msgstr "Un utilisateur avec ce pseudo existe déjà."
#: accounts/views/views.py:93
#: accounts/views/views.py:95
msgid "Email already taken."
msgstr ""
msgstr "L'adresse mail est déjà utilisée."
#: accounts/views/views.py:99
#: accounts/views/views.py:101
msgid "Username already taken."
msgstr ""
msgstr "Le pseudo est déjà utilisé."
#: accounts/views/views.py:103
#: accounts/views/views.py:105 events/views/teams.py:124
msgid "Updated."
msgstr ""
msgstr "Mis à jour."
#: ctfs/templates/ctfs/ctf_info.html:9
#: ctfs/templates/ctfs/ctf_info.html:10
#: events/templates/events/ctf_info.html:12
msgid "Published date"
msgstr ""
msgstr "Date de publication"
#: ctfs/templates/ctfs/ctf_info.html:17
msgid "Congratulation !"
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:14
#, fuzzy
#| msgid "No category available."
msgid "Challenge is not yet available."
msgstr "Il n'y a pas de catégorie disponible."
#: ctfs/templates/ctfs/ctf_info.html:19
msgid "Already flagged"
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:21 ctfs/templates/ctfs/ctf_info.html:30
msgid "Start the challenge"
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:23 ctfs/templates/ctfs/ctf_info.html:32
msgid "Download"
#: ctfs/templates/ctfs/ctf_info.html:21
#: events/templates/events/ctf_info.html:18 home/templates/home/home.html:46
msgid ""
"No translation available. Please try another language (English or French)."
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:27
#: events/templates/events/ctf_info.html:32
msgid "Congratulation !"
msgstr "Félicitations !"
#: ctfs/templates/ctfs/ctf_info.html:29
#: events/templates/events/ctf_info.html:34
msgid "Already flagged"
msgstr "Déjà résolu"
#: ctfs/templates/ctfs/ctf_info.html:31 ctfs/templates/ctfs/ctf_info.html:40
#: events/templates/events/ctf_info.html:42
#: events/templates/events/ctf_info.html:51
msgid "Start the challenge"
msgstr "Démarrer le challenge"
#: ctfs/templates/ctfs/ctf_info.html:33 ctfs/templates/ctfs/ctf_info.html:42
#: events/templates/events/ctf_info.html:44
#: events/templates/events/ctf_info.html:53
msgid "Download"
msgstr "Télécharger"
#: ctfs/templates/ctfs/ctf_info.html:37
#: events/templates/events/ctf_info.html:48
msgid "Wrong flag ! You can do it !"
msgstr ""
msgstr "Mauvais flag ! Vous pouvez le faire !"
#: ctfs/templates/ctfs/ctf_info.html:45
#: ctfs/templates/ctfs/ctf_info.html:56
#: events/templates/events/ctf_info.html:66
msgid "Solved by"
msgstr ""
msgstr "Résolu par"
#: ctfs/templates/ctfs/ctf_info.html:68
msgid "Nobody have solved this CTF."
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:80
#: events/templates/events/ctf_info.html:96
msgid "Nobody has solved this challenge yet."
msgstr "Personne n'a résolu ce CTF."
#: ctfs/templates/ctfs/ctf_info.html:74
#: ctfs/templates/ctfs/ctf_info.html:87
#: events/templates/events/ctf_info.html:103
msgid "Author"
msgstr ""
msgstr "Auteur"
#: ctfs/templates/ctfs/ctf_info.html:75
#: ctfs/templates/ctfs/ctf_info.html:88
#: events/templates/events/ctf_info.html:104
msgid "Point reward"
msgstr ""
msgstr "Points"
#: ctfs/templates/ctfs/ctfs_list.html:14
msgid "Solved"
msgstr ""
msgstr "Résolu"
#: ctfs/templates/ctfs/ctfs_list.html:37
msgid "No ctf available for this category."
msgstr ""
msgstr "Il n'y a pas de challenges dans cette catégorie."
#: ctfs/templates/ctfs/ctfs_list.html:42
msgid "Categories"
msgstr ""
msgstr "Catégories"
#: ctfs/templates/ctfs/ctfs_list.html:48 templates/base.html:54
msgid "No category available."
msgstr "Il n'y a pas de catégorie disponible."
#: events/templates/events/create_team.html:10
#: events/templates/events/join_team.html:10
#, fuzzy
#| msgid "This event start at"
msgid "This event starts at"
msgstr "Cet événement débute à"
#: events/templates/events/create_team.html:17
#: events/templates/events/join_team.html:17
#, fuzzy
#| msgid "You're already registered to this event."
msgid "You need to be registered to the event."
msgstr "Vous êtes déjà inscrit à cet événement."
#: events/templates/events/create_team.html:20 events/views/teams.py:120
#, fuzzy
#| msgid "Username already taken."
msgid "Name already taken."
msgstr "Ce nom est déjà utilisé."
#: events/templates/events/create_team.html:26
#: events/templates/events/join_team.html:31
#: events/templates/events/manage_team.html:22
msgid "Team name"
msgstr "Nom de l'équipe"
#: events/templates/events/create_team.html:28
#: events/templates/events/create_team.html:49
#: events/templates/events/join_team.html:54
msgid "Create Team"
msgstr "Créer une équipe"
#: events/templates/events/create_team.html:33
#: events/templates/events/event_pwd.html:28
#: events/templates/events/join_team.html:38
msgid "You need to be logged to access this event."
msgstr "Vous devez être connecté pour accéder à cet événement."
#: events/templates/events/create_team.html:42
#: events/templates/events/event_info.html:113
#: events/templates/events/event_pwd.html:36
#: events/templates/events/join_team.html:47
msgid "Starts at"
msgstr "Début"
#: events/templates/events/create_team.html:43
#: events/templates/events/event_info.html:114
#: events/templates/events/event_pwd.html:37
#: events/templates/events/join_team.html:48
msgid "Ends at"
msgstr "Fin"
#: events/templates/events/create_team.html:47
#: events/templates/events/event_info.html:129
#: events/templates/events/join_team.html:52
msgid "Manage my team"
msgstr "Gérer mon équipe"
#: events/templates/events/create_team.html:48
#: events/templates/events/join_team.html:33
#: events/templates/events/join_team.html:53
msgid "Join Team"
msgstr "Rejoindre une équipe"
#: events/templates/events/create_team.html:53
#: events/templates/events/join_team.html:58
msgid "Auto-matching"
msgstr ""
#: home/templates/home/home.html:19
#: events/templates/events/create_team.html:57
#: events/templates/events/join_team.html:62
msgid "Find me a team !"
msgstr ""
#: events/templates/events/ctf_info.html:10
msgid "Event"
msgstr "Événement"
#: events/templates/events/ctf_info.html:25
#: events/templates/events/event_info.html:9
msgid "Subscriptions is over."
msgstr "Les inscriptions sont terminées."
#: events/templates/events/ctf_info.html:28
#: events/templates/events/event_info.html:12
#: events/templates/events/event_pwd.html:18
msgid "You're already registered to this event."
msgstr "Vous êtes déjà inscrit à cet événement."
#: events/templates/events/ctf_info.html:36
#: events/templates/events/event_info.html:18
msgid "This event is over."
msgstr "Cet événement est terminé."
#: events/templates/events/ctf_info.html:38
msgid "Error while processing your request. (Invalid Form)"
msgstr "Erreur lors du traitement de votre requête. (Formulaire non valide)"
#: events/templates/events/ctf_info.html:40
msgid ""
"Error: you're not registered to this event, so you can't register scores, "
"fucking logic."
msgstr ""
"Erreur : vous n'êtes pas inscrit à cet événement, vous ne pouvez donc pas "
"enregistrer de scores,C'est putain de logique."
#: events/templates/events/event_info.html:20
#: events/templates/events/event_pwd.html:9
msgid "This event start at"
msgstr "Cet événement débute à"
#: events/templates/events/event_info.html:30
#, fuzzy
#| msgid "Challenge Name"
msgid "Challenges"
msgstr "Nom du challenge"
#: events/templates/events/event_info.html:47
#, fuzzy
#| msgid "No category available."
msgid "No challenges available."
msgstr "Il n'y a pas de catégorie disponible."
#: events/templates/events/event_info.html:51
msgid "The event has not started yet."
msgstr "L'événement n'a pas encore commencé."
#: events/templates/events/event_info.html:57
#, fuzzy
#| msgid "Scoreboard"
msgid "ScoreBoard"
msgstr "Classement"
#: events/templates/events/event_info.html:88
msgid "Team"
msgstr "Équipe"
#: events/templates/events/event_info.html:106
msgid "No one have earn point yet, you gonna be the first ?"
msgstr "Personne n'a encore gagné de point, allez-vous être le premier ?"
#: events/templates/events/event_pwd.html:15
#: events/templates/events/join_team.html:22
msgid "Wrong password submited."
msgstr "Mauvais mot de passe saisi."
#: events/templates/events/event_pwd.html:20
msgid "This event is password protected"
msgstr "Cet événement est protégé par un mot de passe"
#: events/templates/events/event_pwd.html:21
msgid "You need to submit the event password to gain access to this event."
msgstr "Vous devez saisir le mot de passe de l'événement pour y avoir accès."
#: events/templates/events/events_list.html:6 templates/base.html:61
msgid "Events"
msgstr "Événements"
#: events/templates/events/events_list.html:38
msgid "See more"
msgstr "Voir plus"
#: events/templates/events/events_list.html:44
msgid "No events available."
msgstr "Pas d'évènement disponible."
#: events/templates/events/join_team.html:20
msgid "Team does not exist."
msgstr "Cette équipe n'existe pas."
#: events/templates/events/join_team.html:24
msgid "Maximum size reached."
msgstr "Taille maximale atteinte."
#: events/templates/events/manage_team.html:26
msgid "Team password"
msgstr "Mot de passe de l'équipe"
#: events/templates/events/manage_team.html:44
#: events/templates/events/team.html:49
msgid "Members"
msgstr "Membres"
#: events/templates/events/manage_team.html:51
msgid "Leave Team"
msgstr "Quitte l'équipe"
#: events/templates/events/team.html:38
msgid "It seems that this team has not solved any challenge yet..."
msgstr "Il semble que cette équipe n'a pas encore résolu de challenge..."
#: home/templates/home/home.html:20
msgid "Weekly Top 5"
msgstr ""
#: home/templates/home/home.html:56
msgid "No article available."
msgstr ""
msgstr "Il n'y a pas d'article disponible."
#: home/templates/home/home.html:24
#: home/templates/home/home.html:61
msgid "Latest challenges added"
msgstr ""
msgstr "Derniers challenges ajoutés"
#: home/templates/home/home.html:30
#: home/templates/home/home.html:66
#, fuzzy
#| msgid "Points"
msgid "points"
msgstr "Points"
#: home/templates/home/home.html:70
msgid "No ctf available."
msgstr "Pas de challenge disponible"
#: home/templates/home/home.html:74
msgid "Latest Flags"
msgstr ""
#: home/templates/home/home.html:40
msgid "Flags counter"
#: home/templates/home/home.html:88
msgid "Flags"
msgstr ""
#: project/settings.py:120
msgid "Global Site"
msgstr ""
#: home/templates/home/home.html:94
#, fuzzy
#| msgid "Username"
msgid "Users"
msgstr "Pseudo"
#: project/settings.py:121
msgid "Italian"
msgstr ""
#: project/settings.py:115
msgid "English"
msgstr "Anglais"
#: project/settings.py:122
#: project/settings.py:116
msgid "German"
msgstr ""
msgstr "Allemand"
#: project/settings.py:123
#: project/settings.py:117
msgid "French"
msgstr ""
msgstr "Français"
#: project/settings.py:124
msgid "Spanish"
msgstr ""
#: project/settings.py:125
#: project/settings.py:118
msgid "Russian"
msgstr ""
msgstr "Russe"
#: scoreboard/templates/scoreboard/scoreboard.html:11
msgid "Rank"
msgstr ""
#: scoreboard/templates/scoreboard/scoreboard.html:36
#: scoreboard/templates/scoreboard/scoreboard.html:38
msgid "First"
msgstr ""
msgstr "Début"
#: scoreboard/templates/scoreboard/scoreboard.html:37
#: scoreboard/templates/scoreboard/scoreboard.html:39
msgid "Previous"
msgstr ""
msgstr "Précédente"
#: scoreboard/templates/scoreboard/scoreboard.html:41
#: scoreboard/templates/scoreboard/scoreboard.html:43
msgid "Page "
msgstr ""
msgstr "Page"
#: scoreboard/templates/scoreboard/scoreboard.html:45
#: scoreboard/templates/scoreboard/scoreboard.html:47
msgid "Next"
msgstr ""
msgstr "Suivante"
#: scoreboard/templates/scoreboard/scoreboard.html:46
#: scoreboard/templates/scoreboard/scoreboard.html:48
msgid "Last"
msgstr ""
msgstr "Fin"
#: templates/base.html:59
msgid "Scoreboard"
msgstr ""
msgstr "Classement"
#: templates/base.html:86
msgid "Logout"
#: templates/base.html:64
msgid "Resources"
msgstr ""
#: templates/base.html:93
msgid "Logout"
msgstr "Déconnexion"
#: templates/base.html:100
msgid "Sign Up"
msgstr ""
msgstr "Inscription"
#: templates/base.html:135
msgid "Become a Patron!"
msgstr "Soutenez nous via Patreon !"
#: templates/registration/password_reset_complete.html:11
msgid "Your new password has been set."
msgstr ""
#: templates/registration/password_reset_confirm.html:19
msgid "Your password cant be too similar to your other personal information."
msgstr ""
msgstr "Votre mot de passe a été mis à jour."
#: templates/registration/password_reset_confirm.html:20
msgid "Your password must contain at least 8 characters."
msgstr ""
msgid "Your password cant be too similar to your other personal information."
msgstr "Votre mot de passe ne peut pas être similaire à votre adresse mail."
#: templates/registration/password_reset_confirm.html:21
msgid "Your password cant be a commonly used password."
msgstr ""
msgid "Your password must contain at least 8 characters."
msgstr "Votre mot de passe doit contenir au moins 8 caractères."
#: templates/registration/password_reset_confirm.html:22
msgid "Your password cant be a commonly used password."
msgstr "Votre mot de passe ne peut pas être un mot de passe commun."
#: templates/registration/password_reset_confirm.html:23
msgid "Your password cant be entirely numeric."
msgstr ""
msgstr "Votre mot de passe ne peut pas être entièrement numérique."
#: templates/registration/password_reset_confirm.html:25
#: templates/registration/password_reset_confirm.html:26
msgid "Confirm"
msgstr ""
msgstr "Confirmer"
#: templates/registration/password_reset_confirm.html:27
#: templates/registration/password_reset_confirm.html:28
msgid "Submit"
msgstr ""
msgstr "Soumettre"
#: templates/registration/password_reset_done.html:10
#: templates/registration/password_reset_done.html:11
msgid ""
"We've emailed you instructions for setting your password. You should receive "
"the email shortly!"
msgstr ""
"Vous devrierz recevoir rapidement un email avec des instructions pour "
"réinitialiser votre mot de passe."
#: templates/registration/password_reset_form.html:15
#: templates/registration/password_reset_form.html:16
msgid "Reset"
msgstr ""
msgstr "Réinitialiser"
#, fuzzy
#~| msgid "Manage my team"
#~ msgid "Manage team"
#~ msgstr "Gérer mon équipe"
#~ msgid "Start at"
#~ msgstr "Début"
#~ msgid "End at"
#~ msgstr "Fin"
#~ msgid "Disconnect Discord"
#~ msgstr "Déconnecter Discord"
#~ msgid "Connect Discord"
#~ msgstr "Connecter Discord"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-05-10 19:28+0000\n"
"POT-Creation-Date: 2022-02-04 19:27+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -18,11 +18,41 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: accounts/templates/accounts/delete.html:8
msgid "Delete account"
msgstr ""
#: accounts/templates/accounts/delete.html:11
msgid "Please confirm your password to delete your account."
msgstr ""
#: accounts/templates/accounts/delete.html:12
msgid "Deleted accounts cannot be recovered."
msgstr ""
#: accounts/templates/accounts/delete.html:15
msgid "Password inccorect."
msgstr ""
#: accounts/templates/accounts/delete.html:17
msgid "Your account has been deleted."
msgstr ""
#: accounts/templates/accounts/delete.html:22
#: accounts/templates/accounts/login.html:19
#: accounts/templates/accounts/register.html:23
#: events/templates/events/create_team.html:27
#: events/templates/events/join_team.html:32
msgid "Password"
msgstr ""
#: accounts/templates/accounts/edit.html:21
#: accounts/templates/accounts/login.html:18
#: accounts/templates/accounts/register.html:22
#: ctfs/templates/ctfs/ctf_info.html:50 ctfs/templates/ctfs/ctfs_list.html:12
#: scoreboard/templates/scoreboard/scoreboard.html:12
#: ctfs/templates/ctfs/ctf_info.html:61 ctfs/templates/ctfs/ctfs_list.html:12
#: events/templates/events/ctf_info.html:71
#: events/templates/events/event_info.html:64
#: scoreboard/templates/scoreboard/scoreboard.html:13
msgid "Username"
msgstr ""
@ -31,89 +61,114 @@ msgid "Email"
msgstr ""
#: accounts/templates/accounts/edit.html:30
#: ctfs/templates/ctfs/ctf_info.html:51
#: scoreboard/templates/scoreboard/scoreboard.html:13
#: ctfs/templates/ctfs/ctf_info.html:62
#: events/templates/events/ctf_info.html:72
#: events/templates/events/event_info.html:65
#: scoreboard/templates/scoreboard/scoreboard.html:14
msgid "Website"
msgstr ""
#: accounts/templates/accounts/edit.html:36
#: events/templates/events/manage_team.html:29
msgid "Apply"
msgstr ""
#: accounts/templates/accounts/edit.html:44
msgid "Connected accounts"
msgstr ""
#: accounts/templates/accounts/edit.html:51
msgid "Disconnect Discord"
msgstr ""
#: accounts/templates/accounts/edit.html:56
msgid "Connect Discord"
msgstr ""
#: accounts/templates/accounts/edit.html:66
#: accounts/templates/accounts/profile.html:37
#: ctfs/templates/ctfs/ctf_info.html:52 ctfs/templates/ctfs/ctfs_list.html:13
#: scoreboard/templates/scoreboard/scoreboard.html:14
#: accounts/templates/accounts/edit.html:47
#: accounts/templates/accounts/profile.html:46
#: ctfs/templates/ctfs/ctf_info.html:63 ctfs/templates/ctfs/ctfs_list.html:13
#: events/templates/events/event_info.html:66
#: events/templates/events/event_info.html:89
#: events/templates/events/manage_team.html:40
#: events/templates/events/team.html:45
#: scoreboard/templates/scoreboard/scoreboard.html:15
msgid "Score"
msgstr ""
#: accounts/templates/accounts/edit.html:74
#: accounts/templates/accounts/profile.html:45
msgid "Member since"
#: accounts/templates/accounts/edit.html:55
#: accounts/templates/accounts/profile.html:60
msgid "Registered since"
msgstr ""
#: accounts/templates/accounts/edit.html:61
msgid "Delete my account"
msgstr ""
#: accounts/templates/accounts/login.html:13
msgid "Please, verify your infos."
msgstr ""
#: accounts/templates/accounts/login.html:19
#: accounts/templates/accounts/register.html:23
msgid "Password"
msgstr ""
#: accounts/templates/accounts/login.html:22
msgid "Reset password"
msgstr ""
#: accounts/templates/accounts/login.html:31
#: accounts/templates/accounts/register.html:38 templates/base.html:90
#: accounts/templates/accounts/register.html:38 templates/base.html:97
#: templates/registration/password_reset_complete.html:18
#: templates/registration/password_reset_confirm.html:37
#: templates/registration/password_reset_done.html:17
#: templates/registration/password_reset_form.html:25
#: templates/registration/password_reset_confirm.html:38
#: templates/registration/password_reset_done.html:18
#: templates/registration/password_reset_form.html:26
msgid "Login"
msgstr ""
#: accounts/templates/accounts/login.html:32
#: accounts/templates/accounts/register.html:37
#: templates/registration/password_reset_complete.html:19
#: templates/registration/password_reset_confirm.html:38
#: templates/registration/password_reset_done.html:18
#: templates/registration/password_reset_form.html:26
#: templates/registration/password_reset_confirm.html:39
#: templates/registration/password_reset_done.html:19
#: templates/registration/password_reset_form.html:27
msgid "Sign up"
msgstr ""
#: accounts/templates/accounts/profile.html:12
#: accounts/templates/accounts/profile.html:10
msgid "Challenges Solved by"
msgstr ""
#: accounts/templates/accounts/profile.html:21
#: events/templates/events/team.html:20
msgid "Challenge Name"
msgstr ""
#: accounts/templates/accounts/profile.html:13
#: accounts/templates/accounts/profile.html:22
#: events/templates/events/team.html:21
msgid "Category"
msgstr ""
#: accounts/templates/accounts/profile.html:14
#: accounts/templates/accounts/profile.html:23
#: events/templates/events/team.html:22
msgid "Points"
msgstr ""
#: accounts/templates/accounts/profile.html:15
#: ctfs/templates/ctfs/ctf_info.html:53
#: accounts/templates/accounts/profile.html:24
#: ctfs/templates/ctfs/ctf_info.html:64
#: events/templates/events/ctf_info.html:73
#: events/templates/events/team.html:23
msgid "Date"
msgstr ""
#: accounts/templates/accounts/profile.html:30
msgid "It's seem {{ user.username }} have never solved any CTF yet..."
#: accounts/templates/accounts/profile.html:39
msgid "It seems that this user has not solved any challenge yet..."
msgstr ""
#: accounts/templates/accounts/profile.html:47
#: events/templates/events/event_info.html:63
#: events/templates/events/event_info.html:87
#: events/templates/events/manage_team.html:41
#: events/templates/events/team.html:46
#: scoreboard/templates/scoreboard/scoreboard.html:12
msgid "Rank"
msgstr ""
#: accounts/templates/accounts/profile.html:56
msgid "Status: Member"
msgstr ""
#: accounts/templates/accounts/profile.html:58
msgid "Status: Visitor"
msgstr ""
#: accounts/templates/accounts/profile.html:64
#: events/templates/events/team.html:57
msgid "Categories stats"
msgstr ""
#: accounts/templates/accounts/register.html:13
@ -129,76 +184,99 @@ msgid "Personal website"
msgstr ""
#: accounts/templates/accounts/register.html:26
#: events/templates/events/event_info.html:119
msgid "Register"
msgstr ""
#: accounts/views/views.py:31
#: accounts/views/views.py:33
msgid "Your account was inactive."
msgstr ""
#: accounts/views/views.py:50
#: accounts/views/views.py:52
msgid ""
"The password must contain at least one letter and at least one digit or "
"punctuation character."
msgstr ""
#: accounts/views/views.py:52
#: accounts/views/views.py:54
msgid "A user with that email already exists."
msgstr ""
#: accounts/views/views.py:65
#: accounts/views/views.py:67
msgid "A user with that username already exists."
msgstr ""
#: accounts/views/views.py:93
#: accounts/views/views.py:95
msgid "Email already taken."
msgstr ""
#: accounts/views/views.py:99
#: accounts/views/views.py:101
msgid "Username already taken."
msgstr ""
#: accounts/views/views.py:103
#: accounts/views/views.py:105 events/views/teams.py:124
msgid "Updated."
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:9
#: ctfs/templates/ctfs/ctf_info.html:10
#: events/templates/events/ctf_info.html:12
msgid "Published date"
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:17
msgid "Congratulation !"
#: ctfs/templates/ctfs/ctf_info.html:14
msgid "Challenge is not yet available."
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:19
msgid "Already flagged"
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:21 ctfs/templates/ctfs/ctf_info.html:30
msgid "Start the challenge"
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:23 ctfs/templates/ctfs/ctf_info.html:32
msgid "Download"
#: ctfs/templates/ctfs/ctf_info.html:21
#: events/templates/events/ctf_info.html:18 home/templates/home/home.html:46
msgid ""
"No translation available. Please try another language (English or French)."
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:27
#: events/templates/events/ctf_info.html:32
msgid "Congratulation !"
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:29
#: events/templates/events/ctf_info.html:34
msgid "Already flagged"
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:31 ctfs/templates/ctfs/ctf_info.html:40
#: events/templates/events/ctf_info.html:42
#: events/templates/events/ctf_info.html:51
msgid "Start the challenge"
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:33 ctfs/templates/ctfs/ctf_info.html:42
#: events/templates/events/ctf_info.html:44
#: events/templates/events/ctf_info.html:53
msgid "Download"
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:37
#: events/templates/events/ctf_info.html:48
msgid "Wrong flag ! You can do it !"
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:45
#: ctfs/templates/ctfs/ctf_info.html:56
#: events/templates/events/ctf_info.html:66
msgid "Solved by"
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:68
msgid "Nobody have solved this CTF."
#: ctfs/templates/ctfs/ctf_info.html:80
#: events/templates/events/ctf_info.html:96
msgid "Nobody has solved this challenge yet."
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:74
#: ctfs/templates/ctfs/ctf_info.html:87
#: events/templates/events/ctf_info.html:103
msgid "Author"
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:75
#: ctfs/templates/ctfs/ctf_info.html:88
#: events/templates/events/ctf_info.html:104
msgid "Point reward"
msgstr ""
@ -218,67 +296,248 @@ msgstr ""
msgid "No category available."
msgstr ""
#: home/templates/home/home.html:19
#: events/templates/events/create_team.html:10
#: events/templates/events/join_team.html:10
msgid "This event starts at"
msgstr ""
#: events/templates/events/create_team.html:17
#: events/templates/events/join_team.html:17
msgid "You need to be registered to the event."
msgstr ""
#: events/templates/events/create_team.html:20 events/views/teams.py:120
msgid "Name already taken."
msgstr ""
#: events/templates/events/create_team.html:26
#: events/templates/events/join_team.html:31
#: events/templates/events/manage_team.html:22
msgid "Team name"
msgstr ""
#: events/templates/events/create_team.html:28
#: events/templates/events/create_team.html:49
#: events/templates/events/join_team.html:54
msgid "Create Team"
msgstr ""
#: events/templates/events/create_team.html:33
#: events/templates/events/event_pwd.html:28
#: events/templates/events/join_team.html:38
msgid "You need to be logged to access this event."
msgstr ""
#: events/templates/events/create_team.html:42
#: events/templates/events/event_info.html:113
#: events/templates/events/event_pwd.html:36
#: events/templates/events/join_team.html:47
msgid "Starts at"
msgstr ""
#: events/templates/events/create_team.html:43
#: events/templates/events/event_info.html:114
#: events/templates/events/event_pwd.html:37
#: events/templates/events/join_team.html:48
msgid "Ends at"
msgstr ""
#: events/templates/events/create_team.html:47
#: events/templates/events/event_info.html:129
#: events/templates/events/join_team.html:52
msgid "Manage my team"
msgstr ""
#: events/templates/events/create_team.html:48
#: events/templates/events/join_team.html:33
#: events/templates/events/join_team.html:53
msgid "Join Team"
msgstr ""
#: events/templates/events/create_team.html:53
#: events/templates/events/join_team.html:58
msgid "Auto-matching"
msgstr ""
#: events/templates/events/create_team.html:57
#: events/templates/events/join_team.html:62
msgid "Find me a team !"
msgstr ""
#: events/templates/events/ctf_info.html:10
msgid "Event"
msgstr ""
#: events/templates/events/ctf_info.html:25
#: events/templates/events/event_info.html:9
msgid "Subscriptions is over."
msgstr ""
#: events/templates/events/ctf_info.html:28
#: events/templates/events/event_info.html:12
#: events/templates/events/event_pwd.html:18
msgid "You're already registered to this event."
msgstr ""
#: events/templates/events/ctf_info.html:36
#: events/templates/events/event_info.html:18
msgid "This event is over."
msgstr ""
#: events/templates/events/ctf_info.html:38
msgid "Error while processing your request. (Invalid Form)"
msgstr ""
#: events/templates/events/ctf_info.html:40
msgid ""
"Error: you're not registered to this event, so you can't register scores, "
"fucking logic."
msgstr ""
#: events/templates/events/event_info.html:20
#: events/templates/events/event_pwd.html:9
msgid "This event start at"
msgstr ""
#: events/templates/events/event_info.html:30
msgid "Challenges"
msgstr ""
#: events/templates/events/event_info.html:47
msgid "No challenges available."
msgstr ""
#: events/templates/events/event_info.html:51
msgid "The event has not started yet."
msgstr ""
#: events/templates/events/event_info.html:57
msgid "ScoreBoard"
msgstr ""
#: events/templates/events/event_info.html:88
msgid "Team"
msgstr ""
#: events/templates/events/event_info.html:106
msgid "No one have earn point yet, you gonna be the first ?"
msgstr ""
#: events/templates/events/event_pwd.html:15
#: events/templates/events/join_team.html:22
msgid "Wrong password submited."
msgstr ""
#: events/templates/events/event_pwd.html:20
msgid "This event is password protected"
msgstr ""
#: events/templates/events/event_pwd.html:21
msgid "You need to submit the event password to gain access to this event."
msgstr ""
#: events/templates/events/events_list.html:6 templates/base.html:61
msgid "Events"
msgstr ""
#: events/templates/events/events_list.html:38
msgid "See more"
msgstr ""
#: events/templates/events/events_list.html:44
msgid "No events available."
msgstr ""
#: events/templates/events/join_team.html:20
msgid "Team does not exist."
msgstr ""
#: events/templates/events/join_team.html:24
msgid "Maximum size reached."
msgstr ""
#: events/templates/events/manage_team.html:26
msgid "Team password"
msgstr ""
#: events/templates/events/manage_team.html:44
#: events/templates/events/team.html:49
msgid "Members"
msgstr ""
#: events/templates/events/manage_team.html:51
msgid "Leave Team"
msgstr ""
#: events/templates/events/team.html:38
msgid "It seems that this team has not solved any challenge yet..."
msgstr ""
#: home/templates/home/home.html:20
msgid "Weekly Top 5"
msgstr ""
#: home/templates/home/home.html:56
msgid "No article available."
msgstr ""
#: home/templates/home/home.html:24
#: home/templates/home/home.html:61
msgid "Latest challenges added"
msgstr ""
#: home/templates/home/home.html:30
#: home/templates/home/home.html:66
msgid "points"
msgstr ""
#: home/templates/home/home.html:70
msgid "No ctf available."
msgstr ""
#: home/templates/home/home.html:40
msgid "Flags counter"
#: home/templates/home/home.html:74
msgid "Latest Flags"
msgstr ""
#: project/settings.py:120
msgid "Global Site"
#: home/templates/home/home.html:88
msgid "Flags"
msgstr ""
#: project/settings.py:121
msgid "Italian"
#: home/templates/home/home.html:94
msgid "Users"
msgstr ""
#: project/settings.py:122
#: project/settings.py:115
msgid "English"
msgstr ""
#: project/settings.py:116
msgid "German"
msgstr ""
#: project/settings.py:123
#: project/settings.py:117
msgid "French"
msgstr ""
#: project/settings.py:124
msgid "Spanish"
msgstr ""
#: project/settings.py:125
#: project/settings.py:118
msgid "Russian"
msgstr ""
#: scoreboard/templates/scoreboard/scoreboard.html:11
msgid "Rank"
msgstr ""
#: scoreboard/templates/scoreboard/scoreboard.html:36
#: scoreboard/templates/scoreboard/scoreboard.html:38
msgid "First"
msgstr ""
#: scoreboard/templates/scoreboard/scoreboard.html:37
#: scoreboard/templates/scoreboard/scoreboard.html:39
msgid "Previous"
msgstr ""
#: scoreboard/templates/scoreboard/scoreboard.html:41
#: scoreboard/templates/scoreboard/scoreboard.html:43
msgid "Page "
msgstr ""
#: scoreboard/templates/scoreboard/scoreboard.html:45
#: scoreboard/templates/scoreboard/scoreboard.html:47
msgid "Next"
msgstr ""
#: scoreboard/templates/scoreboard/scoreboard.html:46
#: scoreboard/templates/scoreboard/scoreboard.html:48
msgid "Last"
msgstr ""
@ -286,48 +545,56 @@ msgstr ""
msgid "Scoreboard"
msgstr ""
#: templates/base.html:86
msgid "Logout"
#: templates/base.html:64
msgid "Resources"
msgstr ""
#: templates/base.html:93
msgid "Logout"
msgstr ""
#: templates/base.html:100
msgid "Sign Up"
msgstr ""
#: templates/base.html:135
msgid "Become a Patron!"
msgstr ""
#: templates/registration/password_reset_complete.html:11
msgid "Your new password has been set."
msgstr ""
#: templates/registration/password_reset_confirm.html:19
#: templates/registration/password_reset_confirm.html:20
msgid "Your password cant be too similar to your other personal information."
msgstr ""
#: templates/registration/password_reset_confirm.html:20
#: templates/registration/password_reset_confirm.html:21
msgid "Your password must contain at least 8 characters."
msgstr ""
#: templates/registration/password_reset_confirm.html:21
#: templates/registration/password_reset_confirm.html:22
msgid "Your password cant be a commonly used password."
msgstr ""
#: templates/registration/password_reset_confirm.html:22
#: templates/registration/password_reset_confirm.html:23
msgid "Your password cant be entirely numeric."
msgstr ""
#: templates/registration/password_reset_confirm.html:25
#: templates/registration/password_reset_confirm.html:26
msgid "Confirm"
msgstr ""
#: templates/registration/password_reset_confirm.html:27
#: templates/registration/password_reset_confirm.html:28
msgid "Submit"
msgstr ""
#: templates/registration/password_reset_done.html:10
#: templates/registration/password_reset_done.html:11
msgid ""
"We've emailed you instructions for setting your password. You should receive "
"the email shortly!"
msgstr ""
#: templates/registration/password_reset_form.html:15
#: templates/registration/password_reset_form.html:16
msgid "Reset"
msgstr ""

View File

@ -0,0 +1,600 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-02-06 23:31+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#: accounts/templates/accounts/delete.html:8
msgid "Delete account"
msgstr ""
#: accounts/templates/accounts/delete.html:11
msgid "Please confirm your password to delete your account."
msgstr ""
#: accounts/templates/accounts/delete.html:12
msgid "Deleted accounts cannot be recovered."
msgstr ""
#: accounts/templates/accounts/delete.html:15
msgid "Password inccorect."
msgstr ""
#: accounts/templates/accounts/delete.html:17
msgid "Your account has been deleted."
msgstr ""
#: accounts/templates/accounts/delete.html:22
#: accounts/templates/accounts/login.html:19
#: accounts/templates/accounts/register.html:23
#: events/templates/events/create_team.html:27
#: events/templates/events/join_team.html:32
msgid "Password"
msgstr ""
#: accounts/templates/accounts/edit.html:21
#: accounts/templates/accounts/login.html:18
#: accounts/templates/accounts/register.html:22
#: ctfs/templates/ctfs/ctf_info.html:61 ctfs/templates/ctfs/ctfs_list.html:12
#: events/templates/events/ctf_info.html:71
#: events/templates/events/event_info.html:64
#: scoreboard/templates/scoreboard/scoreboard.html:13
msgid "Username"
msgstr ""
#: accounts/templates/accounts/edit.html:25
msgid "Email"
msgstr ""
#: accounts/templates/accounts/edit.html:30
#: ctfs/templates/ctfs/ctf_info.html:62
#: events/templates/events/ctf_info.html:72
#: events/templates/events/event_info.html:65
#: scoreboard/templates/scoreboard/scoreboard.html:14
msgid "Website"
msgstr ""
#: accounts/templates/accounts/edit.html:36
#: events/templates/events/manage_team.html:29
msgid "Apply"
msgstr ""
#: accounts/templates/accounts/edit.html:47
#: accounts/templates/accounts/profile.html:46
#: ctfs/templates/ctfs/ctf_info.html:63 ctfs/templates/ctfs/ctfs_list.html:13
#: events/templates/events/event_info.html:66
#: events/templates/events/event_info.html:89
#: events/templates/events/manage_team.html:40
#: events/templates/events/team.html:45
#: scoreboard/templates/scoreboard/scoreboard.html:15
msgid "Score"
msgstr ""
#: accounts/templates/accounts/edit.html:55
#: accounts/templates/accounts/profile.html:60
msgid "Registered since"
msgstr ""
#: accounts/templates/accounts/edit.html:61
msgid "Delete my account"
msgstr ""
#: accounts/templates/accounts/login.html:13
msgid "Please, verify your infos."
msgstr ""
#: accounts/templates/accounts/login.html:22
msgid "Reset password"
msgstr ""
#: accounts/templates/accounts/login.html:31
#: accounts/templates/accounts/register.html:38 templates/base.html:97
#: templates/registration/password_reset_complete.html:18
#: templates/registration/password_reset_confirm.html:38
#: templates/registration/password_reset_done.html:18
#: templates/registration/password_reset_form.html:26
msgid "Login"
msgstr ""
#: accounts/templates/accounts/login.html:32
#: accounts/templates/accounts/register.html:37
#: templates/registration/password_reset_complete.html:19
#: templates/registration/password_reset_confirm.html:39
#: templates/registration/password_reset_done.html:19
#: templates/registration/password_reset_form.html:27
msgid "Sign up"
msgstr ""
#: accounts/templates/accounts/profile.html:10
msgid "Challenges Solved by"
msgstr ""
#: accounts/templates/accounts/profile.html:21
#: events/templates/events/team.html:20
msgid "Challenge Name"
msgstr ""
#: accounts/templates/accounts/profile.html:22
#: events/templates/events/team.html:21
msgid "Category"
msgstr ""
#: accounts/templates/accounts/profile.html:23
#: events/templates/events/team.html:22
msgid "Points"
msgstr ""
#: accounts/templates/accounts/profile.html:24
#: ctfs/templates/ctfs/ctf_info.html:64
#: events/templates/events/ctf_info.html:73
#: events/templates/events/team.html:23
msgid "Date"
msgstr ""
#: accounts/templates/accounts/profile.html:39
msgid "It seems that this user has not solved any challenge yet..."
msgstr ""
#: accounts/templates/accounts/profile.html:47
#: events/templates/events/event_info.html:63
#: events/templates/events/event_info.html:87
#: events/templates/events/manage_team.html:41
#: events/templates/events/team.html:46
#: scoreboard/templates/scoreboard/scoreboard.html:12
msgid "Rank"
msgstr ""
#: accounts/templates/accounts/profile.html:56
msgid "Status: Member"
msgstr ""
#: accounts/templates/accounts/profile.html:58
msgid "Status: Visitor"
msgstr ""
#: accounts/templates/accounts/profile.html:64
#: events/templates/events/team.html:57
msgid "Categories stats"
msgstr ""
#: accounts/templates/accounts/register.html:13
msgid "Welcome !"
msgstr ""
#: accounts/templates/accounts/register.html:14
msgid "Your account has been created."
msgstr ""
#: accounts/templates/accounts/register.html:25
msgid "Personal website"
msgstr ""
#: accounts/templates/accounts/register.html:26
#: events/templates/events/event_info.html:119
msgid "Register"
msgstr ""
#: accounts/views/views.py:33
msgid "Your account was inactive."
msgstr ""
#: accounts/views/views.py:52
msgid ""
"The password must contain at least one letter and at least one digit or "
"punctuation character."
msgstr ""
#: accounts/views/views.py:54
msgid "A user with that email already exists."
msgstr ""
#: accounts/views/views.py:67
msgid "A user with that username already exists."
msgstr ""
#: accounts/views/views.py:95
msgid "Email already taken."
msgstr ""
#: accounts/views/views.py:101
msgid "Username already taken."
msgstr ""
#: accounts/views/views.py:105 events/views/teams.py:124
msgid "Updated."
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:10
#: events/templates/events/ctf_info.html:12
msgid "Published date"
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:14
msgid "Challenge is not yet available."
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:21
#: events/templates/events/ctf_info.html:18 home/templates/home/home.html:46
msgid ""
"No translation available. Please try another language (English or French)."
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:27
#: events/templates/events/ctf_info.html:32
msgid "Congratulation !"
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:29
#: events/templates/events/ctf_info.html:34
msgid "Already flagged"
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:31 ctfs/templates/ctfs/ctf_info.html:40
#: events/templates/events/ctf_info.html:42
#: events/templates/events/ctf_info.html:51
msgid "Start the challenge"
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:33 ctfs/templates/ctfs/ctf_info.html:42
#: events/templates/events/ctf_info.html:44
#: events/templates/events/ctf_info.html:53
msgid "Download"
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:37
#: events/templates/events/ctf_info.html:48
msgid "Wrong flag ! You can do it !"
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:56
#: events/templates/events/ctf_info.html:66
msgid "Solved by"
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:80
#: events/templates/events/ctf_info.html:96
msgid "Nobody has solved this challenge yet."
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:87
#: events/templates/events/ctf_info.html:103
msgid "Author"
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:88
#: events/templates/events/ctf_info.html:104
msgid "Point reward"
msgstr ""
#: ctfs/templates/ctfs/ctfs_list.html:14
msgid "Solved"
msgstr ""
#: ctfs/templates/ctfs/ctfs_list.html:37
msgid "No ctf available for this category."
msgstr ""
#: ctfs/templates/ctfs/ctfs_list.html:42
msgid "Categories"
msgstr ""
#: ctfs/templates/ctfs/ctfs_list.html:48 templates/base.html:54
msgid "No category available."
msgstr ""
#: events/templates/events/create_team.html:10
#: events/templates/events/join_team.html:10
msgid "This event starts at"
msgstr ""
#: events/templates/events/create_team.html:17
#: events/templates/events/join_team.html:17
msgid "You need to be registered to the event."
msgstr ""
#: events/templates/events/create_team.html:20 events/views/teams.py:120
msgid "Name already taken."
msgstr ""
#: events/templates/events/create_team.html:26
#: events/templates/events/join_team.html:31
#: events/templates/events/manage_team.html:22
msgid "Team name"
msgstr ""
#: events/templates/events/create_team.html:28
#: events/templates/events/create_team.html:49
#: events/templates/events/join_team.html:54
msgid "Create Team"
msgstr ""
#: events/templates/events/create_team.html:33
#: events/templates/events/event_pwd.html:28
#: events/templates/events/join_team.html:38
msgid "You need to be logged to access this event."
msgstr ""
#: events/templates/events/create_team.html:42
#: events/templates/events/event_info.html:113
#: events/templates/events/event_pwd.html:36
#: events/templates/events/join_team.html:47
msgid "Starts at"
msgstr ""
#: events/templates/events/create_team.html:43
#: events/templates/events/event_info.html:114
#: events/templates/events/event_pwd.html:37
#: events/templates/events/join_team.html:48
msgid "Ends at"
msgstr ""
#: events/templates/events/create_team.html:47
#: events/templates/events/event_info.html:129
#: events/templates/events/join_team.html:52
msgid "Manage my team"
msgstr ""
#: events/templates/events/create_team.html:48
#: events/templates/events/join_team.html:33
#: events/templates/events/join_team.html:53
msgid "Join Team"
msgstr ""
#: events/templates/events/create_team.html:53
#: events/templates/events/join_team.html:58
msgid "Auto-matching"
msgstr ""
#: events/templates/events/create_team.html:57
#: events/templates/events/join_team.html:62
msgid "Find me a team !"
msgstr ""
#: events/templates/events/ctf_info.html:10
msgid "Event"
msgstr ""
#: events/templates/events/ctf_info.html:25
#: events/templates/events/event_info.html:9
msgid "Subscriptions is over."
msgstr ""
#: events/templates/events/ctf_info.html:28
#: events/templates/events/event_info.html:12
#: events/templates/events/event_pwd.html:18
msgid "You're already registered to this event."
msgstr ""
#: events/templates/events/ctf_info.html:36
#: events/templates/events/event_info.html:18
msgid "This event is over."
msgstr ""
#: events/templates/events/ctf_info.html:38
msgid "Error while processing your request. (Invalid Form)"
msgstr ""
#: events/templates/events/ctf_info.html:40
msgid ""
"Error: you're not registered to this event, so you can't register scores, "
"fucking logic."
msgstr ""
#: events/templates/events/event_info.html:20
#: events/templates/events/event_pwd.html:9
msgid "This event start at"
msgstr ""
#: events/templates/events/event_info.html:30
msgid "Challenges"
msgstr ""
#: events/templates/events/event_info.html:47
msgid "No challenges available."
msgstr ""
#: events/templates/events/event_info.html:51
msgid "The event has not started yet."
msgstr ""
#: events/templates/events/event_info.html:57
msgid "ScoreBoard"
msgstr ""
#: events/templates/events/event_info.html:88
msgid "Team"
msgstr ""
#: events/templates/events/event_info.html:106
msgid "No one have earn point yet, you gonna be the first ?"
msgstr ""
#: events/templates/events/event_pwd.html:15
#: events/templates/events/join_team.html:22
msgid "Wrong password submited."
msgstr ""
#: events/templates/events/event_pwd.html:20
msgid "This event is password protected"
msgstr ""
#: events/templates/events/event_pwd.html:21
msgid "You need to submit the event password to gain access to this event."
msgstr ""
#: events/templates/events/events_list.html:6 templates/base.html:61
msgid "Events"
msgstr ""
#: events/templates/events/events_list.html:38
msgid "See more"
msgstr ""
#: events/templates/events/events_list.html:44
msgid "No events available."
msgstr ""
#: events/templates/events/join_team.html:20
msgid "Team does not exist."
msgstr ""
#: events/templates/events/join_team.html:24
msgid "Maximum size reached."
msgstr ""
#: events/templates/events/manage_team.html:26
msgid "Team password"
msgstr ""
#: events/templates/events/manage_team.html:44
#: events/templates/events/team.html:49
msgid "Members"
msgstr ""
#: events/templates/events/manage_team.html:51
msgid "Leave Team"
msgstr ""
#: events/templates/events/team.html:38
msgid "It seems that this team has not solved any challenge yet..."
msgstr ""
#: home/templates/home/home.html:20
msgid "Weekly Top 5"
msgstr ""
#: home/templates/home/home.html:56
msgid "No article available."
msgstr ""
#: home/templates/home/home.html:61
msgid "Latest challenges added"
msgstr ""
#: home/templates/home/home.html:66
msgid "points"
msgstr ""
#: home/templates/home/home.html:70
msgid "No ctf available."
msgstr ""
#: home/templates/home/home.html:74
msgid "Latest Flags"
msgstr ""
#: home/templates/home/home.html:88
msgid "Flags"
msgstr ""
#: home/templates/home/home.html:94
msgid "Users"
msgstr ""
#: project/settings.py:115
msgid "English"
msgstr ""
#: project/settings.py:116
msgid "German"
msgstr ""
#: project/settings.py:117
msgid "French"
msgstr ""
#: project/settings.py:118
msgid "Russian"
msgstr ""
#: scoreboard/templates/scoreboard/scoreboard.html:38
msgid "First"
msgstr ""
#: scoreboard/templates/scoreboard/scoreboard.html:39
msgid "Previous"
msgstr ""
#: scoreboard/templates/scoreboard/scoreboard.html:43
msgid "Page "
msgstr ""
#: scoreboard/templates/scoreboard/scoreboard.html:47
msgid "Next"
msgstr ""
#: scoreboard/templates/scoreboard/scoreboard.html:48
msgid "Last"
msgstr ""
#: templates/base.html:59
msgid "Scoreboard"
msgstr ""
#: templates/base.html:64
msgid "Resources"
msgstr ""
#: templates/base.html:93
msgid "Logout"
msgstr ""
#: templates/base.html:100
msgid "Sign Up"
msgstr ""
#: templates/base.html:135
msgid "Become a Patron!"
msgstr ""
#: templates/registration/password_reset_complete.html:11
msgid "Your new password has been set."
msgstr ""
#: templates/registration/password_reset_confirm.html:20
msgid "Your password cant be too similar to your other personal information."
msgstr ""
#: templates/registration/password_reset_confirm.html:21
msgid "Your password must contain at least 8 characters."
msgstr ""
#: templates/registration/password_reset_confirm.html:22
msgid "Your password cant be a commonly used password."
msgstr ""
#: templates/registration/password_reset_confirm.html:23
msgid "Your password cant be entirely numeric."
msgstr ""
#: templates/registration/password_reset_confirm.html:26
msgid "Confirm"
msgstr ""
#: templates/registration/password_reset_confirm.html:28
msgid "Submit"
msgstr ""
#: templates/registration/password_reset_done.html:11
msgid ""
"We've emailed you instructions for setting your password. You should receive "
"the email shortly!"
msgstr ""
#: templates/registration/password_reset_form.html:16
msgid "Reset"
msgstr ""

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-05-10 19:28+0000\n"
"POT-Creation-Date: 2022-02-04 19:27+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -20,11 +20,41 @@ msgstr ""
"%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n"
"%100>=11 && n%100<=14)? 2 : 3);\n"
#: accounts/templates/accounts/delete.html:8
msgid "Delete account"
msgstr ""
#: accounts/templates/accounts/delete.html:11
msgid "Please confirm your password to delete your account."
msgstr ""
#: accounts/templates/accounts/delete.html:12
msgid "Deleted accounts cannot be recovered."
msgstr ""
#: accounts/templates/accounts/delete.html:15
msgid "Password inccorect."
msgstr ""
#: accounts/templates/accounts/delete.html:17
msgid "Your account has been deleted."
msgstr ""
#: accounts/templates/accounts/delete.html:22
#: accounts/templates/accounts/login.html:19
#: accounts/templates/accounts/register.html:23
#: events/templates/events/create_team.html:27
#: events/templates/events/join_team.html:32
msgid "Password"
msgstr ""
#: accounts/templates/accounts/edit.html:21
#: accounts/templates/accounts/login.html:18
#: accounts/templates/accounts/register.html:22
#: ctfs/templates/ctfs/ctf_info.html:50 ctfs/templates/ctfs/ctfs_list.html:12
#: scoreboard/templates/scoreboard/scoreboard.html:12
#: ctfs/templates/ctfs/ctf_info.html:61 ctfs/templates/ctfs/ctfs_list.html:12
#: events/templates/events/ctf_info.html:71
#: events/templates/events/event_info.html:64
#: scoreboard/templates/scoreboard/scoreboard.html:13
msgid "Username"
msgstr ""
@ -33,89 +63,114 @@ msgid "Email"
msgstr ""
#: accounts/templates/accounts/edit.html:30
#: ctfs/templates/ctfs/ctf_info.html:51
#: scoreboard/templates/scoreboard/scoreboard.html:13
#: ctfs/templates/ctfs/ctf_info.html:62
#: events/templates/events/ctf_info.html:72
#: events/templates/events/event_info.html:65
#: scoreboard/templates/scoreboard/scoreboard.html:14
msgid "Website"
msgstr ""
#: accounts/templates/accounts/edit.html:36
#: events/templates/events/manage_team.html:29
msgid "Apply"
msgstr ""
#: accounts/templates/accounts/edit.html:44
msgid "Connected accounts"
msgstr ""
#: accounts/templates/accounts/edit.html:51
msgid "Disconnect Discord"
msgstr ""
#: accounts/templates/accounts/edit.html:56
msgid "Connect Discord"
msgstr ""
#: accounts/templates/accounts/edit.html:66
#: accounts/templates/accounts/profile.html:37
#: ctfs/templates/ctfs/ctf_info.html:52 ctfs/templates/ctfs/ctfs_list.html:13
#: scoreboard/templates/scoreboard/scoreboard.html:14
#: accounts/templates/accounts/edit.html:47
#: accounts/templates/accounts/profile.html:46
#: ctfs/templates/ctfs/ctf_info.html:63 ctfs/templates/ctfs/ctfs_list.html:13
#: events/templates/events/event_info.html:66
#: events/templates/events/event_info.html:89
#: events/templates/events/manage_team.html:40
#: events/templates/events/team.html:45
#: scoreboard/templates/scoreboard/scoreboard.html:15
msgid "Score"
msgstr "счет"
#: accounts/templates/accounts/edit.html:74
#: accounts/templates/accounts/profile.html:45
msgid "Member since"
#: accounts/templates/accounts/edit.html:55
#: accounts/templates/accounts/profile.html:60
msgid "Registered since"
msgstr ""
#: accounts/templates/accounts/edit.html:61
msgid "Delete my account"
msgstr ""
#: accounts/templates/accounts/login.html:13
msgid "Please, verify your infos."
msgstr ""
#: accounts/templates/accounts/login.html:19
#: accounts/templates/accounts/register.html:23
msgid "Password"
msgstr ""
#: accounts/templates/accounts/login.html:22
msgid "Reset password"
msgstr ""
#: accounts/templates/accounts/login.html:31
#: accounts/templates/accounts/register.html:38 templates/base.html:90
#: accounts/templates/accounts/register.html:38 templates/base.html:97
#: templates/registration/password_reset_complete.html:18
#: templates/registration/password_reset_confirm.html:37
#: templates/registration/password_reset_done.html:17
#: templates/registration/password_reset_form.html:25
#: templates/registration/password_reset_confirm.html:38
#: templates/registration/password_reset_done.html:18
#: templates/registration/password_reset_form.html:26
msgid "Login"
msgstr "Авторизоваться"
#: accounts/templates/accounts/login.html:32
#: accounts/templates/accounts/register.html:37
#: templates/registration/password_reset_complete.html:19
#: templates/registration/password_reset_confirm.html:38
#: templates/registration/password_reset_done.html:18
#: templates/registration/password_reset_form.html:26
#: templates/registration/password_reset_confirm.html:39
#: templates/registration/password_reset_done.html:19
#: templates/registration/password_reset_form.html:27
msgid "Sign up"
msgstr ""
#: accounts/templates/accounts/profile.html:12
#: accounts/templates/accounts/profile.html:10
msgid "Challenges Solved by"
msgstr ""
#: accounts/templates/accounts/profile.html:21
#: events/templates/events/team.html:20
msgid "Challenge Name"
msgstr ""
#: accounts/templates/accounts/profile.html:13
#: accounts/templates/accounts/profile.html:22
#: events/templates/events/team.html:21
msgid "Category"
msgstr "Категории"
#: accounts/templates/accounts/profile.html:14
#: accounts/templates/accounts/profile.html:23
#: events/templates/events/team.html:22
msgid "Points"
msgstr ""
#: accounts/templates/accounts/profile.html:15
#: ctfs/templates/ctfs/ctf_info.html:53
#: accounts/templates/accounts/profile.html:24
#: ctfs/templates/ctfs/ctf_info.html:64
#: events/templates/events/ctf_info.html:73
#: events/templates/events/team.html:23
msgid "Date"
msgstr ""
#: accounts/templates/accounts/profile.html:30
msgid "It's seem {{ user.username }} have never solved any CTF yet..."
#: accounts/templates/accounts/profile.html:39
msgid "It seems that this user has not solved any challenge yet..."
msgstr ""
#: accounts/templates/accounts/profile.html:47
#: events/templates/events/event_info.html:63
#: events/templates/events/event_info.html:87
#: events/templates/events/manage_team.html:41
#: events/templates/events/team.html:46
#: scoreboard/templates/scoreboard/scoreboard.html:12
msgid "Rank"
msgstr ""
#: accounts/templates/accounts/profile.html:56
msgid "Status: Member"
msgstr ""
#: accounts/templates/accounts/profile.html:58
msgid "Status: Visitor"
msgstr ""
#: accounts/templates/accounts/profile.html:64
#: events/templates/events/team.html:57
msgid "Categories stats"
msgstr ""
#: accounts/templates/accounts/register.html:13
@ -131,76 +186,101 @@ msgid "Personal website"
msgstr ""
#: accounts/templates/accounts/register.html:26
#: events/templates/events/event_info.html:119
msgid "Register"
msgstr ""
#: accounts/views/views.py:31
#: accounts/views/views.py:33
msgid "Your account was inactive."
msgstr ""
#: accounts/views/views.py:50
#: accounts/views/views.py:52
msgid ""
"The password must contain at least one letter and at least one digit or "
"punctuation character."
msgstr ""
#: accounts/views/views.py:52
#: accounts/views/views.py:54
msgid "A user with that email already exists."
msgstr ""
#: accounts/views/views.py:65
#: accounts/views/views.py:67
msgid "A user with that username already exists."
msgstr ""
#: accounts/views/views.py:93
#: accounts/views/views.py:95
msgid "Email already taken."
msgstr ""
#: accounts/views/views.py:99
#: accounts/views/views.py:101
msgid "Username already taken."
msgstr ""
#: accounts/views/views.py:103
#: accounts/views/views.py:105 events/views/teams.py:124
msgid "Updated."
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:9
#: ctfs/templates/ctfs/ctf_info.html:10
#: events/templates/events/ctf_info.html:12
msgid "Published date"
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:17
msgid "Congratulation !"
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:14
#, fuzzy
#| msgid "No article available."
msgid "Challenge is not yet available."
msgstr "Нет доступных статей."
#: ctfs/templates/ctfs/ctf_info.html:19
msgid "Already flagged"
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:21 ctfs/templates/ctfs/ctf_info.html:30
msgid "Start the challenge"
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:23 ctfs/templates/ctfs/ctf_info.html:32
msgid "Download"
#: ctfs/templates/ctfs/ctf_info.html:21
#: events/templates/events/ctf_info.html:18 home/templates/home/home.html:46
msgid ""
"No translation available. Please try another language (English or French)."
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:27
#: events/templates/events/ctf_info.html:32
msgid "Congratulation !"
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:29
#: events/templates/events/ctf_info.html:34
msgid "Already flagged"
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:31 ctfs/templates/ctfs/ctf_info.html:40
#: events/templates/events/ctf_info.html:42
#: events/templates/events/ctf_info.html:51
msgid "Start the challenge"
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:33 ctfs/templates/ctfs/ctf_info.html:42
#: events/templates/events/ctf_info.html:44
#: events/templates/events/ctf_info.html:53
msgid "Download"
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:37
#: events/templates/events/ctf_info.html:48
msgid "Wrong flag ! You can do it !"
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:45
#: ctfs/templates/ctfs/ctf_info.html:56
#: events/templates/events/ctf_info.html:66
msgid "Solved by"
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:68
msgid "Nobody have solved this CTF."
#: ctfs/templates/ctfs/ctf_info.html:80
#: events/templates/events/ctf_info.html:96
msgid "Nobody has solved this challenge yet."
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:74
#: ctfs/templates/ctfs/ctf_info.html:87
#: events/templates/events/ctf_info.html:103
msgid "Author"
msgstr ""
#: ctfs/templates/ctfs/ctf_info.html:75
#: ctfs/templates/ctfs/ctf_info.html:88
#: events/templates/events/ctf_info.html:104
msgid "Point reward"
msgstr ""
@ -220,67 +300,254 @@ msgstr ""
msgid "No category available."
msgstr ""
#: home/templates/home/home.html:19
#: events/templates/events/create_team.html:10
#: events/templates/events/join_team.html:10
msgid "This event starts at"
msgstr ""
#: events/templates/events/create_team.html:17
#: events/templates/events/join_team.html:17
msgid "You need to be registered to the event."
msgstr ""
#: events/templates/events/create_team.html:20 events/views/teams.py:120
msgid "Name already taken."
msgstr ""
#: events/templates/events/create_team.html:26
#: events/templates/events/join_team.html:31
#: events/templates/events/manage_team.html:22
msgid "Team name"
msgstr ""
#: events/templates/events/create_team.html:28
#: events/templates/events/create_team.html:49
#: events/templates/events/join_team.html:54
msgid "Create Team"
msgstr ""
#: events/templates/events/create_team.html:33
#: events/templates/events/event_pwd.html:28
#: events/templates/events/join_team.html:38
msgid "You need to be logged to access this event."
msgstr ""
#: events/templates/events/create_team.html:42
#: events/templates/events/event_info.html:113
#: events/templates/events/event_pwd.html:36
#: events/templates/events/join_team.html:47
msgid "Starts at"
msgstr ""
#: events/templates/events/create_team.html:43
#: events/templates/events/event_info.html:114
#: events/templates/events/event_pwd.html:37
#: events/templates/events/join_team.html:48
msgid "Ends at"
msgstr ""
#: events/templates/events/create_team.html:47
#: events/templates/events/event_info.html:129
#: events/templates/events/join_team.html:52
msgid "Manage my team"
msgstr ""
#: events/templates/events/create_team.html:48
#: events/templates/events/join_team.html:33
#: events/templates/events/join_team.html:53
msgid "Join Team"
msgstr ""
#: events/templates/events/create_team.html:53
#: events/templates/events/join_team.html:58
msgid "Auto-matching"
msgstr ""
#: events/templates/events/create_team.html:57
#: events/templates/events/join_team.html:62
msgid "Find me a team !"
msgstr ""
#: events/templates/events/ctf_info.html:10
msgid "Event"
msgstr ""
#: events/templates/events/ctf_info.html:25
#: events/templates/events/event_info.html:9
msgid "Subscriptions is over."
msgstr ""
#: events/templates/events/ctf_info.html:28
#: events/templates/events/event_info.html:12
#: events/templates/events/event_pwd.html:18
msgid "You're already registered to this event."
msgstr ""
#: events/templates/events/ctf_info.html:36
#: events/templates/events/event_info.html:18
msgid "This event is over."
msgstr ""
#: events/templates/events/ctf_info.html:38
msgid "Error while processing your request. (Invalid Form)"
msgstr ""
#: events/templates/events/ctf_info.html:40
msgid ""
"Error: you're not registered to this event, so you can't register scores, "
"fucking logic."
msgstr ""
#: events/templates/events/event_info.html:20
#: events/templates/events/event_pwd.html:9
msgid "This event start at"
msgstr ""
#: events/templates/events/event_info.html:30
msgid "Challenges"
msgstr ""
#: events/templates/events/event_info.html:47
#, fuzzy
#| msgid "No article available."
msgid "No challenges available."
msgstr "Нет доступных статей."
#: events/templates/events/event_info.html:51
msgid "The event has not started yet."
msgstr ""
#: events/templates/events/event_info.html:57
#, fuzzy
#| msgid "Score"
msgid "ScoreBoard"
msgstr "счет"
#: events/templates/events/event_info.html:88
msgid "Team"
msgstr ""
#: events/templates/events/event_info.html:106
msgid "No one have earn point yet, you gonna be the first ?"
msgstr ""
#: events/templates/events/event_pwd.html:15
#: events/templates/events/join_team.html:22
msgid "Wrong password submited."
msgstr ""
#: events/templates/events/event_pwd.html:20
msgid "This event is password protected"
msgstr ""
#: events/templates/events/event_pwd.html:21
msgid "You need to submit the event password to gain access to this event."
msgstr ""
#: events/templates/events/events_list.html:6 templates/base.html:61
msgid "Events"
msgstr ""
#: events/templates/events/events_list.html:38
msgid "See more"
msgstr ""
#: events/templates/events/events_list.html:44
#, fuzzy
#| msgid "No article available."
msgid "No events available."
msgstr "Нет доступных статей."
#: events/templates/events/join_team.html:20
msgid "Team does not exist."
msgstr ""
#: events/templates/events/join_team.html:24
msgid "Maximum size reached."
msgstr ""
#: events/templates/events/manage_team.html:26
msgid "Team password"
msgstr ""
#: events/templates/events/manage_team.html:44
#: events/templates/events/team.html:49
msgid "Members"
msgstr ""
#: events/templates/events/manage_team.html:51
msgid "Leave Team"
msgstr ""
#: events/templates/events/team.html:38
msgid "It seems that this team has not solved any challenge yet..."
msgstr ""
#: home/templates/home/home.html:20
msgid "Weekly Top 5"
msgstr ""
#: home/templates/home/home.html:56
msgid "No article available."
msgstr "Нет доступных статей."
#: home/templates/home/home.html:24
#: home/templates/home/home.html:61
msgid "Latest challenges added"
msgstr ""
#: home/templates/home/home.html:30
#: home/templates/home/home.html:66
msgid "points"
msgstr ""
#: home/templates/home/home.html:70
msgid "No ctf available."
msgstr ""
#: home/templates/home/home.html:40
msgid "Flags counter"
#: home/templates/home/home.html:74
msgid "Latest Flags"
msgstr ""
#: project/settings.py:120
msgid "Global Site"
#: home/templates/home/home.html:88
msgid "Flags"
msgstr ""
#: project/settings.py:121
msgid "Italian"
#: home/templates/home/home.html:94
msgid "Users"
msgstr ""
#: project/settings.py:122
#: project/settings.py:115
msgid "English"
msgstr ""
#: project/settings.py:116
msgid "German"
msgstr ""
#: project/settings.py:123
#: project/settings.py:117
msgid "French"
msgstr ""
#: project/settings.py:124
msgid "Spanish"
msgstr ""
#: project/settings.py:125
#: project/settings.py:118
msgid "Russian"
msgstr ""
#: scoreboard/templates/scoreboard/scoreboard.html:11
msgid "Rank"
msgstr ""
#: scoreboard/templates/scoreboard/scoreboard.html:36
#: scoreboard/templates/scoreboard/scoreboard.html:38
msgid "First"
msgstr ""
#: scoreboard/templates/scoreboard/scoreboard.html:37
#: scoreboard/templates/scoreboard/scoreboard.html:39
msgid "Previous"
msgstr ""
#: scoreboard/templates/scoreboard/scoreboard.html:41
#: scoreboard/templates/scoreboard/scoreboard.html:43
msgid "Page "
msgstr ""
#: scoreboard/templates/scoreboard/scoreboard.html:45
#: scoreboard/templates/scoreboard/scoreboard.html:47
msgid "Next"
msgstr ""
#: scoreboard/templates/scoreboard/scoreboard.html:46
#: scoreboard/templates/scoreboard/scoreboard.html:48
msgid "Last"
msgstr ""
@ -288,48 +555,56 @@ msgstr ""
msgid "Scoreboard"
msgstr ""
#: templates/base.html:86
#: templates/base.html:64
msgid "Resources"
msgstr ""
#: templates/base.html:93
msgid "Logout"
msgstr "Выйти"
#: templates/base.html:93
#: templates/base.html:100
msgid "Sign Up"
msgstr ""
#: templates/base.html:135
msgid "Become a Patron!"
msgstr ""
#: templates/registration/password_reset_complete.html:11
msgid "Your new password has been set."
msgstr ""
#: templates/registration/password_reset_confirm.html:19
#: templates/registration/password_reset_confirm.html:20
msgid "Your password cant be too similar to your other personal information."
msgstr ""
#: templates/registration/password_reset_confirm.html:20
#: templates/registration/password_reset_confirm.html:21
msgid "Your password must contain at least 8 characters."
msgstr ""
#: templates/registration/password_reset_confirm.html:21
#: templates/registration/password_reset_confirm.html:22
msgid "Your password cant be a commonly used password."
msgstr ""
#: templates/registration/password_reset_confirm.html:22
#: templates/registration/password_reset_confirm.html:23
msgid "Your password cant be entirely numeric."
msgstr ""
#: templates/registration/password_reset_confirm.html:25
#: templates/registration/password_reset_confirm.html:26
msgid "Confirm"
msgstr ""
#: templates/registration/password_reset_confirm.html:27
#: templates/registration/password_reset_confirm.html:28
msgid "Submit"
msgstr ""
#: templates/registration/password_reset_done.html:10
#: templates/registration/password_reset_done.html:11
msgid ""
"We've emailed you instructions for setting your password. You should receive "
"the email shortly!"
msgstr ""
#: templates/registration/password_reset_form.html:15
#: templates/registration/password_reset_form.html:16
msgid "Reset"
msgstr ""

156
src/project/settings.py Normal file
View File

@ -0,0 +1,156 @@
"""
Django settings for project project.
Generated by 'django-admin startproject' using Django 2.2.5.
For more information on this file, see
https://docs.djangoproject.com/en/2.2/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/2.2/ref/settings/
"""
import os
from django.utils.translation import gettext_lazy as _
from local_settings import *
DEFAULT_AUTO_FIELD = 'django.db.models.AutoField'
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'home.apps.HomeConfig',
'ctfs.apps.CtfsConfig',
'events.apps.EventsConfig',
'accounts.apps.AccountsConfig',
'scoreboard.apps.ScoreboardConfig',
'resources.apps.ResourcesConfig',
'django.contrib.sites',
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'project.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [(os.path.join(BASE_DIR, 'templates')),],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'project.wsgi.application'
# Database
# https://docs.djangoproject.com/en/2.2/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
# Password validation
# https://docs.djangoproject.com/en/2.2/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# Internationalization
# https://docs.djangoproject.com/en/2.2/topics/i18n/
LANGUAGE_CODE = 'en-us'
LANGUAGE_COOKIE_NAME = 'django_language'
USE_I18N = True
LANGUAGES = (
('en', _("English")),
('de', _('German')),
('fr', _('French')),
('ru', _('Russian')),
('ja', _('Japanese')),
('es', _("Spanish")),
)
LOCALE_PATHS = (
os.path.join(BASE_DIR, 'locale'),
)
TIME_ZONE = 'Europe/Paris'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.2/howto/static-files/
SITE_ID = 1
STATIC_URL = '/static/'
STATIC_ROOT = ''
if DEBUG:
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATICFILES_DIRS = (os.path.join(BASE_DIR, 'statics'),)
else:
STATIC_ROOT = '/home/user/42ctf/src/statics'
TEMPLATES[0]['OPTIONS']['context_processors'].append("ctfs.context_processors.cat_processor")
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
LOGIN_URL = '/accounts/signin/'
EMAIL_BACKEND = 'django_mailjet.backends.MailjetBackend'
EMAIL_HOST = 'in-v3.mailjet.com'
EMAIL_PORT = 587
DEFAULT_FROM_EMAIL = '42ctf <no-reply@42ctf.org>'

View File

@ -32,5 +32,7 @@ urlpatterns += i18n_patterns(
re_path('^accounts/login/', defaults.page_not_found, {'exception': Exception()}),
path('accounts/', include('accounts.urls')),
path('accounts/', include('django.contrib.auth.urls')),
path('scoreboard/', include('scoreboard.urls'))
path('scoreboard/', include('scoreboard.urls')),
path('events/', include('events.urls')),
path('resources/', include('resources.urls'))
)

3
src/resources/admin.py Normal file
View File

@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

4
src/resources/apps.py Normal file
View File

@ -0,0 +1,4 @@
from django.apps import AppConfig
class ResourcesConfig(AppConfig):
name = 'resources'

View File

@ -0,0 +1,359 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-02-04 19:27+0100\n"
"PO-Revision-Date: 2022-02-04 05:53+0100\n"
"Last-Translator: Clément Hamada <clementhamada@pm.me>\n"
"Language-Team: \n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: resources/templates/resources/42ctf.html:7
msgid "What is 42CTF ?"
msgstr "Was ist 42CTF?"
#: resources/templates/resources/42ctf.html:10
msgid "A short introduction to CTF"
msgstr "Eine kurze Einführung zu CTF"
#: resources/templates/resources/42ctf.html:11
msgid ""
"CTF stands for Capture The Flag. It is a cybersecurity competition, where "
"participants have to solve challenges of various categories to gain points "
"and progress on the scoreboard."
msgstr ""
"CTF steht für Capture The Flag. Es ist ein Computersicherheitswettbewerb, "
"indem Teilnehmer Herausforderungen verschiedener Kategorien lösen müssen um "
"die meisten Punkte zu verdienen."
#: resources/templates/resources/42ctf.html:12
msgid "The challenges require participants to find sort of passwords called \\"
msgstr ""
"Die Herausforderungen bestehen darin eine Art Passwort zu finden: sogenannte "
"\\"
#: resources/templates/resources/42ctf.html:15
msgid "Functionment of 42CTF"
msgstr "Funktionsweise von 42CTF"
#: resources/templates/resources/42ctf.html:16
msgid "42CTF is what we call a permanent CTF."
msgstr "42CTF ist ein sogenanntes Dauer-CTF."
#: resources/templates/resources/42ctf.html:17
msgid "Except from the"
msgstr "Außer bei"
#: resources/templates/resources/42ctf.html:17
msgid "events"
msgstr "Ereignissen"
#: resources/templates/resources/42ctf.html:17
msgid "challenges are available on the platform without time limitations."
msgstr "sind Herausforderungen auf der Plattform unbegrenzt zugänglich."
#: resources/templates/resources/42ctf.html:18
msgid "The registration on 42CTF is open to everyone, 42 students or not."
msgstr ""
"Die Registrierung bei 42CTF ist für jeden offen, ob 42-Student oder nicht."
#: resources/templates/resources/42ctf.html:19
msgid ""
"Events may or may not be open. If you would like to organize an event on "
"42CTF, feel free to contact us."
msgstr ""
"Ereignisse können öffentlich oder privat sein. Wenn Sie ein Ereignisse bei "
"42CTF organisieren möchten, kontaktieren Sie uns."
#: resources/templates/resources/42ctf.html:22
msgid "42CTF Team"
msgstr "das 42CTF Team"
#: resources/templates/resources/42ctf.html:23
msgid "42CTF is managed by 42 students."
msgstr "42CTF wird von 42-Studenten verwaltet."
#: resources/templates/resources/42ctf.html:24
msgid "You can meet the team on"
msgstr "Treffen können Sie das Team auf"
#: resources/templates/resources/42ctf.html:25
msgid ""
"Challenges are created by various contributors, not necessarily 42 students."
msgstr ""
"Herausforderungen werden von verschiedenen Mitwirkende beigetragen, nicht "
"zwingend 42-Studenten."
#: resources/templates/resources/42ctf.html:26
msgid ""
"Anyone is welcome to submit their own challenges, either on the permanent "
"CTF or for a specific event."
msgstr ""
"Beiträge sind von jedem willkommen, entweder auf dem Dauer-CTF, oder für ein "
"bestimmtes Ereignis."
#: resources/templates/resources/create_challenge.html:7
msgid "Create new challenges"
msgstr "Erstelle neue Herausforderungen"
#: resources/templates/resources/create_challenge.html:10
msgid "If you want to create new challenges for 42CTF, send us a message on "
msgstr ""
"Falls Sie Herausforderungen für 42CTF erstellen möchten, schicken Sie uns "
"eine Nachricht auf "
#: resources/templates/resources/create_challenge.html:11
msgid "If your challenge is offline, then you don't have to ask us in advance."
msgstr ""
"Falls Ihre Herausforderung offline ist, müssen Sie uns nicht im voraus "
"fragen."
#: resources/templates/resources/create_challenge.html:12
msgid ""
"If your challenge is online (for example web or pwn), then you should give "
"us a short description of what you want to do."
msgstr ""
"Falls Ihre Herausforderung online ist (z.B. web oder pwn), dann sollten sie "
"uns eine kurze Beschreibung von dessen was sie vorhaben geben."
#: resources/templates/resources/create_challenge.html:13
msgid ""
"We may be able to help you or to give you resources such as dockerfiles."
msgstr ""
"Wir können Ihnen helfen oder Ressourcen sowie Dockerfiles zur Verfügung "
"stellen."
#: resources/templates/resources/create_challenge.html:14
msgid "We plan to make those resources publicly available in a near future."
msgstr "Wir haben vor diese Ressourcen in naher Zukunft zu veröffentlichen."
#: resources/templates/resources/donate.html:7
msgid "Donate"
msgstr "Spenden"
#: resources/templates/resources/donate.html:10
msgid "Become a 42CTF member"
msgstr "42CTF-Mitglied werden"
#: resources/templates/resources/donate.html:11
msgid ""
"42CTF is a non-profit organization with a legal status under the french law "
"(Association loi 1901)."
msgstr ""
"42CTF ist eine gemeinnützige Organisation mit einem Rechtsstatus nach "
"französischem Recht (Association loi 1901)."
#: resources/templates/resources/donate.html:12
msgid "You can support us by becoming a member and paying a fee of 15 euros."
msgstr ""
"Sie können uns unterstützen indem Sie Mitglied werden und 15 Euro zahlen."
#: resources/templates/resources/donate.html:13
msgid "Membership is then granted for 1 year."
msgstr "Die Mitgliedschaft wird dann für ein Jahr gewährt."
#: resources/templates/resources/donate.html:15
msgid "When you become a member, you gain the following advantages:"
msgstr "Wenn sie Mitglied werden, bekommen sie folgende Vorteile:"
#: resources/templates/resources/donate.html:16
msgid ""
"A different color for your pseudo in the scoreboard, to let everyone know "
"you're a member."
msgstr ""
"Eine verschiedene Farbe für Ihren Nutzernamen im Punktestand, sodass jeder "
"weiß dass Sie ein Mitglied sind."
#: resources/templates/resources/donate.html:17
msgid ""
"The possibility to play again past CTF, with challenges no longer available, "
"in the form of private events with the people of your choice."
msgstr ""
"Die Möglichkeit einen vergangenen CTF zu wiederholen, mit Herausforderungen "
"die nicht mehr verfügbar sind, in Form von privaten Ereignissen mit Menschen "
"Ihrer Wahl."
#: resources/templates/resources/donate.html:18
msgid ""
"Ex: you played Welcome CTF 2021, and want to play it again with your friends "
"during one weekend."
msgstr ""
"Z.B.: Sie haben am Welcome CTF 2021 teilgenommen, und wollen es mit Ihren "
"Freunden an einem Wochenende wiederholen."
#: resources/templates/resources/donate.html:19
msgid "Or you didn't play Welcome CTF 2021 because you were not eligible."
msgstr ""
"Oder sie haben nicht am Welcome CTF 2021 teilgenommen weil sie nicht "
"berechtigt waren."
#: resources/templates/resources/donate.html:22
msgid "More advantages may come later, and you can submit us your ideas."
msgstr ""
"Weitere Vorteile können später folgen, und Sie können uns Ihre Ideen "
"mitteilen."
#: resources/templates/resources/donate.html:23
msgid ""
"However, we will not organize limited time CTF for members only, as this "
"will be equivalent to organize paid events, and we want 42CTF to remain FREE "
"for all."
msgstr ""
"Trotzdem werden wir keine zeitlich begrenzte CTFs nur für Mitglieder "
"organisieren, da diese Zahlungspflichtige Ereignissen gleichen, und wir "
"42CTF KOSTENLOS für alle zugänglich behalten wollen."
#: resources/templates/resources/donate.html:26
msgid "Donate to 42CTF"
msgstr "An 42CTF spenden"
#: resources/templates/resources/donate.html:27
msgid ""
"You can donate to 42CTF or pay your membership with the following means:"
msgstr ""
"Folgende Zahlungsmethoden sind für eine Spende an 42CTF den Kauf einer "
"Mitgliedshaft verfügbar:"
#: resources/templates/resources/donate.html:46
msgid ""
"If you would like us to add another payment method or if you want to pay in "
"cash, send us a message !"
msgstr ""
"Falls Sie möchten, dass wir eine andere Zahlungsmethode hinzufügen oder "
"lieber Bar zahlen möchten, schicken sie uns eine Nachricht!"
#: resources/templates/resources/donate.html:48
msgid ""
"If you're paying for your membership, don't forget to send us your first and "
"last name, as well as your 42CTF pseudo."
msgstr ""
"Falls sie für eine Mitgliedschaft zahlen, vergessen sie nicht uns Ihren vor "
"und Nachnamen, sowie Ihren 42CTF Nutzernamen mitzuteilen."
#: resources/templates/resources/donate.html:49
msgid ""
"We will only use thoe data to keep track of our members and grant you "
"advantages, and we will never communicate them to any third party."
msgstr ""
"Wir verwenden diese Daten nur um den Überblick über unsere Mitglieder zu "
"Behalten und ihnen Vorteile zu bieten, und werden sie niemals an einem "
"Dritten übermitteln."
#: resources/templates/resources/edit.html:7
msgid "Edit this page"
msgstr "Diese Seite bearbeiten"
#: resources/templates/resources/edit.html:12
msgid ""
"More information coming soon, but as you can guess it involves making a pull "
"request to your favorite"
msgstr ""
"Weitere Information wird folgen, doch sowie Sie es erraten können benötigt "
"es eine Pull Request auf ihrer lieblings"
#: resources/templates/resources/tools.html:7
msgid "Recommended Tools"
msgstr "Empfohlene Werkzeuge"
#: resources/templates/resources/tools.html:10
msgid "To get you started, we built a VM that you can simply import in"
msgstr ""
"Zum beginnen haben wir eine VM erstellt die Sie einfach importieren können"
#: resources/templates/resources/tools.html:10
msgid "with a bunch of useful tools."
msgstr "mit vielen nützlichen Werkzeugen."
#: resources/templates/resources/tools.html:11
msgid "You can dowload this OVA"
msgstr "Herunterladen können Sie die OVA"
#: resources/templates/resources/tools.html:11
msgid "here"
msgstr "Hier"
#: resources/templates/resources/tools.html:13
msgid "Here are the tools installed on the VM:"
msgstr "Folgende Werkzeuge sind auf der VM vorinstalliert:"
#: resources/templates/resources/tools.html:22
msgid ""
"If you want to solve the challenges on your own machine, we recommend you to "
"use a Linux operating system."
msgstr ""
"Falls sie die Herausforderung auf Ihrer eigenen Maschine lösen möchten, "
"empfehlen wir Ihnen einen Linux Betriebssystem zu verwenden."
#: resources/templates/resources/tools.html:23
msgid ""
"Most of the reverse challenges are ELF binaries and won't run on Mac OS or "
"Windows."
msgstr ""
"Die meisten Reverse-Engineering Herausforderungen sind ELF-Binärdateien und "
"können auf macOS oder Windows nicht ausgeführt werden."
#: resources/templates/resources/tools.html:25
msgid "Additionnaly, you will need the following languages interpreters:"
msgstr "Zusätzlich, werden sie folgende Skript-Interpreter benötigen:"
#: resources/templates/resources/translate.html:7
msgid "Translate 42CTF"
msgstr "42CTF Übersetzen"
#: resources/templates/resources/translate.html:10
msgid "42CTF source code is publicly available on this"
msgstr "42CTF's Quellcode ist öffentlich zugänglich auf dieser"
#: resources/templates/resources/translate.html:11
msgid ""
"Translation does not require any programming skill and is a good way to "
"contribute if you want to help us, by making the platform always more "
"accessible."
msgstr ""
"Übersetzung benötigt keine Programmierkenntnisse und ist ein gute "
"Möglichkeit beizutragen wenn sie uns helfen möchten, indem Sie diese "
"Plattform immer zugänglicher machen."
#: resources/templates/resources/translate.html:12
msgid "We have a"
msgstr "Wir haben einen"
# FIXME: internalization -> internationalization
#: resources/templates/resources/translate.html:12
msgid ""
"describing how to translate pages with the Django internalization module."
msgstr ""
"indem beschrieben wird wie man mit dem Django Internationalisierungsmodul "
"Seiten übersetzt."
#: resources/templates/resources/translate.html:13
msgid ""
"We invite you to read it to know all the details, but it merely requires you "
"to edit text files, so you see, no programming skills required ;)"
msgstr ""
"Wir laden Sie dazu ein es zu lesen um alle Einzelheiten zur Kenntnis zu "
"nehmen, doch schrecken Sie sich nicht ab, es ist nichts mehr als "
"Textverarbeitung, keine Programmierkenntnisse sind benötigt ;)"
#: resources/templates/resources/translate.html:14
msgid ""
"You will need to fork the git repository, make your changes, push them, and "
"then open a pull request so that we can merge your contributions into our "
"repository."
msgstr ""
"Sie müssen das git Repository forken, Ihre Änderungen tätigen, pushen, und "
"eine Pull Request eröffnen, sodass wir Ihre Beiträge in unsere Repository "
"mergen können."
#: resources/templates/resources/translate.html:15
msgid "Don't hesitate to reach for help on"
msgstr "Zögern Sie nicht, nach Hilfe zu bitten auf"

View File

@ -0,0 +1,295 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-02-04 19:27+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: resources/templates/resources/42ctf.html:7
msgid "What is 42CTF ?"
msgstr ""
#: resources/templates/resources/42ctf.html:10
msgid "A short introduction to CTF"
msgstr ""
#: resources/templates/resources/42ctf.html:11
msgid ""
"CTF stands for Capture The Flag. It is a cybersecurity competition, where "
"participants have to solve challenges of various categories to gain points "
"and progress on the scoreboard."
msgstr ""
#: resources/templates/resources/42ctf.html:12
msgid "The challenges require participants to find sort of passwords called \\"
msgstr ""
#: resources/templates/resources/42ctf.html:15
msgid "Functionment of 42CTF"
msgstr ""
#: resources/templates/resources/42ctf.html:16
msgid "42CTF is what we call a permanent CTF."
msgstr ""
#: resources/templates/resources/42ctf.html:17
msgid "Except from the"
msgstr ""
#: resources/templates/resources/42ctf.html:17
msgid "events"
msgstr ""
#: resources/templates/resources/42ctf.html:17
msgid "challenges are available on the platform without time limitations."
msgstr ""
#: resources/templates/resources/42ctf.html:18
msgid "The registration on 42CTF is open to everyone, 42 students or not."
msgstr ""
#: resources/templates/resources/42ctf.html:19
msgid ""
"Events may or may not be open. If you would like to organize an event on "
"42CTF, feel free to contact us."
msgstr ""
#: resources/templates/resources/42ctf.html:22
msgid "42CTF Team"
msgstr ""
#: resources/templates/resources/42ctf.html:23
msgid "42CTF is managed by 42 students."
msgstr ""
#: resources/templates/resources/42ctf.html:24
msgid "You can meet the team on"
msgstr ""
#: resources/templates/resources/42ctf.html:25
msgid ""
"Challenges are created by various contributors, not necessarily 42 students."
msgstr ""
#: resources/templates/resources/42ctf.html:26
msgid ""
"Anyone is welcome to submit their own challenges, either on the permanent "
"CTF or for a specific event."
msgstr ""
#: resources/templates/resources/create_challenge.html:7
msgid "Create new challenges"
msgstr ""
#: resources/templates/resources/create_challenge.html:10
msgid "If you want to create new challenges for 42CTF, send us a message on "
msgstr ""
#: resources/templates/resources/create_challenge.html:11
msgid "If your challenge is offline, then you don't have to ask us in advance."
msgstr ""
#: resources/templates/resources/create_challenge.html:12
msgid ""
"If your challenge is online (for example web or pwn), then you should give "
"us a short description of what you want to do."
msgstr ""
#: resources/templates/resources/create_challenge.html:13
msgid ""
"We may be able to help you or to give you resources such as dockerfiles."
msgstr ""
#: resources/templates/resources/create_challenge.html:14
msgid "We plan to make those resources publicly available in a near future."
msgstr ""
#: resources/templates/resources/donate.html:7
msgid "Donate"
msgstr ""
#: resources/templates/resources/donate.html:10
msgid "Become a 42CTF member"
msgstr ""
#: resources/templates/resources/donate.html:11
msgid ""
"42CTF is a non-profit organization with a legal status under the french law "
"(Association loi 1901)."
msgstr ""
#: resources/templates/resources/donate.html:12
msgid "You can support us by becoming a member and paying a fee of 15 euros."
msgstr ""
#: resources/templates/resources/donate.html:13
msgid "Membership is then granted for 1 year."
msgstr ""
#: resources/templates/resources/donate.html:15
msgid "When you become a member, you gain the following advantages:"
msgstr ""
#: resources/templates/resources/donate.html:16
msgid ""
"A different color for your pseudo in the scoreboard, to let everyone know "
"you're a member."
msgstr ""
#: resources/templates/resources/donate.html:17
msgid ""
"The possibility to play again past CTF, with challenges no longer available, "
"in the form of private events with the people of your choice."
msgstr ""
#: resources/templates/resources/donate.html:18
msgid ""
"Ex: you played Welcome CTF 2021, and want to play it again with your friends "
"during one weekend."
msgstr ""
#: resources/templates/resources/donate.html:19
msgid "Or you didn't play Welcome CTF 2021 because you were not eligible."
msgstr ""
#: resources/templates/resources/donate.html:22
msgid "More advantages may come later, and you can submit us your ideas."
msgstr ""
#: resources/templates/resources/donate.html:23
msgid ""
"However, we will not organize limited time CTF for members only, as this "
"will be equivalent to organize paid events, and we want 42CTF to remain FREE "
"for all."
msgstr ""
#: resources/templates/resources/donate.html:26
msgid "Donate to 42CTF"
msgstr ""
#: resources/templates/resources/donate.html:27
msgid ""
"You can donate to 42CTF or pay your membership with the following means:"
msgstr ""
#: resources/templates/resources/donate.html:46
msgid ""
"If you would like us to add another payment method or if you want to pay in "
"cash, send us a message !"
msgstr ""
#: resources/templates/resources/donate.html:48
msgid ""
"If you're paying for your membership, don't forget to send us your first and "
"last name, as well as your 42CTF pseudo."
msgstr ""
#: resources/templates/resources/donate.html:49
msgid ""
"We will only use thoe data to keep track of our members and grant you "
"advantages, and we will never communicate them to any third party."
msgstr ""
#: resources/templates/resources/edit.html:7
msgid "Edit this page"
msgstr ""
#: resources/templates/resources/edit.html:12
msgid ""
"More information coming soon, but as you can guess it involves making a pull "
"request to your favorite"
msgstr ""
#: resources/templates/resources/tools.html:7
msgid "Recommended Tools"
msgstr ""
#: resources/templates/resources/tools.html:10
msgid "To get you started, we built a VM that you can simply import in"
msgstr ""
#: resources/templates/resources/tools.html:10
msgid "with a bunch of useful tools."
msgstr ""
#: resources/templates/resources/tools.html:11
msgid "You can dowload this OVA"
msgstr ""
#: resources/templates/resources/tools.html:11
msgid "here"
msgstr ""
#: resources/templates/resources/tools.html:13
msgid "Here are the tools installed on the VM:"
msgstr ""
#: resources/templates/resources/tools.html:22
msgid ""
"If you want to solve the challenges on your own machine, we recommend you to "
"use a Linux operating system."
msgstr ""
#: resources/templates/resources/tools.html:23
msgid ""
"Most of the reverse challenges are ELF binaries and won't run on Mac OS or "
"Windows."
msgstr ""
#: resources/templates/resources/tools.html:25
msgid "Additionnaly, you will need the following languages interpreters:"
msgstr ""
#: resources/templates/resources/translate.html:7
msgid "Translate 42CTF"
msgstr ""
#: resources/templates/resources/translate.html:10
msgid "42CTF source code is publicly available on this"
msgstr ""
#: resources/templates/resources/translate.html:11
msgid ""
"Translation does not require any programming skill and is a good way to "
"contribute if you want to help us, by making the platform always more "
"accessible."
msgstr ""
#: resources/templates/resources/translate.html:12
msgid "We have a"
msgstr ""
#: resources/templates/resources/translate.html:12
msgid ""
"describing how to translate pages with the Django internalization module."
msgstr ""
#: resources/templates/resources/translate.html:13
msgid ""
"We invite you to read it to know all the details, but it merely requires you "
"to edit text files, so you see, no programming skills required ;)"
msgstr ""
#: resources/templates/resources/translate.html:14
msgid ""
"You will need to fork the git repository, make your changes, push them, and "
"then open a pull request so that we can merge your contributions into our "
"repository."
msgstr ""
#: resources/templates/resources/translate.html:15
msgid "Don't hesitate to reach for help on"
msgstr ""

View File

@ -0,0 +1,339 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-02-04 19:27+0100\n"
"PO-Revision-Date: 2022-02-09 10:55+0100\n"
"Last-Translator: Javier Uhagón (uhagontorralvojavier@gmail.com)\n"
"Language-Team: \n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: resources/templates/resources/42ctf.html:7
msgid "What is 42CTF ?"
msgstr "¿ Qué es 42CTF ?"
#: resources/templates/resources/42ctf.html:10
msgid "A short introduction to CTF"
msgstr "Una corta introducción a CTF"
#: resources/templates/resources/42ctf.html:11
msgid ""
"CTF stands for Capture The Flag. It is a cybersecurity competition, where "
"participants have to solve challenges of various categories to gain points "
"and progress on the scoreboard."
msgstr ""
"CTF significa Capture the Flag. Es una competición de ciberseguridad, en la que "
"los participantes tienen que resolver retos de diferentes categorías para ganar puntos "
"y progresar en la Tabla de puntos."
#: resources/templates/resources/42ctf.html:12
msgid "The challenges require participants to find sort of passwords called \\"
msgstr "Los retos requieren que los participantes encuentren unas contraseñas llamadas \\"
#: resources/templates/resources/42ctf.html:15
msgid "Functionment of 42CTF"
msgstr "Funcionamiento de 42CTF"
#: resources/templates/resources/42ctf.html:16
msgid "42CTF is what we call a permanent CTF."
msgstr "42CTF es lo que llamamos un CTF permanente."
#: resources/templates/resources/42ctf.html:17
msgid "Except from the"
msgstr "A excepción de"
#: resources/templates/resources/42ctf.html:17
msgid "events"
msgstr "eventos"
#: resources/templates/resources/42ctf.html:17
msgid "challenges are available on the platform without time limitations."
msgstr "los retos están disponibles en la plataforma sin limites de tiempo."
#: resources/templates/resources/42ctf.html:18
msgid "The registration on 42CTF is open to everyone, 42 students or not."
msgstr "El registro a 42CTF está abierto a todo el mundo, estudiantes de 42 o no."
#: resources/templates/resources/42ctf.html:19
msgid ""
"Events may or may not be open. If you would like to organize an event on "
"42CTF, feel free to contact us."
msgstr ""
"Los eventos pueden o no estar abiertos. Si quieres organizar un evento en "
"42CTF, sientete libre de contactarnos."
#: resources/templates/resources/42ctf.html:22
msgid "42CTF Team"
msgstr "Equipo de 42CTF"
#: resources/templates/resources/42ctf.html:23
msgid "42CTF is managed by 42 students."
msgstr "42CTF está gestionado por estudiantes de 42."
#: resources/templates/resources/42ctf.html:24
msgid "You can meet the team on"
msgstr "Puedes conocer al equipo en"
#: resources/templates/resources/42ctf.html:25
msgid ""
"Challenges are created by various contributors, not necessarily 42 students."
msgstr ""
"Los retos son creados por varios contribuidores, no necesariamente estudiantes de 42."
#: resources/templates/resources/42ctf.html:26
msgid ""
"Anyone is welcome to submit their own challenges, either on the permanent "
"CTF or for a specific event."
msgstr ""
"Todo el mundo está bienvenido a publicar sus propios retos, en el CTF permanente o en "
"un evento en específico."
#: resources/templates/resources/create_challenge.html:7
msgid "Create new challenges"
msgstr "Crear retos nuevos"
#: resources/templates/resources/create_challenge.html:10
msgid "If you want to create new challenges for 42CTF, send us a message on "
msgstr "Si quieres crear nuevos retos para 42CTF, mandanos un mensaje en "
#: resources/templates/resources/create_challenge.html:11
msgid "If your challenge is offline, then you don't have to ask us in advance."
msgstr "Si tu reto es offline, no nos tienes que avisar por adelantado."
#: resources/templates/resources/create_challenge.html:12
msgid ""
"If your challenge is online (for example web or pwn), then you should give "
"us a short description of what you want to do."
msgstr ""
"Si tu evento es online (por ejemplo web o pwn), entonces deberias "
"mandarnos una corta descripción de lo que quieres hacer."
#: resources/templates/resources/create_challenge.html:13
msgid ""
"We may be able to help you or to give you resources such as dockerfiles."
msgstr ""
"Podemos ser de ayuda o darte recursos como dockerfiles."
#: resources/templates/resources/create_challenge.html:14
msgid "We plan to make those resources publicly available in a near future."
msgstr "Planeamos publicar estos recursos al publico en un futuro cercano."
#: resources/templates/resources/donate.html:7
msgid "Donate"
msgstr "Donar"
#: resources/templates/resources/donate.html:10
msgid "Become a 42CTF member"
msgstr "Convertirse en un miembro de 42CTF"
#: resources/templates/resources/donate.html:11
msgid ""
"42CTF is a non-profit organization with a legal status under the french law "
"(Association loi 1901)."
msgstr ""
"42CTF es una organización sin ánimo de lucro bajo un estatus legal bajo la ley francesa "
"(loi de asociación 1901)."
#: resources/templates/resources/donate.html:12
msgid "You can support us by becoming a member and paying a fee of 15 euros."
msgstr "Puedes apoyarnos convirtiendote en un miebro y pagandonos una comisión de 15 euros."
#: resources/templates/resources/donate.html:13
msgid "Membership is then granted for 1 year."
msgstr "La membresia dura 1 año."
#: resources/templates/resources/donate.html:15
msgid "When you become a member, you gain the following advantages:"
msgstr "Cuando te conviertes en un miembro, ganas las siguientes ventajas:"
#: resources/templates/resources/donate.html:16
msgid ""
"A different color for your pseudo in the scoreboard, to let everyone know "
"you're a member."
msgstr ""
"Un color diferente para tu pseudo en la tabla de puntuaciones para "
"que todo el mundo sepa que eres un miembro."
#: resources/templates/resources/donate.html:17
msgid ""
"The possibility to play again past CTF, with challenges no longer available, "
"in the form of private events with the people of your choice."
msgstr ""
"La posibilidad e jugar un CTF del pasado, con retos que ya no están disponibles, "
"crear eventos privados con gente de tu elección."
#: resources/templates/resources/donate.html:18
msgid ""
"Ex: you played Welcome CTF 2021, and want to play it again with your friends "
"during one weekend."
msgstr ""
"Ejemplo: Si jugaste CTF 2021, y quieres volverlo a jugar con tus amigos "
"durante un fin de semana."
#: resources/templates/resources/donate.html:19
msgid "Or you didn't play Welcome CTF 2021 because you were not eligible."
msgstr "O no jugaste el Welcome CTF 2021 porque no estabas disponible."
#: resources/templates/resources/donate.html:22
msgid "More advantages may come later, and you can submit us your ideas."
msgstr "Más ideas llegarán pronto, y puedes enviarnos ideas."
#: resources/templates/resources/donate.html:23
msgid ""
"However, we will not organize limited time CTF for members only, as this "
"will be equivalent to organize paid events, and we want 42CTF to remain FREE "
"for all."
msgstr ""
"Sin embargo, no organizaremos CTF de tiempo limitado para miembros, ya que "
"esto sería equivalente a organizar eventos de pago, y queremos mantener 42CTF "
"GRATIS para todos."
#: resources/templates/resources/donate.html:26
msgid "Donate to 42CTF"
msgstr "Dona a 42CTF"
#: resources/templates/resources/donate.html:27
msgid ""
"You can donate to 42CTF or pay your membership with the following means:"
msgstr ""
"Puedes donar a 42CTF o pagar tu membresía con los siguientes métodos de pago:"
#: resources/templates/resources/donate.html:46
msgid ""
"If you would like us to add another payment method or if you want to pay in "
"cash, send us a message !"
msgstr ""
"Si quieres que añadamos otro metodo de pago o quieres pagarnos en efectivo "
"¡Mandanos un mensaje!"
#: resources/templates/resources/donate.html:48
msgid ""
"If you're paying for your membership, don't forget to send us your first and "
"last name, as well as your 42CTF pseudo."
msgstr ""
"Si estás pagando por tu membresía, no olvides mandarnos tu nombre y apellido, también "
"tu nombre de usuario en 42CTF"
#: resources/templates/resources/donate.html:49
msgid ""
"We will only use thoe data to keep track of our members and grant you "
"advantages, and we will never communicate them to any third party."
msgstr ""
"Solo usarmos los datos para tener control de la lista de miembros y darte "
"las ventajas de miembro, nunca se los daremos a ningún tercero."
#: resources/templates/resources/edit.html:7
msgid "Edit this page"
msgstr "Editar esta página"
#: resources/templates/resources/edit.html:12
msgid ""
"More information coming soon, but as you can guess it involves making a pull "
"request to your favorite"
msgstr ""
"Más información llegará pronto, pero como puedes imaginar requiere hacer un pull request "
"a tu favorito"
#: resources/templates/resources/tools.html:7
msgid "Recommended Tools"
msgstr "Herramientas Recomendadas"
#: resources/templates/resources/tools.html:10
msgid "To get you started, we built a VM that you can simply import in"
msgstr "Para empezar, hemos creado una Máquina Virtual que simplemente puedes importar."
#: resources/templates/resources/tools.html:10
msgid "with a bunch of useful tools."
msgstr "con unas cuantas herramientas útiles."
#: resources/templates/resources/tools.html:11
msgid "You can dowload this OVA"
msgstr "Puedes descargar este OVA"
#: resources/templates/resources/tools.html:11
msgid "here"
msgstr "aquí"
#: resources/templates/resources/tools.html:13
msgid "Here are the tools installed on the VM:"
msgstr "Aquí están las herramientas instaladas en la Máquina Virtual:"
#: resources/templates/resources/tools.html:22
msgid ""
"If you want to solve the challenges on your own machine, we recommend you to "
"use a Linux operating system."
msgstr ""
"Si quieres resolver los retos en tu propia máquina, te recomendamos usar "
"Linux como sistema operativo."
#: resources/templates/resources/tools.html:23
msgid ""
"Most of the reverse challenges are ELF binaries and won't run on Mac OS or "
"Windows."
msgstr ""
"La mayoría de retos de ingeniería inversa usan binarios ELF y no funcionarán "
"en Mac OS o Windows."
#: resources/templates/resources/tools.html:25
msgid "Additionnaly, you will need the following languages interpreters:"
msgstr "Además, necesitarás tender los siguientes interpretes de lenguaje:"
#: resources/templates/resources/translate.html:7
msgid "Translate 42CTF"
msgstr "Traducir 42CTF"
#: resources/templates/resources/translate.html:10
msgid "42CTF source code is publicly available on this"
msgstr "El código de 42CTF está disponible al público aquí"
#: resources/templates/resources/translate.html:11
msgid ""
"Translation does not require any programming skill and is a good way to "
"contribute if you want to help us, by making the platform always more "
"accessible."
msgstr ""
"La traducción no requiere saber programación y es una buena forma para "
"contribuir si quieres ayudarnos, haciendo la plataforma siempre más "
"accesible."
#: resources/templates/resources/translate.html:12
msgid "We have a"
msgstr "Tenemos un"
#: resources/templates/resources/translate.html:12
msgid ""
"describing how to translate pages with the Django internalization module."
msgstr ""
"Describiendo como traducir las páginas con el modulo de internacionalización Django."
#: resources/templates/resources/translate.html:13
msgid ""
"We invite you to read it to know all the details, but it merely requires you "
"to edit text files, so you see, no programming skills required ;)"
msgstr ""
"Te invitamos a leerlo para conocer todos los detalles, pero simplemente rquiere "
"que edites archivos de texto, asi que como ves, no hace falta saber programar ;)"
#: resources/templates/resources/translate.html:14
msgid ""
"You will need to fork the git repository, make your changes, push them, and "
"then open a pull request so that we can merge your contributions into our "
"repository."
msgstr ""
"Vas a necesitar hacer un Fork del repositorio de git, hacer tus cambios, hacer un push y "
"entonces abrir un Pull request para que podamos hacer merge de tus cambios a "
"nuestro repositorio."
#: resources/templates/resources/translate.html:15
msgid "Don't hesitate to reach for help on"
msgstr "No dudes en pedirnos ayuda"

View File

@ -0,0 +1,317 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-02-04 19:27+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: resources/templates/resources/42ctf.html:7
msgid "What is 42CTF ?"
msgstr "Qu'est ce que 42CTF ?"
#: resources/templates/resources/42ctf.html:10
msgid "A short introduction to CTF"
msgstr "Une brève introduction aux CTF"
#: resources/templates/resources/42ctf.html:11
msgid ""
"CTF stands for Capture The Flag. It is a cybersecurity competition, where "
"participants have to solve challenges of various categories to gain points "
"and progress on the scoreboard."
msgstr ""
#: resources/templates/resources/42ctf.html:12
msgid "The challenges require participants to find sort of passwords called \\"
msgstr ""
#: resources/templates/resources/42ctf.html:15
msgid "Functionment of 42CTF"
msgstr ""
#: resources/templates/resources/42ctf.html:16
msgid "42CTF is what we call a permanent CTF."
msgstr ""
#: resources/templates/resources/42ctf.html:17
msgid "Except from the"
msgstr ""
#: resources/templates/resources/42ctf.html:17
msgid "events"
msgstr ""
#: resources/templates/resources/42ctf.html:17
msgid "challenges are available on the platform without time limitations."
msgstr ""
#: resources/templates/resources/42ctf.html:18
msgid "The registration on 42CTF is open to everyone, 42 students or not."
msgstr ""
#: resources/templates/resources/42ctf.html:19
msgid ""
"Events may or may not be open. If you would like to organize an event on "
"42CTF, feel free to contact us."
msgstr ""
#: resources/templates/resources/42ctf.html:22
msgid "42CTF Team"
msgstr ""
#: resources/templates/resources/42ctf.html:23
msgid "42CTF is managed by 42 students."
msgstr ""
#: resources/templates/resources/42ctf.html:24
msgid "You can meet the team on"
msgstr ""
#: resources/templates/resources/42ctf.html:25
msgid ""
"Challenges are created by various contributors, not necessarily 42 students."
msgstr ""
#: resources/templates/resources/42ctf.html:26
msgid ""
"Anyone is welcome to submit their own challenges, either on the permanent "
"CTF or for a specific event."
msgstr ""
#: resources/templates/resources/create_challenge.html:7
msgid "Create new challenges"
msgstr ""
#: resources/templates/resources/create_challenge.html:10
msgid "If you want to create new challenges for 42CTF, send us a message on "
msgstr ""
#: resources/templates/resources/create_challenge.html:11
msgid "If your challenge is offline, then you don't have to ask us in advance."
msgstr ""
#: resources/templates/resources/create_challenge.html:12
msgid ""
"If your challenge is online (for example web or pwn), then you should give "
"us a short description of what you want to do."
msgstr ""
#: resources/templates/resources/create_challenge.html:13
msgid ""
"We may be able to help you or to give you resources such as dockerfiles."
msgstr ""
#: resources/templates/resources/create_challenge.html:14
msgid "We plan to make those resources publicly available in a near future."
msgstr ""
#: resources/templates/resources/donate.html:7
msgid "Donate"
msgstr "Donner"
#: resources/templates/resources/donate.html:10
msgid "Become a 42CTF member"
msgstr "Devenez membre de 42CTF"
#: resources/templates/resources/donate.html:11
msgid ""
"42CTF is a non-profit organization with a legal status under the french law "
"(Association loi 1901)."
msgstr "42CTF est une association loi 1901 (loi française)."
#: resources/templates/resources/donate.html:12
msgid "You can support us by becoming a member and paying a fee of 15 euros."
msgstr ""
"Vous pouvez nous aider financièrement en devenant membre, au cout de 15 "
"euros."
#: resources/templates/resources/donate.html:13
msgid "Membership is then granted for 1 year."
msgstr "Le status de membre est valable 1 an au paiement de la cotisation."
#: resources/templates/resources/donate.html:15
msgid "When you become a member, you gain the following advantages:"
msgstr "Lorsque vous adherez à 42CTF, vous obtenez les avantages suivants :"
#: resources/templates/resources/donate.html:16
msgid ""
"A different color for your pseudo in the scoreboard, to let everyone know "
"you're a member."
msgstr ""
"Une couleur différente pour votre pseudo sur le scoreboard, pour que tout le "
"monde sache que vous êtes membre."
#: resources/templates/resources/donate.html:17
msgid ""
"The possibility to play again past CTF, with challenges no longer available, "
"in the form of private events with the people of your choice."
msgstr ""
"La possibilité de jouer de nouveau aux CTF passés, avec des challenges qui "
"ne sont plus disponibles, sous la forme d'un événement privé avec les "
"personnes de votre choix."
#: resources/templates/resources/donate.html:18
msgid ""
"Ex: you played Welcome CTF 2021, and want to play it again with your friends "
"during one weekend."
msgstr ""
"Ex: vous avez joué au Welcome CTF 2021, et vous voulez renouveler "
"l'expérience avec vos amis le temps d'un weekend."
#: resources/templates/resources/donate.html:19
msgid "Or you didn't play Welcome CTF 2021 because you were not eligible."
msgstr "Ou au contraire vous n'avez pas joué car vous n'étiez pas éligible."
#: resources/templates/resources/donate.html:22
msgid "More advantages may come later, and you can submit us your ideas."
msgstr ""
"Plus d'avantages pourraient être disponibles plus tard, et vous pouvez nous "
"soumettre vos idées."
#: resources/templates/resources/donate.html:23
msgid ""
"However, we will not organize limited time CTF for members only, as this "
"will be equivalent to organize paid events, and we want 42CTF to remain FREE "
"for all."
msgstr ""
"Cependant, nous n'organiserons pas de CTF en temps limité réservé aux "
"membres, car cela serait équivalent à organiser des événements payants, and "
"nous voulons que 42CTF reste GRATUIT pour tous."
#: resources/templates/resources/donate.html:26
msgid "Donate to 42CTF"
msgstr "Donnez à 42CTF"
#: resources/templates/resources/donate.html:27
msgid ""
"You can donate to 42CTF or pay your membership with the following means:"
msgstr ""
"Vous pouvez donner à 42CTF ou payer votre adhésion avec les moyens suivants :"
#: resources/templates/resources/donate.html:46
msgid ""
"If you would like us to add another payment method or if you want to pay in "
"cash, send us a message !"
msgstr ""
"Si vous aimeriez qu'on ajoute un autre moyen de paiement, ou si vous voulez "
"payer en liquide, envoyez nous un message !"
#: resources/templates/resources/donate.html:48
msgid ""
"If you're paying for your membership, don't forget to send us your first and "
"last name, as well as your 42CTF pseudo."
msgstr ""
"Si vous payez pour l'adhesion, n'oubliez pas de nous envoyer vos noms et "
"prénoms, ainsi que votre pseudo 42CTF."
#: resources/templates/resources/donate.html:49
msgid ""
"We will only use thoe data to keep track of our members and grant you "
"advantages, and we will never communicate them to any third party."
msgstr ""
"Nous utiliserons ces données exclusivement pour tenir compte de nos membres "
"et vous accorder des avantages, nous ne transmettrons jamais ces données à "
"des tierces parties."
#: resources/templates/resources/edit.html:7
msgid "Edit this page"
msgstr ""
#: resources/templates/resources/edit.html:12
msgid ""
"More information coming soon, but as you can guess it involves making a pull "
"request to your favorite"
msgstr ""
#: resources/templates/resources/tools.html:7
msgid "Recommended Tools"
msgstr ""
#: resources/templates/resources/tools.html:10
msgid "To get you started, we built a VM that you can simply import in"
msgstr ""
#: resources/templates/resources/tools.html:10
msgid "with a bunch of useful tools."
msgstr ""
#: resources/templates/resources/tools.html:11
msgid "You can dowload this OVA"
msgstr ""
#: resources/templates/resources/tools.html:11
msgid "here"
msgstr ""
#: resources/templates/resources/tools.html:13
msgid "Here are the tools installed on the VM:"
msgstr ""
#: resources/templates/resources/tools.html:22
msgid ""
"If you want to solve the challenges on your own machine, we recommend you to "
"use a Linux operating system."
msgstr ""
#: resources/templates/resources/tools.html:23
msgid ""
"Most of the reverse challenges are ELF binaries and won't run on Mac OS or "
"Windows."
msgstr ""
#: resources/templates/resources/tools.html:25
msgid "Additionnaly, you will need the following languages interpreters:"
msgstr ""
#: resources/templates/resources/translate.html:7
msgid "Translate 42CTF"
msgstr ""
#: resources/templates/resources/translate.html:10
msgid "42CTF source code is publicly available on this"
msgstr ""
#: resources/templates/resources/translate.html:11
msgid ""
"Translation does not require any programming skill and is a good way to "
"contribute if you want to help us, by making the platform always more "
"accessible."
msgstr ""
#: resources/templates/resources/translate.html:12
msgid "We have a"
msgstr ""
#: resources/templates/resources/translate.html:12
msgid ""
"describing how to translate pages with the Django internalization module."
msgstr ""
#: resources/templates/resources/translate.html:13
msgid ""
"We invite you to read it to know all the details, but it merely requires you "
"to edit text files, so you see, no programming skills required ;)"
msgstr ""
#: resources/templates/resources/translate.html:14
msgid ""
"You will need to fork the git repository, make your changes, push them, and "
"then open a pull request so that we can merge your contributions into our "
"repository."
msgstr ""
#: resources/templates/resources/translate.html:15
msgid "Don't hesitate to reach for help on"
msgstr ""

View File

@ -0,0 +1,295 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-02-04 19:27+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: resources/templates/resources/42ctf.html:7
msgid "What is 42CTF ?"
msgstr ""
#: resources/templates/resources/42ctf.html:10
msgid "A short introduction to CTF"
msgstr ""
#: resources/templates/resources/42ctf.html:11
msgid ""
"CTF stands for Capture The Flag. It is a cybersecurity competition, where "
"participants have to solve challenges of various categories to gain points "
"and progress on the scoreboard."
msgstr ""
#: resources/templates/resources/42ctf.html:12
msgid "The challenges require participants to find sort of passwords called \\"
msgstr ""
#: resources/templates/resources/42ctf.html:15
msgid "Functionment of 42CTF"
msgstr ""
#: resources/templates/resources/42ctf.html:16
msgid "42CTF is what we call a permanent CTF."
msgstr ""
#: resources/templates/resources/42ctf.html:17
msgid "Except from the"
msgstr ""
#: resources/templates/resources/42ctf.html:17
msgid "events"
msgstr ""
#: resources/templates/resources/42ctf.html:17
msgid "challenges are available on the platform without time limitations."
msgstr ""
#: resources/templates/resources/42ctf.html:18
msgid "The registration on 42CTF is open to everyone, 42 students or not."
msgstr ""
#: resources/templates/resources/42ctf.html:19
msgid ""
"Events may or may not be open. If you would like to organize an event on "
"42CTF, feel free to contact us."
msgstr ""
#: resources/templates/resources/42ctf.html:22
msgid "42CTF Team"
msgstr ""
#: resources/templates/resources/42ctf.html:23
msgid "42CTF is managed by 42 students."
msgstr ""
#: resources/templates/resources/42ctf.html:24
msgid "You can meet the team on"
msgstr ""
#: resources/templates/resources/42ctf.html:25
msgid ""
"Challenges are created by various contributors, not necessarily 42 students."
msgstr ""
#: resources/templates/resources/42ctf.html:26
msgid ""
"Anyone is welcome to submit their own challenges, either on the permanent "
"CTF or for a specific event."
msgstr ""
#: resources/templates/resources/create_challenge.html:7
msgid "Create new challenges"
msgstr ""
#: resources/templates/resources/create_challenge.html:10
msgid "If you want to create new challenges for 42CTF, send us a message on "
msgstr ""
#: resources/templates/resources/create_challenge.html:11
msgid "If your challenge is offline, then you don't have to ask us in advance."
msgstr ""
#: resources/templates/resources/create_challenge.html:12
msgid ""
"If your challenge is online (for example web or pwn), then you should give "
"us a short description of what you want to do."
msgstr ""
#: resources/templates/resources/create_challenge.html:13
msgid ""
"We may be able to help you or to give you resources such as dockerfiles."
msgstr ""
#: resources/templates/resources/create_challenge.html:14
msgid "We plan to make those resources publicly available in a near future."
msgstr ""
#: resources/templates/resources/donate.html:7
msgid "Donate"
msgstr ""
#: resources/templates/resources/donate.html:10
msgid "Become a 42CTF member"
msgstr ""
#: resources/templates/resources/donate.html:11
msgid ""
"42CTF is a non-profit organization with a legal status under the french law "
"(Association loi 1901)."
msgstr ""
#: resources/templates/resources/donate.html:12
msgid "You can support us by becoming a member and paying a fee of 15 euros."
msgstr ""
#: resources/templates/resources/donate.html:13
msgid "Membership is then granted for 1 year."
msgstr ""
#: resources/templates/resources/donate.html:15
msgid "When you become a member, you gain the following advantages:"
msgstr ""
#: resources/templates/resources/donate.html:16
msgid ""
"A different color for your pseudo in the scoreboard, to let everyone know "
"you're a member."
msgstr ""
#: resources/templates/resources/donate.html:17
msgid ""
"The possibility to play again past CTF, with challenges no longer available, "
"in the form of private events with the people of your choice."
msgstr ""
#: resources/templates/resources/donate.html:18
msgid ""
"Ex: you played Welcome CTF 2021, and want to play it again with your friends "
"during one weekend."
msgstr ""
#: resources/templates/resources/donate.html:19
msgid "Or you didn't play Welcome CTF 2021 because you were not eligible."
msgstr ""
#: resources/templates/resources/donate.html:22
msgid "More advantages may come later, and you can submit us your ideas."
msgstr ""
#: resources/templates/resources/donate.html:23
msgid ""
"However, we will not organize limited time CTF for members only, as this "
"will be equivalent to organize paid events, and we want 42CTF to remain FREE "
"for all."
msgstr ""
#: resources/templates/resources/donate.html:26
msgid "Donate to 42CTF"
msgstr ""
#: resources/templates/resources/donate.html:27
msgid ""
"You can donate to 42CTF or pay your membership with the following means:"
msgstr ""
#: resources/templates/resources/donate.html:46
msgid ""
"If you would like us to add another payment method or if you want to pay in "
"cash, send us a message !"
msgstr ""
#: resources/templates/resources/donate.html:48
msgid ""
"If you're paying for your membership, don't forget to send us your first and "
"last name, as well as your 42CTF pseudo."
msgstr ""
#: resources/templates/resources/donate.html:49
msgid ""
"We will only use thoe data to keep track of our members and grant you "
"advantages, and we will never communicate them to any third party."
msgstr ""
#: resources/templates/resources/edit.html:7
msgid "Edit this page"
msgstr ""
#: resources/templates/resources/edit.html:12
msgid ""
"More information coming soon, but as you can guess it involves making a pull "
"request to your favorite"
msgstr ""
#: resources/templates/resources/tools.html:7
msgid "Recommended Tools"
msgstr ""
#: resources/templates/resources/tools.html:10
msgid "To get you started, we built a VM that you can simply import in"
msgstr ""
#: resources/templates/resources/tools.html:10
msgid "with a bunch of useful tools."
msgstr ""
#: resources/templates/resources/tools.html:11
msgid "You can dowload this OVA"
msgstr ""
#: resources/templates/resources/tools.html:11
msgid "here"
msgstr ""
#: resources/templates/resources/tools.html:13
msgid "Here are the tools installed on the VM:"
msgstr ""
#: resources/templates/resources/tools.html:22
msgid ""
"If you want to solve the challenges on your own machine, we recommend you to "
"use a Linux operating system."
msgstr ""
#: resources/templates/resources/tools.html:23
msgid ""
"Most of the reverse challenges are ELF binaries and won't run on Mac OS or "
"Windows."
msgstr ""
#: resources/templates/resources/tools.html:25
msgid "Additionnaly, you will need the following languages interpreters:"
msgstr ""
#: resources/templates/resources/translate.html:7
msgid "Translate 42CTF"
msgstr ""
#: resources/templates/resources/translate.html:10
msgid "42CTF source code is publicly available on this"
msgstr ""
#: resources/templates/resources/translate.html:11
msgid ""
"Translation does not require any programming skill and is a good way to "
"contribute if you want to help us, by making the platform always more "
"accessible."
msgstr ""
#: resources/templates/resources/translate.html:12
msgid "We have a"
msgstr ""
#: resources/templates/resources/translate.html:12
msgid ""
"describing how to translate pages with the Django internalization module."
msgstr ""
#: resources/templates/resources/translate.html:13
msgid ""
"We invite you to read it to know all the details, but it merely requires you "
"to edit text files, so you see, no programming skills required ;)"
msgstr ""
#: resources/templates/resources/translate.html:14
msgid ""
"You will need to fork the git repository, make your changes, push them, and "
"then open a pull request so that we can merge your contributions into our "
"repository."
msgstr ""
#: resources/templates/resources/translate.html:15
msgid "Don't hesitate to reach for help on"
msgstr ""

View File

@ -0,0 +1,294 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-02-06 23:31+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#: resources/templates/resources/42ctf.html:7
msgid "What is 42CTF ?"
msgstr ""
#: resources/templates/resources/42ctf.html:10
msgid "A short introduction to CTF"
msgstr ""
#: resources/templates/resources/42ctf.html:11
msgid ""
"CTF stands for Capture The Flag. It is a cybersecurity competition, where "
"participants have to solve challenges of various categories to gain points "
"and progress on the scoreboard."
msgstr ""
#: resources/templates/resources/42ctf.html:12
msgid "The challenges require participants to find sort of passwords called \\"
msgstr ""
#: resources/templates/resources/42ctf.html:15
msgid "Functionment of 42CTF"
msgstr ""
#: resources/templates/resources/42ctf.html:16
msgid "42CTF is what we call a permanent CTF."
msgstr ""
#: resources/templates/resources/42ctf.html:17
msgid "Except from the"
msgstr ""
#: resources/templates/resources/42ctf.html:17
msgid "events"
msgstr ""
#: resources/templates/resources/42ctf.html:17
msgid "challenges are available on the platform without time limitations."
msgstr ""
#: resources/templates/resources/42ctf.html:18
msgid "The registration on 42CTF is open to everyone, 42 students or not."
msgstr ""
#: resources/templates/resources/42ctf.html:19
msgid ""
"Events may or may not be open. If you would like to organize an event on "
"42CTF, feel free to contact us."
msgstr ""
#: resources/templates/resources/42ctf.html:22
msgid "42CTF Team"
msgstr ""
#: resources/templates/resources/42ctf.html:23
msgid "42CTF is managed by 42 students."
msgstr ""
#: resources/templates/resources/42ctf.html:24
msgid "You can meet the team on"
msgstr ""
#: resources/templates/resources/42ctf.html:25
msgid ""
"Challenges are created by various contributors, not necessarily 42 students."
msgstr ""
#: resources/templates/resources/42ctf.html:26
msgid ""
"Anyone is welcome to submit their own challenges, either on the permanent "
"CTF or for a specific event."
msgstr ""
#: resources/templates/resources/create_challenge.html:7
msgid "Create new challenges"
msgstr ""
#: resources/templates/resources/create_challenge.html:10
msgid "If you want to create new challenges for 42CTF, send us a message on "
msgstr ""
#: resources/templates/resources/create_challenge.html:11
msgid "If your challenge is offline, then you don't have to ask us in advance."
msgstr ""
#: resources/templates/resources/create_challenge.html:12
msgid ""
"If your challenge is online (for example web or pwn), then you should give "
"us a short description of what you want to do."
msgstr ""
#: resources/templates/resources/create_challenge.html:13
msgid ""
"We may be able to help you or to give you resources such as dockerfiles."
msgstr ""
#: resources/templates/resources/create_challenge.html:14
msgid "We plan to make those resources publicly available in a near future."
msgstr ""
#: resources/templates/resources/donate.html:7
msgid "Donate"
msgstr ""
#: resources/templates/resources/donate.html:10
msgid "Become a 42CTF member"
msgstr ""
#: resources/templates/resources/donate.html:11
msgid ""
"42CTF is a non-profit organization with a legal status under the french law "
"(Association loi 1901)."
msgstr ""
#: resources/templates/resources/donate.html:12
msgid "You can support us by becoming a member and paying a fee of 15 euros."
msgstr ""
#: resources/templates/resources/donate.html:13
msgid "Membership is then granted for 1 year."
msgstr ""
#: resources/templates/resources/donate.html:15
msgid "When you become a member, you gain the following advantages:"
msgstr ""
#: resources/templates/resources/donate.html:16
msgid ""
"A different color for your pseudo in the scoreboard, to let everyone know "
"you're a member."
msgstr ""
#: resources/templates/resources/donate.html:17
msgid ""
"The possibility to play again past CTF, with challenges no longer available, "
"in the form of private events with the people of your choice."
msgstr ""
#: resources/templates/resources/donate.html:18
msgid ""
"Ex: you played Welcome CTF 2021, and want to play it again with your friends "
"during one weekend."
msgstr ""
#: resources/templates/resources/donate.html:19
msgid "Or you didn't play Welcome CTF 2021 because you were not eligible."
msgstr ""
#: resources/templates/resources/donate.html:22
msgid "More advantages may come later, and you can submit us your ideas."
msgstr ""
#: resources/templates/resources/donate.html:23
msgid ""
"However, we will not organize limited time CTF for members only, as this "
"will be equivalent to organize paid events, and we want 42CTF to remain FREE "
"for all."
msgstr ""
#: resources/templates/resources/donate.html:26
msgid "Donate to 42CTF"
msgstr ""
#: resources/templates/resources/donate.html:27
msgid ""
"You can donate to 42CTF or pay your membership with the following means:"
msgstr ""
#: resources/templates/resources/donate.html:46
msgid ""
"If you would like us to add another payment method or if you want to pay in "
"cash, send us a message !"
msgstr ""
#: resources/templates/resources/donate.html:48
msgid ""
"If you're paying for your membership, don't forget to send us your first and "
"last name, as well as your 42CTF pseudo."
msgstr ""
#: resources/templates/resources/donate.html:49
msgid ""
"We will only use thoe data to keep track of our members and grant you "
"advantages, and we will never communicate them to any third party."
msgstr ""
#: resources/templates/resources/edit.html:7
msgid "Edit this page"
msgstr ""
#: resources/templates/resources/edit.html:12
msgid ""
"More information coming soon, but as you can guess it involves making a pull "
"request to your favorite"
msgstr ""
#: resources/templates/resources/tools.html:7
msgid "Recommended Tools"
msgstr ""
#: resources/templates/resources/tools.html:10
msgid "To get you started, we built a VM that you can simply import in"
msgstr ""
#: resources/templates/resources/tools.html:10
msgid "with a bunch of useful tools."
msgstr ""
#: resources/templates/resources/tools.html:11
msgid "You can dowload this OVA"
msgstr ""
#: resources/templates/resources/tools.html:11
msgid "here"
msgstr ""
#: resources/templates/resources/tools.html:13
msgid "Here are the tools installed on the VM:"
msgstr ""
#: resources/templates/resources/tools.html:22
msgid ""
"If you want to solve the challenges on your own machine, we recommend you to "
"use a Linux operating system."
msgstr ""
#: resources/templates/resources/tools.html:23
msgid ""
"Most of the reverse challenges are ELF binaries and won't run on Mac OS or "
"Windows."
msgstr ""
#: resources/templates/resources/tools.html:25
msgid "Additionnaly, you will need the following languages interpreters:"
msgstr ""
#: resources/templates/resources/translate.html:7
msgid "Translate 42CTF"
msgstr ""
#: resources/templates/resources/translate.html:10
msgid "42CTF source code is publicly available on this"
msgstr ""
#: resources/templates/resources/translate.html:11
msgid ""
"Translation does not require any programming skill and is a good way to "
"contribute if you want to help us, by making the platform always more "
"accessible."
msgstr ""
#: resources/templates/resources/translate.html:12
msgid "We have a"
msgstr ""
#: resources/templates/resources/translate.html:12
msgid ""
"describing how to translate pages with the Django internalization module."
msgstr ""
#: resources/templates/resources/translate.html:13
msgid ""
"We invite you to read it to know all the details, but it merely requires you "
"to edit text files, so you see, no programming skills required ;)"
msgstr ""
#: resources/templates/resources/translate.html:14
msgid ""
"You will need to fork the git repository, make your changes, push them, and "
"then open a pull request so that we can merge your contributions into our "
"repository."
msgstr ""
#: resources/templates/resources/translate.html:15
msgid "Don't hesitate to reach for help on"
msgstr ""

View File

@ -0,0 +1,297 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-02-04 19:27+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n"
"%100>=11 && n%100<=14)? 2 : 3);\n"
#: resources/templates/resources/42ctf.html:7
msgid "What is 42CTF ?"
msgstr ""
#: resources/templates/resources/42ctf.html:10
msgid "A short introduction to CTF"
msgstr ""
#: resources/templates/resources/42ctf.html:11
msgid ""
"CTF stands for Capture The Flag. It is a cybersecurity competition, where "
"participants have to solve challenges of various categories to gain points "
"and progress on the scoreboard."
msgstr ""
#: resources/templates/resources/42ctf.html:12
msgid "The challenges require participants to find sort of passwords called \\"
msgstr ""
#: resources/templates/resources/42ctf.html:15
msgid "Functionment of 42CTF"
msgstr ""
#: resources/templates/resources/42ctf.html:16
msgid "42CTF is what we call a permanent CTF."
msgstr ""
#: resources/templates/resources/42ctf.html:17
msgid "Except from the"
msgstr ""
#: resources/templates/resources/42ctf.html:17
msgid "events"
msgstr ""
#: resources/templates/resources/42ctf.html:17
msgid "challenges are available on the platform without time limitations."
msgstr ""
#: resources/templates/resources/42ctf.html:18
msgid "The registration on 42CTF is open to everyone, 42 students or not."
msgstr ""
#: resources/templates/resources/42ctf.html:19
msgid ""
"Events may or may not be open. If you would like to organize an event on "
"42CTF, feel free to contact us."
msgstr ""
#: resources/templates/resources/42ctf.html:22
msgid "42CTF Team"
msgstr ""
#: resources/templates/resources/42ctf.html:23
msgid "42CTF is managed by 42 students."
msgstr ""
#: resources/templates/resources/42ctf.html:24
msgid "You can meet the team on"
msgstr ""
#: resources/templates/resources/42ctf.html:25
msgid ""
"Challenges are created by various contributors, not necessarily 42 students."
msgstr ""
#: resources/templates/resources/42ctf.html:26
msgid ""
"Anyone is welcome to submit their own challenges, either on the permanent "
"CTF or for a specific event."
msgstr ""
#: resources/templates/resources/create_challenge.html:7
msgid "Create new challenges"
msgstr ""
#: resources/templates/resources/create_challenge.html:10
msgid "If you want to create new challenges for 42CTF, send us a message on "
msgstr ""
#: resources/templates/resources/create_challenge.html:11
msgid "If your challenge is offline, then you don't have to ask us in advance."
msgstr ""
#: resources/templates/resources/create_challenge.html:12
msgid ""
"If your challenge is online (for example web or pwn), then you should give "
"us a short description of what you want to do."
msgstr ""
#: resources/templates/resources/create_challenge.html:13
msgid ""
"We may be able to help you or to give you resources such as dockerfiles."
msgstr ""
#: resources/templates/resources/create_challenge.html:14
msgid "We plan to make those resources publicly available in a near future."
msgstr ""
#: resources/templates/resources/donate.html:7
msgid "Donate"
msgstr ""
#: resources/templates/resources/donate.html:10
msgid "Become a 42CTF member"
msgstr ""
#: resources/templates/resources/donate.html:11
msgid ""
"42CTF is a non-profit organization with a legal status under the french law "
"(Association loi 1901)."
msgstr ""
#: resources/templates/resources/donate.html:12
msgid "You can support us by becoming a member and paying a fee of 15 euros."
msgstr ""
#: resources/templates/resources/donate.html:13
msgid "Membership is then granted for 1 year."
msgstr ""
#: resources/templates/resources/donate.html:15
msgid "When you become a member, you gain the following advantages:"
msgstr ""
#: resources/templates/resources/donate.html:16
msgid ""
"A different color for your pseudo in the scoreboard, to let everyone know "
"you're a member."
msgstr ""
#: resources/templates/resources/donate.html:17
msgid ""
"The possibility to play again past CTF, with challenges no longer available, "
"in the form of private events with the people of your choice."
msgstr ""
#: resources/templates/resources/donate.html:18
msgid ""
"Ex: you played Welcome CTF 2021, and want to play it again with your friends "
"during one weekend."
msgstr ""
#: resources/templates/resources/donate.html:19
msgid "Or you didn't play Welcome CTF 2021 because you were not eligible."
msgstr ""
#: resources/templates/resources/donate.html:22
msgid "More advantages may come later, and you can submit us your ideas."
msgstr ""
#: resources/templates/resources/donate.html:23
msgid ""
"However, we will not organize limited time CTF for members only, as this "
"will be equivalent to organize paid events, and we want 42CTF to remain FREE "
"for all."
msgstr ""
#: resources/templates/resources/donate.html:26
msgid "Donate to 42CTF"
msgstr ""
#: resources/templates/resources/donate.html:27
msgid ""
"You can donate to 42CTF or pay your membership with the following means:"
msgstr ""
#: resources/templates/resources/donate.html:46
msgid ""
"If you would like us to add another payment method or if you want to pay in "
"cash, send us a message !"
msgstr ""
#: resources/templates/resources/donate.html:48
msgid ""
"If you're paying for your membership, don't forget to send us your first and "
"last name, as well as your 42CTF pseudo."
msgstr ""
#: resources/templates/resources/donate.html:49
msgid ""
"We will only use thoe data to keep track of our members and grant you "
"advantages, and we will never communicate them to any third party."
msgstr ""
#: resources/templates/resources/edit.html:7
msgid "Edit this page"
msgstr ""
#: resources/templates/resources/edit.html:12
msgid ""
"More information coming soon, but as you can guess it involves making a pull "
"request to your favorite"
msgstr ""
#: resources/templates/resources/tools.html:7
msgid "Recommended Tools"
msgstr ""
#: resources/templates/resources/tools.html:10
msgid "To get you started, we built a VM that you can simply import in"
msgstr ""
#: resources/templates/resources/tools.html:10
msgid "with a bunch of useful tools."
msgstr ""
#: resources/templates/resources/tools.html:11
msgid "You can dowload this OVA"
msgstr ""
#: resources/templates/resources/tools.html:11
msgid "here"
msgstr ""
#: resources/templates/resources/tools.html:13
msgid "Here are the tools installed on the VM:"
msgstr ""
#: resources/templates/resources/tools.html:22
msgid ""
"If you want to solve the challenges on your own machine, we recommend you to "
"use a Linux operating system."
msgstr ""
#: resources/templates/resources/tools.html:23
msgid ""
"Most of the reverse challenges are ELF binaries and won't run on Mac OS or "
"Windows."
msgstr ""
#: resources/templates/resources/tools.html:25
msgid "Additionnaly, you will need the following languages interpreters:"
msgstr ""
#: resources/templates/resources/translate.html:7
msgid "Translate 42CTF"
msgstr ""
#: resources/templates/resources/translate.html:10
msgid "42CTF source code is publicly available on this"
msgstr ""
#: resources/templates/resources/translate.html:11
msgid ""
"Translation does not require any programming skill and is a good way to "
"contribute if you want to help us, by making the platform always more "
"accessible."
msgstr ""
#: resources/templates/resources/translate.html:12
msgid "We have a"
msgstr ""
#: resources/templates/resources/translate.html:12
msgid ""
"describing how to translate pages with the Django internalization module."
msgstr ""
#: resources/templates/resources/translate.html:13
msgid ""
"We invite you to read it to know all the details, but it merely requires you "
"to edit text files, so you see, no programming skills required ;)"
msgstr ""
#: resources/templates/resources/translate.html:14
msgid ""
"You will need to fork the git repository, make your changes, push them, and "
"then open a pull request so that we can merge your contributions into our "
"repository."
msgstr ""
#: resources/templates/resources/translate.html:15
msgid "Don't hesitate to reach for help on"
msgstr ""

View File

3
src/resources/models.py Normal file
View File

@ -0,0 +1,3 @@
from django.db import models
# Create your models here.

View File

@ -0,0 +1,31 @@
{% block content %}
{% load i18n %}
{% get_current_language as lang %}
<div class="col-sm-12 col-md-6">
<div class="ctf-block">
<div class="ctf-head">
<center><h3>{% trans "What is 42CTF ?" %}</h3></center>
</div>
<div class="ctf-body">
<h4>{% trans "A short introduction to CTF" %}</h4>
{% trans "CTF stands for Capture The Flag. It is a cybersecurity competition, where participants have to solve challenges of various categories to gain points and progress on the scoreboard." %}
{% trans "The challenges require participants to find sort of passwords called \"flags\" and to submit them on the platform."%}
<br><br>
<h4>{% trans "Functionment of 42CTF" %}</h4>
{% trans "42CTF is what we call a permanent CTF." %}<br>
{% trans "Except from the" %} <a href="{% url 'events:events' %}">{% translate "events" %}</a>, {% trans "challenges are available on the platform without time limitations." %}
{% trans "The registration on 42CTF is open to everyone, 42 students or not." %}<br>
{% trans "Events may or may not be open. If you would like to organize an event on 42CTF, feel free to contact us." %}<br>
<br><br>
<h4>{% trans "42CTF Team" %}</h4>
{% trans "42CTF is managed by 42 students." %}<br>
{% trans "You can meet the team on" %} <a class="footer_imgs" href="https://discord.gg/DwZqPpA" target="_blank"><img src="/static/img/discord.png" width="30"></a>.<br>
{% trans "Challenges are created by various contributors, not necessarily 42 students."%}<br>
{% trans "Anyone is welcome to submit their own challenges, either on the permanent CTF or for a specific event." %}
</div>
</div>
</div>
{% endblock %}

View File

@ -0,0 +1,19 @@
{% block content %}
{% load i18n %}
{% get_current_language as lang %}
<div class="col-sm-12 col-md-6">
<div class="ctf-block">
<div class="ctf-head">
<center><h3>{% trans "Create new challenges" %}</h3></center>
</div>
<div class="ctf-body">
{% trans "If you want to create new challenges for 42CTF, send us a message on " %}<a class="footer_imgs" href="https://discord.gg/DwZqPpA" target="_blank"><img src="/static/img/discord.png" width="30"></a> !<br><br>
{% trans "If your challenge is offline, then you don't have to ask us in advance." %}<br>
{% trans "If your challenge is online (for example web or pwn), then you should give us a short description of what you want to do." %}
{% trans "We may be able to help you or to give you resources such as dockerfiles." %}
{% trans "We plan to make those resources publicly available in a near future." %}
</div>
</div>
</div>
{% endblock %}

View File

@ -0,0 +1,54 @@
{% block content %}
{% load i18n %}
{% get_current_language as lang %}
<div class="col-sm-12">
<div class="ctf-block">
<div class="ctf-head">
<center><h3>{% trans "Donate" %}</h3></center>
</div>
<div class="ctf-body">
<h4>{% trans "Become a 42CTF member" %}</h4>
{% trans "42CTF is a non-profit organization with a legal status under the french law (Association loi 1901)." %}<br>
{% trans "You can support us by becoming a member and paying a fee of 15 euros." %}<br>
{% trans "Membership is then granted for 1 year." %}<br><br>
{% trans "When you become a member, you gain the following advantages:" %}<br>
- {% trans "A different color for your pseudo in the scoreboard, to let everyone know you're a member." %}<br>
- {% trans "The possibility to play again past CTF, with challenges no longer available, in the form of private events with the people of your choice." %}<br>
{% trans "Ex: you played Welcome CTF 2021, and want to play it again with your friends during one weekend." %}
{% trans "Or you didn't play Welcome CTF 2021 because you were not eligible." %}
<br><br>
{% trans "More advantages may come later, and you can submit us your ideas." %}<br>
{% trans "However, we will not organize limited time CTF for members only, as this will be equivalent to organize paid events, and we want 42CTF to remain FREE for all." %}<br>
<br><br>
<center><h4>{% trans "Donate to 42CTF" %}</h4>
{% trans "You can donate to 42CTF or pay your membership with the following means:" %}<br>
<a href="https://www.patreon.com/42ctf" target="_blank" class="patreon li-patreon">
<!-- <div class="patreon-content"> -->
<span class="svg-box">
<svg viewBox="0 0 569 546" xmlns="http://www.w3.org/2000/svg"><g><circle cx="362.589996" cy="204.589996" data-fill="1" id="Oval" r="204.589996"></circle><rect data-fill="2" height="545.799988" id="Rectangle" width="100" x="0" y="0"></rect></g></svg>
</span>
<span class="patreon-text">
Patreon
</span>
<!-- </div> -->
</a>
<a href="https://www.paypal.com/donate/?hosted_button_id=M6YBYZ63MQGAY" target="_blank">
<img src="/static/img/paypal.png" width="200" style="margin-top: -10px;">
</a>
<a href="https://www.helloasso.com/associations/42ctf/adhesions/adhesion" target="_blank">
<img src="/static/img/hello_asso.png" width="180" style="margin-top: -10px;">
</a>
</center>
<br>
{% trans "If you would like us to add another payment method or if you want to pay in cash, send us a message !" %}<br><br>
{% trans "If you're paying for your membership, don't forget to send us your first and last name, as well as your 42CTF pseudo." %}
{% trans "We will only use thoe data to keep track of our members and grant you advantages, and we will never communicate them to any third party." %}
</div>
</div>
</div>
{% endblock %}

View File

@ -0,0 +1,19 @@
{% block content %}
{% load i18n %}
{% get_current_language as lang %}
<div class="col-sm-12 col-md-6">
<div class="ctf-block">
<div class="ctf-head">
<center><h3>{% trans "Edit this page" %}</h3></center>
</div>
<div class="ctf-body">
<br>
<br>
{% trans "More information coming soon, but as you can guess it involves making a pull request to your favorite" %} <a href="https://github.com/Danhia/42CTF/">repository</a> ;)
<br>
<br>
<br>
</div>
</div>
</div>
{% endblock %}

Some files were not shown because too many files have changed in this diff Show More