pvl/login/pubtkt.py
author Tero Marttila <terom@fixme.fi>
Mon, 10 Mar 2014 18:27:58 +0200
changeset 378 3fed153a1fe6
parent 371 8c17eb11858f
permissions -rw-r--r--
pvl.dns.zone: typofix self.comment
348
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     1
import base64
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     2
import calendar
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     3
import datetime
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     4
import ipaddr
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     5
import hashlib
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     6
import M2Crypto
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     7
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     8
import logging; log = logging.getLogger('pvl.login.pubtkt')
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     9
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    10
def datetime2unix (dt) :
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    11
    """
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    12
        datetime.datetime -> float
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    13
    """
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    14
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    15
    return calendar.timegm(dt.utctimetuple())
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    16
351
147f5e86b139 pvl.login: fix validity logic, implement renew
Tero Marttila <terom@paivola.fi>
parents: 349
diff changeset
    17
def unix2datetime (unix) :
147f5e86b139 pvl.login: fix validity logic, implement renew
Tero Marttila <terom@paivola.fi>
parents: 349
diff changeset
    18
    return datetime.datetime.utcfromtimestamp(unix)
147f5e86b139 pvl.login: fix validity logic, implement renew
Tero Marttila <terom@paivola.fi>
parents: 349
diff changeset
    19
348
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    20
class Error (Exception) :
370
184917c7d4d4 pvl.login: update access on renew
Tero Marttila <terom@paivola.fi>
parents: 369
diff changeset
    21
    """
184917c7d4d4 pvl.login: update access on renew
Tero Marttila <terom@paivola.fi>
parents: 369
diff changeset
    22
        Error
184917c7d4d4 pvl.login: update access on renew
Tero Marttila <terom@paivola.fi>
parents: 369
diff changeset
    23
    """
184917c7d4d4 pvl.login: update access on renew
Tero Marttila <terom@paivola.fi>
parents: 369
diff changeset
    24
354
d46c8d3e3140 pvl.login: ui tweaks, alerts, back support
Tero Marttila <terom@paivola.fi>
parents: 351
diff changeset
    25
    def __init__ (self, error) :
d46c8d3e3140 pvl.login: ui tweaks, alerts, back support
Tero Marttila <terom@paivola.fi>
parents: 351
diff changeset
    26
        self.error = error
348
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    27
370
184917c7d4d4 pvl.login: update access on renew
Tero Marttila <terom@paivola.fi>
parents: 369
diff changeset
    28
    def __unicode__ (self) :
184917c7d4d4 pvl.login: update access on renew
Tero Marttila <terom@paivola.fi>
parents: 369
diff changeset
    29
        return u"{doc}: {self.error}".format(self=self, doc=self.__doc__.strip())
184917c7d4d4 pvl.login: update access on renew
Tero Marttila <terom@paivola.fi>
parents: 369
diff changeset
    30
348
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    31
class ParseError (Error) :
354
d46c8d3e3140 pvl.login: ui tweaks, alerts, back support
Tero Marttila <terom@paivola.fi>
parents: 351
diff changeset
    32
    """
370
184917c7d4d4 pvl.login: update access on renew
Tero Marttila <terom@paivola.fi>
parents: 369
diff changeset
    33
        Unable to parse PubTkt from cookie
354
d46c8d3e3140 pvl.login: ui tweaks, alerts, back support
Tero Marttila <terom@paivola.fi>
parents: 351
diff changeset
    34
    """
d46c8d3e3140 pvl.login: ui tweaks, alerts, back support
Tero Marttila <terom@paivola.fi>
parents: 351
diff changeset
    35
348
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    36
class VerifyError (Error) :
354
d46c8d3e3140 pvl.login: ui tweaks, alerts, back support
Tero Marttila <terom@paivola.fi>
parents: 351
diff changeset
    37
    """
370
184917c7d4d4 pvl.login: update access on renew
Tero Marttila <terom@paivola.fi>
parents: 369
diff changeset
    38
        Invalid login token sigunature
354
d46c8d3e3140 pvl.login: ui tweaks, alerts, back support
Tero Marttila <terom@paivola.fi>
parents: 351
diff changeset
    39
    """
