Compare commits

...
2311 Commits
Author SHA1 Message Date
Stian Thorgersen a739dd8eb3 Version bump 2015-10-14 07:02:00 +02:00
Stian Thorgersen 07f27633ac Fix tests 2015-10-13 09:52:30 +02:00
Stian Thorgersen e05afd2e48 Version bump 2015-10-13 09:05:59 +02:00
Stian Thorgersen 58372b3151 Add tests without client secret 2015-10-13 09:03:18 +02:00
Stian Thorgersen 6b70b5ddcd KEYCLOAK-1833 Fix error messages for identity brokering 2015-09-10 21:17:31 +02:00
Stian Thorgersen fd73d48e0e Version bump 2015-09-10 21:17:21 +02:00
Marek Posolda 1c38bb7158 Merge pull request #1609 from mposolda/master
KEYCLOAK-1824 ClientIdAndSecretCredentialsProvider not found when dep…
2015-09-08 23:45:04 +02:00
mposolda 149ef706dd KEYCLOAK-1824 ClientIdAndSecretCredentialsProvider not found when deploying Fuse examples 2015-09-08 22:55:43 +02:00
Marek Posolda f1c40dd345 Merge pull request #1608 from mposolda/master
KEYCLOAK-1826
2015-09-08 21:01:52 +02:00
mposolda 6225ccfc06 KEYCLOAK-1826 2015-09-08 21:00:42 +02:00
Marek Posolda 34de631b2a Merge pull request #1607 from mposolda/master
KEYCLOAK-1821 KEYCLOAK-1825 Migration and export/import of clientAuth…
2015-09-08 20:28:04 +02:00
mposolda 86f0092622 KEYCLOAK-1821 KEYCLOAK-1825 Migration and export/import of clientAuthFlow + resetCredentialsFlow 2015-09-08 19:53:35 +02:00
Marek Posolda 76f3842dad Merge pull request #1606 from mposolda/master
Fix service-account demo app on EAP 6.4
2015-09-08 17:22:29 +02:00
mposolda d818ebdd9e Fix service-account demo app on EAP 6.4 2015-09-08 16:41:27 +02:00
Stian Thorgersen 4d90898dd9 Merge pull request #1605 from stianst/master
KEYCLOAK-1818
2015-09-08 09:56:06 +02:00
Stian Thorgersen 298b9e01d8 KEYCLOAK-1818
Authenticator example doesn't work when deployed as a module
2015-09-08 09:55:45 +02:00
Marek Posolda d0b08cacd8 Merge pull request #1604 from mposolda/master
KEYCLOAK-1811 Pluggable client authentication config through adapter …
2015-09-08 00:12:49 +02:00
mposolda 050c65a520 KEYCLOAK-1811 Pluggable client authentication config through adapter subsystem 2015-09-07 23:30:08 +02:00
Stian Thorgersen 5c2fc1120b Merge pull request #1603 from stianst/master
KEYCLOAK-1816
2015-09-07 13:32:29 +02:00
Stian Thorgersen 3d2acbe780 KEYCLOAK-1816
LocaleHelper prints info 'Locale en is not supported'
2015-09-07 13:02:52 +02:00
Stian Thorgersen bce0e0ea90 Merge pull request #1602 from stianst/master
Fixes
2015-09-07 10:36:48 +02:00
Stian Thorgersen 931102ff26 KEYCLOAK-1808
Revoke Grant button should disappear
2015-09-07 10:08:32 +02:00
Stian Thorgersen 5a3938d12f KEYCLOAK-1806
oauth-client example fails if you say no to grant
2015-09-07 09:59:32 +02:00
Stian Thorgersen dca1751a63 KEYCLOAK-1812 View user attributes in admin console doesn't work 2015-09-07 09:40:34 +02:00
Stian Thorgersen f6ec9af61e KEYCLOAK-1805
address theme causes exception for login theme
2015-09-07 09:33:34 +02:00
Stian Thorgersen 64f2f84ffa Merge pull request #1599 from stianst/master
KEYCLOAK-1804
2015-09-07 08:51:01 +02:00
Marek Posolda 5df5e53f11 Merge pull request #1601 from mposolda/master
KEYCLOAK-1799 Download adapter JSON config with proper adapter
2015-09-07 08:36:53 +02:00
mposolda 81f4c50574 KEYCLOAK-1799 Download adapter JSON config with proper adapter 2015-09-04 22:23:01 +02:00
Marek Posolda 2550d16127 Merge pull request #1598 from mposolda/master
KEYCLOAK-1801 Additional fix and cleanup
2015-09-04 22:21:37 +02:00
Stian Thorgersen f3675681c3 KEYCLOAK-1804
Replace -snapshot with startup time in resource urls
2015-09-04 16:55:32 +02:00
Stian Thorgersen 28de8dc5b7 Merge pull request #1597 from mstruk/KEYCLOAK-1779
KEYCLOAK-1779 NPE due to missing web.xml/jboss-web.xml
2015-09-04 16:14:55 +02:00
mposolda 35e63a9398 KEYCLOAK-1801 Additional fix and cleanup 2015-09-04 15:19:43 +02:00
Stian Thorgersen f23f1cc813 Merge pull request #1596 from stianst/master
KEYCLOAK-1803
2015-09-04 14:22:07 +02:00
Marko Strukelj b0095154d1 KEYCLOAK-1779 NPE due to missing web.xml/jboss-web.xml
- improved code readability and npe fix
2015-09-04 14:18:57 +02:00
Stian Thorgersen 79ea9ed314 KEYCLOAK-1803
On/off switches in mappers doesn't work
2015-09-04 14:17:30 +02:00
Marek Posolda 413db0dce1 Merge pull request #1595 from mposolda/master
Add 'Testsuite' prefix to the dummy providers used for testing only
2015-09-04 13:53:10 +02:00
William DeCoste e6745532ce KEYCLOAK-1779 2015-09-04 13:52:25 +02:00
Stian Thorgersen 59da0f90f8 Merge pull request #1594 from stianst/master
KEYCLOAK-1801
2015-09-04 13:37:32 +02:00
mposolda 76f0f52ee3 Add 'Testsuite' prefix to the dummy providers used for testing only 2015-09-04 13:17:20 +02:00
Stian Thorgersen 73c230f1ca KEYCLOAK-1801
Suggestions to improving client credentials tab
2015-09-04 12:55:25 +02:00
Marek Posolda ddee72c756 Merge pull request #1593 from mposolda/master
KEYCLOAK-1802
2015-09-04 12:46:15 +02:00
mposolda 6318964374 KEYCLOAK-1802 2015-09-04 12:21:45 +02:00
Stian Thorgersen 853f1af40d Merge pull request #1592 from stianst/master
KEYCLOAK-1794 Admin console issues with kc-provider-config directive
2015-09-04 11:43:30 +02:00
Stian Thorgersen d429b2151a KEYCLOAK-1800
Save buttons not aligned correctly on otp-policy and flow-bindings pages
2015-09-04 10:14:55 +02:00
Stian Thorgersen b223e1a7af KEYCLOAK-1794 Admin console issues with kc-provider-config directive 2015-09-04 09:59:48 +02:00
Stian Thorgersen c806b8911e Merge pull request #1590 from stianst/master
KEYCLOAK-1796 Tabs on Keycloak identity provider shown twice
2015-09-04 08:59:16 +02:00
Stian Thorgersen 9f30a51925 KEYCLOAK-1796 Tabs on Keycloak identity provider shown twice 2015-09-04 08:32:00 +02:00
Stian Thorgersen a8b7129269 Merge pull request #1585 from stianst/master
KEYCLOAK-1793 Remove cancel button on login and login-totp
2015-09-04 08:19:27 +02:00
Stian Thorgersen 991b0e8ee2 Merge pull request #1586 from suchabar/bsuchano-branch
My first PR - addition of extra info to Readme file
2015-09-04 08:19:12 +02:00
Marek Posolda e9d1475475 Merge pull request #1588 from mposolda/master
KEYCLOAK-1795 Add just one clientAuthenticatorType per client
2015-09-04 00:35:25 +02:00
mposolda bc189554aa KEYCLOAK-1795 Add just one clientAuthenticatorType per client 2015-09-04 00:09:54 +02:00
suchabar d0f26ae4cf Edited Readme file 2015-09-03 20:46:34 +02:00
suchabar ab6d247ef1 Edited Readme file 2015-09-03 20:43:16 +02:00
Stian Thorgersen fcc82a47e4 KEYCLOAK-1793 Remove cancel button on login and login-totp 2015-09-03 20:21:56 +02:00
Marek Posolda 25e53db96f Merge pull request #1584 from mposolda/master
KEYCLOAK-1760 KEYCLOAK-1697 DB fixes
2015-09-03 12:23:31 +02:00
mposolda 89660d06e5 KEYCLOAK-1697 Fix UserProvider.searchForUsersByAttribute 2015-09-03 11:47:24 +02:00
mposolda 493fd0ad6a KEYCLOAK-1760 Fix DB issues when schema option defined 2015-09-03 11:47:24 +02:00
Stian Thorgersen 11422524f3 Merge pull request #1583 from stianst/master
KEYCLOAK-1497 Success message is not displayed when assigning roles
2015-09-03 09:29:24 +02:00
Stian Thorgersen 957214ed78 KEYCLOAK-1497 Success message is not displayed when assigning roles 2015-09-03 08:52:05 +02:00
Bill Burke f013cca3b8 Merge pull request #1582 from patriot1burke/master
KEYCLOAK-1792
2015-09-02 18:00:35 -04:00
Bill Burke a1cfc0a0ff KEYCLOAK-1792 2015-09-02 17:17:57 -04:00
Bill Burke e8b3b3acf3 Merge pull request #1581 from patriot1burke/master
client session required actions
2015-09-02 17:10:20 -04:00
Bill Burke 0cfb03be03 Merge remote-tracking branch 'upstream/master' 2015-09-02 16:30:35 -04:00
Bill Burke 7d4b93e01e client session required actions 2015-09-02 16:30:16 -04:00
Marek Posolda 2f3793805b Merge pull request #1579 from mposolda/master
MSSQL Fix
2015-09-02 16:59:36 +02:00
mposolda a310c13d32 MSSQL Fix 2015-09-02 16:25:38 +02:00
Stian Thorgersen 38a721425d Merge pull request #1578 from stianst/master
KEYCLOAK-1791 Exception on logout on EAP 6.4 overlay
2015-09-02 15:25:45 +02:00
Marek Posolda dfc34d99c5 Merge pull request #1577 from mposolda/master
KEYCLOAK-1789 KEYCLOAK-1759 Export/import fixes
2015-09-02 14:49:23 +02:00
Stian Thorgersen 6c58fd03a4 KEYCLOAK-1791 Exception on logout on EAP 6.4 overlay 2015-09-02 14:40:43 +02:00
mposolda 5b9d1286cc KEYCLOAK-1789 KEYCLOAK-1759 Export/import fixes 2015-09-02 12:03:16 +02:00
Stian Thorgersen d9e330802c Merge pull request #1576 from jean-merelis/master
aligning translation pt-br with master
2015-09-02 09:25:28 +02:00
Stian Thorgersen 085de8a069 Merge pull request #1571 from ssilvert/ng-upgrade-fix-conflicts
KEYCLOAK-1781: Upgrade AngularJS to version 1.4.4
2015-09-02 09:24:26 +02:00
jean 5af4c63a3e aligning translation pt-br with master 2015-09-01 13:53:01 -03:00
Stian Thorgersen 5177365c28 Merge pull request #1574 from stianst/master
Fix loading resources from theme
2015-09-01 14:06:18 +02:00
Marek Posolda 4df5ff3004 Merge pull request #1573 from mposolda/master
KEYCLOAK-1780 documentation + Generic client authentication screen
2015-09-01 13:58:04 +02:00
Stian Thorgersen 00f6841dc7 Fix loading resources from theme 2015-09-01 13:39:35 +02:00
mposolda be8394158f KEYCLOAK-1780 documentation + Generic client authentication screen 2015-09-01 13:17:14 +02:00
Bill Burke fbf62b2a63 Merge pull request #1572 from patriot1burke/master
more mappers
2015-08-31 20:48:55 -04:00
Bill Burke a047fb947b docs 2015-08-31 16:24:09 -04:00
Bill Burke eec3a3d5c3 more mappers 2015-08-31 16:23:17 -04:00
Stan Silvert 9387de1d1a KEYCLOAK-1781: Upgrade AngularJS to version 1.4.4 2015-08-31 15:09:55 -04:00
Bill Burke b9c90f128a Merge pull request #1570 from patriot1burke/master
KEYCLOAK-1726
2015-08-31 14:46:38 -04:00
Bill Burke 5699efc0f5 KEYCLOAK-1726 2015-08-31 14:46:14 -04:00
Bill Burke 6ead008bf4 Merge pull request #1569 from patriot1burke/master
KEYCLOAK-1721
2015-08-31 13:18:08 -04:00
Bill Burke 34e52839f7 KEYCLOAK-1721 2015-08-31 13:17:45 -04:00
Bill Burke bd54e1c60c Merge pull request #1568 from patriot1burke/master
docs
2015-08-31 10:55:25 -04:00
Bill Burke 03006522e2 docs 2015-08-31 10:54:57 -04:00
Bill Burke 7492ae2990 Merge pull request #1567 from patriot1burke/master
refactor recover password
2015-08-31 10:53:29 -04:00
Bill Burke 6edf890699 Merge pull request #1549 from ahus1/ahus1_jetty_contenttype
KEYCLOAK-1776 / JettySessionTokenStore sets content type on restoring form values
2015-08-31 10:34:16 -04:00
Bill Burke 43fd24f02b Merge remote-tracking branch 'upstream/master' 2015-08-31 10:13:55 -04:00
Bill Burke 22ebb81650 refactor recover password 2015-08-31 10:13:42 -04:00
Bill Burke fd074278f7 Merge pull request #1566 from bdecoste/master
KEYCLOAK-1783
2015-08-30 08:50:47 -04:00
William DeCoste ad497a66cd KEYCLOAK-1783 2015-08-29 08:57:04 -07:00
Bill Burke 41275b0e91 Merge pull request #1564 from patriot1burke/master
KEYCLOAK-1375
2015-08-27 14:56:53 -04:00
Bill Burke b82502af1d KEYCLOAK-1375 2015-08-27 14:15:47 -04:00
Bill Burke 43f2199d46 Merge pull request #1561 from velias/KEYCLOAK-1739
KEYCLOAK-1739 - correct handling of diacritics from http request in KeycloakServer
2015-08-27 09:06:42 -04:00
Bill Burke d44541fc9e Merge pull request #1560 from girirajsharma/master
[KEYCLOAK-1767] Clients table is unsorted
2015-08-27 09:06:05 -04:00
Bill Burke 24147a3d84 Merge pull request #1562 from velias/KEYCLOAK-1741
KEYCLOAK-1741 - Login form keeps "Username or email" field value after reshown due validation error
2015-08-27 09:05:40 -04:00
Vlastimil Elias 244d879d00 KEYCLOAK-1741 - Login form keeps "Username or email" field value after
reshown due validation error
2015-08-26 15:39:41 +02:00
Vlastimil Elias f5f67a629e KEYCLOAK-1739 - correct handling of diacritics from http request in
KeycloakServer
2015-08-26 14:58:37 +02:00
Alexander Schwartz aad1d57502 KEYCLOAK-1776 / check content type on form submit 2015-08-25 17:35:10 +02:00
giriraj sharma cf75c2378f [KEYCLOAK-1767] Clients table is unsorted 2015-08-23 21:03:06 +05:30
Bill Burke 3a64c4d582 Merge pull request #1543 from raehalme/KEYCLOAK-1775
KEYCLOAK-1775 Basic auth no longer redirects on Spring Security
2015-08-21 21:06:00 -04:00
Bill Burke d36376ffcd Merge pull request #1559 from patriot1burke/master
totp and profile refactor
2015-08-21 20:59:51 -04:00
Bill Burke 434197c10d Merge remote-tracking branch 'upstream/master' 2015-08-21 18:30:52 -04:00
Bill Burke d4af694c6f refactor profile and totp update 2015-08-21 18:30:39 -04:00
Bill Burke f245b67036 totp refactor 2015-08-21 17:53:26 -04:00
Bill Burke 945673c7da Merge pull request #1558 from patriot1burke/master
refactor update password
2015-08-21 17:27:42 -04:00
Bill Burke c25967bd61 fix 2015-08-21 17:01:29 -04:00
Bill Burke 165fba6b9c refactor update password 2015-08-21 15:17:01 -04:00
Marek Posolda 76209dd899 Merge pull request #1555 from mposolda/master
KEYCLOAK-1295 Fixes and javadoc
2015-08-21 20:41:21 +02:00
Bill Burke 8c8cc53989 Merge pull request #1556 from patriot1burke/master
document bypassing CORS
2015-08-21 13:26:44 -04:00
Bill Burke 6f463196ef Merge pull request #1554 from patriot1burke/master
adapter fixes
2015-08-21 13:21:02 -04:00
mposolda b0e2624343 KEYCLOAK-1295 Fixes and javadoc 2015-08-21 19:00:31 +02:00
Bill Burke 99fda3a7cb document bypassing CORS 2015-08-21 11:43:13 -04:00
Bill Burke 457039d7ba fix NPE in adapter for invalid cors requests 2015-08-21 11:29:38 -04:00
Bill Burke eb4ffbca29 co-existence of bearer and basic auth 2015-08-21 11:02:56 -04:00
Marek Posolda c9afe8fcc4 Merge pull request #1553 from mposolda/master
KEYCLOAK-1295 Adapter support. Fixes
2015-08-21 09:20:49 +02:00
mposolda d8d6348f67 KEYCLOAK-1295 Adapter support. Fixes 2015-08-21 08:26:12 +02:00
mposolda 87f7ec5909 KEYCLOAK-1561 LDAPDn.getParentDn() return value is not a DN 2015-08-21 08:26:12 +02:00
mposolda 18583eb6ed Fix mongo 2015-08-21 08:26:12 +02:00
Bill Burke b9d0219f04 Merge pull request #1552 from patriot1burke/master
change reset password
2015-08-20 18:52:07 -04:00
Bill Burke d9cb1fc4a9 Merge remote-tracking branch 'upstream/master' 2015-08-20 17:43:54 -04:00
Bill Burke 1654be0a85 change reset password 2015-08-20 17:43:37 -04:00
Stian Thorgersen d5944163d6 Merge pull request #1551 from stianst/master
KEYCLOAK-1761 Remove address from registration and account management
2015-08-20 17:19:47 +02:00
Stian Thorgersen 5ca3a48094 KEYCLOAK-1723 Allow aud to be single field or array 2015-08-20 15:55:52 +02:00
Stian Thorgersen 1fb3d7cd3b KEYCLOAK-1161
web.xml example in the doc is incorrect
2015-08-20 13:40:35 +02:00
Stian Thorgersen f827b2dc0d KEYCLOAK-1130
security-deployment vs. secure-deployment in the documentation
2015-08-20 13:37:50 +02:00
Stian Thorgersen 0295824923 KEYCLOAK-1747
Deal with time inconsistency in keycloak.js
2015-08-20 13:29:32 +02:00
Stian Thorgersen 8fee0c946b Merge pull request #1550 from mstruk/KEYCLOAK-1777
KEYCLOAK-1777 Column \"USERFEDERA0_.REALMENTITY_ID\" not found ...
2015-08-20 12:26:13 +02:00
Stian Thorgersen bd13b8a5fe KEYCLOAK-1761 Remove address from registration and account management
KEYCLOAK-1762 Add example theme that adds address fields to registration, account management and admin console
2015-08-20 12:25:26 +02:00
Stian Thorgersen 743ea95a78 Upgraded instructions to upgrade OpenShift cartridge 2015-08-19 15:56:44 +02:00
Marko Strukelj 2998a0fa35 KEYCLOAK-1777 Column \"USERFEDERA0_.REALMENTITY_ID\" not found on Wildfly 10.0.0.Beta1 2015-08-18 18:10:39 +02:00
Alexander Schwartz 7b0a3989e2 JettySessionTokenStore sets content type on restoring form values
Closes: KEYCLOAK-1776
2015-08-18 15:32:27 +02:00
Stian Thorgersen 06fcb7595a Merge pull request #1548 from stianst/master
Updated Docker hub release instructions
2015-08-18 15:21:53 +02:00
Stian Thorgersen bd3c4d4215 Updated Docker hub release instructions 2015-08-18 15:21:32 +02:00
Stian Thorgersen b969d9edfa Merge pull request #1547 from cainj13/master
add missing tag start type to sample jboss configuration in docbook
2015-08-18 14:46:38 +02:00
Josh Cain 3ef0fb63a9 add missing tag start type to sample jboss configuration in docbook 2015-08-18 08:43:28 -04:00
Stian Thorgersen bf706a9191 Merge pull request #1546 from stianst/master
Updated release process docs
2015-08-18 14:42:55 +02:00
Stian Thorgersen 26be615a80 Updated release process to include updating openshit cartridge and docker images 2015-08-18 14:10:13 +02:00
Stian Thorgersen 81928eb61a Updated release process docs 2015-08-18 13:48:21 +02:00
Marek Posolda 126f517520 Merge pull request #1545 from mposolda/master
KEYCLOAK-1295 pluggable client authentication. Support authenticate c…
2015-08-18 10:54:01 +02:00
mposolda 7028496601 KEYCLOAK-1295 pluggable client authentication. Support authenticate clients with signed JWT 2015-08-17 23:21:23 +02:00
Thomas Raehalme 3a4897c7d2 Separated the error message for Bearer token and Basic authentication failures. 2015-08-17 22:36:59 +03:00
Thomas Raehalme b3f142d715 KeycloakAuthenticationProcessingFilter now handles Basic Authentication the same way as Bearer token. 2015-08-17 18:05:49 +03:00
Stian Thorgersen a4e16ca9c7 Merge pull request #1540 from ssilvert/master
Fix typos in doc.
2015-08-17 10:09:19 +02:00
Bill Burke 57176dee75 Merge pull request #1542 from patriot1burke/master
oops, .info messages
2015-08-16 17:28:30 -04:00
Bill Burke f87ba8a3a9 oops, .info messages 2015-08-16 17:28:07 -04:00
Bill Burke 8c0b33f902 Merge pull request #1541 from patriot1burke/master
reset password refactor
2015-08-16 17:26:49 -04:00
Bill Burke 51e927adf7 Merge remote-tracking branch 'upstream/master' 2015-08-16 16:41:08 -04:00
Bill Burke bf4b681506 tests 2015-08-16 16:40:39 -04:00
Bill Burke 3c88d2cc18 finish refactor 2015-08-16 15:38:00 -04:00
Bill Burke c7b5975ac1 reset password refactor 2015-08-16 15:20:16 -04:00
Stan Silvert 09901997c1 Fix typos in doc. 2015-08-16 14:59:31 -04:00
Bill Burke c0f3d851db reset password refactor/flow 2015-08-16 12:23:15 -04:00
Bill Burke 98b6344f03 Merge pull request #1539 from patriot1burke/master
fix holes
2015-08-15 11:37:20 -04:00
Bill Burke e4b6e4c167 Merge pull request #1523 from velias/KEYCLOAK-1731
KEYCLOAK-1731 - patched user attribute handling for update profile action
2015-08-15 11:30:22 -04:00
Bill Burke d6983e829a Merge remote-tracking branch 'upstream/master' 2015-08-15 10:39:44 -04:00
Bill Burke 374a2ad957 fix holes 2015-08-15 10:39:33 -04:00
Bill Burke 52fd2d7e75 Merge pull request #1538 from patriot1burke/master
refactor auth-spi, auth demo, and docs
2015-08-14 15:14:00 -04:00
Bill Burke 25bb0ade1b Merge remote-tracking branch 'upstream/master' 2015-08-14 14:39:10 -04:00
Bill Burke 6d7be80930 refactor auth-spi, auth demo, and docs 2015-08-14 14:38:59 -04:00
Bill Burke 1f13f6372a register required action 2015-08-14 12:03:37 -04:00
Bill Burke 39fcd84d53 Merge pull request #1537 from patriot1burke/master
auth spi docs and refactor
2015-08-14 08:53:21 -04:00
Bill Burke d11a83d6e2 stuff 2015-08-13 15:32:58 -04:00
Bill Burke 1978e23cfd Merge pull request #1536 from patriot1burke/master
auth spi docs and refactor
2015-08-13 13:47:24 -04:00
Bill Burke 4cc1a774df Merge remote-tracking branch 'upstream/master' 2015-08-13 13:02:27 -04:00
Bill Burke 8a23463328 auth spi refactor and doco 2015-08-13 11:28:11 -04:00
Stian Thorgersen fad2913665 Merge pull request #1535 from stianst/master
Remove user session entities from persistence.xml
2015-08-13 13:38:59 +02:00
Stian Thorgersen c4c27973f3 Remove user session entities from persistence.xml 2015-08-13 10:33:18 +02:00
Stian Thorgersen 2ae733bd07 Merge pull request #1534 from stianst/master
KEYCLOAK-1703 Remove jpa and mongo user session providers
2015-08-13 10:32:25 +02:00
Stian Thorgersen 7665b9f81e KEYCLOAK-1703 Remove jpa and mongo user session providers 2015-08-13 08:57:37 +02:00
Stian Thorgersen 248322c748 Merge pull request #1533 from stianst/master
KEYCLOAK-1702 Removed mem and none realm and user cache
2015-08-13 08:24:13 +02:00
Bill Burke 523bdd5ec9 doco 2015-08-12 20:37:51 -04:00
Stian Thorgersen a8ad00156b KEYCLOAK-1702 Removed mem and none realm and user cache 2015-08-12 16:55:23 +02:00
Stian Thorgersen 8f820713fa Merge pull request #1530 from lkubik/multipleDependencyDeclaration
Remove multiple declaration of jboss-logging dependency
2015-08-12 13:00:54 +02:00
Stian Thorgersen fc7d4b072c Merge pull request #1526 from mstruk/WF10
KEYCLOAK-1745 Keycloak fails to start on Wildfly 10.0.0.Alpha6
2015-08-12 11:51:11 +02:00
Bill Burke 1801526f65 auth spi doco 2015-08-11 17:44:06 -04:00
Bill Burke 58e37b6a3f Merge pull request #1532 from patriot1burke/master
refactor requiredactions, start doco
2015-08-11 13:52:07 -04:00
Bill Burke 0bd9cad6ad Merge remote-tracking branch 'upstream/master' 2015-08-11 13:04:51 -04:00
Bill Burke bcc2c893ef refactor requiredactions, start doco 2015-08-11 13:04:40 -04:00
Lukas Kubik ac71bbd4b5 Remove multiple declaration of jboss-logging dependency from testsuit/tomcat6/pom.xml 2015-08-10 15:16:28 +02:00
Stian Thorgersen ae94b30066 Merge pull request #1529 from grange74/KEYCLOAK-1724
KEYCLOAK-1724: Removed second security-constraint as it stops Tomcat from redirecting to Keycloak
2015-08-10 15:11:01 +02:00
nick.grange b3c307affe Removed second security-constraint as it seems to stop Tomcat from
redirecting users that aren’t logged in to Keycloak. Also added missing
tag start.
2015-08-10 22:27:52 +10:00
Bill Burke 03d3f4229e Merge pull request #1528 from patriot1burke/master
auth spi javadoc
2015-08-09 15:51:55 -04:00
Bill Burke c627b83cc5 Merge remote-tracking branch 'upstream/master' 2015-08-09 15:06:37 -04:00
Bill Burke 5469db311d document auth spi 2015-08-09 15:06:24 -04:00
Bill Burke 75793a36cf Merge pull request #1527 from patriot1burke/master
binding custom flows
2015-08-07 21:26:46 -04:00
Bill Burke d68603e4ea Merge remote-tracking branch 'upstream/master' 2015-08-07 19:00:19 -04:00
Bill Burke 33e402e7be binding custom flows 2015-08-07 19:00:07 -04:00
Marko Strukelj 375dce14e6 KEYCLOAK-1745 Keycloak fails to start on Wildfly 10.0.0.Alpha6 2015-08-07 14:56:14 +02:00
Bill Burke 08ae3aee50 Merge pull request #1525 from patriot1burke/master
hotp and otp policy
2015-08-06 17:43:46 -04:00
Bill Burke 1ad7d4f1d8 Merge remote-tracking branch 'upstream/master' 2015-08-06 16:55:16 -04:00
Bill Burke f9e8f1f7b7 hotp 2015-08-06 16:54:59 -04:00
Marek Posolda fa0b45625c Merge pull request #1524 from mposolda/master
Minor clustering improvements
2015-08-06 18:05:40 +02:00
mposolda c5459b2614 Update docker-cluster to keycloak 1.4 2015-08-06 17:29:08 +02:00
mposolda 8232773d97 Log more details about possible error in UserInfoEndpoint 2015-08-06 17:28:35 +02:00
Bill Burke 53b752ccfe Merge remote-tracking branch 'upstream/master' 2015-08-05 20:40:02 -04:00
Bill Burke 07efba364e hotp 2015-08-05 20:39:47 -04:00
Vlastimil Elias 2e52d8ea7a KEYCLOAK-1731 - patched user attribute handling for
login-update-profile.ftl form. Relevant tests added. Tests for user
attributes handling from register.ftl also added.
2015-08-05 17:07:21 +02:00
Marek Posolda a46a7a42a1 Merge pull request #1522 from mposolda/master
Clustering docs and distribution fixes
2015-08-05 13:34:39 +02:00
mposolda 060a193b48 KEYCLOAK-1732 Fix standalone.xml in demo distribution 2015-08-05 13:33:11 +02:00
mposolda 06ee06ae50 Update clustering docs as infinispan is default provider now 2015-08-05 13:32:40 +02:00
Marek Posolda 17a5a9f033 Merge pull request #1521 from mposolda/master
KEYCLOAK-1595 Don't send 401 from AuthorizeClientUtil if public clien…
2015-08-04 16:01:17 +02:00
mposolda e27a754f5f KEYCLOAK-1595 Don't send 401 from AuthorizeClientUtil if public client sent client_id parameter together with Authorization: Negotiate 2015-08-04 15:22:03 +02:00
Bill Burke 61d5ba6a92 Merge pull request #1520 from patriot1burke/master
fix javascript flo bug
2015-08-04 09:04:18 -04:00
Bill Burke eff0054b4a fix bug 2015-08-04 09:03:49 -04:00
Marek Posolda 99cd6c7383 Merge pull request #1519 from mposolda/master
LDAP & migration fixes
2015-08-04 14:14:56 +02:00
mposolda 5087392162 KEYCLOAK-1725 Fix migration from 1.1.0.Final on Oracle 2015-08-04 13:21:09 +02:00
mposolda 7474a31d95 KEYCLOAK-1562 better error reporting when missing UUID on ldap user record 2015-08-04 13:21:09 +02:00
mposolda a0197bc9da KEYCLOAK-1728 NPE during LDAP sync when some LDAP user doesn't have username 2015-08-04 13:21:09 +02:00
Bill Burke 3b2e679aed Merge pull request #1518 from patriot1burke/master
auth flow editing
2015-08-03 19:26:11 -04:00
Bill Burke 75d69a1ec1 Merge pull request #1516 from pfiled/proxy-header-inject-bug
Populate the KEYCLOAK_USERNAME header
2015-08-03 18:59:32 -04:00
Bill Burke 930fc66ebf flow editing 2015-08-03 18:58:14 -04:00
Bill Burke 04d3d26cb1 refactor execution model 2015-08-03 09:52:56 -04:00
Bill Burke de940ccff9 auth flow editing 2015-08-02 19:03:33 -04:00
Daniel Pfile aedc54cc89 Populate the KEYCLOAK_USERNAME header, this fixes the authenticate and roles-allowed constraints in the proxy. 2015-07-30 16:24:16 -05:00
Stian Thorgersen de3a776b9a Merge pull request #1515 from stianst/master
KEYCLOAK-1702 KEYCLOAK-1703 Make Infinispan default user session and …
2015-07-29 13:07:09 +02:00
Stian Thorgersen 5d6cc61d4d KEYCLOAK-1702 KEYCLOAK-1703 Remove mem user session provider 2015-07-29 12:02:27 +02:00
Stian Thorgersen f32b38cdbc KEYCLOAK-1702 KEYCLOAK-1703 Make Infinispan default user session and cache provider 2015-07-29 10:08:15 +02:00
Stian Thorgersen f3bfb06dec Version bump 2015-07-28 10:20:40 +02:00
Stian Thorgersen 630597746e Merge pull request #1514 from stianst/master
KEYCLOAK-1714 Add @JsonIgnoreProperties(ignoreUnknown = true) to JWSH…
2015-07-28 10:15:09 +02:00
Stian Thorgersen f98036296c KEYCLOAK-1716 NPE importing with empty database 2015-07-28 09:46:03 +02:00
Stian Thorgersen bf1f867f23 KEYCLOAK-1715 Cordova example doesn't work on Cordova 5.x 2015-07-28 08:36:01 +02:00
Stian Thorgersen 8215a85930 KEYCLOAK-1549
Migration for multiple attributes and LDAP mappers
2015-07-28 07:46:29 +02:00
Stian Thorgersen 10a5686955 KEYCLOAK-1714 Add @JsonIgnoreProperties(ignoreUnknown = true) to JWSHeader 2015-07-28 07:30:10 +02:00
Bill Burke 2e3c7a3acf Merge pull request #1512 from patriot1burke/master
canonicalization config
2015-07-27 15:33:27 -04:00
Bill Burke 06713da67b Merge remote-tracking branch 'upstream/master' 2015-07-27 11:57:21 -04:00
Bill Burke 46fb1b6582 canonicalization config 2015-07-27 11:57:08 -04:00
Stian Thorgersen 1b3f98db1e Merge pull request #1511 from stianst/master
UserInfo fix
2015-07-27 17:01:41 +02:00
Stian Thorgersen a190cdd8f2 KEYCLOAK-1712 Admin client example not working 2015-07-27 16:01:48 +02:00
Stian Thorgersen 8e25369001 KEYCLOAK-1711 Add get user info to js-console example 2015-07-27 15:43:52 +02:00
Stian Thorgersen 8d90ad816a KEYCLOAK-1710 UserInfoEndpoint throws NPE if user session is not found 2015-07-27 15:43:52 +02:00
Stian Thorgersen da9e42cb21 Merge pull request #1510 from stianst/master
KEYCLOAK-1709 Add standalone-keycloak-ha.xml to server overlays
2015-07-27 14:32:00 +02:00
Stian Thorgersen cbab3ff0d0 KEYCLOAK-1709 Add standalone-keycloak-ha.xml to server overlays 2015-07-27 14:31:40 +02:00
Stian Thorgersen 210b570c89 Merge pull request #1509 from stianst/master
Admin console fixes
2015-07-27 13:31:16 +02:00
Stian Thorgersen a2203df6a3 KEYCLOAK-1705 Logo not changed in admin console for logo example theme 2015-07-27 13:30:55 +02:00
Stian Thorgersen 6a2b369014 KEYCLOAK-1707 Can't export SAML keys 2015-07-27 13:00:22 +02:00
Stian Thorgersen fda6a6657f KEYCLOAK-1708 Authentication flows uses h2 in table 2015-07-27 12:32:55 +02:00
Stian Thorgersen 04565dad00 KEYCLOAK-1706 Service Account tab for clients displays title twice 2015-07-27 12:30:06 +02:00
Stian Thorgersen ac0ae06463 Merge pull request #1508 from stianst/master
KEYCLOAK-1694 Null Client Exception on OAuth Grant Page
2015-07-27 11:43:13 +02:00
Stian Thorgersen a8775f757f KEYCLOAK-1694 Null Client Exception on OAuth Grant Page 2015-07-27 09:59:50 +02:00
Stian Thorgersen e4f4ed923d Merge pull request #1507 from stianst/master
KEYCLOAK-1699 There are 3 failed tests when running testsuite with -P…
2015-07-27 09:57:52 +02:00
Stian Thorgersen c7915fa95d KEYCLOAK-1699 There are 3 failed tests when running testsuite with -Pinfinispan 2015-07-27 08:52:00 +02:00
Bill Burke 652b118634 Merge pull request #1506 from patriot1burke/master
timeout message
2015-07-25 15:27:51 -04:00
Bill Burke f122ff1471 Merge pull request #1505 from patriot1burke/master
login timeouts, verify email
2015-07-25 12:43:53 -04:00
Bill Burke f76b90fab9 timeout message 2015-07-25 12:43:46 -04:00
Bill Burke ccd8beae92 Merge remote-tracking branch 'upstream/master' 2015-07-25 12:16:05 -04:00
Bill Burke 33f01009d2 login timeouts, verify email 2015-07-25 12:13:41 -04:00
mposolda a0e3a71109 Fix infinispan - not finished 2015-07-25 12:05:16 +02:00
mposolda f35ecba801 Sybase - another attempt 2015-07-25 11:47:56 +02:00
Marek Posolda 0d7f26bd14 Merge pull request #1504 from mposolda/master
Migration
2015-07-25 11:36:04 +02:00
mposolda 2f7bdd2640 Fix migration version comparing bug 2015-07-25 09:00:50 +02:00
mposolda 3125e4ddd2 KEYCLOAK-1549 Mongo migration 2015-07-25 08:58:05 +02:00
Marek Posolda c624cb27da Merge pull request #1503 from mposolda/master
KEYCLOAK-1549 Migration for attributes and LDAP mappers - JPA
2015-07-24 23:29:28 +02:00
mposolda 06adf9a094 Sybase fix 2015-07-24 23:28:52 +02:00
mposolda 94ed55ee35 KEYCLOAK-1549 Migration for attributes and LDAP mappers - JPA 2015-07-24 23:09:48 +02:00
Marek Posolda 95c8603b69 Merge pull request #1502 from cwalker67/master
Added null email check in duplicate email check code
2015-07-24 23:04:46 +02:00
Charles Walker 9ad2a8272e quick return check for null email address, in reference to duplicate email check issue #1510 2015-07-24 16:08:26 -04:00
Charles Walker 6dc17da00a Merge pull request #1 from keycloak/master
merge updates
2015-07-24 15:55:34 -04:00
Marek Posolda 97aa1c6b2c Merge pull request #1501 from mposolda/master
Temporarily comment the test failing on Oracle and MSSQL as the funct…
2015-07-24 21:50:35 +02:00
mposolda 084fed8377 Temporarily comment the test failing on Oracle and MSSQL as the functionality is not used right now 2015-07-24 21:49:51 +02:00
Marek Posolda 68d86e4fa1 Merge pull request #1500 from mposolda/master
Fix JPA UserSession provider and MySQL
2015-07-24 20:46:46 +02:00
mposolda 5203373047 Fix JPA UserSession provider and MySQL 2015-07-24 20:39:39 +02:00
Stian Thorgersen 86de481ba1 Merge pull request #1499 from stianst/master
KEYCLOAK-1542
2015-07-24 17:30:29 +02:00
Stian Thorgersen 5d075a97dd Fixes to server-info 2015-07-24 16:45:58 +02:00
Stian Thorgersen e89499f5db Fix xmlns for modules in feature packs 2015-07-24 16:45:27 +02:00
Stian Thorgersen a1f0208767 Merge branch 'velias-KEYCLOAK-1542' 2015-07-24 14:48:10 +02:00
Stian Thorgersen d1964c20ab Refactored server-info and updated admin console 2015-07-24 14:47:37 +02:00
Marek Posolda 1e035bf2e5 Merge pull request #1498 from mposolda/master
Skip testDotInUsername for the MSAD configuration with sAMAccountName…
2015-07-24 13:03:24 +02:00
mposolda f3b87f9cf9 Skip testDotInUsername for the MSAD configuration with sAMAccountName as username 2015-07-24 13:01:54 +02:00
Stian Thorgersen d2ea45e1eb Merge pull request #1496 from stianst/master
KEYCLOAK-1691 and KEYCLOAK-1695
2015-07-24 12:52:19 +02:00
Marek Posolda 58ad6b1a40 Merge pull request #1497 from mposolda/master
Mongo model fix
2015-07-24 12:47:47 +02:00
mposolda 772ef3cd10 Mongo model fix 2015-07-24 12:46:47 +02:00
Stian Thorgersen 204dfd52c8 Merge branch 'KEYCLOAK-1542' of https://github.com/velias/keycloak into velias-KEYCLOAK-1542 2015-07-24 12:17:33 +02:00
Vlastimil Elias 244d3452d0 KEYCLOAK-1542 - removed unused code from the page template 2015-07-24 11:07:01 +02:00
Stian Thorgersen e65f8a7150 KEYCLOAK-1695 Upgrade to WildFly 9.0.1.Final 2015-07-24 10:44:15 +02:00
Stian Thorgersen 90d6991b9d KEYCLOAK-1691 Enable adapter subsystem to use with WildFly Swarm 2015-07-24 10:16:25 +02:00
Stian Thorgersen 87ca3f203a Merge pull request #1488 from stianst/master
KEYCLOAK-1506 Warning of Keycloak 1.3.1 on MySQL 5.6
2015-07-24 09:58:02 +02:00
Marek Posolda 3f3a20e178 Merge pull request #1494 from mposolda/master
KEYCLOAK-1693 Added test and possibility to create users with dot in …
2015-07-24 09:57:55 +02:00
mposolda ce1a19fdbe KEYCLOAK-1693 Added test and possibility to create users with dot in username 2015-07-24 09:33:16 +02:00
Marek Posolda 26ac92a6b1 Merge pull request #1493 from dylanplecki/issue-1693
KEYCLOAK-1693 LDAP DN parse error on escaped characters
2015-07-24 09:07:06 +02:00
Marek Posolda 1c7dd0a533 Merge pull request #1492 from mposolda/master
Simplify embedded server bootstrap in LDAP and Kerberos examples
2015-07-23 22:13:22 +02:00
Dylan Plecki ceb29d76b2 Fix regression in RegEx statements 2015-07-23 14:49:03 -05:00
Dylan Plecki 6efb354cce Fix LDAP DN component matching with negative lookbehind RegEx 2015-07-23 14:48:56 -05:00
Dylan Plecki 8ae242a6ed Fix LDAP RDN resolution based on unescaped comma split 2015-07-23 14:48:48 -05:00
mposolda 5f0f92fd15 Fix test to pass with MSAD 2015-07-23 21:39:40 +02:00
mposolda e521fa3554 Simplify embedded server bootstrap in LDAP and Kerberos examples 2015-07-23 21:17:40 +02:00
Marek Posolda b8f73cf21f Merge pull request #1491 from mposolda/master
Fix MSAD and OpenLDAP
2015-07-23 18:32:32 +02:00
mposolda d068cddbaf Fix MSAD and OpenLDAP 2015-07-23 18:03:12 +02:00
Bill Burke 99422835ab Merge pull request #1489 from patriot1burke/master
fix typo
2015-07-23 11:09:31 -04:00
Bill Burke 68263360c7 fix typo 2015-07-23 11:09:07 -04:00
Vlastimil Elias 34f5ddab0f Merge branch 'KEYCLOAK-1542' of https://github.com/velias/keycloak.git into KEYCLOAK-1542 2015-07-23 16:49:11 +02:00
Stian Thorgersen 0cc4630fc6 KEYCLOAK-1506 Warning of Keycloak 1.3.1 on MySQL 5.6 2015-07-23 16:46:06 +02:00
Vlastimil Elias ee57c79784 KEYCLOAK-1542 - rewrote showing info from providers to be generic 2015-07-23 16:40:57 +02:00
Vlastimil Elias 7e41b8df27 KEYCLOAK-1542 - code formatting cleanup 2015-07-23 16:40:56 +02:00
Vlastimil Elias 79c1d7bafa KEYCLOAK-1542 - code cleanup ahead of PR 2015-07-23 16:40:55 +02:00
Vlastimil Elias 652b2fee86 KEYCLOAK-1542 - Server Info page extended by info about DB and MongoDB.
Functional test for /serverinfo REST endpoint added.
2015-07-23 16:40:54 +02:00
Vlastimil Elias dfb871c26a KEYCLOAK-1542 - added system and memory info into "System Info" page 2015-07-23 16:40:53 +02:00
Vlastimil Elias 99f74acb94 KEYCLOAK-1542 - rewrote showing info from providers to be generic 2015-07-23 16:39:27 +02:00
Stian Thorgersen 83f7682606 Merge pull request #1487 from stianst/master
KEYCLOAK-1463
2015-07-23 15:53:50 +02:00
Stian Thorgersen c4a07f3098 KEYCLOAK-1463
Need better UI for Terms and Conditions
2015-07-23 14:35:57 +02:00
Stian Thorgersen c9451f4f35 Merge pull request #1486 from stianst/master
KEYCLOAK-1593 Move impersonate button on user details page
2015-07-23 14:24:49 +02:00
Stian Thorgersen dff4922783 KEYCLOAK-1593 Move impersonate button on user details page 2015-07-23 14:24:19 +02:00
Stian Thorgersen c05b666f3c Merge pull request #1483 from stianst/master
KEYCLOAK-1591 Issues with token settings page
2015-07-23 13:26:38 +02:00
Marek Posolda 9905024f08 Merge pull request #1485 from mposolda/service-acc
KEYCLOAK-401 Service account docs
2015-07-23 12:19:06 +02:00
mposolda b0cb457287 KEYCLOAK-401 Service account docs 2015-07-23 12:18:09 +02:00
Marek Posolda d4946c1c08 Merge pull request #1484 from mposolda/service-acc
KEYCLOAK-401 Service account refactoring and fixes
2015-07-23 12:09:33 +02:00
Stian Thorgersen 1d745b5cbd KEYCLOAK-1443 Add delete action to tables 2015-07-23 12:07:31 +02:00
mposolda c99785f266 KEYCLOAK-401 Service account refactoring and fixes 2015-07-23 11:29:52 +02:00
Stian Thorgersen 9ecdec3f45 KEYCLOAK-1591 Issues with token settings page 2015-07-23 11:23:53 +02:00
Stian Thorgersen 866f45bd95 Merge pull request #1479 from stianst/master
KEYCLOAK-1588 Strange version of slf4j not available in maven central
2015-07-23 09:17:21 +02:00
Bill Burke 320a79dbff Merge pull request #1482 from patriot1burke/master
better description
2015-07-22 14:47:16 -04:00
Bill Burke 1e0b6f1aad better description 2015-07-22 14:46:58 -04:00
Bill Burke 251ad6727a Merge pull request #1481 from patriot1burke/master
brute force fixes and enhancements
2015-07-22 14:46:29 -04:00
Bill Burke 1b1f56d183 ugh 2015-07-22 14:22:41 -04:00
Bill Burke 7dc05a45ac conflict 2015-07-22 14:20:52 -04:00
Bill Burke 7257bab289 brute force user ui 2015-07-22 14:16:09 -04:00
Bill Burke 48a76c2d0d test brute force 2015-07-22 12:30:52 -04:00
Stian Thorgersen d78c83b236 KEYCLOAK-1588 Strange version of slf4j not available in maven central 2015-07-22 16:27:34 +02:00
Bill Burke d9b0415047 brute force fixes, code cleanup, tests 2015-07-22 09:40:11 -04:00
Stian Thorgersen af2e3de96d Merge pull request #1474 from stianst/master
KEYCLOAK-1427
2015-07-22 14:30:45 +02:00
Vlastimil Elias 1c142cb170 KEYCLOAK-1542 - code formatting cleanup 2015-07-22 14:28:08 +02:00
Stian Thorgersen d5dae7d444 KEYCLOAK-1428 Disable buttons on forms instead of hiding 2015-07-22 14:05:47 +02:00
Vlastimil Elias 85816be967 KEYCLOAK-1542 - code cleanup ahead of PR 2015-07-22 13:35:56 +02:00
Stian Thorgersen e66d658955 KEYCLOAK-1428 Disable buttons on forms instead of hiding 2015-07-22 11:50:24 +02:00
Stian Thorgersen 1916fded95 Fix location of buttons on password-policy form 2015-07-22 11:50:23 +02:00
Stian Thorgersen 8cc8f4c49c Fix tests 2015-07-22 11:50:23 +02:00
Stian Thorgersen 1a3bf16729 KEYCLOAK-1434 Change edit action to buttons to make sure styles are correct 2015-07-22 11:50:23 +02:00
Stian Thorgersen 5304b533fc KEYCLOAK-1434 Add edit action to tables 2015-07-22 11:50:23 +02:00
Stian Thorgersen 0156d47d97 KEYCLOAK-1535 Set tooltip-placement correctly 2015-07-22 11:50:23 +02:00
Stian Thorgersen b04ac6cdba KEYCLOAK-1427 Add remove user button to all user tabs 2015-07-22 11:50:23 +02:00
Stian Thorgersen f43e4200da Removed title on password policy page 2015-07-22 11:50:23 +02:00
Stian Thorgersen 2ba7aef2b1 KEYCLOAK-1427 Add remove user federation button to all user federation tabs 2015-07-22 11:50:23 +02:00
Stian Thorgersen 7a1932cab4 KEYCLOAK-1427 Add remove identity provider button to all identity provider tabs 2015-07-22 11:50:23 +02:00
Stian Thorgersen 59f189229c KEYCLOAK-1427 Add remove client button to all client tabs 2015-07-22 11:50:23 +02:00
Stian Thorgersen 29af7a1d29 KEYCLOAK-1427 Added delete realm button to all realm settings tabs 2015-07-22 11:49:39 +02:00
Marek Posolda 3d9ddc53e6 Merge pull request #1477 from mposolda/service-acc
KEYCLOAK-401 Service accounts initial impl. Client credentials grant support. Demo
2015-07-22 11:37:55 +02:00
mposolda 1a34feda65 KEYCLOAK-401 Added service account demo 2015-07-22 11:07:57 +02:00
mposolda d8c1081578 KEYCLOAK-401 KEYCLOAK-941 Service accounts initial impl. Client credentials grant support 2015-07-22 10:55:50 +02:00
Bill Burke 1085a1da62 Merge pull request #1476 from patriot1burke/master
non-browser flow
2015-07-21 23:15:51 -04:00
Bill Burke 576db8e0e1 Merge remote-tracking branch 'upstream/master' 2015-07-21 20:56:22 -04:00
Bill Burke fe9dc4a28d non-browser flow 2015-07-21 20:56:05 -04:00
Stian Thorgersen d2aaae2340 Merge pull request #1475 from mstruk/KEYCLOAK-1496
KEYCLOAK-1496 Effective roles select element is not updated when addi…
2015-07-21 19:03:44 +02:00
Vlastimil Elias 84e40cbc2c KEYCLOAK-1542 - Server Info page extended by info about DB and MongoDB.
Functional test for /serverinfo REST endpoint added.
2015-07-21 16:09:47 +02:00
Marko Strukelj 42672a9ae2 KEYCLOAK-1496 Effective roles select element is not updated when adding composite client role 2015-07-21 15:59:21 +02:00
Stian Thorgersen 2dd2173553 Merge pull request #1473 from mstruk/KEYCLOAK-1560
KEYCLOAK-1560 IDENTITY_PROVIDER_LOGIN event is send twice
2015-07-21 10:28:32 +02:00
Marko Strukelj fcd5400cda KEYCLOAK-1560 IDENTITY_PROVIDER_LOGIN event is send twice 2015-07-21 09:49:37 +02:00
Marek Posolda 23b69bb7a7 Merge pull request #1467 from mposolda/master
LDAP and case-sensitivity fixes
2015-07-21 08:58:07 +02:00
mposolda c31b0945d8 Kerberos example README 2015-07-21 08:26:16 +02:00
mposolda c71a4ac4e8 KEYCLOAK-1545 KEYCLOAK-1551 Ensure that username and email are always saved to DB lowercased 2015-07-21 08:26:16 +02:00
mposolda 38c7ca64cb KEYCLOAK-1571 Error when the value of UUID LDAP attribute is the same of the Username LDAP attribute 2015-07-21 08:26:16 +02:00
Bill Burke bc187fe7b3 Merge pull request #1472 from patriot1burke/master
clean up client sessions
2015-07-20 19:17:31 -04:00
Bill Burke 548c0db0ae Merge remote-tracking branch 'upstream/master' 2015-07-20 12:21:57 -04:00
Bill Burke 3ecd1307b0 clean up client sessions 2015-07-20 12:21:48 -04:00
Vlastimil Elias b51661b790 KEYCLOAK-1542 - added system and memory info into "System Info" page 2015-07-20 17:11:04 +02:00
Stian Thorgersen 02d6e41ce3 Merge pull request #1471 from stianst/master
KEYCLOAK-1576
2015-07-20 15:21:51 +02:00
Stian Thorgersen f884aed25e KEYCLOAK-1576 2015-07-20 13:35:56 +02:00
Stian Thorgersen f2dee1a470 Add support for multi-part to MailServer util 2015-07-20 13:35:33 +02:00
Stian Thorgersen d5d806760f Merge branch 'ssilvert-KEYCLOAK-1414-cli-script-adapters' 2015-07-20 13:11:10 +02:00
Stian Thorgersen efe2a8f789 Merge branch 'KEYCLOAK-1414-cli-script-adapters' of https://github.com/ssilvert/keycloak into ssilvert-KEYCLOAK-1414-cli-script-adapters
Conflicts:
	docbook/reference/en/en-US/modules/jboss-adapter.xml
