#!/usr/bin/python # -*- coding: utf-8 -*- from flask import Flask, session, redirect, url_for, escape, request, Response, render_template import hashlib import sys from functools import wraps import sqlite3 import os import werkzeug.exceptions app = Flask(__name__) # set the secret key. keep this really secret: app.secret_key = b'\xf5\x18\x8cV\xce\xdd\xfc\x90\xd5\xee\x1b\xbf\xe0\xda\xc5\x87\xc8\xac\xa0\xe9#4"R' def auth(f): ''' Tämä decorator hoitaa kirjautumisen tarkistamisen ja ohjaa tarvittaessa kirjautumissivulle ''' @wraps(f) def decorated(*args, **kwargs): if not 'kirjautunut' in session: return redirect(url_for('start')) return f(*args, **kwargs) return decorated # tämä sisältää vain kirjautumislomakkeen # kannattaa katsoa selaimen network-välilehdeltä miten eri osoitteiden välillä liikutaan # lomakkeen lähettämisen jälkeen @app.route('/', methods=['GET']) def start(): #palautetaan sivu, jolla olevan kirjautumislomakkeen käsittelijä on seuraavana oleva /kirjaudu return render_template('kirjaudu2.html') #tämä funktio tekee varsinaisen kirjautumisen tarkistamisen #ohjaa takaisin kirjautumislomakkeelle, jos autentikointi epäonnistuu #ohjaa laskuriin, jos tunnus ja salasana olivat oikein @app.route('/kirjaudu', methods=['POST', 'GET']) def kirjaudu(): #kelpuutetaan lomake vain post-metodilla if request.method == "POST": tunnus = request.form.get('tunnus', "") salasana = request.form.get('salasana', "") #tunnuksen olemassaolo tarkistetaan yleensä esim. tietokantakyselyllä if tunnus=="ties4080": m = hashlib.sha512() salt = "omasalainenavain" #pidä tämä salassa m.update(salt.encode("UTF-8")) m.update(salasana.encode("UTF-8")) # koskaan ei pidä tallentaa tai vertailla selkokielisiä salasanoja! # salasanan hexdigest-versio haettaisiin oikeasti tietokannasta annetun tunnuksen perusteella # Tässä salasana on nyt vakio if m.hexdigest() == '366e90b5fe29a9d9c1420afa334c4b19c4d63dcd200f424b7a9fe3328a352da5818fc03cffa463c2362db3535b612df4eb27df33d4720fbf592964571ad7572e': session['kirjautunut'] = "ok" #ohjataan halutulle alitussivulle return redirect(url_for('kirjautunut')) #kirjautumisen epäonnistuessa tai yritettäessä sivulle get-metodilla ohjataan etusivulle kirjautumaan uudelleen #jos halutaan esittää virheilmoituksia lomakkeella, niin tallennetaan ne sessioon #tai käytetään Flaskin message flashing -ominaisuutta: https://flask.palletsprojects.com/en/2.3.x/patterns/flashing/ return redirect(url_for('start')) @app.route('/logout') def logout(): session.pop('kirjautunut',None) return redirect(url_for('start')) #laskuri kirjautumisella @app.route('/kirjautunut', methods=['POST','GET']) @auth def kirjautunut(): return render_template('kirjautunut.html')