d46c8d3e3140 pvl.login: ui tweaks, alerts, back support
Tero Marttila <terom@paivola.fi>
parents: 351
diff changeset
    40
348
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    41
    def __init__ (self, pubtkt, error) :
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    42
        self.pubtkt = pubtkt
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    43
        self.error = error
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    44
371
8c17eb11858f pvl.login.pubtkt: ExpiredError is not a VerifyError, and use valid()
Tero Marttila <terom@paivola.fi>
parents: 370
diff changeset
    45
class ExpiredError (Error) :
354
d46c8d3e3140 pvl.login: ui tweaks, alerts, back support
Tero Marttila <terom@paivola.fi>
parents: 351
diff changeset
    46
    """
370
184917c7d4d4 pvl.login: update access on renew
Tero Marttila <terom@paivola.fi>
parents: 369
diff changeset
    47
        Login token has expired
354
d46c8d3e3140 pvl.login: ui tweaks, alerts, back support
Tero Marttila <terom@paivola.fi>
parents: 351
diff changeset
    48
    """
d46c8d3e3140 pvl.login: ui tweaks, alerts, back support
Tero Marttila <terom@paivola.fi>
parents: 351
diff changeset
    49
370
184917c7d4d4 pvl.login: update access on renew
Tero Marttila <terom@paivola.fi>
parents: 369
diff changeset
    50
    def __init__ (self, pubtkt, expire) :
348
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    51
        self.pubtkt = pubtkt
370
184917c7d4d4 pvl.login: update access on renew
Tero Marttila <terom@paivola.fi>
parents: 369
diff changeset
    52
        self.error = expire
348
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    53
370
184917c7d4d4 pvl.login: update access on renew
Tero Marttila <terom@paivola.fi>
parents: 369
diff changeset
    54
class RenewError (Error) :
184917c7d4d4 pvl.login: update access on renew
Tero Marttila <terom@paivola.fi>
parents: 369
diff changeset
    55
    """
184917c7d4d4 pvl.login: update access on renew
Tero Marttila <terom@paivola.fi>
parents: 369
diff changeset
    56
        Unable to renew login token
184917c7d4d4 pvl.login: update access on renew
Tero Marttila <terom@paivola.fi>
parents: 369
diff changeset
    57
    """
354
d46c8d3e3140 pvl.login: ui tweaks, alerts, back support
Tero Marttila <terom@paivola.fi>
parents: 351
diff changeset
    58
d46c8d3e3140 pvl.login: ui tweaks, alerts, back support
Tero Marttila <terom@paivola.fi>
parents: 351
diff changeset
    59
class ServerError (Error) :
d46c8d3e3140 pvl.login: ui tweaks, alerts, back support
Tero Marttila <terom@paivola.fi>
parents: 351
diff changeset
    60
    """
370
184917c7d4d4 pvl.login: update access on renew
Tero Marttila <terom@paivola.fi>
parents: 369
diff changeset
    61
        Login request from invalid server
354
d46c8d3e3140 pvl.login: ui tweaks, alerts, back support
Tero Marttila <terom@paivola.fi>
parents: 351
diff changeset
    62
    """
d46c8d3e3140 pvl.login: ui tweaks, alerts, back support
Tero Marttila <terom@paivola.fi>
parents: 351
diff changeset
    63
    
348
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    64
class ServerKeys (object) :
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    65
    @classmethod
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    66
    def config (cls, public_key, private_key) :
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    67
        return cls(
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    68
                public  = M2Crypto.RSA.load_pub_key(public_key),
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    69
                private = M2Crypto.RSA.load_key(private_key),
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    70
        )
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    71
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    72
    def __init__ (self, public, private) :
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    73
        self.public = public
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    74
        self.private = private
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    75
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    76
class PubTkt (object) :
351
147f5e86b139 pvl.login: fix validity logic, implement renew
Tero Marttila <terom@paivola.fi>
parents: 349
diff changeset
    77
    @staticmethod
