master
Raw Download raw file
  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