2015-07-20 13:10:51 +02:00
Stian Thorgersen 69bbed999f Merge pull request #1466 from ssilvert/KEYCLOAK-1415-server-cli-script
KEYCLOAK-1415 server cli script
2015-07-20 13:08:13 +02:00
Stian Thorgersen 5b7d4184f0 Merge pull request #1470 from stianst/master
Enabled testsuite/integration-arquillian on Travis
2015-07-20 11:52:13 +02:00
Stian Thorgersen 422b7ed5ef Enabled testsuite/integration-arquillian on Travis 2015-07-20 10:39:08 +02:00
Stian Thorgersen 66a2b916f2 Fix CRLF with LF 2015-07-20 07:48:02 +02:00
Stian Thorgersen 27ac253098 Merge pull request #1469 from Smartling/KEYCLOAK-1494-Fix
Support loading keycloak.json from the classpath
2015-07-20 06:48:14 +02:00
Scott Rossillo 1839b24b90 Support for loading keycloak.json from the classpath
Spring Boot and non-web based applications don't have a WEB-INF
directory. Support loading Spring Security adapter's keycloak.json
from the class path.
2015-07-19 12:10:33 -04:00
Bill Burke a60ebb6210 Merge pull request #1468 from patriot1burke/master
required action import/export
2015-07-18 09:06:39 -04:00
Bill Burke 4dba4f3c02 fix 2015-07-17 23:07:36 -04:00
Bill Burke 6727af2f35 required action import/export 2015-07-17 22:48:07 -04:00
Stan Silvert 5bcf334bc5 Don't add security-domain to server. 2015-07-17 12:48:32 -04:00
Stan Silvert ef49bd685e KEYCLOAK-1415 Add CLI scripts to WildFly and EAP overlay bundles. 2015-07-17 12:34:20 -04:00
Stan Silvert 092562fb94 KEYCLOAK-1414 Add CLI script for installing JBoss/WildFly/EAP adapters. 2015-07-17 12:23:10 -04:00
Bill Burke 44e2983803 Merge pull request #1462 from patriot1burke/master
migrate RequiredCredentials
2015-07-17 10:28:21 -04:00
Bill Burke 2e848da1a8 resolve conflicts 2015-07-17 09:45:53 -04:00
Stian Thorgersen 22ae4ecb23 Merge pull request #1464 from stianst/master
KEYCLOAK-1385 Introduce end-of-line normalization
2015-07-17 14:04:59 +02:00
Stian Thorgersen 1642ac2394 KEYCLOAK-1385 Introduce end-of-line normalization 2015-07-17 13:46:51 +02:00
Stian Thorgersen be8aa93cca Merge pull request #1463 from mstruk/remove-war
KEYCLOAK-1345 Remove distribution/subsystem-war
2015-07-17 13:26:34 +02:00
Marko Strukelj fc7ba85639 KEYCLOAK-1345 Remove distribution/subsystem-war 2015-07-17 12:41:00 +02:00
Stian Thorgersen 11d1dd6419 KEYCLOAK-1470 2015-07-17 11:46:02 +02:00
Stian Thorgersen e8bd7270e9 KEYCLOAK-1483 2015-07-17 11:22:04 +02:00
Stian Thorgersen 99e2afa81b KEYCLOAK-1498 2015-07-17 10:54:43 +02:00
Stian Thorgersen 676792d07d KEYCLOAK-1475 2015-07-17 10:33:18 +02:00
Stian Thorgersen 0bec2bcd1e KEYCLOAK-1504 2015-07-17 10:21:15 +02:00
Stian Thorgersen 25328048aa KEYCLOAK-1566 2015-07-17 10:09:28 +02:00
Bill Burke e51d2137cf migrate RequiredCredentials 2015-07-16 22:03:12 -04:00
Bill Burke 5695677873 Merge pull request #1458 from patriot1burke/master
idp initiated relaystate query param
2015-07-16 10:34:12 -04:00
Stian Thorgersen 9d86f582ac Merge branch 'girirajsharma-master' 2015-07-16 16:32:25 +02:00
Stian Thorgersen 97b0558f71 Merge branch 'master' of https://github.com/girirajsharma/keycloak into girirajsharma-master
Conflicts:
	forms/common-themes/src/main/resources/theme/base/admin/resources/partials/client-detail.html
	forms/common-themes/src/main/resources/theme/base/admin/resources/partials/role-detail.html
	forms/common-themes/src/main/resources/theme/base/admin/resources/partials/user-detail.html
