Compare commits

..
392 Commits
Author SHA1 Message Date
Bill Burke 965c44a43d Merge pull request #594 from patriot1burke/master
beta-4 fixes
2014-08-05 20:58:28 -04:00
Bill Burke 905061e2b7 bump version 2014-08-05 20:52:50 -04:00
Bill Burke 45df3087f2 fix aerogear 2014-08-05 20:45:31 -04:00
Bill Burke f9f53a3355 docbook change 2014-08-05 20:31:20 -04:00
Bill Burke ab08ac8ad4 Merge remote-tracking branch 'upstream/master' 2014-08-05 20:29:02 -04:00
Bill Burke 12c9475bfc general settings split up 2014-08-05 20:26:29 -04:00
Bill Burke a0d7fc12db all claims for app 2014-08-05 19:46:55 -04:00
Bill Burke 5b5fea347a improved oauth login/grant 2014-08-05 19:36:19 -04:00
Bill Burke d049007412 delete app/realm/client buttons 2014-08-05 17:34:23 -04:00
Bill Burke cc14a3b288 rename token settings menu to timeout settings 2014-08-05 17:28:20 -04:00
Bill Burke bcd3eeda49 product-portal example logout fix 2014-08-05 17:20:01 -04:00
Bill Burke 992b365eab choose realm 2014-08-05 17:18:11 -04:00
Bill Burke 3882cc4aa8 fix console session logoutAll 2014-08-05 17:16:46 -04:00
Bill Burke 38bd79ab88 filter out unconfigured example files 2014-08-05 16:53:10 -04:00
Bill Burke 790fd1d94d fix cors example 2014-08-05 16:45:21 -04:00
Bill Burke 19e1ddff1d logging 2014-08-05 16:04:13 -04:00
Marek Posolda 0bbc26bd0b Merge pull request #593 from mposolda/db-fix
Updating documentation for export/import
2014-08-05 20:30:05 +02:00
mposolda 1f3db436d8 Updating documentation for export/import 2014-08-05 20:28:53 +02:00
Marek Posolda 7ac663bd5f Merge pull request #592 from mposolda/db-fix
Fixing mssql
2014-08-05 18:30:55 +02:00
mposolda 53fbceb49a Fixing mssql 2014-08-05 18:25:54 +02:00
Marek Posolda 1159dc091d Merge pull request #591 from mposolda/db-fix
Fixing oracle
2014-08-05 15:55:53 +02:00
mposolda 38c0b4ad65 Fixing oracle 2014-08-05 15:45:28 +02:00
Marek Posolda f4f563d570 Merge pull request #590 from mposolda/master
Fix typo in UserFederationProvider
2014-08-05 15:07:42 +02:00
mposolda 550ba16a09 Fix deleting users on mongo 2014-08-05 14:36:53 +02:00
mposolda 0289f5dff9 Fix typo in UserFederationProvider 2014-08-05 13:31:35 +02:00
Bill Burke ea0ceeb65d Merge pull request #589 from patriot1burke/master
app full scope
2014-08-04 16:26:51 -04:00
Bill Burke 3746bf28a1 migration doc 2014-08-04 16:26:13 -04:00
Bill Burke a497c69758 relative logout 2014-08-04 16:17:35 -04:00
Bill Burke 731d75c756 app full scope by default 2014-08-04 16:04:10 -04:00
Marek Posolda 982ba5ab90 Merge pull request #588 from mposolda/master
Adding property to configure if userAccountControls should be updated in...
2014-08-04 21:35:02 +02:00
mposolda c2e2a46025 Adding property to configure if userAccountControls should be updated in Active Directory after user set his password 2014-08-04 21:32:56 +02:00
Bill Burke 8430fb0ed3 Merge pull request #587 from patriot1burke/master
docs
2014-08-04 12:28:32 -04:00
Bill Burke 9a829a38b1 edti migration docs 2014-08-04 12:28:07 -04:00
Bill Burke 04ec750157 federation docs 2014-08-04 12:25:11 -04:00
Marek Posolda 3655db2a30 Merge pull request #586 from mposolda/master
Ensure that displayName is persisted. Add 'user' to ActiveDirectory clas...
2014-08-04 16:43:41 +02:00
mposolda 5edb84ccfb Ensure that displayName is persisted. Add 'user' to ActiveDirectory classes 2014-08-04 16:42:48 +02:00
Marek Posolda 95e2da9c9e Merge pull request #585 from mposolda/master
Upgrade to latest picketlink. Fix LDAP configuration according to that
2014-08-04 14:58:29 +02:00
mposolda 6cb1eb41cf Update mongo entities 2014-08-04 14:51:08 +02:00
mposolda 46a0caf2e0 Upgrade to latest picketlink. Fix LDAP configuration according to that 2014-08-04 13:58:52 +02:00
Bill Burke d96b660686 Merge pull request #584 from patriot1burke/master
fix fed example
2014-08-03 11:04:21 -04:00
Bill Burke ae66b1b88e fix view all users 2014-08-03 11:03:39 -04:00
Bill Burke 60a564dcfd fix fed example 2014-08-03 10:53:37 -04:00
Bill Burke 69656d2775 Merge pull request #583 from patriot1burke/master
delete auth prov example
2014-08-02 22:19:59 -04:00
Bill Burke 24415f2186 delete auth prov example 2014-08-02 22:19:19 -04:00
Bill Burke 0ae3eafe10 Merge pull request #582 from patriot1burke/master
fed example
2014-08-02 22:18:47 -04:00
Bill Burke 6cf708f6e1 fed exampe 2014-08-02 22:18:17 -04:00
Bill Burke f5a626006c Merge pull request #581 from patriot1burke/master
remove AuthenticationProvider/Link
2014-08-01 18:06:18 -04:00
Bill Burke 101a72cd65 remove AuthenticationProvider/Link 2014-08-01 18:03:48 -04:00
Bill Burke 312429cb88 Merge pull request #580 from patriot1burke/master
add HttpServletRequest.authenticate() test
2014-08-01 15:50:40 -04:00
Bill Burke c9851f1c05 add HttpServletRequest.authenticate() test 2014-08-01 15:50:20 -04:00
Bill Burke 73b7fe6169 Merge pull request #579 from patriot1burke/master
remote token validation
2014-08-01 13:34:11 -04:00
Bill Burke d1c5c55a61 switch to a get 2014-08-01 13:28:17 -04:00
Bill Burke bdc31d9459 Merge remote-tracking branch 'upstream/master' 2014-08-01 13:18:46 -04:00
Bill Burke f08c42a37e token validation 2014-08-01 13:18:32 -04:00
Stian Thorgersen 8fbd39934f Merge pull request #578 from stianst/master
Allow private addresses to use http with ssl-required=external
2014-08-01 15:06:15 +01:00
Stian Thorgersen c460630cf8 Allow private addresses to use http with ssl-required=external 2014-08-01 15:05:45 +01:00
Stian Thorgersen 335bc87ad8 Merge pull request #577 from stianst/master
KEYCLOAK-591 Require SSL for all external requests by default
2014-08-01 13:53:04 +01:00
Stian Thorgersen 6cbeeb1b1a KEYCLOAK-591 Require SSL for all external requests by default 2014-08-01 13:52:04 +01:00
Bill Burke 47c9f1439d Merge pull request #576 from patriot1burke/master
maxResults
2014-07-31 17:41:58 -04:00
Bill Burke 64589bc807 maxResults 2014-07-31 17:41:38 -04:00
Bill Burke 2eae9c17a4 Merge pull request #575 from patriot1burke/master
ldap edit mode
2014-07-31 17:31:46 -04:00
Bill Burke 9f6c206078 ldap edit mode 2014-07-31 17:28:48 -04:00
Bill Burke 2460eecd75 Merge pull request #574 from patriot1burke/master
federation registeration
2014-07-31 16:02:52 -04:00
Bill Burke a084695978 support registration ldap 2014-07-31 15:22:20 -04:00
Bill Burke 705da88daa fix cache setup 2014-07-31 14:05:23 -04:00
Bill Burke ce85a42ecf Merge pull request #573 from patriot1burke/master
fed ui
2014-07-31 13:14:45 -04:00
Bill Burke 2990b75faa Merge remote-tracking branch 'upstream/master' 2014-07-31 13:14:05 -04:00
Bill Burke 94c06f3f5d fed ui 2014-07-31 13:13:48 -04:00
Bill Burke b72a7db6fe federation display name 2014-07-31 10:51:04 -04:00
Bill Burke b960f18f4e Merge pull request #571 from patriot1burke/master
federation ui
2014-07-30 22:53:10 -04:00
Bill Burke d0dc75c06f federation ui 2014-07-30 22:52:39 -04:00
Bill Burke 13a5eccaf8 Merge pull request #570 from patriot1burke/master
federation refactor
2014-07-30 16:06:57 -04:00
Bill Burke 898195e1da Merge remote-tracking branch 'upstream/master' 2014-07-30 16:02:09 -04:00
Bill Burke 8ea0d19d2f federation refactor 2014-07-30 16:01:54 -04:00
Stian Thorgersen 465318b352 Merge pull request #569 from stianst/master
KEYCLOAK-545 Stop NPE if no client_secret is specified or bearer-only ap...
2014-07-30 16:42:26 +01:00
Stian Thorgersen fa01d53f9e KEYCLOAK-545 Stop NPE if no client_secret is specified or bearer-only application is used for grants/access 2014-07-30 16:41:07 +01:00
Stian Thorgersen ba8fe1ddaf Merge pull request #568 from stianst/master
KEYCLOAK-562 Cache theme instances
2014-07-30 16:10:41 +01:00
Stian Thorgersen 50bc53d673 KEYCLOAK-562 Cache theme instances 2014-07-30 16:06:08 +01:00
Stian Thorgersen d682701232 Merge pull request #567 from stianst/master
Added login_hint to keycloak.js
2014-07-30 14:27:40 +01:00
Stian Thorgersen 544883ca9f Added login_hint to keycloak.js 2014-07-30 14:27:14 +01:00
Stian Thorgersen 54a7761e15 Merge pull request #566 from stianst/master
Updated admin endpoints and console to use oauth client name/clientId
2014-07-30 14:18:45 +01:00
Stian Thorgersen ed51b4e1ea Deleted old hybrid model 2014-07-30 14:13:16 +01:00
Stian Thorgersen fcc4781e3a Updated admin endpoints and console to use oauth client name/clientId to retrieve a oauth client 2014-07-30 14:10:25 +01:00
Stian Thorgersen 24b5bd6862 Merge pull request #565 from stianst/master
KEYCLOAK-581 Add login_hint query param to login
2014-07-30 13:48:17 +01:00
Stian Thorgersen 614c718304 KEYCLOAK-581 Add login_hint query param to login 2014-07-30 13:43:46 +01:00
Stian Thorgersen e2ce33a86a Merge pull request #564 from stianst/master
Admin REST client
2014-07-30 13:26:04 +01:00
Rodrigo Sasaki e338f1af15 Admin REST client 2014-07-30 13:24:44 +01:00
Stian Thorgersen eefc5ed1d7 Merge pull request #563 from lfryc/KEYCLOAK-588
KEYCLOAK-588 retrieve window.location.origin in InternetExplorer-compatible way
2014-07-30 12:15:16 +01:00
Lukas Fryc 7694b130e6 KEYCLOAK-588 retrieve window.location.origin in InternetExplorer-compatible way 2014-07-30 12:47:52 +02:00
Stian Thorgersen 32ad7271f3 Merge pull request #562 from stianst/access-code
Fix test
2014-07-30 09:47:35 +01:00
Stian Thorgersen 2b012ff238 Fix test 2014-07-30 09:47:16 +01:00
Stian Thorgersen 1bd219ed40 Merge pull request #561 from stianst/access-code
Added ClientSessionModel to UserSessionProvider
2014-07-29 16:18:28 +01:00
Stian Thorgersen 02a59812e6 Added ClientSessionModel to UserSessionProvider 2014-07-29 16:10:41 +01:00
Stian Thorgersen 7f4849e165 Merge pull request #560 from stianst/demo-non-localhost
KEYCLOAK-579 Use relative urls in examples
2014-07-28 10:48:30 +01:00
Stian Thorgersen 628c7dd92a KEYCLOAK-579 Use relative urls in examples 2014-07-28 10:41:21 +01:00
Bill Burke bace16bac6 Merge pull request #559 from patriot1burke/master
federation iteration 2
2014-07-25 21:06:04 -04:00
Bill Burke 3bb0842eae federation iteration 2 2014-07-25 21:05:45 -04:00
Bill Burke a6b38397ea Merge pull request #558 from patriot1burke/master
rename classes
2014-07-25 10:45:22 -04:00
Bill Burke c63467c79f Merge remote-tracking branch 'upstream/master' 2014-07-25 10:41:06 -04:00
Bill Burke b1cd37814a rename 2014-07-25 10:40:46 -04:00
Stian Thorgersen 07d10ee583 Merge pull request #557 from stianst/access-code
KEYCLOAK-570 Add use-resource-role-mappings to WildFly installation
2014-07-25 11:54:10 +01:00
Stian Thorgersen 614bee3061 KEYCLOAK-570 Add use-resource-role-mappings to WildFly installation 2014-07-25 11:53:10 +01:00
Bill Burke 81dfea4052 Merge pull request #556 from patriot1burke/master
rename FederationProvider to UserFederationProvider
2014-07-24 11:11:45 -04:00
Bill Burke 1b14444eba rename FederationProvider to UserFederationProvider 2014-07-24 11:11:21 -04:00
Stian Thorgersen 245d83adce Merge pull request #555 from stianst/master
Added test to make sure password is verified with totp login
2014-07-24 14:15:34 +01:00
Stian Thorgersen b5835fc232 Added test to make sure password is verified with totp login 2014-07-24 14:15:02 +01:00
Stian Thorgersen 8a54f133ba Merge pull request #554 from stianst/master
Moved audit/tests and model/tests to testsuite
2014-07-24 13:50:15 +01:00
Stian Thorgersen 511cc483cb Moved audit/tests and model/tests to testsuite 2014-07-24 13:49:15 +01:00
Bill Burke 6e18a16f78 Merge pull request #553 from patriot1burke/master
Federation iteration 1
2014-07-23 17:08:00 -04:00
Bill Burke 43d08f2d05 federation iteration 1 complete 2014-07-23 17:05:49 -04:00
Bill Burke 171e9b1ce9 Merge remote-tracking branch 'upstream/master' 2014-07-23 15:10:48 -04:00
Bill Burke eec582e704 merge 2014-07-23 15:10:36 -04:00
Stian Thorgersen 4b05feb6d6 Merge pull request #552 from stianst/access-code
Updates to AccessCode
2014-07-23 16:01:38 +01:00
Stian Thorgersen d6f5bf6cde Moved rememberMe, usernameUsed fields from AccessCode to UserSessions. Change AccessCode to have a single action instead of a list of required actions, also used action for codes that needs user to grant permissions first. Finally removed expiration time on access code and use timestamp directly 2014-07-23 15:58:09 +01:00
Bill Burke f1d72d0b6d fed 2 2014-07-23 10:42:18 -04:00
Bill Burke 148d494905 federation iteration 2014-07-23 10:21:25 -04:00
Stian Thorgersen 38b575d91b Merge pull request #550 from mposolda/master
README update
2014-07-23 13:31:41 +01:00
mposolda baf99a2280 README update 2014-07-23 14:01:24 +02:00
Stian Thorgersen 1d80b87bcc Merge pull request #549 from stianst/master
Fix parent relative-path in server-all and server-min
2014-07-22 16:55:51 +01:00
Stian Thorgersen 84754c47d3 Fix parent relative-path in server-all and server-min 2014-07-22 16:55:33 +01:00
Stian Thorgersen 64b8a990f9 Merge pull request #548 from stianst/master
KEYCLOAK-567 Added server-dep-min and server-dep-all poms
2014-07-22 14:11:05 +01:00
Stian Thorgersen 0580c2223b KEYCLOAK-567 Added server-dep-min and server-dep-all poms 2014-07-22 14:10:38 +01:00
Stian Thorgersen 824aed773b Merge pull request #547 from stianst/jpa-fix
Add jboss.as.jpa.managed=false to persistence.xml
2014-07-22 10:08:24 +01:00
Stian Thorgersen 9164e69d49 Add jboss.as.jpa.managed=false to persistence.xml 2014-07-22 09:40:52 +01:00
Stian Thorgersen 670dc39d4f Merge pull request #546 from stianst/access-code
Remove access token from access code, and create token when code is exchanged for token
2014-07-22 09:37:54 +01:00
Stian Thorgersen b196d0dded Remove access token from access code, and create token when code is exchanged for token 2014-07-22 09:37:21 +01:00
Stian Thorgersen bfd62b0807 Merge pull request #545 from mposolda/master
Fix MySQL and PostgreSQL. More DB schema refactoring
2014-07-22 09:10:52 +01:00
mposolda 3514d5cd78 Fix MySQL and PostgreSQL testsuite (was caused by uncommited transaction) 2014-07-22 07:53:05 +02:00
mposolda b3b46339a4 More DB schema refactoring. Ensure that all columns are named in code 2014-07-22 07:53:05 +02:00
Stian Thorgersen 9ff4947abd Merge pull request #540 from mposolda/master
Update DB profiles. Fix ExportImportTest to not clash with other tests
2014-07-21 14:18:04 +01:00
Stian Thorgersen 469eb77486 Merge pull request #544 from stianst/master
KEYCLOAK-569 Check application roles for scope
2014-07-21 13:52:43 +01:00
Stian Thorgersen 213b685b43 KEYCLOAK-569 Check application roles for scope 2014-07-21 13:50:27 +01:00
mposolda 42df327104 Update DB profiles. Fix ExportImportTest to not clash with other tests 2014-07-21 08:48:25 +02:00
Bill Burke d2b42e3843 Merge pull request #542 from patriot1burke/master
remove hack comment
2014-07-18 12:07:51 -04:00
Bill Burke b999c1e5b1 remove hack comment 2014-07-18 12:07:30 -04:00
Bill Burke 2ecf696a12 Merge pull request #541 from patriot1burke/master
cache config and cache docs
2014-07-18 11:48:54 -04:00
Bill Burke 063a63445a keycloak-json fix 2014-07-18 11:45:47 -04:00
Bill Burke b84bdcf464 cache config 2014-07-18 11:43:44 -04:00
Bill Burke f275ecf6d5 cache settings 2014-07-18 11:30:10 -04:00
Stian Thorgersen b241920802 Merge pull request #539 from stianst/master
Updated aerogear-ups integration readme
2014-07-18 12:14:53 +01:00
Stian Thorgersen dcd1406a27 Updated aerogear-ups integration readme 2014-07-18 12:14:29 +01:00
Stian Thorgersen d2d408e223 Merge pull request #538 from stianst/master
Added profile for building AeroGear project-integrations for WildFly
2014-07-18 12:10:27 +01:00
Stian Thorgersen 9699d8aa82 Added profile for building AeroGear project-integrations for WildFly 2014-07-18 12:09:54 +01:00
Stian Thorgersen 6d8d9107c6 Merge pull request #537 from stianst/master
Configure db in keycloak-server.json
2014-07-18 11:35:33 +01:00
Stian Thorgersen fb8483dc56 Added support to specify dialect for JPA 2014-07-18 11:32:09 +01:00
Stian Thorgersen 85621bdd9f KEYCLOAK-566 Configure db in keycloak-server.json instead of persistence.xml 2014-07-18 11:21:52 +01:00
Bill Burke 573f7fc1fb Merge pull request #535 from mposolda/master
Export/import improvements and fixes
2014-07-17 16:34:39 -04:00
Bill Burke 14af840c3a Merge pull request #536 from patriot1burke/master
realmId and rroleId
2014-07-17 16:34:27 -04:00
Bill Burke aa2d1bcc93 db schema 2014-07-17 16:32:36 -04:00
Bill Burke 20cde9cd00 realmId and roleId used in User and user relationships 2014-07-17 15:41:02 -04:00
mposolda 3dff4afe83 Export/import improvements and fixes 2014-07-17 21:31:33 +02:00
Bill Burke 3edce7f580 named queries and roleId in RoleMapping 2014-07-17 15:20:56 -04:00
Stian Thorgersen 35d601d795 Merge pull request #534 from stianst/master
Removed long ids and replaced with composite ids
2014-07-17 11:57:56 +01:00
Stian Thorgersen f00957ec3a Commented out test in ExportImportTest that breakes the other tests 2014-07-17 11:57:33 +01:00
Stian Thorgersen 46c04561ff Removed long ids and replaced with composite ids 2014-07-17 11:16:15 +01:00
Stian Thorgersen 9abe357754 Merge pull request #533 from mposolda/master
Added method UserProvider.getUsersCount(). Refactor export-import witth users pagination
2014-07-17 10:50:52 +01:00
mposolda 3c99350247 Fix testsuite to use mongo for realms,users and audit when keycloak.realm.provider=mongo 2014-07-17 11:05:51 +02:00
mposolda b041f2a857 Added method UserProvider.getUsersCount(). Refactor export-import with users pagination available 2014-07-17 10:15:13 +02:00
mposolda 0a15f873af Minor improvement in AbstractKeycloakRule.stopServer() 2014-07-17 10:14:35 +02:00
Bill Burke 08b0aebe03 Merge pull request #532 from patriot1burke/master
jpa schema changes
2014-07-16 19:38:01 -04:00
Bill Burke a323fe7992 schema changes 2014-07-16 19:34:54 -04:00
Bill Burke 1963e94e33 use long for primary key 2014-07-16 17:11:59 -04:00
Bill Burke 7437af0131 Merge pull request #530 from ssilvert/master
Rename and update XSD to comply with WildFly testsuite.
2014-07-16 15:31:56 -04:00
Bill Burke 60a1fc3020 Merge pull request #531 from mposolda/master
Fix ExportImportTest on som envs like windows
2014-07-16 15:31:45 -04:00
mposolda 8714193c97 Fix ExportImportTest to pass on windows 2014-07-16 20:00:18 +02:00
Stan Silvert a61733cf47 Rename and update XSD to comply with WildFly testsuite. 2014-07-16 13:44:57 -04:00
mposolda 1aff8af336 Enable ExportImportTest 2014-07-16 19:43:47 +02:00
Stian Thorgersen c21be01e97 Merge pull request #529 from stianst/master
KEYCLOAK-435 Added pagination support for users
2014-07-16 18:04:36 +01:00
Stian Thorgersen 72d240a57e KEYCLOAK-435 Added pagination support for users 2014-07-16 17:54:11 +01:00
Stian Thorgersen 83769b3d52 Merge pull request #528 from stianst/master
Fix redirect-loop in keycloak.js
2014-07-16 17:39:15 +01:00
Stian Thorgersen 1a5c2365a1 Fix redirect-loop in keycloak.js 2014-07-16 17:38:56 +01:00
Bill Burke 87e40f1820 Merge pull request #527 from patriot1burke/master
move credential validation to UserProvider
2014-07-16 12:08:50 -04:00
Bill Burke 8fbfba907b Merge remote-tracking branch 'upstream/master' 2014-07-16 12:05:31 -04:00
Bill Burke f342a8c7a3 move credential validation to UserProvider 2014-07-16 12:05:15 -04:00
Stian Thorgersen 866715b752 Merge pull request #526 from stianst/master
KEYCLOAK-559 If session iframe is enabled, check this before doing a log...
2014-07-16 10:48:14 +01:00
Stian Thorgersen e0ec121012 KEYCLOAK-559 If session iframe is enabled, check this before doing a login if onload is check-sso 2014-07-16 10:47:42 +01:00
Stian Thorgersen 63ff5736a2 Merge pull request #525 from stianst/mysql-5.1-fix
KEYCLOAK-554 Fix for MySQL 5.1. Set length of keys to 36 for uuid's or 200 for others
2014-07-16 09:52:18 +01:00
Stian Thorgersen 3451778f48 KEYCLOAK-554 Fix for MySQL 5.1. Set length of keys to 36 for uuid's or 200 for others 2014-07-16 09:51:31 +01:00
Bill Burke e4b3007ce2 Merge pull request #524 from patriot1burke/master
user provider split
2014-07-15 15:45:30 -04:00
Bill Burke a5593469ae rename ModelProvider->RealmProvider 2014-07-15 15:44:50 -04:00
Bill Burke 484a4c1454 user provider refactor complete 2014-07-15 15:25:06 -04:00
Bill Burke 09a336c708 Merge pull request #523 from mposolda/master
Export/import into representations
2014-07-15 12:14:11 -04:00
Bill Burke 4ac5fb08e3 Merge remote-tracking branch 'upstream/master' 2014-07-15 12:11:24 -04:00
Bill Burke ff86bdc35f userprovider split 2014-07-15 12:11:12 -04:00
mposolda 726ce08700 More cleanup and removed export-import-impl module 2014-07-15 16:43:55 +02:00
mposolda c14840a4c0 More cleanup after rebase 2014-07-15 14:44:38 +02:00
mposolda 24a492ffe0 Export/import refactoring to use same representation as admin endpoints 2014-07-15 05:35:24 +02:00
Stian Thorgersen c4ff4e030a Merge pull request #522 from stianst/master
Removed dep on model-jpa from export-import-impl
2014-07-14 17:31:55 +01:00
Stian Thorgersen 7244944879 Removed dep on model-jpa from export-import-impl 2014-07-14 17:31:35 +01:00
Stian Thorgersen 1f2db2c049 Merge pull request #521 from stianst/master
KEYCLOAK-556 NullPointerException in project-integrations example on Wil...
2014-07-14 17:08:30 +01:00
Stian Thorgersen d6e8b1ba2c KEYCLOAK-556 NullPointerException in project-integrations example on WildFly 2014-07-14 17:07:38 +01:00
Stian Thorgersen 7f0a3eebfb Merge pull request #520 from stianst/master
Fix project-integrations/aerogear-ups
2014-07-14 16:38:58 +01:00
Stian Thorgersen 5d0345c922 Fix project-integrations/aerogear-ups 2014-07-14 16:38:39 +01:00
Bill Burke 99a041158c Merge pull request #519 from patriot1burke/master
TM.enlistAfterCompletion
2014-07-14 11:37:16 -04:00
Bill Burke 8f7efd5b67 merge 2014-07-14 11:36:57 -04:00
Bill Burke d2c27daa16 changes 2014-07-14 11:31:25 -04:00
Stian Thorgersen 2d2041db5e Merge pull request #518 from stianst/master
Lazy load connections
2014-07-14 16:29:12 +01:00
Stian Thorgersen e3f260c57f Added lazy load to connection factories, to make sure we only try to connect to JPA/Mongo when used 2014-07-14 16:28:47 +01:00
Stian Thorgersen 8113c3f05e Fixes to persistence.xml 2014-07-14 15:55:26 +01:00
Stian Thorgersen e3bc15a4d9 Merge pull request #516 from stianst/master
KEYCLOAK-512 Pagination support for sessions
2014-07-14 12:01:56 +01:00
Stian Thorgersen 3f68180ee7 KEYCLOAK-512 Pagination support for sessions 2014-07-14 11:49:59 +01:00
Stian Thorgersen 6bb6dc0aaf Merge pull request #515 from stianst/master
Added JPA connection provider and added basic support for multiple trans...
2014-07-14 10:13:45 +01:00
Stian Thorgersen d625fb014c Added JPA connection provider and added basic support for multiple transactions to KeycloakSession 2014-07-14 10:10:03 +01:00
Bill Burke 8cc7676335 Merge pull request #514 from patriot1burke/master
enlist
2014-07-11 19:44:01 -04:00
Bill Burke 626cecba95 enlist 2014-07-11 19:43:37 -04:00
Bill Burke 65348cd5e7 Merge pull request #513 from patriot1burke/master
session transaction
2014-07-11 19:38:58 -04:00
Bill Burke 5f5316fbdc session transaction 2014-07-11 19:29:11 -04:00
Stian Thorgersen 011bac7a1e Merge pull request #512 from stianst/master
Started UserSessionProvider
2014-07-10 16:50:54 +01:00
Stian Thorgersen 86671a2354 Started UserSessionProvider 2014-07-10 16:48:25 +01:00
Bill Burke 8fac39fffa Merge pull request #511 from ssilvert/master
In WF subsystem, make WildFly dependencies provided scope.
2014-07-09 13:54:24 -04:00
Stan Silvert a2710e01da In WF subsystem, make WildFly dependencies provided scope. 2014-07-09 13:33:14 -04:00
Stian Thorgersen 38abcd4a90 Merge pull request #510 from stianst/master
Revert JPA model provider
2014-07-09 15:44:05 +01:00
Stian Thorgersen 62dd6fbc6b Revert JPA model provider 2014-07-09 15:40:23 +01:00
Stian Thorgersen 75c56a2a7c Merge pull request #509 from stianst/master
KEYCLOAK-553 Added minified keycloak.js
2014-07-09 14:17:36 +01:00
Stian Thorgersen 7491b1c369 KEYCLOAK-553 Added minified keycloak.js 2014-07-09 12:23:29 +01:00
Stian Thorgersen a3cca7424a Merge pull request #508 from stianst/master
Removed JPA model provider
2014-07-08 15:36:33 +01:00
Stian Thorgersen 387aed6269 Removed JPA model provider 2014-07-08 15:35:49 +01:00
Stian Thorgersen 20bf888d73 Merge pull request #507 from stianst/master
Removed model methods from KeycloakSession
2014-07-08 15:28:13 +01:00
Stian Thorgersen ad6d52cb0f Removed model methods from KeycloakSession 2014-07-08 15:27:42 +01:00
Stian Thorgersen 8dc293f629 Removed removeAllData from model 2014-07-08 15:27:42 +01:00
Bill Burke de8819aae3 Merge pull request #506 from ssilvert/master
KEYCLOAK-555 Subsystem needs template for new WildFly build.
2014-07-08 10:02:10 -04:00
Stan Silvert e98ced5d0f KEYCLOAK-555 Subsystem needs template for new WildFly build. 2014-07-08 09:39:44 -04:00
Stian Thorgersen 6775af302a Merge pull request #505 from stianst/master
Added hybrid model provider with jpa stores
2014-07-08 12:04:36 +01:00
Stian Thorgersen 621cae61b6 Added hybrid model provider with jpa stores 2014-07-08 12:04:09 +01:00
Bill Burke 922a8f7eef Merge pull request #504 from patriot1burke/master
fix json file
2014-07-07 18:51:59 -04:00
Bill Burke 48a0e564b9 fix json file 2014-07-07 18:51:38 -04:00
Bill Burke 0758d89a59 Merge pull request #502 from mposolda/master
Changes in representations - adding role mappings under user representat...
2014-07-07 18:41:42 -04:00
Bill Burke e94b6acd02 Merge pull request #503 from patriot1burke/master
admin rest api test
2014-07-07 18:38:08 -04:00
Bill Burke a1beff7d3d admin rest api test 2014-07-07 18:37:30 -04:00
mposolda ffc30b4c03 Changes in representations - adding role mappings under user representation 2014-07-07 22:48:53 +02:00
Bill Burke 6d824231e9 Merge pull request #501 from patriot1burke/master
fix delete when cache is on
2014-07-07 15:04:18 -04:00
Bill Burke 060a90197e Merge remote-tracking branch 'upstream/master' 2014-07-07 15:00:05 -04:00
Bill Burke df7aac01dd fix delete realm 2014-07-07 14:59:51 -04:00
Bill Burke 69b00d859b Merge pull request #497 from mposolda/performance
More performance testing stuff
2014-07-07 14:59:41 -04:00
mposolda 9c88979040 Added UsersJob for generic job related to users. Support for sync/async jobs. Configurable host/port 2014-07-07 20:31:43 +02:00
Bill Burke bda218af07 Merge pull request #500 from patriot1burke/master
configurable hash iterations
2014-07-07 12:12:25 -04:00
Bill Burke 15d7568792 configurable hash iterations 2014-07-07 12:11:45 -04:00
Stian Thorgersen 18b14b54f4 Merge pull request #499 from stianst/master
Remove notBefore from users
2014-07-07 16:26:31 +01:00
Stian Thorgersen 38857cf2e6 Remove notBefore from users 2014-07-07 16:23:53 +01:00
Stian Thorgersen 0647590170 Merge pull request #498 from stianst/master
Rename loginName to username
2014-07-07 15:58:26 +01:00
Stian Thorgersen 099743d448 Rename loginName to username 2014-07-07 15:56:21 +01:00
Bill Burke 4cbc423d67 Merge pull request #496 from patriot1burke/master
turn on cache for testsuite
2014-07-03 15:30:05 -04:00
Bill Burke e37b5613ed turn on cache 2014-07-03 15:29:31 -04:00
Bill Burke f92ad89a6c Merge pull request #495 from patriot1burke/master
HttpServletRequest.logout()
2014-07-03 14:08:43 -04:00
Bill Burke e99a675c50 HttpServletRequest.logout() 2014-07-03 14:08:19 -04:00
Stian Thorgersen 4593bff76f Merge pull request #494 from vibe13/master
Alignment of dependencies to other JBoss projects
2014-07-03 09:18:34 +01:00
Andrea Vibelli 81d6590544 Removed unused property resteasy.version.eap.6.3, resteasy.version has the same value and it is the one used for consuming 2.3.7.Final version 2014-07-02 15:10:24 +02:00
Andrea Vibelli 2f9597cf51 Alignment of com.h2database:h2 to version 1.3.168 (was 1.3.161) 2014-07-02 14:53:57 +02:00
Andrea Vibelli 8a246a6444 Extraction of hardcoded version of org.jboss.logging:jboss-logging into properties; alignment of org.jboss.logging:jboss-logging to a unique version 3.1.4.GA (was 3.1.1.GA and 3.1.2.GA) 2014-07-02 14:35:57 +02:00
Stian Thorgersen 876d493458 Merge pull request #491 from jpkrohling/JPK-LocationSearchInsteadHref
Changed window.location.href to search.
2014-07-01 10:10:21 +01:00
Stian Thorgersen 6f023fcae4 Merge pull request #490 from mposolda/performance
Added module performance-web for testing Keycloak endpoints with JMeter
2014-07-01 09:50:15 +01:00
Bill Burke 0abd93417a Merge pull request #492 from patriot1burke/master
model fix for caching
2014-06-30 13:13:16 -04:00
Bill Burke b4f5fe9977 model fix for caching 2014-06-30 13:12:42 -04:00
Juraci Paixão Kröhling e15b0c7d90 Changed window.location.href to search. 2014-06-30 17:56:53 +02:00
Stian Thorgersen 3cf52b018c Merge pull request #489 from smysnk/master
Add AMD support to keycloak javascript adapter
2014-06-30 10:22:55 +01:00
mposolda cb9f159091 Added JMeter. Added KeycloakPerfServer into maven. 2014-06-30 09:45:20 +02:00
Joshua Bellamy-Henn 64cea5f25a Add AMD support to keycloak javascript adapter 2014-06-27 11:24:29 -06:00
mposolda b6fd58e644 Support for configuring number of worker threads in undertow 2014-06-27 17:25:47 +02:00
mposolda de774a3058 Add classes classifier to performance-tools war, so classes can be reused in performance-web module 2014-06-27 15:51:02 +02:00
mposolda 9ebe2ff45e Added support for get-users-count and create-available-users into PerfTools 2014-06-27 15:51:02 +02:00
mposolda 4ebc575afc Change perf test to parse accessToken and refreshToken in Servlet. Support for logout 2014-06-27 15:51:01 +02:00
mposolda a1d4d8e13f Work in progress... 2014-06-27 15:51:01 +02:00
mposolda 69f7dfbb47 Added performance-web module 2014-06-27 15:51:01 +02:00
mposolda 99ce0a36e6 Refactoring current performance test 2014-06-27 15:51:01 +02:00
Stian Thorgersen 67c34554db Merge pull request #488 from stianst/master
Fix reset password test
2014-06-27 14:49:57 +01:00
Stian Thorgersen 9ba61af83b Fix reset password test 2014-06-27 14:48:36 +01:00
Stian Thorgersen 436f5f6229 Merge pull request #487 from stianst/master
KEYCLOAK-501 Check if old session for browser exists and delete before c...
2014-06-27 13:58:23 +01:00
Stian Thorgersen 270d6108ca KEYCLOAK-501 Check if old session for browser exists and delete before creating a new 2014-06-27 12:55:33 +01:00
Stian Thorgersen 18094370a6 Merge pull request #486 from stianst/master
Bug fixes
2014-06-27 12:21:39 +01:00
Stian Thorgersen 26eac398e0 KEYCLOAK-541 Create session after resetting password through email 2014-06-27 12:20:32 +01:00
Stian Thorgersen 93c896b4f7 KEYCLOAK-543 Set sent date on emails 2014-06-27 12:19:56 +01:00
Stian Thorgersen 6b29202f1f Merge pull request #485 from stianst/master
Added mail server to test tools
2014-06-27 11:11:52 +01:00
Stian Thorgersen 3b1d8fd8fe Added mail server to test tools 2014-06-27 11:11:33 +01:00
Stian Thorgersen 630d62f014 Merge pull request #484 from stianst/master
Refactor to KeycloakSession
2014-06-27 09:54:31 +01:00
Stian Thorgersen 711b8ca747 Return null for selected provider if empty string 2014-06-27 09:39:21 +01:00
Stian Thorgersen 34a1923d18 Refactor to prepar for splitting model 2014-06-27 09:39:06 +01:00
Stian Thorgersen 6291936ce9 Disable cache as it's not working
Conflicts:
	project-integrations/aerogear-ups/auth-server/src/main/webapp/WEB-INF/keycloak-server.json
	server/src/main/resources/META-INF/keycloak-server.json
	testsuite/tools/src/main/resources/META-INF/keycloak-server.json
