Skip to content
This repository was archived by the owner on Jun 1, 2023. It is now read-only.

Commit 802634a

Browse files
authored
Merge pull request #26 from IdentityPython/iat_exp
Iat exp
2 parents bbfc9a8 + 120bebb commit 802634a

File tree

6 files changed

+102
-28
lines changed

6 files changed

+102
-28
lines changed

Makefile

+2-2
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,10 @@ test:
4040
.PHONY: test
4141

4242
isort:
43-
@pipenv run isort --recursive $(OICDIR) $(TESTDIR)
43+
@pipenv run isort $(OICDIR) $(TESTDIR)
4444

4545
check-isort:
46-
@pipenv run isort --recursive --diff --check-only $(OICDIR) $(TESTDIR)
46+
@pipenv run isort --diff --check-only $(OICDIR) $(TESTDIR)
4747
.PHONY: isort check-isort
4848

4949
check-pylama:

src/oidcmsg/__init__.py

+2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
__author__ = 'Roland Hedberg'
22
__version__ = '1.1.3'
33

4+
import os
5+
46
VERIFIED_CLAIM_PREFIX = '__verified'
57

68

src/oidcmsg/oidc/__init__.py

+5
Original file line numberDiff line numberDiff line change
@@ -824,6 +824,11 @@ def verify(self, **kwargs):
824824
else:
825825
if (_iat + _storage_time) < (_now - _skew):
826826
raise IATError('Issued too long ago')
827+
elif _iat > _now + _skew:
828+
raise IATError('Issued sometime in the future')
829+
830+
if _exp < _iat:
831+
raise IATError('Expiration time can not be earlier the issued at')
827832

828833
if 'nonce' in kwargs and 'nonce' in self:
829834
if kwargs['nonce'] != self['nonce']:

src/oidcmsg/storage/abfile.py

+27-24
Original file line numberDiff line numberDiff line change
@@ -87,14 +87,16 @@ def __getitem__(self, item):
8787
:return:
8888
"""
8989
item = self.key_conv.serialize(item)
90-
91-
if self.is_changed(item):
92-
logger.info("File content change in {}".format(item))
93-
fname = os.path.join(self.fdir, item)
94-
self.storage[item] = self._read_info(fname)
95-
96-
logger.debug('Read from "%s"', item)
97-
return self.storage[item]
90+
if self._is_file(item):
91+
if self.is_changed(item):
92+
logger.info("File content change in {}".format(item))
93+
fname = os.path.join(self.fdir, item)
94+
self.storage[item] = self._read_info(fname)
95+
96+
logger.debug('Read from "%s"', item)
97+
return self.storage[item]
98+
else:
99+
raise KeyError(item)
98100

99101
def __setitem__(self, key, value):
100102
"""
@@ -163,31 +165,32 @@ def get_mtime(fname):
163165

164166
return mtime
165167

168+
def _is_file(self, item):
169+
fname = os.path.join(self.fdir, item)
170+
return os.path.isfile(fname)
171+
166172
def is_changed(self, item):
167173
"""
168-
Find out if this item has been modified since last
174+
Find out if this item has been modified since last.
175+
When I get here I know that item points to an existing file.
169176
170177
:param item: A key
171178
:return: True/False
172179
"""
173180
fname = os.path.join(self.fdir, item)
174-
if os.path.isfile(fname):
175-
mtime = self.get_mtime(fname)
181+
mtime = self.get_mtime(fname)
176182

177-
try:
178-
_ftime = self.fmtime[item]
179-
except KeyError: # Never been seen before
180-
self.fmtime[item] = mtime
181-
return True
182-
183-
if mtime > _ftime: # has changed
184-
self.fmtime[item] = mtime
185-
return True
186-
else:
187-
return False
183+
try:
184+
_ftime = self.fmtime[item]
185+
except KeyError: # Never been seen before
186+
self.fmtime[item] = mtime
187+
return True
188+
189+
if mtime > _ftime: # has changed
190+
self.fmtime[item] = mtime
191+
return True
188192
else:
189-
logger.error('Could not access {}'.format(fname))
190-
raise KeyError(item)
193+
return False
191194

