def page_login(self, req): """ create login page """ if req.method == 'POST': try: username = req.params_alt().get('username') password = req.params_alt().get('password') (storage_url, token) = get_auth(self.auth_url, username, password, auth_version=self.auth_version) if self.token_bank.get(token, None): self.token_bank[token].update({'url': storage_url, 'last': int(time())}) else: self.token_bank[token] = {'url': storage_url, 'last': int(time())} resp = HTTPFound(location=self.add_prefix(storage_url) + \ '?limit=%s' % self.items_per_page) resp.set_cookie('_token', token, path=self.page_path, max_age=self.cookie_max_age, secure=self.secure) self.memcache_update(token) return resp except Exception, err: lang = self.get_lang(req) resp = Response(charset='utf8') resp.app_iter = self.tmpl({'ptype': 'login', 'top': self.page_path, 'title': self.title, 'lang': lang, 'message': 'Login Failed'}) return resp
def page_login(self, req): """ create login page """ if req.method == 'POST': try: username = req.params_alt().get('username') password = req.params_alt().get('password') (storage_url, token) = get_auth(self.auth_url, username, password, auth_version=self.auth_version) if self.token_bank.get(token, None): self.token_bank[token].update({ 'url': storage_url, 'last': int(time()) }) else: self.token_bank[token] = { 'url': storage_url, 'last': int(time()) } resp = HTTPFound(location=self.add_prefix(storage_url) + \ '?limit=%s' % self.items_per_page) resp.set_cookie('_token', token, path=self.page_path, max_age=self.cookie_max_age, secure=self.secure) self.memcache_update(token) return resp except Exception, err: lang = self.get_lang(req) resp = Response(charset='utf8') resp.app_iter = self.tmpl({ 'ptype': 'login', 'top': self.page_path, 'title': self.title, 'lang': lang, 'message': 'Login Failed' }) return resp
def page_after_action(self, req, storage_url, token): """ page after action """ path = urlparse(self.del_prefix(req.url)).path vrs, acc, cont, obj = split_path(path, 1, 4, True) path_type = len([i for i in [vrs, acc, cont, obj] if i]) params = req.params_alt() loc = storage_url action = params.get('_action') if action == 'cont_create' or action == 'obj_create': rc = self.action_routine(req, storage_url, token) if rc == HTTP_CREATED: self.token_bank[token].update({'msg': 'Create Success'}) elif rc == HTTP_BAD_REQUEST: self.token_bank[token].update({'msg': ''}) elif rc == HTTP_PRECONDITION_FAILED: self.token_bank[token].update( {'msg': 'Invalid name or too long.'}) else: self.token_bank[token].update({'msg': 'Create Failed'}) if action == 'cont_create': loc = storage_url else: loc = self.cont_path(path) if action == 'cont_delete' or action == 'obj_delete': if self.action_routine(req, storage_url, token) == HTTP_NO_CONTENT: self.token_bank[token].update({'msg': 'Delete Success'}) else: self.token_bank[token].update({'msg': 'Delete Failed'}) if action == 'cont_delete': loc = storage_url else: loc = self.cont_path(path) if action == 'obj_copy': if self.action_routine(req, storage_url, token) == HTTP_CREATED: self.token_bank[token].update({'msg': 'Copy Success'}) else: self.token_bank[token].update({'msg': 'Copy Failed'}) loc = self.cont_path(path) if action == 'cont_metadata' or action == 'obj_metadata' or \ action == 'cont_acl' or action == 'obj_set_delete_time' or \ action == 'cont_set_version' or action == 'cont_unset_version' or \ action == 'cont_contsync': if self.action_routine(req, storage_url, token) == HTTP_ACCEPTED: result = 'Success' else: result = 'Failed' if action == 'cont_acl': self.token_bank[token].update( {'msg': 'ACL update %s' % result}) elif action == 'obj_set_delete_time': self.token_bank[token].update( {'msg': 'Schedule of deletion update %s' % result}) elif action == 'cont_set_version' or action == 'cont_unset_version': self.token_bank[token].update( {'msg': 'Version-storing container update %s' % result}) else: self.token_bank[token].update( {'msg': 'Metadata update %s' % result}) if action.startswith('cont_'): loc = storage_url else: loc = self.cont_path(path) resp = HTTPFound(location=self.add_prefix(loc)) resp.set_cookie('_token', token, path=self.page_path, max_age=self.cookie_max_age, secure=self.secure) self.memcache_update(token) return resp
def __call__(self, req): if not self.memcache: self.memcache = cache_from_env(req.environ) login_path = '%s/%s' % (self.page_path, 'login') token = None storage_url = None # favicon if req.path == '/favicon.ico': return self.pass_file(req, 'images/favicon.ico', 'image/vnd.microsoft.icon') # not taylor if not req.path.startswith(self.page_path): return self.app # image if req.path.startswith(join(self.page_path, 'image')): return self.pass_file(req, join('images', basename(req.path))) # css if req.path.startswith(join(self.page_path, 'css')): return self.pass_file(req, join('css', basename(req.path))) # js if req.path.startswith(join(self.page_path, 'js')): return self.pass_file(req, join('js', basename(req.path))) # get token from cookie and query memcache token = req.cookies('_token') if self.memcache and token: cache_val = self.memcache.get('%s_%s' % (self.title, token)) if cache_val: self.token_bank[token] = cache_val status = self.token_bank.get(token, None) if status: storage_url = status.get('url', None) # login page if req.path == login_path: return self.page_login(req) if not token or not storage_url: return HTTPFound(location=login_path) self.token_bank[token].update({'last': time()}) # clean up token bank for tok, val in self.token_bank.items(): last = val.get('last', 0) if (time() - last) >= self.cookie_max_age: del (self.token_bank[tok]) if 'X-PJAX' in req.headers: return self.pass_file(req, 'images/test.html', 'text/html') # return self.page_cont_list(req, storage_url, token, # template_name='containers.tmpl') # return self.page_obj_list(req, storage_url, token, # template_name='objectss.tmpl') # ajax action if '_ajax' in req.params_alt(): if req.params_alt()['_action'].endswith('_meta_list'): status, headers = self.action_routine(req, storage_url, token) return Response(status=status, body=headers) return Response( status=self.action_routine(req, storage_url, token)) # after action if '_action' in req.params_alt(): if req.params_alt()['_action'] == 'logout': del self.token_bank[token] self.memcache.delete('%s_%s' % (self.title, token)) return HTTPFound(location=login_path) return self.page_after_action(req, storage_url, token) # construct main pages return self.page_main(req, storage_url, token)
return resp except err: pass resp = Response() resp.set_cookie('_token', token, path=self.page_path, max_age=self.cookie_max_age, secure=self.secure) resp.status = HTTP_OK resp.headers = obj_status resp.body = objct self.token_bank[token].update({'msg': ''}) self.memcache_update(token) return resp return HTTPFound(location=self.add_prefix(storage_url)) def page_cont_list(self, req, storage_url, token, template=None): """ """ if template is None: tmpl = self.tmpl path = urlparse(self.del_prefix(req.url)).path if len(path.split('/')) <= 2: path = urlparse(storage_url).path vrs, acc, cont, obj = split_path(path, 1, 4, True) lang = self.get_lang(req) base = self.add_prefix(urlparse(storage_url).path) status = self.token_bank.get(token, None) msg = status.get('msg', '') if status else '' params = req.params_alt() limit = params.get('limit', self.items_per_page)
def page_after_action(self, req, storage_url, token): """ page after action """ path = urlparse(self.del_prefix(req.url)).path vrs, acc, cont, obj = split_path(path, 1, 4, True) path_type = len([i for i in [vrs, acc, cont, obj] if i]) params = req.params_alt() loc = storage_url action = params.get('_action') if action == 'cont_create' or action == 'obj_create': rc = self.action_routine(req, storage_url, token) if rc == HTTP_CREATED: self.token_bank[token].update({'msg': 'Create Success'}) elif rc == HTTP_BAD_REQUEST: self.token_bank[token].update({'msg': ''}) elif rc == HTTP_PRECONDITION_FAILED: self.token_bank[token].update({'msg': 'Invalid name or too long.'}) else: self.token_bank[token].update({'msg': 'Create Failed'}) if action == 'cont_create': loc = storage_url else: loc = self.cont_path(path) if action == 'cont_delete' or action == 'obj_delete': if self.action_routine(req, storage_url, token) == HTTP_NO_CONTENT: self.token_bank[token].update({'msg': 'Delete Success'}) else: self.token_bank[token].update({'msg': 'Delete Failed'}) if action == 'cont_delete': loc = storage_url else: loc = self.cont_path(path) if action == 'obj_copy': if self.action_routine(req, storage_url, token) == HTTP_CREATED: self.token_bank[token].update({'msg': 'Copy Success'}) else: self.token_bank[token].update({'msg': 'Copy Failed'}) loc = self.cont_path(path) if action == 'cont_metadata' or action == 'obj_metadata' or \ action == 'cont_acl' or action == 'obj_set_delete_time' or \ action == 'cont_set_version' or action == 'cont_unset_version' or \ action == 'cont_contsync': if self.action_routine(req, storage_url, token) == HTTP_ACCEPTED: result = 'Success' else: result = 'Failed' if action == 'cont_acl': self.token_bank[token].update( {'msg': 'ACL update %s' % result}) elif action == 'obj_set_delete_time': self.token_bank[token].update( {'msg': 'Schedule of deletion update %s' % result}) elif action == 'cont_set_version' or action == 'cont_unset_version': self.token_bank[token].update( {'msg': 'Version-storing container update %s' % result}) else: self.token_bank[token].update( {'msg': 'Metadata update %s' % result}) if action.startswith('cont_'): loc = storage_url else: loc = self.cont_path(path) resp = HTTPFound(location=self.add_prefix(loc)) resp.set_cookie('_token', token, path=self.page_path, max_age=self.cookie_max_age, secure=self.secure) self.memcache_update(token) return resp
def handle_oauth(self, state=None, approval_prompt='auto'): oauth_client = self.provider.create_for_redirect( self.conf, state=state, approval_prompt=approval_prompt) return HTTPFound(location=oauth_client.redirect)