2015-07-16 16:31:16 +02:00
Bill Burke e825be1c79 nonce in tokens 2015-07-16 10:17:44 -04:00
Stian Thorgersen 88252c3dfc Merge pull request #1457 from mstruk/keycloak-prod
KEYCLOAK-1331 Add product.conf and product module
2015-07-16 16:11:44 +02:00
Stian Thorgersen 02997b593f Merge pull request #1459 from stianst/master
Some fixes to integration-arquillian
2015-07-16 16:10:37 +02:00
giriraj sharma 9de81a0b14 Updated patternfly delete glyphicon css. 2015-07-16 18:28:56 +05:30
giriraj sharma ab13182091 [Keycloak-1427] Updated Delete icons with 'pointer' as hovering cursor. 2015-07-16 18:26:58 +05:30
Stian Thorgersen e75e4580ae Some fixes to integration-arquillian
Conflicts:
	testsuite/integration-arquillian/pom.xml
2015-07-16 14:49:38 +02:00
Bill Burke b7f031d199 Merge remote-tracking branch 'upstream/master' 2015-07-16 08:49:23 -04:00
Bill Burke 808d27be2d idp initiated relaystate query param 2015-07-16 08:48:07 -04:00
Marko Strukelj dcf8751ff7 KEYCLOAK-1331 Add product.conf and product module 2015-07-16 14:16:10 +02:00
Bill Burke ec6e3d80ee Merge pull request #1456 from patriot1burke/master
SAML IDP Initiated Login
2015-07-15 20:35:01 -04:00
Bill Burke 5a9badf683 relay state 2015-07-15 20:22:30 -04:00
Bill Burke dd11dcef93 docs 2015-07-15 20:18:14 -04:00
Bill Burke e9851957f0 Merge remote-tracking branch 'upstream/master' 2015-07-15 20:09:13 -04:00
Bill Burke 57cfbb3770 SAML IDP Initiated login 2015-07-15 20:08:55 -04:00
Bill Burke da2590819d Merge pull request #1455 from patriot1burke/master
export/import flows
2015-07-15 15:08:09 -04:00
Bill Burke d74d93a522 fix problems 2015-07-15 14:54:14 -04:00
Bill Burke b3eadcc990 Merge remote-tracking branch 'upstream/master' 2015-07-15 14:17:54 -04:00
Bill Burke f4d4405c20 export/import flows 2015-07-15 14:17:23 -04:00
Stian Thorgersen 1ebec0e2e5 Merge pull request #1454 from brmeyer/KEYCLOAK-1563
KEYCLOAK-1563 update docs for server/adapter subsystem split & WF 9.0…
2015-07-15 09:37:00 +02:00
Brett Meyer 4433347ff3 KEYCLOAK-1563 update docs for server/adapter subsystem split & WF 9.0.0.Final 2015-07-14 15:55:14 -04:00
Stian Thorgersen 08c539ba51 Merge pull request #1452 from stianst/master
KEYCLOAK-1530 Ability to specify default database schema
2015-07-14 15:21:08 +02:00
Stian Thorgersen 4e538dd138 KEYCLOAK-1530 Ability to specify default database schema 2015-07-14 14:34:04 +02:00
Stian Thorgersen 66373ccab2 Merge pull request #1451 from stianst/master
KEYCLOAK-1426 and KEYCLOAK-1565
2015-07-14 12:12:06 +02:00
Stian Thorgersen 9c82c0700d Merge pull request #1425 from girirajsharma/master
[KEYCLOAK-1430] Buttons in form headers should not be primary buttons
2015-07-14 12:04:45 +02:00
Stian Thorgersen a480e50c16 KEYCLOAK-1426 Updated icons in menu 2015-07-14 11:53:02 +02:00
Stian Thorgersen 4391bf4f70 KEYCLOAK-1565 Updated to PatternFly 1.3.0 2015-07-14 11:52:58 +02:00
Stian Thorgersen 18f46cb527 Merge pull request #1450 from stianst/master
KEYCLOAK-1426
2015-07-14 11:32:19 +02:00
Stian Thorgersen 32b89adc04 Wire up new menu 2015-07-14 11:19:44 +02:00
Stian Thorgersen 5a213fcad9 Merge branch 'KEYCLOAK-1426' of https://github.com/andresgalante/keycloak 2015-07-14 10:09:34 +02:00
Stian Thorgersen d6f1d1bb3c Merge pull request #1449 from gtudan/KEYCLOAK-1564
KEYCLOAK-1564: Add CORS-Headers to token requests by password credentials
2015-07-14 09:10:22 +02:00
Gregor Tudan c8c0d0e804 KEYCLOAK-1564: Add CORS-Headers to token requests by password credentials 2015-07-14 08:22:08 +02:00
Stian Thorgersen aeddf2a860 Merge pull request #1448 from ssilvert/KEYCLOAK-1547-infinispan-session-timeout
Keycloak 1547 infinispan session timeout
2015-07-13 19:13:59 +02:00
giriraj sharma b876a5f7bd [KEYCLOAK-1430] Buttons in form headers should not be primary buttons 2015-07-13 22:41:54 +05:30
Stan Silvert af8949c291 Change to make removeUserSession() a protected method. 2015-07-13 11:21:35 -04:00
Stian Thorgersen e3da38df7c KEYCLOAK-1538 Deploy server feature pack to maven repo 2015-07-13 16:47:58 +02:00
Stian Thorgersen a16079e38d Remove unused feature-packs-builds 2015-07-13 14:08:25 +02:00
Stian Thorgersen e13b0fac63 Merge pull request #1447 from mstruk/KEYCLOAK-1370
KEYCLOAK-1370 Empty module de.idyl.winzipaes in keycloak-server-dist
2015-07-13 13:05:12 +02:00
Marko Strukelj 26190350c4 KEYCLOAK-1370 Empty module de.idyl.winzipaes in keycloak-server-dist 2015-07-13 12:42:06 +02:00
Bill Burke 7598cc62d3 Merge pull request #1446 from patriot1burke/master
test impersonation
2015-07-12 10:40:43 -04:00
Bill Burke b3211fa8c2 tooltip 2015-07-12 10:24:15 -04:00
Bill Burke 8dcc909b6e Merge remote-tracking branch 'upstream/master' 2015-07-12 10:12:31 -04:00
Bill Burke fafaf2c490 test impersonate 2015-07-12 10:12:19 -04:00
Marek Posolda 11e2f19503 Merge pull request #1444 from mposolda/master
Use kc-provider-config in LDAP mappers
2015-07-11 23:29:00 +02:00
mposolda d67bd0eff2 Use kc-provider-config in LDAP mappers 2015-07-11 23:11:01 +02:00
Marek Posolda 43bbea9a7c Merge pull request #1443 from mposolda/master
JSON import issue from older versions. Fix import at startup if master realm not present
2015-07-11 19:21:28 +02:00
mposolda dc366c53a7 KEYCLOAK-1175 Import at startup can fail if master realm not present 2015-07-11 18:56:52 +02:00
mposolda fe1ede26be KEYCLOAK-1558 Can't import the file exported in 1.2.0.Beta1 through admin console 2015-07-11 18:56:52 +02:00
Bill Burke aca799b28c Merge pull request #1442 from patriot1burke/master
impersonation in admin console
2015-07-11 11:36:01 -04:00
Bill Burke 1017a0af1d Merge remote-tracking branch 'upstream/master' 2015-07-11 11:09:48 -04:00
Bill Burke ff25484a34 viewUser fixes 2015-07-11 11:01:26 -04:00
Marek Posolda af922920ab Merge pull request #1441 from mposolda/master
KEYCLOAK-1233 Admin console support for add/remove federated identity
2015-07-11 16:48:29 +02:00
Bill Burke 919a3f1b91 fixes 2015-07-11 10:30:23 -04:00
Bill Burke 1ec8e63e9e impersonation redo in admin console 2015-07-11 10:12:55 -04:00
Bill Burke 96c76a059a Merge remote-tracking branch 'upstream/master' 2015-07-11 10:10:37 -04:00
Bill Burke 608701aea7 impersonation redo in admin console 2015-07-11 10:10:05 -04:00
mposolda 142d44a01f KEYCLOAK-1233 Admin console support for add/remove federated identity 2015-07-11 14:08:49 +02:00
mposolda 83c0f537ce Minor update in docs 2015-07-11 11:29:46 +02:00
Bill Burke aeab25b7fe Merge pull request #1440 from patriot1burke/master
user impersonation
2015-07-10 21:21:39 -04:00
Bill Burke ef255c6a5c fix build errors 2015-07-10 21:02:25 -04:00
Bill Burke 474ebed0ee Merge remote-tracking branch 'upstream/master' 2015-07-10 20:39:15 -04:00
Bill Burke 6e55604dc3 impersonation 2015-07-10 20:38:43 -04:00
Marek Posolda 2dfdfefb1a Merge pull request #1438 from mposolda/master
KEYCLOAK-1531 LDAP example and update Kerberos example to use example…
2015-07-09 22:45:56 +02:00
Stan Silvert 48f78cf80a KEYCLOAK-1547 Need to use overridable removeUserSession() method. 2015-07-09 14:46:54 -04:00
mposolda 69cc28dd4b KEYCLOAK-1531 LDAP example and update Kerberos example to use example embedded LDAP 2015-07-09 19:55:37 +02:00
Marek Posolda adb8bcf791 Merge pull request #1437 from mposolda/master
KEYCLOAK-1505 Fix JS error in admin console on old browsers
2015-07-09 10:33:27 +02:00
mposolda bd22d30674 KEYCLOAK-1505 Fix JS error in admin console on old browsers 2015-07-09 10:20:55 +02:00
mposolda afbf1cc33f Comment fix 2015-07-09 10:18:52 +02:00
Bill Burke 485df59c5b Merge pull request #1436 from patriot1burke/master
recaptcha docs
2015-07-08 19:47:45 -04:00
Bill Burke 43308b326d Merge pull request #1435 from patriot1burke/master
role selector
2015-07-08 19:47:22 -04:00
Bill Burke 6c9708c700 recaptcha docs 2015-07-08 19:47:15 -04:00
Bill Burke 4a962aa75a Merge remote-tracking branch 'upstream/master' 2015-07-08 19:18:23 -04:00
Bill Burke e786158071 role selector 2015-07-08 19:18:11 -04:00
Marek Posolda ea5a767948 Merge pull request #1434 from mposolda/master
KEYCLOAK-1533 KEYCLOAK-1534
2015-07-08 21:19:54 +02:00
mposolda bde65a6c57 KEYCLOAK-1533 Handle importing LDAP user with duplicate email during authentication 2015-07-08 20:41:32 +02:00
mposolda 94c0a436b5 KEYCLOAK-1534 handle account management update email or username to the already existing value 2015-07-08 15:27:05 +02:00
mposolda bddf1adeba Improve description for object classes 2015-07-08 12:27:15 +02:00
Bill Burke 9406a577c2 Merge pull request #1431 from mstruk/wf9-version
KEYCLOAK-1512 Upgrade to WildFly 9.0.0.Final
2015-07-07 11:34:34 -04:00
Bill Burke 40344726e1 Merge pull request #1432 from mstruk/ispn-activator
KEYCLOAK-1529 Drop InfinispanCacheActivator and make subsystem do it
2015-07-07 11:34:15 -04:00
Bill Burke 08ffea23b7 Merge pull request #1433 from patriot1burke/master
config directive
2015-07-07 11:32:45 -04:00
Bill Burke f1ddaa8051 config directive 2015-07-07 11:31:28 -04:00
Marko Strukelj 7ae62c1060 KEYCLOAK-1529 Drop InfinispanCacheActivator and make subsystem do it 2015-07-07 16:40:03 +02:00
Marko Strukelj 7c51046d8a KEYCLOAK-1512 Upgrade to WildFly 9.0.0.Final 2015-07-07 14:13:13 +02:00
Bill Burke df6d75e2c5 Merge pull request #1427 from grange74/KEYCLOAK-1486
KEYCLOAK-1486 fixed User link in Clients' Active Sessions page
2015-07-06 17:57:53 -04:00
Bill Burke 3c88d9666d Merge pull request #1430 from patriot1burke/master
auth config ui
2015-07-06 17:56:16 -04:00
Bill Burke ee74025f38 Merge pull request #1429 from mikeazo/patch-1
fixed typo in closing th tag
2015-07-06 17:55:51 -04:00
Bill Burke d49c7d47a2 Merge remote-tracking branch 'upstream/master' 2015-07-06 17:44:52 -04:00
Bill Burke 8f18e9bbbc auth config ui 2015-07-06 17:44:39 -04:00
mikeazo be96a3785b fixed typo in closing th tag 2015-07-06 13:41:10 -04:00
Marek Posolda f3aeb5ec9f Merge pull request #1428 from mposolda/master
Embedded LDAP for examples. LDAP sync bugfixing
2015-07-04 22:46:54 +02:00
mposolda 71ea61e7a6 KEYCLOAK-1532 LDAP sync fixes and other bugfixing 2015-07-04 22:25:47 +02:00
mposolda c6c73e5e59 KEYCLOAK-1531 Added embedded LDAP for examples. Added module keycloak-util-embedded-ldap with common code for testsuite and examples 2015-07-04 21:06:24 +02:00
nick.grange ae242f8480 KEYCLOAK-1486 fixed User link in Clients' Active Sessions page
Changed User link in Clients' Active Sessions page to use userId
instead of username to show User details instead of Resource not found.
Renamed UserSessionRepresentation’s user attribute to username as it
was ambiguous and only used in 1 place (i.e. client-sessions.html).
2015-07-04 22:38:34 +10:00
Stian Thorgersen 351a17f68d Merge pull request #1426 from stianst/master
KEYCLOAK-1530
2015-07-03 15:18:52 +02:00
Stian Thorgersen 1c4f7cb339 KEYCLOAK-1530
Ability to specify default database schema
2015-07-03 14:56:33 +02:00
Andres Galante 2713af189f fixes realm selector when there are too many realms on the list 2015-07-02 16:55:42 -03:00
Andres Galante be62d1a915 styles new menu 2015-07-02 16:45:48 -03:00
Bill Burke 68d71a6767 Merge pull request #1423 from patriot1burke/master
display flows
2015-07-02 11:44:51 -04:00
Bill Burke 46c88ad1bf Merge remote-tracking branch 'upstream/master' 2015-07-02 11:26:28 -04:00
Bill Burke 917151123f display flows 2015-07-02 11:25:51 -04:00
Stian Thorgersen b9e9d6a787 Merge branch 'velias-KEYCLOAK-1421' 2015-07-02 14:16:42 +02:00
Stian Thorgersen db20077c37 Merge branch 'KEYCLOAK-1421' of https://github.com/velias/keycloak into velias-KEYCLOAK-1421
Conflicts:
	testsuite/integration/src/test/java/org/keycloak/testsuite/model/UserModelTest.java
