├── requirements.txt
├── Flask U2F Tutorial - Deployment Guide.pdf
├── .gitignore
├── schema.sql
├── templates
├── login.html
├── register.html
├── security.html
├── u2f_auth.html
├── u2f_add.html
├── layout.html
└── timeline.html
├── README
├── server.crt
├── server.key
├── static
├── style.css
└── u2f-api.js
└── minitwit.py
/requirements.txt:
--------------------------------------------------------------------------------
1 | flask==0.10.1
2 | u2fval-client>=1.0.1
3 |
--------------------------------------------------------------------------------
/Flask U2F Tutorial - Deployment Guide.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dainnilsson/flask-u2f-tutorial/HEAD/Flask U2F Tutorial - Deployment Guide.pdf
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | *.pyc
3 | *.pyo
4 | env
5 | env*
6 | dist
7 | *.egg
8 | *.egg-info
9 | _mailinglist
10 | .tox
11 | .ropeproject/
12 | u2fval_api_token
13 |
--------------------------------------------------------------------------------
/schema.sql:
--------------------------------------------------------------------------------
1 | drop table if exists user;
2 | create table user (
3 | user_id integer primary key autoincrement,
4 | username text not null,
5 | email text not null,
6 | pw_hash text not null
7 | );
8 |
9 | drop table if exists follower;
10 | create table follower (
11 | who_id integer,
12 | whom_id integer
13 | );
14 |
15 | drop table if exists message;
16 | create table message (
17 | message_id integer primary key autoincrement,
18 | author_id integer not null,
19 | text text not null,
20 | pub_date integer
21 | );
22 |
--------------------------------------------------------------------------------
/templates/login.html:
--------------------------------------------------------------------------------
1 | {% extends "layout.html" %}
2 | {% block title %}Sign In{% endblock %}
3 | {% block body %}
4 |
6 |
MiniTwit
7 |
19 | {% with flashes = get_flashed_messages() %}
20 | {% if flashes %}
21 |
22 | {% for message in flashes %}
23 | - {{ message }}
24 | {% endfor %}
25 |
26 | {% endif %}
27 | {% endwith %}
28 |
29 | {% block body %}{% endblock %}
30 |
31 |
34 |
35 |
--------------------------------------------------------------------------------
/server.key:
--------------------------------------------------------------------------------
1 | -----BEGIN RSA PRIVATE KEY-----
2 | MIIEpAIBAAKCAQEArO7u8kXoFfOYn6dIm10XtOHx1g3QOt7Cf4xqGV9K0KhzJAGJ
3 | JKPTmrpnWjSrYWium55ChVZLzbiOwOZs1VQDfK7o+NJE8uEVF22WR77F9dXqNhv7
4 | uCx0StXgZJO0RX7R1uSZYz6r/oJBabECOZIZ+dX+fbAjE4fAh+b1LjxEmWpBcsJS
5 | SuRjObpgakuekCWUNi9SiMc7JvV+g5t/d+S7npELNV/BvEK45im0jNBLX9SMhlu3
6 | CrrWgX8RfDklvtcFiah+IZBC5iHu4y4It9iVYAy9lUs4FRjYS+Li1bNxVUmYDfVR
7 | xQKfpicIXjrYKkemjTYjAyyYWqR1BK1yEfSklwIDAQABAoIBADHh2drYf1GVqnii
8 | 8Daga64pXnC4G1Bf4QqZniEjc5ksfcntB3oiJ2+CRT2n46d9YqBQzi9X7RWyHrtV
9 | vB7s1PSqH1lmjazhcAwJ+EdJqCB5S82/1KQTbpgHiWp5kI5bPnwWBIi0Ezieqe+q
10 | t1GT6xo9t+LZY8TGa6rH3AEyMTdvDWZYSkAmxbqe5DuYd+jBLpEqcxelbXP2hyan
11 | jMfgaQDEh4SJ+U4jk5Y163JXV2TEZQIhx+6ILdEK3CXHAugbFdXigMXDpNgBMHO0
12 | YQRe+obgJI1EhOjDhlm1Nlm18W335aHGApMwHtnwcyQkOyd6wthQUpfAnqay0crt
13 | Z/W8ocECgYEA2wokn4QFBI4D6axVbf+TUdYsYoRNW9HmyaQTx94MUUDwca4+UORq
14 | L2OIU1qn3EcE8ya9O6NHKZyTJManPqJM9lFeWmZEY71UNuwPqRBE9s2MiOts2uB3
15 | QkKGfyphF6U201LTcEjQZ6aZqMxIFb1ptI7M1yEen33whhStieS54CsCgYEAyh0i
16 | 8dKq2uoNXZL/Ilslf423QsIqt6mBnBoocUxQcNmZHuBFi9FHjx6ddQSeY6p5A5BH
17 | Wex87vaSQoDgHNvH8psWluPc5kKdSS3DakLuh2rQOGHPYlWPSgWFVwImUrOFqkYw
18 | A5hTxoqqjjN8royjTbamQC5/NKxdXZR3QUucK0UCgYAAi3bp2qc0irHhy+bufhs8
19 | sd6sZA3ZM51yVPEjpx66uQGgFsHa66aD9ahqJKiUOKz/edIwqshLhzMqfT//POIa
20 | HruwV97FrLvf4xhq4Dp7rqkx0fwUU0iYppe1C0Lwjx2iyurxtYynJVfufouTWkRA
21 | CbbithdgaCzH+Jcx55q6vwKBgQCkjqp3940yZePx7xAZedqDCvBNw2ciWDl1znpl
22 | HLxV1WTtFa6qEv/PUB7lOph3D0IuG5dsaLajnVAiI2nVNUCLj6gJvIaLV2tWPJNh
23 | fhNVYCsd7Mz8BCuBGhOhbtei+BV5OGI5WxnCif4pf1QhjdIcIP0lPnZFfZ0a5xld
24 | qWECfQKBgQCPXMRJvmhXy46/XhpE89IOVA+6VGTvZjFzxigIZXZcebWKudVtGaT6
25 | efVfUwefQSy+zoJ29kLEPinDCGVsVTAuJZtrUzUIBjWpFABFWcBvj3LBolOH9XqK
26 | RovyIuNqqnw/JaSsjor3DKkdQdsENTGwQUNhxwn33Y/pDGJDyWSnlw==
27 | -----END RSA PRIVATE KEY-----
28 |
--------------------------------------------------------------------------------
/templates/timeline.html:
--------------------------------------------------------------------------------
1 | {% extends "layout.html" %}
2 | {% block title %}
3 | {% if request.endpoint == 'public_timeline' %}
4 | Public Timeline
5 | {% elif request.endpoint == 'user_timeline' %}
6 | {{ profile_user.username }}'s Timeline
7 | {% else %}
8 | My Timeline
9 | {% endif %}
10 | {% endblock %}
11 | {% block body %}
12 |
16 | {% if g.user.user_id == profile_user.user_id %}
17 | This is you!
18 | {% elif followed %}
19 | You are currently following this user.
20 |
Unfollow user.
22 | {% else %}
23 | You are not yet following this user.
24 |
Follow user.
26 | {% endif %}
27 |
28 | {% elif request.endpoint == 'timeline' %}
29 |