Compare commits
8 Commits
e6402f37dd
...
2615ad01cd
Author | SHA1 | Date |
---|---|---|
Danhia | 2615ad01cd | |
Danhia | 00962b40d3 | |
Danhia | a12dd0d020 | |
Starthur | 377607239e | |
Starthur | 3829ad11ef | |
Danhia | c7ddf8a435 | |
Danhia | 8cada5b6d2 | |
Danhia | 678abaa1fc |
|
@ -0,0 +1,3 @@
|
||||||
|
[submodule "src/ctfs/templates/challenges"]
|
||||||
|
path = src/ctfs/templates/challenges
|
||||||
|
url = https://gitea.42ctf.org/42CTF/challenges-descriptions.git
|
71
README.md
71
README.md
|
@ -1,47 +1,34 @@
|
||||||
# 42ctf
|
# 42CTF
|
||||||
CTF by 42 students
|
|
||||||
|
[42CTF](https://www.42ctf.org) is a CTF platform created by School 42 students and open to anyone.
|
||||||
|
|
||||||
|
|
||||||
### Todo
|
### Todo
|
||||||
|
|
||||||
- [x] Password reset
|
TODO has been migrated to [issues](https://gitea.42ctf.org/42CTF/website/issues) !
|
||||||
- [x] Access solved challenges
|
And hopefully, it is not redirected anymore to `/dev/null`.
|
||||||
- [x] "Intro" section
|
|
||||||
- [x] Profile edition
|
|
||||||
- [x] Resources page
|
|
||||||
- [x] Flags counter
|
|
||||||
- [x] Graphs on profile page
|
|
||||||
- [ ] Refacto the discord bot with OAuth
|
|
||||||
- [x] Platform translation
|
|
||||||
- [x] French
|
|
||||||
- [ ] Russian
|
|
||||||
- [x] Spanish
|
|
||||||
- [ ] Italian
|
|
||||||
- [x] German
|
|
||||||
- [ ] OAuth 42
|
|
||||||
- [ ] 42 Network leaderboard
|
|
||||||
- [ ] Possibility for users to propose solution to challenges
|
|
||||||
- [ ] Badges/achievments on profile pages
|
|
||||||
- [x] Dynamic scoring
|
|
||||||
|
|
||||||
#### Event feature
|
### How to contribute ?
|
||||||
|
|
||||||
- [X] make scoreboard for events
|
First, you need to contact a 42CTF admin to get an account on the 42CTF gitea.
|
||||||
- [X] make access mod for events :
|
You can contact us on [discord](https://discord.gg/3KDvt6hbWW) or by [email](mailto:42ctf@protonmail.com).
|
||||||
- [X] Sub button for public events
|
You can also fill this [form](https://forms.42l.fr/apps/forms/bpmyGR37AR4yHGnC) and we'll contact you.
|
||||||
- [X] Access by password
|
Then, once you have a gitea account, you can fork this repository, do some stuff, and open a pull request.
|
||||||
- [X] Begin date for display challenges
|
|
||||||
- [X] Ending date for stop flag submission
|
If you want to translate the platform, then have a look at the [wiki](https://gitea.42ctf.org/42CTF/website/wiki).
|
||||||
- [ ] Access by invite link
|
|
||||||
- [X] Admin rights
|
If you want to help with bot development, it has now its own [repository](https://gitea.42ctf.org/42CTF/bot)
|
||||||
- [X] Admin can access to events pages without password
|
|
||||||
- [X] Admin can subscribe to event without password
|
### How to set up my dev environment ?
|
||||||
- [X] process flag submission
|
|
||||||
- [X] increment user score in Scores model
|
There is only one file missing on this repository for you to run the server: `local_settings.py`.
|
||||||
- [X] add filters for admin dashboard
|
You should create one in the `src` directory, with the following content:
|
||||||
- [X] add search in fields in admin dashboard
|
```
|
||||||
- [X] Smooth display of events listing
|
DEBUG = True
|
||||||
- [X] Event info page with background and noice display
|
SECRET_KEY = 'what you want'
|
||||||
- [x] Create teams for events
|
```
|
||||||
- [x] Create/join team
|
|
||||||
- [x] Manage team: change password / leave team
|
When you'll run `python manage.py migrate` then `python manage.py runserver`, an empty database will be automatically created.
|
||||||
- [ ] Dynamic scoring for events
|
The `local_settings.py` is in the `.gitignore` and should stay that way, so we don't accidentally overwrite the production file when we deploy.
|
||||||
|
|
||||||
|
To obtain administrator rights you can run `python manage.py createsuperuser`.
|
|
@ -1,3 +1,3 @@
|
||||||
Django
|
Django==3.2.11
|
||||||
requests
|
requests==2.27.1
|
||||||
authlib
|
authlib==0.15.5
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
# Generated by Django 3.2.11 on 2022-02-15 16:13
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('ctfs', '0007_ctf_disabled'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='ctf',
|
||||||
|
name='description_de',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='ctf',
|
||||||
|
name='description_ru',
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='ctf',
|
||||||
|
name='port',
|
||||||
|
field=models.PositiveSmallIntegerField(blank=True, null=True),
|
||||||
|
),
|
||||||
|
]
|
|
@ -15,10 +15,9 @@ class CTF(models.Model):
|
||||||
disabled = models.BooleanField(default=False)
|
disabled = models.BooleanField(default=False)
|
||||||
description = models.TextField(blank=True)
|
description = models.TextField(blank=True)
|
||||||
description_en = 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)
|
||||||
|
port = models.PositiveSmallIntegerField(null=True, blank=True)
|
||||||
event = models.ForeignKey(Event, null=True, blank=True, on_delete=models.CASCADE)
|
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)
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 18fac3978d21dc824bcffa2bc960aa2bf6b4abd9
|
|
@ -2,6 +2,8 @@
|
||||||
{% block content %}
|
{% block content %}
|
||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
{% load is_member %}
|
{% load is_member %}
|
||||||
|
{% load get_chall %}
|
||||||
|
{% get_current_language as lang %}
|
||||||
<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">
|
||||||
|
@ -15,11 +17,11 @@
|
||||||
</div>
|
</div>
|
||||||
{% else %}
|
{% else %}
|
||||||
<div class="ctf-body">
|
<div class="ctf-body">
|
||||||
{% if description %}
|
{% get_chall_by_lang ctf lang as content %}
|
||||||
{{ description|safe }}
|
{{ content | safe }}
|
||||||
{% else %}
|
<!-- {% if ctf.port %}
|
||||||
{% trans "No translation available. Please try another language (English or French)." %}
|
<b>nc challenges.42ctf.org {{ ctf.port }}</b>
|
||||||
{% endif %}
|
{% endif %} -->
|
||||||
</div>
|
</div>
|
||||||
<div class="ctf-footer">
|
<div class="ctf-footer">
|
||||||
{% if request.user.is_authenticated %}
|
{% if request.user.is_authenticated %}
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
from django import template
|
||||||
|
|
||||||
|
register = template.Library()
|
||||||
|
|
||||||
|
@register.simple_tag
|
||||||
|
def get_chall_by_lang(chall, lang):
|
||||||
|
print(chall.slug)
|
||||||
|
filepath = "ctfs/templates/challenges/"+ lang + "/" + chall.slug + ".html"
|
||||||
|
print(filepath)
|
||||||
|
try:
|
||||||
|
with open(filepath) as fp:
|
||||||
|
return fp.read()
|
||||||
|
except:
|
||||||
|
return chall.description_en
|
|
@ -0,0 +1,23 @@
|
||||||
|
# Generated by Django 3.2.11 on 2022-02-15 16:06
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('events', '0008_event_dynamic'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='eventplayer',
|
||||||
|
name='id',
|
||||||
|
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='team',
|
||||||
|
name='id',
|
||||||
|
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
|
||||||
|
),
|
||||||
|
]
|
Loading…
Reference in New Issue