#!/usr/bin/python # -*- coding: utf-8 -*- from flask import Flask, session, redirect, url_for, escape, request, Response, render_template, flash 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') def dict_factory(cursor, row): d = {} for idx, col in enumerate(cursor.description): d[col[0]] = row[idx] return d #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": try: con = sqlite3.connect(os.path.abspath('resepti.db'), isolation_level=None) con.row_factory = dict_factory tunnus = request.form.get('tunnus', "") salasana = request.form.get('salasana', "") sql = """ SELECT tunnus, salasana FROM User WHERE tunnus = :tunnus """ cur = con.cursor() cur.execute(sql, {"tunnus": tunnus}) user = cur.fetchone() #haetaan kaikki kyselyn tulokset if user and user["Tunnus"]: #tunnus löytyi #lasketaan syötetystä salasanasta hexdigest ja verrataan tietokannassa olevaan m = hashlib.sha512() salt = "suolaasuolaa" #pidä tämä salassa m.update(salt.encode("UTF-8")) m.update(salasana.encode("UTF-8")) if m.hexdigest() == user["Salasana"]: session['kirjautunut'] = "ok" #ohjataan halutulle alitussivulle return redirect(url_for('kirjautunut')) flash("Tunnus tai salasana on väärin") except sqlite3.Error: # mitäs nyt tehdään? flash("Tietokanta ei aukea") finally: #tämä täytyy tehdä aina lopuksi. Hoituu helpoiten finallylla con.close() return redirect(url_for('start')) @app.route('/logout') def logout(): session.pop('kirjautunut',None) return redirect(url_for('start')) @app.route('/kirjautunut', methods=['POST','GET']) @auth def kirjautunut(): return render_template('kirjautunut.html')