2014-06-27 09:38:13 +01:00
Stian Thorgersen 5220c6c288 Merge pull request #483 from mposolda/master
KEYCLOAK-540 Broken project-integrations/aerogear-ups. Move keycloak-ser...
2014-06-25 14:41:56 +01:00
mposolda 532c82f752 KEYCLOAK-540 Broken project-integrations/aerogear-ups. Move keycloak-server.json to correct location, so it's used instead of SystemPropertiesConfigProvider 2014-06-25 15:27:38 +02:00
Stian Thorgersen 61218715af Merge pull request #482 from mposolda/master
LDAP: configurable LDAP Object Classes for User
2014-06-25 09:46:17 +01:00
mposolda 8dce5a90bb LDAP: configurable LDAP Object Classes for User 2014-06-25 07:59:58 +02:00
Stian Thorgersen 8d794b8151 Merge pull request #481 from mposolda/ldap
Ldap improvements and fixes
2014-06-24 09:37:47 +01:00
mposolda b1cfab34fd Support for test of LDAP connection and authentication 2014-06-24 10:03:14 +02:00
mposolda 159a5e20bf Possibility to configure ldap attribute, which is mapped to username, through admin console 2014-06-23 17:54:11 +02:00
mposolda aea4fd8e30 Upgrade to picketlink 2.6.0.CR5. Support for sync whole UserModel into AuthenticationProvider 2014-06-23 15:29:00 +02:00
mposolda 767e6a9783 Add ActiveDirectory fix to properly support sAMAccountName as username 2014-06-23 15:29:00 +02:00
Stian Thorgersen bb8ac0000e Merge pull request #480 from stianst/master
Started test tools module
2014-06-23 11:45:21 +01:00
Stian Thorgersen d73d2e0788 Started test tools module 2014-06-23 11:37:03 +01:00
Bill Burke 714e83198e Merge pull request #479 from patriot1burke/master
perf test fix
2014-06-20 17:15:35 -04:00
Bill Burke c780918501 perf test fix 2014-06-20 17:15:16 -04:00
Bill Burke 8bcb01fadb Merge pull request #478 from patriot1burke/master
user cache
2014-06-20 17:08:16 -04:00
Bill Burke f78f5366cf Merge remote-tracking branch 'upstream/master' 2014-06-20 17:07:50 -04:00
Bill Burke f0d02f24b1 user cache 2014-06-20 17:06:56 -04:00
Bill Burke 15bc33f8e6 Merge pull request #477 from patriot1burke/master
stateless access codes
2014-06-20 10:38:46 -04:00
Bill Burke d21a19925b stateless access codes 2014-06-20 10:37:27 -04:00
Bill Burke a1e9d99d3e Merge remote-tracking branch 'upstream/master' 2014-06-19 08:50:34 -04:00
Bill Burke 094cf675c7 user cache 2014-06-19 08:50:19 -04:00
Stian Thorgersen efcb7ee110 Merge pull request #476 from mposolda/beta-3-testing
Improvement for AD integration to avoid exception when mulitple users wi...
2014-06-19 13:02:36 +01:00
mposolda c8321fc96e Improvement for AD integration to avoid exception when mulitple users without email are synced to Keycloak DB 2014-06-19 13:43:44 +02:00
Stian Thorgersen 56ea29e899 Merge pull request #475 from stianst/master
Bumped version to 1.0-beta-4-SNAPSHOT
2014-06-19 10:20:13 +01:00
Stian Thorgersen df2305eb02 Bumped version to 1.0-beta-4-SNAPSHOT 2014-06-19 10:19:10 +01:00
Stian Thorgersen 5281793078 Merge pull request #474 from mposolda/beta-3-testing
fix javascript error when click on 'Show Expires' and token is not activ...
2014-06-18 17:11:49 +01:00
mposolda 9beb210c23 fix javascript error when click on 'Show Expires' and token is not active 2014-06-18 18:08:05 +02:00
Stian Thorgersen d1c890db18 Merge pull request #472 from mposolda/db-fixes
KEYCLOAK-534 Fix MS-SQL, Oracle and Sybase
2014-06-18 13:32:57 +01:00
Stian Thorgersen 0be4a4b71d Merge pull request #473 from stianst/master
Documentation to reverse proxy config
2014-06-18 13:13:11 +01:00
mposolda 19a545049b KEYCLOAK-536 Fix Sybase - role can't be used as column name as it's keyword in sybase 2014-06-18 12:31:55 +02:00
Stian Thorgersen 34eb34c5fc Added documentation to specify https redirect port 2014-06-18 11:08:06 +01:00
Stian Thorgersen 28adc28a56 Add instructions to configure a reverse proxy with KC 2014-06-18 09:59:23 +01:00
mposolda 5d8c803da6 Remove duplicite dependency declarations to remove maven warnings 2014-06-18 10:31:56 +02:00
mposolda 2fd7fdaa74 KEYCLOAK-535 Fix Keycloak with Oracle 2014-06-18 10:29:57 +02:00
mposolda f9cb99a1ee KEYCLOAK-534 Fix MS-SQL 2014-06-17 19:41:19 +02:00
Stian Thorgersen 37bfb2c594 Merge pull request #471 from stianst/master
KEYCLOAK-533
2014-06-17 15:38:16 +01:00
Stian Thorgersen 3b55248e6c KEYCLOAK-533 2014-06-17 15:30:50 +01:00
Stian Thorgersen b35bccdad2 Merge pull request #470 from stianst/master
KEYCLOAK-530
2014-06-17 14:11:48 +01:00
Stian Thorgersen 6cabf3e57d KEYCLOAK-530 2014-06-17 14:11:31 +01:00
Stian Thorgersen b31b54e17c Merge pull request #469 from stianst/master
KEYCLOAK-532
2014-06-17 14:07:26 +01:00
Stian Thorgersen 469d044254 KEYCLOAK-532 2014-06-17 14:07:07 +01:00
Stian Thorgersen 9a26d7078f Merge pull request #468 from stianst/master
KEYCLOAK-520
2014-06-17 11:21:54 +01:00
Stian Thorgersen 896c32a660 KEYCLOAK-520 2014-06-17 11:21:36 +01:00
Stian Thorgersen 6e23613b9e Merge pull request #467 from stianst/master
Disable cache provider for beta-3 release
2014-06-17 11:07:27 +01:00
Stian Thorgersen d15324110e Disable cache provider for beta-3 release 2014-06-17 11:06:08 +01:00
Stian Thorgersen 153de54fe8 Merge pull request #466 from stianst/master
KEYCLOAK-526 Fix iframe origin when auth server url is relative
2014-06-16 17:55:27 +01:00
Stian Thorgersen 2866f6fc23 KEYCLOAK-526 Fix iframe origin when auth server url is relative 2014-06-16 17:55:03 +01:00
Bill Burke 9228f0c076 Merge pull request #465 from patriot1burke/master
keycloak-521
2014-06-16 11:59:52 -04:00
Bill Burke 1eafb01c8d keycloak-521 2014-06-16 11:59:27 -04:00
Bill Burke 44f446e745 Merge pull request #464 from patriot1burke/master
keycloak-518
2014-06-16 10:48:34 -04:00
Bill Burke c71fdc72c7 keycloak-518 2014-06-16 10:43:50 -04:00
Bill Burke bbf944a225 Merge pull request #463 from patriot1burke/master
oops show-sql=false
2014-06-16 10:28:28 -04:00
Bill Burke dbc5641144 oops show-sql=false 2014-06-16 10:28:06 -04:00
Bill Burke 9080a64fcd Merge pull request #462 from patriot1burke/master
better fetch for role mappings
2014-06-16 10:16:22 -04:00
Bill Burke f50177996d better fetch for role mappings 2014-06-16 10:15:53 -04:00
Bill Burke b649dd39d9 Merge pull request #461 from patriot1burke/master
caching
2014-06-13 20:09:03 -04:00
Bill Burke ab87c03732 cache 1st iteration finished 2014-06-13 19:39:20 -04:00
Bill Burke 8eaf77b3c1 cache impl again 2014-06-13 19:05:05 -04:00
Bill Burke cbea141a54 cache impl 2014-06-13 17:17:45 -04:00
Bill Burke 60a040a141 Merge pull request #460 from patriot1burke/master
refactor for caching
2014-06-13 09:49:08 -04:00
Bill Burke 4a518c964b mongo refactor for caching 2014-06-12 16:51:19 -04:00
Bill Burke bb2ad656a3 cache implement 2014-06-12 11:45:50 -04:00
Bill Burke 30b95e0a57 Merge remote-tracking branch 'upstream/master' 2014-06-12 11:12:22 -04:00
Bill Burke 852c631eff Merge pull request #459 from ssilvert/master
KEYCLOAK-522 Refactor Undertow Adapter so that it can optionally be used without the Servlet API.
2014-06-12 11:12:07 -04:00
Bill Burke 211a279248 Merge remote-tracking branch 'upstream/master' 2014-06-12 11:11:27 -04:00
Bill Burke 2ae2067841 refactor for caching again 2014-06-12 11:11:14 -04:00
Bill Burke 0dd06e3343 model refactor for caching 2014-06-10 18:50:08 -04:00
Stan Silvert 4e9bec69e4 Add Apache 2.0 license 2014-06-09 16:43:45 -04:00
Stan Silvert 70392d9f1a KEYCLOAK-522 Refactor Undertow Adapter so that it can optionally be used
without the Servlet API.
2014-06-09 16:43:44 -04:00
Bill Burke 9a3abf6a6a Merge pull request #458 from mposolda/master
Support for Active Directory and RHDS
2014-06-09 15:15:15 -04:00
mposolda 0bfcbdb359 Support for Active Directory and RHDS 2014-06-09 16:20:19 +02:00
Bill Burke 2f3c8bf079 cache refactor 2014-06-06 15:12:58 -04:00
Stian Thorgersen e7bde986aa Merge pull request #457 from stianst/master
KEYCLOAK-504 Using https results in RuntimeException if sslRequired is set to false
2014-06-06 14:54:40 +01:00
Stian Thorgersen f3211bf34d KEYCLOAK-504
Using https results in RuntimeException if sslRequired is set to false
2014-06-06 14:54:11 +01:00
Stian Thorgersen c086e0a502 Merge pull request #456 from stianst/master
KEYCLOAK-500
2014-06-06 09:53:08 +01:00
Stian Thorgersen 80f4b668b2 KEYCLOAK-500
Redundant condition in keycloak.js
2014-06-06 09:52:25 +01:00
Stian Thorgersen 01606ab5e0 Merge pull request #455 from stianst/master
KEYCLOAK-496 Dependency jira alignments with other JBoss projects
2014-06-05 15:25:37 +01:00
Stian Thorgersen 91e29d9710 KEYCLOAK-496 Dependency jira alignments with other JBoss projects 2014-06-05 13:33:48 +01:00
Stian Thorgersen 23d101f8fa Merge pull request #454 from rodrigopsasaki/issue-keycloak-519
Issue KEYCLOAK-519
2014-06-05 13:30:00 +01:00
Rodrigo Sasaki e08b3e7dec flipped comparison operands to avoid NPE 2014-06-05 09:24:06 -03:00
Stian Thorgersen c4e32b7c45 Merge pull request #453 from stianst/stateless-social
Fix
2014-06-05 11:13:38 +01:00
Stian Thorgersen 14ece40054 Removed file that shouldn't have been committed 2014-06-05 11:12:47 +01:00
Stian Thorgersen eaa6be55d7 KEYCLOAK-496 Removed commons-io 2014-06-05 10:41:37 +01:00
Stian Thorgersen 2ae714aea2 Merge pull request #452 from stianst/stateless-social
KEYCLOAK-244 Social should be stateless
2014-06-05 10:40:07 +01:00
Stian Thorgersen 5f6687ec62 KEYCLOAK-244 Social should be stateless 2014-06-05 10:09:17 +01:00
Stian Thorgersen 06053fad85 Merge pull request #451 from stianst/master
KEYCLOAK-510
2014-06-04 12:34:29 +01:00
Stian Thorgersen d0c06ab0ce KEYCLOAK-510
NPE in ExtendingThemeManager
2014-06-04 12:26:24 +01:00
Stian Thorgersen cfb6f927b2 Merge pull request #450 from jimbo1007/jsfix
add missing initPromise.setSuccess()
2014-06-03 15:02:18 +01:00
unknown 8d33894989 add missing initPromise.setSuccess() 2014-06-03 09:28:01 -04:00
Bill Burke ba13cbe004 Merge pull request #449 from patriot1burke/master
fix deadlocks
2014-06-02 21:34:43 -04:00
Bill Burke 9410adf9ce fix deadlocks 2014-06-02 21:33:43 -04:00
Bill Burke 7443c78087 Merge pull request #448 from patriot1burke/master
bump version again
2014-06-02 14:22:10 -04:00
Bill Burke d5b34a0b41 bump version again 2014-06-02 13:12:04 -04:00
Bill Burke 0cd64e297a Merge pull request #447 from patriot1burke/master
bump version
2014-06-02 12:22:40 -04:00
Bill Burke 0fcf80dd6e bump version 2014-06-02 12:21:58 -04:00
Bill Burke 56e9e0b4f9 Merge pull request #446 from patriot1burke/master
NPE in as7 adapter logout
2014-06-02 12:03:09 -04:00
Bill Burke dfcd3267e4 NPE in as7 adapter logout 2014-06-02 12:02:42 -04:00
Bill Burke f689747fd6 Merge pull request #445 from patriot1burke/master
wildfly ssl fixes
2014-06-02 11:22:51 -04:00
Bill Burke bb11165568 wildfly ssl fixes 2014-06-02 11:22:19 -04:00
Bill Burke a180c6b896 Merge remote-tracking branch 'upstream/master' 2014-06-02 09:37:30 -04:00
Bill Burke 34d3be244d bump undertow version 2014-06-02 09:37:18 -04:00
Stian Thorgersen 4662781213 Merge pull request #443 from lnewson/master
Fixed an integer overflow that caused the token to be refreshed too often
2014-06-02 09:35:11 +01:00
Stian Thorgersen 5bd12a708f Merge pull request #444 from lnewson/social-fix
Fixed an NPE when the social users name is null
2014-06-02 09:34:32 +01:00
Bill Burke e39149c954 Merge remote-tracking branch 'upstream/master' 2014-06-01 18:03:49 -04:00
Bill Burke b925a97b5d bump wildfly version 2014-06-01 18:03:39 -04:00
Lee Newson 3bcf2c81da Fixed an NPE when the users name is null 2014-05-31 10:39:34 +10:00
Lee Newson b52801de25 Fixed an integer overflow that caused the token to always be refreshed 2014-05-31 10:26:06 +10:00
Stian Thorgersen 4d8c3d7d73 Merge pull request #442 from stianst/master
Cache for FreeMarker templates and set cache-control for static resources from themes
2014-05-30 17:03:37 +01:00
Stian Thorgersen ea1f10361a Cache FreeMarker templates 2014-05-30 16:59:25 +01:00
Stian Thorgersen 5dafad71ac Set cache-control on static resources from themes 2014-05-30 16:59:25 +01:00
Bill Burke df28fb97ed Merge pull request #440 from stianst/master
Bump version to 1.0.beta2-SNAPSHOT
2014-05-30 08:56:00 -04:00
Stian Thorgersen 5600018a56 Merge pull request #441 from mposolda/master
Basic fix of performance tests and added README. Still requires work...
2014-05-30 10:37:05 +01:00
mposolda 441c00c06f Basic fix of performance tests and added README. Still requires work... 2014-05-30 11:03:16 +02:00
Stian Thorgersen 9533bbc47d Merge pull request #439 from mposolda/master
Fix js-console on FF
2014-05-30 08:55:33 +01:00
Stian Thorgersen 2025d314ec Bump version to 1.0.beta2-SNAPSHOT 2014-05-30 08:52:03 +01:00
mposolda 772f991545 Fix js-console on FF 2014-05-29 18:56:34 +02:00
887 changed files with 31335 additions and 17984 deletions

