def getresolvers(self):
     '''Return a list of the available resolver names'''
     if self.authType == 'app':
         self.auth = self.app + ":" + Personis_base.generate_app_signature(
             self.app, self.key)
     return jsoncall.do_call(self.modelserver, self.modelport, self.ca_certs_file, "getresolvers", {'modelname':self.modelname,\
              'authType':self.authType, 'auth':self.auth})
 def delcontext(self, context=[]):
     if self.authType == 'app':
         self.auth = self.app + ":" + Personis_base.generate_app_signature(
             self.app, self.key)
     return jsoncall.do_call(self.modelserver, self.modelport, self.ca_certs_file, "delcontext", {'modelname':self.modelname,\
                  'authType':self.authType,\
                  'auth':self.auth,\
                  'context':context})
    def listapps(self):
        """
			returns array of registered app names
		"""
        if self.authType == 'app':
            self.auth = self.app + ":" + Personis_base.generate_app_signature(
                self.app, self.key)
        return jsoncall.do_call(self.modelserver, self.modelport, self.ca_certs_file, "listapps", {'modelname':self.modelname,\
                 'authType':self.authType,\
                 'auth':self.auth})
    def listrequests(self):
        """
			returns array of apps requesting authorisation
		"""
        if self.authType == 'app':
            self.auth = self.app + ":" + Personis_base.generate_app_signature(
                self.app, self.key)
        return jsoncall.do_call(self.modelserver, self.modelport, self.ca_certs_file, "listrequests", {'modelname':self.modelname,\
                 'authType':self.authType,\
                 'auth':self.auth})
 def deleteapp(self, app=None):
     """
                     deletes an app
             """
     if app == None:
         raise ValueError, "deleteapp: app is None"
     if self.authType == 'app':
         self.auth = self.app + ":" + Personis_base.generate_app_signature(
             self.app, self.key)
     return jsoncall.do_call(self.modelserver, self.modelport, self.ca_certs_file, "deleteapp", {'modelname':self.modelname,\
                  'authType':self.authType,\
                  'auth':self.auth,\
                  'app':app})
    def list_subs(self, context=[], componentid=None):
        """
	arguments:
		context is a list giving the path of context identifiers
		componentid designates the component with subscriptions attached
		"""
        if self.authType == 'app':
            self.auth = self.app + ":" + Personis_base.generate_app_signature(
                self.app, self.key)
        return  jsoncall.do_call(self.modelserver, self.modelport, self.ca_certs_file,  "list_subs", {'modelname':self.modelname,\
                     'authType':self.authType,\
                     'auth':self.auth,\
                     'context':context,\
                     'componentid':componentid})
    def import_model(self, context=[], partial_model=None):
        """
	arguments:
		context is the context to import into
		partial_model is a json encoded string containing the partial model
		"""
        if self.authType == 'app':
            self.auth = self.app + ":" + Personis_base.generate_app_signature(
                self.app, self.key)
        return jsoncall.do_call(self.modelserver, self.modelport, self.ca_certs_file, "import_model", {'modelname':self.modelname,\
                     'authType':self.authType,\
                     'auth':self.auth,\
                     'context':context,\
                     'partial_model':partial_model})
    def getcontext(self, context=[], getsize=False):
        """
	Get context information
	arguments:
		context - a list giving the path to the required context
		getsize - True if the size in bytes of the context subtree is required
		"""
        if self.authType == 'app':
            self.auth = self.app + ":" + Personis_base.generate_app_signature(
                self.app, self.key)
        return jsoncall.do_call(self.modelserver, self.modelport, self.ca_certs_file, "getcontext", {'modelname':self.modelname,\
                 'authType':self.authType,\
                 'auth':self.auth,\
                 'context':context,\
                 'getsize':getsize})
 def getpermission(self, context=None, componentid=None, app=None):
     """
                     gets permissions for a context (if componentid is None) or
                             a component
                     returns a tuple (ask,tell)
             """
     if self.authType == 'app':
         self.auth = self.app + ":" + Personis_base.generate_app_signature(
             self.app, self.key)
     return jsoncall.do_call(self.modelserver, self.modelport, self.ca_certs_file, "getpermission", {'modelname':self.modelname,\
                  'authType':self.authType,\
                  'auth':self.auth,\
                  'context': context,\
                  'componentid': componentid,\
                  'app': app})
    def delete_sub(self, context=[], componentid=None, subname=None):
        """
	arguments:
		context is a list giving the path of context identifiers
		componentid designates the component subscribed to
		subname is the subscription name
		"""
        if self.authType == 'app':
            self.auth = self.app + ":" + Personis_base.generate_app_signature(
                self.app, self.key)
        return  jsoncall.do_call(self.modelserver, self.modelport, self.ca_certs_file,  "delete_sub", {'modelname':self.modelname,\
                 'authType':self.authType,\
                 'auth':self.auth,\
                 'context':context,\
                 'componentid':componentid,\
                 'subname':subname})
    def mkcontext(self, context=[], contextobj=None):
        """
	Make a new context in a given context
	arguments:
		context - a list giving the path to the required context 
		contextobj - a Context object
		"""
        if contextobj == None:
            raise ValueError, "mkcontext: contextobj is None"
        if self.authType == 'app':
            self.auth = self.app + ":" + Personis_base.generate_app_signature(
                self.app, self.key)
        return jsoncall.do_call(self.modelserver, self.modelport, self.ca_certs_file, "mkcontext", {'modelname':self.modelname,\
                     'authType':self.authType,\
                     'auth':self.auth,\
                     'context':context,\
                     'contextobj':contextobj.__dict__})
    def set_goals(self, context=[], componentid=None, goals=None):
        """
	arguments:
		context is a list giving the path of context identifiers
		componentid designates the component with subscriptions attached
		goals is a list of paths to components that are:
			goals for this componentid if it is not of type goal
			components that contribute to this componentid if it is of type goal
		"""
        if self.authType == 'app':
            self.auth = self.app + ":" + Personis_base.generate_app_signature(
                self.app, self.key)
        return  jsoncall.do_call(self.modelserver, self.modelport, self.ca_certs_file, "set_goals", {'modelname':self.modelname,\
                     'authType':self.authType,\
                     'auth':self.auth,\
                     'context':context,\
                     'componentid':componentid,\
                     'goals':goals})
    def ask(self, context=[], view=None, resolver=None, showcontexts=None):
        """
	arguments: (see Personis_base for details)
		context is a list giving the path of context identifiers
		view is either:
			an identifier of a view in the context specified
			a list of component identifiers or full path lists
			None indicating that the values of all components in
				the context be returned
		resolver specifies a resolver, default is the builtin resolver

	returns a list of component objects
		"""
        if self.authType == 'app':
            self.auth = self.app + ":" + Personis_base.generate_app_signature(
                self.app, self.key)
        reslist = jsoncall.do_call(self.modelserver, self.modelport, self.ca_certs_file, "ask", {'modelname':self.modelname,\
                  'authType':self.authType,\
                  'auth':self.auth,\
                  'context':context,\
                  'view':view,\
                  'resolver':resolver,\
                  'showcontexts':showcontexts})
        complist = []
        if showcontexts:
            cobjlist, contexts, theviews, thesubs = reslist
            for c in cobjlist:
                comp = Personis_base.Component(**c)
                if c["evidencelist"]:
                    comp.evidencelist = [
                        Personis_base.Evidence(**e) for e in c["evidencelist"]
                    ]
                complist.append(comp)
            reslist = [complist, contexts, theviews, thesubs]
        else:
            for c in reslist:
                comp = Personis_base.Component(**c)
                if c["evidencelist"]:
                    comp.evidencelist = [
                        Personis_base.Evidence(**e) for e in c["evidencelist"]
                    ]
                complist.append(comp)
            reslist = complist
        return reslist
 def setpermission(self,
                   context=None,
                   componentid=None,
                   app=None,
                   permissions={}):
     """
                     sets ask/tell permission for a context (if componentid is None) or
                             a component
             """
     if self.authType == 'app':
         self.auth = self.app + ":" + Personis_base.generate_app_signature(
             self.app, self.key)
     return jsoncall.do_call(self.modelserver, self.modelport, self.ca_certs_file, "setpermission", {'modelname':self.modelname,\
                 'authType':self.authType,\
                 'auth':self.auth,\
                 'context': context,\
                 'componentid': componentid,\
                 'app': app,\
                 'permissions': permissions})
 def delview(self, context=[], viewid=None):
     """
     Delete an existing view in a given context
     arguments:
             context - a list giving the path to the required context
             viewid - the id for the view
     returns:
             None on success
             """
     if viewid == None:
         raise ValueError, "delview: viewid is None"
     if self.authType == 'app':
         self.auth = self.app + ":" + Personis_base.generate_app_signature(
             self.app, self.key)
     return jsoncall.do_call(self.modelserver, self.modelport, self.ca_certs_file, "delview", {'modelname':self.modelname,\
                  'authType':self.authType,\
                  'auth':self.auth,\
                  'context':context,\
                  'viewid':viewid})
 def mkview(self, context=[], viewobj=None):
     """
     Make a new view in a given context
     arguments:
             context - a list giving the path to the required context
             viewobj - a View object
     returns:
             None on success
             a string error message on error
             """
     if viewobj == None:
         raise ValueError, "mkview: viewobj is None"
     if self.authType == 'app':
         self.auth = self.app + ":" + Personis_base.generate_app_signature(
             self.app, self.key)
     return jsoncall.do_call(self.modelserver, self.modelport, self.ca_certs_file, "mkview", {'modelname':self.modelname,\
                  'authType':self.authType,\
                  'auth':self.auth,\
                  'context':context,\
                  'viewobj':viewobj.__dict__})
    def subscribe(self, context=[], view=None, subscription=None):
        """
	arguments:
		context is a list giving the path of context identifiers
		view is either:
			an identifier of a view in the context specified
			a list of component identifiers or full path lists
			None indicating that the values of all components in
				the context be returned
			subscription is a Subscription object
		"""
        if self.authType == 'app':
            self.auth = self.app + ":" + Personis_base.generate_app_signature(
                self.app, self.key)
        return  jsoncall.do_call(self.modelserver, self.modelport, self.ca_certs_file, "subscribe", {'modelname':self.modelname,\
                     'authType':self.authType,\
                     'auth':self.auth,\
                     'context':context,\
                     'view':view,\
                     'subscription':subscription})
    def setresolver(self, context, componentid, resolver):
        """
        set the resolver for a given component in a given context
        arguments:
                context - a list giving the path to the required context
		componentid - the id for a given component
                resolver - the id of the resolver
        returns:
                None on success
                a string error message on error
                """
        if componentid == None:
            raise ValueError, "setresolver: componentid is None"
        if self.authType == 'app':
            self.auth = self.app + ":" + Personis_base.generate_app_signature(
                self.app, self.key)
        return jsoncall.do_call(self.modelserver, self.modelport, self.ca_certs_file, "setresolver", {'modelname':self.modelname,\
                 'authType':self.authType,\
                 'auth':self.auth,\
                 'context':context,\
                 'componentid':componentid, \
                 'resolver':resolver})
    def tell(self,
             context=[],
             componentid=None,
             evidence=None):  # evidence obj
        """
	arguments:
		context - a list giving the path to the required context
		componentid - identifier of the component
		evidence - evidence object to add to the component
		"""
        if componentid == None:
            raise ValueError, "tell: componentid is None"
        if evidence == None:
            raise ValueError, "tell: no evidence provided"
        if self.authType == 'app':
            self.auth = self.app + ":" + Personis_base.generate_app_signature(
                self.app, self.key)
        return jsoncall.do_call(self.modelserver, self.modelport, self.ca_certs_file, "tell", {'modelname':self.modelname,\
                  'authType':self.authType,\
                  'auth':self.auth,\
                  'context':context,\
                  'componentid':componentid,\
                  'evidence':evidence.__dict__})
    def export_model(self, context=[], level=None, resolver=None):
        """
	arguments:
		context is the context to export
                resolver is a string containing the name of a resolver
                        or
                resolver is a dictionary containing information about resolver(s) to be used and arguments
                        the "resolver" key gives the name of a resolver to use, if not present the default resolver is used
                        the "evidence_filter" key specifies an evidence filter
                        eg 'evidence_filter' =  "all" returns all evidence,
                                                "last10" returns last 10 evidence items,
                                                "last1" returns most recent evidence item,
                                                None returns no evidence
		"""
        if self.authType == 'app':
            self.auth = self.app + ":" + Personis_base.generate_app_signature(
                self.app, self.key)
        return jsoncall.do_call(self.modelserver, self.modelport, self.ca_certs_file, "export_model", {'modelname':self.modelname,\
                 'authType':self.authType,\
                 'auth':self.auth,\
                 'context':context,\
                 'level':level,\
                 'resolver':resolver})
