master
1import tornado.ioloop
2import tornado.web
3import tarfile
4import json
5from config import IMPORT_AUDIT, IMPORT_FINAL, MANIFEST
6from sublogin import login
7from submove import process_file_import
8from functools import wraps
9from StringIO import StringIO
10
11import os
12WORKING_DIR = os.path.dirname(os.path.abspath(__file__))
13COOKIE_SECRET = "F+ek4AWESWewGryPRbzq5aSHR1uRD0/ItZenLimCkGI="
14STATIC_DIR = os.path.join(WORKING_DIR,"static")
15TEMPLATE_DIR = os.path.join(WORKING_DIR,"templates")
16TORNADO_PORT = "8888"
17
18class BaseHandler(tornado.web.RequestHandler):
19 def get_login_url(self):
20 return u"/login"
21
22 def get_current_user(self):
23 user_json = self.get_secure_cookie("user")
24 if user_json:
25 return tornado.escape.json_decode(user_json)
26 else:
27 return None
28
29 def get_admin_status(self):
30 admin_json = self.get_secure_cookie("admin")
31 if admin_json:
32 return tornado.escape.json_decode(admin_json)
33 else:
34 return None
35
36 def render(self, template, **kwargs):
37 kwargs['admin'] = self.get_admin_status()
38 super(BaseHandler, self).render(template, **kwargs)
39
40class LoginHandler(BaseHandler):
41 def get(self):
42 self.render('login.html')
43
44 def post(self):
45 username = self.get_argument("username", "")
46 password = self.get_argument("password", "")
47 status, error = login(username, password)
48 if status:
49 adminstatus = error #Yes, ghetto
50 self.set_current_user(username)
51 self.set_admin_status(adminstatus)
52 self.redirect(self.get_argument("next",u"/"))
53 else:
54 self.render("login.html", errormsg=error)
55
56 def set_current_user(self, user):
57 if user:
58 self.set_secure_cookie("user", tornado.escape.json_encode(user))
59 else:
60 self.clear_cookie("user")
61
62 def set_admin_status(self, admin):
63 if admin:
64 self.set_secure_cookie("admin", tornado.escape.json_encode(admin))
65 else:
66 self.clear_cookie("admin")
67
68class LogoutHandler(BaseHandler):
69 def get(self):
70 self.clear_cookie("user")
71 self.clear_cookie("admin")
72 self.redirect(u"/login")
73
74class UploadHandler(BaseHandler):
75 @tornado.web.authenticated
76 def get(self):
77 self.render("index.html")
78
79 @tornado.web.authenticated
80 def post(self):
81 if self.request.files:
82 files = []
83 for f in self.request.files.itervalues():
84 files.append((f[0]['filename'], f[0]['body']))
85 process_file_import(self.current_user, files)
86
87def is_admin(method):
88 @wraps(method)
89 def wrapper(self, *args, **kwargs):
90 if self.get_admin_status():
91 return method(self, *args, **kwargs)
92 else:
93 self.redirect(u"/")
94 return wrapper
95
96class AdminHandler(BaseHandler):
97 @tornado.web.authenticated
98 @is_admin
99 def get(self):
100 #if self.request.headers.get('X-Requested-With') == "XMLHttpRequest":
101 audit_tar = False
102 items = []
103 for filename in os.listdir(IMPORT_AUDIT):
104 try: audit_tar = tarfile.open(os.path.join(IMPORT_AUDIT,filename), mode = "r:gz")
105 except: pass
106 if audit_tar:
107 if MANIFEST in audit_tar.getnames():
108 items.append(json.loads(audit_tar.extractfile(MANIFEST).read()))
109
110 self.render("admin.html", items=items)
111
112 @tornado.web.authenticated
113 @is_admin
114 def post(self):
115 def admin_response(audit_id,result_type,result):
116 self.write(json.dumps({"id":audit_id, "result_type": result_type, "result": result}))
117
118 if self.request.headers.get("Content-Type").startswith("application/json"):
119 self.json_args = json.loads(self.request.body)
120 audit_id = self.json_args['id']
121 audit_file = audit_id+".tar.gz"
122 audit_approve = self.json_args['approve']
123 if audit_file in os.listdir(IMPORT_AUDIT):
124 if audit_approve:
125 try:
126 os.rename(os.path.join(IMPORT_AUDIT,audit_file), os.path.join(IMPORT_FINAL,audit_file))
127 admin_response(audit_id, "success", "Transfer Approved")
128 except:
129 admin_response(audit_id, "error", "Transfer Approval Failed")
130 else:
131 try:
132 os.remove(os.path.join(IMPORT_AUDIT,audit_file))
133 admin_response(audit_id, "success", "Transfer Destruction Success")
134 except:
135 admin_response(audit_id, "success", "Transfer Destruction Failed")
136 else:
137 self.write(json.dumps({"id":audit_id, "result_type": "error", "result":"Invalid ID, File not found"}))
138 else:
139 pass
140
141
142handlers = [
143 (r"/", UploadHandler),
144 (r"/admin", AdminHandler),
145 (r"/login", LoginHandler),
146 (r"/logout", LogoutHandler),
147]
148
149settings = {
150 "cookie_secret": COOKIE_SECRET,
151 "static_path": STATIC_DIR,
152 "template_path": TEMPLATE_DIR,
153}
154
155application = tornado.web.Application(handlers, **settings )
156
157if __name__ == "__main__":
158 application.listen(TORNADO_PORT)
159 tornado.ioloop.IOLoop.instance().start()
160