Justin Richer
620a60ddc2
[maven-release-plugin] prepare release mitreid-connect-0.9.0
12 years ago
Justin Richer
54f1ae972b
Added properties and updated poms for sync to central
12 years ago
Justin Richer
f101dcc512
moved to released version of SECOAUTH
12 years ago
Amanda Anganes
72e2c7cb6c
Updated build references
12 years ago
Justin Richer
4538d8fb14
made signing and verification service construction safe for public-only keys
12 years ago
Justin Richer
6cc50e7cd5
switched signing & validation service to use JWK natively for keys
12 years ago
Justin Richer
5a04198eac
moved to JPSK based key store
12 years ago
Justin Richer
e2ad4d2e8f
cleaned up spurious nosuchalgorithm exceptions, addresses #285
12 years ago
Justin Richer
5f7c46aecd
updated to nimbus 2.13
12 years ago
Amanda Anganes
fcc95f8a0a
Moved nonce processing stuff into nonce service and out of ConnectAuthorizationRequestManager
12 years ago
Justin Richer
08eaaa0a12
updated repository to use proper concrete class
12 years ago
Justin Richer
8fccbf3483
added Id field to DefaultUserInfo object, switched "userId" terminology to "subject"
12 years ago
Justin Richer
b8d2adcf31
added fixme note to hardcoded JWS algorithm, cleaned up x509 view
12 years ago
Justin Richer
f44c704472
major refactor of client filter
...
Collapsed filter into single class
pulled server config and client config management into service classes
created service for issuer (will handle account chooser)
created auth request services (handle signed and unsigned requests)
12 years ago
Justin Richer
6320fce9fd
url -> uri in approval page
12 years ago
Justin Richer
ad3a22e5d4
changed client defaults for JOSE bits
12 years ago
Justin Richer
87c8672948
nullsafe check for refresh
12 years ago
Justin Richer
217916603f
cleaned out broken unit tests -- now we can start fresh
12 years ago
Justin Richer
70b2342864
fixed split client views, fixed typos in various places
12 years ago
Justin Richer
51a7ccc397
entity -> embed
12 years ago
Justin Richer
0d25d4cb17
null-preserving static parsers instead of constructors
12 years ago
Justin Richer
26f03ec070
timestamp for creation date
12 years ago
Justin Richer
fc978ac994
made require_auth_time nullable again
12 years ago
Justin Richer
bbde2d3b90
todo
12 years ago
Justin Richer
db24c203ec
added parser to client registration endpoint
12 years ago
Justin Richer
5c044b9eff
added extra client fields to DB model, moved services to use new client model object
12 years ago
Justin Richer
3f8d7d70e5
updated client model to match OAuth Dyn Reg and OIDC Reg
12 years ago
Justin Richer
5b9422ffdf
cleaned up old unit tests
12 years ago
Justin Richer
d7c857b09f
switched jwk view to use nimubs
12 years ago
Justin Richer
6c1e6b2d74
refactored signing and validation, added jwk-based cache, removed keyfetcher, refactored client side class structure
12 years ago
Justin Richer
385853fa1f
refactored signing and validation, added jwk-based cache, removed keyfetcher, refactored client side class structure
12 years ago
Justin Richer
0712d8c340
updated spring version
12 years ago
Amanda Anganes
60b679e942
First steps towards adding display variables to config bean
12 years ago
Justin Richer
a184b79b06
store tokens with .serialize() not .toString()
12 years ago
Justin Richer
970e3f2f79
not entities after all
12 years ago
Justin Richer
3d9ec51eb3
converted client filters to nimbus-jose
12 years ago
Justin Richer
8d8010d90f
missed a little bit there
12 years ago
Justin Richer
87fc92f97d
extra constructors for algorithm wrappers
12 years ago
Justin Richer
e5732da857
added system default signing algorithm, converted token provider and enhancer to use nimbus-jose
12 years ago
Justin Richer
10ab55a7e2
moved jwk/x509 publishing over to nimbus-jose (mostly)
12 years ago
Justin Richer
fca30cd13f
added provisions to bootstrap signing and validation service from config files
12 years ago
Justin Richer
520f55f960
reinstated signing and validation service
12 years ago
Justin Richer
46a3e70377
removed idtoken class, removed all jwe/jwt tests
12 years ago
Justin Richer
d00b351f32
moved token classes to use Nimbus-JOSE
12 years ago
Justin Richer
1f50945831
added wrapper classes for JWE/JWS algorithms, switched client entity model to use and store them.
12 years ago
Justin Richer
6dc9020a31
deleted local JOSE implementation classes
12 years ago
Justin Richer
d0fdf8140e
sorting on approval page
12 years ago
Justin Richer
eb4773ce46
beginning dynamic scopes on auth page
12 years ago
Justin Richer
c2b9fd4db1
system scope ordering consistency
12 years ago
Justin Richer
cab36a2b80
added appropriate filterered and transformative actions to scope service
12 years ago
Justin Richer
ab35186696
added scope service, repository, and API
12 years ago
Justin Richer
19e7b62a42
removed persistence.xml and moved to pure spring-based config, addresses #194
12 years ago
Justin Richer
a3619240e6
added site scope
12 years ago
Justin Richer
f0ee36dad2
auth_type -> auth_method (addresses #258 )
12 years ago
Justin Richer
e4284353e8
added azp, addresses #247
12 years ago
Justin Richer
da43ba4d55
audience field is now plural
12 years ago
Justin Richer
27a26e0a35
(user_id/prn) -> sub
12 years ago
Justin Richer
0ab4ad4bbe
added "birthdate", addresses #253
12 years ago
Justin Richer
a6806255b8
use sign-magnatude not twos-complement in key parsing
12 years ago
Justin Richer
e8095bab26
principal and audience are different (I thought I fixed this??)
12 years ago
Justin Richer
c946a84b09
adapted keyfetcher to be more general
12 years ago
Amanda Anganes
a4637ec395
Fleshed out nonce service classes, added code to token service impl to check for and store nonces. Added JodaTime library for working with dates.
12 years ago
Amanda Anganes
c7ae315e98
Added initial files for nonce service. Repository and service impls are stubs
12 years ago
Justin Richer
18ddd8333f
added flag to allow introspection, relaxed same-client restrictions on introspection and chained tokens
12 years ago
Justin Richer
51b67ebc03
added queries to get access token from id token
12 years ago
Justin Richer
b49c6571e8
fixed empty constructor of id token, fixed bug in copy constructor of claimset
12 years ago
Justin Richer
6344a72519
missed a few applicationName references, fixed API JSON rendering
12 years ago
Justin Richer
33ceedb283
added scope and grant_type, switched to timeunit
12 years ago
Justin Richer
e2bc15c2b2
beginning of client registration refactor to track IETF dynreg spec
12 years ago
Justin Richer
0659432561
removed builder
12 years ago
Justin Richer
7586c6d661
added "NONE" type auth
12 years ago
Justin Richer
4bd289c18c
shadowed null id token from serializer
12 years ago
Justin Richer
f072aba3f5
moved client details service, fixed authorities mapper
12 years ago
Justin Richer
7342da6a51
completed making id tokens into access tokens
12 years ago
Justin Richer
b8f701d9d8
switched id tokens to entities, they're now access tokens also
...
still needs some work to get the auth object right, for now we're just copying from the access token
12 years ago
Justin Richer
4698552c2d
made email_verified nullable, addresses #237
12 years ago
Justin Richer
413c477879
utility method for approved sites to check expiration
12 years ago
Justin Richer
45ca4e565e
updated to SECOAUTH-1.0.1-BUILD-SNAPSHOT
12 years ago
Amanda Anganes
f50726ab31
Issue 209 - typo
12 years ago
Justin Richer
9c08944a02
Changed arity on approved sites (now can have many per user/site combo)
12 years ago
Justin Richer
e9d1ed270d
service layer cleanups
12 years ago
Justin Richer
757e21a722
added blacklist API
12 years ago
Amanda Anganes
2a0602863e
Conveted Booleans to booleans
12 years ago
Amanda Anganes
51073a7f8d
Refactor part 3
12 years ago
Amanda Anganes
dd2abd94d1
Refactoring part 2
12 years ago
Amanda Anganes
c40efda6b5
Refactor part 1
12 years ago
Justin Richer
920b2a59ba
Fixed error logging
12 years ago
Justin Richer
2d24435365
Created custom resolver, handler mapper
...
moved endpoint back to server
12 years ago
Justin Richer
be1046f9b6
bean-based configuration
12 years ago
Justin Richer
7eb0a6f3d2
Moved JWK to commons
12 years ago
Justin Richer
42389286e4
removed non-RSA algorithms from JWE encrypter/decrypter functions
12 years ago
Justin Richer
558a6286e2
switched to Guava for parsing ints into bytes, addresses #154
12 years ago
Justin Richer
2b62042696
unshadowed Jwe header, unshadowed IdTokenClaims, added smart copy constructor to ClaimSet
12 years ago
Justin Richer
11b35267b4
Refactored stats processor into a service, made home page into a smart page.
12 years ago
Justin Richer
d041ddb0e1
Added approvedSite API and support structure
12 years ago
Justin Richer
8ae1b376fe
updated whitelist service and repository
12 years ago
Justin Richer
140de779fd
converted userid type to enum
12 years ago
Justin Richer
1c34f83297
Fixed JWS algorithm parsing
12 years ago
Justin Richer
29ac1a3a70
reverse lookup for clientdetails utiltiy classes
12 years ago
Justin Richer
21ff134383
JWS coment/format cleanup
12 years ago
Justin Richer
b5ce8d5e8b
added getByUsername to userinfo repositories and supporting classes, updated calling classes to use this
...
fixed namedquery
12 years ago
Justin Richer
ba24ca1f60
removed unused utility method
12 years ago
Amanda Anganes
ba5572b28a
Tidied up a bit, added javadoc comments to new classes
12 years ago
Amanda Anganes
c23b176567
Database backed authorization-code-service now works.
12 years ago
Amanda Anganes
4b76cc514b
Added a database-backed authorization-code system. Untested; needs to be injected into configuration in the place of the in-memory one and tested
12 years ago
Amanda Anganes
dc61068702
Split approved site and whitelisted site scope tables.
12 years ago
Justin Richer
a02f37cec3
added generators to client service API
12 years ago
Justin Richer
26d5a846e0
Updated validator structure and id token checking.
12 years ago
Justin Richer
012bb4afd7
Changed casing on "URI" to "Url" to match other parameters.
12 years ago
Justin Richer
d14f55004c
added parser to userinfo object, userinfo url in filter, fixed bug in user_id check
12 years ago
Justin Richer
fbd6e67af8
Refactored auth provider to call the userinfo endpoint and provide info inside the auth token.
12 years ago
Mike Derryberry
1efe7a1fc3
updated check of algorithm in signing method"
12 years ago
Justin Richer
155974d8e3
moved services and api over to using new client Id field (instead of client_id)
12 years ago
Justin Richer
eb5a24690f
added method to get client by its (new) Long id
12 years ago
Justin Richer
47ff885032
removed unnecessary cached token values
12 years ago
Justin Richer
74a40fc973
changed auth holder reference, moved dates to timestamps
12 years ago
Justin Richer
bb7d6b2e94
split scopes table
12 years ago
Justin Richer
ed99bd36cf
changed clientdetails entity to use @Enumerated, cleaned up .sql file foreign keys
12 years ago
Justin Richer
2d8a5763a3
javafied auth holder class
12 years ago
Amanda Anganes
97d7bc9c13
added field to indicate whether the client has been dynamically registered
12 years ago
Amanda Anganes
f724d3a9fe
updated userinfo table definitions
12 years ago
Amanda Anganes
617e9568d8
Fixed bugs; I can get tokens now. User approval handler seems to be working corrrectly.
12 years ago
Amanda Anganes
49cb8bd0cb
fixing bugs; needed to make all ids BIGINT AUTO-INCREMENT PRIMARY KEY in sql files
12 years ago
Amanda Anganes
0757642e67
removed "s" from allowed_scopes
12 years ago
Amanda Anganes
9c32e92da5
Cleaned up sql tables some more; sticking to _ naming convention
12 years ago
Amanda Anganes
d7deda1699
Propogated AuthenticationHolder effects; this is untested but compiles and I think it is mostly correct
12 years ago
Amanda Anganes
90df91c351
Added AuthenticationHolder object, got references squared away for AccessToken side. Compiles.
12 years ago
Amanda Anganes
cf348590b0
Removed unused ClientGeneratorFactory
12 years ago
Amanda Anganes
d6d80c3e60
Gave OAuth2RefreshTokenEntity a Long Id
12 years ago
Amanda Anganes
6b1dad7215
Gave OAuth2AccessTokenEntity a Long Id
12 years ago
Amanda Anganes
780839dbf9
Made things compile after ClientDetailsEntity refactoring
12 years ago
Amanda Anganes
a68a4f9796
Organized ClientDetailsEntity, updated JPA annotations. Updated sql files to match. Naming conventions: table and column names with multiple words should be seperated by underscores; table and column names should be singular.
12 years ago
Amanda Anganes
15428a875e
Added additional fields to ClientDetailsEntity and did some reorganization, still some more to do. Added "id" field to the sql file, but the sql still needs all of the other additional fields.
12 years ago
Amanda Anganes
8d4e046408
All logging is now org.slf4j. We had a mix of org.slf4j and apache commons-logging. Added error logging to all view which throw errors.
12 years ago
Amanda Anganes
a061e64abf
Merge branch 'user-approval-handler-updated-rebase'
12 years ago
Amanda Anganes
5fb67ab7bb
Did a lot of cleanup; untested but compiles
12 years ago
Amanda Anganes
2f28cf33e7
Changed UserInfo refs in WhitelistedSite to String ids; updated the user approval handler to check if "remember this decision" is checked and only make a new AP if so, and to pull in the scopes selected on the approval page as the saved allowed scopes for that AP.
12 years ago
Amanda Anganes
b87d54b06e
Changed UserInfo references to String "userId" references
12 years ago
Amanda Anganes
845976b8ac
First stages of getting the graylist portion to work. Currently no mechanism for telling the system NOT to remember your decision; that will come later. All approvals will be automatically stored with this code.
12 years ago
Justin Richer
51b8dbe065
Revert "updated jwtHeader typ to use an enum" -- set things back to using a string
...
This reverts commit 3b2268c622
.
12 years ago
Justin Richer
164090e9d5
added jwt string stability to several places, fixed jwe parser
13 years ago
Amanda Anganes
676808bdac
got things to deploy - could not reference UserInfo directly in ApprovedSite and WhitelistedSite; needed to reference DefaultUserInfo instead.
13 years ago
Amanda Anganes
4e10fce7ef
Implementing user approval handler; made some modifications to ApprovedSite and WhitelistedSite models, repositories, and service layers.
13 years ago
Mike Derryberry
3b2268c622
updated jwtHeader typ to use an enum
13 years ago
Mike Derryberry
95dcb10472
updated encrypter/decrypter to store keys as member variables rather than to pass them in
13 years ago
Mike Derryberry
61c7231d9a
updated encrypter and decrypter to use enum class rather than fragile parsing
13 years ago
Mike Derryberry
5f80ebc89a
changing encryption/decryption code to use enum classes rather than shady parsing techniques
13 years ago
Justin Richer
789f41bdbe
fixed client details regression
13 years ago
Justin Richer
3e6f66e2dc
Merge branch 'master' of https://github.com/ssayer/OpenID-Connect-Java-Spring-Server into ssayer-pullreq-124
13 years ago
Justin Richer
d07667576e
cleaned up old code
13 years ago
Justin Richer
40f39a18e0
cleaning up introspection endpoint
13 years ago
Justin Richer
f9dd9df7cd
added skip to test for encryption if not running unlimited strength java
13 years ago
Justin Richer
92e779257d
testing key sizes, still failing outside of bouncycastle
13 years ago
Samuel Sayer
1dd2aaf8a1
add JsonObject export for JWK keys
13 years ago
Justin Richer
319568d971
refactored JWA algorithm markers to use enum instead of string as stored class
13 years ago
Justin Richer
165f3ea292
fixed some unit tests, broke others
13 years ago
Mike Derryberry
e4bc66ba33
small TODO statements cleared up
13 years ago
Mike Derryberry
4deaffd686
updated hmac and rsa signer to use afterPropertiesSet(), abstract oidc auth filter now adds multiple signers to map and then picks the one it needs, and key fetcher now gets jwk
13 years ago
Justin Richer
8b848af0fb
cleaned up signer initialization calls and algorithm-setting code, cleaned up algorithm names, renamed encrypter/decrypter classes
13 years ago
Mike Derryberry
d204ff1e69
removed constructor for RsaDecrypter and RsaEncrypter
13 years ago
Mike Derryberry
4f78c3db80
removed verification of signature in decryption
13 years ago
Mike Derryberry
1dbf2808c1
changed imports
13 years ago
Mike Derryberry
e380d85ad7
updated encryption/decryption to dynamically get mode for cipher. also made the keyDataLen come from the kdf parameter rather than enc
13 years ago
Mike Derryberry
5d3d888c3f
finished testing. fixed MessageDigest problems in generating cek and cik
13 years ago
Mike Derryberry
13e0a7c4bb
tests for encryption/decryption done
13 years ago
Mike Derryberry
88a052019a
added testing for encryption and decryption. slight bug where [ ] gets appended to clearText. working on that
13 years ago
Mike Derryberry
5152fa1c69
added tests for encryption and decryption. WIP
13 years ago
Mike Derryberry
26792d2fba
updated decryption to generate cik and cek based off of key derivation
13 years ago
Mike Derryberry
d86ee2329b
updated encryption to generate cek and cik through key derivation. also fixed signers to use afterPropertiesSet()
13 years ago
Mike Derryberry
7e7cd4f480
update to encryption/decryption. added cmk, cek, and cik use
13 years ago
Mike Derryberry
bc1ff0d964
updated jwe, jwt, and jwk models to have new parameters that were released in latest JOSE update
13 years ago
Mike Derryberry
70e90bc4c1
updated decryption
13 years ago
Mike Derryberry
025f7f3d66
updated encryption to sign using int value rather than alg
13 years ago
Justin Richer
cd222ad66e
got rid of ghost dependency in pom.xml for common
13 years ago
Mike Derryberry
754e8406bb
removed web app from this git repository
13 years ago
Mike Derryberry
99a574d303
encryption completed, decryption WIP
13 years ago
Mike Derryberry
cee44de3d1
updated encryption class to include AbstractJwtEncrypter
13 years ago
Mike Derryberry
caf2a7b494
updated encryption service to encrypt key and claims and then sign the jwe. decryption updated to decrypt encrypted key and ciphertext
13 years ago
Mike Derryberry
cf0ce7b1fb
updated encryption and decryption for claims. WIP
13 years ago
Mike Derryberry
e252951612
added encrypter/decrypter for claims to get ciphertext
13 years ago
Mike Derryberry
33cc3fa899
Added spring simple web app for testing, encryption and decryption classes for rsa and hmac, still WIP
13 years ago
Amanda Anganes
01793ec57f
added preferred_username claim to userinfo endpoint
13 years ago
Amanda Anganes
50241e4da1
changed UserInfo.verified to UserInfo.emailVerified.
13 years ago
Justin Richer
f0c949fd09
added scope-based filter for userinfo
13 years ago
Justin Richer
c24a2206e9
updated jwtheader parser
13 years ago
Justin Richer
ac7a53b234
bugfix: call setNonce instead of setType
13 years ago
Justin Richer
a03129f70a
added documentation updates
13 years ago
Justin Richer
c619e736f9
removed eclipse files from repository
13 years ago
Justin Richer
de1597b214
refresh token handling fixed, removed token factory references
13 years ago
Amanda Anganes
4e3c99abe4
Merge branch 'validityIntegers'
13 years ago
Amanda Anganes
81d1af40bd
Updated our ClientDetailsEntity *TokenTimeout fields to be *ValiditySeconds, which are now typed as proper Integers in the SECOAUTH ClientDetails interface
13 years ago
Justin Richer
1127a7cfbc
refactored JWKs, updated signing servier to use them
13 years ago
Justin Richer
adb8499bee
merged derryberry code, plus tweaks, still WIP
13 years ago
Mike Derryberry
b1fc07bcb8
updated -common code to get a validation service from a server configuration
13 years ago
Amanda Anganes
2930719700
Added architecture diagram
13 years ago
Mike Derryberry
b94fbd7439
updated -common and -client code by removing throws exception, changing to rest templates, and updating test cases to use annotations
13 years ago
Justin Richer
fe3bbfb3d5
Further cleanups. Still missing:
...
- All tests extend TestCase, should use annotations instead
- Several elements throw Exception
- Key Fetchers should use RESTTemplates and be in a separate utility set
13 years ago
Justin Richer
b86abdd761
merge from pull request, plus cleanup
13 years ago
Justin Richer
731ad2e2e2
updated SECOAUTH reference, fixed some SQL files, temporarily closed token timeout issue
13 years ago
Justin Richer
ace5dd1f1e
imported userinfouserdetails filter from MITRE codebase
13 years ago
Mike Derryberry
65dc3daaf8
smart client
13 years ago
Amanda Anganes
2a05ff995d
Added support for additional field in ClientDetailsEntity.java.
13 years ago
Mike Derryberry
3e810cb5dc
Merge remote-tracking branch 'mitre/master'
13 years ago
Mike Derryberry
fad6caa968
Added testing for signers for Hmac, Rsa, and Plaintext
13 years ago
Justin Richer
e44697cef9
updated JWK display to latest, closes #58
13 years ago
Justin Richer
5c72d8b95f
revocation endpoint cleanup, still needs views
13 years ago
Justin Richer
27219c066d
refactored our service to reflect upstream
13 years ago
Mike Derryberry
ee28d56031
initial implementation of x509 and JWK key retrieval
13 years ago
nemonik
8917e75010
see issue #19
13 years ago
Michael Joseph Walsh
6f43040587
slight sequence diagrams tweaks, mods to account-chooser and openid-connect-client
13 years ago
Michael Jett
3402a3e463
ClientAPI now fully supports RESTful DELETE
13 years ago
Michael Jett
af6e043239
Client Entity now initialized with non-null values so JPA won't flip. Added unified method for saving. Sync'd class member names to allow proper binding.
13 years ago
Michael Jett
0c7ea88323
Client updates.
13 years ago
Stephen Moore
49e96778b8
Missed a file
13 years ago
Stephen Moore
fd91c884bb
Made interfaces... deleted a thing.
13 years ago
Justin Richer
ffe31e6049
merged config from bean config config bean bean
13 years ago
Justin Richer
e158ef6fc2
added config bean
13 years ago
Amanda Anganes
e33f277bbe
Updated classes to track newest version of SECOAUTH. This update closes issues #3 , #4 , #8 , and #36 (infinite redirects). This revision changes the authorization and token endpoints to be /openidconnect/auth and /openidconnect/token, respectively.
13 years ago
Stephen Moore
2cf12d4078
Made getAll use ? extends UserInfo
13 years ago
Justin Richer
97dffb6414
added copyright to all java files. closes #11
13 years ago
Justin Richer
6724866099
moved jwt components, utilities, and various interfaces to -common from -server
13 years ago
Justin Richer
59ecb03548
added getter/setter for userinforepository, closes #40
13 years ago
nemonik
6eb8284695
version needed to be modified to 0.1-SNAPSHOT in order to deploy snapshot to nexus
13 years ago
Amanda Anganes
269a354f8c
Added tables.sql, which is just a concatenation of all the other sql files. Added redirect_uris.sql, which is a NEW table needed to support clients registering multiple redirect uris.
...
This updates us to the HEAD revision of SECOAUTH, where the redirect uri field on ClientDetails has been updated to be a Set<String> instead of a single string. I updated the UI code so that it will still work, but it will need to be updated to allow users to register multiple uris.
This also closes issue #2 from the issue tracker.
13 years ago
Stephen Moore
1a1ae4c5b5
Removed Replacer plugin
13 years ago
Amanda Anganes
8b10b83516
Added setNonce to JwtClaims.
13 years ago
U-MITRE\mjwalsh
b4836a0302
mods to auth filter including config comments, http socket time out...
13 years ago
Justin Richer
c51bb72fe5
merged keystore changes
13 years ago
nemonik
3f2631367f
added comments on configuration of client
13 years ago
Justin Richer
664dd1df46
JWT claims can now have nulls in them without barfing
13 years ago
Justin Richer
c59d3fe963
it spits out JWTs! and id tokens! JWT still needs to handle nulls
13 years ago
Amanda Anganes
ebe72412fe
Authorization Grant flow works up to serializing the returned Access Token. Justin is investigating serialization problems.
13 years ago
Justin Richer
b463cabc69
fixed configuration, moved sql file
13 years ago
Justin Richer
2f29cc52b2
Merge branch 'client_refactor'
13 years ago
Justin Richer
baf7c1c166
fixed dependencies and project configurations
13 years ago
Justin Richer
e6e7504213
added files and shuffled things to new packages
13 years ago