diff --git a/data/info3/db.json b/data/info3/db.json new file mode 100644 index 000000000..2e216d680 --- /dev/null +++ b/data/info3/db.json @@ -0,0 +1,268 @@ +{ + "autorzy": [ + { "id": 1, "imieNazwisko": "Andrzej Sapkowski", "rokUrodzenia": 1948, "miejsceUrodzenia": "Łódź", "nagrodyNobla": false, "aktywnyOd": 1986 }, + { "id": 2, "imieNazwisko": "Olga Tokarczuk", "rokUrodzenia": 1962, "miejsceUrodzenia": "Peglów", "nagrodyNobla": true, "aktywnyOd": 1993 }, + { "id": 3, "imieNazwisko": "Stanisław Lem", "rokUrodzenia": 1921, "miejsceUrodzenia": "Lwów", "nagrodyNobla": false, "aktywnyOd": 1946 }, + { "id": 4, "imieNazwisko": "Henryk Sienkiewicz", "rokUrodzenia": 1846, "miejsceUrodzenia": "Wola Okrzejska", "nagrodyNobla": true, "aktywnyOd": 1866 }, + { "id": 5, "imieNazwisko": "Wisława Szymborska", "rokUrodzenia": 1923, "miejsceUrodzenia": "Prowent", "nagrodyNobla": true, "aktywnyOd": 1945 }, + { "id": 6, "imieNazwisko": "Czesław Miłosz", "rokUrodzenia": 1911, "miejsceUrodzenia": "Šeteniai", "nagrodyNobla": true, "aktywnyOd": 1930 }, + { "id": 7, "imieNazwisko": "Ryszard Kapuściński", "rokUrodzenia": 1932, "miejsceUrodzenia": "Pińsk", "nagrodyNobla": false, "aktywnyOd": 1955 }, + { "id": 8, "imieNazwisko": "Bruno Schulz", "rokUrodzenia": 1892, "miejsceUrodzenia": "Drohobycz", "nagrodyNobla": false, "aktywnyOd": 1934 }, + { "id": 9, "imieNazwisko": "Witold Gombrowicz", "rokUrodzenia": 1904, "miejsceUrodzenia": "Małoszyce", "nagrodyNobla": false, "aktywnyOd": 1933 }, + { "id": 10, "imieNazwisko": "Zygmunt Miłoszewski", "rokUrodzenia": 1976, "miejsceUrodzenia": "Warszawa", "nagrodyNobla": false, "aktywnyOd": 2005 } + ], + "ksiazki": [ + { + "id": 1, + "tytul": "Ostatnie życzenie", + "autorId": 1, + "rokWydania": 1993, + "gatunek": "fantasy", + "cykl": "Wiedźmin", + "miejsceWCyklu": 1, + "liczbaJezykowPrzekladu": 37, + "nagrody": [], + "adaptacje": ["gra wideo", "serial Netflix"] + }, + { + "id": 2, + "tytul": "Krew elfów", + "autorId": 1, + "rokWydania": 1994, + "gatunek": "fantasy", + "cykl": "Wiedźmin", + "miejsceWCyklu": 3, + "liczbaJezykowPrzekladu": 37, + "nagrody": ["David Gemmell Legend Award 2009"], + "adaptacje": ["gra wideo", "serial Netflix"] + }, + { + "id": 3, + "tytul": "Wieża Jaskółki", + "autorId": 1, + "rokWydania": 1997, + "gatunek": "fantasy", + "cykl": "Wiedźmin", + "miejsceWCyklu": 6, + "liczbaJezykowPrzekladu": 37, + "nagrody": [], + "adaptacje": ["gra wideo"] + }, + { + "id": 4, + "tytul": "Bieguni", + "autorId": 2, + "rokWydania": 2007, + "gatunek": "proza literacka", + "cykl": null, + "miejsceWCyklu": null, + "liczbaJezykowPrzekladu": 40, + "nagrody": ["Man Booker International Prize 2018", "Nagroda Literacka Nike 2008"], + "adaptacje": [] + }, + { + "id": 5, + "tytul": "Prowadź swój pług przez kości umarłych", + "autorId": 2, + "rokWydania": 2009, + "gatunek": "kryminał", + "cykl": null, + "miejsceWCyklu": null, + "liczbaJezykowPrzekladu": 40, + "nagrody": ["CWA International Dagger 2020"], + "adaptacje": ["film (Pokot, 2017)"] + }, + { + "id": 6, + "tytul": "Księgi Jakubowe", + "autorId": 2, + "rokWydania": 2014, + "gatunek": "powieść historyczna", + "cykl": null, + "miejsceWCyklu": null, + "liczbaJezykowPrzekladu": 40, + "nagrody": ["Nagroda Literacka Nike 2015"], + "adaptacje": [] + }, + { + "id": 7, + "tytul": "Solaris", + "autorId": 3, + "rokWydania": 1961, + "gatunek": "science fiction", + "cykl": null, + "miejsceWCyklu": null, + "liczbaJezykowPrzekladu": 41, + "nagrody": [], + "adaptacje": ["film (Tarkowski, 1972)", "film (Soderbergh, 2002)"] + }, + { + "id": 8, + "tytul": "Cyberiada", + "autorId": 3, + "rokWydania": 1965, + "gatunek": "science fiction", + "cykl": null, + "miejsceWCyklu": null, + "liczbaJezykowPrzekladu": 30, + "nagrody": [], + "adaptacje": [] + }, + { + "id": 9, + "tytul": "Głos Pana", + "autorId": 3, + "rokWydania": 1968, + "gatunek": "science fiction", + "cykl": null, + "miejsceWCyklu": null, + "liczbaJezykowPrzekladu": 25, + "nagrody": [], + "adaptacje": [] + }, + { + "id": 10, + "tytul": "Quo Vadis", + "autorId": 4, + "rokWydania": 1896, + "gatunek": "powieść historyczna", + "cykl": null, + "miejsceWCyklu": null, + "liczbaJezykowPrzekladu": 50, + "nagrody": ["Nagroda Nobla w dziedzinie literatury 1905 (autor)"], + "adaptacje": ["film (1951)", "film (1985)"] + }, + { + "id": 11, + "tytul": "Ogniem i mieczem", + "autorId": 4, + "rokWydania": 1884, + "gatunek": "powieść historyczna", + "cykl": "Trylogia", + "miejsceWCyklu": 1, + "liczbaJezykowPrzekladu": 20, + "nagrody": [], + "adaptacje": ["film (1999)"] + }, + { + "id": 12, + "tytul": "Wiersze wybrane", + "autorId": 5, + "rokWydania": 1998, + "gatunek": "poezja", + "cykl": null, + "miejsceWCyklu": null, + "liczbaJezykowPrzekladu": 44, + "nagrody": ["Nagroda Nobla w dziedzinie literatury 1996 (autorka)"], + "adaptacje": [] + }, + { + "id": 13, + "tytul": "Zniewolony umysł", + "autorId": 6, + "rokWydania": 1953, + "gatunek": "literatura faktu", + "cykl": null, + "miejsceWCyklu": null, + "liczbaJezykowPrzekladu": 30, + "nagrody": ["Nagroda Nobla w dziedzinie literatury 1980 (autor)"], + "adaptacje": [] + }, + { + "id": 14, + "tytul": "Dolina Issy", + "autorId": 6, + "rokWydania": 1955, + "gatunek": "proza literacka", + "cykl": null, + "miejsceWCyklu": null, + "liczbaJezykowPrzekladu": 20, + "nagrody": [], + "adaptacje": [] + }, + { + "id": 15, + "tytul": "Podróże z Herodotem", + "autorId": 7, + "rokWydania": 2004, + "gatunek": "literatura faktu", + "cykl": null, + "miejsceWCyklu": null, + "liczbaJezykowPrzekladu": 25, + "nagrody": [], + "adaptacje": [] + }, + { + "id": 16, + "tytul": "Cesarz", + "autorId": 7, + "rokWydania": 1978, + "gatunek": "literatura faktu", + "cykl": null, + "miejsceWCyklu": null, + "liczbaJezykowPrzekladu": 30, + "nagrody": [], + "adaptacje": [] + }, + { + "id": 17, + "tytul": "Sklepy cynamonowe", + "autorId": 8, + "rokWydania": 1934, + "gatunek": "proza literacka", + "cykl": null, + "miejsceWCyklu": null, + "liczbaJezykowPrzekladu": 25, + "nagrody": [], + "adaptacje": ["film (Brothers Quay, 1986)"] + }, + { + "id": 18, + "tytul": "Sanatorium Pod Klepsydrą", + "autorId": 8, + "rokWydania": 1937, + "gatunek": "proza literacka", + "cykl": null, + "miejsceWCyklu": null, + "liczbaJezykowPrzekladu": 20, + "nagrody": [], + "adaptacje": ["film (Wojciech Has, 1973)"] + }, + { + "id": 19, + "tytul": "Ferdydurke", + "autorId": 9, + "rokWydania": 1937, + "gatunek": "proza literacka", + "cykl": null, + "miejsceWCyklu": null, + "liczbaJezykowPrzekladu": 30, + "nagrody": [], + "adaptacje": ["film (1991)"] + }, + { + "id": 20, + "tytul": "Ziarno prawdy", + "autorId": 10, + "rokWydania": 2011, + "gatunek": "kryminał", + "cykl": "Prokurator Szacki", + "miejsceWCyklu": 2, + "liczbaJezykowPrzekladu": 18, + "nagrody": [], + "adaptacje": [] + } + ], + "recenzje": [ + { "id": 1, "ksiazkaId": 1, "ocena": 5, "komentarz": "Format opowiadań idealnie sprawdza się przy wprowadzaniu do świata Geralta." }, + { "id": 2, "ksiazkaId": 1, "ocena": 4, "komentarz": "Świetny punkt wejścia do serii. Słowiański folklor nadaje jej wyjątkowy charakter." }, + { "id": 3, "ksiazkaId": 4, "ocena": 5, "komentarz": "Najbardziej przystępna powieść Tokarczuk. Niekonwencjonalna, ale satysfakcjonująca." }, + { "id": 4, "ksiazkaId": 5, "ocena": 4, "komentarz": "Sprytny thriller oparty na głębokich pytaniach filozoficznych o naturę." }, + { "id": 5, "ksiazkaId": 7, "ocena": 5, "komentarz": "Jedna z największych powieści science fiction w historii. Ocean jako metafora – niezapomniane." }, + { "id": 6, "ksiazkaId": 7, "ocena": 4, "komentarz": "Gęsta, ale warta wysiłku. Adaptacja Tarkowskiego jest równie niezbędna." }, + { "id": 7, "ksiazkaId": 10, "ocena": 5, "komentarz": "Wciągająca po 130 latach. Nie bez powodu najczęściej tłumaczona polska powieść." }, + { "id": 8, "ksiazkaId": 13, "ocena": 5, "komentarz": "Lektura obowiązkowa, by zrozumieć, jak totalitaryzm niszczy intelektualistów." }, + { "id": 9, "ksiazkaId": 17, "ocena": 5, "komentarz": "Surrealistyczna i oniryczna. Schulz buduje całą mitologię z małego miasteczka." }, + { "id": 10, "ksiazkaId": 19, "ocena": 4, "komentarz": "Absurdalna i wymagająca, ale satyra Gombrowicza wciąż jest aktualna." } + ] +} diff --git a/info3_lab_6.md b/info3_lab_6.md index c5ab23443..ad71e6462 100644 --- a/info3_lab_6.md +++ b/info3_lab_6.md @@ -1,191 +1,201 @@ --- -author: "Ł. Łaniewski-Wołłk" +author: "J. Gałecki" course: Informatyka III material: Instrukcja 6 number: 6 --- -# Polecenia i Materiały -By otworzyć linię poleceń w systemie Windows, można: poszukać jej w Akcesoriach, bądz wybrać Menu Start, Uruchom i wpisać `cmd`. +# REST API -Większość poleceń należy wykonać na maszynie `info3.meil.pw.edu.pl`, lecz niektóre można wykonać w lini poleceń Windows. +Interfejsy REST (Representational State Transfer) służą do komunikacji między klientem i serwerem przy użyciu protokołu HTTP. +Dane przeważnie (choć nie zawsze) wymieniane są w formacie [JSON](https://en.wikipedia.org/wiki/JSON#Syntax). +Na dzisiejszych zajęciach przećwiczymy interakcję z serwerem przy pomocy tej technologii. -Materiały do tego laboratiorium można znaleść w katalogu `/home/zasoby/Info3/smsniff` na serwerze `info3.meil.pw.edu.pl`. Całą zawartość katalogu można przegrać np. na pulpit za pomocą WinSCP, a na koniec zajęć skasować. +### `curl` -# Serwery i porty -Standard TCP/IP mówi jak na na podstawowym poziomie działa Internet. W internecie są podłączone komputery i każdy z nich ma swój unikatowy numer IP. Ten numer to 4 bajty - zazwyczaj zapisuje się go w postaci 4 liczb oddzielonych kropkami (np. 127.0.0.1). Bajt to 8 bitów, wiec można w nim zapisać liczby od $0$ do $2^8-1 = 255$. Tak więc wszystkich numerów IP jest $2^{32}$ więc ponad $4$ miliardy. Jednak w internecie numery sa przydzielane grupami, wiec szybko się wyczerpały. W związku z tym wprowadzono nowy standard IPv6. Nie należy jednak sądzić że to $6$ oznacza że teraz jest $6$ liczb. Jest to poprostu wersja 6ta standardu - i numerów jest teraz $2^{128}$, co daje prawie jeden septylion. Są pewne grupy numerów które są wyjątkowe.: +Narzędziem, z którego będziemy korzystać do wysyłania zapytań do serwera będzie [`curl`](https://www.man7.org/linux/man-pages/man1/curl.1.html). +Możemy przetestować jego działanie komendą -- 127.0.0.1 (localhost) -- numer IP komputera na którym jesteśmy zalogowani -- widoczny tylko z tego komputera -- 192.168.?.? -- numery IP komputerów w sieci lokalnej -- widoczne tylko wewnątrz tej sieci -- 192.168.0.1 -- zwyczajowy adres bramy sieci (np routera w twoim domu) -- widoczny tylko w tej sieci. +```bash +curl 'https://example.com' +``` -Standardową metodą komunikacji jest łączenie się jednego komputera z portem drugiego komputera. Każdy komputer ma wiele portów --- tak by jeden komputer mógł obsługiwać wiele różnych funkcji. Komputer który łączy się nazywamy klientem, zaś komputer do którego się łączymy serwerem. Rozmawiają one przy pomocy zestawu ustalonych komend, które nazywamy protokołem. Żeby nie pomylić protokołów, przypisano im unikatowe porty. To oznacza, że dany port jest zwyczajowo używany do danego protokołu --- ale fizycznie można by do tego użyć dowolnego innego. +Powyższe zawołanie powinno wyświetlić kod HTML witryny `example.com`. +Używając przeglądarki zweryfikuj, czy kod zgadza się z wyświetlaną zawartością. -### Ćwiczenia +Kilka ciekawych opcji `curl`a to: -- Spróbuj dowiedzieć się jaki numer IP mają różne komputery używając np. komendy `ping google.com` -- Spróbuj to samo z nazwami `localhost` i `orange.meil.pw.edu.pl` -- Spróbuj dowiedzieć się coś wiecej o wybranej domenie `whois google.com` albo `whois onet.pl` +- `-I` - wyświetla jedynie nagłówek dokumentu. Przydatne do sprawdzania poprawności zapytań. +- `-v` (verbose) - drukuje kolejne etapy działania `curl`a. -## Telnet -**Port**: 23 +#### Zadanie -Jednym z bardzo użytecznych programów jest `telnet`. Gdy uruchomimy `telnet google.com` program spróbuje połączyć się z komputerem google.com, na porcie 23. Gdyby udało mu sie połączyć, moglibyśmy z klawiatury wysyłać teksty do serwera, a na ekranie wyswietlała by się odpowiedz. Telnet służył do obsługi konsoli --- tak jak SSH (putty) którego używasz. Jednak telnet nie był niczym zabezpieczony (nawet hasło było widoczne), dlatego nie jest teraz nigdzie używany. Jednak `telnet` jest użyteczny ponieważ możemy mu wskazać port na który ma się połączyć --- i w ten sposób "oszukać" program i połączyć się z innym protokołem. +Używając opcji `-v` ustal: -### Ćwiczenia -W następnych ćwiczenia połączymy się na różnych portach z różnymi komputerami pisząc: +- Jaki adres IPv6 ma witryna `example.com`? +- Do kiedy ważny jest certyfikat tej strony? -- `telnet info3.meil.pw.edu.pl` -- `telnet info3.meil.pw.edu.pl 22` -- `telnet localhost` -- `telnet google.com` -- `telnet google.com 80` +## Czytanie prognozy pogody -## Hypertext Transfer Protocol (HTTP) -**Port**:80 **SSL**:443 +Skoro wiemy już jak uzyskać połączenie z serwerem, możemy teraz spróbować pobrać z niego użyteczne dane. +W celach demonstracyjnych skorzystamy z serwisu [`open-meteo.com`](https://open-meteo.com/), który bezpłatnie (przynajmniej na potrzeby niekomercyjne) udostępnia prognozę pogodny. +Możesz otworzyć serwis w przeglądarce i "wyklikać" bieżącą prognozę. +Sama znajomość URL serwisu nie wystarczy jednak do jego integracji w ramach zautomatyzowanych skryptów, które moglibyśmy chcieć przygotować. +Skrypty oczywiście nie mogą "klikać," ale nawet użycie `curl`a nie rozwiązuje problemu. +Strona musiałaby zwracać całą zawartość bazy danych, którą musielibyśmy ręcznie przeszukiwać. +Takie rozwiązanie byłoby ekstremalnie niewydajne (nie wspominając już nawet o kwestiach bezpieczeństwa). +Wobec tego strona musi wystawiać jakiegoś rodzaju interfejs (API), pozwalający na selektywne odpytywanie w poszukiwaniu konkretnych informacji. +Tę właśnie rolę pełni REST. -HTTP to najczęściej używany protokół w internecie. Pozwala on na pobieranie stron z serwerów. W odróżnieniu od poprzednich, nie jest to protokół typu *instrukcja-odpowiedz*. W tym protokole, wysyłamy zapytanie, zaś serwer wysyła nam odpowiedz i zamyka połączenie. Zapytanie wygląda następująco: +Otwórz [dokumentację API serwisu](https://open-meteo.com/en/docs). +Domyślne sugerowane wyszukiwanie dotyczy godzinowej temperatury w Twojej lokalizacji: -```HTTP -GET [ścieżka] HTTP/1.0 -Host: [nazwa serwera] -[inna opcja]: [wartosc] -[pusta linia] +```bash +# Uwaga na apostrofy +curl 'https://api.open-meteo.com/v1/forecast?latitude=52.52&longitude=13.41&hourly=temperature_2m' ``` -Po `GET` naprawdę nie trzeba pisać nic --- lecz jeden serwer może obsługiwać strony gazeta.pl, tv.gazeta.pl i wiadomosci.gazeta.pl, gdybyśmy nie podali `Host:` serwer nie wiedziałby o którą stronę chodzi. -Dla przykładu jeśli chcemy sciągnać stronę `http://m.google.com/index.html` wpiszemy: -```HTTP -GET /index.html HTTP/1.0 -Host: m.google.com +Dane zwracane są w formacie JSON. +Jeżeli chcesz wyświetlić je w nieco bardziej przejrzysty sposób, możesz zpipe'ować wynik do narzędzia `jq`: + +```bash +curl [...] | jq ``` -Inne opcje to : +Zauważ, że `v1/forecast` to ***endpoint***, wobec którego wysyłamy zapytania. +Mówiąc nieco konkretniej, przy pomocy metod HTTP skierowanych pod odpowiednio skonstruowany URL możemy czytać (a także modyfikować, o czym dalej) stan bazy danych, znajdującej się na serwerze. +Po znaku `?` możemy zadać parametry naszego zapytania (zdefiniowane w dokumentacji), łączone znakiem `&` (taka konstrukcja może wyglądać znajomo, często spotykamy tego typu URL w życiu codziennym). -- `User-Agent:` -- twoja przeglądarka -- `Accept:` -- Jakie formaty umiesz przeczytać (html, txt) - można nadać im priorytety. -- `Accept-Language` -- Jakie języki akceptujemy -- też można nadać priorytety. +#### Zadanie -### Ćwiczenia +Odczytaj nagłówek (`curl -I`) zwracany przez endpoint. +Co stanie się, jeżeli zrobisz literówkę w URL? +Przypomnij sobie, jakie znasz kody błędów HTTP. -- Spróbuj ściągnąć główną stronę "m.google.com" -- Spróbuj ściągnąć główną stronę "www.onet.pl" -- Spróbuj ściągnąć główną stronę do pliku -- Wyszukaj w tym pliku adresu jakiegoś obrazka i go ściągnij -- Napisz skrypt do ściągania plików z serwera HTTP. Z dwoma argumentami: nazwa serwera i ścieżka +#### Zadanie -## HTTP over Secure Socket Layer (HTTPS) -**Port**:80 **SSL**:443 +Wczytaj się w dokumentację serwisu Open Meteo. +Używając API, odpowiedz na następujące pytania: -Do wielu usług warto łączyć się kanałem szyfrowanym. Po pierwszym użyciu w tym celu programu `telnet`, np łączac się z `telnet google.com 443`, widzimy że nie umiemy rozmawiać zaszyfrowanymi bajtami. +- Jaka jest obecnie prędkość wiatru w Warszawie? +- Jaka temperatura odczuwalna będzie jutro o 14:00 w Rzymie? -Do komunikacji z serwerem po szyfrowanym połączeniu możemy użyć program `openssl`. Dla przykładu: +Jaki kod błędu zostanie zwrócony, jeżeli niepoprawnie skonstruujesz zapytanie? -```Bash -openssl s_client -connect google.com:443 -``` +#### Zadanie -### Ćwiczenia +Wejdź na portal `allegro.pl`. +Wyszukaj jakiś produkt (jeżeli nie masz pomysłu możesz np. poszukać doniczek). +Następnie zastosuj wybrany filtr (np. tylko czarne doniczki). +Przyjrzyj się URL, pod jakim wyświetlane jest Twoje zapytanie. +Czy wygląda ono znajomo? -- Spróbuj ściągnąć główną stronę "m.google.com" po protokole szyfrowanym -- Spróbuj dodać komentarz w serwisie `github.com` do dyskusji [`https://github.com/ccfd/courses/issues/12`](https://github.com/ccfd/courses/issues/12). Użyj do tego zapytania do serwera `api.github.com` (skonstruuj je uprzednio w pliku tekstowym): +## Edycja bazy danych poprzez API REST -```HTTP -POST /repos/ccfd/courses/issues/12/comments HTTP/1.1 -Host: api.github.com -Authorization: token [token] -User-Agent: Wget/1.9.1 -Connection: close -Content-Type: application/json -Content-Length: 53 +Teraz zobaczymy, w jaki sposób można modyfikować zawartość bazy danych poprzez API REST. +W tym celu użyjemy narzędzia `json-server`. +Pozwala ono na postawienie lokalnego serwera w oparciu o jeden plik `db.json`, stanowiący jego bazę danych. +Następnie możemy rozmawiać z serwerem poprzez API REST. +`json-server` będzie modyfikował zawartość pliku `db.json`, którą możemy na bieżąco podglądać (jest to w końcu zwykły plik tekstowy). -{"body":"To jest bardzo wazny komentarz\nBardzo\n"} +Stwórz plik `db.json` z pustą bazą danych i uruchom `json-server`: + +```bash +nano db.json +# Wpisz do pliku: +# { "puste": [] } +json-server db.json ``` -`[token]` możesz uzyskać logując się na GitHub i dodając token w menu "Settings", "Personal access tokens". -## Simple Mail Transfer Protocol (SMTP) -**Port**:25 **TLS**:587 **SSL**:465 +Powinna się wyświetlić informacja o dostępnym endpointcie "puste" +Następnie otwórz nową konsolę (nie zamykając tej, w której uruchomiony jest serwer) i sprawdź, czy możesz się z nim połączyć (`localhost`, port 3000): -SMTP to protokół używany do wysyłania e-maili. Polączyć się z nim można pod portem nr 25. Jego postawowe instrukcje to: +```bash +curl -vI http://localhost:3000/puste +``` -- `HELO something` -- przywitanie się z serwerem -- `MAIL From: something` -- Od kogo jest e-mail -- `RCPT To: something` -- Do kogo jest e-mail -- `DATA` -- Po tej komendzie można napisać treść e-maila. Zakończyć trzeba [enter].[enter] -- `QUIT` -- Kończy rozmowę z serwerem +### Baza danych autorów - czytanie -Z szyfrowanym protokołem SMTP (typu TLS), można się połączyć za pomocą: +Teraz popracujemy z [bazą danych autorów](http://ccfd.github.io/courses/data/info3/db.json). +Podmień db.json na podlinkowany plik (serwer automatycznie zauważy zmiany, nie musisz go resetować). -```Bash -openssl s_client -connect [serwer]:25 -starttls smtp -``` +#### Zadania -### Ćwiczenia +- Jaki endpointy zawiera podana baza danych? +- Otwórz bazę danych w przeglądarce (pozostałe zadania wykonaj z konsoli) +- Wyświetl wszystkich autorów +- Wyświetl autorów urodzonych po roku 1960 ([składnia kwerendy `json-server`](https://deepwiki.com/typicode/json-server/3.2-query-parameters)) +- Jakie jest ID Olgi Tokarczuk? Pamiętaj, żeby spację w URL zamienić na `+`. +- Wyświetl książki w bazie opublikowane przez Olgę Tokarczuk. +- Wyświetl książki w bazie opublikowane przez Olgę Tokarczuk, posortowane alfabetycznie tytułami (`_sort`). +- Wyświetl książki w bazie, które zdobyły nagrodę Nobla. -- Spróbuj wysłać ze swojego konta e-mail do kolegi obok -- Wyślij e-mail do na swoje prywatne konto i w domu obejrzyj jego nagłówek (poszukaj go w spam'ie). -- Spróbuj wysłać e-mail z konta "admin na swoje konto -- Napisz plik wejściowy, który po przekierowaniu do polecenia 'telnet' wyśle e-mail do kolegi -- Napisz skrypt z jednym argumentem który wyśle zawartość wybranego pliku do kolegi +### Baza danych autorów - PUT, POST, PATCH, DELETE -## Post Office Protocol version 3 (POP3) -**Port**:110 **SSL**:995 +Dotychczasowe zapytania HTTP używały metody GET (domyślnie w `curl`u). +Teraz zobaczymy, jak modyfikować pozycje w bazie metodami PUT, POST i PATCH. -POP3 to protokół używany do odbierania e-maili ze skrzynki. Połączyć się z nim można pod portem nr $110$. Jego podstawowe instrukcje to: +Zakończ pracę serwera (`ctrl+C`), utwórz nową, pustą bazę danych (tak jak na początku, tylko nazwij inaczej plik) i uruchom w oparciu o nią serwer. +Wyświetl zawartość bazy, a następnie wykonaj komendę: -- `USER użytkownik` -- ustawia użytkownika którego chcemy zalogować -- `PASS hasło` -- loguje użytkownika -- `LIST` -- Wypisuje listę e-maili w skrzynce w formacie [numer] [rozmiar] -- `RETR number` -- pobiera e-mail -- `DELE number` -- kasuje e-mail -- `TOP number` -- pobiera pierwsze pare linii e-mail -- `QUIT` -- Kończy rozmowę z serwerem +```bash +curl -X POST 'http://localhost:3000/puste' \ + -H "Content-Type: application/json" \ + -d '{"pole": "wartość", "lista": ["el1", "el2"]}' +``` -Do połączenia szyfrowanego użyj analogicznego polecenia jak w sekcji o HTTPS +Wyświetl ponownie zawartość endpointu `puste` - jak się zmieniła? +Zwróć uwagę na automatycznie nadane pole `id`. +Wykonaj ponownie tę samą komendę. +Jak teraz zmieniła się zawartość bazy? -### Ćwiczenia -- Spróbuj odebrać swoje e-maile -- Spróbuj odebrać czyjeś e-maile -- Napisz plik wejściowy, który po przekierowaniu do polecenia `telnet` pobierze konkretnego e-maila. Jeśli telnet nie reaguje na wejściowy plik, jest to spowodowane tym, ze serwer nie nadąża z interpretowaniem komend. Napisz skrypt który co sekundę będzie wypisywał na ekran jedną linijkę z pliku - a następnie przekieruj z niego wyjście do telnet'u. -- Napisz skrypt z jednym argumentem, który odbierze e-mail o danym numerze. +Teraz wykonaj komendę (podmieniając `[ID]` na wygenerowane ID jednej z pozycji): -# Sniffing -Sniffing, czyli analiza pakietów (Packet Analysis) to najprostsza technika podsłuchu w internecie. Polega ona na przechwytywaniu pakietów na poziomie interface'u sieciowego i rozkodowywaniu ich do postaci czytelnej dla człowieka. W ten sposób możemy zobaczyć wszelkie połączenia TCP/IP (a także UDP). Analizując dane przesyłane pomiędzy klientami a serwerami, możemy nie tylko dowiedzieć się kto z kim się łączy ale: +```bash +curl -X PUT 'http://localhost:3000/puste/[ID]' \ + -H "Content-Type: application/json" \ + -d '{"pole": "wartość 2"}' +``` -- Zobaczyć adresy internetowe na które wchodzą użytkownicy -- Zobaczyć e-maile przesyłane przy pomocy SMTP i odbierane przez POP3, a nawet podejrzeć hasła -- Zobaczyć wpisywane hasła w kiepsko zabezpieczonych stronach HTTP -- Podsłuchiwać programy IM, takie jak: MSN, GG (szyfrowanie jest domyślnie wyłączone), stare wersje ICQ i IRC. +Teraz zrób to samo, tylko zamień `PUT` na `PATCH` i podaj ID drugiej z utworzonych pozycji. +Odpowiedz na pytanie: jaka jest różnica między `POST`, `PUT` i `PATCH`? -W materiałach można znaleść program `smsniff.exe`. Jest to typowy prosty sniffer pod Windows. Sieć w laboratorium jest oparta na dobrym switch'u, więc jedyne pakiety widoczne w sieci, to takie które idą od lub do danego komputera (oraz broadcast). Oznacza to, że nie da się podsłuchiwać innych studentów. +Możemy także całkowicie usuwać pozycje posługując się metodą `DELETE`: -**UWAGA:** *Większość sieci (w tym praktycznie wszystkie WiFi) nie są zabezpieczone przed Sniffingiem! Pamiętaj, że to co właśnie robisz, może zrobić każdy!* +```bash +curl -X DELETE 'http://localhost:3000/puste/[ID]' +``` -### Ćwiczenia +#### Zadanie -- Podsłuchaj swoje połączenie przez SSH z orange'm (port 22) -- Podsłuchując wejdź w przeglądarce na [`http://meil.pw.edu.pl/`](http://meil.pw.edu.pl/) -- Podsłuchując wejdź w przeglądarce na [`https://meil.pw.edu.pl/`](https://meil.pw.edu.pl/) +Uruchom ponownie serwer z bazą literatury i wykonaj następujące zadania: -# Dla dociekliwych: Przekierowanie portu -*Ta część jest dla osób które chcą się pobawić i pogrzebać - nie ma gwarancji że cokolwiek zadziała!* +- Dodaj pozycję: -Porty można przekierować. Jeśli przekierujemy port x z serwera X do portu y serwera Y, to będzie to oznaczać, że jeśli połączymy się z portem x z serwerem X, to on przekaże całą komunikację do portu y serwera Y. Innymi słowy jeśli napiszemy: -```Bash -telnet X x ``` -to połączymy się z portem y na Y. Jest to wyjątkowo przydatne, jeśli my nie potrafimy połączyć się z komputerem Y. Dla przykłady gdy Y jest za firewall'em, albo jest w innej podsieci. +{ + "tytul": "Astronauci", + "autorId": 3, + "rokWydania": 1954, + "gatunek": "science fiction" +} +``` -### Ćwiczenia +- Kto jest autorem dodanej książki? +- W powyższym opisie wkradł się błąd. Rok wydania "Astronautów" to 1951. Popraw w bazie utworzoną pozycję. +- Zamień utworzoną pozycję (zachowując ID, zwróć uwagę na brak pola "gatunek") na: -- Uruchom putty. Wejdz w ustawienia ,,tunneling". Tam ustaw by port `80` był przekierowany na `google.com:80`. Następnie połącz się z maszyną `info3` jak zwykle. -- Spróbuj w przeglądarce otworzyć adres [`http://localhost/`](http://localhost/) -- Zobacz co działa a co nie. Jeśli nie działa, to dlaczego? +``` +{ + "tytul": "Filozofia przypadku. Literatura w świetle empirii", + "autorId": 3, + "rokWydania": 1968, +} +``` -### Ćwiczenia SOCKS Proxy +- Usuń całkowicie utworzoną pozycję +- Dodaj do bazy książek "Pana Tadeusza." Zauważ, że wymaga to dodania najpierw autora. Dane bibliograficzne (jeśli ich nie pamiętasz) pobierz z internetu. -- Uruchom putty. Wejdz w ustawienia "tunneling". Tam ustaw by port `12345` był przekierowaniem typu "Dynamic". Następnie połącz się z maszyną `info3` jak zwykle. -- Ustaw następnie w opcjach przeglądarki serwer SOCKS proxy na `localhost` i port `12345` -- wejdz na google.com -- *ciesz się internetem zza firewall'a* +## Na deser +Pobaw się autentyfikacją w oparciu o rozszerzenie `json-server-auth`...