]> git.frykholm.com Git - friends.git/blame - friends/server.py
Some more cleanup, storing secret for use with hashlib.hmac
[friends.git] / friends / server.py
CommitLineData
b3102128
MF
1import tornado.ioloop
2import tornado.web
ddf4123d 3import os, os.path
b3102128 4import tornado.httpserver
ddf4123d
MF
5import sqlite3
6import arrow
7import datetime
8from rd import RD, Link
087a104b 9import hashlib
ddf4123d
MF
10db = None
11#insert into user (name,email) values('mikael','mikael@frykholm.com');
12#insert into entry (userid,text) values (1,'My thoughts on ostatus');
13import tornado.options
14
15settings = {
16 "static_path": os.path.join(os.path.dirname(__file__), "static"),
17 "cookie_secret": "__TODO:_GENERATE_YOUR_OWN_RANDOM_VALUE_HERE__",
18 "login_url": "/login",
19 "xsrf_cookies": False,
20 "domain":"https://ronin.frykholm.com",
21
22}
23class PushHandler(tornado.web.RequestHandler):
24#curl -v -k "https://ronin.frykholm.com/hub" -d "hub.callback=a" -d "hub.mode=b" -d "hub.topic=c" -d "hub.verify=d"
25 def post(self):
26 """ Someone wants to subscribe to hub_topic feed"""
27 hub_callback = self.get_argument('hub.callback')
28 hub_mode = self.get_argument('hub.mode')
29 hub_topic = self.get_argument('hub.topic')
30 hub_verify = self.get_argument('hub.verify')
31 hub_lease_seconds = self.get_argument('hub.lease_seconds','')
32 hub_secret = self.get_argument('hub.sercret','')
33 hub_verify_token = self.get_argument('hub.verify_token','')
511b6ecb 34 print(self.request.body)
ddf4123d
MF
35 if hub_mode == 'unsubscribe':
36 pass #FIXME
37 path = hub_topic.split(self.settings['domain'])[1]
38 user = path.split('user/')[1]
39 row = db.execute("select id from user where name=?",(user,)).fetchone()
087a104b
MF
40 if row: #FIXME calculate expire timestamp
41 db.execute("INSERT into subscriptions (userid, expires, callback, secret, verified) values (?,?,?,?)",(row['id'],datetime.datetime.now(),hub_secret,hub_callback,False))
ddf4123d
MF
42 db.commit()
43 self.set_status(202)
511b6ecb 44 #TODO add GET callback with the same data we got
087a104b
MF
45 #TODO add secret to outgoing feeds with hmac
46
b3102128
MF
47class XrdHandler(tornado.web.RequestHandler):
48 def get(self):
ddf4123d
MF
49 self.render("templates/xrd.xml", hostname="ronin.frykholm.com", url=self.settings['domain'])
50
51class FingerHandler(tornado.web.RequestHandler):
52 def get(self):
53 user = self.get_argument('resource')
54 user = user.split('acct:')[1]
55 (user,domain) = user.split('@')
56 rows = db.execute("select id from user where user.name=?",(user,)).fetchone()
57 if not rows:
58 self.set_status(404)
59 self.write("Not found")
60 self.finish()
61 return
62 lnk = Link(rel='http://spec.example.net/photo/1.0',
63 type='image/jpeg',
64 href='{}/static/{}.jpg'.format(self.settings['domain'],user))
65 lnk.titles.append(('User Photo', 'en'))
66 lnk.titles.append(('Benutzerfoto', 'de'))
67 lnk.properties.append(('http://spec.example.net/created/1.0', '1970-01-01'))
68 lnk2 = Link(rel='http://schemas.google.com/g/2010#updates-from',
69 type='application/atom+xml',
70 href='{}/user/{}'.format(self.settings['domain'],user))
71
72 rd = RD(subject='{}/{}'.format(self.settings['domain'],user))
73 rd.properties.append('http://spec.example.net/type/person')
74 rd.links.append(lnk)
75 rd.links.append(lnk2)
76 self.write(rd.to_json())
b3102128
MF
77
78class UserHandler(tornado.web.RequestHandler):
79 def get(self, user):
ddf4123d
MF
80 entries = db.execute("select entry.id,text,ts from user,entry where user.id=entry.userid and user.name=?",(user,))
81 #import pdb;pdb.set_trace()
82 self.set_header("Content-Type", 'application/atom+xml')
83 self.render("templates/feed.xml",
84 user=user,
85 feed_url="{}/user/{}".format(self.settings['domain'], user),
86 hub_url="{}/hub".format(self.settings['domain']),
87 entries=entries,
88 arrow=arrow )
b3102128
MF
89
90application = tornado.web.Application([
91 (r"/.well-known/host-meta", XrdHandler),
ddf4123d 92 (r"/.well-known/webfinger", FingerHandler),
b3102128 93 (r"/user/(.+)", UserHandler),
ddf4123d
MF
94 (r"/hub", PushHandler),
95 ],debug=True,**settings)
b3102128 96srv = tornado.httpserver.HTTPServer(application, ssl_options={
ddf4123d
MF
97 "certfile": "ronin.frykholm.com.pem",
98 "keyfile": "ronin.frykholm.com.key",
b3102128 99 })
ddf4123d
MF
100def setup_db(path):
101 print("No db found, creating in {}".format(path))
102 con = sqlite3.connect(path)
103 con.execute(""" create table user (id integer primary key,
104 name varchar,
105 email varchar);
106 create table entry (id integer primary key,
107 userid INTEGER,
108 text varchar,
109 ts timestamp default current_timestamp,
110 FOREIGN KEY(userid) REFERENCES user(id));
111 create table subscriptions (id integer primary key,
112 userid integer,
113 expires datetime,
114 callback varchar,
087a104b 115 secret varchar,
ddf4123d
MF
116 verified bool,
117 FOREIGN KEY(userid) REFERENCES user(id));""")
118 con.commit()
b3102128 119
b3102128 120if __name__ == "__main__":
ddf4123d
MF
121 dbPath = 'friends.db'
122 tornado.options.parse_command_line()
123 if not os.path.exists(dbPath):
124 setup_db(dbPath)
125 db = sqlite3.connect(dbPath, detect_types=sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES)
126 db.row_factory = sqlite3.Row
b3102128 127 srv.listen(443)
3ffcd3f8 128 tornado.ioloop.IOLoop.instance().start()