Skip to content

Commit

Permalink
Preapre services pages
Browse files Browse the repository at this point in the history
  • Loading branch information
sea-kg committed Jun 20, 2024
1 parent 64b0a3f commit 9a2b2d8
Show file tree
Hide file tree
Showing 6 changed files with 422 additions and 11 deletions.
162 changes: 162 additions & 0 deletions CONCEPT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,162 @@
# ctf01d training platform

Платформа для тренировок команд CTF в режиме attack-defence заточенная под журейную систему ctf01d.


Основные функции:
- Каталог сервисов с чекерами
- Список команд
- Автоматическое развертывание игры AD на базе ctf01d в каком либо виртуальном пространстве.

Система должна будет работать в двух режимах:

1. Это как каталог сервисов - публично развернутый архив
2. Это как локальная система для тренировок (которая сможет стянуть сервисы из публичного каталога)

## Технологический стек

- Сервер: golang
- База данных: postgre
- Клинет: фронт на vanila + jquery

## Авторизация и пользователи (общее)

Каждый пользователь имеет такие поля:

- uuid пользователя
- Имя для входа (login) - *должно быть ограничение на символы, англ + цифры + _, так как он будет использвоаться в url, Уникальное и не изменяемое*
- Видимое имя - *То как будет отображается пользовательдля всех, например: Иван Петров*
- Пароль для входа (password) - *есснно в базе храниться хеш*
- Аватар - *Ссылка на аватарку*
- Рейтинг - *Пока просто каеие то абстрактные очки*

Cписок ролей пользователей (надо бы что бы была возможность создавать новые роли при необходимости - место для костылей и прочего):

- user - пользователь, роль по-умолчанию
- moderator - пользователь, который может апрувать часть данных
- admin - администратор

профиль пользователя:

- История по командам, в каких играл и в какой сейчас состоит

### Функции

- Авторизация - *простая по логин/пароль*
- Регистрация - *Закрытая, пользователь вводит свои креты, и только администратор в ручном режиме будет активировать пользователей*
- Создать пользователя - *Администратор может создавать пользователей самостоятельно*
- Удалить пользователя - *Администратор может удалить пользователя навсегда*
- Сброс пароля - *Администратор может установить пароль для любого пользователя*
- Изменить пароль - *Пользователь может изменить свой пароль при использовании предыдущего*
- Обновить аватар - *Пользователь может загрузить свою новую аватарку*
- Удалить аватар - *Пользователь может удалить свою аватарку, либо админ может сбросить у любого пользователя*

*пароль должен именть не менее 6 символов*

## Каталог сервисов

Каждый сервис имеет такие поля:

- uuid сервиса
- Уникальное имя
- Публичное описание - *То есть то которое будут видеть все так что там должна быть только общая информация, например: аналог Инстаграм или чат*
- Приватное описание - *Описание уязвимостей, на какие портах работает, какие технологии применялись*
- Автор - *что бы знать в кого писать и для соблюдения авторских прав*
- Копирайт - *для соблюдения авторских прав*
- Аватарка - *для того чтобы интересенее отображалось в списке*
- Архив с сервисом - *Непосредственно то что будет разворачиваться в уязвимомо образе* (должно быть версионирование файлов на стороне сервера)
- Валидный ли архив с сервисом - *Поле обозначает что прошел ли сервис проверки*
- Архив с чекером - *То что будет использоваться журейной системой* (должно быть версионирование файлов на стороне сервера)
- Валидный ли архив с чекером - *Поле обозначает что прошел ли чекер проверки*
- Публичный ли сервис - *то есть доступный ли он для пользователей*
- Дата создания сервиса - *Указывается пользователем*
- Дата последнего изменения полей - *Автоматичеки со стороны сервера*
- Райтап(ы) - ?
- Валидация - *Прошел ли сервис валидацию*
- Рейтинг сервиса

На текущий момент добавлять/изменять/удалять сервисы может только пользователи с ролью админ.


### Функции

- Добавить сервис - *администратор*
- Изменить сервис - *администратор*
- Установить аватарку - *администратор*
- Удалить аватарку - *администратор*
- Залить архив сервиса - *формально убедиться что в архиве все файлы есть какие надо*
- Залить архив чекера - *формально убедиться что в архиве есть все файлы какие надо*

