From: Thierry Parmentelat Date: Wed, 6 Jul 2011 10:38:50 +0000 (+0200) Subject: reviewed consistency of the expiration field in credential, and calls X-Git-Tag: sfa-1.0-27~31 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=1c663cf3a4a011d01a8dec6ec1b98834b23c00f0;hp=b3ecf9e21fc2d4c57c2fc0f507df5eb5fc429786;p=sfa.git reviewed consistency of the expiration field in credential, and calls to utcparse that could not deal with a datetime input --- diff --git a/sfa/trust/credential.py b/sfa/trust/credential.py index fad46682..45c34f81 100644 --- a/sfa/trust/credential.py +++ b/sfa/trust/credential.py @@ -26,19 +26,17 @@ # Credentials are signed XML files that assign a subject gid privileges to an object gid ## -### $Id$ -### $URL$ - import os +from types import StringTypes import datetime -from sfa.util.sfatime import utcparse +from StringIO import StringIO from tempfile import mkstemp from xml.dom.minidom import Document, parseString from lxml import etree -from dateutil.parser import parse -from StringIO import StringIO + from sfa.util.faults import * from sfa.util.sfalogging import logger +from sfa.util.sfatime import utcparse from sfa.trust.certificate import Keypair from sfa.trust.credential_legacy import CredentialLegacy from sfa.trust.rights import Right, Rights @@ -347,22 +345,26 @@ class Credential(object): ## - # Expiration: an absolute UTC time of expiration (as either an int or datetime) + # Expiration: an absolute UTC time of expiration (as either an int or string or datetime) # def set_expiration(self, expiration): if isinstance(expiration, int): self.expiration = datetime.datetime.fromtimestamp(expiration) - else: + elif isinstance (expiration, datetime.datetime): self.expiration = expiration - + elif isinstance (expiration, StringTypes): + self.expiration = utcparse (expiration) + else: + logger.error ("unexpected input type in Credential.set_expiration") ## - # get the lifetime of the credential (in datetime format) - + # get the lifetime of the credential (always in datetime format) + # def get_expiration(self): if not self.expiration: self.decode() - return utcparse(self.expiration) + # at this point self.expiration is normalized as a datetime - DON'T call utcparse again + return self.expiration ## # For legacy sake @@ -645,7 +647,7 @@ class Credential(object): self.set_refid(cred.getAttribute("xml:id")) - self.set_expiration(parse(getTextNode(cred, "expires"))) + self.set_expiration(utcparse(getTextNode(cred, "expires"))) self.gidCaller = GID(string=getTextNode(cred, "owner_gid")) self.gidObject = GID(string=getTextNode(cred, "target_gid")) diff --git a/sfa/util/sfatime.py b/sfa/util/sfatime.py index 901b4e0d..1c5b6fd3 100644 --- a/sfa/util/sfatime.py +++ b/sfa/util/sfatime.py @@ -1,10 +1,16 @@ import dateutil.parser +import datetime -def utcparse(str): +from sfa.util.sfalogging import logger + +def utcparse(string): """ Translate a string into a time using dateutil.parser.parse but make sure it's in UTC time and strip the timezone, so that it's compatible with normal datetime.datetime objects""" - t = dateutil.parser.parse(str) - if not t.utcoffset() is None: + if isinstance (string, datetime.datetime): + logger.warn ("argument to utcparse already a datetime - doing nothing") + return string + t = dateutil.parser.parse(string) + if t.utcoffset() is not None: t = t.utcoffset() + t.replace(tzinfo=None) return t