147f5e86b139 pvl.login: fix validity logic, implement renew
Tero Marttila <terom@paivola.fi>
parents: 349
diff changeset
    78
    def now () :
147f5e86b139 pvl.login: fix validity logic, implement renew
Tero Marttila <terom@paivola.fi>
parents: 349
diff changeset
    79
        return datetime.datetime.utcnow()
147f5e86b139 pvl.login: fix validity logic, implement renew
Tero Marttila <terom@paivola.fi>
parents: 349
diff changeset
    80
348
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    81
    @classmethod
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    82
    def load (cls, cookie, public_key) :
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    83
        """
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    84
            Load and verify a pubtkt from a cookie.
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    85
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    86
            Raise ParseError, VerifyError.
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    87
        """
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    88
        
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    89
        pubtkt, hash, sig = cls.parse(cookie)
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    90
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    91
        log.debug("parsed %s hash=%s sig=%s", pubtkt, hash.encode('hex'), sig.encode('hex'))
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    92
        
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    93
        try :
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    94
            if not public_key.verify(hash, sig, 'sha1') :
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    95
                raise VerifyError(pubtkt, "Unable to verify signature")
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    96
        except M2Crypto.RSA.RSAError as ex :
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    97
            raise VerifyError(pubtkt, str(ex))
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    98
        
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    99
371
8c17eb11858f pvl.login.pubtkt: ExpiredError is not a VerifyError, and use valid()
Tero Marttila <terom@paivola.fi>
parents: 370
diff changeset
   100
        log.debug("checking expiry %s", pubtkt.validuntil)
8c17eb11858f pvl.login.pubtkt: ExpiredError is not a VerifyError, and use valid()
Tero Marttila <terom@paivola.fi>
parents: 370
diff changeset
   101
        
8c17eb11858f pvl.login.pubtkt: ExpiredError is not a VerifyError, and use valid()
Tero Marttila <terom@paivola.fi>
parents: 370
diff changeset
   102
        if not pubtkt.valid() :
370
184917c7d4d4 pvl.login: update access on renew
Tero Marttila <terom@paivola.fi>
parents: 369
diff changeset
   103
            raise ExpiredError(pubtkt, pubtkt.validuntil)
348
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   104
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   105
        return pubtkt
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   106
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   107
    @classmethod
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   108
    def parse (cls, cookie) :
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   109
        """
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   110
            Load a pubtkt from a cookie
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   111
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   112
            Raises ParseError.
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   113
        """
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   114
        
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   115
        if ';sig=' in cookie :
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   116
            data, sig = cookie.rsplit(';sig=', 1)
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   117
        else :
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   118
            raise ParseError("Missing signature")
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   119
        
354
d46c8d3e3140 pvl.login: ui tweaks, alerts, back support
Tero Marttila <terom@paivola.fi>
parents: 351
diff changeset
   120
        try :
d46c8d3e3140 pvl.login: ui tweaks, alerts, back support
Tero Marttila <terom@paivola.fi>
parents: 351
diff changeset
   121
            sig = base64.b64decode(sig)
d46c8d3e3140 pvl.login: ui tweaks, alerts, back support
Tero Marttila <terom@paivola.fi>
parents: 351
diff changeset
   122
        except (ValueError, TypeError) as ex :
d46c8d3e3140 pvl.login: ui tweaks, alerts, back support
Tero Marttila <terom@paivola.fi>
parents: 351
diff changeset
   123
            raise ParseError("Invalid signature")
d46c8d3e3140 pvl.login: ui tweaks, alerts, back support
Tero Marttila <terom@paivola.fi>
parents: 351
diff changeset
   124
348
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   125
        hash = hashlib.sha1(data).digest()
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   126
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   127
        try :
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   128
            attrs = dict(field.split('=', 1) for field in data.split(';'))
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   129
        except ValueError as ex :
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   130
            raise ParseError(str(ex))
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   131
        
354
d46c8d3e3140 pvl.login: ui tweaks, alerts, back support
Tero Marttila <terom@paivola.fi>
parents: 351
diff changeset
   132
        if 'uid' not in attrs or 'validuntil' not in attrs :