No files matched your search

+1 -1
View File
@@ -3,7 +3,7 @@
<parent>
<artifactId>keycloak-audit-parent</artifactId>
<groupId>org.keycloak</groupId>
<version>1.0-beta-1</version>
<version>1.0-beta-4</version>
</parent>
<modelVersion>4.0.0</modelVersion>
+1
View File
@@ -17,6 +17,7 @@ public interface Details {
String REMEMBER_ME = "remember_me";
String TOKEN_ID = "token_id";
String REFRESH_TOKEN_ID = "refresh_token_id";
String VALIDATE_ACCESS_TOKEN = "validate_access_token";
String UPDATED_REFRESH_TOKEN_ID = "updated_refresh_token_id";
}
@@ -10,6 +10,7 @@ public interface Errors {
String CLIENT_NOT_FOUND = "client_not_found";
String CLIENT_DISABLED = "client_disabled";
String INVALID_CLIENT_CREDENTIALS = "invalid_client_credentials";
String INVALID_CLIENT = "invalid_client";
String USER_NOT_FOUND = "user_not_found";
String USER_DISABLED = "user_disabled";
+2
View File
@@ -14,6 +14,8 @@ public enum EventType {
CODE_TO_TOKEN,
CODE_TO_TOKEN_ERROR,
REFRESH_TOKEN,
VALIDATE_ACCESS_TOKEN,
VALIDATE_ACCESS_TOKEN_ERROR,
REFRESH_TOKEN_ERROR,
SOCIAL_LINK,
SOCIAL_LINK_ERROR,
+1 -1
View File
@@ -3,7 +3,7 @@
<parent>
<artifactId>keycloak-audit-parent</artifactId>
<groupId>org.keycloak</groupId>
<version>1.0-beta-1</version>
<version>1.0-beta-4</version>
</parent>
<modelVersion>4.0.0</modelVersion>
+8 -9
View File
@@ -7,13 +7,10 @@ import org.keycloak.audit.EventType;
import org.keycloak.email.EmailException;
import org.keycloak.email.EmailProvider;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.RealmProvider;
import org.keycloak.models.RealmModel;
import org.keycloak.models.UserModel;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
@@ -23,12 +20,14 @@ public class EmailAuditListener implements AuditListener {
private static final Logger log = Logger.getLogger(EmailAuditListener.class);
private KeycloakSession keycloakSession;
private KeycloakSession session;
private RealmProvider model;
private EmailProvider emailProvider;
private Set<EventType> includedEvents;
public EmailAuditListener(KeycloakSession keycloakSession, EmailProvider emailProvider, Set<EventType> includedEvents) {
this.keycloakSession = keycloakSession;
public EmailAuditListener(KeycloakSession session, EmailProvider emailProvider, Set<EventType> includedEvents) {
this.session = session;
this.model = session.realms();
this.emailProvider = emailProvider;
this.includedEvents = includedEvents;
}
@@ -37,8 +36,8 @@ public class EmailAuditListener implements AuditListener {
public void onEvent(Event event) {
if (includedEvents.contains(event.getEvent())) {
if (event.getRealmId() != null && event.getUserId() != null) {
RealmModel realm = keycloakSession.getRealm(event.getRealmId());
UserModel user = realm.getUserById(event.getUserId());
RealmModel realm = model.getRealm(event.getRealmId());
UserModel user = session.users().getUserById(event.getUserId(), realm);
if (user != null && user.getEmail() != null && user.isEmailVerified()) {
try {
emailProvider.setRealm(realm).setUser(user).sendEvent(event);
@@ -6,7 +6,6 @@ import org.keycloak.audit.AuditListenerFactory;
import org.keycloak.audit.EventType;
import org.keycloak.email.EmailProvider;
import org.keycloak.models.KeycloakSession;
import org.keycloak.provider.ProviderSession;
import java.util.Collections;
import java.util.HashSet;
@@ -25,10 +24,9 @@ public class EmailAuditListenerFactory implements AuditListenerFactory {
private Set<EventType> includedEvents = new HashSet<EventType>();
@Override
public AuditListener create(ProviderSession providerSession) {
KeycloakSession keycloakSession = providerSession.getProvider(KeycloakSession.class);
EmailProvider emailProvider = providerSession.getProvider(EmailProvider.class);
return new EmailAuditListener(keycloakSession, emailProvider, includedEvents);
public AuditListener create(KeycloakSession session) {
EmailProvider emailProvider = session.getProvider(EmailProvider.class);
return new EmailAuditListener(session, emailProvider, includedEvents);
}
@Override
+7 -1
View File
@@ -3,7 +3,7 @@
<parent>
<artifactId>keycloak-audit-parent</artifactId>
<groupId>org.keycloak</groupId>
<version>1.0-beta-1</version>
<version>1.0-beta-4</version>
</parent>
<modelVersion>4.0.0</modelVersion>
@@ -24,6 +24,12 @@
<version>${project.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-model-api</artifactId>
<version>${project.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-audit-api</artifactId>
@@ -4,7 +4,7 @@ import org.jboss.logging.Logger;
import org.keycloak.Config;
import org.keycloak.audit.AuditListener;
import org.keycloak.audit.AuditListenerFactory;
import org.keycloak.provider.ProviderSession;
import org.keycloak.models.KeycloakSession;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
@@ -16,7 +16,7 @@ public class JBossLoggingAuditListenerFactory implements AuditListenerFactory {
private static final Logger logger = Logger.getLogger("org.keycloak.audit");
@Override
public AuditListener create(ProviderSession providerSession) {
public AuditListener create(KeycloakSession session) {
return new JBossLoggingAuditListener(logger);
}
+9 -14
View File
@@ -3,7 +3,7 @@
<parent>
<artifactId>keycloak-audit-parent</artifactId>
<groupId>org.keycloak</groupId>
<version>1.0-beta-1</version>
<version>1.0-beta-4</version>
</parent>
<modelVersion>4.0.0</modelVersion>
@@ -21,13 +21,19 @@
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-audit-api</artifactId>
<artifactId>keycloak-model-api</artifactId>
<version>${project.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-audit-tests</artifactId>
<artifactId>keycloak-connections-jpa</artifactId>
<version>${project.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-audit-api</artifactId>
<version>${project.version}</version>
<scope>provided</scope>
</dependency>
@@ -52,16 +58,5 @@
<artifactId>jackson-core-asl</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
@@ -3,33 +3,44 @@ package org.keycloak.audit.jpa;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
@Entity
@Table(name="EVENT_ENTITY")
public class EventEntity {
@Id
@Column(name="ID", length = 36)
private String id;
@Column(name="TIME")
private long time;
@Column(name="EVENT")
private String event;
@Column(name="REALM_ID")
private String realmId;
@Column(name="CLIENT_ID")
private String clientId;
@Column(name="USER_ID")
private String userId;
@Column(name="SESSION_ID")
private String sessionId;
@Column(name="IP_ADDRESS")
private String ipAddress;
@Column(name="ERROR")
private String error;
@Column(length = 2550)
@Column(name="DETAILS_JSON", length = 2550)
private String detailsJson;
public String getId() {
@@ -41,44 +41,28 @@ public class JpaAuditProvider implements AuditProvider {
@Override
public void clear() {
beginTx();
em.createQuery("delete from EventEntity").executeUpdate();
}
@Override
public void clear(String realmId) {
beginTx();
em.createQuery("delete from EventEntity where realmId = :realmId").setParameter("realmId", realmId).executeUpdate();
}
@Override
public void clear(String realmId, long olderThan) {
beginTx();
em.createQuery("delete from EventEntity where realmId = :realmId and time < :time").setParameter("realmId", realmId).setParameter("time", olderThan).executeUpdate();
}
@Override
public void onEvent(Event event) {
if (includedEvents.contains(event.getEvent())) {
beginTx();
em.persist(convert(event));
}
}
@Override
public void close() {
if (tx != null) {
tx.commit();
}
em.close();
}
private void beginTx() {
if (tx == null) {
tx = em.getTransaction();
tx.begin();
}
}
static EventEntity convert(Event o) {
@@ -4,10 +4,9 @@ import org.keycloak.Config;
import org.keycloak.audit.AuditProvider;
import org.keycloak.audit.AuditProviderFactory;
import org.keycloak.audit.EventType;
import org.keycloak.provider.ProviderSession;
import org.keycloak.connections.jpa.JpaConnectionProvider;
import org.keycloak.models.KeycloakSession;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import java.util.HashSet;
import java.util.Set;
@@ -17,19 +16,17 @@ import java.util.Set;
public class JpaAuditProviderFactory implements AuditProviderFactory {
public static final String ID = "jpa";
private EntityManagerFactory emf;
private Set<EventType> includedEvents = new HashSet<EventType>();
@Override
public AuditProvider create(ProviderSession providerSession) {
return new JpaAuditProvider(emf.createEntityManager(), includedEvents);
public AuditProvider create(KeycloakSession session) {
JpaConnectionProvider connection = session.getProvider(JpaConnectionProvider.class);
return new JpaAuditProvider(connection.getEntityManager(), includedEvents);
}
@Override
public void init(Config.Scope config) {
emf = Persistence.createEntityManagerFactory("jpa-keycloak-audit-store");
String[] include = config.getArray("include-events");
if (include != null) {
for (String i : include) {
@@ -51,7 +48,6 @@ public class JpaAuditProviderFactory implements AuditProviderFactory {
@Override
public void close() {
emf.close();
}
@Override
@@ -1,15 +0,0 @@
package org.keycloak.audit.jpa;
import org.keycloak.audit.tests.AbstractAuditProviderTest;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public class JpaAuditProviderTest extends AbstractAuditProviderTest {
@Override
protected String getProviderId() {
return JpaAuditProviderFactory.ID;
}
}
@@ -1,22 +0,0 @@
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0">
<persistence-unit name="jpa-keycloak-audit-store" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>org.keycloak.audit.jpa.EventEntity</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<property name="hibernate.connection.url" value="jdbc:h2:mem:test"/>
<property name="hibernate.connection.driver_class" value="org.h2.Driver"/>
<property name="hibernate.connection.username" value="sa"/>
<property name="hibernate.connection.password" value=""/>
<property name="hibernate.hbm2ddl.auto" value="create-drop" />
<property name="hibernate.show_sql" value="false" />
<property name="hibernate.format_sql" value="true" />
</properties>
</persistence-unit>
</persistence>
+11 -96
View File
@@ -3,7 +3,7 @@
<parent>
<artifactId>keycloak-audit-parent</artifactId>
<groupId>org.keycloak</groupId>
<version>1.0-beta-1</version>
<version>1.0-beta-4</version>
</parent>
<modelVersion>4.0.0</modelVersion>
@@ -14,14 +14,20 @@
<dependencies>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-core</artifactId>
<version>${project.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-core</artifactId>
<artifactId>keycloak-model-api</artifactId>
<version>${project.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-connections-mongo</artifactId>
<version>${project.version}</version>
<scope>provided</scope>
</dependency>
@@ -31,12 +37,6 @@
<version>${project.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-audit-tests</artifactId>
<version>${project.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jboss.logging</groupId>
<artifactId>jboss-logging</artifactId>
@@ -47,90 +47,5 @@
<artifactId>mongo-java-driver</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<properties>
<keycloak.audit.mongo.host>localhost</keycloak.audit.mongo.host>
<keycloak.audit.mongo.port>27018</keycloak.audit.mongo.port>
<keycloak.audit.mongo.db>keycloak</keycloak.audit.mongo.db>
<keycloak.audit.mongo.clearOnStartup>true</keycloak.audit.mongo.clearOnStartup>
<keycloak.audit.mongo.bindIp>127.0.0.1</keycloak.audit.mongo.bindIp>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<!-- Postpone tests to "integration-test" phase, so that we can bootstrap embedded mongo on 27018 before running tests -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<executions>
<execution>
<id>test</id>
<phase>integration-test</phase>
<goals>
<goal>test</goal>
</goals>
<configuration>
<systemPropertyVariables>
<keycloak.audit.mongo.host>${keycloak.audit.mongo.host}</keycloak.audit.mongo.host>
<keycloak.audit.mongo.port>${keycloak.audit.mongo.port}</keycloak.audit.mongo.port>
<keycloak.audit.mongo.db>${keycloak.audit.mongo.db}</keycloak.audit.mongo.db>
<keycloak.audit.mongo.clearOnStartup>${keycloak.audit.mongo.clearOnStartup}</keycloak.audit.mongo.clearOnStartup>
<keycloak.audit.mongo.bindIp>${keycloak.model.mongo.bindIp}</keycloak.audit.mongo.bindIp>
</systemPropertyVariables>
</configuration>
</execution>
<execution>
<id>default-test</id>
<configuration>
<skip>true</skip>
</configuration>
</execution>
</executions>
</plugin>
<!-- Embedded mongo -->
<plugin>
<groupId>com.github.joelittlejohn.embedmongo</groupId>
<artifactId>embedmongo-maven-plugin</artifactId>
<executions>
<execution>
<id>start-mongodb</id>
<phase>pre-integration-test</phase>
<goals>
<goal>start</goal>
</goals>
<configuration>
<port>${keycloak.audit.mongo.port}</port>
<logging>file</logging>
<logFile>${project.build.directory}/mongodb.log</logFile>
<bindIp>${keycloak.audit.mongo.bindIp}</bindIp>
</configuration>
</execution>
<execution>
<id>stop-mongodb</id>
<phase>post-integration-test</phase>
<goals>
<goal>stop</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
@@ -1,19 +1,15 @@
package org.keycloak.audit.mongo;
import com.mongodb.DB;
import com.mongodb.MongoClient;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
import com.mongodb.DBCollection;
import com.mongodb.WriteConcern;
import org.jboss.logging.Logger;
import org.keycloak.Config;
import org.keycloak.audit.AuditProvider;
import org.keycloak.audit.AuditProviderFactory;
import org.keycloak.audit.EventType;
import org.keycloak.provider.ProviderSession;
import org.keycloak.connections.mongo.MongoConnectionProvider;
import org.keycloak.models.KeycloakSession;
import java.net.UnknownHostException;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
@@ -25,45 +21,21 @@ public class MongoAuditProviderFactory implements AuditProviderFactory {
protected static final Logger logger = Logger.getLogger(MongoAuditProviderFactory.class);
public static final String ID = "mongo";
private MongoClient client;
private DB db;
private Set<EventType> includedEvents = new HashSet<EventType>();
@Override
public AuditProvider create(ProviderSession providerSession) {
return new MongoAuditProvider(db.getCollection("audit"), includedEvents);
public AuditProvider create(KeycloakSession session) {
MongoConnectionProvider connection = session.getProvider(MongoConnectionProvider.class);
DBCollection collection = connection.getDB().getCollection("audit");
collection.setWriteConcern(WriteConcern.UNACKNOWLEDGED);
return new MongoAuditProvider(collection, includedEvents);
}
@Override
public void init(Config.Scope config) {
try {
String host = config.get("host", ServerAddress.defaultHost());
int port = config.getInt("port", ServerAddress.defaultPort());
String dbName = config.get("db", "keycloak-audit");
boolean clearOnStartup = config.getBoolean("clearOnStartup", false);
String user = config.get("user");
String password = config.get("password");
if (user != null && password != null) {
MongoCredential credential = MongoCredential.createMongoCRCredential(user, dbName, password.toCharArray());
client = new MongoClient(new ServerAddress(host, port), Collections.singletonList(credential));
} else {
client = new MongoClient(host, port);
}
client.setWriteConcern(WriteConcern.UNACKNOWLEDGED);
db = client.getDB(dbName);
if (clearOnStartup) {
db.getCollection("audit").drop();
}
logger.infof("Initialized mongo audit. host: %s, port: %d, db: %s, clearOnStartup: %b", host, port, dbName, clearOnStartup);
} catch (UnknownHostException e) {
throw new RuntimeException(e);
}
String[] include = config.getArray("include-events");
if (include != null) {
for (String i : include) {
@@ -85,7 +57,6 @@ public class MongoAuditProviderFactory implements AuditProviderFactory {
@Override
public void close() {
client.close();
}
@Override
@@ -1,15 +0,0 @@
package org.keycloak.audit.mongo;
import org.keycloak.audit.tests.AbstractAuditProviderTest;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public class MongoAuditProviderTest extends AbstractAuditProviderTest {
@Override
protected String getProviderId() {
return MongoAuditProviderFactory.ID;
}
}
+1 -2
View File
@@ -3,7 +3,7 @@
<parent>
<artifactId>keycloak-parent</artifactId>
<groupId>org.keycloak</groupId>
<version>1.0-beta-1</version>
<version>1.0-beta-4</version>
<relativePath>../pom.xml</relativePath>
</parent>
@@ -21,6 +21,5 @@
<module>jpa</module>
<module>jboss-logging</module>
<module>mongo</module>
<module>tests</module>
</modules>
</project>
@@ -1,139 +0,0 @@
package org.keycloak.audit.tests;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.keycloak.Config;
import org.keycloak.audit.AuditProvider;
import org.keycloak.audit.AuditProviderFactory;
import org.keycloak.audit.Event;
import org.keycloak.audit.EventType;
import org.keycloak.provider.ProviderFactory;
import java.util.HashMap;
import java.util.Map;
import java.util.ServiceLoader;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public abstract class AbstractAuditProviderTest {
private ProviderFactory<AuditProvider> factory;
private AuditProvider provider;
@Before
public void before() {
String providerId = getProviderId();
ServiceLoader<AuditProviderFactory> factories = ServiceLoader.load(AuditProviderFactory.class);
for (AuditProviderFactory f : factories) {
if (f.getId().equals(providerId)) {
factory = f;
factory.init(Config.scope("audit", providerId));
}
}
provider = factory.create(null);
}
protected abstract String getProviderId();
@After
public void after() {
provider.clear();
provider.close();
factory.close();
}
@Test
public void save() {
provider.onEvent(create(EventType.LOGIN, "realmId", "clientId", "userId", "127.0.0.1", "error"));
}
@Test
public void query() {
long oldest = System.currentTimeMillis() - 30000;
long newest = System.currentTimeMillis() + 30000;
provider.onEvent(create(EventType.LOGIN, "realmId", "clientId", "userId", "127.0.0.1", "error"));
provider.onEvent(create(newest, EventType.REGISTER, "realmId", "clientId", "userId", "127.0.0.1", "error"));
provider.onEvent(create(newest, EventType.REGISTER, "realmId", "clientId", "userId2", "127.0.0.1", "error"));
provider.onEvent(create(EventType.LOGIN, "realmId2", "clientId", "userId", "127.0.0.1", "error"));
provider.onEvent(create(oldest, EventType.LOGIN, "realmId", "clientId2", "userId", "127.0.0.1", "error"));
provider.onEvent(create(EventType.LOGIN, "realmId", "clientId", "userId2", "127.0.0.1", "error"));
provider.close();
provider = factory.create(null);
Assert.assertEquals(5, provider.createQuery().client("clientId").getResultList().size());
Assert.assertEquals(5, provider.createQuery().realm("realmId").getResultList().size());
Assert.assertEquals(4, provider.createQuery().event(EventType.LOGIN).getResultList().size());
Assert.assertEquals(6, provider.createQuery().event(EventType.LOGIN, EventType.REGISTER).getResultList().size());
Assert.assertEquals(4, provider.createQuery().user("userId").getResultList().size());
Assert.assertEquals(1, provider.createQuery().user("userId").event(EventType.REGISTER).getResultList().size());
Assert.assertEquals(2, provider.createQuery().maxResults(2).getResultList().size());
Assert.assertEquals(1, provider.createQuery().firstResult(5).getResultList().size());
Assert.assertEquals(newest, provider.createQuery().maxResults(1).getResultList().get(0).getTime());
Assert.assertEquals(oldest, provider.createQuery().firstResult(5).maxResults(1).getResultList().get(0).getTime());
}
@Test
public void clear() {
provider.onEvent(create(System.currentTimeMillis() - 30000, EventType.LOGIN, "realmId", "clientId", "userId", "127.0.0.1", "error"));
provider.onEvent(create(System.currentTimeMillis() - 20000, EventType.LOGIN, "realmId", "clientId", "userId", "127.0.0.1", "error"));
provider.onEvent(create(System.currentTimeMillis(), EventType.LOGIN, "realmId", "clientId", "userId", "127.0.0.1", "error"));
provider.onEvent(create(System.currentTimeMillis(), EventType.LOGIN, "realmId", "clientId", "userId", "127.0.0.1", "error"));
provider.onEvent(create(System.currentTimeMillis() - 30000, EventType.LOGIN, "realmId2", "clientId", "userId", "127.0.0.1", "error"));
provider.close();
provider = factory.create(null);
provider.clear("realmId");
Assert.assertEquals(1, provider.createQuery().getResultList().size());
}
@Test
public void clearOld() {
provider.onEvent(create(System.currentTimeMillis() - 30000, EventType.LOGIN, "realmId", "clientId", "userId", "127.0.0.1", "error"));
provider.onEvent(create(System.currentTimeMillis() - 20000, EventType.LOGIN, "realmId", "clientId", "userId", "127.0.0.1", "error"));
provider.onEvent(create(System.currentTimeMillis(), EventType.LOGIN, "realmId", "clientId", "userId", "127.0.0.1", "error"));
provider.onEvent(create(System.currentTimeMillis(), EventType.LOGIN, "realmId", "clientId", "userId", "127.0.0.1", "error"));
provider.onEvent(create(System.currentTimeMillis() - 30000, EventType.LOGIN, "realmId2", "clientId", "userId", "127.0.0.1", "error"));
provider.close();
provider = factory.create(null);
provider.clear("realmId", System.currentTimeMillis() - 10000);
Assert.assertEquals(3, provider.createQuery().getResultList().size());
}
private Event create(EventType event, String realmId, String clientId, String userId, String ipAddress, String error) {
return create(System.currentTimeMillis(), event, realmId, clientId, userId, ipAddress, error);
}
private Event create(long time, EventType event, String realmId, String clientId, String userId, String ipAddress, String error) {
Event e = new Event();
e.setTime(time);
e.setEvent(event);
e.setRealmId(realmId);
e.setClientId(clientId);
e.setUserId(userId);
e.setIpAddress(ipAddress);
e.setError(error);
Map<String, String> details = new HashMap<String, String>();
details.put("key1", "value1");
details.put("key2", "value2");
e.setDetails(details);
return e;
}
}
@@ -1,15 +0,0 @@
package org.keycloak.authentication;
/**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
*/
public class AuthProviderConstants {
// Model is default provider. See AuthenticationProviderModel.DEFAULT_PROVIDER
public static final String PROVIDER_NAME_MODEL = "model";
public static final String PROVIDER_NAME_EXTERNAL_MODEL = "externalModel";
public static final String PROVIDER_NAME_PICKETLINK = "picketlink";
// Used in external-model provider
public static final String EXTERNAL_REALM_ID = "externalRealmId";
}
@@ -1,12 +0,0 @@
package org.keycloak.authentication;
/**
* Result of authentication by AuthenticationProvider
*
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
*/
public enum AuthProviderStatus {
SUCCESS, INVALID_CREDENTIALS, FAILED
}
@@ -1,83 +0,0 @@
package org.keycloak.authentication;
/**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
*/
public class AuthUser {
private String id;
private String username;
private String firstName;
private String lastName;
private String email;
private String providerName;
public AuthUser(String id, String username, String providerName) {
this.id = id;
this.username = username;
this.providerName = providerName;
}
public String getId() {
return id;
}
public AuthUser setId(String id) {
this.id = id;
return this;
}
public String getUsername() {
return username;
}
public AuthUser setUsername(String username) {
this.username = username;
return this;
}
public String getFirstName() {
return firstName;
}
public AuthUser setName(String name) {
int i = name.lastIndexOf(' ');
if (i != -1) {
firstName = name.substring(0, i);
lastName = name.substring(i + 1);
} else {
firstName = name;
}
return this;
}
public AuthUser setName(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
return this;
}
public String getLastName() {
return lastName;
}
public String getEmail() {
return email;
}
public AuthUser setEmail(String email) {
this.email = email;
return this;
}
public String getProviderName() {
return providerName;
}
public AuthUser setProviderName(String providerName) {
this.providerName = providerName;
return this;
}
}
@@ -1,68 +0,0 @@
package org.keycloak.authentication;
import java.util.List;
import java.util.Map;
import org.keycloak.models.RealmModel;
import org.keycloak.provider.Provider;
/**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
*/
public interface AuthenticationProvider extends Provider {
String getName();
/**
* Get names of all available configuration options of current provider
*
* @return options or empty list if no options available
*/
List<String> getAvailableOptions();
/**
* Get user by given username or email. Return user instance or null if user doesn't exists in this authentication provider
*
* @param realm
* @param configuration
* @param username or email
* @return found user or null if user with given username doesn't exists
* @throws AuthenticationProviderException
*/
AuthUser getUser(RealmModel realm, Map<String, String> configuration, String username) throws AuthenticationProviderException;
/**
* Try to register user with this authentication provider
*
* @param realm
* @param configuration
* @param username
* @return ID of newly created user (For example ID from LDAP)
* @throws AuthenticationProviderException if user creation couldn't happen
*/
String registerUser(RealmModel realm, Map<String, String> configuration, String username) throws AuthenticationProviderException;
/**
* Standard Authentication flow
*
* @param username
* @param password
* @return result of authentication, which might eventually encapsulate info about authenticated user and provider which successfully authenticated
*/
AuthProviderStatus validatePassword(RealmModel realm, Map<String, String> configuration, String username, String password) throws AuthenticationProviderException;
/**
* Update credential
*
* @param realm
* @param configuration
* @param username
* @param password
* @return true if credential has been successfully updated
* @throws AuthenticationProviderException
*/
boolean updateCredential(RealmModel realm, Map<String, String> configuration, String username, String password) throws AuthenticationProviderException;
}
@@ -1,24 +0,0 @@
package org.keycloak.authentication;
/**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
*/
public class AuthenticationProviderException extends Exception {
private static final long serialVersionUID = 15L;
protected AuthenticationProviderException() {
}
public AuthenticationProviderException(String message) {
super(message);
}
public AuthenticationProviderException(Throwable cause) {
super(cause);
}
public AuthenticationProviderException(String message, Throwable cause) {
super(message, cause);
}
}
@@ -1,9 +0,0 @@
package org.keycloak.authentication;
import org.keycloak.provider.ProviderFactory;
/**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
*/
public interface AuthenticationProviderFactory extends ProviderFactory<AuthenticationProvider> {
}
@@ -1,219 +0,0 @@
package org.keycloak.authentication;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.jboss.logging.Logger;
import org.keycloak.models.AuthenticationLinkModel;
import org.keycloak.models.AuthenticationProviderModel;
import org.keycloak.models.RealmModel;
import org.keycloak.models.UserModel;
import org.keycloak.provider.ProviderSession;
import org.keycloak.util.ProviderLoader;
/**
* Access point to authentication SPI. It finds configured and available {@link AuthenticationProvider} instances for current realm
* and then delegates method call to them.
*
* Example of usage: AuthenticationProviderManager.getManager(realm).validateUser("joe", "password");
*
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
*/
public class AuthenticationProviderManager {
private static final Logger logger = Logger.getLogger(AuthenticationProviderManager.class);
private final RealmModel realm;
private final Map<String, AuthenticationProvider> delegates;
public static AuthenticationProviderManager getManager(RealmModel realm, ProviderSession providerSession) {
Iterable<AuthenticationProvider> providers = providerSession.getAllProviders(AuthenticationProvider.class);
Map<String, AuthenticationProvider> providersMap = new HashMap<String, AuthenticationProvider>();
for (AuthenticationProvider provider : providers) {
providersMap.put(provider.getName(), provider);
}
return new AuthenticationProviderManager(realm, providersMap);
}
public AuthenticationProviderManager(RealmModel realm, Map<String, AuthenticationProvider> delegates) {
this.realm = realm;
this.delegates = delegates;
}
public AuthUser getUser(String username) {
List<AuthenticationProviderModel> authProviderModels = getConfiguredProviderModels(realm);
for (AuthenticationProviderModel providerModel : authProviderModels) {
AuthenticationProvider delegate = getProvider(providerModel.getProviderName());
if (delegate == null) {
continue;
}
try {
AuthUser authUser = delegate.getUser(realm, providerModel.getConfig(), username);
if (authUser != null) {
logger.debugf("User '%s' found with provider '%s'", username, providerModel.getProviderName());
return authUser;
}
} catch (AuthenticationProviderException ape) {
logger.warn(ape.getMessage(), ape);
}
}
logger.debugf("User '%s' not found with any provider", username);
return null;
}
public AuthProviderStatus validatePassword(UserModel user, String password) {
AuthenticationLinkModel authLink = realm.getAuthenticationLink(user);
if (authLink == null) {
// User not yet linked with any authenticationProvider. Find provider with biggest priority where he is and link
AuthUser authUser = getUser(user.getLoginName());
authLink = new AuthenticationLinkModel(authUser.getProviderName(), authUser.getId());
realm.setAuthenticationLink(user, authLink);
logger.infof("User '%s' linked with provider '%s'", authUser.getUsername(), authUser.getProviderName());
}
String providerName = authLink.getAuthProvider();
AuthenticationProviderModel providerModel = getConfiguredProviderModel(realm, providerName);
AuthenticationProvider delegate = getProvider(providerName);
if (delegate == null || providerModel == null) {
return AuthProviderStatus.FAILED;
}
try {
checkCorrectAuthLink(delegate, providerModel, authLink, user.getLoginName());
AuthProviderStatus currentResult = delegate.validatePassword(realm, providerModel.getConfig(), user.getLoginName(), password);
logger.debugf("Authentication provider '%s' finished with '%s' for authentication of '%s'", delegate.getName(), currentResult.toString(), user.getLoginName());
return currentResult;
} catch (AuthenticationProviderException ape) {
logger.warn(ape.getMessage(), ape);
return AuthProviderStatus.FAILED;
}
}
public boolean updatePassword(UserModel user, String password) throws AuthenticationProviderException {
AuthenticationLinkModel authLink = realm.getAuthenticationLink(user);
if (authLink == null) {
// Find provider with biggest priority where password update is supported. Then register user here and link him
List<AuthenticationProviderModel> configuredProviders = getConfiguredProviderModels(realm);
for (AuthenticationProviderModel providerModel : configuredProviders) {
if (providerModel.isPasswordUpdateSupported()) {
AuthenticationProvider delegate = getProvider(providerModel.getProviderName());
if (delegate != null) {
AuthUser authUser = delegate.getUser(realm, providerModel.getConfig(), user.getLoginName());
if (authUser != null) {
// Linking existing user supported just for "model" provider. In other cases throw exception
if (providerModel.getProviderName().equals(AuthenticationProviderModel.DEFAULT_PROVIDER.getProviderName())) {
authLink = new AuthenticationLinkModel(providerModel.getProviderName(), authUser.getId());
realm.setAuthenticationLink(user, authLink);
logger.infof("User '%s' linked with provider '%s'", authUser.getUsername(), authUser.getProviderName());
} else {
throw new AuthenticationProviderException("User " + authUser.getUsername() + " exists in provider "
+ authUser.getProviderName() + " but is not linked with model user");
}
} else {
String userIdInProvider = delegate.registerUser(realm, providerModel.getConfig(), user.getLoginName());
authLink = new AuthenticationLinkModel(providerModel.getProviderName(), userIdInProvider);
realm.setAuthenticationLink(user, authLink);
logger.infof("User '%s' registered in provider '%s' and linked", user.getLoginName(), providerModel.getProviderName());
}
break;
}
}
}
if (authLink == null) {
logger.warnf("No providers found where password update is supported for user '%s'", user.getLoginName());
return false;
}
}
String providerName = authLink.getAuthProvider();
AuthenticationProviderModel providerModel = getConfiguredProviderModel(realm, providerName);
if (providerModel == null) {
return false;
}
String username = user.getLoginName();
// Update just those, which support password update
if (providerModel.isPasswordUpdateSupported()) {
try {
AuthenticationProvider delegate = getProvider(providerName);
if (delegate == null) {
return false;
}
checkCorrectAuthLink(delegate, providerModel, authLink, username);
if (delegate.updateCredential(realm,providerModel.getConfig(), user.getLoginName(), password)) {
logger.debugf("Updated password in authentication provider '%s' for user '%s'", providerName, username);
return true;
} else {
logger.warnf("Password not updated in authentication provider '%s' for user '%s'", providerName, username);
return false;
}
} catch (AuthenticationProviderException ape) {
// Rethrow it to upper layer
logger.warn("Failed to update password: " + ape.getMessage());
throw ape;
}
} else {
logger.warnf("Skip password update for authentication provider '%s' for user '%s'", providerName, username);
return false;
}
}
private AuthenticationProvider getProvider(String providerName) {
AuthenticationProvider delegate = delegates.get(providerName);
if (delegate == null) {
logger.warnf("Provider '%s' not available on classpath", providerName);
}
return delegate;
}
private static List<AuthenticationProviderModel> getConfiguredProviderModels(RealmModel realm) {
List<AuthenticationProviderModel> configuredProviders = realm.getAuthenticationProviders();
// Use model based authentication of current realm by default
if (configuredProviders == null || configuredProviders.isEmpty()) {
configuredProviders = Collections.EMPTY_LIST;
logger.warnf("No authentication providers found");
}
return configuredProviders;
}
public static AuthenticationProviderModel getConfiguredProviderModel(RealmModel realm, String providerName) {
List<AuthenticationProviderModel> providers = getConfiguredProviderModels(realm);
for (AuthenticationProviderModel provider : providers) {
if (providerName.equals(provider.getProviderName())) {
return provider;
}
}
logger.warnf("Provider '%s' not configured in realm", providerName);
return null;
}
// Check if ID of linked AuthUser is same as expected ID from authenticationLink . It should catch the case when for example user "john" was deleted in LDAP
// and then user "john" has been created again, but it's actually different user with different ID
private void checkCorrectAuthLink(AuthenticationProvider authProvider, AuthenticationProviderModel providerModel,
AuthenticationLinkModel authLinkModel, String username) throws AuthenticationProviderException {
AuthUser authUser = authProvider.getUser(realm, providerModel.getConfig(), username);
if (authUser == null) {
throw new AuthenticationProviderException("User " + username + " not found in authentication provider " + providerModel.getProviderName());
}
String userExternalId = authUser.getId();
if (!userExternalId.equals(authLinkModel.getAuthUserId())) {
throw new AuthenticationProviderException("ID did not match! ID from provider: " + userExternalId + ", ID from authentication link: " + authLinkModel.getAuthUserId());
}
}
}
@@ -1 +0,0 @@
org.keycloak.authentication.AuthenticationSpi
@@ -1,84 +0,0 @@
package org.keycloak.authentication.model;
import java.util.Map;
import org.jboss.logging.Logger;
import org.keycloak.models.RealmModel;
import org.keycloak.models.UserCredentialModel;
import org.keycloak.models.UserModel;
import org.keycloak.models.utils.KeycloakModelUtils;
import org.keycloak.representations.idm.CredentialRepresentation;
import org.keycloak.authentication.AuthProviderStatus;
import org.keycloak.authentication.AuthUser;
import org.keycloak.authentication.AuthenticationProvider;
import org.keycloak.authentication.AuthenticationProviderException;
/**
* Authentication provider, which delegates calling of all methods to specified realm
*
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
*/
public abstract class AbstractModelAuthenticationProvider implements AuthenticationProvider {
private static final Logger logger = Logger.getLogger(AbstractModelAuthenticationProvider.class);
@Override
public AuthUser getUser(RealmModel currentRealm, Map<String, String> config, String username) throws AuthenticationProviderException {
RealmModel realm = getRealm(currentRealm, config);
UserModel user = KeycloakModelUtils.findUserByNameOrEmail(realm, username);
return user == null ? null : createAuthenticatedUserInstance(user);
}
@Override
public String registerUser(RealmModel currentRealm, Map<String, String> config, String username) throws AuthenticationProviderException {
RealmModel realm = getRealm(currentRealm, config);
UserModel user = currentRealm.addUser(username);
user.setEnabled(true);
return user.getId();
}
@Override
public AuthProviderStatus validatePassword(RealmModel currentRealm, Map<String, String> config, String username, String password) throws AuthenticationProviderException {
RealmModel realm = getRealm(currentRealm, config);
UserModel user = KeycloakModelUtils.findUserByNameOrEmail(realm, username);
boolean result = realm.validatePassword(user, password);
return result ? AuthProviderStatus.SUCCESS : AuthProviderStatus.INVALID_CREDENTIALS;
}
@Override
public boolean updateCredential(RealmModel currentRealm, Map<String, String> config, String username, String password) throws AuthenticationProviderException {
RealmModel realm = getRealm(currentRealm, config);
// Validate password policy
String error = realm.getPasswordPolicy().validate(password);
if (error != null) {
throw new AuthenticationProviderException(error);
}
UserModel user = realm.getUser(username);
if (user == null) {
logger.warnf("User '%s' doesn't exists. Skip password update", username);
return false;
}
UserCredentialModel cred = new UserCredentialModel();
cred.setType(CredentialRepresentation.PASSWORD);
cred.setValue(password);
realm.updateCredential(user, cred);
return true;
}
@Override
public void close() {
}
protected abstract RealmModel getRealm(RealmModel currentRealm, Map<String, String> config) throws AuthenticationProviderException;
protected AuthUser createAuthenticatedUserInstance(UserModel user) {
return new AuthUser(user.getId(), user.getLoginName(), getName())
.setName(user.getFirstName(), user.getLastName())
.setEmail(user.getEmail());
}
}
@@ -1,53 +0,0 @@
package org.keycloak.authentication.model;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import org.jboss.resteasy.spi.ResteasyProviderFactory;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.RealmModel;
import org.keycloak.authentication.AuthProviderConstants;
import org.keycloak.authentication.AuthenticationProviderException;
import org.keycloak.provider.ProviderSession;
/**
* AbstractModelAuthenticationProvider, which delegates authentication operations to different (external) realm
*
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
*/
public class ExternalModelAuthenticationProvider extends AbstractModelAuthenticationProvider {
public ExternalModelAuthenticationProvider(ProviderSession providerSession) {
}
@Override
public String getName() {
return AuthProviderConstants.PROVIDER_NAME_EXTERNAL_MODEL;
}
@Override
public List<String> getAvailableOptions() {
return Arrays.asList(AuthProviderConstants.EXTERNAL_REALM_ID);
}
@Override
public RealmModel getRealm(RealmModel currentRealm, Map<String, String> configuration) throws AuthenticationProviderException {
String realmId = configuration.get(AuthProviderConstants.EXTERNAL_REALM_ID);
if (realmId == null) {
throw new AuthenticationProviderException("Option '" + AuthProviderConstants.EXTERNAL_REALM_ID + "' not specified in configuration");
}
// TODO: This won't be needed when KeycloakSession is available from ProviderSession
KeycloakSession session = ResteasyProviderFactory.getContextData(KeycloakSession.class);
if (session == null) {
throw new AuthenticationProviderException("KeycloakSession not available");
}
RealmModel realm = session.getRealm(realmId);
if (realm == null) {
throw new AuthenticationProviderException("Realm with id '" + realmId + "' doesn't exists");
}
return realm;
}
}
@@ -1,32 +0,0 @@
package org.keycloak.authentication.model;
import org.keycloak.Config;
import org.keycloak.authentication.AuthProviderConstants;
import org.keycloak.authentication.AuthenticationProvider;
import org.keycloak.authentication.AuthenticationProviderFactory;
import org.keycloak.provider.ProviderSession;
/**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
*/
public class ExternalModelAuthenticationProviderFactory implements AuthenticationProviderFactory {
@Override
public AuthenticationProvider create(ProviderSession providerSession) {
return new ExternalModelAuthenticationProvider(providerSession);
}
@Override
public void init(Config.Scope config) {
}
@Override
public void close() {
}
@Override
public String getId() {
return AuthProviderConstants.PROVIDER_NAME_EXTERNAL_MODEL;
}
}
@@ -1,31 +0,0 @@
package org.keycloak.authentication.model;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.keycloak.models.RealmModel;
import org.keycloak.authentication.AuthProviderConstants;
/**
* AbstractModelAuthenticationProvider, which uses current realm to call operations on
*
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
*/
public class ModelAuthenticationProvider extends AbstractModelAuthenticationProvider {
@Override
public String getName() {
return AuthProviderConstants.PROVIDER_NAME_MODEL;
}
@Override
public List<String> getAvailableOptions() {
return Collections.EMPTY_LIST;
}
@Override
protected RealmModel getRealm(RealmModel currentRealm, Map<String, String> config) {
return currentRealm;
}
}
@@ -1,32 +0,0 @@
package org.keycloak.authentication.model;
import org.keycloak.Config;
import org.keycloak.authentication.AuthProviderConstants;
import org.keycloak.authentication.AuthenticationProvider;
import org.keycloak.authentication.AuthenticationProviderFactory;
import org.keycloak.provider.ProviderSession;
/**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
*/
public class ModelAuthenticationProviderFactory implements AuthenticationProviderFactory {
@Override
public AuthenticationProvider create(ProviderSession providerSession) {
return new ModelAuthenticationProvider();
}
@Override
public void init(Config.Scope config) {
}
@Override
public void close() {
}
@Override
public String getId() {
return AuthProviderConstants.PROVIDER_NAME_MODEL;
}
}
@@ -1,2 +0,0 @@
org.keycloak.authentication.model.ModelAuthenticationProviderFactory
org.keycloak.authentication.model.ExternalModelAuthenticationProviderFactory
@@ -1,130 +0,0 @@
package org.keycloak.authentication.picketlink;
import org.jboss.logging.Logger;
import org.keycloak.authentication.AuthProviderConstants;
import org.keycloak.authentication.AuthProviderStatus;
import org.keycloak.authentication.AuthUser;
import org.keycloak.authentication.AuthenticationProvider;
import org.keycloak.authentication.AuthenticationProviderException;
import org.keycloak.models.RealmModel;
import org.keycloak.picketlink.IdentityManagerProvider;
import org.picketlink.idm.IdentityManagementException;
import org.picketlink.idm.IdentityManager;
import org.picketlink.idm.credential.Credentials;
import org.picketlink.idm.credential.Password;
import org.picketlink.idm.credential.UsernamePasswordCredentials;
import org.picketlink.idm.model.basic.BasicModel;
import org.picketlink.idm.model.basic.User;
import java.util.Collections;
import java.util.List;
import java.util.Map;
/**
* AuthenticationProvider, which delegates authentication to picketlink
*
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
*/
public class PicketlinkAuthenticationProvider implements AuthenticationProvider {
private static final Logger logger = Logger.getLogger(PicketlinkAuthenticationProvider.class);
private final IdentityManagerProvider identityManagerProvider;
public PicketlinkAuthenticationProvider(IdentityManagerProvider identityManagerProvider) {
this.identityManagerProvider = identityManagerProvider;
}
@Override
public String getName() {
return AuthProviderConstants.PROVIDER_NAME_PICKETLINK;
}
@Override
public List<String> getAvailableOptions() {
return Collections.EMPTY_LIST;
}
@Override
public AuthUser getUser(RealmModel realm, Map<String, String> configuration, String username) throws AuthenticationProviderException {
IdentityManager identityManager = getIdentityManager(realm);
try {
User picketlinkUser = BasicModel.getUser(identityManager, username);
return picketlinkUser == null ? null : new AuthUser(picketlinkUser.getId(), picketlinkUser.getLoginName(), getName())
.setName(picketlinkUser.getFirstName(), picketlinkUser.getLastName())
.setEmail(picketlinkUser.getEmail())
.setProviderName(getName());
} catch (IdentityManagementException ie) {
throw convertIDMException(ie);
}
}
@Override
public String registerUser(RealmModel realm, Map<String, String> configuration, String username) throws AuthenticationProviderException {
IdentityManager identityManager = getIdentityManager(realm);
try {
User picketlinkUser = new User(username);
identityManager.add(picketlinkUser);
return picketlinkUser.getId();
} catch (IdentityManagementException ie) {
throw convertIDMException(ie);
}
}
@Override
public AuthProviderStatus validatePassword(RealmModel realm, Map<String, String> configuration, String username, String password) throws AuthenticationProviderException {
IdentityManager identityManager = getIdentityManager(realm);
try {
UsernamePasswordCredentials credential = new UsernamePasswordCredentials();
credential.setUsername(username);
credential.setPassword(new Password(password.toCharArray()));
identityManager.validateCredentials(credential);
if (credential.getStatus() == Credentials.Status.VALID) {
return AuthProviderStatus.SUCCESS;
} else {
return AuthProviderStatus.INVALID_CREDENTIALS;
}
} catch (IdentityManagementException ie) {
throw convertIDMException(ie);
}
}
@Override
public boolean updateCredential(RealmModel realm, Map<String, String> configuration, String username, String password) throws AuthenticationProviderException {
IdentityManager identityManager = getIdentityManager(realm);
try {
User picketlinkUser = BasicModel.getUser(identityManager, username);
if (picketlinkUser == null) {
logger.debugf("User '%s' doesn't exists. Skip password update", username);
return false;
}
identityManager.updateCredential(picketlinkUser, new Password(password.toCharArray()));
return true;
} catch (IdentityManagementException ie) {
throw convertIDMException(ie);
}
}
@Override
public void close() {
}
public IdentityManager getIdentityManager(RealmModel realm) throws AuthenticationProviderException {
return identityManagerProvider.getIdentityManager(realm);
}
private AuthenticationProviderException convertIDMException(IdentityManagementException ie) {
Throwable realCause = ie;
while (realCause.getCause() != null) {
realCause = realCause.getCause();
}
// Use the message from the realCause
return new AuthenticationProviderException(realCause.getMessage(), ie);
}
}
@@ -1,33 +0,0 @@
package org.keycloak.authentication.picketlink;
import org.keycloak.Config;
import org.keycloak.authentication.AuthProviderConstants;
import org.keycloak.authentication.AuthenticationProvider;
import org.keycloak.authentication.AuthenticationProviderFactory;
import org.keycloak.picketlink.IdentityManagerProvider;
import org.keycloak.provider.ProviderSession;
/**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
*/
public class PicketlinkAuthenticationProviderFactory implements AuthenticationProviderFactory {
@Override
public AuthenticationProvider create(ProviderSession providerSession) {
return new PicketlinkAuthenticationProvider(providerSession.getProvider(IdentityManagerProvider.class));
}
@Override
public void init(Config.Scope config) {
}
@Override
public void close() {
}
@Override
public String getId() {
return AuthProviderConstants.PROVIDER_NAME_PICKETLINK;
}
}
@@ -1 +0,0 @@
org.keycloak.authentication.picketlink.PicketlinkAuthenticationProviderFactory
+39
View File
@@ -0,0 +1,39 @@
<?xml version="1.0"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<parent>
<artifactId>keycloak-parent</artifactId>
<groupId>org.keycloak</groupId>
<version>1.0-beta-4</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>keycloak-connections-jpa</artifactId>
<name>Keycloak Connections JPA</name>
<description/>
<dependencies>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-core</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-model-api</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.0-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${hibernate.entitymanager.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
@@ -0,0 +1,26 @@
package org.keycloak.connections.jpa;
import javax.persistence.EntityManager;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public class DefaultJpaConnectionProvider implements JpaConnectionProvider {
private final EntityManager em;
public DefaultJpaConnectionProvider(EntityManager em) {
this.em = em;
}
@Override
public EntityManager getEntityManager() {
return em;
}
@Override
public void close() {
em.close();
}
}
@@ -0,0 +1,102 @@
package org.keycloak.connections.jpa;
import org.hibernate.ejb.AvailableSettings;
import org.keycloak.Config;
import org.keycloak.models.KeycloakSession;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public class DefaultJpaConnectionProviderFactory implements JpaConnectionProviderFactory {
private volatile EntityManagerFactory emf;
private Config.Scope config;
@Override
public JpaConnectionProvider create(KeycloakSession session) {
lazyInit();
EntityManager em = emf.createEntityManager();
em = PersistenceExceptionConverter.create(em);
session.getTransaction().enlist(new JpaKeycloakTransaction(em));
return new DefaultJpaConnectionProvider(em);
}
@Override
public void close() {
if (emf != null) {
emf.close();
}
}
@Override
public String getId() {
return "default";
}
@Override
public void init(Config.Scope config) {
this.config = config;
}
private void lazyInit() {
if (emf == null) {
synchronized (this) {
if (emf == null) {
String unitName = config.get("unitName");
Map<String, Object> properties = new HashMap<String, Object>();
// Only load config from keycloak-server.json if unitName is not specified
if (unitName == null) {
unitName = "keycloak-default";
String dataSource = config.get("dataSource");
if (dataSource != null) {
if (config.getBoolean("jta", false)) {
properties.put(AvailableSettings.JTA_DATASOURCE, dataSource);
} else {
properties.put(AvailableSettings.NON_JTA_DATASOURCE, dataSource);
}
} else {
properties.put(AvailableSettings.JDBC_URL, config.get("url"));
properties.put(AvailableSettings.JDBC_DRIVER, config.get("driver"));
String driverDialect = config.get("driverDialect");
if (driverDialect != null && driverDialect.length() > 0) {
properties.put("hibernate.dialect", driverDialect);
}
String user = config.get("user");
if (user != null) {
properties.put(AvailableSettings.JDBC_USER, user);
}
String password = config.get("password");
if (password != null) {
properties.put(AvailableSettings.JDBC_PASSWORD, password);
}
}
String databaseSchema = config.get("databaseSchema", "validate");
if (databaseSchema != null) {
properties.put("hibernate.hbm2ddl.auto", databaseSchema);
}
properties.put("hibernate.show_sql", config.getBoolean("showSql", false));
properties.put("hibernate.format_sql", config.getBoolean("formatSql", true));
}
emf = Persistence.createEntityManagerFactory(unitName, properties);
}
}
}
}
}
@@ -0,0 +1,14 @@
package org.keycloak.connections.jpa;
import org.keycloak.provider.Provider;
import javax.persistence.EntityManager;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public interface JpaConnectionProvider extends Provider {
EntityManager getEntityManager();
}
@@ -0,0 +1,9 @@
package org.keycloak.connections.jpa;
import org.keycloak.provider.ProviderFactory;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public interface JpaConnectionProviderFactory extends ProviderFactory<JpaConnectionProvider> {
}
@@ -1,4 +1,4 @@
package org.keycloak.authentication;
package org.keycloak.connections.jpa;
import org.keycloak.provider.Provider;
import org.keycloak.provider.ProviderFactory;
@@ -7,21 +7,21 @@ import org.keycloak.provider.Spi;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public class AuthenticationSpi implements Spi {
public class JpaConnectionSpi implements Spi {
@Override
public String getName() {
return "authentication";
return "connectionsJpa";
}
@Override
public Class<? extends Provider> getProviderClass() {
return AuthenticationProvider.class;
return JpaConnectionProvider.class;
}
@Override
public Class<? extends ProviderFactory> getProviderFactoryClass() {
return AuthenticationProviderFactory.class;
return JpaConnectionProviderFactory.class;
}
}
@@ -0,0 +1,53 @@
package org.keycloak.connections.jpa;
import org.keycloak.models.KeycloakTransaction;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceException;
/**
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $
*/
public class JpaKeycloakTransaction implements KeycloakTransaction {
protected EntityManager em;
public JpaKeycloakTransaction(EntityManager em) {
this.em = em;
}
@Override
public void begin() {
em.getTransaction().begin();
}
@Override
public void commit() {
try {
em.getTransaction().commit();
} catch (PersistenceException e) {
throw PersistenceExceptionConverter.convert(e.getCause() != null ? e.getCause() : e);
}
}
@Override
public void rollback() {
em.getTransaction().rollback();
}
@Override
public void setRollbackOnly() {
em.getTransaction().setRollbackOnly();
}
@Override
public boolean getRollbackOnly() {
return em.getTransaction().getRollbackOnly();
}
@Override
public boolean isActive() {
return em.getTransaction().isActive();
}
}
@@ -0,0 +1,48 @@
package org.keycloak.connections.jpa;
import org.hibernate.exception.ConstraintViolationException;
import org.keycloak.models.ModelDuplicateException;
import org.keycloak.models.ModelException;
import javax.persistence.EntityExistsException;
import javax.persistence.EntityManager;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public class PersistenceExceptionConverter implements InvocationHandler {
private EntityManager em;
public static EntityManager create(EntityManager em) {
return (EntityManager) Proxy.newProxyInstance(EntityManager.class.getClassLoader(), new Class[]{EntityManager.class}, new PersistenceExceptionConverter(em));
}
private PersistenceExceptionConverter(EntityManager em) {
this.em = em;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
try {
return method.invoke(em, args);
} catch (InvocationTargetException e) {
throw convert(e.getCause());
}
}
public static ModelException convert(Throwable t) {
if (t.getCause() != null && t.getCause() instanceof ConstraintViolationException) {
throw new ModelDuplicateException(t);
} if (t instanceof EntityExistsException) {
throw new ModelDuplicateException(t);
} else {
throw new ModelException(t);
}
}
}
@@ -0,0 +1,35 @@
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0">
<persistence-unit name="keycloak-default" transaction-type="RESOURCE_LOCAL">
<class>org.keycloak.models.jpa.entities.ApplicationEntity</class>
<class>org.keycloak.models.jpa.entities.CredentialEntity</class>
<class>org.keycloak.models.jpa.entities.OAuthClientEntity</class>
<class>org.keycloak.models.jpa.entities.RealmEntity</class>
<class>org.keycloak.models.jpa.entities.RequiredCredentialEntity</class>
<class>org.keycloak.models.jpa.entities.UserFederationProviderEntity</class>
<class>org.keycloak.models.jpa.entities.RoleEntity</class>
<class>org.keycloak.models.jpa.entities.SocialLinkEntity</class>
<class>org.keycloak.models.jpa.entities.UserEntity</class>
<class>org.keycloak.models.jpa.entities.UserRequiredActionEntity</class>
<class>org.keycloak.models.jpa.entities.UserAttributeEntity</class>
<class>org.keycloak.models.jpa.entities.UserRoleMappingEntity</class>
<class>org.keycloak.models.jpa.entities.ScopeMappingEntity</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.UserSessionEntity</class>
<class>org.keycloak.models.sessions.jpa.entities.UsernameLoginFailureEntity</class>
<!-- JpaAuditProvider -->
<class>org.keycloak.audit.jpa.EventEntity</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<property name="jboss.as.jpa.managed" value="false"/>
</properties>
</persistence-unit>
</persistence>
@@ -0,0 +1 @@
org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory
@@ -0,0 +1 @@
org.keycloak.connections.jpa.JpaConnectionSpi
+37
View File
@@ -0,0 +1,37 @@
<?xml version="1.0"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<parent>
<artifactId>keycloak-parent</artifactId>
<groupId>org.keycloak</groupId>
<version>1.0-beta-4</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>keycloak-connections-mongo</artifactId>
<name>Keycloak Connections Mongo</name>
<description/>
<dependencies>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-core</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-model-api</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.jboss.logging</groupId>
<artifactId>jboss-logging</artifactId>
</dependency>
</dependencies>
</project>
@@ -0,0 +1,111 @@
package org.keycloak.connections.mongo;
import com.mongodb.DB;
import com.mongodb.MongoClient;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
import org.jboss.logging.Logger;
import org.keycloak.Config;
import org.keycloak.connections.mongo.api.MongoStore;
import org.keycloak.connections.mongo.impl.MongoStoreImpl;
import org.keycloak.connections.mongo.impl.context.TransactionMongoStoreInvocationContext;
import org.keycloak.models.KeycloakSession;
import java.util.Collections;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public class DefaultMongoConnectionFactoryProvider implements MongoConnectionProviderFactory {
// TODO Make configurable
private String[] entities = new String[]{
"org.keycloak.models.mongo.keycloak.entities.MongoRealmEntity",
"org.keycloak.models.mongo.keycloak.entities.MongoUserEntity",
"org.keycloak.models.mongo.keycloak.entities.MongoRoleEntity",
"org.keycloak.models.entities.RequiredCredentialEntity",
"org.keycloak.models.entities.CredentialEntity",
"org.keycloak.models.entities.SocialLinkEntity",
"org.keycloak.models.mongo.keycloak.entities.MongoApplicationEntity",
"org.keycloak.models.mongo.keycloak.entities.MongoOAuthClientEntity",
"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"
};
private static final Logger logger = Logger.getLogger(DefaultMongoConnectionFactoryProvider.class);
private volatile MongoClient client;
private MongoStore mongoStore;
private DB db;
private Config.Scope config;
@Override
public MongoConnectionProvider create(KeycloakSession session) {
lazyInit();
TransactionMongoStoreInvocationContext invocationContext = new TransactionMongoStoreInvocationContext(mongoStore);
session.getTransaction().enlist(new MongoKeycloakTransaction(invocationContext));
return new DefaultMongoConnectionProvider(db, mongoStore, invocationContext);
}
@Override
public void init(Config.Scope config) {
this.config = config;
}
private void lazyInit() {
if (client == null) {
synchronized (this) {
if (client == null) {
try {
String host = config.get("host", ServerAddress.defaultHost());
int port = config.getInt("port", ServerAddress.defaultPort());
String dbName = config.get("db", "keycloak");
boolean clearOnStartup = config.getBoolean("clearOnStartup", false);
String user = config.get("user");
String password = config.get("password");
if (user != null && password != null) {
MongoCredential credential = MongoCredential.createMongoCRCredential(user, dbName, password.toCharArray());
client = new MongoClient(new ServerAddress(host, port), Collections.singletonList(credential));
} else {
client = new MongoClient(host, port);
}
this.db = client.getDB(dbName);
this.mongoStore = new MongoStoreImpl(db, clearOnStartup, getManagedEntities());
logger.infof("Initialized mongo model. host: %s, port: %d, db: %s, clearOnStartup: %b", host, port, dbName, clearOnStartup);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
}
}
private Class[] getManagedEntities() throws ClassNotFoundException {
Class[] entityClasses = new Class[entities.length];
for (int i = 0; i < entities.length; i++) {
entityClasses[i] = Thread.currentThread().getContextClassLoader().loadClass(entities[i]);
}
return entityClasses;
}
@Override
public void close() {
if (client != null) {
client.close();
}
}
@Override
public String getId() {
return "default";
}
}
@@ -0,0 +1,41 @@
package org.keycloak.connections.mongo;
import com.mongodb.DB;
import org.keycloak.connections.mongo.api.MongoStore;
import org.keycloak.connections.mongo.api.context.MongoStoreInvocationContext;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public class DefaultMongoConnectionProvider implements MongoConnectionProvider {
private DB db;
private MongoStore mongoStore;
private MongoStoreInvocationContext invocationContext;
public DefaultMongoConnectionProvider(DB db, MongoStore mongoStore, MongoStoreInvocationContext invocationContext) {
this.db = db;
this.mongoStore = mongoStore;
this.invocationContext = invocationContext;
}
@Override
public DB getDB() {
return db;
}
@Override
public MongoStore getMongoStore() {
return mongoStore;
}
@Override
public MongoStoreInvocationContext getInvocationContext() {
return invocationContext;
}
@Override
public void close() {
}
}
@@ -0,0 +1,19 @@
package org.keycloak.connections.mongo;
import com.mongodb.DB;
import org.keycloak.connections.mongo.api.MongoStore;
import org.keycloak.connections.mongo.api.context.MongoStoreInvocationContext;
import org.keycloak.provider.Provider;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public interface MongoConnectionProvider extends Provider {
DB getDB();
MongoStore getMongoStore();
MongoStoreInvocationContext getInvocationContext();
}
@@ -0,0 +1,9 @@
package org.keycloak.connections.mongo;
import org.keycloak.provider.ProviderFactory;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public interface MongoConnectionProviderFactory extends ProviderFactory<MongoConnectionProvider> {
}
@@ -0,0 +1,27 @@
package org.keycloak.connections.mongo;
import org.keycloak.provider.Provider;
import org.keycloak.provider.ProviderFactory;
import org.keycloak.provider.Spi;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public class MongoConnectionSpi implements Spi {
@Override
public String getName() {
return "connectionsMongo";
}
@Override
public Class<? extends Provider> getProviderClass() {
return MongoConnectionProvider.class;
}
@Override
public Class<? extends ProviderFactory> getProviderFactoryClass() {
return MongoConnectionProviderFactory.class;
}
}
@@ -1,9 +1,9 @@
package org.keycloak.models.mongo.keycloak.adapters;
package org.keycloak.connections.mongo;
import com.mongodb.MongoException;
import org.keycloak.connections.mongo.api.context.MongoStoreInvocationContext;
import org.keycloak.connections.mongo.impl.MongoStoreImpl;
import org.keycloak.models.KeycloakTransaction;
import org.keycloak.models.mongo.api.context.MongoStoreInvocationContext;
import org.keycloak.models.mongo.impl.MongoStoreImpl;
/**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
@@ -1,4 +1,4 @@
package org.keycloak.models.mongo.api;
package org.keycloak.connections.mongo.api;
import java.lang.annotation.Documented;
import java.lang.annotation.Inherited;
@@ -1,4 +1,4 @@
package org.keycloak.models.mongo.api;
package org.keycloak.connections.mongo.api;
/**
* Base interface for object, which is persisted in Mongo
@@ -1,4 +1,4 @@
package org.keycloak.models.mongo.api;
package org.keycloak.connections.mongo.api;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
@@ -1,6 +1,6 @@
package org.keycloak.models.mongo.api;
package org.keycloak.connections.mongo.api;
import org.keycloak.models.mongo.api.context.MongoStoreInvocationContext;
import org.keycloak.connections.mongo.api.context.MongoStoreInvocationContext;
/**
* Entity with Id
@@ -1,4 +1,4 @@
package org.keycloak.models.mongo.api;
package org.keycloak.connections.mongo.api;
import java.lang.annotation.Documented;
import java.lang.annotation.Inherited;
@@ -1,4 +1,4 @@
package org.keycloak.models.mongo.api;
package org.keycloak.connections.mongo.api;
import java.lang.annotation.Documented;
import java.lang.annotation.Inherited;
@@ -1,7 +1,7 @@
package org.keycloak.models.mongo.api;
package org.keycloak.connections.mongo.api;
import com.mongodb.DBObject;
import org.keycloak.models.mongo.api.context.MongoStoreInvocationContext;
import org.keycloak.connections.mongo.api.context.MongoStoreInvocationContext;
import java.util.List;
@@ -31,6 +31,10 @@ public interface MongoStore {
<T extends MongoIdentifiableEntity> List<T> loadEntities(Class<T> type, DBObject query, MongoStoreInvocationContext context);
<T extends MongoIdentifiableEntity> List<T> loadEntities(Class<T> type, DBObject query, DBObject sort, int firstResult, int maxResults, MongoStoreInvocationContext context);
<T extends MongoIdentifiableEntity> int countEntities(Class<T> type, DBObject query, MongoStoreInvocationContext context);
boolean removeEntity(MongoIdentifiableEntity entity, MongoStoreInvocationContext context);
boolean removeEntity(Class<? extends MongoIdentifiableEntity> type, String id, MongoStoreInvocationContext context);
@@ -41,8 +45,4 @@ public interface MongoStore {
<S> boolean pullItemFromList(MongoIdentifiableEntity entity, String listPropertyName, S itemToPull, MongoStoreInvocationContext context);
/**
* Completely remove all data from DB
*/
void removeAllEntities();
}
@@ -1,7 +1,7 @@
package org.keycloak.models.mongo.api.context;
package org.keycloak.connections.mongo.api.context;
import org.keycloak.models.mongo.api.MongoIdentifiableEntity;
import org.keycloak.models.mongo.api.MongoStore;
import org.keycloak.connections.mongo.api.MongoIdentifiableEntity;
import org.keycloak.connections.mongo.api.MongoStore;
/**
* Context, which provides callback methods to be invoked by MongoStore
@@ -1,4 +1,4 @@
package org.keycloak.models.mongo.api.context;
package org.keycloak.connections.mongo.api.context;
/**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
@@ -1,4 +1,4 @@
package org.keycloak.models.mongo.api.types;
package org.keycloak.connections.mongo.api.types;
/**
* SPI object to convert object from application type to database type and vice versa. Shouldn't be directly used by application.
@@ -1,4 +1,4 @@
package org.keycloak.models.mongo.api.types;
package org.keycloak.connections.mongo.api.types;
import java.util.List;
@@ -1,4 +1,4 @@
package org.keycloak.models.mongo.api.types;
package org.keycloak.connections.mongo.api.types;
import java.util.HashMap;
import java.util.Map;
@@ -1,6 +1,5 @@
package org.keycloak.models.mongo.impl;
package org.keycloak.connections.mongo.impl;
import org.keycloak.models.mongo.api.MongoEntity;
import org.keycloak.models.utils.reflection.Property;
import java.util.Collection;
@@ -1,4 +1,4 @@
package org.keycloak.models.mongo.impl;
package org.keycloak.connections.mongo.impl;
import com.mongodb.BasicDBList;
import com.mongodb.BasicDBObject;
@@ -8,31 +8,29 @@ import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.MongoException;
import org.jboss.logging.Logger;
import org.keycloak.models.ModelException;
import org.keycloak.connections.mongo.api.MongoCollection;
import org.keycloak.connections.mongo.api.MongoEntity;
import org.keycloak.connections.mongo.api.MongoIdentifiableEntity;
import org.keycloak.connections.mongo.api.MongoIndex;
import org.keycloak.connections.mongo.api.MongoIndexes;
import org.keycloak.connections.mongo.api.MongoStore;
import org.keycloak.connections.mongo.api.context.MongoStoreInvocationContext;
import org.keycloak.connections.mongo.api.context.MongoTask;
import org.keycloak.connections.mongo.api.types.Mapper;
import org.keycloak.connections.mongo.api.types.MapperContext;
import org.keycloak.connections.mongo.api.types.MapperRegistry;
import org.keycloak.connections.mongo.impl.types.BasicDBListMapper;
import org.keycloak.connections.mongo.impl.types.BasicDBObjectMapper;
import org.keycloak.connections.mongo.impl.types.BasicDBObjectToMapMapper;
import org.keycloak.connections.mongo.impl.types.EnumToStringMapper;
import org.keycloak.connections.mongo.impl.types.ListMapper;
import org.keycloak.connections.mongo.impl.types.MapMapper;
import org.keycloak.connections.mongo.impl.types.MongoEntityMapper;
import org.keycloak.connections.mongo.impl.types.SimpleMapper;
import org.keycloak.connections.mongo.impl.types.StringToEnumMapper;
import org.keycloak.models.ModelDuplicateException;
import org.keycloak.models.mongo.api.MongoCollection;
import org.keycloak.models.mongo.api.MongoEntity;
import org.keycloak.models.mongo.api.MongoField;
import org.keycloak.models.mongo.api.MongoIdentifiableEntity;
import org.keycloak.models.mongo.api.MongoIndex;
import org.keycloak.models.mongo.api.MongoIndexes;
import org.keycloak.models.mongo.api.MongoStore;
import org.keycloak.models.mongo.api.context.MongoStoreInvocationContext;
import org.keycloak.models.mongo.api.context.MongoTask;
import org.keycloak.models.mongo.api.types.Mapper;
import org.keycloak.models.mongo.api.types.MapperContext;
import org.keycloak.models.mongo.api.types.MapperRegistry;
import org.keycloak.models.mongo.impl.types.BasicDBListMapper;
import org.keycloak.models.mongo.impl.types.BasicDBObjectMapper;
import org.keycloak.models.mongo.impl.types.BasicDBObjectToMapMapper;
import org.keycloak.models.mongo.impl.types.EnumToStringMapper;
import org.keycloak.models.mongo.impl.types.ListMapper;
import org.keycloak.models.mongo.impl.types.MapMapper;
import org.keycloak.models.mongo.impl.types.MongoEntityMapper;
import org.keycloak.models.mongo.impl.types.SimpleMapper;
import org.keycloak.models.mongo.impl.types.StringToEnumMapper;
import org.keycloak.models.ModelException;
import org.keycloak.models.utils.KeycloakModelUtils;
import org.keycloak.models.utils.reflection.AnnotatedPropertyCriteria;
import org.keycloak.models.utils.reflection.Property;
import org.keycloak.models.utils.reflection.PropertyQueries;
@@ -41,7 +39,6 @@ import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
@@ -283,6 +280,35 @@ public class MongoStoreImpl implements MongoStore {
return convertCursor(type, cursor, context);
}
@Override
public <T extends MongoIdentifiableEntity> List<T> loadEntities(Class<T> type, DBObject query, DBObject sort, int firstResult, int maxResults, MongoStoreInvocationContext context) {
// First we should execute all pending tasks before searching DB
context.beforeDBSearch(type);
DBCollection dbCollection = getDBCollectionForType(type);
DBCursor cursor = dbCollection.find(query);
if (firstResult != -1) {
cursor.skip(firstResult);
}
if (maxResults != -1) {
cursor.limit(maxResults);
}
if (sort != null) {
cursor.sort(sort);
}
return convertCursor(type, cursor, context);
}
public <T extends MongoIdentifiableEntity> int countEntities(Class<T> type, DBObject query, MongoStoreInvocationContext context) {
context.beforeDBSearch(type);
DBCollection dbCollection = getDBCollectionForType(type);
Long count = dbCollection.count(query);
// For now, assume that int is sufficient
return count.intValue();
}
@Override
public boolean removeEntity(MongoIdentifiableEntity entity, MongoStoreInvocationContext context) {
@@ -417,13 +443,6 @@ public class MongoStoreImpl implements MongoStore {
}
}
@Override
public void removeAllEntities() {
Set<Class<?>> managedTypes = this.entityInfoCache.keySet();
Class<? extends MongoEntity>[] arrayTemplate = (Class<? extends MongoEntity>[])new Class<?>[0];
this.clearManagedCollections(managedTypes.toArray(arrayTemplate));
}
// Possibility to add user-defined mappers
public void addAppObjectConverter(Mapper<?, ?> mapper) {
mapperRegistry.addAppObjectMapper(mapper);
@@ -1,10 +1,9 @@
package org.keycloak.models.mongo.impl.context;
package org.keycloak.connections.mongo.impl.context;
import org.keycloak.models.mongo.api.MongoEntity;
import org.keycloak.models.mongo.api.MongoIdentifiableEntity;
import org.keycloak.models.mongo.api.MongoStore;
import org.keycloak.models.mongo.api.context.MongoStoreInvocationContext;
import org.keycloak.models.mongo.api.context.MongoTask;
import org.keycloak.connections.mongo.api.MongoIdentifiableEntity;
import org.keycloak.connections.mongo.api.MongoStore;
import org.keycloak.connections.mongo.api.context.MongoStoreInvocationContext;
import org.keycloak.connections.mongo.api.context.MongoTask;
/**
* Context, which is not doing any postponing of tasks and does not cache anything
@@ -1,4 +1,9 @@
package org.keycloak.models.mongo.impl.context;
package org.keycloak.connections.mongo.impl.context;
import org.keycloak.connections.mongo.api.MongoIdentifiableEntity;
import org.keycloak.connections.mongo.api.MongoStore;
import org.keycloak.connections.mongo.api.context.MongoStoreInvocationContext;
import org.keycloak.connections.mongo.api.context.MongoTask;
import java.util.HashMap;
import java.util.HashSet;
@@ -6,11 +11,6 @@ import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
import org.keycloak.models.mongo.api.MongoIdentifiableEntity;
import org.keycloak.models.mongo.api.MongoStore;
import org.keycloak.models.mongo.api.context.MongoStoreInvocationContext;
import org.keycloak.models.mongo.api.context.MongoTask;
/**
* Invocation context, which has some very basic support for transactions, and is able to cache loaded objects.
* It always execute all pending update tasks before start searching for other objects
@@ -1,9 +1,9 @@
package org.keycloak.models.mongo.impl.types;
package org.keycloak.connections.mongo.impl.types;
import com.mongodb.BasicDBList;
import org.keycloak.models.mongo.api.types.Mapper;
import org.keycloak.models.mongo.api.types.MapperContext;
import org.keycloak.models.mongo.api.types.MapperRegistry;
import org.keycloak.connections.mongo.api.types.Mapper;
import org.keycloak.connections.mongo.api.types.MapperContext;
import org.keycloak.connections.mongo.api.types.MapperRegistry;
import java.util.ArrayList;
import java.util.List;
@@ -1,22 +1,21 @@
package org.keycloak.models.mongo.impl.types;
package org.keycloak.connections.mongo.impl.types;
import com.mongodb.BasicDBObject;
import org.jboss.logging.Logger;
import org.keycloak.connections.mongo.api.MongoIdentifiableEntity;
import org.keycloak.connections.mongo.api.types.Mapper;
import org.keycloak.connections.mongo.api.types.MapperContext;
import org.keycloak.connections.mongo.api.types.MapperRegistry;
import org.keycloak.connections.mongo.impl.EntityInfo;
import org.keycloak.connections.mongo.impl.MongoStoreImpl;
import org.keycloak.models.utils.reflection.Property;
import org.keycloak.models.utils.reflection.Types;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import com.mongodb.BasicDBObject;
import org.jboss.logging.Logger;
import org.keycloak.models.mongo.api.MongoEntity;
import org.keycloak.models.mongo.api.MongoIdentifiableEntity;
import org.keycloak.models.mongo.api.types.Mapper;
import org.keycloak.models.mongo.api.types.MapperContext;
import org.keycloak.models.mongo.api.types.MapperRegistry;
import org.keycloak.models.mongo.impl.MongoStoreImpl;
import org.keycloak.models.mongo.impl.EntityInfo;
import org.keycloak.models.utils.reflection.Property;
import org.keycloak.models.utils.reflection.Types;
/**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
*/
@@ -1,12 +1,12 @@
package org.keycloak.models.mongo.impl.types;
package org.keycloak.connections.mongo.impl.types;
import com.mongodb.BasicDBObject;
import org.keycloak.connections.mongo.api.types.Mapper;
import org.keycloak.connections.mongo.api.types.MapperContext;
import java.util.HashMap;
import java.util.Map;
import com.mongodb.BasicDBObject;
import org.keycloak.models.mongo.api.types.Mapper;
import org.keycloak.models.mongo.api.types.MapperContext;
/**
* For now, there is support just for convert to Map<String, String>
*
@@ -1,7 +1,7 @@
package org.keycloak.models.mongo.impl.types;
package org.keycloak.connections.mongo.impl.types;
import org.keycloak.models.mongo.api.types.Mapper;
import org.keycloak.models.mongo.api.types.MapperContext;
import org.keycloak.connections.mongo.api.types.Mapper;
import org.keycloak.connections.mongo.api.types.MapperContext;
/**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
@@ -1,9 +1,9 @@
package org.keycloak.models.mongo.impl.types;
package org.keycloak.connections.mongo.impl.types;
import com.mongodb.BasicDBList;
import org.keycloak.models.mongo.api.types.Mapper;
import org.keycloak.models.mongo.api.types.MapperContext;
import org.keycloak.models.mongo.api.types.MapperRegistry;
import org.keycloak.connections.mongo.api.types.Mapper;
import org.keycloak.connections.mongo.api.types.MapperContext;
import org.keycloak.connections.mongo.api.types.MapperRegistry;
import java.util.List;
@@ -1,12 +1,12 @@
package org.keycloak.models.mongo.impl.types;
package org.keycloak.connections.mongo.impl.types;
import com.mongodb.BasicDBObject;
import org.keycloak.connections.mongo.api.types.Mapper;
import org.keycloak.connections.mongo.api.types.MapperContext;
import java.util.Map;
import java.util.Set;
import com.mongodb.BasicDBObject;
import org.keycloak.models.mongo.api.types.Mapper;
import org.keycloak.models.mongo.api.types.MapperContext;
/**
* For now, we support just convert from Map<String, String>
*
@@ -1,11 +1,12 @@
package org.keycloak.models.mongo.impl.types;
package org.keycloak.connections.mongo.impl.types;
import com.mongodb.BasicDBObject;
import org.keycloak.models.mongo.api.types.Mapper;
import org.keycloak.models.mongo.api.types.MapperContext;
import org.keycloak.models.mongo.api.types.MapperRegistry;
import org.keycloak.models.mongo.impl.MongoStoreImpl;
import org.keycloak.models.mongo.impl.EntityInfo;
import org.keycloak.connections.mongo.api.MongoIdentifiableEntity;
import org.keycloak.connections.mongo.api.types.Mapper;
import org.keycloak.connections.mongo.api.types.MapperContext;
import org.keycloak.connections.mongo.api.types.MapperRegistry;
import org.keycloak.connections.mongo.impl.EntityInfo;
import org.keycloak.connections.mongo.impl.MongoStoreImpl;
import org.keycloak.models.utils.reflection.Property;
import java.util.Collection;
@@ -38,7 +39,7 @@ public class MongoEntityMapper<T> implements Mapper<T, BasicDBObject> {
String propName = property.getName();
// Ignore "id" property
if (!"id".equals(propName)) {
if (!"id".equals(propName) || !(applicationObject instanceof MongoIdentifiableEntity)) {
Object propValue = property.getValue(applicationObject);
if (propValue != null) {
Object dbValue = propValue == null ? null : mapperRegistry.convertApplicationObjectToDBObject(propValue, Object.class);
@@ -1,7 +1,7 @@
package org.keycloak.models.mongo.impl.types;
package org.keycloak.connections.mongo.impl.types;
import org.keycloak.models.mongo.api.types.Mapper;
import org.keycloak.models.mongo.api.types.MapperContext;
import org.keycloak.connections.mongo.api.types.Mapper;
import org.keycloak.connections.mongo.api.types.MapperContext;
/**
* Just returns input
@@ -1,7 +1,7 @@
package org.keycloak.models.mongo.impl.types;
package org.keycloak.connections.mongo.impl.types;
import org.keycloak.models.mongo.api.types.Mapper;
import org.keycloak.models.mongo.api.types.MapperContext;
import org.keycloak.connections.mongo.api.types.Mapper;
import org.keycloak.connections.mongo.api.types.MapperContext;
/**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
@@ -0,0 +1 @@
org.keycloak.connections.mongo.DefaultMongoConnectionFactoryProvider
@@ -0,0 +1 @@
org.keycloak.connections.mongo.MongoConnectionSpi
+31
View File
@@ -0,0 +1,31 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<parent>
<artifactId>keycloak-parent</artifactId>
<groupId>org.keycloak</groupId>
<version>1.0-beta-4</version>
</parent>
<name>Connections Parent</name>
<description/>
<modelVersion>4.0.0</modelVersion>
<artifactId>keycloak-connections-pom</artifactId>
<packaging>pom</packaging>
<modules>
<module>jpa</module>
<module>mongo</module>
</modules>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
</project>
+1 -1
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>keycloak-parent</artifactId>
<groupId>org.keycloak</groupId>
<version>1.0-beta-1</version>
<version>1.0-beta-4</version>
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
+1 -1
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>keycloak-parent</artifactId>
<groupId>org.keycloak</groupId>
<version>1.0-beta-1</version>
<version>1.0-beta-4</version>
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
@@ -19,6 +19,7 @@ public class AbstractOAuthClient {
protected String authUrl;
protected String codeUrl;
protected String refreshUrl;
protected boolean relativeUrls;
protected String scope;
protected String stateCookieName = OAUTH_TOKEN_REQUEST_STATE;
protected String stateCookiePath;
@@ -100,6 +101,14 @@ public class AbstractOAuthClient {
this.publicClient = publicClient;
}
public boolean isRelativeUrls() {
return relativeUrls;
}
public void setRelativeUrls(boolean relativeUrls) {
this.relativeUrls = relativeUrls;
}
protected String stripOauthParametersFromRedirect(String uri) {
KeycloakUriBuilder builder = KeycloakUriBuilder.fromUri(uri)
.replaceQueryParam(OAuth2Constants.CODE, null)
@@ -1,4 +1,4 @@
package org.keycloak.services;
package org.keycloak;
/**
* Information about the client connection
+6 -1
View File
@@ -16,7 +16,12 @@ public class Config {
}
public static String getProvider(String spi) {
return configProvider.getProvider(spi);
String provider = configProvider.getProvider(spi);
if (provider == null || provider.trim().equals("")) {
return null;
} else {
return provider;
}
}
public static Scope scope(String... scope) {
@@ -17,7 +17,12 @@ public class RSATokenVerifier {
}
public static AccessToken verifyToken(String tokenString, PublicKey realmKey, String realm, boolean checkActive) throws VerificationException {
JWSInput input = new JWSInput(tokenString);
JWSInput input = null;
try {
input = new JWSInput(tokenString);
} catch (Exception e) {
throw new VerificationException("Couldn't parse token", e);
}
if (!isPublicKeyValid(input, realmKey)) throw new VerificationException("Invalid token signature.");
AccessToken token;
@@ -0,0 +1,43 @@
package org.keycloak.enums;
import org.keycloak.ClientConnection;
import java.net.InetAddress;
import java.net.UnknownHostException;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public enum SslRequired {
ALL,
EXTERNAL,
NONE;
public boolean isRequired(ClientConnection connection) {
return isRequired(connection.getRemoteAddr());
}
public boolean isRequired(String address) {
switch (this) {
case ALL:
return true;
case NONE:
return false;
case EXTERNAL:
return !isLocal(address);
default:
return true;
}
}
private boolean isLocal(String remoteAddress) {
try {
InetAddress inetAddress = InetAddress.getByName(remoteAddress);
return inetAddress.isAnyLocalAddress() || inetAddress.isLoopbackAddress() || inetAddress.isSiteLocalAddress();
} catch (UnknownHostException e) {
return false;
}
}
}
@@ -1,20 +0,0 @@
package org.keycloak.provider;
import java.util.Set;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public interface ProviderSession {
<T extends Provider> T getProvider(Class<T> clazz);
<T extends Provider> T getProvider(Class<T> clazz, String id);
<T extends Provider> Set<String> listProviderIds(Class<T> clazz);
<T extends Provider> Set<T> getAllProviders(Class<T> clazz);
void close();
}
@@ -1,14 +0,0 @@
package org.keycloak.provider;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public interface ProviderSessionFactory {
ProviderSession createSession();
void close();
void init();
}
@@ -9,7 +9,7 @@ import org.codehaus.jackson.annotate.JsonPropertyOrder;
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $
*/
@JsonPropertyOrder({"realm", "realm-public-key", "auth-server-url", "ssl-not-required",
@JsonPropertyOrder({"realm", "realm-public-key", "auth-server-url", "ssl-required",
"resource", "credentials",
"use-resource-role-mappings",
"enable-cors", "cors-max-age", "cors-allowed-methods",
@@ -12,7 +12,7 @@ import java.util.Map;
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $
*/
@JsonPropertyOrder({"realm", "realm-public-key", "auth-server-url", "ssl-not-required",
@JsonPropertyOrder({"realm", "realm-public-key", "auth-server-url", "ssl-required",
"resource", "public-client", "credentials",
"use-resource-role-mappings",
"enable-cors", "cors-max-age", "cors-allowed-methods",
@@ -9,7 +9,7 @@ import org.codehaus.jackson.annotate.JsonPropertyOrder;
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $
*/
@JsonPropertyOrder({"realm", "realm-public-key", "auth-server-url", "ssl-not-required"})
@JsonPropertyOrder({"realm", "realm-public-key", "auth-server-url", "ssl-required"})
public class BaseRealmConfig {
@JsonProperty("realm")
protected String realm;
@@ -17,15 +17,15 @@ public class BaseRealmConfig {
protected String realmKey;
@JsonProperty("auth-server-url")
protected String authServerUrl;
@JsonProperty("ssl-not-required")
protected boolean sslNotRequired;
@JsonProperty("ssl-required")
protected String sslRequired;
public boolean isSslNotRequired() {
return sslNotRequired;
public String getSslRequired() {
return sslRequired;
}
public void setSslNotRequired(boolean sslNotRequired) {
this.sslNotRequired = sslNotRequired;
public void setSslRequired(String sslRequired) {
this.sslRequired = sslRequired;
}
public String getRealm() {
@@ -21,6 +21,7 @@ public class ApplicationRepresentation {
protected Integer notBefore;
protected Boolean bearerOnly;
protected Boolean publicClient;
protected Boolean fullScopeAllowed;
public String getId() {
@@ -134,4 +135,12 @@ public class ApplicationRepresentation {
public void setPublicClient(Boolean publicClient) {
this.publicClient = publicClient;
}
public Boolean isFullScopeAllowed() {
return fullScopeAllowed;
}
public void setFullScopeAllowed(Boolean fullScopeAllowed) {
this.fullScopeAllowed = fullScopeAllowed;
}
}
@@ -1,26 +0,0 @@
package org.keycloak.representations.idm;
/**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
*/
public class AuthenticationLinkRepresentation {
private String authProvider;
private String authUserId;
public String getAuthProvider() {
return authProvider;
}
public void setAuthProvider(String authProvider) {
this.authProvider = authProvider;
}
public String getAuthUserId() {
return authUserId;
}
public void setAuthUserId(String authUserId) {
this.authUserId = authUserId;
}
}
@@ -1,37 +0,0 @@
package org.keycloak.representations.idm;
import java.util.Map;
/**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
*/
public class AuthenticationProviderRepresentation {
private String providerName;
private boolean passwordUpdateSupported = true;
private Map<String, String> config;
public String getProviderName() {
return providerName;
}
public void setProviderName(String providerName) {
this.providerName = providerName;
}
public boolean isPasswordUpdateSupported() {
return passwordUpdateSupported;
}
public void setPasswordUpdateSupported(boolean passwordUpdateSupported) {
this.passwordUpdateSupported = passwordUpdateSupported;
}
public Map<String, String> getConfig() {
return config;
}
public void setConfig(Map<String, String> config) {
this.config = config;
}
}
@@ -95,4 +95,40 @@ public class ClaimRepresentation {
public void setPhone(boolean phone) {
this.phone = phone;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
ClaimRepresentation that = (ClaimRepresentation) o;
if (address != that.address) return false;
if (email != that.email) return false;
if (gender != that.gender) return false;
if (locale != that.locale) return false;
if (name != that.name) return false;
if (phone != that.phone) return false;
if (picture != that.picture) return false;
if (profile != that.profile) return false;
if (username != that.username) return false;
if (website != that.website) return false;
return true;
}
@Override
public int hashCode() {
int result = (name ? 1 : 0);
result = 31 * result + (username ? 1 : 0);
result = 31 * result + (profile ? 1 : 0);
result = 31 * result + (picture ? 1 : 0);
result = 31 * result + (website ? 1 : 0);
result = 31 * result + (email ? 1 : 0);
result = 31 * result + (gender ? 1 : 0);
result = 31 * result + (locale ? 1 : 0);
result = 31 * result + (address ? 1 : 0);
result = 31 * result + (phone ? 1 : 0);
return result;
}
}
@@ -11,9 +11,16 @@ public class CredentialRepresentation {
public static final String CLIENT_CERT = "cert";
protected String type;
protected String value;
protected String device;
// Plain-text value of credential (used for example during import from manually created JSON file)
protected String value;
// Value stored in DB (used for example during export/import)
protected String hashedSaltedValue;
protected String salt;
protected Integer hashIterations;
public String getType() {
return type;
}
@@ -37,4 +44,28 @@ public class CredentialRepresentation {
public void setDevice(String device) {
this.device = device;
}
public String getHashedSaltedValue() {
return hashedSaltedValue;
}
public void setHashedSaltedValue(String hashedSaltedValue) {
this.hashedSaltedValue = hashedSaltedValue;
}
public String getSalt() {
return salt;
}
public void setSalt(String salt) {
this.salt = salt;
}
public Integer getHashIterations() {
return hashIterations;
}
public void setHashIterations(Integer hashIterations) {
this.hashIterations = hashIterations;
}
}
Loaded 100 of 887 files, more files were not shown because too many files have changed in this diff. Show more