Ztráta cca 0.1 bodu z bonusu za povolení duplicitního parametru.
10: celkem bodu
1.1: premie
====== Prehled hodnoceni ==========
1: uhlednost kodu: ok
1: komentare: ok
1: identifikatory: ok
1: spravna volba datovych typu: ok
1: rozklad na funkce a vyuziti funkci: ok
0.3: bonus za doxygen komentare
: Level 1
0.3:ok: pwcheck 1 1 <hesla.txt >1_0
0.2:ok: pwcheck 1 1 <hesla_1_unsafe.txt >1_1
0.2:ok: pwcheck 1 1 <hesla_1_safe.txt >1_2
0.2:ok: pwcheck 1 1 <hesla_mixed.txt >1_3
: Level 2
0.3:ok: pwcheck 2 3 <hesla.txt >2_0
0.2:ok: pwcheck 2 2 <hesla_2_unsafe.txt >2_1
0.2:ok: pwcheck 2 1 <hesla_2_safe.txt >2_2
0.2:ok: pwcheck 2 4 <hesla_mixed.txt >2_3
: Level 3
0.3:ok: pwcheck 3 2 <hesla.txt >3_0
0.2:ok: pwcheck 3 1 <hesla_3_unsafe.txt >3_1
0.2:ok: pwcheck 3 4 <hesla_3_safe.txt >3_2
0.2:ok: pwcheck 3 3 <hesla_mixed.txt >3_3
: Level 4
0.3:ok: pwcheck 4 2 <hesla.txt >4_0
0.2:ok: pwcheck 4 2 <hesla_4_unsafe.txt >4_1
0.2:ok: pwcheck 4 4 <hesla_4_safe.txt >4_2
0.2:ok: pwcheck 4 3 <hesla_mixed.txt >4_3
: Statistiky + komplikovanejsi
0.3:ok: pwcheck 2 4 --stats <hesla.txt >5_0
0.2:ok: pwcheck 2 4 --stats <hesla_nchars.txt >5_1
0.2:ok: pwcheck 1 1 --stats <hesla_empty.txt >6_1
0.2:ok: pwcheck 4 4 <hesla_overlapping.txt >6_3
: Bonus
0.2:ok: pwcheck --stats <hesla.txt >8_1
0.3:ok: pwcheck -l 2 <hesla.txt >8_2
0.3:ok: pwcheck --stats -p 2 -l 3 <hesla.txt >8_3
0:chyba: duplicitni parametr
0.1:ok: pwcheck 1 1 <hesla_empty_line.txt
0.1:ok: pwcheck 1 1 --stats <hesla_whitespaces.txt
0.1:ok: pwcheck 3 101 <hesla_big_level.txt
0.1:ok: reakce na neocekavane argumenty
0.05:ok: reakce na spatne argumenty (neni cislo)
0.05:ok: reakce na spatne argumenty (zaporne cislo)
====== Log z prekladu =============
Ok
====== Analyza kodu ===============
Ok
====== Log z jednotlivych testu ===
: Level 1
0.3:ok: pwcheck 1 1 <hesla.txt >1_0
0.2:ok: pwcheck 1 1 <hesla_1_unsafe.txt >1_1
0.2:ok: pwcheck 1 1 <hesla_1_safe.txt >1_2
0.2:ok: pwcheck 1 1 <hesla_mixed.txt >1_3
: Level 2
0.3:ok: pwcheck 2 3 <hesla.txt >2_0
0.2:ok: pwcheck 2 2 <hesla_2_unsafe.txt >2_1
0.2:ok: pwcheck 2 1 <hesla_2_safe.txt >2_2
0.2:ok: pwcheck 2 4 <hesla_mixed.txt >2_3
: Level 3
0.3:ok: pwcheck 3 2 <hesla.txt >3_0
0.2:ok: pwcheck 3 1 <hesla_3_unsafe.txt >3_1
0.2:ok: pwcheck 3 4 <hesla_3_safe.txt >3_2
0.2:ok: pwcheck 3 3 <hesla_mixed.txt >3_3
: Level 4
0.3:ok: pwcheck 4 2 <hesla.txt >4_0
0.2:ok: pwcheck 4 2 <hesla_4_unsafe.txt >4_1
0.2:ok: pwcheck 4 4 <hesla_4_safe.txt >4_2
0.2:ok: pwcheck 4 3 <hesla_mixed.txt >4_3
: Statistiky + komplikovanejsi
0.3:ok: pwcheck 2 4 --stats <hesla.txt >5_0
0.2:ok: pwcheck 2 4 --stats <hesla_nchars.txt >5_1
0.2:ok: pwcheck 1 1 --stats <hesla_empty.txt >6_1
0.2:ok: pwcheck 4 4 <hesla_overlapping.txt >6_3
: Bonus
0.2:ok: pwcheck --stats <hesla.txt >8_1
0.3:ok: pwcheck -l 2 <hesla.txt >8_2
0.3:ok: pwcheck --stats -p 2 -l 3 <hesla.txt >8_3
0:chyba: duplicitni parametr
0.1:ok: pwcheck 1 1 <hesla_empty_line.txt
0.1:ok: pwcheck 1 1 --stats <hesla_whitespaces.txt
0.1:ok: pwcheck 3 101 <hesla_big_level.txt
0.1:ok: reakce na neocekavane argumenty
# Neplatny prepinac --test
0.05:ok: reakce na spatne argumenty (neni cislo)
# Argument LEVEL musi byt cele cislo mezi 1 a 4!
0.05:ok: reakce na spatne argumenty (zaporne cislo)
# Argument LEVEL musi byt cele cislo mezi 1 a 4!
Projekt 1 - Ověřování síly hesel (práce s textem)
Snad všichni známe tu situaci, kdy si chceme vytvořit nové heslo do nějakého systému, ale ten nás pořád otravuje nesmyslnými požadavky na formát hesla. I když jednoduchá kombinatorika říka, že většina těchto pravidel je zbytečná a nejbezpečnější je prostě vytvořit dostatečně dlouhé heslo, pravidla pořád existují a uživatelé se s nimi musí naučit žít. V tomto projektu se na daný problém podíváme z opačné strany, konkrétně si vyzkoušíme, jak takový jednoduchý systém ověřující sílu hesel naprogramovat.
Cílem projektu je vytvořit program, který na vstupu dostane sadu hesel a pro každé z nich ověří, jestli heslo splňuje všechna (pevně zadaná) požadovaná pravidla. Ta hesla, která projdou kontrolou, budou vypisována na výstup, ostatní budou zahozena.
Program implementujte ve zdrojovém souboru "pwcheck.c"
. Vstupní data (seznam hesel) budou čtena ze standardního vstupu (stdin), výstup (filtrovaný seznam hesel) bude tisknut na standardní výstup (stdout).
Odevzdání: Odevzdejte zdrojový soubor pwcheck.c prostřednictvím informačního systému.
Překlad: Program překládejte s následujícími argumenty:
$ gcc -std=c99 -Wall -Wextra -Werror pwcheck.c -o pwcheck
Program se spouští v následující podobě: (./pwcheck
značí umístění a název programu):
./pwcheck LEVEL PARAM [--stats]
Program je spouštěn se dvěma pevně zadanými argumenty LEVEL
a PARAM
a s jedním volitelným argumentem --stats
, případně zadaným na třetí pozici:
LEVEL
celé číslo v intervalu [1, 4], které určuje požadovanou úroveň bezpečnosti (viz níže)PARAM
kladné celé číslo, které určuje dodatečný parametr pravidel (viz níže)--stats
pokud je zadané, určuje, zda se na konci programu mají vypsat souhrnné statistiky analyzovaných hesel
Jsou definovány celkem 4 úrovně bezpečnosti vyjádřeny pomocí 4 pravidel. Úroveň bezpečnosti určuje, že hesla musí splňovat všechna pravidla na dané a nižší úrovni. Tzn. např. úroveň bezpečnosti 3 specifikuje, že hesla musí splňovat pravidla 1, 2 a 3.
Některá pravidla jsou parametrizovatelná celým číslem zadaným pomocí argumentu programu PARAM. V následujícím seznamu je tento parametr označen jako X.
- Heslo obsahuje alespoň 1 velké a 1 malé písmeno.
- Heslo obsahuje znaky z alespoň X skupin (v případě, že je číslo X větší než 4, myslí se tím všechny skupiny). Uvažované skupiny jsou:
- malá písmena (a-z)
- velká písmena (A-Z)
- čísla (0-9)
- speciální znaky (podporované musí být alespoň nealfanumerické znaky z ASCII tabulky na pozicích 33-126 32-126, tedy včetně mezery)
- Heslo neobsahuje sekvenci stejných znaků délky alespoň X.
- Heslo neobsahuje dva stejné podřetězce délky alespoň X.
Pokud je zadaný argument programu --stats, program musí na konec výstupu vypsat celkové statistiky ve formátu:
Statistika:
Ruznych znaku: NCHARS
Minimalni delka: MIN
Prumerna delka: AVG
kde NCHARS je počet různých znaků vyskytujících se napříč všemi hesly, MIN je délka nejkratšího hesla (resp. hesel) a AVG je průměrná délka hesla (aritmetický průměr) zaokrouhlená na 1 desetiné místo. Statistiky zahrňují i hesla, která byla zahozena.
Seznam hesel je programu předán na standardním vstupu (stdin). Každé heslo je zadáno na samostatném řádku a obsahuje pouze ASCII textová data, kromě znaku nového řádku. Maximální délka hesla je 100 znaků, jinak se jedná o nevalidní data. Program musí podporovat neomezený počet hesel na vstupu.
Program na standardní výstup (stdout) vypisuje hesla ze vstupního seznamu, každé na samostatný řádek, která splňují požadovanou úroveň bezpečnosti zadanou jako argument programu LEVEL. Hesla musí být vypsána beze změny a ve stejném pořadí, v jakém se objevila na vstupu.
Za výstupním seznamem hesel pak program volitelně vypisuje statistiku (viz. Statistiky).
Je zakázané použít následující funkce:
- volání funkcí z knihoven string.h a ctype.h - cílem projektu je naučit se implementovat dané funkce ručně,
- volání z rodiny malloc a free - práce s dynamickou pamětí není v tomto projektu zapotřebí,
- volání z rodiny fopen, fclose, fscanf, ... - práce se soubory (dočasnými) není v tomto projektu žádoucí,
- volání funkce exit - cílem projektu je naučit se vytvořit programové konstrukce, které dokáží zpracovat neočekávaný stav programu a případně program řádně ukončit návratem z funkce main.
Na chyby za běhu programu reagujte obvyklým způsobem: na neočekávaná vstupní data, formát vstupních dat nebo chyby při volání funkcí reagujte přerušením programu se stručným a výstižným chybovým hlášením na příslušný výstup a odpovídajícím návratovým kódem. Hlášení budou v kódování ASCII česky nebo anglicky.
Pomocný soubor se seznamem hesel:
$ cat hesla.txt
1234567890
Password
Heslo123
Mojevelmidlouhehesloscislem0
IZP2021:[email protected]
Příklady spuštění:
./pwcheck 1 1 <hesla.txt
Password
Heslo123
Mojevelmidlouhehesloscislem0
IZP2021:[email protected]
./pwcheck 2 3 <hesla.txt
Heslo123
Mojevelmidlouhehesloscislem0
IZP2021:[email protected]
./pwcheck 3 2 <hesla.txt
Heslo123
Mojevelmidlouhehesloscislem0
IZP2021:[email protected]
./pwcheck 4 2 <hesla.txt
Heslo123
IZP2021:[email protected]
./pwcheck 2 4 --stats <hesla.txt
IZP2021:[email protected]
Statistika:
Ruznych znaku: 36
Minimalni delka: 8
Prumerna delka: 14.4
Funkcionalita vašeho programu bude hodnocena na strojích s operačním systémem GNU Linux.
Na výsledné hodnocení mají hlavní vliv následující faktory:
- přeložitelnost zdrojového souboru,
- formát zdrojového souboru (členění, zarovnání, komentáře, vhodně zvolené identifikátory), dekompozice problému na podproblémy (vhodné funkce, vhodná délka funkcí a parametry funkcí),
- správná volba datových typů, případně tvorba nových typů,
- správná funkcionalita filtrování hesel,
- ošetření chybových stavů.
- Detekce jednotlivých pravidel: jelikož každá úroveň zabezpečení vyžaduje ověření všech pravidel nižší úrovně, dává smysl jednotlivá pravidla implementovat v pořadí, jak jsou zadána.
- Vypisování statistik.
- Další (prémiové) rozšíření funkcionality.
Prémiové řešení je dobrovolné a lze za něj získat bonusové body. Podmínkou pro udělení prémiových bodů je výborné vypracování povinných částí projektu zadání. Výsledné hodnocení je plně v kompetenci vyučujího, který bude projekt hodnotit. Výše prémiových bodů závisí také na sofistikovanosti řešení.
Pokročilé načítání argumentů příkazové řádky (až 1 bod): program nevyžaduje argumenty pouze na pevných pozicích, ale je možné zadat úroveň zabezpečení a parametr pravidel také pomocí volitelných přepínačů. Syntax spuštění:
./pwcheck [-l LEVEL] [-p PARAM] [--stats]
přičemž jednotlivé přepínače mohou být zadány v libovolném pořadí. Při nezadání přepínače je výchozí hodnota příslušného argumentu 1. Upozornění: program v rozšířené formě musí stále akceptovat argumenty příkazové řádky původní, nerozšířené varianty:
./pwcheck LEVEL PARAM [--stats]