d46c8d3e3140 pvl.login: ui tweaks, alerts, back support
Tero Marttila <terom@paivola.fi>
parents: 351
diff changeset
   133
            raise ParseError("Missing parameters in cookie (uid, validuntil)")
d46c8d3e3140 pvl.login: ui tweaks, alerts, back support
Tero Marttila <terom@paivola.fi>
parents: 351
diff changeset
   134
348
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   135
        try :
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   136
            return cls.build(**attrs), hash, sig
354
d46c8d3e3140 pvl.login: ui tweaks, alerts, back support
Tero Marttila <terom@paivola.fi>
parents: 351
diff changeset
   137
        except TypeError as ex :
d46c8d3e3140 pvl.login: ui tweaks, alerts, back support
Tero Marttila <terom@paivola.fi>
parents: 351
diff changeset
   138
            raise ParseError("Invalid or missing parameters in cookie")
d46c8d3e3140 pvl.login: ui tweaks, alerts, back support
Tero Marttila <terom@paivola.fi>
parents: 351
diff changeset
   139
        except ValueError as ex :
348
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   140
            raise ParseError(str(ex))
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   141
    
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   142
    @classmethod
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   143
    def build (cls, uid, validuntil, cip=None, tokens=None, udata=None, graceperiod=None, bauth=None) :
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   144
        """
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   145
            Build a pubtkt from items.
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   146
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   147
            Raises TypeError or ValueError..
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   148
        """
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   149
        
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   150
        return cls(uid,
351
147f5e86b139 pvl.login: fix validity logic, implement renew
Tero Marttila <terom@paivola.fi>
parents: 349
diff changeset
   151
                validuntil  = unix2datetime(int(validuntil)),
348
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   152
                cip         = ipaddr.IPAddress(cip) if cip else None,
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   153
                tokens      = tokens.split(',') if tokens else (),
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   154
                udata       = udata,
351
147f5e86b139 pvl.login: fix validity logic, implement renew
Tero Marttila <terom@paivola.fi>
parents: 349
diff changeset
   155
                graceperiod = unix2datetime(int(graceperiod)) if graceperiod else None,
348
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   156
                bauth       = bauth,
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   157
        )
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   158
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   159
    @classmethod
354
d46c8d3e3140 pvl.login: ui tweaks, alerts, back support
Tero Marttila <terom@paivola.fi>
parents: 351
diff changeset
   160
    def new (cls, uid, valid, grace=None, **opts) :
351
147f5e86b139 pvl.login: fix validity logic, implement renew
Tero Marttila <terom@paivola.fi>
parents: 349
diff changeset
   161
        now = cls.now()
348
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   162
354
d46c8d3e3140 pvl.login: ui tweaks, alerts, back support
Tero Marttila <terom@paivola.fi>
parents: 351
diff changeset
   163
        return cls(uid, now + valid,
d46c8d3e3140 pvl.login: ui tweaks, alerts, back support
Tero Marttila <terom@paivola.fi>
parents: 351
diff changeset
   164
            graceperiod = now + grace if grace else None,
d46c8d3e3140 pvl.login: ui tweaks, alerts, back support
Tero Marttila <terom@paivola.fi>
parents: 351
diff changeset
   165
            **opts
d46c8d3e3140 pvl.login: ui tweaks, alerts, back support
Tero Marttila <terom@paivola.fi>
parents: 351
diff changeset
   166
        )
348
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   167
370
184917c7d4d4 pvl.login: update access on renew
Tero Marttila <terom@paivola.fi>
parents: 369
diff changeset
   168
    def update (self, valid, grace, cip=None, tokens=None, udata=None, bauth=None) :
184917c7d4d4 pvl.login: update access on renew
Tero Marttila <terom@paivola.fi>
parents: 369
diff changeset
   169
        now = self.now()
184917c7d4d4 pvl.login: update access on renew
Tero Marttila <terom@paivola.fi>
parents: 369
diff changeset
   170
