#!/usr/bin/env python # # Implementation of handlers for Weave user service. import tornado.httpserver import tornado.ioloop import tornado.web import time import calendar import traceback import logging import cStringIO import json import cgi from urlparse import urlparse from server_config import account, storage, external_scheme, external_hostname from weave_handler import WeaveHandler class UsernameRootHandler(WeaveHandler): def get(self, name): if account.nameIsAvailable(name): self.write("0") else: self.write("1") def put(self, name): args = json.loads(self.request.body) # TODO handle captcha, invite code, secret, etc. Lots of work. try: name = name.lower() account.create(name, password=args['password'], email=args['email']) self.write(name) except Exception, e: # TODO: return weave error codes raise tornado.web.HTTPError(500, str(e)) @tornado.web.authenticated def delete(self, name): self.check_account_match(name) account.delete(name) class SetEmailHandler(WeaveHandler): @tornado.web.authenticated def post(self, name): self.check_account_match(name) account.setEmail(name, self.request.body) self.write(self.request.body) class SetPasswordHandler(WeaveHandler): @tornado.web.authenticated def post(self, name): self.check_account_match(name) account.setPassword(name, self.request.body) self.write("success") # Note that getStorageNode is not currently authenticated. class GetStorageNodeHandler(WeaveHandler): def get(self, name): node = account.getStorageNode(name) if node: self.write(node) else: if account.nameIsAvailable(name): raise tornado.web.HTTPError(404, "Not Found") else: # If the account system returns None for a storage node, # but the account exists, it means that the current host # is the storage node. self.write("%s://%s" % (external_scheme, external_hostname))