def post(self, id, relationship): (Config, myself, check) = auth.init_actingweb(appreq=self, id=id, path='trust', subpath=relationship, add_response=False) if not myself: return if not check.checkAuthorisation( path='trust', subpath='<type>', method='POST'): self.response.set_status(403) return try: params = json.loads(self.request.body.decode('utf-8', 'ignore')) if 'baseuri' in params: baseuri = params['baseuri'] else: baseuri = '' if 'id' in params: peerid = params['id'] else: peerid = '' if 'type' in params: type = params['type'] else: type = '' if 'secret' in params: secret = params['secret'] else: secret = '' if 'desc' in params: desc = params['desc'] else: desc = '' if 'verify' in params: verificationToken = params['verify'] else: verificationToken = None except ValueError: self.response.set_status(400, 'No json content') return if len(baseuri) == 0 or len(peerid) == 0 or len(type) == 0: self.response.set_status(400, 'Missing mandatory attributes') return if Config.auto_accept_default_relationship and Config.default_relationship == relationship: approved = True else: approved = False # Since we received a request for a relationship, assume that peer has approved new_trust = myself.createVerifiedTrust( baseuri=baseuri, peerid=peerid, approved=approved, secret=secret, verificationToken=verificationToken, type=type, peer_approved=True, relationship=relationship, desc=desc) if not new_trust: self.response.set_status(403, 'Forbidden') return self.response.headers.add_header( "Location", str(Config.root + myself.id + '/trust/' + new_trust.relationship + "/" + new_trust.peerid)) pair = { 'baseuri': new_trust.baseuri, 'id': myself.id, 'peerid': new_trust.peerid, 'relationship': new_trust.relationship, 'approved': new_trust.approved, 'peer_approved': new_trust.peer_approved, 'verified': new_trust.verified, 'type': new_trust.type, 'desc': new_trust.desc, 'secret': new_trust.secret, } out = json.dumps(pair) self.response.write(out) self.response.headers["Content-Type"] = "application/json" if approved: self.response.set_status(201, 'Created') else: self.response.set_status(202, 'Accepted')
def post(self, id): (Config, myself, check) = auth.init_actingweb(appreq=self, id=id, path='trust') if not myself or check.response["code"] != 200: return if not check.checkAuthorisation(path='trust', method='POST'): self.response.set_status(403) return secret = '' desc = '' relationship = Config.default_relationship type = '' try: params = json.loads(self.request.body.decode('utf-8', 'ignore')) if 'url' in params: url = params['url'] else: url = '' if 'relationship' in params: relationship = params['relationship'] if 'type' in params: type = params['type'] if 'desc' in params: desc = params['desc'] except ValueError: url = self.request.get('url') relationship = self.request.get('relationship') type = self.request.get('type') if len(url) == 0: self.response.set_status(400, 'Missing peer URL') return secret = Config.newToken() new_trust = myself.createReciprocalTrust(url=url, secret=secret, desc=desc, relationship=relationship, type=type) if not new_trust: self.response.set_status(408, 'Unable to create trust relationship') return self.response.headers.add_header( "Location", str(Config.root + myself.id + '/trust/' + new_trust.relationship + '/' + new_trust.peerid)) pair = { 'baseuri': new_trust.baseuri, 'id': myself.id, 'peerid': new_trust.peerid, 'relationship': new_trust.relationship, 'approved': new_trust.approved, 'peer_approved': new_trust.peer_approved, 'verified': new_trust.verified, 'type': new_trust.type, 'desc': new_trust.desc, 'secret': new_trust.secret, } out = json.dumps(pair) self.response.write(out) self.response.headers["Content-Type"] = "application/json" self.response.set_status(201, 'Created')
def post(self, actor_id, relationship): (myself, check) = auth.init_actingweb( appreq=self, actor_id=actor_id, path='trust', subpath=relationship, add_response=False, config=self.config) if not myself: self.response.set_status(404) logging.debug("Got trust creation request for unknown Actor(" + str(id) + ")") return if not check.check_authorisation(path='trust', subpath='<type>', method='POST'): self.response.set_status(403) return try: params = json.loads(self.request.body.decode('utf-8', 'ignore')) if 'baseuri' in params: baseuri = params['baseuri'] else: baseuri = '' if 'id' in params: peerid = params['id'] else: peerid = '' if 'type' in params: peer_type = params['type'] else: peer_type = '' if 'secret' in params: secret = params['secret'] else: secret = '' if 'desc' in params: desc = params['desc'] else: desc = '' if 'verify' in params: verification_token = params['verify'] else: verification_token = None except ValueError: self.response.set_status(400, 'No json content') return if len(baseuri) == 0 or len(peerid) == 0 or len(peer_type) == 0: self.response.set_status(400, 'Missing mandatory attributes') return if self.config.auto_accept_default_relationship and self.config.default_relationship == relationship: approved = True else: approved = False # Since we received a request for a relationship, assume that peer has approved new_trust = myself.create_verified_trust( baseuri=baseuri, peerid=peerid, approved=approved, secret=secret, verification_token=verification_token, trust_type=peer_type, peer_approved=True, relationship=relationship, desc=desc) if not new_trust: self.response.set_status(403, 'Forbidden') return self.response.headers["Location"] = str(self.config.root + myself.id + '/trust/' + new_trust["relationship"] + "/" + new_trust["peerid"]) out = json.dumps(new_trust) self.response.write(out) self.response.headers["Content-Type"] = "application/json" if approved: self.response.set_status(201, 'Created') else: self.response.set_status(202, 'Accepted')
def get(self, actor_id, path): (myself, check) = auth.init_actingweb(appreq=self, actor_id=actor_id, path='www', subpath=path, config=self.config) if not myself or check.response["code"] != 200: return if not self.config.ui: self.response.set_status(404, "Web interface is not enabled") return if not check.check_authorisation( path='www', subpath=path, method='GET'): self.response.write('') self.response.set_status(403) return if not path or path == '': self.response.template_values = { 'url': self.request.url, 'id': actor_id, 'creator': myself.creator, 'passphrase': myself.passphrase, } return if path == 'init': self.response.template_values = { 'id': myself.id, } return if path == 'properties': properties = myself.get_properties() properties = self.on_aw.get_properties(path=None, data=properties) self.response.template_values = { 'id': myself.id, 'properties': properties, } return if path == 'property': lookup = myself.property[self.request.get('name')] lookup = self.on_aw.get_properties(path=self.request.get('name'), data=lookup) if lookup: self.response.template_values = { 'id': myself.id, 'property': self.request.get('name'), 'value': lookup, 'qual': '', } else: self.response.template_values = { 'id': myself.id, 'property': self.request.get('name'), 'value': 'Not set', 'qual': 'no', } return if path == 'trust': relationships = myself.get_trust_relationships() if not relationships or len(relationships) == 0: self.response.set_status(404, 'Not found') return for t in relationships: t["approveuri"] = self.config.root + myself.id + \ '/trust/' + t.relationship + '/' + t.peerid self.response.template_values = { 'id': myself.id, 'trusts': relationships, } return output = self.on_aw.www_paths(path=path) if output: self.response.write(output) else: self.response.set_status(404, "Not found") return
def put(self, id, name): (Config, myself, check) = auth.init_actingweb(appreq=self, id=id, path='properties', subpath=name) if not myself or check.response["code"] != 200: return if not name: path = {} path[0] = None else: path = name.split('/') name = path[0] if len(path) >= 2 and len(path[1]) > 0: resource = path[1] else: resource = None if not check.checkAuthorisation( path='properties', subpath=name, method='PUT'): self.response.set_status(403) return body = self.request.body.decode('utf-8', 'ignore') if len(path) == 1: myself.setProperty(name, body) myself.registerDiffs(target='properties', subtarget=name, blob=body) self.response.set_status(204) return # Keep text blob for later diff registration blob = body # Make store var to be merged with original struct try: body = json.loads(body) except: pass store = {} store[path[len(path) - 1]] = body # logging.debug('store with body:' + json.dumps(store)) # Make store to be at same level as orig value i = len(path) - 2 while i > 0: c = store.copy() store = {} store[path[i]] = c # logging.debug('store with i=' + str(i) + ' (' + json.dumps(store) + ')') i -= 1 # logging.debug('Snippet to store(' + json.dumps(store) + ')') orig = myself.getProperty(name).value logging.debug('Original value(' + orig + ')') try: orig = json.loads(orig) merge_dict(orig, store) res = json.dumps(orig) except: res = json.dumps(store) logging.debug('Result to store( ' + res + ') in /properties/' + name) myself.setProperty(name, res) myself.registerDiffs(target='properties', subtarget=name, resource=resource, blob=blob) self.response.set_status(204)
def get(self, id, path): (Config, myself, check) = auth.init_actingweb(appreq=self, id=id, path='www', subpath=path) if not myself or check.response["code"] != 200: return if not Config.ui: self.response.set_status(404, "Web interface is not enabled") return if not check.checkAuthorisation(path='www', subpath=path, method='GET'): self.response.set_status(403) return if not path or path == '': template_values = { 'url': self.request.url, 'id': id, 'creator': myself.creator, 'passphrase': myself.passphrase, } template_path = os.path.join(os.path.dirname(__file__), 'templates/aw-actor-www-root.html') self.response.write( template.render(template_path, template_values).encode('utf-8')) return if path == 'init': template_values = { 'id': myself.id, } template_path = os.path.join(os.path.dirname(__file__), 'templates/aw-actor-www-init.html') self.response.write( template.render(template_path, template_values).encode('utf-8')) return if path == 'properties': properties = myself.getProperties() template_values = { 'id': myself.id, 'properties': properties, } template_path = os.path.join( os.path.dirname(__file__), 'templates/aw-actor-www-properties.html') self.response.write( template.render(template_path, template_values).encode('utf-8')) return if path == 'property': lookup = myself.getProperty(self.request.get('name')) if lookup.value: template_values = { 'id': myself.id, 'property': lookup.name, 'value': lookup.value, 'qual': '', } else: template_values = { 'id': myself.id, 'property': lookup.name, 'value': 'Not set', 'qual': 'no', } template_path = os.path.join( os.path.dirname(__file__), 'templates/aw-actor-www-property.html') self.response.write( template.render(template_path, template_values).encode('utf-8')) return if path == 'trust': relationships = myself.getTrustRelationships() if not relationships: self.response.set_status(404, 'Not found') return trusts = [] for t in relationships: trusts.append({ "peerid": t.peerid, "relationship": t.relationship, "type": t.type, "approved": t.approved, "approveuri": Config.root + myself.id + '/trust/' + t.relationship + '/' + t.peerid, "peer_approved": t.peer_approved, "baseuri": t.baseuri, "desc": t.desc, "verified": t.verified, }) template_values = { 'id': myself.id, 'trusts': trusts, } template_path = os.path.join(os.path.dirname(__file__), 'templates/aw-actor-www-trust.html') self.response.write( template.render(template_path, template_values).encode('utf-8')) return output = on_aw_www_paths.on_www_paths(myself=myself, req=self, auth=check, path=path) if output: self.response.write(output) else: self.response.set_status(404, "Not found") return
def put(self, actor_id, name): (myself, check) = auth.init_actingweb(appreq=self, actor_id=actor_id, path='properties', subpath=name, config=self.config) if not myself or check.response["code"] != 200: return resource = None if not name: path = [] else: path = name.split('/') name = path[0] if len(path) >= 2 and len(path[1]) > 0: resource = path[1] if not check.check_authorisation(path='properties', subpath=name, method='PUT'): self.response.set_status(403) return body = self.request.body.decode('utf-8', 'ignore') if len(path) == 1: old = myself.property[name] try: old = json.loads(old) except (TypeError, ValueError, KeyError): old = {} try: new = json.loads(body) is_json = True except (TypeError, ValueError, KeyError): new = body is_json = False new = self.on_aw.put_properties(path=path, old=old, new=new) if new is None: self.response.set_status(400, 'Payload is not accepted') return if is_json: myself.property[name] = json.dumps(new) else: myself.property[name] = new myself.register_diffs(target='properties', subtarget=name, blob=body) self.response.set_status(204) return # Keep text blob for later diff registration blob = body # Make store var to be merged with original struct try: body = json.loads(body) except (TypeError, ValueError, KeyError): pass store = {path[len(path) - 1]: body} # logging.debug('store with body:' + json.dumps(store)) # Make store to be at same level as orig value i = len(path)-2 while i > 0: c = copy.copy(store) store = {path[i]: c} # logging.debug('store with i=' + str(i) + ' (' + json.dumps(store) + ')') i -= 1 # logging.debug('Snippet to store(' + json.dumps(store) + ')') orig = myself.property[name] logging.debug('Original value(' + orig + ')') try: orig = json.loads(orig) merge_dict(orig, store) res = orig except (TypeError, ValueError, KeyError): res = store res = self.on_aw.put_properties(path=path, old=orig, new=res) if res is None: self.response.set_status(400, 'Payload is not accepted') return res = json.dumps(res) logging.debug('Result to store( ' + res + ') in /properties/' + name) myself.property[name] = res myself.register_diffs(target='properties', subtarget=name, resource=resource, blob=blob) self.response.set_status(204)