Esempio n. 21
0
print
print "Tell full name as owner"
ev = Personis_base.Evidence(evidence_type="explicit", value="Alice")
um.tell(context=["Personal"], componentid='firstname', evidence=ev)
ev = Personis_base.Evidence(evidence_type="explicit", value="Smith")
um.tell(context=["Personal"], componentid='lastname', evidence=ev)

print "Ask for Alice's fullname as owner (should work)"
reslist = um.ask(context=["Personal"], view='fullname')
print reslist[0].value, reslist[1].value

um = None
print "Access Alice's model as an unregistered App:"
try:
    unregistered_key = Personis_base.generate_app_key("MyHealth")
    auth = 'withings:' + Personis_base.generate_app_signature(
        'withings', unregistered_key)
    um = Personis_base.Access(model="Alice",
                              modeldir='Tests/Models',
                              authType='app',
                              auth=auth)
except Exception as e:
    print "Access failed with exception : %s\n" % (e)

um = None
print "Access Alice's model as a registered App (should work):"
try:
    auth = 'MyHealth:' + Personis_base.generate_app_signature('MyHealth', key)
    um = Personis_base.Access(model="Alice",
                              modeldir='Tests/Models',
                              authType='app',
                              auth=auth)
    def __init__(self,
                 model=None,
                 modelserver=None,
                 user=None,
                 password=None,
                 app=None,
                 description="",
                 debug=0,
                 ca_certs_file="ca_certs/ca.pem"):
        if modelserver == None:
            raise ValueError, "modelserver is None"
        if ':' in modelserver:
            self.modelserver, self.modelport = modelserver.split(":")
        else:
            self.modelserver = modelserver
            self.modelport = 2005  # default port for personis server
        self.modelname = model
        self.user = user
        self.password = password
        self.app = app
        self.description = description
        self.debug = debug
        self.key = None
        self.ca_certs_file = ca_certs_file
        if self.app == None:
            self.auth = user + ":" + password
            self.authType = "user"
        else:
            self.authType = "app"
            try:
                self.key = Personis_base.import_app_key(app)
            except Personis_exceptions.KeyFileNotFoundError:
                self.key = Personis_base.generate_app_key(self.app)
                fingerprint = Personis_base.generate_app_fingerprint(self.key)
                AppRequestAuth(model=self.modelname,
                               modelserver=self.modelserver,
                               app=self.app,
                               key=self.key.publickey().exportKey(),
                               description=self.description)
                message = "Authorisation has been requested for app " + self.app + " to access model " + self.model + " on server " + self.modelserver + ".\n"
                message += "Key fingerprint: %s\n" % (fingerprint)
                raise Personis_exceptions.AuthRequestedError(message)

        ok = False
        try:
            command = "access"
            args = {'modelname': self.modelname}
            if self.app != None:
                self.auth = self.app + ":" + Personis_base.generate_app_signature(
                    self.app, self.key)
                args['authType'] = 'app'
            else:
                args['authType'] = 'user'
            args['auth'] = self.auth
            if self.debug != 0:
                print "jsondocall:", self.modelserver, self.modelport, self.ca_certs_file, self.modelname, self.authType, self.auth

            ok = jsoncall.do_call(self.modelserver, self.modelport,
                                  self.ca_certs_file, command, args)
            if self.debug != 0:
                print "---------------------- result returned", ok
        except:
            if debug > 0:
                traceback.print_exc()
            raise
            raise ValueError, "cannot access model '%s', server '%s'" % (
                self.modelname, self.modelserver)
        if not ok:
            raise ValueError, "server '%s' cannot access model '%s'" % (
                self.modelserver, self.modelname)