184917c7d4d4 pvl.login: update access on renew
Tero Marttila <terom@paivola.fi>
parents: 369
diff changeset
   171
        return type(self)(self.uid, now + valid,
184917c7d4d4 pvl.login: update access on renew
Tero Marttila <terom@paivola.fi>
parents: 369
diff changeset
   172
            graceperiod = now + grace if grace else None,
184917c7d4d4 pvl.login: update access on renew
Tero Marttila <terom@paivola.fi>
parents: 369
diff changeset
   173
            cip         = self.cip if cip is None else cip,
184917c7d4d4 pvl.login: update access on renew
Tero Marttila <terom@paivola.fi>
parents: 369
diff changeset
   174
            tokens      = self.tokens if tokens is None else tokens,
184917c7d4d4 pvl.login: update access on renew
Tero Marttila <terom@paivola.fi>
parents: 369
diff changeset
   175
            udata       = self.udata if udata is None else udata,
184917c7d4d4 pvl.login: update access on renew
Tero Marttila <terom@paivola.fi>
parents: 369
diff changeset
   176
            bauth       = self.bauth if bauth is None else bauth,
184917c7d4d4 pvl.login: update access on renew
Tero Marttila <terom@paivola.fi>
parents: 369
diff changeset
   177
        )
184917c7d4d4 pvl.login: update access on renew
Tero Marttila <terom@paivola.fi>
parents: 369
diff changeset
   178
348
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   179
    def __init__ (self, uid, validuntil, cip=None, tokens=(), udata=None, graceperiod=None, bauth=None) :
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   180
        self.uid = uid
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   181
        self.validuntil = validuntil
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   182
        self.cip = cip
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   183
        self.tokens = tokens
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   184
        self.udata = udata
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   185
        self.graceperiod = graceperiod
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   186
        self.bauth = bauth
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   187
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   188
    def iteritems (self) :
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   189
        yield 'uid', self.uid
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   190
        yield 'validuntil', int(datetime2unix(self.validuntil))
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   191
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   192
        if self.cip :
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   193
            yield 'cip', self.cip
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   194
        
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   195
        if self.tokens :
369
e6d0e8a967ac pvl.login: ldap access (tokens) and userdata support
Tero Marttila <terom@paivola.fi>
parents: 366
diff changeset
   196
            yield 'tokens', ','.join(str(token) for token in self.tokens)
348
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   197
        
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   198
        if self.udata :
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   199
            yield 'udata', self.udata
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   200
        
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   201
        if self.graceperiod :
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   202
            yield 'graceperiod', int(datetime2unix(self.graceperiod))
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   203
        
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   204
        if self.bauth :
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   205
            yield 'bauth', self.bauth
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   206
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   207
    def __str__ (self) :
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   208
        """
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   209
            The (unsigned) pubtkt
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   210
        """
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   211
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   212
        return ';'.join('%s=%s' % (key, value) for key, value in self.iteritems())
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   213
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   214
    def sign (self, private_key) :
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   215
        data = str(self)
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   216
        hash = hashlib.sha1(data).digest()
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   217
        sign = private_key.sign(hash, 'sha1')
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   218
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   219
        return '%s;sig=%s' % (self, base64.b64encode(sign))
089ec3eddc92 pvl.login: a pubtkt-based sso login server..
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   220
349
3c20473d0bdc pvl.login: pimp out form with domain, and iconized panel for ticket
Tero Marttila <terom@paivola.fi>
parents: 348
diff changeset
   221
    def valid (self) :
3c20473d0bdc pvl.login: pimp out form with domain, and iconized panel for ticket
Tero Marttila <terom@paivola.fi>
parents: 348
diff changeset
   222
        """
3c20473d0bdc pvl.login: pimp out form with domain, and iconized panel for ticket
Tero Marttila <terom@paivola.fi>
parents: 348
diff changeset
   223
            Return remaining ticket validity.
3c20473d0bdc pvl.login: pimp out form with domain, and iconized panel for ticket
Tero Marttila <terom@paivola.fi>
parents: 348
diff changeset
   224
        """
3c20473d0bdc pvl.login: pimp out form with domain, and iconized panel for ticket
Tero Marttila <terom@paivola.fi>
parents: 348
diff changeset
   225
