Viikkotehtävä 4
Tällä viikolla harjoitellaan mod_pythonin sessioiden ja evästeiden käyttämistä sekä tiedostojen käsittelyä ja tiedoston latausta palvelimelle lomakkeen avulla. Tehtäville yhteiset vaatimukset:
- Käytetään Python-kieltä.
- Kommentoikaa koodin oleellisimpia osia!
- Kaikkien sivujen on oltava validia XHTML 1.0 Strictiä.
- Valmiiden mod_python-sivujen pitää toimia users.jyu.fi:ssä.
- Sivut on toteutettava mod_pythonin publisher-käsittelijällä tai omilla käsittelijöillä.
- Tietokantojen käyttäminen on kiellettyä
- Annetuista tiedostojen nimistä saa halutessaan poiketa. Oleellista on järjestelmän jakautuminen ja toiminta useammassa eri osoitteessa.
Taso 1
Toteuta sessioilla kirjautumispalvelu:
- Tee mod_python-sivu (testi.py), jolle tulee päästä vain silloin, kun sessioilla toteutettu kirjautuminen
(login.py, jonka tekeminen ohjeistettu alempana) on voimassa.
- Jos kirjautuminen ei ole voimassa, käyttäjä ohjataan kirjautumissivulle (login.py, jonka tekeminen ohjeistettu alempana).
- Tee sivulle ainakin "uloskirjautuminen"-linkki, muulla sisällöllä ei ole väliä. Linkkiä klikkaamalla tulee hoitaa käyttäjän uloskirjautuminen (login.py:n avulla). Uloskirjautumisen jälkeen käyttäjä ohjataan login.py-sivulle, eikä testi.py-sivulle tule luonnollisestikaan päästä ennen uutta kirjautumista.
- Tee mod_python-sivu (login.py), joka hoitaa kirjautumisen:
- Tee sivulle lomake, jossa kysytään käyttäjätunnusta ja salasanaa käyttäjältä.
- Jos käyttäjän antama käyttäjätunnus on ope ja salasana on tjta270 niin käyttäjä ohjataan aiemmin tehdylle testi.py-sivulle. Tämän jälkeen testi.py-sivulle tulee päästä ilman kirjautumista uloskirjautumiseen tai selaimen sulkemiseen saakka.
- Jos käyttäjätunnus tai salasana oli väärä, tulostetaan asianmukaiset virheilmoitukset ja palautetaan käyttäjä takaisin kirjautumissivulle. Virheilmoituksessa tulee eritellä virhe tarkemmin (esimerkiksi "Käyttäjätunnus oli oikea, mutta salasana väärä." tai "Käyttäjätunnusta ei löytynyt.")
- Sivun tulee hoitaa myös uloskirjautuminen (kun on painettu "uloskirjautuminen"-linkkiä testi.py-sivulla).
Taso 3
Laajenna 1. tason kirjautumispalvelua myös rekisteröitymispalveluksi (toteutus edelleen sessioilla):
- testi.py- ja login.py-tiedostojen toteutus aluksi 1. tason tehtävän kaltainen, seuraavat kohdat täydentävät niitä.
- Olemassa olevat käyttäjät ja salasanat haetaan users.txt-tiedostosta (kopioi tiedosto omaan hakemistoosi). Tiedostossa on siis yksi käyttäjä per rivi muodossa "kayttajatunnus|nimi|salasana".
- Kirjautumissivulla on linkki "rekisteröidy", jota painamalla käyttäjä ohjataan rekisteröitymiseen (login.py voi hoitaa senkin tai siihen voi tehdä uuden tiedoston).
- Rekisteröitymisessä käyttäjältä kysytään lomakkeella nimi, käyttäjätunnus ja salasana. Salasana kysytään kahteen kertaan. Salasanaa kysyttäessä käytettävä password-kenttää, eli salasana ei saa näkyä kirjoitettaessa. Nimi ei saa olla tyhjä, lisäksi käyttäjätunnuksen ja salasanan tulee olla vähintään 5 merkkiä pitkiä. Kahta samaa käyttäjätunnusta ei saa olla. Mihinkään kohtaan ei saa myöskään syöttää "|"-merkkiä. Salasanan tulee olla luonnollisesti sama molemmilla syöttökerroilla. Rekisteröitymissivulla tulee olla linkki myös kirjautumissivulle.
- Jos käyttäjän antamat tiedot ovat sopivia (edellisen kohdan vaatimukset täyttyvät), lisätään käyttäjän tiedot users.txt-tiedostoon (kirjoitetaan tiedoston loppuun uudelle riville) muotoon "kayttajatunnus|nimi|salasana". Salasana tulee tallentaa tiedostoon salatussa muodossa (md5). Tulostetaan lisäksi käyttäjälle ilmoitus onnistuneesta rekisteröitymisestä ja ohjataan käyttäjä automaattisesti kirjautumissivulle.
- Jos käyttäjän antamat tiedot olivat puutteellisia, käyttäjä palautetaan lomakkeelle ja tulostetaan asianmukaiset virheilmoitukset (mikä rekisteröitymisessä meni väärin).
- Kirjautumisessa salasana tulee tarkistaa salattuun muotoon (md5) tallennetusta salasanasta.
- Tee testi2.py-sivu, jonka sisällöksi laita vähintään linkki testi.py-sivulle. testi2.py-sivulle tulee päästä vain silloin, kun kirjautuminen on voimassa. Jos kirjautuminen ei ole voimassa, käyttäjä ohjataan automaattisesti kirjautumiseen.
Taso 5
Tee ensin kaikki 3. tason tehtävät. Tee lisäksi testi.py-sivulle lomake, jolla voi ladata kuvan palvelimelle seuraavien ohjeiden mukaan:
- Tee siihen hakemistoon, jossa testi.py-tiedosto sijaitsee, kansio kuvat. Kuvat tulee tallentaa kyseiseen kansioon.
- Luo uusi sivu upload.py. Lisää sivulle kuvien latauslomake. Kuvien latauslomakkeella tulee olla tiedostokentän ja submit-painikkeen lisäksi tekstikenttä, johon pyydetään kuvan nimi (ei siis tarvitse olla sama kuin kuvan tiedostonimi) käyttäjältä.
- Kuvaa ladatessa täytyy tarkistaa seuraavat seikat. Jos joku kohta ei toteudu, tulee käyttäjä palauttaa lomakkeelle ja
tulostaa asianmukaiset virheilmoitukset sekä lisäksi käyttäjän mahdollisesti jo syöttämä kuvan nimi valmiiksi lomakkeelle,
ettei sitä tarvitse kirjoittaa uudelleen.
- Kuvan maksimikoko 500 kt.
- Hyväksyttävät tiedostopäätteet jpg, gif ja png. Isoilla ja pienillä kirjaimilla ei saa olla merkitystä.
- Kahta samannimistä (tiedostonimi) kuvaa ei voi tallentaa.
- Kuvan voi ladata vain rekisteröitynyt ja kirjautunut käyttäjä
- Kuvan tiedostonimien samankaltaisuuden testausta varten tallenna aina kuvaa lisätessä erilliseen tekstitiedostoon (esimerkiksi kuvat.txt) kuvalle annettu nimi, kuvan tiedostonimi ja latausajankohta (pyydä aika palvelimelta järkevässä muodossa, esim. "21.3.2007 16:22") muotoon "kuvan_nimi|kuvan_tiedostonimi|latausajankohta". Joka kuvalle tulee olla oma rivi tekstitiedostossa.
- Kirjoita uusi sivu (kuvat.py), joka näyttää kirjautuneille käyttäjille kaikki palvelimelle ladatut kuvat ja listaa niiden nimet ja latausajankohdat.
- Kirjoita uusi sivu asetukset.py jolla käyttäjä voi vaihtaa salasanansa. Päivitetyllä salasanalla korvataan users.txt-tiedostossa ollut vanha salasana.
- Asetukset.py-sivulla käyttäjä voi salasanan vaihtamisen lisäksi vaihtaa sivuston ulkoasun valitsemalla seuraavista
css-tiedostoista yhden:
- Ei tyyliä (oletusvalinta)
- http://www.w3.org/StyleSheets/Core/stylebot.html?family=1&doc=XML
- http://www.w3.org/StyleSheets/Core/stylebot.html?family=2&doc=XML
- http://www.w3.org/StyleSheets/Core/stylebot.html?family=3&doc=XML
- http://www.w3.org/StyleSheets/Core/stylebot.html?family=4&doc=XML
- http://www.w3.org/StyleSheets/Core/stylebot.html?family=5&doc=XML
- http://www.w3.org/StyleSheets/Core/stylebot.html?family=6&doc=XML
- http://www.w3.org/StyleSheets/Core/stylebot.html?family=7&doc=XML
Käyttäjien kommentit
Tervehdys! Tuli tuosta mieleeni, jotta miksi $_POST tai $_GET taulukoita saa käyttää? Niitä tarvitaan kuitenkin, koska tiedot eivät siirry hidden kenttään kuitenkaan itsestään. Mielestäni turhaa ohjelmoijan kiusaamista kieltää järkevien tekniikoiden käyttäminen, vai voitteko perustella mielekkään tilanteen, jossa kyseisten muuttujien käyttö olisi erityisen ongelmallista?
Tasolla 5 $_POST tai $_GET -taulukoiden käyttöä ei olekaan kielletty, koska niitä tarvitaan hidden-kenttien käytössä. Mutta alemmilla tasoilla hiddeniä ei tarvita, joten ei tarvita myöskään $_POST tai $_GET -taulukoita. Välillä tehtäviin joutuu tekemään hiukan teennäisiä rajoituksia, jotta niiden vaikeustaso saadaan sopivaksi tai jotta ne "joutuu" tekemään juuri sillä tekniikalla, jota tehtävässä halutaan testata. Jos oikein hakemalla hakisi $_POST tai $_GET -taulukoiden ongelmia, niin yksi voisi olla se, että pätevä käyttäjä voi syöttää niiden arvoiksi mitä tahansa esim. selaimen lisäosan avulla ja näin lomakkeen käsittelijää voidaan "huijata". Mutta tässä tehtävässä käyttöä ei siis kielletty tuon syyn takia. ;-)
Moro! 5-tason vaatimuksissa sanotaan: "arvotussa lottorivissä on mukana mahdollisesti myös lisänumeroita, mutta käyttäjän syöttämässä lottorivissä ei". Ilmeisesti toisin päin?
Kyllä se on juuri nuin, kun sivulla sanotaan. Eli lotossa se arvontakone arpoo niitä lisänumeroita, mutta käyttäjä täyttää riviinsä vain sen määrätyn määrän numeroita (lotossa 7, eli ne "varsinaiset numerot"). :-)
Terve. Kommentteja itse sivuun liittyen: näkisin paremmaksi, että tehtävänannossa vain kerrottaisiin loogiset kokonaisuudet, joihin vastaussivuston tulisi jakaantua. Eli millä sivuilla vastauksessa selaimessa liikutaan. Eli voisi käyttää halutessaan esim. /login/, /testi/ jne. Vastaajan ei tällöin tarvitsisi turhaan stressata siitä, missä tiedostossa minkäkin ratkaisun pätkän tulisi mahdollisesti sijaita. Kommenteista: nykyiset kommentit ovat ilmeisesti kopioinnin yhteydessä eksyneet tälle sivulle, lottokone PHP:llä ei ole enää tehtävän aiheena.
Noita taso-5:ssä käytettäviä danielgreene.comin css tiedostoja ei näytä enää olevan olemassa...
Korjattu. Laitoin tilalle W3Cn mallityylilomakkeita.