print
print "Tell full name as owner"
ev = Personis_base.Evidence(evidence_type="explicit", value="Alice")
um.tell(context=["Personal"], componentid='firstname', evidence=ev)
ev = Personis_base.Evidence(evidence_type="explicit", value="Smith")
um.tell(context=["Personal"], componentid='lastname', evidence=ev)

print "Ask for Alice's fullname as owner (should work)"
reslist = um.ask(context=["Personal"], view='fullname')
print reslist[0].value, reslist[1].value

um = None
print "Access Alice's model as an unregistered App:"
try:
	unregistered_key = Personis_base.generate_app_key("MyHealth")
	auth = 'withings:' + Personis_base.generate_app_signature('withings', unregistered_key)
	um = Personis_base.Access(model="Alice", modeldir='Tests/Models', authType='app', auth=auth)
except Exception as e:
	print "Access failed with exception : %s\n" % (e)

um = None
print "Access Alice's model as a registered App (should work):"
try:
	auth = 'MyHealth:' + Personis_base.generate_app_signature('MyHealth', key) 
	um = Personis_base.Access(model="Alice", modeldir='Tests/Models', authType='app', auth=auth)
except Exception as e:
	print "Access failed with exception : %s\n" % (e)

print "Ask for Alice's fullname as app 'MyHealth' (should NOT work)"
try:
	reslist = um.ask(context=["Personal"], view='fullname')