from sfa.util.sfatime import utcparse, datetime_to_epoch
from sfa.util.prefixTree import prefixTree
from sfa.util.xrn import Xrn, get_authority, hrn_to_urn, urn_to_hrn
-from sfa.util.plxrn import hrn_to_pl_login_base
from sfa.util.version import version_core
from sfa.util.sfalogging import logger
'urn':xrn.get_urn(),
'peers':peers})
- def GetCredential(self, api, xrn, type, is_self=False):
+ def GetCredential(self, api, xrn, type, caller_xrn=None):
# convert xrn to hrn
if type:
hrn = urn_to_hrn(xrn)[0]
record=dbsession.query(RegRecord).filter_by(type=type,hrn=hrn).first()
if not record:
raise RecordNotFound("hrn=%s, type=%s"%(hrn,type))
-
- # verify_cancreate_credential requires that the member lists
- # (researchers, pis, etc) be filled in
- logger.debug("get credential before augment dict, keys=%s"%record.__dict__.keys())
- self.driver.augment_records_with_testbed_info (record.__dict__)
- logger.debug("get credential after augment dict, keys=%s"%record.__dict__.keys())
- if not self.driver.is_enabled (record.__dict__):
- raise AccountNotEnabled(": PlanetLab account %s is not enabled. Please contact your site PI" %(record.email))
+
+ # xxx for the record only
+ # used to call this, which was wrong, now all needed data is natively is our DB
+ # self.driver.augment_records_with_testbed_info (record.__dict__)
+ # likewise, we deprecate is_enabled which was not really useful
+ # if not self.driver.is_enabled (record.__dict__): ...
+ # xxx for the record only
# get the callers gid
- # if this is a self cred the record's gid is the caller's gid
- if is_self:
+ # if caller_xrn is not specified assume the caller is the record
+ # object itself.
+ if not caller_xrn:
caller_hrn = hrn
caller_gid = record.get_gid_object()
else:
- caller_gid = api.auth.client_cred.get_gid_caller()
- caller_hrn = caller_gid.get_hrn()
-
+ caller_hrn, caller_type = urn_to_hrn(caller_xrn)
+ if caller_type:
+ caller_record = dbsession.query(RegRecord).filter_by(hrn=caller_hrn,type=caller_type).first()
+ else:
+ caller_record = dbsession.query(RegRecord).filter_by(hrn=caller_hrn).first()
+ if not caller_record:
+ raise RecordNotFound("Unable to associated caller (hrn=%s, type=%s) with credential for (hrn: %s, type: %s)"%(caller_hrn, caller_type, hrn, type))
+ caller_gid = GID(string=caller_record.gid)
+
object_hrn = record.get_gid_object().get_hrn()
- rights = api.auth.determine_user_rights(caller_hrn, record.__dict__)
+ # call the builtin authorization/credential generation engine
+ rights = api.auth.determine_user_rights(caller_hrn, record)
# make sure caller has rights to this object
if rights.is_empty():
raise PermissionError("%s has no rights to %s (%s)" % \
def List (self, api, xrn, origin_hrn=None):
hrn, type = urn_to_hrn(xrn)
+ recursive = False
+ if hrn.endswith('*'):
+ hrn = hrn[:-1]
+ recursive = True
# load all know registry names into a prefix tree and attempt to find
# the longest matching prefix
registries = api.registries
if not record_dicts:
if not api.auth.hierarchy.auth_exists(hrn):
raise MissingAuthority(hrn)
- records = dbsession.query(RegRecord).filter_by(authority=hrn)
+ if recursive:
+ records = dbsession.query(RegRecord).filter(RegRecord.hrn.startswith(hrn))
+ else:
+ records = dbsession.query(RegRecord).filter_by(authority=hrn)
record_dicts=[ record.todict() for record in records ]
return record_dicts