192195
def _read_info(self, fname):
193196
if os.path.isfile(fname):

tests/test_06_oidc.py

+64
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@
3535
from oidcmsg.oidc import CHashError
3636
from oidcmsg.oidc import Claims
3737
from oidcmsg.oidc import DiscoveryRequest
38+
from oidcmsg.oidc import EXPError
39+
from oidcmsg.oidc import IATError
3840
from oidcmsg.oidc import IdToken
3941
from oidcmsg.oidc import Link
4042
from oidcmsg.oidc import OpenIDSchema
@@ -929,6 +931,68 @@ def test_id_token():
929931
idt.verify()
930932

931933

934+
def test_id_token_expired():
935+
_now = time_util.utc_time_sans_frac()
936+
937+
idt = IdToken(**{
938+
"sub": "553df2bcf909104751cfd8b2",
939+
"aud": [
940+
"5542958437706128204e0000",
941+
"554295ce3770612820620000"
942+
],
943+
"auth_time": 1441364872,
944+
"azp": "554295ce3770612820620000",
945+
"at_hash": "L4Ign7TCAD_EppRbHAuCyw",
946+
"iat": _now - 200,
947+
"exp": _now - 100,
948+
"iss": "https://sso.qa.7pass.ctf.prosiebensat1.com"
949+
})
950+
951+
with pytest.raises(EXPError):
952+
idt.verify()
953+
954+
955+
def test_id_token_iat_in_the_future():
956+
_now = time_util.utc_time_sans_frac()
957+
958+
idt = IdToken(**{
959+
"sub": "553df2bcf909104751cfd8b2",
960+
"aud": [
961+
"5542958437706128204e0000",
962+
"554295ce3770612820620000"
963+
],
964+
"auth_time": 1441364872,
965+
"azp": "554295ce3770612820620000",
966+
"at_hash": "L4Ign7TCAD_EppRbHAuCyw",
967+
"iat": _now + 600,
968+
"exp": _now + 1200,
969+
"iss": "https://sso.qa.7pass.ctf.prosiebensat1.com"
970+
})
971+
972+
with pytest.raises(IATError):
973+
idt.verify()
974+
975+
976+
def test_id_token_exp_before_iat():
977+
_now = time_util.utc_time_sans_frac()
978+
979+
idt = IdToken(**{
980+
"sub": "553df2bcf909104751cfd8b2",
981+
"aud": [
982+
"5542958437706128204e0000",
983+
"554295ce3770612820620000"
984+
],
985+
"auth_time": 1441364872,
986+
"azp": "554295ce3770612820620000",
987+
"at_hash": "L4Ign7TCAD_EppRbHAuCyw",
988+
"iat": _now + 50,
989+
"exp": _now,
990+
"iss": "https://sso.qa.7pass.ctf.prosiebensat1.com"
991+
})
992+
993+
with pytest.raises(IATError):
994+
idt.verify(skew=100)
995+
932996
class TestAccessTokenRequest(object):
933997
def test_example(self):
934998
_txt = 'grant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA' \

tox.ini

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ envlist = py{36,37,38},docs,quality
44
[testenv]
55
passenv = CI TRAVIS TRAVIS_*
66
commands =
7-
py.test --cov-report= --cov=oicmsg tests/ -m "not network" {posargs}
7+
py.test --cov-report= --cov=oidcmsg tests/ -m "not network" {posargs}
88
codecov
99
extras = testing
1010
deps =
@@ -20,7 +20,7 @@ commands = sphinx-build -b html doc/ doc/_build/html -W
2020
ignore_errors = True
2121
extras = quality
2222
commands =
23-
isort --recursive --diff --check-only src/ tests/
23+
isort --diff --check-only src/ tests/
2424
pylama src/ tests/
2525

2626
[pep8]

0 commit comments

Comments
 (0)