Compare commits

..
Author SHA1 Message Date
Lukas Kubik 3a702a8da9 Bump the eap6-server-dist version 2015-10-23 14:09:21 +02:00
Stian Thorgersen 8c06c0a78f Version bump 2015-10-23 11:40:25 +02:00
Stian Thorgersen 5ad871a34a Fix tests 2015-10-23 11:40:25 +02:00
Stian Thorgersen 2245918a49 Version bump 2015-10-23 11:40:25 +02:00
Stian Thorgersen 107719b4dd Add tests without client secret 2015-10-23 11:40:25 +02:00
Lukas Kubik 9534dba818 Change back eap 6 dist zip file name 2015-09-15 10:57:52 +02:00
Lukas Kubik edd0081fe0 Remove testsuite module 2015-09-14 15:57:06 +02:00
Lukas Kubik 6093e4c20e Update eap6-server-dist version 2015-09-14 15:40:58 +02:00
Lukas Kubik 3826d62dcb Update community version 2015-09-14 15:17:27 +02:00
Lukas Kubik d97e29099f Update theme examples to fit branding 2015-09-14 14:50:57 +02:00
Lukas Kubik 5308c36ab2 Update server dist name 2015-09-14 14:50:57 +02:00
Lukas Kubik e2ef47ba81 Update eap dist file name 2015-09-14 14:50:57 +02:00
Lukas Kubik d252575172 Move the server-info button 2015-09-14 14:50:57 +02:00
Lukas Kubik 9a45bc154a Delete unused favicon and add deleted jboss logo to example 2015-09-14 14:50:57 +02:00
Lukas Kubik 7de2f95031 Repair username in account 2015-09-14 14:50:57 +02:00
Lukas Kubik 3898c4ed99 Add EAP 6 server dist module 2015-09-14 14:50:57 +02:00
Lukas Kubik a2b2d6c4a8 Repair tests 2015-09-14 14:50:57 +02:00
Lukas Kubik 7ee2714490 Update welcome page logo 2015-09-14 14:50:57 +02:00
Lukas Kubik 82eacf4ce2 Update login logo 2015-09-14 14:50:56 +02:00
Lukas Kubik 80f602303c Account page branding 2015-09-14 14:50:56 +02:00
Lukas Kubik 90fa804bb7 Admin console branding 2015-09-14 14:50:56 +02:00
Lukas Kubik a5aa5b494a Branding for login screen 2015-09-14 14:50:56 +02:00
Lukas Kubik aa13010252 Add RCUE and PatternFly components 2015-09-14 14:50:56 +02:00
Lukas Kubik 0b20ba06ed Welcome page initial branding 2015-09-14 14:50:55 +02:00
Lukas Kubik 109305cfd6 Remove mongo modules and related dependencies 2015-09-14 14:50:55 +02:00
Lukas Kubik db1a109ad7 Prod changes 2015-09-14 14:50:55 +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
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
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
Bill Burke 3dd282e11b pluggable required actions backend 2015-06-10 11:38:01 -04:00
Bill Burke 95349e6e2e clientsession.action to String 2015-06-10 09:21:23 -04: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
Bill Burke 9ab023cc6c more 2015-06-04 10:18:24 -04:00
Bill Burke b54061fc3f more 2015-06-03 18:51:57 -04:00
Bill Burke c12fe28b2d phased auth spi introduction 2015-06-03 10:55:03 -04:00
2567 changed files with 320707 additions and 45158 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
+9
View File
@@ -1,5 +1,8 @@
language: java language: java
jdk:
- oraclejdk8
cache: cache:
directories: directories:
- $HOME/.m2 - $HOME/.m2
@@ -7,4 +10,10 @@ cache:
before_cache: before_cache:
- rm -rf $HOME/.m2/repository/org/keycloak - 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 sudo: false
+1 -1
View File
@@ -4,7 +4,7 @@
<parent> <parent>
<artifactId>keycloak-parent</artifactId> <artifactId>keycloak-parent</artifactId>
<groupId>org.keycloak</groupId> <groupId>org.keycloak</groupId>
<version>1.3.1.Final</version> <version>1.5.1.Final</version>
<relativePath>../../pom.xml</relativePath> <relativePath>../../pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
@@ -58,6 +58,11 @@ public abstract class AbstractIdentityProvider<C extends IdentityProviderModel>
return null; return null;
} }
@Override
public Response performLogin(AuthenticationRequest request) {
return null;
}
@Override @Override
public Response keycloakInitiatedBrowserLogout(UserSessionModel userSession, UriInfo uriInfo, RealmModel realm) { public Response keycloakInitiatedBrowserLogout(UserSessionModel userSession, UriInfo uriInfo, RealmModel realm) {
return null; return null;
@@ -17,6 +17,7 @@
*/ */
package org.keycloak.broker.provider; package org.keycloak.broker.provider;
import org.keycloak.models.ClientSessionModel;
import org.keycloak.models.IdentityProviderModel; import org.keycloak.models.IdentityProviderModel;
import java.util.HashMap; import java.util.HashMap;
@@ -43,6 +44,7 @@ public class BrokeredIdentityContext {
private IdentityProviderModel idpConfig; private IdentityProviderModel idpConfig;
private IdentityProvider idp; private IdentityProvider idp;
private Map<String, Object> contextData = new HashMap<>(); private Map<String, Object> contextData = new HashMap<>();
private ClientSessionModel clientSession;
public BrokeredIdentityContext(String id) { public BrokeredIdentityContext(String id) {
if (id == null) { if (id == null) {
@@ -166,6 +168,14 @@ public class BrokeredIdentityContext {
this.lastName = lastName; this.lastName = lastName;
} }
public ClientSessionModel getClientSession() {
return clientSession;
}
public void setClientSession(ClientSessionModel clientSession) {
this.clientSession = clientSession;
}
public void setName(String name) { public void setName(String name) {
if (name != null) { if (name != null) {
int i = name.lastIndexOf(' '); int i = name.lastIndexOf(' ');
@@ -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.";
}
}
@@ -27,15 +27,15 @@ public class HardcodedRoleMapper extends AbstractIdentityProviderMapper {
property = new ProviderConfigProperty(); property = new ProviderConfigProperty();
property.setName(ROLE); property.setName(ROLE);
property.setLabel("Role"); property.setLabel("Role");
property.setHelpText("Role to grant to user. To reference an application role the syntax is appname.approle, i.e. myapp.myrole"); property.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.STRING_TYPE); property.setType(ProviderConfigProperty.ROLE_TYPE);
configProperties.add(property); configProperties.add(property);
} }
public static String[] parseRole(String role) { public static String[] parseRole(String role) {
int scopeIndex = role.indexOf('.'); int scopeIndex = role.lastIndexOf('.');
if (scopeIndex > -1) { if (scopeIndex > -1) {
String appName = role.substring(0, scopeIndex); String appName = role.substring(0, scopeIndex);
role = role.substring(scopeIndex + 1); role = role.substring(scopeIndex + 1);
@@ -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.";
}
}
@@ -1 +1,3 @@
org.keycloak.broker.provider.HardcodedRoleMapper org.keycloak.broker.provider.HardcodedRoleMapper
org.keycloak.broker.provider.HardcodedAttributeMapper
org.keycloak.broker.provider.HardcodedUserSessionAttributeMapper
+1 -1
View File
@@ -4,7 +4,7 @@
<parent> <parent>
<artifactId>keycloak-parent</artifactId> <artifactId>keycloak-parent</artifactId>
<groupId>org.keycloak</groupId> <groupId>org.keycloak</groupId>
<version>1.3.1.Final</version> <version>1.5.1.Final</version>
<relativePath>../../pom.xml</relativePath> <relativePath>../../pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
@@ -289,10 +289,9 @@ public class OIDCIdentityProvider extends AbstractOAuth2IdentityProvider<OIDCIde
} }
JsonWebToken token = jws.readJsonContent(JsonWebToken.class); JsonWebToken token = jws.readJsonContent(JsonWebToken.class);
String aud = token.getAudience();
String iss = token.getIssuer(); String iss = token.getIssuer();
if (aud != null && !aud.equals(getConfig().getClientId())) { if (!token.hasAudience(getConfig().getClientId())) {
throw new IdentityBrokerException("Wrong audience from token."); throw new IdentityBrokerException("Wrong audience from token.");
} }
@@ -110,7 +110,7 @@ public abstract class AbstractJsonUserAttributeMapper extends AbstractIdentityPr
String value = getJsonValue(mapperModel, context); String value = getJsonValue(mapperModel, context);
if (value != null) { if (value != null) {
user.setAttribute(attribute, value); user.setSingleAttribute(attribute, value);
} }
} }
@@ -43,8 +43,8 @@ public class ClaimToRoleMapper extends AbstractClaimMapper {
property = new ProviderConfigProperty(); property = new ProviderConfigProperty();
property.setName(HardcodedRoleMapper.ROLE); property.setName(HardcodedRoleMapper.ROLE);
property.setLabel("Role"); property.setLabel("Role");
property.setHelpText("Role to grant to user if claim is present. To reference an application role the syntax is appname.approle, i.e. myapp.myrole"); property.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.STRING_TYPE); property.setType(ProviderConfigProperty.ROLE_TYPE);
configProperties.add(property); configProperties.add(property);
} }
@@ -40,8 +40,8 @@ public class ExternalKeycloakRoleToRoleMapper extends AbstractClaimMapper {
property = new ProviderConfigProperty(); property = new ProviderConfigProperty();
property.setName(HardcodedRoleMapper.ROLE); property.setName(HardcodedRoleMapper.ROLE);
property.setLabel("Role"); property.setLabel("Role");
property.setHelpText("Role to grant to user if external role is present. To reference an application role the syntax is appname.approle, i.e. myapp.myrole"); property.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.STRING_TYPE); property.setType(ProviderConfigProperty.ROLE_TYPE);
configProperties.add(property); configProperties.add(property);
} }
@@ -3,16 +3,14 @@ package org.keycloak.broker.oidc.mappers;
import org.keycloak.broker.oidc.KeycloakOIDCIdentityProviderFactory; import org.keycloak.broker.oidc.KeycloakOIDCIdentityProviderFactory;
import org.keycloak.broker.oidc.OIDCIdentityProviderFactory; import org.keycloak.broker.oidc.OIDCIdentityProviderFactory;
import org.keycloak.broker.provider.BrokeredIdentityContext; 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.IdentityProviderMapperModel;
import org.keycloak.models.KeycloakSession; import org.keycloak.models.KeycloakSession;
import org.keycloak.models.RealmModel; import org.keycloak.models.RealmModel;
import org.keycloak.models.RoleModel;
import org.keycloak.models.UserModel; import org.keycloak.models.UserModel;
import org.keycloak.provider.ProviderConfigProperty; import org.keycloak.provider.ProviderConfigProperty;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection;
import java.util.List; import java.util.List;
/** /**
@@ -76,7 +74,7 @@ public class UserAttributeMapper extends AbstractClaimMapper {
String attribute = mapperModel.getConfig().get(USER_ATTRIBUTE); String attribute = mapperModel.getConfig().get(USER_ATTRIBUTE);
Object value = getClaimValue(mapperModel, context); Object value = getClaimValue(mapperModel, context);
if (value != null) { if (value != null) {
user.setAttribute(attribute, value.toString()); user.setSingleAttribute(attribute, value.toString());
} }
} }
@@ -84,9 +82,9 @@ public class UserAttributeMapper extends AbstractClaimMapper {
public void updateBrokeredUser(KeycloakSession session, RealmModel realm, UserModel user, IdentityProviderMapperModel mapperModel, BrokeredIdentityContext context) { public void updateBrokeredUser(KeycloakSession session, RealmModel realm, UserModel user, IdentityProviderMapperModel mapperModel, BrokeredIdentityContext context) {
String attribute = mapperModel.getConfig().get(USER_ATTRIBUTE); String attribute = mapperModel.getConfig().get(USER_ATTRIBUTE);
Object value = getClaimValue(mapperModel, context); Object value = getClaimValue(mapperModel, context);
String current = user.getAttribute(attribute); String current = user.getFirstAttribute(attribute);
if (value != null && !value.equals(current)) { if (value != null && !value.equals(current)) {
user.setAttribute(attribute, value.toString()); user.setSingleAttribute(attribute, value.toString());
} else if (value == null) { } else if (value == null) {
user.removeAttribute(attribute); user.removeAttribute(attribute);
} }
+1 -1
View File
@@ -4,7 +4,7 @@
<parent> <parent>
<artifactId>keycloak-parent</artifactId> <artifactId>keycloak-parent</artifactId>
<groupId>org.keycloak</groupId> <groupId>org.keycloak</groupId>
<version>1.3.1.Final</version> <version>1.5.1.Final</version>
<relativePath>../pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
+1 -1
View File
@@ -4,7 +4,7 @@
<parent> <parent>
<artifactId>keycloak-parent</artifactId> <artifactId>keycloak-parent</artifactId>
<groupId>org.keycloak</groupId> <groupId>org.keycloak</groupId>
<version>1.3.1.Final</version> <version>1.5.1.Final</version>
<relativePath>../../pom.xml</relativePath> <relativePath>../../pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
@@ -286,7 +286,8 @@ public class SAMLEndpoint {
identity.setUsername(subjectNameID.getValue()); identity.setUsername(subjectNameID.getValue());
if (subjectNameID.getFormat().toString().equals(JBossSAMLURIConstants.NAMEID_FORMAT_EMAIL.get())) { //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()); identity.setEmail(subjectNameID.getValue());
} }
@@ -59,8 +59,8 @@ public class AttributeToRoleMapper extends AbstractIdentityProviderMapper {
property = new ProviderConfigProperty(); property = new ProviderConfigProperty();
property.setName(HardcodedRoleMapper.ROLE); property.setName(HardcodedRoleMapper.ROLE);
property.setLabel("Role"); property.setLabel("Role");
property.setHelpText("Role to grant to user. To reference an application role the syntax is appname.approle, i.e. myapp.myrole"); property.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.STRING_TYPE); property.setType(ProviderConfigProperty.ROLE_TYPE);
configProperties.add(property); configProperties.add(property);
} }
@@ -2,17 +2,14 @@ package org.keycloak.broker.saml.mappers;
import org.keycloak.broker.provider.AbstractIdentityProviderMapper; import org.keycloak.broker.provider.AbstractIdentityProviderMapper;
import org.keycloak.broker.provider.BrokeredIdentityContext; import org.keycloak.broker.provider.BrokeredIdentityContext;
import org.keycloak.broker.provider.IdentityBrokerException;
import org.keycloak.broker.saml.SAMLEndpoint; import org.keycloak.broker.saml.SAMLEndpoint;
import org.keycloak.broker.saml.SAMLIdentityProviderFactory; import org.keycloak.broker.saml.SAMLIdentityProviderFactory;
import org.keycloak.dom.saml.v2.assertion.AssertionType; import org.keycloak.dom.saml.v2.assertion.AssertionType;
import org.keycloak.dom.saml.v2.assertion.AttributeStatementType; import org.keycloak.dom.saml.v2.assertion.AttributeStatementType;
import org.keycloak.dom.saml.v2.assertion.AttributeType; import org.keycloak.dom.saml.v2.assertion.AttributeType;
import org.keycloak.models.ClientModel;
import org.keycloak.models.IdentityProviderMapperModel; import org.keycloak.models.IdentityProviderMapperModel;
import org.keycloak.models.KeycloakSession; import org.keycloak.models.KeycloakSession;
import org.keycloak.models.RealmModel; import org.keycloak.models.RealmModel;
import org.keycloak.models.RoleModel;
import org.keycloak.models.UserModel; import org.keycloak.models.UserModel;
import org.keycloak.provider.ProviderConfigProperty; import org.keycloak.provider.ProviderConfigProperty;
@@ -87,7 +84,7 @@ public class UserAttributeMapper extends AbstractIdentityProviderMapper {
String attribute = mapperModel.getConfig().get(USER_ATTRIBUTE); String attribute = mapperModel.getConfig().get(USER_ATTRIBUTE);
Object value = getAttribute(mapperModel, context); Object value = getAttribute(mapperModel, context);
if (value != null) { if (value != null) {
user.setAttribute(attribute, value.toString()); user.setSingleAttribute(attribute, value.toString());
} }
} }
@@ -101,7 +98,7 @@ public class UserAttributeMapper extends AbstractIdentityProviderMapper {
for (AttributeStatementType.ASTChoiceType choice : statement.getAttributes()) { for (AttributeStatementType.ASTChoiceType choice : statement.getAttributes()) {
AttributeType attr = choice.getAttribute(); AttributeType attr = choice.getAttribute();
if (name != null && !name.equals(attr.getName())) continue; if (name != null && !name.equals(attr.getName())) continue;
if (friendly != null && !name.equals(attr.getFriendlyName())) continue; if (friendly != null && !friendly.equals(attr.getFriendlyName())) continue;
List<Object> attributeValue = attr.getAttributeValue(); List<Object> attributeValue = attr.getAttributeValue();
if (attributeValue == null || attributeValue.isEmpty()) return null; if (attributeValue == null || attributeValue.isEmpty()) return null;
@@ -115,9 +112,9 @@ public class UserAttributeMapper extends AbstractIdentityProviderMapper {
public void updateBrokeredUser(KeycloakSession session, RealmModel realm, UserModel user, IdentityProviderMapperModel mapperModel, BrokeredIdentityContext context) { public void updateBrokeredUser(KeycloakSession session, RealmModel realm, UserModel user, IdentityProviderMapperModel mapperModel, BrokeredIdentityContext context) {
String attribute = mapperModel.getConfig().get(USER_ATTRIBUTE); String attribute = mapperModel.getConfig().get(USER_ATTRIBUTE);
Object value = getAttribute(mapperModel, context); Object value = getAttribute(mapperModel, context);
String current = user.getAttribute(attribute); String current = user.getFirstAttribute(attribute);
if (value != null && !value.equals(current)) { if (value != null && !value.equals(current)) {
user.setAttribute(attribute, value.toString()); user.setSingleAttribute(attribute, value.toString());
} else if (value == null) { } else if (value == null) {
user.removeAttribute(attribute); user.removeAttribute(attribute);
} }
+1 -1
View File
@@ -4,7 +4,7 @@
<parent> <parent>
<artifactId>keycloak-parent</artifactId> <artifactId>keycloak-parent</artifactId>
<groupId>org.keycloak</groupId> <groupId>org.keycloak</groupId>
<version>1.3.1.Final</version> <version>1.5.1.Final</version>
<relativePath>../../pom.xml</relativePath> <relativePath>../../pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
@@ -90,18 +90,7 @@ public class DefaultFileConnectionProviderFactory implements FileConnectionProvi
ImportUtils.importFromStream(session, JsonSerialization.mapper, fis, Strategy.IGNORE_EXISTING); ImportUtils.importFromStream(session, JsonSerialization.mapper, fis, Strategy.IGNORE_EXISTING);
session.realms().getMigrationModel().setStoredVersion(model.getModelVersion()); session.realms().getMigrationModel().setStoredVersion(model.getModelVersion());
List<RealmRepresentation> realmReps = new ArrayList<RealmRepresentation>(); ImportUtils.importRealms(session, model.getRealms(), Strategy.IGNORE_EXISTING);
for (RealmRepresentation realmRep : model.getRealms()) {
if (Config.getAdminRealm().equals(realmRep.getRealm())) {
realmReps.add(0, realmRep);
} else {
realmReps.add(realmRep);
}
}
for (RealmRepresentation realmRep : realmReps) {
ImportUtils.importRealm(session, realmRep, Strategy.IGNORE_EXISTING);
}
} catch (IOException ioe) { } catch (IOException ioe) {
logger.error("Unable to read model file " + kcdata.getAbsolutePath(), ioe); logger.error("Unable to read model file " + kcdata.getAbsolutePath(), ioe);
} finally { } finally {
+1 -1
View File
@@ -4,7 +4,7 @@
<parent> <parent>
<artifactId>keycloak-parent</artifactId> <artifactId>keycloak-parent</artifactId>
<groupId>org.keycloak</groupId> <groupId>org.keycloak</groupId>
<version>1.3.1.Final</version> <version>1.5.1.Final</version>
<relativePath>../../pom.xml</relativePath> <relativePath>../../pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
+1 -1
View File
@@ -4,7 +4,7 @@
<parent> <parent>
<artifactId>keycloak-parent</artifactId> <artifactId>keycloak-parent</artifactId>
<groupId>org.keycloak</groupId> <groupId>org.keycloak</groupId>
<version>1.3.1.Final</version> <version>1.5.1.Final</version>
<relativePath>../../pom.xml</relativePath> <relativePath>../../pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
+1 -1
View File
@@ -4,7 +4,7 @@
<parent> <parent>
<artifactId>keycloak-parent</artifactId> <artifactId>keycloak-parent</artifactId>
<groupId>org.keycloak</groupId> <groupId>org.keycloak</groupId>
<version>1.3.1.Final</version> <version>1.5.1.Final</version>
<relativePath>../../pom.xml</relativePath> <relativePath>../../pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
@@ -46,26 +46,26 @@ public class LiquibaseJpaUpdaterProvider implements JpaUpdaterProvider {
private static final String CHANGELOG = "META-INF/jpa-changelog-master.xml"; private static final String CHANGELOG = "META-INF/jpa-changelog-master.xml";
@Override @Override
public String getCurrentVersionSql() { public String getCurrentVersionSql(String defaultSchema) {
return "SELECT ID from DATABASECHANGELOG ORDER BY DATEEXECUTED DESC LIMIT 1"; return "SELECT ID from " + getTable("DATABASECHANGELOG", defaultSchema) + " ORDER BY DATEEXECUTED DESC LIMIT 1";
} }
@Override @Override
public void update(KeycloakSession session, Connection connection) { public void update(KeycloakSession session, Connection connection, String defaultSchema) {
logger.debug("Starting database update"); logger.debug("Starting database update");
// Need ThreadLocal as liquibase doesn't seem to have API to inject custom objects into tasks // Need ThreadLocal as liquibase doesn't seem to have API to inject custom objects into tasks
ThreadLocalSessionContext.setCurrentSession(session); ThreadLocalSessionContext.setCurrentSession(session);
try { try {
Liquibase liquibase = getLiquibase(connection); Liquibase liquibase = getLiquibase(connection, defaultSchema);
List<ChangeSet> changeSets = liquibase.listUnrunChangeSets((Contexts) null); List<ChangeSet> changeSets = liquibase.listUnrunChangeSets((Contexts) null);
if (!changeSets.isEmpty()) { if (!changeSets.isEmpty()) {
if (changeSets.get(0).getId().equals(FIRST_VERSION)) { if (changeSets.get(0).getId().equals(FIRST_VERSION)) {
Statement statement = connection.createStatement(); Statement statement = connection.createStatement();
try { try {
statement.executeQuery("SELECT id FROM REALM"); statement.executeQuery("SELECT id FROM " + getTable("REALM", defaultSchema));
logger.infov("Updating database from {0} to {1}", FIRST_VERSION, changeSets.get(changeSets.size() - 1).getId()); logger.infov("Updating database from {0} to {1}", FIRST_VERSION, changeSets.get(changeSets.size() - 1).getId());
liquibase.markNextChangeSetRan(null); liquibase.markNextChangeSetRan(null);
@@ -93,9 +93,9 @@ public class LiquibaseJpaUpdaterProvider implements JpaUpdaterProvider {
} }
@Override @Override
public void validate(Connection connection) { public void validate(Connection connection, String defaultSchema) {
try { try {
Liquibase liquibase = getLiquibase(connection); Liquibase liquibase = getLiquibase(connection, defaultSchema);
liquibase.validate(); liquibase.validate();
} catch (Exception e) { } catch (Exception e) {
@@ -103,7 +103,7 @@ public class LiquibaseJpaUpdaterProvider implements JpaUpdaterProvider {
} }
} }
private Liquibase getLiquibase(Connection connection) throws Exception { private Liquibase getLiquibase(Connection connection, String defaultSchema) throws Exception {
ServiceLocator sl = ServiceLocator.getInstance(); ServiceLocator sl = ServiceLocator.getInstance();
if (!System.getProperties().containsKey("liquibase.scan.packages")) { if (!System.getProperties().containsKey("liquibase.scan.packages")) {
@@ -125,6 +125,9 @@ public class LiquibaseJpaUpdaterProvider implements JpaUpdaterProvider {
LogFactory.setInstance(new LogWrapper()); LogFactory.setInstance(new LogWrapper());
Database database = DatabaseFactory.getInstance().findCorrectDatabaseImplementation(new JdbcConnection(connection)); Database database = DatabaseFactory.getInstance().findCorrectDatabaseImplementation(new JdbcConnection(connection));
if (defaultSchema != null) {
database.setDefaultSchemaName(defaultSchema);
}
return new Liquibase(CHANGELOG, new ClassLoaderResourceAccessor(getClass().getClassLoader()), database); return new Liquibase(CHANGELOG, new ClassLoaderResourceAccessor(getClass().getClassLoader()), database);
} }
@@ -228,4 +231,8 @@ public class LiquibaseJpaUpdaterProvider implements JpaUpdaterProvider {
} }
public static String getTable(String table, String defaultSchema) {
return defaultSchema != null ? defaultSchema + "." + table : table;
}
} }
@@ -12,6 +12,7 @@ import liquibase.statement.SqlStatement;
import liquibase.statement.core.UpdateStatement; import liquibase.statement.core.UpdateStatement;
import liquibase.structure.core.Schema; import liquibase.structure.core.Schema;
import liquibase.structure.core.Table; import liquibase.structure.core.Table;
import org.keycloak.connections.jpa.updater.liquibase.LiquibaseJpaUpdaterProvider;
import org.keycloak.models.utils.KeycloakModelUtils; import org.keycloak.models.utils.KeycloakModelUtils;
import java.sql.Connection; import java.sql.Connection;
@@ -36,7 +37,7 @@ public class AddRealmCodeSecret implements CustomSqlChange {
String correctedTableName = database.correctObjectName("REALM", Table.class); String correctedTableName = database.correctObjectName("REALM", Table.class);
if (SnapshotGeneratorFactory.getInstance().has(new Table().setName(correctedTableName), database)) { if (SnapshotGeneratorFactory.getInstance().has(new Table().setName(correctedTableName), database)) {
ResultSet resultSet = connection.createStatement().executeQuery("SELECT ID FROM REALM WHERE CODE_SECRET IS NULL"); ResultSet resultSet = connection.createStatement().executeQuery("SELECT ID FROM " + LiquibaseJpaUpdaterProvider.getTable(correctedTableName, database.getDefaultSchemaName()) + " WHERE CODE_SECRET IS NULL");
while (resultSet.next()) { while (resultSet.next()) {
String id = resultSet.getString(1); String id = resultSet.getString(1);
@@ -16,6 +16,7 @@ import liquibase.snapshot.SnapshotGeneratorFactory;
import liquibase.statement.SqlStatement; import liquibase.statement.SqlStatement;
import liquibase.structure.core.Table; import liquibase.structure.core.Table;
import org.jboss.logging.Logger; import org.jboss.logging.Logger;
import org.keycloak.connections.jpa.updater.liquibase.LiquibaseJpaUpdaterProvider;
import org.keycloak.connections.jpa.updater.liquibase.ThreadLocalSessionContext; import org.keycloak.connections.jpa.updater.liquibase.ThreadLocalSessionContext;
import org.keycloak.models.KeycloakSession; import org.keycloak.models.KeycloakSession;
import org.keycloak.services.DefaultKeycloakSessionFactory; import org.keycloak.services.DefaultKeycloakSessionFactory;
@@ -88,7 +89,7 @@ public abstract class CustomKeycloakTask implements CustomSqlChange {
try { try {
String correctedTableName = database.correctObjectName("REALM", Table.class); String correctedTableName = database.correctObjectName("REALM", Table.class);
if (SnapshotGeneratorFactory.getInstance().has(new Table().setName(correctedTableName), database)) { if (SnapshotGeneratorFactory.getInstance().has(new Table().setName(correctedTableName), database)) {
ResultSet resultSet = connection.createStatement().executeQuery("SELECT ID FROM REALM"); ResultSet resultSet = connection.createStatement().executeQuery("SELECT ID FROM " + getTableName(correctedTableName));
try { try {
return (resultSet.next()); return (resultSet.next());
} finally { } finally {
@@ -108,4 +109,9 @@ public abstract class CustomKeycloakTask implements CustomSqlChange {
protected abstract void generateStatementsImpl() throws CustomChangeException; protected abstract void generateStatementsImpl() throws CustomChangeException;
protected abstract String getTaskId(); protected abstract String getTaskId();
// get Table name for sql selects
protected String getTableName(String tableName) {
return LiquibaseJpaUpdaterProvider.getTable(tableName, database.getDefaultSchemaName());
}
} }
@@ -11,6 +11,7 @@ import liquibase.statement.core.InsertStatement;
import liquibase.statement.core.UpdateStatement; import liquibase.statement.core.UpdateStatement;
import liquibase.structure.core.Table; import liquibase.structure.core.Table;
import org.keycloak.Config; import org.keycloak.Config;
import org.keycloak.connections.jpa.updater.liquibase.LiquibaseJpaUpdaterProvider;
import org.keycloak.migration.MigrationProvider; import org.keycloak.migration.MigrationProvider;
import org.keycloak.models.AdminRoles; import org.keycloak.models.AdminRoles;
import org.keycloak.models.ClaimMask; import org.keycloak.models.ClaimMask;
@@ -49,7 +50,10 @@ public class JpaUpdate1_2_0_Beta1 extends CustomKeycloakTask {
String identityProviderTableName = database.correctObjectName("IDENTITY_PROVIDER", Table.class); String identityProviderTableName = database.correctObjectName("IDENTITY_PROVIDER", Table.class);
String idpConfigTableName = database.correctObjectName("IDENTITY_PROVIDER_CONFIG", Table.class); String idpConfigTableName = database.correctObjectName("IDENTITY_PROVIDER_CONFIG", Table.class);
PreparedStatement statement = jdbcConnection.prepareStatement("select RSC.NAME, VALUE, REALM_ID, UPDATE_PROFILE_ON_SOC_LOGIN from REALM_SOCIAL_CONFIG RSC,REALM where RSC.REALM_ID = REALM.ID ORDER BY RSC.REALM_ID, RSC.NAME"); 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 { try {
ResultSet resultSet = statement.executeQuery(); ResultSet resultSet = statement.executeQuery();
try { try {
@@ -124,7 +128,7 @@ public class JpaUpdate1_2_0_Beta1 extends CustomKeycloakTask {
protected void convertSocialToIdFedUsers() throws SQLException, DatabaseException { protected void convertSocialToIdFedUsers() throws SQLException, DatabaseException {
String federatedIdentityTableName = database.correctObjectName("FEDERATED_IDENTITY", Table.class); 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 USER_SOCIAL_LINK"); PreparedStatement statement = jdbcConnection.prepareStatement("select REALM_ID, USER_ID, SOCIAL_PROVIDER, SOCIAL_USER_ID, SOCIAL_USERNAME from " + getTableName("USER_SOCIAL_LINK"));
try { try {
ResultSet resultSet = statement.executeQuery(); ResultSet resultSet = statement.executeQuery();
try { try {
@@ -170,7 +174,7 @@ public class JpaUpdate1_2_0_Beta1 extends CustomKeycloakTask {
String adminRoleId = getAdminRoleId(); String adminRoleId = getAdminRoleId();
String masterRealmId = Config.getAdminRealm(); String masterRealmId = Config.getAdminRealm();
PreparedStatement statement = jdbcConnection.prepareStatement("select NAME from REALM"); PreparedStatement statement = jdbcConnection.prepareStatement("select NAME from " + getTableName("REALM"));
try { try {
ResultSet resultSet = statement.executeQuery(); ResultSet resultSet = statement.executeQuery();
try { try {
@@ -178,7 +182,7 @@ public class JpaUpdate1_2_0_Beta1 extends CustomKeycloakTask {
String realmName = resultSet.getString("NAME"); String realmName = resultSet.getString("NAME");
String masterAdminAppName = realmName + "-realm"; String masterAdminAppName = realmName + "-realm";
PreparedStatement statement2 = jdbcConnection.prepareStatement("select ID from CLIENT where REALM_ID = ? AND NAME = ?"); PreparedStatement statement2 = jdbcConnection.prepareStatement("select ID from " + getTableName("CLIENT") + " where REALM_ID = ? AND NAME = ?");
statement2.setString(1, masterRealmId); statement2.setString(1, masterRealmId);
statement2.setString(2, masterAdminAppName); statement2.setString(2, masterAdminAppName);
@@ -209,7 +213,7 @@ public class JpaUpdate1_2_0_Beta1 extends CustomKeycloakTask {
} }
private String getAdminRoleId() throws SQLException, DatabaseException { private String getAdminRoleId() throws SQLException, DatabaseException {
PreparedStatement statement = jdbcConnection.prepareStatement("select ID from KEYCLOAK_ROLE where NAME = ? AND REALM = ?"); PreparedStatement statement = jdbcConnection.prepareStatement("select ID from " + getTableName("KEYCLOAK_ROLE") + " where NAME = ? AND REALM = ?");
statement.setString(1, AdminRoles.ADMIN); statement.setString(1, AdminRoles.ADMIN);
statement.setString(2, Config.getAdminRealm()); statement.setString(2, Config.getAdminRealm());
@@ -231,7 +235,8 @@ public class JpaUpdate1_2_0_Beta1 extends CustomKeycloakTask {
protected void addNewRealmAdminRoles() throws SQLException, DatabaseException { 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 CLIENT,KEYCLOAK_ROLE where KEYCLOAK_ROLE.APPLICATION = CLIENT.ID AND CLIENT.NAME = 'realm-management' AND KEYCLOAK_ROLE.NAME = ?"); 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); statement.setString(1, AdminRoles.REALM_ADMIN);
try { try {
@@ -280,7 +285,7 @@ public class JpaUpdate1_2_0_Beta1 extends CustomKeycloakTask {
String protocolMapperTableName = database.correctObjectName("PROTOCOL_MAPPER", Table.class); String protocolMapperTableName = database.correctObjectName("PROTOCOL_MAPPER", Table.class);
String protocolMapperCfgTableName = database.correctObjectName("PROTOCOL_MAPPER_CONFIG", Table.class); String protocolMapperCfgTableName = database.correctObjectName("PROTOCOL_MAPPER_CONFIG", Table.class);
PreparedStatement statement = jdbcConnection.prepareStatement("select ID, NAME, ALLOWED_CLAIMS_MASK from CLIENT"); PreparedStatement statement = jdbcConnection.prepareStatement("select ID, NAME, ALLOWED_CLAIMS_MASK from " + getTableName("CLIENT"));
try { try {
ResultSet resultSet = statement.executeQuery(); ResultSet resultSet = statement.executeQuery();
@@ -293,7 +298,7 @@ public class JpaUpdate1_2_0_Beta1 extends CustomKeycloakTask {
} }
Object acmObj = resultSet.getObject("ALLOWED_CLAIMS_MASK"); Object acmObj = resultSet.getObject("ALLOWED_CLAIMS_MASK");
long mask = (acmObj != null) ? (Long) acmObj : ClaimMask.ALL; long mask = (acmObj != null) ? ((Number) acmObj).longValue() : ClaimMask.ALL;
MigrationProvider migrationProvider = this.kcSession.getProvider(MigrationProvider.class); MigrationProvider migrationProvider = this.kcSession.getProvider(MigrationProvider.class);
List<ProtocolMapperRepresentation> protocolMappers = migrationProvider.getMappersForClaimMask(mask); List<ProtocolMapperRepresentation> protocolMappers = migrationProvider.getMappersForClaimMask(mask);
@@ -19,7 +19,7 @@ public class JpaUpdate1_2_0_CR1 extends CustomKeycloakTask {
try { try {
String trueValue = DataTypeFactory.getInstance().getTrueBooleanValue(database); String trueValue = DataTypeFactory.getInstance().getTrueBooleanValue(database);
PreparedStatement statement = jdbcConnection.prepareStatement("select CLIENT.REALM_ID, CLIENT.ID CLIENT_ID from CLIENT where CLIENT.CONSENT_REQUIRED = " + trueValue); PreparedStatement statement = jdbcConnection.prepareStatement("select CLIENT.REALM_ID, CLIENT.ID CLIENT_ID from " + getTableName("CLIENT") + " CLIENT where CLIENT.CONSENT_REQUIRED = " + trueValue);
try { try {
ResultSet resultSet = statement.executeQuery(); ResultSet resultSet = statement.executeQuery();
@@ -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,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>
@@ -7,4 +7,6 @@
<include file="META-INF/jpa-changelog-1.2.0.CR1.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.2.0.Final.xml"/>
<include file="META-INF/jpa-changelog-1.3.0.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> </databaseChangeLog>
+2 -2
View File
@@ -4,7 +4,7 @@
<parent> <parent>
<artifactId>keycloak-parent</artifactId> <artifactId>keycloak-parent</artifactId>
<groupId>org.keycloak</groupId> <groupId>org.keycloak</groupId>
<version>1.3.1.Final</version> <version>1.5.1.Final</version>
<relativePath>../../pom.xml</relativePath> <relativePath>../../pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
@@ -24,7 +24,7 @@
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.hibernate.javax.persistence</groupId> <groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.0-api</artifactId> <artifactId>hibernate-jpa-2.1-api</artifactId>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
@@ -4,6 +4,7 @@ import org.hibernate.ejb.AvailableSettings;
import org.jboss.logging.Logger; import org.jboss.logging.Logger;
import org.keycloak.Config; import org.keycloak.Config;
import org.keycloak.connections.jpa.updater.JpaUpdaterProvider; import org.keycloak.connections.jpa.updater.JpaUpdaterProvider;
import org.keycloak.connections.jpa.util.JpaUtils;
import org.keycloak.models.KeycloakSession; import org.keycloak.models.KeycloakSession;
import org.keycloak.models.KeycloakSessionFactory; import org.keycloak.models.KeycloakSessionFactory;
@@ -13,10 +14,12 @@ import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence; import javax.persistence.Persistence;
import javax.sql.DataSource; import javax.sql.DataSource;
import java.sql.Connection; import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager; import java.sql.DriverManager;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.HashMap; import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map; import java.util.Map;
/** /**
@@ -30,6 +33,8 @@ public class DefaultJpaConnectionProviderFactory implements JpaConnectionProvide
private Config.Scope config; private Config.Scope config;
private Map<String,String> operationalInfo;
@Override @Override
public JpaConnectionProvider create(KeycloakSession session) { public JpaConnectionProvider create(KeycloakSession session) {
lazyInit(session); lazyInit(session);
@@ -70,14 +75,11 @@ public class DefaultJpaConnectionProviderFactory implements JpaConnectionProvide
Connection connection = null; Connection connection = null;
String unitName = config.get("unitName");
String databaseSchema = config.get("databaseSchema"); String databaseSchema = config.get("databaseSchema");
Map<String, Object> properties = new HashMap<String, Object>(); Map<String, Object> properties = new HashMap<String, Object>();
// Only load config from keycloak-server.json if unitName is not specified String unitName = "keycloak-default";
if (unitName == null) {
unitName = "keycloak-default";
String dataSource = config.get("dataSource"); String dataSource = config.get("dataSource");
if (dataSource != null) { if (dataSource != null) {
@@ -105,6 +107,11 @@ public class DefaultJpaConnectionProviderFactory implements JpaConnectionProvide
properties.put("hibernate.dialect", driverDialect); 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 != null) {
if (databaseSchema.equals("development-update")) { if (databaseSchema.equals("development-update")) {
properties.put("hibernate.hbm2ddl.auto", "update"); properties.put("hibernate.hbm2ddl.auto", "update");
@@ -117,7 +124,10 @@ public class DefaultJpaConnectionProviderFactory implements JpaConnectionProvide
properties.put("hibernate.show_sql", config.getBoolean("showSql", false)); properties.put("hibernate.show_sql", config.getBoolean("showSql", false));
properties.put("hibernate.format_sql", config.getBoolean("formatSql", true)); properties.put("hibernate.format_sql", config.getBoolean("formatSql", true));
}
connection = getConnection();
try{
prepareOperationalInfo(connection);
if (databaseSchema != null) { if (databaseSchema != null) {
logger.trace("Updating database"); logger.trace("Updating database");
@@ -127,12 +137,10 @@ public class DefaultJpaConnectionProviderFactory implements JpaConnectionProvide
throw new RuntimeException("Can't update database: JPA updater provider not found"); throw new RuntimeException("Can't update database: JPA updater provider not found");
} }
connection = getConnection();
if (databaseSchema.equals("update")) { if (databaseSchema.equals("update")) {
String currentVersion = null; String currentVersion = null;
try { try {
ResultSet resultSet = connection.createStatement().executeQuery(updater.getCurrentVersionSql()); ResultSet resultSet = connection.createStatement().executeQuery(updater.getCurrentVersionSql(schema));
if (resultSet.next()) { if (resultSet.next()) {
currentVersion = resultSet.getString(1); currentVersion = resultSet.getString(1);
} }
@@ -140,12 +148,12 @@ public class DefaultJpaConnectionProviderFactory implements JpaConnectionProvide
} }
if (currentVersion == null || !JpaUpdaterProvider.LAST_VERSION.equals(currentVersion)) { if (currentVersion == null || !JpaUpdaterProvider.LAST_VERSION.equals(currentVersion)) {
updater.update(session, connection); updater.update(session, connection, schema);
} else { } else {
logger.debug("Database is up to date"); logger.debug("Database is up to date");
} }
} else if (databaseSchema.equals("validate")) { } else if (databaseSchema.equals("validate")) {
updater.validate(connection); updater.validate(connection, schema);
} else { } else {
throw new RuntimeException("Invalid value for databaseSchema: " + databaseSchema); throw new RuntimeException("Invalid value for databaseSchema: " + databaseSchema);
} }
@@ -157,6 +165,7 @@ public class DefaultJpaConnectionProviderFactory implements JpaConnectionProvide
emf = Persistence.createEntityManagerFactory(unitName, properties); emf = Persistence.createEntityManagerFactory(unitName, properties);
logger.trace("EntityManagerFactory created"); logger.trace("EntityManagerFactory created");
} finally {
// Close after creating EntityManagerFactory to prevent in-mem databases from closing // Close after creating EntityManagerFactory to prevent in-mem databases from closing
if (connection != null) { if (connection != null) {
try { try {
@@ -169,6 +178,20 @@ public class DefaultJpaConnectionProviderFactory implements JpaConnectionProvide
} }
} }
} }
}
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() { private Connection getConnection() {
try { try {
@@ -185,4 +208,9 @@ public class DefaultJpaConnectionProviderFactory implements JpaConnectionProvide
} }
} }
@Override
public Map<String,String> getOperationalInfo() {
return operationalInfo;
}
} }
@@ -1,9 +1,10 @@
package org.keycloak.connections.jpa; package org.keycloak.connections.jpa;
import org.keycloak.provider.ProviderFactory; import org.keycloak.provider.ServerInfoAwareProviderFactory;
/** /**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a> * @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/ */
public interface JpaConnectionProviderFactory extends ProviderFactory<JpaConnectionProvider> { public interface JpaConnectionProviderFactory extends ServerInfoAwareProviderFactory<JpaConnectionProvider> {
} }
@@ -12,12 +12,12 @@ public interface JpaUpdaterProvider extends Provider {
public String FIRST_VERSION = "1.0.0.Final"; public String FIRST_VERSION = "1.0.0.Final";
public String LAST_VERSION = "1.3.0.Beta1"; public String LAST_VERSION = "1.5.0";
public String getCurrentVersionSql(); public String getCurrentVersionSql(String defaultSchema);
public void update(KeycloakSession session, Connection connection); public void update(KeycloakSession session, Connection connection, String defaultSchema);
public void validate(Connection connection); public void validate(Connection connection, String defaultSchema);
} }
@@ -0,0 +1,16 @@
package org.keycloak.connections.jpa.util;
import javax.persistence.EntityManager;
/**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
*/
public class JpaUtils {
public static final String HIBERNATE_DEFAULT_SCHEMA = "hibernate.default_schema";
public static String getTableNameForNativeQuery(String tableName, EntityManager em) {
String schema = (String) em.getEntityManagerFactory().getProperties().get(HIBERNATE_DEFAULT_SCHEMA);
return (schema==null) ? tableName : schema + "." + tableName;
}
}
@@ -27,17 +27,8 @@
<class>org.keycloak.models.jpa.entities.UserConsentProtocolMapperEntity</class> <class>org.keycloak.models.jpa.entities.UserConsentProtocolMapperEntity</class>
<class>org.keycloak.models.jpa.entities.AuthenticationFlowEntity</class> <class>org.keycloak.models.jpa.entities.AuthenticationFlowEntity</class>
<class>org.keycloak.models.jpa.entities.AuthenticationExecutionEntity</class> <class>org.keycloak.models.jpa.entities.AuthenticationExecutionEntity</class>
<class>org.keycloak.models.jpa.entities.AuthenticatorEntity</class> <class>org.keycloak.models.jpa.entities.AuthenticatorConfigEntity</class>
<class>org.keycloak.models.jpa.entities.RequiredActionProviderEntity</class>
<!-- JpaUserSessionProvider -->
<class>org.keycloak.models.sessions.jpa.entities.ClientSessionEntity</class>
<class>org.keycloak.models.sessions.jpa.entities.ClientSessionRoleEntity</class>
<class>org.keycloak.models.sessions.jpa.entities.ClientSessionAuthStatusEntity</class>
<class>org.keycloak.models.sessions.jpa.entities.ClientSessionProtocolMapperEntity</class>
<class>org.keycloak.models.sessions.jpa.entities.ClientSessionNoteEntity</class>
<class>org.keycloak.models.sessions.jpa.entities.UserSessionNoteEntity</class>
<class>org.keycloak.models.sessions.jpa.entities.UserSessionEntity</class>
<class>org.keycloak.models.sessions.jpa.entities.UsernameLoginFailureEntity</class>
<!-- JpaAuditProviders --> <!-- JpaAuditProviders -->
<class>org.keycloak.events.jpa.EventEntity</class> <class>org.keycloak.events.jpa.EventEntity</class>
+1 -1
View File
@@ -4,7 +4,7 @@
<parent> <parent>
<artifactId>keycloak-parent</artifactId> <artifactId>keycloak-parent</artifactId>
<groupId>org.keycloak</groupId> <groupId>org.keycloak</groupId>
<version>1.3.1.Final</version> <version>1.5.1.Final</version>
<relativePath>../../pom.xml</relativePath> <relativePath>../../pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
@@ -27,7 +27,8 @@ public class DefaultMongoUpdaterProvider implements MongoUpdaterProvider {
Update1_1_0_Beta1.class, Update1_1_0_Beta1.class,
Update1_2_0_Beta1.class, Update1_2_0_Beta1.class,
Update1_2_0_CR1.class, Update1_2_0_CR1.class,
Update1_3_0.class Update1_3_0.class,
Update1_4_0.class
}; };
@Override @Override
@@ -249,7 +249,7 @@ public class Update1_2_0_Beta1 extends Update {
dbMapper.put("protocolMapper", protocolMapper.getProtocolMapper()); dbMapper.put("protocolMapper", protocolMapper.getProtocolMapper());
Map<String, String> config = protocolMapper.getConfig(); Map<String, String> config = protocolMapper.getConfig();
BasicDBObject dbConfig = MapMapper.convertMap(config); BasicDBObject dbConfig = MapMapper.convertMap(config, null);
dbMapper.put("config", dbConfig); dbMapper.put("config", dbConfig);
dbProtocolMappers.add(dbMapper); dbProtocolMappers.add(dbMapper);
@@ -0,0 +1,63 @@
package org.keycloak.connections.mongo.updater.impl.updates;
import java.util.HashSet;
import java.util.Map;
import com.mongodb.BasicDBList;
import com.mongodb.BasicDBObject;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import org.keycloak.models.KeycloakSession;
import org.keycloak.representations.idm.IdentityProviderRepresentation;
/**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
*/
public class Update1_4_0 extends Update {
@Override
public String getId() {
return "1.4.0";
}
@Override
public void update(KeycloakSession session) throws ClassNotFoundException {
deleteEntries("clientSessions");
deleteEntries("sessions");
// Remove warning
removeField("realms", "authenticators");
updateUserAttributes();
}
private void updateUserAttributes() {
DBCollection users = db.getCollection("users");
DBCursor usersCursor = users.find();
try {
while (usersCursor.hasNext()) {
BasicDBObject user = (BasicDBObject) usersCursor.next();
BasicDBObject attributes = (BasicDBObject) user.get("attributes");
if (attributes != null) {
for (Map.Entry<String, Object> attr : new HashSet<>(attributes.entrySet())) {
String attrName = attr.getKey();
Object attrValue = attr.getValue();
if (attrValue != null && attrValue instanceof String) {
BasicDBList asList = new BasicDBList();
asList.add(attrValue);
attributes.put(attrName, asList);
}
}
user.put("attributes", attributes);
users.save(user);
}
}
} finally {
usersCursor.close();
}
}
}
+1 -1
View File
@@ -4,7 +4,7 @@
<parent> <parent>
<artifactId>keycloak-parent</artifactId> <artifactId>keycloak-parent</artifactId>
<groupId>org.keycloak</groupId> <groupId>org.keycloak</groupId>
<version>1.3.1.Final</version> <version>1.5.1.Final</version>
<relativePath>../../pom.xml</relativePath> <relativePath>../../pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
@@ -5,6 +5,7 @@ import com.mongodb.MongoClient;
import com.mongodb.MongoClientOptions; import com.mongodb.MongoClientOptions;
import com.mongodb.MongoCredential; import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress; import com.mongodb.ServerAddress;
import org.jboss.logging.Logger; import org.jboss.logging.Logger;
import org.keycloak.Config; import org.keycloak.Config;
import org.keycloak.connections.mongo.api.MongoStore; import org.keycloak.connections.mongo.api.MongoStore;
@@ -18,35 +19,35 @@ import javax.net.ssl.SSLSocketFactory;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.net.UnknownHostException; import java.net.UnknownHostException;
import java.util.Collections; import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;
/** /**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a> * @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/ */
public class DefaultMongoConnectionFactoryProvider implements MongoConnectionProviderFactory { public class DefaultMongoConnectionFactoryProvider implements MongoConnectionProviderFactory {
// TODO Make configurable // TODO Make it dynamic
private String[] entities = new String[]{ private String[] entities = new String[]{
"org.keycloak.models.mongo.keycloak.entities.MongoRealmEntity", "org.keycloak.models.mongo.keycloak.entities.MongoRealmEntity",
"org.keycloak.models.mongo.keycloak.entities.MongoUserEntity", "org.keycloak.models.mongo.keycloak.entities.MongoUserEntity",
"org.keycloak.models.mongo.keycloak.entities.MongoRoleEntity", "org.keycloak.models.mongo.keycloak.entities.MongoRoleEntity",
"org.keycloak.models.mongo.keycloak.entities.MongoClientEntity",
"org.keycloak.models.mongo.keycloak.entities.MongoUserConsentEntity",
"org.keycloak.models.mongo.keycloak.entities.MongoMigrationModelEntity",
"org.keycloak.models.entities.IdentityProviderEntity", "org.keycloak.models.entities.IdentityProviderEntity",
"org.keycloak.models.entities.ClientIdentityProviderMappingEntity", "org.keycloak.models.entities.ClientIdentityProviderMappingEntity",
"org.keycloak.models.entities.RequiredCredentialEntity", "org.keycloak.models.entities.RequiredCredentialEntity",
"org.keycloak.models.entities.CredentialEntity", "org.keycloak.models.entities.CredentialEntity",
"org.keycloak.models.entities.FederatedIdentityEntity", "org.keycloak.models.entities.FederatedIdentityEntity",
"org.keycloak.models.mongo.keycloak.entities.MongoClientEntity",
"org.keycloak.models.sessions.mongo.entities.MongoUsernameLoginFailureEntity",
"org.keycloak.models.sessions.mongo.entities.MongoUserSessionEntity",
"org.keycloak.models.sessions.mongo.entities.MongoClientSessionEntity",
"org.keycloak.models.entities.UserFederationProviderEntity", "org.keycloak.models.entities.UserFederationProviderEntity",
"org.keycloak.models.entities.UserFederationMapperEntity", "org.keycloak.models.entities.UserFederationMapperEntity",
"org.keycloak.models.entities.ProtocolMapperEntity", "org.keycloak.models.entities.ProtocolMapperEntity",
"org.keycloak.models.entities.IdentityProviderMapperEntity", "org.keycloak.models.entities.IdentityProviderMapperEntity",
"org.keycloak.models.mongo.keycloak.entities.MongoUserConsentEntity",
"org.keycloak.models.mongo.keycloak.entities.MongoMigrationModelEntity",
"org.keycloak.models.entities.AuthenticationExecutionEntity", "org.keycloak.models.entities.AuthenticationExecutionEntity",
"org.keycloak.models.entities.AuthenticationFlowEntity", "org.keycloak.models.entities.AuthenticationFlowEntity",
"org.keycloak.models.entities.AuthenticatorEntity", "org.keycloak.models.entities.AuthenticatorConfigEntity",
"org.keycloak.models.entities.RequiredActionProviderEntity",
}; };
private static final Logger logger = Logger.getLogger(DefaultMongoConnectionFactoryProvider.class); private static final Logger logger = Logger.getLogger(DefaultMongoConnectionFactoryProvider.class);
@@ -57,6 +58,8 @@ public class DefaultMongoConnectionFactoryProvider implements MongoConnectionPro
private DB db; private DB db;
protected Config.Scope config; protected Config.Scope config;
private Map<String,String> operationalInfo;
@Override @Override
public MongoConnectionProvider create(KeycloakSession session) { public MongoConnectionProvider create(KeycloakSession session) {
lazyInit(session); lazyInit(session);
@@ -159,6 +162,12 @@ public class DefaultMongoConnectionFactoryProvider implements MongoConnectionPro
client = new MongoClient(new ServerAddress(host, port), clientOptions); client = new MongoClient(new ServerAddress(host, port), clientOptions);
} }
operationalInfo = new LinkedHashMap<>();
operationalInfo.put("mongoServerAddress", client.getAddress().toString());
operationalInfo.put("mongoDatabaseName", dbName);
operationalInfo.put("mongoUser", user);
operationalInfo.put("mongoDriverVersion", client.getVersion());
logger.debugv("Initialized mongo model. host: %s, port: %d, db: %s", host, port, dbName); logger.debugv("Initialized mongo model. host: %s, port: %d, db: %s", host, port, dbName);
return client; return client;
} }
@@ -206,4 +215,9 @@ public class DefaultMongoConnectionFactoryProvider implements MongoConnectionPro
} }
} }
@Override
public Map<String,String> getOperationalInfo() {
return operationalInfo;
}
} }
@@ -1,9 +1,9 @@
package org.keycloak.connections.mongo; package org.keycloak.connections.mongo;
import org.keycloak.provider.ProviderFactory; import org.keycloak.provider.ServerInfoAwareProviderFactory;
/** /**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a> * @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/ */
public interface MongoConnectionProviderFactory extends ProviderFactory<MongoConnectionProvider> { public interface MongoConnectionProviderFactory extends ServerInfoAwareProviderFactory<MongoConnectionProvider> {
} }
@@ -1,5 +1,6 @@
package org.keycloak.connections.mongo.api.types; package org.keycloak.connections.mongo.api.types;
import java.lang.reflect.Type;
import java.util.List; import java.util.List;
/** /**
@@ -14,9 +15,9 @@ public class MapperContext<T, S> {
private final Class<? extends S> expectedReturnType; private final Class<? extends S> expectedReturnType;
// in case that expected return type is generic type (like "List<String>"), then genericTypes could contain list of expected generic arguments // in case that expected return type is generic type (like "List<String>"), then genericTypes could contain list of expected generic arguments
private final List<Class<?>> genericTypes; private final List<Type> genericTypes;
public MapperContext(T objectToConvert, Class<? extends S> expectedReturnType, List<Class<?>> genericTypes) { public MapperContext(T objectToConvert, Class<? extends S> expectedReturnType, List<Type> genericTypes) {
this.objectToConvert = objectToConvert; this.objectToConvert = objectToConvert;
this.expectedReturnType = expectedReturnType; this.expectedReturnType = expectedReturnType;
this.genericTypes = genericTypes; this.genericTypes = genericTypes;
@@ -30,7 +31,7 @@ public class MapperContext<T, S> {
return expectedReturnType; return expectedReturnType;
} }
public List<Class<?>> getGenericTypes() { public List<Type> getGenericTypes() {
return genericTypes; return genericTypes;
} }
} }
@@ -47,6 +47,10 @@ public class MapperRegistry {
public <S> S convertDBObjectToApplicationObject(MapperContext<Object, S> context) { public <S> S convertDBObjectToApplicationObject(MapperContext<Object, S> context) {
if (context.getObjectToConvert() == null) {
return null;
}
Object dbObject = context.getObjectToConvert(); Object dbObject = context.getObjectToConvert();
Class<?> expectedApplicationObjectType = context.getExpectedReturnType(); Class<?> expectedApplicationObjectType = context.getExpectedReturnType();
@@ -74,6 +78,10 @@ public class MapperRegistry {
public <S> S convertApplicationObjectToDBObject(Object applicationObject, Class<S> expectedDBObjectType) { public <S> S convertApplicationObjectToDBObject(Object applicationObject, Class<S> expectedDBObjectType) {
if (applicationObject == null) {
return null;
}
Class<?> appObjectType = applicationObject.getClass(); Class<?> appObjectType = applicationObject.getClass();
Mapper<Object, S> mapper = (Mapper<Object, S>)getAppConverterForType(appObjectType, appObjectMappers); Mapper<Object, S> mapper = (Mapper<Object, S>)getAppConverterForType(appObjectType, appObjectMappers);
if (mapper == null) { if (mapper == null) {
@@ -79,9 +79,9 @@ public class MongoStoreImpl implements MongoStore {
mapperRegistry.addAppObjectMapper(new ListMapper(mapperRegistry, Set.class)); mapperRegistry.addAppObjectMapper(new ListMapper(mapperRegistry, Set.class));
mapperRegistry.addDBObjectMapper(new BasicDBListToSetMapper(mapperRegistry)); mapperRegistry.addDBObjectMapper(new BasicDBListToSetMapper(mapperRegistry));
mapperRegistry.addAppObjectMapper(new MapMapper(HashMap.class)); mapperRegistry.addAppObjectMapper(new MapMapper(mapperRegistry, HashMap.class));
mapperRegistry.addAppObjectMapper(new MapMapper(Map.class)); mapperRegistry.addAppObjectMapper(new MapMapper(mapperRegistry, Map.class));
mapperRegistry.addDBObjectMapper(new BasicDBObjectToMapMapper()); mapperRegistry.addDBObjectMapper(new BasicDBObjectToMapMapper(mapperRegistry));
// Enum converters // Enum converters
mapperRegistry.addAppObjectMapper(new EnumToStringMapper()); mapperRegistry.addAppObjectMapper(new EnumToStringMapper());
@@ -24,7 +24,7 @@ public class BasicDBListMapper implements Mapper<BasicDBList, List> {
public List convertObject(MapperContext<BasicDBList, List> context) { public List convertObject(MapperContext<BasicDBList, List> context) {
BasicDBList dbList = context.getObjectToConvert(); BasicDBList dbList = context.getObjectToConvert();
ArrayList<Object> appObjects = new ArrayList<Object>(); ArrayList<Object> appObjects = new ArrayList<Object>();
Class<?> expectedListElementType = context.getGenericTypes().get(0); Class<?> expectedListElementType = (Class<?>) context.getGenericTypes().get(0);
for (Object dbObject : dbList) { for (Object dbObject : dbList) {
MapperContext<Object, Object> newContext = new MapperContext<Object, Object>(dbObject, expectedListElementType, null); MapperContext<Object, Object> newContext = new MapperContext<Object, Object>(dbObject, expectedListElementType, null);
@@ -23,7 +23,7 @@ public class BasicDBListToSetMapper implements Mapper<BasicDBList, Set> {
public Set convertObject(MapperContext<BasicDBList, Set> context) { public Set convertObject(MapperContext<BasicDBList, Set> context) {
BasicDBList dbList = context.getObjectToConvert(); BasicDBList dbList = context.getObjectToConvert();
Set<Object> appObjects = new HashSet<Object>(); Set<Object> appObjects = new HashSet<Object>();
Class<?> expectedListElementType = context.getGenericTypes().get(0); Class<?> expectedListElementType = (Class<?>) context.getGenericTypes().get(0);
for (Object dbObject : dbList) { for (Object dbObject : dbList) {
MapperContext<Object, Object> newContext = new MapperContext<Object, Object>(dbObject, expectedListElementType, null); MapperContext<Object, Object> newContext = new MapperContext<Object, Object>(dbObject, expectedListElementType, null);
@@ -14,6 +14,7 @@ import org.keycloak.util.reflections.Types;
import java.lang.reflect.ParameterizedType; import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
/** /**
@@ -87,10 +88,7 @@ public class BasicDBObjectMapper<S> implements Mapper<BasicDBObject, S> {
ParameterizedType parameterized = (ParameterizedType) type; ParameterizedType parameterized = (ParameterizedType) type;
Type[] genericTypeArguments = parameterized.getActualTypeArguments(); Type[] genericTypeArguments = parameterized.getActualTypeArguments();
List<Class<?>> genericTypes = new ArrayList<Class<?>>(); List<Type> genericTypes = Arrays.asList(genericTypeArguments);
for (Type genericType : genericTypeArguments) {
genericTypes.add((Class<?>)genericType);
}
Class<?> expectedReturnType = (Class<?>)parameterized.getRawType(); Class<?> expectedReturnType = (Class<?>)parameterized.getRawType();
context = new MapperContext<Object, Object>(valueFromDB, expectedReturnType, genericTypes); context = new MapperContext<Object, Object>(valueFromDB, expectedReturnType, genericTypes);
@@ -3,31 +3,44 @@ package org.keycloak.connections.mongo.impl.types;
import com.mongodb.BasicDBObject; import com.mongodb.BasicDBObject;
import org.keycloak.connections.mongo.api.types.Mapper; import org.keycloak.connections.mongo.api.types.Mapper;
import org.keycloak.connections.mongo.api.types.MapperContext; import org.keycloak.connections.mongo.api.types.MapperContext;
import org.keycloak.connections.mongo.api.types.MapperRegistry;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
/** /**
* For now, there is support just for convert to Map<String, simpleType>
* *
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a> * @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
*/ */
public class BasicDBObjectToMapMapper implements Mapper<BasicDBObject, Map> { public class BasicDBObjectToMapMapper implements Mapper<BasicDBObject, Map> {
private final MapperRegistry mapperRegistry;
public BasicDBObjectToMapMapper(MapperRegistry mapperRegistry) {
this.mapperRegistry = mapperRegistry;
}
@Override @Override
public Map convertObject(MapperContext<BasicDBObject, Map> context) { public Map convertObject(MapperContext<BasicDBObject, Map> context) {
BasicDBObject dbObjectToConvert = context.getObjectToConvert(); BasicDBObject dbObjectToConvert = context.getObjectToConvert();
Type expectedElementValueType = context.getGenericTypes().get(1);
HashMap<String, Object> result = new HashMap<String, Object>(); HashMap<String, Object> result = new HashMap<String, Object>();
for (Map.Entry<String, Object> entry : dbObjectToConvert.entrySet()) { for (Map.Entry<String, Object> entry : dbObjectToConvert.entrySet()) {
String key = entry.getKey(); String key = entry.getKey();
Object value = entry.getValue(); Object dbValue = entry.getValue();
// Workaround as manually inserted numbers into mongo may be treated as "Double" // Workaround as manually inserted numbers into mongo may be treated as "Double"
if (value instanceof Double && context.getGenericTypes().get(1) == Integer.class) { if (dbValue instanceof Double && expectedElementValueType == Integer.class) {
value = ((Double)value).intValue(); dbValue = ((Double)dbValue).intValue();
} }
MapperContext<Object, Object> newContext = getMapperContext(dbValue, expectedElementValueType);
Object value = mapperRegistry.convertDBObjectToApplicationObject(newContext);
if (key.contains(MapMapper.DOT_PLACEHOLDER)) { if (key.contains(MapMapper.DOT_PLACEHOLDER)) {
key = key.replaceAll(MapMapper.DOT_PLACEHOLDER, "."); key = key.replaceAll(MapMapper.DOT_PLACEHOLDER, ".");
} }
@@ -46,4 +59,19 @@ public class BasicDBObjectToMapMapper implements Mapper<BasicDBObject, Map> {
public Class<Map> getExpectedReturnType() { public Class<Map> getExpectedReturnType() {
return Map.class; return Map.class;
} }
private MapperContext<Object, Object> getMapperContext(Object dbValue, Type expectedElementValueType) {
if (expectedElementValueType instanceof Class) {
Class<?> clazz = (Class<?>) expectedElementValueType;
return new MapperContext<>(dbValue, clazz, null);
} else if (expectedElementValueType instanceof ParameterizedType) {
ParameterizedType parameterized = (ParameterizedType) expectedElementValueType;
Class<?> expectedClazz = (Class<?>) parameterized.getRawType();
Type[] generics = parameterized.getActualTypeArguments();
return new MapperContext<>(dbValue, expectedClazz, Arrays.asList(generics));
} else {
throw new IllegalArgumentException("Unexpected type: '" + expectedElementValueType + "' for converting " + dbValue);
}
}
} }
@@ -3,6 +3,7 @@ package org.keycloak.connections.mongo.impl.types;
import com.mongodb.BasicDBObject; import com.mongodb.BasicDBObject;
import org.keycloak.connections.mongo.api.types.Mapper; import org.keycloak.connections.mongo.api.types.Mapper;
import org.keycloak.connections.mongo.api.types.MapperContext; import org.keycloak.connections.mongo.api.types.MapperContext;
import org.keycloak.connections.mongo.api.types.MapperRegistry;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
@@ -17,30 +18,34 @@ public class MapMapper<T extends Map> implements Mapper<T, BasicDBObject> {
// Just some dummy way of encoding . character as it's not allowed by mongo in key fields // Just some dummy way of encoding . character as it's not allowed by mongo in key fields
static final String DOT_PLACEHOLDER = "###"; static final String DOT_PLACEHOLDER = "###";
private final MapperRegistry mapperRegistry;
private final Class<T> mapType; private final Class<T> mapType;
public MapMapper(Class<T> mapType) { public MapMapper(MapperRegistry mapperRegistry, Class<T> mapType) {
this.mapperRegistry = mapperRegistry;
this.mapType = mapType; this.mapType = mapType;
} }
@Override @Override
public BasicDBObject convertObject(MapperContext<T, BasicDBObject> context) { public BasicDBObject convertObject(MapperContext<T, BasicDBObject> context) {
T mapToConvert = context.getObjectToConvert(); T mapToConvert = context.getObjectToConvert();
return convertMap(mapToConvert); return convertMap(mapToConvert, mapperRegistry);
} }
public static BasicDBObject convertMap(Map mapToConvert) { public static BasicDBObject convertMap(Map mapToConvert, MapperRegistry mapperRegistry) {
BasicDBObject dbObject = new BasicDBObject(); BasicDBObject dbObject = new BasicDBObject();
Set<Map.Entry> entries = mapToConvert.entrySet(); Set<Map.Entry> entries = mapToConvert.entrySet();
for (Map.Entry entry : entries) { for (Map.Entry entry : entries) {
String key = (String)entry.getKey(); String key = (String)entry.getKey();
Object value = entry.getValue(); Object value = entry.getValue();
Object dbValue = mapperRegistry==null ? entry.getValue() : mapperRegistry.convertApplicationObjectToDBObject(value, Object.class);
if (key.contains(".")) { if (key.contains(".")) {
key = key.replaceAll("\\.", DOT_PLACEHOLDER); key = key.replaceAll("\\.", DOT_PLACEHOLDER);
} }
dbObject.put(key, value); dbObject.put(key, dbValue);
} }
return dbObject; return dbObject;
} }
+3 -3
View File
@@ -3,7 +3,7 @@
<parent> <parent>
<artifactId>keycloak-parent</artifactId> <artifactId>keycloak-parent</artifactId>
<groupId>org.keycloak</groupId> <groupId>org.keycloak</groupId>
<version>1.3.1.Final</version> <version>1.5.1.Final</version>
</parent> </parent>
<name>Connections Parent</name> <name>Connections Parent</name>
<description/> <description/>
@@ -16,9 +16,9 @@
<module>jpa</module> <module>jpa</module>
<module>jpa-liquibase</module> <module>jpa-liquibase</module>
<module>infinispan</module> <module>infinispan</module>
<module>mongo</module> <!--<module>mongo</module>-->
<module>file</module> <module>file</module>
<module>mongo-update</module> <!--<module>mongo-update</module>-->
<module>http-client</module> <module>http-client</module>
</modules> </modules>
+1 -1
View File
@@ -4,7 +4,7 @@
<parent> <parent>
<artifactId>keycloak-parent</artifactId> <artifactId>keycloak-parent</artifactId>
<groupId>org.keycloak</groupId> <groupId>org.keycloak</groupId>
<version>1.3.1.Final</version> <version>1.5.1.Final</version>
<relativePath>../pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
+1 -1
View File
@@ -4,7 +4,7 @@
<parent> <parent>
<artifactId>keycloak-parent</artifactId> <artifactId>keycloak-parent</artifactId>
<groupId>org.keycloak</groupId> <groupId>org.keycloak</groupId>
<version>1.3.1.Final</version> <version>1.5.1.Final</version>
<relativePath>../pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
@@ -16,7 +16,7 @@ public class AbstractOAuthClient {
private final AtomicLong counter = new AtomicLong(); private final AtomicLong counter = new AtomicLong();
protected String clientId; protected String clientId;
protected Map<String, String> credentials; protected Map<String, Object> credentials;
protected String authUrl; protected String authUrl;
protected String tokenUrl; protected String tokenUrl;
protected RelativeUrlsUsed relativeUrlsUsed; protected RelativeUrlsUsed relativeUrlsUsed;
@@ -37,11 +37,11 @@ public class AbstractOAuthClient {
this.clientId = clientId; this.clientId = clientId;
} }
public Map<String, String> getCredentials() { public Map<String, Object> getCredentials() {
return credentials; return credentials;
} }
public void setCredentials(Map<String, String> credentials) { public void setCredentials(Map<String, Object> credentials) {
this.credentials = credentials; this.credentials = credentials;
} }
@@ -29,6 +29,15 @@ public interface OAuth2Constants {
String PASSWORD = "password"; String PASSWORD = "password";
String CLIENT_CREDENTIALS = "client_credentials";
// https://tools.ietf.org/html/draft-ietf-oauth-assertions-01#page-5
String CLIENT_ASSERTION_TYPE = "client_assertion_type";
String CLIENT_ASSERTION = "client_assertion";
// https://tools.ietf.org/html/draft-jones-oauth-jwt-bearer-03#section-2.2
String CLIENT_ASSERTION_TYPE_JWT = "urn:ietf:params:oauth:client-assertion-type:jwt-bearer";
} }
@@ -1,6 +1,7 @@
package org.keycloak; package org.keycloak;
import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.annotate.JsonProperty;
import org.keycloak.util.Time;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
@@ -28,6 +29,9 @@ public class Version {
VERSION = props.getProperty("version"); VERSION = props.getProperty("version");
BUILD_TIME = props.getProperty("build-time"); BUILD_TIME = props.getProperty("build-time");
RESOURCES_VERSION = VERSION.toLowerCase(); RESOURCES_VERSION = VERSION.toLowerCase();
if (RESOURCES_VERSION.endsWith("-snapshot")) {
RESOURCES_VERSION = RESOURCES_VERSION.replace("-snapshot", "-" + Time.currentTime());
}
} catch (IOException e) { } catch (IOException e) {
VERSION=UNKNOWN; VERSION=UNKNOWN;
BUILD_TIME=UNKNOWN; BUILD_TIME=UNKNOWN;
@@ -0,0 +1,19 @@
package org.keycloak.constants;
/**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
*/
public interface ServiceAccountConstants {
String CLIENT_AUTH = "client_auth";
String SERVICE_ACCOUNT_USER_PREFIX = "service-account-";
String CLIENT_ID_PROTOCOL_MAPPER = "Client ID";
String CLIENT_HOST_PROTOCOL_MAPPER = "Client Host";
String CLIENT_ADDRESS_PROTOCOL_MAPPER = "Client IP Address";
String CLIENT_ID = "clientId";
String CLIENT_HOST = "clientHost";
String CLIENT_ADDRESS = "clientAddress";
}
@@ -14,8 +14,6 @@ public enum SslRequired {
EXTERNAL, EXTERNAL,
NONE; NONE;
private static final long serialVersionUID = 1L;
public boolean isRequired(ClientConnection connection) { public boolean isRequired(ClientConnection connection) {
return isRequired(connection.getRemoteAddr()); return isRequired(connection.getRemoteAddr());
} }
@@ -1,5 +1,6 @@
package org.keycloak.jose.jws; package org.keycloak.jose.jws;
import org.codehaus.jackson.annotate.JsonIgnoreProperties;
import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.annotate.JsonProperty;
import org.codehaus.jackson.map.ObjectMapper; import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.annotate.JsonSerialize; import org.codehaus.jackson.map.annotate.JsonSerialize;
@@ -11,6 +12,7 @@ import java.io.Serializable;
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a> * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $ * @version $Revision: 1 $
*/ */
@JsonIgnoreProperties(ignoreUnknown = true)
public class JWSHeader implements Serializable { public class JWSHeader implements Serializable {
@JsonProperty("alg") @JsonProperty("alg")
private Algorithm algorithm; private Algorithm algorithm;
@@ -63,7 +63,7 @@ public class HMACProvider implements SignatureProvider {
public static boolean verify(JWSInput input, SecretKey key) { public static boolean verify(JWSInput input, SecretKey key) {
try { try {
byte[] signature = sign(input.getContent(), input.getHeader().getAlgorithm(), key); byte[] signature = sign(input.getEncodedSignatureInput().getBytes("UTF-8"), input.getHeader().getAlgorithm(), key);
String x = Base64Url.encode(signature); String x = Base64Url.encode(signature);
return x.equals(input.getEncodedSignature()); return x.equals(input.getEncodedSignature());
} catch (Exception e) { } catch (Exception e) {
@@ -0,0 +1,30 @@
package org.keycloak.json;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.JsonParser;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.map.DeserializationContext;
import org.codehaus.jackson.map.JsonDeserializer;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
public class StringOrArrayDeserializer extends JsonDeserializer<Object> {
@Override
public Object deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
JsonNode jsonNode = jsonParser.readValueAsTree();
if (jsonNode.isArray()) {
ArrayList<String> a = new ArrayList<>(1);
Iterator<JsonNode> itr = jsonNode.iterator();
while (itr.hasNext()) {
a.add(itr.next().getTextValue());
}
return a.toArray(new String[a.size()]);
} else {
return new String[] { jsonNode.getTextValue() };
}
}
}
@@ -0,0 +1,25 @@
package org.keycloak.json;
import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.map.JsonSerializer;
import org.codehaus.jackson.map.SerializerProvider;
import java.io.IOException;
public class StringOrArraySerializer extends JsonSerializer<Object> {
@Override
public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
String[] array = (String[]) o;
if (array == null) {
jsonGenerator.writeNull();
} else if (array.length == 1) {
jsonGenerator.writeString(array[0]);
} else {
jsonGenerator.writeStartArray();
for (String s : array) {
jsonGenerator.writeString(s);
}
jsonGenerator.writeEndArray();
}
}
}
@@ -163,11 +163,6 @@ public class AccessToken extends IDToken {
return (AccessToken) super.issuer(issuer); return (AccessToken) super.issuer(issuer);
} }
@Override
public AccessToken audience(String audience) {
return (AccessToken) super.audience(audience);
}
@Override @Override
public AccessToken subject(String subject) { public AccessToken subject(String subject) {
return (AccessToken) super.subject(subject); return (AccessToken) super.subject(subject);
@@ -1,12 +1,6 @@
package org.keycloak.representations; package org.keycloak.representations;
import org.codehaus.jackson.annotate.JsonAnyGetter;
import org.codehaus.jackson.annotate.JsonAnySetter;
import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.annotate.JsonProperty;
import org.codehaus.jackson.annotate.JsonUnwrapped;
import java.util.HashMap;
import java.util.Map;
/** /**
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a> * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
@@ -4,6 +4,10 @@ import org.codehaus.jackson.annotate.JsonAnyGetter;
import org.codehaus.jackson.annotate.JsonAnySetter; import org.codehaus.jackson.annotate.JsonAnySetter;
import org.codehaus.jackson.annotate.JsonIgnore; import org.codehaus.jackson.annotate.JsonIgnore;
import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.annotate.JsonProperty;
import org.codehaus.jackson.map.annotate.JsonDeserialize;
import org.codehaus.jackson.map.annotate.JsonSerialize;
import org.keycloak.json.StringOrArrayDeserializer;
import org.keycloak.json.StringOrArraySerializer;
import org.keycloak.util.Time; import org.keycloak.util.Time;
import java.io.Serializable; import java.io.Serializable;
@@ -26,14 +30,16 @@ public class JsonWebToken implements Serializable {
@JsonProperty("iss") @JsonProperty("iss")
protected String issuer; protected String issuer;
@JsonProperty("aud") @JsonProperty("aud")
protected String audience; @JsonSerialize(using = StringOrArraySerializer.class)
@JsonDeserialize(using = StringOrArrayDeserializer.class)
protected String[] audience;
@JsonProperty("sub") @JsonProperty("sub")
protected String subject; protected String subject;
@JsonProperty("typ") @JsonProperty("typ")
protected String type; protected String type;
@JsonProperty("azp") @JsonProperty("azp")
public String issuedFor; public String issuedFor;
protected Map<String, Object> otherClaims = new HashMap<String, Object>(); protected Map<String, Object> otherClaims = new HashMap<>();
public String getId() { public String getId() {
return id; return id;
@@ -72,7 +78,6 @@ public class JsonWebToken implements Serializable {
@JsonIgnore @JsonIgnore
public boolean isNotBefore() { public boolean isNotBefore() {
return Time.currentTime() >= notBefore; return Time.currentTime() >= notBefore;
} }
/** /**
@@ -113,12 +118,21 @@ public class JsonWebToken implements Serializable {
return this; return this;
} }
@JsonIgnore
public String getAudience() { public String[] getAudience() {
return audience; return audience;
} }
public JsonWebToken audience(String audience) { public boolean hasAudience(String audience) {
for (String a : this.audience) {
if (a.equals(audience)) {
return true;
}
}
return false;
}
public JsonWebToken audience(String... audience) {
this.audience = audience; this.audience = audience;
return this; return this;
} }
@@ -39,7 +39,7 @@ public class BaseAdapterConfig extends BaseRealmConfig {
@JsonProperty("public-client") @JsonProperty("public-client")
protected boolean publicClient; protected boolean publicClient;
@JsonProperty("credentials") @JsonProperty("credentials")
protected Map<String, String> credentials = new HashMap<String, String>(); protected Map<String, Object> credentials = new HashMap<>();
public boolean isUseResourceRoleMappings() { public boolean isUseResourceRoleMappings() {
@@ -114,11 +114,11 @@ public class BaseAdapterConfig extends BaseRealmConfig {
this.enableBasicAuth = enableBasicAuth; this.enableBasicAuth = enableBasicAuth;
} }
public Map<String, String> getCredentials() { public Map<String, Object> getCredentials() {
return credentials; return credentials;
} }
public void setCredentials(Map<String, String> credentials) { public void setCredentials(Map<String, Object> credentials) {
this.credentials = credentials; this.credentials = credentials;
} }
@@ -0,0 +1,87 @@
package org.keycloak.representations.idm;
import java.io.Serializable;
import java.util.Comparator;
/**
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $
*/
public class AuthenticationExecutionRepresentation implements Serializable {
private static final long serialVersionUID = 1L;
private String authenticatorConfig;
private String authenticator;
private String flowAlias;
private boolean autheticatorFlow;
private String requirement;
private boolean userSetupAllowed;
private int priority;
public String getAuthenticatorConfig() {
return authenticatorConfig;
}
public void setAuthenticatorConfig(String authenticatorConfig) {
this.authenticatorConfig = authenticatorConfig;
}
public String getAuthenticator() {
return authenticator;
}
public void setAuthenticator(String authenticator) {
this.authenticator = authenticator;
}
public String getRequirement() {
return requirement;
}
public void setRequirement(String requirement) {
this.requirement = requirement;
}
public int getPriority() {
return priority;
}
public void setPriority(int priority) {
this.priority = priority;
}
public boolean isUserSetupAllowed() {
return userSetupAllowed;
}
public void setUserSetupAllowed(boolean userSetupAllowed) {
this.userSetupAllowed = userSetupAllowed;
}
/**
* If this execution is a flow, this is the flowId pointing to an AuthenticationFlowModel
*
* @return
*/
public String getFlowAlias() {
return flowAlias;
}
public void setFlowAlias(String flowId) {
this.flowAlias = flowId;
}
/**
* Is the referenced authenticator a flow?
*
* @return
*/
public boolean isAutheticatorFlow() {
return autheticatorFlow;
}
public void setAutheticatorFlow(boolean autheticatorFlow) {
this.autheticatorFlow = autheticatorFlow;
}
}
@@ -0,0 +1,67 @@
package org.keycloak.representations.idm;
import java.io.Serializable;
import java.util.List;
/**
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $
*/
public class AuthenticationFlowRepresentation implements Serializable {
private static final long serialVersionUID = 1L;
private String alias;
private String description;
private String providerId;
private boolean topLevel;
private boolean builtIn;
protected List<AuthenticationExecutionRepresentation> authenticationExecutions;
public String getAlias() {
return alias;
}
public void setAlias(String alias) {
this.alias = alias;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getProviderId() {
return providerId;
}
public void setProviderId(String providerId) {
this.providerId = providerId;
}
public boolean isTopLevel() {
return topLevel;
}
public void setTopLevel(boolean topLevel) {
this.topLevel = topLevel;
}
public boolean isBuiltIn() {
return builtIn;
}
public void setBuiltIn(boolean builtIn) {
this.builtIn = builtIn;
}
public List<AuthenticationExecutionRepresentation> getAuthenticationExecutions() {
return authenticationExecutions;
}
public void setAuthenticationExecutions(List<AuthenticationExecutionRepresentation> authenticationExecutions) {
this.authenticationExecutions = authenticationExecutions;
}
}
@@ -0,0 +1,35 @@
package org.keycloak.representations.idm;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
/**
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $
*/
public class AuthenticatorConfigRepresentation implements Serializable {
private static final long serialVersionUID = 1L;
private String alias;
private Map<String, String> config = new HashMap<String, String>();
public String getAlias() {
return alias;
}
public void setAlias(String alias) {
this.alias = alias;
}
public Map<String, String> getConfig() {
return config;
}
public void setConfig(Map<String, String> config) {
this.config = config;
}
}
@@ -0,0 +1,30 @@
package org.keycloak.representations.idm;
/**
* PEM values of key and certificate
*
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
*/
public class CertificateRepresentation {
protected String privateKey;
protected String certificate;
public String getPrivateKey() {
return privateKey;
}
public void setPrivateKey(String privateKey) {
this.privateKey = privateKey;
}
public String getCertificate() {
return certificate;
}
public void setCertificate(String certificate) {
this.certificate = certificate;
}
}
@@ -15,6 +15,7 @@ public class ClientRepresentation {
protected String baseUrl; protected String baseUrl;
protected Boolean surrogateAuthRequired; protected Boolean surrogateAuthRequired;
protected Boolean enabled; protected Boolean enabled;
protected String clientAuthenticatorType;
protected String secret; protected String secret;
protected String[] defaultRoles; protected String[] defaultRoles;
protected List<String> redirectUris; protected List<String> redirectUris;
@@ -22,6 +23,7 @@ public class ClientRepresentation {
protected Integer notBefore; protected Integer notBefore;
protected Boolean bearerOnly; protected Boolean bearerOnly;
protected Boolean consentRequired; protected Boolean consentRequired;
protected Boolean serviceAccountsEnabled;
protected Boolean directGrantsOnly; protected Boolean directGrantsOnly;
protected Boolean publicClient; protected Boolean publicClient;
protected Boolean frontchannelLogout; protected Boolean frontchannelLogout;
@@ -88,6 +90,14 @@ public class ClientRepresentation {
this.baseUrl = baseUrl; this.baseUrl = baseUrl;
} }
public String getClientAuthenticatorType() {
return clientAuthenticatorType;
}
public void setClientAuthenticatorType(String clientAuthenticatorType) {
this.clientAuthenticatorType = clientAuthenticatorType;
}
public String getSecret() { public String getSecret() {
return secret; return secret;
} }
@@ -144,6 +154,14 @@ public class ClientRepresentation {
this.consentRequired = consentRequired; this.consentRequired = consentRequired;
} }
public Boolean isServiceAccountsEnabled() {
return serviceAccountsEnabled;
}
public void setServiceAccountsEnabled(Boolean serviceAccountsEnabled) {
this.serviceAccountsEnabled = serviceAccountsEnabled;
}
public Boolean isDirectGrantsOnly() { public Boolean isDirectGrantsOnly() {
return directGrantsOnly; return directGrantsOnly;
} }
@@ -9,6 +9,7 @@ public class CredentialRepresentation {
public static final String PASSWORD = "password"; public static final String PASSWORD = "password";
public static final String PASSWORD_TOKEN = "password-token"; public static final String PASSWORD_TOKEN = "password-token";
public static final String TOTP = "totp"; public static final String TOTP = "totp";
public static final String HOTP = "hotp";
public static final String CLIENT_CERT = "cert"; public static final String CLIENT_CERT = "cert";
public static final String KERBEROS = "kerberos"; public static final String KERBEROS = "kerberos";
@@ -22,6 +23,11 @@ public class CredentialRepresentation {
protected String hashedSaltedValue; protected String hashedSaltedValue;
protected String salt; protected String salt;
protected Integer hashIterations; protected Integer hashIterations;
protected Integer counter;
private String algorithm;
private Integer digits;
private Integer period;
// only used when updating a credential. Might set required action // only used when updating a credential. Might set required action
protected boolean temporary; protected boolean temporary;
@@ -80,4 +86,36 @@ public class CredentialRepresentation {
public void setTemporary(boolean temporary) { public void setTemporary(boolean temporary) {
this.temporary = temporary; this.temporary = temporary;
} }
public Integer getCounter() {
return counter;
}
public void setCounter(Integer counter) {
this.counter = counter;
}
public String getAlgorithm() {
return algorithm;
}
public void setAlgorithm(String algorithm) {
this.algorithm = algorithm;
}
public Integer getDigits() {
return digits;
}
public void setDigits(Integer digits) {
this.digits = digits;
}
public Integer getPeriod() {
return period;
}
public void setPeriod(Integer period) {
this.period = period;
}
} }
@@ -46,8 +46,16 @@ public class RealmRepresentation {
protected String codeSecret; protected String codeSecret;
protected RolesRepresentation roles; protected RolesRepresentation roles;
protected List<String> defaultRoles; protected List<String> defaultRoles;
@Deprecated
protected Set<String> requiredCredentials; protected Set<String> requiredCredentials;
protected String passwordPolicy; protected String passwordPolicy;
protected String otpPolicyType;
protected String otpPolicyAlgorithm;
protected Integer otpPolicyInitialCounter;
protected Integer otpPolicyDigits;
protected Integer otpPolicyLookAheadWindow;
protected Integer otpPolicyPeriod;
protected List<UserRepresentation> users; protected List<UserRepresentation> users;
protected List<ScopeMappingRepresentation> scopeMappings; protected List<ScopeMappingRepresentation> scopeMappings;
protected Map<String, List<ScopeMappingRepresentation>> clientScopeMappings; protected Map<String, List<ScopeMappingRepresentation>> clientScopeMappings;
@@ -76,6 +84,14 @@ public class RealmRepresentation {
protected Boolean internationalizationEnabled; protected Boolean internationalizationEnabled;
protected Set<String> supportedLocales; protected Set<String> supportedLocales;
protected String defaultLocale; protected String defaultLocale;
protected List<AuthenticationFlowRepresentation> authenticationFlows;
protected List<AuthenticatorConfigRepresentation> authenticatorConfig;
protected List<RequiredActionProviderRepresentation> requiredActions;
protected String browserFlow;
protected String registrationFlow;
protected String directGrantFlow;
protected String resetCredentialsFlow;
protected String clientAuthenticationFlow;
@Deprecated @Deprecated
protected Boolean social; protected Boolean social;
@@ -185,11 +201,11 @@ public class RealmRepresentation {
scopeMappings.add(mapping); scopeMappings.add(mapping);
return mapping; return mapping;
} }
@Deprecated
public Set<String> getRequiredCredentials() { public Set<String> getRequiredCredentials() {
return requiredCredentials; return requiredCredentials;
} }
@Deprecated
public void setRequiredCredentials(Set<String> requiredCredentials) { public void setRequiredCredentials(Set<String> requiredCredentials) {
this.requiredCredentials = requiredCredentials; this.requiredCredentials = requiredCredentials;
} }
@@ -626,5 +642,115 @@ public class RealmRepresentation {
identityProviderMappers.add(rep); identityProviderMappers.add(rep);
} }
public List<AuthenticationFlowRepresentation> getAuthenticationFlows() {
return authenticationFlows;
}
public void setAuthenticationFlows(List<AuthenticationFlowRepresentation> authenticationFlows) {
this.authenticationFlows = authenticationFlows;
}
public List<AuthenticatorConfigRepresentation> getAuthenticatorConfig() {
return authenticatorConfig;
}
public void setAuthenticatorConfig(List<AuthenticatorConfigRepresentation> authenticatorConfig) {
this.authenticatorConfig = authenticatorConfig;
}
public List<RequiredActionProviderRepresentation> getRequiredActions() {
return requiredActions;
}
public void setRequiredActions(List<RequiredActionProviderRepresentation> requiredActions) {
this.requiredActions = requiredActions;
}
public String getOtpPolicyType() {
return otpPolicyType;
}
public void setOtpPolicyType(String otpPolicyType) {
this.otpPolicyType = otpPolicyType;
}
public String getOtpPolicyAlgorithm() {
return otpPolicyAlgorithm;
}
public void setOtpPolicyAlgorithm(String otpPolicyAlgorithm) {
this.otpPolicyAlgorithm = otpPolicyAlgorithm;
}
public Integer getOtpPolicyInitialCounter() {
return otpPolicyInitialCounter;
}
public void setOtpPolicyInitialCounter(Integer otpPolicyInitialCounter) {
this.otpPolicyInitialCounter = otpPolicyInitialCounter;
}
public Integer getOtpPolicyDigits() {
return otpPolicyDigits;
}
public void setOtpPolicyDigits(Integer otpPolicyDigits) {
this.otpPolicyDigits = otpPolicyDigits;
}
public Integer getOtpPolicyLookAheadWindow() {
return otpPolicyLookAheadWindow;
}
public void setOtpPolicyLookAheadWindow(Integer otpPolicyLookAheadWindow) {
this.otpPolicyLookAheadWindow = otpPolicyLookAheadWindow;
}
public Integer getOtpPolicyPeriod() {
return otpPolicyPeriod;
}
public void setOtpPolicyPeriod(Integer otpPolicyPeriod) {
this.otpPolicyPeriod = otpPolicyPeriod;
}
public String getBrowserFlow() {
return browserFlow;
}
public void setBrowserFlow(String browserFlow) {
this.browserFlow = browserFlow;
}
public String getRegistrationFlow() {
return registrationFlow;
}
public void setRegistrationFlow(String registrationFlow) {
this.registrationFlow = registrationFlow;
}
public String getDirectGrantFlow() {
return directGrantFlow;
}
public void setDirectGrantFlow(String directGrantFlow) {
this.directGrantFlow = directGrantFlow;
}
public String getResetCredentialsFlow() {
return resetCredentialsFlow;
}
public void setResetCredentialsFlow(String resetCredentialsFlow) {
this.resetCredentialsFlow = resetCredentialsFlow;
}
public String getClientAuthenticationFlow() {
return clientAuthenticationFlow;
}
public void setClientAuthenticationFlow(String clientAuthenticationFlow) {
this.clientAuthenticationFlow = clientAuthenticationFlow;
}
} }
@@ -0,0 +1,73 @@
package org.keycloak.representations.idm;
import java.util.HashMap;
import java.util.Map;
/**
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $
*/
public class RequiredActionProviderRepresentation {
private String alias;
private String name;
private String providerId;
private boolean enabled;
private boolean defaultAction;
private Map<String, String> config = new HashMap<String, String>();
public String getAlias() {
return alias;
}
public void setAlias(String alias) {
this.alias = alias;
}
/**
* Used for display purposes. Probably should clean this code up and make alias and name the same, but
* the old code references an Enum and the admin console creates a "friendly" name for each enum.
*
* @return
*/
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isEnabled() {
return enabled;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
public boolean isDefaultAction() {
return defaultAction;
}
public void setDefaultAction(boolean defaultAction) {
this.defaultAction = defaultAction;
}
public String getProviderId() {
return providerId;
}
public void setProviderId(String providerId) {
this.providerId = providerId;
}
public Map<String, String> getConfig() {
return config;
}
public void setConfig(Map<String, String> config) {
this.config = config;
}
}
@@ -1,10 +1,14 @@
package org.keycloak.representations.idm; package org.keycloak.representations.idm;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import org.codehaus.jackson.annotate.JsonIgnore;
import org.keycloak.util.MultivaluedHashMap;
/** /**
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a> * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $ * @version $Revision: 1 $
@@ -13,6 +17,7 @@ public class UserRepresentation {
protected String self; // link protected String self; // link
protected String id; protected String id;
protected Long createdTimestamp;
protected String username; protected String username;
protected boolean enabled; protected boolean enabled;
protected boolean totp; protected boolean totp;
@@ -21,7 +26,10 @@ public class UserRepresentation {
protected String lastName; protected String lastName;
protected String email; protected String email;
protected String federationLink; protected String federationLink;
protected Map<String, String> attributes; protected String serviceAccountClientId; // For rep, it points to clientId (not DB ID)
// Currently there is Map<String, List<String>> but for backwards compatibility, we also need to support Map<String, String>
protected Map<String, Object> attributes;
protected List<CredentialRepresentation> credentials; protected List<CredentialRepresentation> credentials;
protected List<String> requiredActions; protected List<String> requiredActions;
protected List<FederatedIdentityRepresentation> federatedIdentities; protected List<FederatedIdentityRepresentation> federatedIdentities;
@@ -50,6 +58,14 @@ public class UserRepresentation {
this.id = id; this.id = id;
} }
public Long getCreatedTimestamp() {
return createdTimestamp;
}
public void setCreatedTimestamp(Long createdTimestamp) {
this.createdTimestamp = createdTimestamp;
}
public String getFirstName() { public String getFirstName() {
return firstName; return firstName;
} }
@@ -106,17 +122,23 @@ public class UserRepresentation {
this.emailVerified = emailVerified; this.emailVerified = emailVerified;
} }
public Map<String, String> getAttributes() { public Map<String, Object> getAttributes() {
return attributes; return attributes;
} }
public void setAttributes(Map<String, String> attributes) { // This method can be removed once we can remove backwards compatibility with Keycloak 1.3 (then getAttributes() can be changed to return Map<String, List<String>> )
@JsonIgnore
public Map<String, List<String>> getAttributesAsListValues() {
return (Map) attributes;
}
public void setAttributes(Map<String, Object> attributes) {
this.attributes = attributes; this.attributes = attributes;
} }
public UserRepresentation attribute(String name, String value) { public UserRepresentation singleAttribute(String name, String value) {
if (this.attributes == null) attributes = new HashMap<String, String>(); if (this.attributes == null) attributes = new HashMap<>();
attributes.put(name, value); attributes.put(name, Arrays.asList(value));
return this; return this;
} }
@@ -128,15 +150,6 @@ public class UserRepresentation {
this.credentials = credentials; this.credentials = credentials;
} }
public UserRepresentation credential(String type, String value) {
if (this.credentials == null) credentials = new ArrayList<CredentialRepresentation>();
CredentialRepresentation cred = new CredentialRepresentation();
cred.setType(type);
cred.setValue(value);
credentials.add(cred);
return this;
}
public List<String> getRequiredActions() { public List<String> getRequiredActions() {
return requiredActions; return requiredActions;
} }
@@ -197,4 +210,12 @@ public class UserRepresentation {
public void setFederationLink(String federationLink) { public void setFederationLink(String federationLink) {
this.federationLink = federationLink; this.federationLink = federationLink;
} }
public String getServiceAccountClientId() {
return serviceAccountClientId;
}
public void setServiceAccountClientId(String serviceAccountClientId) {
this.serviceAccountClientId = serviceAccountClientId;
}
} }
@@ -11,7 +11,8 @@ import java.util.Set;
*/ */
public class UserSessionRepresentation { public class UserSessionRepresentation {
private String id; private String id;
private String user; private String username;
private String userId;
private String ipAddress; private String ipAddress;
private long start; private long start;
private long lastAccess; private long lastAccess;
@@ -25,12 +26,20 @@ public class UserSessionRepresentation {
this.id = id; this.id = id;
} }
public String getUser() { public String getUsername() {
return user; return username;
} }
public void setUser(String user) { public void setUsername(String username) {
this.user = user; this.username = username;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
} }
public String getIpAddress() { public String getIpAddress() {
@@ -3,7 +3,6 @@ package org.keycloak.util;
import org.codehaus.jackson.map.ObjectMapper; import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializationConfig; import org.codehaus.jackson.map.SerializationConfig;
import org.codehaus.jackson.map.annotate.JsonSerialize; import org.codehaus.jackson.map.annotate.JsonSerialize;
import org.codehaus.jackson.type.TypeReference;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
@@ -4,6 +4,7 @@ import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.InputStream; import java.io.InputStream;
import java.security.KeyStore; import java.security.KeyStore;
import java.security.PrivateKey;
import org.keycloak.constants.GenericConstants; import org.keycloak.constants.GenericConstants;
@@ -12,6 +13,14 @@ import org.keycloak.constants.GenericConstants;
* @version $Revision: 1 $ * @version $Revision: 1 $
*/ */
public class KeystoreUtil { public class KeystoreUtil {
static {
BouncyIntegration.init();
}
public enum KeystoreFormat {
JKS,
PKCS12
}
public static KeyStore loadKeyStore(String filename, String password) throws Exception { public static KeyStore loadKeyStore(String filename, String password) throws Exception {
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
@@ -22,4 +31,26 @@ public class KeystoreUtil {
trustStream.close(); trustStream.close();
return trustStore; return trustStore;
} }
public static PrivateKey loadPrivateKeyFromKeystore(String keystoreFile, String storePassword, String keyPassword, String keyAlias, KeystoreFormat format) {
InputStream stream = FindFile.findFile(keystoreFile);
try {
KeyStore keyStore = null;
if (format == KeystoreFormat.JKS) {
keyStore = KeyStore.getInstance(format.toString());
} else {
keyStore = KeyStore.getInstance(format.toString(), "BC");
}
keyStore.load(stream, storePassword.toCharArray());
PrivateKey key = (PrivateKey) keyStore.getKey(keyAlias, keyPassword.toCharArray());
if (key == null) {
throw new RuntimeException("Couldn't load key with alias '" + keyAlias + "' from keystore");
}
return key;
} catch (Exception e) {
throw new RuntimeException("Failed to load private key: " + e.getMessage(), e);
}
}
} }
@@ -96,6 +96,7 @@ public class RSAVerifierTest {
String encoded = new JWSBuilder() String encoded = new JWSBuilder()
.jsonContent(token) .jsonContent(token)
.rsa256(idpPair.getPrivate()); .rsa256(idpPair.getPrivate());
System.out.print("encoded size: " + encoded.length());
AccessToken token = verifySkeletonKeyToken(encoded); AccessToken token = verifySkeletonKeyToken(encoded);
Assert.assertTrue(token.getResourceAccess("service").getRoles().contains("admin")); Assert.assertTrue(token.getResourceAccess("service").getRoles().contains("admin"));
Assert.assertEquals("CN=Client", token.getSubject()); Assert.assertEquals("CN=Client", token.getSubject());
+30
View File
@@ -0,0 +1,30 @@
package org.keycloak.jose;
import org.junit.Assert;
import org.junit.Test;
import org.keycloak.jose.jws.JWSBuilder;
import org.keycloak.jose.jws.JWSInput;
import org.keycloak.jose.jws.crypto.HMACProvider;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.UUID;
/**
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $
*/
public class HmacTest {
@Test
public void testHmacSignatures() throws Exception {
SecretKey secret = new SecretKeySpec(UUID.randomUUID().toString().getBytes(), "HmacSHA256");
String encoded = new JWSBuilder().content("12345678901234567890".getBytes())
.hmac256(secret);
System.out.println("length: " + encoded.length());
JWSInput input = new JWSInput(encoded);
Assert.assertTrue(HMACProvider.verify(input, secret));
}
}
@@ -0,0 +1,44 @@
package org.keycloak.jose;
import org.junit.Test;
import org.keycloak.representations.JsonWebToken;
import org.keycloak.util.JsonSerialization;
import java.io.IOException;
import static org.junit.Assert.*;
/**
* Created by st on 20.08.15.
*/
public class JsonWebTokenTest {
@Test
public void testAudSingle() throws IOException {
String single = "{ \"aud\": \"test\" }";
JsonWebToken s = JsonSerialization.readValue(single, JsonWebToken.class);
assertArrayEquals(new String[] { "test" }, s.getAudience());
}
@Test
public void testAudArray() throws IOException {
String single = "{ \"aud\": [\"test\"] }";
JsonWebToken s = JsonSerialization.readValue(single, JsonWebToken.class);
assertArrayEquals(new String[]{"test"}, s.getAudience());
}
@Test
public void test() throws IOException {
JsonWebToken jsonWebToken = new JsonWebToken();
jsonWebToken.audience("test");
assertTrue(JsonSerialization.writeValueAsPrettyString(jsonWebToken).contains("\"aud\" : \"test\""));
}
@Test
public void testArray() throws IOException {
JsonWebToken jsonWebToken = new JsonWebToken();
jsonWebToken.audience("test", "test2");
assertTrue(JsonSerialization.writeValueAsPrettyString(jsonWebToken).contains("\"aud\" : [ \"test\", \"test2\" ]"));
}
}
+1 -1
View File
@@ -4,7 +4,7 @@
<parent> <parent>
<artifactId>keycloak-parent</artifactId> <artifactId>keycloak-parent</artifactId>
<groupId>org.keycloak</groupId> <groupId>org.keycloak</groupId>
<version>1.3.1.Final</version> <version>1.5.1.Final</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
+3 -15
View File
@@ -4,7 +4,7 @@
<parent> <parent>
<artifactId>keycloak-parent</artifactId> <artifactId>keycloak-parent</artifactId>
<groupId>org.keycloak</groupId> <groupId>org.keycloak</groupId>
<version>1.3.1.Final</version> <version>1.5.1.Final</version>
<relativePath>../../pom.xml</relativePath> <relativePath>../../pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
@@ -40,18 +40,6 @@
<groupId>org.keycloak</groupId> <groupId>org.keycloak</groupId>
<artifactId>keycloak-model-file</artifactId> <artifactId>keycloak-model-file</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-model-sessions-mem</artifactId>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-model-sessions-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-model-sessions-mongo</artifactId>
</dependency>
<dependency> <dependency>
<groupId>org.keycloak</groupId> <groupId>org.keycloak</groupId>
<artifactId>keycloak-model-sessions-infinispan</artifactId> <artifactId>keycloak-model-sessions-infinispan</artifactId>
@@ -132,7 +120,7 @@
</dependency> </dependency>
<!-- mongo --> <!-- mongo -->
<dependency> <!-- <dependency>
<groupId>org.keycloak</groupId> <groupId>org.keycloak</groupId>
<artifactId>keycloak-connections-mongo</artifactId> <artifactId>keycloak-connections-mongo</artifactId>
</dependency> </dependency>
@@ -151,7 +139,7 @@
<dependency> <dependency>
<groupId>org.mongodb</groupId> <groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId> <artifactId>mongo-java-driver</artifactId>
</dependency> </dependency> -->
<!-- export/import --> <!-- export/import -->
<dependency> <dependency>
+1 -1
View File
@@ -4,7 +4,7 @@
<parent> <parent>
<artifactId>keycloak-parent</artifactId> <artifactId>keycloak-parent</artifactId>
<groupId>org.keycloak</groupId> <groupId>org.keycloak</groupId>
<version>1.3.1.Final</version> <version>1.5.1.Final</version>
<relativePath>../../pom.xml</relativePath> <relativePath>../../pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
@@ -27,4 +27,10 @@
<outputDirectory>modules</outputDirectory> <outputDirectory>modules</outputDirectory>
</fileSet> </fileSet>
</fileSets> </fileSets>
<files>
<file>
<source>../../shared-cli/adapter-install.cli</source>
<outputDirectory>bin</outputDirectory>
</file>
</files>
</assembly> </assembly>
@@ -4,7 +4,7 @@
<parent> <parent>
<artifactId>keycloak-parent</artifactId> <artifactId>keycloak-parent</artifactId>
<groupId>org.keycloak</groupId> <groupId>org.keycloak</groupId>
<version>1.3.1.Final</version> <version>1.5.1.Final</version>
<relativePath>../../../../pom.xml</relativePath> <relativePath>../../../../pom.xml</relativePath>
</parent> </parent>
@@ -8,7 +8,7 @@
<parent> <parent>
<artifactId>keycloak-parent</artifactId> <artifactId>keycloak-parent</artifactId>
<groupId>org.keycloak</groupId> <groupId>org.keycloak</groupId>
<version>1.3.1.Final</version> <version>1.5.1.Final</version>
<relativePath>../../../../pom.xml</relativePath> <relativePath>../../../../pom.xml</relativePath>
</parent> </parent>
@@ -23,9 +23,6 @@
--> -->
<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-adapter-subsystem"> <module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-adapter-subsystem">
<properties>
<property name="keycloak-version" value="${project.version}"/>
</properties>
<resources> <resources>
<resource-root path="."/> <resource-root path="."/>
@@ -27,4 +27,10 @@
<outputDirectory>modules/system/layers/base</outputDirectory> <outputDirectory>modules/system/layers/base</outputDirectory>
</fileSet> </fileSet>
</fileSets> </fileSets>
<files>
<file>
<source>../../shared-cli/adapter-install.cli</source>
<outputDirectory>bin</outputDirectory>
</file>
</files>
</assembly> </assembly>
@@ -4,7 +4,7 @@
<parent> <parent>
<artifactId>keycloak-parent</artifactId> <artifactId>keycloak-parent</artifactId>
<groupId>org.keycloak</groupId> <groupId>org.keycloak</groupId>
<version>1.3.1.Final</version> <version>1.5.1.Final</version>
<relativePath>../../../../pom.xml</relativePath> <relativePath>../../../../pom.xml</relativePath>
</parent> </parent>
@@ -3,7 +3,7 @@
<parent> <parent>
<artifactId>keycloak-parent</artifactId> <artifactId>keycloak-parent</artifactId>
<groupId>org.keycloak</groupId> <groupId>org.keycloak</groupId>
<version>1.3.1.Final</version> <version>1.5.1.Final</version>
<relativePath>../../../pom.xml</relativePath> <relativePath>../../../pom.xml</relativePath>
</parent> </parent>
<name>Keycloak AS7 / JBoss EAP 6 Adapter Distros</name> <name>Keycloak AS7 / JBoss EAP 6 Adapter Distros</name>
@@ -4,7 +4,7 @@
<parent> <parent>
<artifactId>keycloak-parent</artifactId> <artifactId>keycloak-parent</artifactId>
<groupId>org.keycloak</groupId> <groupId>org.keycloak</groupId>
<version>1.3.1.Final</version> <version>1.5.1.Final</version>
<relativePath>../../../pom.xml</relativePath> <relativePath>../../../pom.xml</relativePath>
</parent> </parent>
@@ -4,7 +4,7 @@
<parent> <parent>
<artifactId>keycloak-parent</artifactId> <artifactId>keycloak-parent</artifactId>
<groupId>org.keycloak</groupId> <groupId>org.keycloak</groupId>
<version>1.3.1.Final</version> <version>1.5.1.Final</version>
<relativePath>../../../pom.xml</relativePath> <relativePath>../../../pom.xml</relativePath>
</parent> </parent>
@@ -4,7 +4,7 @@
<parent> <parent>
<artifactId>keycloak-parent</artifactId> <artifactId>keycloak-parent</artifactId>
<groupId>org.keycloak</groupId> <groupId>org.keycloak</groupId>
<version>1.3.1.Final</version> <version>1.5.1.Final</version>
<relativePath>../../../pom.xml</relativePath> <relativePath>../../../pom.xml</relativePath>
</parent> </parent>
+1 -1
View File
@@ -4,7 +4,7 @@
<parent> <parent>
<artifactId>keycloak-parent</artifactId> <artifactId>keycloak-parent</artifactId>
<groupId>org.keycloak</groupId> <groupId>org.keycloak</groupId>
<version>1.3.1.Final</version> <version>1.5.1.Final</version>
<relativePath>../../../pom.xml</relativePath> <relativePath>../../../pom.xml</relativePath>
</parent> </parent>
Loaded 100 of 2567 files, more files were not shown because too many files have changed in this diff. Show more