351
147f5e86b139 pvl.login: fix validity logic, implement renew
Tero Marttila <terom@paivola.fi>
parents: 349
diff changeset
   226
        now = self.now()
147f5e86b139 pvl.login: fix validity logic, implement renew
Tero Marttila <terom@paivola.fi>
parents: 349
diff changeset
   227
147f5e86b139 pvl.login: fix validity logic, implement renew
Tero Marttila <terom@paivola.fi>
parents: 349
diff changeset
   228
        if self.validuntil > now :
147f5e86b139 pvl.login: fix validity logic, implement renew
Tero Marttila <terom@paivola.fi>
parents: 349
diff changeset
   229
            return self.validuntil - now
147f5e86b139 pvl.login: fix validity logic, implement renew
Tero Marttila <terom@paivola.fi>
parents: 349
diff changeset
   230
        else :
147f5e86b139 pvl.login: fix validity logic, implement renew
Tero Marttila <terom@paivola.fi>
parents: 349
diff changeset
   231
            return False
349
3c20473d0bdc pvl.login: pimp out form with domain, and iconized panel for ticket
Tero Marttila <terom@paivola.fi>
parents: 348
diff changeset
   232
3c20473d0bdc pvl.login: pimp out form with domain, and iconized panel for ticket
Tero Marttila <terom@paivola.fi>
parents: 348
diff changeset
   233
    def grace (self) :
3c20473d0bdc pvl.login: pimp out form with domain, and iconized panel for ticket
Tero Marttila <terom@paivola.fi>
parents: 348
diff changeset
   234
        """
356
90697e60bf28 pvl.login.PubTkt: change grace() to return timedelta within grace period
Tero Marttila <terom@paivola.fi>
parents: 354
diff changeset
   235
            Return remaining grace period.
349
3c20473d0bdc pvl.login: pimp out form with domain, and iconized panel for ticket
Tero Marttila <terom@paivola.fi>
parents: 348
diff changeset
   236
        """
351
147f5e86b139 pvl.login: fix validity logic, implement renew
Tero Marttila <terom@paivola.fi>
parents: 349
diff changeset
   237
        
147f5e86b139 pvl.login: fix validity logic, implement renew
Tero Marttila <terom@paivola.fi>
parents: 349
diff changeset
   238
        now = self.now()
147f5e86b139 pvl.login: fix validity logic, implement renew
Tero Marttila <terom@paivola.fi>
parents: 349
diff changeset
   239
        
147f5e86b139 pvl.login: fix validity logic, implement renew
Tero Marttila <terom@paivola.fi>
parents: 349
diff changeset
   240
        if not self.graceperiod :
147f5e86b139 pvl.login: fix validity logic, implement renew
Tero Marttila <terom@paivola.fi>
parents: 349
diff changeset
   241
            return None
349
3c20473d0bdc pvl.login: pimp out form with domain, and iconized panel for ticket
Tero Marttila <terom@paivola.fi>
parents: 348
diff changeset
   242
356
90697e60bf28 pvl.login.PubTkt: change grace() to return timedelta within grace period
Tero Marttila <terom@paivola.fi>
parents: 354
diff changeset
   243
        elif now < self.graceperiod :
90697e60bf28 pvl.login.PubTkt: change grace() to return timedelta within grace period
Tero Marttila <terom@paivola.fi>
parents: 354
diff changeset
   244
            # still valid
90697e60bf28 pvl.login.PubTkt: change grace() to return timedelta within grace period
Tero Marttila <terom@paivola.fi>
parents: 354
diff changeset
   245
            return None
90697e60bf28 pvl.login.PubTkt: change grace() to return timedelta within grace period
Tero Marttila <terom@paivola.fi>
parents: 354
diff changeset
   246
90697e60bf28 pvl.login.PubTkt: change grace() to return timedelta within grace period
Tero Marttila <terom@paivola.fi>
parents: 354
diff changeset
   247
        elif now < self.validuntil :
90697e60bf28 pvl.login.PubTkt: change grace() to return timedelta within grace period
Tero Marttila <terom@paivola.fi>
parents: 354
diff changeset
   248
            # positive
90697e60bf28 pvl.login.PubTkt: change grace() to return timedelta within grace period
Tero Marttila <terom@paivola.fi>
parents: 354
diff changeset
   249
            return self.validuntil - now
90697e60bf28 pvl.login.PubTkt: change grace() to return timedelta within grace period
Tero Marttila <terom@paivola.fi>
parents: 354
diff changeset
   250
351
147f5e86b139 pvl.login: fix validity logic, implement renew
Tero Marttila <terom@paivola.fi>
parents: 349
diff changeset
   251
        else :
356
90697e60bf28 pvl.login.PubTkt: change grace() to return timedelta within grace period
Tero Marttila <terom@paivola.fi>
parents: 354
diff changeset
   252
            # expired
351
147f5e86b139 pvl.login: fix validity logic, implement renew
Tero Marttila <terom@paivola.fi>
parents: 349
diff changeset
   253
            return False
349
3c20473d0bdc pvl.login: pimp out form with domain, and iconized panel for ticket
Tero Marttila <terom@paivola.fi>
parents: 348
diff changeset
   254
364
b1689d86f5ac pvl.login.PubTkt: remaining() for pre-graceperiod renewal
Tero Marttila <terom@paivola.fi>
parents: 356
diff changeset
   255
    def remaining (self) :
b1689d86f5ac pvl.login.PubTkt: remaining() for pre-graceperiod renewal
Tero Marttila <terom@paivola.fi>
parents: 356
diff changeset
   256
        """
b1689d86f5ac pvl.login.PubTkt: remaining() for pre-graceperiod renewal
Tero Marttila <terom@paivola.fi>
parents: 356
diff changeset
   257
            Return remaining validity before grace.
b1689d86f5ac pvl.login.PubTkt: remaining() for pre-graceperiod renewal
Tero Marttila <terom@paivola.fi>
parents: 356
diff changeset
   258
        """
b1689d86f5ac pvl.login.PubTkt: remaining() for pre-graceperiod renewal
Tero Marttila <terom@paivola.fi>
parents: 356
diff changeset
   259
b1689d86f5ac pvl.login.PubTkt: remaining() for pre-graceperiod renewal
Tero Marttila <terom@paivola.fi>
parents: 356
diff changeset
   260
        now = self.now()
b1689d86f5ac pvl.login.PubTkt: remaining() for pre-graceperiod renewal
Tero Marttila <terom@paivola.fi>
parents: 356
diff changeset
   261
        
b1689d86f5ac pvl.login.PubTkt: remaining() for pre-graceperiod renewal
Tero Marttila <terom@paivola.fi>
parents: 356
diff changeset
   262
        if not self.graceperiod :
b1689d86f5ac pvl.login.PubTkt: remaining() for pre-graceperiod renewal
Tero Marttila <terom@paivola.fi>
parents: 356
diff changeset
   263
            return self.valid()
b1689d86f5ac pvl.login.PubTkt: remaining() for pre-graceperiod renewal
Tero Marttila <terom@paivola.fi>
parents: 356
diff changeset
   264
b1689d86f5ac pvl.login.PubTkt: remaining() for pre-graceperiod renewal
Tero Marttila <terom@paivola.fi>
parents: 356
diff changeset
   265
        elif now < self.graceperiod :
b1689d86f5ac pvl.login.PubTkt: remaining() for pre-graceperiod renewal
Tero Marttila <terom@paivola.fi>
parents: 356
diff changeset
   266
            return self.graceperiod - now
b1689d86f5ac pvl.login.PubTkt: remaining() for pre-graceperiod renewal
Tero Marttila <terom@paivola.fi>
parents: 356
diff changeset
   267
b1689d86f5ac pvl.login.PubTkt: remaining() for pre-graceperiod renewal
Tero Marttila <terom@paivola.fi>
parents: 356
diff changeset
   268
        else :
b1689d86f5ac pvl.login.PubTkt: remaining() for pre-graceperiod renewal
Tero Marttila <terom@paivola.fi>
parents: 356
diff changeset
   269
            # expired
