Compare commits

..
2028 Commits
Author SHA1 Message Date
Stian Thorgersen 25322e3a7c Bump version 2015-06-18 12:29:03 +02:00
Stian Thorgersen ba6a67910b Merge pull request #1400 from stianst/1.3.x
1.3.x
2015-06-17 19:30:39 +02:00
Stian Thorgersen b435ed2a7a KEYCLOAK-1476 2015-06-17 19:28:58 +02:00
Stian Thorgersen 36d52c4436 KEYCLOAK-1476 NotSerializableException: org.keycloak.models.cache.entities.CachedClientRole 2015-06-17 19:25:41 +02:00
Stian Thorgersen de84c73468 Merge pull request #1399 from mstruk/KEYCLOAK-1476
KEYCLOAK-1476 NotSerializableException: org.keycloak.models.cache.ent…
2015-06-17 19:25:15 +02:00
Marko Strukelj 12e1c3435e KEYCLOAK-1476 NotSerializableException: org.keycloak.models.cache.entities.CachedClientRole 2015-06-17 17:55:58 +02:00
Stian Thorgersen 6ede13ae34 Merge pull request #1398 from stianst/1.3.x
KEYCLOAK-1479
2015-06-17 12:54:10 +01:00
Stian Thorgersen aceb32997b KEYCLOAK-1479 2015-06-17 13:52:31 +02:00
Marek Posolda 9c4df5a34a Merge pull request #1396 from mposolda/1.3.x
Reduce liquibase logging during test to debug
2015-06-17 12:14:29 +02:00
mposolda 629a20c82f Reduce liquibase logging during test to debug 2015-06-17 12:13:00 +02:00
Stian Thorgersen 51d02352a1 Merge pull request #1395 from mstruk/examples-docs
KEYCLOAK-1442 Fix examples/demo-template/README.md
2015-06-17 06:28:52 +01:00
Marko Strukelj 9254e04e9c KEYCLOAK-1442 Fix examples/demo-template/README.md
- fixed all examples READMEs
2015-06-17 01:02:53 +02:00
Stian Thorgersen cc1056fd2d Merge pull request #1394 from stianst/1.3.x
1.3.x
2015-06-16 14:58:12 +01:00
Stian Thorgersen 0b79337afc Fix demo-dist build prob 2015-06-16 15:57:14 +02:00
Stian Thorgersen 3b5bdae426 Make it possible to specify ldif file for LDAPEmbeddedServer 2015-06-16 15:57:14 +02:00
Stian Thorgersen 77b4b0ef8e Fix demo-dist build prob 2015-06-16 15:57:14 +02:00
Stian Thorgersen 2021143fce Merge pull request #1393 from mstruk/KEYCLOAK-1448
KEYCLOAK-1448 Cannot configure an authenticator for method KEYCLOAK
2015-06-16 14:21:24 +01:00
Marko Strukelj 2b25a1aaa2 KEYCLOAK-1448 Cannot configure an authenticator for method KEYCLOAK 2015-06-16 15:15:04 +02:00
Stian Thorgersen 3c83b791d9 Merge pull request #1391 from stianst/1.3.x
Add missing ExampleDS
2015-06-16 13:40:51 +01:00
Stian Thorgersen 44a1225de3 Add missing ExampleDS 2015-06-16 14:40:04 +02:00
Stian Thorgersen 5c2e27c87d Merge pull request #1387 from stianst/1.3.x
Fixes
2015-06-16 13:03:07 +01:00
Stian Thorgersen 5ecc62be95 KEYCLOAK-1446
Field ... of subresource ... will not be injected according to spec
2015-06-16 14:02:03 +02:00
Stian Thorgersen ff3853dfee Updated clustering docs 2015-06-16 13:32:13 +02:00
Stian Thorgersen 571a190b45 KEYCLOAK-1468
Infinispan cache not available in JNDI
2015-06-16 13:32:13 +02:00
Stian Thorgersen 23fab43db0 Recover server-overlay name 2015-06-16 13:32:13 +02:00
Bill Burke f8ac2501f7 remove auth flow setup 2015-06-16 06:12:15 -04:00
Bill Burke 6116885166 remove auth flow migration 2015-06-16 06:04:21 -04:00
Stian Thorgersen 1a8adaf857 Merge pull request #1385 from stianst/1.3.x
Fix event-store example
2015-06-16 06:21:45 +01:00
Stian Thorgersen e4a6ccf596 Fix event-store example 2015-06-15 20:25:12 +02:00
Stian Thorgersen 97f48ba66c Merge pull request #1381 from stianst/1.3.x
Added wildfly extension to dist
2015-06-15 19:13:44 +01:00
Stian Thorgersen bf667dba65 Added wildfly extension to dist 2015-06-15 20:13:06 +02:00
Stian Thorgersen 90b321726b Merge pull request #1379 from stianst/1.3.x
Fixes
2015-06-15 15:04:05 +01:00
Stian Thorgersen 9e5704a181 Update keycloak-server.json 2015-06-15 15:49:39 +02:00
Stian Thorgersen 41c850999a KEYCLOAK-1449 Demo bundle doesn't include subsystem configuration 2015-06-15 15:01:35 +02:00
Stian Thorgersen e793d8f2e1 Merge pull request #1377 from stianst/1.3.x
Fixes
2015-06-15 14:00:05 +01:00
Stian Thorgersen afa0a3a0b4 Fix CDI examples 2015-06-15 14:21:12 +02:00
Stian Thorgersen 3b2f84ecf5 KEYCLOAK-1447 LinkageError deploying oauth-client-cdi to WildFly 8.2.0.Final 2015-06-15 13:22:21 +02:00
Stian Thorgersen 964106fa42 Update adapter installation docs 2015-06-15 09:04:04 +02:00
Stian Thorgersen 05fca83d5a Renamed eap6 server overlay poms 2015-06-15 09:04:04 +02:00
Stian Thorgersen dac5e51875 Merge pull request #1375 from stianst/1.3.x
Fix testsuite/docker-cluster deps
2015-06-15 06:41:25 +01:00
Stian Thorgersen aa36572b27 Fix testsuite/docker-cluster deps 2015-06-15 07:40:04 +02:00
Stian Thorgersen e2e4cd4d86 Merge pull request #1370 from stianst/1.3.x
KEYCLOAK-1411
2015-06-15 06:32:33 +01:00
Marek Posolda 92b3d5fcc6 Merge pull request #1373 from mposolda/1.3.x
KEYCLOAK-1260 Upgrade h2 version to fix locking issues in SAMLKeyCloa…
2015-06-12 19:55:49 +02:00
mposolda 1f1eef69ff KEYCLOAK-1260 Upgrade h2 version to fix locking issues in SAMLKeyCloakServerBrokerWithSignatureTest 2015-06-12 19:40:56 +02:00
Marek Posolda a9d0a938ba Merge pull request #1372 from mposolda/1.3.x
KEYCLOAK-1298 Fix constraint names to be uppercased
2015-06-12 19:15:42 +02:00
mposolda c0d8df381a KEYCLOAK-1298 Fix constraint names to be uppercased 2015-06-12 18:59:49 +02:00
Marek Posolda 984e474d01 Merge pull request #1371 from mposolda/1.3.x
Fix Oracle together with Sybase
2015-06-12 17:19:07 +02:00
mposolda 33eca6e50c Enable liquibase trace logging with JPA profile 2015-06-12 16:59:04 +02:00
Stian Thorgersen b9d69561dc Update server and adapter install docs 2015-06-12 16:13:51 +02:00
mposolda 8dc3cbd294 Fix Oracle together with Sybase 2015-06-12 16:08:21 +02:00
Stian Thorgersen c93addc3a9 KEYCLOAK-1411
DefaultCacheUserProvider addUser returns UserModel instance which is not cached/managed by the cache
2015-06-12 15:55:40 +02:00
Stian Thorgersen 939527bd98 Bump version 2015-06-12 14:32:06 +02:00
Stian Thorgersen cc2de52a1a Revert to old RestEasy until we can drop support for EAP 6.4 2015-06-12 14:20:08 +02:00
Stian Thorgersen 4ccc37abbb Add EAP6 standalone.xml to source instead of dl eap6 from techpreview repo 2015-06-12 14:20:08 +02:00
Stian Thorgersen 47d1681e90 Merge pull request #1365 from stianst/master
Error page is displayed if user rejects sign in with social provider
2015-06-12 13:03:08 +01:00
Stian Thorgersen c89a412661 KEYCLOAK-1321
Error page is displayed if user rejects sign in with social provider
2015-06-12 13:32:30 +02:00
Stian Thorgersen 5bd53804f9 Fix admin-api to show that users are retrieved by ip, not username 2015-06-12 13:32:30 +02:00
Stian Thorgersen 0d957311b4 Merge pull request #1364 from mstruk/wf9cr2
KEYCLOAK-1441 Upgrade to WildFly 9 CR2
2015-06-12 11:30:42 +01:00
Marko Strukelj c2495acca9 KEYCLOAK-1441 Upgrade to WildFly 9 CR2 2015-06-12 11:49:36 +02:00
Marek Posolda c297b29a13 Merge pull request #1363 from mposolda/master
KEYCLOAK-1403 Update liquibase to newest version. Fix Sybase
2015-06-12 11:26:09 +02:00
mposolda 112ebf77d5 KEYCLOAK-1403 Update liquibase to newest version. Fix Sybase 2015-06-12 11:11:28 +02:00
Stian Thorgersen 5993d40fab Merge pull request #1353 from Smartling/KEYCLOAK-1438
Fix Spring Security adapter logout handling
2015-06-12 07:50:00 +01:00
Stian Thorgersen 2d82d15e5b Merge pull request #1361 from ssilvert/KEYCLOAK-1083-unlock-user-account
KEYCLOAK-1083: Provide a way for admin to unlock user account
2015-06-12 07:44:07 +01:00
Stian Thorgersen 656b157103 Merge pull request #1360 from mstruk/fix-poms
Fixed pom issues that were generating tons of Maven warnings
2015-06-12 07:43:38 +01:00
Marek Posolda 514417ac2d Merge pull request #1362 from mposolda/master
KEYCLOAK-1405 Fix MSSQL Server
2015-06-11 22:37:16 +02:00
mposolda 938cfe2555 KEYCLOAK-1405 Fix MSSQL Server 2015-06-11 22:23:45 +02:00
Stan Silvert d6e64a2c5e KEYCLOAK-1083: Provide a way for admin to unlock user account 2015-06-11 15:32:03 -04:00
Marek Posolda df7cb4a9d0 Merge pull request #1359 from mposolda/master
Database fixes
2015-06-11 17:14:19 +02:00
Marko Strukelj 9a37696d29 Fixed pom issues that were generating tons of Maven warnings 2015-06-11 16:57:33 +02:00
mposolda 20fe7ec7b8 Database fixes 2015-06-11 16:56:38 +02:00
Stian Thorgersen 37cef49565 Merge pull request #1357 from mstruk/eap6
KEYCLOAK-1412 Server-overlay for EAP 6.4
2015-06-11 15:00:20 +01:00
Stian Thorgersen b5ee395aac Merge pull request #1358 from tkyjovsk/master
fixed some UI tests broken by KEYCLOAK-1431
2015-06-11 13:56:23 +01:00
fkiss 7b89b80f71 added ignore on role mappings test 2015-06-11 14:37:12 +02:00
Tomas Kyjovsky 08f2b0dea9 fixed UI tests broken by KEYCLOAK-1431 2015-06-11 14:15:05 +02:00
Marko Strukelj 92e17f4b40 KEYCLOAK-1412 Server-overlay for EAP 6.4
- Added as7-server-subsystem
 - Added eap6-server-overlay
 - Moved modules to eap6-server-modules
 - Renamed wildfly-server-subsystem to wf9-server-subsystem for consistency
2015-06-11 09:40:47 +02:00
Stian Thorgersen b8aedd5a3a Merge pull request #1356 from matzew/ImportFix
Applying suggested import change from mstruk 💄
2015-06-11 08:06:27 +01:00
Matthias Wessendorf d3e178d459 Applying suggested import change from mstruk 💄 2015-06-11 08:52:53 +02:00
Stian Thorgersen 996d8e8cd3 Merge pull request #1355 from stianst/master
KEYCLOAK-1439 Admin Console is not loaded when Keycloak is installed …
2015-06-11 07:38:29 +01:00
Stian Thorgersen 0e1a059d8d KEYCLOAK-1439 Admin Console is not loaded when Keycloak is installed as root context 2015-06-11 08:15:42 +02:00
Tomas Kyjovsky 30359b51fa Merge upstream-master into tkyjovsk-master 2015-06-10 23:27:36 +02:00
Marek Posolda d8880e5ff3 Merge pull request #1354 from mposolda/master
KEYCLOAK-1260 Fix saml backchannel logout with JPA UserSession provid…
2015-06-10 21:37:05 +02:00
Stian Thorgersen 6819b8e3a5 Merge pull request #1352 from girirajsharma/master
[KEYCLOAK-1431] Update page titles
2015-06-10 18:28:25 +01:00
mposolda 03b521926a KEYCLOAK-1260 Fix saml backchannel logout with JPA UserSession provider on MySQL + PostgreSQL 2015-06-10 18:59:07 +02:00
Scott Rossillo abfec23404 Fix Spring Security adapter logout handling
Stops KeycloakLogoutHandler from throwing an exception if the
authentication is not of type KeycloakAuthenticationToken.

Fixes KEYCLOAK-1438.
2015-06-10 12:22:18 -04:00
girirajsharma 92efe8441e [KEYCLOAK-1431] Update page titles 2015-06-10 20:23:39 +05:30
fkiss 15f8e83d4a added initial tests and page for assigning user role mappings 2015-06-10 15:02:25 +02:00
Bill Burke 0095968a73 Merge pull request #1344 from velias/KEYCLOAK-1373
KEYCLOAK-1373 - Allow to map other informations provided by Social Identity providers into Keycloak user profile attributes
2015-06-10 09:02:03 -04:00
Stian Thorgersen ad01d64803 Merge pull request #1351 from girirajsharma/master
[KEYCLOAK-1425] Remove address options on registration screen
2015-06-10 13:32:18 +01:00
girirajsharma 30405804bc [KEYCLOAK-1425] Remove address options on registration screen 2015-06-10 17:42:22 +05:30
Stian Thorgersen 6093d00fdd Merge pull request #1350 from girirajsharma/master
[KEYCLOAK-1424] Login button on login screen should be on the left
2015-06-10 12:14:06 +01:00
girirajsharma 1ba5ea411b [KEYCLOAK-1424] Login button on login screen should be on the left 2015-06-10 16:14:19 +05:30
Tomas Kyjovsky 9dd7a947e9 Merge upstream-master into tkyjovsk-master 2015-06-10 10:40:32 +02:00
Stian Thorgersen c51e6a916c Merge pull request #1346 from mstruk/srv-overlay
Re-enabled server-overlay, and demo-dist for Wildfly 9
2015-06-10 07:30:49 +01:00
Marek Posolda e9b9da6d20 Merge pull request #1349 from mposolda/master
KEYCLOAK-1416 federation provider/mapper model fixes
2015-06-09 23:39:49 +02:00
mposolda 557edbec6d KEYCLOAK-1416 federation provider/mapper model fixes 2015-06-09 23:15:43 +02:00
Marek Posolda 93650c442a Merge pull request #1348 from mposolda/master
KEYCLOAK-1088 Audit of user grants during login
2015-06-09 20:55:26 +02:00
mposolda d3e9b29d78 KEYCLOAK-1088 Audit of user grants during login 2015-06-09 20:37:12 +02:00
Marek Posolda 7cf1b002d2 Merge pull request #1347 from mposolda/master
Fix AdminRecoveryTest + minor fixes in messages
2015-06-09 18:06:59 +02:00
mposolda e96ba202e9 Fix AdminRecoveryTest to not break admin tests 2015-06-09 17:44:07 +02:00
mposolda 9a5ca4d367 Minor improve in error messages and tests 2015-06-09 17:43:20 +02:00
Marko Strukelj e6928c6456 KEYCLOAK-1417 Re-enable demo-dist 2015-06-09 16:35:46 +02:00
Marko Strukelj 245edcb5b9 KEYCLOAK-1418 Re-enable server-overlay
- it's based on server-dist for Wildfly 9 in order to reuse server-feature-pack - no dependency on distribution/modules
2015-06-09 16:35:46 +02:00
Marek Posolda e4cb97aa49 Merge pull request #1345 from mposolda/master
KEYCLOAK-1401 Fix oracle and sybase - step 1
2015-06-09 15:51:51 +02:00
mposolda bc93066fe3 KEYCLOAK-1401 Fix oracle and sybase - step 1 2015-06-09 15:35:03 +02:00
Lukas Kubik bf686bd791 Revert "Add new .gitattributes file"
This reverts commit 01e232158b.
2015-06-09 15:19:36 +02:00
Lukas Kubik 01e232158b Add new .gitattributes file 2015-06-09 15:16:34 +02:00
Vlastimil Elias c6e0195a3c KEYCLOAK-1373 - added attribute importer for other social providers,
documented
2015-06-09 13:49:58 +02:00
Stian Thorgersen 966d939c12 Merge pull request #1340 from mstruk/srv-subsystem
Cleanup, and simplify keycloak-server-subsystem
2015-06-09 07:05:07 +01:00
Stian Thorgersen c61c05be51 Merge pull request #1335 from ssilvert/keycloak-config
KEYCLOAK-1404: Need recovery mechanism for master admin user
2015-06-09 07:02:47 +01:00
Stian Thorgersen 7b099e3d6b Merge pull request #1341 from mstruk/KEYCLOAK-1370
KEYCLOAK-1370 Empty module de.idyl.winzipaes in keycloak-server-dist
2015-06-09 06:45:39 +01:00
Marek Posolda 6d257a0d4c Merge pull request #1343 from mposolda/master
KEYCLOAK-1358 docs for LDAP mappers
2015-06-08 21:11:27 +02:00
mposolda b80a4a0aa9 KEYCLOAK-1358 docs for LDAP mappers 2015-06-08 21:10:38 +02:00
Marek Posolda aabb3428a8 Merge pull request #1342 from mposolda/master
JSON migration, LDAP logging reduced to trace/debug
2015-06-08 20:24:45 +02:00
mposolda 80ff7b92db KEYCLOAK-886 Reduce some LDAP info logging to trace and debug 2015-06-08 19:23:32 +02:00
mposolda 7badd3d5e5 JSON migration 2015-06-08 19:23:32 +02:00
Stan Silvert e977a363ef Require user to specify a temporary admin password to do admin recovery. 2015-06-08 13:04:52 -04:00
Bill Burke 91283878ac html encoding fix 2015-06-08 12:38:16 -04:00
Vlastimil Elias 74ace4006c Added base abstract implementation of Attribute mapper for Social
providers, used for GitHub provider
2015-06-08 17:04:53 +02:00
Marko Strukelj 7be957f4f9 KEYCLOAK-1370 Empty module de.idyl.winzipaes in keycloak-server-dist 2015-06-08 15:59:51 +02:00
Marko Strukelj 3643e76a06 Cleanup, and simplify keycloak-server-subsystem
- KEYCLOAK-1346 Remove support for overlays in server subsystem
 - KEYCLOAK-1347 Remove support for multiple auth-servers
 - KEYCLOAK-1348 Simplify server subsystem definition
2015-06-08 15:33:34 +02:00
Marek Posolda 07bc756785 Merge pull request #1339 from mposolda/master
DB migration
2015-06-08 13:17:15 +02:00
mposolda 0af68d28f1 KEYCLOAK-1357 LDAP migration 2015-06-08 12:29:24 +02:00
mposolda 75e1f50faf KEYCLOAK-1390 mongo migration for identity providers 2015-06-08 12:29:18 +02:00
Marek Posolda b578122f19 Merge pull request #1337 from mposolda/ldap
KEYCLOAK-1067 Upgrade embedmongo plugin version. Speed-up mongo tests…
2015-06-05 18:53:36 +02:00
mposolda e014dcce76 KEYCLOAK-1067 Upgrade embedmongo plugin version. Speed-up mongo testsuite 2015-06-05 18:51:27 +02:00
Marek Posolda a1bdf2837e Merge pull request #1336 from mposolda/ldap
Mongo fixes & few other fixes
2015-06-05 18:29:45 +02:00
mposolda 0092d9f74d Mongo fixes & few other fixes 2015-06-05 17:52:56 +02:00
Stan Silvert e48aafd588 Fix spelling error. 2015-06-05 07:46:39 -04:00
Marek Posolda d958d85290 Merge pull request #1334 from mposolda/ldap
KEYCLOAK-1359 more Active Directory fixes
2015-06-05 11:59:08 +02:00
mposolda 5b40031251 KEYCLOAK-1359 more Active Directory fixes 2015-06-05 11:32:29 +02:00
Stian Thorgersen 399a4a0511 Merge pull request #1333 from stianst/master
KEYCLOAK-1407 Label for otp on login is 'Log in'
2015-06-05 08:52:48 +01:00
Stian Thorgersen bebe51c885 KEYCLOAK-1407 Label for otp on login is 'Log in' 2015-06-05 09:37:34 +02:00
Stan Silvert 6812514683 KEYCLOAK-1404: Need recovery mechanism for master admin user 2015-06-04 15:29:44 -04:00
Marek Posolda 62de481329 Merge pull request #1332 from mposolda/ldap
KEYCLOAK-1359 LDAP & Active directory fixes and improvements
2015-06-04 20:47:10 +02:00
mposolda c3eb6df220 KEYCLOAK-1359 LDAP & Active directory fixes and improvements 2015-06-04 20:15:44 +02:00
Stian Thorgersen d875b9885d Merge pull request #1331 from stianst/master
KEYCLOAK-1325 Public/private SPI
2015-06-04 15:26:46 +01:00
Stian Thorgersen 3510e17dd3 Merge pull request #1330 from vramik/master
KEYCLOAK-1398 - Change type of 'REPRESENTATION' from BLOB to TEXT in …
2015-06-04 15:02:12 +01:00
Stian Thorgersen f50570e350 KEYCLOAK-1325
Public/private SPI
2015-06-04 15:59:47 +02:00
vramik a52cdae1f7 KEYCLOAK-1398 - Change type of 'REPRESENTATION' from BLOB to TEXT in jpa-changelog-1.3.0.Beta1.xml 2015-06-04 15:43:55 +02:00
Marek Posolda 826c60ae36 Merge pull request #1324 from velias/KEYCLOAK-1371
KEYCLOAK-1371 - Perform "Update Profile on First Login" only if some of mandatory user profile fields is missing from identity provider
2015-06-04 15:19:59 +02:00
Stian Thorgersen d2c9d1569c Merge pull request #1329 from mstruk/modules-cleanup
Clean up distribution/modules and adapter-feature-packs
2015-06-04 13:56:35 +01:00
Stian Thorgersen 15dca61c59 Merge pull request #1318 from cfsnyder/master
KEYCLOAK-681 multi-part emails
2015-06-04 13:55:52 +01:00
Stian Thorgersen 4224496611 Doc update 2015-06-04 14:41:24 +02:00
Stian Thorgersen 7467fbaa12 Merge pull request #1328 from girirajsharma/master
Minor fix: resolved a scope variable in services.js and a typo.
2015-06-04 11:52:17 +01:00
Marko Strukelj 580e4fb0b2 Clean up distribution/modules and adapter-feature-packs 2015-06-04 11:39:08 +02:00
girirajsharma 90b15a070c Minor fix: resolved a scope variable in services.js and a typo. 2015-06-04 14:35:48 +05:30
Marek Posolda ce7de3b576 Merge pull request #1327 from mposolda/ldap
KEYCLOAK-1359 More LDAP fixes
2015-06-03 20:00:58 +02:00
mposolda 31d0365e85 KEYCLOAK-1359 More LDAP fixes 2015-06-03 19:57:11 +02:00
Stian Thorgersen 084da8a03d Merge pull request #1325 from stianst/master
KEYCLOAK-1386 Direct Grant API always on
2015-06-03 18:29:29 +01:00
Marek Posolda e395ecb749 Merge pull request #1326 from mposolda/ldap
KEYCLOAK-1359 Fix testsuite with OpenLDAP, Other LDAP fixes
2015-06-03 18:45:43 +02:00
mposolda a34cb92fc1 KEYCLOAK-1359 Fix testsuite with OpenLDAP, Other LDAP fixes 2015-06-03 18:44:23 +02:00
Cory Snyder 0ac000adca KEYCLOAK-681 multi-part emails 2015-06-03 10:33:18 -04:00
Stian Thorgersen 1dd0b563b6 KEYCLOAK-1386 Direct Grant API always on 2015-06-03 16:24:15 +02:00
Marek Posolda 26acf6fa83 Merge pull request #1323 from mposolda/ldap
Ldap: testsuite upgrade + per-request federation caching
2015-06-03 15:36:29 +02:00
Vlastimil Elias dcc19a39d7 KEYCLOAK-1371 - Perform "Update Profile on First Login" only if some of
mandatory user profile fields is missing from identity provider
2015-06-03 15:24:25 +02:00
mposolda 496062ef0c KEYCLOAK-1359 LDAP tests update 2015-06-03 14:54:14 +02:00
mposolda b27f18c380 KEYCLOAK-838 per-request cache in UserFederationManager 2015-06-03 12:48:19 +02:00
Marek Posolda 442d65bb5f Merge pull request #1322 from mposolda/master
KEYCLOAK-1368 allow forwarding to error page in bearer-only deploymen…
2015-06-03 12:47:04 +02:00
mposolda 35e4a5e56d KEYCLOAK-1368 allow forwarding to error page in bearer-only deployments. Adding DeploymentBuilder 2015-06-03 12:34:56 +02:00
Stian Thorgersen fb60ca115f Merge pull request #1321 from girirajsharma/master
[KEYCLOAK-1356] Order the roles in a alphabetical way
2015-06-03 11:00:57 +01:00
Stian Thorgersen 3d3871b0e6 Merge pull request #1291 from AOEpeople/KEYCLOAK-1305
KEYCLOAK-1305 Add possibility to change username
2015-06-03 10:51:34 +01:00
Stian Thorgersen 060a59f982 Merge pull request #1317 from velias/KEYCLOAK-1372
KEYCLOAK-1372 - do not perform email verification if email is provided by trusted Identity provider
2015-06-03 10:29:52 +01:00
Vlastimil Elias c6c0abbedf KEYCLOAK-1372 - typo patched 2015-06-03 11:00:02 +02:00
Vlastimil Elias df182c3301 KEYCLOAK-1372 - tests updated to test whole user flow including email
verification step
2015-06-03 10:54:33 +02:00
Marek Posolda 56c858d917 Merge pull request #1297 from AOEpeople/KEYCLOAK-1350
KEYCLOAK-1350 client_session_state should be updated when refreshing a token
2015-06-03 09:15:50 +02:00
Stian Thorgersen 00068c460a Merge pull request #1320 from bradthurber/missing-space-in-example-customer-app-string
minor text edit for an error message on customer example
2015-06-03 07:30:54 +01:00
girirajsharma 5d0b6400df [KEYCLOAK-1356] Order the roles in a alphabetical way 2015-06-03 02:02:20 +05:30
Brad Thurber 413295e15e minor text edit 2015-06-02 15:34:50 -04:00
Vlastimil Elias 1c3d165e5d KEYCLOAK-1372 - tests improved 2015-06-02 15:41:50 +02:00
Petr Mensik 5fe0406ec9 Fixed addDisabledUser test 2015-06-02 15:37:19 +02:00
Sebastian Rose 17affe576f KEYCLOAK-1350 client_session_state should be updated when refreshing a token 2015-06-02 15:01:47 +02:00
Vlastimil Elias b86d091ad1 KEYCLOAK-1372 - do not perform email verification if email is provided
by trusted Identity provider
2015-06-02 14:59:29 +02:00
Stian Thorgersen ea544c639e Merge pull request #1316 from girirajsharma/master
[KEYCLOAK-1367] - Enter doesn't work in user search box
2015-06-02 13:35:03 +01:00
Niko Köbler 492e6cd856 KEYCLOAK-1305 Add possibility to change username 2015-06-02 14:08:19 +02:00
Bill Burke 5680be743c Merge pull request #1298 from AOEpeople/KEYCLOAK-1103
KEYCLOAK-1103 proxy configuration for inject header if user is logged in, but do not enforce login
2015-06-02 08:04:05 -04:00
Bill Burke 1fd22ee672 Merge pull request #1288 from dbarentine/master
[KEYCLOAK-1354] Make destination optional
2015-06-02 07:59:50 -04:00
girirajsharma c3faea0428 [KEYCLOAK-1367] - Enter doesn't work in user search box 2015-06-02 17:25:05 +05:30
Stian Thorgersen 483ac69c47 Merge pull request #1315 from velias/KEYCLOAK-1362
KEYCLOAK-1362 - button CSS classes are defined by theme properties now to be customizable
2015-06-02 10:55:18 +01:00
Stian Thorgersen 805ad9f250 Merge pull request #1314 from mstruk/modules-cleanup
KEYCLOAK-1332 Remove adapter modules from server
2015-06-02 10:54:46 +01:00
Vlastimil Elias 43799fd315 KEYCLOAK-1362 - button CSS classes are defined by theme properties 2015-06-02 10:47:13 +02:00
Marko Strukelj 91ec4cb5c7 KEYCLOAK-1332 Remove adapter modules from server 2015-06-02 10:22:26 +02:00
Stian Thorgersen 634ce85f17 Merge pull request #1313 from stianst/master
Changes to Travis around caching
2015-06-02 09:15:44 +01:00
Stian Thorgersen b6c52e8859 Changes to Travis around caching 2015-06-02 09:59:06 +02:00
Stian Thorgersen d042f6e2c9 Merge pull request #1311 from tkyjovsk/master
Removed keycloak-wildfly-adapter-subsystem dependency from keycloak-jboss-modules.
2015-06-02 08:42:36 +01:00
Stian Thorgersen cfe8c2956f Merge pull request #1309 from velias/KEYCLOAK-1369
KEYCLOAK-1369 GUI order attribute of Social providers is reflected in Account management app
2015-06-02 08:41:58 +01:00
Stian Thorgersen 235a8eab02 Merge pull request #1308 from mstruk/srv-subsystem
KEYCLOAK-1304 WF9 server subsystem
2015-06-02 08:41:37 +01:00
Stian Thorgersen 6baefa7490 Merge pull request #1307 from velias/KEYCLOAK-1361
KEYCLOAK-1361 - ability to add custom fields (user.attributes) on login-update-profile.ftl page
2015-06-02 08:40:54 +01:00
Stian Thorgersen 319b29aa7d Merge pull request #1300 from girirajsharma/master
[KEYCLOAK-1200] From and To filter fields in Event viewer in admin app
2015-06-02 08:32:02 +01:00
Stian Thorgersen 02428e4f0f Merge pull request #1306 from vramik/master
KEYCLOAK-1366 - Change type of 'REPRESENTATION' from VARCHAR to BLOB …
2015-06-02 08:30:19 +01:00
Tomas Kyjovsky 3fe93eebb6 Removed keycloak-wildfly-adapter-subsystem dependency from keycloak-jboss-modules. 2015-06-01 19:18:56 +02:00
Marek Posolda f5c7c14ce0 Merge pull request #1310 from mposolda/ldap2
KEYCLOAK-886 LDAP: Fixes and improvements
2015-06-01 18:12:04 +02:00
mposolda f57ab78916 KEYCLOAK-886 LDAP: Fixes and improvements 2015-06-01 17:38:34 +02:00
Vlastimil Elias 087dab6f3d KEYCLOAK-1369 GUI order attribute of Social providers is reflected in
Account management app
2015-06-01 17:01:57 +02:00
Marko Strukelj 3df504b6b4 KEYCLOAK-1304 WF9 server subsystem
- remove unnecessary dependencies
2015-06-01 16:07:59 +02:00
Vlastimil Elias ea98b26766 KEYCLOAK-1361 - ability to add custom fields (user.attributes) on
login-update-profile.ftl page
2015-06-01 15:44:36 +02:00
Stian Thorgersen 6d6e598ce5 Merge pull request #1304 from lkubik/remove-multiple-mysql-versions
Remove duplicit mysql version declaration
2015-06-01 13:35:39 +01:00
Lukas Kubik 67ad7463f4 Remove duplicit mysql version declaration 2015-06-01 14:08:32 +02:00
vramik df6b481112 KEYCLOAK-1366 - Change type of 'REPRESENTATION' from VARCHAR to BLOB in jpa-changelog-1.3.0.Beta1.xml 2015-06-01 11:43:06 +02:00
Marek Posolda 5301b556f0 Merge pull request #1303 from mposolda/ldap2
Update links in kerberos docs and example README
2015-05-29 21:45:32 +02:00
mposolda 2ff7345b08 Update links in kerberos docs and example README 2015-05-29 21:44:28 +02:00
Stian Thorgersen bafcd3f036 Merge pull request #1302 from stianst/master
KEYCLOAK-1327 Updated for users
2015-05-29 15:59:07 +01:00
Stian Thorgersen 5f787028df KEYCLOAK-1327 Updated for users 2015-05-29 15:29:04 +01:00
Stian Thorgersen e1e65af8ea Merge pull request #1301 from mstruk/wf9
KEYCLOAK-1303 WF9 adapter subsystem
2015-05-29 15:23:28 +01:00
girirajsharma 5bb71d396a [KEYCLOAK-1200] From and To filter fields in Event viewer in admin app 2015-05-29 19:13:56 +05:30
Stian Thorgersen 058f44743c Merge pull request #1299 from stianst/master
Misc
2015-05-29 14:22:47 +01:00
Marko Strukelj 2077a2a3af KEYCLOAK-1303 WF9 adapter subsystem
- not dependent on distribution/modules any more
 - keycloak-adapter-subsystem moved to keycloak-wf9-subsystem
 - still installed as <extension module="org.keycloak.keycloak-adapter-subsystem"/>
2015-05-29 15:17:41 +02:00
Stian Thorgersen 5a3a0ae437 KEYCLOAK-1325 Log warning if internal SPI is used 2015-05-29 13:58:40 +01:00
Sebastian Rose b4204fc806 getOrDefault not in java 7 2015-05-29 14:33:52 +02:00
Sebastian Rose e8c90c1327 fixed typo in doc 2015-05-29 14:33:52 +02:00
Sebastian Rose 136f2c8bb7 documentation fixed 2015-05-29 14:33:52 +02:00
Sebastian Rose 2b5e0e238d constants 2015-05-29 14:33:52 +02:00
Sebastian Rose a6eface8bc configurable header names, documentation 2015-05-29 14:33:52 +02:00
Sebastian Rose 7659b1aa18 KEYCLOAK-1103 - First draft 2015-05-29 14:33:52 +02:00
Stian Thorgersen a953b52eac KEYCLOAK-1327 Updated for client stats 2015-05-29 13:15:35 +01:00
Stian Thorgersen 6f164f0ee9 KEYCLOAK-1327 Updated for clients 2015-05-29 13:15:34 +01:00
Stian Thorgersen f61a9d7a70 Merge pull request #1296 from mstruk/as7
KEYCLOAK-1301 AS7 / EAP6 adapter subsystem
2015-05-29 10:13:59 +01:00
Marko Strukelj 4f270bffd0 Refactor EAP 6 adapter distribution
- not dependent on distribution/modules any more
 - uses the same modules as AS7
 - again use <extension module="org.keycloak.keycloak-adapter-subsystem"/>
2015-05-28 23:56:11 +02:00
Marko Strukelj fa90602aa0 Refactor AS 7 adapter distribution
- not dependent on distribution/modules any more
 - again use <extension module="org.keycloak.keycloak-adapter-subsystem"/>
2015-05-28 23:56:11 +02:00
Marek Posolda eaf5034ec7 Merge pull request #1295 from mposolda/ldap2
Ldap fixes + added authType to UI to allow users specify LDAP auth type
2015-05-28 20:44:31 +02:00
mposolda e83de896c9 LDAP fixes + added authType to UI to allow users specify authType 2015-05-28 19:54:15 +02:00
mposolda bcd607a1ee KEYCLOAK-1360 ModelExceptionMapper logges the exception 2015-05-28 19:54:15 +02:00
Bill Burke e1adceeb85 Merge pull request #1294 from patriot1burke/master
javadoc
2015-05-28 09:31:38 -04:00
Bill Burke 106bdc3c52 javadoc 2015-05-28 09:30:57 -04:00
Stian Thorgersen 5229807020 Merge pull request #1293 from girirajsharma/master
[KEYCLOAK-1276] Update Zocial.css
2015-05-28 15:26:13 +02:00
girirajsharma 1e89467b31 [KEYCLOAK-1276] Update Zocial.css 2015-05-28 18:39:51 +05:30
Stian Thorgersen f65b502a96 Merge pull request #1283 from girirajsharma/master
[KEYCLOAK-1200]- From and To filter fields in Event viewer in admin app
2015-05-28 15:03:22 +02:00
girirajsharma efe8342965 [KEYCLOAK-1200]- From and To filter fields in Event viewer in admin app 2015-05-28 18:05:31 +05:30
Marek Posolda 90cb3acd2f Merge pull request #1292 from mposolda/ldap2
Ldap enhancements + Make admin requests to have RealmModel and ClientModel available
2015-05-28 12:40:11 +02:00
mposolda 98dd87efbc Added ProviderConfigProperty.CLIENT_LIST and refactor role federation mapper to use it 2015-05-28 12:28:26 +02:00
mposolda ce6576ce84 KEYCLOAK-1355 Make admin requests to have RealmModel and ClientModel available in KeycloakContext 2015-05-28 12:28:26 +02:00
mposolda 5d4869f915 KEYCLOAK-1300 Fullname test 2015-05-28 12:28:26 +02:00
Stian Thorgersen 92567a070c Merge pull request #1290 from mstruk/wf8
Reintroduce org.keycloak.keycloak-adapter-subsystem module to WF8
2015-05-28 10:08:30 +02:00
Marko Strukelj 30955c4e2c Reintroduce org.keycloak.keycloak-adapter-subsystem module to WF8
- again use <extension module="org.keycloak.keycloak-adapter-subsystem"/>
2015-05-28 09:49:34 +02:00
Stian Thorgersen f9d51db182 Merge pull request #1282 from behana/master
Add send-verify-email endpoint to admin-rest-api
2015-05-28 09:09:06 +02:00
Dane Barentine 852e799fea [KEYCLOAK-1354] Make destination optional and fix details for SAML login events 2015-05-27 15:36:10 -07:00
behana bbc3e99bb5 KEYCLOAK-1353 Option to pass client_id to resetPasswordMail 2015-05-28 00:10:36 +02:00
behana e8e22ee44c KEYCLOAK-1352 Add send-verify-email to admin-rest-api 2015-05-28 00:05:39 +02:00
Bill Burke 7a211beede Merge pull request #1287 from patriot1burke/master
unfinished working auth spi
2015-05-27 14:38:05 -04:00
Bill Burke 24279b138b Merge remote-tracking branch 'upstream/master' 2015-05-27 14:28:57 -04:00
Bill Burke a2718a889d unfinished working auth spi 2015-05-27 14:28:47 -04:00
Bill Burke 756de9f7f6 Merge pull request #1286 from patriot1burke/master
auth spi initialization
2015-05-27 11:27:10 -04:00
Bill Burke 143d176dcd Merge remote-tracking branch 'upstream/master' 2015-05-27 10:39:59 -04:00
Bill Burke a1f7cfaf3a auth spi initialization 2015-05-27 10:39:46 -04:00
Stian Thorgersen a549b3ac70 Merge pull request #1284 from pmensik/integration-arquillian
Prepare UI testing for PR
2015-05-27 10:25:01 +02:00
Marek Posolda 43c9179204 Merge pull request #1285 from mposolda/ldap
KEYCLOAK-886 User Federation Mappers - admin console
2015-05-26 18:28:43 +02:00
mposolda dfe232cf80 KEYCLOAK-886 User Federation Mappers - admin console 2015-05-26 17:48:52 +02:00
Petr Mensik ba88cdce70 Prepare UI testing for PR 2015-05-26 15:57:01 +02:00
Stian Thorgersen 269f9fe860 Merge pull request #1274 from mstruk/wf8
Wildfly 8.2.0.Final compatibility
2015-05-26 09:24:56 +02:00
Stian Thorgersen 4a670ab236 Merge pull request #1276 from mstruk/fix-demos
Fix HttpClient issues in example demos on AS7 / Wildfly
2015-05-26 09:02:06 +02:00
Stian Thorgersen ab934f3d35 Merge pull request #1273 from girirajsharma/master
[KEYCLOAK-1334] Forgot password page does not return validation error
2015-05-26 08:56:04 +02:00
Stian Thorgersen 24eca809f1 Merge pull request #1275 from mstruk/pom-repo-fix
Fix build issue with missing org.jboss.as version 7.5.0.Final-redhat-15
2015-05-26 08:55:34 +02:00
Bill Burke 57780b6520 Merge pull request #1279 from patriot1burke/master
auth spi data model
2015-05-22 17:03:45 -04:00
Bill Burke f5e301fe0d merge 2015-05-22 16:15:55 -04:00
Bill Burke 68976f5b0c auth spi datamodel 2015-05-22 16:03:26 -04:00
girirajsharma 8e7e208265 [KEYCLOAK-1334] Forgot password page does not return validation error
message when input field is empty
2015-05-23 01:18:23 +05:30
mposolda 0951c11aa6 Revert mistakenly edited file 2015-05-22 21:31:03 +02:00
Marek Posolda 3d4ca01242 Merge pull request #1277 from mposolda/ldap
Ldap enhancements - step 1
2015-05-22 21:28:07 +02:00
mposolda 319f86e91a KEYCLOAK-886 Admin console - step 1 2015-05-22 21:09:55 +02:00
mposolda 490b3e3603 KEYCLOAK-886 Added builtin federation mappers when creating new LDAP Federation model. Testsuite passing 2015-05-22 21:09:55 +02:00
mposolda 7476ee51e4 KEYCLOAK-886 Model and representations for UserFederationMappers 2015-05-22 21:09:50 +02:00
mposolda a9f1fda68a KEYCLOAK-630 Added Role Federation mapper. Fixes and refactoring 2015-05-22 21:08:33 +02:00
mposolda 975337f225 KEYCLOAK-1300 Added FullNameLDAPFederationMapper 2015-05-22 21:08:21 +02:00
mposolda 1490f106f2 KEYCLOAK-599 Added UserFederationMappers. Added UserAttributeLDAPFederationMapper 2015-05-22 21:07:32 +02:00
mposolda 61c35265a6 KEYCLOAK-826 Show count of created/updated users during federation sync 2015-05-22 21:06:38 +02:00
mposolda 0f4497e53e Remove user from KC after removing from federation 2015-05-22 21:06:38 +02:00
Marko Strukelj ca60c283fc Fix HttpClient issues in example demos on AS7 / Wildfly
- don't use org.keycloak.adapter.HttpClientBuilder - it's Keycloak internals
 - don't use HttpClient 4.2 or 4.3 APIs (not default in AS7, and Wildfly 8)
    so way we can use the same jboss-deployment-structure.xml
2015-05-22 19:16:34 +02:00
Marko Strukelj 37298bdbd6 Fix build issue with missing org.jboss.as version 7.5.0.Final-redhat-15
- activeByDefault profile is turned off when -P is used
2015-05-22 18:10:40 +02:00
Marko Strukelj d70fd86a82 Wildfly 8.2.0.Final compatibility
- added integration/keycloak/wf8-subsystem
 - added distribution/adapters/wf8-adapter containing wf8-modules, and wf8-adapter-zip
 - there's no dependency on distribution/modules
 - subsystem is installed by unzipping keycloak-wf8-adapter-dist.zip to Wildfly 8.2.0.Final, and adding <extension-module>org.keycloak.keycloak-wf8-subsystem</extension-module> to standalone.xml
2015-05-22 17:38:02 +02:00
Stian Thorgersen ad606cbce6 Merge pull request #1272 from stianst/master
Version bump
2015-05-22 09:05:30 +02:00
Stian Thorgersen 4e0a32a37a Version bump 2015-05-22 09:04:30 +02:00
Stian Thorgersen 7290040008 Merge pull request #1270 from mstruk/as7
AS 7.1.1.Final / EAP 6 compatibility
2015-05-22 09:04:06 +02:00
Marko Strukelj 91bf50eb6c AS 7.1.1.Final / EAP 6.4 compatibility 2015-05-21 11:30:26 +02:00
Stian Thorgersen 748ed30b47 Merge pull request #1268 from stianst/master
Fixes
2015-05-20 07:56:54 +02:00
Stian Thorgersen b88d2f792d NotSerializableException: org.keycloak.models.sessions.infinispan.entities.LoginFailureKey 2015-05-20 07:11:17 +02:00
Stian Thorgersen c8b19fa1ae Updated release instructions 2015-05-20 07:10:53 +02:00
Stian Thorgersen c0795ce2c7 Merge pull request #1267 from stianst/master
Updated admin events
2015-05-19 11:40:42 +02:00
Stian Thorgersen 12c3aa83dd Updated admin events 2015-05-19 11:40:17 +02:00
Stian Thorgersen c193ba0c81 Merge pull request #1261 from panga/master
KEYCLOAK-1306 - Better Admin API error handling (new)
2015-05-19 08:56:19 +02:00
Stian Thorgersen d8226c457f Merge pull request #1266 from stianst/master
Dist fixes
2015-05-19 08:30:44 +02:00
Stian Thorgersen a507771f7c Fix demo dist 2015-05-19 08:15:39 +02:00
Stian Thorgersen 2f8d577e95 Fix server-overlay 2015-05-19 08:15:39 +02:00
Stian Thorgersen 362babe5e2 Fixed server-dist 2015-05-19 08:15:39 +02:00
Bill Burke d9297cee16 Merge pull request #1265 from patriot1burke/master
phase 1 auth/required actions SPI
2015-05-18 16:57:15 -04:00
Bill Burke 3851a2fe72 merge 2015-05-18 16:41:51 -04:00
Bill Burke 338300df32 1st phase auth/required action spi 2015-05-18 16:32:38 -04:00
Stian Thorgersen 0c7f63b2f3 Merge branch 'master' of https://github.com/girirajsharma/keycloak into girirajsharma-master
Conflicts:
	services/src/main/java/org/keycloak/services/resources/admin/RealmAdminResource.java
2015-05-18 06:56:12 +02:00
Stian Thorgersen 9a87b7f196 Merge pull request #1263 from panga/fix_response
Fix wrong response code
2015-05-15 09:13:50 +02:00
Leonardo Loch Zanivan abcd830af1 Fix response code 2015-05-13 15:39:51 -03:00
Leonardo Loch Zanivan f807c999b6 Initial messages SPI implementation for Admin REST Services. 2015-05-13 11:13:49 -03:00
girirajsharma ccd5deb85f [KEYCLOAK 392] Audit admin events 2015-05-13 16:47:30 +05:30
Stian Thorgersen dbf9525860 KEYCLOAK-1312 Add clearToken to keycloak.js 2015-05-13 13:13:36 +02:00
Stian Thorgersen 502efe42c9 KEYCLOAK-1288 2015-05-13 11:50:36 +02:00
Stian Thorgersen f0787d98d1 Merge pull request #1259 from stianst/master
Fix welcome-theme in test server
2015-05-13 11:31:19 +02:00
Stian Thorgersen d2ed8302a7 Fix welcome-theme in test server 2015-05-13 11:25:43 +02:00
Stian Thorgersen 15310d1e97 Merge pull request #1257 from stianst/master
KEYCLOAK-1310 Don't log migration model for fresh instal
2015-05-13 11:17:55 +02:00
Stian Thorgersen 38af401a16 KEYCLOAK-1310 Don't log migration model for fresh instal 2015-05-13 11:16:50 +02:00
Stian Thorgersen ab1d39dfb3 Merge pull request #1256 from stianst/master
KEYCLOAK-1277 Fix upgrading from 1.0.x to 1.2.0.Beta1
2015-05-13 10:55:26 +02:00
Stian Thorgersen d35786fe49 KEYCLOAK-1277 Fix upgrading from 1.0.x to 1.2.0.Beta1
Conflicts:
	connections/jpa-liquibase/src/main/resources/META-INF/jpa-changelog-master.xml
2015-05-13 10:54:48 +02:00
Stian Thorgersen b9db84edf3 Merge pull request #1254 from stianst/master
KEYCLOAK-1307 Fix docs for databaseSchema
2015-05-13 08:11:59 +02:00
Stian Thorgersen c3176cac6a KEYCLOAK-1307 Fix docs for databaseSchema 2015-05-13 08:09:29 +02:00
Stian Thorgersen 6c98d64874 Merge pull request #1238 from raehalme/KEYCLOAK-1294
Added support for GrantedAuthoritiesMapper in KeycloakAuthenticationProvider
2015-05-13 06:57:29 +02:00
Stian Thorgersen 269dc26029 Merge pull request #1250 from ssilvert/patch-1
Fix parent pom.
2015-05-12 14:55:20 +02:00
Stian Thorgersen 48d26fc0e9 Merge pull request #1249 from ssilvert/patch-2
Fix parent pom.
2015-05-12 14:55:11 +02:00
Stan Silvert 797bf49ea6 Update pom.xml 2015-05-12 08:39:57 -04:00
Stan Silvert fd96bacf70 Update pom.xml 2015-05-12 08:38:08 -04:00
Stian Thorgersen 7f9739cd4f Merge pull request #1248 from stianst/master
Added isPrivate to Spi
2015-05-12 08:25:56 +02:00
Stian Thorgersen 698660c92a Added isPrivate to Spi 2015-05-12 08:25:24 +02:00
Stian Thorgersen 5aa90243a0 Merge pull request #1247 from Smartling/KEYCLOAK-1299
Add Servlet 2.x support to the Spring Security adapter
2015-05-12 07:26:50 +02:00
Scott Rossillo 4d32ac8765 Add Servlet 2.x support to the Spring Security adapter
Cookie.setHttpOnly() was added in Servlet 3.0. Make setting a
cookie as HttpOnly dependent on servlet version.
2015-05-11 19:48:16 -04:00
Stian Thorgersen 224f85b981 Merge pull request #1246 from stianst/master
Moved adapter feature pack
2015-05-11 16:27:38 +02:00
Stian Thorgersen 29c72c0744 Moved adapter feature pack 2015-05-11 16:27:16 +02:00
Stian Thorgersen 36c162126b Merge pull request #1245 from stianst/master
Removed unused xslt from server-dist
2015-05-11 16:14:01 +02:00
Stian Thorgersen 252dfe006b Removed unused xslt from server-dist 2015-05-11 16:13:44 +02:00
Stian Thorgersen d1743f0608 Merge pull request #1244 from stianst/master
Build server dist with feature pack
2015-05-11 16:09:42 +02:00
Stian Thorgersen 9168cf811c Build server dist with feature pack 2015-05-11 16:09:16 +02:00
Stian Thorgersen 9e50ae6a01 Merge pull request #1243 from girirajsharma/patch-1
Minor issue: Fixed non-resolvable pom error while updating db schema.
2015-05-11 15:10:38 +02:00
Giriraj Sharma 371c798116 Minor issue: Fixed non-resolvabe pom error while updating schema via hibernate. 2015-05-11 18:38:02 +05:30
Stian Thorgersen d00e0021b6 Merge branch 'master' of https://github.com/girirajsharma/keycloak into girirajsharma-master
Conflicts:
	connections/jpa-liquibase/src/main/resources/META-INF/jpa-changelog-master.xml
	services/src/main/java/org/keycloak/services/resources/admin/IdentityProvidersResource.java
2015-05-11 13:36:30 +02:00
Stian Thorgersen bce3e61b7d Merge pull request #1242 from stianst/master
KEYCLOAK-1289 Support environment variables in keycloak.json
2015-05-11 11:03:50 +02:00
Stian Thorgersen ccbd4bace1 KEYCLOAK-1289 Support environment variables in keycloak.json 2015-05-11 10:17:25 +02:00
Thomas Raehalme 78999537f0 Added support for GrantedAuthoritiesMapper in KeycloakAuthenticationProvider. 2015-05-09 13:42:09 +03:00
Bill Burke e3b0cc7093 Merge pull request #1236 from Smartling/KEYCLOAK-1291
Improve Spring Security adapter default configuration
2015-05-08 20:53:36 -04:00
Bill Burke 50014f4398 Merge pull request #1235 from Smartling/KEYCLOAK-1290
Use backchannel logout for Spring Security SSO
2015-05-08 20:53:26 -04:00
Bill Burke 833c276424 Merge pull request #1234 from mstruk/wfly-subs-split-master
Wildfly 9 - subsystem split + feature packs
2015-05-08 20:53:17 -04:00
Bill Burke 770525a385 Merge pull request #1237 from patriot1burke/master
username mapper
2015-05-08 20:53:05 -04:00
Bill Burke e4204a56f5 username mapper 2015-05-08 20:41:31 -04:00
Scott Rossillo d37a9eada3 Improve Spring Security adapter default configuration 2015-05-08 18:24:49 -04:00
Scott Rossillo a7bfae2f56 Use backchannel logout for Spring Security SSO
Use backchannel logout for Keycloak's Spring Security adapter
single sign-out to allow Spring Security's logout complete handler
to fire.
2015-05-08 18:20:17 -04:00
Stian Thorgersen aaebcd074e Merge pull request #1233 from Smartling/KEYCLOAK-1274
Add Spring Security adapter documentation
2015-05-08 07:10:03 +02:00
Stian Thorgersen 58fc4520c9 Merge pull request #1232 from Smartling/KEYCLOAK-1287
Enable Spring Security adapter to register nodes
2015-05-08 07:09:42 +02:00
Stian Thorgersen 53716697ca Merge pull request #1222 from Smartling/KEYCLOAK-1273
Improve Spring Security adapter client to client authorization
2015-05-08 07:01:14 +02:00
Stian Thorgersen 96668daefa Merge pull request #1231 from Smartling/KEYCLOAK-1286
Permit Spring Security adapter to process admin tasks with CSRF enabled
2015-05-08 07:00:15 +02:00
Scott Rossillo 4b033d3d93 Add Spring Security adapter documentation 2015-05-08 00:23:25 -04:00
Scott Rossillo 8ca9a6a64a Enable Spring Security adapter to register nodes
Enable dynamic application node registration and unregistration
from Spring Security protected applications.
2015-05-07 20:09:16 -04:00
Scott Rossillo 2ce3925ba9 Permit Spring Security adapter to process admin tasks with CSRF enabled
Spring Security's CSRF protection blocks Keycloak administrative
actions when configured with the default request matcher.

This provides a CSRF request matcher that permits Keycloak
administrative actions without the CSRF token.
2015-05-07 19:58:27 -04:00
Marek Posolda 3d9adbe991 Merge pull request #1230 from mposolda/master
KEYCLOAK-1284 Allow users to easily inject or configure MongoClient
2015-05-07 20:56:48 +02:00
mposolda f16828e129 KEYCLOAK-1284 Allow users to easily inject or configure MongoClient for MongoConnectionProvider 2015-05-07 20:40:17 +02:00
mposolda 91eb80beb0 Minor improvements 2015-05-07 20:07:30 +02:00
Marko Strukelj 30682968ff Fix invalid module references that should point to keycloak-wildfly-adapter 2015-05-07 17:21:23 +02:00
Bill Burke 620e3b67e9 Merge pull request #1229 from patriot1burke/master
fix nameid policy
2015-05-07 10:53:34 -04:00
Bill Burke afe1ddd719 Merge remote-tracking branch 'upstream/master' 2015-05-07 10:52:55 -04:00
Bill Burke 0aefacc88e fix name id policy 2015-05-07 10:52:12 -04:00
Stian Thorgersen 366c707afa Merge pull request #1227 from stianst/master
KEYCLOAK-1282
2015-05-07 09:39:54 +02:00
Stian Thorgersen 707e29adef KEYCLOAK-1282 2015-05-07 09:39:28 +02:00
Stian Thorgersen 66f2735224 Merge pull request #1225 from stianst/master
KEYCLOAK-1279
2015-05-07 06:46:25 +02:00
Stian Thorgersen 86e19c274f KEYCLOAK-1279 2015-05-07 06:46:12 +02:00
Stian Thorgersen 46bb59e348 Merge pull request #1224 from stianst/master
Fix doc for installing onto EAP
2015-05-07 06:29:53 +02:00
Stian Thorgersen 37cbba57e6 Fix doc for installing onto EAP 2015-05-07 06:27:32 +02:00
Scott Rossillo b05da425b9 Improve Spring Security adapter client to client authorization 2015-05-06 16:54:55 -04:00
Marko Strukelj c28f5cef7a Fix WildFly org.apache.httpcomponents issue 2015-05-06 18:57:40 +02:00
Marko Strukelj f65e804836 WildFly testsuite work 2015-05-06 16:51:49 +02:00
Marko Strukelj 01e9b3bcff Upgrade version on overlooked poms to 1.3.0.Beta1-SNAPSHOT 2015-05-05 21:30:42 +02:00
Marko Strukelj 4e58bed39e Move keycloak modules under integration/keycloak 2015-05-05 20:48:13 +02:00
Marko Strukelj 7d2942e1be KEYCLOAK-1183 Split subsystem into separate server and adapter subsystems
- Rename keycloak-server-subsystem dir to wildfly-server-subsystem
 - Rename keycloak-agent-subsystem dir to keycloak-wildfly-agent-subsystem
 - Rename artifacts accordingly (keycloak- prefix)
 Only maven artifacts are renamed, jboss-modules modules are still called keycloak-server-subsystem, and keycloak-agent-subsystem
2015-05-05 20:43:23 +02:00
Marko Strukelj 943404689e KEYCLOAK-1183 Split subsystem into separate server and adapter subsystems
- Use WildFly 9.0.0.CR1
2015-05-05 20:40:05 +02:00
Marko Strukelj 89875aea02 KEYCLOAK-1183 Split subsystem into separate server and adapter subsystems
- Fix deprecated uses, and more code cleanup
2015-05-05 20:40:05 +02:00
Marko Strukelj 70ce96caa0 KEYCLOAK-1183 Split subsystem into separate server and adapter subsystems
- Fix overlooked file renames causing subsystem tests to fail
2015-05-05 20:40:05 +02:00
Marko Strukelj 625fb02dfe Fix typo preventing adapter-only-dist feature pack to build 2015-05-05 20:40:04 +02:00
Stan Silvert 18966334ab Update README.md 2015-05-05 20:40:04 +02:00
Stan Silvert a8f3756bbc Rename feature pack artifacts. Fix empty content directory. 2015-05-05 20:40:04 +02:00
Stan Silvert f0dab97b80 Add README file. 2015-05-05 20:40:04 +02:00
Stan Silvert 3a7bba041f Create builds based on WildFly 9 feature packs. 2015-05-05 20:40:04 +02:00
Marko Strukelj a50c0e61e4 Fix missing wildfly-undertow version 2015-05-05 20:40:04 +02:00
Marko Strukelj 87cb28eaab KEYCLOAK-1183 Split subsystem into separate server and adapter subsystems
- Fix server-subsystem tests
2015-05-05 20:40:04 +02:00
Marko Strukelj 03fa58a271 KEYCLOAK-1183 Split subsystem into separate server and adapter subsystems
- POM dependencies cleanup
2015-05-05 20:40:03 +02:00
Marko Strukelj 666e610334 Upgrade WildFly to 9.0.0.RC1-SNAPSHOT 2015-05-05 20:40:03 +02:00
Marko Strukelj 3c76a85674 KEYCLOAK-1183 Split subsystem into separate server and adapter subsystems
- More code and pom cleanup
2015-05-05 20:40:03 +02:00
Marko Strukelj c571ad9902 KEYCLOAK-1183 Split subsystem into separate server and adapter subsystems
- Renamed keycloak-subsystem into keycloak-server-subsystem
 - Added keycloak-adapter-subsystem without auth-server support
 - Removed adapter config from keycloak-server subsystem
 - Added proper .xsd for server subsystem
2015-05-05 20:40:03 +02:00
Tomaz Cerar 355c440c3d Update subsystem code to reflect latest standards 2015-05-05 20:38:52 +02:00
Tomaz Cerar 9a17658f84 remove eap6 dup 2015-05-05 20:38:52 +02:00
Bill Burke 69347aa7f6 Merge pull request #1220 from panga/master
KEYCLOAK-1269 and KEYCLOAK-1270
2015-05-05 14:31:48 -04:00
Bill Burke bf259f4c98 Merge pull request #1221 from patriot1burke/master
no backchannel if state
2015-05-05 14:18:52 -04:00
Bill Burke 082ebe8043 no backchannel if state 2015-05-05 13:58:07 -04:00
Leonardo Zanivan a13a02c995 KEYCLOAK-1270 fix 2015-05-05 11:17:27 -03:00
Leonardo Zanivan 3a9ac80786 Merge branch 'master' of github.com:panga/keycloak 2015-05-05 10:30:32 -03:00
Leonardo Zanivan d3cf177ebc Fix user.emailVerified on realm import 2015-05-05 10:29:44 -03:00
Leonardo Zanivan 7b49dbb74e Merge pull request #1 from keycloak/master
Merge
2015-05-05 10:27:59 -03:00
Stian Thorgersen 4cc249bcd4 Merge pull request #1219 from stianst/master
Fixes
2015-05-05 11:56:19 +02:00
Stian Thorgersen 035529d7a2 Version bump 2015-05-05 11:45:21 +02:00
Stian Thorgersen fa91c0ed03 Added missing dependencies to testsuite/docker-cluster£ 2015-05-05 10:40:47 +02:00
Stian Thorgersen adbde56c1a Removed tar.gz dist of docs 2015-05-05 10:28:04 +02:00
Stian Thorgersen a917939441 Don't deploy saml examples to maven 2015-05-05 09:33:48 +02:00
Stian Thorgersen f793e883ef Don't deploy saml examples to maven 2015-05-05 08:46:51 +02:00
Stian Thorgersen d2780c0b2e Fix broker examples poms 2015-05-05 07:55:22 +02:00
Stian Thorgersen 896e309866 Fix version setting 2015-05-05 07:31:07 +02:00
Stian Thorgersen a6dbfc7861 Fix version setting 2015-05-05 07:29:14 +02:00
Stian Thorgersen 070ed88337 Fix version setting 2015-05-05 07:24:40 +02:00
Stian Thorgersen bd52908df4 Fix version setting 2015-05-05 07:22:50 +02:00
Stian Thorgersen 5399c20a8c KEYCLOAK-1259 2015-05-05 07:02:00 +02:00
Stian Thorgersen 4a82ed73a4 KEYCLOAK-1252 2015-05-05 07:00:15 +02:00
Stian Thorgersen f388c3d385 KEYCLOAK-1253 2015-05-05 06:49:54 +02:00
Stian Thorgersen 2de0748e95 KEYCLOAK-1255 2015-05-05 06:48:01 +02:00
Stian Thorgersen 997ede06fb KEYCLOAK-1256 2015-05-05 06:39:58 +02:00
Stian Thorgersen 68be5dd12a KEYCLOAK-1257 2015-05-05 06:33:49 +02:00
Stian Thorgersen ad751e419c Merge pull request #1218 from stianst/master
KEYCLOAK-1263
2015-05-05 06:20:30 +02:00
Stian Thorgersen c862479dcd KEYCLOAK-1263 2015-05-05 06:20:09 +02:00
Stian Thorgersen 5cb11b9036 Merge pull request #1217 from stianst/master
KEYCLOAK-1254
2015-05-05 06:16:12 +02:00
Stian Thorgersen f63d52af04 KEYCLOAK-1254 2015-05-05 06:15:46 +02:00
Stian Thorgersen 3c0959640b Merge pull request #1215 from stianst/master
Fixes to brokering
2015-05-05 06:06:22 +02:00
Marek Posolda dea4f4b931 Merge pull request #1216 from mposolda/master
KEYCLOAK-1265 Fix import realm in admin console on EAP 6.4, Update docke...
2015-05-04 23:34:34 +02:00
mposolda 3d26ab8817 KEYCLOAK-1265 Fix import realm in admin console on EAP 6.4, Update docker-cluster 2015-05-04 23:20:13 +02:00
Stian Thorgersen 3f3b21a75e Fix login with Twitter 2015-05-04 21:23:07 +02:00
Stian Thorgersen b0002d6a09 Fix broker examples 2015-05-04 21:09:01 +02:00
Stian Thorgersen c1708ea7d5 Merge pull request #1214 from stianst/master
Fixes
2015-05-04 20:56:17 +02:00
Stian Thorgersen 937ab313e5 Added distribution changes to migration docs 2015-05-04 20:29:30 +02:00
Stian Thorgersen 523f746745 Added providers classpath for standalone/configuration/providers 2015-05-04 20:13:08 +02:00
Stian Thorgersen f5f5d934c8 Fix saml examples 2015-05-04 19:50:05 +02:00
Stian Thorgersen d67804cd0b Renamed change logs to CR1 2015-05-04 19:35:16 +02:00
Stian Thorgersen dcbdb59e00 Updated instructions to deploy cors to use wildfly 2015-05-04 19:35:16 +02:00
Stian Thorgersen 92db89f9e8 Merge pull request #1213 from stianst/master
Updated instructions on deploying example themes
2015-05-04 15:26:50 +02:00
Stian Thorgersen aafc46657a Updated instructions on deploying example themes 2015-05-04 15:26:33 +02:00
Marek Posolda 667e014971 Merge pull request #1212 from mposolda/master
Workaround to have SAMLKeyCloakServerBrokerWithSignatureTest.testAccountManagementLinkIdentity passing with JPA profile
2015-05-04 14:54:18 +02:00
mposolda ed525f8ed9 Workaround to have SAMLKeyCloakServerBrokerWithSignatureTest.testAccountManagementLinkIdentity passing with JPA profile 2015-05-04 14:42:25 +02:00
mposolda e03140a9f2 Fix redirect after unlink federated identity and logout from account management 2015-05-04 14:42:25 +02:00
Stian Thorgersen 6377cb71f7 Merge pull request #1211 from stianst/master
Updated example themes
2015-05-04 12:49:35 +02:00
Stian Thorgersen a3c40f311c Updated example themes 2015-05-04 12:49:18 +02:00
Stian Thorgersen c736fab75e Merge pull request #1210 from stianst/master
Fixes
2015-05-04 11:55:32 +02:00
Stian Thorgersen df442a6ab8 Fix admin-client example 2015-05-04 11:55:09 +02:00
Stian Thorgersen d355d53262 Don't deploy demo bundle and subsystem war to Maven repo 2015-05-04 11:40:06 +02:00
Stian Thorgersen a7bebadf20 Merge pull request #1209 from stianst/master
Fixes to AS7 adapter
2015-05-04 11:35:57 +02:00
Stian Thorgersen 59d7ff3f0a Fixes to AS7 adapter 2015-05-04 11:35:37 +02:00
Stian Thorgersen 7f02ac84ad Merge pull request #1208 from jean-merelis/translate-pt-br
aligning translation pt-br with master
2015-05-04 07:50:57 +02:00
girirajsharma 70f53c6c06 [KEYCLOAK-392] - Admin audit events 2015-05-03 01:46:52 +05:30
jean b3723cf323 aligning translation pt-br with master 2015-05-01 16:14:21 -03:00
Bill Burke edfe7bd285 Merge pull request #1207 from patriot1burke/master
bump default key sizes
2015-05-01 10:59:20 -04:00
Bill Burke 311fca5a72 exception handling fix 2015-05-01 10:31:03 -04:00
Bill Burke 98d82d2cae stupid 2015-05-01 10:13:57 -04:00
Bill Burke 9372d23ad9 bump default keysize to 2048 2015-05-01 10:11:49 -04:00
Stian Thorgersen de2ce8a04e Merge pull request #1206 from stianst/master
Add Xdoclint option to JavaDoc only if JDK > 1.8
2015-04-30 15:22:19 +02:00
Stian Thorgersen 7eafb14622 Add Xdoclint option to JavaDoc only if JDK > 1.8 2015-04-30 15:05:17 +02:00
Stian Thorgersen fd91d46b5b Merge pull request #1205 from stianst/master
KEYCLOAK-1248 Fix direct grants only switch
2015-04-30 14:41:55 +02:00
Stian Thorgersen 3768c1f1ad KEYCLOAK-1243
Federated Identities table is empty for user synced from classpath properties provider
2015-04-30 14:31:20 +02:00
Stian Thorgersen dcbf91eff0 Fix to social provider buttons 2015-04-30 14:16:25 +02:00
Stian Thorgersen 66242b4176 KEYCLOAK-1244 Save button on user federation redirects to user federation list 2015-04-30 14:00:44 +02:00
Stian Thorgersen 39627f0661 KEYCLOAK-1248 Fix direct grants only switch 2015-04-30 13:44:46 +02:00
Stian Thorgersen 71f2bf77f8 Merge pull request #1204 from stianst/master
Add -Xdoclint:none to make javadoc work on jdk8
2015-04-30 13:31:24 +02:00
Marek Posolda 99c79f9fd7 Merge pull request #1203 from mposolda/master
Minor fix in example
2015-04-30 13:31:10 +02:00
mposolda c942f44437 Minor fix in example 2015-04-30 13:30:05 +02:00
Marek Posolda efaca72631 Merge pull request #1202 from mposolda/master
Docs fix for Application and OAuth client merge. Migration. Docs fix for...
2015-04-30 13:18:09 +02:00
mposolda 6fb98c547a Docs fix for Application and OAuth client merge. Migration. Docs fix for direct access grants 2015-04-30 13:14:38 +02:00
Stian Thorgersen 25bddb8ee7 Add -Xdoclint:none to make javadoc work on jdk8 2015-04-30 13:01:19 +02:00
Stian Thorgersen f1bff01999 Merge pull request #1201 from stianst/master
Misc
2015-04-30 12:52:46 +02:00
Stian Thorgersen 74e5c62069 Updated server installation docs 2015-04-30 12:33:27 +02:00
Marek Posolda e52e13d611 Merge pull request #1200 from mposolda/master
Fix tooltips on FF
2015-04-30 11:33:58 +02:00
mposolda 8f6e7d275e Fix tooltips on FF 2015-04-30 11:32:16 +02:00
Stian Thorgersen ad42b4dde3 Updated demo-dist 2015-04-30 09:40:24 +02:00
Stian Thorgersen 973fa0d4ec Replace Keycloak account theme with PatternFly account theme 2015-04-30 08:24:01 +02:00
Stian Thorgersen 640e6efefd Rename Cache Config tab to Cache 2015-04-30 08:20:27 +02:00
Stian Thorgersen e026c8b206 Fix dark font on login page 2015-04-30 08:16:34 +02:00
Bill Burke 761be66362 Merge pull request #1199 from patriot1burke/master
apache http client fixes
2015-04-29 21:59:50 -04:00
Bill Burke e54bf4a16f hc config and docs 2015-04-29 21:42:32 -04:00
Bill Burke 35c33f132e demo fix and error message fix 2015-04-29 21:16:59 -04:00
Bill Burke 666827b7cb remove resteasy ClientRequest 2015-04-29 20:46:14 -04:00
Bill Burke 10998eb35b Merge pull request #1193 from behana/master
Let admin-client acquire new token if refresh_token is stale
2015-04-29 16:33:20 -04:00
Bill Burke 10d02e7442 Merge pull request #1198 from patriot1burke/master
fix acct theme, broker examples
2015-04-29 15:53:23 -04:00
Bill Burke 8d493381a9 fix account theme 2015-04-29 15:52:15 -04:00
Bill Burke d353add130 Merge remote-tracking branch 'upstream/master' 2015-04-29 14:40:04 -04:00
Bill Burke 77d17001bf broker examples 2015-04-29 14:39:41 -04:00
Stian Thorgersen df317b8368 Merge pull request #1197 from stianst/master
Removed PatternFly themes
2015-04-29 19:51:27 +02:00
Stian Thorgersen ee358ccbc4 Removed PatternFly themes 2015-04-29 19:47:56 +02:00
Stian Thorgersen 4450416905 Merge pull request #1196 from stianst/master
KEYCLOAK-887 Updated admin console theme
2015-04-29 19:34:58 +02:00
Stian Thorgersen 0b821a71e3 KEYCLOAK-887 Updated admin console theme 2015-04-29 19:34:08 +02:00
Bill Burke fd620ef505 Merge pull request #1194 from patriot1burke/master
READ_TOKEN -> read-token
2015-04-29 10:21:48 -04:00
Marek Posolda e05f60b66e Merge pull request #1195 from mposolda/master
When revoke consent from admin console, logout clientSessions similarly ...
2015-04-29 16:21:38 +02:00
Bill Burke 947a2f0c20 READ_TOKEN -> read-token 2015-04-29 09:47:56 -04:00
mposolda 063cefa18c When revoke consent from admin console, logout clientSessions similarly like done in Account mgmt 2015-04-29 15:35:33 +02:00
behana 8dfc7d9e8d Let admin-client acquire new token if refresh_token is stale 2015-04-29 05:01:59 +02:00
Bill Burke d632d22d2a Merge pull request #1188 from shivasaxena/patch-1
corrected URL of XML entity descriptor for the IDP
2015-04-28 21:49:55 -04:00
Bill Burke 4a89fe93b5 Merge pull request #1191 from Smartling/KEYCLOAK-1238
Add Spring Security adapter
2015-04-28 21:49:33 -04:00
Bill Burke 08e1f455e2 Merge pull request #1192 from patriot1burke/master
broker backchannel logout
2015-04-28 19:18:45 -04:00
Bill Burke e65c0d9893 broker backchannel logout console 2015-04-28 19:02:37 -04:00
Bill Burke be656b2dba Merge remote-tracking branch 'upstream/master' 2015-04-28 18:52:42 -04:00
Bill Burke bfcf595346 backchannel broker logout 2015-04-28 18:52:30 -04:00
Scott Rossillo 06a7938aa6 Add Spring Security adapter 2015-04-28 15:05:56 -04:00
Marek Posolda e51cb4df60 Merge pull request #1190 from mposolda/master
KEYCLOAK-1240 Fix stale cache issue
2015-04-28 20:44:26 +02:00
mposolda 553f8a6f27 KEYCLOAK-1240 Fix stale cache issue 2015-04-28 20:20:50 +02:00
Marek Posolda 4d288f1ffc Merge pull request #1189 from mposolda/master
Fix JPA migration of OAuth clients
2015-04-28 18:20:13 +02:00
mposolda 3e5854c651 Fix JPA migration of OAuth clients 2015-04-28 17:44:06 +02:00
Marek Posolda 53fc940952 Merge pull request #1187 from mposolda/master
Fix MySQL
2015-04-28 12:45:33 +02:00
Shiva Saxena c95e21a49a corrected URL of XML entity descriptor for the IDP 2015-04-28 16:09:16 +05:30
mposolda 692898501e Fix MySQL 2015-04-28 12:34:22 +02:00
Marek Posolda 1fbbdb5f4a Merge pull request #1186 from mposolda/master
Fix mongo migration
2015-04-28 11:12:13 +02:00
mposolda d4c69e98ce Fix mongo migration 2015-04-28 11:10:48 +02:00
Marek Posolda 8224f3ba48 Merge pull request #1185 from mposolda/master
KEYCLOAK-1070 and other fixes
2015-04-28 10:16:56 +02:00
mposolda 5e0f560fdc KEYCLOAK-1070 Migration for adding names to builtin clients 2015-04-28 09:35:57 +02:00
mposolda 1d4bf4ddaa UserSessionNote mapper have combobox for claim type in admin console 2015-04-28 07:56:45 +02:00
mposolda 775d1f096c Fix mongo model 2015-04-28 07:56:45 +02:00
mposolda 316053018b KEYCLOAK-1070 Support for view and revoke consents in admin console 2015-04-28 07:56:45 +02:00
mposolda 1d4ef83b81 Show how to retrieve user details in REST endpoint 2015-04-28 07:56:45 +02:00
mposolda 074b6d261a Test how to retrieve underlying error message from the admin-client 2015-04-28 07:56:45 +02:00
Bill Burke bbe2532acb Merge pull request #1184 from patriot1burke/master
model migration
2015-04-27 16:41:54 -04:00
Bill Burke 4166393396 model migration 2015-04-27 16:12:43 -04:00
Stian Thorgersen 9ce452443d Merge pull request #1183 from stianst/master
KEYCLOAK-1189 Add apache httpclient module with slot 4.3
2015-04-27 19:14:44 +02:00
Stian Thorgersen 215a3497ae KEYCLOAK-1189 Add apache httpclient module with slot 4.3 2015-04-27 16:33:48 +02:00
Bill Burke f17863041a Merge pull request #1182 from patriot1burke/master
more broker mappers
2015-04-26 11:20:15 -04:00
Bill Burke 40510683a1 fix tomcat version 2015-04-26 11:10:49 -04:00
Bill Burke 2b1ec74fba docs for broker 2015-04-26 11:04:13 -04:00
Bill Burke 206b44d9c2 Merge remote-tracking branch 'upstream/master' 2015-04-26 10:32:04 -04:00
Bill Burke 44787d83d2 more broker mappers 2015-04-26 10:31:53 -04:00
Bill Burke 23a3aa023c Merge pull request #1181 from patriot1burke/master
filter oidc broker import keys
2015-04-24 19:37:25 -04:00
Bill Burke 9151d2aebd Merge remote-tracking branch 'upstream/master' 2015-04-24 18:37:18 -04:00
Bill Burke 5e1ac684a5 broker logout fixes 2015-04-24 16:32:32 -04:00
Bill Burke 5fca18b3c0 filter oidc broker import keys 2015-04-24 15:03:35 -04:00
Bill Burke 7395d6585c filter oidc broker import keys 2015-04-24 15:03:20 -04:00
Marek Posolda 05d0f1d2ee Merge pull request #1180 from mposolda/master
KEYCLOAK-1216
2015-04-24 19:19:02 +02:00
mposolda a338626d2b KEYCLOAK-1216 Click on 'Logout all sessions' in Account mgmt should propagate logout to the apps 2015-04-24 18:42:18 +02:00
mposolda 767d1fcc20 Don't use JPA eventsStore in mongo tests 2015-04-24 18:42:17 +02:00
Marek Posolda b8d23829aa Merge pull request #1179 from mposolda/master
KEYCLOAK-1070 Improve Applications page and add available roles. Add tes...
2015-04-24 17:15:21 +02:00
mposolda ce747ad039 Change title of Applications page 2015-04-24 16:49:12 +02:00
mposolda 3a4670e8ff KEYCLOAK-1070 Improve Applications page and add available roles. Add tests 2015-04-24 16:40:52 +02:00
Stian Thorgersen 68c3652078 Merge pull request #1178 from stianst/master
More dist updates
2015-04-24 09:24:10 +02:00
Stian Thorgersen 1f49ae8a2f Updated xslts 2015-04-24 09:19:40 +02:00
Stian Thorgersen ac49ba2f44 More tweaks to dist 2015-04-24 07:30:59 +02:00
Stian Thorgersen f0d3fa783a Moved docs into separate dist to reduce size of server-overlay 2015-04-24 07:15:11 +02:00
Bill Burke d007ee3630 Merge pull request #1177 from patriot1burke/master
broker token role
2015-04-23 16:46:22 -04:00
Bill Burke 84fd38316c stupid 2015-04-23 16:34:42 -04:00
Bill Burke 104a9f9842 Merge remote-tracking branch 'upstream/master' 2015-04-23 16:31:09 -04:00
Bill Burke d49e0eda9e broker token role 2015-04-23 15:26:07 -04:00
Marek Posolda 76f406e993 Merge pull request #1176 from mposolda/master
KEYCLOAK-1070 persistent grants - another step
2015-04-23 19:01:37 +02:00
mposolda d1e6b7523e Fix mongo 2015-04-23 18:32:18 +02:00
mposolda 14b3d085a0 KEYCLOAK-1070 Rename 'Access' to 'Applications' 2015-04-23 18:21:21 +02:00
mposolda c942a8ac4f KEYCLOAK-1070 ClientModel.setName/getName 2015-04-23 18:21:21 +02:00
mposolda 535023d800 KEYCLOAK-1070 add setProtocolMappers/getProtocolMappers to ClientSession 2015-04-23 18:20:34 +02:00
Bill Burke dae219d32e Merge pull request #1175 from patriot1burke/master
broker token exchange refactor
2015-04-23 12:08:12 -04:00
Bill Burke a7d245b1fb finish 2015-04-23 11:40:29 -04:00
Bill Burke 1f4df58e6c broker token exchange refactor 2015-04-23 11:26:44 -04:00
Stian Thorgersen d314198e40 Merge pull request #1174 from stianst/master
Build javadoc as part of release process
2015-04-23 16:09:59 +02:00
Stian Thorgersen 35b6c88500 Don't replace welcome-content in server-overlay 2015-04-23 15:53:04 +02:00
Stian Thorgersen f74e1463df Updated docs for server dist changes 2015-04-23 15:53:04 +02:00
Stian Thorgersen 37243d058c Fixes 2015-04-23 15:53:03 +02:00
Stian Thorgersen 927032997e Updated release instructions 2015-04-23 15:53:03 +02:00
Stian Thorgersen e64a2d8de5 Fixes 2015-04-23 15:53:03 +02:00
Stian Thorgersen e697d5ebf5 Merge pull request #1173 from stianst/master
Updates to deps
2015-04-23 13:24:13 +02:00
Stian Thorgersen 9d5cd2091e Updates to deps 2015-04-23 13:23:22 +02:00
Stian Thorgersen 870f29d797 Merge pull request #1172 from stianst/master
Dist work
2015-04-23 12:40:38 +02:00
Stian Thorgersen f037aaa1af Removed project-integrations as it's moved to a separate repo 2015-04-23 11:19:20 +02:00
Stian Thorgersen e17105cc8e Updated distribution and cleaning of maven modules 2015-04-23 11:15:05 +02:00
Stian Thorgersen cf75a97f08 Merge pull request #1169 from gkfirst8/KEYCLOAK-1220
log the right value when keycloak.config.file could not be found or read
2015-04-22 14:08:29 +02:00
Marek Posolda 8e0252ecb1 Merge pull request #1171 from mposolda/master
KEYCLOAK-1070
2015-04-22 12:09:51 +02:00
mposolda 34e033e351 KEYCLOAK-1070 JSON representation and export/import for userConsent 2015-04-22 11:29:43 +02:00
mposolda 11035dbe1b KEYCLOAK-1070 Rename GrantedConsentModel to UserConsentModel. Mongo support for consents. Mongo fixes 2015-04-22 11:29:36 +02:00
gkfirst8 0b782e9910 Fix logging call 2015-04-22 10:54:43 +02:00
Stian Thorgersen 136fd37b1b Merge pull request #1170 from stianst/master
KEYCLOAK-1218 Better security for ServerInfoAdminResource
2015-04-22 09:43:11 +02:00
Stian Thorgersen b5f3efe272 KEYCLOAK-1218 Better security for ServerInfoAdminResource 2015-04-22 08:59:00 +02:00
Marek Posolda 955967f78a Merge pull request #1167 from panga/master
KEYCLOAK-1222 - BasicAuth KeycloakSecurityContext token issue
2015-04-22 08:39:44 +02:00
Leonardo Loch Zanivan 642fc996fb Basic Auth token fix 2015-04-21 16:22:14 -03:00
Leonardo Loch Zanivan 6ce0285315 Basic Auth token fix 2015-04-21 12:32:17 -03:00
gkfirst8 aef61411e9 log the right value when keycloak.config.file could not be found or read
Fix for [KEYCLOAK-1220]
2015-04-21 11:46:33 +02:00
Stian Thorgersen 83a409bbf6 Merge pull request #1165 from stianst/master
KEYCLOAK-1208 Allow same-origin if cors is enabled
2015-04-21 10:57:47 +02:00
Stian Thorgersen 5ed864fbbc KEYCLOAK-1208 Allow same-origin if cors is enabled 2015-04-21 10:42:13 +02:00
Bill Burke 416e71fa97 Merge pull request #1164 from patriot1burke/master
broker mapper tests
2015-04-20 18:35:15 -04:00
Bill Burke f9b099d49d Merge remote-tracking branch 'upstream/master' 2015-04-20 18:20:04 -04:00
Bill Burke 193aa23581 broker mapper tests 2015-04-20 18:04:30 -04:00
Bill Burke 3a4750c6de Merge pull request #1163 from patriot1burke/master
broker user attribute mapper
2015-04-20 15:01:02 -04:00
Bill Burke 63201c10f5 turn off ide test 2015-04-20 14:36:24 -04:00
Bill Burke 65f058a088 Merge remote-tracking branch 'upstream/master' 2015-04-20 14:33:44 -04:00
Bill Burke c95c9fa022 broker user attribute mapper 2015-04-20 14:33:31 -04:00
Bill Burke af736a29f1 Merge pull request #1144 from TFaga/master
[KEYCLOAK-1211] Fixed AD users authenticating without providing a password
2015-04-20 12:31:58 -04:00
Bill Burke 22f26a6221 Merge pull request #1162 from patriot1burke/master
saml broker role mapper
2015-04-20 12:31:31 -04:00
Bill Burke d30b81144e ignore test 2015-04-20 12:00:22 -04:00
Bill Burke e32ef66e2a Merge remote-tracking branch 'upstream/master' 2015-04-20 11:55:01 -04:00
Bill Burke 3ceb818ee5 saml broker role mapper 2015-04-20 11:54:39 -04:00
Stian Thorgersen 6b1e4b2ab3 Merge pull request #1161 from stianst/master
KEYCLOAK-1210 Link to Google Authenticator is broken
2015-04-20 09:59:34 +02:00
Stian Thorgersen 3a4141f5b5 KEYCLOAK-1210 Link to Google Authenticator is broken 2015-04-20 09:44:26 +02:00
Stian Thorgersen 5ea6169214 Merge pull request #1157 from girirajsharma/master
Minor issue: Fixed wildfly ide-configs link parsing.
2015-04-20 07:11:22 +02:00
Bill Burke 46c63d9169 Merge pull request #1160 from patriot1burke/master
oidc broker role mapper
2015-04-17 18:36:57 -04:00
Bill Burke db1d6e79d9 more surefire mem needed 2015-04-17 17:44:10 -04:00
Bill Burke 8eb2f35423 Merge remote-tracking branch 'upstream/master' 2015-04-17 16:41:16 -04:00
Bill Burke a7c563b0eb oidc broker role mapper 2015-04-17 16:41:04 -04:00
Marek Posolda 6a6ddc8a0c Merge pull request #1159 from mposolda/master
Improve kerberos documentation a bit
2015-04-17 18:44:07 +02:00
mposolda 6965364813 Improve kerberos documentation a bit 2015-04-17 18:43:04 +02:00
Marek Posolda 9937be1cdf Merge pull request #1158 from mposolda/master
KEYCLOAK-1070 Persistent grants - step 1
2015-04-17 17:11:53 +02:00
mposolda 78830836b8 KEYCLOAK-1070 Persistent grants - step 1 2015-04-17 14:03:23 +02:00
Stian Thorgersen aea5055b30 Merge branch 'fiorenzino-KEYCLOAK-1215' 2015-04-17 13:06:19 +02:00
Giriraj Sharma a75d608f87 Minor issue: Fixed wildfly ide-configs link parsing. 2015-04-17 16:36:17 +05:30
Stian Thorgersen d52a365766 Add it to admin console language options and fix test 2015-04-17 13:06:07 +02:00
Stian Thorgersen c071601660 Merge branch 'KEYCLOAK-1215' of https://github.com/fiorenzino/keycloak into fiorenzino-KEYCLOAK-1215 2015-04-17 12:58:22 +02:00
Stian Thorgersen fad0e80bcf Merge pull request #1155 from girirajsharma/master
[KEYCLOAK-402] - Force password changes at regular intervals
2015-04-17 12:55:45 +02:00
girirajsharma f959332117 [KEYCLOAK-402] - Force password changes at regular intervals 2015-04-16 23:41:45 +05:30
fiorenzo pizza fb7ca4928d some single quote 2015-04-16 17:17:34 +02:00
fiorenzo pizza f5bc936e0d admin messages 2015-04-16 17:14:37 +02:00
fiorenzo pizza 1ef5bf2abf it translation 2015-04-16 16:27:02 +02:00
Marek Posolda 14b2401aa8 Merge pull request #1154 from fiorenzino/KEYCLOAK-1214
support Novell eDirectory in federation module
2015-04-16 15:24:48 +02:00
Stian Thorgersen 6e5820ea11 Merge pull request #1153 from stianst/master
KEYCLOAK-1061 Add back to application link to error page
2015-04-16 14:41:10 +02:00
Stian Thorgersen 115e533a71 KEYCLOAK-1061 Add back to application link to error page
KEYCLOAK-1148 space in redirect uri gives error
2015-04-16 14:17:32 +02:00
Stian Thorgersen 495ab25301 Merge pull request #1152 from stianst/master
KEYCLOAK-1207 Invalid direct access example
2015-04-16 12:54:46 +02:00
Stian Thorgersen afe4f84135 KEYCLOAK-1207 Invalid direct access example 2015-04-16 12:54:14 +02:00
Stian Thorgersen 7d853dabe4 Merge pull request #1151 from stianst/master
KEYCLOAK-1212 CORS requests blocked on OPTIONS request
2015-04-16 12:50:55 +02:00
fiorenzo pizza e32d7c52fc first commit 2015-04-16 12:47:17 +02:00
Stian Thorgersen 5addabe893 KEYCLOAK-1212 CORS requests blocked on OPTIONS request 2015-04-16 11:27:30 +02:00
Stian Thorgersen 0daa3ee29f Merge pull request #1150 from stianst/master
Update not found and forbidden in admin console
2015-04-16 10:36:24 +02:00
Stian Thorgersen 9c5e38a023 Updated not found and forbidden access to show a proper page instead of just notification 2015-04-16 10:35:52 +02:00
Stian Thorgersen d42c917448 Fix styling on not found page 2015-04-16 09:32:37 +02:00
Stian Thorgersen 8fb60226c8 Merge pull request #1149 from stianst/master
Hide realm caret if only one realm
2015-04-16 09:23:42 +02:00
Stian Thorgersen fda190de01 Hide realm caret if only one realm 2015-04-16 09:23:25 +02:00
Stian Thorgersen 58dd353238 Merge pull request #1148 from stianst/kc-context
KEYCLOAK-1213 Installation file for bearer-only doesn't include auth-ser...
2015-04-16 09:20:22 +02:00
Stian Thorgersen 0027d22964 KEYCLOAK-1213 Installation file for bearer-only doesn't include auth-server-url 2015-04-16 09:19:55 +02:00
Stian Thorgersen 1a05f0f3b4 Merge pull request #1145 from ssilvert/run-kc-as-root-context
Document how to run Keycloak Server as root context.
2015-04-16 09:11:55 +02:00
Bill Burke 476da4e3e0 Merge pull request #1146 from patriot1burke/master
phased broker mapper changes
2015-04-15 11:21:26 -04:00
Bill Burke edb9f0cecf merge conflicts 2015-04-15 11:18:47 -04:00
Bill Burke 0addc4cf58 broker mapper mgmt 2015-04-15 11:10:53 -04:00
Tilen Faganel 770d2d8a4c [KEYCLOAK-1211] Fixed Active Directory users authenticating without providing a password 2015-04-15 16:59:55 +02:00
Stan Silvert f4898884e4 Document how to run Keycloak Server as root context. 2015-04-15 10:36:38 -04:00
Stian Thorgersen 5ef1ddb9f1 Merge pull request #1143 from stianst/kc-context
Added KeycloakContext
2015-04-15 14:02:14 +02:00
Stian Thorgersen f3e5541b7d KEYCLOAK-1109 Added KeycloakContext
KEYCLOAK-1042 Access to Cookies within Events
KEYCLOAK-1209 Enable jboss-logging event listener by default and allow configuring log level
2015-04-15 13:34:54 +02:00
Stian Thorgersen a19a3f4277 Merge pull request #1142 from stianst/master
Improvements to password history policy and tests
2015-04-15 12:57:42 +02:00
Stian Thorgersen 3f327326aa Improvements to password history policy and tests 2015-04-15 12:14:28 +02:00
Stian Thorgersen 29ea24c8fb Merge pull request #1141 from dbarentine/master
[KEYCLOAK-1205] Fix BearerAuthFilter refreshing token
2015-04-15 11:09:26 +02:00
Dane Barentine 4fe328002a [KEYCLOAK-1206] Change role mapping path in admin client to match API changes 2015-04-14 22:21:28 -07:00
Dane Barentine b1b149e0c3 [KEYCLOAK-1205] Fix BearerAuthFilter refreshing token after it's expired 2015-04-14 22:19:07 -07:00
Stian Thorgersen 47da227809 Merge pull request #1132 from girirajsharma/master
[KEYCLOAK-405] - Feature that doesn't allow old password to be reused
2015-04-15 06:53:07 +02:00
Stian Thorgersen 43d33260c9 Merge pull request #1140 from jean-merelis/work
update translation (pt-BR) for version 1.2.0.RC1
2015-04-15 06:52:04 +02:00
girirajsharma ad715371a3 Added password policy test cases for regex and password history. 2015-04-15 02:08:06 +05:30
girirajsharma 0ff4b6dd93 [KEYCLOAK-405]-Fixed deletion of expired Credentials if policy removed. 2015-04-15 02:08:05 +05:30
girirajsharma e3bb61248a [KEYCLOAK-405] - Feature that doesn't allow old password to be reused 2015-04-15 02:08:05 +05:30
jean e75e85cf80 update translation (pt-BR) for version 1.2.0.RC1 2015-04-14 10:25:17 -03:00
Stian Thorgersen 375d061f58 Merge pull request #1139 from stianst/master
Updates to dev docs
2015-04-14 10:39:00 +02:00
Stian Thorgersen 78eb5acb8e Updates to README.md 2015-04-14 10:38:25 +02:00
Stian Thorgersen 656a5c4baa Updated hacking on KC guide 2015-04-14 10:31:07 +02:00
Stian Thorgersen b8d05c452c Merge pull request #1138 from stianst/master
KEYCLOAK-1187
2015-04-14 09:28:26 +02:00
Stian Thorgersen f6631a6163 KEYCLOAK-1187 2015-04-14 09:28:05 +02:00
Stian Thorgersen c0f6b6d8d0 Updated README.md and started HackingOnKeycloak guide 2015-04-14 09:27:51 +02:00
Stian Thorgersen d13acaa9ef Merge pull request #1137 from stianst/master
KEYCLOAK-1187
2015-04-14 09:27:24 +02:00
Stian Thorgersen 8ebac35706 Removed Thread.sleep from tests and replaced with Time.offset 2015-04-14 08:59:22 +02:00
Stian Thorgersen 517e42f13d KEYCLOAK-1187 2015-04-14 08:05:24 +02:00
Stian Thorgersen 9c6e6c8284 KEYCLOAK-1187 2015-04-14 07:49:18 +02:00
Stian Thorgersen a9ed193826 KEYCLOAK-1187 2015-04-14 07:36:30 +02:00
Stian Thorgersen a94fd9a098 APPLICATION_DEFAULT_ROLES and APP_NODE_REGISTRATIONS to CLIENT_... 2015-04-14 07:36:30 +02:00
Stian Thorgersen 411ff56499 RealmEntity.applications --> RealmEntity.clients 2015-04-14 07:36:30 +02:00
Stian Thorgersen c70d12a411 Renamed entity master admin app to master admin client 2015-04-14 07:36:30 +02:00
Bill Burke d4f138cadc Merge pull request #1136 from dbarentine/master
KEYCLOAK-1202 Set AudienceRestriction to the issuer from the original re...
2015-04-13 20:15:49 -04:00
Dane Barentine da70391677 KEYCLOAK-1202 Set AudienceRestriction to the issuer from the original request. 2015-04-13 12:47:40 -07:00
Bill Burke f61fb4ba18 fix conflicts 2015-04-13 09:59:59 -04:00
Bill Burke d2a5403527 refactor for broker mappers 2015-04-13 09:45:23 -04:00
Stian Thorgersen 06ac706057 Merge pull request #1135 from stianst/master
Updated example jsons
2015-04-13 14:23:58 +02:00
Stian Thorgersen 4abd62661f Updated example jsons 2015-04-13 14:23:41 +02:00
Stian Thorgersen f56f1c85b9 Merge pull request #1134 from stianst/master
KEYCLOAK-1187
2015-04-13 14:18:18 +02:00
Stian Thorgersen 46e386cd43 KEYCLOAK-1187 2015-04-13 13:54:30 +02:00
Stian Thorgersen 600353899a KEYCLOAK-1187 2015-04-13 13:32:18 +02:00
Stian Thorgersen 4fbbf39c51 KEYCLOAK-1187 Admin console and endpoints 2015-04-13 13:29:31 +02:00
Stian Thorgersen 9a047eda36 KEYCLOAK-1187 Updated representations 2015-04-13 10:13:32 +02:00
Stian Thorgersen 716bf104db Merge pull request #1133 from stianst/master
More work on KEYCLOAK-1187
2015-04-10 14:46:41 +02:00
Stian Thorgersen f435a8c6df Remove @Test on methods in AdapterTestStrategy. These are not executed from other test classes. Having the @Test on methods in a non-empty constructor causes IntelliJ to complain 2015-04-10 13:35:27 +02:00
Stian Thorgersen a18715a774 Deprecate OAuthClientRepresentation and ApplicationRepresentation and added ClientRepresentation 2015-04-10 13:33:29 +02:00
Stian Thorgersen f0f0aae88d Merge pull request #1131 from stianst/master
KEYCLOAK-1187 DB migration support for oauth/application to client
2015-04-10 09:48:34 +02:00
Stian Thorgersen 4ae9310f83 KEYCLOAK-1187 DB migration support for oauth/application to client 2015-04-10 09:21:34 +02:00
Stian Thorgersen 1567982f0b Merge pull request #1128 from ssilvert/KEYCLOAK-1174-NPE-on-WF9
KEYCLOAK-1174: NPE on WildFly 9
2015-04-10 07:05:46 +02:00
Stan Silvert 875aae91fc Add owner attribute to Keycloak server deployment 2015-04-09 14:52:47 -04:00
Stan Silvert bbef4e2be1 KEYCLOAK-1174: Refactor KeycloakAdapterConfigService to be a simple
singleton
2015-04-09 10:30:39 -04:00
Stian Thorgersen 4955f36115 Merge pull request #1125 from velias/KEYCLOAK-1195
KEYCLOAK-1195 - added identity brokes ordering for login page
2015-04-09 15:44:43 +02:00
Vlastimil Elias 0606cb4a5e KEYCLOAK-1195 - added identity brokes ordering for login page 2015-04-09 14:39:00 +02:00
Stian Thorgersen 85e7cf5783 Merge pull request #1127 from stianst/master
KEYCLOAK-1187 First round
2015-04-09 13:13:01 +02:00
Stian Thorgersen 6fbc0975c0 KEYCLOAK-1187 First round: Combined ApplicationModel and OAuthClientModel into ClientModel. Removed OAuth Clients from Admin console and renamed Applications to Clients. 2015-04-09 12:27:30 +02:00
Marek Posolda b92a178142 Merge pull request #1126 from mposolda/master
KEYCLOAK-1007 Fork Picketlink LDAP code. Remove picketlink dependencies ...
2015-04-08 22:52:57 +02:00
mposolda eb5ae4aae9 KEYCLOAK-1007 Fork Picketlink LDAP code. Remove picketlink dependencies from LDAP Federation provider 2015-04-08 22:04:02 +02:00
Bill Burke dc23ef6188 Merge pull request #1124 from jpkrohling/JPK-Typos
KEYCLOAK-1192 KEYCLOAK-1193 KEYCLOAK-1194 - Fixed typos in tooltip and documentation.
2015-04-08 11:21:43 -04:00
Juraci Paixão Kröhling b0b28a9f38 KEYCLOAK-1192 KEYCLOAK-1193 KEYCLOAK-1194 - Fixed typos in tooltip and documentation. 2015-04-08 14:20:01 +02:00
Stian Thorgersen e6f6f92403 Merge pull request #1121 from velias/KEYCLOAK-1182
KEYCLOAK-1182 - string values for user profile are now sanitized during reading from social providers
2015-04-08 09:49:43 +02:00
Bill Burke 63f8d92a8b Merge pull request #1123 from patriot1burke/master
broker mapper datamodel
2015-04-07 20:44:50 -04:00
Bill Burke a42a750ebb Merge remote-tracking branch 'upstream/master' 2015-04-07 18:04:15 -04:00
Bill Burke 335832d553 broker mapper datamodel 2015-04-07 18:04:03 -04:00
Vlastimil Elias ac1e8e8389 KEYCLOAK-1182 - string values for user profile are now sanitized during
reading from social providers. Related unit tests added.
2015-04-07 14:01:31 +02:00
Marek Posolda 448fb35a72 Merge pull request #1120 from mposolda/master
KEYCLOAK-1181 Running liquibase updates via maven plugin doesn't work
2015-04-07 11:24:08 +02:00
mposolda 2ba2e7768d KEYCLOAK-1181 Running Liquibase updates via maven plugin doesn't work 2015-04-07 10:27:44 +02:00
mposolda d0ead0f0a0 More logging 2015-04-07 08:46:39 +02:00
Bill Burke 463310e1c3 Merge pull request #1113 from girirajsharma/master
[KEYCLOAK-400]Provide a configuration for regex in the password policies
2015-04-03 15:00:57 -04:00
Bill Burke 5ca9af0b1d Merge pull request #1118 from patriot1burke/master
initial Picketlink SAML fork
2015-04-03 14:32:21 -04:00
Bill Burke e795bdc16c Merge remote-tracking branch 'upstream/master' 2015-04-03 14:04:35 -04:00
Bill Burke 37306e689d initial Picketlink SAML fork 2015-04-03 14:04:19 -04:00
girirajsharma ca13e3c4ba [KEYCLOAK-400]Provide a configuration for regex in the password policies 2015-04-02 23:37:25 +05:30
Bill Burke 3a5861c624 Merge pull request #1117 from patriot1burke/master
bump pom version
2015-04-02 09:37:15 -04:00
Bill Burke 326818ea45 bump pom versio 2015-04-02 09:36:43 -04:00
Stian Thorgersen 148b466ce4 Merge pull request #1115 from mposolda/master
Fix clustering when auth-server-url-for-backend-requests is used
2015-04-02 13:13:56 +02:00
Stian Thorgersen 18e4be3cc9 Merge pull request #1116 from stianst/master
Comment out store tokens in admin console, and store/retrieve tokens in ...
2015-04-02 13:13:41 +02:00
Stian Thorgersen 1738429e10 Comment out store tokens in admin console, and store/retrieve tokens in docs 2015-04-02 13:13:17 +02:00
mposolda 6a34ad36f5 Fix clustering when auth-server-url-for-backend-requests is used 2015-04-02 13:02:24 +02:00
mposolda 56a9451128 minor improve in fuse example 2015-04-02 10:43:29 +02:00
Bill Burke 96e188bcae Merge pull request #1114 from patriot1burke/master
disable token exchange ui/example
2015-04-01 15:57:20 -04:00
Bill Burke 952b2fc83d disable token exchange ui/example 2015-04-01 15:56:52 -04:00
mposolda 15dfb6180c Fix fuse example 2015-04-01 18:03:16 +02:00
Bill Burke fc18190c5d Merge pull request #1111 from patriot1burke/master
expire cookie on backchannel
2015-04-01 11:28:00 -04:00
Bill Burke 10ced1e908 Merge remote-tracking branch 'upstream/master' 2015-04-01 10:33:25 -04:00
Bill Burke 1d56805faf unique username for brokered user 2015-04-01 10:32:47 -04:00
mposolda 41bf97ff40 Fix Cors example 2015-04-01 16:28:09 +02:00
mposolda 839ce470c2 Fixing broker examples 2015-04-01 14:41:37 +02:00
Stian Thorgersen 5f0b3ae019 Added instructions on deploying provider examples using jboss-cli 2015-04-01 14:22:17 +02:00
Stian Thorgersen bdbb1b891a KEYCLOAK-1170 User details for customer-portal-js are all null 2015-04-01 13:53:22 +02:00
Stian Thorgersen 48c7bd1b5e KEYCLOAK-1171 Missing parameters: response_type login to oauth-client and oauth-client-cdi 2015-04-01 13:50:50 +02:00
Stian Thorgersen 41828cd865 Prompt query param not added correctly after OIDC refactoring 2015-04-01 13:33:28 +02:00
Marek Posolda ded9a9f98c Merge pull request #1112 from mposolda/master
KEYCLOAK-1169 KEYCLOAK-1151
2015-04-01 11:44:37 +02:00
mposolda 42541d74b5 KEYCLOAK-1151 AuthorizationURL for custom social logins should perserve query parameters 2015-04-01 11:00:02 +02:00
mposolda a5567ead7a KEYCLOAK-1169 Skip DB write at each broker login if 3rd party token is not required 2015-04-01 11:00:02 +02:00
Stian Thorgersen 58068946e4 Formatting for KEYCLOAK-1113 2015-04-01 10:52:15 +02:00
Stian Thorgersen a2c4a1f760 Merge branch 'KEYCLOAK-1113' of https://github.com/velias/keycloak into velias-KEYCLOAK-1113
Conflicts:
	services/src/main/java/org/keycloak/services/resources/LoginActionsService.java
2015-04-01 09:45:13 +02:00
Stian Thorgersen fabb34445f KEYCLOAK-1093
Update docs for subsystem and domain mode
2015-04-01 09:36:06 +02:00
Stian Thorgersen a95d36eeb5 Fix to db changelog 2015-04-01 07:36:58 +02:00
Stian Thorgersen f9d814598e KEYCLOAK-946 Only show endpoints relevant for admin rest api 2015-04-01 07:31:17 +02:00
Stian Thorgersen abf8aea3f6 Merge pull request #1110 from ssilvert/KEYCLOAK-1166-admin-access-example-broken
KEYCLOAK-1166 Admin Access Example Broken
2015-04-01 06:33:00 +02:00
Bill Burke 03bfca5e41 expire cookie on backchannel 2015-03-31 19:33:43 -04:00
Bill Burke ecb6b2f7e9 Merge pull request #1109 from patriot1burke/master
jwks parsing on import
2015-03-31 15:02:07 -04:00
Stan Silvert 89f2f64042 Fix doc for this. 2015-03-31 14:59:58 -04:00
Stan Silvert 6e39c3d2f7 KEYCLOAK-1166 Admin Access Example Broken 2015-03-31 14:53:38 -04:00
Bill Burke e3754c472b Merge remote-tracking branch 'upstream/master' 2015-03-31 14:25:39 -04:00
Bill Burke 2d7e861086 jwks parsing 2015-03-31 14:25:26 -04:00
Stian Thorgersen 799c9da1c1 Merge pull request #1107 from stianst/master
Removed admin audit events - needs a rethink
2015-03-31 18:41:33 +02:00
Marek Posolda 04773f6aaf Merge pull request #1108 from mposolda/master
Migration docs, fixes
2015-03-31 17:43:08 +02:00
mposolda 4c1f2445e3 Bigger 'redirect URI' field in admin console, so it's not partially hidden 2015-03-31 17:10:19 +02:00
mposolda 783f11e6b8 KEYCLOAK-1121 KEYCLOAK-1122 Update migration guide about protocol mappers and identity brokers 2015-03-31 16:50:10 +02:00
mposolda 3256337614 CookieTokenStore not working correctly on EAP 6.3 2015-03-31 14:53:37 +02:00
Stian Thorgersen 969b1bf33c KEYCLOAK-1125 Update provider documentation and example and add instructions on using jboss-cli to create module 2015-03-31 14:42:58 +02:00
Stian Thorgersen fcc2e0a9f0 Removed admin audit events - need to rethink how to implement it 2015-03-31 14:37:54 +02:00
Stian Thorgersen 4a650e5417 Merge pull request #1104 from girirajsharma/master
Removed unused bcmail bouncycastle dependency.
2015-03-31 14:33:02 +02:00
girirajsharma 0077741a74 Removed unused bcmail bouncycastle dependency. 2015-03-31 17:07:28 +05:30
Stian Thorgersen 7d320392f2 KEYCLOAK-1149 app cred field not wide enough 2015-03-31 09:14:56 +02:00
Marek Posolda ade3b4eb75 Merge pull request #1102 from mposolda/master
Added bouncycastle module to EAP6 and AS7 packaging. Kerberos example README fix
2015-03-30 18:05:17 +02:00
mposolda 96b48877b8 Added bouncycastle module to EAP6 and AS7 packaging as it's not here by default 2015-03-30 17:59:49 +02:00
mposolda 13639a1bcc Minor fix in kerberos example 2015-03-30 17:59:49 +02:00
Stian Thorgersen 76309c1dcb Merge pull request #1101 from jean-merelis/work
pt-BR Internationalization support for pr #1097
2015-03-30 16:03:15 +02:00
Stian Thorgersen 99b67dfd6c Merge pull request #1100 from stianst/master
Admin audit events
2015-03-30 15:45:25 +02:00
Stian Thorgersen b777534411 KEYCLOAK-1140 Display redirect uri on identity provider detail page 2015-03-30 15:45:15 +02:00
jean f62f0d4877 pt-BR Internationalization support #1097 2015-03-30 10:17:51 -03:00
Stian Thorgersen 96dad77c66 KEYCLOAK-392 Admin events 2015-03-30 14:38:32 +02:00
girirajsharma 962b623b4a [KEYCLOAK-392] - Admin audit events 2015-03-30 14:06:01 +02:00
Vlastimil Elias 01094663bf KEYCLOAK-1113 - profile update now uses correct form validation also 2015-03-30 12:53:05 +02:00
Vlastimil Elias 31a80a973c KEYCLOAK-1113 - user registration form input boxes and labels are red on
error (css class is configurable in theme, has-error used for
patternfly)
2015-03-30 09:05:48 +02:00
Stian Thorgersen f8b25cad7f Merge pull request #1097 from gerbermichi/i18n
[KEYCLOAK-301] Internationalization support (4rd pr)
2015-03-30 08:25:03 +02:00
Michael Gerber 7b820a4eed i18n for default claims
role description i18n

tests

typo

fix unit test
2015-03-29 11:34:53 +02:00
Bill Burke 2c28223115 Merge pull request #1092 from dbarentine/master
KEYCLOAK-1154, KEYCLOAK-1155 Changes
2015-03-27 12:35:48 -04:00
Bill Burke e464947abe Merge pull request #1096 from patriot1burke/master
broker fixes
2015-03-27 12:35:36 -04:00
Bill Burke 878ce0761d broker fixes 2015-03-27 12:13:48 -04:00
Vlastimil Elias 8727aef647 KEYCLOAK-1113 - LoginFormProvider extended to allow per field errors,
freemarker implementation extended (backward compatible), used for
registration form
2015-03-27 15:41:42 +01:00
Stian Thorgersen 48050de1a6 KEYCLOAK-1128 Add changes to themes to migration guide 2015-03-27 12:07:39 +01:00
Stian Thorgersen ff11a377da Merge pull request #1094 from velias/KEYCLOAK-1141
KEYCLOAK-1141 - name of federated identity provider added back to acount management
2015-03-27 11:32:38 +01:00
Stian Thorgersen 3c1d8d56e5 Merge pull request #1095 from stianst/master
KEYCLOAK-1021 Add tar.gz version to dists
2015-03-27 11:22:28 +01:00
Stian Thorgersen 58db94209a KEYCLOAK-1021 Add tar.gz version to dists 2015-03-27 11:03:46 +01:00
Vlastimil Elias 2c8c741a0b KEYCLOAK-1141 - name of federated identity provider added back to acount
management page
2015-03-27 10:26:03 +01:00
Stian Thorgersen 37e732c64d Merge pull request #1093 from stianst/master
KEYCLOAK-1137 Access to logged in user data (first/last name) on any pag...
2015-03-27 08:52:46 +01:00
Stian Thorgersen be13b88d24 KEYCLOAK-1137 Access to logged in user data (first/last name) on any page in freemarker 2015-03-27 08:08:20 +01:00
Dane Barentine b5d5f340ba KEYCLOAK-1155 Added SSL support for MongoDB connections 2015-03-26 10:53:11 -07:00
Dane Barentine 3b15da2fdd KEYCLOAK-1154 Set Conditions and SubjectConfirmationData NotOnOrAfter values based on realm settings 2015-03-26 10:51:09 -07:00
Bill Burke f6d3e76b67 Merge pull request #1090 from stianst/master
KEYCLOAK-1146 Order of First/Last name form fields is inconsistent
2015-03-26 13:07:26 -04:00
Bill Burke 019766fba1 Merge pull request #1091 from patriot1burke/master
fix query parsing
2015-03-26 13:07:00 -04:00
Bill Burke 9d7db174e1 merged 2015-03-26 13:06:50 -04:00
Bill Burke c20ab4a9a6 fix query parsing 2015-03-26 13:05:09 -04:00
Stian Thorgersen 62fddda24d KEYCLOAK-1146 Order of First/Last name form fields is inconsistent 2015-03-26 16:18:38 +01:00
Stian Thorgersen b82be5ca29 Merge fixes 2015-03-26 14:27:30 +01:00
Stian Thorgersen cd1315e839 Fix file encoding for message bundles 2015-03-26 13:55:13 +01:00
Stian Thorgersen 16cb3c31c0 KEYCLOAK-1123 Add note that db has changed to migration guide 2015-03-26 13:50:36 +01:00
Stian Thorgersen 720ea7bd76 Add option to configure KeycloakServer through ~/.keycloak-server.properties 2015-03-26 13:50:36 +01:00
Stian Thorgersen b727087f04 KEYCLOAK-1150
'iss' should be URL not just realm name
2015-03-26 13:50:36 +01:00
Bill Burke d36ee0d0af Merge pull request #1088 from patriot1burke/master
oidc and saml broker backchannel logout
2015-03-26 08:43:21 -04:00
Stian Thorgersen daae3045ae Merge pull request #1084 from jean-merelis/work
KEYCLOAK-1135 add Realm name in email messages
2015-03-26 13:00:16 +01:00
mposolda 5566ad008f Minor 2015-03-26 11:51:16 +01:00
Marek Posolda f482e16998 Merge pull request #1089 from mposolda/master
JSON migration of protocol mappers, fixing oracle
2015-03-26 11:50:15 +01:00
mposolda 477d8b35e3 KEYCLOAK-1116 KEYCLOAK-1117 JSON migration and removal of ClientModel.claimsMask 2015-03-26 11:49:22 +01:00
mposolda 2599e77491 Fix oracle 2015-03-26 08:10:26 +01:00
Bill Burke bb6cf95948 merge 2015-03-25 19:23:51 -04:00
Bill Burke f64d84b03a Merge remote-tracking branch 'upstream/master' 2015-03-25 19:02:23 -04:00
Bill Burke e0c70e1c47 oidc broker backchannel logout 2015-03-25 19:02:07 -04:00
Bill Burke 13268c52c6 saml backchannel logout 2015-03-25 16:51:25 -04:00
Stian Thorgersen 14683882e8 KEYCLOAK-1138 Appliance distribution from master failes with ClassNotFoundException 2015-03-25 10:11:56 +01:00
Bill Burke 82dd3cf8a4 Merge pull request #1087 from patriot1burke/master
broker backchannel logout
2015-03-24 16:58:22 -04:00
Marek Posolda 88a90111bb Merge pull request #1086 from mposolda/master
KEYCLOAK-1004 Jpa migration for 1.2.0.Beta1
2015-03-24 21:48:51 +01:00
Bill Burke eb85e6d7c4 Merge remote-tracking branch 'upstream/master' 2015-03-24 16:05:07 -04:00
Bill Burke 71de12b446 broker backchannel logout 2015-03-24 16:03:46 -04:00
mposolda cc784ecb46 KEYCLOAK-1004 Jpa migration for 1.2.0.Beta1 2015-03-24 18:44:20 +01:00
Bill Burke d1bfb26ebf Merge pull request #1085 from patriot1burke/master
broker ui improvements
2015-03-24 10:28:10 -04:00
Bill Burke 4a0f6eca11 broker ui improvements 2015-03-24 10:27:01 -04:00
jean be95646061 KEYCLOAK-1135 add Realm name in email messages 2015-03-24 10:49:58 -03:00
Bill Burke e9aac561d3 Merge pull request #1083 from velias/KEYCLOAK-1046
KEYCLOAK-1046 - StackOverflow social login provider implementation
2015-03-24 08:31:36 -04:00
Vlastimil Elias ee742be811 KEYCLOAK-1046 - added modules definition, tests and documentation 2015-03-24 08:49:31 +01:00
Stian Thorgersen b10b871c3c Enable pt-br 2015-03-24 07:35:11 +01:00
Stian Thorgersen c134ebc0c0 Merge pull request #1079 from jean-merelis/master
support for i8n pt-BR
2015-03-24 06:12:16 +01:00
Bill Burke 4681148b1a Merge pull request #1082 from patriot1burke/master
broker oidc logout and console fixes
2015-03-23 21:39:37 -04:00
Bill Burke c3859fa34f oidc logout and console fixes 2015-03-23 21:30:56 -04:00
Bill Burke 5a7cefb198 Merge remote-tracking branch 'upstream/master' 2015-03-23 13:21:28 -04:00
Bill Burke 410953fc5f broker oidc logout 2015-03-23 13:21:17 -04:00
Marek Posolda 19c6fe368f Merge pull request #1081 from mposolda/master
KEYCLOAK-1106 Incorrect table mapping (realm_application)
2015-03-23 18:06:20 +01:00
Vlastimil Elias c2fe63db63 KEYCLOAK-1046 - StackOverflow social login provider implementation 2015-03-23 17:48:26 +01:00
Vlastimil Elias a474051869 LinkedIn configuration page template moved to reflect new folder
structure of themes
2015-03-23 17:45:01 +01:00
mposolda b8b0ecc419 KEYCLOAK-1106 Incorrect table mapping (realm_application) 2015-03-23 17:35:41 +01:00
Vlastimil Elias f2485bf56b KEYCLOAK-1046 - SimpleHttp is now able to process gzip encoded responses 2015-03-23 16:37:46 +01:00
jean 12ed875154 support for i8n pt-BR 2015-03-23 09:56:23 -03:00
Marek Posolda 8d69ef95f5 Merge pull request #1078 from mposolda/master
Fix databases, mongo, infinispan and active directory
2015-03-23 13:46:24 +01:00
mposolda fe8395bff7 Fix databases, mongo, infinispan and active directory 2015-03-23 12:57:01 +01:00
Stian Thorgersen 339a312d69 Merge pull request #1077 from stianst/jar-theme
Jar theme
2015-03-23 11:31:00 +01:00
Stian Thorgersen cd748e4482 Merge pull request #1076 from velias/KEYCLOAK-28
KEYCLOAK-28 - Login with LinkedIn
2015-03-23 11:30:21 +01:00
Stian Thorgersen 1dadfc9726 Updated themes docs 2015-03-23 11:10:16 +01:00
Stian Thorgersen a3073db6c0 Update theme examples for new theme structure 2015-03-23 11:10:15 +01:00
Stian Thorgersen 97d7fd65c2 KEYCLOAK-1127 Change theme structure from 'type/name' to 'name/type' 2015-03-23 11:10:15 +01:00
Vlastimil Elias e35afb66c1 KEYCLOAK-28 - added LinkedIn social login documentation into reference
guide
2015-03-23 10:43:53 +01:00
Vlastimil Elias c21d110b4c KEYCLOAK-28 - Login with LinkedIn 2015-03-23 10:24:01 +01:00
Stian Thorgersen acef322ea3 Merge pull request #1072 from gerbermichi/i18n
[KEYCLOAK-301] Internationalization support (3rd pr)
2015-03-23 06:35:59 +01:00
Bill Burke f625b92cb2 Merge pull request #1074 from patriot1burke/master
oidc logout profile
2015-03-22 13:59:50 -04:00
Bill Burke f546358d66 oidc logout profile 2015-03-22 12:45:36 -04:00
Bill Burke 1700cb149b Merge pull request #1073 from patriot1burke/master
broker logout
2015-03-20 19:51:10 -04:00
Bill Burke 97d5f4aafc broker refactor 2015-03-20 18:56:25 -04:00
Michael Gerber 06e02e8026 i18n for code.ftl
i18n for login-oauth-grant.ftl

i18n for account.ftl

i18n for account.ftl

i18n for federatedIdentity.ftl

i18n for log.ftl

i18n for password.ftl

i18n for sessions.ftl

i18n for template.ftl

i18n for totp.ftl

i18nfix

i18n messages cleanup
advanced message formater for claim and role
2015-03-20 19:32:38 +01:00
Bill Burke 90c815055d broker logout 2015-03-20 12:13:33 -04:00
Stian Thorgersen abb22296b7 Merge pull request #1071 from stianst/jar-theme
Fix formatting of README.md
2015-03-20 14:50:11 +01:00
Stian Thorgersen 4494c2a731 Fix module theme loader 2015-03-20 14:49:46 +01:00
Stian Thorgersen bf9830dae8 Fix formatting of README.md 2015-03-20 14:20:51 +01:00
Stian Thorgersen 404faeeaed Merge pull request #1070 from stianst/jar-theme
KEYCLOAK-498 Package theme as a JAR
2015-03-20 14:14:09 +01:00
Stian Thorgersen 8ed1c475e4 KEYCLOAK-498 Package theme as a JAR 2015-03-20 14:13:25 +01:00
Stian Thorgersen 4109371b56 Merge pull request #1069 from stianst/master
Hide internationalization options if internationalization is not enabled
2015-03-20 10:21:04 +01:00
Stian Thorgersen 06a554068f Hide internationalization options if internationalization is not enabled 2015-03-20 10:20:46 +01:00
Stian Thorgersen dd2a5df654 Merge pull request #1068 from stianst/master
KEYCLOAK-1100 Clicking on mapper name for account application fails
2015-03-20 08:50:42 +01:00
Stian Thorgersen 06a45170ef KEYCLOAK-1100 Clicking on mapper name for account application fails 2015-03-20 08:50:24 +01:00
Stian Thorgersen f46784380f Merge pull request #1067 from stianst/master
KEYCLOAK-1062 Document how to configure listeners
2015-03-20 08:40:26 +01:00
Stian Thorgersen d44cc8639d KEYCLOAK-1062 Document how to configure listeners 2015-03-20 08:40:05 +01:00
Stian Thorgersen 545521137d Merge pull request #1066 from stianst/master
KEYCLOAK-1076 XML tag <enable-basic-auth> needed in secure-deployments f...
2015-03-20 08:25:18 +01:00
Stian Thorgersen 1714ce91d1 KEYCLOAK-1076 XML tag <enable-basic-auth> needed in secure-deployments for AS-7 subsystem 2015-03-20 07:37:16 +01:00
Stian Thorgersen 3efb5d2650 Merge pull request #1065 from stianst/master
KEYCLOAK-1110 Fix role not removed from default roles when not deleted
2015-03-20 07:30:09 +01:00
Stian Thorgersen 93f9706297 KEYCLOAK-1110 Fix role not removed from default roles when not deleted 2015-03-20 06:17:35 +01:00
Stian Thorgersen 1d4e8118f0 Updated admin-client to use new token endpoint 2015-03-20 06:04:36 +01:00
Stian Thorgersen 71c7d8e48b Merge pull request #1062 from velias/KEYCLOAK-1053
KEYCLOAK-1053 patch of email validation during social login without email
2015-03-20 05:37:16 +01:00
Stian Thorgersen 6e967ab261 Merge pull request #1059 from ssilvert/connectionsFile
Minor doc fix for json file persistence.
2015-03-20 05:34:44 +01:00
Stian Thorgersen cd2172df4a Merge pull request #1064 from gerbermichi/i18n
[KEYCLOAK-301] Internationalization support (second pr)
2015-03-20 05:34:20 +01:00
Michael Gerber d8193f0f25 ui_locales as specified in:
http://openid.net/specs/openid-connect-core-1_0.html#rfc.section.3.1.2

replace ' through '' and introduce msg method for i18n in *.ftl files

replace ' through '' and introduce msg method for i18n in *.ftl files

css dorpdown

get current url with locale as query parameter

Introduce LocaleBean

add css dropdown to account page

css styling...

css styling...
2015-03-19 21:28:55 +01:00
Marek Posolda de4c05e484 Merge pull request #1063 from mposolda/master
Mongo migration, MigrationUtils
2015-03-19 20:35:20 +01:00
mposolda a65bac7751 Mongo migration: admin roles, timeout, protocol mappers 2015-03-19 19:58:19 +01:00
mposolda 82e290e06c Minor model fix 2015-03-19 19:58:19 +01:00
Vlastimil Elias c0cf537654 KEYCLOAK-1053 - social login do not fail when email validation is
enabled for realm but email is not provided by social login provider
(eg. Twitter)
2015-03-19 17:19:55 +01:00
Stian Thorgersen e1188e0c68 Merge pull request #1061 from stianst/master
KEYCLOAK-1115 Horizontal scrollbar on login screen with low resolution
2015-03-19 16:30:03 +01:00
Stian Thorgersen f18c0af49c KEYCLOAK-1115 Horizontal scrollbar on login screen with low resolution 2015-03-19 16:28:16 +01:00
Stian Thorgersen 8a38597b3a Merge pull request #1060 from stianst/master
KEYCLOAK-1080 Unrecognized field social when importing from 1.1.0.Final
2015-03-19 14:50:49 +01:00
Stian Thorgersen 0c16bdb31d KEYCLOAK-1080 Unrecognized field social when importing from 1.1.0.Final 2015-03-19 14:27:24 +01:00
Bill Burke b26277a17c broker fixes 2015-03-18 21:58:04 -04:00
Stan Silvert 8f90509a3c Minor doc fix for json file persistence. 2015-03-18 11:28:42 -04:00
Marek Posolda 3912c60ebc Merge pull request #1058 from mposolda/master
Fix google and twitter examples
2015-03-18 12:01:41 +01:00
mposolda cc5efc629d Fix google and twitter examples 2015-03-18 11:59:40 +01:00
Marek Posolda b8d5109744 Merge pull request #1057 from mposolda/master
KEYCLOAK-1108 Remove option for enable/disable login per app. Few other minor fixes
2015-03-18 10:36:44 +01:00
mposolda 24f18609dd Update federated links when identity provider alias is changed 2015-03-18 09:43:53 +01:00
mposolda 8c4f45fd38 Fix CSS of social buttons on login screen 2015-03-18 09:43:53 +01:00
mposolda aeb27ff047 KEYCLOAK-1108 Remove option for enable/disable login per application 2015-03-18 09:43:53 +01:00
Bill Burke 48adefdbea Merge pull request #1055 from ssilvert/KEYCLOAK-1105-refactor-InMemoryModel
KEYCLOAK-1105 Refactor InMemoryModel
2015-03-17 19:27:29 -04:00
Bill Burke cc0231e5aa Merge pull request #1056 from patriot1burke/master
saml broker import/export, and module fixes
2015-03-17 19:21:32 -04:00
Bill Burke ce2c4188fb saml broker import/export, and module fixes 2015-03-17 19:20:46 -04:00
Stan Silvert 68b88b4baf KEYCLOAK-1105 Refactor InMemoryModel to use a factory instead of a
singleton.
2015-03-17 16:16:39 -04:00
Stan Silvert ecadc92f40 KEYCLOAK-1105 fix file profile in testsuite 2015-03-17 16:16:38 -04:00
Stian Thorgersen 13b22d6644 KEYCLOAK-1107 saml and oidc broker options don't sho 2015-03-17 12:10:53 +01:00
Marek Posolda b6b4731f9e Merge pull request #1054 from mposolda/master
Fix broker packaging and facebook example
2015-03-17 10:57:42 +01:00
mposolda d3e75084de Fix broker packaging and facebook example 2015-03-17 10:55:06 +01:00
Stian Thorgersen c650a8d52d KEYCLOAK-752 Upgrade Liquibase 2015-03-17 09:32:50 +01:00
Stian Thorgersen b4af5c4a1e KEYCLOAK-1028 Make sure we return invalid response with response_type is token 2015-03-17 08:55:20 +01:00
Stian Thorgersen 2d785b5d5e KEYCLOAK-1050 Added support for selecting multiple values 2015-03-17 07:52:55 +01:00
Stian Thorgersen 2f6ae96aec Updated token endpoint in broker tests 2015-03-17 07:22:16 +01:00
Bill Burke 4a8f34f27f Merge pull request #1052 from patriot1burke/master
set saml issuer
2015-03-16 16:18:36 -04:00
Bill Burke adb5f306c2 fix account mappers issue 2015-03-16 16:15:22 -04:00
Marek Posolda 7c72781cb1 Merge pull request #1053 from mposolda/master
KEYCLOAK-1094 Rename k_idp_hint to kc_idp_hint
2015-03-16 20:50:09 +01:00
Bill Burke de2aa8e676 javadoc fixes 2015-03-16 15:37:49 -04:00
mposolda b22cd6ddd7 Adding pom.xml to broker examples 2015-03-16 20:28:33 +01:00
mposolda 4da566ae4d KEYCLOAK-1094 Rename k_idp_hint to kc_idp_hint 2015-03-16 20:00:20 +01:00
Bill Burke 1715be2308 set saml issuer 2015-03-16 14:52:29 -04:00
Bill Burke 321041fccf Merge pull request #1050 from patriot1burke/master
saml broker SPSSO descriptor
2015-03-16 13:31:47 -04:00
Marek Posolda 90c4185ee1 Merge pull request #1051 from mposolda/master
Fix Kerberos test on windows, KEYCLOAK-1092
2015-03-16 18:10:50 +01:00
Bill Burke 224066f0fd saml broker defaults and export page 2015-03-16 12:34:20 -04:00
mposolda a3c3a837ad Fix Kerberos tests on windows - another attempt 2015-03-16 17:05:19 +01:00
mposolda 5fe0c38498 KEYCLOAK-1092 Fix test for crud of federated identity links 2015-03-16 16:49:01 +01:00
Bill Burke f13f0730db Merge remote-tracking branch 'upstream/master' 2015-03-16 10:03:15 -04:00
Marek Posolda cb17db50c1 Merge pull request #1049 from mposolda/master
Attempt to fix Kerberos.credentialDelegationTest on windows
2015-03-16 14:57:50 +01:00
mposolda 05fd3032ec Attempt to fix Kerberos.credentialDelegationTest on windows 2015-03-16 14:25:38 +01:00
Bill Burke ec1ba40f4a Merge remote-tracking branch 'upstream/master' 2015-03-16 09:22:55 -04:00
Stian Thorgersen 7ab0597989 Merge pull request #1048 from stianst/oidc
Change adapters to use auth and token endpoints
2015-03-16 10:28:06 +01:00
Stian Thorgersen e2b02d414f Change adapters to use auth and token endpoints 2015-03-16 09:23:12 +01:00
Stian Thorgersen 3d05f31202 Merge pull request #1047 from gerbermichi/i18n
[KEYCLOAK-301] Internationalization support
2015-03-16 09:17:16 +01:00
Michael Gerber 144ee2c56d add localization support to realm
(cherry picked from commit b00764b)

add localization support to realm
(cherry picked from commit b00764b)

add localization support to realm
(cherry picked from commit b00764b)

admin gui for localization support
(cherry picked from commit c157cc3)

added locale support to ClassLoaderTheme and FolderTheme
(cherry picked from commit 764960a)

rename localizatin to internationalization
(cherry picked from commit 74a0658)

fallback if no message can be found
(cherry picked from commit 2d54e6f)

fallback if no message can be found
(cherry picked from commit 2d54e6f)

add HttpHeaders
(cherry picked from commit be921c8)

add HttpHeaders
(cherry picked from commit be921c8)

NPE fix
(cherry picked from commit 148158b)

improve locale helper
(cherry picked from commit 57a805a)

write cookie
fix npe
(cherry picked from commit 33398b3)

dropdown to choose language
(cherry picked from commit 9e2eb60)

added dropdown to choose locale to the account page.
fixed the path of the cookie.
(cherry picked from commit 871469a)

remove debug info
(cherry picked from commit c3ea6b1)

added dropdown to change locale for user.
(cherry picked from commit 1575bea)

add i18n for emails
(cherry picked from commit b6280e9)

i18n for emails
(cherry picked from commit 6118c51)

set default locale to english
(cherry picked from commit 386447b)

change locale type form String to Locale
(cherry picked from commit 8dcc595)

change file encoding
(cherry picked from commit 2cce96d)

added parameters to setSuccess, setWarning, setError
(cherry picked from commit 64ea438)

i18n for error messages
(cherry picked from commit e75d5ef)

i18n for error message in login
(cherry picked from commit 8b60c96)

add i18n for messages in account pages
(cherry picked from commit 9849d94)

fix unit test
(cherry picked from commit a70a1c7)

fix unit test
(cherry picked from commit 008744b)

locale localization :)
(cherry picked from commit f3a2144)

locale localization :)
(cherry picked from commit 21f6384)

messages refactoring
(cherry picked from commit 08f1ae7)

messages refactoring
(cherry picked from commit 3b4b53a)

messages refactoring
(cherry picked from commit 69146d4)

messages refactoring
(cherry picked from commit cd3db1d)

messages refactoring
(cherry picked from commit 715583f)

fix unit tests after message refactoring
(cherry picked from commit a82c9ff)

fix unit tests after message refactoring
(cherry picked from commit 5662d83)

fix unit tests after message refactoring
(cherry picked from commit 1188de6)

fix unit tests after message refactoring
(cherry picked from commit 90ded07)

German translations
(cherry picked from commit 9822b99)

removed newliines
(cherry picked from commit 34ca1d8)

removed java 8 dependency
(cherry picked from commit 3a23f4f)

typo
(cherry picked from commit a818122)

typo
(cherry picked from commit a818122)

forgotten properties

unit test fixes

unit test fixes

fixes after rebase

add localization support to realm
(cherry picked from commit b00764b)

add localization support to realm
(cherry picked from commit b00764b)

add localization support to realm
(cherry picked from commit b00764b)

admin gui for localization support
(cherry picked from commit c157cc3)

added locale support to ClassLoaderTheme and FolderTheme
(cherry picked from commit 764960a)

rename localizatin to internationalization
(cherry picked from commit 74a0658)

fallback if no message can be found
(cherry picked from commit 2d54e6f)

fallback if no message can be found
(cherry picked from commit 2d54e6f)

add HttpHeaders
(cherry picked from commit be921c8)

add HttpHeaders
(cherry picked from commit be921c8)

NPE fix
(cherry picked from commit 148158b)

improve locale helper
(cherry picked from commit 57a805a)

write cookie
fix npe
(cherry picked from commit 33398b3)

dropdown to choose language
(cherry picked from commit 9e2eb60)

added dropdown to choose locale to the account page.
fixed the path of the cookie.
(cherry picked from commit 871469a)

remove debug info
(cherry picked from commit c3ea6b1)

added dropdown to change locale for user.
(cherry picked from commit 1575bea)

add i18n for emails
(cherry picked from commit b6280e9)

i18n for emails
(cherry picked from commit 6118c51)

set default locale to english
(cherry picked from commit 386447b)

change locale type form String to Locale
(cherry picked from commit 8dcc595)

change file encoding
(cherry picked from commit 2cce96d)

added parameters to setSuccess, setWarning, setError
(cherry picked from commit 64ea438)

i18n for error messages
(cherry picked from commit e75d5ef)

i18n for error message in login
(cherry picked from commit 8b60c96)

add i18n for messages in account pages
(cherry picked from commit 9849d94)

fix unit test
(cherry picked from commit a70a1c7)

fix unit test
(cherry picked from commit 008744b)

locale localization :)
(cherry picked from commit f3a2144)

locale localization :)
(cherry picked from commit 21f6384)

messages refactoring
(cherry picked from commit 08f1ae7)

messages refactoring
(cherry picked from commit 3b4b53a)

messages refactoring
(cherry picked from commit 69146d4)

messages refactoring
(cherry picked from commit cd3db1d)

messages refactoring
(cherry picked from commit 715583f)

fix unit tests after message refactoring
(cherry picked from commit a82c9ff)

fix unit tests after message refactoring
(cherry picked from commit 5662d83)

fix unit tests after message refactoring
(cherry picked from commit 1188de6)

fix unit tests after message refactoring
(cherry picked from commit 90ded07)

German translations
(cherry picked from commit 9822b99)

removed newliines
(cherry picked from commit 34ca1d8)

removed java 8 dependency
(cherry picked from commit 3a23f4f)

typo
(cherry picked from commit a818122)

typo
(cherry picked from commit a818122)

forgotten properties

unit test fixes

unit test fixes

fixes after rebase

fixes after rebase

fixes after rebase

fixes after rebase
2015-03-14 14:08:06 +01:00
Bill Burke 60ecf99aa6 export saml broker SPSSO descriptor 2015-03-13 20:56:40 -04:00
Bill Burke 7f879fcf62 Merge pull request #1043 from jpkrohling/KEYCLOAK-1101-PasswordPolicyNotUsername
KEYCLOAK-1101 - Added notUsername() to password policy.
2015-03-13 16:58:44 -04:00
Marek Posolda f732332281 Merge pull request #1046 from mposolda/master
KEYCLOAK-1102 Used just one ResteasyClient in admin client
2015-03-13 20:22:06 +01:00
mposolda 9b74393add KEYCLOAK-1102 Used just one ResteasyClient in admin client 2015-03-13 19:56:05 +01:00
Marek Posolda d28f3ebaf9 Merge pull request #1045 from mposolda/master
KEYCLOAK-1099 Test of identity providers and protocol mappers import
2015-03-13 19:53:26 +01:00
mposolda 7d2d3230d2 KEYCLOAK-1099 Test of identity providers and protocol mappers import 2015-03-13 19:34:40 +01:00
Marek Posolda 29030a6d39 Merge pull request #1044 from mposolda/master
Fix kerberos test failing in some environments
2015-03-13 17:52:17 +01:00
mposolda 84eed9ffc6 Fix kerberos test failing in some environments 2015-03-13 17:17:09 +01:00
Juraci Paixão Kröhling a64ce244d5 KEYCLOAK-1101 - Added notUsername() to password policy. 2015-03-13 15:50:28 +01:00
Marek Posolda fbfe552b54 Merge pull request #1042 from mposolda/master
KEYCLOAK-1043 Fix fuse packaging due to bouncycastle update. Improve cam...
2015-03-13 11:18:33 +01:00
mposolda 444cdac9f5 KEYCLOAK-1043 Fix fuse packaging due to bouncycastle update. Improve camel example 2015-03-13 10:57:44 +01:00
Bill Burke 4b48988a73 update readme features 2015-03-12 18:13:05 -04:00
Bill Burke d8b34b68ec Merge pull request #1041 from patriot1burke/master
bump picketlink version
2015-03-12 18:09:42 -04:00
Bill Burke 6dd2959a38 bump picketlink version 2015-03-12 18:09:06 -04:00
Bill Burke 9b5b9e3275 Merge pull request #1040 from patriot1burke/master
bump liquibase LAST_VERSION
2015-03-12 16:55:28 -04:00
Bill Burke cc98a3dae0 bump liquibase LAST_VERSION 2015-03-12 16:55:04 -04:00
Bill Burke 0f23e1e31f Merge pull request #1039 from patriot1burke/master
KEYCLOAK-982
2015-03-12 16:54:50 -04:00
Bill Burke eeb47f9374 KEYCLOAK-982 2015-03-12 16:34:02 -04:00
Bill Burke 7d2a6237b0 Merge pull request #1034 from velias/KEYCLOAK-1074
#1074 - Allow registration with email as username
2015-03-12 15:36:05 -04:00
Vlastimil Elias 5b653b4e3e rebase 2015-03-12 15:57:14 +01:00
Vlastimil Elias 43aa61ace3 KEYCLOAK-1074
- field label changes on login page
- added all relevant integration tests
2015-03-12 15:45:41 +01:00
Vlastimil Elias 7fce4f1dd9 patched RepresentationToModel injured during reformating 2015-03-12 15:43:17 +01:00
Vlastimil Elias dec8d33af1 code formatting improved to keep only real changes done for
KEYCLOAK-1074
2015-03-12 15:43:16 +01:00
Vlastimil Elias c8c0449124 code formatting patched to be close to original and produce better difs 2015-03-12 15:39:31 +01:00
Vlastimil Elias 21b4f9a2f1 KEYCLOAK-1074 - Allow registration with email as username (without
username as separate field)
2015-03-12 15:31:19 +01:00
Vlastimil Elias aad1f3707e KEYCLOAK-1074
- field label changes on login page
- added all relevant integration tests
2015-03-12 15:04:25 +01:00
Stian Thorgersen d296d480e9 Merge pull request #1038 from stianst/oidc
OpenID Connect Discovery and single auth and token endpoints
2015-03-12 13:00:38 +01:00
Stian Thorgersen ffbb2df1f3 KEYCLOAK-571 OpenID Connect Discovery
KEYCLOAK-1091 JSON Web Key Set endpoint
KEYCLOAK-790 One OpenID Connect token endpoint URL
2015-03-12 11:45:13 +01:00
Marek Posolda f8010c21c9 Merge pull request #1037 from mposolda/master
Minor improvements for kerberos
2015-03-12 09:49:56 +01:00
mposolda c2f2c5ccb6 Minor improvements for kerberos 2015-03-12 09:12:16 +01:00
Bill Burke 0e0181ced4 Merge pull request #1036 from patriot1burke/master
validate destination
2015-03-11 20:03:21 -04:00
Bill Burke 9984caa2fe validate destination 2015-03-11 19:27:01 -04:00
Bill Burke 3af3dd78e5 Merge pull request #1035 from patriot1burke/master
clean and docs for mapper
2015-03-11 12:07:03 -04:00
Bill Burke 6450c4c5f3 cleanup and docs for mappers 2015-03-11 12:05:27 -04:00
Vlastimil Elias f64da6faa0 patched RepresentationToModel injured during reformating 2015-03-11 16:07:06 +01:00
Vlastimil Elias 4cd3827976 code formatting improved to keep only real changes done for
KEYCLOAK-1074
2015-03-11 15:38:42 +01:00
Bill Burke 451ce64907 role name mapper 2015-03-11 09:59:56 -04:00
Vlastimil Elias a49a2f1dc4 code formatting patched to be close to original and produce better difs 2015-03-11 09:50:21 +01:00
Vlastimil Elias b117409531 KEYCLOAK-1074 - Allow registration with email as username (without
username as separate field)
2015-03-10 16:28:57 +01:00
Marek Posolda 81f88539ff Merge pull request #1033 from mposolda/master
Minor fixes in kerberos example
2015-03-10 13:07:08 +01:00
mposolda 90c9d29a45 Minor fixes in kerberos example 2015-03-10 12:44:41 +01:00
Stian Thorgersen 453d29f188 Tweak to tests to pass on travis 2015-03-10 04:58:36 +01:00
Stian Thorgersen f6a2c23314 Tweaks to file provider 2015-03-10 04:42:20 +01:00
Stan Silvert b79160722c Update documentation for JSON File persistence of the model. 2015-03-10 04:42:20 +01:00
Stan Silvert cb4c2cc5e3 All tests now passing except broker tests and ImportExportTest. 2015-03-10 04:42:19 +01:00
Stan Silvert b1d341155d Fix AdminApiTest. Fix distribution. Try to prevent InMemoryModel leaks. 2015-03-10 04:42:19 +01:00
Stan Silvert e0f670768f Make 3 more tests pass. 2015-03-10 04:42:19 +01:00
Stan Silvert 72b3db2322 KEYCLOAK-1072 Implement file-based JSON storage of the model 2015-03-10 04:42:19 +01:00
Bill Burke bf27c22dd5 Merge pull request #1032 from patriot1burke/master
mapper fixes and tests
2015-03-09 21:33:38 -04:00
Bill Burke 28a5e61dff role mappers and testing 2015-03-09 21:03:35 -04:00
Bill Burke 5cf64546c8 Merge remote-tracking branch 'upstream/master' 2015-03-09 09:05:53 -04:00
Bill Burke cdf22669f4 test oidc mappers 2015-03-09 09:05:39 -04:00
Bill Burke 60313a310c saml mapper tests 2015-03-09 08:02:30 -04:00
Bill Burke d4468913dd hardcoded saml mappers 2015-03-09 07:55:20 -04:00
Stian Thorgersen 3bc1d2e124 Merge branch 'girirajsharma-master' 2015-03-09 11:50:49 +01:00
Stian Thorgersen 452931bfb8 Simplified setting to/from dates 2015-03-09 11:47:08 +01:00
girirajsharma d2188a3f55 Fixed Event Viewer pagination, date filter and added testcases. 2015-03-09 11:47:08 +01:00
girirajsharma ce33ce2485 [KEYCLOAK-1050] - Improve filtering in Event viewer in admin app. 2015-03-09 11:47:08 +01:00
Stian Thorgersen 6874933724 Merge pull request #1031 from stianst/master
Removed dep on wildfly-extensions in server-all
2015-03-09 11:46:54 +01:00
Stian Thorgersen 2f64b6aaad Removed dep on wildfly-extensions in server-all 2015-03-09 11:45:50 +01:00
Bill Burke 7ba0681731 saml role list test 2015-03-08 08:14:48 -04:00
Bill Burke 7bfd55c0de Merge pull request #1029 from patriot1burke/master
saml role list mapper
2015-03-07 21:38:06 -05:00
Bill Burke 34cabf5bdb Merge remote-tracking branch 'upstream/master' 2015-03-07 19:47:45 -05:00
Bill Burke 5c6c30fef4 saml role list mapper 2015-03-07 19:47:34 -05:00
Bill Burke 868c54b614 Merge pull request #1027 from patriot1burke/master
added mappers, test saml mappers
2015-03-06 19:00:10 -05:00
Bill Burke 1de285b724 mappers 2015-03-06 18:42:20 -05:00
Bill Burke 4a4158a4e4 test saml attributes 2015-03-06 18:29:36 -05:00
Marek Posolda ff231f0d19 Merge pull request #1025 from mposolda/master
Minor enhancements in kerberos example
2015-03-06 19:47:19 +01:00
mposolda e7cc1c3e58 Minor enhancements in kerberos example 2015-03-06 18:39:08 +01:00
Marek Posolda b6b16c62f5 Merge pull request #1024 from mposolda/krb-deleg-cred
KEYCLOAK-1066 Kerberos credential delegation support
2015-03-06 13:22:56 +01:00
mposolda db07d79009 KEYCLOAK-1066 Kerberos credential delegation support 2015-03-06 12:59:29 +01:00
Stian Thorgersen 8cf31bd3f1 Updated docs to include deploying providers as modules 2015-03-06 07:13:15 +01:00
Stian Thorgersen 2b78a3bf4d Tweaks to tests that fail on travis 2015-03-06 06:35:15 +01:00
Stian Thorgersen 1f5fedb0b0 Module provider loader 2015-03-06 05:30:17 +01:00
Bill Burke db2c01caa9 more mappers 2015-03-05 19:55:53 -05:00
Bill Burke 42eed8145c Merge pull request #1023 from patriot1burke/master
add oauth mappers
2015-03-05 12:14:54 -05:00
Bill Burke 558277f66d Merge remote-tracking branch 'upstream/master' 2015-03-05 11:55:05 -05:00
Bill Burke 06c8bf0964 add oauth mappers 2015-03-05 11:54:51 -05:00
Stian Thorgersen 4cb3d51781 KEYCLOAK-1082
Make sure session is valid if keycloak.js is initialized with tokens
2015-03-05 07:42:31 +01:00
Bill Burke 8dea0d50ee Merge pull request #1021 from patriot1burke/master
fix reg formatting
2015-03-04 21:00:20 -05:00
Bill Burke 6cfbd59d80 fix reg formatting 2015-03-04 20:59:40 -05:00
Bill Burke 7c445cf983 Merge pull request #1020 from patriot1burke/master
ID Token mapping, fix IDToken.otherClaims
2015-03-04 20:42:21 -05:00
Bill Burke 98831ec05a fix other claims in IDToken 2015-03-04 20:27:06 -05:00
Bill Burke 453ef808cc ID token mapping 2015-03-04 18:39:10 -05:00
Bill Burke 049dafd3c9 Merge pull request #1019 from patriot1burke/master
fix error
2015-03-04 17:41:38 -05:00
Bill Burke 51e2507f5d fix error 2015-03-04 17:39:40 -05:00
Bill Burke 94c778f22f Merge pull request #1018 from patriot1burke/master
reg/account custom attributes
2015-03-04 17:29:03 -05:00
Bill Burke 94980fff29 merge conflicts 2015-03-04 17:27:44 -05:00
Bill Burke 33520e9fec reg/account custom attributes 2015-03-04 17:25:50 -05:00
Bill Burke 226b75e1c5 Merge pull request #1017 from patriot1burke/master
fix SAML examples
2015-03-04 10:38:39 -05:00
Bill Burke 5a37754b62 fix SAML examples 2015-03-04 10:38:06 -05:00
Stian Thorgersen fb745d1dae Removed reference to auth-server.war in appliance docs 2015-03-04 15:19:00 +01:00
Stian Thorgersen 6c7f35c509 KEYCLOAK-1014 Don't redirect to app after reset password or verify email if new browser session 2015-03-04 13:39:11 +01:00
Stian Thorgersen ad799058a6 Merge pull request #1016 from mstruk/master
Fix boolean type - was causing issues on some dbs i.e. PostgreSQL
2015-03-04 13:08:02 +01:00
Marko Strukelj 3d1db7dd91 Fix boolean type - was causing issues on some dbs i.e. PostgreSQL 2015-03-04 12:50:03 +01:00
Stian Thorgersen f907a749aa KEYCLOAK-1015 Allow configuring login timeout separate to login actions 2015-03-04 08:45:01 +01:00
Bill Burke d7860420d6 Merge pull request #1015 from patriot1burke/master
refactor mapper
2015-03-03 21:21:42 -05:00
Bill Burke b51766e86e Merge remote-tracking branch 'upstream/master' 2015-03-03 20:38:46 -05:00
Bill Burke 396e0c6171 refactor mappers 2015-03-03 20:38:28 -05:00
Bill Burke aee47a80bd Merge pull request #1011 from patriot1burke/master
fix mongo
2015-03-03 13:44:42 -05:00
Bill Burke 4430d8efac Merge remote-tracking branch 'upstream/master' 2015-03-03 12:02:54 -05:00
Bill Burke 608185f06a boolean mapper property types 2015-03-03 12:00:40 -05:00
Stian Thorgersen d74214cf56 Merge pull request #1014 from girirajsharma/master
[KEYCLOAK-1024] - Make sure docs point out password hashing iterations should be increased.
2015-03-03 13:03:11 +01:00
girirajsharma 634ae972c6 [KEYCLOAK-1024] - Make sure docs point out password hashing iterations
should be increased.
2015-03-03 14:30:52 +05:30
Bill Burke 0559c1df06 Merge remote-tracking branch 'upstream/master' 2015-03-02 21:40:01 -05:00
Bill Burke 753feae49e fixes 2015-03-02 21:39:43 -05:00
Marek Posolda eb43d0b779 Merge pull request #1013 from mposolda/krb-deleg-cred
Kerberos/SPNEGO login in SAML applications
2015-03-02 20:48:05 +01:00
mposolda 633696ab7d Kerberos/SPNEGO login in SAML applications 2015-03-02 20:28:04 +01:00
Marek Posolda 5c30093554 Merge pull request #1012 from girirajsharma/master
[KEYCLOAK-1026] - Application Settings tooltip copy/paste error.
2015-03-02 19:56:45 +01:00
girirajsharma 7dffe82118 [KEYCLOAK-1026] - Application Settings tooltip copy/paste error. 2015-03-02 23:56:09 +05:30
Bill Burke 5e12ee3e7a resolve conflicts 2015-03-02 09:00:10 -05:00
Bill Burke 6f88d50d4d fix mongo 2015-03-02 08:55:11 -05:00
Marek Posolda d1fbe1fd30 Merge pull request #1010 from mposolda/krb-deleg-cred
Configurable KDC encryption types, Mongo fix
2015-03-02 13:27:38 +01:00
mposolda 4741a9a91e Configurable kdc encryption types for Kerberos test 2015-03-02 12:56:13 +01:00
mposolda 58a7e549b2 Fix mongo to pass with testsuite 2015-03-02 12:07:31 +01:00
Bill Burke 80553e0dd8 Merge pull request #1009 from patriot1burke/master
mapper refactoring, default saml mappers
2015-03-01 00:20:59 -05:00
Bill Burke 4361ce1d42 mapper refactoring 2015-02-28 19:48:50 -05:00
Bill Burke 1684f00922 Merge pull request #1008 from patriot1burke/master
saml attribute mappers
2015-02-28 11:33:16 -05:00
Bill Burke f54da90d71 Merge remote-tracking branch 'upstream/master' 2015-02-28 11:17:19 -05:00
Bill Burke 2da925505e saml attribute mappers 2015-02-28 11:17:06 -05:00
Bill Burke 42b3bc1eea Merge pull request #1004 from girirajsharma/master
[KEYCLOAK-1058] - Can't choose again the same realm.
2015-02-27 21:22:43 -05:00
Bill Burke 2066a7ac89 Merge pull request #999 from velias/patch-1
Updated target java to 1.7 in parent pom.xml
2015-02-27 21:22:03 -05:00
Bill Burke 5a7ea3ba5d Merge pull request #1007 from patriot1burke/master
add saml mapper interfaces
2015-02-27 21:21:41 -05:00
Bill Burke 9dd9c9b37f add saml mapper interfaces 2015-02-27 20:16:34 -05:00
Bill Burke 724789e114 Merge pull request #1006 from patriot1burke/master
add mapper category and help text
2015-02-27 18:38:58 -05:00
Bill Burke 07b038e126 add mapper category and help text 2015-02-27 18:21:42 -05:00
Bill Burke ccb3a618b1 Merge pull request #1005 from patriot1burke/master
initial protocol mapper ui
2015-02-27 18:03:22 -05:00
Bill Burke 8533d49dfb Merge remote-tracking branch 'upstream/master' 2015-02-27 17:28:09 -05:00
Bill Burke 1c6e90c4ef protocol mapper ui 2015-02-27 17:21:02 -05:00
girirajsharma 7ea5d411d7 [KEYCLOAK-1058] - Can't choose again the same realm. 2015-02-27 19:32:03 +05:30
Marek Posolda ea98d26683 Merge pull request #1003 from mposolda/master
Kerberos documentation
2015-02-27 13:50:10 +01:00
mposolda aaf3c18a1b Kerberos documentation 2015-02-27 13:48:40 +01:00
Pedro Igor 663560a185 Merge pull request #1002 from pedroigor/master
[KEYCLOAK-883] - Configuration option to disable token retrieval from applications.
2015-02-27 02:13:49 -03:00
pedroigor b45d6b896a [KEYCLOAK-883] - Configuration option to disable token retrieval from applications. 2015-02-27 02:13:27 -03:00
Pedro Igor cd39d5292a Merge pull request #1001 from pedroigor/master
[KEYCLOAK-883] - Reverting change that redirects to error page when fede...
2015-02-26 15:27:56 -03:00
pedroigor 17653e7e74 [KEYCLOAK-883] - Reverting change that redirects to error page when federating identities.. 2015-02-26 15:27:32 -03:00
Pedro Igor 69da51cc56 Merge pull request #1000 from pedroigor/master
[KEYCLOAK-883] - Examples config and logging changes.
2015-02-26 12:34:47 -03:00
pedroigor 8f263a43e3 [KEYCLOAK-883] - Examples config and logging changes. 2015-02-26 12:34:33 -03:00
Vlastimil Eliáš 86b5f1b66c Updated target java to 1.7
Updated target java to 1.7 as Keycloak source codes are not compilable under java 1.6 due some core java classes (unknown constructor in AssertionError, bad visibility of method in InetAddress). 
This change eases import of Keycloak project into Eclipse also as Eclipse uses this maven property to set Java version for project. Without this change there are compilation errors in Eclipse after project import.
2015-02-26 10:26:07 +01:00
Pedro Igor bccffadc7c Merge pull request #998 from pedroigor/master
[KEYCLOAK-883] - Minor changes to the configuration of identity providers for clients.
2015-02-25 21:02:43 -03:00
pedroigor 6e38964838 [KEYCLOAK-883] - Minor changes to the configuration of identity providers for clients. 2015-02-25 21:00:49 -03:00
Marek Posolda 21992ddd31 Merge pull request #997 from mposolda/master
Kerberos fixes for jboss-modules refactoring. Fix environment specific t...
2015-02-25 23:35:50 +01:00
mposolda 0c893b6175 Kerberos fixes for jboss-modules refactoring. Fix environment specific test failures 2015-02-25 22:36:27 +01:00
Bill Burke 8d4d497063 Merge pull request #993 from patriot1burke/master
claim mappings next phase
2015-02-25 11:46:13 -05:00
Bill Burke 430daf4c39 Merge remote-tracking branch 'upstream/master' 2015-02-25 11:35:04 -05:00
Bill Burke 9f759ed77c rest interface for claim mapping 2015-02-25 11:34:51 -05:00
Stian Thorgersen 195a5dffdc Merge pull request #995 from stianst/master
KEYCLOAK-1017 Add server version to cached resources to prevent problems...
2015-02-25 16:15:11 +01:00
Pedro Igor b8e712e10b Merge pull request #996 from pedroigor/master
[KEYCLOAK-1036] - Revert.
2015-02-25 11:22:15 -03:00
pedroigor 128cd98ce2 [KEYCLOAK-1036] - Revert. 2015-02-25 11:21:56 -03:00
Stian Thorgersen 5a10bbc8ca KEYCLOAK-1017 Add server version to cached resources to prevent problems with browser cache 2015-02-25 15:03:01 +01:00
Stian Thorgersen 12dc159326 Merge pull request #994 from stianst/modules
KEYCLOAK-934 Extract dependencies into modules
2015-02-25 12:55:36 +01:00
Stian Thorgersen b6a512b494 KEYCLOAK-934 Extract dependencies into modules 2015-02-25 12:05:48 +01:00
Bill Burke 1704a6c643 Merge remote-tracking branch 'upstream/master' 2015-02-24 19:37:22 -05:00
Bill Burke c20ad93807 claim mappings next phase 2015-02-24 19:37:07 -05:00
Stian Thorgersen e0da63c985 Merge pull request #992 from girirajsharma/master
[KEYCLOAK-1049]-Inconsistent name for Type information in Event viewer.
2015-02-24 15:34:34 +01:00
girirajsharma 427d840441 [KEYCLOAK-1049]-Inconsistent name for Type information in Event viewer. 2015-02-24 19:43:01 +05:30
Stian Thorgersen 76d154b9ab Merge pull request #991 from girirajsharma/master
[KEYCLOAK-1030]-Unable to delete Password Policy.
2015-02-24 15:08:33 +01:00
girirajsharma 55190d7808 [KEYCLOAK-1030]-Unable to delete Password Policy. 2015-02-24 18:43:38 +05:30
Stian Thorgersen 0ad3c72c0a Merge pull request #982 from girirajsharma/master
[KEYCLOAK-1031]-Multiple accounts with the same email.
2015-02-24 13:35:15 +01:00
Bill Burke 40a865bf9f Merge pull request #990 from patriot1burke/master
ProviderFactory.postInit()
2015-02-23 13:02:05 -05:00
Bill Burke 6c5f35720a Merge remote-tracking branch 'upstream/master' 2015-02-23 12:12:08 -05:00
Bill Burke 100dbd5fd7 ProviderFactory.postInit() 2015-02-23 12:11:48 -05:00
Bill Burke 1a43309333 Merge pull request #989 from patriot1burke/master
provider events
2015-02-23 12:11:30 -05:00
girirajsharma f83f76b143 [KEYCLOAK-1031]-Multiple accounts with the same email. 2015-02-23 22:29:00 +05:30
Bill Burke d06b7a47ac Merge remote-tracking branch 'upstream/master' 2015-02-23 11:39:39 -05:00
Bill Burke 1dde3e1459 provider events 2015-02-23 11:39:24 -05:00
Marek Posolda 175b397eb2 Merge pull request #988 from mposolda/master
Kerberos automated tests, fixes
2015-02-23 17:30:37 +01:00
mposolda 4b6b48dc34 Increase MaxPermSize for tests 2015-02-23 17:05:10 +01:00
mposolda 9f8b59dfb6 Kerberos/LDAP fixes 2015-02-23 14:07:55 +01:00
mposolda 9dd5ecd464 Kerberos automated test 2015-02-23 13:13:34 +01:00
Bill Burke 58299d3373 Merge pull request #987 from patriot1burke/master
more claims work
2015-02-21 10:50:54 -05:00
Bill Burke 169e3a50be Merge remote-tracking branch 'upstream/master' 2015-02-21 10:30:05 -05:00
Bill Burke e9f0b8999e Merge remote-tracking branch 'upstream/master' 2015-02-21 10:28:27 -05:00
Bill Burke 1ee68bca5b Merge pull request #984 from patriot1burke/master
refactor for claims, fixed XSS bugs
2015-02-21 10:27:37 -05:00
Bill Burke 69582ee3be more claims work 2015-02-21 10:26:55 -05:00
Pedro Igor 463e33e232 Merge pull request #986 from pedroigor/master
[KEYCLOAK-994] - Identity broker documentation.
2015-02-20 23:09:52 -02:00
pedroigor 2d56c271af [KEYCLOAK-994] - Identity broker documentation. 2015-02-20 23:08:57 -02:00
Pedro Igor 4ed2383f72 Merge pull request #985 from pedroigor/master
Fixing twitter example config files.
2015-02-20 21:08:54 -02:00
pedroigor e61ed33469 Fixing twitter example config files. 2015-02-20 21:08:19 -02:00
Bill Burke 6d224745b2 dont display saml fieldset 2015-02-20 10:14:39 -05:00
Bill Burke 42ffe21f91 Merge remote-tracking branch 'upstream/master' 2015-02-20 09:23:18 -05:00
Bill Burke 20f12ea960 changes 2015-02-20 09:22:49 -05:00
Stian Thorgersen ef054670eb Merge pull request #978 from girirajsharma/master
Fixed a very minor breadcrumb label in user details(attributes) UI.
2015-02-19 08:27:02 +01:00
Marek Posolda beb3d80afa Merge pull request #981 from mposolda/master
KEYCLOAK-1041 Fix examples packaging
2015-02-18 18:00:41 +01:00
mposolda 8aa19fe8eb KEYCLOAK-1041 Fix examples packaging 2015-02-18 17:38:58 +01:00
Marek Posolda d7b48f9ae2 Merge pull request #980 from mposolda/master
Kerberos refactored to be federation provider. Support for Kerberos and ...
2015-02-18 17:24:33 +01:00
mposolda d8024b0c6c Kerberos refactored to be federation provider. Support for Kerberos and LDAP. Username/password authentication support with kerberos credentials.
First step - KerberosFederationProvider

Finished KerberosFederationProvider. Added support for username/password authentication with kerberos credentials

Added Kerberos UI to LDAPFederationProvider

Fixes
2015-02-18 17:19:15 +01:00
Pedro Igor 7e4aa09efc Merge pull request #979 from pedroigor/master
[KEYCLOAK-883] - Tipo for identity provider settings tab. Fixing directive name.
2015-02-18 14:00:17 -02:00
pedroigor 9541d22ac5 [KEYCLOAK-883] - Tipo for identity provider settings tab. Fixing directive name. 2015-02-18 13:59:49 -02:00
girirajsharma bb027a3123 Fixed a very minor breadcrumb label in user details(attributes) UI. 2015-02-18 19:01:48 +05:30
Marek Posolda 8f5010e71a Merge pull request #977 from mposolda/master
LDAP testing improvements. Support for embedded Kerberos server in testsuite
2015-02-16 12:12:55 +01:00
mposolda 4795059e15 Fix mongo model 2015-02-16 11:50:42 +01:00
mposolda 5da05aa62a LDAP testing improvements. Support for embedded Kerberos server in testsuite 2015-02-16 11:50:28 +01:00
Bill Burke 6097ecb53f Merge pull request #976 from patriot1burke/master
client to protocol mapping model
2015-02-15 19:50:56 -05:00
Bill Burke ebd9bae1ee client to protocol mapping model 2015-02-15 17:01:34 -05:00
Bill Burke 2fb97f058b claim support phase 2 2015-02-14 09:56:19 -05:00
Bill Burke 1b4b7ace8b Merge pull request #974 from girirajsharma/master
Minor changes : Fixed spell/grammatical errors in docbook.
2015-02-14 09:03:45 -05:00
girirajsharma 48b115a4bb Minor changes : Fixed spell/grammatical errors in docbook. 2015-02-14 15:37:25 +05:30
Bill Burke 955a615a22 Merge pull request #973 from patriot1burke/master
claim mapping phase 1
2015-02-13 21:39:34 -05:00
Bill Burke 8586a8d1a5 Merge remote-tracking branch 'upstream/master' 2015-02-13 20:57:51 -05:00
Bill Burke c09b17c2e2 claim mapping phase 1 2015-02-13 20:57:38 -05:00
Marek Posolda 45375a9625 Merge pull request #971 from mposolda/master
Add authenticateByDefault flag to IdentityProviderModel. Automatic kerberos login
2015-02-13 10:25:46 +01:00
mposolda 3ef243dd42 Add authenticateByDefault flag to IdentityProviderModel 2015-02-13 10:08:51 +01:00
mposolda 205f7c5d6b Display error if linking account with kerberos is unsuccessful 2015-02-13 08:13:08 +01:00
Pedro Igor 2b7c7f63b6 Merge pull request #970 from pedroigor/master
[KEYCLOAK-883] - Code cleanup and refactoring.
2015-02-13 01:45:31 -02:00
pedroigor b0fb737de3 [KEYCLOAK-883] - Code cleanup and refactoring. 2015-02-13 01:27:11 -02:00
Bill Burke 7df5a832c9 fix dependency 2015-02-12 12:05:10 -05:00
Bill Burke ed286ba533 Merge pull request #964 from girirajsharma/master
Updated parent POM version for saml sub module in examples-pom module.
2015-02-11 22:13:35 -05:00
Bill Burke 4a1397afd8 Merge pull request #969 from patriot1burke/master
more saml config
2015-02-11 22:13:14 -05:00
Bill Burke 9b053e6918 more saml config 2015-02-11 21:56:16 -05:00
Bill Burke 889fe8dd8c Merge remote-tracking branch 'upstream/master' 2015-02-11 20:54:11 -05:00
Bill Burke 3ff423c3ad saml config 2015-02-11 20:54:01 -05:00
Marek Posolda a5c1e8e27b Merge pull request #968 from mposolda/master
Just display login with warning if Kerberos login failed
2015-02-11 19:12:04 +01:00
mposolda eed54d6198 Just display login with warning if Kerberos login failed 2015-02-11 19:11:03 +01:00
Marek Posolda e63900dac9 Merge pull request #967 from mposolda/master
KEYCLOAK-1037 Bad error message on login form in case of expired code
2015-02-11 18:49:51 +01:00
mposolda 534187f4d7 KEYCLOAK-1037 Bad error message on login form in case of expired code 2015-02-11 18:48:32 +01:00
Marek Posolda 37a8e295bd Merge pull request #966 from mposolda/master
Kerberos broker fixes
2015-02-11 13:13:42 +01:00
mposolda 03d607b022 Fix showing federation links of users in admin console 2015-02-11 13:03:31 +01:00
mposolda 4b637036ac Display error page if kerberos token is unavailable 2015-02-11 12:25:20 +01:00
mposolda 07bda93b81 Support for both SPNEGO and Kerberos mechanisms. Improved logging 2015-02-11 12:25:20 +01:00
girirajsharma c7560cec71 Updated parent POM version for saml sub module in examples-pom module. 2015-02-11 04:53:18 +05:30
Bill Burke 40f2fb91bc Merge pull request #960 from girirajsharma/master
Updated BC provider versions and deprecated CertificateUtil methods.
2015-02-10 17:55:45 -05:00
Bill Burke 988dcfc83d Merge pull request #963 from patriot1burke/master
saml url configuration
2015-02-10 17:55:20 -05:00
Bill Burke 36282d24b5 Merge remote-tracking branch 'upstream/master' 2015-02-10 11:33:33 -05:00
Bill Burke 0e9fcf19e0 saml url support 2015-02-10 11:33:18 -05:00
Marek Posolda 35628174b0 Merge pull request #962 from mposolda/master
KEYCLOAK-1036 Don't allow registration through identity brokering in cas...
2015-02-10 17:05:53 +01:00
mposolda f582250b31 KEYCLOAK-1036 Don't allow registration through identity brokering in case that realm registration is disabled 2015-02-10 16:57:07 +01:00
Pedro Igor 32aa6cdf9b Merge pull request #961 from pedroigor/master
[KEYCLOAK-883] - SAML Brokering Example.
2015-02-10 12:55:10 -02:00
pedroigor 49c3a6308e [KEYCLOAK-883] - SAML Brokering Example. 2015-02-10 12:54:16 -02:00
girirajsharma c3d7ef8066 Updated BC provider versions and deprecated CertificateUtil methods. 2015-02-10 18:44:54 +05:30
Marek Posolda 0b67437fa7 Merge pull request #959 from mposolda/master
KEYCLOAK-1035 Brokered identity linked by account management may not be recognized during login
2015-02-10 13:55:40 +01:00
mposolda 90496f62ac KEYCLOAK-1035 Brokered identity linked by account management may not be recognized during login 2015-02-10 13:54:45 +01:00
mposolda d59a28f1cb Added test for import kerberos model 2015-02-10 13:54:45 +01:00
Marek Posolda b2c0b90d07 Merge pull request #958 from mposolda/master
Kerberos broker - step 1
2015-02-10 09:53:35 +01:00
mposolda 0c2795cf7c KEYCLOAK-828 SPNEGO/Kerberos broker - step 1 2015-02-10 09:50:07 +01:00
mposolda d1c4d9795b Mongo fix 2015-02-10 09:50:07 +01:00
mposolda d523d7f202 Ensure timestamp on clientSession is updated in AccountService when linking identity broker 2015-02-10 09:49:44 +01:00
Pedro Igor 988832e388 Merge pull request #957 from pedroigor/master
[KEYCLOAK-883] - Twitter example.
2015-02-09 21:34:37 -02:00
pedroigor 735b031f26 [KEYCLOAK-883] - Twitter example. 2015-02-09 21:34:10 -02:00
Pedro Igor e84ae5e68d Merge pull request #956 from pedroigor/master
[KEYCLOAK-992] - Storing twitter tokens.
2015-02-09 21:31:56 -02:00
pedroigor 02e9c87fa4 [KEYCLOAK-992] - Storing twitter tokens. 2015-02-09 21:31:16 -02:00
Pedro Igor 36079fc6e6 Merge pull request #955 from pedroigor/master
[KEYCLOAK-883] - Refactoring to services endpoints and exposing them through admin client.
2015-02-09 21:30:42 -02:00
pedroigor ff1f10d7a7 [KEYCLOAK-883] - Refactoring to services endpoints and exposing them through admin client. 2015-02-09 21:30:21 -02:00
Pedro Igor 98c75f162a Merge pull request #954 from pedroigor/master
[KEYCLOAK-992] - More examples. Improving client code.
2015-02-08 22:04:15 -02:00
pedroigor fc4fee1253 [KEYCLOAK-992] - More examples. Improving client code. 2015-02-08 22:02:35 -02:00
Pedro Igor 5a9fcff0fd Merge pull request #953 from pedroigor/master
[KEYCLOAK-883] - Idp hint should be processed firts.
2015-02-08 22:01:59 -02:00
pedroigor cb72fa4788 [KEYCLOAK-883] - Idp hint should be processed firts. 2015-02-08 22:01:30 -02:00
Pedro Igor 916ba57c40 Merge pull request #952 from pedroigor/master
[KEYCKOAK-883] - Adding idpHint config option when configuring login url.
2015-02-08 20:53:29 -02:00
pedroigor 4ce2e76a2d [KEYCKOAK-883] - Adding idpHint config option when configuring login url. 2015-02-08 20:52:44 -02:00
pedroigor 98d8de00d4 [KEYCLOAK-992] - Removing my app credentials. 2015-02-08 03:37:22 -02:00
pedroigor 2c56daf6fd Merge branch 'master' of github.com:keycloak/keycloak 2015-02-08 03:35:21 -02:00
Pedro Igor 670ef4f820 Merge pull request #951 from pedroigor/KEYCLOAK-992
[KEYCLOAK-992] - Initial code for examples. Fixing cors when retreiving tokens.
2015-02-08 03:30:00 -02:00
pedroigor d6c49c4452 [KEYCLOAK-992] - Initial code for examples. Fixing cors when retreiving tokens. 2015-02-08 03:28:37 -02:00
pedroigor 1e13254598 [KEYCLOAK-992] - Initial code for examples. Fixing cors when retreiving tokens. 2015-02-08 03:27:57 -02:00
Pedro Igor e11ebe9971 Merge pull request #950 from pedroigor/KEYCLOAK-992
[KEYCLOAK-992] - Token retrieval from brokered idps.
2015-02-07 00:08:10 -02:00
pedroigor 4b1ba704ec [KEYCLOAK-992] - Token retrieval from brokered idps. 2015-02-06 22:23:34 -02:00
Pedro Igor 9b6254399d Merge pull request #948 from pedroigor/master
[KEYCLOAK-883] - Fixing alias update.
2015-02-06 16:28:21 -02:00
pedroigor 47f8f44347 [KEYCLOAK-883] - Fixing alias update. 2015-02-06 16:03:47 -02:00
Marek Posolda dae6055d85 Merge pull request #949 from mposolda/master
KEYCLOAK-1025 Skip automatic logout from KC admin console for non-author...
2015-02-06 18:54:41 +01:00
mposolda 8b4e724aeb KEYCLOAK-1025 Skip automatic logout from KC admin console for non-authorized users 2015-02-06 18:13:17 +01:00
Bill Burke 9a9f2a17a5 Merge pull request #947 from patriot1burke/master
frontchannel docs
2015-02-06 09:28:25 -05:00
Bill Burke 2a662ad2a6 frontchannel docs 2015-02-06 09:28:00 -05:00
Bill Burke 716d7f6606 Merge pull request #946 from patriot1burke/master
console front channel logout switch
2015-02-06 09:25:00 -05:00
Bill Burke c94e868c63 console front channel logout switch 2015-02-06 09:24:34 -05:00
Stian Thorgersen 27d4a33226 Merge branch 'girirajsharma-master' 2015-02-04 09:03:02 +01:00
Stian Thorgersen 56579fe0f6 Changed syslog event listener id 2015-02-04 09:02:48 +01:00
Stian Thorgersen d44f9446a2 Merge branch 'master' of https://github.com/girirajsharma/keycloak into girirajsharma-master 2015-02-04 09:00:22 +01:00
Marek Posolda 9a1e080025 Merge pull request #944 from EricWittmann/typo-fix-1
fixed a very minor tooltip typo
2015-02-03 22:40:38 +01:00
girirajsharma 30a36498c9 Provided sys-logging provider to enable keycloak events remote logging. 2015-02-04 02:03:57 +05:30
Eric Wittmann c9d7ed5df6 fixed a very minor tooltip typo 2015-02-03 11:59:49 -05:00
mposolda 1d8ebd441d KEYCLOAK-1023 Improve osgi packaging for hawtio. Fix typos in fuse example docs. 2015-02-02 23:25:56 +01:00
Stian Thorgersen 31f399e52a Merge pull request #943 from srose/KEYCLOAK-1020-a
KEYCLOAK-1020, minimal change
2015-02-02 09:23:10 +01:00
Sebastian Rose 0fccac1c68 KEYCLOAK-1020, minimal change 2015-01-31 17:29:36 +01:00
Pedro Igor 1375d50a47 Merge pull request #942 from pedroigor/KEYCLOAK-993
[KEYCLOAK-993] - Set requested scope for social providers.
2015-01-30 16:23:04 -02:00
pedroigor fcc7afcd26 [KEYCLOAK-993] - Set requested scope for social providers. 2015-01-30 16:05:08 -02:00
Pedro Igor e452165c4a Merge pull request #941 from pedroigor/KEYCLOAK-996
[KEYCLOAK-996] - Allow application to select provider.
2015-01-30 14:28:50 -02:00
pedroigor 99a457c5c1 [KEYCLOAK-996] - Allow application to select provider. 2015-01-30 14:02:53 -02:00
Stian Thorgersen 4dfb4a91ea KEYCLOAK-1018 Update JS adapter to use protocol/openid-connect urls 2015-01-30 14:29:58 +01:00
Stian Thorgersen 34fc92c0d3 Merge pull request #934 from girirajsharma/master
Fixed adding right CORS headers to actual and preflight CORS requests.
2015-01-30 14:02:29 +01:00
Stian Thorgersen 8c2ffeb601 Merge pull request #940 from stianst/master
KEYCLOAK-1019 Fix to keycloak.js if auth-server-url ends with '/'
2015-01-30 13:57:20 +01:00
Stian Thorgersen e2998a09b6 KEYCLOAK-1019 Fix to keycloak.js if auth-server-url ends with '/' 2015-01-30 10:02:27 +01:00
girirajsharma 2d6e1048ef Fixed adding right CORS headers to actual and preflight CORS requests. 2015-01-30 13:57:27 +05:30
Pedro Igor 0e344e6461 Merge pull request #939 from pedroigor/KEYCLOAK-883
[KEYCLOAK-883] - Tests.
2015-01-29 16:18:01 -02:00
pedroigor 5fae76c7e4 [KEYCLOAK-883] - Adding tests for update profile. Removing old social related classes. 2015-01-29 16:05:00 -02:00
pedroigor 8fc6368202 [KEYCLOAK-883] - OIDC brokering tests. 2015-01-29 11:57:24 -02:00
Pedro Igor f013796324 Merge pull request #938 from pedroigor/KEYCLOAK-883
[KEYCLOAK-883] - Initial tests for SAML brokering.
2015-01-29 09:11:39 -02:00
pedroigor 1960c608cd [KEYCLOAK-883] - Initial tests for SAML brokering. 2015-01-29 00:04:02 -02:00
Bill Burke b41be304e0 Merge pull request #937 from patriot1burke/master
saml frontchannel logout
2015-01-28 17:34:36 -05:00
Bill Burke fd20a25100 Merge remote-tracking branch 'upstream/master' 2015-01-28 17:09:59 -05:00
Bill Burke ea3bba98aa saml frontchannel logout 2015-01-28 17:09:13 -05:00
Stian Thorgersen 6400e9b978 Fix federation provider example to load users file from it's own ClassLoader instead of Thread CL 2015-01-28 13:23:13 +01:00
Stian Thorgersen 1a913b21c1 Updates to migration guide 2015-01-28 12:04:18 +01:00
Stian Thorgersen 6ecd9fbde7 Merge pull request #936 from stianst/master
Provider loaders
2015-01-28 11:51:05 +01:00
Stian Thorgersen eb695f12f7 KEYCLOAK-1000 Module provider loader 2015-01-28 11:26:46 +01:00
Stian Thorgersen c5bfaa6051 Added provider section to docs 2015-01-28 11:25:27 +01:00
Stian Thorgersen 67ba1de56f KEYCLOAK-999 Load providers from file-system 2015-01-28 09:15:07 +01:00
Pedro Igor 27956d6d2e Merge pull request #935 from pedroigor/KEYCLOAK-883
[KEYCLOAK-883] - Model tests.
2015-01-28 00:07:36 -02:00
pedroigor 2065815627 [KEYCLOAK-883] - Model tests. 2015-01-27 23:53:56 -02:00
Stian Thorgersen 15feb39ecc Update Travis CI config 2015-01-27 13:20:49 +01:00
Stian Thorgersen 594cc23a30 Add travis.yml 2015-01-27 08:51:04 +01:00
Stian Thorgersen 073b63de9e Clear time offset after tests 2015-01-27 08:51:04 +01:00
mposolda 920249b3e8 Fixed test failures caused by uncleared Time offset 2015-01-26 17:07:35 +01:00
Stian Thorgersen a36c651b10 Merge pull request #930 from pedroigor/KEYCLOAK-883
[KEYCLOAK-883] - Fixing addition of 2 providers of the same type.
2015-01-26 09:46:39 +01:00
Stian Thorgersen 7a7ca59685 Merge pull request #928 from pedroigor/KEYCLOAK-997
[KEYCLOAK-997] - Redirect directly to provider if password login is disa...
2015-01-26 08:48:08 +01:00
pedroigor 54c9efaf0d [KEYCLOAK-883] - Fixing addition of 2 providers of the same type. 2015-01-23 19:46:39 -02:00
pedroigor c2ba2a70ce [KEYCLOAK-997] - Redirect directly to provider if password login is disabled and there's only one provider. 2015-01-23 18:20:19 -02:00
mposolda ee4fbca868 Improve OOTB experience for ssh and jmx authentication in fuse 2015-01-23 20:57:40 +01:00
Stian Thorgersen 71b36ceb07 Merge pull request #927 from pedroigor/KEYCLOAK-986
[KEYCLOAK-986] - Escape characters when doing SAML POST Binding.
2015-01-23 15:12:01 +01:00
pedroigor edecda8599 [KEYCLOAK-986] - Escape characters when doing SAML POST Binding. 2015-01-23 12:09:44 -02:00
Marek Posolda 31de0112d8 Merge pull request #926 from mposolda/master
KEYCLOAK-1008 Mongo: Migrate social data from 1.1 database to identity f...
2015-01-23 13:02:50 +01:00
mposolda eaae4eb986 KEYCLOAK-1008 Mongo: Migrate social data from 1.1 database to identity federation data 2015-01-23 13:01:39 +01:00
Marek Posolda 3631635487 Merge pull request #925 from mposolda/master
Fix mongo model
2015-01-23 10:20:44 +01:00
mposolda a634f1a65f Fix mongo model 2015-01-23 10:19:06 +01:00
Stian Thorgersen 72b4790c4f Merge pull request #922 from pedroigor/KEYCLOAK-883
[KEYCLOAK-883] - More SAML configuration. Using SAML builders to create AuthnRequest.
2015-01-22 12:26:19 +01:00
Stian Thorgersen 7be2c9d15c Merge pull request #923 from pedroigor/KEYCLOAK-987
[KEYCLOAK-987] - IdP should respect the protocol binding when processing AuthnRequest.
2015-01-22 12:25:52 +01:00
pedroigor d1f38a4236 [KEYCLOAK-987] - IdP should respect the protocol binding when processing AuthnRequest. 2015-01-21 23:53:56 -02:00
pedroigor b9a7594113 [KEYCLOAK-883] - More SAML configuration. Using SAML builders to create AuthnRequest. 2015-01-21 23:40:20 -02:00
Marek Posolda da240b2b36 Merge pull request #920 from girirajsharma/master
Fixed KeyCloak relative URI optimization with auth-server-url in docbook
2015-01-21 17:13:26 +01:00
mposolda efb6ec8099 Added docs and example for SSH and JMX authentication on fuse 2015-01-21 13:43:38 +01:00
Stian Thorgersen f31bece1b9 KEYCLOAK-980 Password reset is possible with expired link 2015-01-21 13:11:06 +01:00
Stian Thorgersen e7a792f922 KEYCLOAK-983 Fix login after reset-password 2015-01-21 12:28:30 +01:00
mposolda 715482e371 Have fuse example working on newest fuse 6.2. Refactoring of ServletReregistrationService to work on fuse 6.1, 6.2 and karaf 3.0.2 2015-01-20 21:45:08 +01:00
girirajsharma 10c9b9b0b9 Updated KeyCloak relative URI as per scheme, host and port of request. 2015-01-21 01:27:42 +05:30
Bill Burke f454e5ae12 Merge pull request #921 from patriot1burke/master
logout via redirect - step 1
2015-01-20 10:57:04 -05:00
Bill Burke c5303df4fc merge 2015-01-20 10:55:04 -05:00
Bill Burke 24de9e932f ?? 2015-01-20 10:47:03 -05:00
girirajsharma 6088fddf94 Fixed KeyCloak relative URI optimization with auth-server-url in docbook 2015-01-20 20:21:59 +05:30
Stian Thorgersen c8d879a82d KEYCLOAK-977 Use reflection to find constructor for JBossGenericPrincipal to support EAP 6.4 2015-01-20 13:24:58 +01:00
mposolda f592e8b499 KEYCLOAK-981 Module org.picketlink.federation.bindings doesn't work with EAP6 2015-01-20 11:58:56 +01:00
mposolda 1119bb5b8b Fix SAML examples. Fix links in README files for SAML examples 2015-01-20 11:58:38 +01:00
Stian Thorgersen 40ec9da797 KEYCLOAK-975 Client/app secret should be read-only, not disabled 2015-01-19 14:08:14 +01:00
mposolda c0a928e6d0 Update instructions for fuse demo 2015-01-19 13:23:29 +01:00
Stian Thorgersen 981d50d082 Fix OAuthRedirectUriTest 2015-01-19 12:20:58 +01:00
Bill Burke 42bdb7731d Merge pull request #916 from jimmidyson/spring-boot-integration
Spring boot adapter
2015-01-16 19:01:04 -05:00
Bill Burke 8b6a3ad8e4 Merge remote-tracking branch 'upstream/master' 2015-01-16 18:58:01 -05:00
Bill Burke a0ba6d2c16 saml redirect logout 1st step 2015-01-16 18:57:33 -05:00
Bill Burke ef2698936b Merge pull request #919 from pedroigor/KEYCLOAK-884
[KEYCLOAK-884] - OpenID Connect UserInfo Endpoint.
2015-01-16 14:28:30 -05:00
pedroigor 4f432775ed [KEYCLOAK-884] - OpenID Connect UserInfo Endpoint. 2015-01-16 15:45:27 -02:00
mposolda 7be7001f4b Remove references about installing auth-server on JBoss AS 7.1.1 2015-01-16 18:02:31 +01:00
mposolda 2e04ac549e Make it easier to run demo on different host then auth-server 2015-01-16 18:02:23 +01:00
Jimmi Dyson 7483663194 Update Spring Boot documentation to show how to use Spring Boot keycloak
adapter with multiple security constraints.
2015-01-16 12:43:47 +00:00
Jimmi Dyson 81849ae631 Configure resource constraints via Spring Boot properties 2015-01-16 12:43:47 +00:00
Jimmi Dyson c4361e5695 Add documentation 2015-01-16 12:43:43 +00:00
Jimmi Dyson a5246b8075 Working external configuration through Spring Boot application.properties 2015-01-16 12:42:59 +00:00
Jimmi Dyson 273e945850 First stab - now just to make it configurable 2015-01-16 12:42:54 +00:00
Stian Thorgersen ef0201718f Fix OAuthRedirectUriTest 2015-01-16 13:22:12 +01:00
Stian Thorgersen cb91b862aa KEYCLOAK-967 Username is displayed as undefined in Cordova example 2015-01-16 13:22:12 +01:00
mposolda e4a8ced8b0 KEYCLOAK-974 ServerVersionResource doesn't handle cors requests 2015-01-16 12:57:08 +01:00
Stian Thorgersen a5b348dfba KEYCLOAK-964 JS Console has two tabs for Show ID Token 2015-01-16 11:27:33 +01:00
Stian Thorgersen 8828d6e2f1 KEYCLOAK-965 NPE in TokenManager.verifyAccess if application is deleted 2015-01-16 11:25:05 +01:00
Stian Thorgersen bf6c46da1c KEYCLOAK-962 Changed access token request to use redirect_uri from initial request instead of the resolved redirect_uri 2015-01-16 11:01:03 +01:00
Stian Thorgersen 768898a06e KEYCLOAK-963 Change code output to single-line for 'urn:ietf:wg:oauth:2.0:oob' 2015-01-16 10:16:08 +01:00
Marek Posolda ba0dc06252 Merge pull request #918 from mposolda/master
Fuse/Karaf adapter, demo example and documentation
2015-01-15 20:32:44 +01:00
mposolda 522e24017c Rebase with master 2015-01-15 20:29:34 +01:00
mposolda ad31b3dd2e Typo in packaging 2015-01-15 19:50:38 +01:00
mposolda 7faee110d5 KEYCLOAK-853 Documentation for login modules 2015-01-15 19:03:11 +01:00
mposolda aacbdf5748 Documentation for fuse adapter and example 2015-01-15 19:02:58 +01:00
mposolda d928c26e27 KEYCLOAK-539 Fuse adapter. OSGI bundling. OSGI headers in keycloak adapter maven artifacts. Rename package in jetty-core 2015-01-15 19:02:45 +01:00
Stian Thorgersen e4b7dd2df3 KEYCLOAK-960 Fix pagination of app sessions 2015-01-15 14:03:01 +01:00
Stian Thorgersen 7ccea2bd10 KEYCLOAK-958 Support role names with '/' and '\' 2015-01-15 12:22:14 +01:00
Stian Thorgersen 82a7471042 KEYCLOAK-959 Warning message in server log after logging out all sessions 2015-01-15 09:55:10 +01:00
Stian Thorgersen c3c6d4cbba Add redirect_uri to access token request in keycloak.js 2015-01-14 15:18:22 +01:00
Stian Thorgersen b16845a09e KEYCLOAK-955 Fix AeroGear project integration example 2015-01-14 14:32:03 +01:00
Stian Thorgersen 29b8c2c924 KEYCLOAK-949 Disabled user with wrong credentials receive wrong error message 2015-01-14 10:10:53 +01:00
Stian Thorgersen abd5967be3 KEYCLOAK-957 Access Token Request does not verify redirect_uri 2015-01-14 09:59:21 +01:00
Michael Gerber 3be74cda30 check if email is null 2015-01-14 09:18:05 +01:00
Stian Thorgersen 25daf5c45e Merge pull request #915 from girirajsharma/master
Minor changes : Fixed spell/grammatical errors in docbook.
2015-01-14 09:13:03 +01:00
girirajsharma 7cf1161305 Minor changes : Fixed spell/grammatical errors in docbook. 2015-01-14 00:20:44 +05:30
Stian Thorgersen e796c11b64 Merge pull request #913 from pedroigor/KEYCLOAK-883
[KEYCLOAK-883] - Initial changes.
2015-01-13 15:16:17 +01:00
pedroigor fa2533ed11 [KEYCLOAK-883] - Initial changes. 2015-01-13 00:58:19 -02:00
Stian Thorgersen 959933a227 Version bump 2015-01-12 10:35:50 +01:00
Stian Thorgersen de566ec741 Merge pull request #912 from gerbermichi/login-hint
Pass login_hint param to Keycloak login page
2015-01-12 10:35:12 +01:00
Michael Gerber 9c484b9938 add test 2015-01-09 14:03:36 +01:00
Michael Gerber 7ce1502bc5 pass login_hint parameter to the keycloak login page 2015-01-09 11:58:44 +01:00
Marek Posolda 78d5b09b4b Merge pull request #911 from mposolda/master
Fix resolving of current hostname and logout bug
2015-01-08 11:44:08 +01:00
mposolda fff8ae9f8a KEYCLOAK-942 Incorrect condition in ResourceAdminManager could cause global logout 2015-01-08 11:09:11 +01:00
mposolda e62858cefd KEYCLOAK-900 Fix resolving of current hostname 2015-01-08 11:09:11 +01:00
Stian Thorgersen 526e25abc7 Fixes for commons-io dep issues in KeycloakServer 2015-01-08 09:53:43 +01:00
Bill Burke dc94fac9f5 Merge pull request #910 from patriot1burke/master
saml persistent and transient id support
2015-01-07 19:31:43 -05:00
Bill Burke 110783ff2f Merge remote-tracking branch 'upstream/master' 2015-01-07 19:23:47 -05:00
Bill Burke 795b1d2893 saml persistent and transient id support 2015-01-07 19:23:33 -05:00
Stian Thorgersen b7dae5c88f Fixes for regression introduced by KEYCLOAK-923 2015-01-07 14:54:18 +01:00
Stian Thorgersen 37d6a79205 Merge pull request #909 from pedroigor/master
[KEYCLOAK-928] - Validate duplicated emails when updating profile.
2015-01-07 14:20:02 +01:00
pedroigor c4892428ae [KEYCLOAK-928] - Validate duplicated emails when updating profile. 2015-01-07 11:09:40 -02:00
Stian Thorgersen 2b1ae89608 KEYCLOAK-933 expose-token setting not working - empty string returned instead of token 2015-01-07 12:58:42 +01:00
Bill Burke 2a7fc53300 Merge pull request #908 from patriot1burke/master
fix cached principal adapter
2015-01-06 15:57:56 -05:00
Marek Posolda f4c06b7cd0 Merge pull request #907 from mposolda/master
KEYCLOAK-929 Don't remove principal on session passivation
2015-01-06 19:57:32 +01:00
Bill Burke 0f4953dcd2 fix cached principal adapter 2015-01-06 13:47:02 -05:00
mposolda c7b0c4fb05 KEYCLOAK-929 Don't remove principal on session passivation 2015-01-06 19:44:07 +01:00
Stian Thorgersen 6aa0cb5e3d Merge pull request #906 from gerbermichi/email-event
add error event if mail can not be send
2015-01-06 13:45:30 +01:00
Michael Gerber 181c1c8b5b add error event if mail can not be send 2015-01-06 13:02:27 +01:00
Stian Thorgersen 74ba508e4a KEYCLOAK-918 Reverse proxy triggers NPE in undertow adapter 2015-01-06 10:14:57 +01:00
Stian Thorgersen 992455e273 KEYCLOAK-923 Login redirect should support query param in keycloak.js 2015-01-06 09:56:03 +01:00
Stian Thorgersen 6c8013182b Merge branch 'gerbermichi-reset-password' 2015-01-05 14:34:57 +01:00
Stian Thorgersen 45a1f4361e Add test 2015-01-05 14:34:08 +01:00
Stian Thorgersen 39daeca09c Merge branch 'reset-password' of https://github.com/gerbermichi/keycloak into gerbermichi-reset-password 2015-01-05 14:26:51 +01:00
gerbermichi 0c73e67372 a disabled user should not receive an email to reset the password 2015-01-05 14:07:03 +01:00
Stian Thorgersen 628437c146 KEYCLOAK-760 OAuth2 refresh token expiration date 2015-01-05 10:50:50 +01:00
Stian Thorgersen 528196f786 Merge pull request #903 from gerbermichi/reset-password-email-feature
Add redirect URI to the reset password email web service
2015-01-05 08:59:19 +01:00
Michael Gerber ec1499cdf6 Merge remote-tracking branch 'upstream/master' into reset-password-email-feature 2015-01-02 14:11:51 +01:00
Michael Gerber 019bb558d1 reset-password-email with redirect_uri and client_id 2015-01-02 14:10:44 +01:00
Stian Thorgersen 6462da2c72 Merge pull request #902 from gerbermichi/reset-password-email-fix
fix reset-password-email
2015-01-02 13:51:08 +01:00
Stian Thorgersen d1119a1c26 KEYCLOAK-830
RestEasy client proxy NullPointerException with Keycloak
2015-01-02 12:52:39 +01:00
Michael Gerber 53e18b3ebe fix reset-password-email 2015-01-02 12:52:21 +01:00
Stian Thorgersen f97b71c207 KEYCLOAK-903
No client session for direct grant
2014-12-30 13:28:08 +01:00
Stian Thorgersen a367473386 KEYCLOAK-902 State should not be required 2014-12-30 10:38:08 +01:00
Stian Thorgersen f157dd7915 Updated instructions to test on PostgreSQL 2014-12-30 10:05:27 +01:00
Stian Thorgersen 2eb2ec50e3 KEYCLOAK-885 Support Liquibase updateSQL 2014-12-29 14:40:00 +01:00
Stian Thorgersen 9d63482759 KEYCLOAK-869 Rename EventEntity time column to entity_time 2014-12-29 14:39:42 +01:00
Stian Thorgersen ebf85cf04b Add test to add/remove RequiredAction to UserTest 2014-12-29 08:56:23 +01:00
Bill Burke 3a9a7976fa Merge pull request #901 from patriot1burke/master
error page adapter support
2014-12-23 16:33:29 -05:00
Bill Burke ec9ce6ef2f error page adapter support 2014-12-23 16:33:08 -05:00
Bill Burke 30cfabb08d Merge pull request #900 from patriot1burke/master
update wildfly distro
2014-12-22 16:40:54 -05:00
Bill Burke a280c11897 update wildfly distro 2014-12-22 16:40:29 -05:00
Bill Burke 358f968429 Merge pull request #899 from patriot1burke/master
RESTEASY-901
2014-12-22 16:06:52 -05:00
Bill Burke e39ea2adaf remove redundant tests 2014-12-22 16:06:19 -05:00
Bill Burke 8a1b7e39af RESTEASY-901 2014-12-22 15:59:25 -05:00
Bill Burke af3efa547c Merge pull request #898 from gerbermichi/master
Fix the java.lang.NoClassDefFoundError: org/xnio/OptionMap error
2014-12-22 14:01:26 -05:00
Bill Burke fdbe5c879e Merge pull request #896 from ssilvert/fix-demo-readme
Fix demo readme.
2014-12-22 10:38:14 -05:00
Michael Gerber 3be930f6cf Not required authentication test cases 2014-12-21 15:32:36 +01:00
Michael Gerber bcbb658ae4 Not required authentication bugfix 2014-12-20 14:16:29 +01:00
Michael Gerber 512a68c5fa Not required authentication bugfix 2014-12-20 14:12:35 +01:00
gerbermichi 1eaafcd3d9 bugfix for excluded post rest services 2014-12-19 16:55:46 +01:00
gerbermichi 2a33b177d5 fix nio bug 2014-12-18 16:58:36 +01:00
gerbermichi 1cbf5a5d99 Merge remote-tracking branch 'upstream/master' 2014-12-18 07:54:23 +01:00
Bill Burke 28a56289d9 Merge pull request #897 from patriot1burke/master
saved requests
2014-12-17 22:29:46 -05:00
Bill Burke 08be04b337 saved requests 2014-12-17 22:29:18 -05:00
Bill Burke 519d051eb0 Merge pull request #895 from ssilvert/KEYCLOAK-880-props-in-subsys
KEYCLOAK-880 Fix use of ${..} props in subsystem XML
2014-12-17 16:08:12 -05:00
Stan Silvert fe10913780 Fix demo readme. 2014-12-17 15:55:32 -05:00
Stan Silvert 0082892f7c KEYCLOAK-880 Fix use of ${..} props in subsystem XML 2014-12-17 15:40:02 -05:00
Stian Thorgersen 3a9de56f9c KEYCLOAK-869 Time field in EventEntity should be escaped 2014-12-17 15:04:53 +01:00
Stian Thorgersen e174802b0d KEYCLOAK-825
Log out user sessions on password reset
2014-12-17 14:54:33 +01:00
Stian Thorgersen e42fe6fb23 KEYCLOAK-891 Create server info page on admin console 2014-12-17 13:24:47 +01:00
Stian Thorgersen 6cf42db584 KEYCLOAK-891 Create server info page on admin console 2014-12-17 13:21:31 +01:00
gerbermichi 2186fe32a9 Bugfix: Can not read keycloak-server.json if the path contains a space
https://issues.jboss.org/browse/KEYCLOAK-892
2014-12-17 12:32:06 +01:00
Stian Thorgersen 7886d2aecc Merge pull request #894 from stianst/master
KEYCLOAK-895 Document polyfillers for IE9 compatibility in keycloak.js
2014-12-17 12:16:21 +01:00
Stian Thorgersen 2030ab159d KEYCLOAK-895 Document polyfillers for IE9 compatibility in keycloak.js 2014-12-17 12:15:46 +01:00
Stian Thorgersen ee62f5b1a1 Merge pull request #891 from nilspreusker/ie9-compatibility
IE9 Compatibility
2014-12-17 10:56:14 +01:00
gerbermichi 0755cb6996 Bugfix: Can not read keycloak-server.json if the path contains a space
https://issues.jboss.org/browse/KEYCLOAK-892
2014-12-16 18:54:48 +01:00
gerbermichi 1650cb33c6 Merge remote-tracking branch 'upstream/master' 2014-12-16 18:50:52 +01:00
gerbermichi c34b3a8017 Bugfix: Can not read keycloak-server.json if the path contains a space
https://issues.jboss.org/browse/KEYCLOAK-892
2014-12-16 18:44:09 +01:00
Bill Burke 000a85fe99 Merge pull request #892 from patriot1burke/master
common eap code
2014-12-16 12:27:32 -05:00
Bill Burke 17a8a92bb3 common eap code 2014-12-16 12:26:56 -05:00
Nils Preusker ce1fd8eedc using JSON.stringify(...) and JSON.parse(...)
see
http://lists.jboss.org/pipermail/keycloak-user/2014-December/thread.html
#1355
2014-12-16 16:14:13 +01:00
Stian Thorgersen 919a4c661b Merge pull request #890 from stianst/master
KEYCLOAK-874
2014-12-16 15:31:33 +01:00
Stian Thorgersen cf11911f6b KEYCLOAK-874
keycloak-example-themes-dist:zip:1.1.0.Beta2 does not exist
2014-12-16 15:31:02 +01:00
Stian Thorgersen f620b04656 Merge pull request #888 from gerbermichi/master
Bugfix: Changed timezone to GMT so IE can store cookie
2014-12-16 14:38:08 +01:00
Marek Posolda a3f5ace895 Merge pull request #889 from mposolda/master
Minor improvements/fixes in documentation
2014-12-16 14:22:25 +01:00
mposolda fbe26e28f1 Minor improvements/fixes in documentation 2014-12-16 14:04:04 +01:00
Michael Gerber 9169a3df76 IE 11 does not store cookie because of wrong time zone
https://issues.jboss.org/browse/KEYCLOAK-875
2014-12-13 21:24:49 +01:00
Marek Posolda 5ee0827a84 Merge pull request #887 from mposolda/master
KEYCLOAK-879 Added missing transport element in clustering documentation
2014-12-12 12:20:06 +01:00
mposolda c4462c6de7 KEYCLOAK-879 Added missing transport element in clustering documentation 2014-12-12 12:19:24 +01:00
Bill Burke 4c6f1b6a60 Merge pull request #886 from patriot1burke/master
bump
2014-12-05 21:10:45 -05:00
Bill Burke 6c04e26376 bump 2014-12-05 21:09:38 -05:00
Bill Burke 2ba266c98a Merge pull request #885 from patriot1burke/master
bump version
2014-12-05 19:04:00 -05:00
Bill Burke c0059a875b bump version 2014-12-05 19:03:13 -05:00
Bill Burke 541f23e1bb Merge pull request #884 from patriot1burke/master
rm adapters from appliance/war-dist
2014-12-05 18:33:12 -05:00
Bill Burke b768d593a2 rm adapters from appliance/war-dist 2014-12-05 18:30:41 -05:00
Bill Burke f5fe5c8d73 Merge pull request #883 from patriot1burke/master
proxy fixes
2014-12-05 17:47:14 -05:00
Bill Burke 2350baee14 Merge remote-tracking branch 'upstream/master' 2014-12-05 17:39:12 -05:00
Bill Burke 38073d2aaa fix proxy 2014-12-05 17:38:56 -05:00
Bill Burke 78be1280d3 Merge pull request #880 from ssilvert/master
Restore old AS7 subsystem
2014-12-04 19:25:22 -05:00
Stan Silvert 952436f129 Restore old AS7 subystem. 2014-12-04 14:53:50 -05:00
Stan Silvert a3002cfee6 Remove keycloak subsystem from AS7 dist. 2014-12-04 14:53:49 -05:00
Bill Burke 85ee8f2d43 Merge pull request #882 from patriot1burke/master
bump undertow version
2014-12-04 10:18:46 -05:00
Bill Burke e94f7ca741 bump undertow version 2014-12-04 10:18:16 -05:00
Stian Thorgersen 7de0c8f78b Merge pull request #881 from rexorient/master
Added CORS preflight support for realms/<realm>/tokens/refresh
2014-12-03 08:39:29 +01:00
apenders f3adf02eea Added CORS preflight support for realms/<realm>/tokens/refresh 2014-12-02 15:33:15 -07:00
Marek Posolda f240b60d4b Merge pull request #879 from mposolda/master
Fix osgi packaging
2014-12-02 21:34:25 +01:00
mposolda cd8bee8e29 Fix osgi packaging 2014-12-02 21:33:22 +01:00
Bill Burke 2195c35c70 Merge pull request #878 from patriot1burke/master
adapter testsuite port
2014-12-02 14:39:58 -05:00
Bill Burke 090162ce8a Merge remote-tracking branch 'upstream/master' 2014-12-02 14:38:57 -05:00
Bill Burke 82c3e4c1bc adapter testsuite port and adapter fixes 2014-12-02 14:38:33 -05:00
Marek Posolda e963f7c905 Merge pull request #877 from mposolda/master
Fix eap63 distribution and docker-cluster tool
2014-12-02 20:31:03 +01:00
mposolda 2802ad4ad5 Fix eap63 distribution and docker-cluster tool 2014-12-02 20:28:27 +01:00
Marek Posolda 8eed641f79 Merge pull request #876 from mposolda/master
KEYCLOAK-863 Osgi packaging for karaf/fuse
2014-12-01 15:12:59 +01:00
mposolda bfab7361f4 KEYCLOAK-863 Osgi packaging for karaf/fuse 2014-12-01 15:10:19 +01:00
Stian Thorgersen 4afcbc0610 Merge branch 'objectiser-RTGOV-620' 2014-12-01 13:47:33 +01:00
Stian Thorgersen e069f303a4 Added full scope to app in JaxrsBasicAuthTest 2014-12-01 13:39:19 +01:00
objectiser 8e01f8ecf1 KEYCLOAK-861 Support basic authentication against user credentials managed by KeyCloak. 2014-12-01 11:43:19 +00:00
Marek Posolda 3e8495f435 Merge pull request #875 from mposolda/master
Allow login modules to be more flexible
2014-11-28 20:08:41 +01:00
mposolda c5d000cefc Allow login modules to be more flexible 2014-11-28 20:06:18 +01:00
Stian Thorgersen 5c2e7df7de Merge pull request #873 from stianst/master
Use HmacSHA256 for code signatures
2014-11-27 10:34:51 +01:00
Stian Thorgersen c1360270d0 Ignore ProxyTest 2014-11-27 10:33:54 +01:00
Stian Thorgersen a843e31c12 KEYCLOAK-862 Use HmacSHA256 for code signatures 2014-11-27 10:02:08 +01:00
Stian Thorgersen 6b3e7c76bd Merge pull request #870 from ssilvert/eap-subsys
KEYCLOAK-856 Merge WildFly and EAP subsystems
2014-11-27 10:02:01 +01:00
Bill Burke fde8316693 Merge pull request #872 from patriot1burke/master
proxy headers
2014-11-25 15:14:01 -05:00
Bill Burke 7d4f28f52d proxy headers 2014-11-25 15:13:11 -05:00
Bill Burke 8c451af3f5 Merge pull request #871 from patriot1burke/master
proxy distro and docs
2014-11-24 19:22:44 -05:00
Bill Burke e14c5adf55 Merge remote-tracking branch 'upstream/master' 2014-11-24 19:16:34 -05:00
Bill Burke cdd751a38b proxy docs 2014-11-24 19:16:20 -05:00
Bill Burke d7dfacabfa proxy testing 2014-11-24 18:31:05 -05:00
Bill Burke d0856e024f proxy distro 2014-11-24 18:12:17 -05:00
Stan Silvert 0e58378489 KEYCLOAK-856 Update docs 2014-11-24 17:22:22 -05:00
Stan Silvert d53b01eb2b KEYCLOAK-856 Rename wildfly-subsystem to keycloak-subsystem 2014-11-24 16:52:16 -05:00
Marek Posolda ba9c3c9142 Merge pull request #869 from mposolda/master
KEYCLOAK-859 Added DirectAccessGrantsLoginModule
2014-11-24 19:08:53 +01:00
mposolda 2a78d0d4d0 KEYCLOAK-859 Added DirectAccessGrantsLoginModule 2014-11-24 18:56:51 +01:00
Stan Silvert 34e18c176d KEYCLOAK-856 Remove EAP subsystem 2014-11-23 09:35:19 -05:00
Bill Burke a6f231abbf Merge pull request #868 from patriot1burke/master
proxy config
2014-11-21 18:53:23 -05:00
Bill Burke 4bad1fea86 Merge remote-tracking branch 'upstream/master' 2014-11-21 18:45:02 -05:00
Bill Burke bc6e7c249b proxy config 2 2014-11-21 18:44:39 -05:00
Marek Posolda 21eb40e2c2 Merge pull request #867 from mposolda/master
KEYCLOAK-858 avoid creating inner DeploymentDelegate for each request
2014-11-21 23:50:20 +01:00
mposolda f1378a6092 KEYCLOAK-858 avoid creating inner DeploymentDelegate for each request 2014-11-21 23:49:29 +01:00
Marek Posolda e0d884ac1a Merge pull request #866 from mposolda/master
KEYCLOAK-857 add getter/setter for principalAttribute to AdapterDeployme...
2014-11-21 22:52:39 +01:00
mposolda 829f9f4386 KEYCLOAK-857 add getter/setter for principalAttribute to AdapterDeploymentContext 2014-11-21 22:51:22 +01:00
Stan Silvert f537661341 KEYCLOAK-856 Merge WildFly and EAP subsystems 2014-11-21 13:33:14 -05:00
Marek Posolda 8abbcca76b Merge pull request #865 from mposolda/master
Minor fixes in testsuite
2014-11-21 17:46:58 +01:00
mposolda e3e47a9246 Fix location of Tomcat6 home to be inside target 2014-11-21 17:34:30 +01:00
mposolda 96d430cd7e Fix CookieTokenStoreAdapterTest sometimes failing 2014-11-21 17:34:30 +01:00
Bill Burke b53707a129 Merge pull request #864 from patriot1burke/master
proxy constraints
2014-11-21 11:21:23 -05:00
Bill Burke 3a95401086 proxy constraints 2014-11-21 11:20:47 -05:00
Bill Burke 0143d71728 Merge pull request #863 from patriot1burke/master
proxy
2014-11-20 21:55:49 -05:00
Bill Burke 21279fc9ed proxy 2014-11-20 21:48:59 -05:00
Stian Thorgersen 0327bc0d5a Merge pull request #862 from stianst/master
KEYCLOAK-791 Denial of Service by invalid character injection
2014-11-18 14:59:01 +01:00
Stian Thorgersen ed1073ca92 KEYCLOAK-791 Denial of Service by invalid character injection 2014-11-18 14:58:20 +01:00
Bill Burke ca946d4b19 Merge pull request #860 from carljmosca/master
added support for Tivoli LDAP unique identifier
2014-11-17 10:52:50 -05:00
Bill Burke 7244e2f173 Merge pull request #859 from patriot1burke/master
tomcat6
2014-11-15 12:00:18 -05:00
Bill Burke 5be045c42b tomcat6 2014-11-15 11:59:33 -05:00
Marek Posolda a991ccf909 Merge pull request #858 from mposolda/master
Fixes to login module
2014-11-15 00:14:57 +01:00
mposolda b08930961f Fixes to login module 2014-11-14 21:06:07 +01:00
Bill Burke e01c634ed7 Merge remote-tracking branch 'upstream/master' 2014-11-14 09:20:17 -05:00
Bill Burke 46983d68f3 move ServerCookie to core 2014-11-14 09:20:03 -05:00
Marek Posolda 4ebca3ca43 Merge pull request #857 from mposolda/master
KEYCLOAK-853 Added jaas login module BearerTokenLoginModule
2014-11-14 13:40:58 +01:00
mposolda 68bff44b2e KEYCLOAK-853 Added jaas login module BearerTokenLoginModule 2014-11-14 13:40:12 +01:00
Carl J. Mosca aedbb8eb87 added support for Tivoli LDAP unique identifier 2014-11-13 16:17:40 -05:00
Bill Burke 41c6aacce8 Merge pull request #856 from patriot1burke/master
tomcat 8
2014-11-12 19:04:04 -05:00
Bill Burke a65560c5e6 tomcat8 2014-11-12 19:03:22 -05:00
Bill Burke e2045907d4 tomcat8 2014-11-12 18:56:18 -05:00
Bill Burke f552057b06 Merge remote-tracking branch 'upstream/master' 2014-11-12 15:38:05 -05:00
Bill Burke 81dc076bae Merge pull request #855 from ssilvert/subsys-enhancements
KEYCLOAK-839 Auth Server overlay enhancements
2014-11-12 15:37:39 -05:00
Stan Silvert 67c0182a49 KEYCLOAK-839 Auth Server overlay enhancements 2014-11-12 13:39:39 -05:00
Stan Silvert c85a31be7f KEYCLOAK-839 Auth Server overlay enhancements 2014-11-12 13:39:38 -05:00
Bill Burke ac2b8af172 overview update 2014-11-12 11:00:48 -05:00
Bill Burke 8b515ae625 Merge pull request #854 from patriot1burke/master
jetty 8 support
2014-11-12 10:44:53 -05:00
Bill Burke 9a622a05b1 jetty 8 docs 2014-11-12 10:44:20 -05:00
Bill Burke eccb295076 fix jsps with bad import 2014-11-12 10:34:21 -05:00
Bill Burke dd8c40b0d8 last jetty8 stuff 2014-11-12 10:32:37 -05:00
Bill Burke 25740508b5 fix artifact 2014-11-12 10:08:42 -05:00
Bill Burke 7f23c0dff8 Merge pull request #853 from patriot1burke/master
fix JWS impl, fix contributor SAML PR
2014-11-11 22:10:10 -05:00
Bill Burke 5c6dd8e0c3 temp fix for contributor SAML PR 2014-11-11 22:09:38 -05:00
Bill Burke 3b347d5f52 Merge remote-tracking branch 'upstream/master' 2014-11-11 21:28:49 -05:00
Bill Burke 0636cd898f fix incorrect JWS implementation 2014-11-11 21:28:35 -05:00
Bill Burke 43cb52b319 Merge pull request #852 from eivim/master
Add SAML NameID Formats and include certificate in signature
2014-11-11 20:42:29 -05:00
Eivind Mikkelsen 24a2773524 Add SAML NameID Formats and include certificate in signature
The NameID Format in the AuthnRequest NameIDPolicy is now respected,
and support has been added for the following NameID Formats:

  - urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified
  - urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress
  - urn:oasis:names:tc:SAML:2.0:nameid-format:transient

The persistent NameID format was previously used in all responses
and mapped to the principal's username. Now, unspecified is mapped
to the principal's username and used by default if no NameIDPolicy
is specified by the SP.

The persistent format requires generating a pseudo-random identifier
that must be generated by the IdP on first login and stored in the
user's profile. Persistent NameID Format is not yet implemented.

The certificate is now added to the signature to enable support for
integration with Service Providers where only the IdP's certificate
fingerprint is configured (e.g. Zendesk).
2014-11-12 01:24:51 +01:00
Marek Posolda 7f29d4c247 Merge pull request #851 from mposolda/pl-upgrade
PL upgrade to 2.7.0.CR2 and ldap improvements
2014-11-11 15:20:46 +01:00
mposolda 279a70bcb8 Fix failing tests 2014-11-11 15:17:32 +01:00
mposolda 2f0498bb7f KEYCLOAK-827 add entryDN as one of attributes, which can be mapped to username 2014-11-11 13:20:12 +01:00
mposolda 64e777a4f4 Upgrade to picketlink 2.7.0.CR2 and minor LDAP improvements 2014-11-11 12:58:49 +01:00
Bill Burke 3fd8cd66d6 Merge pull request #850 from patriot1burke/master
update readme
2014-11-10 17:11:29 -05:00
Bill Burke d72bcebdf0 update readme 2014-11-10 17:11:07 -05:00
Bill Burke 7e9dbce259 Merge pull request #849 from patriot1burke/master
jetty 8
2014-11-10 17:09:39 -05:00
Bill Burke 3b6f10913c merge 2014-11-10 17:09:00 -05:00
Bill Burke 3fbffc9d7d jetty 8 2014-11-10 16:59:31 -05:00
Marek Posolda b4e0a1e6f5 Merge pull request #848 from mposolda/fuse
KEYCLOAK-835 KEYCLOAK-836
2014-11-10 22:26:11 +01:00
mposolda 63198288df Add jetty modules to distribution 2014-11-10 22:16:20 +01:00
mposolda 07fd8ae9d7 KEYCLOAK-836 Added OsgiJaxrsBearerTokenFilterImpl to be used in fuse 2014-11-10 22:16:20 +01:00
mposolda a94ab5883d KEYCLOAK-835 Move AdapterConstants to different package 2014-11-10 22:16:20 +01:00
mposolda d1e819cef1 KEYCLOAK-836 Refactoring of JaxrsBearerTokenFilter to work with both resteasy and Apache CXF. Added test 2014-11-10 22:16:14 +01:00
Bill Burke ebb795af5a Merge pull request #847 from patriot1burke/master
Jetty 9.x adapters
2014-11-07 21:11:24 -05:00
Bill Burke b0a5161e6b final jetty stuff 2014-11-07 21:10:15 -05:00
Bill Burke 3805510e20 more jetty adapter 2014-11-07 18:34:53 -05:00
Bill Burke 31050e0580 Merge pull request #811 from ssilvert/deploy-auth-in-subsys
KEYCLOAK-795 Move Auth Server into Keycloak Subsystem
2014-11-06 17:57:19 -05:00
Bill Burke 2e9f1908f0 Merge pull request #846 from patriot1burke/master
document truststore classpath:
2014-11-06 17:46:21 -05:00
Bill Burke f12cd5fa09 document truststore classpath: 2014-11-06 17:46:01 -05:00
Bill Burke b487d6c836 Merge pull request #844 from Monezz/master
KEYCLOAK-829 Support loading keystore from classpath
2014-11-06 17:39:37 -05:00
Bill Burke 47ea0f5e23 Merge pull request #845 from patriot1burke/master
jetty adapter
2014-11-06 17:36:48 -05:00
Bill Burke d77f1f090f merge for jetty 2014-11-06 17:36:22 -05:00
Bill Burke 666851a44a Merge remote-tracking branch 'upstream/master' 2014-11-06 17:27:44 -05:00
Bill Burke cd25d7019b jetty adapter 2014-11-06 17:27:31 -05:00
Timon Veenstra 7c9e3f4555 KEYCLOAK-829 Adjustment to KetstoreUtil to support loading keystore from classpath 2014-11-06 21:43:49 +01:00
Marek Posolda c0f377c8c7 Merge pull request #841 from jpkrohling/JPK-KEYCLOAK-821
KEYCLOAK-821 - Support for comma-separated list of file names to import.
2014-11-06 20:32:31 +01:00
Stian Thorgersen 4a38b04e3e Merge pull request #843 from stianst/master
KEYCLOAK-824 Wrong digit shown in Invalid Password message
2014-11-06 13:08:42 +01:00
Stian Thorgersen 9343cf2aca KEYCLOAK-824 Wrong digit shown in Invalid Password message 2014-11-06 12:30:24 +01:00
Marek Posolda 3d70bae994 Merge pull request #842 from mposolda/master
KEYCLOAK-822 More mandatory fields in LDAP configuration in admin consol...
2014-11-05 17:20:31 +01:00
mposolda 8895d0b91e KEYCLOAK-822 More mandatory fields in LDAP configuration in admin console 2014-11-05 17:14:03 +01:00
Juraci Paixão Kröhling cd0ad70952 KEYCLOAK-821 - Support for comma-separated list of file names to import. 2014-11-05 17:04:17 +01:00
Stian Thorgersen 5041d6ed80 Merge pull request #840 from stianst/master
KEYCLOAK-820  Don't expose realm private key through admin endpoints
2014-11-05 15:35:32 +01:00
Stian Thorgersen e7625c2bb1 KEYCLOAK-820 Don't expose realm private key through admin endpoints 2014-11-05 15:34:56 +01:00
Stan Silvert 63712039e7 KEYCLOAK-795: Update CLI 2014-11-05 08:31:09 -05:00
Stan Silvert aa55a86ff6 KEYCLOAK-795 Update documentation. Add latest version of CLI to appliance
dist.
2014-11-05 08:31:08 -05:00
Stan Silvert e8e50d2d1c KEYCLOAK-795 Cleanup appliance dist. 2014-11-05 08:31:07 -05:00
Stan Silvert 3f75ebf029 KEYCLOAK-795 Move Auth Server into Keycloak Subsystem 2014-11-05 08:31:07 -05:00
Stan Silvert f9215e961d Incremental commit because I haven't done one in awhile. 2014-11-05 08:31:06 -05:00
Stan Silvert 4776582a6a Old experiment with keycloak-server.json embedded into standalone.xml 2014-11-05 08:31:05 -05:00
Stian Thorgersen 5091e07555 Fix label for certificate on realm-keys page 2014-11-05 13:57:27 +01:00
Stian Thorgersen 5943af79af Update pom for 'examples/demo-template/example-ear' to not deploy to repo 2014-11-05 13:54:14 +01:00
Stian Thorgersen 875e9ba513 Merge pull request #839 from jpkrohling/JPK-Wildfly-Adapter-Dist-Zip-Bug
KEYCLOAK-816 Removed undertow-adapter as dependency from wildfly-adapter-zip
2014-11-05 13:14:04 +01:00
Juraci Paixão Kröhling 8c8f82d0fd KEYCLOAK-816 - Removed undertow-adapter as dependency from wildfly-adapter-zip 2014-11-05 12:15:37 +01:00
Bill Burke 00167ee76a Merge pull request #838 from patriot1burke/master
doclet fix
2014-11-04 16:05:44 -05:00
Bill Burke 9c175bfb5d Merge remote-tracking branch 'upstream/master' 2014-11-04 15:55:47 -05:00
Bill Burke ede59a4441 fix jax-doclets 2014-11-04 15:55:33 -05:00
Stian Thorgersen e91129db92 Merge pull request #837 from stianst/master
Fixes
2014-11-04 16:00:54 +01:00
Stian Thorgersen ebf04c01c6 Fix version in pom for admin-client 2014-11-04 15:57:14 +01:00
Stian Thorgersen 797c2762c8 Fix for sybase 2014-11-04 14:47:51 +01:00
Stian Thorgersen cfb6fb3d06 Update to server-installation.xml 2014-11-04 14:31:07 +01:00
Stian Thorgersen a147136db0 Minor updates to admin-client and multi-tenant examples 2014-11-04 14:22:07 +01:00
Stian Thorgersen 7327423a03 Fix ResetPasswordTest 2014-11-04 13:05:50 +01:00
Stian Thorgersen 91529ef6fd Fix MultiTenancyTest 2014-11-04 13:05:44 +01:00
Stian Thorgersen 431fa29ef1 Use relative urls for multi-tenant example 2014-11-04 10:33:49 +01:00
Stian Thorgersen 1797f7e704 KEYCLOAK-814 Admin Client Example 2014-11-04 10:33:42 +01:00
Stian Thorgersen 0f8c073354 Version bump 2014-11-04 09:01:06 +01:00
Marek Posolda 61a538ba29 Merge pull request #836 from mposolda/master
Fix LDAP test for case-insensitive databases like MySQL
2014-11-03 21:40:45 +01:00
mposolda 9ae8d6aee1 Fix LDAP test for case-insensitive databases like MySQL 2014-11-03 21:35:12 +01:00
Marek Posolda 98852e2f3f Merge pull request #835 from mposolda/master
Docs for AS 7.1.1 and EAP 6.2 workaround
2014-11-03 17:11:47 +01:00
mposolda d997e73f2d Docs for AS 7.1.1 and EAP 6.2 workaround 2014-11-03 17:05:28 +01:00
Stian Thorgersen fd08a884ad Merge pull request #834 from ssilvert/KEYCLOAK-812-remove-confidential-transport
KEYCLOAK-812: Remove confidential transport from auth server web.xml and
2014-11-03 15:55:20 +01:00
Stan Silvert 6c02510b92 KEYCLOAK-812: Remove confidential transport from auth server we.xml and
documentation.
2014-11-03 09:36:55 -05:00
Marek Posolda 7408600f94 Merge pull request #833 from mposolda/master
Fix servlet logout on wildfly/undertow
2014-11-03 13:00:30 +01:00
mposolda 229391d48b Fix servlet logout on wildfly/undertow 2014-11-03 12:59:40 +01:00
Marek Posolda 187fbfaf03 Merge pull request #832 from mposolda/master
Multitenancy example working on AS 7.1.1
2014-11-03 10:44:25 +01:00
mposolda 28547b0620 Multitenancy example working on AS 7.1.1 2014-11-03 10:41:49 +01:00
Bill Burke 380f5dfb4e Merge pull request #831 from patriot1burke/master
principal token attribute mapping
2014-10-31 16:40:30 -04:00
Bill Burke 9c7e297118 principal token attribute mapping 2014-10-31 16:40:07 -04:00
Bill Burke ce94b7e9de Merge pull request #830 from patriot1burke/master
servlet logout fixes
2014-10-31 10:46:27 -04:00
Bill Burke f209476a1b merged 2014-10-31 10:45:35 -04:00
Bill Burke bd08643f6c Merge remote-tracking branch 'upstream/master' 2014-10-31 10:29:13 -04:00
Bill Burke a9770073b2 logout ffixes 2014-10-31 10:29:06 -04:00
Stian Thorgersen da5332608c Merge pull request #829 from stianst/master
KEYCLOAK-805 Add overview section to migration docs
2014-10-31 14:42:26 +01:00
Stian Thorgersen c43040a08e KEYCLOAK-805 Add overview section to migration docs 2014-10-31 14:41:54 +01:00
Stian Thorgersen 488351e46f Merge pull request #828 from stianst/master
KEYCLOAK-787 Clicking back to login after sending password reset email f...
2014-10-31 14:05:31 +01:00
Stian Thorgersen bb2de4dc59 KEYCLOAK-787 Clicking back to login after sending password reset email fails 2014-10-31 13:59:56 +01:00
Marek Posolda fe27f5364a Merge pull request #827 from mposolda/master
Remove realm property from KeycloakSecurityContext. Fix multitenancy on EAP 6.3
2014-10-31 13:32:11 +01:00
mposolda 82af7cbfa2 Fix multi-tenancy on EAP63/AS7 2014-10-31 13:17:35 +01:00
mposolda 44d4f6eb95 Remove redundant realm property from KeycloakSecurityContext 2014-10-31 13:17:35 +01:00
Stian Thorgersen 8d1548bd4d Merge pull request #826 from stianst/master
Fixes
2014-10-31 12:45:31 +01:00
Stian Thorgersen 9b0d5acb50 KEYCLOAK-704 KEYCLOAK-768 Improvements to access code generation 2014-10-31 12:45:03 +01:00
Marek Posolda 39686d5d4e Merge pull request #824 from mposolda/master
KEYCLOAK-808 Issue when DB search is case-sensitive byt LDAP search is n...
2014-10-31 10:42:35 +01:00
mposolda 78a1df693c KEYCLOAK-808 Issue when DB search is case-sensitive byt LDAP search is not 2014-10-31 10:27:55 +01:00
Stian Thorgersen 8adad9dddf KEYCLOAK-806
Increase defaults for 'SSO Session Idle Timeout'
2014-10-31 09:41:21 +01:00
Marek Posolda 65362be4dd Merge pull request #823 from mposolda/master
KEYCLOAK-788 Ensure expired ClientSessions removed during UserSessionPro...
2014-10-30 23:34:27 +01:00
mposolda a6ca925340 KEYCLOAK-788 Ensure expired ClientSessions removed during UserSessionProvider.removeExpiredUserSessions 2014-10-30 23:02:48 +01:00
Marek Posolda 97907cd7ff Merge pull request #822 from mposolda/master
KEYCLOAK-800 and tomcat7 test fixes
2014-10-30 21:42:17 +01:00
mposolda 3d11a4746c Set basedir for Tomcat7 test to avoid creating dirs in workspace 2014-10-30 21:40:35 +01:00
mposolda 0f25280611 KEYCLOAK-800 Ensure that loginFailures infinispan cache is defined 2014-10-30 21:15:52 +01:00
Stian Thorgersen 99016cdc83 Merge pull request #821 from keycloak/multi-tenant-adapter
KEYCLOAK-779
2014-10-30 16:55:00 +01:00
Juraci Paixão Kröhling 8e764e642f KEYCLOAK-779
Adapter multi-tenancy support
2014-10-30 16:54:26 +01:00
Bill Burke a56cef47f2 Merge pull request #820 from patriot1burke/master
remove info logging
2014-10-30 09:53:27 -04:00
Bill Burke cf747dac22 remove info logging 2014-10-30 09:53:06 -04:00
Marek Posolda 0234bdb619 Merge pull request #819 from mposolda/master
KEYCLOAK-799 - Configurable connections pooling for mongo client
2014-10-30 11:20:03 +01:00
mposolda b88b520bad KEYCLOAK-799 - Configurable connections pooling for mongo client 2014-10-30 11:19:16 +01:00
Bill Burke 5446bf77e8 Merge pull request #818 from patriot1burke/master
migrate docs
2014-10-29 16:05:04 -04:00
Bill Burke c5b72464cb migrate docs 2014-10-29 16:04:46 -04:00
Bill Burke 917eb112ff Merge pull request #817 from patriot1burke/master
tomcat7 and bug fix
2014-10-29 16:03:43 -04:00
Bill Burke 0183ac43bc aud should be client-id, issuer should be realm 2014-10-29 15:56:25 -04:00
Bill Burke c660be7bbb tomcat7 docbook 2014-10-29 14:48:10 -04:00
Bill Burke 935045926e tomcat7 distro 2014-10-29 12:30:12 -04:00
Bill Burke d289fa7402 Merge remote-tracking branch 'upstream/master' 2014-10-29 11:42:36 -04:00
Bill Burke 5831cffc19 add logging to pom 2014-10-29 11:42:24 -04:00
Stian Thorgersen 03b8aa1fc2 Merge pull request #812 from stianst/master
Fixes
2014-10-29 14:21:18 +01:00
Stian Thorgersen 05b6dc7af4 KEYCLOAK-797
login-status-iframe.html fails if domain contains hyphen
2014-10-29 14:02:38 +01:00
Stian Thorgersen 8c2d4812b0 KEYCLOAK-763
Document reverse proxy setup on AS7/EAP
2014-10-29 14:02:16 +01:00
Stian Thorgersen fb5482a725 Merge pull request #810 from jpkrohling/JPK-rename-adapter-core
Changed name for adapter-core maven module
2014-10-29 10:35:49 +01:00
Juraci Paixão Kröhling e43dd0ad19 Changed name for adapter-core maven module 2014-10-29 10:18:49 +01:00
Stian Thorgersen 0e6b25fa8d Merge pull request #809 from stianst/master
KEYCLOAK-756 Adding missing metadata to MANIFEST
2014-10-29 10:11:28 +01:00
Stian Thorgersen 6f147f890d KEYCLOAK-756 Adding missing metadata to MANIFEST 2014-10-29 10:08:48 +01:00
Stian Thorgersen 22ddf8b9d1 Merge pull request #808 from stianst/master
KEYCLOAK-726 Downloading a OAuth client installation file results on wro...
2014-10-29 09:13:12 +01:00
Stian Thorgersen 3b23101365 KEYCLOAK-726 Downloading a OAuth client installation file results on wrong JSON 2014-10-29 09:12:14 +01:00
Bill Burke 5e8ca5a140 Merge pull request #807 from patriot1burke/master
add tomcat7 adapter test
2014-10-28 18:41:57 -04:00
Bill Burke da27f43573 add tomcat7 adapter test 2014-10-28 18:41:35 -04:00
Stian Thorgersen c697945d39 Merge pull request #806 from stianst/master
KEYCLOAK-772 Event settings are not imported
2014-10-28 20:35:42 +01:00
Stian Thorgersen fcda005d88 KEYCLOAK-772 Event settings are not imported 2014-10-28 20:21:03 +01:00
Stian Thorgersen ca96c071e8 Merge pull request #805 from stianst/master
Fixes
2014-10-28 20:14:55 +01:00
Stian Thorgersen b23bf58170 KEYCLOAK-352 Third level of navigation is not necessary in some pages 2014-10-28 20:05:18 +01:00
Stian Thorgersen 27d217c220 KEYCLOAK-351 Third level of navigation disappears in 'Add Role' pages 2014-10-28 20:02:27 +01:00
Stian Thorgersen 6e4785e74c KEYCLOAK-777 No login event for social login 2014-10-28 19:56:41 +01:00
Stian Thorgersen 4eb60a169b KEYCLOAK-728 2014-10-28 19:48:11 +01:00
Bill Burke eaaaf91963 Merge pull request #804 from patriot1burke/master
idp descriptor
2014-10-28 12:49:54 -04:00
Bill Burke 12e2a4698d idp descriptor 2014-10-28 12:49:31 -04:00
Bill Burke e5934e9d54 saml docs 2014-10-28 12:16:54 -04:00
Bill Burke 802e184ca9 Merge pull request #803 from patriot1burke/master
saml entity descriptor importer
2014-10-28 12:04:11 -04:00
Bill Burke cb110d095f conflict 2014-10-28 11:55:52 -04:00
Bill Burke e3609cc85b app importer 2014-10-28 11:54:58 -04:00
Marek Posolda e2fd4d3b90 Merge pull request #802 from mposolda/master
KEYCLOAK-740 Documentation of adapters clustering
2014-10-27 23:42:50 +01:00
mposolda b1cfedb488 KEYCLOAK-740 Documentation of adapters clustering 2014-10-27 23:41:36 +01:00
mposolda c6fc44bcc2 Minor fixes and javadoc 2014-10-27 22:02:09 +01:00
Marek Posolda 4b87b8f7e3 Merge pull request #801 from mposolda/master
KEYCLOAK-702 - Added AdapterTokenStore spi. Possibility to save account ...
2014-10-27 17:06:49 +01:00
mposolda a538e25b9d KEYCLOAK-702 - Added AdapterTokenStore spi. Possibility to save account info to cookie as alternative to http session 2014-10-27 16:20:01 +01:00
Bill Burke 971f0f5c16 publish protocol support 2014-10-24 11:25:04 -04:00
Bill Burke 1be070e34d cleanup 2014-10-24 11:00:34 -04:00
Bill Burke dba7864180 Merge remote-tracking branch 'upstream/master' 2014-10-24 10:58:46 -04:00
Bill Burke ce76270ad8 saml key refactor 2014-10-24 10:58:32 -04:00
Stian Thorgersen a2e38d8bd4 Merge pull request #800 from stianst/master
KEYCLOAK-786
2014-10-23 21:00:16 +02:00
Stian Thorgersen 319578f390 KEYCLOAK-786
Value in input fields should be escaped
2014-10-23 20:43:49 +02:00
Marek Posolda 1e68f63715 Merge pull request #797 from mposolda/dynamic-adapter-registration
KEYCLOAK-778 InfinispanUserCacheProvider not working on EAP6 / AS7
2014-10-23 11:38:43 +02:00
mposolda d9331998c3 KEYCLOAK-778 InfinispanUserCacheProvider not working on EAP6 / AS7 2014-10-23 11:36:06 +02:00
Bill Burke ad7e2cd12e Merge pull request #796 from patriot1burke/master
readme
2014-10-22 16:22:09 -04:00
Bill Burke 3b30b63bcc readme 2014-10-22 16:21:46 -04:00
Bill Burke 4417f28c5a Merge pull request #795 from patriot1burke/master
force post binding switch and saml docs
2014-10-22 15:19:02 -04:00
Bill Burke 5fa5379f81 document saml 2014-10-22 15:18:24 -04:00
Bill Burke f715a026ba force post binding switch 2014-10-22 14:32:46 -04:00
Bill Burke de29b566fe Merge pull request #794 from patriot1burke/master
more saml config options
2014-10-22 14:06:51 -04:00
Bill Burke b3fe650e27 Merge remote-tracking branch 'upstream/master' 2014-10-22 14:01:09 -04:00
Bill Burke f38c6d3412 config optiosn 2014-10-22 14:00:56 -04:00
Marek Posolda ed3d13d398 Merge pull request #793 from mposolda/dynamic-adapter-registration
Rewrite NodeRegistrationManagement to better suit multi-tenant usecase
2014-10-22 17:52:19 +02:00
mposolda 5bfb0e73ac Rewrite NodeRegistrationManagement to better suit multi-tenant usecase 2014-10-22 17:11:05 +02:00
Bill Burke 3bfa79e210 Merge pull request #792 from patriot1burke/master
saml distro and examples
2014-10-21 21:39:43 -04:00
Bill Burke 4d3299ae08 saml distro and examples 2014-10-21 21:39:10 -04:00
Marek Posolda 8ec2b2398c Merge pull request #791 from mposolda/dynamic-adapter-registration
Send node registration at 1st request instead of deployment startup. Bug...
2014-10-21 23:22:51 +02:00
mposolda f3da9760a3 Send node registration at 1st request instead of deployment startup. Bugfixing 2014-10-21 23:15:21 +02:00
Bill Burke 87d4cc59a4 Merge pull request #790 from patriot1burke/master
sig alg and upload cert support
2014-10-21 16:39:26 -04:00
Bill Burke a36e43bacc Merge remote-tracking branch 'upstream/master' 2014-10-21 16:33:44 -04:00
Bill Burke 668497df4d upload keys 2014-10-21 16:33:17 -04:00
Bill Burke d3375962ad signature algorithm support 2014-10-21 10:35:39 -04:00
Bill Burke b155382523 Merge pull request #789 from patriot1burke/master
more saml unit tests
2014-10-21 09:10:18 -04:00
Bill Burke e0730e5517 Merge remote-tracking branch 'upstream/master' 2014-10-21 09:05:37 -04:00
Bill Burke c1694a2791 more saml unit tests 2014-10-21 09:05:24 -04:00
Stian Thorgersen dec82ddf68 Merge pull request #787 from stianst/master
KEYCLOAK-711 HttpServletReqest.logout() does not work with relative URI
2014-10-21 12:42:34 +02:00
Marek Posolda 00834ce3c1 Merge pull request #786 from mposolda/dynamic-adapter-registration
KEYCLOAK-759 Added adapter clustering to admin console
2014-10-21 12:37:14 +02:00
Stian Thorgersen 2c218c9aa0 KEYCLOAK-711 HttpServletReqest.logout() does not work with relative URI 2014-10-21 12:36:20 +02:00
mposolda 01c705b4d3 KEYCLOAK-759 Added adapter clustering to admin console 2014-10-21 12:32:53 +02:00
Stian Thorgersen 9565a785b2 Merge pull request #784 from stianst/master
KEYCLOAK-710 Ignore missing roles in access-code
2014-10-21 11:24:28 +02:00
Stian Thorgersen dd4b2f811b KEYCLOAK-710 Ignore missing roles in access-code 2014-10-21 11:15:35 +02:00
Stian Thorgersen ea6d7e1fac Merge pull request #780 from stianst/master
Fixes
2014-10-21 10:01:22 +02:00
Stian Thorgersen 6b2a4229e3 KEYCLOAK-700 Check path is valid in account/login-redirect 2014-10-21 09:57:56 +02:00
Stian Thorgersen 63b41e2548 KEYCLOAK-703 Check valid origin is passed to login-status-iframe 2014-10-21 09:57:56 +02:00
Stian Thorgersen ed895ce02d KEYCLOAK-699 Set maximum size of qr-code 2014-10-21 09:57:56 +02:00
Stian Thorgersen 61b71082f7 Merge pull request #779 from stianst/master
KEYCLOAK-706 SMTP port field should not be mandatory
2014-10-21 09:16:06 +02:00
Stian Thorgersen 5478f282dc KEYCLOAK-706 SMTP port field should not be mandatory 2014-10-21 09:11:49 +02:00
Bill Burke ebaa5bebe5 Merge pull request #778 from patriot1burke/master
saml unit tests
2014-10-20 16:31:39 -04:00
Bill Burke e2de6edff8 saml unit tests 2014-10-20 16:31:00 -04:00
Stian Thorgersen 1d324d6b9a Merge pull request #777 from stianst/master
KEYCLOAK-766 Keycloak fails with OpenShift PostgreSQL 9.2 cartridge, wor...
2014-10-20 19:30:52 +02:00
Stian Thorgersen b0ce226005 KEYCLOAK-766 Keycloak fails with OpenShift PostgreSQL 9.2 cartridge, works fine with MySQL one 2014-10-20 16:50:07 +02:00
Stian Thorgersen a2be747f45 Merge pull request #776 from stianst/master
KEYCLOAK-761
2014-10-20 12:35:48 +02:00
Stian Thorgersen f8e68dadb5 KEYCLOAK-761
Broken databases
2014-10-20 12:35:11 +02:00
Bill Burke 8b05e2ebf8 Merge pull request #775 from patriot1burke/master
saml redirect binding
2014-10-17 16:54:56 -04:00
Bill Burke d0ce72167d merge 2014-10-17 16:54:25 -04:00
Bill Burke c91ecc3033 saml redirect binding 2014-10-17 16:48:45 -04:00
Marek Posolda 4ae6190b79 Merge pull request #774 from mposolda/dynamic-adapter-registration
Fix type in jpa-changelog
2014-10-17 22:13:53 +02:00
mposolda d87a26818e Fix type in jpa-changelog 2014-10-17 22:13:31 +02:00
Marek Posolda 0dae2240e5 Merge pull request #773 from mposolda/dynamic-adapter-registration
KEYCLOAK-759 dynamic registration of managementUrls in cluster
2014-10-17 22:02:47 +02:00
mposolda 7d8f265789 KEYCLOAK-759 dynamic registration of managementUrls in cluster 2014-10-17 21:51:46 +02:00
Stian Thorgersen 8545457f5a Merge pull request #772 from stianst/master
KEYCLOAK-761 Fix database schema
2014-10-17 14:42:57 +02:00
Stian Thorgersen ca2223abb8 KEYCLOAK-761 Fix database schema 2014-10-17 14:21:31 +02:00
Stian Thorgersen 01507fc1dc KEYCLOAK-747 Fix onUserRemoved in user session providers 2014-10-17 13:35:07 +02:00
Bill Burke b9389100cd Merge pull request #771 from patriot1burke/master
saml encryption
2014-10-16 11:52:22 -04:00
Bill Burke 91c545534e Merge remote-tracking branch 'upstream/master' 2014-10-16 11:45:03 -04:00
Bill Burke 3e5afcde9e saml encryption 2014-10-16 11:44:51 -04:00
Bill Burke c90bf2d9e1 Merge pull request #770 from patriot1burke/master
saml signatures
2014-10-16 09:20:08 -04:00
Bill Burke 638ce06f77 Merge remote-tracking branch 'upstream/master' 2014-10-16 09:14:30 -04:00
Bill Burke 4750b22b6d saml signatures 2014-10-16 09:14:04 -04:00
Stian Thorgersen 7d59117fc1 Merge pull request #769 from stianst/master
Added promptOnNonLocalDatabase=false to clean-jpa
2014-10-16 13:03:39 +02:00
Stian Thorgersen 425b2199f2 Added promptOnNonLocalDatabase=false to clean-jpa 2014-10-16 13:03:00 +02:00
Stian Thorgersen a882f95749 Merge pull request #768 from stianst/master
Simplified embedded infinispan connection config
2014-10-16 12:40:08 +02:00
Stian Thorgersen cdcbafa311 Simplified embedded infinispan connection config 2014-10-16 12:39:14 +02:00
Stian Thorgersen a36fd419b5 Merge pull request #767 from stianst/master
Add clean-jpa profile to testsuite
2014-10-16 10:02:53 +02:00
Stian Thorgersen 9029ec4f28 Add clean-jpa profile to testsuite 2014-10-16 10:02:24 +02:00
Stian Thorgersen d013e9869a Merge pull request #766 from stianst/master
KEYCLOAK-761 Fix type of credential#salt
2014-10-16 09:35:55 +02:00
Stian Thorgersen fe5eb1a06d KEYCLOAK-761 Fix type of credential#salt 2014-10-16 09:34:53 +02:00
Bill Burke 582ee8897e Merge pull request #765 from patriot1burke/master
app cert generation support
2014-10-14 19:17:26 -04:00
Bill Burke 4e41041469 db 2014-10-14 19:13:23 -04:00
Bill Burke 8fbc8fc736 Merge remote-tracking branch 'upstream/master' 2014-10-14 18:39:08 -04:00
Bill Burke 7760887ac1 app cert support, bug fixes 2014-10-14 18:38:48 -04:00
Stian Thorgersen 7e7ab86821 Merge pull request #763 from stianst/master
KEYCLOAK-755 Support env variables in keycloak-server.json
2014-10-14 15:06:57 +02:00
Stian Thorgersen 106a0cb48d KEYCLOAK-755 Support env variables in keycloak-server.json 2014-10-14 15:06:18 +02:00
Stian Thorgersen 75be776aa1 Removed properties from server keycloak-server.json 2014-10-14 15:06:18 +02:00
Stian Thorgersen 2dbebd164f Merge pull request #762 from stianst/master
KEYCLOAK-753 Add 'username:' prefix to remember me cookie to prevent iss...
2014-10-14 13:49:59 +02:00
Stian Thorgersen 1021e8af5c KEYCLOAK-753 Add 'username:' prefix to remember me cookie to prevent issue with old cookie 2014-10-14 13:44:03 +02:00
Stian Thorgersen 2ad688a663 Merge pull request #761 from stianst/liquibase
KEYCLOAK-736 Fix class-path issues
2014-10-14 13:05:25 +02:00
Stian Thorgersen bf7effc6f2 KEYCLOAK-736 Fix class-path issues 2014-10-14 13:04:38 +02:00
Stian Thorgersen d86547620a Merge pull request #760 from stianst/liquibase
KEYCLOAK-736 Database migration support"
2014-10-14 10:41:48 +02:00
Stian Thorgersen 94de88ef3b KEYCLOAK-736 Database migration support" 2014-10-14 10:07:41 +02:00
Stian Thorgersen 101c7697fd Merge pull request #759 from stianst/master
KEYCLOAK-744 Document view-event and manage-event roles
2014-10-13 14:02:47 +02:00
Stian Thorgersen cf94f4f84a KEYCLOAK-744 Document view-event and manage-event roles 2014-10-13 14:02:20 +02:00
Stian Thorgersen 6855b2f0e4 Merge pull request #758 from stianst/master
KEYCLOAK-746 Allow linking to account from external provider
2014-10-13 13:19:36 +02:00
Stian Thorgersen 4d401224de KEYCLOAK-746 Allow linking to account from external provider 2014-10-13 10:48:45 +02:00
Bill Burke 4d007c776a generate/store realm certificate 2014-10-11 10:49:04 -04:00
Bill Burke eac1fb23cf Merge pull request #757 from patriot1burke/master
use id for oauth in admin console
2014-10-10 16:56:47 -04:00
Bill Burke d9ff44b870 Merge remote-tracking branch 'upstream/master' 2014-10-10 16:56:16 -04:00
Bill Burke deffa9b4e1 oauth id in admin console 2014-10-10 16:55:57 -04:00
Bill Burke 3d7fca885e Merge pull request #756 from patriot1burke/master
freeotp
2014-10-10 16:08:03 -04:00
Bill Burke 08c5fed1b3 freeotp 2014-10-10 16:07:35 -04:00
Bill Burke 23d0361168 Merge pull request #755 from patriot1burke/master
admin console and model attributes
2014-10-09 18:31:16 -04:00
Bill Burke 0ace5cd746 merge conflicts 2014-10-09 18:26:14 -04:00
Bill Burke 94da99bf10 use app id in admin console urls 2014-10-09 18:22:02 -04:00
Marek Posolda 3d5d7777f6 Merge pull request #754 from mposolda/master
KEYCLOAK748 cluster-aware logout for non-distributable applications
2014-10-09 21:36:13 +02:00
mposolda 9954d68a1f KEYCLOAK-748 cluster-aware logout for non-distributable apps 2014-10-09 21:33:07 +02:00
mposolda 00716b7bfc Docker config update 2014-10-09 21:33:06 +02:00
Stian Thorgersen 6d1555262e Merge branch 'abstractj-totp-name' 2014-10-09 13:08:54 +02:00
Bruno Oliveira c00c712c39 KEYCLOAK-745 Display the realm name for OTP QR code scan 2014-10-09 13:03:48 +02:00
Marek Posolda 63f4a32f2e Merge pull request #752 from mposolda/stateless-session-mgmt
Test for KEYCLOAK-741
2014-10-09 12:36:40 +02:00
mposolda 2445575a04 Test for KEYCLOAK-741 2014-10-09 12:30:30 +02:00
Marek Posolda 56fe821bef Merge pull request #751 from mposolda/stateless-session-mgmt
Fix mongo to pass with testsuite
2014-10-09 11:38:59 +02:00
mposolda 36cc298b32 Fix mongo to pass with testsuite 2014-10-09 11:37:42 +02:00
Marek Posolda a00d36eea2 Merge pull request #750 from mposolda/stateless-session-mgmt
Stateless session mgmt
2014-10-08 23:32:51 +02:00
mposolda ac8b43358d Reduce logging 2014-10-08 23:28:02 +02:00
mposolda 1e33931f23 KEYCLOAK-741 Failure to refresh token should invalidate http session 2014-10-08 22:18:11 +02:00
mposolda 7e7406ddb7 KEYCLOAK-743 Stateless session mgmt. Drop statistics for adapters. 2014-10-08 22:18:10 +02:00
mposolda 84e1ace539 KEYCLOAK-742 Added always-refresh-token option to adapters 2014-10-08 22:18:10 +02:00
Bill Burke a1d1877751 ClientModel attributes and protocol 2014-10-08 10:54:13 -04:00
Bill Burke 390ca0930b Merge pull request #749 from patriot1burke/master
undertow slash redirect problem
2014-10-08 09:46:20 -04:00
Bill Burke 13a2108846 undertow slash redirect problem 2014-10-08 09:45:49 -04:00
Bill Burke 9ffd517b53 Merge pull request #747 from patriot1burke/master
saml backchannel logout
2014-10-07 18:18:54 -04:00
Bill Burke 5f1e6f3a23 merge 2014-10-07 18:17:44 -04:00
Bill Burke 6d5ab0f66b saml backchannel logout 2014-10-07 18:06:02 -04:00
Marek Posolda bc85be23b7 Merge pull request #746 from mposolda/master
KEYCLOAK-738 Possible NPE in MemUserSessionProvider.getUserSessions
2014-10-07 19:21:14 +02:00
mposolda 6522455b44 KEYCLOAK-738 Possible NPE in MemUserSessionProvider.getUserSessions 2014-10-07 19:19:46 +02:00
Stian Thorgersen 2e76be45fa Merge pull request #744 from pilhuhn/patch-1
Update adapter-config.xml
2014-10-07 13:15:05 +02:00
Marek Posolda 0c3a9be1a1 Merge pull request #745 from mposolda/docker
Possibility to test EAP6 cluster with docker+fig
2014-10-07 12:42:08 +02:00
mposolda a6bbc492b8 Possibility to test EAP6 cluster with docker+fig 2014-10-07 12:33:44 +02:00
Heiko W. Rupp 3d4ef91bf1 Update adapter-config.xml
Fix some minor typos in the json, Otherwise it is invalid.

Also deploying in the keycloak 1.0.1 appliance, the line

"cors-allowed-methods" : [ "POST", "PUT", "DELETE", "GET" ],

makes parsing fail with 

11:19:10,121 ERROR [org.jboss.as.controller.management-operation] (DeploymentScanner-threads - 1) JBAS014613: Operation ("full-replace-deployment") failed - address: ([]) - failure description: {"JBAS014671: Failed services" => {"jboss.undertow.deployment.default-server.default-host./rhq-metrics" => "org.jboss.msc.service.StartException in service jboss.undertow.deployment.default-server.default-host./rhq-metrics: Failed to start service
    Caused by: java.lang.RuntimeException: org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of java.lang.String out of START_ARRAY token
 at [Source: java.io.BufferedInputStream@1605c2fe; line: 9, column: 24] (through reference chain: org.keycloak.representations.adapters.config.AdapterConfig[\"cors-allowed-methods\"])
    Caused by: org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of java.lang.String out of START_ARRAY token
 at [Source: java.io.BufferedInputStream@1605c2fe; line: 9, column: 24] (through reference chain: org.keycloak.representations.adapters.config.AdapterConfig[\"cors-allowed-methods\"])"}}
2014-10-07 11:21:15 +02:00
Stian Thorgersen 1604315e40 Merge pull request #743 from stianst/master
KEYCLOAK-730 Document clustering
2014-10-06 13:58:57 +02:00
Stian Thorgersen f702d8f1ff KEYCLOAK-730 Document clustering 2014-10-06 13:58:32 +02:00
Marek Posolda 87f826c850 Merge pull request #742 from mposolda/master
Simplify method signature in JsonSerialization
2014-10-05 22:12:19 +02:00
mposolda 59bf7e524f Change method signature 2014-10-05 20:07:54 +02:00
Bill Burke e01424b815 Merge pull request #741 from patriot1burke/master
saml basic
2014-10-04 22:15:56 -04:00
Bill Burke c609ae3496 saml 2014-10-04 22:15:25 -04:00
Bill Burke e3a3933390 saml basic 2014-10-04 21:27:48 -04:00
Stian Thorgersen 1f40ab407c Merge pull request #739 from stianst/master
KEYCLOAK-729
2014-10-03 14:11:49 +02:00
Stian Thorgersen 1d66bd9c15 KEYCLOAK-729
Update themes documentation
2014-10-03 14:11:03 +02:00
Stian Thorgersen 777999e0ea Merge pull request #737 from stianst/master
KEYCLOAK-722 Refreshing token throws RuntimeException if realm keys have...
2014-10-03 13:23:53 +02:00
Stian Thorgersen 0d5be568f8 KEYCLOAK-722 Refreshing token throws RuntimeException if realm keys have changed 2014-10-03 13:23:21 +02:00
Stian Thorgersen 17bb42d60e Merge pull request #736 from stianst/master
KEYCLOAK-662 NPE when using direct grant API with email as username
2014-10-03 12:12:16 +02:00
Stian Thorgersen d6f030a05a KEYCLOAK-662 NPE when using direct grant API with email as username 2014-10-03 12:10:52 +02:00
Marek Posolda 18401815af Merge pull request #734 from mposolda/master
Workaround for WFLY-3345 so logout can work for 'distributable' applicat...
2014-10-03 11:27:28 +02:00
mposolda 10e618dee9 Workaround for WFLY-3345 so logout can work for 'distributable' applications 2014-10-03 11:26:34 +02:00
Stian Thorgersen 98f9c798f0 Merge pull request #733 from stianst/master
KEYCLOAK-701 Use built-in themes if specified theme is not found
2014-10-03 11:24:40 +02:00
Stian Thorgersen 49f3172163 KEYCLOAK-701 Use built-in themes if specified theme is not found 2014-10-03 11:17:12 +02:00
Stian Thorgersen 53489cd556 Merge pull request #731 from stianst/master
Add login test with multiple sessions for same user
2014-10-03 10:42:39 +02:00
Stian Thorgersen a5aa1da841 Add login test with multiple sessions for same user 2014-10-03 10:41:04 +02:00
Marek Posolda e11180a4f0 Merge pull request #729 from mposolda/master
KEYCLOAK-732 AuthenticationManager.logout should logout just current use...
2014-10-02 22:54:31 +02:00
mposolda e6121f301f KEYCLOAK-732 AuthenticationManager.logout should logout just current userSession 2014-10-02 22:52:44 +02:00
Marek Posolda 4050cf9ac3 Merge pull request #728 from mposolda/master
KEYCLOAK-731
2014-10-02 19:19:09 +02:00
mposolda 50f148cd7c Use one option "auth-server-url-for-backend-requests" instead of 3 options 2014-10-02 19:16:04 +02:00
mposolda 72b5632cfe KEYCLOAK-731 Support for replacing configuration of Java adapters with system properties 2014-10-02 19:15:37 +02:00
Stian Thorgersen 8855bcf3c1 Merge pull request #727 from stianst/master
KEYCLOAK-727: 'logout'->'log out' + moved message to bundle
2014-10-02 10:55:01 +02:00
Lukas Fryc a85b58dccd KEYCLOAK-727: 'logout'->'log out' + moved message to bundle 2014-10-02 10:54:26 +02:00
Stian Thorgersen 01e6d09d79 Merge pull request #725 from stianst/master
Fixes to infinispan user session provider
2014-10-02 09:43:21 +02:00
Stian Thorgersen 597ee2b8c9 Fixes to infinispan user session provider 2014-10-02 09:00:48 +02:00
Marek Posolda 6ff37cfc24 Merge pull request #724 from mposolda/master
KEYCLOAK-709 ResourceAdminManager.logoutApplication shouldn't immediatel...
2014-10-01 23:21:46 +02:00
mposolda 95521e8a95 KEYCLOAK-709 ResourceAdminManager.logoutApplication shouldn't immediatelly fail with RuntimeException 2014-10-01 23:20:49 +02:00
Bill Burke 4b254475da Merge pull request #723 from patriot1burke/master
finish login protocol refactoring
2014-10-01 14:58:42 -04:00
Bill Burke 6cf62a2768 move pre-auth 2014-10-01 14:57:52 -04:00
Bill Burke 71216bf2c9 merge 2014-10-01 14:21:23 -04:00
Bill Burke cbc383d494 finish protocol refactoring 2014-10-01 14:19:59 -04:00
Marek Posolda a75c9ee04e Merge pull request #722 from mposolda/master
Http session replication working for example apps on Wildfly
2014-10-01 19:14:14 +02:00
mposolda d7bcd41909 Ensure that KeycloakUndertowAccount and referenced classes can be serialized in session 2014-10-01 19:08:41 +02:00
Bill Burke 546d45b009 protocol abstraction 2014-10-01 10:38:42 -04:00
Bill Burke 99738ea4ad Merge remote-tracking branch 'upstream/master' 2014-10-01 10:01:59 -04:00
Bill Burke 4b399fe05a login protocol abstraction 2014-10-01 10:01:42 -04:00
mposolda eb920b4993 Examples: Don't require to create HttpSession when visiting JSP pages 2014-10-01 13:44:38 +02:00
mposolda 1b6b95bb9a Added distributable to customer-portal in cluster test 2014-10-01 11:52:16 +02:00
Marek Posolda bd077a3adb Merge pull request #721 from mposolda/master
Use infinispan UserSession provider for docker cluster env. Don't prepar...
2014-10-01 10:52:48 +02:00
mposolda fd0a000823 Use infinispan UserSession provider for docker cluster env. Don't prepare nodes during each fig start 2014-10-01 10:51:24 +02:00
Bill Burke a6ae8d08ac Merge pull request #720 from patriot1burke/master
token service refactoring
2014-09-30 16:03:13 -04:00
Bill Burke e32f73880f Merge remote-tracking branch 'upstream/master' 2014-09-30 15:58:39 -04:00
Bill Burke 63b65c933b token service refactoring 2014-09-30 15:58:20 -04:00
Marek Posolda 72ec9ccb00 Merge pull request #719 from mposolda/master
KEYCLOAK-721 Possibility to resolve relative URI by hostname. Examples working in docker clustering env
2014-09-30 20:17:25 +02:00
mposolda 89dc55a106 Make examples working in docker cluster env 2014-09-30 19:50:17 +02:00
mposolda 80a9a8984a Cleanup. Support to use-hostname-for-local-requests added to Demo examples 2014-09-30 17:37:36 +02:00
mposolda 18fe808ce0 KEYCLOAK-720 Support for relative URI resolved by hostname in wildfly adapter 2014-09-30 17:37:36 +02:00
mposolda 337b03fc62 KEYCLOAK-720 added support for oauth clients 2014-09-30 17:37:36 +02:00
Stian Thorgersen 617c61034f Merge pull request #718 from stianst/master
KEYCLOAK-725 Add realm update to the Admin Client
2014-09-30 15:44:16 +02:00
Stian Thorgersen f026772c87 KEYCLOAK-725 Add realm update to the Admin Client 2014-09-30 15:43:18 +02:00
Stian Thorgersen 0f307afd16 Merge pull request #717 from stianst/master
Fixes to JPA user session provider
2014-09-30 14:47:45 +02:00
Stian Thorgersen a1f223735c Fixes to JPA user session provider 2014-09-30 14:47:22 +02:00
Stian Thorgersen d1bb872aec Merge pull request #716 from stianst/master
Fixes to Mongo user session provider
2014-09-30 14:25:49 +02:00
Stian Thorgersen 1d4e842cc0 Fixes to Mongo user session provider 2014-09-30 14:24:49 +02:00
Stian Thorgersen 209fdc1255 Fix UserSessionProviderTest.testGetByClientPaginated 2014-09-30 10:59:37 +02:00
Stian Thorgersen 3ded1943e2 Merge pull request #715 from keycloak/clustering
Fixes to UserSessionProviderTest
2014-09-30 10:23:10 +02:00
Stian Thorgersen bdeb59f87e Fixes to UserSessionProviderTest 2014-09-30 10:22:33 +02:00
Stian Thorgersen 994adaf493 Merge pull request #714 from keycloak/clustering
Clustering support
2014-09-30 10:21:21 +02:00
Stian Thorgersen 99c73a9cc7 Clustering support 2014-09-30 09:40:20 +02:00
Bill Burke 6075ef221f Merge pull request #713 from patriot1burke/master
action url refactor
2014-09-29 16:58:27 -04:00
Bill Burke fc867e59ea action url refactor 2014-09-29 16:57:58 -04:00
Bill Burke 6212403569 Merge pull request #712 from patriot1burke/master
login refactor phase 2, still more to do
2014-09-29 16:16:10 -04:00
Bill Burke 75a3093dda login refactor phase 2, still more to do 2014-09-29 16:15:33 -04:00
Bill Burke 6c46af5b3c Merge pull request #711 from patriot1burke/master
cliensession refactor
2014-09-29 10:01:35 -04:00
Bill Burke 67f10bee24 Merge remote-tracking branch 'upstream/master' 2014-09-29 09:56:37 -04:00
Bill Burke 524b423733 ClientSession everywhere refactor phase1 2014-09-26 17:44:33 -04:00
Stian Thorgersen c05f83c9b3 Merge pull request #709 from stianst/master
Add test to add/remove attributes to user through admin endpoints
2014-09-25 19:36:43 +02:00
Stian Thorgersen f2e97ff9d6 Add test to add/remove attributes to user through admin endpoints 2014-09-25 19:35:57 +02:00
Stian Thorgersen ca4ed6d528 Merge pull request #708 from stianst/master
Fix cordova example
2014-09-25 19:00:45 +02:00
Stian Thorgersen 8006ea073b Fix cordova example 2014-09-25 19:00:13 +02:00
Stian Thorgersen f8b4a91fa8 Merge pull request #707 from sebastienblanc/all_origins
change origin to * so it will work even if KC is behind https (like on OpenShift)
2014-09-25 18:49:36 +02:00
Sebastien Blanc e17d6c81f9 change origin to * 2014-09-25 17:43:10 +02:00
Stian Thorgersen f77de41b2e Merge pull request #706 from stianst/master
Fix welcome-theme for testsuite
2014-09-25 11:54:21 +02:00
Stian Thorgersen c12577e886 Fix welcome-theme for testsuite 2014-09-25 11:53:28 +02:00
Stian Thorgersen 5daec20a6e Merge pull request #705 from cvasilak/doc-link
fix docbook link
2014-09-24 12:05:11 +01:00
Christos Vasilakis 6d3aaa0560 fix docbook link 2014-09-24 12:58:18 +03:00
Stian Thorgersen 2e11e71453 Merge pull request #704 from cvasilak/link.fix
fix create-realm link
2014-09-24 10:03:21 +01:00
Christos Vasilakis fb561b8fd6 fix create-realm link 2014-09-24 11:40:22 +03:00
Bill Burke 0bf6c36ca7 add auth method to ClientSession 2014-09-23 11:18:39 -04:00
Bill Burke 66d58476d0 refactor security page flow 2014-09-23 11:05:10 -04:00
Bill Burke bf42227224 remove junk 2014-09-22 16:35:22 -04:00
Bill Burke 99a6713e6f clientsession notes 2014-09-22 16:34:42 -04:00
Bill Burke a26ac1758c Merge pull request #703 from patriot1burke/master
KEYCLOAK-705 and 687
2014-09-19 11:37:25 -04:00
Bill Burke ef60e17641 security vulnerability doc 2014-09-19 11:35:15 -04:00
Bill Burke 53943f8246 KEYCLOAK-705 2014-09-19 11:03:08 -04:00
Bill Burke 0b8b31a3ea KEYCLOAK-705 2014-09-19 10:00:47 -04:00
Stian Thorgersen 6f3132eafd Merge pull request #701 from stianst/master
KEYCLOAK-696 Display Keycloak version in admin console
2014-09-18 13:24:38 +02:00
Stian Thorgersen dcb5717154 KEYCLOAK-696 Display Keycloak version in admin console 2014-09-18 13:24:03 +02:00
Stian Thorgersen bfdb8d4e2d Merge pull request #700 from stianst/master
Removed info log statement
2014-09-18 12:38:48 +02:00
Stian Thorgersen 91fced3b87 Removed info log statement 2014-09-18 12:37:51 +02:00
Marek Posolda 825c475c7f Merge pull request #699 from mposolda/master
Admin console fixes, KEYCLOAK_REMEMBER_ME life changed to 1 year
2014-09-18 11:15:09 +02:00
mposolda 89471b7db1 KEYCLOAK-695 Let KEYCLOAK_REMEMBER_ME cookie to be valid for 1 year 2014-09-18 11:03:44 +02:00
mposolda 95233af485 KEYCLOAK-694 Fix JS error which could happen when creating application 2014-09-18 10:51:10 +02:00
mposolda fc37398235 KEYCLOAK-693 Hide top navigation when creating OAuth client 2014-09-18 10:50:18 +02:00
Marek Posolda 16ea18370d Merge pull request #698 from mposolda/master
Prefill login form just if rememberMe enabled for the realm
2014-09-17 08:59:00 +02:00
mposolda 1049bca433 Prefill login form just if rememberMe enabled for the realm 2014-09-17 08:54:29 +02:00
Marek Posolda 364174fb7e Merge pull request #697 from mposolda/master
Cookie & rememberMe fix. Fixing testsuite with mongo
2014-09-16 22:15:27 +02:00
mposolda 5352872b4b Use KEYCLOAK_REMEMBER_ME as hint to prefill login form. Change lifespan of KEYCLOAK_IDENTITY to maxSsoSessionLifespan 2014-09-16 22:09:27 +02:00
mposolda bd0887d18e Fixing testsuite for mongo 2014-09-16 20:02:30 +02:00
Marek Posolda 9a5f42039d Merge pull request #696 from mposolda/master
Added directive kcNavigationApplication and kcNavigationOauthClient. Hide Scope and Claims for bearer-only apps
2014-09-12 20:16:52 +02:00
mposolda ce8dd136bd Added directive kcNavigationApplication and kcNavigationOauthClient. Hide Scope and Claims for bearer-only apps 2014-09-12 20:15:11 +02:00
mposolda 1be2bff95f Typo 2014-09-12 16:57:02 +02:00
Stian Thorgersen 485ca9c90f Merge pull request #695 from stianst/master
KEYCLOAK-657 Set cache-control for keycloak.js and login-iframe
2014-09-12 13:47:20 +02:00
Stian Thorgersen 811cfd52c9 KEYCLOAK-657 Set cache-control for keycloak.js and login-iframe 2014-09-12 13:46:56 +02:00
Stian Thorgersen 5c1807eb2d Merge pull request #694 from stianst/master
Fixes to KEYCLOAK-682
2014-09-12 12:27:31 +02:00
Stian Thorgersen 7c15a70f53 Fixes to KEYCLOAK-682 2014-09-12 12:26:52 +02:00
Stian Thorgersen c9c525e942 Merge pull request #693 from stianst/master
KEYCLOAK-682 Only send logout admin action to clients associated with us...
2014-09-12 11:47:30 +02:00
Stian Thorgersen 5d141d4d8a KEYCLOAK-682 Only send logout admin action to clients associated with user session 2014-09-12 11:47:11 +02:00
Stian Thorgersen e96d6f0dfd Merge pull request #692 from stianst/master
Change version schema to match JBoss
2014-09-12 09:36:27 +02:00
Stian Thorgersen 423dc1b8a7 Change version schema to match JBoss 2014-09-12 09:35:08 +02:00
Marek Posolda ab080dcdd8 Merge pull request #691 from mposolda/master
Preserve form values in account mgmt after error. Allow valid email during registration or account mgmt
2014-09-11 20:57:27 +02:00
mposolda 6f173d4554 KEYCLOAK-678 Preserve form values in account mgmt after error 2014-09-11 20:54:48 +02:00
mposolda 649a40f58c KEYCLOAK-676 Validate email address format during registration or account mgmt 2014-09-11 20:05:00 +02:00
Stian Thorgersen d06668d39b Merge pull request #690 from stianst/master
KEYCLOAK-653 Add theme support to welcome-pages
2014-09-11 15:58:51 +02:00
Stian Thorgersen b23463a1d2 KEYCLOAK-653 Add theme support to welcome-pages 2014-09-11 15:58:29 +02:00
Stian Thorgersen 7f81032577 Merge pull request #689 from stianst/master
KEYCLOAK-680 Add/remove social-links through admin api
2014-09-11 12:10:23 +02:00
Stian Thorgersen 280cbf2174 KEYCLOAK-680 Add/remove social-links through admin api 2014-09-11 12:09:55 +02:00
Stian Thorgersen 228bb297c2 Merge pull request #688 from stianst/master
Added KEYCLOAK_DEV_PORT env variable for KeycloakServer
2014-09-11 11:05:53 +02:00
Stian Thorgersen f96e59d085 Added KEYCLOAK_DEV_PORT env variable for KeycloakServer 2014-09-11 11:05:29 +02:00
Stian Thorgersen 86300e7e86 Merge pull request #687 from stianst/master
Version bump
2014-09-11 09:29:37 +02:00
Stian Thorgersen 5dea07793b Version bump 2014-09-11 09:27:58 +02:00
Marek Posolda 5e51204114 Merge pull request #686 from mposolda/master
KEYCLOAK-674 Reduce info level logging in adapters
2014-09-10 16:04:48 +02:00
mposolda 4c0751c1a0 KEYCLOAK-674 Reduce info level logging in adapters 2014-09-10 16:02:22 +02:00
Marek Posolda ec1434c65e Merge pull request #685 from mposolda/master
Support for cors in PublicRealmResource
2014-09-10 13:16:21 +02:00
mposolda aa7bbeb11b Support for cors in PublicRealmResource 2014-09-10 13:05:53 +02:00
Marek Posolda 88a39dbaf7 Merge pull request #683 from mposolda/master
KEYCLOAK-670 allow ServerInfo to be available with cors
2014-09-10 10:52:33 +02:00
mposolda 52920119bd Ensure that ServerInfo request is authorized and add CORS support to it 2014-09-10 10:42:05 +02:00
mposolda 47ac358bb6 Fix timeouts in cors example 2014-09-10 10:42:04 +02:00
Stian Thorgersen 62aa2d7f65 Merge pull request #684 from stianst/master
Fix CRSF protection on Chrome, and add check if 'Referer' header
2014-09-10 10:34:49 +02:00
Stian Thorgersen 557de7690e Fix CRSF protection on Chrome, and add check if 'Referer' header 2014-09-10 10:32:56 +02:00
Bill Burke 4c8da3d614 Merge pull request #682 from patriot1burke/master
version bump
2014-09-09 13:35:39 -04:00
Bill Burke 3f539c6d5c version bump 2014-09-09 13:34:56 -04:00
Bill Burke 5b1d67f17d Merge pull request #681 from patriot1burke/master
change CSRF to random value
2014-09-09 13:27:59 -04:00
Bill Burke e3e32982a0 change CSRF to random value 2014-09-09 13:27:34 -04:00
Bill Burke b771cd30e7 Merge pull request #680 from patriot1burke/master
nolog CORS exception
2014-09-09 12:54:55 -04:00
Bill Burke ac29db51e5 nolog CORS exception 2014-09-09 12:51:55 -04:00
Bill Burke 6e3770f04a Merge pull request #679 from patriot1burke/master
CSRF
2014-09-09 12:07:29 -04:00
Bill Burke d0a3a04d34 CSRF 2014-09-09 12:06:48 -04:00
Stian Thorgersen c5662020d8 Merge pull request #678 from stianst/master
Moved logo-example themes to examples/themes
2014-09-09 14:09:58 +02:00
Stian Thorgersen fea0d1af66 Moved logo-example themes to examples/themes 2014-09-09 14:09:32 +02:00
Stian Thorgersen 30cd28d288 Merge pull request #677 from stianst/master
KEYCLOAK-668 Make sure keycloak.js doesn't send multiple concurrent requ...
2014-09-09 13:46:21 +02:00
Stian Thorgersen c475721dab KEYCLOAK-668 Make sure keycloak.js doesn't send multiple concurrent requests to refresh the token 2014-09-09 13:45:55 +02:00
Stian Thorgersen 839069ca15 Merge pull request #676 from stianst/master
Fixes to admin console random logout
2014-09-09 11:02:19 +02:00
Stian Thorgersen 09860f1ee1 Fix test 2014-09-09 11:01:24 +02:00
Stian Thorgersen a1b6378bef KEYCLOAK-667 Remove client-side idle timeout from admin console - with sso idle timeout we have a server-side mechanism for this 2014-09-09 11:01:24 +02:00
Stian Thorgersen 3530fa6259 KEYCLOAK-666 Update session last refreshed on every token refresh 2014-09-09 11:01:24 +02:00
Bill Burke d22afd78e6 Merge pull request #675 from patriot1burke/master
doc update
2014-09-08 09:09:07 -04:00
Bill Burke f1986093e6 doc update 2014-09-08 09:07:51 -04:00
Stian Thorgersen 6c5477bc02 Merge pull request #674 from stianst/master
Minor fixes to theme docs
2014-09-08 14:59:34 +02:00
Stian Thorgersen ae6fd458e8 Minor fixes to theme docs 2014-09-08 14:59:09 +02:00
Stian Thorgersen cdda48d895 Merge pull request #673 from stianst/master
Typo fix in docs
2014-09-08 10:25:18 +02:00
Stian Thorgersen 556314ae15 Typo fix in docs 2014-09-08 10:24:47 +02:00
Stian Thorgersen a2845fa0b4 Merge pull request #672 from stianst/master
Added instruction to manually configure and deploy the unconfigured demo
2014-09-03 13:32:33 +02:00
Stian Thorgersen 8c4a3374d3 Added instruction to manually configure and deploy the unconfigured demo 2014-09-03 13:20:58 +02:00
Stian Thorgersen b97106b750 Adding changes to examples overview readme 2014-09-03 13:18:14 +02:00
Stian Thorgersen 7907abd206 Merge pull request #671 from stianst/master
Added README.md with Overview of all examples
2014-09-03 11:22:42 +02:00
Stian Thorgersen 090871f8b9 Added README.md with Overview of all examples 2014-09-03 11:22:08 +02:00
Stian Thorgersen 0baf12c0ef Merge pull request #670 from stianst/master
Updates to server-installation docs
2014-09-03 10:13:36 +02:00
Stian Thorgersen 1599371ee5 Updates to server-installation docs 2014-09-03 10:13:05 +02:00
Stian Thorgersen 3bc27ef366 Merge pull request #669 from stianst/master
Fix AccountTest.viewLog test
2014-09-03 08:53:56 +02:00
Stian Thorgersen d5c5cc8321 Fix AccountTest.viewLog test 2014-09-03 08:53:02 +02:00
Bill Burke aea00fc574 Merge pull request #668 from patriot1burke/master
admin theme refactor
2014-09-02 11:37:32 -04:00
Bill Burke e9dc8b2460 refactor admin theme 2014-09-02 11:36:59 -04:00
Bill Burke eaed199b20 add logo example theme 2014-09-02 11:11:26 -04:00
Marek Posolda f7fcefc11c Merge pull request #667 from mposolda/master
KEYCLOAK-659 Export current version number during export
2014-09-02 17:09:10 +02:00
mposolda 1f0dcbddbe KEYCLOAK-659 Export current version number during export 2014-09-02 17:06:58 +02:00
Stian Thorgersen 9af0743883 Merge pull request #666 from stianst/master
Updated docs to inherit project version from keycloak-parent
2014-09-02 14:07:24 +02:00
Stian Thorgersen 7d4863783c Use keycloak-parent in docbook to inherit project version 2014-09-02 13:57:23 +02:00
Stian Thorgersen d87718f768 Inject project version from pom 2014-09-02 13:22:15 +02:00
Stian Thorgersen c7ba6159b5 Merge pull request #665 from stianst/master
Doc fix
2014-09-02 12:52:42 +02:00
Stian Thorgersen b43909aff1 Doc fix 2014-09-02 12:52:22 +02:00
Marek Posolda 87d9a5422d Merge pull request #664 from mposolda/master
Use stronger passwords in LDAP tests due to password policy on MSAD2012
2014-09-02 12:49:34 +02:00
mposolda 44937d33ad Use stronger passwords in LDAP tests due to password policy on MSAD2012 2014-09-02 12:43:14 +02:00
Stian Thorgersen b561080f3a Merge pull request #663 from stianst/master
Fix search for users by attribute on mongo
2014-09-02 11:52:15 +02:00
Stian Thorgersen d905ce12e3 Fix search for users by attribute on mongo 2014-09-02 11:51:29 +02:00
Marek Posolda 7040bd1c51 Merge pull request #662 from mposolda/master
Fix SyncProvidersTest with ActiveDirectory
2014-09-02 11:12:43 +02:00
mposolda cd91a29a89 Fix SyncProvidersTest with ActiveDirectory 2014-09-02 11:06:31 +02:00
Stian Thorgersen b1b452815a Merge pull request #661 from stianst/master
KEYCLOAK-656 Remove login-status-iframe from dist
2014-09-02 10:54:52 +02:00
Stian Thorgersen 59d66dd20e KEYCLOAK-656 Remove login-status-iframe from dist 2014-09-02 10:54:26 +02:00
Stian Thorgersen 0763d0d9d6 Merge pull request #660 from stianst/master
KEYCLOAK-658 Fix searching for users
2014-09-02 10:02:08 +02:00
Stian Thorgersen 8c8c44e50f KEYCLOAK-658 Fix searching for users 2014-09-02 10:01:44 +02:00
Marek Posolda 14b1941454 Merge pull request #659 from mposolda/master
Added more props to LDAPEmbeddedServer to allow automated test with Acti...
2014-09-01 20:54:49 +02:00
mposolda e52811ac28 Added more props to LDAPEmbeddedServer to allow automated test with ActiveDirectory 2014-09-01 20:43:14 +02:00
Stian Thorgersen 4f3a980f8b Merge pull request #658 from stianst/master
Version bump
2014-09-01 10:17:31 +02:00
Stian Thorgersen 05a1fc1ded Version bump 2014-09-01 10:17:00 +02:00
Stian Thorgersen ff74d1ddc0 Merge pull request #657 from stianst/master
Various fixes
2014-08-29 17:11:53 +02:00
Stian Thorgersen 31b0f5543f Fixes 2014-08-29 17:11:18 +02:00
Stian Thorgersen 39c0be5d99 KEYCLOAK-652
Social user can't set password
2014-08-29 16:51:10 +02:00
Stian Thorgersen fb18789b05 KEYCLOAK-650
Server error while trying to download keycloak.json for oauth client
2014-08-29 16:08:42 +02:00
Stian Thorgersen bcbf5da4b8 KEYCLOAK-651
Page not found trying to save changes to brute force
2014-08-29 16:04:37 +02:00
Stian Thorgersen e1b9dfe65d KEYCLOAK-649 Invalidate realm if app name or client clientId is changed 2014-08-29 15:49:17 +02:00
Stian Thorgersen 52f86f2293 Merge pull request #656 from stianst/master
Fixes to event-store-mem example
2014-08-29 14:56:09 +02:00
Stian Thorgersen e413694cf5 Fixes to event-store-mem example 2014-08-29 14:55:45 +02:00
Stian Thorgersen 20ce36dc64 Merge pull request #655 from stianst/master
Clean user credential management form
2014-08-29 11:06:11 +02:00
Stian Thorgersen a3c982a630 Clean user credential management form 2014-08-29 11:05:37 +02:00
Stian Thorgersen e0542b5260 Merge pull request #654 from stianst/master
KEYCLOAK-648 Fix removing role from composite role
2014-08-29 10:27:29 +02:00
Stian Thorgersen 7c7025a83d KEYCLOAK-648 Fix removing role from composite role 2014-08-29 10:18:00 +02:00
Stian Thorgersen 3e6a1f47ec Merge pull request #653 from stianst/master
Fix test
2014-08-29 09:10:41 +02:00
Stian Thorgersen 32703d19a0 Fix test 2014-08-29 08:59:57 +02:00
Stian Thorgersen cdc6588ac1 Merge branch 'ungarida-master' 2014-08-28 14:30:29 +02:00
Stian Thorgersen 57aea9b51c Merge branch 'master' of https://github.com/ungarida/keycloak into ungarida-master
Conflicts:
	integration/tomcat7/adapter/src/main/java/org/keycloak/adapters/tomcat7/AuthenticatedActionsValve.java
2014-08-28 14:29:07 +02:00
Stian Thorgersen a2171bf777 Merge pull request #652 from stianst/master
Password token
2014-08-28 14:22:51 +02:00
Stian Thorgersen b9d0f64f74 Added password token to use inplace of plain-text password for totp 2014-08-28 13:51:55 +02:00
Stian Thorgersen 55d614fce8 Reduce log in UserFederationResource 2014-08-28 11:26:55 +02:00
Stian Thorgersen 46d118207a Merge pull request #651 from stianst/master
Rename audit to events
2014-08-28 11:07:02 +02:00
Stian Thorgersen 3bfe3d256e Rename audit to events 2014-08-28 10:56:37 +02:00
Marek Posolda b50ab14a0a Merge pull request #650 from mposolda/master
More Federation & LDAP fixes
2014-08-27 12:41:38 +02:00
mposolda 08c58cf2f2 Upgrade picketlink to 2.7.0.Beta1 2014-08-27 12:22:15 +02:00
mposolda d26543360b KEYCLOAK-646 Fix LDAP authentication when there are commas in the value of bindingProperty 2014-08-27 12:19:23 +02:00
mposolda fb18004c1d KEYCLOAK-643 Handle flows with adding user with existing username or email in federation providers 2014-08-27 12:19:23 +02:00
Stian Thorgersen 49fb452a79 Merge pull request #649 from stianst/master
KEYCLOAK-531 Reduce info level logging
2014-08-27 11:17:56 +02:00
Stian Thorgersen 55bd889a0f KEYCLOAK-531 Reduce info level logging 2014-08-27 11:17:24 +02:00
Stian Thorgersen 269a0dbec1 Merge pull request #643 from ssilvert/KEYCLOAK-642-subsys-wfcontroller
KEYCLOAK-642 Latest WildFly breaks Keycloak Subsystem
2014-08-27 08:19:20 +02:00
Marek Posolda cf51db88e7 Merge pull request #648 from mposolda/master
Federation & LDAP related fixes
2014-08-26 20:43:23 +02:00
mposolda fc0889cd2e KEYCLOAK-644 Searching by email from LDAP doesn't work 2014-08-26 20:24:25 +02:00
mposolda b3b480c25f Display proper error message if LDAP-linked user couldn't be deleted due to read-only mode 2014-08-26 19:10:48 +02:00
mposolda 892fa04130 KEYCLOAK-645 Disable username field when editing user in admin console 2014-08-26 18:04:26 +02:00
Marek Posolda 8d3e51c236 Merge pull request #647 from mposolda/master
Handle exceptions and UI errors when user is read only. Minor sync issue
2014-08-26 13:02:11 +02:00
mposolda fd9d2ba4d5 Handle exceptions and UI errors when user is read only. Some sync issues 2014-08-26 12:54:05 +02:00
Marek Posolda 75bc633a33 Merge pull request #645 from mposolda/master
Fix pagination of searching users
2014-08-25 21:14:56 +02:00
mposolda 3fdb22cb05 Fix pagination of searching users 2014-08-25 21:13:50 +02:00
Marek Posolda f51ba1cb8a Merge pull request #644 from mposolda/master
Docs about sync. Tooltips and minor fixes
2014-08-25 17:19:02 +02:00
mposolda 688f4a07a3 Added docs about sync of users 2014-08-25 17:17:32 +02:00
mposolda 6c7d0f27a7 More tooltips for LDAP and generic federation. Minor fixes 2014-08-25 16:28:52 +02:00
Stan Silvert 1e5ca3062c KEYCLOAK-642 Latest WildFly breaks Keycloak Subsystem 2014-08-22 13:49:57 -04:00
Bill Burke ca97e7ba35 Merge pull request #642 from patriot1burke/master
import console from export
2014-08-21 17:25:16 -04:00
Bill Burke e99afec7ec import console from export 2014-08-21 17:17:09 -04:00
Bill Burke a23853a6bc Merge pull request #641 from patriot1burke/master
bump pom
2014-08-21 10:47:22 -04:00
Bill Burke 7c8edb5d11 bump pom 2014-08-21 10:46:49 -04:00
Bill Burke 83ad045410 Merge pull request #640 from patriot1burke/master
last fixes for rc1
2014-08-20 14:51:14 -04:00
Bill Burke e5d5276135 race 2014-08-20 14:50:28 -04:00
Bill Burke 6f38a02aaa SSL mode docs 2014-08-20 14:37:15 -04:00
Bill Burke 5dd84f1d9a fix AccountService referrer problems 2014-08-20 14:20:59 -04:00
Bill Burke 30147ce25a import doc 2014-08-20 13:32:14 -04:00
Bill Burke dd011f043d fix cors demo 2014-08-20 13:29:09 -04:00
Bill Burke 7dec0319b6 doc ix 2014-08-20 13:26:57 -04:00
Bill Burke 06c14df0f3 Merge pull request #639 from patriot1burke/master
enhancements
2014-08-20 11:56:29 -04:00
Bill Burke 041d0be990 add notification messages 2014-08-20 11:55:59 -04:00
Bill Burke f6a76e673c add federation breadcrums 2014-08-20 11:40:48 -04:00
Bill Burke 47f361a4ab nocache for fed provider list 2014-08-20 11:29:45 -04:00
Bill Burke 6e7924da76 demo fixes 2014-08-20 11:08:40 -04:00
Bill Burke df1a0c03b6 Merge pull request #638 from patriot1burke/master
readme
2014-08-20 08:51:03 -04:00
Bill Burke 971bea8a24 readme again 2014-08-20 08:50:24 -04:00
Bill Burke c8f0a1ab5a readme 2014-08-20 08:49:42 -04:00
Bill Burke 0ae9ac0848 Merge pull request #637 from patriot1burke/master
doc touchup
2014-08-19 15:10:52 -04:00
Bill Burke 3dd52e8b28 doc touchup 2014-08-19 15:10:32 -04:00
Bill Burke 0f6915c615 Merge pull request #636 from patriot1burke/master
fix mongo
2014-08-19 14:49:35 -04:00
Bill Burke 74cd23b331 fix mongo 2014-08-19 14:49:15 -04:00
Bill Burke cc17895ef3 Merge pull request #635 from patriot1burke/master
more minor screen changes
2014-08-19 12:13:24 -04:00
Bill Burke 09ada81b27 more minor screen changes 2014-08-19 12:12:58 -04:00
Bill Burke 75e0fa87c3 Merge pull request #632 from ssilvert/master
Add web-console and http-endpoint default configurations for WildFly
2014-08-18 18:56:02 -04:00
Bill Burke 6628e226e4 Merge pull request #631 from ssilvert/Use-KeycloakDS
By default, the datasource should be KeycloakDS instead of ExampleDS.
2014-08-18 18:55:53 -04:00
Bill Burke 89d47a392b Merge pull request #634 from patriot1burke/master
buncho fixes
2014-08-18 18:55:18 -04:00
Bill Burke c38abb2cfe ? 2014-08-18 18:52:51 -04:00
Bill Burke faf18dfdfd fix cookie parsing problem 2014-08-18 18:36:36 -04:00
Bill Burke 2dc32fb8c9 fix menu error 2014-08-18 18:06:23 -04:00
Bill Burke 2ec029e8e0 Merge pull request #633 from patriot1burke/master
social fixes
2014-08-18 11:56:14 -04:00
Bill Burke 80904209b3 KEYCLOAK-627 2014-08-18 11:55:27 -04:00
Bill Burke 8b1483d7ef docs 2014-08-18 10:48:28 -04:00
Bill Burke bbeff1ef22 Merge remote-tracking branch 'upstream/master' 2014-08-18 10:40:55 -04:00
Stan Silvert aac3c2e0ee Don't block server artifact from being pushed to the repo. 2014-08-15 14:51:38 -04:00
Stan Silvert a240a00983 Add web-console and http-endpoint default configurations for WildFly
build.
2014-08-15 13:43:18 -04:00
Bill Burke c86a6ba3f3 fix admin reset email 2014-08-15 11:46:38 -04:00
Stan Silvert bc301baa1f By default, the datasource should be KeycloakDS instead of ExampleDS. 2014-08-15 08:55:04 -04:00
Bill Burke edbf26f007 Merge pull request #630 from patriot1burke/master
expanded token service coverage
2014-08-14 21:01:26 -04:00
Bill Burke 5dca2a3588 expanded token service coverage 2014-08-14 21:01:05 -04:00
Bill Burke cf5a7d228b Merge pull request #629 from patriot1burke/master
add some breadcrumbs, add app role
2014-08-14 18:47:15 -04:00
Bill Burke f7a7c3ca7b add some breadcrumbs, add app role 2014-08-14 18:46:53 -04:00
Bill Burke 28fcdf0b8f Merge pull request #628 from patriot1burke/master
relative uri problem
2014-08-14 12:00:03 -04:00
Bill Burke c38ec33881 tooltip fixes 2014-08-14 11:59:03 -04:00
Bill Burke cfee00d4c5 fix relative uri problem 2014-08-14 11:01:04 -04:00
Bill Burke 46bf0d78fa Merge pull request #627 from patriot1burke/master
more tooltips
2014-08-13 15:11:28 -04:00
Bill Burke a14be592de more tooltips 2014-08-13 15:11:05 -04:00
Bill Burke 29691a3167 Merge pull request #626 from patriot1burke/master
more tooltips, change password
2014-08-13 12:17:48 -04:00
Bill Burke 517a2b99d7 more tooltips 2014-08-13 12:17:20 -04:00
Bill Burke edf73af508 change password 2014-08-13 10:35:49 -04:00
Bill Burke 4a5ea08a2a Merge pull request #625 from patriot1burke/master
tooltips
2014-08-13 09:42:09 -04:00
Bill Burke 7b86cca649 better tooltip user 2014-08-13 09:40:43 -04:00
Bill Burke c77b7cd7d6 fix required user tooltip 2014-08-13 09:38:56 -04:00
Bill Burke 6b0a87c57a Merge pull request #624 from patriot1burke/master
add js adapter to dist
2014-08-12 18:25:03 -04:00
Bill Burke b1c331c5f3 add js adapter to dist 2014-08-12 18:24:40 -04:00
Bill Burke 7ae342452e Merge pull request #623 from patriot1burke/master
tooltips
2014-08-12 16:31:25 -04:00
Bill Burke 4438aa6606 tooltips 2014-08-12 16:22:26 -04:00
Marek Posolda 8cd8472003 Merge pull request #622 from mposolda/master
Sync admin UI and fixes.
2014-08-12 19:13:50 +02:00
mposolda 687aa78567 Fix issue in sync admin UI 2014-08-12 19:12:05 +02:00
mposolda 8419e5883d Ensure that transaction.isActive() is false after commit or rollback 2014-08-12 18:58:37 +02:00
mposolda 4bac0474c6 Sync UI for generic providers 2014-08-12 18:12:28 +02:00
mposolda f0b66a2241 Admin console UI for sync of users from LDAP. Sync fixes 2014-08-12 18:12:27 +02:00
Bill Burke 51b71e8f20 Merge pull request #621 from patriot1burke/master
refactor UI screens, remove breadcrumbs
2014-08-12 11:09:50 -04:00
Bill Burke 8615515b9a refactor UI screens, remove breadcrumbs 2014-08-12 11:07:39 -04:00
Bill Burke 10cf486d26 Merge pull request #620 from ssilvert/KEYCLOAK-331-ear
KEYCLOAK-331 Fixed NPE when user specifies EAR name instead of WAR in subsystem.
2014-08-12 10:29:46 -04:00
Bill Burke abb1647672 Merge pull request #619 from patriot1burke/master
fix logout
2014-08-12 10:06:44 -04:00
Bill Burke 114c1b95fa fix logout 2014-08-12 10:06:19 -04:00
Stan Silvert 4e88bbc811 KEYCLOAK-331 Fixed NPE when user specifies EAR name instead of WAR in standalone.xml. Also, fixed EAR deployment in general and added EAR example. 2014-08-12 10:03:20 -04:00
Stan Silvert 504a41aec4 KEYCLOAK-331 Fixed NPE when user specifies EAR name instead of WAR in
standalone.xml.  Also, fixed EAR deployment in general and added EAR
example.
2014-08-12 09:58:54 -04:00
Stian Thorgersen e9bf1ef618 Merge pull request #618 from stianst/master
Fix test
2014-08-12 12:14:32 +01:00
Stian Thorgersen 9d6e450c05 Fix test 2014-08-12 12:13:59 +01:00
Stian Thorgersen fb7e95f1e4 Merge pull request #617 from stianst/master
KEYCLOAK-592 Display login form with error message if trying to login wi...
2014-08-12 12:06:39 +01:00
Stian Thorgersen f95418dfc9 KEYCLOAK-592 Display login form with error message if trying to login with social provider where email already exists 2014-08-12 12:06:13 +01:00
Bill Burke 94be235a0f Merge pull request #616 from patriot1burke/master
menu
2014-08-11 17:48:52 -04:00
Bill Burke 100de5a55e menu 2014-08-11 17:47:55 -04:00
Bill Burke 26570de4cd Merge pull request #615 from patriot1burke/master
X-Frame-Options, Content-Security-Policy
2014-08-11 17:45:26 -04:00
Bill Burke 7c97e02715 X-Frame-Options, Content-Security-Policy 2014-08-11 17:45:01 -04:00
Bill Burke e73bdf9d8c Merge pull request #614 from patriot1burke/master
add jpa realm attributes
2014-08-11 12:33:36 -04:00
Bill Burke 8d1ff1d49c add jpa realm attributes 2014-08-11 12:33:17 -04:00
Stian Thorgersen de770d2881 Merge pull request #613 from stianst/master
Added tooltip to realm enabled button
2014-08-11 16:14:14 +01:00
Stian Thorgersen 7f96770089 Added tooltip to realm enabled button 2014-08-11 16:13:38 +01:00
Stian Thorgersen 3f83538fc1 Merge pull request #612 from stianst/master
KEYCLOAK-616 Not require registration to add a new social user
2014-08-11 15:35:54 +01:00
Stian Thorgersen 3040f4e89f KEYCLOAK-616 Not require registration to add a new social user 2014-08-11 15:34:57 +01:00
Marek Posolda c57c264d91 Merge pull request #611 from mposolda/master
Fix transaction handling in KeycloakModelUtils.runJobInTransaction. Star...
2014-08-11 13:53:04 +02:00
mposolda 8ba7559cac Fix transaction handling in KeycloakModelUtils.runJobInTransaction. Start sync tasks for configured federation providers at startup 2014-08-11 13:51:44 +02:00
Marek Posolda c4d5a4138c Merge pull request #610 from mposolda/master
Support for users sync
2014-08-10 23:40:23 +02:00
mposolda d699404ce7 Support for periodic users sync 2014-08-10 23:23:50 +02:00
mposolda ee79747cb6 Sync - first iteration 2014-08-10 23:22:35 +02:00
mposolda 5cb6c4e77c Improve TimerSPI to support cancelling of previously scheduled tasks 2014-08-10 23:17:39 +02:00
Bill Burke 05638a8953 Merge pull request #609 from patriot1burke/master
fixes
2014-08-10 12:29:07 -04:00
Bill Burke 48f7efc97f @NoCache where appropriate 2014-08-10 12:28:43 -04:00
Bill Burke 9aa6b4cbfa optimize imports 2014-08-10 12:17:45 -04:00
Bill Burke cae0a7628d use SecureRandom for totp 2014-08-10 12:12:24 -04:00
Bill Burke 82e29dfcb3 Merge pull request #608 from patriot1burke/master
jiras
2014-08-10 11:50:42 -04:00
Bill Burke ad94b94833 enlarge URL html input 2014-08-10 11:49:58 -04:00
Bill Burke 687e497455 test searchForUserByAttributes 2014-08-10 11:36:02 -04:00
Bill Burke 67f31648a6 Merge pull request #572 from vibe13/duplicated-version
Remove warning from Maven log4j:log4j:jar -> duplicate declaration
2014-08-10 11:04:51 -04:00
Bill Burke d332851a75 Merge pull request #606 from alarikmyrin/KEYCLOAK-621
KEYCLOAK-621 fix searchForUserByAttributes method
2014-08-10 11:02:08 -04:00
Bill Burke 4a18a32cfc Merge pull request #607 from patriot1burke/master
change logout behavior
2014-08-10 09:09:32 -04:00
Alarik Myrin 428cd54a81 KEYCLOAK-621 fix searchForUserByAttributes method so that it works and is not subject to SQL injection 2014-08-09 13:59:20 -04:00
Bill Burke dc4e8603d7 change logout behavior 2014-08-08 18:33:37 -04:00
Marek Posolda b96f8aef6d Merge pull request #605 from mposolda/master
LDAP testing and improvements
2014-08-08 12:24:39 +02:00
mposolda dc50c312cb Configurable if pagination and connectionPooling are supported in LDAP 2014-08-08 12:09:08 +02:00
mposolda 1f12a2d67b Adding LDAPUtils. Bit refactoring LDAP test for easier testing with various servers 2014-08-08 10:40:34 +02:00
Marek Posolda a2bef7dbbe Merge pull request #604 from mposolda/master
Fix testsuite hangs on MySQL and PostgreSQL due to uncommited transactio...
2014-08-07 20:40:12 +02:00
mposolda c6af13c8cc Fix testsuite hangs on MySQL and PostgreSQL due to uncommited transactions 2014-08-07 20:38:20 +02:00
Marek Posolda 5be5f6475f Merge pull request #603 from mposolda/master
Fix adding social link in mongo. Fixed export/import of federationProvid...
2014-08-07 17:39:56 +02:00
mposolda 5673fb34b1 Fix adding social link in mongo. Fixed export/import of federationProviders. Enhanced ExportImportTest 2014-08-07 17:33:48 +02:00
Marek Posolda 5214fe2a55 Merge pull request #602 from mposolda/master
Users not registered with FederationProvider during import, Update docs for database setup
2014-08-07 13:05:23 +02:00
mposolda 76db33829b KEYCLOAK-600 Users shouldn't be registered with Federation Provider on an import 2014-08-07 12:38:56 +02:00
mposolda 746da8f270 Possibility to specify hibernate dialect even if datasource is used 2014-08-07 12:27:12 +02:00
mposolda f8667cdb38 Update documentations for JPA and Mongo 2014-08-07 12:23:46 +02:00
Marek Posolda 1ec4fe921d Merge pull request #601 from mposolda/master
KEYCLOAK-618 Remove org.bouncycastle from jboss-modules-structure.xml as...
2014-08-07 10:34:48 +02:00
mposolda 915701106c KEYCLOAK-618 Remove org.bouncycastle from jboss-modules-structure.xml as it's in auth-server.war 2014-08-07 10:32:26 +02:00
Bill Burke 2309e6f040 Merge pull request #600 from patriot1burke/master
delete fed provider
2014-08-06 20:49:25 -04:00
Bill Burke 839d823edd change delete msg 2014-08-06 20:48:48 -04:00
Bill Burke 99e6f0edad delete fed provider 2014-08-06 20:38:30 -04:00
Bill Burke bb138bd6e4 Merge pull request #599 from patriot1burke/master
KEYCLOAK-547
2014-08-06 19:16:19 -04:00
Bill Burke 32a19563a5 KEYCLOAK-547 2014-08-06 19:15:52 -04:00
Bill Burke 3b65127399 Merge pull request #598 from patriot1burke/master
cookie cache off
2014-08-06 18:04:36 -04:00
Bill Burke c17a5823e9 cookie cache off 2014-08-06 18:01:16 -04:00
Bill Burke c9e88c944a Merge pull request #597 from patriot1burke/master
pom description
2014-08-06 17:50:25 -04:00
Bill Burke b93cf4868c pom description 2014-08-06 17:50:01 -04:00
Bill Burke 53ac88ca26 Merge pull request #596 from patriot1burke/master
version
2014-08-06 15:45:15 -04:00
Bill Burke aff32f69bb version 2014-08-06 15:44:50 -04:00
Bill Burke 4fcf11d0db Merge pull request #595 from patriot1burke/master
bump version
2014-08-06 09:00:47 -04:00
Bill Burke e04af84ac0 bump version 2014-08-06 09:00:23 -04:00
Andrea Vibelli 9e4086e501 Remove warning from Maven log4j:log4j:jar -> duplicate declaration 2014-07-31 11:06:24 +02:00
Davide Ungari 5764ad84e9 Fix equals huge error, too much Javascript lately 2014-07-27 10:02:41 +02:00
Davide Ungari f3fde4a8df Upgrade to tomcat.7.0.54 2014-07-27 10:01:02 +02:00
Davide Ungari 983ccdd121 Merge remote-tracking branch 'upstream/master' 2014-07-26 11:27:08 +02:00
Davide Ungari 73ed22c52c logout 2014-07-26 11:25:27 +02:00
3641 changed files with 536507 additions and 65848 deletions

No files matched your search

+6
View File
@@ -9,6 +9,12 @@
.settings
.classpath
# NetBeans #
############
nbactions.xml
nb-configuration.xml
catalog.xml
# Compiled source #
###################
*.com
+10
View File
@@ -0,0 +1,10 @@
language: java
cache:
directories:
- $HOME/.m2
before_cache:
- rm -rf $HOME/.m2/repository/org/keycloak
sudo: false
+70 -2
View File
@@ -1,4 +1,72 @@
keycloak
Keycloak
========
SSO Service for web apps and REST services.
Keycloak is an SSO Service for web apps and REST services. For more information visit [http://keycloak.org](http://keycloak.org).
Building
--------
Ensure you have JDK 7 (or newer), Maven 3.2.1 (or newer) and Git installed
java -version
mvn -version
git --version
First clone the Keycloak repository:
git clone https://github.com/keycloak/keycloak.git
cd keycloak
To build Keycloak run:
mvn install
This will build all modules and run the testsuite.
To build the distribution run:
mvn install -Pdistribution
Once completed you will find distribution archives in `distribution`.
Starting Keycloak
-----------------
To start Keycloak during development first build as specficied above, then run:
mvn -f testsuite/integration/pom.xml exec:java -Pkeycloak-server
To start Keycloak from the appliance distribution first build the distribution it as specified above, then run:
tar xfz distribution/appliance-dist/target/keycloak-appliance-dist-all-<VERSION>.tar.gz
cd keycloak-appliance-dist-all-<VERSION>/keycloak
bin/standalone.sh
To stop the server press `Ctrl + C`.
Contributing
------------
* See [Hacking on Keycloak](misc/HackingOnKeycloak.md)
Documentation
-------------
* [User Guide, Admin REST API and Javadocs](http://keycloak.jboss.org/docs)
* Developer documentation
* [Hacking on Keycloak](misc/HackingOnKeycloak.md) - how to become a Keycloak contributor
* [Testsuite](misc/Testsuite.md) - details about testsuite, but also how to quickly run Keycloak during development and a few test tools (OTP generation, LDAP server, Mail server)
* [Database Testing](misc/DatabaseTesting.md) - how to do testing of Keycloak on different databases
* [Updating Database](misc/UpdatingDatabaseSchema.md) - how to change the Keycloak database
* [Release Process](misc/ReleaseProcess.md) - how to release Keycloak
License
-------
* [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
-40
View File
@@ -1,40 +0,0 @@
<?xml version="1.0"?>
<project>
<parent>
<artifactId>keycloak-audit-parent</artifactId>
<groupId>org.keycloak</groupId>
<version>1.0-beta-4</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>keycloak-audit-api</artifactId>
<name>Keycloak Audit API</name>
<description/>
<dependencies>
<dependency>
<groupId>org.jboss.logging</groupId>
<artifactId>jboss-logging</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-core</artifactId>
<version>${project.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-model-api</artifactId>
<version>${project.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
@@ -1,149 +0,0 @@
package org.keycloak.audit;
import org.jboss.logging.Logger;
import org.keycloak.models.ClientModel;
import org.keycloak.models.RealmModel;
import org.keycloak.models.UserModel;
import org.keycloak.models.UserSessionModel;
import java.util.HashMap;
import java.util.List;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public class Audit {
private static final Logger log = Logger.getLogger(Audit.class);
private List<AuditListener> listeners;
private Event event;
public Audit(List<AuditListener> listeners, RealmModel realm, String ipAddress) {
this.listeners = listeners;
this.event = new Event();
realm(realm);
ipAddress(ipAddress);
}
Audit() {
}
public Audit realm(RealmModel realm) {
event.setRealmId(realm.getId());
return this;
}
public Audit realm(String realmId) {
event.setRealmId(realmId);
return this;
}
public Audit client(ClientModel client) {
event.setClientId(client.getClientId());
return this;
}
public Audit client(String clientId) {
event.setClientId(clientId);
return this;
}
public Audit user(UserModel user) {
event.setUserId(user.getId());
return this;
}
public Audit user(String userId) {
event.setUserId(userId);
return this;
}
public Audit session(UserSessionModel session) {
event.setSessionId(session.getId());
return this;
}
public Audit session(String sessionId) {
event.setSessionId(sessionId);
return this;
}
public Audit ipAddress(String ipAddress) {
event.setIpAddress(ipAddress);
return this;
}
public Audit event(EventType e) {
event.setEvent(e);
return this;
}
public Audit detail(String key, String value) {
if (value == null || value.equals("")) {
return this;
}
if (event.getDetails() == null) {
event.setDetails(new HashMap<String, String>());
}
event.getDetails().put(key, value);
return this;
}
public Audit removeDetail(String key) {
if (event.getDetails() != null) {
event.getDetails().remove(key);
}
return this;
}
public Event getEvent() {
return event;
}
public void success() {
send();
}
public void error(String error) {
event.setEvent(EventType.valueOf(event.getEvent().name() + "_ERROR"));
event.setError(error);
send();
}
public Audit clone() {
Audit clone = new Audit();
clone.listeners = listeners;
clone.event = event.clone();
return clone;
}
public Audit reset() {
Event old = event;
event = new Event();
event.setRealmId(old.getRealmId());
event.setIpAddress(old.getIpAddress());
event.setClientId(old.getClientId());
event.setUserId(old.getUserId());
return this;
}
private void send() {
event.setTime(System.currentTimeMillis());
if (listeners != null) {
for (AuditListener l : listeners) {
try {
l.onEvent(event);
} catch (Throwable t) {
log.error("Failed to send event to " + l, t);
}
}
}
}
}
@@ -1,12 +0,0 @@
package org.keycloak.audit;
import org.keycloak.provider.Provider;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public interface AuditListener extends Provider {
public void onEvent(Event event);
}
@@ -1,10 +0,0 @@
package org.keycloak.audit;
import org.keycloak.provider.ProviderFactory;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public interface AuditListenerFactory extends ProviderFactory<AuditListener> {
}
@@ -1,27 +0,0 @@
package org.keycloak.audit;
import org.keycloak.provider.Provider;
import org.keycloak.provider.ProviderFactory;
import org.keycloak.provider.Spi;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public class AuditListenerSpi implements Spi {
@Override
public String getName() {
return "audit-listener";
}
@Override
public Class<? extends Provider> getProviderClass() {
return AuditListener.class;
}
@Override
public Class<? extends ProviderFactory> getProviderFactoryClass() {
return AuditListenerFactory.class;
}
}
@@ -1,16 +0,0 @@
package org.keycloak.audit;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public interface AuditProvider extends AuditListener {
public EventQuery createQuery();
public void clear();
public void clear(String realmId);
public void clear(String realmId, long olderThan);
}
@@ -1,10 +0,0 @@
package org.keycloak.audit;
import org.keycloak.provider.ProviderFactory;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public interface AuditProviderFactory extends ProviderFactory<AuditProvider> {
}
@@ -1,27 +0,0 @@
package org.keycloak.audit;
import org.keycloak.provider.Provider;
import org.keycloak.provider.ProviderFactory;
import org.keycloak.provider.Spi;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public class AuditProviderSpi implements Spi {
@Override
public String getName() {
return "audit";
}
@Override
public Class<? extends Provider> getProviderClass() {
return AuditProvider.class;
}
@Override
public Class<? extends ProviderFactory> getProviderFactoryClass() {
return AuditProviderFactory.class;
}
}
@@ -1,23 +0,0 @@
package org.keycloak.audit;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public interface Details {
String EMAIL = "email";
String PREVIOUS_EMAIL = "previous_email";
String UPDATED_EMAIL = "updated_email";
String CODE_ID = "code_id";
String REDIRECT_URI = "redirect_uri";
String RESPONSE_TYPE = "response_type";
String AUTH_METHOD = "auth_method";
String REGISTER_METHOD = "register_method";
String USERNAME = "username";
String REMEMBER_ME = "remember_me";
String TOKEN_ID = "token_id";
String REFRESH_TOKEN_ID = "refresh_token_id";
String VALIDATE_ACCESS_TOKEN = "validate_access_token";
String UPDATED_REFRESH_TOKEN_ID = "updated_refresh_token_id";
}
@@ -1,42 +0,0 @@
package org.keycloak.audit;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public interface Errors {
String REALM_DISABLED = "realm_disabled";
String CLIENT_NOT_FOUND = "client_not_found";
String CLIENT_DISABLED = "client_disabled";
String INVALID_CLIENT_CREDENTIALS = "invalid_client_credentials";
String INVALID_CLIENT = "invalid_client";
String USER_NOT_FOUND = "user_not_found";
String USER_DISABLED = "user_disabled";
String USER_TEMPORARILY_DISABLED = "user_temporarily_disabled";
String INVALID_USER_CREDENTIALS = "invalid_user_credentials";
String USERNAME_MISSING = "username_missing";
String USERNAME_IN_USE = "username_in_use";
String INVALID_REDIRECT_URI = "invalid_redirect_uri";
String INVALID_CODE = "invalid_code";
String INVALID_TOKEN = "invalid_token";
String INVALID_REGISTRATION = "invalid_registration";
String INVALID_FORM = "invalid_form";
String REGISTRATION_DISABLED = "registration_disabled";
String REJECTED_BY_USER = "rejected_by_user";
String NOT_ALLOWED = "not_allowed";
String SOCIAL_PROVIDER_NOT_FOUND = "social_provider_not_found";
String SOCIAL_ID_IN_USE = "social_id_in_use";
String USER_NOT_LOGGED_IN = "user_not_logged_in";
String USER_SESSION_NOT_FOUND = "user_session_not_found";
}
@@ -1,26 +0,0 @@
package org.keycloak.audit;
import java.util.List;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public interface EventQuery {
public EventQuery event(EventType... events);
public EventQuery realm(String realmId);
public EventQuery client(String clientId);
public EventQuery user(String userId);
public EventQuery ipAddress(String ipAddress);
public EventQuery firstResult(int result);
public EventQuery maxResults(int results);
public List<Event> getResultList();
}
@@ -1,44 +0,0 @@
package org.keycloak.audit;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public enum EventType {
LOGIN,
LOGIN_ERROR,
REGISTER,
REGISTER_ERROR,
LOGOUT,
LOGOUT_ERROR,
CODE_TO_TOKEN,
CODE_TO_TOKEN_ERROR,
REFRESH_TOKEN,
VALIDATE_ACCESS_TOKEN,
VALIDATE_ACCESS_TOKEN_ERROR,
REFRESH_TOKEN_ERROR,
SOCIAL_LINK,
SOCIAL_LINK_ERROR,
REMOVE_SOCIAL_LINK,
REMOVE_SOCIAL_LINK_ERROR,
UPDATE_EMAIL,
UPDATE_EMAIL_ERROR,
UPDATE_PROFILE,
UPDATE_PROFILE_ERROR,
UPDATE_PASSWORD,
UPDATE_PASSWORD_ERROR,
UPDATE_TOTP,
UPDATE_TOTP_ERROR,
VERIFY_EMAIL,
VERIFY_EMAIL_ERROR,
REMOVE_TOTP,
REMOVE_TOTP_ERROR,
SEND_VERIFY_EMAIL,
SEND_VERIFY_EMAIL_ERROR,
SEND_RESET_PASSWORD,
SEND_RESET_PASSWORD_ERROR
}
@@ -1,2 +0,0 @@
org.keycloak.audit.AuditProviderSpi
org.keycloak.audit.AuditListenerSpi
-52
View File
@@ -1,52 +0,0 @@
<?xml version="1.0"?>
<project>
<parent>
<artifactId>keycloak-audit-parent</artifactId>
<groupId>org.keycloak</groupId>
<version>1.0-beta-4</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>keycloak-audit-email</artifactId>
<name>Keycloak Audit Email Provider</name>
<description/>
<dependencies>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-core</artifactId>
<version>${project.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-model-api</artifactId>
<version>${project.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-audit-api</artifactId>
<version>${project.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-email-api</artifactId>
<version>${project.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.jboss.logging</groupId>
<artifactId>jboss-logging</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
@@ -1,56 +0,0 @@
package org.keycloak.audit.email;
import org.jboss.logging.Logger;
import org.keycloak.audit.AuditListener;
import org.keycloak.audit.Event;
import org.keycloak.audit.EventType;
import org.keycloak.email.EmailException;
import org.keycloak.email.EmailProvider;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.RealmProvider;
import org.keycloak.models.RealmModel;
import org.keycloak.models.UserModel;
import java.util.Set;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public class EmailAuditListener implements AuditListener {
private static final Logger log = Logger.getLogger(EmailAuditListener.class);
private KeycloakSession session;
private RealmProvider model;
private EmailProvider emailProvider;
private Set<EventType> includedEvents;
public EmailAuditListener(KeycloakSession session, EmailProvider emailProvider, Set<EventType> includedEvents) {
this.session = session;
this.model = session.realms();
this.emailProvider = emailProvider;
this.includedEvents = includedEvents;
}
@Override
public void onEvent(Event event) {
if (includedEvents.contains(event.getEvent())) {
if (event.getRealmId() != null && event.getUserId() != null) {
RealmModel realm = model.getRealm(event.getRealmId());
UserModel user = session.users().getUserById(event.getUserId(), realm);
if (user != null && user.getEmail() != null && user.isEmailVerified()) {
try {
emailProvider.setRealm(realm).setUser(user).sendEvent(event);
} catch (EmailException e) {
log.error("Failed to send event mail", e);
}
}
}
}
}
@Override
public void close() {
}
}
@@ -1,60 +0,0 @@
package org.keycloak.audit.email;
import org.keycloak.Config;
import org.keycloak.audit.AuditListener;
import org.keycloak.audit.AuditListenerFactory;
import org.keycloak.audit.EventType;
import org.keycloak.email.EmailProvider;
import org.keycloak.models.KeycloakSession;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public class EmailAuditListenerFactory implements AuditListenerFactory {
private static final Set<EventType> SUPPORTED_EVENTS = new HashSet<EventType>();
static {
Collections.addAll(SUPPORTED_EVENTS, EventType.LOGIN_ERROR, EventType.UPDATE_PASSWORD, EventType.REMOVE_TOTP, EventType.UPDATE_TOTP);
}
private Set<EventType> includedEvents = new HashSet<EventType>();
@Override
public AuditListener create(KeycloakSession session) {
EmailProvider emailProvider = session.getProvider(EmailProvider.class);
return new EmailAuditListener(session, emailProvider, includedEvents);
}
@Override
public void init(Config.Scope config) {
String[] include = config.getArray("include-events");
if (include != null) {
for (String i : include) {
includedEvents.add(EventType.valueOf(i.toUpperCase()));
}
} else {
includedEvents.addAll(SUPPORTED_EVENTS);
}
String[] exclude = config.getArray("exclude-events");
if (exclude != null) {
for (String e : exclude) {
includedEvents.remove(EventType.valueOf(e.toUpperCase()));
}
}
}
@Override
public void close() {
}
@Override
public String getId() {
return "email";
}
}
@@ -1 +0,0 @@
org.keycloak.audit.email.EmailAuditListenerFactory
-46
View File
@@ -1,46 +0,0 @@
<?xml version="1.0"?>
<project>
<parent>
<artifactId>keycloak-audit-parent</artifactId>
<groupId>org.keycloak</groupId>
<version>1.0-beta-4</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>keycloak-audit-jboss-logging</artifactId>
<name>Keycloak Audit JBoss Logging Provider</name>
<description/>
<dependencies>
<dependency>
<groupId>org.jboss.logging</groupId>
<artifactId>jboss-logging</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-core</artifactId>
<version>${project.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-model-api</artifactId>
<version>${project.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-audit-api</artifactId>
<version>${project.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
@@ -1,66 +0,0 @@
package org.keycloak.audit.log;
import org.jboss.logging.Logger;
import org.keycloak.audit.AuditListener;
import org.keycloak.audit.Event;
import java.util.Map;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public class JBossLoggingAuditListener implements AuditListener {
private final Logger logger;
public JBossLoggingAuditListener(Logger logger) {
this.logger = logger;
}
@Override
public void onEvent(Event event) {
Logger.Level level = event.getError() != null ? Logger.Level.WARN : Logger.Level.INFO;
if (logger.isEnabled(level)) {
StringBuilder sb = new StringBuilder();
sb.append("event=");
sb.append(event.getEvent());
sb.append(", realmId=");
sb.append(event.getRealmId());
sb.append(", clientId=");
sb.append(event.getClientId());
sb.append(", userId=");
sb.append(event.getUserId());
sb.append(", ipAddress=");
sb.append(event.getIpAddress());
if (event.getError() != null) {
sb.append(", error=");
sb.append(event.getError());
}
if (event.getDetails() != null) {
for (Map.Entry<String, String> e : event.getDetails().entrySet()) {
sb.append(", ");
sb.append(e.getKey());
if (e.getValue() == null || e.getValue().indexOf(' ') == -1) {
sb.append("=");
sb.append(e.getValue());
} else {
sb.append("='");
sb.append(e.getValue());
sb.append("'");
}
}
}
logger.log(level, sb.toString());
}
}
@Override
public void close() {
}
}
@@ -1,36 +0,0 @@
package org.keycloak.audit.log;
import org.jboss.logging.Logger;
import org.keycloak.Config;
import org.keycloak.audit.AuditListener;
import org.keycloak.audit.AuditListenerFactory;
import org.keycloak.models.KeycloakSession;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public class JBossLoggingAuditListenerFactory implements AuditListenerFactory {
public static final String ID = "jboss-logging";
private static final Logger logger = Logger.getLogger("org.keycloak.audit");
@Override
public AuditListener create(KeycloakSession session) {
return new JBossLoggingAuditListener(logger);
}
@Override
public void init(Config.Scope config) {
}
@Override
public void close() {
}
@Override
public String getId() {
return ID;
}
}
@@ -1 +0,0 @@
org.keycloak.audit.log.JBossLoggingAuditListenerFactory
-62
View File
@@ -1,62 +0,0 @@
<?xml version="1.0"?>
<project>
<parent>
<artifactId>keycloak-audit-parent</artifactId>
<groupId>org.keycloak</groupId>
<version>1.0-beta-4</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>keycloak-audit-jpa</artifactId>
<name>Keycloak Audit JPA Provider</name>
<description/>
<dependencies>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-core</artifactId>
<version>${project.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-model-api</artifactId>
<version>${project.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-connections-jpa</artifactId>
<version>${project.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-audit-api</artifactId>
<version>${project.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.0-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${hibernate.entitymanager.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-core-asl</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
@@ -1,106 +0,0 @@
package org.keycloak.audit.jpa;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.type.TypeReference;
import org.jboss.logging.Logger;
import org.keycloak.audit.AuditProvider;
import org.keycloak.audit.Event;
import org.keycloak.audit.EventQuery;
import org.keycloak.audit.EventType;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import java.io.IOException;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public class JpaAuditProvider implements AuditProvider {
private static final ObjectMapper mapper = new ObjectMapper();
private static final TypeReference<Map<String, String>> mapType = new TypeReference<Map<String, String>>() {
};
private static final Logger logger = Logger.getLogger(JpaAuditProvider.class);
private EntityManager em;
private EntityTransaction tx;
private Set<EventType> includedEvents;
public JpaAuditProvider(EntityManager em, Set<EventType> includedEvents) {
this.em = em;
this.includedEvents = includedEvents;
}
@Override
public EventQuery createQuery() {
return new JpaEventQuery(em);
}
@Override
public void clear() {
em.createQuery("delete from EventEntity").executeUpdate();
}
@Override
public void clear(String realmId) {
em.createQuery("delete from EventEntity where realmId = :realmId").setParameter("realmId", realmId).executeUpdate();
}
@Override
public void clear(String realmId, long olderThan) {
em.createQuery("delete from EventEntity where realmId = :realmId and time < :time").setParameter("realmId", realmId).setParameter("time", olderThan).executeUpdate();
}
@Override
public void onEvent(Event event) {
if (includedEvents.contains(event.getEvent())) {
em.persist(convert(event));
}
}
@Override
public void close() {
}
static EventEntity convert(Event o) {
EventEntity e = new EventEntity();
e.setId(UUID.randomUUID().toString());
e.setTime(o.getTime());
e.setEvent(o.getEvent().toString());
e.setRealmId(o.getRealmId());
e.setClientId(o.getClientId());
e.setUserId(o.getUserId());
e.setSessionId(o.getSessionId());
e.setIpAddress(o.getIpAddress());
e.setError(o.getError());
try {
e.setDetailsJson(mapper.writeValueAsString(o.getDetails()));
} catch (IOException ex) {
logger.error("Failed to write log details", ex);
}
return e;
}
static Event convert(EventEntity o) {
Event e = new Event();
e.setTime(o.getTime());
e.setEvent(EventType.valueOf(o.getEvent()));
e.setRealmId(o.getRealmId());
e.setClientId(o.getClientId());
e.setUserId(o.getUserId());
e.setSessionId(o.getSessionId());
e.setIpAddress(o.getIpAddress());
e.setError(o.getError());
try {
Map<String, String> details = mapper.readValue(o.getDetailsJson(), mapType);
e.setDetails(details);
} catch (IOException ex) {
logger.error("Failed to read log details", ex);
}
return e;
}
}
@@ -1,58 +0,0 @@
package org.keycloak.audit.jpa;
import org.keycloak.Config;
import org.keycloak.audit.AuditProvider;
import org.keycloak.audit.AuditProviderFactory;
import org.keycloak.audit.EventType;
import org.keycloak.connections.jpa.JpaConnectionProvider;
import org.keycloak.models.KeycloakSession;
import java.util.HashSet;
import java.util.Set;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public class JpaAuditProviderFactory implements AuditProviderFactory {
public static final String ID = "jpa";
private Set<EventType> includedEvents = new HashSet<EventType>();
@Override
public AuditProvider create(KeycloakSession session) {
JpaConnectionProvider connection = session.getProvider(JpaConnectionProvider.class);
return new JpaAuditProvider(connection.getEntityManager(), includedEvents);
}
@Override
public void init(Config.Scope config) {
String[] include = config.getArray("include-events");
if (include != null) {
for (String i : include) {
includedEvents.add(EventType.valueOf(i.toUpperCase()));
}
} else {
for (EventType i : EventType.values()) {
includedEvents.add(i);
}
}
String[] exclude = config.getArray("exclude-events");
if (exclude != null) {
for (String e : exclude) {
includedEvents.remove(EventType.valueOf(e.toUpperCase()));
}
}
}
@Override
public void close() {
}
@Override
public String getId() {
return ID;
}
}
@@ -1 +0,0 @@
org.keycloak.audit.jpa.JpaAuditProviderFactory
-51
View File
@@ -1,51 +0,0 @@
<?xml version="1.0"?>
<project>
<parent>
<artifactId>keycloak-audit-parent</artifactId>
<groupId>org.keycloak</groupId>
<version>1.0-beta-4</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>keycloak-audit-mongo</artifactId>
<name>Keycloak Audit Mongo Provider</name>
<description/>
<dependencies>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-core</artifactId>
<version>${project.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-model-api</artifactId>
<version>${project.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-connections-mongo</artifactId>
<version>${project.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-audit-api</artifactId>
<version>${project.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.jboss.logging</groupId>
<artifactId>jboss-logging</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
@@ -1,107 +0,0 @@
package org.keycloak.audit.mongo;
import com.mongodb.BasicDBObject;
import com.mongodb.DBCollection;
import com.mongodb.DBObject;
import org.keycloak.audit.AuditProvider;
import org.keycloak.audit.Event;
import org.keycloak.audit.EventQuery;
import org.keycloak.audit.EventType;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public class MongoAuditProvider implements AuditProvider {
private DBCollection audit;
private Set<EventType> includedEvents;
public MongoAuditProvider(DBCollection audit, Set<EventType> includedEvents) {
this.audit = audit;
this.includedEvents = includedEvents;
}
@Override
public EventQuery createQuery() {
return new MongoEventQuery(audit);
}
@Override
public void clear() {
audit.remove(new BasicDBObject());
}
@Override
public void clear(String realmId) {
audit.remove(new BasicDBObject("realmId", realmId));
}
@Override
public void clear(String realmId, long olderThan) {
BasicDBObject q = new BasicDBObject();
q.put("realmId", realmId);
q.put("time", new BasicDBObject("$lt", olderThan));
audit.remove(q);
}
@Override
public void onEvent(Event event) {
if (includedEvents.contains(event.getEvent())) {
audit.insert(convert(event));
}
}
@Override
public void close() {
}
static DBObject convert(Event o) {
BasicDBObject e = new BasicDBObject();
e.put("time", o.getTime());
e.put("event", o.getEvent().toString());
e.put("realmId", o.getRealmId());
e.put("clientId", o.getClientId());
e.put("userId", o.getUserId());
e.put("sessionId", o.getSessionId());
e.put("ipAddress", o.getIpAddress());
e.put("error", o.getError());
BasicDBObject details = new BasicDBObject();
if (o.getDetails() != null) {
for (Map.Entry<String, String> entry : o.getDetails().entrySet()) {
details.put(entry.getKey(), entry.getValue());
}
}
e.put("details", details);
return e;
}
static Event convert(BasicDBObject o) {
Event e = new Event();
e.setTime(o.getLong("time"));
e.setEvent(EventType.valueOf(o.getString("event")));
e.setRealmId(o.getString("realmId"));
e.setClientId(o.getString("clientId"));
e.setUserId(o.getString("userId"));
e.setSessionId(o.getString("sessionId"));
e.setIpAddress(o.getString("ipAddress"));
e.setError(o.getString("error"));
BasicDBObject d = (BasicDBObject) o.get("details");
if (d != null) {
Map<String, String> details = new HashMap<String, String>();
for (Object k : d.keySet()) {
details.put((String) k, d.getString((String) k));
}
e.setDetails(details);
}
return e;
}
}
@@ -1,67 +0,0 @@
package org.keycloak.audit.mongo;
import com.mongodb.DBCollection;
import com.mongodb.WriteConcern;
import org.jboss.logging.Logger;
import org.keycloak.Config;
import org.keycloak.audit.AuditProvider;
import org.keycloak.audit.AuditProviderFactory;
import org.keycloak.audit.EventType;
import org.keycloak.connections.mongo.MongoConnectionProvider;
import org.keycloak.models.KeycloakSession;
import java.util.HashSet;
import java.util.Set;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public class MongoAuditProviderFactory implements AuditProviderFactory {
protected static final Logger logger = Logger.getLogger(MongoAuditProviderFactory.class);
public static final String ID = "mongo";
private Set<EventType> includedEvents = new HashSet<EventType>();
@Override
public AuditProvider create(KeycloakSession session) {
MongoConnectionProvider connection = session.getProvider(MongoConnectionProvider.class);
DBCollection collection = connection.getDB().getCollection("audit");
collection.setWriteConcern(WriteConcern.UNACKNOWLEDGED);
return new MongoAuditProvider(collection, includedEvents);
}
@Override
public void init(Config.Scope config) {
String[] include = config.getArray("include-events");
if (include != null) {
for (String i : include) {
includedEvents.add(EventType.valueOf(i.toUpperCase()));
}
} else {
for (EventType i : EventType.values()) {
includedEvents.add(i);
}
}
String[] exclude = config.getArray("exclude-events");
if (exclude != null) {
for (String e : exclude) {
includedEvents.remove(EventType.valueOf(e.toUpperCase()));
}
}
}
@Override
public void close() {
}
@Override
public String getId() {
return ID;
}
}
@@ -1,93 +0,0 @@
package org.keycloak.audit.mongo;
import com.mongodb.BasicDBObject;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import org.keycloak.audit.Event;
import org.keycloak.audit.EventQuery;
import org.keycloak.audit.EventType;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public class MongoEventQuery implements EventQuery {
private Integer firstResult;
private Integer maxResults;
private DBCollection audit;
private final BasicDBObject query;
public MongoEventQuery(DBCollection audit) {
this.audit = audit;
query = new BasicDBObject();
}
@Override
public EventQuery event(EventType... events) {
List<String> eventStrings = new LinkedList<String>();
for (EventType e : events) {
eventStrings.add(e.toString());
}
query.put("event", new BasicDBObject("$in", eventStrings));
return this;
}
@Override
public EventQuery realm(String realmId) {
query.put("realmId", realmId);
return this;
}
@Override
public EventQuery client(String clientId) {
query.put("clientId", clientId);
return this;
}
@Override
public EventQuery user(String userId) {
query.put("userId", userId);
return this;
}
@Override
public EventQuery ipAddress(String ipAddress) {
query.put("ipAddress", ipAddress);
return this;
}
@Override
public EventQuery firstResult(int firstResult) {
this.firstResult = firstResult;
return this;
}
@Override
public EventQuery maxResults(int maxResults) {
this.maxResults = maxResults;
return this;
}
@Override
public List<Event> getResultList() {
DBCursor cur = audit.find(query).sort(new BasicDBObject("time", -1));
if (firstResult != null) {
cur.skip(firstResult);
}
if (maxResults != null) {
cur.limit(maxResults);
}
List<Event> events = new LinkedList<Event>();
while (cur.hasNext()) {
events.add(MongoAuditProvider.convert((BasicDBObject) cur.next()));
}
return events;
}
}
@@ -1 +0,0 @@
org.keycloak.audit.mongo.MongoAuditProviderFactory
-25
View File
@@ -1,25 +0,0 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<parent>
<artifactId>keycloak-parent</artifactId>
<groupId>org.keycloak</groupId>
<version>1.0-beta-4</version>
<relativePath>../pom.xml</relativePath>
</parent>
<name>Audit Parent</name>
<description/>
<modelVersion>4.0.0</modelVersion>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-audit-parent</artifactId>
<packaging>pom</packaging>
<modules>
<module>api</module>
<module>email</module>
<module>jpa</module>
<module>jboss-logging</module>
<module>mongo</module>
</modules>
</project>
+50
View File
@@ -0,0 +1,50 @@
<?xml version="1.0"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<parent>
<artifactId>keycloak-parent</artifactId>
<groupId>org.keycloak</groupId>
<version>1.3.1.Final</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>keycloak-broker-core</artifactId>
<name>Keycloak Broker Core</name>
<description/>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-core</artifactId>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-model-api</artifactId>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-events-api</artifactId>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxrs</artifactId>
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>
@@ -0,0 +1,90 @@
/*
* JBoss, Home of Professional Open Source
*
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.keycloak.broker.provider;
import org.keycloak.events.EventBuilder;
import org.keycloak.models.ClientSessionModel;
import org.keycloak.models.IdentityProviderModel;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.RealmModel;
import org.keycloak.models.UserModel;
import org.keycloak.models.UserSessionModel;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
/**
* @author Pedro Igor
*/
public abstract class AbstractIdentityProvider<C extends IdentityProviderModel> implements IdentityProvider<C> {
private final C config;
public AbstractIdentityProvider(C config) {
this.config = config;
}
public C getConfig() {
return this.config;
}
@Override
public Response export(UriInfo uriInfo, RealmModel realm, String format) {
return Response.noContent().build();
}
@Override
public void close() {
// no-op
}
@Override
public Object callback(RealmModel realm, AuthenticationCallback callback, EventBuilder event) {
return null;
}
@Override
public Response keycloakInitiatedBrowserLogout(UserSessionModel userSession, UriInfo uriInfo, RealmModel realm) {
return null;
}
@Override
public void backchannelLogout(UserSessionModel userSession, UriInfo uriInfo, RealmModel realm) {
}
@Override
public void attachUserSession(UserSessionModel userSession, ClientSessionModel clientSession, BrokeredIdentityContext context) {
}
@Override
public void preprocessFederatedIdentity(KeycloakSession session, RealmModel realm, BrokeredIdentityContext context) {
}
@Override
public void importNewUser(KeycloakSession session, RealmModel realm, UserModel user, BrokeredIdentityContext context) {
}
@Override
public void updateBrokeredUser(KeycloakSession session, RealmModel realm, UserModel user, BrokeredIdentityContext context) {
}
}
@@ -0,0 +1,59 @@
/*
* JBoss, Home of Professional Open Source
*
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.keycloak.broker.provider;
import org.keycloak.Config;
import org.keycloak.models.IdentityProviderModel;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.KeycloakSessionFactory;
import org.keycloak.models.RealmModel;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
/**
* @author Pedro Igor
*/
public abstract class AbstractIdentityProviderFactory<T extends IdentityProvider> implements IdentityProviderFactory<T> {
@Override
public void close() {
}
@Override
public void init(Config.Scope config) {
}
@Override
public void postInit(KeycloakSessionFactory factory) {
}
@Override
public T create(KeycloakSession session) {
return null;
}
@Override
public Map<String, String> parseConfig(InputStream inputStream) {
return new HashMap<String, String>();
}
}
@@ -0,0 +1,38 @@
package org.keycloak.broker.provider;
import org.keycloak.broker.provider.IdentityProviderMapper;
import org.keycloak.models.IdentityProviderMapperModel;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.KeycloakSessionFactory;
import org.keycloak.models.RealmModel;
/**
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $
*/
public abstract class AbstractIdentityProviderMapper implements IdentityProviderMapper {
@Override
public void close() {
}
@Override
public IdentityProviderMapper create(KeycloakSession session) {
return null;
}
@Override
public void init(org.keycloak.Config.Scope config) {
}
@Override
public void postInit(KeycloakSessionFactory factory) {
}
@Override
public void preprocessFederatedIdentity(KeycloakSession session, RealmModel realm, IdentityProviderMapperModel mapperModel, BrokeredIdentityContext context) {
}
}
@@ -0,0 +1,83 @@
/*
* JBoss, Home of Professional Open Source
*
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.keycloak.broker.provider;
import org.jboss.resteasy.spi.HttpRequest;
import org.keycloak.models.ClientSessionModel;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.RealmModel;
import javax.ws.rs.core.UriInfo;
/**
* @author Pedro Igor
*/
public class AuthenticationRequest {
private final KeycloakSession session;
private final UriInfo uriInfo;
private final String state;
private final HttpRequest httpRequest;
private final RealmModel realm;
private final String redirectUri;
private final ClientSessionModel clientSession;
public AuthenticationRequest(KeycloakSession session, RealmModel realm, ClientSessionModel clientSession, HttpRequest httpRequest, UriInfo uriInfo, String state, String redirectUri) {
this.session = session;
this.realm = realm;
this.httpRequest = httpRequest;
this.uriInfo = uriInfo;
this.state = state;
this.redirectUri = redirectUri;
this.clientSession = clientSession;
}
public KeycloakSession getSession() {
return session;
}
public UriInfo getUriInfo() {
return this.uriInfo;
}
public String getState() {
return this.state;
}
public HttpRequest getHttpRequest() {
return this.httpRequest;
}
public RealmModel getRealm() {
return this.realm;
}
/**
* <p>Returns the redirect url that must be included in an authentication request in order to process responses from an
* identity provider.</p>
*
* @return
*/
public String getRedirectUri() {
return this.redirectUri;
}
public ClientSessionModel getClientSession() {
return this.clientSession;
}
}
@@ -0,0 +1,190 @@
/*
* JBoss, Home of Professional Open Source
*
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.keycloak.broker.provider;
import org.keycloak.models.IdentityProviderModel;
import java.util.HashMap;
import java.util.Map;
/**
* <p>Represents all identity information obtained from an {@link org.keycloak.broker.provider.IdentityProvider} after a
* successful authentication.</p>
*
* @author Pedro Igor
*/
public class BrokeredIdentityContext {
private String id;
private String username;
private String modelUsername;
private String email;
private String firstName;
private String lastName;
private String brokerSessionId;
private String brokerUserId;
private String code;
private String token;
private IdentityProviderModel idpConfig;
private IdentityProvider idp;
private Map<String, Object> contextData = new HashMap<>();
public BrokeredIdentityContext(String id) {
if (id == null) {
throw new RuntimeException("No identifier provider for identity.");
}
this.id = id;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
/**
* Username in remote idp
*
* @return
*/
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
/**
* username to store in UserModel
*
* @return
*/
public String getModelUsername() {
return modelUsername;
}
public void setModelUsername(String modelUsername) {
this.modelUsername = modelUsername;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getBrokerSessionId() {
return brokerSessionId;
}
public void setBrokerSessionId(String brokerSessionId) {
this.brokerSessionId = brokerSessionId;
}
public String getBrokerUserId() {
return brokerUserId;
}
public void setBrokerUserId(String brokerUserId) {
this.brokerUserId = brokerUserId;
}
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public IdentityProviderModel getIdpConfig() {
return idpConfig;
}
public void setIdpConfig(IdentityProviderModel idpConfig) {
this.idpConfig = idpConfig;
}
public IdentityProvider getIdp() {
return idp;
}
public void setIdp(IdentityProvider idp) {
this.idp = idp;
}
public Map<String, Object> getContextData() {
return contextData;
}
public void setContextData(Map<String, Object> contextData) {
this.contextData = contextData;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public void setName(String name) {
if (name != null) {
int i = name.lastIndexOf(' ');
if (i != -1) {
firstName = name.substring(0, i);
lastName = name.substring(i + 1);
} else {
firstName = name;
}
}
}
@Override
public String toString() {
return "{" +
"id='" + id + '\'' +
", username='" + username + '\'' +
", email='" + email + '\'' +
'}';
}
}
@@ -0,0 +1,110 @@
package org.keycloak.broker.provider;
import org.keycloak.broker.provider.AbstractIdentityProviderMapper;
import org.keycloak.broker.provider.BrokeredIdentityContext;
import org.keycloak.broker.provider.IdentityBrokerException;
import org.keycloak.models.ClientModel;
import org.keycloak.models.IdentityProviderMapperModel;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.RealmModel;
import org.keycloak.models.RoleModel;
import org.keycloak.models.UserModel;
import org.keycloak.provider.ProviderConfigProperty;
import java.util.ArrayList;
import java.util.List;
/**
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $
*/
public class HardcodedRoleMapper extends AbstractIdentityProviderMapper {
public static final String ROLE = "role";
protected static final List<ProviderConfigProperty> configProperties = new ArrayList<ProviderConfigProperty>();
static {
ProviderConfigProperty property;
property = new ProviderConfigProperty();
property.setName(ROLE);
property.setLabel("Role");
property.setHelpText("Role to grant to user. To reference an application role the syntax is appname.approle, i.e. myapp.myrole");
property.setType(ProviderConfigProperty.STRING_TYPE);
configProperties.add(property);
}
public static String[] parseRole(String role) {
int scopeIndex = role.indexOf('.');
if (scopeIndex > -1) {
String appName = role.substring(0, scopeIndex);
role = role.substring(scopeIndex + 1);
String[] rtn = {appName, role};
return rtn;
} else {
String[] rtn = {null, role};
return rtn;
}
}
public static RoleModel getRoleFromString(RealmModel realm, String roleName) {
String[] parsedRole = parseRole(roleName);
RoleModel role = null;
if (parsedRole[0] == null) {
role = realm.getRole(parsedRole[1]);
} else {
ClientModel client = realm.getClientByClientId(parsedRole[0]);
role = client.getRole(parsedRole[1]);
}
return role;
}
@Override
public List<ProviderConfigProperty> getConfigProperties() {
return configProperties;
}
@Override
public String getDisplayCategory() {
return "Role Importer";
}
@Override
public String getDisplayType() {
return "Hardcoded Role";
}
public static final String[] COMPATIBLE_PROVIDERS = {ANY_PROVIDER};
public static final String PROVIDER_ID = "oidc-hardcoded-role-idp-mapper";
@Override
public String getId() {
return PROVIDER_ID;
}
@Override
public String[] getCompatibleProviders() {
return COMPATIBLE_PROVIDERS;
}
@Override
public void importNewUser(KeycloakSession session, RealmModel realm, UserModel user, IdentityProviderMapperModel mapperModel, BrokeredIdentityContext context) {
String roleName = mapperModel.getConfig().get(ROLE);
RoleModel role = getRoleFromString(realm, roleName);
if (role == null) throw new IdentityBrokerException("Unable to find role: " + roleName);
user.grantRole(role);
}
@Override
public void updateBrokeredUser(KeycloakSession session, RealmModel realm, UserModel user, IdentityProviderMapperModel mapperModel, BrokeredIdentityContext context) {
}
@Override
public String getHelpText() {
return "When user is imported from provider, hardcode a role mapping for it.";
}
}
@@ -0,0 +1,32 @@
/*
* JBoss, Home of Professional Open Source
*
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.keycloak.broker.provider;
/**
* @author pedroigor
*/
public class IdentityBrokerException extends RuntimeException {
public IdentityBrokerException(String message) {
super(message);
}
public IdentityBrokerException(String message, Throwable t) {
super(message, t);
}
}
@@ -0,0 +1,106 @@
/*
* JBoss, Home of Professional Open Source
*
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.keycloak.broker.provider;
import org.keycloak.events.EventBuilder;
import org.keycloak.models.ClientSessionModel;
import org.keycloak.models.FederatedIdentityModel;
import org.keycloak.models.IdentityProviderMapperModel;
import org.keycloak.models.IdentityProviderModel;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.RealmModel;
import org.keycloak.models.UserModel;
import org.keycloak.models.UserSessionModel;
import org.keycloak.provider.Provider;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
/**
* @author Pedro Igor
*/
public interface IdentityProvider<C extends IdentityProviderModel> extends Provider {
interface AuthenticationCallback {
/**
* This method should be called by provider after the JAXRS callback endpoint has finished authentication
* with the remote IDP
*
* @param context
* @return
*/
Response authenticated(BrokeredIdentityContext context);
Response cancelled(String code);
Response error(String code, String message);
}
void preprocessFederatedIdentity(KeycloakSession session, RealmModel realm, BrokeredIdentityContext context);
void attachUserSession(UserSessionModel userSession, ClientSessionModel clientSession, BrokeredIdentityContext context);
void importNewUser(KeycloakSession session, RealmModel realm, UserModel user, BrokeredIdentityContext context);
void updateBrokeredUser(KeycloakSession session, RealmModel realm, UserModel user, BrokeredIdentityContext context);
/**
* JAXRS callback endpoint for when the remote IDP wants to callback to keycloak.
*
* @return
*/
Object callback(RealmModel realm, AuthenticationCallback callback, EventBuilder event);
/**
* <p>Initiates the authentication process by sending an authentication request to an identity provider. This method is called
* only once during the authentication.</p>
*
* @param request The initial authentication request. Contains all the contextual information in order to build an authentication request to the
* identity provider.
* @return
*/
Response performLogin(AuthenticationRequest request);
/**
* <p>Returns a {@link javax.ws.rs.core.Response} containing the token previously stored during the authentication process for a
* specific user.</p>
*
* @param identity
* @return
*/
Response retrieveToken(FederatedIdentityModel identity);
void backchannelLogout(UserSessionModel userSession, UriInfo uriInfo, RealmModel realm);
/**
* Called when a Keycloak application initiates a logout through the browser. This is expected to do a logout
* with the IDP
*
* @param userSession
* @param uriInfo
* @param realm
* @return null if this is not supported by this provider
*/
Response keycloakInitiatedBrowserLogout(UserSessionModel userSession, UriInfo uriInfo, RealmModel realm);
/**
* Export a representation of the IdentityProvider in a specific format. For example, a SAML EntityDescriptor
*
* @return
*/
Response export(UriInfo uriInfo, RealmModel realm, String format);
}
@@ -0,0 +1,58 @@
/*
* JBoss, Home of Professional Open Source
*
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.keycloak.broker.provider;
import org.keycloak.models.IdentityProviderModel;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.RealmModel;
import org.keycloak.provider.ProviderFactory;
import java.io.InputStream;
import java.util.Map;
/**
* @author Pedro Igor
*/
public interface IdentityProviderFactory<T extends IdentityProvider> extends ProviderFactory<T> {
/**
* <p>A friendly name for this factory.</p>
*
* @return
*/
String getName();
/**
* <p>Creates an {@link IdentityProvider} based on the configuration contained in
* <code>model</code>.</p>
*
* @param model The configuration to be used to create the identity provider.
* @return
*/
T create(IdentityProviderModel model);
/**
* <p>Creates an {@link IdentityProvider} based on the configuration from
* <code>inputStream</code>.</p>
*
* @param model The model containing the common abd basic configuration for an identity provider.
* @param inputStream The input stream from where configuration will be loaded from..
* @return
*/
Map<String, String> parseConfig(InputStream inputStream);
}
@@ -0,0 +1,56 @@
package org.keycloak.broker.provider;
import org.keycloak.models.IdentityProviderMapperModel;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.RealmModel;
import org.keycloak.models.UserModel;
import org.keycloak.provider.ConfiguredProvider;
import org.keycloak.provider.Provider;
import org.keycloak.provider.ProviderFactory;
/**
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $
*/
public interface IdentityProviderMapper extends Provider, ProviderFactory<IdentityProviderMapper>,ConfiguredProvider {
public static final String ANY_PROVIDER = "*";
String[] getCompatibleProviders();
String getDisplayCategory();
String getDisplayType();
/**
* Called to determine what keycloak username and email to use to process the login request from the external IDP
* Usually used to map BrokeredIdentityContet.username or email.
*
* @param session
* @param realm
* @param mapperModel
* @param context
*/
void preprocessFederatedIdentity(KeycloakSession session, RealmModel realm, IdentityProviderMapperModel mapperModel, BrokeredIdentityContext context);
/**
* Called after UserModel is created for first time for this user.
*
* @param session
* @param realm
* @param user
* @param mapperModel
* @param context
*/
void importNewUser(KeycloakSession session, RealmModel realm, UserModel user, IdentityProviderMapperModel mapperModel, BrokeredIdentityContext context);
/**
* Called when this user has logged in before and has already been imported.
*
* @param session
* @param realm
* @param user
* @param mapperModel
* @param context
*/
void updateBrokeredUser(KeycloakSession session, RealmModel realm, UserModel user, IdentityProviderMapperModel mapperModel, BrokeredIdentityContext context);
}
@@ -0,0 +1,32 @@
package org.keycloak.broker.provider;
import org.keycloak.provider.Provider;
import org.keycloak.provider.ProviderFactory;
import org.keycloak.provider.Spi;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public class IdentityProviderMapperSpi implements Spi {
@Override
public boolean isInternal() {
return true;
}
@Override
public String getName() {
return "identity-provider-mapper";
}
@Override
public Class<? extends Provider> getProviderClass() {
return IdentityProviderMapper.class;
}
@Override
public Class<? extends ProviderFactory> getProviderFactoryClass() {
return IdentityProviderMapper.class;
}
}
@@ -0,0 +1,50 @@
/*
* JBoss, Home of Professional Open Source
*
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.keycloak.broker.provider;
import org.keycloak.provider.Provider;
import org.keycloak.provider.ProviderFactory;
import org.keycloak.provider.Spi;
/**
* @author Pedro Igor
*/
public class IdentityProviderSpi implements Spi {
public static final String IDENTITY_PROVIDER_SPI_NAME = "identity_provider";
@Override
public boolean isInternal() {
return false;
}
@Override
public String getName() {
return IDENTITY_PROVIDER_SPI_NAME;
}
@Override
public Class<? extends Provider> getProviderClass() {
return IdentityProvider.class;
}
@Override
public Class<? extends ProviderFactory> getProviderFactoryClass() {
return IdentityProviderFactory.class;
}
}
@@ -0,0 +1,238 @@
package org.keycloak.broker.provider.util;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.StringWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
import java.util.zip.GZIPInputStream;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
* @author Vlastimil Elias (velias at redhat dot com)
*/
public class SimpleHttp {
private String url;
private String method;
private Map<String, String> headers;
private Map<String, String> params;
protected SimpleHttp(String url, String method) {
this.url = url;
this.method = method;
}
public static SimpleHttp doGet(String url) {
return new SimpleHttp(url, "GET");
}
public static SimpleHttp doPost(String url) {
return new SimpleHttp(url, "POST");
}
public SimpleHttp header(String name, String value) {
if (headers == null) {
headers = new HashMap<String, String>();
}
headers.put(name, value);
return this;
}
public SimpleHttp param(String name, String value) {
if (params == null) {
params = new HashMap<String, String>();
}
params.put(name, value);
return this;
}
public String asString() throws IOException {
boolean get = method.equals("GET");
boolean post = method.equals("POST");
StringBuilder sb = new StringBuilder();
if (get) {
sb.append(url);
}
if (params != null) {
boolean f = true;
for (Map.Entry<String, String> p : params.entrySet()) {
if (f) {
f = false;
if (get) {
sb.append("?");
}
} else {
sb.append("&");
}
sb.append(URLEncoder.encode(p.getKey(), "UTF-8"));
sb.append("=");
sb.append(URLEncoder.encode(p.getValue(), "UTF-8"));
}
}
if (get) {
url = sb.toString();
}
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
OutputStream os = null;
InputStream is = null;
try {
connection.setRequestMethod(method);
if (headers != null) {
for (Map.Entry<String, String> h : headers.entrySet()) {
connection.setRequestProperty(h.getKey(), h.getValue());
}
}
if (post) {
String data = sb.toString();
connection.setDoOutput(true);
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setRequestProperty("Content-Length", String.valueOf(data.length()));
os = connection.getOutputStream();
os.write(data.getBytes());
} else {
connection.setDoOutput(false);
}
String ce = connection.getHeaderField("Content-Encoding");
is = connection.getInputStream();
if ("gzip".equals(ce)) {
is = new GZIPInputStream(is);
}
return toString(is);
} finally {
if (os != null) {
try {
os.close();
} catch (IOException e) {
}
}
if (is != null) {
try {
is.close();
} catch (IOException e) {
}
}
if (connection != null) {
try {
connection.disconnect();
} catch (Exception e) {
}
}
}
}
public int asStatus() throws IOException {
boolean get = method.equals("GET");
boolean post = method.equals("POST");
StringBuilder sb = new StringBuilder();
if (get) {
sb.append(url);
}
if (params != null) {
boolean f = true;
for (Map.Entry<String, String> p : params.entrySet()) {
if (f) {
f = false;
if (get) {
sb.append("?");
}
} else {
sb.append("&");
}
sb.append(URLEncoder.encode(p.getKey(), "UTF-8"));
sb.append("=");
sb.append(URLEncoder.encode(p.getValue(), "UTF-8"));
}
}
if (get) {
url = sb.toString();
}
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
OutputStream os = null;
InputStream is = null;
try {
connection.setRequestMethod(method);
if (headers != null) {
for (Map.Entry<String, String> h : headers.entrySet()) {
connection.setRequestProperty(h.getKey(), h.getValue());
}
}
if (post) {
String data = sb.toString();
connection.setDoOutput(true);
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setRequestProperty("Content-Length", String.valueOf(data.length()));
os = connection.getOutputStream();
os.write(data.getBytes());
} else {
connection.setDoOutput(false);
}
is = connection.getInputStream();
return connection.getResponseCode();
} finally {
if (os != null) {
try {
os.close();
} catch (IOException e) {
}
}
if (is != null) {
try {
is.close();
} catch (IOException e) {
}
}
if (connection != null) {
try {
connection.disconnect();
} catch (Exception e) {
}
}
}
}
private String toString(InputStream is) throws IOException {
InputStreamReader reader = new InputStreamReader(is);
StringWriter writer = new StringWriter();
char[] buffer = new char[1024 * 4];
for (int n = reader.read(buffer); n != -1; n = reader.read(buffer)) {
writer.write(buffer, 0, n);
}
return writer.toString();
}
}
@@ -0,0 +1 @@
org.keycloak.broker.provider.HardcodedRoleMapper
@@ -0,0 +1,2 @@
org.keycloak.broker.provider.IdentityProviderSpi
org.keycloak.broker.provider.IdentityProviderMapperSpi
+58
View File
@@ -0,0 +1,58 @@
<?xml version="1.0"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<parent>
<artifactId>keycloak-parent</artifactId>
<groupId>org.keycloak</groupId>
<version>1.3.1.Final</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>keycloak-broker-oidc</artifactId>
<name>Keycloak Broker - OpenID Connect Identity Provider</name>
<description/>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-core</artifactId>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-broker-core</artifactId>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-core-asl</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-events-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-services</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.jboss.logging</groupId>
<artifactId>jboss-logging</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
@@ -0,0 +1,258 @@
/*
* JBoss, Home of Professional Open Source
*
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.keycloak.broker.oidc;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.map.ObjectMapper;
import org.jboss.logging.Logger;
import org.keycloak.ClientConnection;
import org.keycloak.OAuth2Constants;
import org.keycloak.broker.provider.util.SimpleHttp;
import org.keycloak.broker.provider.AbstractIdentityProvider;
import org.keycloak.broker.provider.AuthenticationRequest;
import org.keycloak.broker.provider.BrokeredIdentityContext;
import org.keycloak.broker.provider.IdentityBrokerException;
import org.keycloak.events.Errors;
import org.keycloak.events.EventBuilder;
import org.keycloak.events.EventType;
import org.keycloak.models.FederatedIdentityModel;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.RealmModel;
import org.keycloak.services.ErrorPage;
import org.keycloak.services.messages.Messages;
import javax.ws.rs.GET;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriBuilder;
import javax.ws.rs.core.UriInfo;
import java.io.IOException;
import java.net.URI;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author Pedro Igor
*/
public abstract class AbstractOAuth2IdentityProvider<C extends OAuth2IdentityProviderConfig> extends AbstractIdentityProvider<C> {
protected static final Logger logger = Logger.getLogger(AbstractOAuth2IdentityProvider.class);
public static final String OAUTH2_GRANT_TYPE_AUTHORIZATION_CODE = "authorization_code";
public static final String FEDERATED_ACCESS_TOKEN = "FEDERATED_ACCESS_TOKEN";
public static final String FEDERATED_REFRESH_TOKEN = "FEDERATED_REFRESH_TOKEN";
public static final String FEDERATED_TOKEN_EXPIRATION = "FEDERATED_TOKEN_EXPIRATION";
public static final String ACCESS_DENIED = "access_denied";
protected static ObjectMapper mapper = new ObjectMapper();
public static final String OAUTH2_PARAMETER_ACCESS_TOKEN = "access_token";
public static final String OAUTH2_PARAMETER_SCOPE = "scope";
public static final String OAUTH2_PARAMETER_STATE = "state";
public static final String OAUTH2_PARAMETER_RESPONSE_TYPE = "response_type";
public static final String OAUTH2_PARAMETER_REDIRECT_URI = "redirect_uri";
public static final String OAUTH2_PARAMETER_CODE = "code";
public static final String OAUTH2_PARAMETER_CLIENT_ID = "client_id";
public static final String OAUTH2_PARAMETER_CLIENT_SECRET = "client_secret";
public static final String OAUTH2_PARAMETER_GRANT_TYPE = "grant_type";
public AbstractOAuth2IdentityProvider(C config) {
super(config);
if (config.getDefaultScope() == null || config.getDefaultScope().isEmpty()) {
config.setDefaultScope(getDefaultScopes());
}
}
@Override
public Object callback(RealmModel realm, AuthenticationCallback callback, EventBuilder event) {
return new Endpoint(callback, realm, event);
}
@Override
public Response performLogin(AuthenticationRequest request) {
try {
URI authorizationUrl = createAuthorizationUrl(request).build();
return Response.temporaryRedirect(authorizationUrl).build();
} catch (Exception e) {
throw new IdentityBrokerException("Could not create authentication request.", e);
}
}
@Override
public Response retrieveToken(FederatedIdentityModel identity) {
return Response.ok(identity.getToken()).build();
}
@Override
public C getConfig() {
return super.getConfig();
}
protected String extractTokenFromResponse(String response, String tokenName) {
if(response == null)
return null;
if (response.startsWith("{")) {
try {
JsonNode node = mapper.readTree(response);
if(node.has(tokenName)){
String s = node.get(tokenName).getTextValue();
if(s == null || s.trim().isEmpty())
return null;
return s;
} else {
return null;
}
} catch (IOException e) {
throw new IdentityBrokerException("Could not extract token [" + tokenName + "] from response [" + response + "] due: " + e.getMessage(), e);
}
} else {
Matcher matcher = Pattern.compile(tokenName + "=([^&]+)").matcher(response);
if (matcher.find()) {
return matcher.group(1);
}
}
return null;
}
protected BrokeredIdentityContext getFederatedIdentity(String response) {
String accessToken = extractTokenFromResponse(response, OAUTH2_PARAMETER_ACCESS_TOKEN);
if (accessToken == null) {
throw new IdentityBrokerException("No access token available in OAuth server response: " + response);
}
return doGetFederatedIdentity(accessToken);
}
protected BrokeredIdentityContext doGetFederatedIdentity(String accessToken) {
return null;
}
protected UriBuilder createAuthorizationUrl(AuthenticationRequest request) {
return UriBuilder.fromUri(getConfig().getAuthorizationUrl())
.queryParam(OAUTH2_PARAMETER_SCOPE, getConfig().getDefaultScope())
.queryParam(OAUTH2_PARAMETER_STATE, request.getState())
.queryParam(OAUTH2_PARAMETER_RESPONSE_TYPE, "code")
.queryParam(OAUTH2_PARAMETER_CLIENT_ID, getConfig().getClientId())
.queryParam(OAUTH2_PARAMETER_REDIRECT_URI, request.getRedirectUri());
}
/**
* Get JSON property as text. JSON numbers and booleans are converted to text. Empty string is converted to null.
*
* @param jsonNode to get property from
* @param name of property to get
* @return string value of the property or null.
*/
protected String getJsonProperty(JsonNode jsonNode, String name) {
if (jsonNode.has(name) && !jsonNode.get(name).isNull()) {
String s = jsonNode.get(name).asText();
if(s != null && !s.isEmpty())
return s;
else
return null;
}
return null;
}
protected JsonNode asJsonNode(String json) throws IOException {
return mapper.readTree(json);
}
protected abstract String getDefaultScopes();
protected class Endpoint {
protected AuthenticationCallback callback;
protected RealmModel realm;
protected EventBuilder event;
@Context
protected KeycloakSession session;
@Context
protected ClientConnection clientConnection;
@Context
protected HttpHeaders headers;
@Context
protected UriInfo uriInfo;
public Endpoint(AuthenticationCallback callback, RealmModel realm, EventBuilder event) {
this.callback = callback;
this.realm = realm;
this.event = event;
}
@GET
public Response authResponse(@QueryParam(AbstractOAuth2IdentityProvider.OAUTH2_PARAMETER_STATE) String state,
@QueryParam(AbstractOAuth2IdentityProvider.OAUTH2_PARAMETER_CODE) String authorizationCode,
@QueryParam(OAuth2Constants.ERROR) String error) {
if (error != null) {
//logger.error("Failed " + getConfig().getAlias() + " broker login: " + error);
if (error.equals(ACCESS_DENIED)) {
return callback.cancelled(state);
} else {
return callback.error(state, Messages.IDENTITY_PROVIDER_UNEXPECTED_ERROR);
}
}
try {
if (authorizationCode != null) {
String response = generateTokenRequest(authorizationCode).asString();
BrokeredIdentityContext federatedIdentity = getFederatedIdentity(response);
if (getConfig().isStoreToken()) {
federatedIdentity.setToken(response);
}
federatedIdentity.setCode(state);
federatedIdentity.setIdpConfig(getConfig());
federatedIdentity.setIdp(AbstractOAuth2IdentityProvider.this);
return callback.authenticated(federatedIdentity);
}
} catch (Exception e) {
logger.error("Failed to make identity provider oauth callback", e);
}
event.event(EventType.LOGIN);
event.error(Errors.IDENTITY_PROVIDER_LOGIN_FAILURE);
return ErrorPage.error(session, Messages.IDENTITY_PROVIDER_UNEXPECTED_ERROR);
}
public SimpleHttp generateTokenRequest(String authorizationCode) {
return SimpleHttp.doPost(getConfig().getTokenUrl())
.param(OAUTH2_PARAMETER_CODE, authorizationCode)
.param(OAUTH2_PARAMETER_CLIENT_ID, getConfig().getClientId())
.param(OAUTH2_PARAMETER_CLIENT_SECRET, getConfig().getClientSecret())
.param(OAUTH2_PARAMETER_REDIRECT_URI, uriInfo.getAbsolutePath().toString())
.param(OAUTH2_PARAMETER_GRANT_TYPE, OAUTH2_GRANT_TYPE_AUTHORIZATION_CODE);
}
}
}
@@ -0,0 +1,114 @@
package org.keycloak.broker.oidc;
import org.keycloak.broker.provider.util.SimpleHttp;
import org.keycloak.broker.provider.BrokeredIdentityContext;
import org.keycloak.constants.AdapterConstants;
import org.keycloak.events.EventBuilder;
import org.keycloak.jose.jws.JWSInput;
import org.keycloak.models.RealmModel;
import org.keycloak.models.UserSessionModel;
import org.keycloak.representations.AccessTokenResponse;
import org.keycloak.representations.JsonWebToken;
import org.keycloak.representations.adapters.action.AdminAction;
import org.keycloak.representations.adapters.action.LogoutAction;
import org.keycloak.services.managers.AuthenticationManager;
import org.keycloak.util.JsonSerialization;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.core.Response;
import java.io.IOException;
import java.security.PublicKey;
/**
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $
*/
public class KeycloakOIDCIdentityProvider extends OIDCIdentityProvider {
public static final String VALIDATED_ACCESS_TOKEN = "VALIDATED_ACCESS_TOKEN";
public KeycloakOIDCIdentityProvider(OIDCIdentityProviderConfig config) {
super(config);
}
@Override
public Object callback(RealmModel realm, AuthenticationCallback callback, EventBuilder event) {
return new KeycloakEndpoint(callback, realm, event);
}
@Override
protected void processAccessTokenResponse(BrokeredIdentityContext context, PublicKey idpKey, AccessTokenResponse response) {
JsonWebToken access = validateToken(idpKey, response.getToken());
context.getContextData().put(VALIDATED_ACCESS_TOKEN, access);
}
protected class KeycloakEndpoint extends OIDCEndpoint {
public KeycloakEndpoint(AuthenticationCallback callback, RealmModel realm, EventBuilder event) {
super(callback, realm, event);
}
@POST
@Path(AdapterConstants.K_LOGOUT)
public Response backchannelLogout(String input) {
JWSInput token = new JWSInput(input);
PublicKey key = getExternalIdpKey();
if (key != null) {
if (!verify(token, key)) {
logger.warn("Failed to verify logout request");
return Response.status(400).build();
}
}
LogoutAction action = null;
try {
action = JsonSerialization.readValue(token.getContent(), LogoutAction.class);
} catch (IOException e) {
throw new RuntimeException(e);
}
if (!validateAction(action)) return Response.status(400).build();
if (action.getKeycloakSessionIds() != null) {
for (String sessionId : action.getKeycloakSessionIds()) {
String brokerSessionId = getConfig().getAlias() + "." + sessionId;
UserSessionModel userSession = session.sessions().getUserSessionByBrokerSessionId(realm, brokerSessionId);
if (userSession != null
&& userSession.getState() != UserSessionModel.State.LOGGING_OUT
&& userSession.getState() != UserSessionModel.State.LOGGED_OUT
) {
AuthenticationManager.backchannelLogout(session, realm, userSession, uriInfo, clientConnection, headers, false);
}
}
}
return Response.ok().build();
}
protected boolean validateAction(AdminAction action) {
if (!action.validate()) {
logger.warn("admin request failed, not validated" + action.getAction());
return false;
}
if (action.isExpired()) {
logger.warn("admin request failed, expired token");
return false;
}
if (!getConfig().getClientId().equals(action.getResource())) {
logger.warn("Resource name does not match");
return false;
}
return true;
}
@Override
public SimpleHttp generateTokenRequest(String authorizationCode) {
return super.generateTokenRequest(authorizationCode)
.param(AdapterConstants.CLIENT_SESSION_STATE, "n/a"); // hack to get backchannel logout to work
}
}
}
@@ -0,0 +1,59 @@
/*
* JBoss, Home of Professional Open Source
*
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.keycloak.broker.oidc;
import org.keycloak.broker.oidc.mappers.UsernameTemplateMapper;
import org.keycloak.broker.provider.AbstractIdentityProviderFactory;
import org.keycloak.models.IdentityProviderMapperModel;
import org.keycloak.models.IdentityProviderModel;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.RealmModel;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
/**
* @author Pedro Igor
*/
public class KeycloakOIDCIdentityProviderFactory extends AbstractIdentityProviderFactory<KeycloakOIDCIdentityProvider> {
public static final String PROVIDER_ID = "keycloak-oidc";
@Override
public String getName() {
return "Keycloak OpenID Connect";
}
@Override
public KeycloakOIDCIdentityProvider create(IdentityProviderModel model) {
return new KeycloakOIDCIdentityProvider(new OIDCIdentityProviderConfig(model));
}
@Override
public String getId() {
return PROVIDER_ID;
}
@Override
public Map<String, String> parseConfig(InputStream inputStream) {
return OIDCIdentityProviderFactory.parseOIDCConfig(inputStream);
}
}
@@ -0,0 +1,78 @@
/*
* JBoss, Home of Professional Open Source
*
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.keycloak.broker.oidc;
import org.keycloak.models.IdentityProviderModel;
/**
* @author Pedro Igor
*/
public class OAuth2IdentityProviderConfig extends IdentityProviderModel {
public OAuth2IdentityProviderConfig(IdentityProviderModel model) {
super(model);
}
public String getAuthorizationUrl() {
return getConfig().get("authorizationUrl");
}
public void setAuthorizationUrl(String authorizationUrl) {
getConfig().put("authorizationUrl", authorizationUrl);
}
public String getTokenUrl() {
return getConfig().get("tokenUrl");
}
public void setTokenUrl(String tokenUrl) {
getConfig().put("tokenUrl", tokenUrl);
}
public String getUserInfoUrl() {
return getConfig().get("userInfoUrl");
}
public void setUserInfoUrl(String userInfoUrl) {
getConfig().put("userInfoUrl", userInfoUrl);
}
public String getClientId() {
return getConfig().get("clientId");
}
public void setClientId(String clientId) {
getConfig().put("clientId", clientId);
}
public String getClientSecret() {
return getConfig().get("clientSecret");
}
public void setClientSecret(String clientSecret) {
getConfig().put("clientSecret", clientSecret);
}
public String getDefaultScope() {
return getConfig().get("defaultScope");
}
public void setDefaultScope(String defaultScope) {
getConfig().put("defaultScope", defaultScope);
}
}
@@ -0,0 +1,333 @@
/*
* JBoss, Home of Professional Open Source
*
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.keycloak.broker.oidc;
import org.codehaus.jackson.JsonNode;
import org.jboss.logging.Logger;
import org.keycloak.broker.oidc.mappers.AbstractJsonUserAttributeMapper;
import org.keycloak.broker.oidc.util.JsonSimpleHttp;
import org.keycloak.broker.provider.util.SimpleHttp;
import org.keycloak.broker.provider.AuthenticationRequest;
import org.keycloak.broker.provider.BrokeredIdentityContext;
import org.keycloak.broker.provider.IdentityBrokerException;
import org.keycloak.events.Errors;
import org.keycloak.events.EventBuilder;
import org.keycloak.events.EventType;
import org.keycloak.jose.jws.JWSInput;
import org.keycloak.jose.jws.crypto.RSAProvider;
import org.keycloak.models.ClientSessionModel;
import org.keycloak.models.RealmModel;
import org.keycloak.models.UserSessionModel;
import org.keycloak.representations.AccessTokenResponse;
import org.keycloak.representations.IDToken;
import org.keycloak.representations.JsonWebToken;
import org.keycloak.services.ErrorPage;
import org.keycloak.services.managers.AuthenticationManager;
import org.keycloak.services.messages.Messages;
import org.keycloak.services.resources.IdentityBrokerService;
import org.keycloak.services.resources.RealmsResource;
import org.keycloak.util.JsonSerialization;
import org.keycloak.util.PemUtils;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriBuilder;
import javax.ws.rs.core.UriInfo;
import java.io.IOException;
import java.security.PublicKey;
/**
* @author Pedro Igor
*/
public class OIDCIdentityProvider extends AbstractOAuth2IdentityProvider<OIDCIdentityProviderConfig> {
protected static final Logger logger = Logger.getLogger(OIDCIdentityProvider.class);
public static final String OAUTH2_PARAMETER_PROMPT = "prompt";
public static final String SCOPE_OPENID = "openid";
public static final String FEDERATED_ID_TOKEN = "FEDERATED_ID_TOKEN";
public static final String USER_INFO = "UserInfo";
public static final String FEDERATED_ACCESS_TOKEN_RESPONSE = "FEDERATED_ACCESS_TOKEN_RESPONSE";
public static final String VALIDATED_ID_TOKEN = "VALIDATED_ID_TOKEN";
public OIDCIdentityProvider(OIDCIdentityProviderConfig config) {
super(config);
String defaultScope = config.getDefaultScope();
if (!defaultScope.contains(SCOPE_OPENID)) {
config.setDefaultScope(SCOPE_OPENID + " " + defaultScope);
}
}
@Override
public Object callback(RealmModel realm, AuthenticationCallback callback, EventBuilder event) {
return new OIDCEndpoint(callback, realm, event);
}
protected PublicKey getExternalIdpKey() {
String signingCert = getConfig().getCertificateSignatureVerifier();
try {
if (signingCert != null && !signingCert.trim().equals("")) {
return PemUtils.decodeCertificate(signingCert).getPublicKey();
} else if (getConfig().getPublicKeySignatureVerifier() != null && !getConfig().getPublicKeySignatureVerifier().trim().equals("")) {
return PemUtils.decodePublicKey(getConfig().getPublicKeySignatureVerifier());
}
} catch (Exception e) {
throw new RuntimeException(e);
}
return null;
}
protected class OIDCEndpoint extends Endpoint {
public OIDCEndpoint(AuthenticationCallback callback, RealmModel realm, EventBuilder event) {
super(callback, realm, event);
}
@GET
@Path("logout_response")
public Response logoutResponse(@Context UriInfo uriInfo,
@QueryParam("state") String state) {
UserSessionModel userSession = session.sessions().getUserSession(realm, state);
if (userSession == null) {
logger.error("no valid user session");
EventBuilder event = new EventBuilder(realm, session, clientConnection);
event.event(EventType.LOGOUT);
event.error(Errors.USER_SESSION_NOT_FOUND);
return ErrorPage.error(session, Messages.IDENTITY_PROVIDER_UNEXPECTED_ERROR);
}
if (userSession.getState() != UserSessionModel.State.LOGGING_OUT) {
logger.error("usersession in different state");
EventBuilder event = new EventBuilder(realm, session, clientConnection);
event.event(EventType.LOGOUT);
event.error(Errors.USER_SESSION_NOT_FOUND);
return ErrorPage.error(session, Messages.SESSION_NOT_ACTIVE);
}
return AuthenticationManager.finishBrowserLogout(session, realm, userSession, uriInfo, clientConnection, headers);
}
}
@Override
public void backchannelLogout(UserSessionModel userSession, UriInfo uriInfo, RealmModel realm) {
if (getConfig().getLogoutUrl() == null || getConfig().getLogoutUrl().trim().equals("") || !getConfig().isBackchannelSupported()) return;
String idToken = userSession.getNote(FEDERATED_ID_TOKEN);
if (idToken == null) return;
backchannelLogout(userSession, idToken);
}
protected void backchannelLogout(UserSessionModel userSession, String idToken) {
String sessionId = userSession.getId();
UriBuilder logoutUri = UriBuilder.fromUri(getConfig().getLogoutUrl())
.queryParam("state", sessionId);
logoutUri.queryParam("id_token_hint", idToken);
String url = logoutUri.build().toString();
try {
int status = JsonSimpleHttp.doGet(url).asStatus();
boolean success = status >=200 && status < 400;
if (!success) {
logger.warn("Failed backchannel broker logout to: " + url);
}
} catch (Exception e) {
logger.warn("Failed backchannel broker logout to: " + url, e);
}
}
@Override
public Response keycloakInitiatedBrowserLogout(UserSessionModel userSession, UriInfo uriInfo, RealmModel realm) {
if (getConfig().getLogoutUrl() == null || getConfig().getLogoutUrl().trim().equals("")) return null;
String idToken = userSession.getNote(FEDERATED_ID_TOKEN);
if (idToken != null && getConfig().isBackchannelSupported()) {
backchannelLogout(userSession, idToken);
return null;
} else {
String sessionId = userSession.getId();
UriBuilder logoutUri = UriBuilder.fromUri(getConfig().getLogoutUrl())
.queryParam("state", sessionId);
if (idToken != null) logoutUri.queryParam("id_token_hint", idToken);
String redirect = RealmsResource.brokerUrl(uriInfo)
.path(IdentityBrokerService.class, "getEndpoint")
.path(OIDCEndpoint.class, "logoutResponse")
.build(realm.getName(), getConfig().getAlias()).toString();
logoutUri.queryParam("post_logout_redirect_uri", redirect);
Response response = Response.status(302).location(logoutUri.build()).build();
return response;
}
}
@Override
protected UriBuilder createAuthorizationUrl(AuthenticationRequest request) {
UriBuilder authorizationUrl = super.createAuthorizationUrl(request);
String prompt = getConfig().getPrompt();
if (prompt != null && !prompt.isEmpty()) {
authorizationUrl.queryParam(OAUTH2_PARAMETER_PROMPT, prompt);
}
return authorizationUrl;
}
protected void processAccessTokenResponse(BrokeredIdentityContext context, PublicKey idpKey, AccessTokenResponse response) {
}
@Override
protected BrokeredIdentityContext getFederatedIdentity(String response) {
AccessTokenResponse tokenResponse = null;
try {
tokenResponse = JsonSerialization.readValue(response, AccessTokenResponse.class);
} catch (IOException e) {
throw new IdentityBrokerException("Could not decode access token response.", e);
}
PublicKey key = getExternalIdpKey();
String accessToken = verifyAccessToken(key, tokenResponse);
String encodedIdToken = tokenResponse.getIdToken();
JsonWebToken idToken = validateToken(key, encodedIdToken);
try {
String id = idToken.getSubject();
BrokeredIdentityContext identity = new BrokeredIdentityContext(id);
String name = (String)idToken.getOtherClaims().get(IDToken.NAME);
String preferredUsername = (String)idToken.getOtherClaims().get(IDToken.PREFERRED_USERNAME);
String email = (String)idToken.getOtherClaims().get(IDToken.EMAIL);
if (getConfig().getUserInfoUrl() != null && (id == null || name == null || preferredUsername == null || email == null) ) {
SimpleHttp request = JsonSimpleHttp.doGet(getConfig().getUserInfoUrl())
.header("Authorization", "Bearer " + accessToken);
JsonNode userInfo = JsonSimpleHttp.asJson(request);
id = getJsonProperty(userInfo, "sub");
name = getJsonProperty(userInfo, "name");
preferredUsername = getJsonProperty(userInfo, "preferred_username");
email = getJsonProperty(userInfo, "email");
AbstractJsonUserAttributeMapper.storeUserProfileForMapper(identity, userInfo, getConfig().getAlias());
}
identity.getContextData().put(FEDERATED_ACCESS_TOKEN_RESPONSE, tokenResponse);
identity.getContextData().put(VALIDATED_ID_TOKEN, idToken);
processAccessTokenResponse(identity, key, tokenResponse);
identity.setId(id);
identity.setName(name);
identity.setEmail(email);
identity.setBrokerUserId(getConfig().getAlias() + "." + id);
if (tokenResponse.getSessionState() != null) {
identity.setBrokerSessionId(getConfig().getAlias() + "." + tokenResponse.getSessionState());
}
if (preferredUsername == null) {
preferredUsername = email;
}
if (preferredUsername == null) {
preferredUsername = id;
}
identity.setUsername(preferredUsername);
if (getConfig().isStoreToken()) {
identity.setToken(response);
}
return identity;
} catch (Exception e) {
throw new IdentityBrokerException("Could not fetch attributes from userinfo endpoint.", e);
}
}
private String verifyAccessToken(PublicKey key, AccessTokenResponse tokenResponse) {
String accessToken = tokenResponse.getToken();
if (accessToken == null) {
throw new IdentityBrokerException("No access_token from server.");
}
return accessToken;
}
protected boolean verify(JWSInput jws, PublicKey key) {
if (key == null) return true;
if (!getConfig().isValidateSignature()) return true;
return RSAProvider.verify(jws, key);
}
protected JsonWebToken validateToken(PublicKey key, String encodedToken) {
if (encodedToken == null) {
throw new IdentityBrokerException("No token from server.");
}
try {
JWSInput jws = new JWSInput(encodedToken);
if (!verify(jws, key)) {
throw new IdentityBrokerException("token signature validation failed");
}
JsonWebToken token = jws.readJsonContent(JsonWebToken.class);
String aud = token.getAudience();
String iss = token.getIssuer();
if (aud != null && !aud.equals(getConfig().getClientId())) {
throw new IdentityBrokerException("Wrong audience from token.");
}
if (!token.isActive()) {
throw new IdentityBrokerException("Token is no longer valid");
}
String trustedIssuers = getConfig().getIssuer();
if (trustedIssuers != null) {
String[] issuers = trustedIssuers.split(",");
for (String trustedIssuer : issuers) {
if (iss != null && iss.equals(trustedIssuer.trim())) {
return token;
}
}
throw new IdentityBrokerException("Wrong issuer from token. Got: " + iss + " expected: " + getConfig().getIssuer());
}
return token;
} catch (IOException e) {
throw new IdentityBrokerException("Could not decode token.", e);
}
}
@Override
public void attachUserSession(UserSessionModel userSession, ClientSessionModel clientSession, BrokeredIdentityContext context) {
AccessTokenResponse tokenResponse = (AccessTokenResponse)context.getContextData().get(FEDERATED_ACCESS_TOKEN_RESPONSE);
userSession.setNote(FEDERATED_ACCESS_TOKEN, tokenResponse.getToken());
userSession.setNote(FEDERATED_ID_TOKEN, tokenResponse.getIdToken());
}
@Override
protected String getDefaultScopes() {
return "openid";
}
}
@@ -0,0 +1,84 @@
/*
* JBoss, Home of Professional Open Source
*
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.keycloak.broker.oidc;
import org.keycloak.models.IdentityProviderModel;
/**
* @author Pedro Igor
*/
public class OIDCIdentityProviderConfig extends OAuth2IdentityProviderConfig {
public OIDCIdentityProviderConfig(IdentityProviderModel identityProviderModel) {
super(identityProviderModel);
}
public String getPrompt() {
return getConfig().get("prompt");
}
public void setPrompt(String prompt) {
getConfig().put("prompt", prompt);
}
public String getIssuer() {
return getConfig().get("issuer");
}
public void setIssuer(String issuer) {
getConfig().put("issuer", issuer);
}
public String getLogoutUrl() {
return getConfig().get("logoutUrl");
}
public void setLogoutUrl(String url) {
getConfig().put("logoutUrl", url);
}
public String getCertificateSignatureVerifier() {
return getConfig().get("certificateSignatureVerifier");
}
public void setCertificateSignatureVerifier(String signingCertificate) {
getConfig().put("certificateSignatureVerifier", signingCertificate);
}
public String getPublicKeySignatureVerifier() {
return getConfig().get("publicKeySignatureVerifier");
}
public void setPublicKeySignatureVerifier(String signingCertificate) {
getConfig().put("publicKeySignatureVerifier", signingCertificate);
}
public boolean isValidateSignature() {
return Boolean.valueOf(getConfig().get("validateSignature"));
}
public void setValidateSignature(boolean validateSignature) {
getConfig().put("validateSignature", String.valueOf(validateSignature));
}
public boolean isBackchannelSupported() {
return Boolean.valueOf(getConfig().get("backchannelSupported"));
}
public void setBackchannelSupported(boolean backchannel) {
getConfig().put("backchannelSupported", String.valueOf(backchannel));
}
}
@@ -0,0 +1,108 @@
/*
* JBoss, Home of Professional Open Source
*
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.keycloak.broker.oidc;
import org.keycloak.broker.oidc.mappers.UsernameTemplateMapper;
import org.keycloak.broker.provider.util.SimpleHttp;
import org.keycloak.broker.provider.AbstractIdentityProviderFactory;
import org.keycloak.jose.jwk.JWK;
import org.keycloak.jose.jwk.JWKParser;
import org.keycloak.models.IdentityProviderMapperModel;
import org.keycloak.models.IdentityProviderModel;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.RealmModel;
import org.keycloak.models.utils.KeycloakModelUtils;
import org.keycloak.protocol.oidc.representations.JSONWebKeySet;
import org.keycloak.protocol.oidc.representations.OIDCConfigurationRepresentation;
import org.keycloak.util.JsonSerialization;
import java.io.IOException;
import java.io.InputStream;
import java.security.PublicKey;
import java.util.HashMap;
import java.util.Map;
/**
* @author Pedro Igor
*/
public class OIDCIdentityProviderFactory extends AbstractIdentityProviderFactory<OIDCIdentityProvider> {
public static final String PROVIDER_ID = "oidc";
@Override
public String getName() {
return "OpenID Connect v1.0";
}
@Override
public OIDCIdentityProvider create(IdentityProviderModel model) {
return new OIDCIdentityProvider(new OIDCIdentityProviderConfig(model));
}
@Override
public String getId() {
return PROVIDER_ID;
}
@Override
public Map<String, String> parseConfig(InputStream inputStream) {
return parseOIDCConfig(inputStream);
}
protected static Map<String, String> parseOIDCConfig(InputStream inputStream) {
OIDCConfigurationRepresentation rep = null;
try {
rep = JsonSerialization.readValue(inputStream, OIDCConfigurationRepresentation.class);
} catch (IOException e) {
throw new RuntimeException("failed to load openid connect metadata", e);
}
OIDCIdentityProviderConfig config = new OIDCIdentityProviderConfig(new IdentityProviderModel());
config.setIssuer(rep.getIssuer());
config.setLogoutUrl(rep.getLogoutEndpoint());
config.setAuthorizationUrl(rep.getAuthorizationEndpoint());
config.setTokenUrl(rep.getTokenEndpoint());
config.setUserInfoUrl(rep.getUserinfoEndpoint());
if (rep.getJwksUri() != null) {
String uri = rep.getJwksUri();
String keySetString = null;
try {
keySetString = SimpleHttp.doGet(uri).asString();
JSONWebKeySet keySet = JsonSerialization.readValue(keySetString, JSONWebKeySet.class);
for (JWK jwk : keySet.getKeys()) {
JWKParser parse = JWKParser.create(jwk);
if (parse.getJwk().getPublicKeyUse().equals(JWK.SIG_USE) && keyTypeSupported(jwk.getKeyType())) {
PublicKey key = parse.toPublicKey();
config.setPublicKeySignatureVerifier(KeycloakModelUtils.getPemFromKey(key));
config.setValidateSignature(true);
break;
}
}
} catch (IOException e) {
throw new RuntimeException("Failed to query JWKSet from: " + uri, e);
}
}
return config.getConfig();
}
protected static boolean keyTypeSupported(String type) {
return type != null && type.equals("RSA");
}
}
@@ -0,0 +1,97 @@
package org.keycloak.broker.oidc.mappers;
import org.keycloak.broker.oidc.KeycloakOIDCIdentityProvider;
import org.keycloak.broker.provider.AbstractIdentityProviderMapper;
import org.keycloak.broker.provider.BrokeredIdentityContext;
import org.keycloak.models.IdentityProviderMapperModel;
import org.keycloak.provider.ProviderConfigProperty;
import org.keycloak.representations.JsonWebToken;
import java.util.List;
import java.util.Map;
/**
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $
*/
public abstract class AbstractClaimMapper extends AbstractIdentityProviderMapper {
public static final String CLAIM = "claim";
public static final String CLAIM_VALUE = "claim.value";
public static Object getClaimValue(JsonWebToken token, String claim) {
String[] split = claim.split("\\.");
Map<String, Object> jsonObject = token.getOtherClaims();
for (int i = 0; i < split.length; i++) {
if (i == split.length - 1) {
return jsonObject.get(split[i]);
} else {
Object val = jsonObject.get(split[i]);
if (!(val instanceof Map)) return null;
jsonObject = (Map<String, Object>)val;
}
}
return null;
}
public static Object getClaimValue(IdentityProviderMapperModel mapperModel, BrokeredIdentityContext context) {
String claim = mapperModel.getConfig().get(CLAIM);
return getClaimValue(context, claim);
}
public static Object getClaimValue(BrokeredIdentityContext context, String claim) {
{ // search access token
JsonWebToken token = (JsonWebToken)context.getContextData().get(KeycloakOIDCIdentityProvider.VALIDATED_ACCESS_TOKEN);
if (token != null) {
Object value = getClaimValue(token, claim);
if (value != null) return value;
}
}
{ // search ID Token
JsonWebToken token = (JsonWebToken)context.getContextData().get(KeycloakOIDCIdentityProvider.VALIDATED_ID_TOKEN);
if (token != null) {
Object value = getClaimValue(token, claim);
if (value != null) return value;
}
}
return null;
}
protected boolean hasClaimValue(IdentityProviderMapperModel mapperModel, BrokeredIdentityContext context) {
Object value = getClaimValue(mapperModel, context);
String desiredValue = mapperModel.getConfig().get(CLAIM_VALUE);
return valueEquals(desiredValue, value);
}
public boolean valueEquals(String desiredValue, Object value) {
if (value instanceof String) {
if (desiredValue.equals(value)) return true;
} else if (value instanceof Double) {
try {
if (Double.valueOf(desiredValue).equals(value)) return true;
} catch (Exception e) {
}
} else if (value instanceof Integer) {
try {
if (Integer.valueOf(desiredValue).equals(value)) return true;
} catch (Exception e) {
}
} else if (value instanceof Boolean) {
try {
if (Boolean.valueOf(desiredValue).equals(value)) return true;
} catch (Exception e) {
}
} else if (value instanceof List) {
List list = (List)value;
for (Object val : list) {
return valueEquals(desiredValue, val);
}
}
return false;
}
}
@@ -0,0 +1,206 @@
package org.keycloak.broker.oidc.mappers;
import java.util.ArrayList;
import java.util.List;
import org.codehaus.jackson.JsonNode;
import org.jboss.logging.Logger;
import org.keycloak.broker.oidc.OIDCIdentityProvider;
import org.keycloak.broker.provider.AbstractIdentityProviderMapper;
import org.keycloak.broker.provider.BrokeredIdentityContext;
import org.keycloak.models.IdentityProviderMapperModel;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.RealmModel;
import org.keycloak.models.UserModel;
import org.keycloak.provider.ProviderConfigProperty;
/**
* Abstract class for Social Provider mappers which allow mapping of JSON user profile field into Keycloak user
* attribute. Concrete mapper classes with own ID and provider mapping must be implemented for each social provider who
* uses {@link JsonNode} user profile.
*
* @author Vlastimil Elias (velias at redhat dot com)
*/
public abstract class AbstractJsonUserAttributeMapper extends AbstractIdentityProviderMapper {
protected static final Logger logger = Logger.getLogger(AbstractJsonUserAttributeMapper.class);
protected static final Logger LOGGER_DUMP_USER_PROFILE = Logger.getLogger("org.keycloak.social.user_profile_dump");
private static final String JSON_PATH_DELIMITER = ".";
/**
* Config param where name of mapping source JSON User Profile field is stored.
*/
public static final String CONF_JSON_FIELD = "jsonField";
/**
* Config param where name of mapping target USer attribute is stored.
*/
public static final String CONF_USER_ATTRIBUTE = "userAttribute";
/**
* Key in {@link BrokeredIdentityContext#getContextData()} where {@link JsonNode} with user profile is stored.
*/
public static final String CONTEXT_JSON_NODE = OIDCIdentityProvider.USER_INFO;
private static final List<ProviderConfigProperty> configProperties = new ArrayList<ProviderConfigProperty>();
static {
ProviderConfigProperty property;
ProviderConfigProperty property1;
property1 = new ProviderConfigProperty();
property1.setName(CONF_JSON_FIELD);
property1.setLabel("Social Profile JSON Field Path");
property1.setHelpText("Path of field in Social provider User Profile JSON data to get value from. You can use dot notation for nesting and square brackets for array index. Eg. 'contact.address[0].country'.");
property1.setType(ProviderConfigProperty.STRING_TYPE);
configProperties.add(property1);
property = new ProviderConfigProperty();
property.setName(CONF_USER_ATTRIBUTE);
property.setLabel("User Attribute Name");
property.setHelpText("User attribute name to store information into.");
property.setType(ProviderConfigProperty.STRING_TYPE);
configProperties.add(property);
}
/**
* Store used profile JsonNode into user context for later use by this mapper. Profile data are dumped into special logger if enabled also to allow investigation of the structure.
*
* @param user context to store profile data into
* @param profile to store into context
* @param provider identification of social provider to be used in log dump
*
* @see #importNewUser(KeycloakSession, RealmModel, UserModel, IdentityProviderMapperModel, BrokeredIdentityContext)
* @see BrokeredIdentityContext#getContextData()
*/
public static void storeUserProfileForMapper(BrokeredIdentityContext user, JsonNode profile, String provider) {
user.getContextData().put(AbstractJsonUserAttributeMapper.CONTEXT_JSON_NODE, profile);
if (LOGGER_DUMP_USER_PROFILE.isDebugEnabled())
LOGGER_DUMP_USER_PROFILE.debug("User Profile JSON Data for provider "+provider+": " + profile);
}
@Override
public List<ProviderConfigProperty> getConfigProperties() {
return configProperties;
}
@Override
public String getDisplayCategory() {
return "Attribute Importer";
}
@Override
public String getDisplayType() {
return "Attribute Importer";
}
@Override
public String getHelpText() {
return "Import user profile information if it exists in Social provider JSON data into the specified user attribute.";
}
@Override
public void importNewUser(KeycloakSession session, RealmModel realm, UserModel user, IdentityProviderMapperModel mapperModel, BrokeredIdentityContext context) {
String attribute = mapperModel.getConfig().get(CONF_USER_ATTRIBUTE);
if (attribute == null || attribute.trim().isEmpty()) {
logger.debug("Attribute is not configured");
return;
}
attribute = attribute.trim();
String value = getJsonValue(mapperModel, context);
if (value != null) {
user.setAttribute(attribute, value);
}
}
@Override
public void updateBrokeredUser(KeycloakSession session, RealmModel realm, UserModel user, IdentityProviderMapperModel mapperModel, BrokeredIdentityContext context) {
// we do not update user profile from social provider
}
protected static String getJsonValue(IdentityProviderMapperModel mapperModel, BrokeredIdentityContext context) {
String jsonField = mapperModel.getConfig().get(CONF_JSON_FIELD);
if (jsonField == null || jsonField.trim().isEmpty()) {
logger.debug("JSON field path is not configured");
return null;
}
jsonField = jsonField.trim();
if (jsonField.startsWith(JSON_PATH_DELIMITER) || jsonField.endsWith(JSON_PATH_DELIMITER) || jsonField.startsWith("[")) {
logger.debug("JSON field path is invalid " + jsonField);
return null;
}
JsonNode profileJsonNode = (JsonNode) context.getContextData().get(CONTEXT_JSON_NODE);
String value = getJsonValue(profileJsonNode, jsonField);
if (value == null) {
logger.debug("User profile JSON value '" + jsonField + "' is not available.");
}
return value;
}
protected static String getJsonValue(JsonNode baseNode, String fieldPath) {
logger.debug("Going to process JsonNode path " + fieldPath + " on data " + baseNode);
if (baseNode != null) {
int idx = fieldPath.indexOf(JSON_PATH_DELIMITER);
String currentFieldName = fieldPath;
if (idx > 0) {
currentFieldName = fieldPath.substring(0, idx).trim();
if (currentFieldName.isEmpty()) {
logger.debug("JSON path is invalid " + fieldPath);
return null;
}
}
String currentNodeName = currentFieldName;
int arrayIndex = -1;
if (currentFieldName.endsWith("]")) {
int bi = currentFieldName.indexOf("[");
if (bi == -1) {
logger.debug("Invalid array index construct in " + currentFieldName);
return null;
}
try {
String is = currentFieldName.substring(bi+1, currentFieldName.length() - 1).trim();
arrayIndex = Integer.parseInt(is);
} catch (Exception e) {
logger.debug("Invalid array index construct in " + currentFieldName);
return null;
}
currentNodeName = currentFieldName.substring(0,bi).trim();
}
JsonNode currentNode = baseNode.get(currentNodeName);
if (arrayIndex > -1 && currentNode.isArray()) {
logger.debug("Going to take array node at index " + arrayIndex);
currentNode = currentNode.get(arrayIndex);
}
if (currentNode == null) {
logger.debug("JsonNode not found for name " + currentFieldName);
return null;
}
if (idx < 0) {
if (!currentNode.isValueNode()) {
logger.debug("JsonNode is not value node for name " + currentFieldName);
return null;
}
String ret = currentNode.asText();
if (ret != null && !ret.trim().isEmpty())
return ret.trim();
} else {
return getJsonValue(currentNode, fieldPath.substring(idx + 1));
}
}
return null;
}
}
@@ -0,0 +1,105 @@
package org.keycloak.broker.oidc.mappers;
import org.keycloak.broker.oidc.KeycloakOIDCIdentityProviderFactory;
import org.keycloak.broker.oidc.OIDCIdentityProviderFactory;
import org.keycloak.broker.provider.BrokeredIdentityContext;
import org.keycloak.broker.provider.HardcodedRoleMapper;
import org.keycloak.broker.provider.IdentityBrokerException;
import org.keycloak.models.IdentityProviderMapperModel;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.RealmModel;
import org.keycloak.models.RoleModel;
import org.keycloak.models.UserModel;
import org.keycloak.provider.ProviderConfigProperty;
import java.util.ArrayList;
import java.util.List;
/**
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $
*/
public class ClaimToRoleMapper extends AbstractClaimMapper {
public static final String[] COMPATIBLE_PROVIDERS = {KeycloakOIDCIdentityProviderFactory.PROVIDER_ID, OIDCIdentityProviderFactory.PROVIDER_ID};
private static final List<ProviderConfigProperty> configProperties = new ArrayList<ProviderConfigProperty>();
static {
ProviderConfigProperty property;
ProviderConfigProperty property1;
property1 = new ProviderConfigProperty();
property1.setName(CLAIM);
property1.setLabel("Claim");
property1.setHelpText("Name of claim to search for in token. You can reference nested claims using a '.', i.e. 'address.locality'.");
property1.setType(ProviderConfigProperty.STRING_TYPE);
configProperties.add(property1);
property1 = new ProviderConfigProperty();
property1.setName(CLAIM_VALUE);
property1.setLabel("Claim Value");
property1.setHelpText("Value the claim must have. If the claim is an array, then the value must be contained in the array.");
property1.setType(ProviderConfigProperty.STRING_TYPE);
configProperties.add(property1);
property = new ProviderConfigProperty();
property.setName(HardcodedRoleMapper.ROLE);
property.setLabel("Role");
property.setHelpText("Role to grant to user if claim is present. To reference an application role the syntax is appname.approle, i.e. myapp.myrole");
property.setType(ProviderConfigProperty.STRING_TYPE);
configProperties.add(property);
}
public static final String PROVIDER_ID = "oidc-role-idp-mapper";
@Override
public List<ProviderConfigProperty> getConfigProperties() {
return configProperties;
}
@Override
public String getId() {
return PROVIDER_ID;
}
@Override
public String[] getCompatibleProviders() {
return COMPATIBLE_PROVIDERS;
}
@Override
public String getDisplayCategory() {
return "Role Importer";
}
@Override
public String getDisplayType() {
return "Claim to Role";
}
@Override
public void importNewUser(KeycloakSession session, RealmModel realm, UserModel user, IdentityProviderMapperModel mapperModel, BrokeredIdentityContext context) {
String roleName = mapperModel.getConfig().get(HardcodedRoleMapper.ROLE);
if (hasClaimValue(mapperModel, context)) {
RoleModel role = HardcodedRoleMapper.getRoleFromString(realm, roleName);
if (role == null) throw new IdentityBrokerException("Unable to find role: " + roleName);
user.grantRole(role);
}
}
@Override
public void updateBrokeredUser(KeycloakSession session, RealmModel realm, UserModel user, IdentityProviderMapperModel mapperModel, BrokeredIdentityContext context) {
String roleName = mapperModel.getConfig().get(HardcodedRoleMapper.ROLE);
if (!hasClaimValue(mapperModel, context)) {
RoleModel role = HardcodedRoleMapper.getRoleFromString(realm, roleName);
if (role == null) throw new IdentityBrokerException("Unable to find role: " + roleName);
user.deleteRoleMapping(role);
}
}
@Override
public String getHelpText() {
return "If a claim exists, grant the user the specified realm or application role.";
}
}
@@ -0,0 +1,118 @@
package org.keycloak.broker.oidc.mappers;
import org.keycloak.broker.oidc.KeycloakOIDCIdentityProvider;
import org.keycloak.broker.oidc.KeycloakOIDCIdentityProviderFactory;
import org.keycloak.broker.oidc.OIDCIdentityProviderFactory;
import org.keycloak.broker.provider.BrokeredIdentityContext;
import org.keycloak.broker.provider.HardcodedRoleMapper;
import org.keycloak.broker.provider.IdentityBrokerException;
import org.keycloak.models.IdentityProviderMapperModel;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.RealmModel;
import org.keycloak.models.RoleModel;
import org.keycloak.models.UserModel;
import org.keycloak.provider.ProviderConfigProperty;
import org.keycloak.representations.JsonWebToken;
import java.util.ArrayList;
import java.util.List;
/**
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $
*/
public class ExternalKeycloakRoleToRoleMapper extends AbstractClaimMapper {
public static final String[] COMPATIBLE_PROVIDERS = {KeycloakOIDCIdentityProviderFactory.PROVIDER_ID};
private static final List<ProviderConfigProperty> configProperties = new ArrayList<ProviderConfigProperty>();
private static final String EXTERNAL_ROLE = "external.role";
static {
ProviderConfigProperty property;
ProviderConfigProperty property1;
property1 = new ProviderConfigProperty();
property1.setName(EXTERNAL_ROLE);
property1.setLabel("External role");
property1.setHelpText("External role to check for. To reference an application role the syntax is appname.approle, i.e. myapp.myrole.");
property1.setType(ProviderConfigProperty.STRING_TYPE);
configProperties.add(property1);
property = new ProviderConfigProperty();
property.setName(HardcodedRoleMapper.ROLE);
property.setLabel("Role");
property.setHelpText("Role to grant to user if external role is present. To reference an application role the syntax is appname.approle, i.e. myapp.myrole");
property.setType(ProviderConfigProperty.STRING_TYPE);
configProperties.add(property);
}
public static final String PROVIDER_ID = "keycloak-oidc-role-to-role-idp-mapper";
@Override
public List<ProviderConfigProperty> getConfigProperties() {
return configProperties;
}
@Override
public String getId() {
return PROVIDER_ID;
}
@Override
public String[] getCompatibleProviders() {
return COMPATIBLE_PROVIDERS;
}
@Override
public String getDisplayCategory() {
return "Role Importer";
}
@Override
public String getDisplayType() {
return "External Role to Role";
}
@Override
public void importNewUser(KeycloakSession session, RealmModel realm, UserModel user, IdentityProviderMapperModel mapperModel, BrokeredIdentityContext context) {
RoleModel role = hasRole(realm, mapperModel, context);
if (role != null) {
user.grantRole(role);
}
}
private RoleModel hasRole(RealmModel realm,IdentityProviderMapperModel mapperModel, BrokeredIdentityContext context) {
JsonWebToken token = (JsonWebToken)context.getContextData().get(KeycloakOIDCIdentityProvider.VALIDATED_ACCESS_TOKEN);
//if (token == null) return;
String roleName = mapperModel.getConfig().get(HardcodedRoleMapper.ROLE);
String[] parseRole = HardcodedRoleMapper.parseRole(mapperModel.getConfig().get(EXTERNAL_ROLE));
String externalRoleName = parseRole[1];
String claimName = null;
if (parseRole[0] == null) {
claimName = "realm_access.roles";
} else {
claimName = "resource_access." + parseRole[0] + ".roles";
}
Object claim = getClaimValue(token, claimName);
if (valueEquals(externalRoleName, claim)) {
RoleModel role = HardcodedRoleMapper.getRoleFromString(realm, roleName);
if (role == null) throw new IdentityBrokerException("Unable to find role: " + roleName);
return role;
}
return null;
}
@Override
public void updateBrokeredUser(KeycloakSession session, RealmModel realm, UserModel user, IdentityProviderMapperModel mapperModel, BrokeredIdentityContext context) {
RoleModel role = hasRole(realm, mapperModel, context);
if (role == null) {
user.deleteRoleMapping(role);
}
}
@Override
public String getHelpText() {
return "Looks for an external role in a keycloak access token. If external role exists, grant the user the specified realm or application role.";
}
}
@@ -0,0 +1,100 @@
package org.keycloak.broker.oidc.mappers;
import org.keycloak.broker.oidc.KeycloakOIDCIdentityProviderFactory;
import org.keycloak.broker.oidc.OIDCIdentityProviderFactory;
import org.keycloak.broker.provider.BrokeredIdentityContext;
import org.keycloak.broker.provider.IdentityBrokerException;
import org.keycloak.models.ClientModel;
import org.keycloak.models.IdentityProviderMapperModel;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.RealmModel;
import org.keycloak.models.RoleModel;
import org.keycloak.models.UserModel;
import org.keycloak.provider.ProviderConfigProperty;
import java.util.ArrayList;
import java.util.List;
/**
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $
*/
public class UserAttributeMapper extends AbstractClaimMapper {
public static final String[] COMPATIBLE_PROVIDERS = {KeycloakOIDCIdentityProviderFactory.PROVIDER_ID, OIDCIdentityProviderFactory.PROVIDER_ID};
private static final List<ProviderConfigProperty> configProperties = new ArrayList<ProviderConfigProperty>();
public static final String USER_ATTRIBUTE = "user.attribute";
static {
ProviderConfigProperty property;
ProviderConfigProperty property1;
property1 = new ProviderConfigProperty();
property1.setName(CLAIM);
property1.setLabel("Claim");
property1.setHelpText("Name of claim to search for in token. You can reference nested claims using a '.', i.e. 'address.locality'.");
property1.setType(ProviderConfigProperty.STRING_TYPE);
configProperties.add(property1);
property = new ProviderConfigProperty();
property.setName(USER_ATTRIBUTE);
property.setLabel("User Attribute Name");
property.setHelpText("User attribute name to store claim.");
property.setType(ProviderConfigProperty.STRING_TYPE);
configProperties.add(property);
}
public static final String PROVIDER_ID = "oidc-user-attribute-idp-mapper";
@Override
public List<ProviderConfigProperty> getConfigProperties() {
return configProperties;
}
@Override
public String getId() {
return PROVIDER_ID;
}
@Override
public String[] getCompatibleProviders() {
return COMPATIBLE_PROVIDERS;
}
@Override
public String getDisplayCategory() {
return "Attribute Importer";
}
@Override
public String getDisplayType() {
return "Attribute Importer";
}
@Override
public void importNewUser(KeycloakSession session, RealmModel realm, UserModel user, IdentityProviderMapperModel mapperModel, BrokeredIdentityContext context) {
String attribute = mapperModel.getConfig().get(USER_ATTRIBUTE);
Object value = getClaimValue(mapperModel, context);
if (value != null) {
user.setAttribute(attribute, value.toString());
}
}
@Override
public void updateBrokeredUser(KeycloakSession session, RealmModel realm, UserModel user, IdentityProviderMapperModel mapperModel, BrokeredIdentityContext context) {
String attribute = mapperModel.getConfig().get(USER_ATTRIBUTE);
Object value = getClaimValue(mapperModel, context);
String current = user.getAttribute(attribute);
if (value != null && !value.equals(current)) {
user.setAttribute(attribute, value.toString());
} else if (value == null) {
user.removeAttribute(attribute);
}
}
@Override
public String getHelpText() {
return "Import declared claim if it exists in ID or access token into the specified user attribute.";
}
}
@@ -0,0 +1,109 @@
package org.keycloak.broker.oidc.mappers;
import org.keycloak.broker.oidc.KeycloakOIDCIdentityProviderFactory;
import org.keycloak.broker.oidc.OIDCIdentityProviderFactory;
import org.keycloak.broker.provider.BrokeredIdentityContext;
import org.keycloak.models.IdentityProviderMapperModel;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.RealmModel;
import org.keycloak.models.UserModel;
import org.keycloak.models.utils.KeycloakModelUtils;
import org.keycloak.provider.ProviderConfigProperty;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $
*/
public class UsernameTemplateMapper extends AbstractClaimMapper {
public static final String[] COMPATIBLE_PROVIDERS = {KeycloakOIDCIdentityProviderFactory.PROVIDER_ID, OIDCIdentityProviderFactory.PROVIDER_ID};
private static final List<ProviderConfigProperty> configProperties = new ArrayList<ProviderConfigProperty>();
public static final String TEMPLATE = "template";
static {
ProviderConfigProperty property;
property = new ProviderConfigProperty();
property.setName(TEMPLATE);
property.setLabel("Template");
property.setHelpText("Template to use to format the username to import. Substitutions are enclosed in ${}. For example: '${ALIAS}.${CLAIM.sub}'. ALIAS is the provider alias. CLAIM.<NAME> references an ID or Access token claim.");
property.setType(ProviderConfigProperty.STRING_TYPE);
property.setDefaultValue("${ALIAS}.${CLAIM.preferred_username}");
configProperties.add(property);
}
public static final String PROVIDER_ID = "oidc-username-idp-mapper";
@Override
public List<ProviderConfigProperty> getConfigProperties() {
return configProperties;
}
@Override
public String getId() {
return PROVIDER_ID;
}
@Override
public String[] getCompatibleProviders() {
return COMPATIBLE_PROVIDERS;
}
@Override
public String getDisplayCategory() {
return "Preprocessor";
}
@Override
public String getDisplayType() {
return "Username Template Importer";
}
@Override
public void importNewUser(KeycloakSession session, RealmModel realm, UserModel user, IdentityProviderMapperModel mapperModel, BrokeredIdentityContext context) {
}
@Override
public void updateBrokeredUser(KeycloakSession session, RealmModel realm, UserModel user, IdentityProviderMapperModel mapperModel, BrokeredIdentityContext context) {
}
static Pattern substitution = Pattern.compile("\\$\\{([^}]+)\\}");
@Override
public void preprocessFederatedIdentity(KeycloakSession session, RealmModel realm, IdentityProviderMapperModel mapperModel, BrokeredIdentityContext context) {
String template = mapperModel.getConfig().get(TEMPLATE);
Matcher m = substitution.matcher(template);
StringBuffer sb = new StringBuffer();
while (m.find()) {
String variable = m.group(1);
if (variable.equals("ALIAS")) {
m.appendReplacement(sb, context.getIdpConfig().getAlias());
} else if (variable.equals("UUID")) {
m.appendReplacement(sb, KeycloakModelUtils.generateId());
} else if (variable.startsWith("CLAIM.")) {
String name = variable.substring("CLAIM.".length());
Object value = AbstractClaimMapper.getClaimValue(context, name);
if (value == null) value = "";
m.appendReplacement(sb, value.toString());
} else {
m.appendReplacement(sb, m.group(1));
}
}
m.appendTail(sb);
String username = sb.toString();
context.setModelUsername(username);
}
@Override
public String getHelpText() {
return "Format the username to import.";
}
}
@@ -0,0 +1,32 @@
package org.keycloak.broker.oidc.util;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.map.ObjectMapper;
import org.keycloak.broker.provider.util.SimpleHttp;
import java.io.IOException;
/**
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $
*/
public class JsonSimpleHttp extends SimpleHttp {
public JsonSimpleHttp(String url, String method) {
super(url, method);
}
public static JsonSimpleHttp doGet(String url) {
return new JsonSimpleHttp(url, "GET");
}
public static JsonSimpleHttp doPost(String url) {
return new JsonSimpleHttp(url, "POST");
}
private static ObjectMapper mapper = new ObjectMapper();
public static JsonNode asJson(SimpleHttp request) throws IOException {
return mapper.readTree(request.asString());
}
}
@@ -0,0 +1,2 @@
org.keycloak.broker.oidc.OIDCIdentityProviderFactory
org.keycloak.broker.oidc.KeycloakOIDCIdentityProviderFactory
@@ -0,0 +1,4 @@
org.keycloak.broker.oidc.mappers.ClaimToRoleMapper
org.keycloak.broker.oidc.mappers.ExternalKeycloakRoleToRoleMapper
org.keycloak.broker.oidc.mappers.UserAttributeMapper
org.keycloak.broker.oidc.mappers.UsernameTemplateMapper
@@ -0,0 +1,133 @@
/*
* JBoss, Home of Professional Open Source
* Copyright 2015 Red Hat Inc. and/or its affiliates and other contributors
* as indicated by the @authors tag. All rights reserved.
*/
package org.keycloak.broker.oidc;
import org.codehaus.jackson.JsonNode;
import org.junit.Assert;
import org.junit.Test;
import org.keycloak.broker.provider.BrokeredIdentityContext;
import org.keycloak.broker.provider.IdentityBrokerException;
import org.keycloak.models.IdentityProviderModel;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
/**
* Unit test for {@link AbstractOAuth2IdentityProvider}
*
* @author Vlastimil Elias (velias at redhat dot com)
*/
public class AbstractOAuth2IdentityProviderTest {
@Test
public void constructor_defaultScopeHandling(){
TestProvider tested = getTested();
//default scope is set from the provider if not provided in the configuration
Assert.assertEquals( tested.getDefaultScopes(), tested.getConfig().getDefaultScope());
//default scope is preserved if provided in the configuration
IdentityProviderModel model = new IdentityProviderModel();
OAuth2IdentityProviderConfig config = new OAuth2IdentityProviderConfig(model);
config.setDefaultScope("myscope");
tested = new TestProvider(config);
Assert.assertEquals("myscope", tested.getConfig().getDefaultScope());
}
@Test
public void getJsonProperty_asJsonNode() throws IOException {
TestProvider tested = getTested();
JsonNode jsonNode = tested
.asJsonNode("{\"nullone\":null, \"emptyone\":\"\", \"blankone\": \" \", \"withvalue\" : \"my value\", \"withbooleanvalue\" : true, \"withnumbervalue\" : 10}");
Assert.assertNull(tested.getJsonProperty(jsonNode, "nonexisting"));
Assert.assertNull(tested.getJsonProperty(jsonNode, "nullone"));
Assert.assertNull(tested.getJsonProperty(jsonNode, "emptyone"));
Assert.assertEquals(" ", tested.getJsonProperty(jsonNode, "blankone"));
Assert.assertEquals("my value", tested.getJsonProperty(jsonNode, "withvalue"));
Assert.assertEquals("true", tested.getJsonProperty(jsonNode, "withbooleanvalue"));
Assert.assertEquals("10", tested.getJsonProperty(jsonNode, "withnumbervalue"));
}
@Test(expected = IdentityBrokerException.class)
public void getFederatedIdentity_responseUrlLine_tokenNotFound() {
TestProvider tested = getTested();
tested.getFederatedIdentity("cosi=sss");
}
@Test(expected = IdentityBrokerException.class)
public void getFederatedIdentity_responseJSON_tokenNotFound() {
TestProvider tested = getTested();
Map<String, String> notes = new HashMap<>();
tested.getFederatedIdentity("{\"cosi\":\"sss\"}");
}
@Test(expected = IdentityBrokerException.class)
public void getFederatedIdentity_responseJSON_invalidFormat() {
TestProvider tested = getTested();
Map<String, String> notes = new HashMap<>();
tested.getFederatedIdentity("{\"cosi\":\"sss\"");
}
@Test(expected = IdentityBrokerException.class)
public void getFederatedIdentity_responseJSON_emptyTokenField() {
TestProvider tested = getTested();
tested.getFederatedIdentity("{\""
+ AbstractOAuth2IdentityProvider.OAUTH2_PARAMETER_ACCESS_TOKEN + "\" : \"\"}");
}
@Test(expected = IdentityBrokerException.class)
public void getFederatedIdentity_responseJSON_nullTokenField() {
TestProvider tested = getTested();
tested.getFederatedIdentity("{\""
+ AbstractOAuth2IdentityProvider.OAUTH2_PARAMETER_ACCESS_TOKEN + "\" : null}");
}
@Test
public void getFederatedIdentity_responseJSON() {
TestProvider tested = getTested();
BrokeredIdentityContext fi = tested.getFederatedIdentity("{\""
+ AbstractOAuth2IdentityProvider.OAUTH2_PARAMETER_ACCESS_TOKEN + "\" : \"458rt\"}");
Assert.assertNotNull(fi);
Assert.assertEquals("458rt", fi.getId());
}
@Test
public void getFederatedIdentity_responseUrlLine() {
TestProvider tested = getTested();
BrokeredIdentityContext fi = tested.getFederatedIdentity("cosi=sss&"
+ AbstractOAuth2IdentityProvider.OAUTH2_PARAMETER_ACCESS_TOKEN + "=458rtf&kdesi=ss}");
Assert.assertNotNull(fi);
Assert.assertEquals("458rtf", fi.getId());
}
private TestProvider getTested() {
IdentityProviderModel model = new IdentityProviderModel();
OAuth2IdentityProviderConfig config = new OAuth2IdentityProviderConfig(model);
return new TestProvider(config);
}
private static class TestProvider extends AbstractOAuth2IdentityProvider<OAuth2IdentityProviderConfig> {
public TestProvider(OAuth2IdentityProviderConfig config) {
super(config);
}
@Override
protected String getDefaultScopes() {
return "default";
}
protected BrokeredIdentityContext doGetFederatedIdentity(String accessToken) {
return new BrokeredIdentityContext(accessToken);
};
};
}
@@ -0,0 +1,120 @@
/*
* JBoss, Home of Professional Open Source
* Copyright 2015 Red Hat Inc. and/or its affiliates and other contributors
* as indicated by the @authors tag. All rights reserved.
*/
package org.keycloak.broker.oidc.mappers;
import java.io.IOException;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.junit.Assert;
import org.junit.Test;
/**
* Unit test for {@link AbstractJsonUserAttributeMapper}
*
* @author Vlastimil Elias (velias at redhat dot com)
*/
public class AbstractJsonUserAttributeMapperTest {
private static ObjectMapper mapper = new ObjectMapper();
private static JsonNode baseNode;
private JsonNode getJsonNode() throws JsonProcessingException, IOException {
if (baseNode == null)
baseNode = mapper.readTree("{ \"value1\" : \"v1 \",\"value_empty\" : \"\", \"value_b\" : true, \"value_i\" : 454, " + " \"value_array\":[\"a1\",\"a2\"], " +" \"nest1\": {\"value1\": \" fgh \",\"value_empty\" : \"\", \"nest2\":{\"value_b\" : false, \"value_i\" : 43}}, "+ " \"nesta\": { \"a\":[{\"av1\": \"vala1\"},{\"av1\": \"vala2\"}]}"+" }");
return baseNode;
}
@Test
public void getJsonValue_invalidPath() throws JsonProcessingException, IOException {
Assert.assertNull(AbstractJsonUserAttributeMapper.getJsonValue(getJsonNode(), "."));
Assert.assertNull(AbstractJsonUserAttributeMapper.getJsonValue(getJsonNode(), ".."));
Assert.assertNull(AbstractJsonUserAttributeMapper.getJsonValue(getJsonNode(), "...value1"));
Assert.assertNull(AbstractJsonUserAttributeMapper.getJsonValue(getJsonNode(), ".value1"));
Assert.assertNull(AbstractJsonUserAttributeMapper.getJsonValue(getJsonNode(), "value1."));
Assert.assertNull(AbstractJsonUserAttributeMapper.getJsonValue(getJsonNode(), "[]"));
Assert.assertNull(AbstractJsonUserAttributeMapper.getJsonValue(getJsonNode(), "[value1"));
}
@Test
public void getJsonValue_simpleValues() throws JsonProcessingException, IOException {
//unknown field returns null
Assert.assertEquals(null, AbstractJsonUserAttributeMapper.getJsonValue(getJsonNode(), "value_unknown"));
// we check value is trimmed also!
Assert.assertEquals("v1", AbstractJsonUserAttributeMapper.getJsonValue(getJsonNode(), "value1"));
Assert.assertEquals(null, AbstractJsonUserAttributeMapper.getJsonValue(getJsonNode(), "value_empty"));
Assert.assertEquals("true", AbstractJsonUserAttributeMapper.getJsonValue(getJsonNode(), "value_b"));
Assert.assertEquals("454", AbstractJsonUserAttributeMapper.getJsonValue(getJsonNode(), "value_i"));
}
@Test
public void getJsonValue_nestedSimpleValues() throws JsonProcessingException, IOException {
// null if path points to JSON object
Assert.assertEquals(null, AbstractJsonUserAttributeMapper.getJsonValue(getJsonNode(), "nest1"));
Assert.assertEquals(null, AbstractJsonUserAttributeMapper.getJsonValue(getJsonNode(), "nest1.nest2"));
//unknown field returns null
Assert.assertEquals(null, AbstractJsonUserAttributeMapper.getJsonValue(getJsonNode(), "nest1.value_unknown"));
Assert.assertEquals(null, AbstractJsonUserAttributeMapper.getJsonValue(getJsonNode(), "nest1.nest2.value_unknown"));
// we check value is trimmed also!
Assert.assertEquals("fgh", AbstractJsonUserAttributeMapper.getJsonValue(getJsonNode(), "nest1.value1"));
Assert.assertEquals(null, AbstractJsonUserAttributeMapper.getJsonValue(getJsonNode(), "nest1.value_empty"));
Assert.assertEquals("false", AbstractJsonUserAttributeMapper.getJsonValue(getJsonNode(), "nest1.nest2.value_b"));
Assert.assertEquals("43", AbstractJsonUserAttributeMapper.getJsonValue(getJsonNode(), "nest1.nest2.value_i"));
// null if invalid nested path
Assert.assertNull(AbstractJsonUserAttributeMapper.getJsonValue(getJsonNode(), "nest1."));
Assert.assertNull(AbstractJsonUserAttributeMapper.getJsonValue(getJsonNode(), "nest1.nest2."));
}
@Test
public void getJsonValue_simpleArray() throws JsonProcessingException, IOException {
// array field itself returns null if no index is provided
Assert.assertEquals(null, AbstractJsonUserAttributeMapper.getJsonValue(getJsonNode(), "value_array"));
// outside index returns null
Assert.assertEquals(null, AbstractJsonUserAttributeMapper.getJsonValue(getJsonNode(), "value_array[2]"));
//corect index
Assert.assertEquals("a1", AbstractJsonUserAttributeMapper.getJsonValue(getJsonNode(), "value_array[0]"));
Assert.assertEquals("a2", AbstractJsonUserAttributeMapper.getJsonValue(getJsonNode(), "value_array[1]"));
//incorrect array constructs
Assert.assertNull(AbstractJsonUserAttributeMapper.getJsonValue(getJsonNode(), "value_array[]"));
Assert.assertNull(AbstractJsonUserAttributeMapper.getJsonValue(getJsonNode(), "value_array]"));
Assert.assertNull(AbstractJsonUserAttributeMapper.getJsonValue(getJsonNode(), "value_array["));
Assert.assertNull(AbstractJsonUserAttributeMapper.getJsonValue(getJsonNode(), "value_array[a]"));
Assert.assertNull(AbstractJsonUserAttributeMapper.getJsonValue(getJsonNode(), "value_array[-2]"));
}
@Test
public void getJsonValue_nestedArrayWithObjects() throws JsonProcessingException, IOException {
Assert.assertEquals("vala1", AbstractJsonUserAttributeMapper.getJsonValue(getJsonNode(), "nesta.a[0].av1"));
Assert.assertEquals("vala2", AbstractJsonUserAttributeMapper.getJsonValue(getJsonNode(), "nesta.a[1].av1"));
//different path erros or nonexisting indexes or fields return null
Assert.assertEquals(null, AbstractJsonUserAttributeMapper.getJsonValue(getJsonNode(), "nesta.a[2].av1"));
Assert.assertEquals(null, AbstractJsonUserAttributeMapper.getJsonValue(getJsonNode(), "nesta.a[0]"));
Assert.assertEquals(null, AbstractJsonUserAttributeMapper.getJsonValue(getJsonNode(), "nesta.a[0].av_unknown"));
Assert.assertEquals(null, AbstractJsonUserAttributeMapper.getJsonValue(getJsonNode(), "nesta.a[].av1"));
Assert.assertEquals(null, AbstractJsonUserAttributeMapper.getJsonValue(getJsonNode(), "nesta.a"));
Assert.assertEquals(null, AbstractJsonUserAttributeMapper.getJsonValue(getJsonNode(), "nesta.a.av1"));
Assert.assertEquals(null, AbstractJsonUserAttributeMapper.getJsonValue(getJsonNode(), "nesta.a].av1"));
Assert.assertEquals(null, AbstractJsonUserAttributeMapper.getJsonValue(getJsonNode(), "nesta.a[.av1"));
}
}
Executable
+23
View File
@@ -0,0 +1,23 @@
<?xml version="1.0"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<parent>
<artifactId>keycloak-parent</artifactId>
<groupId>org.keycloak</groupId>
<version>1.3.1.Final</version>
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>keycloak-broker-parent</artifactId>
<name>Keycloak Broker Parent</name>
<description/>
<packaging>pom</packaging>
<modules>
<module>core</module>
<module>oidc</module>
<module>saml</module>
</modules>
</project>
+50
View File
@@ -0,0 +1,50 @@
<?xml version="1.0"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<parent>
<artifactId>keycloak-parent</artifactId>
<groupId>org.keycloak</groupId>
<version>1.3.1.Final</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>keycloak-broker-saml</artifactId>
<name>Keycloak Broker - SAML Identity Provider</name>
<description/>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-broker-core</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-saml-protocol</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-saml-core</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-services</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-events-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.jboss.logging</groupId>
<artifactId>jboss-logging</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
@@ -0,0 +1,491 @@
package org.keycloak.broker.saml;
import org.jboss.logging.Logger;
import org.keycloak.ClientConnection;
import org.keycloak.VerificationException;
import org.keycloak.broker.provider.BrokeredIdentityContext;
import org.keycloak.broker.provider.IdentityBrokerException;
import org.keycloak.broker.provider.IdentityProvider;
import org.keycloak.dom.saml.v2.assertion.AssertionType;
import org.keycloak.dom.saml.v2.assertion.AttributeStatementType;
import org.keycloak.dom.saml.v2.assertion.AttributeType;
import org.keycloak.dom.saml.v2.assertion.AuthnStatementType;
import org.keycloak.dom.saml.v2.assertion.EncryptedAssertionType;
import org.keycloak.dom.saml.v2.assertion.NameIDType;
import org.keycloak.dom.saml.v2.assertion.SubjectType;
import org.keycloak.dom.saml.v2.protocol.LogoutRequestType;
import org.keycloak.dom.saml.v2.protocol.RequestAbstractType;
import org.keycloak.dom.saml.v2.protocol.ResponseType;
import org.keycloak.dom.saml.v2.protocol.StatusResponseType;
import org.keycloak.events.Details;
import org.keycloak.events.Errors;
import org.keycloak.events.EventBuilder;
import org.keycloak.events.EventType;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.RealmModel;
import org.keycloak.models.UserSessionModel;
import org.keycloak.protocol.saml.SAML2LogoutResponseBuilder;
import org.keycloak.protocol.saml.SAMLRequestParser;
import org.keycloak.protocol.saml.SamlProtocol;
import org.keycloak.protocol.saml.SamlProtocolUtils;
import org.keycloak.saml.common.constants.GeneralConstants;
import org.keycloak.saml.common.constants.JBossSAMLConstants;
import org.keycloak.saml.common.constants.JBossSAMLURIConstants;
import org.keycloak.saml.common.exceptions.ConfigurationException;
import org.keycloak.saml.common.exceptions.ProcessingException;
import org.keycloak.saml.common.util.DocumentUtil;
import org.keycloak.saml.common.util.StaxParserUtil;
import org.keycloak.saml.processing.api.saml.v2.response.SAML2Response;
import org.keycloak.saml.processing.core.parsers.saml.SAMLParser;
import org.keycloak.saml.processing.core.saml.v2.common.SAMLDocumentHolder;
import org.keycloak.saml.processing.core.saml.v2.constants.X500SAMLProfileConstants;
import org.keycloak.saml.processing.core.util.JAXPValidationUtil;
import org.keycloak.saml.processing.core.util.XMLEncryptionUtil;
import org.keycloak.saml.processing.core.util.XMLSignatureUtil;
import org.keycloak.saml.processing.web.util.PostBindingUtil;
import org.keycloak.services.ErrorPage;
import org.keycloak.services.managers.AuthenticationManager;
import org.keycloak.services.messages.Messages;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import javax.ws.rs.Consumes;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriBuilder;
import javax.ws.rs.core.UriInfo;
import javax.xml.namespace.QName;
import java.io.IOException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.cert.X509Certificate;
import java.util.List;
/**
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $
*/
public class SAMLEndpoint {
protected static final Logger logger = Logger.getLogger(SAMLEndpoint.class);
public static final String SAML_FEDERATED_SESSION_INDEX = "SAML_FEDERATED_SESSION_INDEX";
public static final String SAML_FEDERATED_SUBJECT = "SAML_FEDERATED_SUBJECT";
public static final String SAML_FEDERATED_SUBJECT_NAMEFORMAT = "SAML_FEDERATED_SUBJECT_NAMEFORMAT";
public static final String SAML_LOGIN_RESPONSE = "SAML_LOGIN_RESPONSE";
public static final String SAML_ASSERTION = "SAML_ASSERTION";
public static final String SAML_AUTHN_STATEMENT = "SAML_AUTHN_STATEMENT";
protected RealmModel realm;
protected EventBuilder event;
protected SAMLIdentityProviderConfig config;
protected IdentityProvider.AuthenticationCallback callback;
protected SAMLIdentityProvider provider;
@Context
private UriInfo uriInfo;
@Context
private KeycloakSession session;
@Context
private ClientConnection clientConnection;
@Context
private HttpHeaders headers;
public SAMLEndpoint(RealmModel realm, SAMLIdentityProvider provider, SAMLIdentityProviderConfig config, IdentityProvider.AuthenticationCallback callback) {
this.realm = realm;
this.config = config;
this.callback = callback;
this.provider = provider;
}
@GET
public Response redirectBinding(@QueryParam(GeneralConstants.SAML_REQUEST_KEY) String samlRequest,
@QueryParam(GeneralConstants.SAML_RESPONSE_KEY) String samlResponse,
@QueryParam(GeneralConstants.RELAY_STATE) String relayState) {
return new RedirectBinding().execute(samlRequest, samlResponse, relayState);
}
/**
*/
@POST
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public Response postBinding(@FormParam(GeneralConstants.SAML_REQUEST_KEY) String samlRequest,
@FormParam(GeneralConstants.SAML_RESPONSE_KEY) String samlResponse,
@FormParam(GeneralConstants.RELAY_STATE) String relayState) {
return new PostBinding().execute(samlRequest, samlResponse, relayState);
}
protected abstract class Binding {
private boolean checkSsl() {
if (uriInfo.getBaseUri().getScheme().equals("https")) {
return true;
} else {
return !realm.getSslRequired().isRequired(clientConnection);
}
}
protected Response basicChecks(String samlRequest, String samlResponse) {
if (!checkSsl()) {
event.event(EventType.LOGIN);
event.error(Errors.SSL_REQUIRED);
return ErrorPage.error(session, Messages.HTTPS_REQUIRED);
}
if (!realm.isEnabled()) {
event.event(EventType.LOGIN_ERROR);
event.error(Errors.REALM_DISABLED);
return ErrorPage.error(session, Messages.REALM_NOT_ENABLED);
}
if (samlRequest == null && samlResponse == null) {
event.event(EventType.LOGIN);
event.error(Errors.INVALID_REQUEST);
return ErrorPage.error(session, Messages.INVALID_REQUEST);
}
return null;
}
protected abstract String getBindingType();
protected abstract void verifySignature(SAMLDocumentHolder documentHolder) throws VerificationException;
protected abstract SAMLDocumentHolder extractRequestDocument(String samlRequest);
protected abstract SAMLDocumentHolder extractResponseDocument(String response);
protected PublicKey getIDPKey() {
X509Certificate certificate = null;
try {
certificate = XMLSignatureUtil.getX509CertificateFromKeyInfoString(config.getSigningCertificate().replaceAll("\\s", ""));
} catch (ProcessingException e) {
throw new RuntimeException(e);
}
return certificate.getPublicKey();
}
public Response execute(String samlRequest, String samlResponse, String relayState) {
event = new EventBuilder(realm, session, clientConnection);
Response response = basicChecks(samlRequest, samlResponse);
if (response != null) return response;
if (samlRequest != null) return handleSamlRequest(samlRequest, relayState);
else return handleSamlResponse(samlResponse, relayState);
}
protected Response handleSamlRequest(String samlRequest, String relayState) {
SAMLDocumentHolder holder = extractRequestDocument(samlRequest);
RequestAbstractType requestAbstractType = (RequestAbstractType) holder.getSamlObject();
// validate destination
if (requestAbstractType.getDestination() != null && !uriInfo.getAbsolutePath().equals(requestAbstractType.getDestination())) {
event.event(EventType.IDENTITY_PROVIDER_RESPONSE);
event.detail(Details.REASON, "invalid_destination");
event.error(Errors.INVALID_SAML_RESPONSE);
return ErrorPage.error(session, Messages.INVALID_REQUEST);
}
if (config.isValidateSignature()) {
try {
verifySignature(holder);
} catch (VerificationException e) {
logger.error("validation failed", e);
event.event(EventType.IDENTITY_PROVIDER_RESPONSE);
event.error(Errors.INVALID_SIGNATURE);
return ErrorPage.error(session, Messages.INVALID_REQUESTER);
}
}
if (requestAbstractType instanceof LogoutRequestType) {
logger.debug("** logout request");
event.event(EventType.LOGOUT);
LogoutRequestType logout = (LogoutRequestType) requestAbstractType;
return logoutRequest(logout, relayState);
} else {
event.event(EventType.LOGIN);
event.error(Errors.INVALID_TOKEN);
return ErrorPage.error(session, Messages.INVALID_REQUEST);
}
}
protected Response logoutRequest(LogoutRequestType request, String relayState) {
String brokerUserId = config.getAlias() + "." + request.getNameID().getValue();
if (request.getSessionIndex() == null || request.getSessionIndex().isEmpty()) {
List<UserSessionModel> userSessions = session.sessions().getUserSessionByBrokerUserId(realm, brokerUserId);
for (UserSessionModel userSession : userSessions) {
if (userSession.getState() == UserSessionModel.State.LOGGING_OUT || userSession.getState() == UserSessionModel.State.LOGGED_OUT) {
continue;
}
try {
AuthenticationManager.backchannelLogout(session, realm, userSession, uriInfo, clientConnection, headers, false);
} catch (Exception e) {
logger.warn("failed to do backchannel logout for userSession", e);
}
}
} else {
for (String sessionIndex : request.getSessionIndex()) {
String brokerSessionId = brokerUserId + "." + sessionIndex;
UserSessionModel userSession = session.sessions().getUserSessionByBrokerSessionId(realm, brokerSessionId);
if (userSession != null) {
if (userSession.getState() == UserSessionModel.State.LOGGING_OUT || userSession.getState() == UserSessionModel.State.LOGGED_OUT) {
continue;
}
try {
AuthenticationManager.backchannelLogout(session, realm, userSession, uriInfo, clientConnection, headers, false);
} catch (Exception e) {
logger.warn("failed to do backchannel logout for userSession", e);
}
}
}
}
String issuerURL = getEntityId(uriInfo, realm);
SAML2LogoutResponseBuilder builder = new SAML2LogoutResponseBuilder();
builder.logoutRequestID(request.getID());
builder.destination(config.getSingleLogoutServiceUrl());
builder.issuer(issuerURL);
builder.relayState(relayState);
if (config.isWantAuthnRequestsSigned()) {
builder.signWith(realm.getPrivateKey(), realm.getPublicKey(), realm.getCertificate())
.signDocument();
}
try {
if (config.isPostBindingResponse()) {
return builder.postBinding().response();
} else {
return builder.redirectBinding().response();
}
} catch (ConfigurationException e) {
throw new RuntimeException(e);
} catch (ProcessingException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
private String getEntityId(UriInfo uriInfo, RealmModel realm) {
return UriBuilder.fromUri(uriInfo.getBaseUri()).path("realms").path(realm.getName()).build().toString();
}
protected Response handleLoginResponse(String samlResponse, SAMLDocumentHolder holder, ResponseType responseType, String relayState) {
try {
AssertionType assertion = getAssertion(responseType);
SubjectType subject = assertion.getSubject();
SubjectType.STSubType subType = subject.getSubType();
NameIDType subjectNameID = (NameIDType) subType.getBaseID();
//Map<String, String> notes = new HashMap<>();
BrokeredIdentityContext identity = new BrokeredIdentityContext(subjectNameID.getValue());
identity.setCode(relayState);
identity.getContextData().put(SAML_LOGIN_RESPONSE, responseType);
identity.getContextData().put(SAML_ASSERTION, assertion);
identity.setUsername(subjectNameID.getValue());
if (subjectNameID.getFormat().toString().equals(JBossSAMLURIConstants.NAMEID_FORMAT_EMAIL.get())) {
identity.setEmail(subjectNameID.getValue());
}
if (config.isStoreToken()) {
identity.setToken(samlResponse);
}
AuthnStatementType authn = null;
for (Object statement : assertion.getStatements()) {
if (statement instanceof AuthnStatementType) {
authn = (AuthnStatementType)statement;
identity.getContextData().put(SAML_AUTHN_STATEMENT, authn);
break;
}
}
if (assertion.getAttributeStatements() != null ) {
for (AttributeStatementType attrStatement : assertion.getAttributeStatements()) {
for (AttributeStatementType.ASTChoiceType choice : attrStatement.getAttributes()) {
AttributeType attribute = choice.getAttribute();
if (X500SAMLProfileConstants.EMAIL.getFriendlyName().equals(attribute.getFriendlyName())
|| X500SAMLProfileConstants.EMAIL.get().equals(attribute.getName())) {
if (!attribute.getAttributeValue().isEmpty()) identity.setEmail(attribute.getAttributeValue().get(0).toString());
}
}
}
}
String brokerUserId = config.getAlias() + "." + subjectNameID.getValue();
identity.setBrokerUserId(brokerUserId);
identity.setIdpConfig(config);
identity.setIdp(provider);
if (authn != null && authn.getSessionIndex() != null) {
identity.setBrokerSessionId(identity.getBrokerUserId() + "." + authn.getSessionIndex());
}
return callback.authenticated(identity);
} catch (Exception e) {
throw new IdentityBrokerException("Could not process response from SAML identity provider.", e);
}
}
private AssertionType getAssertion(ResponseType responseType) throws ProcessingException {
List<ResponseType.RTChoiceType> assertions = responseType.getAssertions();
if (assertions.isEmpty()) {
throw new IdentityBrokerException("No assertion from response.");
}
ResponseType.RTChoiceType rtChoiceType = assertions.get(0);
EncryptedAssertionType encryptedAssertion = rtChoiceType.getEncryptedAssertion();
if (encryptedAssertion != null) {
decryptAssertion(responseType, realm.getPrivateKey());
}
return responseType.getAssertions().get(0).getAssertion();
}
public Response handleSamlResponse(String samlResponse, String relayState) {
SAMLDocumentHolder holder = extractResponseDocument(samlResponse);
StatusResponseType statusResponse = (StatusResponseType)holder.getSamlObject();
// validate destination
if (statusResponse.getDestination() != null && !uriInfo.getAbsolutePath().toString().equals(statusResponse.getDestination())) {
event.event(EventType.IDENTITY_PROVIDER_RESPONSE);
event.detail(Details.REASON, "invalid_destination");
event.error(Errors.INVALID_SAML_RESPONSE);
return ErrorPage.error(session, Messages.INVALID_FEDERATED_IDENTITY_ACTION);
}
if (config.isValidateSignature()) {
try {
verifySignature(holder);
} catch (VerificationException e) {
logger.error("validation failed", e);
event.event(EventType.IDENTITY_PROVIDER_RESPONSE);
event.error(Errors.INVALID_SIGNATURE);
return ErrorPage.error(session, Messages.INVALID_FEDERATED_IDENTITY_ACTION);
}
}
if (statusResponse instanceof ResponseType) {
return handleLoginResponse(samlResponse, holder, (ResponseType)statusResponse, relayState);
} else {
// todo need to check that it is actually a LogoutResponse
return handleLogoutResponse(holder, statusResponse, relayState);
}
//throw new RuntimeException("Unknown response type");
}
protected Response handleLogoutResponse(SAMLDocumentHolder holder, StatusResponseType responseType, String relayState) {
if (relayState == null) {
logger.error("no valid user session");
event.event(EventType.LOGOUT);
event.error(Errors.USER_SESSION_NOT_FOUND);
return ErrorPage.error(session, Messages.IDENTITY_PROVIDER_UNEXPECTED_ERROR);
}
UserSessionModel userSession = session.sessions().getUserSession(realm, relayState);
if (userSession == null) {
logger.error("no valid user session");
event.event(EventType.LOGOUT);
event.error(Errors.USER_SESSION_NOT_FOUND);
return ErrorPage.error(session, Messages.IDENTITY_PROVIDER_UNEXPECTED_ERROR);
}
if (userSession.getState() != UserSessionModel.State.LOGGING_OUT) {
logger.error("usersession in different state");
event.event(EventType.LOGOUT);
event.error(Errors.USER_SESSION_NOT_FOUND);
return ErrorPage.error(session, Messages.SESSION_NOT_ACTIVE);
}
return AuthenticationManager.finishBrowserLogout(session, realm, userSession, uriInfo, clientConnection, headers);
}
protected ResponseType decryptAssertion(ResponseType responseType, PrivateKey privateKey) throws ProcessingException {
SAML2Response saml2Response = new SAML2Response();
try {
Document doc = saml2Response.convert(responseType);
Element enc = DocumentUtil.getElement(doc, new QName(JBossSAMLConstants.ENCRYPTED_ASSERTION.get()));
if (enc == null) {
throw new IdentityBrokerException("No encrypted assertion found.");
}
String oldID = enc.getAttribute(JBossSAMLConstants.ID.get());
Document newDoc = DocumentUtil.createDocument();
Node importedNode = newDoc.importNode(enc, true);
newDoc.appendChild(importedNode);
Element decryptedDocumentElement = XMLEncryptionUtil.decryptElementInDocument(newDoc, privateKey);
SAMLParser parser = new SAMLParser();
JAXPValidationUtil.checkSchemaValidation(decryptedDocumentElement);
AssertionType assertion = (AssertionType) parser.parse(StaxParserUtil.getXMLEventReader(DocumentUtil
.getNodeAsStream(decryptedDocumentElement)));
responseType.replaceAssertion(oldID, new ResponseType.RTChoiceType(assertion));
return responseType;
} catch (Exception e) {
throw new IdentityBrokerException("Could not decrypt assertion.", e);
}
}
}
protected class PostBinding extends Binding {
@Override
protected void verifySignature(SAMLDocumentHolder documentHolder) throws VerificationException {
SamlProtocolUtils.verifyDocumentSignature(documentHolder.getSamlDocument(), getIDPKey());
}
@Override
protected SAMLDocumentHolder extractRequestDocument(String samlRequest) {
return SAMLRequestParser.parseRequestPostBinding(samlRequest);
}
@Override
protected SAMLDocumentHolder extractResponseDocument(String response) {
byte[] samlBytes = PostBindingUtil.base64Decode(response);
String xml = new String(samlBytes);
return SAMLRequestParser.parseResponseDocument(samlBytes);
}
@Override
protected String getBindingType() {
return SamlProtocol.SAML_POST_BINDING;
}
}
protected class RedirectBinding extends Binding {
@Override
protected void verifySignature(SAMLDocumentHolder documentHolder) throws VerificationException {
PublicKey publicKey = getIDPKey();
SamlProtocolUtils.verifyRedirectSignature(publicKey, uriInfo);
}
@Override
protected SAMLDocumentHolder extractRequestDocument(String samlRequest) {
return SAMLRequestParser.parseRequestRedirectBinding(samlRequest);
}
@Override
protected SAMLDocumentHolder extractResponseDocument(String response) {
return SAMLRequestParser.parseRequestRedirectBinding(response);
}
@Override
protected String getBindingType() {
return SamlProtocol.SAML_REDIRECT_BINDING;
}
}
}
@@ -0,0 +1,248 @@
/*
* JBoss, Home of Professional Open Source
*
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.keycloak.broker.saml;
import org.jboss.logging.Logger;
import org.keycloak.broker.provider.AbstractIdentityProvider;
import org.keycloak.broker.provider.AuthenticationRequest;
import org.keycloak.broker.provider.BrokeredIdentityContext;
import org.keycloak.broker.provider.IdentityBrokerException;
import org.keycloak.broker.provider.util.SimpleHttp;
import org.keycloak.dom.saml.v2.assertion.AssertionType;
import org.keycloak.dom.saml.v2.assertion.AuthnStatementType;
import org.keycloak.dom.saml.v2.assertion.NameIDType;
import org.keycloak.dom.saml.v2.assertion.SubjectType;
import org.keycloak.dom.saml.v2.protocol.ResponseType;
import org.keycloak.events.EventBuilder;
import org.keycloak.models.ClientSessionModel;
import org.keycloak.models.FederatedIdentityModel;
import org.keycloak.models.RealmModel;
import org.keycloak.models.UserSessionModel;
import org.keycloak.protocol.saml.SAML2AuthnRequestBuilder;
import org.keycloak.protocol.saml.SAML2LogoutRequestBuilder;
import org.keycloak.protocol.saml.SAML2NameIDPolicyBuilder;
import org.keycloak.saml.common.constants.GeneralConstants;
import org.keycloak.saml.common.constants.JBossSAMLURIConstants;
import org.keycloak.saml.common.exceptions.ConfigurationException;
import org.keycloak.saml.common.exceptions.ParsingException;
import org.keycloak.saml.common.exceptions.ProcessingException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriBuilder;
import javax.ws.rs.core.UriInfo;
import java.io.IOException;
import java.security.KeyPair;
import java.security.PrivateKey;
import java.security.PublicKey;
/**
* @author Pedro Igor
*/
public class SAMLIdentityProvider extends AbstractIdentityProvider<SAMLIdentityProviderConfig> {
protected static final Logger logger = Logger.getLogger(SAMLIdentityProvider.class);
public SAMLIdentityProvider(SAMLIdentityProviderConfig config) {
super(config);
}
@Override
public Object callback(RealmModel realm, AuthenticationCallback callback, EventBuilder event) {
return new SAMLEndpoint(realm, this, getConfig(), callback);
}
@Override
public Response performLogin(AuthenticationRequest request) {
try {
UriInfo uriInfo = request.getUriInfo();
RealmModel realm = request.getRealm();
String issuerURL = getEntityId(uriInfo, realm);
String destinationUrl = getConfig().getSingleSignOnServiceUrl();
String nameIDPolicyFormat = getConfig().getNameIDPolicyFormat();
if (nameIDPolicyFormat == null) {
nameIDPolicyFormat = JBossSAMLURIConstants.NAMEID_FORMAT_PERSISTENT.get();
}
String protocolBinding = JBossSAMLURIConstants.SAML_HTTP_REDIRECT_BINDING.get();
String assertionConsumerServiceUrl = request.getRedirectUri();
if (getConfig().isPostBindingResponse()) {
protocolBinding = JBossSAMLURIConstants.SAML_HTTP_POST_BINDING.get();
}
SAML2AuthnRequestBuilder authnRequestBuilder = new SAML2AuthnRequestBuilder()
.assertionConsumerUrl(assertionConsumerServiceUrl)
.destination(destinationUrl)
.issuer(issuerURL)
.forceAuthn(getConfig().isForceAuthn())
.protocolBinding(protocolBinding)
.nameIdPolicy(SAML2NameIDPolicyBuilder.format(nameIDPolicyFormat))
.relayState(request.getState());
if (getConfig().isWantAuthnRequestsSigned()) {
PrivateKey privateKey = realm.getPrivateKey();
PublicKey publicKey = realm.getPublicKey();
if (privateKey == null) {
throw new IdentityBrokerException("Identity Provider [" + getConfig().getAlias() + "] wants a signed authentication request. But the Realm [" + realm.getName() + "] does not have a private key.");
}
if (publicKey == null) {
throw new IdentityBrokerException("Identity Provider [" + getConfig().getAlias() + "] wants a signed authentication request. But the Realm [" + realm.getName() + "] does not have a public key.");
}
KeyPair keypair = new KeyPair(publicKey, privateKey);
authnRequestBuilder.signWith(keypair);
authnRequestBuilder.signDocument();
}
if (getConfig().isPostBindingAuthnRequest()) {
return authnRequestBuilder.postBinding().request();
} else {
return authnRequestBuilder.redirectBinding().request();
}
} catch (Exception e) {
throw new IdentityBrokerException("Could not create authentication request.", e);
}
}
private String getEntityId(UriInfo uriInfo, RealmModel realm) {
return UriBuilder.fromUri(uriInfo.getBaseUri()).path("realms").path(realm.getName()).build().toString();
}
@Override
public void attachUserSession(UserSessionModel userSession, ClientSessionModel clientSession, BrokeredIdentityContext context) {
ResponseType responseType = (ResponseType)context.getContextData().get(SAMLEndpoint.SAML_LOGIN_RESPONSE);
AssertionType assertion = (AssertionType)context.getContextData().get(SAMLEndpoint.SAML_ASSERTION);
SubjectType subject = assertion.getSubject();
SubjectType.STSubType subType = subject.getSubType();
NameIDType subjectNameID = (NameIDType) subType.getBaseID();
userSession.setNote(SAMLEndpoint.SAML_FEDERATED_SUBJECT, subjectNameID.getValue());
if (subjectNameID.getFormat() != null) userSession.setNote(SAMLEndpoint.SAML_FEDERATED_SUBJECT_NAMEFORMAT, subjectNameID.getFormat().toString());
AuthnStatementType authn = (AuthnStatementType)context.getContextData().get(SAMLEndpoint.SAML_AUTHN_STATEMENT);
if (authn != null && authn.getSessionIndex() != null) {
userSession.setNote(SAMLEndpoint.SAML_FEDERATED_SESSION_INDEX, authn.getSessionIndex());
}
}
@Override
public Response retrieveToken(FederatedIdentityModel identity) {
return Response.ok(identity.getToken()).build();
}
@Override
public void backchannelLogout(UserSessionModel userSession, UriInfo uriInfo, RealmModel realm) {
String singleLogoutServiceUrl = getConfig().getSingleLogoutServiceUrl();
if (singleLogoutServiceUrl == null || singleLogoutServiceUrl.trim().equals("") || !getConfig().isBackchannelSupported()) return;
SAML2LogoutRequestBuilder logoutBuilder = buildLogoutRequest(userSession, uriInfo, realm, singleLogoutServiceUrl);
try {
int status = SimpleHttp.doPost(singleLogoutServiceUrl)
.param(GeneralConstants.SAML_REQUEST_KEY, logoutBuilder.postBinding().encoded())
.param(GeneralConstants.RELAY_STATE, userSession.getId()).asStatus();
boolean success = status >=200 && status < 400;
if (!success) {
logger.warn("Failed saml backchannel broker logout to: " + singleLogoutServiceUrl);
}
} catch (Exception e) {
logger.warn("Failed saml backchannel broker logout to: " + singleLogoutServiceUrl, e);
}
}
@Override
public Response keycloakInitiatedBrowserLogout(UserSessionModel userSession, UriInfo uriInfo, RealmModel realm) {
String singleLogoutServiceUrl = getConfig().getSingleLogoutServiceUrl();
if (singleLogoutServiceUrl == null || singleLogoutServiceUrl.trim().equals("")) return null;
if (getConfig().isBackchannelSupported()) {
backchannelLogout(userSession, uriInfo, realm);
return null;
} else {
try {
SAML2LogoutRequestBuilder logoutBuilder = buildLogoutRequest(userSession, uriInfo, realm, singleLogoutServiceUrl);
return logoutBuilder.postBinding().request();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
protected SAML2LogoutRequestBuilder buildLogoutRequest(UserSessionModel userSession, UriInfo uriInfo, RealmModel realm, String singleLogoutServiceUrl) {
SAML2LogoutRequestBuilder logoutBuilder = new SAML2LogoutRequestBuilder()
.assertionExpiration(realm.getAccessCodeLifespan())
.issuer(getEntityId(uriInfo, realm))
.sessionIndex(userSession.getNote(SAMLEndpoint.SAML_FEDERATED_SESSION_INDEX))
.userPrincipal(userSession.getNote(SAMLEndpoint.SAML_FEDERATED_SUBJECT), userSession.getNote(SAMLEndpoint.SAML_FEDERATED_SUBJECT_NAMEFORMAT))
.destination(singleLogoutServiceUrl)
.relayState(userSession.getId());
if (getConfig().isWantAuthnRequestsSigned()) {
logoutBuilder.signWith(realm.getPrivateKey(), realm.getPublicKey(), realm.getCertificate())
.signDocument();
}
return logoutBuilder;
}
@Override
public Response export(UriInfo uriInfo, RealmModel realm, String format) {
String authnBinding = JBossSAMLURIConstants.SAML_HTTP_REDIRECT_BINDING.get();
if (getConfig().isPostBindingAuthnRequest()) {
authnBinding = JBossSAMLURIConstants.SAML_HTTP_POST_BINDING.get();
}
String endpoint = uriInfo.getBaseUriBuilder()
.path("realms").path(realm.getName())
.path("broker")
.path(getConfig().getAlias())
.path("endpoint")
.build().toString();
String descriptor =
"<EntityDescriptor entityID=\"" + getEntityId(uriInfo, realm) + "\">\n" +
" <SPSSODescriptor AuthnRequestsSigned=\"" + getConfig().isWantAuthnRequestsSigned() + "\"\n" +
" protocolSupportEnumeration=\"urn:oasis:names:tc:SAML:2.0:protocol urn:oasis:names:tc:SAML:1.1:protocol http://schemas.xmlsoap.org/ws/2003/07/secext\">\n" +
" <NameIDFormat>" + getConfig().getNameIDPolicyFormat() + "\n" +
" </NameIDFormat>\n" +
" <SingleLogoutService Binding=\"" + authnBinding + "\" Location=\"" + endpoint + "\"/>\n" +
" <AssertionConsumerService\n" +
" Binding=\"" + authnBinding + "\" Location=\"" + endpoint + "\"\n" +
" index=\"1\" isDefault=\"true\" />\n";
if (getConfig().isWantAuthnRequestsSigned()) {
descriptor +=
" <KeyDescriptor use=\"signing\">\n" +
" <dsig:KeyInfo xmlns:dsig=\"http://www.w3.org/2000/09/xmldsig#\">\n" +
" <dsig:X509Data>\n" +
" <dsig:X509Certificate>\n" + realm.getCertificatePem() + "\n" +
" </dsig:X509Certificate>\n" +
" </dsig:X509Data>\n" +
" </dsig:KeyInfo>\n" +
" </KeyDescriptor>\n";
}
descriptor +=
" </SPSSODescriptor>\n" +
"</EntityDescriptor>\n";
return Response.ok(descriptor, MediaType.APPLICATION_XML_TYPE).build();
}
}
@@ -0,0 +1,122 @@
/*
* JBoss, Home of Professional Open Source
*
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.keycloak.broker.saml;
import org.keycloak.models.IdentityProviderModel;
/**
* @author Pedro Igor
*/
public class SAMLIdentityProviderConfig extends IdentityProviderModel {
public SAMLIdentityProviderConfig() {
}
public SAMLIdentityProviderConfig(IdentityProviderModel identityProviderModel) {
super(identityProviderModel);
}
public String getSingleSignOnServiceUrl() {
return getConfig().get("singleSignOnServiceUrl");
}
public void setSingleSignOnServiceUrl(String singleSignOnServiceUrl) {
getConfig().put("singleSignOnServiceUrl", singleSignOnServiceUrl);
}
public String getSingleLogoutServiceUrl() {
return getConfig().get("singleLogoutServiceUrl");
}
public void setSingleLogoutServiceUrl(String singleLogoutServiceUrl) {
getConfig().put("singleLogoutServiceUrl", singleLogoutServiceUrl);
}
public boolean isValidateSignature() {
return Boolean.valueOf(getConfig().get("validateSignature"));
}
public void setValidateSignature(boolean validateSignature) {
getConfig().put("validateSignature", String.valueOf(validateSignature));
}
public boolean isForceAuthn() {
return Boolean.valueOf(getConfig().get("forceAuthn"));
}
public void setForceAuthn(boolean forceAuthn) {
getConfig().put("forceAuthn", String.valueOf(forceAuthn));
}
public String getSigningCertificate() {
return getConfig().get("signingCertificate");
}
public void setSigningCertificate(String signingCertificate) {
getConfig().put("signingCertificate", signingCertificate);
}
public String getNameIDPolicyFormat() {
return getConfig().get("nameIDPolicyFormat");
}
public void setNameIDPolicyFormat(String nameIDPolicyFormat) {
getConfig().put("nameIDPolicyFormat", nameIDPolicyFormat);
}
public boolean isWantAuthnRequestsSigned() {
return Boolean.valueOf(getConfig().get("wantAuthnRequestsSigned"));
}
public void setWantAuthnRequestsSigned(boolean wantAuthnRequestsSigned) {
getConfig().put("wantAuthnRequestsSigned", String.valueOf(wantAuthnRequestsSigned));
}
public String getEncryptionPublicKey() {
return getConfig().get("encryptionPublicKey");
}
public void setEncryptionPublicKey(String encryptionPublicKey) {
getConfig().put("encryptionPublicKey", encryptionPublicKey);
}
public boolean isPostBindingAuthnRequest() {
return Boolean.valueOf(getConfig().get("postBindingAuthnRequest"));
}
public void setPostBindingAuthnRequest(boolean postBindingAuthnRequest) {
getConfig().put("postBindingAuthnRequest", String.valueOf(postBindingAuthnRequest));
}
public boolean isPostBindingResponse() {
return Boolean.valueOf(getConfig().get("postBindingResponse"));
}
public void setPostBindingResponse(boolean postBindingResponse) {
getConfig().put("postBindingResponse", String.valueOf(postBindingResponse));
}
public boolean isBackchannelSupported() {
return Boolean.valueOf(getConfig().get("backchannelSupported"));
}
public void setBackchannelSupported(boolean backchannel) {
getConfig().put("backchannelSupported", String.valueOf(backchannel));
}
}
@@ -0,0 +1,158 @@
/*
* JBoss, Home of Professional Open Source
*
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.keycloak.broker.saml;
import org.keycloak.broker.provider.AbstractIdentityProviderFactory;
import org.keycloak.broker.saml.mappers.UsernameTemplateMapper;
import org.keycloak.dom.saml.v2.metadata.EndpointType;
import org.keycloak.dom.saml.v2.metadata.EntitiesDescriptorType;
import org.keycloak.dom.saml.v2.metadata.EntityDescriptorType;
import org.keycloak.dom.saml.v2.metadata.IDPSSODescriptorType;
import org.keycloak.dom.saml.v2.metadata.KeyDescriptorType;
import org.keycloak.dom.saml.v2.metadata.KeyTypes;
import org.keycloak.models.IdentityProviderMapperModel;
import org.keycloak.models.IdentityProviderModel;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.RealmModel;
import org.keycloak.saml.common.constants.JBossSAMLURIConstants;
import org.keycloak.saml.common.exceptions.ParsingException;
import org.keycloak.saml.common.util.DocumentUtil;
import org.keycloak.saml.processing.core.parsers.saml.SAMLParser;
import org.w3c.dom.Element;
import javax.xml.namespace.QName;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author Pedro Igor
*/
public class SAMLIdentityProviderFactory extends AbstractIdentityProviderFactory<SAMLIdentityProvider> {
public static final String PROVIDER_ID = "saml";
@Override
public String getName() {
return "SAML v2.0";
}
@Override
public SAMLIdentityProvider create(IdentityProviderModel model) {
return new SAMLIdentityProvider(new SAMLIdentityProviderConfig(model));
}
@Override
public Map<String, String> parseConfig(InputStream inputStream) {
try {
Object parsedObject = new SAMLParser().parse(inputStream);
EntityDescriptorType entityType;
if (EntitiesDescriptorType.class.isInstance(parsedObject)) {
entityType = (EntityDescriptorType) ((EntitiesDescriptorType) parsedObject).getEntityDescriptor().get(0);
} else {
entityType = (EntityDescriptorType) parsedObject;
}
List<EntityDescriptorType.EDTChoiceType> choiceType = entityType.getChoiceType();
if (!choiceType.isEmpty()) {
EntityDescriptorType.EDTChoiceType edtChoiceType = choiceType.get(0);
List<EntityDescriptorType.EDTDescriptorChoiceType> descriptors = edtChoiceType.getDescriptors();
if (!descriptors.isEmpty()) {
EntityDescriptorType.EDTDescriptorChoiceType edtDescriptorChoiceType = descriptors.get(0);
IDPSSODescriptorType idpDescriptor = edtDescriptorChoiceType.getIdpDescriptor();
if (idpDescriptor != null) {
SAMLIdentityProviderConfig samlIdentityProviderConfig = new SAMLIdentityProviderConfig();
String singleSignOnServiceUrl = null;
boolean postBinding = false;
for (EndpointType endpoint : idpDescriptor.getSingleSignOnService()) {
if (endpoint.getBinding().toString().equals(JBossSAMLURIConstants.SAML_HTTP_POST_BINDING.get())) {
singleSignOnServiceUrl = endpoint.getLocation().toString();
postBinding = true;
break;
} else if (endpoint.getBinding().toString().equals(JBossSAMLURIConstants.SAML_HTTP_REDIRECT_BINDING.get())){
singleSignOnServiceUrl = endpoint.getLocation().toString();
}
}
String singleLogoutServiceUrl = null;
for (EndpointType endpoint : idpDescriptor.getSingleLogoutService()) {
if (postBinding && endpoint.getBinding().toString().equals(JBossSAMLURIConstants.SAML_HTTP_POST_BINDING.get())) {
singleLogoutServiceUrl = endpoint.getLocation().toString();
break;
} else if (!postBinding && endpoint.getBinding().toString().equals(JBossSAMLURIConstants.SAML_HTTP_REDIRECT_BINDING.get())){
singleLogoutServiceUrl = endpoint.getLocation().toString();
break;
}
}
samlIdentityProviderConfig.setSingleLogoutServiceUrl(singleLogoutServiceUrl);
samlIdentityProviderConfig.setSingleSignOnServiceUrl(singleSignOnServiceUrl);
samlIdentityProviderConfig.setWantAuthnRequestsSigned(idpDescriptor.isWantAuthnRequestsSigned());
samlIdentityProviderConfig.setValidateSignature(idpDescriptor.isWantAuthnRequestsSigned());
samlIdentityProviderConfig.setPostBindingResponse(postBinding);
samlIdentityProviderConfig.setPostBindingAuthnRequest(postBinding);
List<KeyDescriptorType> keyDescriptor = idpDescriptor.getKeyDescriptor();
String defaultCertificate = null;
if (keyDescriptor != null) {
for (KeyDescriptorType keyDescriptorType : keyDescriptor) {
Element keyInfo = keyDescriptorType.getKeyInfo();
Element x509KeyInfo = DocumentUtil.getChildElement(keyInfo, new QName("dsig", "X509Certificate"));
if (KeyTypes.SIGNING.equals(keyDescriptorType.getUse())) {
samlIdentityProviderConfig.setSigningCertificate(x509KeyInfo.getTextContent());
} else if (KeyTypes.ENCRYPTION.equals(keyDescriptorType.getUse())) {
samlIdentityProviderConfig.setEncryptionPublicKey(x509KeyInfo.getTextContent());
} else if (keyDescriptorType.getUse() == null) {
defaultCertificate = x509KeyInfo.getTextContent();
}
}
}
if (defaultCertificate != null) {
if (samlIdentityProviderConfig.getSigningCertificate() == null) {
samlIdentityProviderConfig.setSigningCertificate(defaultCertificate);
}
if (samlIdentityProviderConfig.getEncryptionPublicKey() == null) {
samlIdentityProviderConfig.setEncryptionPublicKey(defaultCertificate);
}
}
return samlIdentityProviderConfig.getConfig();
}
}
}
} catch (ParsingException pe) {
throw new RuntimeException("Could not parse IdP SAML Metadata", pe);
}
return new HashMap<String, String>();
}
@Override
public String getId() {
return PROVIDER_ID;
}
}
@@ -0,0 +1,140 @@
package org.keycloak.broker.saml.mappers;
import org.keycloak.broker.provider.AbstractIdentityProviderMapper;
import org.keycloak.broker.provider.BrokeredIdentityContext;
import org.keycloak.broker.provider.HardcodedRoleMapper;
import org.keycloak.broker.provider.IdentityBrokerException;
import org.keycloak.broker.saml.SAMLEndpoint;
import org.keycloak.broker.saml.SAMLIdentityProviderFactory;
import org.keycloak.dom.saml.v2.assertion.AssertionType;
import org.keycloak.dom.saml.v2.assertion.AttributeStatementType;
import org.keycloak.dom.saml.v2.assertion.AttributeType;
import org.keycloak.models.ClientModel;
import org.keycloak.models.IdentityProviderMapperModel;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.RealmModel;
import org.keycloak.models.RoleModel;
import org.keycloak.models.UserModel;
import org.keycloak.provider.ProviderConfigProperty;
import org.keycloak.representations.JsonWebToken;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $
*/
public class AttributeToRoleMapper extends AbstractIdentityProviderMapper {
public static final String[] COMPATIBLE_PROVIDERS = {SAMLIdentityProviderFactory.PROVIDER_ID};
private static final List<ProviderConfigProperty> configProperties = new ArrayList<ProviderConfigProperty>();
public static final String ATTRIBUTE_NAME = "attribute.name";
public static final String ATTRIBUTE_FRIENDLY_NAME = "attribute.friendly.name";
public static final String ATTRIBUTE_VALUE = "attribute.value";
static {
ProviderConfigProperty property;
property = new ProviderConfigProperty();
property.setName(ATTRIBUTE_NAME);
property.setLabel("Attribute Name");
property.setHelpText("Name of attribute to search for in assertion. You can leave this blank and specify a friendly name instead.");
property.setType(ProviderConfigProperty.STRING_TYPE);
configProperties.add(property);
property = new ProviderConfigProperty();
property.setName(ATTRIBUTE_FRIENDLY_NAME);
property.setLabel("Friendly Name");
property.setHelpText("Friendly name of attribute to search for in assertion. You can leave this blank and specify a name instead.");
property.setType(ProviderConfigProperty.STRING_TYPE);
configProperties.add(property);
property = new ProviderConfigProperty();
property.setName(ATTRIBUTE_VALUE);
property.setLabel("Attribute Value");
property.setHelpText("Value the attribute must have. If the attribute is a list, then the value must be contained in the list.");
property.setType(ProviderConfigProperty.STRING_TYPE);
configProperties.add(property);
property = new ProviderConfigProperty();
property.setName(HardcodedRoleMapper.ROLE);
property.setLabel("Role");
property.setHelpText("Role to grant to user. To reference an application role the syntax is appname.approle, i.e. myapp.myrole");
property.setType(ProviderConfigProperty.STRING_TYPE);
configProperties.add(property);
}
public static final String PROVIDER_ID = "saml-role-idp-mapper";
@Override
public List<ProviderConfigProperty> getConfigProperties() {
return configProperties;
}
@Override
public String getId() {
return PROVIDER_ID;
}
@Override
public String[] getCompatibleProviders() {
return COMPATIBLE_PROVIDERS;
}
@Override
public String getDisplayCategory() {
return "Role Mapper";
}
@Override
public String getDisplayType() {
return "SAML Attribute to Role";
}
@Override
public void importNewUser(KeycloakSession session, RealmModel realm, UserModel user, IdentityProviderMapperModel mapperModel, BrokeredIdentityContext context) {
String roleName = mapperModel.getConfig().get(HardcodedRoleMapper.ROLE);
if (isAttributePresent(mapperModel, context)) {
RoleModel role = HardcodedRoleMapper.getRoleFromString(realm, roleName);
if (role == null) throw new IdentityBrokerException("Unable to find role: " + roleName);
user.grantRole(role);
}
}
protected boolean isAttributePresent(IdentityProviderMapperModel mapperModel, BrokeredIdentityContext context) {
String name = mapperModel.getConfig().get(ATTRIBUTE_NAME);
if (name != null && name.trim().equals("")) name = null;
String friendly = mapperModel.getConfig().get(ATTRIBUTE_FRIENDLY_NAME);
if (friendly != null && friendly.trim().equals("")) friendly = null;
String desiredValue = mapperModel.getConfig().get(ATTRIBUTE_VALUE);
AssertionType assertion = (AssertionType)context.getContextData().get(SAMLEndpoint.SAML_ASSERTION);
for (AttributeStatementType statement : assertion.getAttributeStatements()) {
for (AttributeStatementType.ASTChoiceType choice : statement.getAttributes()) {
AttributeType attr = choice.getAttribute();
if (name != null && !name.equals(attr.getName())) continue;
if (friendly != null && !name.equals(attr.getFriendlyName())) continue;
for (Object val : attr.getAttributeValue()) {
if (val.equals(desiredValue)) return true;
}
}
}
return false;
}
@Override
public void updateBrokeredUser(KeycloakSession session, RealmModel realm, UserModel user, IdentityProviderMapperModel mapperModel, BrokeredIdentityContext context) {
String roleName = mapperModel.getConfig().get(HardcodedRoleMapper.ROLE);
if (!isAttributePresent(mapperModel, context)) {
RoleModel role = HardcodedRoleMapper.getRoleFromString(realm, roleName);
if (role == null) throw new IdentityBrokerException("Unable to find role: " + roleName);
user.deleteRoleMapping(role);
}
}
@Override
public String getHelpText() {
return "If a claim exists, grant the user the specified realm or application role.";
}
}
@@ -0,0 +1,132 @@
package org.keycloak.broker.saml.mappers;
import org.keycloak.broker.provider.AbstractIdentityProviderMapper;
import org.keycloak.broker.provider.BrokeredIdentityContext;
import org.keycloak.broker.provider.IdentityBrokerException;
import org.keycloak.broker.saml.SAMLEndpoint;
import org.keycloak.broker.saml.SAMLIdentityProviderFactory;
import org.keycloak.dom.saml.v2.assertion.AssertionType;
import org.keycloak.dom.saml.v2.assertion.AttributeStatementType;
import org.keycloak.dom.saml.v2.assertion.AttributeType;
import org.keycloak.models.ClientModel;
import org.keycloak.models.IdentityProviderMapperModel;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.RealmModel;
import org.keycloak.models.RoleModel;
import org.keycloak.models.UserModel;
import org.keycloak.provider.ProviderConfigProperty;
import java.util.ArrayList;
import java.util.List;
/**
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $
*/
public class UserAttributeMapper extends AbstractIdentityProviderMapper {
public static final String[] COMPATIBLE_PROVIDERS = {SAMLIdentityProviderFactory.PROVIDER_ID};
private static final List<ProviderConfigProperty> configProperties = new ArrayList<ProviderConfigProperty>();
public static final String ATTRIBUTE_NAME = "attribute.name";
public static final String ATTRIBUTE_FRIENDLY_NAME = "attribute.friendly.name";
public static final String USER_ATTRIBUTE = "user.attribute";
static {
ProviderConfigProperty property;
property = new ProviderConfigProperty();
property.setName(ATTRIBUTE_NAME);
property.setLabel("Attribute Name");
property.setHelpText("Name of attribute to search for in assertion. You can leave this blank and specify a friendly name instead.");
property.setType(ProviderConfigProperty.STRING_TYPE);
configProperties.add(property);
property = new ProviderConfigProperty();
property.setName(ATTRIBUTE_FRIENDLY_NAME);
property.setLabel("Friendly Name");
property.setHelpText("Friendly name of attribute to search for in assertion. You can leave this blank and specify a name instead.");
property.setType(ProviderConfigProperty.STRING_TYPE);
configProperties.add(property);
property = new ProviderConfigProperty();
property.setName(USER_ATTRIBUTE);
property.setLabel("User Attribute Name");
property.setHelpText("User attribute name to store saml attribute.");
property.setType(ProviderConfigProperty.STRING_TYPE);
configProperties.add(property);
}
public static final String PROVIDER_ID = "saml-user-attribute-idp-mapper";
@Override
public List<ProviderConfigProperty> getConfigProperties() {
return configProperties;
}
@Override
public String getId() {
return PROVIDER_ID;
}
@Override
public String[] getCompatibleProviders() {
return COMPATIBLE_PROVIDERS;
}
@Override
public String getDisplayCategory() {
return "Attribute Importer";
}
@Override
public String getDisplayType() {
return "Attribute Importer";
}
@Override
public void importNewUser(KeycloakSession session, RealmModel realm, UserModel user, IdentityProviderMapperModel mapperModel, BrokeredIdentityContext context) {
String attribute = mapperModel.getConfig().get(USER_ATTRIBUTE);
Object value = getAttribute(mapperModel, context);
if (value != null) {
user.setAttribute(attribute, value.toString());
}
}
protected String getAttribute(IdentityProviderMapperModel mapperModel, BrokeredIdentityContext context) {
String name = mapperModel.getConfig().get(ATTRIBUTE_NAME);
if (name != null && name.trim().equals("")) name = null;
String friendly = mapperModel.getConfig().get(ATTRIBUTE_FRIENDLY_NAME);
if (friendly != null && friendly.trim().equals("")) friendly = null;
AssertionType assertion = (AssertionType)context.getContextData().get(SAMLEndpoint.SAML_ASSERTION);
for (AttributeStatementType statement : assertion.getAttributeStatements()) {
for (AttributeStatementType.ASTChoiceType choice : statement.getAttributes()) {
AttributeType attr = choice.getAttribute();
if (name != null && !name.equals(attr.getName())) continue;
if (friendly != null && !name.equals(attr.getFriendlyName())) continue;
List<Object> attributeValue = attr.getAttributeValue();
if (attributeValue == null || attributeValue.isEmpty()) return null;
return attributeValue.get(0).toString();
}
}
return null;
}
@Override
public void updateBrokeredUser(KeycloakSession session, RealmModel realm, UserModel user, IdentityProviderMapperModel mapperModel, BrokeredIdentityContext context) {
String attribute = mapperModel.getConfig().get(USER_ATTRIBUTE);
Object value = getAttribute(mapperModel, context);
String current = user.getAttribute(attribute);
if (value != null && !value.equals(current)) {
user.setAttribute(attribute, value.toString());
} else if (value == null) {
user.removeAttribute(attribute);
}
}
@Override
public String getHelpText() {
return "Import declared saml attribute if it exists in assertion into the specified user attribute.";
}
}
@@ -0,0 +1,133 @@
package org.keycloak.broker.saml.mappers;
import org.keycloak.broker.provider.AbstractIdentityProviderMapper;
import org.keycloak.broker.provider.BrokeredIdentityContext;
import org.keycloak.broker.saml.SAMLEndpoint;
import org.keycloak.broker.saml.SAMLIdentityProviderFactory;
import org.keycloak.dom.saml.v2.assertion.AssertionType;
import org.keycloak.dom.saml.v2.assertion.AttributeStatementType;
import org.keycloak.dom.saml.v2.assertion.AttributeType;
import org.keycloak.dom.saml.v2.assertion.NameIDType;
import org.keycloak.dom.saml.v2.assertion.SubjectType;
import org.keycloak.models.IdentityProviderMapperModel;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.RealmModel;
import org.keycloak.models.UserModel;
import org.keycloak.models.utils.KeycloakModelUtils;
import org.keycloak.provider.ProviderConfigProperty;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $
*/
public class UsernameTemplateMapper extends AbstractIdentityProviderMapper {
public static final String[] COMPATIBLE_PROVIDERS = {SAMLIdentityProviderFactory.PROVIDER_ID};
private static final List<ProviderConfigProperty> configProperties = new ArrayList<ProviderConfigProperty>();
public static final String TEMPLATE = "template";
static {
ProviderConfigProperty property;
property = new ProviderConfigProperty();
property.setName(TEMPLATE);
property.setLabel("Template");
property.setHelpText("Template to use to format the username to import. Substitutions are enclosed in ${}. For example: '${ALIAS}.${NAMEID}'. ALIAS is the provider alias. NAMEID is that SAML name id assertion. ATTRIBUTE.<NAME> references a SAML attribute where name is the attribute name or friendly name.");
property.setType(ProviderConfigProperty.STRING_TYPE);
property.setDefaultValue("${ALIAS}.${NAMEID}");
configProperties.add(property);
}
public static final String PROVIDER_ID = "saml-username-idp-mapper";
@Override
public List<ProviderConfigProperty> getConfigProperties() {
return configProperties;
}
@Override
public String getId() {
return PROVIDER_ID;
}
@Override
public String[] getCompatibleProviders() {
return COMPATIBLE_PROVIDERS;
}
@Override
public String getDisplayCategory() {
return "Preprocessor";
}
@Override
public String getDisplayType() {
return "Username Template Importer";
}
@Override
public void importNewUser(KeycloakSession session, RealmModel realm, UserModel user, IdentityProviderMapperModel mapperModel, BrokeredIdentityContext context) {
}
@Override
public void updateBrokeredUser(KeycloakSession session, RealmModel realm, UserModel user, IdentityProviderMapperModel mapperModel, BrokeredIdentityContext context) {
}
static Pattern substitution = Pattern.compile("\\$\\{([^}]+)\\}");
@Override
public void preprocessFederatedIdentity(KeycloakSession session, RealmModel realm, IdentityProviderMapperModel mapperModel, BrokeredIdentityContext context) {
AssertionType assertion = (AssertionType)context.getContextData().get(SAMLEndpoint.SAML_ASSERTION);
String template = mapperModel.getConfig().get(TEMPLATE);
Matcher m = substitution.matcher(template);
StringBuffer sb = new StringBuffer();
while (m.find()) {
String variable = m.group(1);
if (variable.equals("ALIAS")) {
m.appendReplacement(sb, context.getIdpConfig().getAlias());
} else if (variable.equals("UUID")) {
m.appendReplacement(sb, KeycloakModelUtils.generateId());
} else if (variable.equals("NAMEID")) {
SubjectType subject = assertion.getSubject();
SubjectType.STSubType subType = subject.getSubType();
NameIDType subjectNameID = (NameIDType) subType.getBaseID();
m.appendReplacement(sb, subjectNameID.getValue());
} else if (variable.startsWith("ATTRIBUTE.")) {
String name = variable.substring("ATTRIBUTE.".length());
String value = "";
for (AttributeStatementType statement : assertion.getAttributeStatements()) {
for (AttributeStatementType.ASTChoiceType choice : statement.getAttributes()) {
AttributeType attr = choice.getAttribute();
if (name.equals(attr.getName()) || name.equals(attr.getFriendlyName())) {
List<Object> attributeValue = attr.getAttributeValue();
if (attributeValue != null && !attributeValue.isEmpty()) {
value = attributeValue.get(0).toString();
}
break;
}
}
}
m.appendReplacement(sb, value);
} else {
m.appendReplacement(sb, m.group(1));
}
}
m.appendTail(sb);
context.setModelUsername(sb.toString());
}
@Override
public String getHelpText() {
return "Format the username to import.";
}
}
@@ -0,0 +1 @@
org.keycloak.broker.saml.SAMLIdentityProviderFactory
@@ -0,0 +1,3 @@
org.keycloak.broker.saml.mappers.AttributeToRoleMapper
org.keycloak.broker.saml.mappers.UserAttributeMapper
org.keycloak.broker.saml.mappers.UsernameTemplateMapper
+43
View File
@@ -0,0 +1,43 @@
<?xml version="1.0"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<parent>
<artifactId>keycloak-parent</artifactId>
<groupId>org.keycloak</groupId>
<version>1.3.1.Final</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>keycloak-connections-file</artifactId>
<name>Keycloak Connections File</name>
<description/>
<dependencies>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-export-import-api</artifactId>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-export-import-single-file</artifactId>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-core</artifactId>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-model-api</artifactId>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.jboss.logging</groupId>
<artifactId>jboss-logging</artifactId>
</dependency>
</dependencies>
</project>
@@ -0,0 +1,86 @@
/*
* Copyright 2015 Red Hat Inc. and/or its affiliates and other contributors
* as indicated by the @author tags. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package org.keycloak.connections.file;
import org.keycloak.models.KeycloakSession;
/**
* Provides the InMemoryModel and notifies the factory to save it when
* the session is done.
*
* @author Stan Silvert ssilvert@redhat.com (C) 2015 Red Hat Inc.
*/
public class DefaultFileConnectionProvider implements FileConnectionProvider {
private final DefaultFileConnectionProviderFactory factory;
private final KeycloakSession session;
private final InMemoryModel inMemoryModel;
private boolean isRollbackOnly = false;
public DefaultFileConnectionProvider(DefaultFileConnectionProviderFactory factory,
KeycloakSession session,
InMemoryModel inMemoryModel) {
this.factory = factory;
this.session = session;
this.inMemoryModel = inMemoryModel;
}
@Override
public InMemoryModel getModel() {
return inMemoryModel;
}
@Override
public void sessionClosed(KeycloakSession session) {
factory.sessionClosed(session);
}
@Override
public void close() {
}
@Override
public void begin() {
}
@Override
public void commit() {
factory.commit(session);
}
@Override
public void rollback() {
factory.rollback(session);
}
@Override
public void setRollbackOnly() {
isRollbackOnly = true;
}
@Override
public boolean getRollbackOnly() {
return isRollbackOnly;
}
@Override
public boolean isActive() {
return factory.isActive(session);
}
}
@@ -0,0 +1,221 @@
/*
* Copyright 2015 Red Hat Inc. and/or its affiliates and other contributors
* as indicated by the @author tags. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package org.keycloak.connections.file;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.codehaus.jackson.JsonToken;
import org.jboss.logging.Logger;
import org.keycloak.Config;
import org.keycloak.exportimport.Strategy;
import org.keycloak.exportimport.util.ExportUtils;
import org.keycloak.exportimport.util.ImportUtils;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.KeycloakSessionFactory;
import org.keycloak.models.RealmModel;
import org.keycloak.representations.idm.RealmRepresentation;
import org.keycloak.util.JsonSerialization;
/**
* This class dispenses a FileConnectionProvider to Keycloak sessions. It
* makes sure that only one InMemoryModel is provided for each session and it
* handles thread contention for the file where the model is read or saved.
*
* @author Stan Silvert ssilvert@redhat.com (C) 2015 Red Hat Inc.
*/
public class DefaultFileConnectionProviderFactory implements FileConnectionProviderFactory {
protected static final Logger logger = Logger.getLogger(DefaultFileConnectionProviderFactory.class);
private File kcdata;
private final Map<KeycloakSession, FileConnectionProvider> allProviders = new HashMap<KeycloakSession, FileConnectionProvider>();
@Override
public void init(Config.Scope config) {
String fileName = config.get("fileName");
if (fileName == null) {
fileName = "keycloak-model.json";
}
String directory = config.get("directory");
if (directory == null) {
directory = System.getProperty("jboss.server.data.dir");
}
if (directory == null) {
directory = ".";
}
kcdata = new File(directory, fileName);
}
public void sessionClosed(KeycloakSession session) {
synchronized(allProviders) {
allProviders.remove(session);
//logger.info("Removed session " + session.hashCode());
//logger.info("sessionClosed: Session count=" + allModels.size());
}
}
void readModelFile(KeycloakSession session) {
synchronized(allProviders) {
if (!kcdata.exists()) {
return;
}
FileInputStream fis = null;
try {
fis = new FileInputStream(kcdata);
Model model = JsonSerialization.readValue(fis, Model.class);
ImportUtils.importFromStream(session, JsonSerialization.mapper, fis, Strategy.IGNORE_EXISTING);
session.realms().getMigrationModel().setStoredVersion(model.getModelVersion());
List<RealmRepresentation> realmReps = new ArrayList<RealmRepresentation>();
for (RealmRepresentation realmRep : model.getRealms()) {
if (Config.getAdminRealm().equals(realmRep.getRealm())) {
realmReps.add(0, realmRep);
} else {
realmReps.add(realmRep);
}
}
for (RealmRepresentation realmRep : realmReps) {
ImportUtils.importRealm(session, realmRep, Strategy.IGNORE_EXISTING);
}
} catch (IOException ioe) {
logger.error("Unable to read model file " + kcdata.getAbsolutePath(), ioe);
} finally {
//logger.info("Read model file for session=" + session.hashCode());
try {
if (fis != null) {
fis.close();
}
} catch (IOException e) {
logger.error("Failed to close output stream.", e);
}
}
}
}
void writeModelFile(KeycloakSession session) {
synchronized(allProviders) {
FileOutputStream outStream = null;
try {
outStream = new FileOutputStream(kcdata);
exportModel(session, outStream);
} catch (IOException e) {
logger.error("Unable to write model file " + kcdata.getAbsolutePath(), e);
} finally {
//logger.info("Wrote model file for session=" + session.hashCode());
try {
if (outStream != null) {
outStream.close();
}
} catch (IOException e) {
logger.error("Failed to close output stream.", e);
}
}
}
}
private void exportModel(KeycloakSession session, FileOutputStream outStream) throws IOException {
List<RealmModel> realms = session.realms().getRealms();
List<RealmRepresentation> reps = new ArrayList<RealmRepresentation>();
for (RealmModel realm : realms) {
reps.add(ExportUtils.exportRealm(session, realm, true));
}
Model model = new Model();
model.setRealms(reps);
model.setModelVersion(session.realms().getMigrationModel().getStoredVersion());
JsonSerialization.prettyMapper.writeValue(outStream, model);
}
@Override
public FileConnectionProvider create(KeycloakSession session) {
synchronized (allProviders) {
FileConnectionProvider fcProvider = allProviders.get(session);
if (fcProvider == null) {
InMemoryModel model = new InMemoryModel();
fcProvider = new DefaultFileConnectionProvider(this, session, model);
allProviders.put(session, fcProvider);
session.getTransaction().enlist(fcProvider);
readModelFile(session);
//logger.info("Added session " + session.hashCode() + " total sessions=" + allModels.size());
}
return fcProvider;
}
}
// commitCount is used for debugging. This allows you to easily run a test
// to a particular point and then examine the JSON file.
//private static int commitCount = 0;
void commit(KeycloakSession session) {
//commitCount++;
synchronized (allProviders) {
// in case commit was somehow called twice on the same session
if (!allProviders.containsKey(session)) return;
try {
writeModelFile(session);
} finally {
allProviders.remove(session);
//logger.info("Removed session " + session.hashCode());
//logger.info("*** commitCount=" + commitCount);
//logger.info("commit(): Session count=" + allModels.size());
}
// if (commitCount == 16) {Thread.dumpStack();System.exit(0);}
}
}
void rollback(KeycloakSession session) {
synchronized (allProviders) {
allProviders.remove(session);
//logger.info("rollback(): Session count=" + allModels.size());
}
}
boolean isActive(KeycloakSession session) {
synchronized (allProviders) {
return allProviders.containsKey(session);
}
}
@Override
public void close() {
}
@Override
public String getId() {
return "default";
}
@Override
public void postInit(KeycloakSessionFactory factory) {
}
}
@@ -0,0 +1,31 @@
/*
* Copyright 2015 Red Hat Inc. and/or its affiliates and other contributors
* as indicated by the @author tags. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package org.keycloak.connections.file;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.KeycloakTransaction;
import org.keycloak.provider.Provider;
/**
* @author Stan Silvert ssilvert@redhat.com (C) 2015 Red Hat Inc.
*/
public interface FileConnectionProvider extends Provider, KeycloakTransaction {
InMemoryModel getModel();
void sessionClosed(KeycloakSession session);
}
@@ -0,0 +1,25 @@
/*
* Copyright 2015 Red Hat Inc. and/or its affiliates and other contributors
* as indicated by the @author tags. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package org.keycloak.connections.file;
import org.keycloak.provider.ProviderFactory;
/**
* @author Stan Silvert ssilvert@redhat.com (C) 2015 Red Hat Inc.
*/
public interface FileConnectionProviderFactory extends ProviderFactory<FileConnectionProvider> {
}
@@ -0,0 +1,32 @@
package org.keycloak.connections.file;
import org.keycloak.provider.Provider;
import org.keycloak.provider.ProviderFactory;
import org.keycloak.provider.Spi;
/**
* @author Stan Silvert ssilvert@redhat.com (C) 2015 Red Hat Inc.
*/
public class FileConnectionSpi implements Spi {
@Override
public boolean isInternal() {
return true;
}
@Override
public String getName() {
return "connectionsFile";
}
@Override
public Class<? extends Provider> getProviderClass() {
return FileConnectionProvider.class;
}
@Override
public Class<? extends ProviderFactory> getProviderFactoryClass() {
return FileConnectionProviderFactory.class;
}
}
@@ -0,0 +1,109 @@
/*
* Copyright 2015 Red Hat Inc. and/or its affiliates and other contributors
* as indicated by the @author tags. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package org.keycloak.connections.file;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import org.keycloak.models.RealmModel;
import org.keycloak.models.UserModel;
/**
* This class provides an in-memory copy of the entire model for each
* Keycloak session. At the start of the session, the model is read
* from JSON. When the session's transaction ends, the model is written back
* out.
*
* @author Stan Silvert ssilvert@redhat.com (C) 2015 Red Hat Inc.
*/
public class InMemoryModel {
private final Map<String, RealmModel> allRealms = new HashMap<String, RealmModel>();
// realmId, userId, userModel
private final Map<String, Map<String,UserModel>> allUsers = new HashMap<String, Map<String,UserModel>>();
private String modelVersion;
public InMemoryModel() {
}
public void putRealm(String id, RealmModel realm) {
allRealms.put(id, realm);
allUsers.put(id, new HashMap<String, UserModel>());
}
public String getModelVersion() {
return modelVersion;
}
public void setModelVersion(String modelVersion) {
this.modelVersion = modelVersion;
}
public RealmModel getRealm(String id) {
return allRealms.get(id);
}
public Collection<RealmModel> getRealms() {
return allRealms.values();
}
public RealmModel getRealmByName(String name) {
for (RealmModel realm : getRealms()) {
if (realm.getName().equals(name)) return realm;
}
return null;
}
public boolean removeRealm(String id) {
allUsers.remove(id);
return (allRealms.remove(id) != null);
}
protected Map<String, UserModel> realmUsers(String realmId) {
Map<String, UserModel> realmUsers = allUsers.get(realmId);
if (realmUsers == null) throw new NullPointerException("Realm users not found for id=" + realmId);
return realmUsers;
}
public void putUser(String realmId, String userId, UserModel user) {
realmUsers(realmId).put(userId, user);
}
public UserModel getUser(String realmId, String userId) {
return realmUsers(realmId).get(userId);
}
public boolean hasUserWithUsername(String realmId, String username) {
for (UserModel user : getUsers(realmId)) {
if (user.getUsername().equals(username)) return true;
}
return false;
}
public Collection<UserModel> getUsers(String realmId) {
return realmUsers(realmId).values();
}
public boolean removeUser(String realmId, String userId) {
return (realmUsers(realmId).remove(userId) != null);
}
}
@@ -0,0 +1,30 @@
package org.keycloak.connections.file;
import org.keycloak.representations.idm.RealmRepresentation;
import java.util.List;
/**
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $
*/
public class Model {
private String modelVersion;
private List<RealmRepresentation> realms;
public String getModelVersion() {
return modelVersion;
}
public void setModelVersion(String modelVersion) {
this.modelVersion = modelVersion;
}
public List<RealmRepresentation> getRealms() {
return realms;
}
public void setRealms(List<RealmRepresentation> realms) {
this.realms = realms;
}
}
@@ -0,0 +1 @@
org.keycloak.connections.file.DefaultFileConnectionProviderFactory
@@ -0,0 +1 @@
org.keycloak.connections.file.FileConnectionSpi
+36
View File
@@ -0,0 +1,36 @@
<?xml version="1.0"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<parent>
<artifactId>keycloak-parent</artifactId>
<groupId>org.keycloak</groupId>
<version>1.3.1.Final</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>keycloak-connections-http-client</artifactId>
<name>Keycloak Connections Apache HttpClient</name>
<description/>
<dependencies>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-core</artifactId>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-model-api</artifactId>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.jboss.logging</groupId>
<artifactId>jboss-logging</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
@@ -0,0 +1,139 @@
package org.keycloak.connections.httpclient;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.EntityBuilder;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.impl.client.CloseableHttpClient;
import org.jboss.logging.Logger;
import org.keycloak.Config;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.KeycloakSessionFactory;
import org.keycloak.util.EnvUtil;
import org.keycloak.util.KeystoreUtil;
import java.io.IOException;
import java.io.InputStream;
import java.security.KeyStore;
import java.util.concurrent.TimeUnit;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public class DefaultHttpClientFactory implements HttpClientFactory {
private static final Logger logger = Logger.getLogger(DefaultHttpClientFactory.class);
private volatile CloseableHttpClient httpClient;
@Override
public HttpClientProvider create(KeycloakSession session) {
return new HttpClientProvider() {
@Override
public HttpClient getHttpClient() {
return httpClient;
}
@Override
public void close() {
}
@Override
public int postText(String uri, String text) throws IOException {
HttpPost request = new HttpPost(uri);
request.setEntity(EntityBuilder.create().setText(text).setContentType(ContentType.TEXT_PLAIN).build());
HttpResponse response = httpClient.execute(request);
try {
return response.getStatusLine().getStatusCode();
} finally {
HttpEntity entity = response.getEntity();
if (entity != null) {
InputStream is = entity.getContent();
if (is != null) is.close();
}
}
}
@Override
public InputStream get(String uri) throws IOException {
HttpGet request = new HttpGet(uri);
HttpResponse response = httpClient.execute(request);
HttpEntity entity = response.getEntity();
if (entity == null) return null;
return entity.getContent();
}
};
}
@Override
public void close() {
try {
httpClient.close();
} catch (IOException e) {
}
}
@Override
public String getId() {
return "default";
}
@Override
public void init(Config.Scope config) {
long socketTimeout = config.getLong("socket-timeout-millis", -1L);
long establishConnectionTimeout = config.getLong("establish-connection-timeout-millis", -1L);
int maxPooledPerRoute = config.getInt("max-pooled-per-route", 0);
int connectionPoolSize = config.getInt("connection-pool-size", 200);
boolean disableTrustManager = config.getBoolean("disable-trust-manager", false);
boolean disableCookies = config.getBoolean("disable-cookies", true);
String hostnameVerificationPolicy = config.get("hostname-verification-policy", "WILDCARD");
HttpClientBuilder.HostnameVerificationPolicy hostnamePolicy = HttpClientBuilder.HostnameVerificationPolicy.valueOf(hostnameVerificationPolicy);
String truststore = config.get("truststore");
String truststorePassword = config.get("truststore-password");
String clientKeystore = config.get("client-keystore");
String clientKeystorePassword = config.get("client-keystore-password");
String clientPrivateKeyPassword = config.get("client-key-password");
HttpClientBuilder builder = new HttpClientBuilder();
builder.socketTimeout(socketTimeout, TimeUnit.MILLISECONDS)
.establishConnectionTimeout(establishConnectionTimeout, TimeUnit.MILLISECONDS)
.maxPooledPerRoute(maxPooledPerRoute)
.connectionPoolSize(connectionPoolSize)
.hostnameVerification(hostnamePolicy)
.disableCookies(disableCookies);
if (disableTrustManager) builder.disableTrustManager();
if (truststore != null) {
truststore = EnvUtil.replace(truststore);
try {
builder.trustStore(KeystoreUtil.loadKeyStore(truststore, truststorePassword));
} catch (Exception e) {
throw new RuntimeException("Failed to load truststore", e);
}
}
if (clientKeystore != null) {
clientKeystore = EnvUtil.replace(clientKeystore);
try {
KeyStore clientCertKeystore = KeystoreUtil.loadKeyStore(clientKeystore, clientKeystorePassword);
builder.keyStore(clientCertKeystore, clientPrivateKeyPassword);
} catch (Exception e) {
throw new RuntimeException("Failed to load keystore", e);
}
}
httpClient = builder.build();
}
@Override
public void postInit(KeycloakSessionFactory factory) {
}
}
@@ -0,0 +1,281 @@
package org.keycloak.connections.httpclient;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.conn.ssl.AllowAllHostnameVerifier;
import org.apache.http.conn.ssl.BrowserCompatHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLContexts;
import org.apache.http.conn.ssl.StrictHostnameVerifier;
import org.apache.http.conn.ssl.X509HostnameVerifier;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLException;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.io.IOException;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.concurrent.TimeUnit;
/**
* Abstraction for creating HttpClients. Allows SSL configuration.
*
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $
*/
public class HttpClientBuilder {
public static enum HostnameVerificationPolicy {
/**
* Hostname verification is not done on the server's certificate
*/
ANY,
/**
* Allows wildcards in subdomain names i.e. *.foo.com
*/
WILDCARD,
/**
* CN must match hostname connecting to
*/
STRICT
}
/**
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $
*/
private static class PassthroughTrustManager implements X509TrustManager {
public void checkClientTrusted(X509Certificate[] chain,
String authType) throws CertificateException {
}
public void checkServerTrusted(X509Certificate[] chain,
String authType) throws CertificateException {
}
public X509Certificate[] getAcceptedIssuers() {
return null;
}
}
protected KeyStore truststore;
protected KeyStore clientKeyStore;
protected String clientPrivateKeyPassword;
protected boolean disableTrustManager;
protected HostnameVerificationPolicy policy = HostnameVerificationPolicy.WILDCARD;
protected SSLContext sslContext;
protected int connectionPoolSize = 100;
protected int maxPooledPerRoute = 0;
protected long connectionTTL = -1;
protected TimeUnit connectionTTLUnit = TimeUnit.MILLISECONDS;
protected HostnameVerifier verifier = null;
protected long socketTimeout = -1;
protected TimeUnit socketTimeoutUnits = TimeUnit.MILLISECONDS;
protected long establishConnectionTimeout = -1;
protected TimeUnit establishConnectionTimeoutUnits = TimeUnit.MILLISECONDS;
protected boolean disableCookies = false;
/**
* Socket inactivity timeout
*
* @param timeout
* @param unit
* @return
*/
public HttpClientBuilder socketTimeout(long timeout, TimeUnit unit)
{
this.socketTimeout = timeout;
this.socketTimeoutUnits = unit;
return this;
}
/**
* When trying to make an initial socket connection, what is the timeout?
*
* @param timeout
* @param unit
* @return
*/
public HttpClientBuilder establishConnectionTimeout(long timeout, TimeUnit unit)
{
this.establishConnectionTimeout = timeout;
this.establishConnectionTimeoutUnits = unit;
return this;
}
public HttpClientBuilder connectionTTL(long ttl, TimeUnit unit) {
this.connectionTTL = ttl;
this.connectionTTLUnit = unit;
return this;
}
public HttpClientBuilder maxPooledPerRoute(int maxPooledPerRoute) {
this.maxPooledPerRoute = maxPooledPerRoute;
return this;
}
public HttpClientBuilder connectionPoolSize(int connectionPoolSize) {
this.connectionPoolSize = connectionPoolSize;
return this;
}
/**
* Disable trust management and hostname verification. <i>NOTE</i> this is a security
* hole, so only set this option if you cannot or do not want to verify the identity of the
* host you are communicating with.
*/
public HttpClientBuilder disableTrustManager() {
this.disableTrustManager = true;
return this;
}
/**
* Disable cookie management.
*/
public HttpClientBuilder disableCookies(boolean disable) {
this.disableTrustManager = disable;
return this;
}
/**
* SSL policy used to verify hostnames
*
* @param policy
* @return
*/
public HttpClientBuilder hostnameVerification(HostnameVerificationPolicy policy) {
this.policy = policy;
return this;
}
public HttpClientBuilder sslContext(SSLContext sslContext) {
this.sslContext = sslContext;
return this;
}
public HttpClientBuilder trustStore(KeyStore truststore) {
this.truststore = truststore;
return this;
}
public HttpClientBuilder keyStore(KeyStore keyStore, String password) {
this.clientKeyStore = keyStore;
this.clientPrivateKeyPassword = password;
return this;
}
public HttpClientBuilder keyStore(KeyStore keyStore, char[] password) {
this.clientKeyStore = keyStore;
this.clientPrivateKeyPassword = new String(password);
return this;
}
static class VerifierWrapper implements X509HostnameVerifier {
protected HostnameVerifier verifier;
VerifierWrapper(HostnameVerifier verifier) {
this.verifier = verifier;
}
@Override
public void verify(String host, SSLSocket ssl) throws IOException {
if (!verifier.verify(host, ssl.getSession())) throw new SSLException("Hostname verification failure");
}
@Override
public void verify(String host, X509Certificate cert) throws SSLException {
throw new SSLException("This verification path not implemented");
}
@Override
public void verify(String host, String[] cns, String[] subjectAlts) throws SSLException {
throw new SSLException("This verification path not implemented");
}
@Override
public boolean verify(String s, SSLSession sslSession) {
return verifier.verify(s, sslSession);
}
}
public CloseableHttpClient build() {
X509HostnameVerifier verifier = null;
if (this.verifier != null) verifier = new VerifierWrapper(this.verifier);
else {
switch (policy) {
case ANY:
verifier = new AllowAllHostnameVerifier();
break;
case WILDCARD:
verifier = new BrowserCompatHostnameVerifier();
break;
case STRICT:
verifier = new StrictHostnameVerifier();
break;
}
}
try {
SSLConnectionSocketFactory sslsf = null;
SSLContext theContext = sslContext;
if (disableTrustManager) {
theContext = SSLContext.getInstance("TLS");
theContext.init(null, new TrustManager[]{new PassthroughTrustManager()},
new SecureRandom());
verifier = new AllowAllHostnameVerifier();
sslsf = new SSLConnectionSocketFactory(theContext, verifier);
} else if (theContext != null) {
sslsf = new SSLConnectionSocketFactory(theContext, verifier);
} else if (clientKeyStore != null || truststore != null) {
theContext = createSslContext("TLS", clientKeyStore, clientPrivateKeyPassword, truststore, null);
sslsf = new SSLConnectionSocketFactory(theContext, verifier);
} else {
final SSLContext tlsContext = SSLContext.getInstance("TLS");
tlsContext.init(null, null, null);
sslsf = new SSLConnectionSocketFactory(tlsContext, verifier);
}
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout((int) establishConnectionTimeout)
.setSocketTimeout((int) socketTimeout).build();
org.apache.http.impl.client.HttpClientBuilder builder = HttpClients.custom()
.setDefaultRequestConfig(requestConfig)
.setSSLSocketFactory(sslsf)
.setMaxConnTotal(connectionPoolSize)
.setMaxConnPerRoute(maxPooledPerRoute);
if (disableCookies) builder.disableCookieManagement();
return builder.build();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private SSLContext createSslContext(
final String algorithm,
final KeyStore keystore,
final String keyPassword,
final KeyStore truststore,
final SecureRandom random)
throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException {
return SSLContexts.custom()
.useProtocol(algorithm)
.setSecureRandom(random)
.loadKeyMaterial(keystore, keyPassword != null ? keyPassword.toCharArray() : null)
.loadTrustMaterial(truststore)
.build();
}
}
@@ -0,0 +1,11 @@
package org.keycloak.connections.httpclient;
import org.apache.http.client.HttpClient;
import org.keycloak.provider.Provider;
import org.keycloak.provider.ProviderFactory;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public interface HttpClientFactory extends ProviderFactory<HttpClientProvider> {
}
@@ -0,0 +1,34 @@
package org.keycloak.connections.httpclient;
import org.apache.http.client.HttpClient;
import org.keycloak.provider.Provider;
import org.keycloak.provider.ProviderFactory;
import java.io.IOException;
import java.io.InputStream;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public interface HttpClientProvider extends Provider {
HttpClient getHttpClient();
/**
* Helper method
*
* @param uri
* @param text
* @return http response status
* @throws IOException
*/
public int postText(String uri, String text) throws IOException;
/**
* Helper method
*
* @param uri
* @return response stream, you must close this stream or leaks will happen
* @throws IOException
*/
public InputStream get(String uri) throws IOException;
}
@@ -0,0 +1,32 @@
package org.keycloak.connections.httpclient;
import org.keycloak.provider.Provider;
import org.keycloak.provider.ProviderFactory;
import org.keycloak.provider.Spi;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public class HttpClientSpi implements Spi {
@Override
public boolean isInternal() {
return true;
}
@Override
public String getName() {
return "connectionsHttpClient";
}
@Override
public Class<? extends Provider> getProviderClass() {
return HttpClientProvider.class;
}
@Override
public Class<? extends ProviderFactory> getProviderFactoryClass() {
return HttpClientFactory.class;
}
}
@@ -0,0 +1 @@
org.keycloak.connections.httpclient.DefaultHttpClientFactory
@@ -0,0 +1 @@
org.keycloak.connections.httpclient.HttpClientSpi
+31
View File
@@ -0,0 +1,31 @@
<?xml version="1.0"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<parent>
<artifactId>keycloak-parent</artifactId>
<groupId>org.keycloak</groupId>
<version>1.3.1.Final</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>keycloak-connections-infinispan</artifactId>
<name>Keycloak Connections Infinispan</name>
<description/>
<dependencies>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-core</artifactId>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-model-api</artifactId>
</dependency>
<dependency>
<groupId>org.infinispan</groupId>
<artifactId>infinispan-core</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
@@ -0,0 +1,26 @@
package org.keycloak.connections.infinispan;
import org.infinispan.Cache;
import org.infinispan.manager.EmbeddedCacheManager;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public class DefaultInfinispanConnectionProvider implements InfinispanConnectionProvider {
private EmbeddedCacheManager cacheManager;
public DefaultInfinispanConnectionProvider(EmbeddedCacheManager cacheManager) {
this.cacheManager = cacheManager;
}
@Override
public <K, V> Cache<K, V> getCache(String name) {
return cacheManager.getCache(name);
}
@Override
public void close() {
}
}
Loaded 100 of 3641 files, more files were not shown because too many files have changed in this diff. Show more