2015-07-02 14:15:54 +02:00
Stian Thorgersen ec3d027f90 Merge pull request #1421 from stianst/master
KEYCLOAK-1507
2015-07-02 14:10:57 +02:00
Stian Thorgersen 50678085c9 Merge pull request #1403 from mstruk/KEYCLOAK-1484
KEYCLOAK-1484 Keycloak from server-dist and demo-dist doesn't start
2015-07-02 14:10:19 +02:00
Stian Thorgersen 5af4785ba1 KEYCLOAK-1507
Tomcat Adapter throws NPE under certain conditions
2015-07-02 09:08:40 +02:00
Stian Thorgersen f59d42d5d3 Merge pull request #1420 from girirajsharma/master
[KEYCLOAK-1435] Base URL on client table should open in new tab
2015-07-02 09:00:24 +02:00
giriraj sharma fc7ae1ee96 [KEYCLOAK-1435] Base URL on client table should open in new tab 2015-07-02 06:40:22 +05:30
Bill Burke 2699bb9a44 Merge pull request #1368 from girirajsharma/master
[KEYCLOAK-1427] Move delete buttons
2015-07-01 15:32:11 -04:00
Bill Burke 212f5b4082 Merge pull request #1410 from dbarentine/master
Spec compliance, bug fixes
2015-07-01 15:27:47 -04:00
Bill Burke 9591f48077 Merge pull request #1419 from patriot1burke/master
recapthca
2015-07-01 15:26:20 -04:00
Bill Burke 0a8494a0f2 Merge remote-tracking branch 'upstream/master' 2015-07-01 15:10:14 -04:00
Bill Burke 39f2a4ab71 repatcha 2015-07-01 15:10:04 -04:00
Bill Burke 39aa09ca36 form action refactor 2015-07-01 14:07:02 -04:00
Bill Burke 45c5a2ae78 Merge pull request #1418 from patriot1burke/master
registration flow
2015-06-30 13:19:18 -04:00
Bill Burke a1c612f833 remove old code 2015-06-30 12:47:34 -04:00
Bill Burke bc39bb32d4 Merge remote-tracking branch 'upstream/master' 2015-06-30 12:46:29 -04:00
Bill Burke 884308ecb5 reg flow 2015-06-30 12:46:10 -04:00
Marek Posolda 2d7f232c3d Merge pull request #1417 from mposolda/master
KEYCLOAK-1487 multivalued attributes support
2015-06-30 14:56:45 +02:00
Bill Burke afa65d9ead registration flow 2015-06-29 22:12:06 -04:00
mposolda 605c88a029 KEYCLOAK-1487 Multivalued support for UserAttribute protocol mapper. End-to-end LDAP example test including application 2015-06-29 21:45:47 +02:00
mposolda 09994d1730 KEYCLOAK-1487 Support for multiple values of one UserModel attribute. LDAP multivalued attribute support 2015-06-29 14:56:40 +02:00
girirajSharma bb9c99ebf6 [KEYCLOAK-1427] Move delete buttons 2015-06-28 14:31:40 +05:30
Marek Posolda d4819886a6 Merge pull request #1416 from mposolda/master
LDAP mappers fixes
2015-06-26 14:43:10 +02:00
mposolda 23445123a2 KEYCLOAK-1490 Possibility to always read user attribute values from LDAP 2015-06-26 14:06:31 +02:00
mposolda 773bb43b41 KEYCLOAK-1487 Fix LDAP case-sensitivity. Show warning in case of duplicate username 2015-06-25 19:27:22 +02:00
mposolda 493dddde02 Mongo fix 2015-06-25 19:24:50 +02:00
Bill Burke 2e5704c6b4 Merge pull request #1413 from patriot1burke/master
refactor auth spi into additional form spi
2015-06-24 21:29:26 -04:00
Bill Burke be6c843bba Merge remote-tracking branch 'upstream/master' 2015-06-24 21:07:51 -04:00
Bill Burke 064d677fdc form auth 2015-06-24 21:07:38 -04:00
Marek Posolda 084ab782da Merge pull request #1412 from mposolda/master
KEYCLOAK-1501 Fix osgi packaging. Improve fuse demo example
2015-06-24 16:43:09 +02:00
mposolda 1a10a1ef75 KEYCLOAK-1501 Fix osgi packaging and fuse demo. Improve example 2015-06-24 16:26:05 +02:00
mposolda acc77e4e6c Remove ClientConnectionFilter filter mappings from web.xml in distribution 2015-06-24 11:10:22 +02:00
Stian Thorgersen 2c0ff9be60 Merge pull request #1407 from ssilvert/enforcer
Add enforcer plugin to enforce maven version.
2015-06-23 18:42:18 +02:00
Dane Barentine b9f5946cf0 [KEYCLOAK-1493] Added explicit dependency on keycloak-saml-core 2015-06-22 14:50:04 -07:00
Dane Barentine c403968fa8 [KEYCLOAK-1493] Added explicit dependency on keycloak-saml-core 2015-06-22 11:07:29 -07:00
Dane Barentine 14baef425e [KEYCLOAK-1493] Added a couple of WSTrust constants 2015-06-22 11:07:23 -07:00
Dane Barentine 8da532da93 [KEYCLOAK-1492] Fix mapClaim when nested attribute already exists 2015-06-22 11:00:40 -07:00
Dane Barentine facf701897 [KEYCLOAK-1491] SAML Spec compliance. NameIDFormat is optional, AttributeStatement must contain one or more attribute or encryptedattribute statements 2015-06-22 10:58:13 -07:00
Vlastimil Elias f9fe9ea5d6 rebased to latest keycloak/master 2015-06-22 10:48:54 +02:00
Vlastimil Elias f5a80c3007 KEYCLOAK-1421 patched source formatting 2015-06-22 10:37:27 +02:00
Vlastimil Elias 7cff37e707 KEYCLOAK-1421 Added timestamp of keycloak user creation into user models
and persistence
2015-06-22 10:37:26 +02:00
Vlastimil Elias 4e8c6b3fc4 KEYCLOAK-1421 patched source formatting 2015-06-22 10:33:57 +02:00
Vlastimil Elias 82282c1c75 KEYCLOAK-1421 - user created date added to the admin console 2015-06-22 10:32:39 +02:00
Vlastimil Elias d7379f29da KEYCLOAK-1421 Added timestamp of keycloak user creation into user models
and persistence
2015-06-22 10:32:37 +02:00
Bill Burke 000159226d refactor 2015-06-21 12:09:22 -04:00
Bill Burke 4ebdb8d24b refactor 2015-06-21 11:52:30 -04:00
Bill Burke fc2df08e15 ClientSessionModel.getNotes() 2015-06-20 09:07:54 -04:00
Bill Burke aaa83dc19a Merge pull request #1408 from patriot1burke/master
make authenticator config optional
2015-06-19 21:17:23 -04:00
Bill Burke adff0d5da0 make authenticator config optional 2015-06-19 21:16:45 -04:00
Stan Silvert 285d6931bc Add enforcer plugin to enforce maven version. 2015-06-19 18:14:25 -04:00
Bill Burke 114b687c5c Merge pull request #1406 from patriot1burke/master
refactor registration and console pages
2015-06-19 18:06:12 -04:00
Bill Burke a26ade3988 refactor registration and console pages 2015-06-19 17:51:59 -04:00
Bill Burke 94e2983310 Merge pull request #1405 from patriot1burke/master
cleanup client sessions
2015-06-19 16:23:31 -04:00
Bill Burke fb2f5f6756 Merge remote-tracking branch 'upstream/master' 2015-06-19 14:44:00 -04:00
Bill Burke d7b818cba2 cleanup client sessions 2015-06-19 14:43:40 -04:00
Bill Burke 8d885d14ed Merge pull request #1404 from patriot1burke/master
handle page refresh better
2015-06-18 20:16:29 -04:00
Bill Burke 39e0023a5f Merge remote-tracking branch 'upstream/master' 2015-06-18 20:01:34 -04:00
Bill Burke 84faac0cd6 handle page refresh better 2015-06-18 20:01:12 -04:00
Bill Burke 1bce639d35 refactor flow first phase 2015-06-18 16:48:28 -04:00
Marko Strukelj f2061610b9 KEYCLOAK-1484 Keycloak from server-dist and demo-dist doesn't start 2015-06-18 20:36:32 +02:00
Bill Burke 8716f9b41a Merge pull request #1401 from mstruk/KEYCLOAK-1476
KEYCLOAK-1476 NotSerializableException: org.keycloak.models.cache.entities.CachedClientRole
2015-06-17 17:36:02 -04:00
Bill Burke a24c817bb7 Merge pull request #1402 from patriot1burke/master
cleanup authenticators
2015-06-17 17:34:57 -04:00
Bill Burke 47997e0056 Merge remote-tracking branch 'upstream/master' 2015-06-17 17:15:16 -04:00
Bill Burke 70fd7bea99 cleanup authenticators 2015-06-17 17:15:01 -04:00
Marko Strukelj 52565375b3 KEYCLOAK-1476 NotSerializableException: org.keycloak.models.cache.entities.CachedClientRole
- Remove noop code (Enum serialization 101 - http://docs.oracle.com/javase/6/docs/platform/serialization/spec/serial-arch.html#6469)
2015-06-17 22:05:32 +02:00
Bill Burke 2c327d9eee Merge pull request #1389 from patriot1burke/master
access code checks
2015-06-17 15:59:23 -04:00
Stian Thorgersen caeb710444 KEYCLOAK-1476 2015-06-17 19:34:41 +02:00
Marko Strukelj 0b0b101184 KEYCLOAK-1476 NotSerializableException: org.keycloak.models.cache.entities.CachedClientRole
Conflicts:
	model/api/src/main/java/org/keycloak/models/AuthenticationExecutionModel.java
2015-06-17 19:34:38 +02:00
Bill Burke f5b4a0788e timeout message 2015-06-17 10:16:21 -04:00
Bill Burke 1aa338fe3e Merge remote-tracking branch 'upstream/master' 2015-06-17 09:43:14 -04:00
Bill Burke 5615d8d870 required actions edit 2015-06-17 09:42:58 -04:00
Stian Thorgersen 9711ccd914 Merge pull request #1397 from stianst/master
Fixes
2015-06-17 15:11:33 +02:00
Stian Thorgersen fbc2b845ad KEYCLOAK-1476 NotSerializableException: org.keycloak.models.cache.entities.CachedClientRole 2015-06-17 14:05:55 +02:00
Stian Thorgersen 39ecca0989 KEYCLOAK-1479 2015-06-17 13:53:11 +02:00
Stian Thorgersen f19b6afd85 Fix demo-dist build prob 2015-06-17 13:53:11 +02:00
Stian Thorgersen dca347398d Make it possible to specify ldif file for LDAPEmbeddedServer 2015-06-17 13:53:11 +02:00
Stian Thorgersen de6341bd87 Fix demo-dist build prob 2015-06-17 13:53:11 +02:00
mposolda 5cb9dbb87a Reduce liquibase logging during test to debug 2015-06-17 12:15:30 +02:00
Bill Burke dddc5181e7 required actions storage/display 2015-06-16 22:48:39 -04:00
Bill Burke 3b78fa2d5d required actions model 2015-06-16 18:17:38 -04:00
Bill Burke 2a64f5e3ce Merge remote-tracking branch 'upstream/master' 2015-06-16 09:30:07 -04:00
Bill Burke 8f5b53e3ce clientsession timeout checks 2015-06-16 09:29:36 -04:00
Stian Thorgersen 605f5decb3 Merge pull request #1392 from mstruk/KEYCLOAK-1448
KEYCLOAK-1448 Cannot configure an authenticator for method KEYCLOAK
2015-06-16 14:11:28 +01:00
Marko Strukelj d00e128920 KEYCLOAK-1448 Cannot configure an authenticator for method KEYCLOAK 2015-06-16 14:51:31 +02:00
Stian Thorgersen 226c1c53c0 Merge pull request #1390 from stianst/master
Add missing ExampleDS
2015-06-16 13:40:36 +01:00
Stian Thorgersen 001b874903 Add missing ExampleDS 2015-06-16 14:40:19 +02:00
Stian Thorgersen cc523ea356 Merge pull request #1388 from stianst/master
Fixes
2015-06-16 13:03:10 +01:00
Stian Thorgersen 5dc2b7b1d5 KEYCLOAK-1446
Field ... of subresource ... will not be injected according to spec
2015-06-16 14:02:21 +02:00
Bill Burke cd84e78b27 access code checks 2015-06-16 07:59:53 -04:00
Stian Thorgersen dedaa24972 Updated clustering docs 2015-06-16 13:31:58 +02:00
Stian Thorgersen 1b0c4e5d1f KEYCLOAK-1468
Infinispan cache not available in JNDI
2015-06-16 13:31:51 +02:00
Stian Thorgersen b7e3fc5f73 Recover server-overlay name 2015-06-16 08:11:15 +02:00
Stian Thorgersen 9b9ec09788 Merge pull request #1384 from stianst/master
Fix event-store example
2015-06-16 06:21:30 +01:00
Bill Burke bd7ceb0b73 Merge pull request #1383 from patriot1burke/master
verify clientsession actions
2015-06-15 18:28:17 -04:00
Bill Burke 9638c0dd83 verify clientsession actions 2015-06-15 18:04:55 -04:00
Stian Thorgersen 60f40544bb Fix event-store example 2015-06-15 20:24:32 +02:00
Stian Thorgersen 066fb7178d Merge pull request #1382 from stianst/master
Added wildfly extension to dist
2015-06-15 19:14:05 +01:00
Stian Thorgersen cd762e5e8c Added wildfly extension to dist 2015-06-15 20:13:20 +02:00
Stian Thorgersen f990d68cee Merge pull request #1380 from stianst/master
Fixes
2015-06-15 15:04:31 +01:00
Bill Burke 88f14b39a7 Merge pull request #1378 from patriot1burke/master
auth spi
2015-06-15 09:50:05 -04:00
Stian Thorgersen eda64584d7 Update keycloak-server.json 2015-06-15 15:49:55 +02:00
Bill Burke 2f2a2dced6 Merge remote-tracking branch 'upstream/master' 2015-06-15 09:28:25 -04:00
Bill Burke 38a2ea2fdf fix merge conflict mistakes 2015-06-15 09:28:11 -04:00
Bill Burke 43bad9a608 merge 2015-06-15 09:02:15 -04:00
Stian Thorgersen be5f3086ce KEYCLOAK-1449 Demo bundle doesn't include subsystem configuration 2015-06-15 15:01:22 +02:00
Stian Thorgersen 663f12d5e6 Merge pull request #1376 from stianst/master
Fixes
2015-06-15 14:00:09 +01:00
Stian Thorgersen 6e758d721d Fix CDI examples 2015-06-15 14:21:27 +02:00
Stian Thorgersen 4c98b04ab7 KEYCLOAK-1447 LinkageError deploying oauth-client-cdi to WildFly 8.2.0.Final 2015-06-15 13:22:36 +02:00
Stian Thorgersen f846645989 Update adapter installation docs 2015-06-15 09:03:50 +02:00
Stian Thorgersen 6bc79b590c Renamed eap6 server overlay poms 2015-06-15 09:03:50 +02:00
Stian Thorgersen 2ad7e870d8 Merge pull request #1374 from stianst/master
Fix testsuite/docker-cluster deps
2015-06-15 06:41:11 +01:00
Stian Thorgersen 87636669ae Fix testsuite/docker-cluster deps 2015-06-15 07:40:19 +02:00
Stian Thorgersen 8d627f1329 Merge pull request #1369 from stianst/master
KEYCLOAK-1411
2015-06-15 06:32:49 +01:00
Bill Burke c51cc4703b kerberos fixes 2015-06-14 20:58:02 -04:00
mposolda a1124c9e1f KEYCLOAK-1260 Upgrade h2 version to fix locking issues in SAMLKeyCloakServerBrokerWithSignatureTest 2015-06-12 19:58:27 +02:00
mposolda 20e245cb05 KEYCLOAK-1298 Fix constraint names to be uppercased 2015-06-12 19:17:12 +02:00
mposolda 5c8e165080 Enable liquibase trace logging with JPA profile 2015-06-12 17:20:57 +02:00
mposolda afe088a9e8 Fix Oracle together with Sybase 2015-06-12 17:20:38 +02:00
Stian Thorgersen 162f31baa2 Update server and adapter install docs 2015-06-12 16:14:03 +02:00
Stian Thorgersen 28a50df746 KEYCLOAK-1411
DefaultCacheUserProvider addUser returns UserModel instance which is not cached/managed by the cache
2015-06-12 15:33:22 +02:00
Stian Thorgersen 5a0d600322 Merge pull request #1367 from stianst/master
Bump version
2015-06-12 13:36:42 +01:00
Stian Thorgersen 38c1945ce4 Bump version 2015-06-12 14:35:34 +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
Bill Burke 392fa21f1e finish reg 2015-06-11 21:15:53 -04:00
Bill Burke fa99b5415d flow alias lookup 2015-06-11 18:02:49 -04: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
Bill Burke c52d16da6d default required actions in model 2015-06-11 15:18:09 -04:00
Bill Burke 3f62cd9271 terms and conditions 2015-06-11 14:39:08 -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
Bill Burke 3dd282e11b pluggable required actions backend 2015-06-10 11:38:01 -04:00
girirajsharma 92efe8441e [KEYCLOAK-1431] Update page titles 2015-06-10 20:23:39 +05:30
Bill Burke 95349e6e2e clientsession.action to String 2015-06-10 09:21:23 -04:00
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
Bill Burke dcc40b0a63 error handling 2015-06-05 15:51:43 -04:00
Bill Burke dc0d9a8dce merge 2015-06-05 14:44:37 -04:00
Bill Burke 021b01f0bd passing tests 2015-06-05 13:49:24 -04: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
Bill Burke 9ab023cc6c more 2015-06-04 10:18:24 -04: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
Bill Burke b54061fc3f more 2015-06-03 18:51:57 -04:00
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
Bill Burke c12fe28b2d phased auth spi introduction 2015-06-03 10:55:03 -04: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
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
4191 changed files with 669527 additions and 98065 deletions

No files matched your search

+20
View File
@@ -0,0 +1,20 @@
* text=auto
*.html text eol=lf
*.java text eol=lf
*.js text eol=lf
*.json text eol=lf
*.jsp text eol=lf
*.md text eol=lf
*.properties text eol=lf
*.svg text auto
*.xml text eol=lf
*.xsl text eol=lf
*.png binary
*.jpg binary
*.gif binary
*.ttf binary
*.eot binary
*.otf binary
*.woff binary
+6
View File
@@ -9,6 +9,12 @@
.settings
.classpath
# NetBeans #
############
nbactions.xml
nb-configuration.xml
catalog.xml
# Compiled source #
###################
*.com
+19
View File
@@ -0,0 +1,19 @@
language: java
jdk:
- oraclejdk8
cache:
directories:
- $HOME/.m2
before_cache:
- rm -rf $HOME/.m2/repository/org/keycloak
install: mvn install -Pdistribution -DskipTests=true -B -V
script:
- mvn test -B
- mvn -file testsuite/integration-arquillian test -B
sudo: false
+67 -30
View File
@@ -1,35 +1,72 @@
keycloak
Keycloak
========
Please visit [http://keycloak.org](http://keycloak.org) for more information on Keycloak including how to download, documentation,
and video tutorials.
Keycloak is an SSO Service for web apps and REST services. For more information visit [http://keycloak.org](http://keycloak.org).
Keycloak is an SSO Service for web apps and REST services.
It can be used for social applications as well as enterprise applications. It is based on OpenID Connect with SAML support in the works.
Here's some of the features:
* SSO and Single Log Out for browser applications
* Social Broker. Enable Google, Facebook, Yahoo, Twitter social login with no code required.
* Optional LDAP/Active Directory integration
* Optional User Registration
* Password and TOTP support (via Google Authenticator). Client cert auth coming soon.
* User session management from both admin and user perspective
* Customizable themes for user facing pages: login, grant pages, account management, emails, and admin console all customizable!
* OAuth Bearer token auth for REST Services
* Integrated Browser App to REST Service token propagation
* Admin REST API
* OAuth 2.0 Grant requests
* CORS Support
* CORS Web Origin management and validation
* Completely centrally managed user and role mapping metadata. Minimal configuration at the application side
* Admin Console for managing users, roles, role mappings, applications, user sessions, allowed CORS web origins, and OAuth clients.
* Deployable as a WAR, appliance, or an Openshift cloud service (SaaS).
* Supports JBoss AS7, EAP 6.x, and Wildfly applications. Plans to support Node.js, RAILS, GRAILS, and other non-Java applications.
* Javascript/HTML 5 adapter for pure Javascript apps
* Session management from admin console
* Revocation policies
* Password policies
* OpenID Connect Support
Building
--------
Please visit [http://keycloak.org](http://keycloak.org) for more information on Keycloak including how to download, documentation,
and video tutorials.
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)
+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.5.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,95 @@
/*
* 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 performLogin(AuthenticationRequest request) {
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,200 @@
/*
* 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.ClientSessionModel;
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<>();
private ClientSessionModel clientSession;
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 ClientSessionModel getClientSession() {
return clientSession;
}
public void setClientSession(ClientSessionModel clientSession) {
this.clientSession = clientSession;
}
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,89 @@
package org.keycloak.broker.provider;
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 HardcodedAttributeMapper extends AbstractIdentityProviderMapper {
public static final String ATTRIBUTE = "attribute";
public static final String ATTRIBUTE_VALUE = "attribute.value";
protected static final List<ProviderConfigProperty> configProperties = new ArrayList<ProviderConfigProperty>();
static {
ProviderConfigProperty property;
property = new ProviderConfigProperty();
property.setName(ATTRIBUTE);
property.setLabel("User Attribute");
property.setHelpText("Name of user attribute you want to hardcode");
property.setType(ProviderConfigProperty.STRING_TYPE);
configProperties.add(property);
property = new ProviderConfigProperty();
property.setName(ATTRIBUTE_VALUE);
property.setLabel("User Attribute Value");
property.setHelpText("Value you want to hardcode");
property.setType(ProviderConfigProperty.STRING_TYPE);
configProperties.add(property);
}
@Override
public List<ProviderConfigProperty> getConfigProperties() {
return configProperties;
}
@Override
public String getDisplayCategory() {
return "Attribute Importer";
}
@Override
public String getDisplayType() {
return "Hardcoded Attribute";
}
public static final String[] COMPATIBLE_PROVIDERS = {ANY_PROVIDER};
public static final String PROVIDER_ID = "hardcoded-attribute-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 attribute = mapperModel.getConfig().get(ATTRIBUTE);
String attributeValue = mapperModel.getConfig().get(ATTRIBUTE_VALUE);
user.setSingleAttribute(attribute, attributeValue);
}
@Override
public void updateBrokeredUser(KeycloakSession session, RealmModel realm, UserModel user, IdentityProviderMapperModel mapperModel, BrokeredIdentityContext context) {
String attribute = mapperModel.getConfig().get(ATTRIBUTE);
String attributeValue = mapperModel.getConfig().get(ATTRIBUTE_VALUE);
user.setSingleAttribute(attribute, attributeValue);
}
@Override
public String getHelpText() {
return "When user is imported from provider, hardcode a value to a specific user attribute.";
}
}
@@ -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. Click 'Select Role' button to browse roles, or just type it in the textbox. To reference an application role the syntax is appname.approle, i.e. myapp.myrole");
property.setType(ProviderConfigProperty.ROLE_TYPE);
configProperties.add(property);
}
public static String[] parseRole(String role) {
int scopeIndex = role.lastIndexOf('.');
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,87 @@
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.ProviderConfigProperty;
import java.util.ArrayList;
import java.util.List;
/**
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $
*/
public class HardcodedUserSessionAttributeMapper extends AbstractIdentityProviderMapper {
public static final String ATTRIBUTE = "attribute";
public static final String ATTRIBUTE_VALUE = "attribute.value";
protected static final List<ProviderConfigProperty> configProperties = new ArrayList<ProviderConfigProperty>();
static {
ProviderConfigProperty property;
property = new ProviderConfigProperty();
property.setName(ATTRIBUTE);
property.setLabel("User Session Attribute");
property.setHelpText("Name of user session attribute you want to hardcode");
property.setType(ProviderConfigProperty.STRING_TYPE);
configProperties.add(property);
property = new ProviderConfigProperty();
property.setName(ATTRIBUTE_VALUE);
property.setLabel("User Session Attribute Value");
property.setHelpText("Value you want to hardcode");
property.setType(ProviderConfigProperty.STRING_TYPE);
configProperties.add(property);
}
@Override
public List<ProviderConfigProperty> getConfigProperties() {
return configProperties;
}
@Override
public String getDisplayCategory() {
return "Attribute Importer";
}
@Override
public String getDisplayType() {
return "Hardcoded User Session Attribute";
}
public static final String[] COMPATIBLE_PROVIDERS = {ANY_PROVIDER};
public static final String PROVIDER_ID = "hardcoded-user-session-attribute-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 attribute = mapperModel.getConfig().get(ATTRIBUTE);
String attributeValue = mapperModel.getConfig().get(ATTRIBUTE_VALUE);
context.getClientSession().setUserSessionNote(attribute, attributeValue);
}
@Override
public void updateBrokeredUser(KeycloakSession session, RealmModel realm, UserModel user, IdentityProviderMapperModel mapperModel, BrokeredIdentityContext context) {
String attribute = mapperModel.getConfig().get(ATTRIBUTE);
String attributeValue = mapperModel.getConfig().get(ATTRIBUTE_VALUE);
context.getClientSession().setUserSessionNote(attribute, attributeValue);
}
@Override
public String getHelpText() {
return "When user is imported from provider, hardcode a value to a specific user session attribute.";
}
}
@@ -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,3 @@
org.keycloak.broker.provider.HardcodedRoleMapper
org.keycloak.broker.provider.HardcodedAttributeMapper
org.keycloak.broker.provider.HardcodedUserSessionAttributeMapper
@@ -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.5.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,332 @@
/*
* 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 iss = token.getIssuer();
if (!token.hasAudience(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.setSingleAttribute(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. Click 'Select Role' button to browse roles, or just type it in the textbox. To reference an application role the syntax is appname.approle, i.e. myapp.myrole");
property.setType(ProviderConfigProperty.ROLE_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. Click 'Select Role' button to browse roles, or just type it in the textbox. To reference an application role the syntax is appname.approle, i.e. myapp.myrole");
property.setType(ProviderConfigProperty.ROLE_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,98 @@
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.provider.ProviderConfigProperty;
import java.util.ArrayList;
import java.util.Collection;
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.setSingleAttribute(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.getFirstAttribute(attribute);
if (value != null && !value.equals(current)) {
user.setSingleAttribute(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.5.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.5.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,492 @@
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());
//SAML Spec 2.2.2 Format is optional
if (subjectNameID.getFormat() != null && 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. Click 'Select Role' button to browse roles, or just type it in the textbox. To reference an application role the syntax is appname.approle, i.e. myapp.myrole");
property.setType(ProviderConfigProperty.ROLE_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,129 @@
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.models.IdentityProviderMapperModel;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.RealmModel;
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.setSingleAttribute(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 && !friendly.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.getFirstAttribute(attribute);
if (value != null && !value.equals(current)) {
user.setSingleAttribute(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.5.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,210 @@
/*
* 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());
ImportUtils.importRealms(session, model.getRealms(), 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.5.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.5.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() {
}
}
@@ -0,0 +1,132 @@
package org.keycloak.connections.infinispan;
import org.infinispan.configuration.cache.CacheMode;
import org.infinispan.configuration.cache.Configuration;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.configuration.global.GlobalConfigurationBuilder;
import org.infinispan.manager.DefaultCacheManager;
import org.infinispan.manager.EmbeddedCacheManager;
import org.jboss.logging.Logger;
import org.keycloak.Config;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.KeycloakSessionFactory;
import javax.naming.InitialContext;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public class DefaultInfinispanConnectionProviderFactory implements InfinispanConnectionProviderFactory {
protected static final Logger logger = Logger.getLogger(DefaultInfinispanConnectionProviderFactory.class);
private Config.Scope config;
private EmbeddedCacheManager cacheManager;
private boolean containerManaged;
@Override
public InfinispanConnectionProvider create(KeycloakSession session) {
lazyInit();
return new DefaultInfinispanConnectionProvider(cacheManager);
}
@Override
public void close() {
if (cacheManager != null && !containerManaged) {
cacheManager.stop();
}
cacheManager = null;
}
@Override
public String getId() {
return "default";
}
@Override
public void init(Config.Scope config) {
this.config = config;
}
@Override
public void postInit(KeycloakSessionFactory factory) {
}
private void lazyInit() {
if (cacheManager == null) {
synchronized (this) {
if (cacheManager == null) {
String cacheContainer = config.get("cacheContainer");
if (cacheContainer != null) {
initContainerManaged(cacheContainer);
} else {
initEmbedded();
}
}
}
}
}
private void initContainerManaged(String cacheContainerLookup) {
try {
cacheManager = (EmbeddedCacheManager) new InitialContext().lookup(cacheContainerLookup);
containerManaged = true;
logger.debugv("Using container managed Infinispan cache container, lookup={1}", cacheContainerLookup);
} catch (Exception e) {
throw new RuntimeException("Failed to retrieve cache container", e);
}
}
private void initEmbedded() {
GlobalConfigurationBuilder gcb = new GlobalConfigurationBuilder();
boolean clustered = config.getBoolean("clustered", false);
boolean async = config.getBoolean("async", true);
boolean allowDuplicateJMXDomains = config.getBoolean("allowDuplicateJMXDomains", true);
if (clustered) {
gcb.transport().defaultTransport();
}
gcb.globalJmxStatistics().allowDuplicateDomains(allowDuplicateJMXDomains);
cacheManager = new DefaultCacheManager(gcb.build());
containerManaged = false;
logger.debug("Started embedded Infinispan cache container");
ConfigurationBuilder invalidationConfigBuilder = new ConfigurationBuilder();
if (clustered) {
invalidationConfigBuilder.clustering().cacheMode(async ? CacheMode.INVALIDATION_ASYNC : CacheMode.INVALIDATION_SYNC);
}
Configuration invalidationCacheConfiguration = invalidationConfigBuilder.build();
cacheManager.defineConfiguration(InfinispanConnectionProvider.REALM_CACHE_NAME, invalidationCacheConfiguration);
cacheManager.defineConfiguration(InfinispanConnectionProvider.USER_CACHE_NAME, invalidationCacheConfiguration);
ConfigurationBuilder sessionConfigBuilder = new ConfigurationBuilder();
if (clustered) {
String sessionsMode = config.get("sessionsMode", "distributed");
if (sessionsMode.equalsIgnoreCase("replicated")) {
sessionConfigBuilder.clustering().cacheMode(async ? CacheMode.REPL_ASYNC : CacheMode.REPL_SYNC);
} else if (sessionsMode.equalsIgnoreCase("distributed")) {
sessionConfigBuilder.clustering().cacheMode(async ? CacheMode.DIST_ASYNC : CacheMode.DIST_SYNC);
} else {
throw new RuntimeException("Invalid value for sessionsMode");
}
sessionConfigBuilder.clustering().hash()
.numOwners(config.getInt("sessionsOwners", 2))
.numSegments(config.getInt("sessionsSegments", 60)).build();
}
Configuration sessionCacheConfiguration = sessionConfigBuilder.build();
cacheManager.defineConfiguration(InfinispanConnectionProvider.SESSION_CACHE_NAME, sessionCacheConfiguration);
cacheManager.defineConfiguration(InfinispanConnectionProvider.LOGIN_FAILURE_CACHE_NAME, sessionCacheConfiguration);
}
}
@@ -0,0 +1,18 @@
package org.keycloak.connections.infinispan;
import org.infinispan.Cache;
import org.keycloak.provider.Provider;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public interface InfinispanConnectionProvider extends Provider {
static final String REALM_CACHE_NAME = "realms";
static final String USER_CACHE_NAME = "users";
static final String SESSION_CACHE_NAME = "sessions";
static final String LOGIN_FAILURE_CACHE_NAME = "loginFailures";
<K, V> Cache<K, V> getCache(String name);
}
@@ -0,0 +1,9 @@
package org.keycloak.connections.infinispan;
import org.keycloak.provider.ProviderFactory;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public interface InfinispanConnectionProviderFactory extends ProviderFactory<InfinispanConnectionProvider> {
}
@@ -0,0 +1,32 @@
package org.keycloak.connections.infinispan;
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 InfinispanConnectionSpi implements Spi {
@Override
public boolean isInternal() {
return true;
}
@Override
public String getName() {
return "connectionsInfinispan";
}
@Override
public Class<? extends Provider> getProviderClass() {
return InfinispanConnectionProvider.class;
}
@Override
public Class<? extends ProviderFactory> getProviderFactoryClass() {
return InfinispanConnectionProviderFactory.class;
}
}
@@ -0,0 +1 @@
org.keycloak.connections.infinispan.DefaultInfinispanConnectionProviderFactory
@@ -0,0 +1 @@
org.keycloak.connections.infinispan.InfinispanConnectionSpi
+76
View File
@@ -0,0 +1,76 @@
<?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.5.1.Final</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>keycloak-connections-jpa-liquibase</artifactId>
<name>Keycloak Connections JPA Liquibase Updater</name>
<description/>
<dependencies>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-connections-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-model-api</artifactId>
</dependency>
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
<exclusions>
<exclusion>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.jboss.logging</groupId>
<artifactId>jboss-logging</artifactId>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-services</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-maven-plugin</artifactId>
<configuration>
<changeLogFile>META-INF/jpa-changelog-master.xml</changeLogFile>
<url>${project.url}</url>
<driver>${driver}</driver>
<username>${username}</username>
<password>${password}</password>
<referenceUrl>${referenceUrl}</referenceUrl>
<referenceDriver>${driver}</referenceDriver>
<referenceUsername>${username}</referenceUsername>
<referencePassword>${password}</referencePassword>
</configuration>
</plugin>
</plugins>
</build>
<properties>
<username>sa</username>
<password></password>
<driver>org.h2.Driver</driver>
</properties>
</project>
@@ -0,0 +1,238 @@
package org.keycloak.connections.jpa.updater.liquibase;
import liquibase.Contexts;
import liquibase.Liquibase;
import liquibase.changelog.ChangeSet;
import liquibase.changelog.DatabaseChangeLog;
import liquibase.changelog.RanChangeSet;
import liquibase.database.Database;
import liquibase.database.DatabaseFactory;
import liquibase.database.core.DB2Database;
import liquibase.database.core.DerbyDatabase;
import liquibase.database.core.FirebirdDatabase;
import liquibase.database.core.H2Database;
import liquibase.database.core.HsqlDatabase;
import liquibase.database.core.InformixDatabase;
import liquibase.database.core.MSSQLDatabase;
import liquibase.database.core.MySQLDatabase;
import liquibase.database.core.OracleDatabase;
import liquibase.database.core.PostgresDatabase;
import liquibase.database.core.SQLiteDatabase;
import liquibase.database.core.SybaseASADatabase;
import liquibase.database.core.SybaseDatabase;
import liquibase.database.jvm.JdbcConnection;
import liquibase.exception.LiquibaseException;
import liquibase.logging.LogFactory;
import liquibase.logging.LogLevel;
import liquibase.resource.ClassLoaderResourceAccessor;
import liquibase.servicelocator.ServiceLocator;
import org.jboss.logging.Logger;
import org.keycloak.connections.jpa.updater.JpaUpdaterProvider;
import org.keycloak.models.KeycloakSession;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public class LiquibaseJpaUpdaterProvider implements JpaUpdaterProvider {
private static final Logger logger = Logger.getLogger(LiquibaseJpaUpdaterProvider.class);
private static final String CHANGELOG = "META-INF/jpa-changelog-master.xml";
@Override
public String getCurrentVersionSql(String defaultSchema) {
return "SELECT ID from " + getTable("DATABASECHANGELOG", defaultSchema) + " ORDER BY DATEEXECUTED DESC LIMIT 1";
}
@Override
public void update(KeycloakSession session, Connection connection, String defaultSchema) {
logger.debug("Starting database update");
// Need ThreadLocal as liquibase doesn't seem to have API to inject custom objects into tasks
ThreadLocalSessionContext.setCurrentSession(session);
try {
Liquibase liquibase = getLiquibase(connection, defaultSchema);
List<ChangeSet> changeSets = liquibase.listUnrunChangeSets((Contexts) null);
if (!changeSets.isEmpty()) {
if (changeSets.get(0).getId().equals(FIRST_VERSION)) {
Statement statement = connection.createStatement();
try {
statement.executeQuery("SELECT id FROM " + getTable("REALM", defaultSchema));
logger.infov("Updating database from {0} to {1}", FIRST_VERSION, changeSets.get(changeSets.size() - 1).getId());
liquibase.markNextChangeSetRan(null);
} catch (SQLException e) {
logger.info("Initializing database schema");
}
} else {
if (logger.isDebugEnabled()) {
List<RanChangeSet> ranChangeSets = liquibase.getDatabase().getRanChangeSetList();
logger.debugv("Updating database from {0} to {1}", ranChangeSets.get(ranChangeSets.size() - 1).getId(), changeSets.get(changeSets.size() - 1).getId());
} else {
logger.infov("Updating database");
}
}
liquibase.update((Contexts) null);
}
} catch (Exception e) {
throw new RuntimeException("Failed to update database", e);
} finally {
ThreadLocalSessionContext.removeCurrentSession();
}
logger.debug("Completed database update");
}
@Override
public void validate(Connection connection, String defaultSchema) {
try {
Liquibase liquibase = getLiquibase(connection, defaultSchema);
liquibase.validate();
} catch (Exception e) {
throw new RuntimeException("Failed to validate database", e);
}
}
private Liquibase getLiquibase(Connection connection, String defaultSchema) throws Exception {
ServiceLocator sl = ServiceLocator.getInstance();
if (!System.getProperties().containsKey("liquibase.scan.packages")) {
if (sl.getPackages().remove("liquibase.core")) {
sl.addPackageToScan("liquibase.core.xml");
}
if (sl.getPackages().remove("liquibase.parser")) {
sl.addPackageToScan("liquibase.parser.core.xml");
}
if (sl.getPackages().remove("liquibase.serializer")) {
sl.addPackageToScan("liquibase.serializer.core.xml");
}
sl.getPackages().remove("liquibase.ext");
sl.getPackages().remove("liquibase.sdk");
}
LogFactory.setInstance(new LogWrapper());
Database database = DatabaseFactory.getInstance().findCorrectDatabaseImplementation(new JdbcConnection(connection));
if (defaultSchema != null) {
database.setDefaultSchemaName(defaultSchema);
}
return new Liquibase(CHANGELOG, new ClassLoaderResourceAccessor(getClass().getClassLoader()), database);
}
@Override
public void close() {
}
private static class LogWrapper extends LogFactory {
private liquibase.logging.Logger logger = new liquibase.logging.Logger() {
@Override
public void setName(String name) {
}
@Override
public void setLogLevel(String level) {
}
@Override
public void setLogLevel(LogLevel level) {
}
@Override
public void setLogLevel(String logLevel, String logFile) {
}
@Override
public void severe(String message) {
LiquibaseJpaUpdaterProvider.logger.error(message);
}
@Override
public void severe(String message, Throwable e) {
LiquibaseJpaUpdaterProvider.logger.error(message, e);
}
@Override
public void warning(String message) {
LiquibaseJpaUpdaterProvider.logger.warn(message);
}
@Override
public void warning(String message, Throwable e) {
LiquibaseJpaUpdaterProvider.logger.warn(message, e);
}
@Override
public void info(String message) {
LiquibaseJpaUpdaterProvider.logger.debug(message);
}
@Override
public void info(String message, Throwable e) {
LiquibaseJpaUpdaterProvider.logger.debug(message, e);
}
@Override
public void debug(String message) {
LiquibaseJpaUpdaterProvider.logger.trace(message);
}
@Override
public LogLevel getLogLevel() {
if (LiquibaseJpaUpdaterProvider.logger.isTraceEnabled()) {
return LogLevel.DEBUG;
} else if (LiquibaseJpaUpdaterProvider.logger.isDebugEnabled()) {
return LogLevel.INFO;
} else {
return LogLevel.WARNING;
}
}
@Override
public void debug(String message, Throwable e) {
LiquibaseJpaUpdaterProvider.logger.trace(message, e);
}
@Override
public void setChangeLog(DatabaseChangeLog databaseChangeLog) {
}
@Override
public void setChangeSet(ChangeSet changeSet) {
}
@Override
public int getPriority() {
return 0;
}
};
@Override
public liquibase.logging.Logger getLog(String name) {
return logger;
}
@Override
public liquibase.logging.Logger getLog() {
return logger;
}
}
public static String getTable(String table, String defaultSchema) {
return defaultSchema != null ? defaultSchema + "." + table : table;
}
}
@@ -0,0 +1,37 @@
package org.keycloak.connections.jpa.updater.liquibase;
import org.keycloak.Config;
import org.keycloak.connections.jpa.updater.JpaUpdaterProvider;
import org.keycloak.connections.jpa.updater.JpaUpdaterProviderFactory;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.KeycloakSessionFactory;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public class LiquibaseJpaUpdaterProviderFactory implements JpaUpdaterProviderFactory {
@Override
public JpaUpdaterProvider create(KeycloakSession session) {
return new LiquibaseJpaUpdaterProvider();
}
@Override
public void init(Config.Scope config) {
}
@Override
public void postInit(KeycloakSessionFactory factory) {
}
@Override
public void close() {
}
@Override
public String getId() {
return "liquibase";
}
}
@@ -0,0 +1,23 @@
package org.keycloak.connections.jpa.updater.liquibase;
import org.keycloak.models.KeycloakSession;
/**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
*/
public class ThreadLocalSessionContext {
private static final ThreadLocal<KeycloakSession> currentSession = new ThreadLocal<KeycloakSession>();
public static KeycloakSession getCurrentSession() {
return currentSession.get();
}
public static void setCurrentSession(KeycloakSession session) {
currentSession.set(session);
}
public static void removeCurrentSession() {
currentSession.remove();
}
}
@@ -0,0 +1,86 @@
package org.keycloak.connections.jpa.updater.liquibase.custom;
import liquibase.change.custom.CustomSqlChange;
import liquibase.database.Database;
import liquibase.database.jvm.JdbcConnection;
import liquibase.exception.CustomChangeException;
import liquibase.exception.SetupException;
import liquibase.exception.ValidationErrors;
import liquibase.resource.ResourceAccessor;
import liquibase.snapshot.SnapshotGeneratorFactory;
import liquibase.statement.SqlStatement;
import liquibase.statement.core.UpdateStatement;
import liquibase.structure.core.Schema;
import liquibase.structure.core.Table;
import org.keycloak.connections.jpa.updater.liquibase.LiquibaseJpaUpdaterProvider;
import org.keycloak.models.utils.KeycloakModelUtils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.util.ArrayList;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public class AddRealmCodeSecret implements CustomSqlChange {
private String confirmationMessage;
@Override
public SqlStatement[] generateStatements(Database database) throws CustomChangeException {
try {
StringBuilder sb = new StringBuilder();
sb.append("Generated codeSecret for realms: ");
Connection connection = ((JdbcConnection) (database.getConnection())).getWrappedConnection();
ArrayList<SqlStatement> statements = new ArrayList<SqlStatement>();
String correctedTableName = database.correctObjectName("REALM", Table.class);
if (SnapshotGeneratorFactory.getInstance().has(new Table().setName(correctedTableName), database)) {
ResultSet resultSet = connection.createStatement().executeQuery("SELECT ID FROM " + LiquibaseJpaUpdaterProvider.getTable(correctedTableName, database.getDefaultSchemaName()) + " WHERE CODE_SECRET IS NULL");
while (resultSet.next()) {
String id = resultSet.getString(1);
UpdateStatement statement = new UpdateStatement(null, null, correctedTableName)
.addNewColumnValue("CODE_SECRET", KeycloakModelUtils.generateCodeSecret())
.setWhereClause("ID='" + id + "'");
statements.add(statement);
if (!resultSet.isFirst()) {
sb.append(", ");
}
sb.append(id);
}
if (!statements.isEmpty()) {
confirmationMessage = sb.toString();
}
}
return statements.toArray(new SqlStatement[statements.size()]);
} catch (Exception e) {
throw new CustomChangeException("Failed to add realm code secret", e);
}
}
@Override
public String getConfirmationMessage() {
return confirmationMessage;
}
@Override
public void setUp() throws SetupException {
}
@Override
public void setFileOpener(ResourceAccessor resourceAccessor) {
}
@Override
public ValidationErrors validate(Database database) {
return null;
}
}
@@ -0,0 +1,117 @@
package org.keycloak.connections.jpa.updater.liquibase.custom;
import java.sql.Connection;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import liquibase.change.custom.CustomSqlChange;
import liquibase.database.Database;
import liquibase.database.jvm.JdbcConnection;
import liquibase.exception.CustomChangeException;
import liquibase.exception.SetupException;
import liquibase.exception.ValidationErrors;
import liquibase.resource.ResourceAccessor;
import liquibase.snapshot.SnapshotGeneratorFactory;
import liquibase.statement.SqlStatement;
import liquibase.structure.core.Table;
import org.jboss.logging.Logger;
import org.keycloak.connections.jpa.updater.liquibase.LiquibaseJpaUpdaterProvider;
import org.keycloak.connections.jpa.updater.liquibase.ThreadLocalSessionContext;
import org.keycloak.models.KeycloakSession;
import org.keycloak.services.DefaultKeycloakSessionFactory;
/**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
*/
public abstract class CustomKeycloakTask implements CustomSqlChange {
private final Logger logger = Logger.getLogger(getClass());
protected KeycloakSession kcSession;
protected Database database;
protected JdbcConnection jdbcConnection;
protected Connection connection;
protected StringBuilder confirmationMessage = new StringBuilder();
protected List<SqlStatement> statements = new ArrayList<SqlStatement>();
@Override
public ValidationErrors validate(Database database) {
return null;
}
@Override
public void setFileOpener(ResourceAccessor resourceAccessor) {
}
@Override
public String getConfirmationMessage() {
return confirmationMessage.toString();
}
@Override
public void setUp() throws SetupException {
this.kcSession = ThreadLocalSessionContext.getCurrentSession();
if (this.kcSession == null) {
// Probably running Liquibase from maven plugin. Try to create kcSession programmatically
logger.info("No KeycloakSession provided in ThreadLocal. Initializing KeycloakSessionFactory");
try {
DefaultKeycloakSessionFactory factory = new DefaultKeycloakSessionFactory();
factory.init();
this.kcSession = factory.create();
} catch (Exception e) {
throw new SetupException("Exception when initializing factory", e);
}
}
}
@Override
public SqlStatement[] generateStatements(Database database) throws CustomChangeException {
this.database = database;
jdbcConnection = (JdbcConnection) database.getConnection();
connection = jdbcConnection.getWrappedConnection();
if (isApplicable()) {
confirmationMessage.append(getTaskId() + ": ");
generateStatementsImpl();
} else {
confirmationMessage.append(getTaskId() + ": no update applicable for this task");
}
return statements.toArray(new SqlStatement[statements.size()]);
}
protected boolean isApplicable() throws CustomChangeException {
try {
String correctedTableName = database.correctObjectName("REALM", Table.class);
if (SnapshotGeneratorFactory.getInstance().has(new Table().setName(correctedTableName), database)) {
ResultSet resultSet = connection.createStatement().executeQuery("SELECT ID FROM " + getTableName(correctedTableName));
try {
return (resultSet.next());
} finally {
resultSet.close();
}
} else {
return false;
}
} catch (Exception e) {
throw new CustomChangeException("Failed to check database availability", e);
}
}
/**
* It's supposed to fill SQL statements to the "statements" variable and fill "confirmationMessage"
*/
protected abstract void generateStatementsImpl() throws CustomChangeException;
protected abstract String getTaskId();
// get Table name for sql selects
protected String getTableName(String tableName) {
return LiquibaseJpaUpdaterProvider.getTable(tableName, database.getDefaultSchemaName());
}
}
@@ -0,0 +1,343 @@
package org.keycloak.connections.jpa.updater.liquibase.custom;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import liquibase.exception.CustomChangeException;
import liquibase.exception.DatabaseException;
import liquibase.statement.core.InsertStatement;
import liquibase.statement.core.UpdateStatement;
import liquibase.structure.core.Table;
import org.keycloak.Config;
import org.keycloak.connections.jpa.updater.liquibase.LiquibaseJpaUpdaterProvider;
import org.keycloak.migration.MigrationProvider;
import org.keycloak.models.AdminRoles;
import org.keycloak.models.ClaimMask;
import org.keycloak.models.utils.KeycloakModelUtils;
import org.keycloak.representations.idm.ProtocolMapperRepresentation;
/**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
*/
public class JpaUpdate1_2_0_Beta1 extends CustomKeycloakTask {
private String realmTableName;
@Override
protected String getTaskId() {
return "Update 1.2.0.Beta1";
}
@Override
protected void generateStatementsImpl() throws CustomChangeException {
realmTableName = database.correctObjectName("REALM", Table.class);
try {
convertSocialToIdFedRealms();
convertSocialToIdFedUsers();
addAccessCodeLoginTimeout();
addNewAdminRoles();
addDefaultProtocolMappers();
} catch (Exception e) {
throw new CustomChangeException(getTaskId() + ": Exception when updating data from previous version", e);
}
}
protected void convertSocialToIdFedRealms() throws SQLException, DatabaseException {
String identityProviderTableName = database.correctObjectName("IDENTITY_PROVIDER", Table.class);
String idpConfigTableName = database.correctObjectName("IDENTITY_PROVIDER_CONFIG", Table.class);
String realmSocialConfigTable = getTableName("REALM_SOCIAL_CONFIG");
String realmTableName = getTableName("REALM");
PreparedStatement statement = jdbcConnection.prepareStatement("select RSC.NAME, VALUE, REALM_ID, UPDATE_PROFILE_ON_SOC_LOGIN from " + realmSocialConfigTable + " RSC," + realmTableName +
" REALM where RSC.REALM_ID = REALM.ID ORDER BY RSC.REALM_ID, RSC.NAME");
try {
ResultSet resultSet = statement.executeQuery();
try {
boolean providerInProgress = false;
String socialProviderId = null;
String clientId = null;
String clientSecret;
String realmId = null;
boolean updateProfileOnSocialLogin = false;
boolean first = true;
while (resultSet.next()) {
if (first) {
confirmationMessage.append("Migrating social to identity providers: ");
first = false;
}
if (!providerInProgress) {
String key = resultSet.getString("NAME");
int keyIndex = key.indexOf(".key");
if (keyIndex == -1) {
throw new IllegalStateException("Can't parse the provider from column: " + key);
}
socialProviderId = key.substring(0, keyIndex);
clientId = resultSet.getString("VALUE");
realmId = resultSet.getString("REALM_ID");
updateProfileOnSocialLogin = resultSet.getBoolean("UPDATE_PROFILE_ON_SOC_LOGIN");
providerInProgress = true;
} else {
clientSecret = resultSet.getString("VALUE");
String internalId = KeycloakModelUtils.generateId();
InsertStatement idpInsert = new InsertStatement(null, null, identityProviderTableName)
.addColumnValue("INTERNAL_ID", internalId)
.addColumnValue("ENABLED", true)
.addColumnValue("PROVIDER_ALIAS", socialProviderId)
.addColumnValue("PROVIDER_ID", socialProviderId)
.addColumnValue("UPDATE_PROFILE_FIRST_LOGIN", updateProfileOnSocialLogin)
.addColumnValue("STORE_TOKEN", false)
.addColumnValue("AUTHENTICATE_BY_DEFAULT", false)
.addColumnValue("REALM_ID", realmId);
InsertStatement clientIdInsert = new InsertStatement(null, null, idpConfigTableName)
.addColumnValue("IDENTITY_PROVIDER_ID", internalId)
.addColumnValue("NAME", "clientId")
.addColumnValue("VALUE", clientId);
InsertStatement clientSecretInsert = new InsertStatement(null, null, idpConfigTableName)
.addColumnValue("IDENTITY_PROVIDER_ID", internalId)
.addColumnValue("NAME", "clientSecret")
.addColumnValue("VALUE", clientSecret);
statements.add(idpInsert);
statements.add(clientIdInsert);
statements.add(clientSecretInsert);
confirmationMessage.append(socialProviderId + " in realm " + realmId + ", ");
providerInProgress = false;
}
}
// It means that some provider where processed
if (!first) {
confirmationMessage.append(". ");
}
} finally {
resultSet.close();
}
} finally {
statement.close();
}
}
protected void convertSocialToIdFedUsers() throws SQLException, DatabaseException {
String federatedIdentityTableName = database.correctObjectName("FEDERATED_IDENTITY", Table.class);
PreparedStatement statement = jdbcConnection.prepareStatement("select REALM_ID, USER_ID, SOCIAL_PROVIDER, SOCIAL_USER_ID, SOCIAL_USERNAME from " + getTableName("USER_SOCIAL_LINK"));
try {
ResultSet resultSet = statement.executeQuery();
try {
int count = 0;
while (resultSet.next()) {
InsertStatement insert = new InsertStatement(null, null, federatedIdentityTableName)
.addColumnValue("REALM_ID", resultSet.getString("REALM_ID"))
.addColumnValue("USER_ID", resultSet.getString("USER_ID"))
.addColumnValue("IDENTITY_PROVIDER", resultSet.getString("SOCIAL_PROVIDER"))
.addColumnValue("FEDERATED_USER_ID", resultSet.getString("SOCIAL_USER_ID"))
.addColumnValue("FEDERATED_USERNAME", resultSet.getString("SOCIAL_USERNAME"));
count++;
statements.add(insert);
}
confirmationMessage.append("Updating " + count + " social links to federated identities. ");
} finally {
resultSet.close();
}
} finally {
statement.close();
}
}
protected void addAccessCodeLoginTimeout() {
UpdateStatement statement = new UpdateStatement(null, null, realmTableName)
.addNewColumnValue("LOGIN_LIFESPAN", 1800)
.setWhereClause("LOGIN_LIFESPAN IS NULL");
statements.add(statement);
confirmationMessage.append("Updated LOGIN_LIFESPAN of all realms to 1800 seconds. ");
}
private void addNewAdminRoles() throws SQLException, DatabaseException{
addNewMasterAdminRoles();
addNewRealmAdminRoles();
confirmationMessage.append("Adding new admin roles. ");
}
protected void addNewMasterAdminRoles() throws SQLException, DatabaseException {
// Retrieve ID of admin role of master realm
String adminRoleId = getAdminRoleId();
String masterRealmId = Config.getAdminRealm();
PreparedStatement statement = jdbcConnection.prepareStatement("select NAME from " + getTableName("REALM"));
try {
ResultSet resultSet = statement.executeQuery();
try {
while (resultSet.next()) {
String realmName = resultSet.getString("NAME");
String masterAdminAppName = realmName + "-realm";
PreparedStatement statement2 = jdbcConnection.prepareStatement("select ID from " + getTableName("CLIENT") + " where REALM_ID = ? AND NAME = ?");
statement2.setString(1, masterRealmId);
statement2.setString(2, masterAdminAppName);
try {
ResultSet resultSet2 = statement2.executeQuery();
try {
if (resultSet2.next()) {
String masterAdminAppId = resultSet2.getString("ID");
addAdminRole(AdminRoles.VIEW_IDENTITY_PROVIDERS, masterRealmId, masterAdminAppId, adminRoleId);
addAdminRole(AdminRoles.MANAGE_IDENTITY_PROVIDERS, masterRealmId, masterAdminAppId, adminRoleId);
} else {
throw new IllegalStateException("Couldn't find ID of '" + masterAdminAppName + "' application in 'master' realm. ");
}
} finally {
resultSet2.close();
}
} finally {
statement2.close();
}
}
} finally {
resultSet.close();
}
} finally {
statement.close();
}
}
private String getAdminRoleId() throws SQLException, DatabaseException {
PreparedStatement statement = jdbcConnection.prepareStatement("select ID from " + getTableName("KEYCLOAK_ROLE") + " where NAME = ? AND REALM = ?");
statement.setString(1, AdminRoles.ADMIN);
statement.setString(2, Config.getAdminRealm());
try {
ResultSet resultSet = statement.executeQuery();
try {
if (resultSet.next()) {
return resultSet.getString("ID");
} else {
throw new IllegalStateException("Couldn't find ID of 'admin' role in 'master' realm");
}
} finally {
resultSet.close();
}
} finally {
statement.close();
}
}
protected void addNewRealmAdminRoles() throws SQLException, DatabaseException {
PreparedStatement statement = jdbcConnection.prepareStatement("select CLIENT.ID REALM_ADMIN_APP_ID, CLIENT.REALM_ID REALM_ID, KEYCLOAK_ROLE.ID ADMIN_ROLE_ID from " +
getTableName("CLIENT") + " CLIENT," + getTableName("KEYCLOAK_ROLE") + " KEYCLOAK_ROLE where KEYCLOAK_ROLE.APPLICATION = CLIENT.ID AND CLIENT.NAME = 'realm-management' AND KEYCLOAK_ROLE.NAME = ?");
statement.setString(1, AdminRoles.REALM_ADMIN);
try {
ResultSet resultSet = statement.executeQuery();
try {
while (resultSet.next()) {
String realmAdminAppId = resultSet.getString("REALM_ADMIN_APP_ID");
String realmId = resultSet.getString("REALM_ID");
String adminRoleId = resultSet.getString("ADMIN_ROLE_ID");
addAdminRole(AdminRoles.VIEW_IDENTITY_PROVIDERS, realmId, realmAdminAppId, adminRoleId);
addAdminRole(AdminRoles.MANAGE_IDENTITY_PROVIDERS, realmId, realmAdminAppId, adminRoleId);
}
} finally {
resultSet.close();
}
} finally {
statement.close();
}
}
private void addAdminRole(String roleName, String realmId, String applicationId, String realmAdminAppRoleId) {
String roleTableName = database.correctObjectName("KEYCLOAK_ROLE", Table.class);
String compositeRoleTableName = database.correctObjectName("COMPOSITE_ROLE", Table.class);
String newRoleId = KeycloakModelUtils.generateId();
InsertStatement insertRole = new InsertStatement(null, null, roleTableName)
.addColumnValue("ID", newRoleId)
.addColumnValue("APP_REALM_CONSTRAINT", applicationId)
.addColumnValue("APPLICATION_ROLE", true)
.addColumnValue("NAME", roleName)
.addColumnValue("REALM_ID", realmId)
.addColumnValue("APPLICATION", applicationId);
// Add newly created role to the composite roles of 'realm-admin' role
InsertStatement insertCompRole = new InsertStatement(null, null, compositeRoleTableName)
.addColumnValue("COMPOSITE", realmAdminAppRoleId)
.addColumnValue("CHILD_ROLE", newRoleId);
statements.add(insertRole);
statements.add(insertCompRole);
}
protected void addDefaultProtocolMappers() throws SQLException, DatabaseException {
String protocolMapperTableName = database.correctObjectName("PROTOCOL_MAPPER", Table.class);
String protocolMapperCfgTableName = database.correctObjectName("PROTOCOL_MAPPER_CONFIG", Table.class);
PreparedStatement statement = jdbcConnection.prepareStatement("select ID, NAME, ALLOWED_CLAIMS_MASK from " + getTableName("CLIENT"));
try {
ResultSet resultSet = statement.executeQuery();
try {
boolean first = true;
while (resultSet.next()) {
if (first) {
confirmationMessage.append("Migrating claimsMask to protocol mappers for clients: ");
first = false;
}
Object acmObj = resultSet.getObject("ALLOWED_CLAIMS_MASK");
long mask = (acmObj != null) ? ((Number) acmObj).longValue() : ClaimMask.ALL;
MigrationProvider migrationProvider = this.kcSession.getProvider(MigrationProvider.class);
List<ProtocolMapperRepresentation> protocolMappers = migrationProvider.getMappersForClaimMask(mask);
for (ProtocolMapperRepresentation protocolMapper : protocolMappers) {
String mapperId = KeycloakModelUtils.generateId();
InsertStatement insert = new InsertStatement(null, null, protocolMapperTableName)
.addColumnValue("ID", mapperId)
.addColumnValue("PROTOCOL", protocolMapper.getProtocol())
.addColumnValue("NAME", protocolMapper.getName())
.addColumnValue("CONSENT_REQUIRED", protocolMapper.isConsentRequired())
.addColumnValue("CONSENT_TEXT", protocolMapper.getConsentText())
.addColumnValue("PROTOCOL_MAPPER_NAME", protocolMapper.getProtocolMapper())
.addColumnValue("CLIENT_ID", resultSet.getString("ID"));
statements.add(insert);
for (Map.Entry<String, String> cfgEntry : protocolMapper.getConfig().entrySet()) {
InsertStatement cfgInsert = new InsertStatement(null, null, protocolMapperCfgTableName)
.addColumnValue("PROTOCOL_MAPPER_ID", mapperId)
.addColumnValue("NAME", cfgEntry.getKey())
.addColumnValue("VALUE", cfgEntry.getValue());
statements.add(cfgInsert);
}
}
confirmationMessage.append(resultSet.getString("NAME") + ", ");
}
// It means that some provider where processed
if (!first) {
confirmationMessage.append(". ");
}
} finally {
resultSet.close();
}
} finally {
statement.close();
}
}
}
@@ -0,0 +1,53 @@
package org.keycloak.connections.jpa.updater.liquibase.custom;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import liquibase.datatype.DataTypeFactory;
import liquibase.exception.CustomChangeException;
import liquibase.statement.core.InsertStatement;
import liquibase.structure.core.Table;
/**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
*/
public class JpaUpdate1_2_0_CR1 extends CustomKeycloakTask {
@Override
protected void generateStatementsImpl() throws CustomChangeException {
String realmClientTableName = database.correctObjectName("REALM_CLIENT", Table.class);
try {
String trueValue = DataTypeFactory.getInstance().getTrueBooleanValue(database);
PreparedStatement statement = jdbcConnection.prepareStatement("select CLIENT.REALM_ID, CLIENT.ID CLIENT_ID from " + getTableName("CLIENT") + " CLIENT where CLIENT.CONSENT_REQUIRED = " + trueValue);
try {
ResultSet resultSet = statement.executeQuery();
try {
while (resultSet.next()) {
String realmId = resultSet.getString("REALM_ID");
String oauthClientId = resultSet.getString("CLIENT_ID");
InsertStatement realmClientInsert = new InsertStatement(null, null, realmClientTableName)
.addColumnValue("REALM_ID", realmId)
.addColumnValue("CLIENT_ID", oauthClientId);
statements.add(realmClientInsert);
}
} finally {
resultSet.close();
}
} finally {
statement.close();
}
confirmationMessage.append("Inserted " + statements.size() + " OAuth Clients to REALM_CLIENT table");
} catch (Exception e) {
throw new CustomChangeException(getTaskId() + ": Exception when updating data from previous version", e);
}
}
@Override
protected String getTaskId() {
return "Update 1.2.0.CR1";
}
}
@@ -0,0 +1,54 @@
package org.keycloak.connections.jpa.updater.liquibase.custom;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import liquibase.datatype.DataTypeFactory;
import liquibase.exception.CustomChangeException;
import liquibase.statement.core.InsertStatement;
import liquibase.statement.core.UpdateStatement;
import liquibase.structure.core.Table;
import org.keycloak.models.utils.KeycloakModelUtils;
/**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
*/
public class JpaUpdate1_4_0_Final extends CustomKeycloakTask {
@Override
protected void generateStatementsImpl() throws CustomChangeException {
String userAttributeTableName = database.correctObjectName("USER_ATTRIBUTE", Table.class);
try {
PreparedStatement statement = jdbcConnection.prepareStatement("select NAME, USER_ID from " + getTableName("USER_ATTRIBUTE"));
try {
ResultSet resultSet = statement.executeQuery();
try {
while (resultSet.next()) {
String name = resultSet.getString(1);
String userId = resultSet.getString(2);
UpdateStatement updateStatement = new UpdateStatement(null, null, userAttributeTableName)
.addNewColumnValue("ID", KeycloakModelUtils.generateId())
.setWhereClause("NAME='" + name + "' AND USER_ID='" + userId + "'");
statements.add(updateStatement);
}
} finally {
resultSet.close();
}
} finally {
statement.close();
}
confirmationMessage.append("Updated " + statements.size() + " attributes in USER_ATTRIBUTE table");
} catch (Exception e) {
throw new CustomChangeException(getTaskId() + ": Exception when updating data from previous version", e);
}
}
@Override
protected String getTaskId() {
return "Update 1.4.0.Final";
}
}
@@ -0,0 +1,420 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.2.xsd">
<changeSet author="sthorger@redhat.com" id="1.0.0.Final">
<createTable tableName="APPLICATION_DEFAULT_ROLES">
<column name="APPLICATION_ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
<column name="ROLE_ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
</createTable>
<createTable tableName="CLIENT">
<column name="DTYPE" type="VARCHAR(31)">
<constraints nullable="false"/>
</column>
<column name="ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
<column name="ALLOWED_CLAIMS_MASK" type="BIGINT"/>
<column name="ENABLED" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
<column name="FULL_SCOPE_ALLOWED" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
<column name="NAME" type="VARCHAR(255)"/>
<column name="NOT_BEFORE" type="INT"/>
<column name="PUBLIC_CLIENT" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
<column name="SECRET" type="VARCHAR(255)"/>
<column name="BASE_URL" type="VARCHAR(255)"/>
<column name="BEARER_ONLY" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
<column name="MANAGEMENT_URL" type="VARCHAR(255)"/>
<column name="SURROGATE_AUTH_REQUIRED" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
<column name="DIRECT_GRANTS_ONLY" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
<column name="REALM_ID" type="VARCHAR(36)"/>
</createTable>
<createTable tableName="CLIENT_SESSION">
<column name="ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
<column name="ACTION" type="INT"/>
<column name="CLIENT_ID" type="VARCHAR(36)"/>
<column name="REDIRECT_URI" type="VARCHAR(255)"/>
<column name="STATE" type="VARCHAR(255)"/>
<column name="TIMESTAMP" type="INT"/>
<column name="SESSION_ID" type="VARCHAR(36)"/>
</createTable>
<createTable tableName="CLIENT_SESSION_ROLE">
<column name="ROLE_ID" type="VARCHAR(255)">
<constraints nullable="false"/>
</column>
<column name="CLIENT_SESSION" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
</createTable>
<createTable tableName="COMPOSITE_ROLE">
<column name="COMPOSITE" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
<column name="CHILD_ROLE" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
</createTable>
<createTable tableName="CREDENTIAL">
<column name="ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
<column name="DEVICE" type="VARCHAR(255)"/>
<column name="HASH_ITERATIONS" type="INT"/>
<column name="SALT" type="BLOB(16)"/>
<column name="TYPE" type="VARCHAR(255)"/>
<column name="VALUE" type="VARCHAR(255)"/>
<column name="USER_ID" type="VARCHAR(36)"/>
</createTable>
<createTable tableName="EVENT_ENTITY">
<column name="ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
<column name="CLIENT_ID" type="VARCHAR(255)"/>
<column name="DETAILS_JSON" type="VARCHAR(2550)"/>
<column name="ERROR" type="VARCHAR(255)"/>
<column name="IP_ADDRESS" type="VARCHAR(255)"/>
<column name="REALM_ID" type="VARCHAR(255)"/>
<column name="SESSION_ID" type="VARCHAR(255)"/>
<column name="TIME" type="BIGINT"/>
<column name="TYPE" type="VARCHAR(255)"/>
<column name="USER_ID" type="VARCHAR(255)"/>
</createTable>
<createTable tableName="FED_PROVIDERS">
<column name="REALM_ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
<column name="USERFEDERATIONPROVIDERS_ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
</createTable>
<createTable tableName="KEYCLOAK_ROLE">
<column name="ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
<column name="APP_REALM_CONSTRAINT" type="VARCHAR(36)"/>
<column name="APPLICATION_ROLE" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
<column name="DESCRIPTION" type="VARCHAR(255)"/>
<column name="NAME" type="VARCHAR(255)"/>
<column name="REALM_ID" type="VARCHAR(255)"/>
<column name="APPLICATION" type="VARCHAR(36)"/>
<column name="REALM" type="VARCHAR(36)"/>
</createTable>
<createTable tableName="REALM">
<column name="ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
<column name="ACCESS_CODE_LIFESPAN" type="INT"/>
<column name="USER_ACTION_LIFESPAN" type="INT"/>
<column name="ACCESS_TOKEN_LIFESPAN" type="INT"/>
<column name="ACCOUNT_THEME" type="VARCHAR(255)"/>
<column name="ADMIN_THEME" type="VARCHAR(255)"/>
<column name="EMAIL_THEME" type="VARCHAR(255)"/>
<column name="ENABLED" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
<column name="EVENTS_ENABLED" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
<column name="EVENTS_EXPIRATION" type="BIGINT"/>
<column name="LOGIN_THEME" type="VARCHAR(255)"/>
<column name="NAME" type="VARCHAR(255)"/>
<column name="NOT_BEFORE" type="INT"/>
<column name="PASSWORD_CRED_GRANT_ALLOWED" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
<column name="PASSWORD_POLICY" type="VARCHAR(255)"/>
<column name="PRIVATE_KEY" type="VARCHAR(2048)"/>
<column name="PUBLIC_KEY" type="VARCHAR(2048)"/>
<column name="REGISTRATION_ALLOWED" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
<column name="REMEMBER_ME" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
<column name="RESET_PASSWORD_ALLOWED" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
<column name="SOCIAL" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
<column name="SSL_REQUIRED" type="VARCHAR(255)"/>
<column name="SSO_IDLE_TIMEOUT" type="INT"/>
<column name="SSO_MAX_LIFESPAN" type="INT"/>
<column name="UPDATE_PROFILE_ON_SOC_LOGIN" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
<column name="VERIFY_EMAIL" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
<column name="MASTER_ADMIN_APP" type="VARCHAR(36)"/>
</createTable>
<createTable tableName="REALM_APPLICATION">
<column name="APPLICATION_ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
<column name="REALM_ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
</createTable>
<createTable tableName="REALM_ATTRIBUTE">
<column name="NAME" type="VARCHAR(255)">
<constraints nullable="false"/>
</column>
<column name="VALUE" type="VARCHAR(255)"/>
<column name="REALM_ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
</createTable>
<createTable tableName="REALM_DEFAULT_ROLES">
<column name="REALM_ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
<column name="ROLE_ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
</createTable>
<createTable tableName="REALM_EVENTS_LISTENERS">
<column name="REALM_ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
<column name="VALUE" type="VARCHAR(255)"/>
</createTable>
<createTable tableName="REALM_REQUIRED_CREDENTIAL">
<column name="TYPE" type="VARCHAR(255)">
<constraints nullable="false"/>
</column>
<column name="FORM_LABEL" type="VARCHAR(255)"/>
<column name="INPUT" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
<column name="SECRET" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
<column name="REALM_ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
</createTable>
<createTable tableName="REALM_SMTP_CONFIG">
<column name="REALM_ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
<column name="VALUE" type="VARCHAR(255)"/>
<column name="NAME" type="VARCHAR(255)">
<constraints nullable="false"/>
</column>
</createTable>
<createTable tableName="REALM_SOCIAL_CONFIG">
<column name="REALM_ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
<column name="VALUE" type="VARCHAR(255)"/>
<column name="NAME" type="VARCHAR(255)">
<constraints nullable="false"/>
</column>
</createTable>
<createTable tableName="REDIRECT_URIS">
<column name="CLIENT_ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
<column name="VALUE" type="VARCHAR(255)"/>
</createTable>
<createTable tableName="SCOPE_MAPPING">
<column name="CLIENT_ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
<column name="ROLE_ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
</createTable>
<createTable tableName="USERNAME_LOGIN_FAILURE">
<column name="REALM_ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
<column name="USERNAME" type="VARCHAR(200)">
<constraints nullable="false"/>
</column>
<column name="FAILED_LOGIN_NOT_BEFORE" type="INT"/>
<column name="LAST_FAILURE" type="BIGINT"/>
<column name="LAST_IP_FAILURE" type="VARCHAR(255)"/>
<column name="NUM_FAILURES" type="INT"/>
</createTable>
<createTable tableName="USER_ATTRIBUTE">
<column name="NAME" type="VARCHAR(255)">
<constraints nullable="false"/>
</column>
<column name="VALUE" type="VARCHAR(255)"/>
<column name="USER_ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
</createTable>
<createTable tableName="USER_ENTITY">
<column name="ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
<column name="EMAIL" type="VARCHAR(255)"/>
<column name="EMAIL_CONSTRAINT" type="VARCHAR(255)"/>
<column name="EMAIL_VERIFIED" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
<column name="ENABLED" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
<column name="FEDERATION_LINK" type="VARCHAR(255)"/>
<column name="FIRST_NAME" type="VARCHAR(255)"/>
<column name="LAST_NAME" type="VARCHAR(255)"/>
<column name="REALM_ID" type="VARCHAR(255)"/>
<column name="TOTP" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
<column name="USERNAME" type="VARCHAR(255)"/>
</createTable>
<createTable tableName="USER_FEDERATION_CONFIG">
<column name="USER_FEDERATION_PROVIDER_ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
<column name="VALUE" type="VARCHAR(255)"/>
<column name="NAME" type="VARCHAR(255)">
<constraints nullable="false"/>
</column>
</createTable>
<createTable tableName="USER_FEDERATION_PROVIDER">
<column name="ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
<column name="CHANGED_SYNC_PERIOD" type="INT"/>
<column name="DISPLAY_NAME" type="VARCHAR(255)"/>
<column name="FULL_SYNC_PERIOD" type="INT"/>
<column name="LAST_SYNC" type="INT"/>
<column name="PRIORITY" type="INT"/>
<column name="PROVIDER_NAME" type="VARCHAR(255)"/>
<column name="REALM_ID" type="VARCHAR(36)"/>
</createTable>
<createTable tableName="USER_REQUIRED_ACTION">
<column name="ACTION" type="INT">
<constraints nullable="false"/>
</column>
<column name="USER_ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
</createTable>
<createTable tableName="USER_ROLE_MAPPING">
<column name="ROLE_ID" type="VARCHAR(255)">
<constraints nullable="false"/>
</column>
<column name="USER_ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
</createTable>
<createTable tableName="USER_SESSION">
<column name="ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
<column name="AUTH_METHOD" type="VARCHAR(255)"/>
<column name="IP_ADDRESS" type="VARCHAR(255)"/>
<column name="LAST_SESSION_REFRESH" type="INT"/>
<column name="LOGIN_USERNAME" type="VARCHAR(255)"/>
<column name="REALM_ID" type="VARCHAR(255)"/>
<column name="REMEMBER_ME" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
<column name="STARTED" type="INT"/>
<column name="USER_ID" type="VARCHAR(255)"/>
</createTable>
<createTable tableName="USER_SOCIAL_LINK">
<column name="SOCIAL_PROVIDER" type="VARCHAR(255)">
<constraints nullable="false"/>
</column>
<column name="REALM_ID" type="VARCHAR(255)"/>
<column name="SOCIAL_USER_ID" type="VARCHAR(255)"/>
<column name="SOCIAL_USERNAME" type="VARCHAR(255)"/>
<column name="USER_ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
</createTable>
<createTable tableName="WEB_ORIGINS">
<column name="CLIENT_ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
<column name="VALUE" type="VARCHAR(255)"/>
</createTable>
<addPrimaryKey columnNames="REALM_ID, NAME" constraintName="CONSTRAINT_1" tableName="REALM_SOCIAL_CONFIG"/>
<addPrimaryKey columnNames="REALM_ID, USERNAME" constraintName="CONSTRAINT_17" tableName="USERNAME_LOGIN_FAILURE"/>
<addPrimaryKey columnNames="ACTION, USER_ID" constraintName="CONSTRAINT_2" tableName="USER_REQUIRED_ACTION"/>
<addPrimaryKey columnNames="SOCIAL_PROVIDER, USER_ID" constraintName="CONSTRAINT_3" tableName="USER_SOCIAL_LINK"/>
<addPrimaryKey columnNames="ID" constraintName="CONSTRAINT_4" tableName="EVENT_ENTITY"/>
<addPrimaryKey columnNames="ID" constraintName="CONSTRAINT_4A" tableName="REALM"/>
<addPrimaryKey columnNames="CLIENT_SESSION, ROLE_ID" constraintName="CONSTRAINT_5" tableName="CLIENT_SESSION_ROLE"/>
<addPrimaryKey columnNames="ID" constraintName="CONSTRAINT_57" tableName="USER_SESSION"/>
<addPrimaryKey columnNames="ID" constraintName="CONSTRAINT_5C" tableName="USER_FEDERATION_PROVIDER"/>
<addPrimaryKey columnNames="NAME, USER_ID" constraintName="CONSTRAINT_6" tableName="USER_ATTRIBUTE"/>
<addPrimaryKey columnNames="ID" constraintName="CONSTRAINT_7" tableName="CLIENT"/>
<addPrimaryKey columnNames="ID" constraintName="CONSTRAINT_8" tableName="CLIENT_SESSION"/>
<addPrimaryKey columnNames="CLIENT_ID, ROLE_ID" constraintName="CONSTRAINT_81" tableName="SCOPE_MAPPING"/>
<addPrimaryKey columnNames="NAME, REALM_ID" constraintName="CONSTRAINT_9" tableName="REALM_ATTRIBUTE"/>
<addPrimaryKey columnNames="REALM_ID, TYPE" constraintName="CONSTRAINT_92" tableName="REALM_REQUIRED_CREDENTIAL"/>
<addPrimaryKey columnNames="ID" constraintName="CONSTRAINT_A" tableName="KEYCLOAK_ROLE"/>
<addPrimaryKey columnNames="ROLE_ID, USER_ID" constraintName="CONSTRAINT_C" tableName="USER_ROLE_MAPPING"/>
<addPrimaryKey columnNames="REALM_ID, NAME" constraintName="CONSTRAINT_E" tableName="REALM_SMTP_CONFIG"/>
<addPrimaryKey columnNames="ID" constraintName="CONSTRAINT_F" tableName="CREDENTIAL"/>
<addPrimaryKey columnNames="USER_FEDERATION_PROVIDER_ID, NAME" constraintName="CONSTRAINT_F9" tableName="USER_FEDERATION_CONFIG"/>
<addPrimaryKey columnNames="ID" constraintName="CONSTRAINT_FB" tableName="USER_ENTITY"/>
<addUniqueConstraint columnNames="ROLE_ID" constraintName="UK_8AELWNIBJI49AVXSRTUF6XJOW" tableName="APPLICATION_DEFAULT_ROLES"/>
<addUniqueConstraint columnNames="REALM_ID,NAME" constraintName="UK_B71CJLBENV945RB6GCON438AT" tableName="CLIENT"/>
<addUniqueConstraint columnNames="USERFEDERATIONPROVIDERS_ID" constraintName="UK_DCCIRJLIPU1478VQC89DID88C" tableName="FED_PROVIDERS"/>
<addUniqueConstraint columnNames="REALM_ID,EMAIL_CONSTRAINT" constraintName="UK_DYKN684SL8UP1CRFEI6ECKHD7" tableName="USER_ENTITY"/>
<addUniqueConstraint columnNames="ROLE_ID" constraintName="UK_H4WPD7W4HSOOLNI3H0SW7BTJE" tableName="REALM_DEFAULT_ROLES"/>
<addUniqueConstraint columnNames="NAME,APP_REALM_CONSTRAINT" constraintName="UK_J3RWUVD56ONTGSUHOGM184WW2" tableName="KEYCLOAK_ROLE"/>
<addUniqueConstraint columnNames="REALM_ID" constraintName="UK_L5QGA3RFME47335JY8JXYXH3I" tableName="REALM_APPLICATION"/>
<addUniqueConstraint columnNames="NAME" constraintName="UK_ORVSDMLA56612EAEFIQ6WL5OI" tableName="REALM"/>
<addUniqueConstraint columnNames="REALM_ID,USERNAME" constraintName="UK_RU8TT6T700S9V50BU18WS5HA6" tableName="USER_ENTITY"/>
<addForeignKeyConstraint baseColumnNames="CLIENT_SESSION" baseTableName="CLIENT_SESSION_ROLE" constraintName="FK_11B7SGQW18I532811V7O2DV76" referencedColumnNames="ID" referencedTableName="CLIENT_SESSION"/>
<addForeignKeyConstraint baseColumnNames="CLIENT_ID" baseTableName="REDIRECT_URIS" constraintName="FK_1BURS8PB4OUJ97H5WUPPAHV9F" referencedColumnNames="ID" referencedTableName="CLIENT"/>
<addForeignKeyConstraint baseColumnNames="REALM_ID" baseTableName="USER_FEDERATION_PROVIDER" constraintName="FK_1FJ32F6PTOLW2QY60CD8N01E8" referencedColumnNames="ID" referencedTableName="REALM"/>
<addForeignKeyConstraint baseColumnNames="REALM_ID" baseTableName="FED_PROVIDERS" constraintName="FK_213LYQ09FKXQ8K8NY8DY3737T" referencedColumnNames="ID" referencedTableName="REALM"/>
<addForeignKeyConstraint baseColumnNames="REALM_ID" baseTableName="REALM_REQUIRED_CREDENTIAL" constraintName="FK_5HG65LYBEVAVKQFKI3KPONH9V" referencedColumnNames="ID" referencedTableName="REALM"/>
<addForeignKeyConstraint baseColumnNames="USER_ID" baseTableName="USER_ATTRIBUTE" constraintName="FK_5HRM2VLF9QL5FU043KQEPOVBR" referencedColumnNames="ID" referencedTableName="USER_ENTITY"/>
<addForeignKeyConstraint baseColumnNames="USER_ID" baseTableName="USER_SOCIAL_LINK" constraintName="FK_68CJYS5UWM55UY823Y75XG4OM" referencedColumnNames="ID" referencedTableName="USER_ENTITY"/>
<addForeignKeyConstraint baseColumnNames="USER_ID" baseTableName="USER_REQUIRED_ACTION" constraintName="FK_6QJ3W1JW9CVAFHE19BWSIUVMD" referencedColumnNames="ID" referencedTableName="USER_ENTITY"/>
<addForeignKeyConstraint baseColumnNames="REALM" baseTableName="KEYCLOAK_ROLE" constraintName="FK_6VYQFE4CN4WLQ8R6KT5VDSJ5C" referencedColumnNames="ID" referencedTableName="REALM"/>
<addForeignKeyConstraint baseColumnNames="REALM_ID" baseTableName="REALM_SMTP_CONFIG" constraintName="FK_70EJ8XDXGXD0B9HH6180IRR0O" referencedColumnNames="ID" referencedTableName="REALM"/>
<addForeignKeyConstraint baseColumnNames="APPLICATION_ID" baseTableName="REALM_APPLICATION" constraintName="FK_71S3P0DIUXAWWQQSA528UBY2Q" referencedColumnNames="ID" referencedTableName="REALM"/>
<addForeignKeyConstraint baseColumnNames="ROLE_ID" baseTableName="APPLICATION_DEFAULT_ROLES" constraintName="FK_8AELWNIBJI49AVXSRTUF6XJOW" referencedColumnNames="ID" referencedTableName="KEYCLOAK_ROLE"/>
<addForeignKeyConstraint baseColumnNames="REALM_ID" baseTableName="REALM_ATTRIBUTE" constraintName="FK_8SHXD6L3E9ATQUKACXGPFFPTW" referencedColumnNames="ID" referencedTableName="REALM"/>
<addForeignKeyConstraint baseColumnNames="COMPOSITE" baseTableName="COMPOSITE_ROLE" constraintName="FK_A63WVEKFTU8JO1PNJ81E7MCE2" referencedColumnNames="ID" referencedTableName="KEYCLOAK_ROLE"/>
<addForeignKeyConstraint baseColumnNames="SESSION_ID" baseTableName="CLIENT_SESSION" constraintName="FK_B4AO2VCVAT6UKAU74WBWTFQO1" referencedColumnNames="ID" referencedTableName="USER_SESSION"/>
<addForeignKeyConstraint baseColumnNames="USER_ID" baseTableName="USER_ROLE_MAPPING" constraintName="FK_C4FQV34P1MBYLLOXANG7B1Q3L" referencedColumnNames="ID" referencedTableName="USER_ENTITY"/>
<addForeignKeyConstraint baseColumnNames="USERFEDERATIONPROVIDERS_ID" baseTableName="FED_PROVIDERS" constraintName="FK_DCCIRJLIPU1478VQC89DID88C" referencedColumnNames="ID" referencedTableName="USER_FEDERATION_PROVIDER"/>
<addForeignKeyConstraint baseColumnNames="REALM_ID" baseTableName="REALM_DEFAULT_ROLES" constraintName="FK_EVUDB1PPW84OXFAX2DRS03ICC" referencedColumnNames="ID" referencedTableName="REALM"/>
<addForeignKeyConstraint baseColumnNames="CHILD_ROLE" baseTableName="COMPOSITE_ROLE" constraintName="FK_GR7THLLB9LU8Q4VQA4524JJY8" referencedColumnNames="ID" referencedTableName="KEYCLOAK_ROLE"/>
<addForeignKeyConstraint baseColumnNames="ROLE_ID" baseTableName="REALM_DEFAULT_ROLES" constraintName="FK_H4WPD7W4HSOOLNI3H0SW7BTJE" referencedColumnNames="ID" referencedTableName="KEYCLOAK_ROLE"/>
<addForeignKeyConstraint baseColumnNames="REALM_ID" baseTableName="REALM_EVENTS_LISTENERS" constraintName="FK_H846O4H0W8EPX5NXEV9F5Y69J" referencedColumnNames="ID" referencedTableName="REALM"/>
<addForeignKeyConstraint baseColumnNames="REALM_ID" baseTableName="REALM_APPLICATION" constraintName="FK_L5QGA3RFME47335JY8JXYXH3I" referencedColumnNames="ID" referencedTableName="CLIENT"/>
<addForeignKeyConstraint baseColumnNames="CLIENT_ID" baseTableName="WEB_ORIGINS" constraintName="FK_LOJPHO213XCX4WNKOG82SSRFY" referencedColumnNames="ID" referencedTableName="CLIENT"/>
<addForeignKeyConstraint baseColumnNames="APPLICATION_ID" baseTableName="APPLICATION_DEFAULT_ROLES" constraintName="FK_MAYLTS7KLWQW2H8M2B5JOYTKY" referencedColumnNames="ID" referencedTableName="CLIENT"/>
<addForeignKeyConstraint baseColumnNames="CLIENT_ID" baseTableName="SCOPE_MAPPING" constraintName="FK_OUSE064PLMLR732LXJCN1Q5F1" referencedColumnNames="ID" referencedTableName="CLIENT"/>
<addForeignKeyConstraint baseColumnNames="ROLE_ID" baseTableName="SCOPE_MAPPING" constraintName="FK_P3RH9GRKU11KQFRS4FLTT7RNQ" referencedColumnNames="ID" referencedTableName="KEYCLOAK_ROLE"/>
<addForeignKeyConstraint baseColumnNames="REALM_ID" baseTableName="CLIENT" constraintName="FK_P56CTINXXB9GSK57FO49F9TAC" referencedColumnNames="ID" referencedTableName="REALM"/>
<addForeignKeyConstraint baseColumnNames="USER_ID" baseTableName="CREDENTIAL" constraintName="FK_PFYR0GLASQYL0DEI3KL69R6V0" referencedColumnNames="ID" referencedTableName="USER_ENTITY"/>
<addForeignKeyConstraint baseColumnNames="APPLICATION" baseTableName="KEYCLOAK_ROLE" constraintName="FK_PIMO5LE2C0RAL09FL8CM9WFW9" referencedColumnNames="ID" referencedTableName="CLIENT"/>
<addForeignKeyConstraint baseColumnNames="MASTER_ADMIN_APP" baseTableName="REALM" constraintName="FK_RSAF444KK6QRKMS7N56AIWQ5Y" referencedColumnNames="ID" referencedTableName="CLIENT"/>
<addForeignKeyConstraint baseColumnNames="REALM_ID" baseTableName="REALM_SOCIAL_CONFIG" constraintName="FK_SV5I3C2TI7G0G922FGE683SOV" referencedColumnNames="ID" referencedTableName="REALM"/>
<addForeignKeyConstraint baseColumnNames="USER_FEDERATION_PROVIDER_ID" baseTableName="USER_FEDERATION_CONFIG" constraintName="FK_T13HPU1J94R2EBPEKR39X5EU5" referencedColumnNames="ID" referencedTableName="USER_FEDERATION_PROVIDER"/>
</changeSet>
</databaseChangeLog>
@@ -0,0 +1,59 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.2.xsd">
<changeSet author="sthorger@redhat.com" id="1.1.0.Beta1">
<delete tableName="CLIENT_SESSION_ROLE"/>
<delete tableName="CLIENT_SESSION"/>
<delete tableName="USER_SESSION"/>
<createTable tableName="CLIENT_ATTRIBUTES">
<column name="CLIENT_ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
<column name="VALUE" type="VARCHAR(2048)"/>
<column name="NAME" type="VARCHAR(255)">
<constraints nullable="false"/>
</column>
</createTable>
<createTable tableName="CLIENT_SESSION_NOTE">
<column name="NAME" type="VARCHAR(255)">
<constraints nullable="false"/>
</column>
<column name="VALUE" type="VARCHAR(255)"/>
<column name="CLIENT_SESSION" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
</createTable>
<createTable tableName="APP_NODE_REGISTRATIONS">
<column name="APPLICATION_ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
<column name="VALUE" type="INT"/>
<column name="NAME" type="VARCHAR(255)">
<constraints nullable="false"/>
</column>
</createTable>
<addColumn tableName="CLIENT_SESSION">
<column name="AUTH_METHOD" type="VARCHAR(255)"/>
</addColumn>
<addColumn tableName="CLIENT">
<column name="PROTOCOL" type="VARCHAR(255)"/>
</addColumn>
<addColumn tableName="CLIENT_SESSION">
<column name="REALM_ID" type="VARCHAR(255)"/>
</addColumn>
<addColumn tableName="REALM">
<column name="CERTIFICATE" type="VARCHAR(2048)"/>
<column name="CODE_SECRET" type="VARCHAR(255)"/>
</addColumn>
<addColumn tableName="CLIENT">
<column name="NODE_REREG_TIMEOUT" type="INT" defaultValueNumeric="0"/>
</addColumn>
<addPrimaryKey columnNames="CLIENT_ID, NAME" constraintName="CONSTRAINT_3C" tableName="CLIENT_ATTRIBUTES"/>
<addPrimaryKey columnNames="CLIENT_SESSION, NAME" constraintName="CONSTRAINT_5E" tableName="CLIENT_SESSION_NOTE"/>
<addPrimaryKey columnNames="APPLICATION_ID, NAME" constraintName="CONSTRAINT_84" tableName="APP_NODE_REGISTRATIONS"/>
<addForeignKeyConstraint baseColumnNames="CLIENT_ID" baseTableName="CLIENT_ATTRIBUTES" constraintName="FK3C47C64BEACCA966" referencedColumnNames="ID" referencedTableName="CLIENT"/>
<addForeignKeyConstraint baseColumnNames="CLIENT_SESSION" baseTableName="CLIENT_SESSION_NOTE" constraintName="FK5EDFB00FF51C2736" referencedColumnNames="ID" referencedTableName="CLIENT_SESSION"/>
<addForeignKeyConstraint baseColumnNames="APPLICATION_ID" baseTableName="APP_NODE_REGISTRATIONS" constraintName="FK8454723BA992F594" referencedColumnNames="ID" referencedTableName="CLIENT"/>
<customChange class="org.keycloak.connections.jpa.updater.liquibase.custom.AddRealmCodeSecret"/>
</changeSet>
</databaseChangeLog>
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.2.xsd">
<changeSet author="sthorger@redhat.com" id="1.1.0.Final">
<renameColumn tableName="EVENT_ENTITY" oldColumnName="TIME" newColumnName="EVENT_TIME" columnDataType="BIGINT"/>
</changeSet>
</databaseChangeLog>
@@ -0,0 +1,172 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">
<changeSet author="psilva@redhat.com" id="1.2.0.Beta1">
<delete tableName="CLIENT_SESSION_ROLE"/>
<delete tableName="CLIENT_SESSION_NOTE"/>
<delete tableName="CLIENT_SESSION"/>
<delete tableName="USER_SESSION"/>
<createTable tableName="PROTOCOL_MAPPER">
<column name="ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
<column name="NAME" type="VARCHAR(255)">
<constraints nullable="false"/>
</column>
<column name="PROTOCOL" type="VARCHAR(255)">
<constraints nullable="false"/>
</column>
<column name="PROTOCOL_MAPPER_NAME" type="VARCHAR(255)">
<constraints nullable="false"/>
</column>
<column name="CONSENT_REQUIRED" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
<column name="CONSENT_TEXT" type="VARCHAR(255)"/>
<column name="CLIENT_ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
</createTable>
<createTable tableName="PROTOCOL_MAPPER_CONFIG">
<column name="PROTOCOL_MAPPER_ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
<column name="VALUE" type="CLOB"/>
<column name="NAME" type="VARCHAR(255)">
<constraints nullable="false"/>
</column>
</createTable>
<createTable tableName="FEDERATED_IDENTITY">
<column name="IDENTITY_PROVIDER" type="VARCHAR(255)">
<constraints nullable="false"/>
</column>
<column name="REALM_ID" type="VARCHAR(36)"/>
<column name="FEDERATED_USER_ID" type="VARCHAR(255)"/>
<column name="FEDERATED_USERNAME" type="VARCHAR(255)"/>
<column name="TOKEN" type="TEXT"/>
<column name="USER_ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
</createTable>
<createTable tableName="IDENTITY_PROVIDER">
<column name="INTERNAL_ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
<column name="ENABLED" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
<column name="PROVIDER_ALIAS" type="VARCHAR(255)"/>
<column name="PROVIDER_ID" type="VARCHAR(255)"/>
<column name="UPDATE_PROFILE_FIRST_LOGIN" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
<column name="STORE_TOKEN" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
<column name="AUTHENTICATE_BY_DEFAULT" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
<column name="REALM_ID" type="VARCHAR(36)"/>
</createTable>
<createTable tableName="IDENTITY_PROVIDER_CONFIG">
<column name="IDENTITY_PROVIDER_ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
<column name="VALUE" type="CLOB"/>
<column name="NAME" type="VARCHAR(255)">
<constraints nullable="false"/>
</column>
</createTable>
<createTable tableName="CLIENT_IDENTITY_PROV_MAPPING">
<column name="CLIENT_ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
<column name="IDENTITY_PROVIDER_ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
<column name="RETRIEVE_TOKEN" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
</createTable>
<createTable tableName="REALM_SUPPORTED_LOCALES">
<column name="REALM_ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
<column name="VALUE" type="VARCHAR(255)"/>
</createTable>
<createTable tableName="USER_SESSION_NOTE">
<column name="USER_SESSION" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
<column name="NAME" type="VARCHAR(255)">
<constraints nullable="false"/>
</column>
<column name="VALUE" type="VARCHAR(2048)"/>
</createTable>
<addColumn tableName="CLIENT">
<column name="FRONTCHANNEL_LOGOUT" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
</addColumn>
<addColumn tableName="USER_SESSION">
<column name="USER_SESSION_STATE" type="INT" />
<column name="BROKER_SESSION_ID" type="VARCHAR(255)" />
<column name="BROKER_USER_ID" type="VARCHAR(255)" />
</addColumn>
<addPrimaryKey columnNames="ID" constraintName="CONSTRAINT_PCM" tableName="PROTOCOL_MAPPER"/>
<addPrimaryKey columnNames="INTERNAL_ID" constraintName="CONSTRAINT_2B" tableName="IDENTITY_PROVIDER"/>
<addPrimaryKey columnNames="IDENTITY_PROVIDER, USER_ID" constraintName="CONSTRAINT_40" tableName="FEDERATED_IDENTITY"/>
<addPrimaryKey columnNames="IDENTITY_PROVIDER_ID, NAME" constraintName="CONSTRAINT_D" tableName="IDENTITY_PROVIDER_CONFIG"/>
<addPrimaryKey columnNames="PROTOCOL_MAPPER_ID, NAME" constraintName="CONSTRAINT_PMConfig" tableName="PROTOCOL_MAPPER_CONFIG"/>
<addPrimaryKey columnNames="USER_SESSION, NAME" constraintName="CONSTRAINT_USN_PK" tableName="USER_SESSION_NOTE"/>
<addForeignKeyConstraint baseColumnNames="REALM_ID" baseTableName="IDENTITY_PROVIDER" constraintName="FK2B4EBC52AE5C3B34" referencedColumnNames="ID" referencedTableName="REALM"/>
<addForeignKeyConstraint baseColumnNames="CLIENT_ID" baseTableName="PROTOCOL_MAPPER" constraintName="FK_PCM_REALM" referencedColumnNames="ID" referencedTableName="CLIENT"/>
<addForeignKeyConstraint baseColumnNames="USER_ID" baseTableName="FEDERATED_IDENTITY" constraintName="FK404288B92EF007A6" referencedColumnNames="ID" referencedTableName="USER_ENTITY"/>
<addForeignKeyConstraint baseColumnNames="IDENTITY_PROVIDER_ID" baseTableName="IDENTITY_PROVIDER_CONFIG" constraintName="FKDC4897CF864C4E43" referencedColumnNames="INTERNAL_ID" referencedTableName="IDENTITY_PROVIDER"/>
<addForeignKeyConstraint baseColumnNames="PROTOCOL_MAPPER_ID" baseTableName="PROTOCOL_MAPPER_CONFIG" constraintName="FK_PMConfig" referencedColumnNames="ID" referencedTableName="PROTOCOL_MAPPER"/>
<addForeignKeyConstraint baseColumnNames="IDENTITY_PROVIDER_ID" baseTableName="CLIENT_IDENTITY_PROV_MAPPING" constraintName="FK_7CELWNIBJI49AVXSRTUF6XJ12" referencedColumnNames="INTERNAL_ID" referencedTableName="IDENTITY_PROVIDER"/>
<addForeignKeyConstraint baseColumnNames="CLIENT_ID" baseTableName="CLIENT_IDENTITY_PROV_MAPPING" constraintName="FK_56ELWNIBJI49AVXSRTUF6XJ23" referencedColumnNames="ID" referencedTableName="CLIENT"/>
<addForeignKeyConstraint baseColumnNames="REALM_ID" baseTableName="REALM_SUPPORTED_LOCALES" constraintName="FK_SUPPORTED_LOCALES_REALM" referencedColumnNames="ID" referencedTableName="REALM"/>
<addForeignKeyConstraint baseColumnNames="USER_SESSION" baseTableName="USER_SESSION_NOTE" constraintName="FK5EDFB00FF51D3472" referencedColumnNames="ID" referencedTableName="USER_SESSION"/>
<addUniqueConstraint columnNames="PROVIDER_ALIAS, REALM_ID" constraintName="UK_2DAELWNIBJI49AVXSRTUF6XJ33" tableName="IDENTITY_PROVIDER"/>
<addUniqueConstraint columnNames="IDENTITY_PROVIDER_ID,CLIENT_ID" constraintName="UK_7CAELWNIBJI49AVXSRTUF6XJ12" tableName="CLIENT_IDENTITY_PROV_MAPPING"/>
<addColumn tableName="REALM">
<column name="LOGIN_LIFESPAN" type="INT"/>
<column name="INTERNATIONALIZATION_ENABLED" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
<column name="DEFAULT_LOCALE" type="VARCHAR(255)" />
<column name="REG_EMAIL_AS_USERNAME" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
</addColumn>
<!-- KEYCLOAK-1106 APPLICATION_ID and REALM_ID switched in REALM_APPLICATION table -->
<dropForeignKeyConstraint baseTableName="REALM_APPLICATION" constraintName="FK_71S3P0DIUXAWWQQSA528UBY2Q" />
<dropForeignKeyConstraint baseTableName="REALM_APPLICATION" constraintName="FK_L5QGA3RFME47335JY8JXYXH3I" />
<dropUniqueConstraint tableName="REALM_APPLICATION" constraintName="UK_L5QGA3RFME47335JY8JXYXH3I" />
<renameColumn tableName="REALM_APPLICATION" oldColumnName="APPLICATION_ID" newColumnName="APPLICATION_ID_TMP" columnDataType="VARCHAR(36)"/>
<renameColumn tableName="REALM_APPLICATION" oldColumnName="REALM_ID" newColumnName="APPLICATION_ID" columnDataType="VARCHAR(36)"/>
<renameColumn tableName="REALM_APPLICATION" oldColumnName="APPLICATION_ID_TMP" newColumnName="REALM_ID" columnDataType="VARCHAR(36)"/>
<addUniqueConstraint columnNames="APPLICATION_ID" constraintName="UK_M6QGA3RFME47335JY8JXYXH3I" tableName="REALM_APPLICATION"/>
<addForeignKeyConstraint baseColumnNames="APPLICATION_ID" baseTableName="REALM_APPLICATION" constraintName="FK_82S3P0DIUXAWWQQSA528UBY2Q" referencedColumnNames="ID" referencedTableName="CLIENT"/>
<addForeignKeyConstraint baseColumnNames="REALM_ID" baseTableName="REALM_APPLICATION" constraintName="FK_M6QGA3RFME47335JY8JXYXH3I" referencedColumnNames="ID" referencedTableName="REALM"/>
<customChange class="org.keycloak.connections.jpa.updater.liquibase.custom.JpaUpdate1_2_0_Beta1"/>
<!-- Remove obsolete 'social' and 'claims' stuff -->
<dropForeignKeyConstraint baseTableName="USER_SOCIAL_LINK" constraintName="FK_68CJYS5UWM55UY823Y75XG4OM" />
<dropTable tableName="USER_SOCIAL_LINK" cascadeConstraints="true" />
<dropForeignKeyConstraint baseTableName="REALM_SOCIAL_CONFIG" constraintName="FK_SV5I3C2TI7G0G922FGE683SOV" />
<dropTable tableName="REALM_SOCIAL_CONFIG" cascadeConstraints="true" />
<dropColumn tableName="CLIENT" columnName="ALLOWED_CLAIMS_MASK" />
<createTable tableName="REALM_ENABLED_EVENT_TYPES">
<column name="REALM_ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
<column name="VALUE" type="VARCHAR(255)"/>
</createTable>
<addForeignKeyConstraint baseColumnNames="REALM_ID" baseTableName="REALM_ENABLED_EVENT_TYPES" constraintName="FK_H846O4H0W8EPX5NWEDRF5Y69J" referencedColumnNames="ID" referencedTableName="REALM"/>
</changeSet>
</databaseChangeLog>
@@ -0,0 +1,147 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">
<changeSet author="bburke@redhat.com" id="1.2.0.RC1">
<delete tableName="CLIENT_SESSION_ROLE"/>
<delete tableName="CLIENT_SESSION_NOTE"/>
<delete tableName="CLIENT_SESSION"/>
<delete tableName="USER_SESSION_NOTE"/>
<delete tableName="USER_SESSION"/>
<createTable tableName="MIGRATION_MODEL">
<column name="ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
<column name="VERSION" type="VARCHAR(36)">
<constraints nullable="true"/>
</column>
</createTable>
<createTable tableName="IDENTITY_PROVIDER_MAPPER">
<column name="ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
<column name="NAME" type="VARCHAR(255)">
<constraints nullable="false"/>
</column>
<column name="IDP_ALIAS" type="VARCHAR(255)">
<constraints nullable="false"/>
</column>
<column name="IDP_MAPPER_NAME" type="VARCHAR(255)">
<constraints nullable="false"/>
</column>
<column name="REALM_ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
</createTable>
<createTable tableName="IDP_MAPPER_CONFIG">
<column name="IDP_MAPPER_ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
<column name="VALUE" type="CLOB"/>
<column name="NAME" type="VARCHAR(255)">
<constraints nullable="false"/>
</column>
</createTable>
<addColumn tableName="CREDENTIAL">
<column name="CREATED_DATE" type="BIGINT"/>
</addColumn>
<createTable tableName="USER_CONSENT">
<column name="ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
<column name="CLIENT_ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
<column name="USER_ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
</createTable>
<createTable tableName="USER_CONSENT_ROLE">
<column name="USER_CONSENT_ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
<column name="ROLE_ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
</createTable>
<createTable tableName="USER_CONSENT_PROT_MAPPER">
<column name="USER_CONSENT_ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
<column name="PROTOCOL_MAPPER_ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
</createTable>
<createTable tableName="CLIENT_SESSION_PROT_MAPPER">
<column name="PROTOCOL_MAPPER_ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
<column name="CLIENT_SESSION" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
</createTable>
<addPrimaryKey columnNames="ID" constraintName="CONSTRAINT_MIGMOD" tableName="MIGRATION_MODEL"/>
<addPrimaryKey columnNames="ID" constraintName="CONSTRAINT_IDPM" tableName="IDENTITY_PROVIDER_MAPPER"/>
<addPrimaryKey columnNames="IDP_MAPPER_ID, NAME" constraintName="CONSTRAINT_IDPMConfig" tableName="IDP_MAPPER_CONFIG"/>
<addPrimaryKey columnNames="ID" constraintName="CONSTRAINT_GRNTCSNT_PM" tableName="USER_CONSENT"/>
<addPrimaryKey columnNames="USER_CONSENT_ID, ROLE_ID" constraintName="CONSTRAINT_GRNTCSNT_ROLE_PM" tableName="USER_CONSENT_ROLE"/>
<addPrimaryKey columnNames="USER_CONSENT_ID, PROTOCOL_MAPPER_ID" constraintName="CONSTRAINT_GRNTCSNT_PRM_PM" tableName="USER_CONSENT_PROT_MAPPER"/>
<addPrimaryKey columnNames="CLIENT_SESSION, PROTOCOL_MAPPER_ID" constraintName="CONSTRAINT_CS_PMP_PK" tableName="CLIENT_SESSION_PROT_MAPPER"/>
<addForeignKeyConstraint baseColumnNames="REALM_ID" baseTableName="IDENTITY_PROVIDER_MAPPER" constraintName="FK_IDPM_REALM" referencedColumnNames="ID" referencedTableName="REALM"/>
<addForeignKeyConstraint baseColumnNames="IDP_MAPPER_ID" baseTableName="IDP_MAPPER_CONFIG" constraintName="FK_IDPMConfig" referencedColumnNames="ID" referencedTableName="IDENTITY_PROVIDER_MAPPER"/>
<addForeignKeyConstraint baseColumnNames="USER_ID" baseTableName="USER_CONSENT" constraintName="FK_GRNTCSNT_USER" referencedColumnNames="ID" referencedTableName="USER_ENTITY"/>
<addForeignKeyConstraint baseColumnNames="USER_CONSENT_ID" baseTableName="USER_CONSENT_ROLE" constraintName="FK_GRNTCSNT_ROLE_GR" referencedColumnNames="ID" referencedTableName="USER_CONSENT"/>
<addForeignKeyConstraint baseColumnNames="USER_CONSENT_ID" baseTableName="USER_CONSENT_PROT_MAPPER" constraintName="FK_GRNTCSNT_PRM_GR" referencedColumnNames="ID" referencedTableName="USER_CONSENT"/>
<addForeignKeyConstraint baseColumnNames="CLIENT_SESSION" baseTableName="CLIENT_SESSION_PROT_MAPPER" constraintName="FK_33A8SGQW18I532811V7O2DK89" referencedColumnNames="ID" referencedTableName="CLIENT_SESSION"/>
<renameColumn tableName="CLIENT" newColumnName="CLIENT_ID" oldColumnName="NAME" columnDataType="VARCHAR(255)"/>
<addColumn tableName="CLIENT">
<column name="CONSENT_REQUIRED" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
<column name="NAME" type="VARCHAR(255)" />
</addColumn>
<addColumn tableName="IDENTITY_PROVIDER">
<column name="ADD_TOKEN_ROLE" type="BOOLEAN" defaultValueBoolean="true">
<constraints nullable="false"/>
</column>
</addColumn>
<update tableName="CLIENT">
<column name="CONSENT_REQUIRED" valueBoolean="true"/>
<where>DTYPE = 'OAuthClientEntity'</where>
</update>
<dropColumn tableName="CLIENT" columnName="DTYPE"/>
<dropForeignKeyConstraint baseTableName="REALM" constraintName="FK_RSAF444KK6QRKMS7N56AIWQ5Y" />
<renameColumn tableName="REALM" newColumnName="MASTER_ADMIN_CLIENT" oldColumnName="MASTER_ADMIN_APP" columnDataType="VARCHAR(36)"/>
<addForeignKeyConstraint baseColumnNames="MASTER_ADMIN_CLIENT" baseTableName="REALM" constraintName="FK_TRAF444KK6QRKMS7N56AIWQ5Y" referencedColumnNames="ID" referencedTableName="CLIENT"/>
<dropForeignKeyConstraint baseTableName="REALM_APPLICATION" constraintName="FK_82S3P0DIUXAWWQQSA528UBY2Q" />
<renameTable oldTableName="REALM_APPLICATION" newTableName="REALM_CLIENT"/>
<renameColumn tableName="REALM_CLIENT" newColumnName="CLIENT_ID" oldColumnName="APPLICATION_ID" columnDataType="VARCHAR(36)"/>
<addForeignKeyConstraint baseColumnNames="CLIENT_ID" baseTableName="REALM_CLIENT" constraintName="FK_93S3P0DIUXAWWQQSA528UBY2Q" referencedColumnNames="ID" referencedTableName="CLIENT"/>
<dropForeignKeyConstraint baseTableName="APPLICATION_DEFAULT_ROLES" constraintName="FK_MAYLTS7KLWQW2H8M2B5JOYTKY" />
<renameTable oldTableName="APPLICATION_DEFAULT_ROLES" newTableName="CLIENT_DEFAULT_ROLES"/>
<renameColumn tableName="CLIENT_DEFAULT_ROLES" newColumnName="CLIENT_ID" oldColumnName="APPLICATION_ID" columnDataType="VARCHAR(36)"/>
<addForeignKeyConstraint baseColumnNames="CLIENT_ID" baseTableName="CLIENT_DEFAULT_ROLES" constraintName="FK_NUILTS7KLWQW2H8M2B5JOYTKY" referencedColumnNames="ID" referencedTableName="CLIENT"/>
<dropForeignKeyConstraint baseTableName="APP_NODE_REGISTRATIONS" constraintName="FK8454723BA992F594" />
<renameTable oldTableName="APP_NODE_REGISTRATIONS" newTableName="CLIENT_NODE_REGISTRATIONS"/>
<renameColumn tableName="CLIENT_NODE_REGISTRATIONS" newColumnName="CLIENT_ID" oldColumnName="APPLICATION_ID" columnDataType="VARCHAR(36)"/>
<addForeignKeyConstraint baseColumnNames="CLIENT_ID" baseTableName="CLIENT_NODE_REGISTRATIONS" constraintName="FK4129723BA992F594" referencedColumnNames="ID" referencedTableName="CLIENT"/>
<dropForeignKeyConstraint baseTableName="KEYCLOAK_ROLE" constraintName="FK_PIMO5LE2C0RAL09FL8CM9WFW9" />
<renameColumn tableName="KEYCLOAK_ROLE" newColumnName="CLIENT" oldColumnName="APPLICATION" columnDataType="VARCHAR(36)"/>
<renameColumn tableName="KEYCLOAK_ROLE" newColumnName="CLIENT_ROLE" oldColumnName="APPLICATION_ROLE" columnDataType="BOOLEAN"/>
<renameColumn tableName="KEYCLOAK_ROLE" newColumnName="CLIENT_REALM_CONSTRAINT" oldColumnName="APP_REALM_CONSTRAINT" columnDataType="VARCHAR(36)"/>
<addForeignKeyConstraint baseColumnNames="CLIENT" baseTableName="KEYCLOAK_ROLE" constraintName="FK_KJHO5LE2C0RAL09FL8CM9WFW9" referencedColumnNames="ID" referencedTableName="CLIENT"/>
<dropUniqueConstraint tableName="KEYCLOAK_ROLE" constraintName="UK_J3RWUVD56ONTGSUHOGM184WW2"/>
<addUniqueConstraint columnNames="NAME,CLIENT_REALM_CONSTRAINT" constraintName="UK_J3RWUVD56ONTGSUHOGM184WW2-2" tableName="KEYCLOAK_ROLE"/>
<addUniqueConstraint columnNames="CLIENT_ID, USER_ID" constraintName="UK_JKUWUVD56ONTGSUHOGM8UEWRT" tableName="USER_CONSENT"/>
<customChange class="org.keycloak.connections.jpa.updater.liquibase.custom.JpaUpdate1_2_0_CR1"/>
</changeSet>
</databaseChangeLog>
@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">
<changeSet author="keycloak" id="1.2.0.Final">
<!-- KEYCLOAK-1277 -->
<update tableName="CLIENT">
<column name="DIRECT_GRANTS_ONLY" valueBoolean="false"/>
<where>DIRECT_GRANTS_ONLY is null</where>
</update>
<update tableName="CLIENT">
<column name="BEARER_ONLY" valueBoolean="false"/>
<where>BEARER_ONLY is null</where>
</update>
<update tableName="CLIENT">
<column name="SURROGATE_AUTH_REQUIRED" valueBoolean="false"/>
<where>SURROGATE_AUTH_REQUIRED is null</where>
</update>
</changeSet>
</databaseChangeLog>
@@ -0,0 +1,200 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">
<changeSet author="bburke@redhat.com" id="1.3.0">
<delete tableName="CLIENT_SESSION_ROLE"/>
<delete tableName="CLIENT_SESSION_PROT_MAPPER"/>
<delete tableName="CLIENT_SESSION_NOTE"/>
<delete tableName="CLIENT_SESSION"/>
<delete tableName="USER_SESSION_NOTE"/>
<delete tableName="USER_SESSION"/>
<createTable tableName="ADMIN_EVENT_ENTITY">
<column name="ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
<column name="ADMIN_EVENT_TIME" type="BIGINT"/>
<column name="REALM_ID" type="VARCHAR(255)"/>
<column name="OPERATION_TYPE" type="VARCHAR(255)"/>
<column name="AUTH_REALM_ID" type="VARCHAR(255)"/>
<column name="AUTH_CLIENT_ID" type="VARCHAR(255)"/>
<column name="AUTH_USER_ID" type="VARCHAR(255)"/>
<column name="IP_ADDRESS" type="VARCHAR(255)"/>
<column name="RESOURCE_PATH" type="VARCHAR(2550)"/>
<column name="REPRESENTATION" type="TEXT(25500)"/>
<column name="ERROR" type="VARCHAR(255)"/>
</createTable>
<createTable tableName="AUTHENTICATOR">
<column name="ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
<column name="ALIAS" type="VARCHAR(255)"/>
<column name="REALM_ID" type="VARCHAR(36)"/>
<column name="PROVIDER_ID" type="VARCHAR(255)"/>
</createTable>
<createTable tableName="AUTHENTICATION_FLOW">
<column name="ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
<column name="ALIAS" type="VARCHAR(255)"/>
<column name="DESCRIPTION" type="VARCHAR(255)"/>
<column name="REALM_ID" type="VARCHAR(36)"/>
</createTable>
<createTable tableName="AUTHENTICATION_EXECUTION">
<column name="ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
<column name="ALIAS" type="VARCHAR(255)"/>
<column name="AUTHENTICATOR" type="VARCHAR(36)"/>
<column name="REALM_ID" type="VARCHAR(36)"/>
<column name="FLOW_ID" type="VARCHAR(36)"/>
<column name="REQUIREMENT" type="INT"/>
<column name="PRIORITY" type="INT"/>
<column name="USER_SETUP_ALLOWED" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
<column name="AUTHENTICATOR_FLOW" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
</createTable>
<createTable tableName="AUTHENTICATOR_CONFIG">
<column name="AUTHENTICATOR_ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
<column name="VALUE" type="CLOB"/>
<column name="NAME" type="VARCHAR(255)">
<constraints nullable="false"/>
</column>
</createTable>
<createTable tableName="USER_FEDERATION_MAPPER">
<column name="ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
<column name="NAME" type="VARCHAR(255)">
<constraints nullable="false"/>
</column>
<column name="FEDERATION_PROVIDER_ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
<column name="FEDERATION_MAPPER_TYPE" type="VARCHAR(255)">
<constraints nullable="false"/>
</column>
<column name="REALM_ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
</createTable>
<createTable tableName="USER_FEDERATION_MAPPER_CONFIG">
<column name="USER_FEDERATION_MAPPER_ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
<column name="VALUE" type="VARCHAR(255)"/>
<column name="NAME" type="VARCHAR(255)">
<constraints nullable="false"/>
</column>
</createTable>
<addColumn tableName="REALM">
<column name="ADMIN_EVENTS_ENABLED" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
<column name="ADMIN_EVENTS_DETAILS_ENABLED" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
<column name="EDIT_USERNAME_ALLOWED" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
</addColumn>
<createTable tableName="CLIENT_SESSION_AUTH_STATUS">
<column name="AUTHENTICATOR" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
<column name="STATUS" type="INT"/>
<column name="CLIENT_SESSION" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
</createTable>
<addColumn tableName="CLIENT_SESSION">
<column name="AUTH_USER_ID" type="VARCHAR(36)"/>
</addColumn>
<addColumn tableName="IDENTITY_PROVIDER">
<column name="TRUST_EMAIL" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
<column name="UPDATE_PROFILE_FIRST_LGN_MD" type="VARCHAR(255)" defaultValue="on">
<constraints nullable="false"/>
</column>
</addColumn>
<!-- migrate value from UPDATE_PROFILE_FIRST_LOGIN to UPDATE_PROFILE_FIRST_LGN_MD then drop it -->
<update tableName="IDENTITY_PROVIDER">
<column name="UPDATE_PROFILE_FIRST_LGN_MD" value="off"/>
<where>UPDATE_PROFILE_FIRST_LOGIN = :value</where>
<whereParams>
<param valueBoolean="false" />
</whereParams>
</update>
<dropDefaultValue tableName="IDENTITY_PROVIDER" columnName="UPDATE_PROFILE_FIRST_LOGIN" />
<dropColumn tableName="IDENTITY_PROVIDER" columnName="UPDATE_PROFILE_FIRST_LOGIN"/>
<addColumn tableName="USER_REQUIRED_ACTION">
<column name="REQUIRED_ACTION" type="VARCHAR(255)" defaultValue=" ">
<constraints nullable="false"/>
</column>
</addColumn>
<!-- VERIFY_EMAIL, UPDATE_PROFILE, CONFIGURE_TOTP, UPDATE_PASSWORD -->
<update tableName="USER_REQUIRED_ACTION">
<column name="REQUIRED_ACTION" value="VERIFY_EMAIL"/>
<where>ACTION = 0</where>
</update>
<update tableName="USER_REQUIRED_ACTION">
<column name="REQUIRED_ACTION" value="UPDATE_PROFILE"/>
<where>ACTION = 1</where>
</update>
<update tableName="USER_REQUIRED_ACTION">
<column name="REQUIRED_ACTION" value="CONFIGURE_TOTP"/>
<where>ACTION = 2</where>
</update>
<update tableName="USER_REQUIRED_ACTION">
<column name="REQUIRED_ACTION" value="UPDATE_PASSWORD"/>
<where>ACTION = 3</where>
</update>
<addPrimaryKey columnNames="ID" constraintName="CONSTRAINT_AUTH_PK" tableName="AUTHENTICATOR"/>
<addPrimaryKey columnNames="ID" constraintName="CONSTRAINT_AUTH_FLOW_PK" tableName="AUTHENTICATION_FLOW"/>
<addPrimaryKey columnNames="ID" constraintName="CONSTRAINT_AUTH_EXEC_PK" tableName="AUTHENTICATION_EXECUTION"/>
<addPrimaryKey columnNames="AUTHENTICATOR_ID, NAME" constraintName="CONSTRAINT_AUTH_CFG_PK" tableName="AUTHENTICATOR_CONFIG"/>
<dropPrimaryKey constraintName="CONSTRAINT_2" tableName="USER_REQUIRED_ACTION"/>
<dropColumn tableName="USER_REQUIRED_ACTION" columnName="ACTION"/>
<addPrimaryKey columnNames="REQUIRED_ACTION, USER_ID" constraintName="CONSTRAINT_REQUIRED_ACTION" tableName="USER_REQUIRED_ACTION"/>
<addPrimaryKey columnNames="CLIENT_SESSION, AUTHENTICATOR" constraintName="CONSTRAINT_AUTH_STATUS_PK" tableName="CLIENT_SESSION_AUTH_STATUS"/>
<addPrimaryKey columnNames="ID" constraintName="CONSTRAINT_FEDMAPPERPM" tableName="USER_FEDERATION_MAPPER"/>
<addPrimaryKey columnNames="USER_FEDERATION_MAPPER_ID, NAME" constraintName="CONSTRAINT_FEDMAPPER_CFG_PM" tableName="USER_FEDERATION_MAPPER_CONFIG"/>
<addForeignKeyConstraint baseColumnNames="CLIENT_SESSION" baseTableName="CLIENT_SESSION_AUTH_STATUS" constraintName="AUTH_STATUS_CONSTRAINT" referencedColumnNames="ID" referencedTableName="CLIENT_SESSION"/>
<addForeignKeyConstraint baseColumnNames="REALM_ID" baseTableName="AUTHENTICATOR" constraintName="FK_AUTH_REALM" referencedColumnNames="ID" referencedTableName="REALM"/>
<addForeignKeyConstraint baseColumnNames="REALM_ID" baseTableName="AUTHENTICATION_FLOW" constraintName="FK_AUTH_FLOW_REALM" referencedColumnNames="ID" referencedTableName="REALM"/>
<addForeignKeyConstraint baseColumnNames="REALM_ID" baseTableName="AUTHENTICATION_EXECUTION" constraintName="FK_AUTH_EXEC_REALM" referencedColumnNames="ID" referencedTableName="REALM"/>
<addForeignKeyConstraint baseColumnNames="FLOW_ID" baseTableName="AUTHENTICATION_EXECUTION" constraintName="FK_AUTH_EXEC_FLOW" referencedColumnNames="ID" referencedTableName="AUTHENTICATION_FLOW"/>
<addForeignKeyConstraint baseColumnNames="REALM_ID" baseTableName="USER_FEDERATION_MAPPER" constraintName="FK_FEDMAPPERPM_REALM" referencedColumnNames="ID" referencedTableName="REALM"/>
<addForeignKeyConstraint baseColumnNames="FEDERATION_PROVIDER_ID" baseTableName="USER_FEDERATION_MAPPER" constraintName="FK_FEDMAPPERPM_FEDPRV" referencedColumnNames="ID" referencedTableName="USER_FEDERATION_PROVIDER"/>
<addForeignKeyConstraint baseColumnNames="USER_FEDERATION_MAPPER_ID" baseTableName="USER_FEDERATION_MAPPER_CONFIG" constraintName="FK_FEDMAPPER_CFG" referencedColumnNames="ID" referencedTableName="USER_FEDERATION_MAPPER"/>
<dropDefaultValue tableName="REALM" columnName="PASSWORD_CRED_GRANT_ALLOWED" />
<dropColumn tableName="REALM" columnName="PASSWORD_CRED_GRANT_ALLOWED"/>
<!-- KEYCLOAK-1298 Change constraint names to be upper-cased -->
<dropForeignKeyConstraint baseTableName="PROTOCOL_MAPPER_CONFIG" constraintName="FK_PMConfig" />
<dropPrimaryKey constraintName="CONSTRAINT_PMConfig" tableName="PROTOCOL_MAPPER_CONFIG"/>
<addPrimaryKey columnNames="PROTOCOL_MAPPER_ID, NAME" constraintName="CONSTRAINT_PMCONFIG" tableName="PROTOCOL_MAPPER_CONFIG"/>
<addForeignKeyConstraint baseColumnNames="PROTOCOL_MAPPER_ID" baseTableName="PROTOCOL_MAPPER_CONFIG" constraintName="FK_PMCONFIG" referencedColumnNames="ID" referencedTableName="PROTOCOL_MAPPER"/>
<dropForeignKeyConstraint baseTableName="IDP_MAPPER_CONFIG" constraintName="FK_IDPMConfig" />
<dropPrimaryKey constraintName="CONSTRAINT_IDPMConfig" tableName="IDP_MAPPER_CONFIG"/>
<addPrimaryKey columnNames="IDP_MAPPER_ID, NAME" constraintName="CONSTRAINT_IDPMCONFIG" tableName="IDP_MAPPER_CONFIG"/>
<addForeignKeyConstraint baseColumnNames="IDP_MAPPER_ID" baseTableName="IDP_MAPPER_CONFIG" constraintName="FK_IDPMCONFIG" referencedColumnNames="ID" referencedTableName="IDENTITY_PROVIDER_MAPPER"/>
<!-- Sybase specific hacks -->
<modifySql dbms="sybase">
<replace replace="[USER_REQUIRED_ACTION] DROP PRIMARY KEY" with="[USER_REQUIRED_ACTION] DROP CONSTRAINT CONSTRAINT_2" />
<replace replace="[PROTOCOL_MAPPER_CONFIG] DROP PRIMARY KEY" with="[PROTOCOL_MAPPER_CONFIG] DROP CONSTRAINT CONSTRAINT_PMConfig" />
<replace replace="[IDP_MAPPER_CONFIG] DROP PRIMARY KEY" with="[IDP_MAPPER_CONFIG] DROP CONSTRAINT CONSTRAINT_IDPMConfig" />
<regExpReplace replace=".*(SET DEFAULT NULL)" with="SELECT 1" />
</modifySql>
</changeSet>
</databaseChangeLog>
@@ -0,0 +1,156 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">
<changeSet author="bburke@redhat.com" id="1.4.0">
<delete tableName="CLIENT_SESSION_AUTH_STATUS"/>
<delete tableName="CLIENT_SESSION_ROLE"/>
<delete tableName="CLIENT_SESSION_PROT_MAPPER"/>
<delete tableName="CLIENT_SESSION_NOTE"/>
<delete tableName="CLIENT_SESSION"/>
<delete tableName="USER_SESSION_NOTE"/>
<delete tableName="USER_SESSION"/>
<addColumn tableName="CLIENT">
<column name="SERVICE_ACCOUNTS_ENABLED" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
</addColumn>
<addColumn tableName="CLIENT_SESSION">
<column name="CURRENT_ACTION" type="VARCHAR(36)">
<constraints nullable="true"/>
</column>
</addColumn>
<addColumn tableName="AUTHENTICATION_FLOW">
<column name="PROVIDER_ID" type="VARCHAR(36)" defaultValue="basic-flow">
<constraints nullable="false"/>
</column>
<column name="TOP_LEVEL" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
<column name="BUILT_IN" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
</addColumn>
<addColumn tableName="AUTHENTICATION_EXECUTION">
<column name="AUTH_FLOW_ID" type="VARCHAR(36)">
<constraints nullable="true"/>
</column>
<column name="AUTH_CONFIG" type="VARCHAR(36)">
<constraints nullable="true"/>
</column>
</addColumn>
<addColumn tableName="USER_ATTRIBUTE">
<column name="ID" type="VARCHAR(36)" defaultValue="sybase-needs-something-here">
<constraints nullable="false"/>
</column>
</addColumn>
<dropColumn tableName="AUTHENTICATOR" columnName="PROVIDER_ID"/>
<renameTable oldTableName="AUTHENTICATOR_CONFIG" newTableName="AUTHENTICATOR_CONFIG_ENTRY"/>
<renameTable oldTableName="AUTHENTICATOR" newTableName="AUTHENTICATOR_CONFIG"/>
<!-- OAUTH_GRANT,
CODE_TO_TOKEN,
VERIFY_EMAIL,
UPDATE_PROFILE,
CONFIGURE_TOTP,
UPDATE_PASSWORD,
RECOVER_PASSWORD,
AUTHENTICATE,
SOCIAL_CALLBACK,
LOGGED_OUT -->
<update tableName="CLIENT_SESSION">
<column name="CURRENT_ACTION" value="OAUTH_GRANT"/>
<where>ACTION = 0</where>
</update>
<update tableName="CLIENT_SESSION">
<column name="CURRENT_ACTION" value="CODE_TO_TOKEN"/>
<where>ACTION = 1</where>
</update>
<update tableName="CLIENT_SESSION">
<column name="CURRENT_ACTION" value="VERIFY_EMAIL"/>
<where>ACTION = 2</where>
</update>
<update tableName="CLIENT_SESSION">
<column name="CURRENT_ACTION" value="UPDATE_PROFILE"/>
<where>ACTION = 3</where>
</update>
<update tableName="CLIENT_SESSION">
<column name="CURRENT_ACTION" value="CONFIGURE_TOTP"/>
<where>ACTION = 4</where>
</update>
<update tableName="CLIENT_SESSION">
<column name="CURRENT_ACTION" value="UPDATE_PASSWORD"/>
<where>ACTION = 5</where>
</update>
<update tableName="CLIENT_SESSION">
<column name="CURRENT_ACTION" value="RECOVER_PASSWORD"/>
<where>ACTION = 6</where>
</update>
<update tableName="CLIENT_SESSION">
<column name="CURRENT_ACTION" value="AUTHENTICATE"/>
<where>ACTION = 7</where>
</update>
<update tableName="CLIENT_SESSION">
<column name="CURRENT_ACTION" value="SOCIAL_CALLBACK"/>
<where>ACTION = 8</where>
</update>
<update tableName="CLIENT_SESSION">
<column name="CURRENT_ACTION" value="LOGGED_OUT"/>
<where>ACTION = 9</where>
</update>
<createTable tableName="CLIENT_USER_SESSION_NOTE">
<column name="NAME" type="VARCHAR(255)">
<constraints nullable="false"/>
</column>
<column name="VALUE" type="VARCHAR(2048)"/>
<column name="CLIENT_SESSION" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
</createTable>
<createTable tableName="REQUIRED_ACTION_PROVIDER">
<column name="ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
<column name="ALIAS" type="VARCHAR(255)"/>
<column name="NAME" type="VARCHAR(255)"/>
<column name="REALM_ID" type="VARCHAR(36)"/>
<column name="ENABLED" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
<column name="DEFAULT_ACTION" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
<column name="PROVIDER_ID" type="VARCHAR(255)"/>
</createTable>
<createTable tableName="REQUIRED_ACTION_CONFIG">
<column name="REQUIRED_ACTION_ID" type="VARCHAR(36)">
<constraints nullable="false"/>
</column>
<column name="VALUE" type="CLOB"/>
<column name="NAME" type="VARCHAR(255)">
<constraints nullable="false"/>
</column>
</createTable>
<customChange class="org.keycloak.connections.jpa.updater.liquibase.custom.JpaUpdate1_4_0_Final"/>
<dropPrimaryKey constraintName="CONSTRAINT_6" tableName="USER_ATTRIBUTE"/>
<addPrimaryKey columnNames="ID" constraintName="CONSTRAINT_USER_ATTRIBUTE_PK" tableName="USER_ATTRIBUTE"/>
<addPrimaryKey columnNames="ID" constraintName="CONSTRAINT_REQ_ACT_PRV_PK" tableName="REQUIRED_ACTION_PROVIDER"/>
<addPrimaryKey columnNames="REQUIRED_ACTION_ID, NAME" constraintName="CONSTRAINT_REQ_ACT_CFG_PK" tableName="REQUIRED_ACTION_CONFIG"/>
<addPrimaryKey columnNames="CLIENT_SESSION, NAME" constraintName="CONSTR_CL_USR_SES_NOTE" tableName="CLIENT_USER_SESSION_NOTE"/>
<addForeignKeyConstraint baseColumnNames="REALM_ID" baseTableName="REQUIRED_ACTION_PROVIDER" constraintName="FK_REQ_ACT_REALM" referencedColumnNames="ID" referencedTableName="REALM"/>
<addForeignKeyConstraint baseColumnNames="CLIENT_SESSION" baseTableName="CLIENT_USER_SESSION_NOTE" constraintName="FK_CL_USR_SES_NOTE" referencedColumnNames="ID" referencedTableName="CLIENT_SESSION"/>
<dropColumn tableName="CLIENT_SESSION" columnName="ACTION"/>
<addColumn tableName="USER_ENTITY">
<column name="CREATED_TIMESTAMP" type="BIGINT"/>
<column name="SERVICE_ACCOUNT_CLIENT_LINK" type="VARCHAR(36)"/>
</addColumn>
<!-- Sybase specific hacks -->
<modifySql dbms="sybase">
<replace replace="[USER_ATTRIBUTE] DROP PRIMARY KEY" with="[USER_ATTRIBUTE] DROP CONSTRAINT CONSTRAINT_6" />
</modifySql>
</changeSet>
</databaseChangeLog>
@@ -0,0 +1,76 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">
<changeSet author="bburke@redhat.com" id="1.5.0">
<delete tableName="CLIENT_SESSION_AUTH_STATUS"/>
<delete tableName="CLIENT_SESSION_ROLE"/>
<delete tableName="CLIENT_SESSION_PROT_MAPPER"/>
<delete tableName="CLIENT_SESSION_NOTE"/>
<delete tableName="CLIENT_SESSION"/>
<delete tableName="USER_SESSION_NOTE"/>
<delete tableName="USER_SESSION"/>
<dropDefaultValue tableName="AUTHENTICATION_EXECUTION" columnName="USER_SETUP_ALLOWED" />
<dropColumn tableName="AUTHENTICATION_EXECUTION" columnName="USER_SETUP_ALLOWED"/>
<addColumn tableName="CREDENTIAL">
<column name="COUNTER" type="INT" defaultValueNumeric="0">
<constraints nullable="true"/>
</column>
<column name="DIGITS" type="INT" defaultValueNumeric="6">
<constraints nullable="true"/>
</column>
<column name="PERIOD" type="INT" defaultValueNumeric="30">
<constraints nullable="true"/>
</column>
<column name="ALGORITHM" type="VARCHAR(36)" defaultValue="HmacSHA1">
<constraints nullable="true"/>
</column>
</addColumn>
<addColumn tableName="REALM">
<column name="OTP_POLICY_COUNTER" type="INT" defaultValueNumeric="0">
<constraints nullable="true"/>
</column>
<column name="OTP_POLICY_WINDOW" type="INT" defaultValueNumeric="1">
<constraints nullable="true"/>
</column>
<column name="OTP_POLICY_PERIOD" type="INT" defaultValueNumeric="30">
<constraints nullable="true"/>
</column>
<column name="OTP_POLICY_DIGITS" type="INT" defaultValueNumeric="6">
<constraints nullable="true"/>
</column>
<column name="OTP_POLICY_ALG" type="VARCHAR(36)" defaultValue="HmacSHA1">
<constraints nullable="true"/>
</column>
<column name="OTP_POLICY_TYPE" type="VARCHAR(36)" defaultValue="totp">
<constraints nullable="true"/>
</column>
<column name="BROWSER_FLOW" type="VARCHAR(36)">
<constraints nullable="true"/>
</column>
<column name="REGISTRATION_FLOW" type="VARCHAR(36)">
<constraints nullable="true"/>
</column>
<column name="DIRECT_GRANT_FLOW" type="VARCHAR(36)">
<constraints nullable="true"/>
</column>
<column name="RESET_CREDENTIALS_FLOW" type="VARCHAR(36)">
<constraints nullable="true"/>
</column>
<column name="CLIENT_AUTH_FLOW" type="VARCHAR(36)">
<constraints nullable="true"/>
</column>
</addColumn>
<addColumn tableName="CLIENT">
<column name="CLIENT_AUTHENTICATOR_TYPE" type="VARCHAR(255)">
<constraints nullable="true"/>
</column>
</addColumn>
<!-- Sybase specific hacks -->
<modifySql dbms="sybase">
<regExpReplace replace=".*(SET DEFAULT NULL)" with="SELECT 1" />
</modifySql>
</changeSet>
</databaseChangeLog>
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.2.xsd">
<include file="META-INF/jpa-changelog-1.0.0.Final.xml"/>
<include file="META-INF/jpa-changelog-1.1.0.Beta1.xml"/>
<include file="META-INF/jpa-changelog-1.1.0.Final.xml"/>
<include file="META-INF/jpa-changelog-1.2.0.Beta1.xml"/>
<include file="META-INF/jpa-changelog-1.2.0.CR1.xml"/>
<include file="META-INF/jpa-changelog-1.2.0.Final.xml"/>
<include file="META-INF/jpa-changelog-1.3.0.xml"/>
<include file="META-INF/jpa-changelog-1.4.0.xml"/>
<include file="META-INF/jpa-changelog-1.5.0.xml"/>
</databaseChangeLog>
@@ -0,0 +1 @@
org.keycloak.connections.jpa.updater.liquibase.LiquibaseJpaUpdaterProviderFactory
+36 -39
View File
@@ -1,39 +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.1.0-Alpha1-SNAPSHOT</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>keycloak-connections-jpa</artifactId>
<name>Keycloak Connections JPA</name>
<description/>
<dependencies>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-core</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-model-api</artifactId>
<version>${project.version}</version>
</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>
</dependencies>
</project>
<?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.5.1.Final</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>keycloak-connections-jpa</artifactId>
<name>Keycloak Connections JPA</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.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.1-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
@@ -1,13 +1,25 @@
package org.keycloak.connections.jpa;
import org.hibernate.ejb.AvailableSettings;
import org.jboss.logging.Logger;
import org.keycloak.Config;
import org.keycloak.connections.jpa.updater.JpaUpdaterProvider;
import org.keycloak.connections.jpa.util.JpaUtils;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.KeycloakSessionFactory;
import javax.naming.InitialContext;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
/**
@@ -15,13 +27,17 @@ import java.util.Map;
*/
public class DefaultJpaConnectionProviderFactory implements JpaConnectionProviderFactory {
private static final Logger logger = Logger.getLogger(DefaultJpaConnectionProviderFactory.class);
private volatile EntityManagerFactory emf;
private Config.Scope config;
private Map<String,String> operationalInfo;
@Override
public JpaConnectionProvider create(KeycloakSession session) {
lazyInit();
lazyInit(session);
EntityManager em = emf.createEntityManager();
em = PersistenceExceptionConverter.create(em);
@@ -46,56 +62,155 @@ public class DefaultJpaConnectionProviderFactory implements JpaConnectionProvide
this.config = config;
}
private void lazyInit() {
@Override
public void postInit(KeycloakSessionFactory factory) {
}
private void lazyInit(KeycloakSession session) {
if (emf == null) {
synchronized (this) {
if (emf == null) {
String unitName = config.get("unitName");
logger.debug("Initializing JPA connections");
Connection connection = null;
String databaseSchema = config.get("databaseSchema");
Map<String, Object> properties = new HashMap<String, Object>();
// Only load config from keycloak-server.json if unitName is not specified
if (unitName == null) {
unitName = "keycloak-default";
String unitName = "keycloak-default";
String dataSource = config.get("dataSource");
if (dataSource != null) {
if (config.getBoolean("jta", false)) {
properties.put(AvailableSettings.JTA_DATASOURCE, dataSource);
} else {
properties.put(AvailableSettings.NON_JTA_DATASOURCE, dataSource);
}
String dataSource = config.get("dataSource");
if (dataSource != null) {
if (config.getBoolean("jta", false)) {
properties.put(AvailableSettings.JTA_DATASOURCE, dataSource);
} else {
properties.put(AvailableSettings.JDBC_URL, config.get("url"));
properties.put(AvailableSettings.JDBC_DRIVER, config.get("driver"));
String user = config.get("user");
if (user != null) {
properties.put(AvailableSettings.JDBC_USER, user);
}
String password = config.get("password");
if (password != null) {
properties.put(AvailableSettings.JDBC_PASSWORD, password);
}
properties.put(AvailableSettings.NON_JTA_DATASOURCE, dataSource);
}
} else {
properties.put(AvailableSettings.JDBC_URL, config.get("url"));
properties.put(AvailableSettings.JDBC_DRIVER, config.get("driver"));
String driverDialect = config.get("driverDialect");
if (driverDialect != null && driverDialect.length() > 0) {
properties.put("hibernate.dialect", driverDialect);
String user = config.get("user");
if (user != null) {
properties.put(AvailableSettings.JDBC_USER, user);
}
String databaseSchema = config.get("databaseSchema", "validate");
if (databaseSchema != null) {
properties.put("hibernate.hbm2ddl.auto", databaseSchema);
String password = config.get("password");
if (password != null) {
properties.put(AvailableSettings.JDBC_PASSWORD, password);
}
properties.put("hibernate.show_sql", config.getBoolean("showSql", false));
properties.put("hibernate.format_sql", config.getBoolean("formatSql", true));
}
emf = Persistence.createEntityManagerFactory(unitName, properties);
String driverDialect = config.get("driverDialect");
if (driverDialect != null && driverDialect.length() > 0) {
properties.put("hibernate.dialect", driverDialect);
}
String schema = config.get("schema");
if (schema != null) {
properties.put(JpaUtils.HIBERNATE_DEFAULT_SCHEMA, schema);
}
if (databaseSchema != null) {
if (databaseSchema.equals("development-update")) {
properties.put("hibernate.hbm2ddl.auto", "update");
databaseSchema = null;
} else if (databaseSchema.equals("development-validate")) {
properties.put("hibernate.hbm2ddl.auto", "validate");
databaseSchema = null;
}
}
properties.put("hibernate.show_sql", config.getBoolean("showSql", false));
properties.put("hibernate.format_sql", config.getBoolean("formatSql", true));
connection = getConnection();
try{
prepareOperationalInfo(connection);
if (databaseSchema != null) {
logger.trace("Updating database");
JpaUpdaterProvider updater = session.getProvider(JpaUpdaterProvider.class);
if (updater == null) {
throw new RuntimeException("Can't update database: JPA updater provider not found");
}
if (databaseSchema.equals("update")) {
String currentVersion = null;
try {
ResultSet resultSet = connection.createStatement().executeQuery(updater.getCurrentVersionSql(schema));
if (resultSet.next()) {
currentVersion = resultSet.getString(1);
}
} catch (SQLException e) {
}
if (currentVersion == null || !JpaUpdaterProvider.LAST_VERSION.equals(currentVersion)) {
updater.update(session, connection, schema);
} else {
logger.debug("Database is up to date");
}
} else if (databaseSchema.equals("validate")) {
updater.validate(connection, schema);
} else {
throw new RuntimeException("Invalid value for databaseSchema: " + databaseSchema);
}
logger.trace("Database update completed");
}
logger.trace("Creating EntityManagerFactory");
emf = Persistence.createEntityManagerFactory(unitName, properties);
logger.trace("EntityManagerFactory created");
} finally {
// Close after creating EntityManagerFactory to prevent in-mem databases from closing
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
logger.warn(e);
}
}
}
}
}
}
}
protected void prepareOperationalInfo(Connection connection) {
try {
operationalInfo = new LinkedHashMap<>();
DatabaseMetaData md = connection.getMetaData();
operationalInfo.put("databaseUrl",md.getURL());
operationalInfo.put("databaseUser", md.getUserName());
operationalInfo.put("databaseProduct", md.getDatabaseProductName() + " " + md.getDatabaseProductVersion());
operationalInfo.put("databaseDriver", md.getDriverName() + " " + md.getDriverVersion());
} catch (SQLException e) {
logger.warn("Unable to prepare operational info due database exception: " + e.getMessage());
}
}
private Connection getConnection() {
try {
String dataSourceLookup = config.get("dataSource");
if (dataSourceLookup != null) {
DataSource dataSource = (DataSource) new InitialContext().lookup(dataSourceLookup);
return dataSource.getConnection();
} else {
Class.forName(config.get("driver"));
return DriverManager.getConnection(config.get("url"), config.get("user"), config.get("password"));
}
} catch (Exception e) {
throw new RuntimeException("Failed to connect to database", e);
}
}
@Override
public Map<String,String> getOperationalInfo() {
return operationalInfo;
}
}
Loaded 100 of 4191 files, more files were not shown because too many files have changed in this diff. Show more