### Фичи

- Если админов много то возможно нужно реализовать защиту от перезаписи данных путем: клиент отправляет данные как было и как стало и сервер уже проверяет что если поля соответсвуют то обновляет, если же изменилось какое либо поле то отправить ответ какое поле изменилось клиенту.
- При загрузки zip для сервиса необходимо проверить корректно ли работает чекер (проверить все коды и состояния)

## Команды

Поля:

- uuid команды
- Имя команды
- Аватарка
- Университет
- Описание
- Ссылка на оффициальный сайт
- Текущий капитан

Отдельной таблицей по отношению к пользователям (многие ко многим? - да владеть двумя командами это возможно):
- команда uuid - *уникальный идентификатор*
- Роль в команде - (четыре захаркоженные роли: owner, captain, vice-captain, player)
- Название роли в команде - *роли придуманные капитанами и замами команд*
- публичный комментарий - *виден всем*
- приватный коментарий - *виден только владельцу капитану и зам капитана*

Отдельной таблицей:
- Запрос на создание команды (имя, университет, описание) - *Принимает заявку администратор*

Также нужна таблица историческая, по изменению состава команды + изменению ролей в команде:

Пишем туда но ничего не удаляем.

### Функции

- Запрос создания команды - *От пользователя*
- Подтверждение создания команды - *Администратор*
- Создание команды - *Администратор*
- Удаление команды - *Администратор*
- Редактирование команды - *Администратор либо владелец*
- Добавление участников в команду *Администратор*
- Приглашение в команду - *Владелец команды, капитан или зам капитана*
- Запрос в состав команды - *Пользователь*
- Установка капитана/зам капитана/Участника - *Владелец команды и администратор*
- Установка зам капитана/Участника - *Капитан команды и администратор*
- Установка "Название роли в команде"/"публичный комментарий"/"приватный коментарий" для учатников команды - *Владелец команды и администратор*


### Логика

- Владельцев команды может быть несколько.
- Капитан команды может быть только один.
- Зам капитанов команды может быть несколько (потом можно будет сделать ограничение).
- Участников команды может быть много.
- Владеть можно несколькими командами
- Капитаном можно быть только в одной команде.
- Участвовать можно в нескольких камандах одновременно (Но во время игры надо будет проверять на уникальность списка учатников).


## Игры

Поля:
- Название
- Дата начала
- Дата окончания
- Кто проводит


### TODO

- Создание игр по расписанию (какие сервисы какие команды и когда)
- Список кто с кем и когда
- Когда игру открывают - то опенвпн (или какой то там будет доступ) для соответсвующих команд и пользователей.
- Где находиться scoreboard
- По завершению игры - надо сохранять результат скоребоарда.
5 changes: 5 additions & 0 deletions html/assets/css/index.css
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,9 @@ body,html{

.btn-menu-top-left {
margin-left: 10px;
}

.services-card {
display: inline-block;
margin: 10px;
}
39 changes: 39 additions & 0 deletions html/assets/js/api.js
Original file line number Diff line number Diff line change
Expand Up @@ -41,3 +41,42 @@ window.ctf01d_tp_api.auth_session = function (auth_data) {
data: JSON.stringify(auth_data),
});
}

window.ctf01d_tp_api.services_list = function() {
return $.ajax({
url: '/api/services',
method: 'GET',
});
}

window.ctf01d_tp_api.service_create = function(service_data) {
return $.ajax({
url: '/api/services',
method: 'POST',
contentType: 'application/json',
data: JSON.stringify(service_data),
});
}

window.ctf01d_tp_api.service_update = function(service_id, service_data) {
return $.ajax({
url: '/api/services/' + service_id,
method: 'PUT',
contentType: 'application/json',
data: JSON.stringify(service_data),
});
}

window.ctf01d_tp_api.service_delete = function(service_id) {
return $.ajax({
url: '/api/services/' + service_id,
method: 'DELETE',
});
}

window.ctf01d_tp_api.service_info = function(service_id) {
return $.ajax({
url: '/api/services/' + service_id,
method: 'GET',
});
}
Loading

0 comments on commit 9a2b2d8

Please sign in to comment.