Compare commits
85 Commits
f8eef0ef3d
...
2f6362360b
Author | SHA1 | Date |
---|---|---|
Danhia | 2f6362360b | |
Danhia | a639904ee2 | |
Danhia | 63d22cdf6d | |
Danhia | 911c9f6732 | |
Danhia | 6337a0dcdb | |
Danhia | c25f58341d | |
Danhia | 2ab42b20c7 | |
Danhia | c38cc8dc94 | |
Danhia | 396d8ee99b | |
Danhia | da6e51bdcd | |
Danhia | 0beafc39fa | |
Danhia | b352a2341a | |
Danhia | 0c08fdda96 | |
Danhia | 314a7e17b4 | |
Danhia | 3c4478dddb | |
Danhia | 6455a8ddc6 | |
Danhia | 4802218005 | |
Danhia | 5242150b92 | |
Danhia | c06c94e807 | |
Danhia | 5219778d5b | |
Danhia | a1bda8a7cc | |
Danhia | aea1ecda15 | |
Danhia | 79c74e1946 | |
Danhia | 94a24376d4 | |
Danhia | bd4dadeaf1 | |
Danhia | 827068f113 | |
Danhia | 818be801b2 | |
Danhia | 6a16e0fdbd | |
Danhia | 40a7d4ebdd | |
Danhia | a6095cc5c4 | |
Danhia | 66a9bd6b09 | |
Danhia | ceede3cfa0 | |
Danhia | ef1673dbd4 | |
Danhia | e4f68edeff | |
Danhia | 2ab410efdf | |
Danhia | dfa5c3830d | |
Danhia | 6ec1a20e74 | |
Danhia | 7ae36e2cee | |
Danhia | 411896bf01 | |
Danhia | 9405fcabde | |
Danhia | 727e11a29e | |
Danhia | be0fc5dd67 | |
Danhia | d20b3f75d9 | |
Danhia | 3d456ea26b | |
ix | e5c4a2856e | |
Danhia | 7cf7fd82d4 | |
Maxime ROTH | ca34f76465 | |
Danhia | 0123edd87a | |
Maxime ROTH | a295321f19 | |
ix | 2dcea7cd74 | |
Danhia | ecd7ca69db | |
ix | e6e50fcd05 | |
ix | 4dcc953baf | |
ix | a7620eec77 | |
ix | baa598f1aa | |
ix | ddccb96586 | |
ix | 9f0273a85b | |
ix | 63349df20f | |
Ix | 1274a6b7fe | |
ix | f5b54e3ed6 | |
ix | 0a42af4a9b | |
Ix | 87b1a5f6f8 | |
ix | a379f4934d | |
ix | 86cc6070e1 | |
ix | c98e89b5ca | |
Ix | 8d3cd60ae4 | |
ix | e956082385 | |
ix | 071ba34792 | |
ix | 81e283ea69 | |
ix | ed928f6f33 | |
ix | ce31ce30ee | |
ix | 500d6fe228 | |
Danhia | 0c0506505b | |
ix | 62b3b7e5cd | |
ix | acbf38a6a7 | |
ix | dbdd6b06f8 | |
Danhia | 428edadb31 | |
Danhia | 768e62f369 | |
ix | 52c2dcdec3 | |
ix | 42441e7854 | |
ix | b0cea92ea8 | |
ix | 0c285cc486 | |
ix | 5e0da0e8b3 | |
Ix | faec388ad5 | |
Ix | afb572d091 |
|
@ -1,3 +1,4 @@
|
||||||
|
local_settings.py
|
||||||
# Byte-compiled / optimized / DLL files
|
# Byte-compiled / optimized / DLL files
|
||||||
__pycache__/
|
__pycache__/
|
||||||
*.py[cod]
|
*.py[cod]
|
||||||
|
@ -108,7 +109,7 @@ media/
|
||||||
*.pid
|
*.pid
|
||||||
*.json
|
*.json
|
||||||
|
|
||||||
settings.py
|
local-settings.py
|
||||||
/data
|
/data
|
||||||
/config
|
/config
|
||||||
|
|
||||||
|
|
30
README.md
30
README.md
|
@ -9,16 +9,16 @@ CTF by 42 students
|
||||||
- [x] Section "Intro"
|
- [x] Section "Intro"
|
||||||
- [x] Section Treasure Hunt
|
- [x] Section Treasure Hunt
|
||||||
- [x] Edition de profil
|
- [x] Edition de profil
|
||||||
- [ ] Ajouter de la Doc
|
- [x] Ajouter de la Doc
|
||||||
- [x] Infrastructure de pwn
|
- [x] Infrastructure de pwn
|
||||||
- [x] Organiser une session découverte
|
- [x] Organiser une session découverte
|
||||||
- [x] Compteur de flags
|
- [x] Compteur de flags
|
||||||
- [ ] Graphiques statistiques
|
- [x] Graphiques statistiques
|
||||||
- [x] Création d'un discord linkable
|
- [x] Création d'un discord linkable
|
||||||
- [ ] Refonte du linkage discord -> 42ctf
|
- [ ] Refonte du linkage discord -> 42ctf
|
||||||
- [ ] Traduction du site
|
- [x] Traduction du site
|
||||||
- [x] Anglais
|
- [x] Anglais
|
||||||
- [ ] Français
|
- [x] Français
|
||||||
- [ ] Russe
|
- [ ] Russe
|
||||||
- [ ] Espagnol
|
- [ ] Espagnol
|
||||||
- [ ] Italien
|
- [ ] Italien
|
||||||
|
@ -26,3 +26,25 @@ CTF by 42 students
|
||||||
- [ ] Feature proposer une solution à un challenge
|
- [ ] Feature proposer une solution à un challenge
|
||||||
- [ ] Système de badge/succès
|
- [ ] 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)
|
- [ ] 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
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
Django
|
||||||
|
requests
|
||||||
|
authlib
|
|
@ -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
|
||||||
|
|
|
@ -1,5 +1,12 @@
|
||||||
from .models import UserProfileInfo
|
from .models import UserProfileInfo
|
||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
|
|
||||||
admin.site.register(UserProfileInfo)
|
#admin.site.register(UserProfileInfo)
|
||||||
# Register your models here.
|
# 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']
|
|
@ -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'),
|
||||||
|
),
|
||||||
|
]
|
|
@ -12,6 +12,9 @@ class UserProfileInfo(models.Model):
|
||||||
last_submission_date = models.DateTimeField('Last Submission Date', default=timezone.now)
|
last_submission_date = models.DateTimeField('Last Submission Date', default=timezone.now)
|
||||||
token = models.CharField(max_length=200, blank=True)
|
token = models.CharField(max_length=200, blank=True)
|
||||||
discord_id = models.CharField(max_length=20, null=True, blank=True, unique=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):
|
def __str__(self):
|
||||||
return self.user.username
|
return self.user.username
|
||||||
class Meta:
|
class Meta:
|
||||||
|
|
|
@ -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 %}
|
||||||
|
|
|
@ -39,26 +39,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</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>
|
||||||
<div class="d-none d-md-block col-10 col-md-3 right-sidebar">
|
<div class="d-none d-md-block col-10 col-md-3 right-sidebar">
|
||||||
<ul class="list-group">
|
<ul class="list-group">
|
||||||
|
@ -71,8 +52,16 @@
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
{% endif %}
|
{% 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>
|
||||||
|
<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>
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
@ -8,28 +8,28 @@
|
||||||
<h3>Login</h3>
|
<h3>Login</h3>
|
||||||
</div>
|
</div>
|
||||||
<div class="ctf-body">
|
<div class="ctf-body">
|
||||||
<div class="col-sm-8 col-md-6 mx-auto">
|
<div class="col-sm-8 col-md-6 mx-auto">
|
||||||
{% if error %}
|
{% if error %}
|
||||||
<span class="message error-msg">{% trans "Please, verify your infos." %}</span>
|
<span class="message error-msg">{% trans "Please, verify your infos." %}</span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<form method="post">
|
<form method="post">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<input class="form-control" type="text" name="username" placeholder="{% trans "Username" %}"></br>
|
<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="password" name="password" placeholder="{% trans "Password" %}"></br>
|
||||||
<input class="form-control" type="submit" value="login">
|
<input class="form-control" type="submit" value="login">
|
||||||
</div>
|
</div>
|
||||||
<a href="{% url 'password_reset' %}">{% trans "Reset password" %}</a>
|
<a href="{% url 'password_reset' %}">{% trans "Reset password" %}</a>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-12 col-md-3 right-sidebar">
|
<div class="col-sm-12 col-md-3 right-sidebar">
|
||||||
<ul class="list-group">
|
<ul class="list-group">
|
||||||
<a href="/accounts/signin" class="list-group-item">{% trans "Login" %}</a>
|
<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/signup" class="list-group-item">{% trans "Sign up" %}</a>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,13 +1,22 @@
|
||||||
{% extends 'base.html' %}
|
{% extends 'base.html' %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
|
{% load key_value %}
|
||||||
|
{% load is_member %}
|
||||||
|
{% ismember user.userprofileinfo as is_member %}
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-sm-12 col-md-9">
|
<div class="col-sm-12 col-md-9">
|
||||||
<div>
|
<div>
|
||||||
<h4>Challenges Solved by {{ user.username }}</h4>
|
<h4>{% trans "Challenges Solved by" %} <span class="{{ is_member }}">{{ user.username }}</span></h4>
|
||||||
{% if solves%}
|
{% if solves%}
|
||||||
<table class="table table-dark">
|
|
||||||
<thead>
|
<div class="table table-dark">
|
||||||
|
<div class="card-body">
|
||||||
|
<div id="time-chart"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<table class="table table-dark">
|
||||||
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th scope="col">{% trans "Challenge Name" %}</th>
|
<th scope="col">{% trans "Challenge Name" %}</th>
|
||||||
<th scope="col">{% trans "Category" %}</th>
|
<th scope="col">{% trans "Category" %}</th>
|
||||||
|
@ -18,7 +27,7 @@
|
||||||
<tbody>
|
<tbody>
|
||||||
{% for s in solves %}
|
{% for s in solves %}
|
||||||
<tr>
|
<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.category.name}}</td>
|
||||||
<td>{{ s.ctf.points }}</td>
|
<td>{{ s.ctf.points }}</td>
|
||||||
<td>{{ s.flag_date|date:"Y-m-d H:i:s" }}</td>
|
<td>{{ s.flag_date|date:"Y-m-d H:i:s" }}</td>
|
||||||
|
@ -27,14 +36,15 @@
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
{% else %}
|
{% 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 %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="d-none d-md-block col-10 col-md-3 right-sidebar">
|
<div class="d-none d-md-block col-10 col-md-3 right-sidebar">
|
||||||
<ul class="list-group">
|
<ul class="list-group">
|
||||||
<li class="list-group-item">{{ user.username }}</li>
|
<li class="list-group-item {{ is_member }}">{{ user.username }}</li>
|
||||||
<li class="list-group-item">{% trans "Score" %} : {{ user.userprofileinfo.score }}</li>
|
<li class="list-group-item">{% trans "Score" %} : {{ score }}</li>
|
||||||
|
<li class="list-group-item">{% trans "Rank" %} : {{ rank }}</li>
|
||||||
{% if user.userprofileinfo.portfolio_site %}
|
{% if user.userprofileinfo.portfolio_site %}
|
||||||
<li class="list-group-item">
|
<li class="list-group-item">
|
||||||
<a href="{{ user.userprofileinfo.portfolio_site }}" target="_blank">
|
<a href="{{ user.userprofileinfo.portfolio_site }}" target="_blank">
|
||||||
|
@ -42,9 +52,101 @@
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
{% endif %}
|
{% 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>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</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 %}
|
{% endblock %}
|
||||||
|
|
||||||
|
|
|
@ -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(',','.')
|
|
@ -12,5 +12,6 @@ urlpatterns = [
|
||||||
path('rank/<str:token>', views.rank, name='rank'),
|
path('rank/<str:token>', views.rank, name='rank'),
|
||||||
path('connections/connect/discord', views.connection.connect, name='connections-connect-discord'),
|
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/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'),
|
||||||
]
|
]
|
||||||
|
|
|
@ -2,7 +2,7 @@ from django.shortcuts import render, redirect, get_object_or_404
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
from django import forms
|
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 ..forms import UserForm,UserProfileInfoForm, UserInfosUpdateForm, UserUpdateForm
|
||||||
from django.contrib.auth import authenticate, login, logout
|
from django.contrib.auth import authenticate, login, logout
|
||||||
from django.contrib.auth.models import User
|
from django.contrib.auth.models import User
|
||||||
|
@ -15,116 +15,170 @@ from django.urls import reverse
|
||||||
from secrets import token_hex
|
from secrets import token_hex
|
||||||
from accounts.models import UserProfileInfo
|
from accounts.models import UserProfileInfo
|
||||||
|
|
||||||
|
from django.contrib.auth.models import timezone
|
||||||
|
|
||||||
from . import connection
|
from . import connection
|
||||||
|
|
||||||
def signin(request):
|
def signin(request):
|
||||||
if not request.user.is_authenticated:
|
if not request.user.is_authenticated:
|
||||||
if request.method == 'POST':
|
if request.method == 'POST':
|
||||||
username = request.POST.get('username')
|
username = request.POST.get('username')
|
||||||
password = request.POST.get('password')
|
password = request.POST.get('password')
|
||||||
user = authenticate(username=username, password=password)
|
user = authenticate(username=username, password=password)
|
||||||
if user:
|
if user:
|
||||||
if user.is_active:
|
if user.is_active:
|
||||||
login(request,user)
|
login(request,user)
|
||||||
return HttpResponseRedirect(reverse('home'))
|
return HttpResponseRedirect(reverse('home'))
|
||||||
else:
|
else:
|
||||||
return HttpResponse(_("Your account was inactive."))
|
return HttpResponse(_("Your account was inactive."))
|
||||||
else:
|
else:
|
||||||
return render(request, 'accounts/login.html', {'error': True})
|
return render(request, 'accounts/login.html', {'error': True})
|
||||||
else:
|
else:
|
||||||
return render(request, 'accounts/login.html', {})
|
return render(request, 'accounts/login.html', {})
|
||||||
else:
|
else:
|
||||||
return HttpResponseRedirect(reverse('home'))
|
return HttpResponseRedirect(reverse('home'))
|
||||||
|
|
||||||
def signup(request):
|
def signup(request):
|
||||||
if not request.user.is_authenticated:
|
if not request.user.is_authenticated:
|
||||||
user_form = UserForm()
|
user_form = UserForm()
|
||||||
profile_form = UserProfileInfoForm()
|
profile_form = UserProfileInfoForm()
|
||||||
registered = False
|
registered = False
|
||||||
if request.method == 'POST':
|
if request.method == 'POST':
|
||||||
pass1 = request.POST.get('password')
|
pass1 = request.POST.get('password')
|
||||||
if len(pass1) < 8:
|
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})
|
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()
|
first_isalpha = pass1[0].isalpha()
|
||||||
if not any(c.isdigit() for c in pass1) or not any(c.isalpha() for c in pass1):
|
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.")})
|
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():
|
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.")})
|
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)
|
user_form = UserForm(data=request.POST)
|
||||||
profile_form = UserProfileInfoForm(data=request.POST)
|
profile_form = UserProfileInfoForm(data=request.POST)
|
||||||
if user_form.is_valid() and profile_form.is_valid():
|
if user_form.is_valid() and profile_form.is_valid():
|
||||||
user = user_form.save()
|
user = user_form.save()
|
||||||
user.set_password(user.password)
|
user.set_password(user.password)
|
||||||
user.save()
|
user.save()
|
||||||
profile = profile_form.save(commit=False)
|
profile = profile_form.save(commit=False)
|
||||||
profile.user = user
|
profile.user = user
|
||||||
profile.token = token_hex(16)
|
profile.token = token_hex(16)
|
||||||
profile.save()
|
profile.save()
|
||||||
registered = True
|
registered = True
|
||||||
else:
|
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_failed':_("A user with that username already exists.")})
|
||||||
return render(request,'accounts/register.html',
|
return render(request,'accounts/register.html',
|
||||||
{'user_form':user_form,
|
{'user_form':user_form,
|
||||||
'profile_form':profile_form,
|
'profile_form':profile_form,
|
||||||
'registered':registered})
|
'registered':registered})
|
||||||
else:
|
else:
|
||||||
return HttpResponseRedirect(reverse('home'))
|
return HttpResponseRedirect(reverse('home'))
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
def out(request):
|
def out(request):
|
||||||
logout(request)
|
logout(request)
|
||||||
return HttpResponseRedirect(reverse('home'))
|
return HttpResponseRedirect(reverse('home'))
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
def edit(request):
|
def edit(request):
|
||||||
if request.method == 'POST':
|
if request.method == 'POST':
|
||||||
umail = request.user.email
|
umail = request.user.email
|
||||||
uuser = request.user.username
|
uuser = request.user.username
|
||||||
p_form = UserInfosUpdateForm(request.POST, instance=request.user.userprofileinfo)
|
p_form = UserInfosUpdateForm(request.POST, instance=request.user.userprofileinfo)
|
||||||
u_form = UserUpdateForm(request.POST, instance=request.user)
|
u_form = UserUpdateForm(request.POST, instance=request.user)
|
||||||
error = None
|
error = None
|
||||||
success = None
|
success = None
|
||||||
if p_form.is_valid() and u_form.is_valid():
|
if p_form.is_valid() and u_form.is_valid():
|
||||||
pmail = u_form.cleaned_data['email']
|
pmail = u_form.cleaned_data['email']
|
||||||
if pmail == umail:
|
if pmail == umail:
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
if User.objects.filter(email=pmail).exists():
|
if User.objects.filter(email=pmail).exists():
|
||||||
error = _("Email already taken.")
|
error = _("Email already taken.")
|
||||||
puser = u_form.cleaned_data['username']
|
puser = u_form.cleaned_data['username']
|
||||||
if puser == uuser:
|
if puser == uuser:
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
if User.objects.filter(username=puser).exists():
|
if User.objects.filter(username=puser).exists():
|
||||||
error = _("Username already taken.")
|
error = _("Username already taken.")
|
||||||
if error is None:
|
if error is None:
|
||||||
u_form.save()
|
u_form.save()
|
||||||
p_form.save()
|
p_form.save()
|
||||||
success = _("Updated.")
|
success = _("Updated.")
|
||||||
request.user.username = uuser
|
request.user.username = uuser
|
||||||
|
|
||||||
context={'p_form': p_form, 'u_form': u_form, 'error':error, 'success' : success}
|
context={'p_form': p_form, 'u_form': u_form, 'error':error, 'success' : success}
|
||||||
return render(request, 'accounts/edit.html', context)
|
return render(request, 'accounts/edit.html', context)
|
||||||
else:
|
else:
|
||||||
p_form = UserInfosUpdateForm(instance=request.user.userprofileinfo)
|
p_form = UserInfosUpdateForm(instance=request.user.userprofileinfo)
|
||||||
u_form = UserUpdateForm(instance=request.user)
|
u_form = UserUpdateForm(instance=request.user)
|
||||||
context={'p_form': p_form, 'u_form': u_form, 'token': request.user.userprofileinfo.token}
|
context={'p_form': p_form, 'u_form': u_form, 'token': request.user.userprofileinfo.token}
|
||||||
return render(request, 'accounts/edit.html',context )
|
return render(request, 'accounts/edit.html',context )
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
def profile(request, user_name):
|
def profile(request, user_name):
|
||||||
user_obj = get_object_or_404(User, username=user_name)
|
catsDatas = []
|
||||||
solves = CTF_flags.objects.filter(user=user_obj).order_by('-flag_date')
|
|
||||||
return render(request,'accounts/profile.html', {'user':user_obj, 'solves':solves})
|
user_obj = get_object_or_404(User, username=user_name)
|
||||||
# Create your views here.
|
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):
|
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
|
rank = 1
|
||||||
for elem in all_users:
|
for elem in all_users:
|
||||||
if elem.token == token:
|
if elem.token == token:
|
||||||
break
|
break
|
||||||
rank += 1
|
rank += 1
|
||||||
data = {"rank": rank}
|
data = {"rank": rank}
|
||||||
return JsonResponse(data)
|
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} )
|
|
@ -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
|
|
@ -2,7 +2,24 @@ from django.contrib import admin
|
||||||
from .models import Category, CTF, CTF_flags
|
from .models import Category, CTF, CTF_flags
|
||||||
|
|
||||||
admin.site.register(Category)
|
admin.site.register(Category)
|
||||||
admin.site.register(CTF)
|
#admin.site.register(CTF)
|
||||||
admin.site.register(CTF_flags)
|
#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.
|
# Register your models here.
|
||||||
|
|
|
@ -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 = 200 - int(log(nb_solves)*8.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()
|
|
@ -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),
|
||||||
|
),
|
||||||
|
]
|
|
@ -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'),
|
||||||
|
),
|
||||||
|
]
|
|
@ -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'),
|
||||||
|
),
|
||||||
|
]
|
|
@ -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),
|
||||||
|
),
|
||||||
|
]
|
|
@ -1,5 +1,6 @@
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.contrib.auth.models import User
|
from django.contrib.auth.models import User
|
||||||
|
from events.models import Event
|
||||||
|
|
||||||
class Category(models.Model):
|
class Category(models.Model):
|
||||||
name = models.CharField(max_length=200)
|
name = models.CharField(max_length=200)
|
||||||
|
@ -11,9 +12,14 @@ class Category(models.Model):
|
||||||
class CTF(models.Model):
|
class CTF(models.Model):
|
||||||
name = models.CharField(max_length=200)
|
name = models.CharField(max_length=200)
|
||||||
flag = models.CharField(max_length=100)
|
flag = models.CharField(max_length=100)
|
||||||
|
disabled = models.BooleanField(default=False)
|
||||||
description = models.TextField(blank=True)
|
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')
|
file = models.FileField(blank=True, upload_to='challenges')
|
||||||
ctf_url = models.URLField(blank=True)
|
ctf_url = models.URLField(blank=True)
|
||||||
|
event = models.ForeignKey(Event, null=True, blank=True, on_delete=models.CASCADE)
|
||||||
points = models.PositiveSmallIntegerField()
|
points = models.PositiveSmallIntegerField()
|
||||||
slug = models.SlugField(max_length=55)
|
slug = models.SlugField(max_length=55)
|
||||||
pub_date = models.DateTimeField('Date published')
|
pub_date = models.DateTimeField('Date published')
|
||||||
|
|
Binary file not shown.
|
@ -1,80 +1,93 @@
|
||||||
{% extends 'base.html' %}
|
{% extends 'base.html' %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
|
{% load is_member %}
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-sm-12 col-md-9">
|
<div class="col-sm-12 col-md-9">
|
||||||
<div class="ctf-block">
|
<div class="ctf-block">
|
||||||
<div class="ctf-head">
|
<div class="ctf-head">
|
||||||
<h3>{{ ctf.name }}</h3>
|
<h3>{{ ctf.name }}</h3>
|
||||||
<small>{% trans "Published date" %} : {{ ctf.pub_date }}</small>
|
<small>{% trans "Published date" %} : {{ ctf.pub_date }}</small>
|
||||||
</div>
|
</div>
|
||||||
|
{% if date < ctf.pub_date %}
|
||||||
<div class="ctf-body">
|
<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>
|
||||||
<div class="ctf-footer">
|
<div class="ctf-footer">
|
||||||
{% if request.user.is_authenticated %}
|
{% if request.user.is_authenticated %}
|
||||||
{% if valitated == True %}
|
{% if valitated == True %}
|
||||||
<p>{% trans "Congratulation !" %}</p>
|
<p>{% trans "Congratulation !" %}</p>
|
||||||
{% elif alvalitated == True %}
|
{% elif alvalitated == True %}
|
||||||
<p>{% trans "Already flagged" %}</p>
|
<p>{% trans "Already flagged" %}</p>
|
||||||
{% if ctf.ctf_url %}
|
{% if ctf.ctf_url %}
|
||||||
<a class="begin-ctf-link" target="_blank" href="{{ ctf.ctf_url }}">{% trans "Start the challenge" %}</a></br>
|
<a class="begin-ctf-link" target="_blank" href="{{ ctf.ctf_url }}">{% trans "Start the challenge" %}</a></br>
|
||||||
{% elif ctf.file %}
|
{% elif ctf.file %}
|
||||||
<a class="begin-ctf-link" target="_blank" href="{{ ctf.file.url }}">{% trans "Download" %}</a></br>
|
<a class="begin-ctf-link" target="_blank" href="{{ ctf.file.url }}">{% trans "Download" %}</a></br>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% else %}
|
{% else %}
|
||||||
{% if failed %}
|
{% if failed %}
|
||||||
<p>{% trans "Wrong flag ! You can do it !" %}</p>
|
<p>{% trans "Wrong flag ! You can do it !" %}</p>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if ctf.ctf_url %}
|
{% if ctf.ctf_url %}
|
||||||
<a class="begin-ctf-link" target="_blank" href="{{ ctf.ctf_url }}">{% trans "Start the challenge" %}</a></br>
|
<a class="begin-ctf-link" target="_blank" href="{{ ctf.ctf_url }}">{% trans "Start the challenge" %}</a></br>
|
||||||
{% elif ctf.file %}
|
{% elif ctf.file %}
|
||||||
<a class="begin-ctf-link" target="_blank" href="{{ ctf.file.url }}">{% trans "Download" %}</a></br>
|
<a class="begin-ctf-link" target="_blank" href="{{ ctf.file.url }}">{% trans "Download" %}</a></br>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<form method="post" class="submitflag-form">
|
<form method="post" class="submitflag-form">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
<input type="text" name="flag" maxlength="48" required="" id="id_flag">
|
<input type="text" name="flag" maxlength="100" required="" id="id_flag">
|
||||||
<input class="form-control" type="submit" value=">">
|
<input class="form-control" type="submit" value=">">
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<h4>{% trans "Solved by" %}</h4>
|
<h4>{% trans "Solved by" %}</h4>
|
||||||
{% if solved_list %}
|
{% if solved_list %}
|
||||||
<table class="table table-dark">
|
<table class="table table-dark">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th scope="col">{% trans "Username" %}</th>
|
<th scope="col">{% trans "Username" %}</th>
|
||||||
<th scope="col">{% trans "Website" %}</th>
|
<th scope="col">{% trans "Website" %}</th>
|
||||||
<th scope="col">{% trans "Score" %}</th>
|
<th scope="col">{% trans "Score" %}</th>
|
||||||
<th scope="col">{% trans "Date" %}</th>
|
<th scope="col">{% trans "Date" %}</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{% for s in solved_list %}
|
{% for s in solved_list %}
|
||||||
<tr>
|
<tr>
|
||||||
<th scope="row"><a class="profile_link" href="/accounts/profile/{{ s.user.username }}"> {{ s.user.username }}</a></th>
|
{% ismember s.user.userprofileinfo as is_member %}
|
||||||
<td>{{ s.user.userprofileinfo.portfolio_site }}</td>
|
<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.score }}</td>
|
<td>{{ s.user.userprofileinfo.portfolio_site }}</td>
|
||||||
<td>{{ s.flag_date }}</td>
|
<td>{{ s.user.userprofileinfo.score }}</td>
|
||||||
|
<td>{{ s.flag_date }}</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
{% else %}
|
{% else %}
|
||||||
<p>{% trans "Nobody have solved this CTF." %}</p>
|
<p>{% trans "Nobody has solved this challenge yet." %}</p>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="d-none d-md-block col-10 col-md-3 right-sidebar">
|
<div class="d-none d-md-block col-10 col-md-3 right-sidebar">
|
||||||
<ul class="list-group">
|
<ul class="list-group">
|
||||||
<li class="list-group-item">{% trans "Author" %} : {{ ctf.author.username }}</li>
|
{% ismember ctf.author.userprofileinfo as is_member %}
|
||||||
<li class="list-group-item">{% trans "Point reward" %} : {{ ctf.points }}</li>
|
<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>
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
{% else %}
|
{% else %}
|
||||||
<th scope="row"> </th>
|
<th scope="row"> </th>
|
||||||
{% endif %}
|
{% 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.points }}</td>
|
||||||
<td>{{ ctf.solved_num }}</td>
|
<td>{{ ctf.solved_num }}</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
@ -42,7 +42,7 @@
|
||||||
<li class="list-group-item active">{% trans "Categories" %}</li>
|
<li class="list-group-item active">{% trans "Categories" %}</li>
|
||||||
{% if cats %}
|
{% if cats %}
|
||||||
{% for c in 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 %}
|
{% endfor %}
|
||||||
{% else %}
|
{% else %}
|
||||||
<li class="list-group-item">{% trans "No category available." %}</li>
|
<li class="list-group-item">{% trans "No category available." %}</li>
|
||||||
|
|
|
@ -4,19 +4,53 @@ from django.contrib.auth.models import timezone
|
||||||
from .models import Category, CTF, CTF_flags
|
from .models import Category, CTF, CTF_flags
|
||||||
from .forms import submit_flag
|
from .forms import submit_flag
|
||||||
from accounts.models import UserProfileInfo
|
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 = 200 - int(log(nb_solves)*8.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):
|
def category(request, cat_slug):
|
||||||
cat = get_object_or_404(Category, slug=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:
|
for ex in ctfs:
|
||||||
ex.solved_num = CTF_flags.objects.filter(ctf=ex).count()
|
ex.solved_num = CTF_flags.objects.filter(ctf=ex).count()
|
||||||
ex.solved = ex.solved_by(request.user)
|
ex.solved = ex.solved_by(request.user)
|
||||||
return render(request, 'ctfs/ctfs_list.html', {'ctfs' : ctfs, 'cat' : cat})
|
return render(request, 'ctfs/ctfs_list.html', {'ctfs' : ctfs, 'cat' : cat})
|
||||||
|
|
||||||
def ctf(request, cat_slug, ctf_slug):
|
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
|
flagged = False
|
||||||
solved_list = CTF_flags.objects.filter(ctf=ctf_info).order_by('flag_date')
|
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 request.user.is_authenticated:
|
||||||
if CTF_flags.objects.filter(user=request.user, ctf=ctf_info):
|
if CTF_flags.objects.filter(user=request.user, ctf=ctf_info):
|
||||||
flagged = True
|
flagged = True
|
||||||
|
@ -24,25 +58,20 @@ def ctf(request, cat_slug, ctf_slug):
|
||||||
if request.user.is_authenticated:
|
if request.user.is_authenticated:
|
||||||
form = submit_flag(data=request.POST)
|
form = submit_flag(data=request.POST)
|
||||||
if flagged == False and form.is_valid():
|
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 = CTF_flags(user = request.user, ctf = ctf_info, flag_date = timezone.now())
|
||||||
new.save()
|
new.save()
|
||||||
profil = UserProfileInfo.objects.get(user=request.user)
|
profil = UserProfileInfo.objects.get(user=request.user)
|
||||||
profil.last_submission_date = timezone.now()
|
profil.last_submission_date = timezone.now()
|
||||||
profil.score += ctf_info.points
|
profil.score += ctf_info.points
|
||||||
profil.save()
|
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:
|
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:
|
else:
|
||||||
form = submit_flag()
|
return render(request, 'ctfs/ctf_info.html', { 'ctf' : ctf_info, 'solved_list': solved_list, 'alvalitated': True, 'description': description, 'date': timezone.now()})
|
||||||
return render(request, 'ctfs/ctf_info.html', {'form' : form, 'ctf' : ctf_info, 'solved_list': solved_list, 'alvalitated': True})
|
|
||||||
else:
|
else:
|
||||||
form = submit_flag()
|
return render(request, 'ctfs/ctf_info.html', { 'ctf' : ctf_info, 'solved_list': solved_list, 'description': description, 'date': timezone.now()})
|
||||||
return render(request, 'ctfs/ctf_info.html', {'form' : form, 'ctf' : ctf_info, 'solved_list': solved_list})
|
|
||||||
else:
|
else:
|
||||||
form = submit_flag()
|
return render(request, 'ctfs/ctf_info.html', { 'ctf' : ctf_info, 'solved_list': solved_list, 'alvalitated': flagged, 'description': description, 'date': timezone.now()})
|
||||||
return render(request, 'ctfs/ctf_info.html', {'form' : form, 'ctf' : ctf_info, 'solved_list': solved_list, 'alvalitated': flagged})
|
|
||||||
|
|
||||||
|
|
||||||
# Create your views here.
|
|
||||||
|
|
|
@ -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']
|
|
@ -0,0 +1,6 @@
|
||||||
|
from django.apps import AppConfig
|
||||||
|
|
||||||
|
|
||||||
|
class EventsConfig(AppConfig):
|
||||||
|
default_auto_field = 'django.db.models.BigAutoField'
|
||||||
|
name = 'events'
|
|
@ -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
|
|
@ -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'],
|
||||||
|
},
|
||||||
|
),
|
||||||
|
]
|
|
@ -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),
|
||||||
|
),
|
||||||
|
]
|
|
@ -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),
|
||||||
|
),
|
||||||
|
]
|
|
@ -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')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
|
@ -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'),
|
||||||
|
),
|
||||||
|
]
|
|
@ -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),
|
||||||
|
),
|
||||||
|
]
|
|
@ -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),
|
||||||
|
),
|
||||||
|
]
|
|
@ -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']
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,61 @@
|
||||||
|
{% 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 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" %} : {{ 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>
|
||||||
|
<ul class="list-group">
|
||||||
|
<a href="{% url 'events:create_team' event_slug=event.slug %}" class="list-group-item">{% trans "Create Team" %}</a>
|
||||||
|
<a href="{% url 'events:join_team' event_slug=event.slug %}" class="list-group-item">{% trans "Join Team" %}</a>
|
||||||
|
</ul>
|
||||||
|
{% if event.auto_match %}
|
||||||
|
<ul class="list-group">
|
||||||
|
<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 %}
|
|
@ -0,0 +1,110 @@
|
||||||
|
{% 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 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 %}
|
||||||
|
|
||||||
|
{% 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>
|
||||||
|
{% 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 %}
|
||||||
|
|
|
@ -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 %}
|
||||||
|
|
|
@ -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 %}
|
||||||
|
|
|
@ -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 %}
|
|
@ -0,0 +1,66 @@
|
||||||
|
{% 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 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" %} : {{ 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>
|
||||||
|
<ul class="list-group">
|
||||||
|
<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">
|
||||||
|
<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 %}
|
|
@ -0,0 +1,59 @@
|
||||||
|
{% 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 %}
|
||||||
|
<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>
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
|
|
|
@ -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 %}
|
||||||
|
|
|
@ -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 ""
|
|
@ -0,0 +1,3 @@
|
||||||
|
from django.test import TestCase
|
||||||
|
|
||||||
|
# Create your tests here.
|
|
@ -0,0 +1,20 @@
|
||||||
|
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'),
|
||||||
|
]
|
|
@ -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))
|
|
@ -0,0 +1,2 @@
|
||||||
|
from .events import *
|
||||||
|
from .teams import *
|
|
@ -0,0 +1,260 @@
|
||||||
|
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
|
||||||
|
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
|
||||||
|
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})
|
||||||
|
|
||||||
|
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 not player.team and event_info.team_size > 1:
|
||||||
|
return render(request, 'events/create_team.html', {'event' : event_info, 'logged': True, 'wrongpwd': False, 'registered' : True, 'notexist' : False})
|
||||||
|
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})
|
||||||
|
elif not player.team and event_info.team_size > 1:
|
||||||
|
return render(request, 'events/create_team.html', {'event' : event_info, 'logged': True, 'wrongpwd': False, 'registered' : True, 'notexist' : False})
|
||||||
|
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 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()
|
||||||
|
if event_info.team_size > 1:
|
||||||
|
return render(request, 'events/create_team.html', {'event' : event_info, 'logged': True, 'wrongpwd': False, 'registered' : True, 'notexist' : False})
|
||||||
|
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()
|
||||||
|
if ev.team_size > 1:
|
||||||
|
return render(request, 'events/create_team.html', {'event' : ev, 'logged': True, 'wrongpwd': False, 'registered' : True, 'notexist' : False})
|
||||||
|
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})
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,176 @@
|
||||||
|
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):
|
||||||
|
response = redirect('events:create_team', event_slug=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)
|
||||||
|
|
||||||
|
@login_required
|
||||||
|
def join_team(request, event_slug):
|
||||||
|
response = redirect('events:join_team', event_slug=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})
|
||||||
|
return redirect('events:event_info', event_slug=event_slug)
|
||||||
|
|
||||||
|
@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)
|
||||||
|
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 render(request, 'events/create_team.html', {'event' : event_info, 'logged': True, 'wrongpwd': False, 'registered' : True, 'notexist' : False})
|
||||||
|
|
||||||
|
@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)
|
|
@ -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),
|
||||||
|
),
|
||||||
|
]
|
|
@ -2,7 +2,10 @@ from django.db import models
|
||||||
|
|
||||||
class new(models.Model):
|
class new(models.Model):
|
||||||
name = models.CharField(max_length=100)
|
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)
|
slug = models.SlugField(max_length=55)
|
||||||
pub_date = models.DateTimeField('Date published')
|
pub_date = models.DateTimeField('Date published')
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
|
|
|
@ -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 d’Utilisation encadrent juridiquement l’utilisation des services du site 42CTF (ci-après dénommé « le site »). <br><br>
|
||||||
|
|
||||||
|
Constituant le contrat entre les éditeurs de 42CTF et l’Utilisateur, l’accès au site doit être précédé de l’acceptation de ces CGU. L’accès à cette plateforme signifie l’acceptation des présentes CGU. <br><br>
|
||||||
|
|
||||||
|
<h5>Article 2 : Mentions légales</h5>
|
||||||
|
|
||||||
|
L’hé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 d’accé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 n’importe où par tout utilisateur disposant d’un accès à Internet. Tous les frais nécessaires pour l’accès aux services (matériel informatique, connexion Internet…) sont à la charge de l’utilisateur.<br>
|
||||||
|
L’accès aux services dédiés aux membres s’effectue à l’aide d’un identifiant et d’un mot de passe.<br>
|
||||||
|
Pour des raisons de maintenance ou autres, l’accè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 l’Utilisateur, la collecte des informations au moment de l’inscription sur le site est nécessaire et obligatoire. Conformément à la loi n°78-17 du 6 janvier relative à l’informatique, aux fichiers et aux libertés, la collecte et le traitement d’informations personnelles s’effectuent 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, l’Utilisateur dispose du droit d’accéder, de rectifier, de supprimer et d’opposer ses données personnelles. L’exercice de ce droit s’effectue 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 d’auteur.<br>
|
||||||
|
La reproduction et la copie des contenus par l’Utilisateur 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é d’une 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 l’utilisation et l’interpré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 l’Utilisateur après l’utilisation ou l’accès à ce site.
|
||||||
|
Le site ne peut être tenu pour responsable en cas de force majeure ou du fait imprévisible et insurmontable d’un tiers.<br>
|
||||||
|
La garantie totale de la sécurité et la confidentialité des données n’est pas assurée par le site. Cependant, le site s’engage à 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, l’Utilisateur sortira de la plateforme. Cette dernière n’a 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, l’Utilisateur 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 l’utilisation des services du site marque l’application du contrat à l’égard de l’Utilisateur.<br><br>
|
||||||
|
|
||||||
|
<h5>Article 10 : Droit applicable et juridiction compétente</h5>
|
||||||
|
|
||||||
|
Le présent contrat est soumis à la législation française. L’absence de résolution à l’amiable des cas de litige entre les parties implique le recours aux tribunaux français compétents pour régler le contentieux.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
|
|
|
@ -1,14 +1,51 @@
|
||||||
{% extends 'base.html' %}
|
{% extends 'base.html' %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
|
{% get_current_language as lang %}
|
||||||
|
{% load is_member %}
|
||||||
<div class="row">
|
<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 %}
|
{% if news %}
|
||||||
{% for n in news %}
|
{% for n in news %}
|
||||||
<div class="card text-center news-card">
|
<div class="card text-center news-card">
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<h5 class="card-title">{{ n.name|safe }}</h5>
|
<h5 class="card-title">{{ n.name|safe }}</h5>
|
||||||
<p class="card-text">{{ n.content|safe }}</p>
|
<p class="card-text">
|
||||||
|
{% if lang == "fr" and n.content %}
|
||||||
|
{{ n.content|safe }}
|
||||||
|
{% elif lang == "en" and n.content_en %}
|
||||||
|
{{ n.content_en|safe }}
|
||||||
|
{% elif lang == "de" and n.content_de %}
|
||||||
|
{{ n.content_de|safe }}
|
||||||
|
{% elif lang == "ru" and n.content_ru %}
|
||||||
|
{{ n.content_ru|safe }}
|
||||||
|
{% else %}
|
||||||
|
{% trans "No translation available. Please try another language (English or French)." %}
|
||||||
|
{% endif %}
|
||||||
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="card-footer text-muted">
|
<div class="card-footer text-muted">
|
||||||
{{ n.pub_date }}
|
{{ n.pub_date }}
|
||||||
|
@ -19,27 +56,46 @@
|
||||||
<p class="text-center">{% trans "No article available." %}</p>
|
<p class="text-center">{% trans "No article available." %}</p>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</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">
|
<ul class="list-group">
|
||||||
<li class="list-group-item active">{% trans "Latest challenges added" %}</li>
|
<li class="list-group-item active">{% trans "Latest challenges added" %}</li>
|
||||||
{% if ctfs %}
|
{% if ctfs %}
|
||||||
{% for ctf in 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 %}
|
{% endfor %}
|
||||||
{% else %}
|
{% else %}
|
||||||
<li class="list-group-item">{% trans "No ctf available." %}</li>
|
<li class="list-group-item">{% trans "No ctf available." %}</li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</ul>
|
</ul>
|
||||||
<ul class="list-group">
|
<ul class="list-group">
|
||||||
<li class="list-group-item active">Top 10</li>
|
<li class="list-group-item">{% trans "Latest Flags" %}</li>
|
||||||
{% for t in top %}
|
{% for f in latest_flags %}
|
||||||
<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>
|
{% 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 %}
|
{% endfor %}
|
||||||
</ul>
|
</ul>
|
||||||
|
<div class="row flex-nowrap">
|
||||||
|
<div class="col-lg-6 col-sm-3">
|
||||||
<ul class="list-group">
|
<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>
|
<li class="list-group-item"><span>{{ flags }}</span></li>
|
||||||
</ul>
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="col-lg-6 col-sm-3">
|
||||||
|
<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>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -3,4 +3,5 @@ from . import views
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('', views.home, name='home'),
|
path('', views.home, name='home'),
|
||||||
|
path('CGU', views.cgu, name='cgu'),
|
||||||
]
|
]
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
from django.shortcuts import render
|
from django.shortcuts import render, redirect
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.http import HttpResponse, HttpResponseRedirect
|
from django.http import HttpResponse, HttpResponseRedirect
|
||||||
from .models import new
|
from .models import new
|
||||||
|
@ -8,6 +8,35 @@ from django.urls import translate_url
|
||||||
from django.utils.translation import (
|
from django.utils.translation import (
|
||||||
LANGUAGE_SESSION_KEY, check_for_language, get_language,
|
LANGUAGE_SESSION_KEY, check_for_language, get_language,
|
||||||
)
|
)
|
||||||
|
import datetime
|
||||||
|
from collections import defaultdict
|
||||||
|
import operator
|
||||||
|
|
||||||
|
def get_content_by_lang(news):
|
||||||
|
lang = get_language()
|
||||||
|
ret = None
|
||||||
|
if lang == "fr":
|
||||||
|
ret = news.content
|
||||||
|
elif lang == "en":
|
||||||
|
ret = news.content_en
|
||||||
|
elif lang == "de":
|
||||||
|
ret = news.content_de
|
||||||
|
elif lang == "ru":
|
||||||
|
ret = news.content_ru
|
||||||
|
return ret
|
||||||
|
|
||||||
|
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):
|
def home(request):
|
||||||
lang_code = get_language()
|
lang_code = get_language()
|
||||||
|
@ -19,14 +48,24 @@ def home(request):
|
||||||
response = HttpResponseRedirect(url_translated)
|
response = HttpResponseRedirect(url_translated)
|
||||||
return response
|
return response
|
||||||
news = new.objects.order_by('-pub_date')[:5]
|
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]
|
top10 = UserProfileInfo.objects.select_related().order_by('-score', 'last_submission_date', 'user__username')[:10]
|
||||||
nb_flags = CTF_flags.objects.count()
|
nb_flags = CTF_flags.objects.count()
|
||||||
nb_users = UserProfileInfo.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):
|
def set_language(request, lang_code):
|
||||||
next = '/'
|
next = '/'
|
||||||
|
if request.GET.get('next'):
|
||||||
|
next = request.GET.get('next')
|
||||||
response = HttpResponseRedirect(next)
|
response = HttpResponseRedirect(next)
|
||||||
if lang_code and check_for_language(lang_code):
|
if lang_code and check_for_language(lang_code):
|
||||||
if next:
|
if next:
|
||||||
|
@ -42,6 +81,7 @@ def set_language(request, lang_code):
|
||||||
path=settings.LANGUAGE_COOKIE_PATH,
|
path=settings.LANGUAGE_COOKIE_PATH,
|
||||||
domain=settings.LANGUAGE_COOKIE_DOMAIN,
|
domain=settings.LANGUAGE_COOKIE_DOMAIN,
|
||||||
)
|
)
|
||||||
return response
|
return redirect('/'+lang_code+next)
|
||||||
|
|
||||||
|
|
||||||
# Create your views here.
|
# Create your views here.
|
||||||
|
|
|
@ -8,7 +8,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2021-05-10 19:28+0000\n"
|
"POT-Creation-Date: 2022-02-02 19:22+0100\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
|
@ -18,11 +18,41 @@ msgstr ""
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\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:26
|
||||||
|
#: events/templates/events/join_team.html:31
|
||||||
|
msgid "Password"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/edit.html:21
|
#: accounts/templates/accounts/edit.html:21
|
||||||
#: accounts/templates/accounts/login.html:18
|
#: accounts/templates/accounts/login.html:18
|
||||||
#: accounts/templates/accounts/register.html:22
|
#: accounts/templates/accounts/register.html:22
|
||||||
#: ctfs/templates/ctfs/ctf_info.html:50 ctfs/templates/ctfs/ctfs_list.html:12
|
#: ctfs/templates/ctfs/ctf_info.html:61 ctfs/templates/ctfs/ctfs_list.html:12
|
||||||
#: scoreboard/templates/scoreboard/scoreboard.html:12
|
#: events/templates/events/ctf_info.html:71
|
||||||
|
#: events/templates/events/event_info.html:64
|
||||||
|
#: scoreboard/templates/scoreboard/scoreboard.html:13
|
||||||
msgid "Username"
|
msgid "Username"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -31,89 +61,114 @@ msgid "Email"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/edit.html:30
|
#: accounts/templates/accounts/edit.html:30
|
||||||
#: ctfs/templates/ctfs/ctf_info.html:51
|
#: ctfs/templates/ctfs/ctf_info.html:62
|
||||||
#: scoreboard/templates/scoreboard/scoreboard.html:13
|
#: events/templates/events/ctf_info.html:72
|
||||||
|
#: events/templates/events/event_info.html:65
|
||||||
|
#: scoreboard/templates/scoreboard/scoreboard.html:14
|
||||||
msgid "Website"
|
msgid "Website"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/edit.html:36
|
#: accounts/templates/accounts/edit.html:36
|
||||||
|
#: events/templates/events/manage_team.html:29
|
||||||
msgid "Apply"
|
msgid "Apply"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/edit.html:44
|
#: accounts/templates/accounts/edit.html:47
|
||||||
msgid "Connected accounts"
|
#: accounts/templates/accounts/profile.html:46
|
||||||
msgstr ""
|
#: ctfs/templates/ctfs/ctf_info.html:63 ctfs/templates/ctfs/ctfs_list.html:13
|
||||||
|
#: events/templates/events/event_info.html:66
|
||||||
#: accounts/templates/accounts/edit.html:51
|
#: events/templates/events/event_info.html:89
|
||||||
msgid "Disconnect Discord"
|
#: events/templates/events/manage_team.html:40
|
||||||
msgstr ""
|
#: events/templates/events/team.html:45
|
||||||
|
#: scoreboard/templates/scoreboard/scoreboard.html:15
|
||||||
#: 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
|
|
||||||
msgid "Score"
|
msgid "Score"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/edit.html:74
|
#: accounts/templates/accounts/edit.html:55
|
||||||
#: accounts/templates/accounts/profile.html:45
|
#: accounts/templates/accounts/profile.html:60
|
||||||
msgid "Member since"
|
msgid "Registered since"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: accounts/templates/accounts/edit.html:61
|
||||||
|
msgid "Delete my account"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/login.html:13
|
#: accounts/templates/accounts/login.html:13
|
||||||
msgid "Please, verify your infos."
|
msgid "Please, verify your infos."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/login.html:19
|
|
||||||
#: accounts/templates/accounts/register.html:23
|
|
||||||
msgid "Password"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: accounts/templates/accounts/login.html:22
|
#: accounts/templates/accounts/login.html:22
|
||||||
msgid "Reset password"
|
msgid "Reset password"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/login.html:31
|
#: 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:103
|
||||||
#: templates/registration/password_reset_complete.html:18
|
#: templates/registration/password_reset_complete.html:18
|
||||||
#: templates/registration/password_reset_confirm.html:37
|
#: templates/registration/password_reset_confirm.html:38
|
||||||
#: templates/registration/password_reset_done.html:17
|
#: templates/registration/password_reset_done.html:18
|
||||||
#: templates/registration/password_reset_form.html:25
|
#: templates/registration/password_reset_form.html:26
|
||||||
msgid "Login"
|
msgid "Login"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/login.html:32
|
#: accounts/templates/accounts/login.html:32
|
||||||
#: accounts/templates/accounts/register.html:37
|
#: accounts/templates/accounts/register.html:37
|
||||||
#: templates/registration/password_reset_complete.html:19
|
#: templates/registration/password_reset_complete.html:19
|
||||||
#: templates/registration/password_reset_confirm.html:38
|
#: templates/registration/password_reset_confirm.html:39
|
||||||
#: templates/registration/password_reset_done.html:18
|
#: templates/registration/password_reset_done.html:19
|
||||||
#: templates/registration/password_reset_form.html:26
|
#: templates/registration/password_reset_form.html:27
|
||||||
msgid "Sign up"
|
msgid "Sign up"
|
||||||
msgstr ""
|
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"
|
msgid "Challenge Name"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/profile.html:13
|
#: accounts/templates/accounts/profile.html:22
|
||||||
|
#: events/templates/events/team.html:21
|
||||||
msgid "Category"
|
msgid "Category"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/profile.html:14
|
#: accounts/templates/accounts/profile.html:23
|
||||||
|
#: events/templates/events/team.html:22
|
||||||
msgid "Points"
|
msgid "Points"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/profile.html:15
|
#: accounts/templates/accounts/profile.html:24
|
||||||
#: ctfs/templates/ctfs/ctf_info.html:53
|
#: ctfs/templates/ctfs/ctf_info.html:64
|
||||||
|
#: events/templates/events/ctf_info.html:73
|
||||||
|
#: events/templates/events/team.html:23
|
||||||
msgid "Date"
|
msgid "Date"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/profile.html:30
|
#: accounts/templates/accounts/profile.html:39
|
||||||
msgid "It's seem {{ user.username }} have never solved any CTF yet..."
|
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 ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/register.html:13
|
#: accounts/templates/accounts/register.html:13
|
||||||
|
@ -129,76 +184,99 @@ msgid "Personal website"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/register.html:26
|
#: accounts/templates/accounts/register.html:26
|
||||||
|
#: events/templates/events/event_info.html:119
|
||||||
msgid "Register"
|
msgid "Register"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/views/views.py:31
|
#: accounts/views/views.py:33
|
||||||
msgid "Your account was inactive."
|
msgid "Your account was inactive."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/views/views.py:50
|
#: accounts/views/views.py:52
|
||||||
msgid ""
|
msgid ""
|
||||||
"The password must contain at least one letter and at least one digit or "
|
"The password must contain at least one letter and at least one digit or "
|
||||||
"punctuation character."
|
"punctuation character."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/views/views.py:52
|
#: accounts/views/views.py:54
|
||||||
msgid "A user with that email already exists."
|
msgid "A user with that email already exists."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/views/views.py:65
|
#: accounts/views/views.py:67
|
||||||
msgid "A user with that username already exists."
|
msgid "A user with that username already exists."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/views/views.py:93
|
#: accounts/views/views.py:95
|
||||||
msgid "Email already taken."
|
msgid "Email already taken."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/views/views.py:99
|
#: accounts/views/views.py:101
|
||||||
msgid "Username already taken."
|
msgid "Username already taken."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/views/views.py:103
|
#: accounts/views/views.py:105 events/views/teams.py:122
|
||||||
msgid "Updated."
|
msgid "Updated."
|
||||||
msgstr ""
|
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"
|
msgid "Published date"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ctfs/templates/ctfs/ctf_info.html:17
|
#: ctfs/templates/ctfs/ctf_info.html:14
|
||||||
msgid "Congratulation !"
|
msgid "Challenge is not yet available."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ctfs/templates/ctfs/ctf_info.html:19
|
#: ctfs/templates/ctfs/ctf_info.html:21
|
||||||
msgid "Already flagged"
|
#: events/templates/events/ctf_info.html:18 home/templates/home/home.html:46
|
||||||
msgstr ""
|
msgid ""
|
||||||
|
"No translation available. Please try another language (English or French)."
|
||||||
#: 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"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ctfs/templates/ctfs/ctf_info.html:27
|
#: 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 !"
|
msgid "Wrong flag ! You can do it !"
|
||||||
msgstr ""
|
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"
|
msgid "Solved by"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ctfs/templates/ctfs/ctf_info.html:68
|
#: ctfs/templates/ctfs/ctf_info.html:80
|
||||||
msgid "Nobody have solved this CTF."
|
#: events/templates/events/ctf_info.html:96
|
||||||
|
msgid "Nobody has solved this challenge yet."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ctfs/templates/ctfs/ctf_info.html:74
|
#: ctfs/templates/ctfs/ctf_info.html:87
|
||||||
|
#: events/templates/events/ctf_info.html:103
|
||||||
msgid "Author"
|
msgid "Author"
|
||||||
msgstr ""
|
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"
|
msgid "Point reward"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -218,67 +296,241 @@ msgstr ""
|
||||||
msgid "No category available."
|
msgid "No category available."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: home/templates/home/home.html:19
|
#: events/templates/events/create_team.html:9
|
||||||
|
#: events/templates/events/join_team.html:9
|
||||||
|
msgid "This event starts at"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: events/templates/events/create_team.html:16
|
||||||
|
#: events/templates/events/join_team.html:16
|
||||||
|
msgid "You need to be registered to the event."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: events/templates/events/create_team.html:19 events/views/teams.py:118
|
||||||
|
msgid "Name already taken."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: events/templates/events/create_team.html:25
|
||||||
|
#: events/templates/events/join_team.html:30
|
||||||
|
#: events/templates/events/manage_team.html:22
|
||||||
|
msgid "Team name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: events/templates/events/create_team.html:27
|
||||||
|
#: events/templates/events/create_team.html:46
|
||||||
|
#: events/templates/events/join_team.html:52
|
||||||
|
msgid "Create Team"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: events/templates/events/create_team.html:32
|
||||||
|
#: events/templates/events/event_pwd.html:28
|
||||||
|
#: events/templates/events/join_team.html:37
|
||||||
|
msgid "You need to be logged to access this event."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: events/templates/events/create_team.html:41
|
||||||
|
#: events/templates/events/event_info.html:113
|
||||||
|
#: events/templates/events/event_pwd.html:36
|
||||||
|
#: events/templates/events/join_team.html:46
|
||||||
|
msgid "Starts at"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: events/templates/events/create_team.html:42
|
||||||
|
#: events/templates/events/event_info.html:114
|
||||||
|
#: events/templates/events/event_pwd.html:37
|
||||||
|
#: events/templates/events/join_team.html:47
|
||||||
|
msgid "Ends at"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: events/templates/events/create_team.html:47
|
||||||
|
#: events/templates/events/join_team.html:32
|
||||||
|
#: events/templates/events/join_team.html:51
|
||||||
|
msgid "Join Team"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: events/templates/events/create_team.html:54
|
||||||
|
#: events/templates/events/join_team.html:59
|
||||||
|
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_info.html:129
|
||||||
|
msgid "Manage my team"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: events/templates/events/event_pwd.html:15
|
||||||
|
#: events/templates/events/join_team.html:21
|
||||||
|
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:63
|
||||||
|
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:19
|
||||||
|
msgid "Team does not exist."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: events/templates/events/join_team.html:23
|
||||||
|
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."
|
msgid "No article available."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: home/templates/home/home.html:24
|
#: home/templates/home/home.html:61
|
||||||
msgid "Latest challenges added"
|
msgid "Latest challenges added"
|
||||||
msgstr ""
|
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."
|
msgid "No ctf available."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: home/templates/home/home.html:40
|
#: home/templates/home/home.html:74
|
||||||
msgid "Flags counter"
|
msgid "Latest Flags"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: project/settings.py:120
|
#: home/templates/home/home.html:88
|
||||||
msgid "Global Site"
|
msgid "Flags"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: project/settings.py:121
|
#: home/templates/home/home.html:94
|
||||||
msgid "Italian"
|
msgid "Users"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: project/settings.py:122
|
#: project/settings.py:115
|
||||||
|
msgid "English"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: project/settings.py:116
|
||||||
msgid "German"
|
msgid "German"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: project/settings.py:123
|
#: project/settings.py:117
|
||||||
msgid "French"
|
msgid "French"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: project/settings.py:124
|
#: project/settings.py:118
|
||||||
msgid "Spanish"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: project/settings.py:125
|
|
||||||
msgid "Russian"
|
msgid "Russian"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: scoreboard/templates/scoreboard/scoreboard.html:11
|
#: scoreboard/templates/scoreboard/scoreboard.html:38
|
||||||
msgid "Rank"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: scoreboard/templates/scoreboard/scoreboard.html:36
|
|
||||||
msgid "First"
|
msgid "First"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: scoreboard/templates/scoreboard/scoreboard.html:37
|
#: scoreboard/templates/scoreboard/scoreboard.html:39
|
||||||
msgid "Previous"
|
msgid "Previous"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: scoreboard/templates/scoreboard/scoreboard.html:41
|
#: scoreboard/templates/scoreboard/scoreboard.html:43
|
||||||
msgid "Page "
|
msgid "Page "
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: scoreboard/templates/scoreboard/scoreboard.html:45
|
#: scoreboard/templates/scoreboard/scoreboard.html:47
|
||||||
msgid "Next"
|
msgid "Next"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: scoreboard/templates/scoreboard/scoreboard.html:46
|
#: scoreboard/templates/scoreboard/scoreboard.html:48
|
||||||
msgid "Last"
|
msgid "Last"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -286,48 +538,56 @@ msgstr ""
|
||||||
msgid "Scoreboard"
|
msgid "Scoreboard"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/base.html:86
|
#: templates/base.html:66
|
||||||
|
msgid "Resources"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: templates/base.html:99
|
||||||
msgid "Logout"
|
msgid "Logout"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/base.html:93
|
#: templates/base.html:106
|
||||||
msgid "Sign Up"
|
msgid "Sign Up"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: templates/base.html:144
|
||||||
|
msgid "Become a Patron!"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: templates/registration/password_reset_complete.html:11
|
#: templates/registration/password_reset_complete.html:11
|
||||||
msgid "Your new password has been set."
|
msgid "Your new password has been set."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/registration/password_reset_confirm.html:19
|
#: templates/registration/password_reset_confirm.html:20
|
||||||
msgid "Your password can’t be too similar to your other personal information."
|
msgid "Your password can’t be too similar to your other personal information."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/registration/password_reset_confirm.html:20
|
#: templates/registration/password_reset_confirm.html:21
|
||||||
msgid "Your password must contain at least 8 characters."
|
msgid "Your password must contain at least 8 characters."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/registration/password_reset_confirm.html:21
|
#: templates/registration/password_reset_confirm.html:22
|
||||||
msgid "Your password can’t be a commonly used password."
|
msgid "Your password can’t be a commonly used password."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/registration/password_reset_confirm.html:22
|
#: templates/registration/password_reset_confirm.html:23
|
||||||
msgid "Your password can’t be entirely numeric."
|
msgid "Your password can’t be entirely numeric."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/registration/password_reset_confirm.html:25
|
#: templates/registration/password_reset_confirm.html:26
|
||||||
msgid "Confirm"
|
msgid "Confirm"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/registration/password_reset_confirm.html:27
|
#: templates/registration/password_reset_confirm.html:28
|
||||||
msgid "Submit"
|
msgid "Submit"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/registration/password_reset_done.html:10
|
#: templates/registration/password_reset_done.html:11
|
||||||
msgid ""
|
msgid ""
|
||||||
"We've emailed you instructions for setting your password. You should receive "
|
"We've emailed you instructions for setting your password. You should receive "
|
||||||
"the email shortly!"
|
"the email shortly!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/registration/password_reset_form.html:15
|
#: templates/registration/password_reset_form.html:16
|
||||||
msgid "Reset"
|
msgid "Reset"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
|
@ -8,7 +8,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2021-05-10 19:28+0000\n"
|
"POT-Creation-Date: 2022-02-02 19:22+0100\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
|
@ -18,11 +18,41 @@ msgstr ""
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\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:26
|
||||||
|
#: events/templates/events/join_team.html:31
|
||||||
|
msgid "Password"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/edit.html:21
|
#: accounts/templates/accounts/edit.html:21
|
||||||
#: accounts/templates/accounts/login.html:18
|
#: accounts/templates/accounts/login.html:18
|
||||||
#: accounts/templates/accounts/register.html:22
|
#: accounts/templates/accounts/register.html:22
|
||||||
#: ctfs/templates/ctfs/ctf_info.html:50 ctfs/templates/ctfs/ctfs_list.html:12
|
#: ctfs/templates/ctfs/ctf_info.html:61 ctfs/templates/ctfs/ctfs_list.html:12
|
||||||
#: scoreboard/templates/scoreboard/scoreboard.html:12
|
#: events/templates/events/ctf_info.html:71
|
||||||
|
#: events/templates/events/event_info.html:64
|
||||||
|
#: scoreboard/templates/scoreboard/scoreboard.html:13
|
||||||
msgid "Username"
|
msgid "Username"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -31,89 +61,114 @@ msgid "Email"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/edit.html:30
|
#: accounts/templates/accounts/edit.html:30
|
||||||
#: ctfs/templates/ctfs/ctf_info.html:51
|
#: ctfs/templates/ctfs/ctf_info.html:62
|
||||||
#: scoreboard/templates/scoreboard/scoreboard.html:13
|
#: events/templates/events/ctf_info.html:72
|
||||||
|
#: events/templates/events/event_info.html:65
|
||||||
|
#: scoreboard/templates/scoreboard/scoreboard.html:14
|
||||||
msgid "Website"
|
msgid "Website"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/edit.html:36
|
#: accounts/templates/accounts/edit.html:36
|
||||||
|
#: events/templates/events/manage_team.html:29
|
||||||
msgid "Apply"
|
msgid "Apply"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/edit.html:44
|
#: accounts/templates/accounts/edit.html:47
|
||||||
msgid "Connected accounts"
|
#: accounts/templates/accounts/profile.html:46
|
||||||
msgstr ""
|
#: ctfs/templates/ctfs/ctf_info.html:63 ctfs/templates/ctfs/ctfs_list.html:13
|
||||||
|
#: events/templates/events/event_info.html:66
|
||||||
#: accounts/templates/accounts/edit.html:51
|
#: events/templates/events/event_info.html:89
|
||||||
msgid "Disconnect Discord"
|
#: events/templates/events/manage_team.html:40
|
||||||
msgstr ""
|
#: events/templates/events/team.html:45
|
||||||
|
#: scoreboard/templates/scoreboard/scoreboard.html:15
|
||||||
#: 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
|
|
||||||
msgid "Score"
|
msgid "Score"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/edit.html:74
|
#: accounts/templates/accounts/edit.html:55
|
||||||
#: accounts/templates/accounts/profile.html:45
|
#: accounts/templates/accounts/profile.html:60
|
||||||
msgid "Member since"
|
msgid "Registered since"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: accounts/templates/accounts/edit.html:61
|
||||||
|
msgid "Delete my account"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/login.html:13
|
#: accounts/templates/accounts/login.html:13
|
||||||
msgid "Please, verify your infos."
|
msgid "Please, verify your infos."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/login.html:19
|
|
||||||
#: accounts/templates/accounts/register.html:23
|
|
||||||
msgid "Password"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: accounts/templates/accounts/login.html:22
|
#: accounts/templates/accounts/login.html:22
|
||||||
msgid "Reset password"
|
msgid "Reset password"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/login.html:31
|
#: 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:103
|
||||||
#: templates/registration/password_reset_complete.html:18
|
#: templates/registration/password_reset_complete.html:18
|
||||||
#: templates/registration/password_reset_confirm.html:37
|
#: templates/registration/password_reset_confirm.html:38
|
||||||
#: templates/registration/password_reset_done.html:17
|
#: templates/registration/password_reset_done.html:18
|
||||||
#: templates/registration/password_reset_form.html:25
|
#: templates/registration/password_reset_form.html:26
|
||||||
msgid "Login"
|
msgid "Login"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/login.html:32
|
#: accounts/templates/accounts/login.html:32
|
||||||
#: accounts/templates/accounts/register.html:37
|
#: accounts/templates/accounts/register.html:37
|
||||||
#: templates/registration/password_reset_complete.html:19
|
#: templates/registration/password_reset_complete.html:19
|
||||||
#: templates/registration/password_reset_confirm.html:38
|
#: templates/registration/password_reset_confirm.html:39
|
||||||
#: templates/registration/password_reset_done.html:18
|
#: templates/registration/password_reset_done.html:19
|
||||||
#: templates/registration/password_reset_form.html:26
|
#: templates/registration/password_reset_form.html:27
|
||||||
msgid "Sign up"
|
msgid "Sign up"
|
||||||
msgstr ""
|
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"
|
msgid "Challenge Name"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/profile.html:13
|
#: accounts/templates/accounts/profile.html:22
|
||||||
|
#: events/templates/events/team.html:21
|
||||||
msgid "Category"
|
msgid "Category"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/profile.html:14
|
#: accounts/templates/accounts/profile.html:23
|
||||||
|
#: events/templates/events/team.html:22
|
||||||
msgid "Points"
|
msgid "Points"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/profile.html:15
|
#: accounts/templates/accounts/profile.html:24
|
||||||
#: ctfs/templates/ctfs/ctf_info.html:53
|
#: ctfs/templates/ctfs/ctf_info.html:64
|
||||||
|
#: events/templates/events/ctf_info.html:73
|
||||||
|
#: events/templates/events/team.html:23
|
||||||
msgid "Date"
|
msgid "Date"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/profile.html:30
|
#: accounts/templates/accounts/profile.html:39
|
||||||
msgid "It's seem {{ user.username }} have never solved any CTF yet..."
|
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 ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/register.html:13
|
#: accounts/templates/accounts/register.html:13
|
||||||
|
@ -129,76 +184,99 @@ msgid "Personal website"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/register.html:26
|
#: accounts/templates/accounts/register.html:26
|
||||||
|
#: events/templates/events/event_info.html:119
|
||||||
msgid "Register"
|
msgid "Register"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/views/views.py:31
|
#: accounts/views/views.py:33
|
||||||
msgid "Your account was inactive."
|
msgid "Your account was inactive."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/views/views.py:50
|
#: accounts/views/views.py:52
|
||||||
msgid ""
|
msgid ""
|
||||||
"The password must contain at least one letter and at least one digit or "
|
"The password must contain at least one letter and at least one digit or "
|
||||||
"punctuation character."
|
"punctuation character."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/views/views.py:52
|
#: accounts/views/views.py:54
|
||||||
msgid "A user with that email already exists."
|
msgid "A user with that email already exists."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/views/views.py:65
|
#: accounts/views/views.py:67
|
||||||
msgid "A user with that username already exists."
|
msgid "A user with that username already exists."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/views/views.py:93
|
#: accounts/views/views.py:95
|
||||||
msgid "Email already taken."
|
msgid "Email already taken."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/views/views.py:99
|
#: accounts/views/views.py:101
|
||||||
msgid "Username already taken."
|
msgid "Username already taken."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/views/views.py:103
|
#: accounts/views/views.py:105 events/views/teams.py:122
|
||||||
msgid "Updated."
|
msgid "Updated."
|
||||||
msgstr ""
|
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"
|
msgid "Published date"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ctfs/templates/ctfs/ctf_info.html:17
|
#: ctfs/templates/ctfs/ctf_info.html:14
|
||||||
msgid "Congratulation !"
|
msgid "Challenge is not yet available."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ctfs/templates/ctfs/ctf_info.html:19
|
#: ctfs/templates/ctfs/ctf_info.html:21
|
||||||
msgid "Already flagged"
|
#: events/templates/events/ctf_info.html:18 home/templates/home/home.html:46
|
||||||
msgstr ""
|
msgid ""
|
||||||
|
"No translation available. Please try another language (English or French)."
|
||||||
#: 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"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ctfs/templates/ctfs/ctf_info.html:27
|
#: 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 !"
|
msgid "Wrong flag ! You can do it !"
|
||||||
msgstr ""
|
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"
|
msgid "Solved by"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ctfs/templates/ctfs/ctf_info.html:68
|
#: ctfs/templates/ctfs/ctf_info.html:80
|
||||||
msgid "Nobody have solved this CTF."
|
#: events/templates/events/ctf_info.html:96
|
||||||
|
msgid "Nobody has solved this challenge yet."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ctfs/templates/ctfs/ctf_info.html:74
|
#: ctfs/templates/ctfs/ctf_info.html:87
|
||||||
|
#: events/templates/events/ctf_info.html:103
|
||||||
msgid "Author"
|
msgid "Author"
|
||||||
msgstr ""
|
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"
|
msgid "Point reward"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -218,67 +296,241 @@ msgstr ""
|
||||||
msgid "No category available."
|
msgid "No category available."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: home/templates/home/home.html:19
|
#: events/templates/events/create_team.html:9
|
||||||
|
#: events/templates/events/join_team.html:9
|
||||||
|
msgid "This event starts at"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: events/templates/events/create_team.html:16
|
||||||
|
#: events/templates/events/join_team.html:16
|
||||||
|
msgid "You need to be registered to the event."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: events/templates/events/create_team.html:19 events/views/teams.py:118
|
||||||
|
msgid "Name already taken."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: events/templates/events/create_team.html:25
|
||||||
|
#: events/templates/events/join_team.html:30
|
||||||
|
#: events/templates/events/manage_team.html:22
|
||||||
|
msgid "Team name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: events/templates/events/create_team.html:27
|
||||||
|
#: events/templates/events/create_team.html:46
|
||||||
|
#: events/templates/events/join_team.html:52
|
||||||
|
msgid "Create Team"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: events/templates/events/create_team.html:32
|
||||||
|
#: events/templates/events/event_pwd.html:28
|
||||||
|
#: events/templates/events/join_team.html:37
|
||||||
|
msgid "You need to be logged to access this event."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: events/templates/events/create_team.html:41
|
||||||
|
#: events/templates/events/event_info.html:113
|
||||||
|
#: events/templates/events/event_pwd.html:36
|
||||||
|
#: events/templates/events/join_team.html:46
|
||||||
|
msgid "Starts at"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: events/templates/events/create_team.html:42
|
||||||
|
#: events/templates/events/event_info.html:114
|
||||||
|
#: events/templates/events/event_pwd.html:37
|
||||||
|
#: events/templates/events/join_team.html:47
|
||||||
|
msgid "Ends at"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: events/templates/events/create_team.html:47
|
||||||
|
#: events/templates/events/join_team.html:32
|
||||||
|
#: events/templates/events/join_team.html:51
|
||||||
|
msgid "Join Team"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: events/templates/events/create_team.html:54
|
||||||
|
#: events/templates/events/join_team.html:59
|
||||||
|
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_info.html:129
|
||||||
|
msgid "Manage my team"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: events/templates/events/event_pwd.html:15
|
||||||
|
#: events/templates/events/join_team.html:21
|
||||||
|
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:63
|
||||||
|
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:19
|
||||||
|
msgid "Team does not exist."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: events/templates/events/join_team.html:23
|
||||||
|
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."
|
msgid "No article available."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: home/templates/home/home.html:24
|
#: home/templates/home/home.html:61
|
||||||
msgid "Latest challenges added"
|
msgid "Latest challenges added"
|
||||||
msgstr ""
|
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."
|
msgid "No ctf available."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: home/templates/home/home.html:40
|
#: home/templates/home/home.html:74
|
||||||
msgid "Flags counter"
|
msgid "Latest Flags"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: project/settings.py:120
|
#: home/templates/home/home.html:88
|
||||||
msgid "Global Site"
|
msgid "Flags"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: project/settings.py:121
|
#: home/templates/home/home.html:94
|
||||||
msgid "Italian"
|
msgid "Users"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: project/settings.py:122
|
#: project/settings.py:115
|
||||||
|
msgid "English"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: project/settings.py:116
|
||||||
msgid "German"
|
msgid "German"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: project/settings.py:123
|
#: project/settings.py:117
|
||||||
msgid "French"
|
msgid "French"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: project/settings.py:124
|
#: project/settings.py:118
|
||||||
msgid "Spanish"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: project/settings.py:125
|
|
||||||
msgid "Russian"
|
msgid "Russian"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: scoreboard/templates/scoreboard/scoreboard.html:11
|
#: scoreboard/templates/scoreboard/scoreboard.html:38
|
||||||
msgid "Rank"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: scoreboard/templates/scoreboard/scoreboard.html:36
|
|
||||||
msgid "First"
|
msgid "First"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: scoreboard/templates/scoreboard/scoreboard.html:37
|
#: scoreboard/templates/scoreboard/scoreboard.html:39
|
||||||
msgid "Previous"
|
msgid "Previous"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: scoreboard/templates/scoreboard/scoreboard.html:41
|
#: scoreboard/templates/scoreboard/scoreboard.html:43
|
||||||
msgid "Page "
|
msgid "Page "
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: scoreboard/templates/scoreboard/scoreboard.html:45
|
#: scoreboard/templates/scoreboard/scoreboard.html:47
|
||||||
msgid "Next"
|
msgid "Next"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: scoreboard/templates/scoreboard/scoreboard.html:46
|
#: scoreboard/templates/scoreboard/scoreboard.html:48
|
||||||
msgid "Last"
|
msgid "Last"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -286,48 +538,56 @@ msgstr ""
|
||||||
msgid "Scoreboard"
|
msgid "Scoreboard"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/base.html:86
|
#: templates/base.html:66
|
||||||
|
msgid "Resources"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: templates/base.html:99
|
||||||
msgid "Logout"
|
msgid "Logout"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/base.html:93
|
#: templates/base.html:106
|
||||||
msgid "Sign Up"
|
msgid "Sign Up"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: templates/base.html:144
|
||||||
|
msgid "Become a Patron!"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: templates/registration/password_reset_complete.html:11
|
#: templates/registration/password_reset_complete.html:11
|
||||||
msgid "Your new password has been set."
|
msgid "Your new password has been set."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/registration/password_reset_confirm.html:19
|
#: templates/registration/password_reset_confirm.html:20
|
||||||
msgid "Your password can’t be too similar to your other personal information."
|
msgid "Your password can’t be too similar to your other personal information."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/registration/password_reset_confirm.html:20
|
#: templates/registration/password_reset_confirm.html:21
|
||||||
msgid "Your password must contain at least 8 characters."
|
msgid "Your password must contain at least 8 characters."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/registration/password_reset_confirm.html:21
|
#: templates/registration/password_reset_confirm.html:22
|
||||||
msgid "Your password can’t be a commonly used password."
|
msgid "Your password can’t be a commonly used password."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/registration/password_reset_confirm.html:22
|
#: templates/registration/password_reset_confirm.html:23
|
||||||
msgid "Your password can’t be entirely numeric."
|
msgid "Your password can’t be entirely numeric."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/registration/password_reset_confirm.html:25
|
#: templates/registration/password_reset_confirm.html:26
|
||||||
msgid "Confirm"
|
msgid "Confirm"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/registration/password_reset_confirm.html:27
|
#: templates/registration/password_reset_confirm.html:28
|
||||||
msgid "Submit"
|
msgid "Submit"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/registration/password_reset_done.html:10
|
#: templates/registration/password_reset_done.html:11
|
||||||
msgid ""
|
msgid ""
|
||||||
"We've emailed you instructions for setting your password. You should receive "
|
"We've emailed you instructions for setting your password. You should receive "
|
||||||
"the email shortly!"
|
"the email shortly!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/registration/password_reset_form.html:15
|
#: templates/registration/password_reset_form.html:16
|
||||||
msgid "Reset"
|
msgid "Reset"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
|
@ -8,7 +8,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2021-05-10 19:28+0000\n"
|
"POT-Creation-Date: 2022-02-02 19:22+0100\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
|
@ -18,11 +18,41 @@ msgstr ""
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\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:26
|
||||||
|
#: events/templates/events/join_team.html:31
|
||||||
|
msgid "Password"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/edit.html:21
|
#: accounts/templates/accounts/edit.html:21
|
||||||
#: accounts/templates/accounts/login.html:18
|
#: accounts/templates/accounts/login.html:18
|
||||||
#: accounts/templates/accounts/register.html:22
|
#: accounts/templates/accounts/register.html:22
|
||||||
#: ctfs/templates/ctfs/ctf_info.html:50 ctfs/templates/ctfs/ctfs_list.html:12
|
#: ctfs/templates/ctfs/ctf_info.html:61 ctfs/templates/ctfs/ctfs_list.html:12
|
||||||
#: scoreboard/templates/scoreboard/scoreboard.html:12
|
#: events/templates/events/ctf_info.html:71
|
||||||
|
#: events/templates/events/event_info.html:64
|
||||||
|
#: scoreboard/templates/scoreboard/scoreboard.html:13
|
||||||
msgid "Username"
|
msgid "Username"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -31,89 +61,114 @@ msgid "Email"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/edit.html:30
|
#: accounts/templates/accounts/edit.html:30
|
||||||
#: ctfs/templates/ctfs/ctf_info.html:51
|
#: ctfs/templates/ctfs/ctf_info.html:62
|
||||||
#: scoreboard/templates/scoreboard/scoreboard.html:13
|
#: events/templates/events/ctf_info.html:72
|
||||||
|
#: events/templates/events/event_info.html:65
|
||||||
|
#: scoreboard/templates/scoreboard/scoreboard.html:14
|
||||||
msgid "Website"
|
msgid "Website"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/edit.html:36
|
#: accounts/templates/accounts/edit.html:36
|
||||||
|
#: events/templates/events/manage_team.html:29
|
||||||
msgid "Apply"
|
msgid "Apply"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/edit.html:44
|
#: accounts/templates/accounts/edit.html:47
|
||||||
msgid "Connected accounts"
|
#: accounts/templates/accounts/profile.html:46
|
||||||
msgstr ""
|
#: ctfs/templates/ctfs/ctf_info.html:63 ctfs/templates/ctfs/ctfs_list.html:13
|
||||||
|
#: events/templates/events/event_info.html:66
|
||||||
#: accounts/templates/accounts/edit.html:51
|
#: events/templates/events/event_info.html:89
|
||||||
msgid "Disconnect Discord"
|
#: events/templates/events/manage_team.html:40
|
||||||
msgstr ""
|
#: events/templates/events/team.html:45
|
||||||
|
#: scoreboard/templates/scoreboard/scoreboard.html:15
|
||||||
#: 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
|
|
||||||
msgid "Score"
|
msgid "Score"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/edit.html:74
|
#: accounts/templates/accounts/edit.html:55
|
||||||
#: accounts/templates/accounts/profile.html:45
|
#: accounts/templates/accounts/profile.html:60
|
||||||
msgid "Member since"
|
msgid "Registered since"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: accounts/templates/accounts/edit.html:61
|
||||||
|
msgid "Delete my account"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/login.html:13
|
#: accounts/templates/accounts/login.html:13
|
||||||
msgid "Please, verify your infos."
|
msgid "Please, verify your infos."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/login.html:19
|
|
||||||
#: accounts/templates/accounts/register.html:23
|
|
||||||
msgid "Password"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: accounts/templates/accounts/login.html:22
|
#: accounts/templates/accounts/login.html:22
|
||||||
msgid "Reset password"
|
msgid "Reset password"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/login.html:31
|
#: 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:103
|
||||||
#: templates/registration/password_reset_complete.html:18
|
#: templates/registration/password_reset_complete.html:18
|
||||||
#: templates/registration/password_reset_confirm.html:37
|
#: templates/registration/password_reset_confirm.html:38
|
||||||
#: templates/registration/password_reset_done.html:17
|
#: templates/registration/password_reset_done.html:18
|
||||||
#: templates/registration/password_reset_form.html:25
|
#: templates/registration/password_reset_form.html:26
|
||||||
msgid "Login"
|
msgid "Login"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/login.html:32
|
#: accounts/templates/accounts/login.html:32
|
||||||
#: accounts/templates/accounts/register.html:37
|
#: accounts/templates/accounts/register.html:37
|
||||||
#: templates/registration/password_reset_complete.html:19
|
#: templates/registration/password_reset_complete.html:19
|
||||||
#: templates/registration/password_reset_confirm.html:38
|
#: templates/registration/password_reset_confirm.html:39
|
||||||
#: templates/registration/password_reset_done.html:18
|
#: templates/registration/password_reset_done.html:19
|
||||||
#: templates/registration/password_reset_form.html:26
|
#: templates/registration/password_reset_form.html:27
|
||||||
msgid "Sign up"
|
msgid "Sign up"
|
||||||
msgstr ""
|
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"
|
msgid "Challenge Name"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/profile.html:13
|
#: accounts/templates/accounts/profile.html:22
|
||||||
|
#: events/templates/events/team.html:21
|
||||||
msgid "Category"
|
msgid "Category"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/profile.html:14
|
#: accounts/templates/accounts/profile.html:23
|
||||||
|
#: events/templates/events/team.html:22
|
||||||
msgid "Points"
|
msgid "Points"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/profile.html:15
|
#: accounts/templates/accounts/profile.html:24
|
||||||
#: ctfs/templates/ctfs/ctf_info.html:53
|
#: ctfs/templates/ctfs/ctf_info.html:64
|
||||||
|
#: events/templates/events/ctf_info.html:73
|
||||||
|
#: events/templates/events/team.html:23
|
||||||
msgid "Date"
|
msgid "Date"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/profile.html:30
|
#: accounts/templates/accounts/profile.html:39
|
||||||
msgid "It's seem {{ user.username }} have never solved any CTF yet..."
|
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 ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/register.html:13
|
#: accounts/templates/accounts/register.html:13
|
||||||
|
@ -129,76 +184,99 @@ msgid "Personal website"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/register.html:26
|
#: accounts/templates/accounts/register.html:26
|
||||||
|
#: events/templates/events/event_info.html:119
|
||||||
msgid "Register"
|
msgid "Register"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/views/views.py:31
|
#: accounts/views/views.py:33
|
||||||
msgid "Your account was inactive."
|
msgid "Your account was inactive."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/views/views.py:50
|
#: accounts/views/views.py:52
|
||||||
msgid ""
|
msgid ""
|
||||||
"The password must contain at least one letter and at least one digit or "
|
"The password must contain at least one letter and at least one digit or "
|
||||||
"punctuation character."
|
"punctuation character."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/views/views.py:52
|
#: accounts/views/views.py:54
|
||||||
msgid "A user with that email already exists."
|
msgid "A user with that email already exists."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/views/views.py:65
|
#: accounts/views/views.py:67
|
||||||
msgid "A user with that username already exists."
|
msgid "A user with that username already exists."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/views/views.py:93
|
#: accounts/views/views.py:95
|
||||||
msgid "Email already taken."
|
msgid "Email already taken."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/views/views.py:99
|
#: accounts/views/views.py:101
|
||||||
msgid "Username already taken."
|
msgid "Username already taken."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/views/views.py:103
|
#: accounts/views/views.py:105 events/views/teams.py:122
|
||||||
msgid "Updated."
|
msgid "Updated."
|
||||||
msgstr ""
|
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"
|
msgid "Published date"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ctfs/templates/ctfs/ctf_info.html:17
|
#: ctfs/templates/ctfs/ctf_info.html:14
|
||||||
msgid "Congratulation !"
|
msgid "Challenge is not yet available."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ctfs/templates/ctfs/ctf_info.html:19
|
#: ctfs/templates/ctfs/ctf_info.html:21
|
||||||
msgid "Already flagged"
|
#: events/templates/events/ctf_info.html:18 home/templates/home/home.html:46
|
||||||
msgstr ""
|
msgid ""
|
||||||
|
"No translation available. Please try another language (English or French)."
|
||||||
#: 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"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ctfs/templates/ctfs/ctf_info.html:27
|
#: 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 !"
|
msgid "Wrong flag ! You can do it !"
|
||||||
msgstr ""
|
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"
|
msgid "Solved by"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ctfs/templates/ctfs/ctf_info.html:68
|
#: ctfs/templates/ctfs/ctf_info.html:80
|
||||||
msgid "Nobody have solved this CTF."
|
#: events/templates/events/ctf_info.html:96
|
||||||
|
msgid "Nobody has solved this challenge yet."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ctfs/templates/ctfs/ctf_info.html:74
|
#: ctfs/templates/ctfs/ctf_info.html:87
|
||||||
|
#: events/templates/events/ctf_info.html:103
|
||||||
msgid "Author"
|
msgid "Author"
|
||||||
msgstr ""
|
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"
|
msgid "Point reward"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -218,67 +296,241 @@ msgstr ""
|
||||||
msgid "No category available."
|
msgid "No category available."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: home/templates/home/home.html:19
|
#: events/templates/events/create_team.html:9
|
||||||
|
#: events/templates/events/join_team.html:9
|
||||||
|
msgid "This event starts at"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: events/templates/events/create_team.html:16
|
||||||
|
#: events/templates/events/join_team.html:16
|
||||||
|
msgid "You need to be registered to the event."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: events/templates/events/create_team.html:19 events/views/teams.py:118
|
||||||
|
msgid "Name already taken."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: events/templates/events/create_team.html:25
|
||||||
|
#: events/templates/events/join_team.html:30
|
||||||
|
#: events/templates/events/manage_team.html:22
|
||||||
|
msgid "Team name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: events/templates/events/create_team.html:27
|
||||||
|
#: events/templates/events/create_team.html:46
|
||||||
|
#: events/templates/events/join_team.html:52
|
||||||
|
msgid "Create Team"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: events/templates/events/create_team.html:32
|
||||||
|
#: events/templates/events/event_pwd.html:28
|
||||||
|
#: events/templates/events/join_team.html:37
|
||||||
|
msgid "You need to be logged to access this event."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: events/templates/events/create_team.html:41
|
||||||
|
#: events/templates/events/event_info.html:113
|
||||||
|
#: events/templates/events/event_pwd.html:36
|
||||||
|
#: events/templates/events/join_team.html:46
|
||||||
|
msgid "Starts at"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: events/templates/events/create_team.html:42
|
||||||
|
#: events/templates/events/event_info.html:114
|
||||||
|
#: events/templates/events/event_pwd.html:37
|
||||||
|
#: events/templates/events/join_team.html:47
|
||||||
|
msgid "Ends at"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: events/templates/events/create_team.html:47
|
||||||
|
#: events/templates/events/join_team.html:32
|
||||||
|
#: events/templates/events/join_team.html:51
|
||||||
|
msgid "Join Team"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: events/templates/events/create_team.html:54
|
||||||
|
#: events/templates/events/join_team.html:59
|
||||||
|
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_info.html:129
|
||||||
|
msgid "Manage my team"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: events/templates/events/event_pwd.html:15
|
||||||
|
#: events/templates/events/join_team.html:21
|
||||||
|
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:63
|
||||||
|
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:19
|
||||||
|
msgid "Team does not exist."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: events/templates/events/join_team.html:23
|
||||||
|
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."
|
msgid "No article available."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: home/templates/home/home.html:24
|
#: home/templates/home/home.html:61
|
||||||
msgid "Latest challenges added"
|
msgid "Latest challenges added"
|
||||||
msgstr ""
|
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."
|
msgid "No ctf available."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: home/templates/home/home.html:40
|
#: home/templates/home/home.html:74
|
||||||
msgid "Flags counter"
|
msgid "Latest Flags"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: project/settings.py:120
|
#: home/templates/home/home.html:88
|
||||||
msgid "Global Site"
|
msgid "Flags"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: project/settings.py:121
|
#: home/templates/home/home.html:94
|
||||||
msgid "Italian"
|
msgid "Users"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: project/settings.py:122
|
#: project/settings.py:115
|
||||||
|
msgid "English"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: project/settings.py:116
|
||||||
msgid "German"
|
msgid "German"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: project/settings.py:123
|
#: project/settings.py:117
|
||||||
msgid "French"
|
msgid "French"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: project/settings.py:124
|
#: project/settings.py:118
|
||||||
msgid "Spanish"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: project/settings.py:125
|
|
||||||
msgid "Russian"
|
msgid "Russian"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: scoreboard/templates/scoreboard/scoreboard.html:11
|
#: scoreboard/templates/scoreboard/scoreboard.html:38
|
||||||
msgid "Rank"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: scoreboard/templates/scoreboard/scoreboard.html:36
|
|
||||||
msgid "First"
|
msgid "First"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: scoreboard/templates/scoreboard/scoreboard.html:37
|
#: scoreboard/templates/scoreboard/scoreboard.html:39
|
||||||
msgid "Previous"
|
msgid "Previous"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: scoreboard/templates/scoreboard/scoreboard.html:41
|
#: scoreboard/templates/scoreboard/scoreboard.html:43
|
||||||
msgid "Page "
|
msgid "Page "
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: scoreboard/templates/scoreboard/scoreboard.html:45
|
#: scoreboard/templates/scoreboard/scoreboard.html:47
|
||||||
msgid "Next"
|
msgid "Next"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: scoreboard/templates/scoreboard/scoreboard.html:46
|
#: scoreboard/templates/scoreboard/scoreboard.html:48
|
||||||
msgid "Last"
|
msgid "Last"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -286,48 +538,56 @@ msgstr ""
|
||||||
msgid "Scoreboard"
|
msgid "Scoreboard"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/base.html:86
|
#: templates/base.html:66
|
||||||
|
msgid "Resources"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: templates/base.html:99
|
||||||
msgid "Logout"
|
msgid "Logout"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/base.html:93
|
#: templates/base.html:106
|
||||||
msgid "Sign Up"
|
msgid "Sign Up"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: templates/base.html:144
|
||||||
|
msgid "Become a Patron!"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: templates/registration/password_reset_complete.html:11
|
#: templates/registration/password_reset_complete.html:11
|
||||||
msgid "Your new password has been set."
|
msgid "Your new password has been set."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/registration/password_reset_confirm.html:19
|
#: templates/registration/password_reset_confirm.html:20
|
||||||
msgid "Your password can’t be too similar to your other personal information."
|
msgid "Your password can’t be too similar to your other personal information."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/registration/password_reset_confirm.html:20
|
#: templates/registration/password_reset_confirm.html:21
|
||||||
msgid "Your password must contain at least 8 characters."
|
msgid "Your password must contain at least 8 characters."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/registration/password_reset_confirm.html:21
|
#: templates/registration/password_reset_confirm.html:22
|
||||||
msgid "Your password can’t be a commonly used password."
|
msgid "Your password can’t be a commonly used password."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/registration/password_reset_confirm.html:22
|
#: templates/registration/password_reset_confirm.html:23
|
||||||
msgid "Your password can’t be entirely numeric."
|
msgid "Your password can’t be entirely numeric."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/registration/password_reset_confirm.html:25
|
#: templates/registration/password_reset_confirm.html:26
|
||||||
msgid "Confirm"
|
msgid "Confirm"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/registration/password_reset_confirm.html:27
|
#: templates/registration/password_reset_confirm.html:28
|
||||||
msgid "Submit"
|
msgid "Submit"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/registration/password_reset_done.html:10
|
#: templates/registration/password_reset_done.html:11
|
||||||
msgid ""
|
msgid ""
|
||||||
"We've emailed you instructions for setting your password. You should receive "
|
"We've emailed you instructions for setting your password. You should receive "
|
||||||
"the email shortly!"
|
"the email shortly!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/registration/password_reset_form.html:15
|
#: templates/registration/password_reset_form.html:16
|
||||||
msgid "Reset"
|
msgid "Reset"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
|
@ -8,7 +8,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2021-05-10 19:28+0000\n"
|
"POT-Creation-Date: 2022-02-02 19:22+0100\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
|
@ -18,316 +18,620 @@ msgstr ""
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n > 1);\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:26
|
||||||
|
#: events/templates/events/join_team.html:31
|
||||||
|
msgid "Password"
|
||||||
|
msgstr "Mot de passe"
|
||||||
|
|
||||||
#: accounts/templates/accounts/edit.html:21
|
#: accounts/templates/accounts/edit.html:21
|
||||||
#: accounts/templates/accounts/login.html:18
|
#: accounts/templates/accounts/login.html:18
|
||||||
#: accounts/templates/accounts/register.html:22
|
#: accounts/templates/accounts/register.html:22
|
||||||
#: ctfs/templates/ctfs/ctf_info.html:50 ctfs/templates/ctfs/ctfs_list.html:12
|
#: ctfs/templates/ctfs/ctf_info.html:61 ctfs/templates/ctfs/ctfs_list.html:12
|
||||||
#: scoreboard/templates/scoreboard/scoreboard.html:12
|
#: events/templates/events/ctf_info.html:71
|
||||||
|
#: events/templates/events/event_info.html:64
|
||||||
|
#: scoreboard/templates/scoreboard/scoreboard.html:13
|
||||||
msgid "Username"
|
msgid "Username"
|
||||||
msgstr ""
|
msgstr "Pseudo"
|
||||||
|
|
||||||
#: accounts/templates/accounts/edit.html:25
|
#: accounts/templates/accounts/edit.html:25
|
||||||
msgid "Email"
|
msgid "Email"
|
||||||
msgstr ""
|
msgstr "Email"
|
||||||
|
|
||||||
#: accounts/templates/accounts/edit.html:30
|
#: accounts/templates/accounts/edit.html:30
|
||||||
#: ctfs/templates/ctfs/ctf_info.html:51
|
#: ctfs/templates/ctfs/ctf_info.html:62
|
||||||
#: scoreboard/templates/scoreboard/scoreboard.html:13
|
#: events/templates/events/ctf_info.html:72
|
||||||
|
#: events/templates/events/event_info.html:65
|
||||||
|
#: scoreboard/templates/scoreboard/scoreboard.html:14
|
||||||
msgid "Website"
|
msgid "Website"
|
||||||
msgstr ""
|
msgstr "Site internet"
|
||||||
|
|
||||||
#: accounts/templates/accounts/edit.html:36
|
#: accounts/templates/accounts/edit.html:36
|
||||||
|
#: events/templates/events/manage_team.html:29
|
||||||
msgid "Apply"
|
msgid "Apply"
|
||||||
msgstr ""
|
msgstr "Appliquer"
|
||||||
|
|
||||||
#: accounts/templates/accounts/edit.html:44
|
#: accounts/templates/accounts/edit.html:47
|
||||||
msgid "Connected accounts"
|
#: accounts/templates/accounts/profile.html:46
|
||||||
msgstr ""
|
#: ctfs/templates/ctfs/ctf_info.html:63 ctfs/templates/ctfs/ctfs_list.html:13
|
||||||
|
#: events/templates/events/event_info.html:66
|
||||||
#: accounts/templates/accounts/edit.html:51
|
#: events/templates/events/event_info.html:89
|
||||||
msgid "Disconnect Discord"
|
#: events/templates/events/manage_team.html:40
|
||||||
msgstr ""
|
#: events/templates/events/team.html:45
|
||||||
|
#: scoreboard/templates/scoreboard/scoreboard.html:15
|
||||||
#: 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
|
|
||||||
msgid "Score"
|
msgid "Score"
|
||||||
msgstr ""
|
msgstr "Score"
|
||||||
|
|
||||||
#: accounts/templates/accounts/edit.html:74
|
#: accounts/templates/accounts/edit.html:55
|
||||||
#: accounts/templates/accounts/profile.html:45
|
#: accounts/templates/accounts/profile.html:60
|
||||||
msgid "Member since"
|
msgid "Registered since"
|
||||||
msgstr ""
|
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
|
#: accounts/templates/accounts/login.html:13
|
||||||
msgid "Please, verify your infos."
|
msgid "Please, verify your infos."
|
||||||
msgstr ""
|
msgstr "Merci de vérifier vos informations."
|
||||||
|
|
||||||
#: accounts/templates/accounts/login.html:19
|
|
||||||
#: accounts/templates/accounts/register.html:23
|
|
||||||
msgid "Password"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: accounts/templates/accounts/login.html:22
|
#: accounts/templates/accounts/login.html:22
|
||||||
msgid "Reset password"
|
msgid "Reset password"
|
||||||
msgstr ""
|
msgstr "Réinitialiser le mot de passe"
|
||||||
|
|
||||||
#: accounts/templates/accounts/login.html:31
|
#: 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:103
|
||||||
#: templates/registration/password_reset_complete.html:18
|
#: templates/registration/password_reset_complete.html:18
|
||||||
#: templates/registration/password_reset_confirm.html:37
|
#: templates/registration/password_reset_confirm.html:38
|
||||||
#: templates/registration/password_reset_done.html:17
|
#: templates/registration/password_reset_done.html:18
|
||||||
#: templates/registration/password_reset_form.html:25
|
#: templates/registration/password_reset_form.html:26
|
||||||
msgid "Login"
|
msgid "Login"
|
||||||
msgstr ""
|
msgstr "Connexion"
|
||||||
|
|
||||||
#: accounts/templates/accounts/login.html:32
|
#: accounts/templates/accounts/login.html:32
|
||||||
#: accounts/templates/accounts/register.html:37
|
#: accounts/templates/accounts/register.html:37
|
||||||
#: templates/registration/password_reset_complete.html:19
|
#: templates/registration/password_reset_complete.html:19
|
||||||
#: templates/registration/password_reset_confirm.html:38
|
#: templates/registration/password_reset_confirm.html:39
|
||||||
#: templates/registration/password_reset_done.html:18
|
#: templates/registration/password_reset_done.html:19
|
||||||
#: templates/registration/password_reset_form.html:26
|
#: templates/registration/password_reset_form.html:27
|
||||||
msgid "Sign up"
|
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"
|
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"
|
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"
|
msgid "Points"
|
||||||
msgstr ""
|
msgstr "Points"
|
||||||
|
|
||||||
#: accounts/templates/accounts/profile.html:15
|
#: accounts/templates/accounts/profile.html:24
|
||||||
#: ctfs/templates/ctfs/ctf_info.html:53
|
#: ctfs/templates/ctfs/ctf_info.html:64
|
||||||
|
#: events/templates/events/ctf_info.html:73
|
||||||
|
#: events/templates/events/team.html:23
|
||||||
msgid "Date"
|
msgid "Date"
|
||||||
msgstr ""
|
msgstr "Date"
|
||||||
|
|
||||||
#: accounts/templates/accounts/profile.html:30
|
#: accounts/templates/accounts/profile.html:39
|
||||||
msgid "It's seem {{ user.username }} have never solved any CTF yet..."
|
msgid "It seems that this user has not solved any challenge yet..."
|
||||||
msgstr ""
|
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
|
#: accounts/templates/accounts/register.html:13
|
||||||
msgid "Welcome !"
|
msgid "Welcome !"
|
||||||
msgstr ""
|
msgstr "Bienvenue !"
|
||||||
|
|
||||||
#: accounts/templates/accounts/register.html:14
|
#: accounts/templates/accounts/register.html:14
|
||||||
msgid "Your account has been created."
|
msgid "Your account has been created."
|
||||||
msgstr ""
|
msgstr "Votre compte a été créé."
|
||||||
|
|
||||||
#: accounts/templates/accounts/register.html:25
|
#: accounts/templates/accounts/register.html:25
|
||||||
msgid "Personal website"
|
msgid "Personal website"
|
||||||
msgstr ""
|
msgstr "Site personnel"
|
||||||
|
|
||||||
#: accounts/templates/accounts/register.html:26
|
#: accounts/templates/accounts/register.html:26
|
||||||
|
#: events/templates/events/event_info.html:119
|
||||||
msgid "Register"
|
msgid "Register"
|
||||||
msgstr ""
|
msgstr "Inscription"
|
||||||
|
|
||||||
#: accounts/views/views.py:31
|
#: accounts/views/views.py:33
|
||||||
msgid "Your account was inactive."
|
msgid "Your account was inactive."
|
||||||
msgstr ""
|
msgstr "Votre compte était inactif."
|
||||||
|
|
||||||
#: accounts/views/views.py:50
|
#: accounts/views/views.py:52
|
||||||
msgid ""
|
msgid ""
|
||||||
"The password must contain at least one letter and at least one digit or "
|
"The password must contain at least one letter and at least one digit or "
|
||||||
"punctuation character."
|
"punctuation character."
|
||||||
msgstr ""
|
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."
|
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."
|
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."
|
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."
|
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:122
|
||||||
msgid "Updated."
|
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"
|
msgid "Published date"
|
||||||
msgstr ""
|
msgstr "Date de publication"
|
||||||
|
|
||||||
#: ctfs/templates/ctfs/ctf_info.html:17
|
#: ctfs/templates/ctfs/ctf_info.html:14
|
||||||
msgid "Congratulation !"
|
#, fuzzy
|
||||||
msgstr ""
|
#| 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
|
#: ctfs/templates/ctfs/ctf_info.html:21
|
||||||
msgid "Already flagged"
|
#: events/templates/events/ctf_info.html:18 home/templates/home/home.html:46
|
||||||
msgstr ""
|
msgid ""
|
||||||
|
"No translation available. Please try another language (English or French)."
|
||||||
#: 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"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ctfs/templates/ctfs/ctf_info.html:27
|
#: 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 !"
|
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"
|
msgid "Solved by"
|
||||||
msgstr ""
|
msgstr "Résolu par"
|
||||||
|
|
||||||
#: ctfs/templates/ctfs/ctf_info.html:68
|
#: ctfs/templates/ctfs/ctf_info.html:80
|
||||||
msgid "Nobody have solved this CTF."
|
#: events/templates/events/ctf_info.html:96
|
||||||
msgstr ""
|
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"
|
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"
|
msgid "Point reward"
|
||||||
msgstr ""
|
msgstr "Points"
|
||||||
|
|
||||||
#: ctfs/templates/ctfs/ctfs_list.html:14
|
#: ctfs/templates/ctfs/ctfs_list.html:14
|
||||||
msgid "Solved"
|
msgid "Solved"
|
||||||
msgstr ""
|
msgstr "Résolu"
|
||||||
|
|
||||||
#: ctfs/templates/ctfs/ctfs_list.html:37
|
#: ctfs/templates/ctfs/ctfs_list.html:37
|
||||||
msgid "No ctf available for this category."
|
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
|
#: ctfs/templates/ctfs/ctfs_list.html:42
|
||||||
msgid "Categories"
|
msgid "Categories"
|
||||||
msgstr ""
|
msgstr "Catégories"
|
||||||
|
|
||||||
#: ctfs/templates/ctfs/ctfs_list.html:48 templates/base.html:54
|
#: ctfs/templates/ctfs/ctfs_list.html:48 templates/base.html:54
|
||||||
msgid "No category available."
|
msgid "No category available."
|
||||||
|
msgstr "Il n'y a pas de catégorie disponible."
|
||||||
|
|
||||||
|
#: events/templates/events/create_team.html:9
|
||||||
|
#: events/templates/events/join_team.html:9
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "This event start at"
|
||||||
|
msgid "This event starts at"
|
||||||
|
msgstr "Cet événement débute à"
|
||||||
|
|
||||||
|
#: events/templates/events/create_team.html:16
|
||||||
|
#: events/templates/events/join_team.html:16
|
||||||
|
#, 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:19 events/views/teams.py:118
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Username already taken."
|
||||||
|
msgid "Name already taken."
|
||||||
|
msgstr "Ce nom est déjà utilisé."
|
||||||
|
|
||||||
|
#: events/templates/events/create_team.html:25
|
||||||
|
#: events/templates/events/join_team.html:30
|
||||||
|
#: events/templates/events/manage_team.html:22
|
||||||
|
msgid "Team name"
|
||||||
|
msgstr "Nom de l'équipe"
|
||||||
|
|
||||||
|
#: events/templates/events/create_team.html:27
|
||||||
|
#: events/templates/events/create_team.html:46
|
||||||
|
#: events/templates/events/join_team.html:52
|
||||||
|
msgid "Create Team"
|
||||||
|
msgstr "Créer une équipe"
|
||||||
|
|
||||||
|
#: events/templates/events/create_team.html:32
|
||||||
|
#: events/templates/events/event_pwd.html:28
|
||||||
|
#: events/templates/events/join_team.html:37
|
||||||
|
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:41
|
||||||
|
#: events/templates/events/event_info.html:113
|
||||||
|
#: events/templates/events/event_pwd.html:36
|
||||||
|
#: events/templates/events/join_team.html:46
|
||||||
|
msgid "Starts at"
|
||||||
|
msgstr "Début"
|
||||||
|
|
||||||
|
#: events/templates/events/create_team.html:42
|
||||||
|
#: events/templates/events/event_info.html:114
|
||||||
|
#: events/templates/events/event_pwd.html:37
|
||||||
|
#: events/templates/events/join_team.html:47
|
||||||
|
msgid "Ends at"
|
||||||
|
msgstr "Fin"
|
||||||
|
|
||||||
|
#: events/templates/events/create_team.html:47
|
||||||
|
#: events/templates/events/join_team.html:32
|
||||||
|
#: events/templates/events/join_team.html:51
|
||||||
|
msgid "Join Team"
|
||||||
|
msgstr "Rejoindre une équipe"
|
||||||
|
|
||||||
|
#: events/templates/events/create_team.html:54
|
||||||
|
#: events/templates/events/join_team.html:59
|
||||||
|
msgid "Find me a team !"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: home/templates/home/home.html:19
|
#: 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_info.html:129
|
||||||
|
msgid "Manage my team"
|
||||||
|
msgstr "Gérer mon équipe"
|
||||||
|
|
||||||
|
#: events/templates/events/event_pwd.html:15
|
||||||
|
#: events/templates/events/join_team.html:21
|
||||||
|
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:63
|
||||||
|
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:19
|
||||||
|
msgid "Team does not exist."
|
||||||
|
msgstr "Cette équipe n'existe pas."
|
||||||
|
|
||||||
|
#: events/templates/events/join_team.html:23
|
||||||
|
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."
|
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"
|
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."
|
msgid "No ctf available."
|
||||||
|
msgstr "Pas de challenge disponible"
|
||||||
|
|
||||||
|
#: home/templates/home/home.html:74
|
||||||
|
msgid "Latest Flags"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: home/templates/home/home.html:40
|
#: home/templates/home/home.html:88
|
||||||
msgid "Flags counter"
|
msgid "Flags"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: project/settings.py:120
|
#: home/templates/home/home.html:94
|
||||||
msgid "Global Site"
|
#, fuzzy
|
||||||
msgstr ""
|
#| msgid "Username"
|
||||||
|
msgid "Users"
|
||||||
|
msgstr "Pseudo"
|
||||||
|
|
||||||
#: project/settings.py:121
|
#: project/settings.py:115
|
||||||
msgid "Italian"
|
msgid "English"
|
||||||
msgstr ""
|
msgstr "Anglais"
|
||||||
|
|
||||||
#: project/settings.py:122
|
#: project/settings.py:116
|
||||||
msgid "German"
|
msgid "German"
|
||||||
msgstr ""
|
msgstr "Allemand"
|
||||||
|
|
||||||
#: project/settings.py:123
|
#: project/settings.py:117
|
||||||
msgid "French"
|
msgid "French"
|
||||||
msgstr ""
|
msgstr "Français"
|
||||||
|
|
||||||
#: project/settings.py:124
|
#: project/settings.py:118
|
||||||
msgid "Spanish"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: project/settings.py:125
|
|
||||||
msgid "Russian"
|
msgid "Russian"
|
||||||
msgstr ""
|
msgstr "Russe"
|
||||||
|
|
||||||
#: scoreboard/templates/scoreboard/scoreboard.html:11
|
#: scoreboard/templates/scoreboard/scoreboard.html:38
|
||||||
msgid "Rank"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: scoreboard/templates/scoreboard/scoreboard.html:36
|
|
||||||
msgid "First"
|
msgid "First"
|
||||||
msgstr ""
|
msgstr "Début"
|
||||||
|
|
||||||
#: scoreboard/templates/scoreboard/scoreboard.html:37
|
#: scoreboard/templates/scoreboard/scoreboard.html:39
|
||||||
msgid "Previous"
|
msgid "Previous"
|
||||||
msgstr ""
|
msgstr "Précédente"
|
||||||
|
|
||||||
#: scoreboard/templates/scoreboard/scoreboard.html:41
|
#: scoreboard/templates/scoreboard/scoreboard.html:43
|
||||||
msgid "Page "
|
msgid "Page "
|
||||||
msgstr ""
|
msgstr "Page"
|
||||||
|
|
||||||
#: scoreboard/templates/scoreboard/scoreboard.html:45
|
#: scoreboard/templates/scoreboard/scoreboard.html:47
|
||||||
msgid "Next"
|
msgid "Next"
|
||||||
msgstr ""
|
msgstr "Suivante"
|
||||||
|
|
||||||
#: scoreboard/templates/scoreboard/scoreboard.html:46
|
#: scoreboard/templates/scoreboard/scoreboard.html:48
|
||||||
msgid "Last"
|
msgid "Last"
|
||||||
msgstr ""
|
msgstr "Fin"
|
||||||
|
|
||||||
#: templates/base.html:59
|
#: templates/base.html:59
|
||||||
msgid "Scoreboard"
|
msgid "Scoreboard"
|
||||||
|
msgstr "Classement"
|
||||||
|
|
||||||
|
#: templates/base.html:66
|
||||||
|
msgid "Resources"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/base.html:86
|
#: templates/base.html:99
|
||||||
msgid "Logout"
|
msgid "Logout"
|
||||||
msgstr ""
|
msgstr "Déconnexion"
|
||||||
|
|
||||||
#: templates/base.html:93
|
#: templates/base.html:106
|
||||||
msgid "Sign Up"
|
msgid "Sign Up"
|
||||||
msgstr ""
|
msgstr "Inscription"
|
||||||
|
|
||||||
|
#: templates/base.html:144
|
||||||
|
msgid "Become a Patron!"
|
||||||
|
msgstr "Soutenez nous via Patreon !"
|
||||||
|
|
||||||
#: templates/registration/password_reset_complete.html:11
|
#: templates/registration/password_reset_complete.html:11
|
||||||
msgid "Your new password has been set."
|
msgid "Your new password has been set."
|
||||||
msgstr ""
|
msgstr "Votre mot de passe a été mis à jour."
|
||||||
|
|
||||||
#: templates/registration/password_reset_confirm.html:19
|
|
||||||
msgid "Your password can’t be too similar to your other personal information."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/registration/password_reset_confirm.html:20
|
#: templates/registration/password_reset_confirm.html:20
|
||||||
msgid "Your password must contain at least 8 characters."
|
msgid "Your password can’t be too similar to your other personal information."
|
||||||
msgstr ""
|
msgstr "Votre mot de passe ne peut pas être similaire à votre adresse mail."
|
||||||
|
|
||||||
#: templates/registration/password_reset_confirm.html:21
|
#: templates/registration/password_reset_confirm.html:21
|
||||||
msgid "Your password can’t be a commonly used password."
|
msgid "Your password must contain at least 8 characters."
|
||||||
msgstr ""
|
msgstr "Votre mot de passe doit contenir au moins 8 caractères."
|
||||||
|
|
||||||
#: templates/registration/password_reset_confirm.html:22
|
#: templates/registration/password_reset_confirm.html:22
|
||||||
|
msgid "Your password can’t 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 can’t be entirely numeric."
|
msgid "Your password can’t 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"
|
msgid "Confirm"
|
||||||
msgstr ""
|
msgstr "Confirmer"
|
||||||
|
|
||||||
#: templates/registration/password_reset_confirm.html:27
|
#: templates/registration/password_reset_confirm.html:28
|
||||||
msgid "Submit"
|
msgid "Submit"
|
||||||
msgstr ""
|
msgstr "Soumettre"
|
||||||
|
|
||||||
#: templates/registration/password_reset_done.html:10
|
#: templates/registration/password_reset_done.html:11
|
||||||
msgid ""
|
msgid ""
|
||||||
"We've emailed you instructions for setting your password. You should receive "
|
"We've emailed you instructions for setting your password. You should receive "
|
||||||
"the email shortly!"
|
"the email shortly!"
|
||||||
msgstr ""
|
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"
|
msgid "Reset"
|
||||||
msgstr ""
|
msgstr "Réinitialiser"
|
||||||
|
|
||||||
|
#~ msgid "Start at"
|
||||||
|
#~ msgstr "Début"
|
||||||
|
|
||||||
|
#~ msgid "End at"
|
||||||
|
#~ msgstr "Fin"
|
||||||
|
|
||||||
|
#~ msgid "Disconnect Discord"
|
||||||
|
#~ msgstr "Déconnecter Discord"
|
||||||
|
|
||||||
|
#~ msgid "Connect Discord"
|
||||||
|
#~ msgstr "Connecter Discord"
|
||||||
|
|
|
@ -8,7 +8,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2021-05-10 19:28+0000\n"
|
"POT-Creation-Date: 2022-02-02 19:22+0100\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
|
@ -18,11 +18,41 @@ msgstr ""
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\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:26
|
||||||
|
#: events/templates/events/join_team.html:31
|
||||||
|
msgid "Password"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/edit.html:21
|
#: accounts/templates/accounts/edit.html:21
|
||||||
#: accounts/templates/accounts/login.html:18
|
#: accounts/templates/accounts/login.html:18
|
||||||
#: accounts/templates/accounts/register.html:22
|
#: accounts/templates/accounts/register.html:22
|
||||||
#: ctfs/templates/ctfs/ctf_info.html:50 ctfs/templates/ctfs/ctfs_list.html:12
|
#: ctfs/templates/ctfs/ctf_info.html:61 ctfs/templates/ctfs/ctfs_list.html:12
|
||||||
#: scoreboard/templates/scoreboard/scoreboard.html:12
|
#: events/templates/events/ctf_info.html:71
|
||||||
|
#: events/templates/events/event_info.html:64
|
||||||
|
#: scoreboard/templates/scoreboard/scoreboard.html:13
|
||||||
msgid "Username"
|
msgid "Username"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -31,89 +61,114 @@ msgid "Email"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/edit.html:30
|
#: accounts/templates/accounts/edit.html:30
|
||||||
#: ctfs/templates/ctfs/ctf_info.html:51
|
#: ctfs/templates/ctfs/ctf_info.html:62
|
||||||
#: scoreboard/templates/scoreboard/scoreboard.html:13
|
#: events/templates/events/ctf_info.html:72
|
||||||
|
#: events/templates/events/event_info.html:65
|
||||||
|
#: scoreboard/templates/scoreboard/scoreboard.html:14
|
||||||
msgid "Website"
|
msgid "Website"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/edit.html:36
|
#: accounts/templates/accounts/edit.html:36
|
||||||
|
#: events/templates/events/manage_team.html:29
|
||||||
msgid "Apply"
|
msgid "Apply"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/edit.html:44
|
#: accounts/templates/accounts/edit.html:47
|
||||||
msgid "Connected accounts"
|
#: accounts/templates/accounts/profile.html:46
|
||||||
msgstr ""
|
#: ctfs/templates/ctfs/ctf_info.html:63 ctfs/templates/ctfs/ctfs_list.html:13
|
||||||
|
#: events/templates/events/event_info.html:66
|
||||||
#: accounts/templates/accounts/edit.html:51
|
#: events/templates/events/event_info.html:89
|
||||||
msgid "Disconnect Discord"
|
#: events/templates/events/manage_team.html:40
|
||||||
msgstr ""
|
#: events/templates/events/team.html:45
|
||||||
|
#: scoreboard/templates/scoreboard/scoreboard.html:15
|
||||||
#: 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
|
|
||||||
msgid "Score"
|
msgid "Score"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/edit.html:74
|
#: accounts/templates/accounts/edit.html:55
|
||||||
#: accounts/templates/accounts/profile.html:45
|
#: accounts/templates/accounts/profile.html:60
|
||||||
msgid "Member since"
|
msgid "Registered since"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: accounts/templates/accounts/edit.html:61
|
||||||
|
msgid "Delete my account"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/login.html:13
|
#: accounts/templates/accounts/login.html:13
|
||||||
msgid "Please, verify your infos."
|
msgid "Please, verify your infos."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/login.html:19
|
|
||||||
#: accounts/templates/accounts/register.html:23
|
|
||||||
msgid "Password"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: accounts/templates/accounts/login.html:22
|
#: accounts/templates/accounts/login.html:22
|
||||||
msgid "Reset password"
|
msgid "Reset password"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/login.html:31
|
#: 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:103
|
||||||
#: templates/registration/password_reset_complete.html:18
|
#: templates/registration/password_reset_complete.html:18
|
||||||
#: templates/registration/password_reset_confirm.html:37
|
#: templates/registration/password_reset_confirm.html:38
|
||||||
#: templates/registration/password_reset_done.html:17
|
#: templates/registration/password_reset_done.html:18
|
||||||
#: templates/registration/password_reset_form.html:25
|
#: templates/registration/password_reset_form.html:26
|
||||||
msgid "Login"
|
msgid "Login"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/login.html:32
|
#: accounts/templates/accounts/login.html:32
|
||||||
#: accounts/templates/accounts/register.html:37
|
#: accounts/templates/accounts/register.html:37
|
||||||
#: templates/registration/password_reset_complete.html:19
|
#: templates/registration/password_reset_complete.html:19
|
||||||
#: templates/registration/password_reset_confirm.html:38
|
#: templates/registration/password_reset_confirm.html:39
|
||||||
#: templates/registration/password_reset_done.html:18
|
#: templates/registration/password_reset_done.html:19
|
||||||
#: templates/registration/password_reset_form.html:26
|
#: templates/registration/password_reset_form.html:27
|
||||||
msgid "Sign up"
|
msgid "Sign up"
|
||||||
msgstr ""
|
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"
|
msgid "Challenge Name"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/profile.html:13
|
#: accounts/templates/accounts/profile.html:22
|
||||||
|
#: events/templates/events/team.html:21
|
||||||
msgid "Category"
|
msgid "Category"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/profile.html:14
|
#: accounts/templates/accounts/profile.html:23
|
||||||
|
#: events/templates/events/team.html:22
|
||||||
msgid "Points"
|
msgid "Points"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/profile.html:15
|
#: accounts/templates/accounts/profile.html:24
|
||||||
#: ctfs/templates/ctfs/ctf_info.html:53
|
#: ctfs/templates/ctfs/ctf_info.html:64
|
||||||
|
#: events/templates/events/ctf_info.html:73
|
||||||
|
#: events/templates/events/team.html:23
|
||||||
msgid "Date"
|
msgid "Date"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/profile.html:30
|
#: accounts/templates/accounts/profile.html:39
|
||||||
msgid "It's seem {{ user.username }} have never solved any CTF yet..."
|
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 ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/register.html:13
|
#: accounts/templates/accounts/register.html:13
|
||||||
|
@ -129,76 +184,99 @@ msgid "Personal website"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/register.html:26
|
#: accounts/templates/accounts/register.html:26
|
||||||
|
#: events/templates/events/event_info.html:119
|
||||||
msgid "Register"
|
msgid "Register"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/views/views.py:31
|
#: accounts/views/views.py:33
|
||||||
msgid "Your account was inactive."
|
msgid "Your account was inactive."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/views/views.py:50
|
#: accounts/views/views.py:52
|
||||||
msgid ""
|
msgid ""
|
||||||
"The password must contain at least one letter and at least one digit or "
|
"The password must contain at least one letter and at least one digit or "
|
||||||
"punctuation character."
|
"punctuation character."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/views/views.py:52
|
#: accounts/views/views.py:54
|
||||||
msgid "A user with that email already exists."
|
msgid "A user with that email already exists."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/views/views.py:65
|
#: accounts/views/views.py:67
|
||||||
msgid "A user with that username already exists."
|
msgid "A user with that username already exists."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/views/views.py:93
|
#: accounts/views/views.py:95
|
||||||
msgid "Email already taken."
|
msgid "Email already taken."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/views/views.py:99
|
#: accounts/views/views.py:101
|
||||||
msgid "Username already taken."
|
msgid "Username already taken."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/views/views.py:103
|
#: accounts/views/views.py:105 events/views/teams.py:122
|
||||||
msgid "Updated."
|
msgid "Updated."
|
||||||
msgstr ""
|
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"
|
msgid "Published date"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ctfs/templates/ctfs/ctf_info.html:17
|
#: ctfs/templates/ctfs/ctf_info.html:14
|
||||||
msgid "Congratulation !"
|
msgid "Challenge is not yet available."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ctfs/templates/ctfs/ctf_info.html:19
|
#: ctfs/templates/ctfs/ctf_info.html:21
|
||||||
msgid "Already flagged"
|
#: events/templates/events/ctf_info.html:18 home/templates/home/home.html:46
|
||||||
msgstr ""
|
msgid ""
|
||||||
|
"No translation available. Please try another language (English or French)."
|
||||||
#: 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"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ctfs/templates/ctfs/ctf_info.html:27
|
#: 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 !"
|
msgid "Wrong flag ! You can do it !"
|
||||||
msgstr ""
|
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"
|
msgid "Solved by"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ctfs/templates/ctfs/ctf_info.html:68
|
#: ctfs/templates/ctfs/ctf_info.html:80
|
||||||
msgid "Nobody have solved this CTF."
|
#: events/templates/events/ctf_info.html:96
|
||||||
|
msgid "Nobody has solved this challenge yet."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ctfs/templates/ctfs/ctf_info.html:74
|
#: ctfs/templates/ctfs/ctf_info.html:87
|
||||||
|
#: events/templates/events/ctf_info.html:103
|
||||||
msgid "Author"
|
msgid "Author"
|
||||||
msgstr ""
|
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"
|
msgid "Point reward"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -218,67 +296,241 @@ msgstr ""
|
||||||
msgid "No category available."
|
msgid "No category available."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: home/templates/home/home.html:19
|
#: events/templates/events/create_team.html:9
|
||||||
|
#: events/templates/events/join_team.html:9
|
||||||
|
msgid "This event starts at"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: events/templates/events/create_team.html:16
|
||||||
|
#: events/templates/events/join_team.html:16
|
||||||
|
msgid "You need to be registered to the event."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: events/templates/events/create_team.html:19 events/views/teams.py:118
|
||||||
|
msgid "Name already taken."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: events/templates/events/create_team.html:25
|
||||||
|
#: events/templates/events/join_team.html:30
|
||||||
|
#: events/templates/events/manage_team.html:22
|
||||||
|
msgid "Team name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: events/templates/events/create_team.html:27
|
||||||
|
#: events/templates/events/create_team.html:46
|
||||||
|
#: events/templates/events/join_team.html:52
|
||||||
|
msgid "Create Team"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: events/templates/events/create_team.html:32
|
||||||
|
#: events/templates/events/event_pwd.html:28
|
||||||
|
#: events/templates/events/join_team.html:37
|
||||||
|
msgid "You need to be logged to access this event."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: events/templates/events/create_team.html:41
|
||||||
|
#: events/templates/events/event_info.html:113
|
||||||
|
#: events/templates/events/event_pwd.html:36
|
||||||
|
#: events/templates/events/join_team.html:46
|
||||||
|
msgid "Starts at"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: events/templates/events/create_team.html:42
|
||||||
|
#: events/templates/events/event_info.html:114
|
||||||
|
#: events/templates/events/event_pwd.html:37
|
||||||
|
#: events/templates/events/join_team.html:47
|
||||||
|
msgid "Ends at"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: events/templates/events/create_team.html:47
|
||||||
|
#: events/templates/events/join_team.html:32
|
||||||
|
#: events/templates/events/join_team.html:51
|
||||||
|
msgid "Join Team"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: events/templates/events/create_team.html:54
|
||||||
|
#: events/templates/events/join_team.html:59
|
||||||
|
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_info.html:129
|
||||||
|
msgid "Manage my team"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: events/templates/events/event_pwd.html:15
|
||||||
|
#: events/templates/events/join_team.html:21
|
||||||
|
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:63
|
||||||
|
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:19
|
||||||
|
msgid "Team does not exist."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: events/templates/events/join_team.html:23
|
||||||
|
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."
|
msgid "No article available."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: home/templates/home/home.html:24
|
#: home/templates/home/home.html:61
|
||||||
msgid "Latest challenges added"
|
msgid "Latest challenges added"
|
||||||
msgstr ""
|
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."
|
msgid "No ctf available."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: home/templates/home/home.html:40
|
#: home/templates/home/home.html:74
|
||||||
msgid "Flags counter"
|
msgid "Latest Flags"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: project/settings.py:120
|
#: home/templates/home/home.html:88
|
||||||
msgid "Global Site"
|
msgid "Flags"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: project/settings.py:121
|
#: home/templates/home/home.html:94
|
||||||
msgid "Italian"
|
msgid "Users"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: project/settings.py:122
|
#: project/settings.py:115
|
||||||
|
msgid "English"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: project/settings.py:116
|
||||||
msgid "German"
|
msgid "German"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: project/settings.py:123
|
#: project/settings.py:117
|
||||||
msgid "French"
|
msgid "French"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: project/settings.py:124
|
#: project/settings.py:118
|
||||||
msgid "Spanish"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: project/settings.py:125
|
|
||||||
msgid "Russian"
|
msgid "Russian"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: scoreboard/templates/scoreboard/scoreboard.html:11
|
#: scoreboard/templates/scoreboard/scoreboard.html:38
|
||||||
msgid "Rank"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: scoreboard/templates/scoreboard/scoreboard.html:36
|
|
||||||
msgid "First"
|
msgid "First"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: scoreboard/templates/scoreboard/scoreboard.html:37
|
#: scoreboard/templates/scoreboard/scoreboard.html:39
|
||||||
msgid "Previous"
|
msgid "Previous"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: scoreboard/templates/scoreboard/scoreboard.html:41
|
#: scoreboard/templates/scoreboard/scoreboard.html:43
|
||||||
msgid "Page "
|
msgid "Page "
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: scoreboard/templates/scoreboard/scoreboard.html:45
|
#: scoreboard/templates/scoreboard/scoreboard.html:47
|
||||||
msgid "Next"
|
msgid "Next"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: scoreboard/templates/scoreboard/scoreboard.html:46
|
#: scoreboard/templates/scoreboard/scoreboard.html:48
|
||||||
msgid "Last"
|
msgid "Last"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -286,48 +538,56 @@ msgstr ""
|
||||||
msgid "Scoreboard"
|
msgid "Scoreboard"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/base.html:86
|
#: templates/base.html:66
|
||||||
|
msgid "Resources"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: templates/base.html:99
|
||||||
msgid "Logout"
|
msgid "Logout"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/base.html:93
|
#: templates/base.html:106
|
||||||
msgid "Sign Up"
|
msgid "Sign Up"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: templates/base.html:144
|
||||||
|
msgid "Become a Patron!"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: templates/registration/password_reset_complete.html:11
|
#: templates/registration/password_reset_complete.html:11
|
||||||
msgid "Your new password has been set."
|
msgid "Your new password has been set."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/registration/password_reset_confirm.html:19
|
#: templates/registration/password_reset_confirm.html:20
|
||||||
msgid "Your password can’t be too similar to your other personal information."
|
msgid "Your password can’t be too similar to your other personal information."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/registration/password_reset_confirm.html:20
|
#: templates/registration/password_reset_confirm.html:21
|
||||||
msgid "Your password must contain at least 8 characters."
|
msgid "Your password must contain at least 8 characters."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/registration/password_reset_confirm.html:21
|
#: templates/registration/password_reset_confirm.html:22
|
||||||
msgid "Your password can’t be a commonly used password."
|
msgid "Your password can’t be a commonly used password."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/registration/password_reset_confirm.html:22
|
#: templates/registration/password_reset_confirm.html:23
|
||||||
msgid "Your password can’t be entirely numeric."
|
msgid "Your password can’t be entirely numeric."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/registration/password_reset_confirm.html:25
|
#: templates/registration/password_reset_confirm.html:26
|
||||||
msgid "Confirm"
|
msgid "Confirm"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/registration/password_reset_confirm.html:27
|
#: templates/registration/password_reset_confirm.html:28
|
||||||
msgid "Submit"
|
msgid "Submit"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/registration/password_reset_done.html:10
|
#: templates/registration/password_reset_done.html:11
|
||||||
msgid ""
|
msgid ""
|
||||||
"We've emailed you instructions for setting your password. You should receive "
|
"We've emailed you instructions for setting your password. You should receive "
|
||||||
"the email shortly!"
|
"the email shortly!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/registration/password_reset_form.html:15
|
#: templates/registration/password_reset_form.html:16
|
||||||
msgid "Reset"
|
msgid "Reset"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
|
@ -8,7 +8,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2021-05-10 19:28+0000\n"
|
"POT-Creation-Date: 2022-02-02 19:22+0100\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\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"
|
"%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"
|
"%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:26
|
||||||
|
#: events/templates/events/join_team.html:31
|
||||||
|
msgid "Password"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/edit.html:21
|
#: accounts/templates/accounts/edit.html:21
|
||||||
#: accounts/templates/accounts/login.html:18
|
#: accounts/templates/accounts/login.html:18
|
||||||
#: accounts/templates/accounts/register.html:22
|
#: accounts/templates/accounts/register.html:22
|
||||||
#: ctfs/templates/ctfs/ctf_info.html:50 ctfs/templates/ctfs/ctfs_list.html:12
|
#: ctfs/templates/ctfs/ctf_info.html:61 ctfs/templates/ctfs/ctfs_list.html:12
|
||||||
#: scoreboard/templates/scoreboard/scoreboard.html:12
|
#: events/templates/events/ctf_info.html:71
|
||||||
|
#: events/templates/events/event_info.html:64
|
||||||
|
#: scoreboard/templates/scoreboard/scoreboard.html:13
|
||||||
msgid "Username"
|
msgid "Username"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -33,89 +63,114 @@ msgid "Email"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/edit.html:30
|
#: accounts/templates/accounts/edit.html:30
|
||||||
#: ctfs/templates/ctfs/ctf_info.html:51
|
#: ctfs/templates/ctfs/ctf_info.html:62
|
||||||
#: scoreboard/templates/scoreboard/scoreboard.html:13
|
#: events/templates/events/ctf_info.html:72
|
||||||
|
#: events/templates/events/event_info.html:65
|
||||||
|
#: scoreboard/templates/scoreboard/scoreboard.html:14
|
||||||
msgid "Website"
|
msgid "Website"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/edit.html:36
|
#: accounts/templates/accounts/edit.html:36
|
||||||
|
#: events/templates/events/manage_team.html:29
|
||||||
msgid "Apply"
|
msgid "Apply"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/edit.html:44
|
#: accounts/templates/accounts/edit.html:47
|
||||||
msgid "Connected accounts"
|
#: accounts/templates/accounts/profile.html:46
|
||||||
msgstr ""
|
#: ctfs/templates/ctfs/ctf_info.html:63 ctfs/templates/ctfs/ctfs_list.html:13
|
||||||
|
#: events/templates/events/event_info.html:66
|
||||||
#: accounts/templates/accounts/edit.html:51
|
#: events/templates/events/event_info.html:89
|
||||||
msgid "Disconnect Discord"
|
#: events/templates/events/manage_team.html:40
|
||||||
msgstr ""
|
#: events/templates/events/team.html:45
|
||||||
|
#: scoreboard/templates/scoreboard/scoreboard.html:15
|
||||||
#: 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
|
|
||||||
msgid "Score"
|
msgid "Score"
|
||||||
msgstr "счет"
|
msgstr "счет"
|
||||||
|
|
||||||
#: accounts/templates/accounts/edit.html:74
|
#: accounts/templates/accounts/edit.html:55
|
||||||
#: accounts/templates/accounts/profile.html:45
|
#: accounts/templates/accounts/profile.html:60
|
||||||
msgid "Member since"
|
msgid "Registered since"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: accounts/templates/accounts/edit.html:61
|
||||||
|
msgid "Delete my account"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/login.html:13
|
#: accounts/templates/accounts/login.html:13
|
||||||
msgid "Please, verify your infos."
|
msgid "Please, verify your infos."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/login.html:19
|
|
||||||
#: accounts/templates/accounts/register.html:23
|
|
||||||
msgid "Password"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: accounts/templates/accounts/login.html:22
|
#: accounts/templates/accounts/login.html:22
|
||||||
msgid "Reset password"
|
msgid "Reset password"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/login.html:31
|
#: 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:103
|
||||||
#: templates/registration/password_reset_complete.html:18
|
#: templates/registration/password_reset_complete.html:18
|
||||||
#: templates/registration/password_reset_confirm.html:37
|
#: templates/registration/password_reset_confirm.html:38
|
||||||
#: templates/registration/password_reset_done.html:17
|
#: templates/registration/password_reset_done.html:18
|
||||||
#: templates/registration/password_reset_form.html:25
|
#: templates/registration/password_reset_form.html:26
|
||||||
msgid "Login"
|
msgid "Login"
|
||||||
msgstr "Авторизоваться"
|
msgstr "Авторизоваться"
|
||||||
|
|
||||||
#: accounts/templates/accounts/login.html:32
|
#: accounts/templates/accounts/login.html:32
|
||||||
#: accounts/templates/accounts/register.html:37
|
#: accounts/templates/accounts/register.html:37
|
||||||
#: templates/registration/password_reset_complete.html:19
|
#: templates/registration/password_reset_complete.html:19
|
||||||
#: templates/registration/password_reset_confirm.html:38
|
#: templates/registration/password_reset_confirm.html:39
|
||||||
#: templates/registration/password_reset_done.html:18
|
#: templates/registration/password_reset_done.html:19
|
||||||
#: templates/registration/password_reset_form.html:26
|
#: templates/registration/password_reset_form.html:27
|
||||||
msgid "Sign up"
|
msgid "Sign up"
|
||||||
msgstr ""
|
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"
|
msgid "Challenge Name"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/profile.html:13
|
#: accounts/templates/accounts/profile.html:22
|
||||||
|
#: events/templates/events/team.html:21
|
||||||
msgid "Category"
|
msgid "Category"
|
||||||
msgstr "Категории"
|
msgstr "Категории"
|
||||||
|
|
||||||
#: accounts/templates/accounts/profile.html:14
|
#: accounts/templates/accounts/profile.html:23
|
||||||
|
#: events/templates/events/team.html:22
|
||||||
msgid "Points"
|
msgid "Points"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/profile.html:15
|
#: accounts/templates/accounts/profile.html:24
|
||||||
#: ctfs/templates/ctfs/ctf_info.html:53
|
#: ctfs/templates/ctfs/ctf_info.html:64
|
||||||
|
#: events/templates/events/ctf_info.html:73
|
||||||
|
#: events/templates/events/team.html:23
|
||||||
msgid "Date"
|
msgid "Date"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/profile.html:30
|
#: accounts/templates/accounts/profile.html:39
|
||||||
msgid "It's seem {{ user.username }} have never solved any CTF yet..."
|
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 ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/register.html:13
|
#: accounts/templates/accounts/register.html:13
|
||||||
|
@ -131,76 +186,101 @@ msgid "Personal website"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/templates/accounts/register.html:26
|
#: accounts/templates/accounts/register.html:26
|
||||||
|
#: events/templates/events/event_info.html:119
|
||||||
msgid "Register"
|
msgid "Register"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/views/views.py:31
|
#: accounts/views/views.py:33
|
||||||
msgid "Your account was inactive."
|
msgid "Your account was inactive."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/views/views.py:50
|
#: accounts/views/views.py:52
|
||||||
msgid ""
|
msgid ""
|
||||||
"The password must contain at least one letter and at least one digit or "
|
"The password must contain at least one letter and at least one digit or "
|
||||||
"punctuation character."
|
"punctuation character."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/views/views.py:52
|
#: accounts/views/views.py:54
|
||||||
msgid "A user with that email already exists."
|
msgid "A user with that email already exists."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/views/views.py:65
|
#: accounts/views/views.py:67
|
||||||
msgid "A user with that username already exists."
|
msgid "A user with that username already exists."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/views/views.py:93
|
#: accounts/views/views.py:95
|
||||||
msgid "Email already taken."
|
msgid "Email already taken."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/views/views.py:99
|
#: accounts/views/views.py:101
|
||||||
msgid "Username already taken."
|
msgid "Username already taken."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: accounts/views/views.py:103
|
#: accounts/views/views.py:105 events/views/teams.py:122
|
||||||
msgid "Updated."
|
msgid "Updated."
|
||||||
msgstr ""
|
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"
|
msgid "Published date"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ctfs/templates/ctfs/ctf_info.html:17
|
#: ctfs/templates/ctfs/ctf_info.html:14
|
||||||
msgid "Congratulation !"
|
#, fuzzy
|
||||||
msgstr ""
|
#| msgid "No article available."
|
||||||
|
msgid "Challenge is not yet available."
|
||||||
|
msgstr "Нет доступных статей."
|
||||||
|
|
||||||
#: ctfs/templates/ctfs/ctf_info.html:19
|
#: ctfs/templates/ctfs/ctf_info.html:21
|
||||||
msgid "Already flagged"
|
#: events/templates/events/ctf_info.html:18 home/templates/home/home.html:46
|
||||||
msgstr ""
|
msgid ""
|
||||||
|
"No translation available. Please try another language (English or French)."
|
||||||
#: 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"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ctfs/templates/ctfs/ctf_info.html:27
|
#: 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 !"
|
msgid "Wrong flag ! You can do it !"
|
||||||
msgstr ""
|
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"
|
msgid "Solved by"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ctfs/templates/ctfs/ctf_info.html:68
|
#: ctfs/templates/ctfs/ctf_info.html:80
|
||||||
msgid "Nobody have solved this CTF."
|
#: events/templates/events/ctf_info.html:96
|
||||||
|
msgid "Nobody has solved this challenge yet."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ctfs/templates/ctfs/ctf_info.html:74
|
#: ctfs/templates/ctfs/ctf_info.html:87
|
||||||
|
#: events/templates/events/ctf_info.html:103
|
||||||
msgid "Author"
|
msgid "Author"
|
||||||
msgstr ""
|
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"
|
msgid "Point reward"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -220,67 +300,247 @@ msgstr ""
|
||||||
msgid "No category available."
|
msgid "No category available."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: home/templates/home/home.html:19
|
#: events/templates/events/create_team.html:9
|
||||||
|
#: events/templates/events/join_team.html:9
|
||||||
|
msgid "This event starts at"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: events/templates/events/create_team.html:16
|
||||||
|
#: events/templates/events/join_team.html:16
|
||||||
|
msgid "You need to be registered to the event."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: events/templates/events/create_team.html:19 events/views/teams.py:118
|
||||||
|
msgid "Name already taken."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: events/templates/events/create_team.html:25
|
||||||
|
#: events/templates/events/join_team.html:30
|
||||||
|
#: events/templates/events/manage_team.html:22
|
||||||
|
msgid "Team name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: events/templates/events/create_team.html:27
|
||||||
|
#: events/templates/events/create_team.html:46
|
||||||
|
#: events/templates/events/join_team.html:52
|
||||||
|
msgid "Create Team"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: events/templates/events/create_team.html:32
|
||||||
|
#: events/templates/events/event_pwd.html:28
|
||||||
|
#: events/templates/events/join_team.html:37
|
||||||
|
msgid "You need to be logged to access this event."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: events/templates/events/create_team.html:41
|
||||||
|
#: events/templates/events/event_info.html:113
|
||||||
|
#: events/templates/events/event_pwd.html:36
|
||||||
|
#: events/templates/events/join_team.html:46
|
||||||
|
msgid "Starts at"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: events/templates/events/create_team.html:42
|
||||||
|
#: events/templates/events/event_info.html:114
|
||||||
|
#: events/templates/events/event_pwd.html:37
|
||||||
|
#: events/templates/events/join_team.html:47
|
||||||
|
msgid "Ends at"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: events/templates/events/create_team.html:47
|
||||||
|
#: events/templates/events/join_team.html:32
|
||||||
|
#: events/templates/events/join_team.html:51
|
||||||
|
msgid "Join Team"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: events/templates/events/create_team.html:54
|
||||||
|
#: events/templates/events/join_team.html:59
|
||||||
|
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_info.html:129
|
||||||
|
msgid "Manage my team"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: events/templates/events/event_pwd.html:15
|
||||||
|
#: events/templates/events/join_team.html:21
|
||||||
|
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:63
|
||||||
|
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:19
|
||||||
|
msgid "Team does not exist."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: events/templates/events/join_team.html:23
|
||||||
|
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."
|
msgid "No article available."
|
||||||
msgstr "Нет доступных статей."
|
msgstr "Нет доступных статей."
|
||||||
|
|
||||||
#: home/templates/home/home.html:24
|
#: home/templates/home/home.html:61
|
||||||
msgid "Latest challenges added"
|
msgid "Latest challenges added"
|
||||||
msgstr ""
|
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."
|
msgid "No ctf available."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: home/templates/home/home.html:40
|
#: home/templates/home/home.html:74
|
||||||
msgid "Flags counter"
|
msgid "Latest Flags"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: project/settings.py:120
|
#: home/templates/home/home.html:88
|
||||||
msgid "Global Site"
|
msgid "Flags"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: project/settings.py:121
|
#: home/templates/home/home.html:94
|
||||||
msgid "Italian"
|
msgid "Users"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: project/settings.py:122
|
#: project/settings.py:115
|
||||||
|
msgid "English"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: project/settings.py:116
|
||||||
msgid "German"
|
msgid "German"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: project/settings.py:123
|
#: project/settings.py:117
|
||||||
msgid "French"
|
msgid "French"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: project/settings.py:124
|
#: project/settings.py:118
|
||||||
msgid "Spanish"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: project/settings.py:125
|
|
||||||
msgid "Russian"
|
msgid "Russian"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: scoreboard/templates/scoreboard/scoreboard.html:11
|
#: scoreboard/templates/scoreboard/scoreboard.html:38
|
||||||
msgid "Rank"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: scoreboard/templates/scoreboard/scoreboard.html:36
|
|
||||||
msgid "First"
|
msgid "First"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: scoreboard/templates/scoreboard/scoreboard.html:37
|
#: scoreboard/templates/scoreboard/scoreboard.html:39
|
||||||
msgid "Previous"
|
msgid "Previous"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: scoreboard/templates/scoreboard/scoreboard.html:41
|
#: scoreboard/templates/scoreboard/scoreboard.html:43
|
||||||
msgid "Page "
|
msgid "Page "
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: scoreboard/templates/scoreboard/scoreboard.html:45
|
#: scoreboard/templates/scoreboard/scoreboard.html:47
|
||||||
msgid "Next"
|
msgid "Next"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: scoreboard/templates/scoreboard/scoreboard.html:46
|
#: scoreboard/templates/scoreboard/scoreboard.html:48
|
||||||
msgid "Last"
|
msgid "Last"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -288,48 +548,56 @@ msgstr ""
|
||||||
msgid "Scoreboard"
|
msgid "Scoreboard"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/base.html:86
|
#: templates/base.html:66
|
||||||
|
msgid "Resources"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: templates/base.html:99
|
||||||
msgid "Logout"
|
msgid "Logout"
|
||||||
msgstr "Выйти"
|
msgstr "Выйти"
|
||||||
|
|
||||||
#: templates/base.html:93
|
#: templates/base.html:106
|
||||||
msgid "Sign Up"
|
msgid "Sign Up"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: templates/base.html:144
|
||||||
|
msgid "Become a Patron!"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: templates/registration/password_reset_complete.html:11
|
#: templates/registration/password_reset_complete.html:11
|
||||||
msgid "Your new password has been set."
|
msgid "Your new password has been set."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/registration/password_reset_confirm.html:19
|
#: templates/registration/password_reset_confirm.html:20
|
||||||
msgid "Your password can’t be too similar to your other personal information."
|
msgid "Your password can’t be too similar to your other personal information."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/registration/password_reset_confirm.html:20
|
#: templates/registration/password_reset_confirm.html:21
|
||||||
msgid "Your password must contain at least 8 characters."
|
msgid "Your password must contain at least 8 characters."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/registration/password_reset_confirm.html:21
|
#: templates/registration/password_reset_confirm.html:22
|
||||||
msgid "Your password can’t be a commonly used password."
|
msgid "Your password can’t be a commonly used password."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/registration/password_reset_confirm.html:22
|
#: templates/registration/password_reset_confirm.html:23
|
||||||
msgid "Your password can’t be entirely numeric."
|
msgid "Your password can’t be entirely numeric."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/registration/password_reset_confirm.html:25
|
#: templates/registration/password_reset_confirm.html:26
|
||||||
msgid "Confirm"
|
msgid "Confirm"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/registration/password_reset_confirm.html:27
|
#: templates/registration/password_reset_confirm.html:28
|
||||||
msgid "Submit"
|
msgid "Submit"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/registration/password_reset_done.html:10
|
#: templates/registration/password_reset_done.html:11
|
||||||
msgid ""
|
msgid ""
|
||||||
"We've emailed you instructions for setting your password. You should receive "
|
"We've emailed you instructions for setting your password. You should receive "
|
||||||
"the email shortly!"
|
"the email shortly!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/registration/password_reset_form.html:15
|
#: templates/registration/password_reset_form.html:16
|
||||||
msgid "Reset"
|
msgid "Reset"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
|
@ -0,0 +1,154 @@
|
||||||
|
"""
|
||||||
|
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')),
|
||||||
|
)
|
||||||
|
|
||||||
|
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>'
|
|
@ -32,5 +32,7 @@ urlpatterns += i18n_patterns(
|
||||||
re_path('^accounts/login/', defaults.page_not_found, {'exception': Exception()}),
|
re_path('^accounts/login/', defaults.page_not_found, {'exception': Exception()}),
|
||||||
path('accounts/', include('accounts.urls')),
|
path('accounts/', include('accounts.urls')),
|
||||||
path('accounts/', include('django.contrib.auth.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'))
|
||||||
)
|
)
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
from django.contrib import admin
|
||||||
|
|
||||||
|
# Register your models here.
|
|
@ -0,0 +1,4 @@
|
||||||
|
from django.apps import AppConfig
|
||||||
|
|
||||||
|
class ResourcesConfig(AppConfig):
|
||||||
|
name = 'resources'
|
|
@ -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-02 19:22+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:9
|
||||||
|
#: resources/templates/resources/resources.html:12
|
||||||
|
msgid "What is 42CTF ?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:12
|
||||||
|
msgid "A short introduction to CTF"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:13
|
||||||
|
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:14
|
||||||
|
msgid "The challenges require participants to find sort of passwords called \\"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:17
|
||||||
|
msgid "Functionment of 42CTF"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:18
|
||||||
|
msgid "42CTF is what we call a permanent CTF."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:19
|
||||||
|
msgid "Except from the"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:19
|
||||||
|
msgid "events"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:19
|
||||||
|
msgid "challenges are available on the platform without time limitations."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:20
|
||||||
|
msgid "The registration on 42CTF is open to everyone, 42 students or not."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:21
|
||||||
|
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:24
|
||||||
|
msgid "42CTF Team"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:25
|
||||||
|
msgid "42CTF is managed by 42 students."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:26
|
||||||
|
msgid "You can meet the team on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:27
|
||||||
|
msgid ""
|
||||||
|
"Challenges are created by various contributors, not necessarily 42 students."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:28
|
||||||
|
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:9
|
||||||
|
#: resources/templates/resources/resources.html:28
|
||||||
|
msgid "Create new challenges"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/create_challenge.html:12
|
||||||
|
msgid "If you want to create new challenges for 42CTF, send us a message on "
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/create_challenge.html:13
|
||||||
|
msgid "If your challenge is offline, then you don't have to ask us in advance."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/create_challenge.html:14
|
||||||
|
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:15
|
||||||
|
msgid ""
|
||||||
|
"We may be able to help you or to give you resources such as dockerfiles."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/create_challenge.html:16
|
||||||
|
msgid "We plan to make those resources publicly available in a near future."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:9
|
||||||
|
#: resources/templates/resources/resources.html:31
|
||||||
|
msgid "Donate"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:12
|
||||||
|
msgid "Become a 42CTF member"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:13
|
||||||
|
msgid ""
|
||||||
|
"42CTF is a non-profit organization with a legal status under the french law "
|
||||||
|
"(Association loi 1901)."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:14
|
||||||
|
msgid "You can support us by becoming a member and paying a fee of 15 euros."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:15
|
||||||
|
msgid "Membership is then granted for 1 year."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:17
|
||||||
|
msgid "When you become a member, you gain the following advantages:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:18
|
||||||
|
msgid ""
|
||||||
|
"A different color for your pseudo in the scoreboard, to let everyone know "
|
||||||
|
"you're a member."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:19
|
||||||
|
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:20
|
||||||
|
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:21
|
||||||
|
msgid "Or you didn't play Welcome CTF 2021 because you were not eligible."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:24
|
||||||
|
msgid "More advantages may come later, and you can submit us your ideas."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:25
|
||||||
|
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:28
|
||||||
|
msgid "Donate to 42CTF"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:29
|
||||||
|
msgid ""
|
||||||
|
"You can donate to 42CTF or pay your membership with the following means:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:43
|
||||||
|
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:45
|
||||||
|
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:46
|
||||||
|
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:9
|
||||||
|
#: resources/templates/resources/resources.html:30
|
||||||
|
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/resources.html:10
|
||||||
|
msgid "Getting started"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/resources.html:13
|
||||||
|
#: resources/templates/resources/tools.html:9
|
||||||
|
msgid "Recommended Tools"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/resources.html:20
|
||||||
|
msgid "Technical documentation"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/resources.html:21
|
||||||
|
msgid "No docs available, contact us if you want to write some :)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/resources.html:26
|
||||||
|
msgid "Contribute"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/resources.html:29
|
||||||
|
#: resources/templates/resources/translate.html:9
|
||||||
|
msgid "Translate 42CTF"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/tools.html:12
|
||||||
|
msgid "To get you started, we built a VM that you can simply import in"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/tools.html:12
|
||||||
|
msgid "with a bunch of useful tools."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/tools.html:13
|
||||||
|
msgid "You can dowload this OVA"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/tools.html:13
|
||||||
|
msgid "here"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/tools.html:15
|
||||||
|
msgid "Here are the tools installed on the VM:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/tools.html:24
|
||||||
|
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:25
|
||||||
|
msgid ""
|
||||||
|
"Most of the reverse challenges are ELF binaries and won't run on Mac OS or "
|
||||||
|
"Windows."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/tools.html:27
|
||||||
|
msgid "Additionnaly, you will need the following languages interpreters:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/translate.html:12
|
||||||
|
msgid "42CTF source code is publicly available on this"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/translate.html:13
|
||||||
|
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:14
|
||||||
|
msgid "We have a"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/translate.html:14
|
||||||
|
msgid ""
|
||||||
|
"describing how to translate pages with the Django internalization module."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/translate.html:15
|
||||||
|
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:16
|
||||||
|
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:17
|
||||||
|
msgid "Don't hesitate to reach for help on"
|
||||||
|
msgstr ""
|
|
@ -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-02 19:22+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:9
|
||||||
|
#: resources/templates/resources/resources.html:12
|
||||||
|
msgid "What is 42CTF ?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:12
|
||||||
|
msgid "A short introduction to CTF"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:13
|
||||||
|
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:14
|
||||||
|
msgid "The challenges require participants to find sort of passwords called \\"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:17
|
||||||
|
msgid "Functionment of 42CTF"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:18
|
||||||
|
msgid "42CTF is what we call a permanent CTF."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:19
|
||||||
|
msgid "Except from the"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:19
|
||||||
|
msgid "events"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:19
|
||||||
|
msgid "challenges are available on the platform without time limitations."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:20
|
||||||
|
msgid "The registration on 42CTF is open to everyone, 42 students or not."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:21
|
||||||
|
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:24
|
||||||
|
msgid "42CTF Team"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:25
|
||||||
|
msgid "42CTF is managed by 42 students."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:26
|
||||||
|
msgid "You can meet the team on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:27
|
||||||
|
msgid ""
|
||||||
|
"Challenges are created by various contributors, not necessarily 42 students."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:28
|
||||||
|
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:9
|
||||||
|
#: resources/templates/resources/resources.html:28
|
||||||
|
msgid "Create new challenges"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/create_challenge.html:12
|
||||||
|
msgid "If you want to create new challenges for 42CTF, send us a message on "
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/create_challenge.html:13
|
||||||
|
msgid "If your challenge is offline, then you don't have to ask us in advance."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/create_challenge.html:14
|
||||||
|
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:15
|
||||||
|
msgid ""
|
||||||
|
"We may be able to help you or to give you resources such as dockerfiles."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/create_challenge.html:16
|
||||||
|
msgid "We plan to make those resources publicly available in a near future."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:9
|
||||||
|
#: resources/templates/resources/resources.html:31
|
||||||
|
msgid "Donate"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:12
|
||||||
|
msgid "Become a 42CTF member"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:13
|
||||||
|
msgid ""
|
||||||
|
"42CTF is a non-profit organization with a legal status under the french law "
|
||||||
|
"(Association loi 1901)."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:14
|
||||||
|
msgid "You can support us by becoming a member and paying a fee of 15 euros."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:15
|
||||||
|
msgid "Membership is then granted for 1 year."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:17
|
||||||
|
msgid "When you become a member, you gain the following advantages:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:18
|
||||||
|
msgid ""
|
||||||
|
"A different color for your pseudo in the scoreboard, to let everyone know "
|
||||||
|
"you're a member."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:19
|
||||||
|
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:20
|
||||||
|
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:21
|
||||||
|
msgid "Or you didn't play Welcome CTF 2021 because you were not eligible."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:24
|
||||||
|
msgid "More advantages may come later, and you can submit us your ideas."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:25
|
||||||
|
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:28
|
||||||
|
msgid "Donate to 42CTF"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:29
|
||||||
|
msgid ""
|
||||||
|
"You can donate to 42CTF or pay your membership with the following means:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:43
|
||||||
|
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:45
|
||||||
|
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:46
|
||||||
|
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:9
|
||||||
|
#: resources/templates/resources/resources.html:30
|
||||||
|
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/resources.html:10
|
||||||
|
msgid "Getting started"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/resources.html:13
|
||||||
|
#: resources/templates/resources/tools.html:9
|
||||||
|
msgid "Recommended Tools"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/resources.html:20
|
||||||
|
msgid "Technical documentation"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/resources.html:21
|
||||||
|
msgid "No docs available, contact us if you want to write some :)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/resources.html:26
|
||||||
|
msgid "Contribute"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/resources.html:29
|
||||||
|
#: resources/templates/resources/translate.html:9
|
||||||
|
msgid "Translate 42CTF"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/tools.html:12
|
||||||
|
msgid "To get you started, we built a VM that you can simply import in"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/tools.html:12
|
||||||
|
msgid "with a bunch of useful tools."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/tools.html:13
|
||||||
|
msgid "You can dowload this OVA"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/tools.html:13
|
||||||
|
msgid "here"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/tools.html:15
|
||||||
|
msgid "Here are the tools installed on the VM:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/tools.html:24
|
||||||
|
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:25
|
||||||
|
msgid ""
|
||||||
|
"Most of the reverse challenges are ELF binaries and won't run on Mac OS or "
|
||||||
|
"Windows."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/tools.html:27
|
||||||
|
msgid "Additionnaly, you will need the following languages interpreters:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/translate.html:12
|
||||||
|
msgid "42CTF source code is publicly available on this"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/translate.html:13
|
||||||
|
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:14
|
||||||
|
msgid "We have a"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/translate.html:14
|
||||||
|
msgid ""
|
||||||
|
"describing how to translate pages with the Django internalization module."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/translate.html:15
|
||||||
|
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:16
|
||||||
|
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:17
|
||||||
|
msgid "Don't hesitate to reach for help on"
|
||||||
|
msgstr ""
|
|
@ -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-02 19:22+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:9
|
||||||
|
#: resources/templates/resources/resources.html:12
|
||||||
|
msgid "What is 42CTF ?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:12
|
||||||
|
msgid "A short introduction to CTF"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:13
|
||||||
|
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:14
|
||||||
|
msgid "The challenges require participants to find sort of passwords called \\"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:17
|
||||||
|
msgid "Functionment of 42CTF"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:18
|
||||||
|
msgid "42CTF is what we call a permanent CTF."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:19
|
||||||
|
msgid "Except from the"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:19
|
||||||
|
msgid "events"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:19
|
||||||
|
msgid "challenges are available on the platform without time limitations."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:20
|
||||||
|
msgid "The registration on 42CTF is open to everyone, 42 students or not."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:21
|
||||||
|
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:24
|
||||||
|
msgid "42CTF Team"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:25
|
||||||
|
msgid "42CTF is managed by 42 students."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:26
|
||||||
|
msgid "You can meet the team on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:27
|
||||||
|
msgid ""
|
||||||
|
"Challenges are created by various contributors, not necessarily 42 students."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:28
|
||||||
|
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:9
|
||||||
|
#: resources/templates/resources/resources.html:28
|
||||||
|
msgid "Create new challenges"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/create_challenge.html:12
|
||||||
|
msgid "If you want to create new challenges for 42CTF, send us a message on "
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/create_challenge.html:13
|
||||||
|
msgid "If your challenge is offline, then you don't have to ask us in advance."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/create_challenge.html:14
|
||||||
|
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:15
|
||||||
|
msgid ""
|
||||||
|
"We may be able to help you or to give you resources such as dockerfiles."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/create_challenge.html:16
|
||||||
|
msgid "We plan to make those resources publicly available in a near future."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:9
|
||||||
|
#: resources/templates/resources/resources.html:31
|
||||||
|
msgid "Donate"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:12
|
||||||
|
msgid "Become a 42CTF member"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:13
|
||||||
|
msgid ""
|
||||||
|
"42CTF is a non-profit organization with a legal status under the french law "
|
||||||
|
"(Association loi 1901)."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:14
|
||||||
|
msgid "You can support us by becoming a member and paying a fee of 15 euros."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:15
|
||||||
|
msgid "Membership is then granted for 1 year."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:17
|
||||||
|
msgid "When you become a member, you gain the following advantages:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:18
|
||||||
|
msgid ""
|
||||||
|
"A different color for your pseudo in the scoreboard, to let everyone know "
|
||||||
|
"you're a member."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:19
|
||||||
|
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:20
|
||||||
|
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:21
|
||||||
|
msgid "Or you didn't play Welcome CTF 2021 because you were not eligible."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:24
|
||||||
|
msgid "More advantages may come later, and you can submit us your ideas."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:25
|
||||||
|
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:28
|
||||||
|
msgid "Donate to 42CTF"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:29
|
||||||
|
msgid ""
|
||||||
|
"You can donate to 42CTF or pay your membership with the following means:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:43
|
||||||
|
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:45
|
||||||
|
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:46
|
||||||
|
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:9
|
||||||
|
#: resources/templates/resources/resources.html:30
|
||||||
|
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/resources.html:10
|
||||||
|
msgid "Getting started"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/resources.html:13
|
||||||
|
#: resources/templates/resources/tools.html:9
|
||||||
|
msgid "Recommended Tools"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/resources.html:20
|
||||||
|
msgid "Technical documentation"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/resources.html:21
|
||||||
|
msgid "No docs available, contact us if you want to write some :)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/resources.html:26
|
||||||
|
msgid "Contribute"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/resources.html:29
|
||||||
|
#: resources/templates/resources/translate.html:9
|
||||||
|
msgid "Translate 42CTF"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/tools.html:12
|
||||||
|
msgid "To get you started, we built a VM that you can simply import in"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/tools.html:12
|
||||||
|
msgid "with a bunch of useful tools."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/tools.html:13
|
||||||
|
msgid "You can dowload this OVA"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/tools.html:13
|
||||||
|
msgid "here"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/tools.html:15
|
||||||
|
msgid "Here are the tools installed on the VM:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/tools.html:24
|
||||||
|
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:25
|
||||||
|
msgid ""
|
||||||
|
"Most of the reverse challenges are ELF binaries and won't run on Mac OS or "
|
||||||
|
"Windows."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/tools.html:27
|
||||||
|
msgid "Additionnaly, you will need the following languages interpreters:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/translate.html:12
|
||||||
|
msgid "42CTF source code is publicly available on this"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/translate.html:13
|
||||||
|
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:14
|
||||||
|
msgid "We have a"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/translate.html:14
|
||||||
|
msgid ""
|
||||||
|
"describing how to translate pages with the Django internalization module."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/translate.html:15
|
||||||
|
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:16
|
||||||
|
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:17
|
||||||
|
msgid "Don't hesitate to reach for help on"
|
||||||
|
msgstr ""
|
|
@ -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-02 19:22+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:9
|
||||||
|
#: resources/templates/resources/resources.html:12
|
||||||
|
msgid "What is 42CTF ?"
|
||||||
|
msgstr "Qu'est ce que 42CTF ?"
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:12
|
||||||
|
msgid "A short introduction to CTF"
|
||||||
|
msgstr "Une brève introduction aux CTF"
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:13
|
||||||
|
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:14
|
||||||
|
msgid "The challenges require participants to find sort of passwords called \\"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:17
|
||||||
|
msgid "Functionment of 42CTF"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:18
|
||||||
|
msgid "42CTF is what we call a permanent CTF."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:19
|
||||||
|
msgid "Except from the"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:19
|
||||||
|
msgid "events"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:19
|
||||||
|
msgid "challenges are available on the platform without time limitations."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:20
|
||||||
|
msgid "The registration on 42CTF is open to everyone, 42 students or not."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:21
|
||||||
|
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:24
|
||||||
|
msgid "42CTF Team"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:25
|
||||||
|
msgid "42CTF is managed by 42 students."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:26
|
||||||
|
msgid "You can meet the team on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:27
|
||||||
|
msgid ""
|
||||||
|
"Challenges are created by various contributors, not necessarily 42 students."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:28
|
||||||
|
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:9
|
||||||
|
#: resources/templates/resources/resources.html:28
|
||||||
|
msgid "Create new challenges"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/create_challenge.html:12
|
||||||
|
msgid "If you want to create new challenges for 42CTF, send us a message on "
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/create_challenge.html:13
|
||||||
|
msgid "If your challenge is offline, then you don't have to ask us in advance."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/create_challenge.html:14
|
||||||
|
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:15
|
||||||
|
msgid ""
|
||||||
|
"We may be able to help you or to give you resources such as dockerfiles."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/create_challenge.html:16
|
||||||
|
msgid "We plan to make those resources publicly available in a near future."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:9
|
||||||
|
#: resources/templates/resources/resources.html:31
|
||||||
|
msgid "Donate"
|
||||||
|
msgstr "Donner"
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:12
|
||||||
|
msgid "Become a 42CTF member"
|
||||||
|
msgstr "Devenez membre de 42CTF"
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:13
|
||||||
|
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:14
|
||||||
|
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:15
|
||||||
|
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:17
|
||||||
|
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:18
|
||||||
|
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:19
|
||||||
|
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:20
|
||||||
|
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:21
|
||||||
|
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:24
|
||||||
|
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:25
|
||||||
|
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:28
|
||||||
|
msgid "Donate to 42CTF"
|
||||||
|
msgstr "Donnez à 42CTF"
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:29
|
||||||
|
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:43
|
||||||
|
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:45
|
||||||
|
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:46
|
||||||
|
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:9
|
||||||
|
#: resources/templates/resources/resources.html:30
|
||||||
|
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/resources.html:10
|
||||||
|
msgid "Getting started"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/resources.html:13
|
||||||
|
#: resources/templates/resources/tools.html:9
|
||||||
|
msgid "Recommended Tools"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/resources.html:20
|
||||||
|
msgid "Technical documentation"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/resources.html:21
|
||||||
|
msgid "No docs available, contact us if you want to write some :)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/resources.html:26
|
||||||
|
msgid "Contribute"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/resources.html:29
|
||||||
|
#: resources/templates/resources/translate.html:9
|
||||||
|
msgid "Translate 42CTF"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/tools.html:12
|
||||||
|
msgid "To get you started, we built a VM that you can simply import in"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/tools.html:12
|
||||||
|
msgid "with a bunch of useful tools."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/tools.html:13
|
||||||
|
msgid "You can dowload this OVA"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/tools.html:13
|
||||||
|
msgid "here"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/tools.html:15
|
||||||
|
msgid "Here are the tools installed on the VM:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/tools.html:24
|
||||||
|
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:25
|
||||||
|
msgid ""
|
||||||
|
"Most of the reverse challenges are ELF binaries and won't run on Mac OS or "
|
||||||
|
"Windows."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/tools.html:27
|
||||||
|
msgid "Additionnaly, you will need the following languages interpreters:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/translate.html:12
|
||||||
|
msgid "42CTF source code is publicly available on this"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/translate.html:13
|
||||||
|
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:14
|
||||||
|
msgid "We have a"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/translate.html:14
|
||||||
|
msgid ""
|
||||||
|
"describing how to translate pages with the Django internalization module."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/translate.html:15
|
||||||
|
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:16
|
||||||
|
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:17
|
||||||
|
msgid "Don't hesitate to reach for help on"
|
||||||
|
msgstr ""
|
|
@ -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-02 19:22+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:9
|
||||||
|
#: resources/templates/resources/resources.html:12
|
||||||
|
msgid "What is 42CTF ?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:12
|
||||||
|
msgid "A short introduction to CTF"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:13
|
||||||
|
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:14
|
||||||
|
msgid "The challenges require participants to find sort of passwords called \\"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:17
|
||||||
|
msgid "Functionment of 42CTF"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:18
|
||||||
|
msgid "42CTF is what we call a permanent CTF."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:19
|
||||||
|
msgid "Except from the"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:19
|
||||||
|
msgid "events"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:19
|
||||||
|
msgid "challenges are available on the platform without time limitations."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:20
|
||||||
|
msgid "The registration on 42CTF is open to everyone, 42 students or not."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:21
|
||||||
|
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:24
|
||||||
|
msgid "42CTF Team"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:25
|
||||||
|
msgid "42CTF is managed by 42 students."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:26
|
||||||
|
msgid "You can meet the team on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:27
|
||||||
|
msgid ""
|
||||||
|
"Challenges are created by various contributors, not necessarily 42 students."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:28
|
||||||
|
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:9
|
||||||
|
#: resources/templates/resources/resources.html:28
|
||||||
|
msgid "Create new challenges"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/create_challenge.html:12
|
||||||
|
msgid "If you want to create new challenges for 42CTF, send us a message on "
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/create_challenge.html:13
|
||||||
|
msgid "If your challenge is offline, then you don't have to ask us in advance."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/create_challenge.html:14
|
||||||
|
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:15
|
||||||
|
msgid ""
|
||||||
|
"We may be able to help you or to give you resources such as dockerfiles."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/create_challenge.html:16
|
||||||
|
msgid "We plan to make those resources publicly available in a near future."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:9
|
||||||
|
#: resources/templates/resources/resources.html:31
|
||||||
|
msgid "Donate"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:12
|
||||||
|
msgid "Become a 42CTF member"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:13
|
||||||
|
msgid ""
|
||||||
|
"42CTF is a non-profit organization with a legal status under the french law "
|
||||||
|
"(Association loi 1901)."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:14
|
||||||
|
msgid "You can support us by becoming a member and paying a fee of 15 euros."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:15
|
||||||
|
msgid "Membership is then granted for 1 year."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:17
|
||||||
|
msgid "When you become a member, you gain the following advantages:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:18
|
||||||
|
msgid ""
|
||||||
|
"A different color for your pseudo in the scoreboard, to let everyone know "
|
||||||
|
"you're a member."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:19
|
||||||
|
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:20
|
||||||
|
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:21
|
||||||
|
msgid "Or you didn't play Welcome CTF 2021 because you were not eligible."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:24
|
||||||
|
msgid "More advantages may come later, and you can submit us your ideas."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:25
|
||||||
|
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:28
|
||||||
|
msgid "Donate to 42CTF"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:29
|
||||||
|
msgid ""
|
||||||
|
"You can donate to 42CTF or pay your membership with the following means:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:43
|
||||||
|
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:45
|
||||||
|
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:46
|
||||||
|
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:9
|
||||||
|
#: resources/templates/resources/resources.html:30
|
||||||
|
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/resources.html:10
|
||||||
|
msgid "Getting started"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/resources.html:13
|
||||||
|
#: resources/templates/resources/tools.html:9
|
||||||
|
msgid "Recommended Tools"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/resources.html:20
|
||||||
|
msgid "Technical documentation"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/resources.html:21
|
||||||
|
msgid "No docs available, contact us if you want to write some :)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/resources.html:26
|
||||||
|
msgid "Contribute"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/resources.html:29
|
||||||
|
#: resources/templates/resources/translate.html:9
|
||||||
|
msgid "Translate 42CTF"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/tools.html:12
|
||||||
|
msgid "To get you started, we built a VM that you can simply import in"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/tools.html:12
|
||||||
|
msgid "with a bunch of useful tools."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/tools.html:13
|
||||||
|
msgid "You can dowload this OVA"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/tools.html:13
|
||||||
|
msgid "here"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/tools.html:15
|
||||||
|
msgid "Here are the tools installed on the VM:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/tools.html:24
|
||||||
|
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:25
|
||||||
|
msgid ""
|
||||||
|
"Most of the reverse challenges are ELF binaries and won't run on Mac OS or "
|
||||||
|
"Windows."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/tools.html:27
|
||||||
|
msgid "Additionnaly, you will need the following languages interpreters:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/translate.html:12
|
||||||
|
msgid "42CTF source code is publicly available on this"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/translate.html:13
|
||||||
|
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:14
|
||||||
|
msgid "We have a"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/translate.html:14
|
||||||
|
msgid ""
|
||||||
|
"describing how to translate pages with the Django internalization module."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/translate.html:15
|
||||||
|
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:16
|
||||||
|
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:17
|
||||||
|
msgid "Don't hesitate to reach for help on"
|
||||||
|
msgstr ""
|
|
@ -0,0 +1,319 @@
|
||||||
|
# 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-02 19:22+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:9
|
||||||
|
#: resources/templates/resources/resources.html:12
|
||||||
|
msgid "What is 42CTF ?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:12
|
||||||
|
msgid "A short introduction to CTF"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:13
|
||||||
|
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:14
|
||||||
|
msgid "The challenges require participants to find sort of passwords called \\"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:17
|
||||||
|
msgid "Functionment of 42CTF"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:18
|
||||||
|
msgid "42CTF is what we call a permanent CTF."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:19
|
||||||
|
msgid "Except from the"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:19
|
||||||
|
msgid "events"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:19
|
||||||
|
msgid "challenges are available on the platform without time limitations."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:20
|
||||||
|
msgid "The registration on 42CTF is open to everyone, 42 students or not."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:21
|
||||||
|
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:24
|
||||||
|
msgid "42CTF Team"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:25
|
||||||
|
msgid "42CTF is managed by 42 students."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:26
|
||||||
|
msgid "You can meet the team on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:27
|
||||||
|
msgid ""
|
||||||
|
"Challenges are created by various contributors, not necessarily 42 students."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/42ctf.html:28
|
||||||
|
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:9
|
||||||
|
#: resources/templates/resources/resources.html:28
|
||||||
|
msgid "Create new challenges"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/create_challenge.html:12
|
||||||
|
msgid "If you want to create new challenges for 42CTF, send us a message on "
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/create_challenge.html:13
|
||||||
|
msgid "If your challenge is offline, then you don't have to ask us in advance."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/create_challenge.html:14
|
||||||
|
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:15
|
||||||
|
msgid ""
|
||||||
|
"We may be able to help you or to give you resources such as dockerfiles."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/create_challenge.html:16
|
||||||
|
msgid "We plan to make those resources publicly available in a near future."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:9
|
||||||
|
#: resources/templates/resources/resources.html:31
|
||||||
|
msgid "Donate"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:12
|
||||||
|
msgid "Become a 42CTF member"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:13
|
||||||
|
msgid ""
|
||||||
|
"42CTF is a non-profit organization with a legal status under the french law "
|
||||||
|
"(Association loi 1901)."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:14
|
||||||
|
msgid "You can support us by becoming a member and paying a fee of 15 euros."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:15
|
||||||
|
msgid "Membership is then granted for 1 year."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:17
|
||||||
|
msgid "When you become a member, you gain the following advantages:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:18
|
||||||
|
msgid ""
|
||||||
|
"A different color for your pseudo in the scoreboard, to let everyone know "
|
||||||
|
"you're a member."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:19
|
||||||
|
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:20
|
||||||
|
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:21
|
||||||
|
msgid "Or you didn't play Welcome CTF 2021 because you were not eligible."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:24
|
||||||
|
msgid "More advantages may come later, and you can submit us your ideas."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:25
|
||||||
|
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:28
|
||||||
|
msgid "Donate to 42CTF"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:29
|
||||||
|
msgid ""
|
||||||
|
"You can donate to 42CTF or pay your membership with the following means:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/donate.html:43
|
||||||
|
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:45
|
||||||
|
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:46
|
||||||
|
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:9
|
||||||
|
#: resources/templates/resources/resources.html:30
|
||||||
|
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/resources.html:10
|
||||||
|
msgid "Getting started"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/resources.html:13
|
||||||
|
#: resources/templates/resources/tools.html:9
|
||||||
|
msgid "Recommended Tools"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/resources.html:20
|
||||||
|
msgid "Technical documentation"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/resources.html:21
|
||||||
|
msgid "No docs available, contact us if you want to write some :)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/resources.html:26
|
||||||
|
msgid "Contribute"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/resources.html:29
|
||||||
|
#: resources/templates/resources/translate.html:9
|
||||||
|
msgid "Translate 42CTF"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/tools.html:12
|
||||||
|
msgid "To get you started, we built a VM that you can simply import in"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/tools.html:12
|
||||||
|
msgid "with a bunch of useful tools."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/tools.html:13
|
||||||
|
msgid "You can dowload this OVA"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/tools.html:13
|
||||||
|
msgid "here"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/tools.html:15
|
||||||
|
msgid "Here are the tools installed on the VM:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/tools.html:24
|
||||||
|
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:25
|
||||||
|
msgid ""
|
||||||
|
"Most of the reverse challenges are ELF binaries and won't run on Mac OS or "
|
||||||
|
"Windows."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/tools.html:27
|
||||||
|
msgid "Additionnaly, you will need the following languages interpreters:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/translate.html:12
|
||||||
|
msgid "42CTF source code is publicly available on this"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/translate.html:13
|
||||||
|
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:14
|
||||||
|
msgid "We have a"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/translate.html:14
|
||||||
|
msgid ""
|
||||||
|
"describing how to translate pages with the Django internalization module."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/templates/resources/translate.html:15
|
||||||
|
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:16
|
||||||
|
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:17
|
||||||
|
msgid "Don't hesitate to reach for help on"
|
||||||
|
msgstr ""
|
|
@ -0,0 +1,3 @@
|
||||||
|
from django.db import models
|
||||||
|
|
||||||
|
# Create your models here.
|
|
@ -0,0 +1,34 @@
|
||||||
|
{% extends 'base.html' %}
|
||||||
|
{% block content %}
|
||||||
|
{% load i18n %}
|
||||||
|
{% get_current_language as lang %}
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-12 col-md-9">
|
||||||
|
<div class="ctf-block">
|
||||||
|
<div class="ctf-head">
|
||||||
|
<h3>{% trans "What is 42CTF ?" %}</h3>
|
||||||
|
</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>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
|
@ -0,0 +1,22 @@
|
||||||
|
{% extends 'base.html' %}
|
||||||
|
{% block content %}
|
||||||
|
{% load i18n %}
|
||||||
|
{% get_current_language as lang %}
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-12 col-md-9">
|
||||||
|
<div class="ctf-block">
|
||||||
|
<div class="ctf-head">
|
||||||
|
<h3>{% trans "Create new challenges" %}</h3>
|
||||||
|
</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>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
|
@ -0,0 +1,53 @@
|
||||||
|
{% extends 'base.html' %}
|
||||||
|
{% block content %}
|
||||||
|
{% load i18n %}
|
||||||
|
{% get_current_language as lang %}
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-12 col-md-9">
|
||||||
|
<div class="ctf-block">
|
||||||
|
<div class="ctf-head">
|
||||||
|
<h3>{% trans "Donate" %}</h3>
|
||||||
|
</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>
|
||||||
|
|
||||||
|
<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">
|
||||||
|
</a><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>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
|
@ -0,0 +1,18 @@
|
||||||
|
{% extends 'base.html' %}
|
||||||
|
{% block content %}
|
||||||
|
{% load i18n %}
|
||||||
|
{% get_current_language as lang %}
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-12 col-md-9">
|
||||||
|
<div class="ctf-block">
|
||||||
|
<div class="ctf-head">
|
||||||
|
<h3>{% trans "Edit this page" %}</h3>
|
||||||
|
</div>
|
||||||
|
<div class="ctf-body">
|
||||||
|
{% 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> ;)
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
|
@ -0,0 +1,40 @@
|
||||||
|
{% extends 'base.html' %}
|
||||||
|
{% block content %}
|
||||||
|
{% load i18n %}
|
||||||
|
{% get_current_language as lang %}
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-lg-9 col-sm-12 news-card">
|
||||||
|
|
||||||
|
<div class="card news-card">
|
||||||
|
<ul class="list-group">
|
||||||
|
<li class="list-group-item active">{% trans "Getting started" %}</li>
|
||||||
|
<li class="list-group-item">
|
||||||
|
<a href="{% url 'resources:42ctf' %}">{% trans "What is 42CTF ?" %}</a></br>
|
||||||
|
<a href="{% url 'resources:tools' %}">{% trans "Recommended Tools" %}</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card news-card">
|
||||||
|
<ul class="list-group">
|
||||||
|
<li class="list-group-item active">{% trans "Technical documentation" %}</li>
|
||||||
|
<li class="list-group-item">{% trans "No docs available, contact us if you want to write some :)" %}</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="card news-card">
|
||||||
|
<ul class="list-group">
|
||||||
|
<li class="list-group-item active">{% trans "Contribute" %}</li>
|
||||||
|
<li class="list-group-item">
|
||||||
|
<a href="{% url 'resources:create_challenge' %}">{% trans "Create new challenges" %}</a></br>
|
||||||
|
<a href="{% url 'resources:translate' %}">{% trans "Translate 42CTF" %}</a></br>
|
||||||
|
<a href="{% url 'resources:edit' %}">{% trans "Edit this page" %}</a></br>
|
||||||
|
<a href="{% url 'resources:donate' %}">{% trans "Donate" %}</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
|
|
|
@ -0,0 +1,35 @@
|
||||||
|
{% extends 'base.html' %}
|
||||||
|
{% block content %}
|
||||||
|
{% load i18n %}
|
||||||
|
{% get_current_language as lang %}
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-12 col-md-9">
|
||||||
|
<div class="ctf-block">
|
||||||
|
<div class="ctf-head">
|
||||||
|
<h3>{% trans "Recommended Tools" %}</h3>
|
||||||
|
</div>
|
||||||
|
<div class="ctf-body">
|
||||||
|
{% trans "To get you started, we built a VM that you can simply import in" %} <a href="https://www.virtualbox.org/wiki/Downloads">Virtual Box</a> {% trans "with a bunch of useful tools." %}<br>
|
||||||
|
{% trans "You can dowload this OVA" %} <a href="/media/xubuntu-42ctf.ova">{% trans "here" %}</a>.<br>
|
||||||
|
<br>
|
||||||
|
{% trans "Here are the tools installed on the VM:" %}<br>
|
||||||
|
- <a href="https://github.com/exiftool/exiftool">exiftool</a></br>
|
||||||
|
- <a href="https://portswigger.net/burp/communitydownload">burp</a></br>
|
||||||
|
- <a href="https://cutter.re">cutter</a></br>
|
||||||
|
- <a href="https://github.com/ReFirmLabs/binwalk">binwalk</a></br>
|
||||||
|
- <a href="https://rada.re">r2</a></br>
|
||||||
|
- <a href="https://gef.readthedocs.io/en/master/">gdb/gef</a></br>
|
||||||
|
- qemu-user</br>
|
||||||
|
<br>
|
||||||
|
{% trans "If you want to solve the challenges on your own machine, we recommend you to use a Linux operating system."%}
|
||||||
|
{% trans "Most of the reverse challenges are ELF binaries and won't run on Mac OS or Windows." %}<br><br>
|
||||||
|
|
||||||
|
{% trans "Additionnaly, you will need the following languages interpreters:" %}<br>
|
||||||
|
- python3<br>
|
||||||
|
- lua<br>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
|
@ -0,0 +1,23 @@
|
||||||
|
{% extends 'base.html' %}
|
||||||
|
{% block content %}
|
||||||
|
{% load i18n %}
|
||||||
|
{% get_current_language as lang %}
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-12 col-md-9">
|
||||||
|
<div class="ctf-block">
|
||||||
|
<div class="ctf-head">
|
||||||
|
<h3>{% trans "Translate 42CTF" %}</h3>
|
||||||
|
</div>
|
||||||
|
<div class="ctf-body">
|
||||||
|
{% trans "42CTF source code is publicly available on this"%} <a href="https://github.com/Danhia/42CTF/">github</a>.<br>
|
||||||
|
{% trans "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." %}<br><br>
|
||||||
|
{% trans "We have a" %} <a href="https://github.com/Danhia/42CTF/wiki/Internationalization">wiki</a> {% trans "describing how to translate pages with the Django internalization module." %}<br>
|
||||||
|
{% trans "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 ;)" %}
|
||||||
|
{% trans "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." %}<br><br>
|
||||||
|
{% trans "Don't hesitate to reach for help on" %} <a class="footer_imgs" href="https://discord.gg/DwZqPpA" target="_blank"><img src="/static/img/discord.png" width="30"></a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
|
@ -0,0 +1,3 @@
|
||||||
|
from django.test import TestCase
|
||||||
|
|
||||||
|
# Create your tests here.
|
|
@ -0,0 +1,14 @@
|
||||||
|
from django.urls import path
|
||||||
|
from . import views
|
||||||
|
|
||||||
|
app_name = "resources"
|
||||||
|
|
||||||
|
urlpatterns = [
|
||||||
|
path('', views.resources, name='resources'),
|
||||||
|
path('42ctf', views.ctf42, name='42ctf'),
|
||||||
|
path('tools', views.tools, name='tools'),
|
||||||
|
path('create_challenge', views.create_challenge, name='create_challenge'),
|
||||||
|
path('translate', views.translate, name='translate'),
|
||||||
|
path('edit', views.edit, name='edit'),
|
||||||
|
path('donate', views.donate, name='donate'),
|
||||||
|
]
|
|
@ -0,0 +1,26 @@
|
||||||
|
from django.shortcuts import render
|
||||||
|
from django.core.paginator import Paginator
|
||||||
|
from accounts.models import UserProfileInfo
|
||||||
|
|
||||||
|
# Create your views here.
|
||||||
|
|
||||||
|
def resources(request):
|
||||||
|
return render(request, 'resources/resources.html')
|
||||||
|
|
||||||
|
def ctf42(request):
|
||||||
|
return render(request, 'resources/42ctf.html')
|
||||||
|
|
||||||
|
def tools(request):
|
||||||
|
return render(request, 'resources/tools.html')
|
||||||
|
|
||||||
|
def create_challenge(request):
|
||||||
|
return render(request, 'resources/create_challenge.html')
|
||||||
|
|
||||||
|
def translate(request):
|
||||||
|
return render(request, 'resources/translate.html')
|
||||||
|
|
||||||
|
def edit(request):
|
||||||
|
return render(request, 'resources/edit.html')
|
||||||
|
|
||||||
|
def donate(request):
|
||||||
|
return render(request, 'resources/donate.html')
|
|
@ -1,38 +1,24 @@
|
||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
from django.core.management.base import BaseCommand, CommandError
|
from django.core.management.base import BaseCommand, CommandError
|
||||||
from accounts import models as acc_models
|
from accounts.models import UserProfileInfo
|
||||||
from ctfs import models as ex_models
|
from ctfs import models as ex_models
|
||||||
|
|
||||||
class Command(BaseCommand):
|
class Command(BaseCommand):
|
||||||
help = 'Recomputes the score and ranking caches from the solutions'
|
help = 'Recomputes the score cache from the solutions'
|
||||||
|
|
||||||
def handle(self, *args, **options):
|
def handle(self, *args, **options):
|
||||||
all_sols = ex_models.CTF_flags.objects.select_related().all()
|
all_sols = ex_models.CTF_flags.objects.select_related().filter(ctf__event=None, ctf__disabled=False)
|
||||||
|
all_users = UserProfileInfo.objects.all()
|
||||||
|
|
||||||
scores = defaultdict(int)
|
scores = defaultdict(int)
|
||||||
for sol in all_sols:
|
for sol in all_sols:
|
||||||
scores[sol.user] += sol.ctf.points
|
scores[sol.user] += sol.ctf.points
|
||||||
li = [(s, u) for (u, s) in scores.items()]
|
|
||||||
# #li.sort(reverse=True)
|
|
||||||
|
|
||||||
li2 = []
|
for u in all_users:
|
||||||
old_rank = None
|
if u.user not in scores.keys():
|
||||||
old_score = None
|
u.score = 0
|
||||||
rank = 0
|
u.save()
|
||||||
for (s, u) in li:
|
|
||||||
rank += 1
|
|
||||||
if s == old_score:
|
|
||||||
li2.append((u, s, old_rank))
|
|
||||||
else:
|
|
||||||
old_score = s
|
|
||||||
old_rank = rank
|
|
||||||
li2.append((u, s, rank))
|
|
||||||
|
|
||||||
for (u, s, r) in li2:
|
for u in scores:
|
||||||
u.userprofileinfo.score = s
|
u.userprofileinfo.score = scores[u]
|
||||||
# u.userprofileinfo.rank = r
|
|
||||||
u.userprofileinfo.save()
|
u.userprofileinfo.save()
|
||||||
|
|
||||||
# not_handled = acc_models.UserProfileInfo.objects.exclude(
|
|
||||||
# id__in=[u.id for u, s, r in li2]
|
|
||||||
# )
|
|
||||||
# not_handled.update(score=0, rank=rank+1)
|
|
||||||
|
|
|
@ -1,54 +1,56 @@
|
||||||
{% extends 'base.html' %}
|
{% extends 'base.html' %}
|
||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
|
{% load is_member %}
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<div>
|
<div>
|
||||||
<h4>Scoreboard</h4>
|
<h4>Scoreboard</h4>
|
||||||
<table class="table table-dark">
|
<table class="table table-dark">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th scope="col">{% trans "Rank" %}</th>
|
<th scope="col">{% trans "Rank" %}</th>
|
||||||
<th scope="col">{% trans "Username" %}</th>
|
<th scope="col">{% trans "Username" %}</th>
|
||||||
<th scope="col">{% trans "Website" %}</th>
|
<th scope="col">{% trans "Website" %}</th>
|
||||||
<th scope="col">{% trans "Score" %}</th>
|
<th scope="col">{% trans "Score" %}</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{% for s in scores %}
|
{% for s in scores %}
|
||||||
<tr>
|
{% ismember s.user.userprofileinfo as is_member %}
|
||||||
<th scope="row"># {{ forloop.counter0|add:scores.start_index }}</th>
|
<tr>
|
||||||
<th><a class="profile_link" href="/accounts/profile/{{ s.user.username }}"> {{ s.user.username }}</a></th>
|
<th scope="row"># {{ forloop.counter0|add:scores.start_index }}</th>
|
||||||
<td>
|
<th><a class="profile_link {{is_member}}" href="{% url 'accounts:profile' user_name=s.user.username %}"> {{ s.user.username }}</a></th>
|
||||||
{% if s.user.userprofileinfo.portfolio_site %}
|
<td>
|
||||||
<a href="{{ s.user.userprofileinfo.portfolio_site }}" target="_blank">{{ s.user.userprofileinfo.portfolio_site }}</a>
|
{% if s.user.userprofileinfo.portfolio_site %}
|
||||||
{% endif %}
|
<a href="{{ s.user.userprofileinfo.portfolio_site }}" target="_blank">{{ s.user.userprofileinfo.portfolio_site }}</a>
|
||||||
</td>
|
{% endif %}
|
||||||
<td>{{ s.user.userprofileinfo.score }}</td>
|
</td>
|
||||||
|
<td>{{ s.user.userprofileinfo.score }}</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
<div class="pagination">
|
<div class="pagination">
|
||||||
<span class="step-links">
|
<span class="step-links">
|
||||||
{% if scores.has_previous %}
|
{% if scores.has_previous %}
|
||||||
<a href="?page=1">« {% trans "First" %}</a>
|
<a href="?page=1">« {% trans "First" %}</a>
|
||||||
<a href="?page={{ scores.previous_page_number }}">{% trans "Previous" %}</a>
|
<a href="?page={{ scores.previous_page_number }}">{% trans "Previous" %}</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
<span class="current">
|
<span class="current">
|
||||||
{% trans "Page "%} {{ scores.number }} / {{ scores.paginator.num_pages }}.
|
{% trans "Page "%} {{ scores.number }} / {{ scores.paginator.num_pages }}.
|
||||||
|
</span>
|
||||||
|
|
||||||
|
{% if scores.has_next %}
|
||||||
|
<a href="?page={{ scores.next_page_number }}">{% trans "Next" %}</a>
|
||||||
|
<a href="?page={{ scores.paginator.num_pages }}">{% trans "Last" %}»</a>
|
||||||
|
{% endif %}
|
||||||
</span>
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
{% if scores.has_next %}
|
</div>
|
||||||
<a href="?page={{ scores.next_page_number }}">{% trans "Next" %}</a>
|
|
||||||
<a href="?page={{ scores.paginator.num_pages }}">{% trans "Last" %}»</a>
|
|
||||||
{% endif %}
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
from django import template
|
||||||
|
from django.contrib.auth.models import timezone
|
||||||
|
|
||||||
|
register = template.Library()
|
||||||
|
|
||||||
|
@register.simple_tag
|
||||||
|
def ismember(user):
|
||||||
|
if user.member and user.member_until > timezone.now():
|
||||||
|
return "is-member"
|
||||||
|
return ""
|
|
@ -14,7 +14,7 @@ select.admin-autocomplete {
|
||||||
|
|
||||||
.select2-container--admin-autocomplete.select2-container--focus .select2-selection,
|
.select2-container--admin-autocomplete.select2-container--focus .select2-selection,
|
||||||
.select2-container--admin-autocomplete.select2-container--open .select2-selection {
|
.select2-container--admin-autocomplete.select2-container--open .select2-selection {
|
||||||
border-color: #999;
|
border-color: var(--body-quiet-color);
|
||||||
min-height: 30px;
|
min-height: 30px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -29,13 +29,13 @@ select.admin-autocomplete {
|
||||||
}
|
}
|
||||||
|
|
||||||
.select2-container--admin-autocomplete .select2-selection--single {
|
.select2-container--admin-autocomplete .select2-selection--single {
|
||||||
background-color: #fff;
|
background-color: var(--body-bg);
|
||||||
border: 1px solid #ccc;
|
border: 1px solid var(--border-color);
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.select2-container--admin-autocomplete .select2-selection--single .select2-selection__rendered {
|
.select2-container--admin-autocomplete .select2-selection--single .select2-selection__rendered {
|
||||||
color: #444;
|
color: var(--body-fg);
|
||||||
line-height: 30px;
|
line-height: 30px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -46,7 +46,7 @@ select.admin-autocomplete {
|
||||||
}
|
}
|
||||||
|
|
||||||
.select2-container--admin-autocomplete .select2-selection--single .select2-selection__placeholder {
|
.select2-container--admin-autocomplete .select2-selection--single .select2-selection__placeholder {
|
||||||
color: #999;
|
color: var(--body-quiet-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
.select2-container--admin-autocomplete .select2-selection--single .select2-selection__arrow {
|
.select2-container--admin-autocomplete .select2-selection--single .select2-selection__arrow {
|
||||||
|
@ -80,7 +80,7 @@ select.admin-autocomplete {
|
||||||
}
|
}
|
||||||
|
|
||||||
.select2-container--admin-autocomplete.select2-container--disabled .select2-selection--single {
|
.select2-container--admin-autocomplete.select2-container--disabled .select2-selection--single {
|
||||||
background-color: #eee;
|
background-color: var(--darkened-bg);
|
||||||
cursor: default;
|
cursor: default;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -94,8 +94,8 @@ select.admin-autocomplete {
|
||||||
}
|
}
|
||||||
|
|
||||||
.select2-container--admin-autocomplete .select2-selection--multiple {
|
.select2-container--admin-autocomplete .select2-selection--multiple {
|
||||||
background-color: white;
|
background-color: var(--body-bg);
|
||||||
border: 1px solid #ccc;
|
border: 1px solid var(--border-color);
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
cursor: text;
|
cursor: text;
|
||||||
}
|
}
|
||||||
|
@ -104,8 +104,10 @@ select.admin-autocomplete {
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
list-style: none;
|
list-style: none;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 0 5px;
|
padding: 0 10px 5px 5px;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__rendered li {
|
.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__rendered li {
|
||||||
|
@ -113,7 +115,7 @@ select.admin-autocomplete {
|
||||||
}
|
}
|
||||||
|
|
||||||
.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__placeholder {
|
.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__placeholder {
|
||||||
color: #999;
|
color: var(--body-quiet-color);
|
||||||
margin-top: 5px;
|
margin-top: 5px;
|
||||||
float: left;
|
float: left;
|
||||||
}
|
}
|
||||||
|
@ -123,11 +125,13 @@ select.admin-autocomplete {
|
||||||
float: right;
|
float: right;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
margin: 5px;
|
margin: 5px;
|
||||||
|
position: absolute;
|
||||||
|
right: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__choice {
|
.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__choice {
|
||||||
background-color: #e4e4e4;
|
background-color: var(--darkened-bg);
|
||||||
border: 1px solid #ccc;
|
border: 1px solid var(--border-color);
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
cursor: default;
|
cursor: default;
|
||||||
float: left;
|
float: left;
|
||||||
|
@ -137,7 +141,7 @@ select.admin-autocomplete {
|
||||||
}
|
}
|
||||||
|
|
||||||
.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__choice__remove {
|
.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__choice__remove {
|
||||||
color: #999;
|
color: var(--body-quiet-color);
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
|
@ -145,7 +149,7 @@ select.admin-autocomplete {
|
||||||
}
|
}
|
||||||
|
|
||||||
.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__choice__remove:hover {
|
.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__choice__remove:hover {
|
||||||
color: #333;
|
color: var(--body-fg);
|
||||||
}
|
}
|
||||||
|
|
||||||
.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder, .select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-search--inline {
|
.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder, .select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-search--inline {
|
||||||
|
@ -163,12 +167,12 @@ select.admin-autocomplete {
|
||||||
}
|
}
|
||||||
|
|
||||||
.select2-container--admin-autocomplete.select2-container--focus .select2-selection--multiple {
|
.select2-container--admin-autocomplete.select2-container--focus .select2-selection--multiple {
|
||||||
border: solid #999 1px;
|
border: solid var(--body-quiet-color) 1px;
|
||||||
outline: 0;
|
outline: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.select2-container--admin-autocomplete.select2-container--disabled .select2-selection--multiple {
|
.select2-container--admin-autocomplete.select2-container--disabled .select2-selection--multiple {
|
||||||
background-color: #eee;
|
background-color: var(--darkened-bg);
|
||||||
cursor: default;
|
cursor: default;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -186,12 +190,20 @@ select.admin-autocomplete {
|
||||||
border-bottom-right-radius: 0;
|
border-bottom-right-radius: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.select2-container--admin-autocomplete .select2-search--dropdown {
|
||||||
|
background: var(--darkened-bg);
|
||||||
|
}
|
||||||
|
|
||||||
.select2-container--admin-autocomplete .select2-search--dropdown .select2-search__field {
|
.select2-container--admin-autocomplete .select2-search--dropdown .select2-search__field {
|
||||||
border: 1px solid #ccc;
|
background: var(--body-bg);
|
||||||
|
color: var(--body-fg);
|
||||||
|
border: 1px solid var(--border-color);
|
||||||
|
border-radius: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.select2-container--admin-autocomplete .select2-search--inline .select2-search__field {
|
.select2-container--admin-autocomplete .select2-search--inline .select2-search__field {
|
||||||
background: transparent;
|
background: transparent;
|
||||||
|
color: var(--body-fg);
|
||||||
border: none;
|
border: none;
|
||||||
outline: 0;
|
outline: 0;
|
||||||
box-shadow: none;
|
box-shadow: none;
|
||||||
|
@ -201,6 +213,8 @@ select.admin-autocomplete {
|
||||||
.select2-container--admin-autocomplete .select2-results > .select2-results__options {
|
.select2-container--admin-autocomplete .select2-results > .select2-results__options {
|
||||||
max-height: 200px;
|
max-height: 200px;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
|
color: var(--body-fg);
|
||||||
|
background: var(--body-bg);
|
||||||
}
|
}
|
||||||
|
|
||||||
.select2-container--admin-autocomplete .select2-results__option[role=group] {
|
.select2-container--admin-autocomplete .select2-results__option[role=group] {
|
||||||
|
@ -208,11 +222,12 @@ select.admin-autocomplete {
|
||||||
}
|
}
|
||||||
|
|
||||||
.select2-container--admin-autocomplete .select2-results__option[aria-disabled=true] {
|
.select2-container--admin-autocomplete .select2-results__option[aria-disabled=true] {
|
||||||
color: #999;
|
color: var(--body-quiet-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
.select2-container--admin-autocomplete .select2-results__option[aria-selected=true] {
|
.select2-container--admin-autocomplete .select2-results__option[aria-selected=true] {
|
||||||
background-color: #ddd;
|
background-color: var(--selected-bg);
|
||||||
|
color: var(--body-fg);
|
||||||
}
|
}
|
||||||
|
|
||||||
.select2-container--admin-autocomplete .select2-results__option .select2-results__option {
|
.select2-container--admin-autocomplete .select2-results__option .select2-results__option {
|
||||||
|
@ -249,8 +264,8 @@ select.admin-autocomplete {
|
||||||
}
|
}
|
||||||
|
|
||||||
.select2-container--admin-autocomplete .select2-results__option--highlighted[aria-selected] {
|
.select2-container--admin-autocomplete .select2-results__option--highlighted[aria-selected] {
|
||||||
background-color: #79aec8;
|
background-color: var(--primary);
|
||||||
color: white;
|
color: var(--primary-fg);
|
||||||
}
|
}
|
||||||
|
|
||||||
.select2-container--admin-autocomplete .select2-results__group {
|
.select2-container--admin-autocomplete .select2-results__group {
|
||||||
|
|
|
@ -4,24 +4,116 @@
|
||||||
|
|
||||||
@import url(fonts.css);
|
@import url(fonts.css);
|
||||||
|
|
||||||
|
/* VARIABLE DEFINITIONS */
|
||||||
|
:root {
|
||||||
|
--primary: #79aec8;
|
||||||
|
--secondary: #417690;
|
||||||
|
--accent: #f5dd5d;
|
||||||
|
--primary-fg: #fff;
|
||||||
|
|
||||||
|
--body-fg: #333;
|
||||||
|
--body-bg: #fff;
|
||||||
|
--body-quiet-color: #666;
|
||||||
|
--body-loud-color: #000;
|
||||||
|
|
||||||
|
--header-color: #ffc;
|
||||||
|
--header-branding-color: var(--accent);
|
||||||
|
--header-bg: var(--secondary);
|
||||||
|
--header-link-color: var(--primary-fg);
|
||||||
|
|
||||||
|
--breadcrumbs-fg: #c4dce8;
|
||||||
|
--breadcrumbs-link-fg: var(--body-bg);
|
||||||
|
--breadcrumbs-bg: var(--primary);
|
||||||
|
|
||||||
|
--link-fg: #447e9b;
|
||||||
|
--link-hover-color: #036;
|
||||||
|
--link-selected-fg: #5b80b2;
|
||||||
|
|
||||||
|
--hairline-color: #e8e8e8;
|
||||||
|
--border-color: #ccc;
|
||||||
|
|
||||||
|
--error-fg: #ba2121;
|
||||||
|
|
||||||
|
--message-success-bg: #dfd;
|
||||||
|
--message-warning-bg: #ffc;
|
||||||
|
--message-error-bg: #ffefef;
|
||||||
|
|
||||||
|
--darkened-bg: #f8f8f8; /* A bit darker than --body-bg */
|
||||||
|
--selected-bg: #e4e4e4; /* E.g. selected table cells */
|
||||||
|
--selected-row: #ffc;
|
||||||
|
|
||||||
|
--button-fg: #fff;
|
||||||
|
--button-bg: var(--primary);
|
||||||
|
--button-hover-bg: #609ab6;
|
||||||
|
--default-button-bg: var(--secondary);
|
||||||
|
--default-button-hover-bg: #205067;
|
||||||
|
--close-button-bg: #888; /* Previously #bbb, contrast 1.92 */
|
||||||
|
--close-button-hover-bg: #747474;
|
||||||
|
--delete-button-bg: #ba2121;
|
||||||
|
--delete-button-hover-bg: #a41515;
|
||||||
|
|
||||||
|
--object-tools-fg: var(--button-fg);
|
||||||
|
--object-tools-bg: var(--close-button-bg);
|
||||||
|
--object-tools-hover-bg: var(--close-button-hover-bg);
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) {
|
||||||
|
:root {
|
||||||
|
--primary: #264b5d;
|
||||||
|
--primary-fg: #eee;
|
||||||
|
|
||||||
|
--body-fg: #eeeeee;
|
||||||
|
--body-bg: #121212;
|
||||||
|
--body-quiet-color: #e0e0e0;
|
||||||
|
--body-loud-color: #ffffff;
|
||||||
|
|
||||||
|
--breadcrumbs-link-fg: #e0e0e0;
|
||||||
|
--breadcrumbs-bg: var(--primary);
|
||||||
|
|
||||||
|
--link-fg: #81d4fa;
|
||||||
|
--link-hover-color: #4ac1f7;
|
||||||
|
--link-selected-fg: #6f94c6;
|
||||||
|
|
||||||
|
--hairline-color: #272727;
|
||||||
|
--border-color: #353535;
|
||||||
|
|
||||||
|
--error-fg: #e35f5f;
|
||||||
|
--message-success-bg: #006b1b;
|
||||||
|
--message-warning-bg: #583305;
|
||||||
|
--message-error-bg: #570808;
|
||||||
|
|
||||||
|
--darkened-bg: #212121;
|
||||||
|
--selected-bg: #1b1b1b;
|
||||||
|
--selected-row: #00363a;
|
||||||
|
|
||||||
|
--close-button-bg: #333333;
|
||||||
|
--close-button-hover-bg: #666666;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
html, body {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
font-family: "Roboto","Lucida Grande","DejaVu Sans","Bitstream Vera Sans",Verdana,Arial,sans-serif;
|
font-family: "Roboto","Lucida Grande","DejaVu Sans","Bitstream Vera Sans",Verdana,Arial,sans-serif;
|
||||||
color: #333;
|
color: var(--body-fg);
|
||||||
background: #fff;
|
background: var(--body-bg);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* LINKS */
|
/* LINKS */
|
||||||
|
|
||||||
a:link, a:visited {
|
a:link, a:visited {
|
||||||
color: #447e9b;
|
color: var(--link-fg);
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
|
transition: color 0.15s, background 0.15s;
|
||||||
}
|
}
|
||||||
|
|
||||||
a:focus, a:hover {
|
a:focus, a:hover {
|
||||||
color: #036;
|
color: var(--link-hover-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
a:focus {
|
a:focus {
|
||||||
|
@ -33,7 +125,7 @@ a img {
|
||||||
}
|
}
|
||||||
|
|
||||||
a.section:link, a.section:visited {
|
a.section:link, a.section:visited {
|
||||||
color: #fff;
|
color: var(--header-link-color);
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,7 +152,7 @@ h1 {
|
||||||
margin: 0 0 20px;
|
margin: 0 0 20px;
|
||||||
font-weight: 300;
|
font-weight: 300;
|
||||||
font-size: 20px;
|
font-size: 20px;
|
||||||
color: #666;
|
color: var(--body-quiet-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
h2 {
|
h2 {
|
||||||
|
@ -76,7 +168,7 @@ h2.subhead {
|
||||||
h3 {
|
h3 {
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
margin: .8em 0 .3em 0;
|
margin: .8em 0 .3em 0;
|
||||||
color: #666;
|
color: var(--body-quiet-color);
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -89,12 +181,12 @@ h4 {
|
||||||
h5 {
|
h5 {
|
||||||
font-size: 10px;
|
font-size: 10px;
|
||||||
margin: 1.5em 0 .5em 0;
|
margin: 1.5em 0 .5em 0;
|
||||||
color: #666;
|
color: var(--body-quiet-color);
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
letter-spacing: 1px;
|
letter-spacing: 1px;
|
||||||
}
|
}
|
||||||
|
|
||||||
ul li {
|
ul > li {
|
||||||
list-style-type: square;
|
list-style-type: square;
|
||||||
padding: 1px 0;
|
padding: 1px 0;
|
||||||
}
|
}
|
||||||
|
@ -124,9 +216,10 @@ form {
|
||||||
|
|
||||||
fieldset {
|
fieldset {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
|
min-width: 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
border: none;
|
border: none;
|
||||||
border-top: 1px solid #eee;
|
border-top: 1px solid var(--hairline-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
blockquote {
|
blockquote {
|
||||||
|
@ -139,13 +232,14 @@ blockquote {
|
||||||
|
|
||||||
code, pre {
|
code, pre {
|
||||||
font-family: "Bitstream Vera Sans Mono", Monaco, "Courier New", Courier, monospace;
|
font-family: "Bitstream Vera Sans Mono", Monaco, "Courier New", Courier, monospace;
|
||||||
color: #666;
|
color: var(--body-quiet-color);
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
|
overflow-x: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
pre.literal-block {
|
pre.literal-block {
|
||||||
margin: 10px;
|
margin: 10px;
|
||||||
background: #eee;
|
background: var(--darkened-bg);
|
||||||
padding: 6px 8px;
|
padding: 6px 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -155,8 +249,8 @@ code strong {
|
||||||
|
|
||||||
hr {
|
hr {
|
||||||
clear: both;
|
clear: both;
|
||||||
color: #eee;
|
color: var(--hairline-color);
|
||||||
background-color: #eee;
|
background-color: var(--hairline-color);
|
||||||
height: 1px;
|
height: 1px;
|
||||||
border: none;
|
border: none;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
|
@ -171,25 +265,13 @@ hr {
|
||||||
font-size: 11px;
|
font-size: 11px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tiny {
|
|
||||||
font-size: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
p.tiny {
|
|
||||||
margin-top: -2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.mini {
|
.mini {
|
||||||
font-size: 10px;
|
font-size: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
p.mini {
|
|
||||||
margin-top: -3px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.help, p.help, form p.help, div.help, form div.help, div.help li {
|
.help, p.help, form p.help, div.help, form div.help, div.help li {
|
||||||
font-size: 11px;
|
font-size: 11px;
|
||||||
color: #999;
|
color: var(--body-quiet-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
div.help ul {
|
div.help ul {
|
||||||
|
@ -205,54 +287,35 @@ p img, h1 img, h2 img, h3 img, h4 img, td img {
|
||||||
}
|
}
|
||||||
|
|
||||||
.quiet, a.quiet:link, a.quiet:visited {
|
.quiet, a.quiet:link, a.quiet:visited {
|
||||||
color: #999;
|
color: var(--body-quiet-color);
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
}
|
}
|
||||||
|
|
||||||
.float-right {
|
|
||||||
float: right;
|
|
||||||
}
|
|
||||||
|
|
||||||
.float-left {
|
|
||||||
float: left;
|
|
||||||
}
|
|
||||||
|
|
||||||
.clear {
|
.clear {
|
||||||
clear: both;
|
clear: both;
|
||||||
}
|
}
|
||||||
|
|
||||||
.align-left {
|
|
||||||
text-align: left;
|
|
||||||
}
|
|
||||||
|
|
||||||
.align-right {
|
|
||||||
text-align: right;
|
|
||||||
}
|
|
||||||
|
|
||||||
.example {
|
|
||||||
margin: 10px 0;
|
|
||||||
padding: 5px 10px;
|
|
||||||
background: #efefef;
|
|
||||||
}
|
|
||||||
|
|
||||||
.nowrap {
|
.nowrap {
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.hidden {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
/* TABLES */
|
/* TABLES */
|
||||||
|
|
||||||
table {
|
table {
|
||||||
border-collapse: collapse;
|
border-collapse: collapse;
|
||||||
border-color: #ccc;
|
border-color: var(--border-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
td, th {
|
td, th {
|
||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
line-height: 16px;
|
line-height: 16px;
|
||||||
border-bottom: 1px solid #eee;
|
border-bottom: 1px solid var(--hairline-color);
|
||||||
vertical-align: top;
|
vertical-align: top;
|
||||||
padding: 8px;
|
padding: 8px;
|
||||||
font-family: "Roboto", "Lucida Grande", Verdana, Arial, sans-serif;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
th {
|
th {
|
||||||
|
@ -262,34 +325,37 @@ th {
|
||||||
|
|
||||||
thead th,
|
thead th,
|
||||||
tfoot td {
|
tfoot td {
|
||||||
color: #666;
|
color: var(--body-quiet-color);
|
||||||
padding: 5px 10px;
|
padding: 5px 10px;
|
||||||
font-size: 11px;
|
font-size: 11px;
|
||||||
background: #fff;
|
background: var(--body-bg);
|
||||||
border: none;
|
border: none;
|
||||||
border-top: 1px solid #eee;
|
border-top: 1px solid var(--hairline-color);
|
||||||
border-bottom: 1px solid #eee;
|
border-bottom: 1px solid var(--hairline-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
tfoot td {
|
tfoot td {
|
||||||
border-bottom: none;
|
border-bottom: none;
|
||||||
border-top: 1px solid #eee;
|
border-top: 1px solid var(--hairline-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
thead th.required {
|
thead th.required {
|
||||||
color: #000;
|
color: var(--body-loud-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
tr.alt {
|
tr.alt {
|
||||||
background: #f6f6f6;
|
background: var(--darkened-bg);
|
||||||
}
|
}
|
||||||
|
|
||||||
.row1 {
|
tr:nth-child(odd), .row-form-errors {
|
||||||
background: #fff;
|
background: var(--body-bg);
|
||||||
}
|
}
|
||||||
|
|
||||||
.row2 {
|
tr:nth-child(even),
|
||||||
background: #f9f9f9;
|
tr:nth-child(even) .errorlist,
|
||||||
|
tr:nth-child(odd) + .row-form-errors,
|
||||||
|
tr:nth-child(odd) + .row-form-errors .errorlist {
|
||||||
|
background: var(--darkened-bg);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* SORTABLE TABLES */
|
/* SORTABLE TABLES */
|
||||||
|
@ -298,15 +364,15 @@ thead th {
|
||||||
padding: 5px 10px;
|
padding: 5px 10px;
|
||||||
line-height: normal;
|
line-height: normal;
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
background: #f6f6f6;
|
background: var(--darkened-bg);
|
||||||
}
|
}
|
||||||
|
|
||||||
thead th a:link, thead th a:visited {
|
thead th a:link, thead th a:visited {
|
||||||
color: #666;
|
color: var(--body-quiet-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
thead th.sorted {
|
thead th.sorted {
|
||||||
background: #eee;
|
background: var(--selected-bg);
|
||||||
}
|
}
|
||||||
|
|
||||||
thead th.sorted .text {
|
thead th.sorted .text {
|
||||||
|
@ -325,7 +391,7 @@ table thead th .text a {
|
||||||
}
|
}
|
||||||
|
|
||||||
table thead th .text a:focus, table thead th .text a:hover {
|
table thead th .text a:focus, table thead th .text a:hover {
|
||||||
background: #eee;
|
background: var(--selected-bg);
|
||||||
}
|
}
|
||||||
|
|
||||||
thead th.sorted a.sortremove {
|
thead th.sorted a.sortremove {
|
||||||
|
@ -372,12 +438,12 @@ table thead th.sorted .sortoptions a.sortremove:after {
|
||||||
left: 3px;
|
left: 3px;
|
||||||
font-weight: 200;
|
font-weight: 200;
|
||||||
font-size: 18px;
|
font-size: 18px;
|
||||||
color: #999;
|
color: var(--body-quiet-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
table thead th.sorted .sortoptions a.sortremove:focus:after,
|
table thead th.sorted .sortoptions a.sortremove:focus:after,
|
||||||
table thead th.sorted .sortoptions a.sortremove:hover:after {
|
table thead th.sorted .sortoptions a.sortremove:hover:after {
|
||||||
color: #447e9b;
|
color: var(--link-fg);
|
||||||
}
|
}
|
||||||
|
|
||||||
table thead th.sorted .sortoptions a.sortremove:focus,
|
table thead th.sorted .sortoptions a.sortremove:focus,
|
||||||
|
@ -424,16 +490,18 @@ textarea {
|
||||||
|
|
||||||
input[type=text], input[type=password], input[type=email], input[type=url],
|
input[type=text], input[type=password], input[type=email], input[type=url],
|
||||||
input[type=number], input[type=tel], textarea, select, .vTextField {
|
input[type=number], input[type=tel], textarea, select, .vTextField {
|
||||||
border: 1px solid #ccc;
|
border: 1px solid var(--border-color);
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
padding: 5px 6px;
|
padding: 5px 6px;
|
||||||
margin-top: 0;
|
margin-top: 0;
|
||||||
|
color: var(--body-fg);
|
||||||
|
background-color: var(--body-bg);
|
||||||
}
|
}
|
||||||
|
|
||||||
input[type=text]:focus, input[type=password]:focus, input[type=email]:focus,
|
input[type=text]:focus, input[type=password]:focus, input[type=email]:focus,
|
||||||
input[type=url]:focus, input[type=number]:focus, input[type=tel]:focus,
|
input[type=url]:focus, input[type=number]:focus, input[type=tel]:focus,
|
||||||
textarea:focus, select:focus, .vTextField:focus {
|
textarea:focus, select:focus, .vTextField:focus {
|
||||||
border-color: #999;
|
border-color: var(--body-quiet-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
select {
|
select {
|
||||||
|
@ -449,12 +517,13 @@ select[multiple] {
|
||||||
/* FORM BUTTONS */
|
/* FORM BUTTONS */
|
||||||
|
|
||||||
.button, input[type=submit], input[type=button], .submit-row input, a.button {
|
.button, input[type=submit], input[type=button], .submit-row input, a.button {
|
||||||
background: #79aec8;
|
background: var(--button-bg);
|
||||||
padding: 10px 15px;
|
padding: 10px 15px;
|
||||||
border: none;
|
border: none;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
color: #fff;
|
color: var(--button-fg);
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
|
transition: background 0.15s;
|
||||||
}
|
}
|
||||||
|
|
||||||
a.button {
|
a.button {
|
||||||
|
@ -464,7 +533,7 @@ a.button {
|
||||||
.button:active, input[type=submit]:active, input[type=button]:active,
|
.button:active, input[type=submit]:active, input[type=button]:active,
|
||||||
.button:focus, input[type=submit]:focus, input[type=button]:focus,
|
.button:focus, input[type=submit]:focus, input[type=button]:focus,
|
||||||
.button:hover, input[type=submit]:hover, input[type=button]:hover {
|
.button:hover, input[type=submit]:hover, input[type=button]:hover {
|
||||||
background: #609ab6;
|
background: var(--button-hover-bg);
|
||||||
}
|
}
|
||||||
|
|
||||||
.button[disabled], input[type=submit][disabled], input[type=button][disabled] {
|
.button[disabled], input[type=submit][disabled], input[type=button][disabled] {
|
||||||
|
@ -475,13 +544,13 @@ a.button {
|
||||||
float: right;
|
float: right;
|
||||||
border: none;
|
border: none;
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
background: #417690;
|
background: var(--default-button-bg);
|
||||||
}
|
}
|
||||||
|
|
||||||
.button.default:active, input[type=submit].default:active,
|
.button.default:active, input[type=submit].default:active,
|
||||||
.button.default:focus, input[type=submit].default:focus,
|
.button.default:focus, input[type=submit].default:focus,
|
||||||
.button.default:hover, input[type=submit].default:hover {
|
.button.default:hover, input[type=submit].default:hover {
|
||||||
background: #205067;
|
background: var(--default-button-hover-bg);
|
||||||
}
|
}
|
||||||
|
|
||||||
.button[disabled].default,
|
.button[disabled].default,
|
||||||
|
@ -496,7 +565,7 @@ input[type=button][disabled].default {
|
||||||
.module {
|
.module {
|
||||||
border: none;
|
border: none;
|
||||||
margin-bottom: 30px;
|
margin-bottom: 30px;
|
||||||
background: #fff;
|
background: var(--body-bg);
|
||||||
}
|
}
|
||||||
|
|
||||||
.module p, .module ul, .module h3, .module h4, .module dl, .module pre {
|
.module p, .module ul, .module h3, .module h4, .module dl, .module pre {
|
||||||
|
@ -522,8 +591,8 @@ input[type=button][disabled].default {
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
background: #79aec8;
|
background: var(--primary);
|
||||||
color: #fff;
|
color: var(--header-link-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
.module caption,
|
.module caption,
|
||||||
|
@ -550,18 +619,18 @@ ul.messagelist li {
|
||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
padding: 10px 10px 10px 65px;
|
padding: 10px 10px 10px 65px;
|
||||||
margin: 0 0 10px 0;
|
margin: 0 0 10px 0;
|
||||||
background: #dfd url(../img/icon-yes.svg) 40px 12px no-repeat;
|
background: var(--message-success-bg) url(../img/icon-yes.svg) 40px 12px no-repeat;
|
||||||
background-size: 16px auto;
|
background-size: 16px auto;
|
||||||
color: #333;
|
color: var(--body-fg);
|
||||||
}
|
}
|
||||||
|
|
||||||
ul.messagelist li.warning {
|
ul.messagelist li.warning {
|
||||||
background: #ffc url(../img/icon-alert.svg) 40px 14px no-repeat;
|
background: var(--message-warning-bg) url(../img/icon-alert.svg) 40px 14px no-repeat;
|
||||||
background-size: 14px auto;
|
background-size: 14px auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
ul.messagelist li.error {
|
ul.messagelist li.error {
|
||||||
background: #ffefef url(../img/icon-no.svg) 40px 12px no-repeat;
|
background: var(--message-error-bg) url(../img/icon-no.svg) 40px 12px no-repeat;
|
||||||
background-size: 16px auto;
|
background-size: 16px auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -571,24 +640,26 @@ ul.messagelist li.error {
|
||||||
display: block;
|
display: block;
|
||||||
padding: 10px 12px;
|
padding: 10px 12px;
|
||||||
margin: 0 0 10px 0;
|
margin: 0 0 10px 0;
|
||||||
color: #ba2121;
|
color: var(--error-fg);
|
||||||
border: 1px solid #ba2121;
|
border: 1px solid var(--error-fg);
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
background-color: #fff;
|
background-color: var(--body-bg);
|
||||||
background-position: 5px 12px;
|
background-position: 5px 12px;
|
||||||
|
overflow-wrap: break-word;
|
||||||
}
|
}
|
||||||
|
|
||||||
ul.errorlist {
|
ul.errorlist {
|
||||||
margin: 0 0 4px;
|
margin: 0 0 4px;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
color: #ba2121;
|
color: var(--error-fg);
|
||||||
background: #fff;
|
background: var(--body-bg);
|
||||||
}
|
}
|
||||||
|
|
||||||
ul.errorlist li {
|
ul.errorlist li {
|
||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
display: block;
|
display: block;
|
||||||
margin-bottom: 4px;
|
margin-bottom: 4px;
|
||||||
|
overflow-wrap: break-word;
|
||||||
}
|
}
|
||||||
|
|
||||||
ul.errorlist li:first-child {
|
ul.errorlist li:first-child {
|
||||||
|
@ -612,7 +683,7 @@ td ul.errorlist li {
|
||||||
.form-row.errors {
|
.form-row.errors {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
border: none;
|
border: none;
|
||||||
border-bottom: 1px solid #eee;
|
border-bottom: 1px solid var(--hairline-color);
|
||||||
background: none;
|
background: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -620,22 +691,9 @@ td ul.errorlist li {
|
||||||
padding-left: 0;
|
padding-left: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.errors input, .errors select, .errors textarea {
|
.errors input, .errors select, .errors textarea,
|
||||||
border: 1px solid #ba2121;
|
td ul.errorlist + input, td ul.errorlist + select, td ul.errorlist + textarea {
|
||||||
}
|
border: 1px solid var(--error-fg);
|
||||||
|
|
||||||
div.system-message {
|
|
||||||
background: #ffc;
|
|
||||||
margin: 10px;
|
|
||||||
padding: 6px 8px;
|
|
||||||
font-size: .8em;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.system-message p.system-message-title {
|
|
||||||
padding: 4px 5px 4px 25px;
|
|
||||||
margin: 0;
|
|
||||||
color: #c11;
|
|
||||||
background: #ffefef url(../img/icon-no.svg) 5px 5px no-repeat;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.description {
|
.description {
|
||||||
|
@ -646,20 +704,19 @@ div.system-message p.system-message-title {
|
||||||
/* BREADCRUMBS */
|
/* BREADCRUMBS */
|
||||||
|
|
||||||
div.breadcrumbs {
|
div.breadcrumbs {
|
||||||
background: #79aec8;
|
background: var(--breadcrumbs-bg);
|
||||||
padding: 10px 40px;
|
padding: 10px 40px;
|
||||||
border: none;
|
border: none;
|
||||||
font-size: 14px;
|
color: var(--breadcrumbs-fg);
|
||||||
color: #c4dce8;
|
|
||||||
text-align: left;
|
text-align: left;
|
||||||
}
|
}
|
||||||
|
|
||||||
div.breadcrumbs a {
|
div.breadcrumbs a {
|
||||||
color: #fff;
|
color: var(--breadcrumbs-link-fg);
|
||||||
}
|
}
|
||||||
|
|
||||||
div.breadcrumbs a:focus, div.breadcrumbs a:hover {
|
div.breadcrumbs a:focus, div.breadcrumbs a:hover {
|
||||||
color: #c4dce8;
|
color: var(--breadcrumbs-fg);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ACTION ICONS */
|
/* ACTION ICONS */
|
||||||
|
@ -685,11 +742,11 @@ div.breadcrumbs a:focus, div.breadcrumbs a:hover {
|
||||||
}
|
}
|
||||||
|
|
||||||
a.deletelink:link, a.deletelink:visited {
|
a.deletelink:link, a.deletelink:visited {
|
||||||
color: #CC3434;
|
color: #CC3434; /* XXX Probably unused? */
|
||||||
}
|
}
|
||||||
|
|
||||||
a.deletelink:focus, a.deletelink:hover {
|
a.deletelink:focus, a.deletelink:hover {
|
||||||
color: #993333;
|
color: #993333; /* XXX Probably unused? */
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -704,14 +761,6 @@ a.deletelink:focus, a.deletelink:hover {
|
||||||
margin-top: -48px;
|
margin-top: -48px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.form-row .object-tools {
|
|
||||||
margin-top: 5px;
|
|
||||||
margin-bottom: 5px;
|
|
||||||
float: none;
|
|
||||||
height: 2em;
|
|
||||||
padding-left: 3.5em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.object-tools li {
|
.object-tools li {
|
||||||
display: block;
|
display: block;
|
||||||
float: left;
|
float: left;
|
||||||
|
@ -727,29 +776,29 @@ a.deletelink:focus, a.deletelink:hover {
|
||||||
display: block;
|
display: block;
|
||||||
float: left;
|
float: left;
|
||||||
padding: 3px 12px;
|
padding: 3px 12px;
|
||||||
background: #999;
|
background: var(--object-tools-bg);
|
||||||
|
color: var(--object-tools-fg);
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
font-size: 11px;
|
font-size: 11px;
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
letter-spacing: 0.5px;
|
letter-spacing: 0.5px;
|
||||||
color: #fff;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.object-tools a:focus, .object-tools a:hover {
|
.object-tools a:focus, .object-tools a:hover {
|
||||||
background-color: #417690;
|
background-color: var(--object-tools-hover-bg);
|
||||||
}
|
}
|
||||||
|
|
||||||
.object-tools a:focus{
|
.object-tools a:focus{
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.object-tools a.viewsitelink, .object-tools a.golink,.object-tools a.addlink {
|
.object-tools a.viewsitelink, .object-tools a.addlink {
|
||||||
background-repeat: no-repeat;
|
background-repeat: no-repeat;
|
||||||
background-position: right 7px center;
|
background-position: right 7px center;
|
||||||
padding-right: 26px;
|
padding-right: 26px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.object-tools a.viewsitelink, .object-tools a.golink {
|
.object-tools a.viewsitelink {
|
||||||
background-image: url(../img/tooltag-arrowright.svg);
|
background-image: url(../img/tooltag-arrowright.svg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -774,6 +823,23 @@ table#change-history tbody th {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
min-width: 980px;
|
min-width: 980px;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
#container > div {
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#container > .main {
|
||||||
|
display: flex;
|
||||||
|
flex: 1 0 auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.main > .content {
|
||||||
|
flex: 1 0;
|
||||||
|
max-width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
#content {
|
#content {
|
||||||
|
@ -834,13 +900,13 @@ table#change-history tbody th {
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
padding: 10px 40px;
|
padding: 10px 40px;
|
||||||
background: #417690;
|
background: var(--header-bg);
|
||||||
color: #ffc;
|
color: var(--header-color);
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
#header a:link, #header a:visited {
|
#header a:link, #header a:visited {
|
||||||
color: #fff;
|
color: var(--header-link-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
#header a:focus , #header a:hover {
|
#header a:focus , #header a:hover {
|
||||||
|
@ -856,11 +922,11 @@ table#change-history tbody th {
|
||||||
margin: 0 20px 0 0;
|
margin: 0 20px 0 0;
|
||||||
font-weight: 300;
|
font-weight: 300;
|
||||||
font-size: 24px;
|
font-size: 24px;
|
||||||
color: #f5dd5d;
|
color: var(--accent);
|
||||||
}
|
}
|
||||||
|
|
||||||
#branding h1, #branding h1 a:link, #branding h1 a:visited {
|
#branding h1, #branding h1 a:link, #branding h1 a:visited {
|
||||||
color: #f5dd5d;
|
color: var(--accent);
|
||||||
}
|
}
|
||||||
|
|
||||||
#branding h2 {
|
#branding h2 {
|
||||||
|
@ -868,7 +934,7 @@ table#change-history tbody th {
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
margin: -8px 0 8px 0;
|
margin: -8px 0 8px 0;
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
color: #ffc;
|
color: var(--header-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
#branding a:hover {
|
#branding a:hover {
|
||||||
|
@ -892,14 +958,14 @@ table#change-history tbody th {
|
||||||
|
|
||||||
#user-tools a:focus, #user-tools a:hover {
|
#user-tools a:focus, #user-tools a:hover {
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
border-bottom-color: #79aec8;
|
border-bottom-color: var(--primary);
|
||||||
color: #79aec8;
|
color: var(--primary);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* SIDEBAR */
|
/* SIDEBAR */
|
||||||
|
|
||||||
#content-related {
|
#content-related {
|
||||||
background: #f8f8f8;
|
background: var(--darkened-bg);
|
||||||
}
|
}
|
||||||
|
|
||||||
#content-related .module {
|
#content-related .module {
|
||||||
|
@ -907,8 +973,7 @@ table#change-history tbody th {
|
||||||
}
|
}
|
||||||
|
|
||||||
#content-related h3 {
|
#content-related h3 {
|
||||||
font-size: 14px;
|
color: var(--body-quiet-color);
|
||||||
color: #666;
|
|
||||||
padding: 0 16px;
|
padding: 0 16px;
|
||||||
margin: 0 0 16px;
|
margin: 0 0 16px;
|
||||||
}
|
}
|
||||||
|
@ -937,22 +1002,22 @@ table#change-history tbody th {
|
||||||
background: none;
|
background: none;
|
||||||
padding: 16px;
|
padding: 16px;
|
||||||
margin-bottom: 16px;
|
margin-bottom: 16px;
|
||||||
border-bottom: 1px solid #eaeaea;
|
border-bottom: 1px solid var(--hairline-color);
|
||||||
font-size: 18px;
|
font-size: 18px;
|
||||||
color: #333;
|
color: var(--body-fg);
|
||||||
}
|
}
|
||||||
|
|
||||||
.delete-confirmation form input[type="submit"] {
|
.delete-confirmation form input[type="submit"] {
|
||||||
background: #ba2121;
|
background: var(--delete-button-bg);
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
padding: 10px 15px;
|
padding: 10px 15px;
|
||||||
color: #fff;
|
color: var(--button-fg);
|
||||||
}
|
}
|
||||||
|
|
||||||
.delete-confirmation form input[type="submit"]:active,
|
.delete-confirmation form input[type="submit"]:active,
|
||||||
.delete-confirmation form input[type="submit"]:focus,
|
.delete-confirmation form input[type="submit"]:focus,
|
||||||
.delete-confirmation form input[type="submit"]:hover {
|
.delete-confirmation form input[type="submit"]:hover {
|
||||||
background: #a41515;
|
background: var(--delete-button-hover-bg);
|
||||||
}
|
}
|
||||||
|
|
||||||
.delete-confirmation form .cancel-link {
|
.delete-confirmation form .cancel-link {
|
||||||
|
@ -960,17 +1025,17 @@ table#change-history tbody th {
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
height: 15px;
|
height: 15px;
|
||||||
line-height: 15px;
|
line-height: 15px;
|
||||||
background: #ddd;
|
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
padding: 10px 15px;
|
padding: 10px 15px;
|
||||||
color: #333;
|
color: var(--button-fg);
|
||||||
|
background: var(--close-button-bg);
|
||||||
margin: 0 0 0 10px;
|
margin: 0 0 0 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.delete-confirmation form .cancel-link:active,
|
.delete-confirmation form .cancel-link:active,
|
||||||
.delete-confirmation form .cancel-link:focus,
|
.delete-confirmation form .cancel-link:focus,
|
||||||
.delete-confirmation form .cancel-link:hover {
|
.delete-confirmation form .cancel-link:hover {
|
||||||
background: #ccc;
|
background: var(--close-button-hover-bg);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* POPUP */
|
/* POPUP */
|
||||||
|
|
|
@ -1,8 +1,14 @@
|
||||||
/* CHANGELISTS */
|
/* CHANGELISTS */
|
||||||
|
|
||||||
#changelist {
|
#changelist {
|
||||||
position: relative;
|
display: flex;
|
||||||
width: 100%;
|
align-items: flex-start;
|
||||||
|
justify-content: space-between;
|
||||||
|
}
|
||||||
|
|
||||||
|
#changelist .changelist-form-container {
|
||||||
|
flex: 1 1 auto;
|
||||||
|
min-width: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#changelist table {
|
#changelist table {
|
||||||
|
@ -21,7 +27,6 @@
|
||||||
|
|
||||||
.change-list .filtered .results, .change-list .filtered .paginator,
|
.change-list .filtered .results, .change-list .filtered .paginator,
|
||||||
.filtered #toolbar, .filtered div.xfull {
|
.filtered #toolbar, .filtered div.xfull {
|
||||||
margin-right: 280px;
|
|
||||||
width: auto;
|
width: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -30,17 +35,18 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
#changelist-form .results {
|
#changelist-form .results {
|
||||||
overflow-x: auto;
|
overflow-x: auto;
|
||||||
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
#changelist .toplinks {
|
#changelist .toplinks {
|
||||||
border-bottom: 1px solid #ddd;
|
border-bottom: 1px solid var(--hairline-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
#changelist .paginator {
|
#changelist .paginator {
|
||||||
color: #666;
|
color: var(--body-quiet-color);
|
||||||
border-bottom: 1px solid #eee;
|
border-bottom: 1px solid var(--hairline-color);
|
||||||
background: #fff;
|
background: var(--body-bg);
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -62,57 +68,59 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
#changelist table tfoot {
|
#changelist table tfoot {
|
||||||
color: #666;
|
color: var(--body-quiet-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TOOLBAR */
|
/* TOOLBAR */
|
||||||
|
|
||||||
#changelist #toolbar {
|
#toolbar {
|
||||||
padding: 8px 10px;
|
padding: 8px 10px;
|
||||||
margin-bottom: 15px;
|
margin-bottom: 15px;
|
||||||
border-top: 1px solid #eee;
|
border-top: 1px solid var(--hairline-color);
|
||||||
border-bottom: 1px solid #eee;
|
border-bottom: 1px solid var(--hairline-color);
|
||||||
background: #f8f8f8;
|
background: var(--darkened-bg);
|
||||||
color: #666;
|
color: var(--body-quiet-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
#changelist #toolbar form input {
|
#toolbar form input {
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
padding: 5px;
|
padding: 5px;
|
||||||
color: #333;
|
color: var(--body-fg);
|
||||||
}
|
}
|
||||||
|
|
||||||
#changelist #toolbar form #searchbar {
|
#toolbar #searchbar {
|
||||||
height: 19px;
|
height: 19px;
|
||||||
border: 1px solid #ccc;
|
border: 1px solid var(--border-color);
|
||||||
padding: 2px 5px;
|
padding: 2px 5px;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
vertical-align: top;
|
vertical-align: top;
|
||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
|
max-width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
#changelist #toolbar form #searchbar:focus {
|
#toolbar #searchbar:focus {
|
||||||
border-color: #999;
|
border-color: var(--body-quiet-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
#changelist #toolbar form input[type="submit"] {
|
#toolbar form input[type="submit"] {
|
||||||
border: 1px solid #ccc;
|
border: 1px solid var(--border-color);
|
||||||
padding: 2px 10px;
|
font-size: 13px;
|
||||||
|
padding: 4px 8px;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
background: #fff;
|
background: var(--body-bg);
|
||||||
box-shadow: 0 -15px 20px -10px rgba(0, 0, 0, 0.15) inset;
|
box-shadow: 0 -15px 20px -10px rgba(0, 0, 0, 0.15) inset;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
color: #333;
|
color: var(--body-fg);
|
||||||
}
|
}
|
||||||
|
|
||||||
#changelist #toolbar form input[type="submit"]:focus,
|
#toolbar form input[type="submit"]:focus,
|
||||||
#changelist #toolbar form input[type="submit"]:hover {
|
#toolbar form input[type="submit"]:hover {
|
||||||
border-color: #999;
|
border-color: var(--body-quiet-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
#changelist #changelist-search img {
|
#changelist-search img {
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
margin-right: 4px;
|
margin-right: 4px;
|
||||||
}
|
}
|
||||||
|
@ -120,14 +128,11 @@
|
||||||
/* FILTER COLUMN */
|
/* FILTER COLUMN */
|
||||||
|
|
||||||
#changelist-filter {
|
#changelist-filter {
|
||||||
position: absolute;
|
flex: 0 0 240px;
|
||||||
top: 0;
|
order: 1;
|
||||||
right: 0;
|
background: var(--darkened-bg);
|
||||||
z-index: 1000;
|
|
||||||
width: 240px;
|
|
||||||
background: #f8f8f8;
|
|
||||||
border-left: none;
|
border-left: none;
|
||||||
margin: 0;
|
margin: 0 0 0 30px;
|
||||||
}
|
}
|
||||||
|
|
||||||
#changelist-filter h2 {
|
#changelist-filter h2 {
|
||||||
|
@ -141,7 +146,6 @@
|
||||||
|
|
||||||
#changelist-filter h3 {
|
#changelist-filter h3 {
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
font-size: 14px;
|
|
||||||
padding: 0 15px;
|
padding: 0 15px;
|
||||||
margin-bottom: 10px;
|
margin-bottom: 10px;
|
||||||
}
|
}
|
||||||
|
@ -149,12 +153,11 @@
|
||||||
#changelist-filter ul {
|
#changelist-filter ul {
|
||||||
margin: 5px 0;
|
margin: 5px 0;
|
||||||
padding: 0 15px 15px;
|
padding: 0 15px 15px;
|
||||||
border-bottom: 1px solid #eaeaea;
|
border-bottom: 1px solid var(--hairline-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
#changelist-filter ul:last-child {
|
#changelist-filter ul:last-child {
|
||||||
border-bottom: none;
|
border-bottom: none;
|
||||||
padding-bottom: none;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#changelist-filter li {
|
#changelist-filter li {
|
||||||
|
@ -165,25 +168,31 @@
|
||||||
|
|
||||||
#changelist-filter a {
|
#changelist-filter a {
|
||||||
display: block;
|
display: block;
|
||||||
color: #999;
|
color: var(--body-quiet-color);
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
overflow-x: hidden;
|
overflow-x: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
#changelist-filter li.selected {
|
#changelist-filter li.selected {
|
||||||
border-left: 5px solid #eaeaea;
|
border-left: 5px solid var(--hairline-color);
|
||||||
padding-left: 10px;
|
padding-left: 10px;
|
||||||
margin-left: -15px;
|
margin-left: -15px;
|
||||||
}
|
}
|
||||||
|
|
||||||
#changelist-filter li.selected a {
|
#changelist-filter li.selected a {
|
||||||
color: #5b80b2;
|
color: var(--link-selected-fg);
|
||||||
}
|
}
|
||||||
|
|
||||||
#changelist-filter a:focus, #changelist-filter a:hover,
|
#changelist-filter a:focus, #changelist-filter a:hover,
|
||||||
#changelist-filter li.selected a:focus,
|
#changelist-filter li.selected a:focus,
|
||||||
#changelist-filter li.selected a:hover {
|
#changelist-filter li.selected a:hover {
|
||||||
color: #036;
|
color: var(--link-hover-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
#changelist-filter #changelist-filter-clear a {
|
||||||
|
font-size: 13px;
|
||||||
|
padding-bottom: 10px;
|
||||||
|
border-bottom: 1px solid var(--hairline-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* DATE DRILLDOWN */
|
/* DATE DRILLDOWN */
|
||||||
|
@ -204,12 +213,12 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.change-list ul.toplinks .date-back a {
|
.change-list ul.toplinks .date-back a {
|
||||||
color: #999;
|
color: var(--body-quiet-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
.change-list ul.toplinks .date-back a:focus,
|
.change-list ul.toplinks .date-back a:focus,
|
||||||
.change-list ul.toplinks .date-back a:hover {
|
.change-list ul.toplinks .date-back a:hover {
|
||||||
color: #036;
|
color: var(--link-hover-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* PAGINATOR */
|
/* PAGINATOR */
|
||||||
|
@ -220,26 +229,26 @@
|
||||||
padding-bottom: 10px;
|
padding-bottom: 10px;
|
||||||
line-height: 22px;
|
line-height: 22px;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
border-top: 1px solid #ddd;
|
border-top: 1px solid var(--hairline-color);
|
||||||
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.paginator a:link, .paginator a:visited {
|
.paginator a:link, .paginator a:visited {
|
||||||
padding: 2px 6px;
|
padding: 2px 6px;
|
||||||
background: #79aec8;
|
background: var(--button-bg);
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
color: #fff;
|
color: var(--button-fg);
|
||||||
}
|
}
|
||||||
|
|
||||||
.paginator a.showall {
|
.paginator a.showall {
|
||||||
padding: 0;
|
|
||||||
border: none;
|
border: none;
|
||||||
background: none;
|
background: none;
|
||||||
color: #5b80b2;
|
color: var(--link-fg);
|
||||||
}
|
}
|
||||||
|
|
||||||
.paginator a.showall:focus, .paginator a.showall:hover {
|
.paginator a.showall:focus, .paginator a.showall:hover {
|
||||||
background: none;
|
background: none;
|
||||||
color: #036;
|
color: var(--link-hover-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
.paginator .end {
|
.paginator .end {
|
||||||
|
@ -255,13 +264,12 @@
|
||||||
|
|
||||||
.paginator a:focus, .paginator a:hover {
|
.paginator a:focus, .paginator a:hover {
|
||||||
color: white;
|
color: white;
|
||||||
background: #036;
|
background: var(--link-hover-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ACTIONS */
|
/* ACTIONS */
|
||||||
|
|
||||||
.filtered .actions {
|
.filtered .actions {
|
||||||
margin-right: 280px;
|
|
||||||
border-right: none;
|
border-right: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -271,21 +279,22 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
#changelist table tbody tr.selected {
|
#changelist table tbody tr.selected {
|
||||||
background-color: #FFFFCC;
|
background-color: var(--selected-row);
|
||||||
}
|
}
|
||||||
|
|
||||||
#changelist .actions {
|
#changelist .actions {
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
background: #fff;
|
background: var(--body-bg);
|
||||||
border-top: none;
|
border-top: none;
|
||||||
border-bottom: none;
|
border-bottom: none;
|
||||||
line-height: 24px;
|
line-height: 24px;
|
||||||
color: #999;
|
color: var(--body-quiet-color);
|
||||||
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
#changelist .actions.selected {
|
#changelist .actions.selected { /* XXX Probably unused? */
|
||||||
background: #fffccf;
|
background: var(--body-bg);
|
||||||
border-top: 1px solid #fffee8;
|
border-top: 1px solid var(--body-bg);
|
||||||
border-bottom: 1px solid #edecd6;
|
border-bottom: 1px solid #edecd6;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -295,7 +304,6 @@
|
||||||
#changelist .actions span.question {
|
#changelist .actions span.question {
|
||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
margin: 0 0.5em;
|
margin: 0 0.5em;
|
||||||
display: none;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#changelist .actions:last-child {
|
#changelist .actions:last-child {
|
||||||
|
@ -305,9 +313,8 @@
|
||||||
#changelist .actions select {
|
#changelist .actions select {
|
||||||
vertical-align: top;
|
vertical-align: top;
|
||||||
height: 24px;
|
height: 24px;
|
||||||
background: none;
|
color: var(--body-fg);
|
||||||
color: #000;
|
border: 1px solid var(--border-color);
|
||||||
border: 1px solid #ccc;
|
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
padding: 0 0 0 4px;
|
padding: 0 0 0 4px;
|
||||||
|
@ -316,7 +323,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
#changelist .actions select:focus {
|
#changelist .actions select:focus {
|
||||||
border-color: #999;
|
border-color: var(--body-quiet-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
#changelist .actions label {
|
#changelist .actions label {
|
||||||
|
@ -327,18 +334,18 @@
|
||||||
|
|
||||||
#changelist .actions .button {
|
#changelist .actions .button {
|
||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
border: 1px solid #ccc;
|
border: 1px solid var(--border-color);
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
background: #fff;
|
background: var(--body-bg);
|
||||||
box-shadow: 0 -15px 20px -10px rgba(0, 0, 0, 0.15) inset;
|
box-shadow: 0 -15px 20px -10px rgba(0, 0, 0, 0.15) inset;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
height: 24px;
|
height: 24px;
|
||||||
line-height: 1;
|
line-height: 1;
|
||||||
padding: 4px 8px;
|
padding: 4px 8px;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
color: #333;
|
color: var(--body-fg);
|
||||||
}
|
}
|
||||||
|
|
||||||
#changelist .actions .button:focus, #changelist .actions .button:hover {
|
#changelist .actions .button:focus, #changelist .actions .button:hover {
|
||||||
border-color: #999;
|
border-color: var(--body-quiet-color);
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,5 +23,4 @@ ul.actionlist li {
|
||||||
list-style-type: none;
|
list-style-type: none;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
-o-text-overflow: ellipsis;
|
|
||||||
}
|
}
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue