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')
Exemple #3
0
    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')
Exemple #4
0
    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
Exemple #5
0
 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
Exemple #7
0
 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)