b1689d86f5ac pvl.login.PubTkt: remaining() for pre-graceperiod renewal
Tero Marttila <terom@paivola.fi>
parents: 356
diff changeset
   270
            return False
b1689d86f5ac pvl.login.PubTkt: remaining() for pre-graceperiod renewal
Tero Marttila <terom@paivola.fi>
parents: 356
diff changeset
   271
366
af3833864b89 pvl.login.PubTkt: grace_period() for the fixed length of the grace period
Tero Marttila <terom@paivola.fi>
parents: 364
diff changeset
   272
    def grace_period (self) :
af3833864b89 pvl.login.PubTkt: grace_period() for the fixed length of the grace period
Tero Marttila <terom@paivola.fi>
parents: 364
diff changeset
   273
        """
af3833864b89 pvl.login.PubTkt: grace_period() for the fixed length of the grace period
Tero Marttila <terom@paivola.fi>
parents: 364
diff changeset
   274
            Return the length of the grace period.
af3833864b89 pvl.login.PubTkt: grace_period() for the fixed length of the grace period
Tero Marttila <terom@paivola.fi>
parents: 364
diff changeset
   275
        """
af3833864b89 pvl.login.PubTkt: grace_period() for the fixed length of the grace period
Tero Marttila <terom@paivola.fi>
parents: 364
diff changeset
   276
af3833864b89 pvl.login.PubTkt: grace_period() for the fixed length of the grace period
Tero Marttila <terom@paivola.fi>
parents: 364
diff changeset
   277
        if self.graceperiod :
af3833864b89 pvl.login.PubTkt: grace_period() for the fixed length of the grace period
Tero Marttila <terom@paivola.fi>
parents: 364
diff changeset
   278
            return self.validuntil - self.graceperiod
af3833864b89 pvl.login.PubTkt: grace_period() for the fixed length of the grace period
Tero Marttila <terom@paivola.fi>
parents: 364
diff changeset
   279
        else :
af3833864b89 pvl.login.PubTkt: grace_period() for the fixed length of the grace period
Tero Marttila <terom@paivola.fi>
parents: 364
diff changeset
   280
            return None
af3833864b89 pvl.login.PubTkt: grace_period() for the fixed length of the grace period
Tero Marttila <terom@paivola.fi>
parents: 364
diff changeset
   281
    
354
d46c8d3e3140 pvl.login: ui tweaks, alerts, back support
Tero Marttila <terom@paivola.fi>
parents: 351
diff changeset
   282
    def renew (self, valid, grace=None) :
351
147f5e86b139 pvl.login: fix validity logic, implement renew
Tero Marttila <terom@paivola.fi>
parents: 349
diff changeset
   283
        if not self.valid() :
147f5e86b139 pvl.login: fix validity logic, implement renew
Tero Marttila <terom@paivola.fi>
parents: 349
diff changeset
   284
            raise ExpiredError(self, "Unable to renew expired pubtkt")
147f5e86b139 pvl.login: fix validity logic, implement renew
Tero Marttila <terom@paivola.fi>
parents: 349
diff changeset
   285
354
d46c8d3e3140 pvl.login: ui tweaks, alerts, back support
Tero Marttila <terom@paivola.fi>
parents: 351
diff changeset
   286
        now = self.now()
351
147f5e86b139 pvl.login: fix validity logic, implement renew
Tero Marttila <terom@paivola.fi>
parents: 349
diff changeset
   287
354
d46c8d3e3140 pvl.login: ui tweaks, alerts, back support
Tero Marttila <terom@paivola.fi>
parents: 351
diff changeset
   288
        self.validuntil = now + valid
d46c8d3e3140 pvl.login: ui tweaks, alerts, back support
Tero Marttila <terom@paivola.fi>
parents: 351
diff changeset
   289
        self.graceperiod = now + grace if grace else None
d46c8d3e3140 pvl.login: ui tweaks, alerts, back support
Tero Marttila <terom@paivola.fi>
parents: 351
diff changeset
   290
d46c8d3e3140 pvl.login: ui tweaks, alerts, back support
Tero Marttila <terom@paivola.fi>
parents: 351
diff changeset
   291