-
Прочитать требования (3 мин.)
-
Создать репозиторий на гитхабе (1 мин.)
-
Создать Hello world, .gitignore (2 мин.)
-
Описать тестовые данные
- Описать пользователей
N log pass U1 vasya
123
U2 admin
admin
U3 q
?!#
U4 abcdefghij
qwerty
- Описать ресурсы
N re ro u R1 A
READ
vasya
R2 A.B.C
WRITE
vasya
R3 A.B
EXECUTE
admin
R4 A
READ
admin
R5 A.B
WRITE
admin
R6 A.B.C
READ
admin
R7 B
EXECUTE
q
R8 A.A.A
EXECUTE
vasya
-
Записываем тесты в sh файл (8 мин).
N command output T1.1 app.jar
1 + вывод справки
T1.2 app.jar -h
0 + вывод справки
T1.3 app.jar -q
1 + вывод справки
T2.1 app.jar -login vasya -pass 123
0
T2.2 app.jar -pass 123 -login vasya
0
T2.3 app.jar -login VASYA -pass 123
2
T2.4 app.jar -login asd -pass 123
3
T2.5 app.jar -login admin -pass 1234
4
T2.6 app.jar -login admin -pass admin
0
T3.1 app.jar -login vasya -pass 123 -role READ -res A
0
T3.2 app.jar -login vasya -pass 123 -role DELETE -res A
5
T3.3 app.jar -login vasya -pass 123 -role WRITE -res A
6
T3.4 app.jar -login vasya -pass 123 -role READ -res A.B
0
T3.5 app.jar -login admin -pass admin -role WRITE -res A.B.C
0
T3.6 app.jar -login vasya -pass 1234 -role DELETE -res A
4
T3.7 app.jar -login vasya -pass 123 -role WRITE -res A.B.C
0
T3.8 app.jar -login admin -pass admin -role READ
0 (удачная аутент.)
T3.9 app.jar -login admin -pass admin -role EXECUTE -res A
6
T3.10 app.jar -login admin -pass admin -role WRITE -res A.A
6
T4.1 app.jar -login vasya -pass 123 -role READ -res A -ds 2020-03-10 -de 2020-04-01 -vol 1024
0
T4.2 app.jar -login vasya -pass 123 -role READ -res A -ds 20202-03-10 -de 2020-04-01 -vol 1024
7 (неверный год)
T4.3 app.jar -login vasya -pass 123 -role READ -res A -ds 2020-12-10 -de 2020-13-01 -vol 1024
7 (несуществующий месяц)
T4.4 app.jar -login vasya -pass 123 -role READ -res A -ds 2020-04-31 -de 2020-04-01 -vol 1024
7 (день которого нет в месяце)
T4.5 app.jar -login vasya -pass 123 -role READ -res A -ds 2020-02-32 -de 2020-04-01 -vol 1024
7 (несуществующее число)
T4.6 app.jar -login vasya -pass 123 -role READ -res A -ds 2020-03-10 -de 2020-04-01 -vol -1024
7 (неверный объем)
T4.7 app.jar -login vasya -pass 123 -role READ -res A -ds 2020-03-10 -de 2020-04-01 -vol alot
7 (некорректный объем)
T4.8 app.jar -login vasya -pass 123 -role READ -res A -ds 2020-03-10 -de 2020-04-01
0 (удачная авторизация)
T4.9 app.jar -login admin -pass admin -role WRITE -res A.B.C -ds 2020-03-10 -de 2020-01-01 -vol 1024
0 (проверка другого юзера)
T4.10 app.jar -login vasya -pass 123 -role WRITE -res A.B.C -ds 2020-12-01 -de 2020-01-45 -vol 1024
7 (несуществующее число)
T4.11 app.jar -login vasya -pass 123 -role EXECUTE -res A.B.C -ds 2020-12-01 -de 2020-01-45 -vol 1024
6 (не проходит авторизация)
-
Обрабатываем простой сценарий (4 мин. 10 сек.)
- Проверяем наличие аргументов (30 сек.)
- Создаём функцию вывода справки (3 мин.)
-
exitProcess(1)
- Проверяем надо ли выводить справку (20 сек.)
Args[0] == “-h”
- Во всех остальных случаях выводим справку и возвращаем
0
(20 сек.)
-
Сценарии аутентификации (16 мин. 30 сек.)
- Создаем метод
needAuthentication()
(20 сек.)Args[0] == “-login” && args[2] == “-pass”
- Создаем метод
validateLogin()
(2 мин.) (проверяем правильность формата логина через regex) - Создаем метод
loginExists()
(20 сек.) проверяем чтоlogin == vasya
- Создаем метод
authenticate()
(20 сек.) проверяем чтоlogin == vasya && pass == 123
- Создаем
DataClass User(login, pass)
(40 сек.) - Создаем коллекцию юзеров, заполняем данные (2 мин.)
- Исправляем методы на работу с коллекцией (4 мин.)
- Создаём класс
argHandler
: (5 мин.)Конструктор (args: Array<String>)
needHelp()
isArgs()
needAuthentication()
- Рефакторим код на использование
argHandler()
(2 мин.)
- Создаем метод
-
Сценарии авторизаци (9 мин.)
- Создаем метод
needAuthorization()
в классеargHandler
(1 мин.) - Создаем метод
validateRole()
(40 сек.) (проверяем правильность роли) - Создаем метод проверки доступа к ресурсу (20 сек.)
проверяем что
res == A && role == READ && user == vasya
- Создаем
DataClass Permission(res, ro, user)
(1 мин.) - Создаем коллекцию разрешений, заполняем данные (4 мин.)
- Исправляем методы на работу с коллекцией (2 мин.)
- Создаем метод
-
Сценарии аккаунтинга (12 мин. 30 сек.)
- Создаем метод
needAccounting()
в классеargHandler
(1 мин.) - Создаем метод
validateVol()
(30 сек.) (проверяем правильность объёма) - Создаем метод
validateDate()
(5 мин.) (проверяем правильность даты) - Создаем
DataClass Activity(user, res, role, ds, de, vol)
(5 мин.) - Создаем коллекцию для хранения активности (30 сек.)
- Создаем объект с переданными данными и помещаем его в коллекцию (30 сек.)
- Создаем метод
-
Модифицируем класс
argHandler
для обработки аргументов в любом порядке (10 мин.) (используя kotlinx.cli) -
Делаем хранение паролей безопасным (29 мин.)
- Создаем метод
getSalt()
(20 сек.)return "46c61ea8b02362b462f24f1ac8d9aacd"
- Создаём метод
getSaltedHash()
(2 мин.) (солим пароль, хэшируем используя sha256 и возвращаем хэш) - Создаём метод
authHash()
(20 сек.) проверяем чтоlogin == vasya && hash == fc5e540b95138a20e304971df53d66887495a05050031881799feeedcfa52f24
- Модифицируем класс
User
для хранения соли и хэша (30 сек.) - Генерируем уникальную соль для каждого пользователя и сохраняем в коллекцию пользователей (10 мин.)
- Генерируем хэш на основе пароля и соли из коллекции для каждого пользователя и сохраняем в коллекцию (10 мин.)
- Исправляем
getSalt()
иauthHash()
на работу с коллекцией (5 мин.) - Подменяем метод
authenticate()
наauthHash()
(20 сек.) (удаляемauthenticate()
, меняем названиеauthHash()
наauthenticate()
) - Удаляем пароли записанные текстом из коллекции (30 сек.)
- Создаем метод
Пункт плана | Оценка времени | Фактическое время | Итого |
---|---|---|---|
1. | 3 мин. | ||
2. | 1 мин. | ||
3. | 2 мин. | ||
5. | 8 мин. | ||
6. | 4 мин. 10 сек. | ||
6.1. | 30 сек. | ||
6.2. | 3 мин. | ||
6.3. | 20 сек. | ||
6.4. | 20 сек. | ||
7. | 16 мин. 30 сек. | ||
7.1. | 20 сек. | ||
7.2. | 2 мин. | ||
7.3. | 20 сек. | ||
7.4. | 20 сек. | ||
7.5. | 40 сек. | ||
7.6. | 2 мин. | ||
7.7. | 4 мин. | ||
7.8. | 5 мин. | ||
7.9. | 2 мин. | ||
8. | 9 мин. | ||
8.1. | 1 мин. | ||
8.2. | 40 сек. | ||
8.3. | 20 сек. | ||
8.4. | 1 мин. | ||
8.5. | 4 мин. | ||
8.6. | 2 мин. | ||
9. | 12 мин. 30 сек. | ||
9.1. | 1 мин. | ||
9.2. | 30 сек. | ||
9.3. | 5 мин. | ||
9.4. | 5 мин. | ||
9.5. | 30 сек. | ||
9.6. | 30 сек. | ||
10. | 10 мин. | ||
11. | 29 мин. | ||
11.1. | 20 сек. | ||
11.2. | 2 мин. | ||
11.3. | 20 сек. | ||
11.4. | 30 сек. | ||
11.5. | 10 мин. | ||
11.6. | 10 мин. | ||
11.7. | 5 мин. | ||
11.8. | 20 сек. | ||
11.9. | 30 сек. |