Compare commits

..
2363 Commits
Author SHA1 Message Date
Stian Thorgersen 81dc436bcd Version bump fix 2015-04-02 13:23:12 +02:00
Stian Thorgersen 2fc0c1a59c Version bump 2015-04-02 13:19:59 +02:00
Stian Thorgersen 1738429e10 Comment out store tokens in admin console, and store/retrieve tokens in docs 2015-04-02 13:13:17 +02:00
Bill Burke 96e188bcae Merge pull request #1114 from patriot1burke/master
disable token exchange ui/example
2015-04-01 15:57:20 -04:00
Bill Burke 952b2fc83d disable token exchange ui/example 2015-04-01 15:56:52 -04:00
mposolda 15dfb6180c Fix fuse example 2015-04-01 18:03:16 +02:00
Bill Burke fc18190c5d Merge pull request #1111 from patriot1burke/master
expire cookie on backchannel
2015-04-01 11:28:00 -04:00
Bill Burke 10ced1e908 Merge remote-tracking branch 'upstream/master' 2015-04-01 10:33:25 -04:00
Bill Burke 1d56805faf unique username for brokered user 2015-04-01 10:32:47 -04:00
mposolda 41bf97ff40 Fix Cors example 2015-04-01 16:28:09 +02:00
mposolda 839ce470c2 Fixing broker examples 2015-04-01 14:41:37 +02:00
Stian Thorgersen 5f0b3ae019 Added instructions on deploying provider examples using jboss-cli 2015-04-01 14:22:17 +02:00
Stian Thorgersen bdbb1b891a KEYCLOAK-1170 User details for customer-portal-js are all null 2015-04-01 13:53:22 +02:00
Stian Thorgersen 48c7bd1b5e KEYCLOAK-1171 Missing parameters: response_type login to oauth-client and oauth-client-cdi 2015-04-01 13:50:50 +02:00
Stian Thorgersen 41828cd865 Prompt query param not added correctly after OIDC refactoring 2015-04-01 13:33:28 +02:00
Marek Posolda ded9a9f98c Merge pull request #1112 from mposolda/master
KEYCLOAK-1169 KEYCLOAK-1151
2015-04-01 11:44:37 +02:00
mposolda 42541d74b5 KEYCLOAK-1151 AuthorizationURL for custom social logins should perserve query parameters 2015-04-01 11:00:02 +02:00
mposolda a5567ead7a KEYCLOAK-1169 Skip DB write at each broker login if 3rd party token is not required 2015-04-01 11:00:02 +02:00
Stian Thorgersen 58068946e4 Formatting for KEYCLOAK-1113 2015-04-01 10:52:15 +02:00
Stian Thorgersen a2c4a1f760 Merge branch 'KEYCLOAK-1113' of https://github.com/velias/keycloak into velias-KEYCLOAK-1113
Conflicts:
	services/src/main/java/org/keycloak/services/resources/LoginActionsService.java
2015-04-01 09:45:13 +02:00
Stian Thorgersen fabb34445f KEYCLOAK-1093
Update docs for subsystem and domain mode
2015-04-01 09:36:06 +02:00
Stian Thorgersen a95d36eeb5 Fix to db changelog 2015-04-01 07:36:58 +02:00
Stian Thorgersen f9d814598e KEYCLOAK-946 Only show endpoints relevant for admin rest api 2015-04-01 07:31:17 +02:00
Stian Thorgersen abf8aea3f6 Merge pull request #1110 from ssilvert/KEYCLOAK-1166-admin-access-example-broken
KEYCLOAK-1166 Admin Access Example Broken
2015-04-01 06:33:00 +02:00
Bill Burke 03bfca5e41 expire cookie on backchannel 2015-03-31 19:33:43 -04:00
Bill Burke ecb6b2f7e9 Merge pull request #1109 from patriot1burke/master
jwks parsing on import
2015-03-31 15:02:07 -04:00
Stan Silvert 89f2f64042 Fix doc for this. 2015-03-31 14:59:58 -04:00
Stan Silvert 6e39c3d2f7 KEYCLOAK-1166 Admin Access Example Broken 2015-03-31 14:53:38 -04:00
Bill Burke e3754c472b Merge remote-tracking branch 'upstream/master' 2015-03-31 14:25:39 -04:00
Bill Burke 2d7e861086 jwks parsing 2015-03-31 14:25:26 -04:00
Stian Thorgersen 799c9da1c1 Merge pull request #1107 from stianst/master
Removed admin audit events - needs a rethink
2015-03-31 18:41:33 +02:00
Marek Posolda 04773f6aaf Merge pull request #1108 from mposolda/master
Migration docs, fixes
2015-03-31 17:43:08 +02:00
mposolda 4c1f2445e3 Bigger 'redirect URI' field in admin console, so it's not partially hidden 2015-03-31 17:10:19 +02:00
mposolda 783f11e6b8 KEYCLOAK-1121 KEYCLOAK-1122 Update migration guide about protocol mappers and identity brokers 2015-03-31 16:50:10 +02:00
mposolda 3256337614 CookieTokenStore not working correctly on EAP 6.3 2015-03-31 14:53:37 +02:00
Stian Thorgersen 969b1bf33c KEYCLOAK-1125 Update provider documentation and example and add instructions on using jboss-cli to create module 2015-03-31 14:42:58 +02:00
Stian Thorgersen fcc2e0a9f0 Removed admin audit events - need to rethink how to implement it 2015-03-31 14:37:54 +02:00
Stian Thorgersen 4a650e5417 Merge pull request #1104 from girirajsharma/master
Removed unused bcmail bouncycastle dependency.
2015-03-31 14:33:02 +02:00
girirajsharma 0077741a74 Removed unused bcmail bouncycastle dependency. 2015-03-31 17:07:28 +05:30
Stian Thorgersen 7d320392f2 KEYCLOAK-1149 app cred field not wide enough 2015-03-31 09:14:56 +02:00
Marek Posolda ade3b4eb75 Merge pull request #1102 from mposolda/master
Added bouncycastle module to EAP6 and AS7 packaging. Kerberos example README fix
2015-03-30 18:05:17 +02:00
mposolda 96b48877b8 Added bouncycastle module to EAP6 and AS7 packaging as it's not here by default 2015-03-30 17:59:49 +02:00
mposolda 13639a1bcc Minor fix in kerberos example 2015-03-30 17:59:49 +02:00
Stian Thorgersen 76309c1dcb Merge pull request #1101 from jean-merelis/work
pt-BR Internationalization support for pr #1097
2015-03-30 16:03:15 +02:00
Stian Thorgersen 99b67dfd6c Merge pull request #1100 from stianst/master
Admin audit events
2015-03-30 15:45:25 +02:00
Stian Thorgersen b777534411 KEYCLOAK-1140 Display redirect uri on identity provider detail page 2015-03-30 15:45:15 +02:00
jean f62f0d4877 pt-BR Internationalization support #1097 2015-03-30 10:17:51 -03:00
Stian Thorgersen 96dad77c66 KEYCLOAK-392 Admin events 2015-03-30 14:38:32 +02:00
girirajsharma 962b623b4a [KEYCLOAK-392] - Admin audit events 2015-03-30 14:06:01 +02:00
Vlastimil Elias 01094663bf KEYCLOAK-1113 - profile update now uses correct form validation also 2015-03-30 12:53:05 +02:00
Vlastimil Elias 31a80a973c KEYCLOAK-1113 - user registration form input boxes and labels are red on
error (css class is configurable in theme, has-error used for
patternfly)
2015-03-30 09:05:48 +02:00
Stian Thorgersen f8b25cad7f Merge pull request #1097 from gerbermichi/i18n
[KEYCLOAK-301] Internationalization support (4rd pr)
2015-03-30 08:25:03 +02:00
Michael Gerber 7b820a4eed i18n for default claims
role description i18n

tests

typo

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

i18n for account.ftl

i18n for account.ftl

i18n for federatedIdentity.ftl

i18n for log.ftl

i18n for password.ftl

i18n for sessions.ftl

i18n for template.ftl

i18n for totp.ftl

i18nfix

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

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

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

css dorpdown

get current url with locale as query parameter

Introduce LocaleBean

add css dropdown to account page

css styling...

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

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

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

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

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

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

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

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

add HttpHeaders
(cherry picked from commit be921c8)

add HttpHeaders
(cherry picked from commit be921c8)

NPE fix
(cherry picked from commit 148158b)

improve locale helper
(cherry picked from commit 57a805a)

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

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

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

remove debug info
(cherry picked from commit c3ea6b1)

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

add i18n for emails
(cherry picked from commit b6280e9)

i18n for emails
(cherry picked from commit 6118c51)

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

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

change file encoding
(cherry picked from commit 2cce96d)

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

i18n for error messages
(cherry picked from commit e75d5ef)

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

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

fix unit test
(cherry picked from commit a70a1c7)

fix unit test
(cherry picked from commit 008744b)

locale localization :)
(cherry picked from commit f3a2144)

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

messages refactoring
(cherry picked from commit 08f1ae7)

messages refactoring
(cherry picked from commit 3b4b53a)

messages refactoring
(cherry picked from commit 69146d4)

messages refactoring
(cherry picked from commit cd3db1d)

messages refactoring
(cherry picked from commit 715583f)

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

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

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

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

German translations
(cherry picked from commit 9822b99)

removed newliines
(cherry picked from commit 34ca1d8)

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

typo
(cherry picked from commit a818122)

typo
(cherry picked from commit a818122)

forgotten properties

unit test fixes

unit test fixes

fixes after rebase

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

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

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

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

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

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

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

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

add HttpHeaders
(cherry picked from commit be921c8)

add HttpHeaders
(cherry picked from commit be921c8)

NPE fix
(cherry picked from commit 148158b)

improve locale helper
(cherry picked from commit 57a805a)

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

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

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

remove debug info
(cherry picked from commit c3ea6b1)

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

add i18n for emails
(cherry picked from commit b6280e9)

i18n for emails
(cherry picked from commit 6118c51)

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

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

change file encoding
(cherry picked from commit 2cce96d)

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

i18n for error messages
(cherry picked from commit e75d5ef)

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

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

fix unit test
(cherry picked from commit a70a1c7)

fix unit test
(cherry picked from commit 008744b)

locale localization :)
(cherry picked from commit f3a2144)

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

messages refactoring
(cherry picked from commit 08f1ae7)

messages refactoring
(cherry picked from commit 3b4b53a)

messages refactoring
(cherry picked from commit 69146d4)

messages refactoring
(cherry picked from commit cd3db1d)

messages refactoring
(cherry picked from commit 715583f)

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

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

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

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

German translations
(cherry picked from commit 9822b99)

removed newliines
(cherry picked from commit 34ca1d8)

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

typo
(cherry picked from commit a818122)

typo
(cherry picked from commit a818122)

forgotten properties

unit test fixes

unit test fixes

fixes after rebase

fixes after rebase

fixes after rebase

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

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

Added Kerberos UI to LDAPFederationProvider

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

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

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

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

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

Also deploying in the keycloak 1.0.1 appliance, the line

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

makes parsing fail with 

11:19:10,121 ERROR [org.jboss.as.controller.management-operation] (DeploymentScanner-threads - 1) JBAS014613: Operation ("full-replace-deployment") failed - address: ([]) - failure description: {"JBAS014671: Failed services" => {"jboss.undertow.deployment.default-server.default-host./rhq-metrics" => "org.jboss.msc.service.StartException in service jboss.undertow.deployment.default-server.default-host./rhq-metrics: Failed to start service
    Caused by: java.lang.RuntimeException: org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of java.lang.String out of START_ARRAY token
 at [Source: java.io.BufferedInputStream@1605c2fe; line: 9, column: 24] (through reference chain: org.keycloak.representations.adapters.config.AdapterConfig[\"cors-allowed-methods\"])
    Caused by: org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of java.lang.String out of START_ARRAY token
 at [Source: java.io.BufferedInputStream@1605c2fe; line: 9, column: 24] (through reference chain: org.keycloak.representations.adapters.config.AdapterConfig[\"cors-allowed-methods\"])"}}
2014-10-07 11:21:15 +02:00
Stian Thorgersen 1604315e40 Merge pull request #743 from stianst/master
KEYCLOAK-730 Document clustering
2014-10-06 13:58:57 +02:00
Stian Thorgersen f702d8f1ff KEYCLOAK-730 Document clustering 2014-10-06 13:58:32 +02:00
Marek Posolda 87f826c850 Merge pull request #742 from mposolda/master
Simplify method signature in JsonSerialization
2014-10-05 22:12:19 +02:00
mposolda 59bf7e524f Change method signature 2014-10-05 20:07:54 +02:00
Bill Burke e01424b815 Merge pull request #741 from patriot1burke/master
saml basic
2014-10-04 22:15:56 -04:00
Bill Burke c609ae3496 saml 2014-10-04 22:15:25 -04:00
Bill Burke e3a3933390 saml basic 2014-10-04 21:27:48 -04:00
Stian Thorgersen 1f40ab407c Merge pull request #739 from stianst/master
KEYCLOAK-729
2014-10-03 14:11:49 +02:00
Stian Thorgersen 1d66bd9c15 KEYCLOAK-729
Update themes documentation
2014-10-03 14:11:03 +02:00
Stian Thorgersen 777999e0ea Merge pull request #737 from stianst/master
KEYCLOAK-722 Refreshing token throws RuntimeException if realm keys have...
2014-10-03 13:23:53 +02:00
Stian Thorgersen 0d5be568f8 KEYCLOAK-722 Refreshing token throws RuntimeException if realm keys have changed 2014-10-03 13:23:21 +02:00
Stian Thorgersen 17bb42d60e Merge pull request #736 from stianst/master
KEYCLOAK-662 NPE when using direct grant API with email as username
2014-10-03 12:12:16 +02:00
Stian Thorgersen d6f030a05a KEYCLOAK-662 NPE when using direct grant API with email as username 2014-10-03 12:10:52 +02:00
Marek Posolda 18401815af Merge pull request #734 from mposolda/master
Workaround for WFLY-3345 so logout can work for 'distributable' applicat...
2014-10-03 11:27:28 +02:00
mposolda 10e618dee9 Workaround for WFLY-3345 so logout can work for 'distributable' applications 2014-10-03 11:26:34 +02:00
Stian Thorgersen 98f9c798f0 Merge pull request #733 from stianst/master
KEYCLOAK-701 Use built-in themes if specified theme is not found
2014-10-03 11:24:40 +02:00
Stian Thorgersen 49f3172163 KEYCLOAK-701 Use built-in themes if specified theme is not found 2014-10-03 11:17:12 +02:00
Stian Thorgersen 53489cd556 Merge pull request #731 from stianst/master
Add login test with multiple sessions for same user
2014-10-03 10:42:39 +02:00
Stian Thorgersen a5aa1da841 Add login test with multiple sessions for same user 2014-10-03 10:41:04 +02:00
Marek Posolda e11180a4f0 Merge pull request #729 from mposolda/master
KEYCLOAK-732 AuthenticationManager.logout should logout just current use...
2014-10-02 22:54:31 +02:00
mposolda e6121f301f KEYCLOAK-732 AuthenticationManager.logout should logout just current userSession 2014-10-02 22:52:44 +02:00
Marek Posolda 4050cf9ac3 Merge pull request #728 from mposolda/master
KEYCLOAK-731
2014-10-02 19:19:09 +02:00
mposolda 50f148cd7c Use one option "auth-server-url-for-backend-requests" instead of 3 options 2014-10-02 19:16:04 +02:00
mposolda 72b5632cfe KEYCLOAK-731 Support for replacing configuration of Java adapters with system properties 2014-10-02 19:15:37 +02:00
Stian Thorgersen 8855bcf3c1 Merge pull request #727 from stianst/master
KEYCLOAK-727: 'logout'->'log out' + moved message to bundle
2014-10-02 10:55:01 +02:00
Lukas Fryc a85b58dccd KEYCLOAK-727: 'logout'->'log out' + moved message to bundle 2014-10-02 10:54:26 +02:00
Stian Thorgersen 01e6d09d79 Merge pull request #725 from stianst/master
Fixes to infinispan user session provider
2014-10-02 09:43:21 +02:00
Stian Thorgersen 597ee2b8c9 Fixes to infinispan user session provider 2014-10-02 09:00:48 +02:00
Marek Posolda 6ff37cfc24 Merge pull request #724 from mposolda/master
KEYCLOAK-709 ResourceAdminManager.logoutApplication shouldn't immediatel...
2014-10-01 23:21:46 +02:00
mposolda 95521e8a95 KEYCLOAK-709 ResourceAdminManager.logoutApplication shouldn't immediatelly fail with RuntimeException 2014-10-01 23:20:49 +02:00
Bill Burke 4b254475da Merge pull request #723 from patriot1burke/master
finish login protocol refactoring
2014-10-01 14:58:42 -04:00
Bill Burke 6cf62a2768 move pre-auth 2014-10-01 14:57:52 -04:00
Bill Burke 71216bf2c9 merge 2014-10-01 14:21:23 -04:00
Bill Burke cbc383d494 finish protocol refactoring 2014-10-01 14:19:59 -04:00
Marek Posolda a75c9ee04e Merge pull request #722 from mposolda/master
Http session replication working for example apps on Wildfly
2014-10-01 19:14:14 +02:00
mposolda d7bcd41909 Ensure that KeycloakUndertowAccount and referenced classes can be serialized in session 2014-10-01 19:08:41 +02:00
Bill Burke 546d45b009 protocol abstraction 2014-10-01 10:38:42 -04:00
Bill Burke 99738ea4ad Merge remote-tracking branch 'upstream/master' 2014-10-01 10:01:59 -04:00
Bill Burke 4b399fe05a login protocol abstraction 2014-10-01 10:01:42 -04:00
mposolda eb920b4993 Examples: Don't require to create HttpSession when visiting JSP pages 2014-10-01 13:44:38 +02:00
mposolda 1b6b95bb9a Added distributable to customer-portal in cluster test 2014-10-01 11:52:16 +02:00
Marek Posolda bd077a3adb Merge pull request #721 from mposolda/master
Use infinispan UserSession provider for docker cluster env. Don't prepar...
2014-10-01 10:52:48 +02:00
mposolda fd0a000823 Use infinispan UserSession provider for docker cluster env. Don't prepare nodes during each fig start 2014-10-01 10:51:24 +02:00
Bill Burke a6ae8d08ac Merge pull request #720 from patriot1burke/master
token service refactoring
2014-09-30 16:03:13 -04:00
Bill Burke e32f73880f Merge remote-tracking branch 'upstream/master' 2014-09-30 15:58:39 -04:00
Bill Burke 63b65c933b token service refactoring 2014-09-30 15:58:20 -04:00
Marek Posolda 72ec9ccb00 Merge pull request #719 from mposolda/master
KEYCLOAK-721 Possibility to resolve relative URI by hostname. Examples working in docker clustering env
2014-09-30 20:17:25 +02:00
mposolda 89dc55a106 Make examples working in docker cluster env 2014-09-30 19:50:17 +02:00
mposolda 80a9a8984a Cleanup. Support to use-hostname-for-local-requests added to Demo examples 2014-09-30 17:37:36 +02:00
mposolda 18fe808ce0 KEYCLOAK-720 Support for relative URI resolved by hostname in wildfly adapter 2014-09-30 17:37:36 +02:00
mposolda 337b03fc62 KEYCLOAK-720 added support for oauth clients 2014-09-30 17:37:36 +02:00
Stian Thorgersen 617c61034f Merge pull request #718 from stianst/master
KEYCLOAK-725 Add realm update to the Admin Client
2014-09-30 15:44:16 +02:00
Stian Thorgersen f026772c87 KEYCLOAK-725 Add realm update to the Admin Client 2014-09-30 15:43:18 +02:00
Stian Thorgersen 0f307afd16 Merge pull request #717 from stianst/master
Fixes to JPA user session provider
2014-09-30 14:47:45 +02:00
Stian Thorgersen a1f223735c Fixes to JPA user session provider 2014-09-30 14:47:22 +02:00
Stian Thorgersen d1bb872aec Merge pull request #716 from stianst/master
Fixes to Mongo user session provider
2014-09-30 14:25:49 +02:00
Stian Thorgersen 1d4e842cc0 Fixes to Mongo user session provider 2014-09-30 14:24:49 +02:00
Stian Thorgersen 209fdc1255 Fix UserSessionProviderTest.testGetByClientPaginated 2014-09-30 10:59:37 +02:00
Stian Thorgersen 3ded1943e2 Merge pull request #715 from keycloak/clustering
Fixes to UserSessionProviderTest
2014-09-30 10:23:10 +02:00
Stian Thorgersen bdeb59f87e Fixes to UserSessionProviderTest 2014-09-30 10:22:33 +02:00
Stian Thorgersen 994adaf493 Merge pull request #714 from keycloak/clustering
Clustering support
2014-09-30 10:21:21 +02:00
Stian Thorgersen 99c73a9cc7 Clustering support 2014-09-30 09:40:20 +02:00
Bill Burke 6075ef221f Merge pull request #713 from patriot1burke/master
action url refactor
2014-09-29 16:58:27 -04:00
Bill Burke fc867e59ea action url refactor 2014-09-29 16:57:58 -04:00
Bill Burke 6212403569 Merge pull request #712 from patriot1burke/master
login refactor phase 2, still more to do
2014-09-29 16:16:10 -04:00
Bill Burke 75a3093dda login refactor phase 2, still more to do 2014-09-29 16:15:33 -04:00
Bill Burke 6c46af5b3c Merge pull request #711 from patriot1burke/master
cliensession refactor
2014-09-29 10:01:35 -04:00
Bill Burke 67f10bee24 Merge remote-tracking branch 'upstream/master' 2014-09-29 09:56:37 -04:00
Bill Burke 524b423733 ClientSession everywhere refactor phase1 2014-09-26 17:44:33 -04:00
Stian Thorgersen c05f83c9b3 Merge pull request #709 from stianst/master
Add test to add/remove attributes to user through admin endpoints
2014-09-25 19:36:43 +02:00
Stian Thorgersen f2e97ff9d6 Add test to add/remove attributes to user through admin endpoints 2014-09-25 19:35:57 +02:00
Stian Thorgersen ca4ed6d528 Merge pull request #708 from stianst/master
Fix cordova example
2014-09-25 19:00:45 +02:00
Stian Thorgersen 8006ea073b Fix cordova example 2014-09-25 19:00:13 +02:00
Stian Thorgersen f8b4a91fa8 Merge pull request #707 from sebastienblanc/all_origins
change origin to * so it will work even if KC is behind https (like on OpenShift)
2014-09-25 18:49:36 +02:00
Sebastien Blanc e17d6c81f9 change origin to * 2014-09-25 17:43:10 +02:00
Stian Thorgersen f77de41b2e Merge pull request #706 from stianst/master
Fix welcome-theme for testsuite
2014-09-25 11:54:21 +02:00
Stian Thorgersen c12577e886 Fix welcome-theme for testsuite 2014-09-25 11:53:28 +02:00
Stian Thorgersen 5daec20a6e Merge pull request #705 from cvasilak/doc-link
fix docbook link
2014-09-24 12:05:11 +01:00
Christos Vasilakis 6d3aaa0560 fix docbook link 2014-09-24 12:58:18 +03:00
Stian Thorgersen 2e11e71453 Merge pull request #704 from cvasilak/link.fix
fix create-realm link
2014-09-24 10:03:21 +01:00
Christos Vasilakis fb561b8fd6 fix create-realm link 2014-09-24 11:40:22 +03:00
Bill Burke 0bf6c36ca7 add auth method to ClientSession 2014-09-23 11:18:39 -04:00
Bill Burke 66d58476d0 refactor security page flow 2014-09-23 11:05:10 -04:00
Bill Burke bf42227224 remove junk 2014-09-22 16:35:22 -04:00
Bill Burke 99a6713e6f clientsession notes 2014-09-22 16:34:42 -04:00
Bill Burke a26ac1758c Merge pull request #703 from patriot1burke/master
KEYCLOAK-705 and 687
2014-09-19 11:37:25 -04:00
Bill Burke ef60e17641 security vulnerability doc 2014-09-19 11:35:15 -04:00
Bill Burke 53943f8246 KEYCLOAK-705 2014-09-19 11:03:08 -04:00
Bill Burke 0b8b31a3ea KEYCLOAK-705 2014-09-19 10:00:47 -04:00
Stian Thorgersen 6f3132eafd Merge pull request #701 from stianst/master
KEYCLOAK-696 Display Keycloak version in admin console
2014-09-18 13:24:38 +02:00
Stian Thorgersen dcb5717154 KEYCLOAK-696 Display Keycloak version in admin console 2014-09-18 13:24:03 +02:00
Stian Thorgersen bfdb8d4e2d Merge pull request #700 from stianst/master
Removed info log statement
2014-09-18 12:38:48 +02:00
Stian Thorgersen 91fced3b87 Removed info log statement 2014-09-18 12:37:51 +02:00
Marek Posolda 825c475c7f Merge pull request #699 from mposolda/master
Admin console fixes, KEYCLOAK_REMEMBER_ME life changed to 1 year
2014-09-18 11:15:09 +02:00
mposolda 89471b7db1 KEYCLOAK-695 Let KEYCLOAK_REMEMBER_ME cookie to be valid for 1 year 2014-09-18 11:03:44 +02:00
mposolda 95233af485 KEYCLOAK-694 Fix JS error which could happen when creating application 2014-09-18 10:51:10 +02:00
mposolda fc37398235 KEYCLOAK-693 Hide top navigation when creating OAuth client 2014-09-18 10:50:18 +02:00
Marek Posolda 16ea18370d Merge pull request #698 from mposolda/master
Prefill login form just if rememberMe enabled for the realm
2014-09-17 08:59:00 +02:00
mposolda 1049bca433 Prefill login form just if rememberMe enabled for the realm 2014-09-17 08:54:29 +02:00
Marek Posolda 364174fb7e Merge pull request #697 from mposolda/master
Cookie & rememberMe fix. Fixing testsuite with mongo
2014-09-16 22:15:27 +02:00
mposolda 5352872b4b Use KEYCLOAK_REMEMBER_ME as hint to prefill login form. Change lifespan of KEYCLOAK_IDENTITY to maxSsoSessionLifespan 2014-09-16 22:09:27 +02:00
mposolda bd0887d18e Fixing testsuite for mongo 2014-09-16 20:02:30 +02:00
Marek Posolda 9a5f42039d Merge pull request #696 from mposolda/master
Added directive kcNavigationApplication and kcNavigationOauthClient. Hide Scope and Claims for bearer-only apps
2014-09-12 20:16:52 +02:00
mposolda ce8dd136bd Added directive kcNavigationApplication and kcNavigationOauthClient. Hide Scope and Claims for bearer-only apps 2014-09-12 20:15:11 +02:00
mposolda 1be2bff95f Typo 2014-09-12 16:57:02 +02:00
Stian Thorgersen 485ca9c90f Merge pull request #695 from stianst/master
KEYCLOAK-657 Set cache-control for keycloak.js and login-iframe
2014-09-12 13:47:20 +02:00
Stian Thorgersen 811cfd52c9 KEYCLOAK-657 Set cache-control for keycloak.js and login-iframe 2014-09-12 13:46:56 +02:00
Stian Thorgersen 5c1807eb2d Merge pull request #694 from stianst/master
Fixes to KEYCLOAK-682
2014-09-12 12:27:31 +02:00
Stian Thorgersen 7c15a70f53 Fixes to KEYCLOAK-682 2014-09-12 12:26:52 +02:00
Stian Thorgersen c9c525e942 Merge pull request #693 from stianst/master
KEYCLOAK-682 Only send logout admin action to clients associated with us...
2014-09-12 11:47:30 +02:00
Stian Thorgersen 5d141d4d8a KEYCLOAK-682 Only send logout admin action to clients associated with user session 2014-09-12 11:47:11 +02:00
Stian Thorgersen e96d6f0dfd Merge pull request #692 from stianst/master
Change version schema to match JBoss
2014-09-12 09:36:27 +02:00
Stian Thorgersen 423dc1b8a7 Change version schema to match JBoss 2014-09-12 09:35:08 +02:00
Marek Posolda ab080dcdd8 Merge pull request #691 from mposolda/master
Preserve form values in account mgmt after error. Allow valid email during registration or account mgmt
2014-09-11 20:57:27 +02:00
mposolda 6f173d4554 KEYCLOAK-678 Preserve form values in account mgmt after error 2014-09-11 20:54:48 +02:00
mposolda 649a40f58c KEYCLOAK-676 Validate email address format during registration or account mgmt 2014-09-11 20:05:00 +02:00
Stian Thorgersen d06668d39b Merge pull request #690 from stianst/master
KEYCLOAK-653 Add theme support to welcome-pages
2014-09-11 15:58:51 +02:00
Stian Thorgersen b23463a1d2 KEYCLOAK-653 Add theme support to welcome-pages 2014-09-11 15:58:29 +02:00
Stian Thorgersen 7f81032577 Merge pull request #689 from stianst/master
KEYCLOAK-680 Add/remove social-links through admin api
2014-09-11 12:10:23 +02:00
Stian Thorgersen 280cbf2174 KEYCLOAK-680 Add/remove social-links through admin api 2014-09-11 12:09:55 +02:00
Stian Thorgersen 228bb297c2 Merge pull request #688 from stianst/master
Added KEYCLOAK_DEV_PORT env variable for KeycloakServer
2014-09-11 11:05:53 +02:00
Stian Thorgersen f96e59d085 Added KEYCLOAK_DEV_PORT env variable for KeycloakServer 2014-09-11 11:05:29 +02:00
Stian Thorgersen 86300e7e86 Merge pull request #687 from stianst/master
Version bump
2014-09-11 09:29:37 +02:00
Stian Thorgersen 5dea07793b Version bump 2014-09-11 09:27:58 +02:00
Marek Posolda 5e51204114 Merge pull request #686 from mposolda/master
KEYCLOAK-674 Reduce info level logging in adapters
2014-09-10 16:04:48 +02:00
mposolda 4c0751c1a0 KEYCLOAK-674 Reduce info level logging in adapters 2014-09-10 16:02:22 +02:00
Marek Posolda ec1434c65e Merge pull request #685 from mposolda/master
Support for cors in PublicRealmResource
2014-09-10 13:16:21 +02:00
mposolda aa7bbeb11b Support for cors in PublicRealmResource 2014-09-10 13:05:53 +02:00
Marek Posolda 88a39dbaf7 Merge pull request #683 from mposolda/master
KEYCLOAK-670 allow ServerInfo to be available with cors
2014-09-10 10:52:33 +02:00
mposolda 52920119bd Ensure that ServerInfo request is authorized and add CORS support to it 2014-09-10 10:42:05 +02:00
mposolda 47ac358bb6 Fix timeouts in cors example 2014-09-10 10:42:04 +02:00
Stian Thorgersen 62aa2d7f65 Merge pull request #684 from stianst/master
Fix CRSF protection on Chrome, and add check if 'Referer' header
2014-09-10 10:34:49 +02:00
Stian Thorgersen 557de7690e Fix CRSF protection on Chrome, and add check if 'Referer' header 2014-09-10 10:32:56 +02:00
Bill Burke 4c8da3d614 Merge pull request #682 from patriot1burke/master
version bump
2014-09-09 13:35:39 -04:00
Bill Burke 3f539c6d5c version bump 2014-09-09 13:34:56 -04:00
Bill Burke 5b1d67f17d Merge pull request #681 from patriot1burke/master
change CSRF to random value
2014-09-09 13:27:59 -04:00
Bill Burke e3e32982a0 change CSRF to random value 2014-09-09 13:27:34 -04:00
Bill Burke b771cd30e7 Merge pull request #680 from patriot1burke/master
nolog CORS exception
2014-09-09 12:54:55 -04:00
Bill Burke ac29db51e5 nolog CORS exception 2014-09-09 12:51:55 -04:00
Bill Burke 6e3770f04a Merge pull request #679 from patriot1burke/master
CSRF
2014-09-09 12:07:29 -04:00
Bill Burke d0a3a04d34 CSRF 2014-09-09 12:06:48 -04:00
Stian Thorgersen c5662020d8 Merge pull request #678 from stianst/master
Moved logo-example themes to examples/themes
2014-09-09 14:09:58 +02:00
Stian Thorgersen fea0d1af66 Moved logo-example themes to examples/themes 2014-09-09 14:09:32 +02:00
Stian Thorgersen 30cd28d288 Merge pull request #677 from stianst/master
KEYCLOAK-668 Make sure keycloak.js doesn't send multiple concurrent requ...
2014-09-09 13:46:21 +02:00
Stian Thorgersen c475721dab KEYCLOAK-668 Make sure keycloak.js doesn't send multiple concurrent requests to refresh the token 2014-09-09 13:45:55 +02:00
Stian Thorgersen 839069ca15 Merge pull request #676 from stianst/master
Fixes to admin console random logout
2014-09-09 11:02:19 +02:00
Stian Thorgersen 09860f1ee1 Fix test 2014-09-09 11:01:24 +02:00
Stian Thorgersen a1b6378bef KEYCLOAK-667 Remove client-side idle timeout from admin console - with sso idle timeout we have a server-side mechanism for this 2014-09-09 11:01:24 +02:00
Stian Thorgersen 3530fa6259 KEYCLOAK-666 Update session last refreshed on every token refresh 2014-09-09 11:01:24 +02:00
Bill Burke d22afd78e6 Merge pull request #675 from patriot1burke/master
doc update
2014-09-08 09:09:07 -04:00
Bill Burke f1986093e6 doc update 2014-09-08 09:07:51 -04:00
Stian Thorgersen 6c5477bc02 Merge pull request #674 from stianst/master
Minor fixes to theme docs
2014-09-08 14:59:34 +02:00
Stian Thorgersen ae6fd458e8 Minor fixes to theme docs 2014-09-08 14:59:09 +02:00
Stian Thorgersen cdda48d895 Merge pull request #673 from stianst/master
Typo fix in docs
2014-09-08 10:25:18 +02:00
Stian Thorgersen 556314ae15 Typo fix in docs 2014-09-08 10:24:47 +02:00
Stian Thorgersen a2845fa0b4 Merge pull request #672 from stianst/master
Added instruction to manually configure and deploy the unconfigured demo
2014-09-03 13:32:33 +02:00
Stian Thorgersen 8c4a3374d3 Added instruction to manually configure and deploy the unconfigured demo 2014-09-03 13:20:58 +02:00
Stian Thorgersen b97106b750 Adding changes to examples overview readme 2014-09-03 13:18:14 +02:00
Stian Thorgersen 7907abd206 Merge pull request #671 from stianst/master
Added README.md with Overview of all examples
2014-09-03 11:22:42 +02:00
Stian Thorgersen 090871f8b9 Added README.md with Overview of all examples 2014-09-03 11:22:08 +02:00
Stian Thorgersen 0baf12c0ef Merge pull request #670 from stianst/master
Updates to server-installation docs
2014-09-03 10:13:36 +02:00
Stian Thorgersen 1599371ee5 Updates to server-installation docs 2014-09-03 10:13:05 +02:00
Stian Thorgersen 3bc27ef366 Merge pull request #669 from stianst/master
Fix AccountTest.viewLog test
2014-09-03 08:53:56 +02:00
Stian Thorgersen d5c5cc8321 Fix AccountTest.viewLog test 2014-09-03 08:53:02 +02:00
Bill Burke aea00fc574 Merge pull request #668 from patriot1burke/master
admin theme refactor
2014-09-02 11:37:32 -04:00
Bill Burke e9dc8b2460 refactor admin theme 2014-09-02 11:36:59 -04:00
Bill Burke eaed199b20 add logo example theme 2014-09-02 11:11:26 -04:00
Marek Posolda f7fcefc11c Merge pull request #667 from mposolda/master
KEYCLOAK-659 Export current version number during export
2014-09-02 17:09:10 +02:00
mposolda 1f0dcbddbe KEYCLOAK-659 Export current version number during export 2014-09-02 17:06:58 +02:00
Stian Thorgersen 9af0743883 Merge pull request #666 from stianst/master
Updated docs to inherit project version from keycloak-parent
2014-09-02 14:07:24 +02:00
Stian Thorgersen 7d4863783c Use keycloak-parent in docbook to inherit project version 2014-09-02 13:57:23 +02:00
Stian Thorgersen d87718f768 Inject project version from pom 2014-09-02 13:22:15 +02:00
Stian Thorgersen c7ba6159b5 Merge pull request #665 from stianst/master
Doc fix
2014-09-02 12:52:42 +02:00
Stian Thorgersen b43909aff1 Doc fix 2014-09-02 12:52:22 +02:00
Marek Posolda 87d9a5422d Merge pull request #664 from mposolda/master
Use stronger passwords in LDAP tests due to password policy on MSAD2012
2014-09-02 12:49:34 +02:00
mposolda 44937d33ad Use stronger passwords in LDAP tests due to password policy on MSAD2012 2014-09-02 12:43:14 +02:00
Stian Thorgersen b561080f3a Merge pull request #663 from stianst/master
Fix search for users by attribute on mongo
2014-09-02 11:52:15 +02:00
Stian Thorgersen d905ce12e3 Fix search for users by attribute on mongo 2014-09-02 11:51:29 +02:00
Marek Posolda 7040bd1c51 Merge pull request #662 from mposolda/master
Fix SyncProvidersTest with ActiveDirectory
2014-09-02 11:12:43 +02:00
mposolda cd91a29a89 Fix SyncProvidersTest with ActiveDirectory 2014-09-02 11:06:31 +02:00
Stian Thorgersen b1b452815a Merge pull request #661 from stianst/master
KEYCLOAK-656 Remove login-status-iframe from dist
2014-09-02 10:54:52 +02:00
Stian Thorgersen 59d66dd20e KEYCLOAK-656 Remove login-status-iframe from dist 2014-09-02 10:54:26 +02:00
Stian Thorgersen 0763d0d9d6 Merge pull request #660 from stianst/master
KEYCLOAK-658 Fix searching for users
2014-09-02 10:02:08 +02:00
Stian Thorgersen 8c8c44e50f KEYCLOAK-658 Fix searching for users 2014-09-02 10:01:44 +02:00
Marek Posolda 14b1941454 Merge pull request #659 from mposolda/master
Added more props to LDAPEmbeddedServer to allow automated test with Acti...
2014-09-01 20:54:49 +02:00
mposolda e52811ac28 Added more props to LDAPEmbeddedServer to allow automated test with ActiveDirectory 2014-09-01 20:43:14 +02:00
Stian Thorgersen 4f3a980f8b Merge pull request #658 from stianst/master
Version bump
2014-09-01 10:17:31 +02:00
Stian Thorgersen 05a1fc1ded Version bump 2014-09-01 10:17:00 +02:00
Stian Thorgersen ff74d1ddc0 Merge pull request #657 from stianst/master
Various fixes
2014-08-29 17:11:53 +02:00
Stian Thorgersen 31b0f5543f Fixes 2014-08-29 17:11:18 +02:00
Stian Thorgersen 39c0be5d99 KEYCLOAK-652
Social user can't set password
2014-08-29 16:51:10 +02:00
Stian Thorgersen fb18789b05 KEYCLOAK-650
Server error while trying to download keycloak.json for oauth client
2014-08-29 16:08:42 +02:00
Stian Thorgersen bcbf5da4b8 KEYCLOAK-651
Page not found trying to save changes to brute force
2014-08-29 16:04:37 +02:00
Stian Thorgersen e1b9dfe65d KEYCLOAK-649 Invalidate realm if app name or client clientId is changed 2014-08-29 15:49:17 +02:00
Stian Thorgersen 52f86f2293 Merge pull request #656 from stianst/master
Fixes to event-store-mem example
2014-08-29 14:56:09 +02:00
Stian Thorgersen e413694cf5 Fixes to event-store-mem example 2014-08-29 14:55:45 +02:00
Stian Thorgersen 20ce36dc64 Merge pull request #655 from stianst/master
Clean user credential management form
2014-08-29 11:06:11 +02:00
Stian Thorgersen a3c982a630 Clean user credential management form 2014-08-29 11:05:37 +02:00
Stian Thorgersen e0542b5260 Merge pull request #654 from stianst/master
KEYCLOAK-648 Fix removing role from composite role
2014-08-29 10:27:29 +02:00
Stian Thorgersen 7c7025a83d KEYCLOAK-648 Fix removing role from composite role 2014-08-29 10:18:00 +02:00
Stian Thorgersen 3e6a1f47ec Merge pull request #653 from stianst/master
Fix test
2014-08-29 09:10:41 +02:00
Stian Thorgersen 32703d19a0 Fix test 2014-08-29 08:59:57 +02:00
Stian Thorgersen cdc6588ac1 Merge branch 'ungarida-master' 2014-08-28 14:30:29 +02:00
Stian Thorgersen 57aea9b51c Merge branch 'master' of https://github.com/ungarida/keycloak into ungarida-master
Conflicts:
	integration/tomcat7/adapter/src/main/java/org/keycloak/adapters/tomcat7/AuthenticatedActionsValve.java
2014-08-28 14:29:07 +02:00
Stian Thorgersen a2171bf777 Merge pull request #652 from stianst/master
Password token
2014-08-28 14:22:51 +02:00
Stian Thorgersen b9d0f64f74 Added password token to use inplace of plain-text password for totp 2014-08-28 13:51:55 +02:00
Stian Thorgersen 55d614fce8 Reduce log in UserFederationResource 2014-08-28 11:26:55 +02:00
Stian Thorgersen 46d118207a Merge pull request #651 from stianst/master
Rename audit to events
2014-08-28 11:07:02 +02:00
Stian Thorgersen 3bfe3d256e Rename audit to events 2014-08-28 10:56:37 +02:00
Marek Posolda b50ab14a0a Merge pull request #650 from mposolda/master
More Federation & LDAP fixes
2014-08-27 12:41:38 +02:00
mposolda 08c58cf2f2 Upgrade picketlink to 2.7.0.Beta1 2014-08-27 12:22:15 +02:00
mposolda d26543360b KEYCLOAK-646 Fix LDAP authentication when there are commas in the value of bindingProperty 2014-08-27 12:19:23 +02:00
mposolda fb18004c1d KEYCLOAK-643 Handle flows with adding user with existing username or email in federation providers 2014-08-27 12:19:23 +02:00
Stian Thorgersen 49fb452a79 Merge pull request #649 from stianst/master
KEYCLOAK-531 Reduce info level logging
2014-08-27 11:17:56 +02:00
Stian Thorgersen 55bd889a0f KEYCLOAK-531 Reduce info level logging 2014-08-27 11:17:24 +02:00
Stian Thorgersen 269a0dbec1 Merge pull request #643 from ssilvert/KEYCLOAK-642-subsys-wfcontroller
KEYCLOAK-642 Latest WildFly breaks Keycloak Subsystem
2014-08-27 08:19:20 +02:00
Marek Posolda cf51db88e7 Merge pull request #648 from mposolda/master
Federation & LDAP related fixes
2014-08-26 20:43:23 +02:00
mposolda fc0889cd2e KEYCLOAK-644 Searching by email from LDAP doesn't work 2014-08-26 20:24:25 +02:00
mposolda b3b480c25f Display proper error message if LDAP-linked user couldn't be deleted due to read-only mode 2014-08-26 19:10:48 +02:00
mposolda 892fa04130 KEYCLOAK-645 Disable username field when editing user in admin console 2014-08-26 18:04:26 +02:00
Marek Posolda 8d3e51c236 Merge pull request #647 from mposolda/master
Handle exceptions and UI errors when user is read only. Minor sync issue
2014-08-26 13:02:11 +02:00
mposolda fd9d2ba4d5 Handle exceptions and UI errors when user is read only. Some sync issues 2014-08-26 12:54:05 +02:00
Marek Posolda 75bc633a33 Merge pull request #645 from mposolda/master
Fix pagination of searching users
2014-08-25 21:14:56 +02:00
mposolda 3fdb22cb05 Fix pagination of searching users 2014-08-25 21:13:50 +02:00
Marek Posolda f51ba1cb8a Merge pull request #644 from mposolda/master
Docs about sync. Tooltips and minor fixes
2014-08-25 17:19:02 +02:00
mposolda 688f4a07a3 Added docs about sync of users 2014-08-25 17:17:32 +02:00
mposolda 6c7d0f27a7 More tooltips for LDAP and generic federation. Minor fixes 2014-08-25 16:28:52 +02:00
Stan Silvert 1e5ca3062c KEYCLOAK-642 Latest WildFly breaks Keycloak Subsystem 2014-08-22 13:49:57 -04:00
Bill Burke ca97e7ba35 Merge pull request #642 from patriot1burke/master
import console from export
2014-08-21 17:25:16 -04:00
Bill Burke e99afec7ec import console from export 2014-08-21 17:17:09 -04:00
Bill Burke a23853a6bc Merge pull request #641 from patriot1burke/master
bump pom
2014-08-21 10:47:22 -04:00
Bill Burke 7c8edb5d11 bump pom 2014-08-21 10:46:49 -04:00
Bill Burke 83ad045410 Merge pull request #640 from patriot1burke/master
last fixes for rc1
2014-08-20 14:51:14 -04:00
Bill Burke e5d5276135 race 2014-08-20 14:50:28 -04:00
Bill Burke 6f38a02aaa SSL mode docs 2014-08-20 14:37:15 -04:00
Bill Burke 5dd84f1d9a fix AccountService referrer problems 2014-08-20 14:20:59 -04:00
Bill Burke 30147ce25a import doc 2014-08-20 13:32:14 -04:00
Bill Burke dd011f043d fix cors demo 2014-08-20 13:29:09 -04:00
Bill Burke 7dec0319b6 doc ix 2014-08-20 13:26:57 -04:00
Bill Burke 06c14df0f3 Merge pull request #639 from patriot1burke/master
enhancements
2014-08-20 11:56:29 -04:00
Bill Burke 041d0be990 add notification messages 2014-08-20 11:55:59 -04:00
Bill Burke f6a76e673c add federation breadcrums 2014-08-20 11:40:48 -04:00
Bill Burke 47f361a4ab nocache for fed provider list 2014-08-20 11:29:45 -04:00
Bill Burke 6e7924da76 demo fixes 2014-08-20 11:08:40 -04:00
Bill Burke df1a0c03b6 Merge pull request #638 from patriot1burke/master
readme
2014-08-20 08:51:03 -04:00
Bill Burke 971bea8a24 readme again 2014-08-20 08:50:24 -04:00
Bill Burke c8f0a1ab5a readme 2014-08-20 08:49:42 -04:00
Bill Burke 0ae9ac0848 Merge pull request #637 from patriot1burke/master
doc touchup
2014-08-19 15:10:52 -04:00
Bill Burke 3dd52e8b28 doc touchup 2014-08-19 15:10:32 -04:00
Bill Burke 0f6915c615 Merge pull request #636 from patriot1burke/master
fix mongo
2014-08-19 14:49:35 -04:00
Bill Burke 74cd23b331 fix mongo 2014-08-19 14:49:15 -04:00
Bill Burke cc17895ef3 Merge pull request #635 from patriot1burke/master
more minor screen changes
2014-08-19 12:13:24 -04:00
Bill Burke 09ada81b27 more minor screen changes 2014-08-19 12:12:58 -04:00
Bill Burke 75e0fa87c3 Merge pull request #632 from ssilvert/master
Add web-console and http-endpoint default configurations for WildFly
2014-08-18 18:56:02 -04:00
Bill Burke 6628e226e4 Merge pull request #631 from ssilvert/Use-KeycloakDS
By default, the datasource should be KeycloakDS instead of ExampleDS.
2014-08-18 18:55:53 -04:00
Bill Burke 89d47a392b Merge pull request #634 from patriot1burke/master
buncho fixes
2014-08-18 18:55:18 -04:00
Bill Burke c38abb2cfe ? 2014-08-18 18:52:51 -04:00
Bill Burke faf18dfdfd fix cookie parsing problem 2014-08-18 18:36:36 -04:00
Bill Burke 2dc32fb8c9 fix menu error 2014-08-18 18:06:23 -04:00
Bill Burke 2ec029e8e0 Merge pull request #633 from patriot1burke/master
social fixes
2014-08-18 11:56:14 -04:00
Bill Burke 80904209b3 KEYCLOAK-627 2014-08-18 11:55:27 -04:00
Bill Burke 8b1483d7ef docs 2014-08-18 10:48:28 -04:00
Bill Burke bbeff1ef22 Merge remote-tracking branch 'upstream/master' 2014-08-18 10:40:55 -04:00
Stan Silvert aac3c2e0ee Don't block server artifact from being pushed to the repo. 2014-08-15 14:51:38 -04:00
Stan Silvert a240a00983 Add web-console and http-endpoint default configurations for WildFly
build.
2014-08-15 13:43:18 -04:00
Bill Burke c86a6ba3f3 fix admin reset email 2014-08-15 11:46:38 -04:00
Stan Silvert bc301baa1f By default, the datasource should be KeycloakDS instead of ExampleDS. 2014-08-15 08:55:04 -04:00
Bill Burke edbf26f007 Merge pull request #630 from patriot1burke/master
expanded token service coverage
2014-08-14 21:01:26 -04:00
Bill Burke 5dca2a3588 expanded token service coverage 2014-08-14 21:01:05 -04:00
Bill Burke cf5a7d228b Merge pull request #629 from patriot1burke/master
add some breadcrumbs, add app role
2014-08-14 18:47:15 -04:00
Bill Burke f7a7c3ca7b add some breadcrumbs, add app role 2014-08-14 18:46:53 -04:00
Bill Burke 28fcdf0b8f Merge pull request #628 from patriot1burke/master
relative uri problem
2014-08-14 12:00:03 -04:00
Bill Burke c38ec33881 tooltip fixes 2014-08-14 11:59:03 -04:00
Bill Burke cfee00d4c5 fix relative uri problem 2014-08-14 11:01:04 -04:00
Bill Burke 46bf0d78fa Merge pull request #627 from patriot1burke/master
more tooltips
2014-08-13 15:11:28 -04:00
Bill Burke a14be592de more tooltips 2014-08-13 15:11:05 -04:00
Bill Burke 29691a3167 Merge pull request #626 from patriot1burke/master
more tooltips, change password
2014-08-13 12:17:48 -04:00
Bill Burke 517a2b99d7 more tooltips 2014-08-13 12:17:20 -04:00
Bill Burke edf73af508 change password 2014-08-13 10:35:49 -04:00
Bill Burke 4a5ea08a2a Merge pull request #625 from patriot1burke/master
tooltips
2014-08-13 09:42:09 -04:00
Bill Burke 7b86cca649 better tooltip user 2014-08-13 09:40:43 -04:00
Bill Burke c77b7cd7d6 fix required user tooltip 2014-08-13 09:38:56 -04:00
Bill Burke 6b0a87c57a Merge pull request #624 from patriot1burke/master
add js adapter to dist
2014-08-12 18:25:03 -04:00
Bill Burke b1c331c5f3 add js adapter to dist 2014-08-12 18:24:40 -04:00
Bill Burke 7ae342452e Merge pull request #623 from patriot1burke/master
tooltips
2014-08-12 16:31:25 -04:00
Bill Burke 4438aa6606 tooltips 2014-08-12 16:22:26 -04:00
Marek Posolda 8cd8472003 Merge pull request #622 from mposolda/master
Sync admin UI and fixes.
2014-08-12 19:13:50 +02:00
mposolda 687aa78567 Fix issue in sync admin UI 2014-08-12 19:12:05 +02:00
mposolda 8419e5883d Ensure that transaction.isActive() is false after commit or rollback 2014-08-12 18:58:37 +02:00
mposolda 4bac0474c6 Sync UI for generic providers 2014-08-12 18:12:28 +02:00
mposolda f0b66a2241 Admin console UI for sync of users from LDAP. Sync fixes 2014-08-12 18:12:27 +02:00
Bill Burke 51b71e8f20 Merge pull request #621 from patriot1burke/master
refactor UI screens, remove breadcrumbs
2014-08-12 11:09:50 -04:00
Bill Burke 8615515b9a refactor UI screens, remove breadcrumbs 2014-08-12 11:07:39 -04:00
Bill Burke 10cf486d26 Merge pull request #620 from ssilvert/KEYCLOAK-331-ear
KEYCLOAK-331 Fixed NPE when user specifies EAR name instead of WAR in subsystem.
2014-08-12 10:29:46 -04:00
Bill Burke abb1647672 Merge pull request #619 from patriot1burke/master
fix logout
2014-08-12 10:06:44 -04:00
Bill Burke 114c1b95fa fix logout 2014-08-12 10:06:19 -04:00
Stan Silvert 4e88bbc811 KEYCLOAK-331 Fixed NPE when user specifies EAR name instead of WAR in standalone.xml. Also, fixed EAR deployment in general and added EAR example. 2014-08-12 10:03:20 -04:00
Stan Silvert 504a41aec4 KEYCLOAK-331 Fixed NPE when user specifies EAR name instead of WAR in
standalone.xml.  Also, fixed EAR deployment in general and added EAR
example.
2014-08-12 09:58:54 -04:00
Stian Thorgersen e9bf1ef618 Merge pull request #618 from stianst/master
Fix test
2014-08-12 12:14:32 +01:00
Stian Thorgersen 9d6e450c05 Fix test 2014-08-12 12:13:59 +01:00
Stian Thorgersen fb7e95f1e4 Merge pull request #617 from stianst/master
KEYCLOAK-592 Display login form with error message if trying to login wi...
2014-08-12 12:06:39 +01:00
Stian Thorgersen f95418dfc9 KEYCLOAK-592 Display login form with error message if trying to login with social provider where email already exists 2014-08-12 12:06:13 +01:00
Bill Burke 94be235a0f Merge pull request #616 from patriot1burke/master
menu
2014-08-11 17:48:52 -04:00
Bill Burke 100de5a55e menu 2014-08-11 17:47:55 -04:00
Bill Burke 26570de4cd Merge pull request #615 from patriot1burke/master
X-Frame-Options, Content-Security-Policy
2014-08-11 17:45:26 -04:00
Bill Burke 7c97e02715 X-Frame-Options, Content-Security-Policy 2014-08-11 17:45:01 -04:00
Bill Burke e73bdf9d8c Merge pull request #614 from patriot1burke/master
add jpa realm attributes
2014-08-11 12:33:36 -04:00
Bill Burke 8d1ff1d49c add jpa realm attributes 2014-08-11 12:33:17 -04:00
Stian Thorgersen de770d2881 Merge pull request #613 from stianst/master
Added tooltip to realm enabled button
2014-08-11 16:14:14 +01:00
Stian Thorgersen 7f96770089 Added tooltip to realm enabled button 2014-08-11 16:13:38 +01:00
Stian Thorgersen 3f83538fc1 Merge pull request #612 from stianst/master
KEYCLOAK-616 Not require registration to add a new social user
2014-08-11 15:35:54 +01:00
Stian Thorgersen 3040f4e89f KEYCLOAK-616 Not require registration to add a new social user 2014-08-11 15:34:57 +01:00
Marek Posolda c57c264d91 Merge pull request #611 from mposolda/master
Fix transaction handling in KeycloakModelUtils.runJobInTransaction. Star...
2014-08-11 13:53:04 +02:00
mposolda 8ba7559cac Fix transaction handling in KeycloakModelUtils.runJobInTransaction. Start sync tasks for configured federation providers at startup 2014-08-11 13:51:44 +02:00
Marek Posolda c4d5a4138c Merge pull request #610 from mposolda/master
Support for users sync
2014-08-10 23:40:23 +02:00
mposolda d699404ce7 Support for periodic users sync 2014-08-10 23:23:50 +02:00
mposolda ee79747cb6 Sync - first iteration 2014-08-10 23:22:35 +02:00
mposolda 5cb6c4e77c Improve TimerSPI to support cancelling of previously scheduled tasks 2014-08-10 23:17:39 +02:00
Bill Burke 05638a8953 Merge pull request #609 from patriot1burke/master
fixes
2014-08-10 12:29:07 -04:00
Bill Burke 48f7efc97f @NoCache where appropriate 2014-08-10 12:28:43 -04:00
Bill Burke 9aa6b4cbfa optimize imports 2014-08-10 12:17:45 -04:00
Bill Burke cae0a7628d use SecureRandom for totp 2014-08-10 12:12:24 -04:00
Bill Burke 82e29dfcb3 Merge pull request #608 from patriot1burke/master
jiras
2014-08-10 11:50:42 -04:00
Bill Burke ad94b94833 enlarge URL html input 2014-08-10 11:49:58 -04:00
Bill Burke 687e497455 test searchForUserByAttributes 2014-08-10 11:36:02 -04:00
Bill Burke 67f31648a6 Merge pull request #572 from vibe13/duplicated-version
Remove warning from Maven log4j:log4j:jar -> duplicate declaration
2014-08-10 11:04:51 -04:00
Bill Burke d332851a75 Merge pull request #606 from alarikmyrin/KEYCLOAK-621
KEYCLOAK-621 fix searchForUserByAttributes method
2014-08-10 11:02:08 -04:00
Bill Burke 4a18a32cfc Merge pull request #607 from patriot1burke/master
change logout behavior
2014-08-10 09:09:32 -04:00
Alarik Myrin 428cd54a81 KEYCLOAK-621 fix searchForUserByAttributes method so that it works and is not subject to SQL injection 2014-08-09 13:59:20 -04:00
Bill Burke dc4e8603d7 change logout behavior 2014-08-08 18:33:37 -04:00
Marek Posolda b96f8aef6d Merge pull request #605 from mposolda/master
LDAP testing and improvements
2014-08-08 12:24:39 +02:00
mposolda dc50c312cb Configurable if pagination and connectionPooling are supported in LDAP 2014-08-08 12:09:08 +02:00
mposolda 1f12a2d67b Adding LDAPUtils. Bit refactoring LDAP test for easier testing with various servers 2014-08-08 10:40:34 +02:00
Marek Posolda a2bef7dbbe Merge pull request #604 from mposolda/master
Fix testsuite hangs on MySQL and PostgreSQL due to uncommited transactio...
2014-08-07 20:40:12 +02:00
mposolda c6af13c8cc Fix testsuite hangs on MySQL and PostgreSQL due to uncommited transactions 2014-08-07 20:38:20 +02:00
Marek Posolda 5be5f6475f Merge pull request #603 from mposolda/master
Fix adding social link in mongo. Fixed export/import of federationProvid...
2014-08-07 17:39:56 +02:00
mposolda 5673fb34b1 Fix adding social link in mongo. Fixed export/import of federationProviders. Enhanced ExportImportTest 2014-08-07 17:33:48 +02:00
Marek Posolda 5214fe2a55 Merge pull request #602 from mposolda/master
Users not registered with FederationProvider during import, Update docs for database setup
2014-08-07 13:05:23 +02:00
mposolda 76db33829b KEYCLOAK-600 Users shouldn't be registered with Federation Provider on an import 2014-08-07 12:38:56 +02:00
mposolda 746da8f270 Possibility to specify hibernate dialect even if datasource is used 2014-08-07 12:27:12 +02:00
mposolda f8667cdb38 Update documentations for JPA and Mongo 2014-08-07 12:23:46 +02:00
Marek Posolda 1ec4fe921d Merge pull request #601 from mposolda/master
KEYCLOAK-618 Remove org.bouncycastle from jboss-modules-structure.xml as...
2014-08-07 10:34:48 +02:00
mposolda 915701106c KEYCLOAK-618 Remove org.bouncycastle from jboss-modules-structure.xml as it's in auth-server.war 2014-08-07 10:32:26 +02:00
Bill Burke 2309e6f040 Merge pull request #600 from patriot1burke/master
delete fed provider
2014-08-06 20:49:25 -04:00
Bill Burke 839d823edd change delete msg 2014-08-06 20:48:48 -04:00
Bill Burke 99e6f0edad delete fed provider 2014-08-06 20:38:30 -04:00
Bill Burke bb138bd6e4 Merge pull request #599 from patriot1burke/master
KEYCLOAK-547
2014-08-06 19:16:19 -04:00
Bill Burke 32a19563a5 KEYCLOAK-547 2014-08-06 19:15:52 -04:00
Bill Burke 3b65127399 Merge pull request #598 from patriot1burke/master
cookie cache off
2014-08-06 18:04:36 -04:00
Bill Burke c17a5823e9 cookie cache off 2014-08-06 18:01:16 -04:00
Bill Burke c9e88c944a Merge pull request #597 from patriot1burke/master
pom description
2014-08-06 17:50:25 -04:00
Bill Burke b93cf4868c pom description 2014-08-06 17:50:01 -04:00
Bill Burke 53ac88ca26 Merge pull request #596 from patriot1burke/master
version
2014-08-06 15:45:15 -04:00
Bill Burke aff32f69bb version 2014-08-06 15:44:50 -04:00
Bill Burke 4fcf11d0db Merge pull request #595 from patriot1burke/master
bump version
2014-08-06 09:00:47 -04:00
Bill Burke e04af84ac0 bump version 2014-08-06 09:00:23 -04:00
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
Andrea Vibelli 9e4086e501 Remove warning from Maven log4j:log4j:jar -> duplicate declaration 2014-07-31 11:06:24 +02: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
Davide Ungari 5764ad84e9 Fix equals huge error, too much Javascript lately 2014-07-27 10:02:41 +02:00
Davide Ungari f3fde4a8df Upgrade to tomcat.7.0.54 2014-07-27 10:01:02 +02:00
Davide Ungari 983ccdd121 Merge remote-tracking branch 'upstream/master' 2014-07-26 11:27:08 +02:00
Davide Ungari 73ed22c52c logout 2014-07-26 11:25:27 +02:00
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
Bill Burke f6b59b03bb Merge pull request #438 from patriot1burke/master
bump version
2014-05-29 12:16:30 -04:00
Bill Burke 2ae3775841 bump version 2014-05-29 12:12:33 -04:00
Stian Thorgersen 8573c13b8c Merge pull request #437 from mposolda/master
Improve PropertiesAuthenticationProvider to support retrieving user pass...
2014-05-29 16:10:11 +01:00
mposolda db1c6e9afd Improve PropertiesAuthenticationProvider to support retrieving user passwords from custom location and persisting password updates 2014-05-29 16:55:41 +02:00
Stian Thorgersen 429f003578 Merge pull request #436 from stianst/master
Fix audit provider example
2014-05-29 15:08:48 +01:00
Stian Thorgersen dd684858f2 Fix audit provider example 2014-05-29 15:08:27 +01:00
Stian Thorgersen 2e82d56634 Merge pull request #435 from stianst/master
Demo fixes
2014-05-29 14:04:40 +01:00
Stian Thorgersen 1ede6e70b7 Fix customer-portal-cli example 2014-05-29 14:04:10 +01:00
Stian Thorgersen 8908fbef58 Fix instructions for deploying demo to use jboss-as:deploy or wildfly:deploy 2014-05-29 14:03:50 +01:00
Stian Thorgersen 09a96b3a2b Merge pull request #434 from stianst/master
Added sunrise theme to examples, including instructions on how to deploy
2014-05-29 13:15:14 +01:00
Stian Thorgersen 5b7c8b6920 Added sunrise theme to examples, including instructions on how to deploy 2014-05-29 13:14:39 +01:00
Stian Thorgersen 409b46963e Merge pull request #433 from mposolda/master
Add more scopes into testrealm.json to ensure that admin is able to acce...
2014-05-29 13:03:04 +01:00
mposolda 53cf574735 Add more scopes into testrealm.json to ensure that admin is able to access all things he needs 2014-05-29 13:06:47 +02:00
Stian Thorgersen fe236cabd3 Merge pull request #431 from mposolda/master
Change default timeouts for testrealm.json bundled in examples, Fix admin-access-app example
2014-05-29 10:55:35 +01:00
Stian Thorgersen d25536569a Merge pull request #430 from PatrickMadden/master
Added bindIp support to embedmongo-maven-plugin configuration. Solves is...
2014-05-29 10:54:46 +01:00
mposolda 06b9499805 Fixing typo in admin console causing errors when change passwordCredentialsGrant 2014-05-29 11:42:54 +02:00
Stian Thorgersen 2a2e57467d Merge pull request #432 from stianst/master
Fix themes displayed multiple times in admin console
2014-05-29 10:28:22 +01:00
Stian Thorgersen 24ac6cbbac Fix themes displayed multiple times in admin console 2014-05-29 10:28:05 +01:00
Stian Thorgersen 0b68e52b83 Fix Cannot read property 'realm' of undefined 2014-05-29 10:20:49 +01:00
Stian Thorgersen cf1393ffe1 Updated sunrise theme example 2014-05-29 09:42:17 +01:00
mposolda c4808a3e61 Fix admin-App example 2014-05-29 10:29:06 +02:00
mposolda f0d37b19e2 Fix typo in docs 2014-05-29 10:28:54 +02:00
mposolda 65206a72b2 Change default timeouts for testrealm.json bundled in examples 2014-05-29 09:30:22 +02:00
Stian Thorgersen a91d4c06ee Merge pull request #429 from mposolda/master
Fixes in JS examples
2014-05-29 07:52:46 +01:00
PatrickMadden e8ad08bd28 Reuse bindIp of model for audit in integration test suite. 2014-05-28 20:02:42 -05:00
PatrickMadden 7a3b1ddd18 Added bindIp support to embedmongo-maven-plugin configuration. Solves issue of firewall pop-ups consistently displaying on every Microsoft Windows build. 2014-05-28 19:14:23 -05:00
mposolda db939ee076 Fix angular-product example 2014-05-28 23:30:34 +02:00
mposolda 5ede17d8b8 Replace innerText with innerHTML as innerText doesn't work on FF 2014-05-28 21:50:23 +02:00
Bill Burke 0ff992e04e Merge pull request #428 from patriot1burke/master
docs
2014-05-28 12:34:11 -04:00
Bill Burke 34a579821a docs 2014-05-28 12:33:49 -04:00
Stian Thorgersen dd30a35e1e Disable session iframe in Corodova 2014-05-28 17:29:13 +01:00
Stian Thorgersen 2074e1423f Fixes for example/cordova 2014-05-28 17:10:28 +01:00
Stian Thorgersen d5476b78ec Merge pull request #427 from stianst/master
Deploy server war and dist bundles to Maven repo. Also added '-parent' to some parent poms where this was missing
2014-05-28 15:32:58 +01:00
Stian Thorgersen df19700f69 Deploy server war and dist bundles to Maven repo. Also added '-parent' to some parent poms where this was missing 2014-05-28 15:32:20 +01:00
Bill Burke 3c605a7740 Merge pull request #426 from patriot1burke/master
docs and master realm rename
2014-05-28 09:51:56 -04:00
Bill Burke a64b35d72f doc merge 2014-05-28 09:33:42 -04:00
Bill Burke e880b77692 update docs 2014-05-28 09:31:33 -04:00
Stian Thorgersen e8fe26ff1c Merge pull request #425 from stianst/master
Fix for WildFly 8.1.0.CR2
2014-05-28 14:20:53 +01:00
Stian Thorgersen 108ccd98d0 Fix for WildFly 8.1.0.CR2 2014-05-28 14:20:29 +01:00
Stian Thorgersen 5fddc28cd6 Updated jboss maven plugin and added wildfly maven plugin. Both are skipped by default, so only needs to be specified in modules that should be deployed 2014-05-28 11:00:36 +01:00
Stian Thorgersen 63001d5e16 Merge pull request #424 from mposolda/master
Fix configuration of maven plugins in authentication-properties example
2014-05-28 09:59:36 +01:00
mposolda caccf76ea4 Fix configuration of maven plugins in authentication-properties example 2014-05-28 10:56:00 +02:00
Stian Thorgersen 5120549005 Merge pull request #423 from mposolda/master
Updated documentation and added example for Authentication SPI
2014-05-28 09:12:01 +01:00
mposolda e67032a9d7 Documentation about Authentication SPI, LDAP and Export/import 2014-05-27 22:37:25 +02:00
mposolda a903eb7605 Added example for AuthenticationProvider SPI 2014-05-27 22:37:25 +02:00
Bill Burke 5b431338c2 Merge pull request #422 from patriot1burke/master
admin console mistake
2014-05-27 14:56:14 -04:00
Bill Burke c20d488648 admin console mistake 2014-05-27 14:38:03 -04:00
Stian Thorgersen 57a8f3f5ee Added to migration guid for beta1 2014-05-27 15:29:04 +01:00
Stian Thorgersen 6dda7fc356 Added example providers for audit listener and audit provider 2014-05-27 15:11:52 +01:00
Stian Thorgersen 9261c1608f Fix missing @Path in admin console 2014-05-27 13:40:32 +01:00
Stian Thorgersen 80cd43390b Added doc for audit 2014-05-27 13:40:23 +01:00
Stian Thorgersen c196849574 Updated doc for themes 2014-05-27 13:08:00 +01:00
Stian Thorgersen 1007d19860 Updated instructions to configure Mongo through keycloak-server.json 2014-05-27 12:05:35 +01:00
Stian Thorgersen 374a7b8848 Updated url for OpenShift cartridge 2014-05-27 12:05:22 +01:00
Stian Thorgersen 8ae57fd117 Include all themes in configuration/themes to make it easy to modify/create themes 2014-05-27 12:05:09 +01:00
Bill Burke 5a2fd16b92 Merge pull request #421 from patriot1burke/master
jaxrs-doclet, more javadocs
2014-05-26 20:51:53 -04:00
Bill Burke 3545ac130b jax-doclet 2014-05-26 20:50:42 -04:00
Bill Burke 199c786e22 jaxrs-doclet support 2014-05-26 20:41:33 -04:00
Bill Burke 38b52283a5 Merge remote-tracking branch 'upstream/master' 2014-05-26 12:50:09 -04:00
Bill Burke 1f8b2d4c7b stuff 2014-05-26 12:49:56 -04:00
Bill Burke 9c0fa93510 Merge pull request #420 from patriot1burke/master
admin rest example, default origins, effect roles
2014-05-23 19:03:25 -04:00
Bill Burke ab2932f75e effective roles to oauth 2014-05-23 19:01:09 -04:00
Bill Burke 81083ef470 Merge remote-tracking branch 'upstream/master' 2014-05-23 18:22:34 -04:00
Bill Burke e4232c73c6 admin rest api example 2014-05-23 18:20:55 -04:00
Bill Burke 29070cec77 add KeycloakSecurityContext to principal 2014-05-23 16:26:44 -04:00
Bill Burke fbef9f7691 default web origins 2014-05-23 16:15:00 -04:00
Bill Burke 97f3a3feef Merge pull request #419 from patriot1burke/master
admin cors
2014-05-23 16:12:08 -04:00
Bill Burke 54cc095ff5 admin cors support 2014-05-23 16:02:14 -04:00
Stian Thorgersen 0ad4d5cc47 Change 'Composite roles' to 'Effective roles' on role mapping/scope pages 2014-05-23 16:44:55 +01:00
Bill Burke 236f3ab768 admin cors 2014-05-23 09:37:07 -04:00
Stian Thorgersen 6de7c42ac9 Merge pull request #418 from mposolda/master
Fixing typo
2014-05-23 10:21:44 +01:00
mposolda bb7a809ab5 Fixing typo 2014-05-23 11:19:17 +02:00
Stian Thorgersen 142b155460 Merge pull request #417 from mposolda/master
At least one redirect_uri must be available for oauthClients and applica...
2014-05-23 10:11:06 +01:00
Stian Thorgersen 0f6bc9c5c7 KEYCLOAK-492
Can't add scope on application role to application
2014-05-23 10:10:19 +01:00
mposolda e600d7c449 At least one redirect_uri must be available for oauthClients and applications, which are not bearer-only 2014-05-23 10:55:43 +02:00
Stian Thorgersen 37327be521 KEYCLOAK-482
Cannot read property 'realm' of undefined
2014-05-23 09:36:14 +01:00
Stian Thorgersen 07d2bf988a Merge pull request #416 from mposolda/master
Fix logging typo when importing roles
2014-05-23 09:14:10 +01:00
mposolda df06a0c878 Fix logging typo when importing roles 2014-05-23 09:46:50 +02:00
Stian Thorgersen cee3fea98f Merge pull request #415 from mposolda/master
Invalid active tab when on token-settings page
2014-05-23 08:39:49 +01:00
mposolda 5c378cbd9d Invalid active tab when on token-settings page 2014-05-23 08:51:06 +02:00
Stian Thorgersen 37099f3177 KEYCLOAK-494
Session state iframe uses first redirect uri for a client
2014-05-22 17:51:51 +01:00
Stian Thorgersen 128cc7eadb Fixes to js-console example 2014-05-22 17:07:40 +01:00
Stian Thorgersen de36973716 Redirect to login form automatically in keycloak.js if login-required is set 2014-05-22 16:59:38 +01:00
Stian Thorgersen 08b1996149 Removed jboss.as.jpa.managed property from persistence.xml as it's causing problems on AS 7.1 2014-05-22 16:01:05 +01:00
Stian Thorgersen 0574302840 Fix dialog for resetting user password 2014-05-22 15:39:31 +01:00
Stian Thorgersen fad0a7728c Make add redirect-uri and web-origin use same l&f 2014-05-22 15:10:22 +01:00
Stian Thorgersen 86ad7292af Fix updating sessions after logout session 2014-05-22 14:51:36 +01:00
Stian Thorgersen 74e2bfd9bd Merge pull request #414 from mposolda/master
Extract some version numbers into properties
2014-05-22 11:21:55 +01:00
mposolda 0c60bd80df Extract some versions into properties 2014-05-22 12:04:13 +02:00
Stian Thorgersen 46f81a331a Merge pull request #413 from mposolda/master
Fixing location of folder for FolderThemeProvider
2014-05-22 08:54:22 +01:00
mposolda b0ba7ed188 Fixing location of FolderThemeProvider 2014-05-22 09:21:42 +02:00
Bill Burke 0d9e14d4c7 Merge remote-tracking branch 'upstream/master' 2014-05-21 10:56:21 -04:00
Stian Thorgersen 10ae457237 Fixes to admin console 2014-05-21 14:10:59 +01:00
Stian Thorgersen 73f59417bd Remove index.html from redirect on '/auth/admin/' 2014-05-21 12:47:07 +01:00
Stian Thorgersen 6814230193 Fix NPE in account service 2014-05-21 12:13:00 +01:00
Stian Thorgersen d68131ac00 KEYCLOAK-475
Log is shown in menu when audit is disabled for realm
2014-05-21 12:05:32 +01:00
Stian Thorgersen 952f098440 KEYCLOAK-483
Remove 'index.html' from console url
2014-05-21 11:16:48 +01:00
Stian Thorgersen f08477ea66 Run import before creating default realm 2014-05-21 11:16:47 +01:00
Stian Thorgersen 8544dd66d8 Merge pull request #412 from mposolda/master
Mongo related fixes
2014-05-21 10:50:31 +01:00
Stian Thorgersen a5a2848251 KEYCLOAK-476
theme/account/patternfly/img/icon-sidebar-active.svg not found
2014-05-21 10:40:15 +01:00
mposolda 7232535729 More mongo fixes 2014-05-21 11:34:27 +02:00
mposolda 271292dbd4 Mongo related fixes 2014-05-21 11:34:27 +02:00
Stian Thorgersen eb47d43497 For installed app urn redirect to a page instead of returning the html, this is to prevent NPE if page is refreshed 2014-05-21 10:32:03 +01:00
Stian Thorgersen fd9317a295 KEYCLOAK-474
Code not visible for urn:ietf:wg:oauth:2.0:oob
2014-05-21 09:52:02 +01:00
Stian Thorgersen 11fc6d5321 KEYCLOAK-477
Remove keycloak.js debug statements
2014-05-21 09:39:02 +01:00
Stian Thorgersen 64a36aee03 Merge pull request #411 from stianst/master
Twitter fix and read keycloak-sever.json from standalone/configuration
2014-05-21 09:35:49 +01:00
Stian Thorgersen 59440840fe Read keycloak-sever.json from <JBOSS_HOME>/standalone/configuration if it exists 2014-05-21 09:35:01 +01:00
Stian Thorgersen c2075af7f7 Fix Twitter for localhost 2014-05-21 08:47:58 +01:00
Stian Thorgersen ab85f09608 Merge pull request #410 from ssilvert/master
Make UndertowUserSessionManagement class usable without the Servlet API.
2014-05-21 07:56:17 +01:00
Stan Silvert da799b18c3 Make UndertowUserSessionManagement class usable without the Servlet API. 2014-05-20 19:58:08 -04:00
Bill Burke ca6de3e486 simpler applicaiton create page 2014-05-20 17:45:14 -04:00
Bill Burke ae3c4e8459 default web origin is redirect uris 2014-05-20 17:40:45 -04:00
Bill Burke 8e79f550b0 Merge remote-tracking branch 'upstream/master' 2014-05-20 16:49:28 -04:00
Bill Burke 0137918701 urn 2014-05-20 16:49:25 -04:00
Bill Burke 79828ddc78 Merge pull request #409 from patriot1burke/master
fix urn redirect uri
2014-05-20 16:15:40 -04:00
Bill Burke fcca9dd90a fix urn redirect uri 2014-05-20 16:15:13 -04:00
Stian Thorgersen 1b4b537043 Merge pull request #408 from stianst/email-events
Email audit listener
2014-05-20 17:29:45 +01:00
Stian Thorgersen b09e2f697e Email audit listener 2014-05-20 17:04:17 +01:00
Bill Burke 2855baecef Merge pull request #407 from patriot1burke/master
check redirect uri exists in token service
2014-05-20 11:39:22 -04:00
Bill Burke b7cf1bb215 Merge remote-tracking branch 'upstream/master' 2014-05-20 11:38:50 -04:00
Bill Burke b3dd349342 check redirect uri exists in token service 2014-05-20 11:38:35 -04:00
Stian Thorgersen 357337047b Merge pull request #406 from stianst/master
Fix config for folder theme provider£
2014-05-20 14:42:39 +01:00
Stian Thorgersen 5496f043a5 Fix config for folder theme provider£ 2014-05-20 14:42:07 +01:00
Bill Burke a22aa8055f Merge pull request #405 from patriot1burke/master
redirect uris not required with bearer only
2014-05-20 09:31:23 -04:00
Bill Burke 57f0ea0638 Merge remote-tracking branch 'upstream/master' 2014-05-20 09:27:18 -04:00
Bill Burke f723ac79d1 redirect not required with bearer only 2014-05-20 09:19:04 -04:00
Stian Thorgersen 3a15b416a9 Merge pull request #404 from stianst/master
Add realm option to enable/disable Resource Owner Password Credentials G...
2014-05-20 11:33:07 +01:00
Stian Thorgersen cc97265c06 Add realm option to enable/disable Resource Owner Password Credentials Grant 2014-05-20 11:32:22 +01:00
Stian Thorgersen 665038d0ce Merge pull request #403 from stianst/master
Add email theme config for realm
2014-05-20 11:01:07 +01:00
Stian Thorgersen 8d1149dc07 Add email theme config for realm 2014-05-20 11:00:43 +01:00
Bill Burke ebea9e9270 Merge pull request #402 from patriot1burke/master
fix remove expired token
2014-05-19 18:53:54 -04:00
Bill Burke b5aa9efefb fix remove expired sessions 2014-05-19 18:53:28 -04:00
Bill Burke 95f56e2e62 fix removeexpired sessions 2014-05-19 18:33:54 -04:00
Bill Burke 273775d848 Merge pull request #401 from patriot1burke/master
fix aerogear again
2014-05-19 18:14:16 -04:00
Bill Burke 8606f344a8 fix aerogear again 2014-05-19 18:13:54 -04:00
Bill Burke 53c3696cbb Merge pull request #400 from patriot1burke/master
aerogear fix
2014-05-19 18:09:54 -04:00
Bill Burke 7203d9ba12 aerogear fix 2014-05-19 18:09:36 -04:00
Bill Burke 26d3e48555 Merge pull request #399 from patriot1burke/master
don't allow bearer-only to login
2014-05-19 15:09:18 -04:00
Bill Burke a53206995a stuff 2014-05-19 15:08:38 -04:00
Bill Burke b2c8f48af9 Merge pull request #398 from patriot1burke/master
require redirect
2014-05-19 14:54:31 -04:00
Bill Burke 11c23a7945 require redirect 2014-05-19 14:44:36 -04:00
Stian Thorgersen 3be4579204 Merge pull request #397 from stianst/email-themes
Email themes
2014-05-19 17:40:52 +01:00
Stian Thorgersen a3d08e7191 Added theme support to emails 2014-05-19 17:34:58 +01:00
Bill Burke 7e8b16f975 acct svc + sessions 2014-05-19 17:34:48 +01:00
Bill Burke 966eb2fe47 Merge pull request #396 from patriot1burke/master
acct svc + sessions
2014-05-19 11:46:04 -04:00
Bill Burke 5826f02ebe acct svc + sessions 2014-05-19 11:45:42 -04:00
Bill Burke 2b525c6016 Merge pull request #395 from patriot1burke/master
fix brute shutdown
2014-05-19 10:35:49 -04:00
Bill Burke dc7923c436 fix brute shutdown 2014-05-19 10:33:49 -04:00
Stian Thorgersen 00a64eeb89 Merge pull request #394 from stianst/master
Added keycloak-server.json for project-integrations/aerogear-ups
2014-05-19 10:47:15 +01:00
Stian Thorgersen 76c9f2c4ec Added keycloak-server.json for project-integrations/aerogear-ups 2014-05-19 10:46:33 +01:00
Bill Burke dafa52ea93 Merge pull request #393 from patriot1burke/master
user-session client association
2014-05-17 14:32:46 -04:00
Bill Burke c2bf6c3822 Merge remote-tracking branch 'upstream/master' 2014-05-17 14:24:37 -04:00
Bill Burke ab8de6ba25 client user-session association 2014-05-17 14:24:32 -04:00
Stian Thorgersen 6714e2b87f Merge pull request #392 from stianst/master
Server config
2014-05-16 17:34:13 +01:00
Stian Thorgersen 855269f35d Added 'keycloak-server.json' for configuring the server
Added SPI interface to detect SPI's
Converted Model to SPI/Provider to be loaded through ProviderSessionFactory
2014-05-16 17:33:22 +01:00
Stian Thorgersen a3ed02ea16 Merge pull request #391 from jeroenr/master
CORS improvements and clean up
2014-05-16 16:06:43 +01:00
Jeroen Rosenberg 84f13eadc1 * Possibility to add exposed headers
* Default allow headers
* Fix warnings, unused import, redundancies
2014-05-16 16:39:17 +02:00
Jeroen Rosenberg cedf43c084 Refactored joining of allowed headers to be more efficient 2014-05-16 14:28:49 +02:00
Jeroen Rosenberg 4c281a39bb Unused import 2014-05-16 14:10:13 +02:00
Jeroen Rosenberg 5533357c46 Added HEAD as default allowed method for Cors 2014-05-16 14:09:50 +02:00
Stian Thorgersen ae4d83107a Merge pull request #390 from jeroenr/master
Fixed URI encoding for clientId and parse optional client secret from config file
2014-05-16 13:02:41 +01:00
Jeroen Rosenberg b92494f023 Refactored to use switch with fall through for readability 2014-05-16 13:52:59 +02:00
Jeroen Rosenberg d3a2617d3c Read optional client secret configuration to ensure we can use Basic auth as well 2014-05-16 13:49:28 +02:00
Jeroen Rosenberg 740943290c URI encode clientId for referrer parameter 2014-05-16 13:46:46 +02:00
Bill Burke c51c7fe189 Merge pull request #389 from jeroenr/master
Improved exception handling. Don't swallow exception
2014-05-16 06:34:18 -04:00
Bill Burke 610eaaaaff Merge pull request #387 from cardosogabriel/POLISHING_UI
UI POLISHING: design styles and content
2014-05-16 06:34:09 -04:00
Jeroen Rosenberg bde9944449 Improved exception handling. Don't swallow exception 2014-05-16 09:35:19 +02:00
Bill Burke 1318ea85be Merge pull request #388 from patriot1burke/master
session idle and max lifespan
2014-05-15 23:18:43 -04:00
Bill Burke 67e3e60f28 test sso idle, logout on idle 2014-05-15 23:10:14 -04:00
Bill Burke bc2360e985 sso session idle and max lifespan 2014-05-15 17:25:57 -04:00
Gabriel Cardoso 8e7b0022a6 UI POLISHING: design styles and content 2014-05-15 15:22:38 -03:00
Bill Burke 27efd3c0a4 ssoSessionIdleTimeout refactor 2014-05-15 13:53:28 -04:00
Bill Burke 07a31d3f35 Merge pull request #386 from patriot1burke/master
check ssl required in adapter
2014-05-14 15:24:22 -04:00
Bill Burke 07dbb7d7b7 check ssl required in adapter 2014-05-14 15:23:45 -04:00
Bill Burke 26f6da10dd Merge pull request #385 from patriot1burke/master
Improved role and scope mapping screens
2014-05-14 14:50:52 -04:00
Bill Burke 7ba8e09aef improved scope screen 2014-05-14 14:50:11 -04:00
Stian Thorgersen d95372c993 Merge pull request #384 from stianst/master
Updated session status iframe for JavaScript adapter
2014-05-14 17:54:58 +01:00
Stian Thorgersen 643daadf60 Updated session status iframe for JavaScript adapter to be created automatically, and to invoke onAuthLogout callback if user is logged out 2014-05-14 17:46:30 +01:00
Stian Thorgersen 7bea4af6c9 Redirect to login page if logged out and submitting forms in acct mngmt 2014-05-14 17:46:30 +01:00
Stian Thorgersen b27776b3c6 Merge pull request #383 from matzew/master
removing java7 ctor usage of runtimeexception
2014-05-14 16:48:15 +01:00
Matthias Wessendorf d9c8dedcfb removing JavaSE6 incompatible ctor 2014-05-14 17:43:36 +02:00
Matthias Wessendorf 9e0bf9e7dc Removing exception ctor that does not work w/ java 6 2014-05-14 17:40:27 +02:00
Bill Burke 0e0dfb60e0 composite role mapping listing 2014-05-14 10:37:50 -04:00
Stian Thorgersen b95fd0d0b0 Merge pull request #382 from stianst/master
KEYCLOAK-431 View open sessions, and logout all sessions, through accoun...
2014-05-14 11:56:52 +01:00
Stian Thorgersen f4f9b1e323 KEYCLOAK-431 View open sessions, and logout all sessions, through account management 2014-05-14 11:56:28 +01:00
Bill Burke f7c3373f75 Merge pull request #381 from patriot1burke/master
IE fixes
2014-05-13 22:47:46 -04:00
Bill Burke 639b7c5610 fix IE problems 2014-05-13 22:33:46 -04:00
Bill Burke b30809d681 httponly, ie keycloak.js fix 2014-05-13 22:06:32 -04:00
Bill Burke 0731f9977b Merge pull request #380 from patriot1burke/master
cors example
2014-05-13 17:17:51 -04:00
Bill Burke e8f8829a76 cors example 2014-05-13 17:17:27 -04:00
Bill Burke 663ff30eae Merge pull request #379 from patriot1burke/master
angular example
2014-05-13 12:07:59 -04:00
Bill Burke 01d22c3aab angular example 2014-05-13 12:07:28 -04:00
Bill Burke 9b24369b92 Merge pull request #378 from patriot1burke/master
update ups writeup
2014-05-12 19:45:24 -04:00
Bill Burke f6645eea92 update ups writeup 2014-05-12 19:45:01 -04:00
Bill Burke 634f61281d Merge pull request #377 from patriot1burke/master
aerogear template
2014-05-12 19:40:00 -04:00
Bill Burke c560a739b1 aerogear readme 2014-05-12 19:39:29 -04:00
Bill Burke ea672e36ae rename realm management app 2014-05-12 19:28:34 -04:00
Bill Burke eb9335f706 aerogear 2014-05-12 18:34:17 -04:00
Bill Burke d429525620 Merge pull request #376 from patriot1burke/master
fix create realm
2014-05-12 15:42:42 -04:00
Bill Burke b1a480c20d fix create realm 2014-05-12 15:42:10 -04:00
Bill Burke 0fcebb8670 remove bundled app 2014-05-12 15:38:15 -04:00
Bill Burke 3e32bd116b aerogear demo update 2014-05-12 15:35:54 -04:00
Bill Burke a4cb268703 Merge pull request #375 from patriot1burke/master
per-realm admin console
2014-05-12 10:13:18 -04:00
Bill Burke 06b98589eb Merge remote-tracking branch 'upstream/master' 2014-05-12 10:12:42 -04:00
Bill Burke 1e1991e285 per-realm admin 2014-05-12 10:12:31 -04:00
Bill Burke b0446fab0c Merge pull request #374 from patriot1burke/master
iframe check login
2014-05-10 11:28:24 -04:00
Bill Burke 1194e40ef2 iframe check login 2014-05-10 11:23:44 -04:00
Stian Thorgersen 2a820c73b1 Merge pull request #373 from stianst/master
KEYCLOAK-421 Set realm admin apps to bearer-only
2014-05-09 12:03:56 +01:00
Stian Thorgersen 624fcf6197 KEYCLOAK-421 Set realm admin apps to bearer-only 2014-05-09 12:03:39 +01:00
Stian Thorgersen 59747500aa Merge pull request #372 from stianst/login-session
KEYCLOAK-432 Added user sessions
2014-05-09 11:53:23 +01:00
Stian Thorgersen 6f0b12174c KEYCLOAK-432 Added user sessions 2014-05-09 11:52:45 +01:00
Bill Burke 5568c8dc7d Merge pull request #371 from patriot1burke/master
keycloak.js admin login
2014-05-08 20:08:52 -04:00
Bill Burke d957cc4883 Merge remote-tracking branch 'upstream/master' 2014-05-08 20:03:20 -04:00
Bill Burke 2d949b63b5 keycloak.js login for admin 2014-05-08 19:55:57 -04:00
Stian Thorgersen abdbef6a51 Merge pull request #370 from mposolda/master
Social fixes and improvements
2014-05-07 16:50:19 +01:00
mposolda c51011acef KEYCLOAK-354 Possibility for admin to see social links of some user in admin console 2014-05-07 17:28:13 +02:00
mposolda 6b1e0401ba KEYCLOAK-361 it shouldn't be possible to remove last social link if user don't have password 2014-05-07 17:28:13 +02:00
Stian Thorgersen d523242dbb Merge pull request #368 from mposolda/master
A bit more cleanup of dependencies
2014-05-07 12:52:22 +01:00
Stian Thorgersen 92058b16c9 Merge pull request #369 from abstractj/cleanup
Little code clean up
2014-05-07 12:52:09 +01:00
Bruno Oliveira 4424c425a6 Redundant initialization 2014-05-07 08:15:31 -03:00
Bruno Oliveira 5f7b0aae06 Variables will be never used 2014-05-07 08:15:02 -03:00
Bruno Oliveira f77e3b5532 Unused imports 2014-05-07 08:14:32 -03:00
Bruno Oliveira 334b981741 notBefore wasn't being assigned 2014-05-07 08:10:03 -03:00
Bruno Oliveira 957ff7d206 Make it final 2014-05-07 08:05:57 -03:00
Bruno Oliveira 5973ccd522 Scope can be private 2014-05-07 08:03:21 -03:00
Bruno Oliveira 1ea1f0af96 Removing redundant local variable 2014-05-07 07:49:45 -03:00
Bruno Oliveira f5ac81db41 Return not necessary here 2014-05-07 07:48:42 -03:00
Bruno Oliveira 9e7f52ccda extends Object isn't necessary 2014-05-07 07:47:39 -03:00
mposolda f8173e6a5a A bit more cleanup of dependencies 2014-05-07 11:08:47 +02:00
Bill Burke 5edf05d569 Merge pull request #366 from mposolda/export-import-rebased
Full export-import implemented. Remove dependency of mongo on picketlink...
2014-05-06 21:17:51 -04:00
Bill Burke 4666bcbfb2 Merge pull request #367 from patriot1burke/master
remove /rest from RealmsResource - pom fixes
2014-05-06 21:09:11 -04:00
Bill Burke a374e52ea5 /rest removal web.xml fixes 2014-05-06 21:08:27 -04:00
Bill Burke f987d331b7 /rest removal and pom fixes 2014-05-06 20:43:01 -04:00
Bill Burke 314f177fe7 Merge remote-tracking branch 'upstream/master' 2014-05-06 20:21:59 -04:00
Bill Burke 64f591769a remove /rest from RealmsResource 2014-05-06 20:21:49 -04:00
mposolda 0801c9c120 Full export-import implemented. Remove dependency of mongo on picketlink-common 2014-05-06 22:15:57 +02:00
Bill Burke e4e02a2615 Merge pull request #365 from patriot1burke/master
aerogear fix
2014-05-06 10:41:42 -04:00
Bill Burke ff69607f52 aerogear fix 2014-05-06 10:41:17 -04:00
Bill Burke a23b213736 Merge pull request #362 from matzew/JSP-Error
Removing JSP code, adding simple text for a simple demo...
2014-05-06 10:33:27 -04:00
Bill Burke 36ce4e04d9 Merge pull request #364 from patriot1burke/master
add aerogear stuff
2014-05-06 10:10:45 -04:00
Bill Burke 3b6593b476 add aerogear stuff 2014-05-06 10:10:17 -04:00
Bill Burke 6ef3102cd1 Merge pull request #361 from patriot1burke/master
remove ups social dependencies
2014-05-06 10:08:08 -04:00
Bill Burke 39381c104c merge fixes 2014-05-06 10:07:48 -04:00
Bill Burke c04b490f29 port fix 2014-05-06 09:59:52 -04:00
Stian Thorgersen e1f2d296bf Merge pull request #363 from stianst/master
Removed org.json
2014-05-06 13:05:30 +01:00
Stian Thorgersen 1d760388de KEYCLOAK-441 Remove org.json 2014-05-06 12:32:29 +01:00
Stian Thorgersen 8286d1ce34 Fix breadcrumb for audit pages£ 2014-05-06 12:26:17 +01:00
Matthias Wessendorf 7b14d29dee Removing JSP code, adding simple text for a simple demo... 2014-05-06 11:29:08 +02:00
Bill Burke 75224d25b0 remove picketlink dependencies 2014-05-05 18:50:41 -04:00
Bill Burke 3a3ae742a4 Merge pull request #360 from patriot1burke/master
adatper deployment context fixes, picketlink abstraction
2014-05-05 18:21:45 -04:00
Bill Burke e7c64b7812 adatper deployment context fixes, picketlink abstraction 2014-05-05 18:20:52 -04:00
Bill Burke e55eb73fb9 Merge pull request #359 from patriot1burke/master
fix tomcat7 build
2014-05-02 13:00:32 -04:00
Bill Burke 201b35be54 fix tomcat7 build 2014-05-02 13:00:12 -04:00
Bill Burke e25b2b05ae Merge pull request #352 from ungarida/master
Tomcat7 adapter
2014-05-02 12:36:06 -04:00
Bill Burke 6b470f826e Merge pull request #358 from patriot1burke/master
dynamic key lookup, relative uris
2014-05-02 12:34:18 -04:00
Bill Burke 4517d9d707 Merge remote-tracking branch 'upstream/master' 2014-05-02 12:30:31 -04:00
Bill Burke 7ff2c77a82 relative uri tests and fixes 2014-05-02 12:30:08 -04:00
Bill Burke e5e43173bc relative redirect uris 2014-05-02 10:58:29 -04:00
Bill Burke 6f3822e6ea relative adapter urls 2014-05-02 10:17:40 -04:00
Bill Burke 95bafc416d Merge pull request #357 from patriot1burke/master
fix mime type
2014-04-30 14:26:12 -04:00
Bill Burke 2576975988 fix mimetype 2014-04-30 14:25:23 -04:00
Bill Burke 8c5ae9d052 fix mimetype 2014-04-30 14:24:37 -04:00
Stian Thorgersen 8ed5282da5 Merge pull request #356 from stianst/master
Documentation
2014-04-30 14:38:27 +01:00
Stian Thorgersen 9b6d9fda43 Updated documentation for js adapter 2014-04-30 14:38:02 +01:00
Stian Thorgersen 77c6b391c4 Document how to enable social only login 2014-04-30 14:07:03 +01:00
Stian Thorgersen c8432f74f6 Merge pull request #355 from stianst/master
KEYCLOAK-211 Enable social only login
2014-04-30 13:36:25 +01:00
Stian Thorgersen 8fa3425886 KEYCLOAK-211 Enable social only login 2014-04-30 11:57:44 +01:00
Stian Thorgersen 84396d0da1 Merge pull request #354 from stianst/master
KEYCLOAK-333 Removed use of RestEasy's Logger
2014-04-30 11:06:51 +01:00
Stian Thorgersen 38e6bde07e KEYCLOAK-415 Make sure query params are included when navigating in acct mngmt 2014-04-30 11:03:13 +01:00
Stian Thorgersen 9811aaeecc KEYCLOAK-333 Removed use of RestEasy's Logger 2014-04-30 10:13:53 +01:00
Stian Thorgersen 7284aae4df Merge pull request #353 from stianst/constraints
Ensure role name unique within realm/app
2014-04-30 09:50:58 +01:00
Stian Thorgersen 316431c4d1 Ensure role name unique within realm/app 2014-04-30 09:50:29 +01:00
Stian Thorgersen bb039576d4 Merge pull request #351 from stianst/constraints
Ensure application and client names are unique within realm
2014-04-29 17:16:25 +01:00
Stian Thorgersen 646e762cbe Ensure user loginName and email unique within realm 2014-04-29 17:15:28 +01:00
Stian Thorgersen 1d94649b96 Ensure application and client names are unique within realm 2014-04-29 12:03:09 +01:00
Stian Thorgersen 1fa019e9dd Merge pull request #350 from stianst/constraints
Enforce that realm name is unique in model
2014-04-29 10:44:42 +01:00
Stian Thorgersen 364998b34b Enforce that realm name is unique in model 2014-04-29 10:43:27 +01:00
Stian Thorgersen 6778fbfa3b Merge pull request #349 from mposolda/master
Fix testsuite with mongo. Upgrade picketlink and enable connection pooling for LDAP
2014-04-29 10:23:22 +01:00
mposolda bb11ad2ec1 KEYCLOAK-419 Upgrade picketlink dependency and enable ldap connection pooling 2014-04-29 11:10:10 +02:00
mposolda b6386630fb Fix testsuite with mongo 2014-04-29 10:37:43 +02:00
Bill Burke 363e5cdf64 Merge pull request #348 from patriot1burke/master
KeycloakApplication refactor
2014-04-28 18:05:59 -04:00
Bill Burke 7594be8014 merge 2014-04-28 18:05:03 -04:00
Bill Burke 62f8811a46 Merge remote-tracking branch 'upstream/master'
Conflicts:
	bundled-war-example/src/main/java/org/keycloak/server/KeycloakServerApplication.java
	bundled-war-example/src/main/webapp/WEB-INF/web.xml
2014-04-28 18:04:50 -04:00
Bill Burke 2d1dc4a874 application refactor 2014-04-28 17:34:06 -04:00
Stian Thorgersen 0546aebc84 More fixes to bundled war example 2014-04-28 14:32:25 +01:00
Stian Thorgersen c06009d5fb KEYCLOAK-430 Fix bundled war example 2014-04-28 13:36:34 +01:00
Stian Thorgersen 3d02fd5d0e KEYCLOAK-429 Remove role from composite roles when deleted 2014-04-28 12:55:04 +01:00
Bill Burke 562f6703b6 Merge remote-tracking branch 'upstream/master' 2014-04-25 13:15:00 -04:00
Stian Thorgersen 573c88564b Temporarily disabled unique constraint on Realm names as it breakes tests 2014-04-25 17:58:49 +01:00
Stian Thorgersen dabf101d96 Merge pull request #347 from stianst/master
Ensure Realm names are unique
2014-04-25 17:02:29 +01:00
Stian Thorgersen 292089cee8 Ensure Realm names are unique 2014-04-25 17:02:03 +01:00
Bill Burke 5594c73ceb Merge remote-tracking branch 'upstream/master' 2014-04-25 10:34:35 -04:00
Stian Thorgersen ce6652efb1 Merge pull request #346 from stianst/master
KEYCLOAK-347 Link realm and realm-permissions application
2014-04-25 15:32:47 +01:00
Stian Thorgersen f64f55a4c6 KEYCLOAK-347 Link realm and realm-permissions application 2014-04-25 15:32:28 +01:00
Bill Burke 9a3a8c39f4 merge 2014-04-25 10:03:56 -04:00
Bill Burke 1de4c31750 wtf 2014-04-25 10:02:49 -04:00
Bill Burke bda85f700a Merge pull request #343 from matzew/master
Adding simple CDI injection into resources
2014-04-25 09:58:59 -04:00
Stian Thorgersen 3471ce6c63 Merge pull request #345 from stianst/master
KEYCLOAK-385 Add CORS support to refresh token
2014-04-25 14:09:56 +01:00
Stian Thorgersen b8dfac391a KEYCLOAK-385 Add CORS support to refresh token 2014-04-25 14:09:39 +01:00
Stian Thorgersen 28546ad031 Merge pull request #344 from stianst/master
Theme support for admin
2014-04-25 13:59:41 +01:00
Stian Thorgersen d6e5e376bf Theme support for admin 2014-04-25 13:58:58 +01:00
Matthias Wessendorf 9b055c6ad6 Adding simple CDI injection into resources 2014-04-25 13:24:21 +02:00
Stian Thorgersen a3c17d1071 Merge pull request #342 from stianst/master
Added support for common resources to themes
2014-04-24 09:27:02 +01:00
Stian Thorgersen d57cd1aa91 Added support for common resources to themes 2014-04-24 09:26:19 +01:00
Bill Burke 3405330d92 Merge pull request #341 from patriot1burke/master
brute force fixes
2014-04-23 17:56:34 -04:00
Bill Burke 541e865fe8 brute force fixes 2014-04-23 17:55:13 -04:00
Davide Ungari c03b97d2d4 #cfg update version 2014-04-20 12:06:31 +02:00
Davide Ungari 5d275de8b2 #dev integrated adapter tomcat7 2014-04-18 08:32:42 +02:00
Bill Burke 80f3a3152c Merge pull request #340 from patriot1burke/master
brute force settings
2014-04-15 11:37:49 -04:00
Bill Burke 54abfb670c brute force settings 2014-04-15 11:37:27 -04:00
Bill Burke b41bf9f231 Merge pull request #339 from patriot1burke/master
more brute force detection
2014-04-14 18:59:09 -04:00
Bill Burke 2b8d2288fb more brute force detection 2014-04-14 18:58:45 -04:00
Bill Burke b556ff8a83 Merge pull request #338 from patriot1burke/master
move things around
2014-04-14 16:53:51 -04:00
Bill Burke 4c8471ef43 move things around 2014-04-14 16:51:53 -04:00
Bill Burke 1aa58ec580 Merge pull request #337 from patriot1burke/master
app/keycloak self bootstrapping bundle
2014-04-11 13:26:22 -04:00
Bill Burke 272806a3f3 app/keycloak self bootstrapping bundle 2014-04-11 13:24:07 -04:00
Bill Burke 51a718f337 Merge pull request #336 from patriot1burke/master
workarounds for resteasy 2.3.7 bugs
2014-04-10 22:34:19 -04:00
Bill Burke cc982cf246 workarounds for resteasy 2.3.7 bugs 2014-04-11 10:33:53 -04:00
Bill Burke 0896808625 Merge pull request #334 from mposolda/master
Reenable AuthProvidersIntegrationTest.registerUserLdapSuccess. Add varia...
2014-04-10 12:16:08 -04:00
Bill Burke c562e88e75 Merge pull request #335 from patriot1burke/master
fix server jboss-deployment-structure
2014-04-10 12:15:57 -04:00
Bill Burke abd7163205 fix server jboss-deployment-structure 2014-04-11 00:15:35 -04:00
mposolda 1701afb6d4 Fix standalone KeycloakServer 2014-04-10 14:59:54 +02:00
mposolda d8937b11cf Reenable AuthProvidersIntegrationTest.registerUserLdapSuccess. Add variable sleep after undertow stop in testsuite (some windows envs have issues when server is not fully stopped) 2014-04-10 10:29:13 +02:00
Bill Burke de871585e0 Merge pull request #333 from patriot1burke/master
remove transitive dependencies
2014-04-09 23:30:16 -04:00
Bill Burke b41c45d40a remove transitive dependencies 2014-04-10 11:29:47 -04:00
Bill Burke ecaa0d1401 use resteasy 2.3.7 2014-04-10 05:21:07 -04:00
Bill Burke cdc35d99bc cleanup 2014-04-09 22:34:36 -04:00
Bill Burke f5f96c5021 Merge pull request #332 from patriot1burke/master
use resteasy 2.3.7
2014-04-09 17:21:37 -04:00
Bill Burke 29a139f56b Merge pull request #331 from patriot1burke/master
cleanup
2014-04-09 14:00:19 -04:00
Stian Thorgersen daf1f2ed45 Merge pull request #330 from mposolda/master
Fix LDAP test on windows. Ensure that directory with data for embedded A...
2014-04-09 18:44:57 +01:00
mposolda eb37890924 Fix LDAP test on windows. Ensure that directory with data for embedded ApacheDS is deleted 2014-04-09 18:56:36 +02:00
Stian Thorgersen eb3e69d5d7 Updated audit timer 2014-04-09 06:40:15 +01:00
mposolda 5aefe52ccc Refactoring of Authentication SPI and Picketlink to use ProviderSessions
Refactoring of ProviderSessionFactory to support dependencies between components
Calling lifecycle methods
Removing KeycloakRegistry
2014-04-09 00:34:01 +02:00
mposolda 0d00db281a Fix the case when user is directly deleted in LDAP server 2014-04-09 00:06:04 +02:00
mposolda c8c4cfbaae Restructure of authentication module and packages 2014-04-09 00:06:04 +02:00
Bill Burke d5be56fa21 Merge pull request #328 from patriot1burke/master
fix broken build
2014-04-08 11:33:38 -04:00
Bill Burke 1d55a4f1e9 fix broken build 2014-04-08 23:32:26 -04:00
Stian Thorgersen 83bc115b63 Merge pull request #327 from stianst/master
Add timer jars to server
2014-04-08 13:09:26 +01:00
Stian Thorgersen e952ff142d Add timer jars to server 2014-04-08 13:09:06 +01:00
Stian Thorgersen b94bad7f58 Merge pull request #326 from stianst/master
Clearing audit events through admin console and through timer
2014-04-08 12:43:52 +01:00
Stian Thorgersen 354cf02aaa Fix audit mongo tests 2014-04-08 12:43:01 +01:00
Stian Thorgersen 7f0cf3eda8 Allow clearing audit events through admin console, and added timer to clear expired events 2014-04-08 11:32:20 +01:00
Stian Thorgersen 9bc0bd452d Merge pull request #325 from mposolda/master
Logging message during ldap bootstrap
2014-04-08 09:43:05 +01:00
mposolda d124f43423 Logging message during ldap bootstrap 2014-04-07 19:40:02 +02:00
Stian Thorgersen a197bda363 Merge pull request #324 from stianst/master
Audit configurable through admin console
2014-04-07 18:06:43 +01:00
Stian Thorgersen 8ca46fa35d Audit configurable through admin console 2014-04-07 17:58:52 +01:00
Stian Thorgersen aec8feab49 Merge pull request #323 from stianst/master
Move setting cors properties
2014-04-07 13:59:39 +01:00
Stian Thorgersen e7c30fff48 Move setting cors properties 2014-04-07 13:58:35 +01:00
Stian Thorgersen 2916cce6fb Merge pull request #322 from stianst/master
KEYCLOAK-411 Set cors properties in KeycloakDeployment
2014-04-07 13:39:53 +01:00
Stian Thorgersen bf95c2ba85 KEYCLOAK-411 Set cors properties in KeycloakDeployment 2014-04-07 13:39:32 +01:00
Stian Thorgersen 6081572179 Merge pull request #321 from stianst/master
Fix testsuite for mongo
2014-04-07 13:38:01 +01:00
Stian Thorgersen bbf5fee320 Fix testsuite for mongo 2014-04-07 13:35:26 +01:00
Stian Thorgersen d66862fd26 Merge pull request #320 from matzew/master
Adding JPA-Audit PU
2014-04-07 13:21:26 +01:00
Matthias Wessendorf 1c0ef4621e Adding JPA-Audit PU 2014-04-07 14:01:31 +02:00
Stian Thorgersen 323e032287 Merge pull request #319 from stianst/master
Update admin console to allow changing context-path for KC
2014-04-07 11:21:48 +01:00
Stian Thorgersen 948960f33f Allow changing base url for Keycloak 2014-04-07 10:54:27 +01:00
Stian Thorgersen abde247e14 Moved admin-ui-styles into admin-ui 2014-04-07 10:37:21 +01:00
Stian Thorgersen a0cd2bf5a7 Merge pull request #318 from mposolda/ldap
Basic support for registration of new users in AuthenticationProvider (like LDAP). Other improvements in auth SPI
2014-04-07 09:35:35 +01:00
mposolda 58083fbb96 Hide password tab in acct management if passwordUpdate not supported 2014-04-04 23:47:12 +02:00
mposolda ad068a300b Basic support for registration of new users in AuthenticationProvider 2014-04-04 19:53:02 +02:00
mposolda be320e11a5 Improve handling of exceptions thrown from picketlink 2014-04-04 16:35:26 +02:00
Stian Thorgersen b7826be103 Merged humanfriendly filter with capitalize 2014-04-04 15:30:06 +01:00
Stian Thorgersen 216e24864a Merge branch 'ldap' of https://github.com/mposolda/keycloak into mposolda-ldap
Conflicts:
	admin-ui/src/main/resources/META-INF/resources/admin/js/app.js
	admin-ui/src/main/resources/META-INF/resources/admin/js/controllers/realm.js
2014-04-04 15:29:03 +01:00
Stian Thorgersen afea032322 Merge pull request #317 from stianst/master
Added audit to admin console
2014-04-04 15:19:40 +01:00
Stian Thorgersen 88ddc8ebca Added audit to admin console 2014-04-04 15:16:08 +01:00
mposolda 2aac603fad Added configuration of authentication providers into admin console 2014-04-04 13:20:12 +02:00
Stian Thorgersen 8caf3fa83a Added details to log view in acct mngmt 2014-04-04 11:01:18 +01:00
Stian Thorgersen 42975f0edf Merge pull request #315 from stianst/master
Added audit log to account mngmt
2014-04-03 18:24:11 +01:00
Stian Thorgersen 3433227fa7 Added audit log to account mngmt 2014-04-03 16:27:31 +01:00
Stian Thorgersen e6067c915d Added ProviderSession to requests 2014-04-03 16:27:31 +01:00
Stian Thorgersen fcfbf156ce Merge pull request #314 from mposolda/ldap
Fixing testsuite failures with mongo model
2014-04-03 10:26:54 +01:00
mposolda d564955cab Fixing testsuite failures with mongo model 2014-04-03 10:58:39 +02:00
Bill Burke 30d523a5c2 Merge pull request #313 from patriot1burke/master
brute force protection
2014-04-02 20:27:15 -04:00
Bill Burke 126b444d77 brute force merge 2014-04-02 20:26:33 -04:00
Bill Burke d58870545f brute force protection 2014-04-02 20:09:14 -04:00
Bill Burke 231e8895a5 Merge pull request #309 from vibe13/master
Cleaning of pom.xml files
2014-04-02 11:39:04 -04:00
Bill Burke 7d7b9e5b73 Merge pull request #312 from mposolda/ldap
Refactoring of AuthenticationProvider SPI. Add Ldap settings into admin console
2014-04-02 11:37:11 -04:00
mposolda 25bf6d63b4 Refactoring of AuthenticationProvider SPI 2014-04-02 17:27:07 +02:00
mposolda 05cd8a82e5 Storing default AuthenticationProvider at the realm creation time 2014-04-02 17:17:33 +02:00
mposolda 1c218c8e9b Add Ldap settings into admin console 2014-04-02 17:17:32 +02:00
Stian Thorgersen 8af81cd290 Merge pull request #311 from stianst/master
Added JPA and Mongo audit providers. Add audit deps to server war.
2014-04-02 14:05:07 +01:00
Stian Thorgersen 869601d041 Added audit deps to server war 2014-04-02 11:37:22 +01:00
Stian Thorgersen 21239fbab9 Added Mongo audit provider 2014-04-01 18:00:35 +01:00
Stian Thorgersen 722a077de7 Added JPA audit provider£ 2014-04-01 15:13:53 +01:00
Stian Thorgersen 1e15e97d17 Merge pull request #310 from stianst/audit
Started audit
2014-03-31 17:43:42 +01:00
Stian Thorgersen 225307e855 KEYCLOAK-389 Added AuditListener SPI
KEYCLOAK-390 Added JBoss Logging AuditListener
KEYCLOAK-391 Audit Token events
2014-03-31 17:35:14 +01:00
Andrea Vibelli 84f1e1b56e Extraction into properties of maven-compiler-plugin source and target 2014-03-31 11:17:16 +02:00
Andrea Vibelli bdf1c1f495 Remove unnecessary version declaration and insertion of groupId 2014-03-31 10:45:11 +02:00
Andrea Vibelli 5e1da96177 Remove unnecessary version declarations 2014-03-31 10:44:59 +02:00
Andrea Vibelli 3ddb2084cd Remove duplicated dead code 2014-03-31 10:44:47 +02:00
Andrea Vibelli d831e25366 Remove unnecessary groupId declarations 2014-03-31 10:44:34 +02:00
Andrea Vibelli 37fdc50fb4 Remove warnings about no schema definition in pom.xml files 2014-03-31 10:44:22 +02:00
Bill Burke d8a3025ea1 Merge remote-tracking branch 'upstream/master' 2014-03-27 14:10:01 -04:00
Bill Burke 911cf2ae45 Merge pull request #307 from jpkrohling/JavascriptCharset
Fixed charset issue while decoding token with atob
2014-03-27 11:40:48 -04:00
Bill Burke 60ba41e82f Merge pull request #308 from mposolda/ldap
Fix LDAP tests and teststuite on windows. Set initial password directly ...
2014-03-27 11:40:28 -04:00
mposolda 129eb6a3be Fix LDAP tests and teststuite on windows. Set initial password directly in code as import from LDIF is problematic on windows 2014-03-27 16:20:03 +01:00
Juraci Paixão Kröhling 34fbdf4358 Fixed charset issue while decoding token with atob 2014-03-27 09:48:16 +01:00
Bill Burke 51b3de7383 unfix uribuilder 2014-03-26 10:19:56 -04:00
Bill Burke 0ec19c9ec9 uribuilder fix 2014-03-26 10:09:41 -04:00
Bill Burke 4711dd083f Merge pull request #306 from mposolda/master
Remove unfinished ldap-settings tab, which I've added accidentally in pr...
2014-03-26 09:42:57 -04:00
mposolda bcc0bcd219 Remove unfinished ldap-settings tab, which I've added accidentally in previous PR 2014-03-26 14:38:11 +01:00
Stian Thorgersen 00aaefb926 Merge pull request #305 from mposolda/master
Added Authentication SPI dependencies to auth-server.war
2014-03-26 12:45:51 +00:00
mposolda 3302c54c43 Added Authentication SPI dependencies to auth-server.war 2014-03-26 12:57:11 +01:00
Stian Thorgersen 434dec2318 Merge pull request #304 from mposolda/ldap
KEYCLOAK-388 - Auth SPI should be able to differentiate between the INVA...
2014-03-26 11:55:34 +00:00
mposolda 96a05a9b77 Console: work in progress 2014-03-26 12:25:46 +01:00
mposolda 77a44751a6 KEYCLOAK-388 - Auth SPI should be able to differentiate between the INVALID_USERNAME and INVALID_CREDENTIALS 2014-03-26 09:49:47 +01:00
Stian Thorgersen 51b95b1b91 Merge pull request #303 from mposolda/ldap
Fixes in AuthenticationProvider. Fixing testsuite
2014-03-25 14:17:31 +00:00
mposolda ab02dea902 Fixes in AuthenticationProvider. Fixing testsuite 2014-03-25 15:05:08 +01:00
Bill Burke 28a1bd8535 Merge pull request #302 from mposolda/ldap
Authentication SPI. Implementations based on Picketlink+LDAP, model and ...
2014-03-25 08:42:27 -04:00
Stian Thorgersen a2a8e72e20 Merge pull request #301 from stianst/master
Fixes to JS sdk
2014-03-25 10:37:48 +00:00
Stian Thorgersen 4788dd8bd2 Fixes to JS sdk 2014-03-25 10:37:20 +00:00
mposolda 793f69d4b6 Authentication SPI. Implementations based on Picketlink+LDAP, model and external model (other realm). Added KeycloakRegistry 2014-03-24 23:11:11 +01:00
Stian Thorgersen 0879013a90 Merge pull request #300 from corinnekrych/readme.instructions.improvement
fix typos and formatting
2014-03-24 09:36:35 +00:00
corinnekrych 877a552f3b fix typos and formatting 2014-03-21 17:34:24 +01:00
Stian Thorgersen 2403e1f465 Merge pull request #299 from stianst/master
Added support for Cordova to keycloak.js
2014-03-19 17:02:05 +00:00
Stian Thorgersen 119423895d Removed files that shouldn't have been committed 2014-03-19 16:54:20 +00:00
Stian Thorgersen 702ae0307e Fixes to account referrer to allow configurable referrer uri based on app redirect uri 2014-03-19 16:52:41 +00:00
Stian Thorgersen b5bdeae2a2 Updates to keycloak.js, including adding support for Cordova
Conflicts:
	examples/cordova/example-realm.json
	examples/js-console/src/main/webapp/index.html
	integration/js/src/main/resources/META-INF/resources/js/keycloak.js
2014-03-19 16:52:41 +00:00
Stian Thorgersen 4159a97881 Merge pull request #298 from stianst/master
Updates to keycloak.js
2014-03-18 14:44:42 +00:00
Stian Thorgersen 2d5e6520db Updates to keycloak.js 2014-03-18 14:43:48 +00:00
Stian Thorgersen 331ab71427 KEYCLOAK-380 Added OAuth2Constants 2014-03-15 10:43:52 +00:00
Stian Thorgersen f9aaa16cfe KEYCLOAK-378 KEYCLOAK-379 KEYCLOAK-381 Fix refresh token if token contains app roles. Changed long time fields in AccessCode and AccessToken to int 2014-03-15 10:15:10 +00:00
Stian Thorgersen 2ebc32793a Started installed application adapter 2014-03-14 17:01:08 +00:00
Bill Burke cec948ffb4 Merge pull request #297 from patriot1burke/master
further adapter tests
2014-03-14 11:21:53 -04:00
Bill Burke 466b6762d9 further adapter tests 2014-03-14 11:21:32 -04:00
Bill Burke e03737c665 Merge pull request #296 from patriot1burke/master
adapter testing
2014-03-13 21:48:14 -04:00
Bill Burke 3f1b7a0335 adapter testing 2014-03-13 21:47:46 -04:00
Bill Burke f26f2faa72 Merge pull request #295 from patriot1burke/master
bump version to beta-1 snapshot
2014-03-13 11:25:01 -04:00
Bill Burke 7763da1273 bump version to beta-1 snapshot 2014-03-13 11:24:38 -04:00
Bill Burke bb6791d6eb Merge pull request #294 from patriot1burke/master
bump version
2014-03-13 10:58:48 -04:00
Bill Burke 1c6b867079 bump version 2014-03-13 10:58:22 -04:00
Bill Burke 6b57684c52 Merge pull request #293 from patriot1burke/master
NPE in create user
2014-03-13 10:57:13 -04:00
Bill Burke 08769a2daa NPE in create user 2014-03-13 10:56:09 -04:00
Stian Thorgersen 7fff2588b2 Merge pull request #292 from stianst/master
Set next version
2014-03-13 09:12:18 +00:00
Stian Thorgersen ee5cab04e0 Set next version 2014-03-13 09:10:42 +00:00
Bill Burke 9f429e4150 Merge pull request #291 from patriot1burke/master
bump
2014-03-12 17:07:24 -04:00
Bill Burke 9528dbc4dc realm name in OTP 2014-03-12 17:05:57 -04:00
Bill Burke 3ff8d0fd1f bump version 2014-03-12 16:48:12 -04:00
Bill Burke 7b64d9975e Merge pull request #286 from secondsun/KEYCLOAK-355
Fixing java 8 build
2014-03-12 16:43:03 -04:00
Bill Burke ba60a0c04b Merge pull request #289 from stianst/master
Added a README.md in the root of examples to describe the difference bet...
2014-03-12 16:42:48 -04:00
Bill Burke 6926f02cc3 Merge pull request #290 from patriot1burke/master
buncha stuff
2014-03-12 15:58:22 -04:00
Bill Burke 52018b1f81 revoke on logoutAll 2014-03-12 15:57:43 -04:00
Bill Burke fcc95ef99b fix delete realm 2014-03-12 15:00:31 -04:00
Stian Thorgersen 2f29fab931 Added a README.md in the root of examples to describe the difference between preconfigured-demo and unconfigured-demo 2014-03-12 17:15:54 +00:00
Stian Thorgersen 0c2767afd7 Minor updates to docs 2014-03-12 17:15:04 +00:00
Stian Thorgersen 4a90133d29 Added customer-portal-js and customer-portal-cli to example testrealm.js and added instructions for customer-portal-cli to README.md 2014-03-12 17:14:40 +00:00
Stian Thorgersen 3c40e9694f Merge pull request #287 from stianst/master
Added subject in token changed to user id to migration doc
2014-03-12 15:59:27 +00:00
Stian Thorgersen 30358a7582 Added subject in token changed to user id to migration doc 2014-03-12 15:59:04 +00:00
Summers Pittman 20880ffd71 Fixing java 8 build 2014-03-12 10:40:47 -04:00
Bill Burke e48cc006f6 Merge remote-tracking branch 'upstream/master' 2014-03-12 10:17:24 -04:00
Bill Burke accb56be7f user import fix 2014-03-12 10:17:09 -04:00
Stian Thorgersen a1ea79e382 Revert changes to lib until it works on 7 and 8 2014-03-12 14:11:05 +00:00
Stian Thorgersen a1f10ef54b Merge pull request #285 from stianst/master
Add user friendly username for social links. Show access denied if social login is cancelled
2014-03-12 13:52:28 +00:00
Stian Thorgersen fbc39e82a1 KEYCLOAK-365 Add IDToken properties to JS SDK 2014-03-12 11:31:59 +00:00
Stian Thorgersen 0214827492 KEYCLOAK-364 Show access denied if social login is cancelled 2014-03-12 09:21:11 +00:00
Stian Thorgersen 6dc156712e KEYCLOAK-359 Add user friendly username for social links 2014-03-12 08:52:47 +00:00
Bill Burke 53f671e8af Merge pull request #283 from patriot1burke/master
adapter security context propagation
2014-03-11 18:08:23 -04:00
Bill Burke a15e7d1f6e add security domain docs 2014-03-11 17:57:35 -04:00
Bill Burke e836371887 security context propagation 2014-03-11 17:40:53 -04:00
Viliam Rockai 53b596d435 KEYCLOAK-336 removed non-working pagination from role list 2014-03-11 17:54:20 +00:00
Viliam Rockai 0dbd4417af KEYCLOAK-360 fixed account template menu 2014-03-11 18:24:10 +01:00
Viliam Rockai d1b1a98a0a KEYCLOAK-356 added autofocus to the new passwd field 2014-03-11 18:24:10 +01:00
Viliam Rockai ccc4f5a114 KEYCLOAK-362 - fixing the select2 with req user actions 2014-03-11 18:24:10 +01:00
Stian Thorgersen 03a0cce119 Merge pull request #281 from stianst/master
KEYCLOAK-357 KEYCLOAK-358 Set enabled default to true when creating appl...
2014-03-11 13:53:42 +00:00
Stian Thorgersen 26b3ec0b2a KEYCLOAK-357 KEYCLOAK-358 Set enabled default to true when creating applications, clients and users 2014-03-11 13:53:15 +00:00
Stian Thorgersen 7992509fde Merge pull request #280 from stianst/master
KEYCLOAK-355 Fix distribution build on JDK8
2014-03-11 09:52:52 +00:00
Stian Thorgersen b208cae333 KEYCLOAK-355 Fix distribution build on JDK8 2014-03-11 09:52:22 +00:00
Bill Burke 9749c65065 Merge pull request #278 from cardosogabriel/master
Adjustments on headers (top bar)
2014-03-10 20:08:14 -04:00
Bill Burke 9109642821 Merge pull request #279 from patriot1burke/master
refactor adapters complete
2014-03-10 20:08:06 -04:00
Gabriel Cardoso b6503748ca Adjusting headers to make them horizontally aligned to the content 2014-03-10 20:59:57 -03:00
Bill Burke 0284d040dc refactor adapters complete 2014-03-10 18:52:57 -04:00
Stian Thorgersen d8c13c9ac2 Merge pull request #277 from stianst/master
Remove clientSecret required in JS lib, and removed storing token to ses...
2014-03-10 17:28:38 +00:00
Stian Thorgersen be7008f253 Remove clientSecret required in JS lib, and removed storing token to sessionStore 2014-03-10 17:27:05 +00:00
Stian Thorgersen 63bc2d6dbb Merge pull request #276 from mposolda/account-social
KEYCLOAK-26 Linking social providers to existing account
2014-03-10 11:43:01 +00:00
mposolda 3d0d130622 KEYCLOAK-26 Linking social providers to existing account 2014-03-10 11:31:59 +01:00
Bill Burke 8c3225914c Merge pull request #273 from cardosogabriel/master
Improvements in the console header, content area background, favicon and logos
2014-03-07 18:48:45 -05:00
Bill Burke 798e3ce86b Merge pull request #274 from patriot1burke/master
adapter refactoring
2014-03-07 18:48:31 -05:00
Bill Burke 49c79f156a adapter refactoring 2014-03-07 18:48:02 -05:00
Gabriel Cardoso d3634c1180 Updated FavIcon and Keycloak Logos
- more attractive favicon
- updated keycloak logos (bigger distance between the symbol and text)
2014-03-07 18:51:10 -03:00
Gabriel Cardoso c345ee9e5a Fixing Content Area Background
- Now there is no vertical scroll when the content does not occupy the
full height;
- The background area / borders go until the bottom for longer pages
2014-03-07 15:05:22 -03:00
Gabriel Cardoso 12f080e803 Full width header 2014-03-07 14:49:55 -03:00
Bill Burke 2b01de5ecf remove transaction 2014-03-07 08:35:41 -05:00
Stian Thorgersen 61102845ed Merge pull request #271 from mposolda/mongo
Fix mongo to pass with testsuite. Other improvements
2014-03-07 13:01:26 +00:00
Stian Thorgersen ca3b28fda7 Merge pull request #272 from stianst/master
Added docs for installed applications
2014-03-07 13:00:59 +00:00
Stian Thorgersen 854158a9c2 Added docs for installed applications 2014-03-07 13:00:20 +00:00
mposolda 11bcd84738 Added MongoClientProvider. Possibility to configure mongo from external source 2014-03-07 13:39:43 +01:00
mposolda da3f1a21a2 Fix testsuite with Mongo. Added ClientAdapter and ClientEntity to mongo model to improve inheritance 2014-03-07 12:24:41 +01:00
Stian Thorgersen 2edb93ef54 Merge pull request #270 from stianst/master
Added documentation for admin access control
2014-03-07 09:11:00 +00:00
Stian Thorgersen 0f0353674d Added documentation for admin access control 2014-03-07 09:10:16 +00:00
Bill Burke 62b0789e5f Merge pull request #269 from patriot1burke/master
refactor adapters
2014-03-06 21:16:30 -05:00
Bill Burke 26d0f993ba formating for oauth client 2014-03-06 21:16:07 -05:00
Bill Burke a653e5a406 refactor adapters 2014-03-06 21:13:55 -05:00
Bill Burke 0fd0240be7 Merge pull request #268 from cardosogabriel/master
Adjusting font-sizes, margins and a few design details
2014-03-06 15:15:27 -05:00
Gabriel Cardoso 3ea9df89a9 Adjusting font-sizes, margins and a few design details 2014-03-06 16:05:19 -03:00
Bill Burke 3c463419ca Merge pull request #267 from patriot1burke/master
client type selection, remove scope param support
2014-03-06 10:27:10 -05:00
Bill Burke dd292c1d52 remove scope support for now part 2 2014-03-06 10:26:46 -05:00
Bill Burke 801ef3281a remove scope support for now 2014-03-06 09:59:27 -05:00
Bill Burke 8f29bf0a5a client type selection 2014-03-06 09:48:52 -05:00
Stian Thorgersen 6f752e68c8 Merge pull request #266 from stianst/master
Added basic command-line example
2014-03-06 12:09:22 +00:00
Stian Thorgersen 12978a4343 Added basic command-line example 2014-03-06 12:08:44 +00:00
Bill Burke b543e22eee Merge pull request #265 from patriot1burke/master
public clients
2014-03-05 20:26:52 -05:00
Bill Burke 599faa3cb5 public clients 2014-03-05 20:26:27 -05:00
Bill Burke d7b616773a Merge pull request #264 from patriot1burke/master
session mgmt as7
2014-03-05 15:00:37 -05:00
Bill Burke 633ddb70e7 session mgmt as7 2014-03-05 15:00:21 -05:00
Stian Thorgersen d0a6a8ae3b Merge pull request #263 from stianst/master
Added support for any port with http://localhost redirect uri. Added Config to centralize system properties used to configure KC
2014-03-05 15:23:29 +00:00
Stian Thorgersen 60bb05e6ca Added Config to centralize system properties used to configure KC 2014-03-05 15:20:53 +00:00
Stian Thorgersen 0219aa1e4c Added support for any port with http://localhost redirect uri 2014-03-05 12:54:57 +00:00
Bill Burke 34260b7428 Merge pull request #262 from patriot1burke/master
session mgmt
2014-03-04 22:25:56 -05:00
Bill Burke d6bd02ea7d session mgmt 2014-03-04 22:25:33 -05:00
Bill Burke 7699dd2701 Merge remote-tracking branch 'upstream/master' 2014-03-04 15:52:40 -05:00
Bill Burke 2d86b29b6c session stats 2014-03-04 15:52:27 -05:00
Stian Thorgersen 67db515fe1 Fix for small height 2014-03-04 15:41:06 +00:00
Stian Thorgersen df61879fb1 Merge pull request #261 from stianst/master
Fixes to cors for js. Improvements to login form for small screens. Fix ng-disabled with kc-read-only forms
2014-03-04 15:28:51 +00:00
Stian Thorgersen 77259320cf Fix js for cors requests 2014-03-04 15:27:13 +00:00
Stian Thorgersen e0dff8104d Fix ng-disabled when used with kc-read-only forms 2014-03-04 15:25:55 +00:00
Stian Thorgersen 9816fdd842 Improvements to login forms for small screen 2014-03-04 15:25:55 +00:00
Bill Burke 9d4cc19e62 Merge pull request #260 from patriot1burke/master
revocation app level
2014-03-03 17:10:34 -05:00
Bill Burke 06288fa07b revocation app level 2014-03-03 17:10:15 -05:00
Bill Burke 735486c36e Merge pull request #259 from patriot1burke/master
revocation and fix login.ftl
2014-03-03 16:32:22 -05:00
Bill Burke d783c6200e fix login.ftl page 2014-03-03 16:30:09 -05:00
Bill Burke e307916233 revocation ui 2014-03-03 16:01:22 -05:00
Bill Burke 01154f18dd Merge remote-tracking branch 'upstream/master' 2014-03-03 15:50:21 -05:00
Bill Burke 716972347d revocation 2014-03-03 15:50:10 -05:00
Stian Thorgersen 4b8c6f338a Merge pull request #258 from stianst/master
Fix social tab, and minor fixes to xs screens
2014-03-03 13:43:51 +00:00
Stian Thorgersen 170afedd19 Minor fixes for login forms on xs screens 2014-03-03 13:43:05 +00:00
Stian Thorgersen 8881ba2d72 Fix social tab not showing 2014-03-03 13:42:40 +00:00
Stian Thorgersen 1cff76922b Merge pull request #257 from stianst/master
Fixes to login forms, and started support for installed applications (for Cordova)
2014-03-03 13:00:18 +00:00
Stian Thorgersen c0f49763f1 Updates to login form styles 2014-03-03 12:58:57 +00:00
Stian Thorgersen 87aaaf0b06 Started support for installed applications 2014-03-03 12:58:16 +00:00
Bill Burke ec309e7e02 Merge pull request #256 from patriot1burke/master
refactor getRoleById, fix bugs
2014-03-02 20:41:48 -05:00
Bill Burke 22b25a0d9e KEYCLOAK-341 2014-03-02 20:40:34 -05:00
Bill Burke 8126110312 refactor getRoleById 2014-03-02 20:28:58 -05:00
Bill Burke f8eb56d6b7 Merge remote-tracking branch 'upstream/master' 2014-03-02 18:09:55 -05:00
Bill Burke 21b1ad5e0a remove application sessions tab 2014-03-02 17:56:22 -05:00
Bill Burke 5eddacfee9 Merge pull request #255 from patriot1burke/master
revocation
2014-03-02 17:46:49 -05:00
Bill Burke c8023c6651 revocation next phase: undertow complete 2014-03-02 17:32:25 -05:00
Bill Burke 7b30cc59b8 revocation phase 1 2014-02-28 19:47:05 -05:00
Bill Burke 581d64614e Merge pull request #254 from patriot1burke/master
add claims to grant page
2014-02-28 10:45:54 -05:00
Bill Burke 0d309d058c add claims to grant page 2014-02-28 10:45:12 -05:00
Bill Burke 11559cba50 public realm info update 2014-02-28 09:52:53 -05:00
Bill Burke e02d3748a9 Merge pull request #253 from patriot1burke/master
fix NPE
2014-02-28 09:20:09 -05:00
Bill Burke 236d67f78d Merge remote-tracking branch 'upstream/master' 2014-02-28 09:19:45 -05:00
Bill Burke 4dc4c56921 fix NPE 2014-02-28 09:19:26 -05:00
Stian Thorgersen cec3df71ca Merge pull request #252 from stianst/master
Fix form sometimes read-only on refresh
2014-02-28 10:36:30 +00:00
Stian Thorgersen 63aa303673 Fix form sometimes read-only on refresh 2014-02-28 10:35:34 +00:00
Bill Burke 3e68cc601a Merge pull request #250 from vrockai/FORMDIS
AngularJS update and directives refactoring
2014-02-27 16:50:10 -05:00
Bill Burke 918e3d17f6 Merge pull request #251 from patriot1burke/master
refactor out clientmodel.getAgent()
2014-02-27 16:49:30 -05:00
Bill Burke c78d1c90e4 remove clientmodel.getAgent() 2014-02-27 16:48:34 -05:00
Bill Burke 3fc273070e remove clientmodel.agent phase1 2014-02-27 13:55:04 -05:00
Viliam Rockai 7aa7df43aa KEYCLOAK-276 select2 lib update 2014-02-27 18:22:29 +01:00
Viliam Rockai d65926f3b8 KEYCLOAK-340 custom selectors on realm detail replaced with standard one 2014-02-27 17:41:00 +01:00
Viliam Rockai 5881ef3e11 KEYCLOAK-276 AngularJS upgraded to v1.2.13 2014-02-27 17:08:01 +01:00
Bill Burke f8da693fd0 move secret to clientmodel 2014-02-27 10:59:47 -05:00
Viliam Rockai b413636bf5 KEYCLOAK-340 refactoring of on/off switch 2014-02-27 16:33:16 +01:00
Stian Thorgersen a1dca73ad3 Merge pull request #249 from stianst/master
Added create-realm role
2014-02-27 11:08:24 +00:00
Stian Thorgersen 32b7c464c7 Added create-realm role 2014-02-27 11:07:48 +00:00
Stian Thorgersen d5e0e73369 Merge pull request #248 from stianst/master
Fixed permissions not updated when realm is imported
2014-02-27 10:23:51 +00:00
Stian Thorgersen b3375d4279 Fixed permissions not updated when realm is imported 2014-02-27 10:23:27 +00:00
Bill Burke 4f56170b4c Merge pull request #247 from patriot1burke/master
rename scope rep username to client
2014-02-26 22:23:30 -05:00
Bill Burke 42d30a5a70 rename scope rep username to client 2014-02-26 22:23:04 -05:00
Bill Burke 9dbd19f715 Merge pull request #246 from patriot1burke/master
Use ClientModel wherever possible
2014-02-26 22:05:22 -05:00
Bill Burke 48d39bf977 Use ClientModel wherever possible 2014-02-26 22:04:57 -05:00
Bill Burke a8e588216b Merge pull request #245 from patriot1burke/master
IDToken and claims
2014-02-26 19:30:26 -05:00
Bill Burke c02d532001 refactor model 2014-02-26 19:25:42 -05:00
Bill Burke 0f67feb9dd IDToken setup 2014-02-26 19:04:42 -05:00
Bill Burke b2719ff40a claims UI 2014-02-26 16:41:31 -05:00
Bill Burke 8613452f4f Merge remote-tracking branch 'upstream/master' 2014-02-26 15:29:31 -05:00
Bill Burke b249809d2e claims backend 2014-02-26 15:29:17 -05:00
Stian Thorgersen 4ea7808d5f Merge pull request #244 from stianst/master
Added view roles, including updating console to make forms read-only
2014-02-26 17:39:51 +00:00
Stian Thorgersen ae1b98e38f Added view roles, including updating console to make forms read-only 2014-02-26 17:38:42 +00:00
Stian Thorgersen d0ca9a655d Merge pull request #243 from stianst/admin-access
Started directive to make form read-only
2014-02-26 10:56:22 +00:00
Stian Thorgersen 8d5d786452 Started directive to make form read-only 2014-02-26 10:55:40 +00:00
Bill Burke deaf2f9273 Merge pull request #242 from patriot1burke/master
cors docs
2014-02-25 16:23:54 -05:00
Bill Burke db37053f58 cors docs 2014-02-25 16:23:29 -05:00
Stian Thorgersen dd75864749 Merge pull request #241 from stianst/admin-access
Fixes to permissions in admin console
2014-02-25 15:42:08 +00:00
Stian Thorgersen 98629ac6f8 Fixes to permissions in admin console 2014-02-25 15:41:42 +00:00
Stian Thorgersen fa39ec1c98 Merge pull request #240 from stianst/admin-access
KEYCLOAK-292 Fine-grained admin control
2014-02-25 12:59:31 +00:00
Stian Thorgersen 9a73936002 KEYCLOAK-292 Fine-grained admin control 2014-02-25 12:53:36 +00:00
Bill Burke 7f33593931 Merge pull request #239 from patriot1burke/master
token docs
2014-02-24 20:20:51 -05:00
Bill Burke 88fb1ec747 token docs 2014-02-24 20:20:29 -05:00
Bill Burke a3e437f82a Merge pull request #238 from patriot1burke/master
javascript refresh token
2014-02-24 19:59:22 -05:00
Bill Burke 64065a4573 javascript refresh token 2014-02-24 19:58:54 -05:00
Bill Burke 1acfe1502a Merge pull request #237 from patriot1burke/master
remember me
2014-02-24 17:19:53 -05:00
Bill Burke 4b78857b51 as7 adapter refresh token support 2014-02-24 17:16:45 -05:00
Bill Burke 735009cdd7 Merge remote-tracking branch 'upstream/master' 2014-02-24 09:49:01 -05:00
Bill Burke 166e00f2e8 remember me 2014-02-23 11:30:32 -05:00
Bill Burke 3552f9e4aa Merge pull request #236 from patriot1burke/master
central login timeouts, rememberme framework
2014-02-22 21:52:54 -05:00
Bill Burke 01ddafa83a central login timeouts, rememberme framework 2014-02-22 21:52:29 -05:00
Bill Burke 1bfad2e198 Merge pull request #235 from patriot1burke/master
refresh tokens
2014-02-22 20:41:01 -05:00
Bill Burke 3e88cb3b76 logout 2014-02-22 20:40:06 -05:00
Bill Burke 273e706a42 undertow refresh token support 2014-02-22 17:24:04 -05:00
Bill Burke baa0e453b6 Merge remote-tracking branch 'upstream/master' 2014-02-21 17:37:29 -05:00
Bill Burke 898fcf8fd5 Merge pull request #234 from mposolda/master
Fix testsuite with mongo. Fix RealmModel.get**ById(). Added new unit tests
2014-02-21 17:37:06 -05:00
Bill Burke 3b59bd92fc Merge remote-tracking branch 'upstream/master' 2014-02-21 17:37:00 -05:00
Bill Burke 0a9b82a6f4 refresh tokens server side 2014-02-21 17:36:39 -05:00
mposolda 8a4ef40e9e Added new unit tests. Change get***ById() to find just entities from this realm/application 2014-02-21 23:16:06 +01:00
mposolda e85c2c9826 Fix testsuite with Mongo 2014-02-21 23:16:06 +01:00
Bill Burke 15968e9783 Merge pull request #233 from patriot1burke/master
refactor token creation
2014-02-21 12:13:26 -05:00
Bill Burke 97dd7470ce rename tokenLifespan to accessTokenLifespan 2014-02-21 12:12:54 -05:00
Bill Burke e583dc60ae Merge remote-tracking branch 'upstream/master' 2014-02-21 12:02:36 -05:00
Bill Burke 9607acdb6a refactor token creation 2014-02-21 12:02:24 -05:00
Stian Thorgersen 0ee71b09cd Merge pull request #232 from stianst/master
KEYCLOAK-286 Allow login with username or email. KEYCLOAK-287 Remove recover username as we now support login with email
2014-02-21 15:28:39 +00:00
Stian Thorgersen 05bd92d765 KEYCLOAK-286 Allow login with username or email. KEYCLOAK-287 Remove recover username as we now support login with email 2014-02-21 15:25:55 +00:00
Bill Burke cd68462cf3 Merge pull request #231 from patriot1burke/master
rename same classes/attributes
2014-02-21 10:17:02 -05:00
Bill Burke 9442601e42 rename some classes 2014-02-21 10:16:12 -05:00
Bill Burke 4b1fc788cf Merge remote-tracking branch 'upstream/master' 2014-02-21 09:49:08 -05:00
Bill Burke 94d8dbeeee issuedFor has OpenID claim now 2014-02-21 09:48:48 -05:00
Stian Thorgersen 3cb7e7c1bf Merge pull request #230 from stianst/master
KEYCLOAK-284 Subject in token is now user id instead of username
2014-02-21 10:55:25 +00:00
Stian Thorgersen 9ce8e16063 KEYCLOAK-284 Subject in token is now user id instead of username 2014-02-21 09:48:43 +00:00
Stian Thorgersen c2ca1b2731 Merge pull request #227 from matzew/master
Remove outdated references to alpha-1
2014-02-21 09:46:29 +00:00
Stian Thorgersen d47bf103b0 Merge pull request #228 from cardosogabriel/master
Refinements in the logo
2014-02-21 09:46:08 +00:00
Bill Burke dfacae9beb Merge pull request #229 from patriot1burke/master
tokens/access/codes now uses basic auth
2014-02-20 17:20:06 -05:00
Bill Burke 6794166b58 tokens/access/codes now uses basic auth 2014-02-20 17:19:51 -05:00
Gabriel Cardoso 8583d35153 Refinements in the logo 2014-02-20 15:30:21 -03:00
Matthias Wessendorf 2cb37827a8 Remove outdated references to alpha-1 2014-02-20 12:20:40 +01:00
Bill Burke 158eec7999 Merge pull request #226 from patriot1burke/master
alpha 3 version bump
2014-02-19 23:22:53 -05:00
Bill Burke 00043423c2 alpha 3 version bump 2014-02-19 23:22:34 -05:00
2812 changed files with 610830 additions and 100562 deletions

No files matched your search

+6
View File
@@ -9,6 +9,12 @@
.settings
.classpath
# NetBeans #
############
nbactions.xml
nb-configuration.xml
catalog.xml
# Compiled source #
###################
*.com
+8
View File
@@ -0,0 +1,8 @@
language: java
cache:
directories:
- $HOME/.m2
sudo: false
after_script: 'misc/.travis/after.sh'
+36 -1
View File
@@ -1,4 +1,39 @@
keycloak
========
SSO Service for web apps and REST services.
Please visit [http://keycloak.org](http://keycloak.org) for more information on Keycloak including how to download, documentation,
and video tutorials.
Keycloak is an SSO Service for web apps and REST services.
It can be used for social applications as well as enterprise applications. It is based on OpenID Connect with support for SAML 2.0 as well.
Here's some of the features:
* SSO and Single Log Out for browser applications
* Social Broker. Enable Google, Facebook, Yahoo, Twitter, GitHub, LinkedIn social login with no code required.
* Optional LDAP/Active Directory integration
* Optional User Registration
* Password and TOTP support (via Google Authenticator or FreeOTP). Client cert auth coming soon.
* User session management from both admin and user perspective
* Customizable themes for user facing pages: login, grant pages, account management, emails, and admin console all customizable!
* OAuth Bearer token auth for REST Services
* Integrated Browser App to REST Service token propagation
* Admin REST API
* OAuth 2.0 Grant requests
* CORS Support
* CORS Web Origin management and validation
* Completely centrally managed user and role mapping metadata. Minimal configuration at the application side
* Admin Console for managing users, roles, role mappings, applications, user sessions, allowed CORS web origins, and OAuth clients.
* Deployable as a WAR, appliance, or an Openshift cloud service (SaaS).
* Supports JBoss AS7, EAP 6.x, Wildfly, Tomcat, and Jetty applications. Plans to support Node.js, RAILS, GRAILS, and other non-Java applications.
* Javascript/HTML 5 adapter for pure Javascript apps
* Session management from admin console
* Revocation policies
* Password policies
* OpenID Connect Support
* SAML Support
* Token claim and SAML assertion mappings, role name mappings, etc. Ability to configure exactly what information you want in your tokens and SAML documents
* IDP brokering or chaining. You can set up Keycloak to be a child IDP to another SAML or OIDC IDP.
* Kerberos bridging. Logged in Kerberos users can access Keycloak SAML or OIDC applications via our Kerberos bridge.
Please visit [http://keycloak.org](http://keycloak.org) for more information on Keycloak including how to download, documentation,
and video tutorials.
-31
View File
@@ -1,31 +0,0 @@
<?xml version="1.0"?>
<project>
<parent>
<artifactId>keycloak-parent</artifactId>
<groupId>org.keycloak</groupId>
<version>1.0-alpha-2</version>
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>keycloak-admin-ui-styles</artifactId>
<name>Keycloak Admin UI Styles</name>
<description />
<dependencies>
</dependencies>
<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>
</plugins>
</build>
</project>
@@ -1,71 +0,0 @@
/* http://meyerweb.com/eric/tools/css/reset/
v2.0 | 20110126
License: none (public domain)
*/
html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td,
article, aside, canvas, details, embed,
figure, figcaption, footer, header, hgroup,
menu, nav, output, ruby, section, summary,
time, mark, audio, video {
margin: 0;
padding: 0;
border: 0;
font-size: 100%;
font: inherit;
vertical-align: baseline;
}
/* HTML5 display-role reset for older browsers */
article, aside, details, figcaption, figure,
footer, header, hgroup, menu, nav, section {
display: block;
}
body {
line-height: 1;
}
ol, ul {
list-style: none;
}
blockquote, q {
quotes: none;
}
blockquote:before, blockquote:after,
q:before, q:after {
content: '';
content: none;
}
table {
border-collapse: collapse;
border-spacing: 0;
}
/* Clearfix */
.clearfix:after {
content: ".";
display: block;
clear: both;
visibility: hidden;
line-height: 0;
height: 0;
}
.clearfix {
display: inline-block;
}
html[xmlns] .clearfix {
display: block;
}
* html .clearfix {
height: 1%;
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

@@ -1,7 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="23px" height="14px" viewBox="0 0 23 14" enable-background="new 0 0 23 14" xml:space="preserve">
<polyline fill="none" stroke="#009AD8" stroke-miterlimit="10" points="1,13 7,7 1,1 "/>
</svg>

Before

Width:  |  Height:  |  Size: 573 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

@@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="22px" height="52px" viewBox="0 0 22 52" enable-background="new 0 0 22 52" xml:space="preserve">
<polygon fill="#828487" points="11,16 6.818,11.818 7.525,11.111 11,14.586 14.475,11.111 15.182,11.818 "/>
<polygon fill="#DBDADA" points="11,42 6.818,37.818 7.525,37.111 11,40.586 14.475,37.111 15.182,37.818 "/>
</svg>

Before

Width:  |  Height:  |  Size: 699 B

File diff suppressed because it is too large. Load diff

Before

Width:  |  Height:  |  Size: 250 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 269 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 268 KiB

@@ -1,5 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<web-fragment version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-fragment_3_0.xsd ">
</web-fragment>
-31
View File
@@ -1,31 +0,0 @@
<?xml version="1.0"?>
<project>
<parent>
<artifactId>keycloak-parent</artifactId>
<groupId>org.keycloak</groupId>
<version>1.0-alpha-2</version>
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>keycloak-admin-ui</artifactId>
<name>Keycloak Admin UI</name>
<description />
<dependencies>
</dependencies>
<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>
</plugins>
</build>
</project>
@@ -1,107 +0,0 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Keycloak Admin Console</title>
<link rel="icon" href="/auth/admin-ui/img/favicon.ico">
<!-- Frameworks -->
<link rel="stylesheet" href="/auth/admin-ui/patternfly/css/patternfly.css">
<!-- Page styles -->
<link rel="stylesheet" href="/auth/admin-ui/css/admin-console.css">
<link rel="stylesheet" href="/auth/admin-ui/css/tables.css">
<link rel="stylesheet" href="/auth/admin-ui/css/sprites.css">
<link href="lib/select2-3.4.1/select2.css" rel="stylesheet">
<script src="lib/jquery/jquery-1.10.2.js" type="text/javascript"></script>
<script src="lib/select2-3.4.1/select2.js" type="text/javascript"></script>
<script src="lib/angular/angular.js"></script>
<script src="lib/angular/angular-resource.js"></script>
<script src="lib/angular/ui-bootstrap-tpls-0.4.0.js"></script>
<script src="lib/jquery/jquery.idletimer.js" type="text/javascript"></script>
<script src="lib/jquery/jquery.idletimeout.js" type="text/javascript"></script>
<script src="lib/angular/select2.js" type="text/javascript"></script>
<script src="lib/fileupload/angular-file-upload.min.js"></script>
<script src="js/app.js"></script>
<script src="js/controllers/realm.js"></script>
<script src="js/controllers/applications.js"></script>
<script src="js/controllers/oauth-clients.js"></script>
<script src="js/controllers/users.js"></script>
<script src="js/loaders.js"></script>
<script src="js/services.js"></script>
<style>
[ng\:cloak], [ng-cloak], .ng-cloak {
display: none !important;
}
</style>
</head>
<body class="admin-console" data-ng-controller="GlobalCtrl" data-ng-cloak>
<div id="idletimeout">
You will be logged off in <strong><span></span> seconds</strong> due to inactivity.
<a id="idletimeout-resume" href="#">Click here to continue using this web page</a>.
</div>
<div class="feedback-aligner" data-ng-show="notification" data-ng-click="notification = null">
<div class="alert alert-{{notification.type}}">
<span class="pficon pficon-ok" ng-show="notification.type == 'success'"></span>
<span class="pficon pficon-info" ng-show="notification.type == 'info'"></span>
<span class="pficon-layered" ng-show="notification.type == 'danger'">
<span class="pficon pficon-error-octagon"></span>
<span class="pficon pficon-error-exclamation"></span>
</span>
<span class="pficon-layered" ng-show="notification.type == 'warning'">
<span class="pficon pficon-warning-triangle"></span>
<span class="pficon pficon-warning-exclamation"></span>
</span>
<strong>{{notification.header}}</strong> {{notification.message}}
</div>
</div>
<header class="navbar navbar-default navbar-pf navbar-main header">
<div class="container">
<div data-ng-include data-src="'partials/menu.html'"></div>
</div>
</header>
<div class="container">
<div data-ng-view id="view"></div>
<div id="loading" class="loading-backdrop">
<div class="loading">
<span>Loading...</span>
</div>
</div>
</div>
<script type="text/javascript">
$.idleTimeout('#idletimeout', '#idletimeout a', {
idleAfter: 300,
pollingInterval: 60,
keepAliveURL: '/auth/rest/admin/keepalive',
serverResponseEquals: '',
failedRequests: 1,
onTimeout: function(){
$(this).slideUp();
window.location = "/auth/rest/admin/logout";
},
onIdle: function(){
$(this).slideDown(); // show the warning bar
},
onCountdown: function( counter ){
$(this).find("span").html( counter ); // update the counter
},
onResume: function(){
$(this).slideUp(); // hide the warning bar
}
});
</script>
</body>
</html>
@@ -1,191 +0,0 @@
<!doctype html>
<html lang="en">
<head>
<style>
.mock_view {
padding: 2em 2em;
}
</style>
<meta charset="utf-8">
<title>Keycloak Admin Console</title>
<link rel="icon" href="/auth/admin-ui/img/favicon.ico">
<!-- Frameworks -->
<!--link rel="stylesheet" href="/auth/admin-ui/bootstrap/css/bootstrap.css"-->
<link rel="stylesheet" href="/auth/admin-ui/patternfly/css/patternfly.css">
<!-- Page styles -->
<link rel="stylesheet" href="/auth/admin-ui/css/admin-console.css">
<link href="lib/select2-3.4.1/select2.css" rel="stylesheet">
<script src="lib/jquery/jquery-1.10.2.js" type="text/javascript"></script>
<script src="lib/select2-3.4.1/select2.js" type="text/javascript"></script>
<script src="lib/angular/angular.js"></script>
<script src="lib/angular/angular-resource.js"></script>
<script src="lib/angular/ui-bootstrap-tpls-0.4.0.js"></script>
<script src="lib/jquery/jquery.idletimer.js" type="text/javascript"></script>
<script src="lib/jquery/jquery.idletimeout.js" type="text/javascript"></script>
<script src="lib/angular/select2.js" type="text/javascript"></script>
<script src="lib/fileupload/angular-file-upload.min.js"></script> <!--
<script src="/auth/admin-ui/bootstrap-3.0.0-wip/js/dropdown.js"></script>
<script src="/auth/admin-ui/bootstrap-3.0.0-wip/js/tooltip.js"></script>
-->
<script src="/auth/admin-ui/js/bootstrap-tokenfield.js"></script>
<script src="/auth/admin-ui/bootstrap/js/bootstrap.js"></script>
<script src="js/app.js"></script>
<script src="js/controllers/realm.js"></script>
<script src="js/controllers/applications.js"></script>
<script src="js/controllers/oauth-clients.js"></script>
<script src="js/controllers/users.js"></script>
<script src="js/loaders.js"></script>
<script src="js/services.js"></script>
<style>
[ng\:cloak], [ng-cloak], .ng-cloak {
display: none !important;
}
</style>
</head>
<body class="admin-console" data-ng-controller="GlobalCtrl" ng-cloak>
<div id="idletimeout">
You will be logged off in <strong><span></span> seconds</strong> due to inactivity.
<a id="idletimeout-resume" href="#">Click here to continue using this web page</a>.
</div>
<div class="feedback-aligner" data-ng-show="notification" data-ng-click="notification = null">
<div class="alert alert-{{notification.type}}"><strong>{{notification.header}}</strong> {{notification.message}}</div>
</div>
<header class="navbar navbar-default navbar-pf navbar-main header">
<div class="container">
<nav id="kc-navigation" class="navbar" role="navigation">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse-1">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<h1 class="navbar-title"><Strong>KeyCloak</Strong> Central Login</h1>
</div>
<div class="collapse navbar-collapse navbar-collapse-1">
<ul class="nav navbar-nav navbar-utility" data-ng-show="auth.loggedIn">
<li class="dropdown">
<a data-toggle="dropdown" class="dropdown-toggle" href="#">
<span class="pficon pficon-user"></span>
{{auth.user.displayName}}<b class="caret"></b>
</a>
<ul class="dropdown-menu">
<li><a href="/auth/rest/realms/keycloak-admin/account?referrer=admin-console">Manage Account</a></li>
<li class="separator"><a href="/auth/rest/admin/logout">Sign Out</a></li>
</ul>
</li>
</ul>
<ul class="nav navbar-nav navbar-primary persistent-secondary" data-ng-controller="RealmDropdownCtrl">
<li class="dropdown context" data-ng-show="showNav()">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
Realm: {{current.realm.id}}
<b class="caret"></b>
</a>
<ul class="dropdown-menu">
<li data-ng-repeat="realm in current.realms">
<a href="" ng-click="changeRealm(realm.id)" >{{realm.id}}</a>
</li>
</ul>
</li>
<!--------------------------------------->
<li class="active">
<a href="#">Settings</a>
<ul class="nav navbar-nav navbar-persistent">
<li class="active">
<a href="#">General</a>
</li>
<li>
<a href="#">Roles</a>
</li>
<li>
<a href="#">Default Roles</a>
</li>
<li>
<a href="#">Credentials</a>
</li>
<li>
<a href="#">Token</a>
</li>
<li>
<a href="#">Keys</a>
</li>
<li>
<a href="#">Email</a>
</li>
</ul>
</li>
<li>
<a href="#">User</a>
</li>
<li>
<a href="#">Applications</a>
</li>
<li>
<a href="#">OAuth Clients</a>
</li>
<!--------------------------------------->
<li class="active pull-right" data-ng-show="auth.loggedIn">
<a class="button primary" href="#/create/realm" data-ng-class="path[0] == 'create' && path[1] == 'realm' && 'active'"
data-ng-show="auth.loggedIn">Add Realm</a>
</li>
</ul>
</div>
</nav>
</div>
</header>
<div class="container">
<div class="mock_view" data-ng-view id="view"></div>
<div id="loading" class="loading-backdrop">
<div class="loading">
<span>Loading...</span>
</div>
</div>
</div>
<script type="text/javascript">
$.idleTimeout('#idletimeout', '#idletimeout a', {
idleAfter: 300,
pollingInterval: 60,
keepAliveURL: '/auth/rest/admin/keepalive',
serverResponseEquals: '',
failedRequests: 1,
onTimeout: function(){
$(this).slideUp();
window.location = "/auth/rest/admin/logout";
},
onIdle: function(){
$(this).slideDown(); // show the warning bar
},
onCountdown: function( counter ){
$(this).find("span").html( counter ); // update the counter
},
onResume: function(){
$(this).slideUp(); // hide the warning bar
}
});
</script>
</body>
</html>
@@ -1,870 +0,0 @@
'use strict';
var module = angular.module('keycloak', [ 'keycloak.services', 'keycloak.loaders', 'ui.bootstrap', 'ui.select2', 'angularFileUpload' ]);
var resourceRequests = 0;
var loadingTimer = -1;
angular.element(document).ready(function ($http) {
$http.get('/auth/rest/admin/whoami').success(function(data) {
var auth = {};
auth.user = data;
auth.loggedIn = true;
module.factory('Auth', function() {
return auth;
});
angular.bootstrap(document, ["keycloak"]);
}).error(function() {
var path = window.location.hash && window.location.hash.substring(1) || '/';
window.location = '/auth/rest/admin/login?path=' + path;
});
});
module.config([ '$routeProvider', function($routeProvider) {
$routeProvider
/*
.when('/create/realm', {
templateUrl : 'partials/realm-detail.html',
resolve : {
realm : function(RealmLoader) {
return {};
}
},
controller : 'RealmDetailCtrl'
})
*/
.when('/create/realm', {
templateUrl : 'partials/realm-create.html',
resolve : {
},
controller : 'RealmCreateCtrl'
})
.when('/realms/:realm', {
templateUrl : 'partials/realm-detail.html',
resolve : {
realm : function(RealmLoader) {
return RealmLoader();
},
serverInfo : function(ServerInfoLoader) {
return ServerInfoLoader();
}
},
controller : 'RealmDetailCtrl'
})
.when('/realms', {
templateUrl : 'partials/realm-list.html',
controller : 'RealmListCtrl'
})
.when('/realms/:realm/token-settings', {
templateUrl : 'partials/realm-tokens.html',
resolve : {
realm : function(RealmLoader) {
return RealmLoader();
}
},
controller : 'RealmTokenDetailCtrl'
})
.when('/realms/:realm/keys-settings', {
templateUrl : 'partials/realm-keys.html',
resolve : {
realm : function(RealmLoader) {
return RealmLoader();
}
},
controller : 'RealmKeysDetailCtrl'
})
.when('/realms/:realm/social-settings', {
templateUrl : 'partials/realm-social.html',
resolve : {
realm : function(RealmLoader) {
return RealmLoader();
},
serverInfo : function(ServerInfoLoader) {
return ServerInfoLoader();
}
},
controller : 'RealmSocialCtrl'
})
.when('/realms/:realm/default-roles', {
templateUrl : 'partials/realm-default-roles.html',
resolve : {
realm : function(RealmLoader) {
return RealmLoader();
},
applications : function(ApplicationListLoader) {
return ApplicationListLoader();
},
roles : function(RoleListLoader) {
return RoleListLoader();
}
},
controller : 'RealmDefaultRolesCtrl'
})
.when('/realms/:realm/required-credentials', {
templateUrl : 'partials/realm-credentials.html',
resolve : {
realm : function(RealmLoader) {
return RealmLoader();
}
},
controller : 'RealmRequiredCredentialsCtrl'
})
.when('/realms/:realm/smtp-settings', {
templateUrl : 'partials/realm-smtp.html',
resolve : {
realm : function(RealmLoader) {
return RealmLoader();
}
},
controller : 'RealmSMTPSettingsCtrl'
})
.when('/create/user/:realm', {
templateUrl : 'partials/user-detail.html',
resolve : {
realm : function(RealmLoader) {
return RealmLoader();
},
user : function() {
return {};
}
},
controller : 'UserDetailCtrl'
})
.when('/realms/:realm/users/:user', {
templateUrl : 'partials/user-detail.html',
resolve : {
realm : function(RealmLoader) {
return RealmLoader();
},
user : function(UserLoader) {
return UserLoader();
}
},
controller : 'UserDetailCtrl'
})
.when('/realms/:realm/users/:user/user-credentials', {
templateUrl : 'partials/user-credentials.html',
resolve : {
realm : function(RealmLoader) {
return RealmLoader();
},
user : function(UserLoader) {
return UserLoader();
}
},
controller : 'UserCredentialsCtrl'
})
.when('/realms/:realm/users/:user/role-mappings', {
templateUrl : 'partials/role-mappings.html',
resolve : {
realm : function(RealmLoader) {
return RealmLoader();
},
user : function(UserLoader) {
return UserLoader();
},
applications : function(ApplicationListLoader) {
return ApplicationListLoader();
},
roles : function(RoleListLoader) {
return RoleListLoader();
}
},
controller : 'UserRoleMappingCtrl'
})
.when('/realms/:realm/users', {
templateUrl : 'partials/user-list.html',
resolve : {
realm : function(RealmLoader) {
return RealmLoader();
}
},
controller : 'UserListCtrl'
})
.when('/create/role/:realm', {
templateUrl : 'partials/role-detail.html',
resolve : {
realm : function(RealmLoader) {
return RealmLoader();
},
role : function() {
return {};
},
roles : function(RoleListLoader) {
return RoleListLoader();
},
applications : function(ApplicationListLoader) {
return ApplicationListLoader();
}
},
controller : 'RoleDetailCtrl'
})
.when('/realms/:realm/roles/:role', {
templateUrl : 'partials/role-detail.html',
resolve : {
realm : function(RealmLoader) {
return RealmLoader();
},
role : function(RoleLoader) {
return RoleLoader();
},
roles : function(RoleListLoader) {
return RoleListLoader();
},
applications : function(ApplicationListLoader) {
return ApplicationListLoader();
}
},
controller : 'RoleDetailCtrl'
})
.when('/realms/:realm/roles', {
templateUrl : 'partials/role-list.html',
resolve : {
realm : function(RealmLoader) {
return RealmLoader();
},
roles : function(RoleListLoader) {
return RoleListLoader();
}
},
controller : 'RoleListCtrl'
})
.when('/create/role/:realm/applications/:application', {
templateUrl : 'partials/application-role-detail.html',
resolve : {
realm : function(RealmLoader) {
return RealmLoader();
},
application : function(ApplicationLoader) {
return ApplicationLoader();
},
role : function() {
return {};
},
roles : function(RoleListLoader) {
return RoleListLoader();
},
applications : function(ApplicationListLoader) {
return ApplicationListLoader();
}
},
controller : 'ApplicationRoleDetailCtrl'
})
.when('/realms/:realm/applications/:application/roles/:role', {
templateUrl : 'partials/application-role-detail.html',
resolve : {
realm : function(RealmLoader) {
return RealmLoader();
},
application : function(ApplicationLoader) {
return ApplicationLoader();
},
role : function(ApplicationRoleLoader) {
return ApplicationRoleLoader();
},
roles : function(RoleListLoader) {
return RoleListLoader();
},
applications : function(ApplicationListLoader) {
return ApplicationListLoader();
}
},
controller : 'ApplicationRoleDetailCtrl'
})
.when('/realms/:realm/applications/:application/credentials', {
templateUrl : 'partials/application-credentials.html',
resolve : {
realm : function(RealmLoader) {
return RealmLoader();
},
application : function(ApplicationLoader) {
return ApplicationLoader();
}
},
controller : 'ApplicationCredentialsCtrl'
})
.when('/realms/:realm/applications/:application/roles', {
templateUrl : 'partials/application-role-list.html',
resolve : {
realm : function(RealmLoader) {
return RealmLoader();
},
application : function(ApplicationLoader) {
return ApplicationLoader();
},
roles : function(ApplicationRoleListLoader) {
return ApplicationRoleListLoader();
}
},
controller : 'ApplicationRoleListCtrl'
})
.when('/realms/:realm/applications/:application/scope-mappings', {
templateUrl : 'partials/application-scope-mappings.html',
resolve : {
realm : function(RealmLoader) {
return RealmLoader();
},
application : function(ApplicationLoader) {
return ApplicationLoader();
},
applications : function(ApplicationListLoader) {
return ApplicationListLoader();
},
roles : function(RoleListLoader) {
return RoleListLoader();
}
},
controller : 'ApplicationScopeMappingCtrl'
})
.when('/realms/:realm/applications/:application/installation', {
templateUrl : 'partials/application-installation.html',
resolve : {
realm : function(RealmLoader) {
return RealmLoader();
},
application : function(ApplicationLoader) {
return ApplicationLoader();
}
},
controller : 'ApplicationInstallationCtrl'
})
.when('/realms/:realm/applications/:application/sessions', {
templateUrl : 'partials/application-sessions.html',
resolve : {
realm : function(RealmLoader) {
return RealmLoader();
},
application : function(ApplicationLoader) {
return ApplicationLoader();
}
},
controller : 'ApplicationSessionsCtrl'
})
.when('/create/application/:realm', {
templateUrl : 'partials/application-detail.html',
resolve : {
realm : function(RealmLoader) {
return RealmLoader();
},
applications : function(ApplicationListLoader) {
return ApplicationListLoader();
},
application : function() {
return {};
}
},
controller : 'ApplicationDetailCtrl'
})
.when('/realms/:realm/applications/:application', {
templateUrl : 'partials/application-detail.html',
resolve : {
realm : function(RealmLoader) {
return RealmLoader();
},
applications : function(ApplicationListLoader) {
return ApplicationListLoader();
},
application : function(ApplicationLoader) {
return ApplicationLoader();
}
},
controller : 'ApplicationDetailCtrl'
})
.when('/realms/:realm/applications', {
templateUrl : 'partials/application-list.html',
resolve : {
realm : function(RealmLoader) {
return RealmLoader();
},
applications : function(ApplicationListLoader) {
return ApplicationListLoader();
}
},
controller : 'ApplicationListCtrl'
})
// OAUTH Client
.when('/realms/:realm/oauth-clients/:oauth/credentials', {
templateUrl : 'partials/oauth-client-credentials.html',
resolve : {
realm : function(RealmLoader) {
return RealmLoader();
},
oauth : function(OAuthClientLoader) {
return OAuthClientLoader();
}
},
controller : 'OAuthClientCredentialsCtrl'
})
.when('/realms/:realm/oauth-clients/:oauth/scope-mappings', {
templateUrl : 'partials/oauth-client-scope-mappings.html',
resolve : {
realm : function(RealmLoader) {
return RealmLoader();
},
oauth : function(OAuthClientLoader) {
return OAuthClientLoader();
},
applications : function(ApplicationListLoader) {
return ApplicationListLoader();
},
roles : function(RoleListLoader) {
return RoleListLoader();
}
},
controller : 'OAuthClientScopeMappingCtrl'
})
.when('/realms/:realm/oauth-clients/:oauth/installation', {
templateUrl : 'partials/oauth-client-installation.html',
resolve : {
realm : function(RealmLoader) {
return RealmLoader();
},
oauth : function(OAuthClientLoader) {
return OAuthClientLoader();
},
installation : function(OAuthClientInstallationLoader) {
return OAuthClientInstallationLoader();
}
},
controller : 'OAuthClientInstallationCtrl'
})
.when('/create/oauth-client/:realm', {
templateUrl : 'partials/oauth-client-detail.html',
resolve : {
realm : function(RealmLoader) {
return RealmLoader();
},
oauth : function() {
return {};
}
},
controller : 'OAuthClientDetailCtrl'
})
.when('/realms/:realm/oauth-clients/:oauth', {
templateUrl : 'partials/oauth-client-detail.html',
resolve : {
realm : function(RealmLoader) {
return RealmLoader();
},
oauth : function(OAuthClientLoader) {
return OAuthClientLoader();
}
},
controller : 'OAuthClientDetailCtrl'
})
.when('/realms/:realm/oauth-clients', {
templateUrl : 'partials/oauth-client-list.html',
resolve : {
realm : function(RealmLoader) {
return RealmLoader();
},
oauthClients : function(OAuthClientListLoader) {
return OAuthClientListLoader();
}
},
controller : 'OAuthClientListCtrl'
})
.when('/', {
templateUrl : 'partials/home.html',
controller : 'HomeCtrl'
})
.when('/mocks/:realm', {
templateUrl : 'partials/realm-detail_mock.html',
resolve : {
realm : function(RealmLoader) {
return RealmLoader();
},
serverInfo : function(ServerInfoLoader) {
return ServerInfoLoader();
}
},
controller : 'RealmDetailCtrl'
})
.otherwise({
templateUrl : 'partials/notfound.html'
});
} ]);
module.config(function($httpProvider) {
$httpProvider.responseInterceptors.push('errorInterceptor');
var spinnerFunction = function(data, headersGetter) {
if (resourceRequests == 0) {
loadingTimer = window.setTimeout(function() {
$('#loading').show();
loadingTimer = -1;
}, 500);
}
resourceRequests++;
return data;
};
$httpProvider.defaults.transformRequest.push(spinnerFunction);
$httpProvider.responseInterceptors.push('spinnerInterceptor');
});
module.factory('errorInterceptor', function($q, $window, $rootScope, $location, Auth, Notifications) {
return function(promise) {
return promise.then(function(response) {
return response;
}, function(response) {
if (response.status == 401) {
console.log('session timeout?');
Auth.loggedIn = false;
window.location = '/auth/rest/admin/login?path=' + $location.path();
} else if (response.status == 404) {
Notifications.error("Not found");
} else if (response.status) {
if (response.data && response.data.errorMessage) {
Notifications.error(response.data.errorMessage);
} else {
Notifications.error("An unexpected server error has occurred");
}
}
return $q.reject(response);
});
};
});
module.factory('spinnerInterceptor', function($q, $window, $rootScope, $location) {
return function(promise) {
return promise.then(function(response) {
resourceRequests--;
if (resourceRequests == 0) {
if(loadingTimer != -1) {
window.clearTimeout(loadingTimer);
loadingTimer = -1;
}
$('#loading').hide();
}
return response;
}, function(response) {
resourceRequests--;
if (resourceRequests == 0) {
if(loadingTimer != -1) {
window.clearTimeout(loadingTimer);
loadingTimer = -1;
}
$('#loading').hide();
}
return $q.reject(response);
});
};
});
// collapsable form fieldsets
module.directive('collapsable', function() {
return function(scope, element, attrs) {
element.click(function() {
$(this).toggleClass('collapsed');
$(this).find('.toggle-icons').toggleClass('kc-icon-collapse').toggleClass('kc-icon-expand');
$(this).find('.toggle-icons').text($(this).text() == "Icon: expand" ? "Icon: collapse" : "Icon: expand");
$(this).parent().find('.form-group').toggleClass('hidden');
});
}
});
// collapsable form fieldsets
module.directive('uncollapsed', function() {
return function(scope, element, attrs) {
element.prepend('<span class="kc-icon-collapse toggle-icons">Icon: collapse</span>');
element.click(function() {
$(this).toggleClass('collapsed');
$(this).find('.toggle-icons').toggleClass('kc-icon-collapse').toggleClass('kc-icon-expand');
$(this).find('.toggle-icons').text($(this).text() == "Icon: expand" ? "Icon: collapse" : "Icon: expand");
$(this).parent().find('.form-group').toggleClass('hidden');
});
}
});
// collapsable form fieldsets
module.directive('collapsed', function() {
return function(scope, element, attrs) {
element.prepend('<span class="kc-icon-expand toggle-icons">Icon: expand</span>');
element.parent().find('.form-group').toggleClass('hidden');
element.click(function() {
$(this).toggleClass('collapsed');
$(this).find('.toggle-icons').toggleClass('kc-icon-collapse').toggleClass('kc-icon-expand');
$(this).find('.toggle-icons').text($(this).text() == "Icon: expand" ? "Icon: collapse" : "Icon: expand");
$(this).parent().find('.form-group').toggleClass('hidden');
});
}
});
/**
* Directive for presenting an ON-OFF switch for checkbox.
* Usage: <input ng-model="mmm" name="nnn" id="iii" onoffswitch [on-text="ooo" off-text="fff"] />
*/
module.directive('onoffswitch', function() {
return {
restrict: "EA",
require: 'ngModel',
replace: true,
scope: {
ngModel: '=',
ngDisabled: '=',
ngBind: '=',
name: '=',
id: '=',
onText: '@onText',
offText: '@offText'
},
compile: function(element, attrs) {
if (!attrs.onText) { attrs.onText = "ON"; }
if (!attrs.offText) { attrs.offText = "OFF"; }
if (!attrs.ngDisabled) { attrs.ngDisabled = false; }
var html = "<span><div class=\"onoffswitch\" data-ng-class=\"{disabled: ngDisabled}\" tabindex=\"0\" onkeydown=\"var code = event.keyCode || event.which; if (code === 32 || code === 13) { event.stopImmediatePropagation(); event.preventDefault(); $(event.target).find('input').click();}\">" +
"<input type=\"checkbox\" data-ng-model=\"ngModel\" ng-disabled=\"ngDisabled\"" +
" class=\"onoffswitch-checkbox\" name=\"" + attrs.name + "\" id=\"" + attrs.id + "\">" +
"<label for=\"" + attrs.id + "\" class=\"onoffswitch-label\">" +
"<span class=\"onoffswitch-inner\">" +
"<span class=\"onoffswitch-active\">{{onText}}</span>" +
"<span class=\"onoffswitch-inactive\">{{offText}}</span>" +
"</span>" +
"<span class=\"onoffswitch-switch\"></span>" +
"</label>" +
"</div></span>";
element.replaceWith($(html));
}
}
});
module.directive('kcInput', function() {
var d = {
scope : true,
replace : false,
link : function(scope, element, attrs) {
var form = element.children('form');
var label = element.children('label');
var input = element.children('input');
var id = form.attr('name') + '.' + input.attr('name');
element.attr('class', 'control-group');
label.attr('class', 'control-label');
label.attr('for', id);
input.wrap('<div class="controls"/>');
input.attr('id', id);
if (!input.attr('placeHolder')) {
input.attr('placeHolder', label.text());
}
if (input.attr('required')) {
label.append(' <span class="required">*</span>');
}
}
};
return d;
});
module.directive('kcEnter', function() {
return function(scope, element, attrs) {
element.bind("keydown keypress", function(event) {
if (event.which === 13) {
scope.$apply(function() {
scope.$eval(attrs.kcEnter);
});
event.preventDefault();
}
});
};
});
module.directive('kcSave', function ($compile, Notifications) {
return {
restrict: 'A',
link: function ($scope, elem, attr, ctrl) {
elem.addClass("btn btn-primary btn-lg");
elem.attr("type","submit");
elem.bind('click', function() {
$scope.$apply(function() {
var form = elem.closest('form');
if (form && form.attr('name')) {
var ngValid = form.find('.ng-valid');
if ($scope[form.attr('name')].$valid) {
//ngValid.removeClass('error');
ngValid.parent().removeClass('has-error');
$scope['save']();
} else {
Notifications.error("Missing or invalid field(s). Please verify the fields in red.")
//ngValid.removeClass('error');
ngValid.parent().removeClass('has-error');
var ngInvalid = form.find('.ng-invalid');
//ngInvalid.addClass('error');
ngInvalid.parent().addClass('has-error');
}
}
});
})
}
}
});
module.directive('kcReset', function ($compile, Notifications) {
return {
restrict: 'A',
link: function ($scope, elem, attr, ctrl) {
elem.addClass("btn btn-default btn-lg");
elem.attr("type","submit");
elem.bind('click', function() {
$scope.$apply(function() {
var form = elem.closest('form');
if (form && form.attr('name')) {
form.find('.ng-valid').removeClass('error');
form.find('.ng-invalid').removeClass('error');
$scope['reset']();
}
})
})
}
}
});
module.directive('kcCancel', function ($compile, Notifications) {
return {
restrict: 'A',
link: function ($scope, elem, attr, ctrl) {
elem.addClass("btn btn-default btn-lg");
elem.attr("type","submit");
}
}
});
module.directive('kcDelete', function ($compile, Notifications) {
return {
restrict: 'A',
link: function ($scope, elem, attr, ctrl) {
elem.addClass("btn btn-danger btn-lg");
elem.attr("type","submit");
}
}
});
module.directive('kcSelect', function ($compile, Notifications) {
return {
scope: {
kcOptions: '=',
kcModel: '=',
id: "=",
kcPlaceholder: '@'
},
restrict: 'EA',
replace: true,
templateUrl: 'templates/kc-select.html',
link: function(scope, element, attr) {
scope.updateModel = function(item) {
scope.kcModel = item;
};
}
}
});
module.directive('kcNavigation', function ($compile, Notifications) {
return {
scope: {
kcCurrent: '@',
kcRealm: '=',
kcSocial: '='
},
restrict: 'E',
replace: true,
templateUrl: 'templates/kc-navigation.html',
compile: function(element, attrs){
if (!attrs.kcSocial) {
attrs.kcSocial = false;
}
}
}
});
/*
* Used to select the element (invoke $(elem).select()) on specified action list.
* Usages kc-select-action="click mouseover"
* When used in the textarea element, this will select/highlight the textarea content on specified action (i.e. click).
*/
module.directive('kcSelectAction', function ($compile, Notifications) {
return {
restrict: 'A',
compile: function (elem, attrs) {
var events = attrs.kcSelectAction.split(" ");
for(var i=0; i < events.length; i++){
elem.bind(events[i], function(){
elem.select();
});
}
}
}
});
module.filter('remove', function() {
return function(input, remove, attribute) {
if (!input || !remove) {
return input;
}
var out = [];
for ( var i = 0; i < input.length; i++) {
var e = input[i];
if (Array.isArray(remove)) {
for (var j = 0; j < remove.length; j++) {
if (attribute) {
if (remove[j][attribute] == e[attribute]) {
e = null;
break;
}
} else {
if (remove[j] == e) {
e = null;
break;
}
}
}
} else {
if (attribute) {
if (remove[attribute] == e[attribute]) {
e = null;
}
} else {
if (remove == e) {
e = null;
}
}
}
if (e != null) {
out.push(e);
}
}
return out;
};
});
module.filter('capitalize', function() {
return function(input) {
return input.substring(0, 1).toUpperCase() + input.substring(1);
}
});
@@ -1,352 +0,0 @@
module.controller('ApplicationRoleListCtrl', function($scope, $location, realm, application, roles) {
$scope.realm = realm;
$scope.roles = roles;
$scope.application = application;
$scope.$watch(function() {
return $location.path();
}, function() {
$scope.path = $location.path().substring(1).split("/");
});
});
module.controller('ApplicationCredentialsCtrl', function($scope, $location, realm, application, ApplicationCredentials, Notifications) {
$scope.realm = realm;
$scope.application = application;
var secret = ApplicationCredentials.get({ realm : realm.realm, application : application.name },
function() {
$scope.secret = secret.value;
}
);
$scope.changePassword = function() {
var secret = ApplicationCredentials.update({ realm : realm.realm, application : application.name },
function() {
Notifications.success('The secret has been changed.');
$scope.secret = secret.value;
},
function() {
Notifications.error("The secret was not changed due to a problem.");
$scope.secret = "error";
}
);
};
$scope.$watch(function() {
return $location.path();
}, function() {
$scope.path = $location.path().substring(1).split("/");
});
});
module.controller('ApplicationSessionsCtrl', function($scope, $location, realm, application) {
$scope.realm = realm;
$scope.application = application;
});
module.controller('ApplicationRoleDetailCtrl', function($scope, realm, application, role, roles, applications,
Role, ApplicationRole, RoleById, RoleRealmComposites, RoleApplicationComposites,
$http, $location, Dialog, Notifications) {
$scope.realm = realm;
$scope.application = application;
$scope.role = angular.copy(role);
$scope.create = !role.name;
$scope.changed = $scope.create;
$scope.save = function() {
if ($scope.create) {
ApplicationRole.save({
realm: realm.realm,
application : application.name
}, $scope.role, function (data, headers) {
$scope.changed = false;
role = angular.copy($scope.role);
var l = headers().location;
var id = l.substring(l.lastIndexOf("/") + 1);
$location.url("/realms/" + realm.realm + "/applications/" + application.name + "/roles/" + id);
Notifications.success("The role has been created.");
});
} else {
$scope.update();
}
};
$scope.remove = function() {
Dialog.confirmDelete($scope.role.name, 'role', function() {
$scope.role.$remove({
realm : realm.realm,
application : application.name,
role : $scope.role.name
}, function() {
$location.url("/realms/" + realm.realm + "/applications/" + application.name + "/roles");
Notifications.success("The role has been deleted.");
});
});
};
$scope.cancel = function () {
$location.url("/realms/" + realm.realm + "/applications/" + application.name + "/roles");
};
roleControl($scope, realm, role, roles, applications,
ApplicationRole, RoleById, RoleRealmComposites, RoleApplicationComposites,
$http, $location, Notifications, Dialog);
});
module.controller('ApplicationListCtrl', function($scope, realm, applications, Application, $location) {
console.log('ApplicationListCtrl');
$scope.realm = realm;
$scope.applications = applications;
$scope.$watch(function() {
return $location.path();
}, function() {
$scope.path = $location.path().substring(1).split("/");
});
});
module.controller('ApplicationInstallationCtrl', function($scope, realm, application, ApplicationInstallation,ApplicationInstallationJBoss, $http, $routeParams) {
console.log('ApplicationInstallationCtrl');
$scope.realm = realm;
$scope.application = application;
$scope.installation = null;
$scope.download = null;
$scope.configFormat = null;
$scope.configFormats = [
"keycloak.json",
"Wildfly/JBoss Subsystem XML"
];
$scope.changeFormat = function() {
if ($scope.configFormat == "keycloak.json") {
var url = ApplicationInstallation.url({ realm: $routeParams.realm, application: $routeParams.application });
var installation = $http.get(url).success(function(data) {
var tmp = angular.fromJson(data);
$scope.installation = angular.toJson(tmp, true);
})
$scope.download = url;
} else if ($scope.configFormat == "Wildfly/JBoss Subsystem XML") {
var url = ApplicationInstallationJBoss.url({ realm: $routeParams.realm, application: $routeParams.application });
var installation = $http.get(url).success(function(data) {
$scope.installation = data;
})
$scope.download = url;
}
};
});
module.controller('ApplicationDetailCtrl', function($scope, realm, application, Application, $location, Dialog, Notifications) {
console.log('ApplicationDetailCtrl');
$scope.realm = realm;
$scope.create = !application.name;
if (!$scope.create) {
$scope.application= angular.copy(application);
} else {
$scope.application = {};
$scope.application.webOrigins = [];
$scope.application.redirectUris = [];
}
$scope.$watch(function() {
return $location.path();
}, function() {
$scope.path = $location.path().substring(1).split("/");
});
$scope.$watch('application', function() {
if (!angular.equals($scope.application, application)) {
$scope.changed = true;
}
}, true);
$scope.deleteWebOrigin = function(index) {
$scope.application.webOrigins.splice(index, 1);
}
$scope.addWebOrigin = function() {
$scope.application.webOrigins.push($scope.newWebOrigin);
$scope.newWebOrigin = "";
}
$scope.deleteRedirectUri = function(index) {
$scope.application.redirectUris.splice(index, 1);
}
$scope.addRedirectUri = function() {
$scope.application.redirectUris.push($scope.newRedirectUri);
$scope.newRedirectUri = "";
}
$scope.save = function() {
if ($scope.create) {
Application.save({
realm: realm.realm,
application: ''
}, $scope.application, function (data, headers) {
$scope.changed = false;
var l = headers().location;
var id = l.substring(l.lastIndexOf("/") + 1);
$location.url("/realms/" + realm.realm + "/applications/" + id);
Notifications.success("The application has been created.");
});
} else {
Application.update({
realm : realm.realm,
application : application.name
}, $scope.application, function() {
$scope.changed = false;
application = angular.copy($scope.application);
Notifications.success("Your changes have been saved to the application.");
});
}
};
$scope.reset = function() {
$scope.application = angular.copy(application);
$scope.changed = false;
};
$scope.cancel = function() {
$location.url("/realms/" + realm.realm + "/applications");
};
$scope.remove = function() {
Dialog.confirmDelete($scope.application.name, 'application', function() {
$scope.application.$remove({
realm : realm.realm,
application : $scope.application.name
}, function() {
$location.url("/realms/" + realm.realm + "/applications");
Notifications.success("The application has been deleted.");
});
});
};
});
module.controller('ApplicationScopeMappingCtrl', function($scope, $http, realm, application, roles, applications, ApplicationRealmScopeMapping, ApplicationApplicationScopeMapping, ApplicationRole) {
$scope.realm = realm;
$scope.application = application;
$scope.realmRoles = angular.copy(roles);
$scope.selectedRealmRoles = [];
$scope.selectedRealmMappings = [];
$scope.realmMappings = [];
$scope.applications = applications;
$scope.applicationRoles = [];
$scope.selectedApplicationRoles = [];
$scope.selectedApplicationMappings = [];
$scope.applicationMappings = [];
$scope.realmMappings = ApplicationRealmScopeMapping.query({realm : realm.realm, application : application.name}, function(){
for (var i = 0; i < $scope.realmMappings.length; i++) {
var role = $scope.realmMappings[i];
for (var j = 0; j < $scope.realmRoles.length; j++) {
var realmRole = $scope.realmRoles[j];
if (realmRole.id == role.id) {
var idx = $scope.realmRoles.indexOf(realmRole);
if (idx != -1) {
$scope.realmRoles.splice(idx, 1);
break;
}
}
}
}
});
$scope.addRealmRole = function() {
$http.post('/auth/rest/admin/realms/' + realm.realm + '/applications/' + application.name + '/scope-mappings/realm',
$scope.selectedRealmRoles).success(function() {
for (var i = 0; i < $scope.selectedRealmRoles.length; i++) {
var role = $scope.selectedRealmRoles[i];
var idx = $scope.realmRoles.indexOf($scope.selectedRealmRoles[i]);
if (idx != -1) {
$scope.realmRoles.splice(idx, 1);
$scope.realmMappings.push(role);
}
}
$scope.selectRealmRoles = [];
});
};
$scope.deleteRealmRole = function() {
$http.delete('/auth/rest/admin/realms/' + realm.realm + '/applications/' + application.name + '/scope-mappings/realm',
{data : $scope.selectedRealmMappings, headers : {"content-type" : "application/json"}}).success(function() {
for (var i = 0; i < $scope.selectedRealmMappings.length; i++) {
var role = $scope.selectedRealmMappings[i];
var idx = $scope.realmMappings.indexOf($scope.selectedRealmMappings[i]);
if (idx != -1) {
$scope.realmMappings.splice(idx, 1);
$scope.realmRoles.push(role);
}
}
$scope.selectedRealmMappings = [];
});
};
$scope.addApplicationRole = function() {
$http.post('/auth/rest/admin/realms/' + realm.realm + '/applications/' + application.name + '/scope-mappings/applications/' + $scope.targetApp.name,
$scope.selectedApplicationRoles).success(function() {
for (var i = 0; i < $scope.selectedApplicationRoles.length; i++) {
var role = $scope.selectedApplicationRoles[i];
var idx = $scope.applicationRoles.indexOf($scope.selectedApplicationRoles[i]);
if (idx != -1) {
$scope.applicationRoles.splice(idx, 1);
$scope.applicationMappings.push(role);
}
}
$scope.selectedApplicationRoles = [];
});
};
$scope.deleteApplicationRole = function() {
$http.delete('/auth/rest/admin/realms/' + realm.realm + '/applications/' + application.name + '/scope-mappings/applications/' + $scope.targetApp.name,
{data : $scope.selectedApplicationMappings, headers : {"content-type" : "application/json"}}).success(function() {
for (var i = 0; i < $scope.selectedApplicationMappings.length; i++) {
var role = $scope.selectedApplicationMappings[i];
var idx = $scope.applicationMappings.indexOf($scope.selectedApplicationMappings[i]);
if (idx != -1) {
$scope.applicationMappings.splice(idx, 1);
$scope.applicationRoles.push(role);
}
}
$scope.selectedApplicationMappings = [];
});
};
$scope.changeApplication = function() {
if ($scope.targetApp) {
$scope.applicationRoles = ApplicationRole.query({realm : realm.realm, application : $scope.targetApp.name}, function() {
$scope.applicationMappings = ApplicationApplicationScopeMapping.query({realm : realm.realm, application : application.name, targetApp : $scope.targetApp.name}, function(){
for (var i = 0; i < $scope.applicationMappings.length; i++) {
var role = $scope.applicationMappings[i];
for (var j = 0; j < $scope.applicationRoles.length; j++) {
var realmRole = $scope.applicationRoles[j];
if (realmRole.id == role.id) {
var idx = $scope.applicationRoles.indexOf(realmRole);
if (idx != -1) {
$scope.applicationRoles.splice(idx, 1);
break;
}
}
}
}
});
}
);
} else {
$scope.applicationRoles = null;
}
};
});
@@ -1,255 +0,0 @@
module.controller('OAuthClientCredentialsCtrl', function($scope, $location, realm, oauth, OAuthClientCredentials, Notifications) {
$scope.realm = realm;
$scope.oauth = oauth;
var secret = OAuthClientCredentials.get({ realm : realm.realm, oauth : oauth.id },
function() {
$scope.secret = secret.value;
}
);
$scope.changePassword = function() {
var secret = OAuthClientCredentials.update({ realm : realm.realm, oauth : oauth.id },
function() {
Notifications.success('The secret has been changed.');
$scope.secret = secret.value;
},
function() {
Notifications.error("The secret was not changed due to a problem.");
$scope.secret = "error";
}
);
};
$scope.$watch(function() {
return $location.path();
}, function() {
$scope.path = $location.path().substring(1).split("/");
});
});
module.controller('OAuthClientListCtrl', function($scope, realm, oauthClients, OAuthClient, $location) {
$scope.realm = realm;
$scope.oauthClients = oauthClients;
$scope.$watch(function() {
return $location.path();
}, function() {
$scope.path = $location.path().substring(1).split("/");
});
});
module.controller('OAuthClientDetailCtrl', function($scope, realm, oauth, OAuthClient, $location, Dialog, Notifications) {
$scope.realm = realm;
$scope.create = !oauth.id;
if (!$scope.create) {
$scope.oauth= angular.copy(oauth);
} else {
$scope.oauth = {};
$scope.oauth.webOrigins = [];
$scope.oauth.redirectUris = [];
}
$scope.$watch(function() {
return $location.path();
}, function() {
$scope.path = $location.path().substring(1).split("/");
});
$scope.$watch('oauth', function() {
if (!angular.equals($scope.oauth, oauth)) {
$scope.changed = true;
}
}, true);
$scope.deleteWebOrigin = function(index) {
$scope.oauth.webOrigins.splice(index, 1);
}
$scope.addWebOrigin = function() {
$scope.oauth.webOrigins.push($scope.newWebOrigin);
$scope.newWebOrigin = "";
}
$scope.deleteRedirectUri = function(index) {
$scope.oauth.redirectUris.splice(index, 1);
}
$scope.addRedirectUri = function() {
$scope.oauth.redirectUris.push($scope.newRedirectUri);
$scope.newRedirectUri = "";
}
$scope.save = function() {
if ($scope.create) {
OAuthClient.save({
realm: realm.realm
}, $scope.oauth, function (data, headers) {
$scope.changed = false;
var l = headers().location;
var id = l.substring(l.lastIndexOf("/") + 1);
$location.url("/realms/" + realm.realm + "/oauth-clients/" + id);
Notifications.success("The oauth client has been created.");
});
} else {
OAuthClient.update({
realm : realm.realm,
id : oauth.id
}, $scope.oauth, function() {
$scope.changed = false;
oauth = angular.copy($scope.oauth);
Notifications.success("Your changes have been saved to the oauth client.");
});
}
};
$scope.reset = function() {
$scope.oauth = angular.copy(oauth);
$scope.changed = false;
};
$scope.cancel = function() {
$location.url("/realms/" + realm.realm + "/oauth-clients");
};
$scope.remove = function() {
Dialog.confirmDelete($scope.oauth.name, 'oauth', function() {
$scope.oauth.$remove({
realm : realm.realm,
id : $scope.oauth.id
}, function() {
$location.url("/realms/" + realm.realm + "/oauth-clients");
Notifications.success("The oauth client has been deleted.");
});
});
};
});
module.controller('OAuthClientScopeMappingCtrl', function($scope, $http, realm, oauth, roles, applications, OAuthClientRealmScopeMapping, OAuthClientApplicationScopeMapping, ApplicationRole) {
$scope.realm = realm;
$scope.oauth = oauth;
$scope.realmRoles = angular.copy(roles);
$scope.selectedRealmRoles = [];
$scope.selectedRealmMappings = [];
$scope.realmMappings = [];
$scope.applications = applications;
$scope.applicationRoles = [];
$scope.selectedApplicationRoles = [];
$scope.selectedApplicationMappings = [];
$scope.applicationMappings = [];
$scope.realmMappings = OAuthClientRealmScopeMapping.query({realm : realm.realm, oauth : oauth.id}, function(){
for (var i = 0; i < $scope.realmMappings.length; i++) {
var role = $scope.realmMappings[i];
for (var j = 0; j < $scope.realmRoles.length; j++) {
var realmRole = $scope.realmRoles[j];
if (realmRole.id == role.id) {
var idx = $scope.realmRoles.indexOf(realmRole);
if (idx != -1) {
$scope.realmRoles.splice(idx, 1);
break;
}
}
}
}
});
$scope.addRealmRole = function() {
$http.post('/auth/rest/admin/realms/' + realm.realm + '/oauth-clients/' + oauth.id + '/scope-mappings/realm',
$scope.selectedRealmRoles).success(function() {
for (var i = 0; i < $scope.selectedRealmRoles.length; i++) {
var role = $scope.selectedRealmRoles[i];
var idx = $scope.realmRoles.indexOf($scope.selectedRealmRoles[i]);
if (idx != -1) {
$scope.realmRoles.splice(idx, 1);
$scope.realmMappings.push(role);
}
}
$scope.selectRealmRoles = [];
});
};
$scope.deleteRealmRole = function() {
$http.delete('/auth/rest/admin/realms/' + realm.realm + '/oauth-clients/' + oauth.id + '/scope-mappings/realm',
{data : $scope.selectedRealmMappings, headers : {"content-type" : "application/json"}}).success(function() {
for (var i = 0; i < $scope.selectedRealmMappings.length; i++) {
var role = $scope.selectedRealmMappings[i];
var idx = $scope.realmMappings.indexOf($scope.selectedRealmMappings[i]);
if (idx != -1) {
$scope.realmMappings.splice(idx, 1);
$scope.realmRoles.push(role);
}
}
$scope.selectedRealmMappings = [];
});
};
$scope.addApplicationRole = function() {
$http.post('/auth/rest/admin/realms/' + realm.realm + '/oauth-clients/' + oauth.id + '/scope-mappings/applications/' + $scope.targetApp.name,
$scope.selectedApplicationRoles).success(function() {
for (var i = 0; i < $scope.selectedApplicationRoles.length; i++) {
var role = $scope.selectedApplicationRoles[i];
var idx = $scope.applicationRoles.indexOf($scope.selectedApplicationRoles[i]);
if (idx != -1) {
$scope.applicationRoles.splice(idx, 1);
$scope.applicationMappings.push(role);
}
}
$scope.selectedApplicationRoles = [];
});
};
$scope.deleteApplicationRole = function() {
$http.delete('/auth/rest/admin/realms/' + realm.realm + '/oauth-clients/' + oauth.id + '/scope-mappings/applications/' + $scope.targetApp.name,
{data : $scope.selectedApplicationMappings, headers : {"content-type" : "application/json"}}).success(function() {
for (var i = 0; i < $scope.selectedApplicationMappings.length; i++) {
var role = $scope.selectedApplicationMappings[i];
var idx = $scope.applicationMappings.indexOf($scope.selectedApplicationMappings[i]);
if (idx != -1) {
$scope.applicationMappings.splice(idx, 1);
$scope.applicationRoles.push(role);
}
}
$scope.selectedApplicationMappings = [];
});
};
$scope.changeApplication = function() {
if ($scope.targetApp) {
$scope.applicationRoles = ApplicationRole.query({realm : realm.realm, application : $scope.targetApp.name}, function() {
$scope.applicationMappings = OAuthClientApplicationScopeMapping.query({realm : realm.realm, oauth : oauth.id, targetApp : $scope.targetApp.name}, function(){
for (var i = 0; i < $scope.applicationMappings.length; i++) {
var role = $scope.applicationMappings[i];
for (var j = 0; j < $scope.applicationRoles.length; j++) {
var realmRole = $scope.applicationRoles[j];
if (realmRole.id == role.id) {
var idx = $scope.applicationRoles.indexOf(realmRole);
if (idx != -1) {
$scope.applicationRoles.splice(idx, 1);
break;
}
}
}
}
});
}
);
} else {
$scope.targetApp = null;
}
};
});
module.controller('OAuthClientInstallationCtrl', function($scope, realm, installation, oauth, OAuthClientInstallation, $routeParams) {
$scope.realm = realm;
$scope.oauth = oauth;
$scope.installation = installation;
$scope.download = OAuthClientInstallation.url({ realm: $routeParams.realm, oauth: $routeParams.oauth });
});
@@ -1,744 +0,0 @@
module.controller('GlobalCtrl', function($scope, $http, Auth, Current, $location, Notifications) {
$scope.addMessage = function() {
Notifications.success("test");
};
$scope.auth = Auth;
$http.get('/auth/rest/admin/whoami').success(function(data, status) {
Auth.user = data;
Auth.loggedIn = true;
})
.error(function(data, status) {
Auth.loggedIn = false;
});
$scope.$watch(function() {
return $location.path();
}, function() {
$scope.fragment = $location.path();
$scope.path = $location.path().substring(1).split("/");
});
});
module.controller('HomeCtrl', function(Realm, $location) {
Realm.query(null, function(realms) {
var realm;
if (realms.length == 1) {
realm = realms[0].realm;
} else if (realms.length == 2) {
if (realms[0].realm == 'keycloak-admin') {
realm = realms[1].realm;
} else if (realms[1].realm == 'administration') {
realm = realms[0].realm;
}
}
if (realm) {
$location.url('/realms/' + realm);
} else {
$location.url('/realms');
}
});
});
module.controller('RealmListCtrl', function($scope, Realm, Current) {
$scope.realms = Realm.query();
Current.realms = $scope.realms;
});
module.controller('RealmDropdownCtrl', function($scope, Realm, Current, Auth, $location) {
// Current.realms = Realm.get();
$scope.current = Current;
$scope.changeRealm = function(selectedRealm) {
$location.url("/realms/" + selectedRealm);
};
$scope.showNav = function() {
var show = Current.realms.length > 0;
return Auth.loggedIn && show;
}
$scope.refresh = function() {
Current.refresh();
}
});
module.controller('RealmCreateCtrl', function($scope, Current, Realm, $upload, $http, $location, Dialog, Notifications) {
console.log('RealmCreateCtrl');
Current.realm = null;
$scope.realm = {
enabled: true
};
$scope.changed = false;
$scope.files = [];
var oldCopy = angular.copy($scope.realm);
$scope.onFileSelect = function($files) {
$scope.files = $files;
};
$scope.clearFileSelect = function() {
$scope.files = null;
}
$scope.uploadFile = function() {
//$files: an array of files selected, each file has name, size, and type.
for (var i = 0; i < $scope.files.length; i++) {
var $file = $scope.files[i];
$scope.upload = $upload.upload({
url: '/auth/rest/admin/realms', //upload.php script, node.js route, or servlet url
// method: POST or PUT,
// headers: {'headerKey': 'headerValue'}, withCredential: true,
data: {myObj: ""},
file: $file
/* set file formData name for 'Content-Desposition' header. Default: 'file' */
//fileFormDataName: myFile,
/* customize how data is added to formData. See #40#issuecomment-28612000 for example */
//formDataAppender: function(formData, key, val){}
}).progress(function(evt) {
console.log('percent: ' + parseInt(100.0 * evt.loaded / evt.total));
}).success(function(data, status, headers, config) {
Notifications.success("The realm has been uploaded.");
$location.url("/realms");
})
.error(function() {
Notifications.error("The realm can not be uploaded. Please verify the file.");
});
//.then(success, error, progress);
}
};
$scope.$watch('realm', function() {
if (!angular.equals($scope.realm, oldCopy)) {
$scope.changed = true;
}
}, true);
$scope.save = function() {
var realmCopy = angular.copy($scope.realm);
var ssl = window.location.protocol == 'https:';
realmCopy.sslNotRequired = !ssl;
console.log('creating new realm **');
Realm.create(realmCopy, function(data, headers) {
var data = Realm.query(function() {
Current.realms = data;
for (var i = 0; i < Current.realms.length; i++) {
if (Current.realms[i].realm == realmCopy.realm) {
Current.realm = Current.realms[i];
}
}
$location.url("/realms/" + realmCopy.realm);
Notifications.success("The realm has been created.");
});
});
};
$scope.cancel = function() {
//$location.url("/realms");
window.history.back();
};
});
module.controller('RealmDetailCtrl', function($scope, Current, Realm, realm, serverInfo, $http, $location, Dialog, Notifications) {
$scope.createRealm = !realm.realm;
$scope.serverInfo = serverInfo;
console.log('RealmDetailCtrl');
if ($scope.createRealm) {
$scope.realm = {
enabled: true,
requireSsl: true
};
} else {
if (Current.realm == null || Current.realm.realm != realm.realm) {
for (var i = 0; i < Current.realms.length; i++) {
if (realm.realm == Current.realms[i].realm) {
Current.realm = Current.realms[i];
break;
}
}
}
console.log('realm name: ' + realm.realm);
for (var i = 0; i < Current.realms.length; i++) {
console.log('checking Current.realm:' + Current.realms[i].realm);
if (Current.realms[i].realm == realm.realm) {
Current.realm = Current.realms[i];
}
}
/*
if (Current.realm == null || Current.realm.realm != realm.realm) {
console.log('should be unreachable');
console.log('Why? ' + Current.realms.length + ' ' + Current.realm);
return;
}
*/
$scope.realm = angular.copy(realm);
$scope.realm.requireSsl = !realm.sslNotRequired;
}
$scope.social = $scope.realm.social;
$scope.registrationAllowed = $scope.realm.registrationAllowed;
var oldCopy = angular.copy($scope.realm);
$scope.changed = $scope.create;
$scope.$watch('realm', function() {
if (!angular.equals($scope.realm, oldCopy)) {
$scope.changed = true;
}
}, true);
$scope.save = function() {
var realmCopy = angular.copy($scope.realm);
realmCopy.sslNotRequired = !realmCopy.requireSsl;
delete realmCopy["requireSsl"];
if ($scope.createRealm) {
Realm.save(realmCopy, function(data, headers) {
console.log('creating new realm');
var data = Realm.query(function() {
Current.realms = data;
for (var i = 0; i < Current.realms.length; i++) {
if (Current.realms[i].realm == realmCopy.realm) {
Current.realm = Current.realms[i];
}
}
$location.url("/realms/" + realmCopy.realm);
Notifications.success("The realm has been created.");
$scope.social = $scope.realm.social;
$scope.registrationAllowed = $scope.realm.registrationAllowed;
});
});
} else {
console.log('updating realm...');
$scope.changed = false;
console.log('oldCopy.realm - ' + oldCopy.realm);
Realm.update({ id : oldCopy.realm}, realmCopy, function () {
var data = Realm.query(function () {
Current.realms = data;
for (var i = 0; i < Current.realms.length; i++) {
if (Current.realms[i].realm == realmCopy.realm) {
Current.realm = Current.realms[i];
oldCopy = angular.copy($scope.realm);
}
}
});
$location.url("/realms/" + realmCopy.realm);
Notifications.success("Your changes have been saved to the realm.");
$scope.social = $scope.realm.social;
$scope.registrationAllowed = $scope.realm.registrationAllowed;
});
}
};
$scope.reset = function() {
$scope.realm = angular.copy(oldCopy);
$scope.changed = false;
};
$scope.cancel = function() {
//$location.url("/realms");
window.history.back();
};
$scope.remove = function() {
Dialog.confirmDelete($scope.realm.realm, 'realm', function() {
Realm.remove({ id : $scope.realm.realm }, function() {
Current.realms = Realm.query();
Notifications.success("The realm has been deleted.");
$location.url("/");
});
});
};
});
module.controller('RealmRequiredCredentialsCtrl', function($scope, Realm, realm, $http, $location, Dialog, Notifications, PasswordPolicy) {
console.log('RealmRequiredCredentialsCtrl');
$scope.realm = realm;
var oldCopy = angular.copy($scope.realm);
$scope.allPolicies = PasswordPolicy.allPolicies;
$scope.policyMessages = PasswordPolicy.policyMessages;
$scope.policy = PasswordPolicy.parse(realm.passwordPolicy);
var oldPolicy = angular.copy($scope.policy);
$scope.addPolicy = function(policy){
if (!$scope.policy) {
$scope.policy = [];
}
$scope.policy.push(policy);
}
$scope.removePolicy = function(index){
$scope.policy.splice(index, 1);
}
$scope.userCredentialOptions = {
'multiple' : true,
'simple_tags' : true,
'tags' : ['password', 'totp', 'cert']
};
$scope.changed = false;
$scope.$watch('realm', function() {
if (!angular.equals($scope.realm, oldCopy)) {
$scope.changed = true;
}
}, true);
$scope.$watch('policy', function(oldVal, newVal) {
if (!angular.equals($scope.policy, oldPolicy)) {
$scope.realm.passwordPolicy = PasswordPolicy.toString($scope.policy);
$scope.changed = true;
}
}, true);
$scope.save = function() {
$scope.changed = false;
Realm.update($scope.realm, function () {
$location.url("/realms/" + realm.realm + "/required-credentials");
Notifications.success("Your changes have been saved to the realm.");
oldCopy = angular.copy($scope.realm);
oldPolicy = angular.copy($scope.policy);
});
};
$scope.reset = function() {
$scope.realm = angular.copy(oldCopy);
$scope.policy = angular.copy(oldPolicy);
$scope.changed = false;
};
});
module.controller('RealmDefaultRolesCtrl', function ($scope, Realm, realm, applications, roles, Notifications, ApplicationRole, Application) {
console.log('RealmDefaultRolesCtrl');
$scope.realm = realm;
$scope.availableRealmRoles = [];
$scope.selectedRealmRoles = [];
$scope.selectedRealmDefRoles = [];
$scope.applications = angular.copy(applications);
for (var i = 0; i < applications.length; i++) {
if (applications[i].name == 'account') {
$scope.application = $scope.applications[i];
break;
}
}
$scope.availableAppRoles = [];
$scope.selectedAppRoles = [];
$scope.selectedAppDefRoles = [];
if (!$scope.realm.hasOwnProperty('defaultRoles') || $scope.realm.defaultRoles === null) {
$scope.realm.defaultRoles = [];
}
// Populate available roles. Available roles are neither already assigned
for (var i = 0; i < roles.length; i++) {
var item = roles[i].name;
if ($scope.realm.defaultRoles.indexOf(item) < 0) {
$scope.availableRealmRoles.push(item);
}
}
$scope.addRealmDefaultRole = function () {
// Remove selected roles from the Available roles and add them to realm default roles (move from left to right).
for (var i = 0; i < $scope.selectedRealmRoles.length; i++) {
var selectedRole = $scope.selectedRealmRoles[i];
$scope.realm.defaultRoles.push(selectedRole);
var index = $scope.availableRealmRoles.indexOf(selectedRole);
if (index > -1) {
$scope.availableRealmRoles.splice(index, 1);
}
}
// Update/save the realm with new default roles.
Realm.update($scope.realm, function () {
Notifications.success("Realm default roles updated.");
});
};
$scope.deleteRealmDefaultRole = function () {
// Remove selected roles from the realm default roles and add them to available roles (move from right to left).
for (var i = 0; i < $scope.selectedRealmDefRoles.length; i++) {
$scope.availableRealmRoles.push($scope.selectedRealmDefRoles[i]);
var index = $scope.realm.defaultRoles.indexOf($scope.selectedRealmDefRoles[i]);
if (index > -1) {
$scope.realm.defaultRoles.splice(index, 1);
}
}
// Update/save the realm with new default roles.
//var realmCopy = angular.copy($scope.realm);
Realm.update($scope.realm, function () {
Notifications.success("Realm default roles updated.");
});
};
$scope.changeApplication = function () {
$scope.selectedAppRoles = [];
$scope.selectedAppDefRoles = [];
// Populate available roles for selected application
if ($scope.application) {
var appDefaultRoles = ApplicationRole.query({realm: $scope.realm.realm, application: $scope.application.name}, function () {
if (!$scope.application.hasOwnProperty('defaultRoles') || $scope.application.defaultRoles === null) {
$scope.application.defaultRoles = [];
}
$scope.availableAppRoles = [];
for (var i = 0; i < appDefaultRoles.length; i++) {
var roleName = appDefaultRoles[i].name;
if ($scope.application.defaultRoles.indexOf(roleName) < 0) {
$scope.availableAppRoles.push(roleName);
}
}
});
} else {
$scope.availableAppRoles = null;
}
};
$scope.addAppDefaultRole = function () {
// Remove selected roles from the app available roles and add them to app default roles (move from left to right).
for (var i = 0; i < $scope.selectedAppRoles.length; i++) {
var role = $scope.selectedAppRoles[i];
var idx = $scope.application.defaultRoles.indexOf(role);
if (idx < 0) {
$scope.application.defaultRoles.push(role);
}
idx = $scope.availableAppRoles.indexOf(role);
if (idx != -1) {
$scope.availableAppRoles.splice(idx, 1);
}
}
// Update/save the selected application with new default roles.
Application.update({
realm: $scope.realm.realm,
id: $scope.application.name
}, $scope.application, function () {
Notifications.success("Your changes have been saved to the application.");
});
};
$scope.rmAppDefaultRole = function () {
// Remove selected roles from the app default roles and add them to app available roles (move from right to left).
for (var i = 0; i < $scope.selectedAppDefRoles.length; i++) {
var role = $scope.selectedAppDefRoles[i];
var idx = $scope.application.defaultRoles.indexOf(role);
if (idx != -1) {
$scope.application.defaultRoles.splice(idx, 1);
}
idx = $scope.availableAppRoles.indexOf(role);
if (idx < 0) {
$scope.availableAppRoles.push(role);
}
}
// Update/save the selected application with new default roles.
Application.update({
realm: $scope.realm.realm,
id: $scope.application.name
}, $scope.application, function () {
Notifications.success("Your changes have been saved to the application.");
});
};
});
module.controller('RealmSocialCtrl', function($scope, realm, Realm, serverInfo, $location, Notifications) {
console.log('RealmSocialCtrl');
$scope.realm = angular.copy(realm);
$scope.serverInfo = serverInfo;
$scope.allProviders = serverInfo.socialProviders;
$scope.configuredProviders = [];
$scope.$watch('realm.socialProviders', function(socialProviders) {
$scope.configuredProviders = [];
for (var providerConfig in socialProviders) {
var i = providerConfig.split('.');
if (i.length == 2 && i[1] == 'key') {
$scope.configuredProviders.push(i[0]);
}
}
}, true);
var oldCopy = angular.copy($scope.realm);
$scope.changed = false;
$scope.callbackUrl = $location.absUrl().replace(/\/admin.*/, "/rest/social/callback");
$scope.addProvider = function(pId) {
if (!$scope.realm.socialProviders) {
$scope.realm.socialProviders = {};
}
$scope.realm.socialProviders[pId + ".key"] = "";
$scope.realm.socialProviders[pId + ".secret"] = "";
};
$scope.removeProvider = function(pId) {
delete $scope.realm.socialProviders[pId+".key"];
delete $scope.realm.socialProviders[pId+".secret"];
};
$scope.$watch('realm', function() {
if (!angular.equals($scope.realm, oldCopy)) {
$scope.changed = true;
}
}, true);
$scope.save = function() {
var realmCopy = angular.copy($scope.realm);
realmCopy.social = true;
$scope.changed = false;
Realm.update(realmCopy, function () {
$location.url("/realms/" + realm.realm + "/social-settings");
Notifications.success("Saved changes to realm");
oldCopy = realmCopy;
});
};
$scope.reset = function() {
$scope.realm = angular.copy(oldCopy);
$scope.changed = false;
};
});
module.controller('RealmTokenDetailCtrl', function($scope, Realm, realm, $http, $location, Dialog, Notifications, TimeUnit) {
console.log('RealmTokenDetailCtrl');
$scope.realm = realm;
$scope.realm.tokenLifespanUnit = TimeUnit.autoUnit(realm.tokenLifespan);
$scope.realm.tokenLifespan = TimeUnit.toUnit(realm.tokenLifespan, $scope.realm.tokenLifespanUnit);
$scope.$watch('realm.tokenLifespanUnit', function(to, from) {
$scope.realm.tokenLifespan = TimeUnit.convert($scope.realm.tokenLifespan, from, to);
});
$scope.realm.accessCodeLifespanUnit = TimeUnit.autoUnit(realm.accessCodeLifespan);
$scope.realm.accessCodeLifespan = TimeUnit.toUnit(realm.accessCodeLifespan, $scope.realm.accessCodeLifespanUnit);
$scope.$watch('realm.accessCodeLifespanUnit', function(to, from) {
$scope.realm.accessCodeLifespan = TimeUnit.convert($scope.realm.accessCodeLifespan, from, to);
});
$scope.realm.accessCodeLifespanUserActionUnit = TimeUnit.autoUnit(realm.accessCodeLifespanUserAction);
$scope.realm.accessCodeLifespanUserAction = TimeUnit.toUnit(realm.accessCodeLifespanUserAction, $scope.realm.accessCodeLifespanUserActionUnit);
$scope.$watch('realm.accessCodeLifespanUserActionUnit', function(to, from) {
$scope.realm.accessCodeLifespanUserAction = TimeUnit.convert($scope.realm.accessCodeLifespanUserAction, from, to);
});
var oldCopy = angular.copy($scope.realm);
$scope.changed = false;
$scope.$watch('realm', function() {
if (!angular.equals($scope.realm, oldCopy)) {
$scope.changed = true;
}
}, true);
$scope.save = function() {
var realmCopy = angular.copy($scope.realm);
delete realmCopy["tokenLifespanUnit"];
delete realmCopy["accessCodeLifespanUnit"];
delete realmCopy["accessCodeLifespanUserActionUnit"];
realmCopy.tokenLifespan = TimeUnit.toSeconds($scope.realm.tokenLifespan, $scope.realm.tokenLifespanUnit)
realmCopy.accessCodeLifespan = TimeUnit.toSeconds($scope.realm.accessCodeLifespan, $scope.realm.accessCodeLifespanUnit)
realmCopy.accessCodeLifespanUserAction = TimeUnit.toSeconds($scope.realm.accessCodeLifespanUserAction, $scope.realm.accessCodeLifespanUserActionUnit)
$scope.changed = false;
Realm.update(realmCopy, function () {
$location.url("/realms/" + realm.realm + "/token-settings");
Notifications.success("Your changes have been saved to the realm.");
});
};
$scope.reset = function() {
$scope.realm = angular.copy(oldCopy);
$scope.changed = false;
};
});
module.controller('RealmKeysDetailCtrl', function($scope, Realm, realm, $http, $location, Dialog, Notifications) {
$scope.realm = realm;
$scope.generate = function() {
Dialog.confirmGenerateKeys($scope.realm.realm, 'realm', function() {
Realm.update({ realm: realm.realm, publicKey : 'GENERATE' }, function () {
Notifications.success('New keys generated for realm.');
Realm.get({ id : realm.realm }, function(updated) {
$scope.realm = updated;
})
});
});
};
});
module.controller('RoleListCtrl', function($scope, $location, realm, roles) {
$scope.realm = realm;
$scope.roles = roles;
$scope.$watch(function() {
return $location.path();
}, function() {
$scope.path = $location.path().substring(1).split("/");
});
});
module.controller('RoleDetailCtrl', function($scope, realm, role, roles, applications,
Role, ApplicationRole, RoleById, RoleRealmComposites, RoleApplicationComposites,
$http, $location, Dialog, Notifications) {
$scope.realm = realm;
$scope.role = angular.copy(role);
$scope.create = !role.name;
$scope.changed = $scope.create;
$scope.save = function() {
console.log('save');
if ($scope.create) {
Role.save({
realm: realm.realm
}, $scope.role, function (data, headers) {
$scope.changed = false;
role = angular.copy($scope.role);
var l = headers().location;
var id = l.substring(l.lastIndexOf("/") + 1);
$location.url("/realms/" + realm.realm + "/roles/" + id);
Notifications.success("The role has been created.");
});
} else {
$scope.update();
}
};
$scope.remove = function () {
Dialog.confirmDelete($scope.role.name, 'role', function () {
$scope.role.$remove({
realm: realm.realm,
role: $scope.role.name
}, function () {
$location.url("/realms/" + realm.realm + "/roles");
Notifications.success("The role has been deleted.");
});
});
};
$scope.cancel = function () {
$location.url("/realms/" + realm.realm + "/roles");
};
roleControl($scope, realm, role, roles, applications,
ApplicationRole, RoleById, RoleRealmComposites, RoleApplicationComposites,
$http, $location, Notifications, Dialog);
});
module.controller('RealmSMTPSettingsCtrl', function($scope, Current, Realm, realm, $http, $location, Dialog, Notifications) {
console.log('RealmSMTPSettingsCtrl');
var booleanSmtpAtts = ["auth","ssl","starttls"];
$scope.realm = realm;
if ($scope.realm.smtpServer) {
$scope.realm.smtpServer = typeObject($scope.realm.smtpServer);
};
var oldCopy = angular.copy($scope.realm);
$scope.changed = false;
$scope.$watch('realm', function() {
if (!angular.equals($scope.realm, oldCopy)) {
$scope.changed = true;
}
}, true);
$scope.save = function() {
var realmCopy = angular.copy($scope.realm);
realmCopy['smtpServer'] = detypeObject(realmCopy.smtpServer);
$scope.changed = false;
Realm.update(realmCopy, function () {
$location.url("/realms/" + realm.realm + "/smtp-settings");
Notifications.success("Your changes have been saved to the realm.");
});
};
$scope.reset = function() {
$scope.realm = angular.copy(oldCopy);
$scope.changed = false;
};
/* Convert string attributes containing a boolean to actual boolean type + convert an integer string (port) to integer. */
function typeObject(obj){
for (var att in obj){
if (booleanSmtpAtts.indexOf(att) < 0)
continue;
if (obj[att] === "true"){
obj[att] = true;
} else if (obj[att] === "false"){
obj[att] = false;
}
}
obj['port'] = parseInt(obj['port']);
return obj;
}
/* Convert all non-string values to strings to invert changes caused by the typeObject function. */
function detypeObject(obj){
for (var att in obj){
if (booleanSmtpAtts.indexOf(att) < 0)
continue;
if (obj[att] === true){
obj[att] = "true";
} else if (obj[att] === false){
obj[att] = "false"
}
}
obj['port'] = obj['port'].toString();
return obj;
}
});
@@ -1,367 +0,0 @@
module.controller('UserRoleMappingCtrl', function($scope, $http, realm, user, roles, applications, RealmRoleMapping, ApplicationRoleMapping, ApplicationRole) {
$scope.realm = realm;
$scope.user = user;
$scope.realmRoles = angular.copy(roles);
$scope.selectedRealmRoles = [];
$scope.selectedRealmMappings = [];
$scope.realmMappings = [];
$scope.applications = applications;
$scope.applicationRoles = [];
$scope.selectedApplicationRoles = [];
$scope.selectedApplicationMappings = [];
$scope.applicationMappings = [];
$scope.realmMappings = RealmRoleMapping.query({realm : realm.realm, userId : user.username}, function(){
for (var i = 0; i < $scope.realmMappings.length; i++) {
var role = $scope.realmMappings[i];
for (var j = 0; j < $scope.realmRoles.length; j++) {
var realmRole = $scope.realmRoles[j];
if (realmRole.id == role.id) {
var idx = $scope.realmRoles.indexOf(realmRole);
if (idx != -1) {
$scope.realmRoles.splice(idx, 1);
break;
}
}
}
}
});
$scope.addRealmRole = function() {
$http.post('/auth/rest/admin/realms/' + realm.realm + '/users/' + user.username + '/role-mappings/realm',
$scope.selectedRealmRoles).success(function() {
for (var i = 0; i < $scope.selectedRealmRoles.length; i++) {
var role = $scope.selectedRealmRoles[i];
var idx = $scope.realmRoles.indexOf($scope.selectedRealmRoles[i]);
if (idx != -1) {
$scope.realmRoles.splice(idx, 1);
$scope.realmMappings.push(role);
}
}
$scope.selectRealmRoles = [];
});
};
$scope.deleteRealmRole = function() {
$http.delete('/auth/rest/admin/realms/' + realm.realm + '/users/' + user.username + '/role-mappings/realm',
{data : $scope.selectedRealmMappings, headers : {"content-type" : "application/json"}}).success(function() {
for (var i = 0; i < $scope.selectedRealmMappings.length; i++) {
var role = $scope.selectedRealmMappings[i];
var idx = $scope.realmMappings.indexOf($scope.selectedRealmMappings[i]);
if (idx != -1) {
$scope.realmMappings.splice(idx, 1);
$scope.realmRoles.push(role);
}
}
$scope.selectedRealmMappings = [];
});
};
$scope.addApplicationRole = function() {
$http.post('/auth/rest/admin/realms/' + realm.realm + '/users/' + user.username + '/role-mappings/applications/' + $scope.application.name,
$scope.selectedApplicationRoles).success(function() {
for (var i = 0; i < $scope.selectedApplicationRoles.length; i++) {
var role = $scope.selectedApplicationRoles[i];
var idx = $scope.applicationRoles.indexOf($scope.selectedApplicationRoles[i]);
if (idx != -1) {
$scope.applicationRoles.splice(idx, 1);
$scope.applicationMappings.push(role);
}
}
$scope.selectedApplicationRoles = [];
});
};
$scope.deleteApplicationRole = function() {
$http.delete('/auth/rest/admin/realms/' + realm.realm + '/users/' + user.username + '/role-mappings/applications/' + $scope.application.name,
{data : $scope.selectedApplicationMappings, headers : {"content-type" : "application/json"}}).success(function() {
for (var i = 0; i < $scope.selectedApplicationMappings.length; i++) {
var role = $scope.selectedApplicationMappings[i];
var idx = $scope.applicationMappings.indexOf($scope.selectedApplicationMappings[i]);
if (idx != -1) {
$scope.applicationMappings.splice(idx, 1);
$scope.applicationRoles.push(role);
}
}
$scope.selectedApplicationMappings = [];
});
};
$scope.changeApplication = function() {
if ($scope.application) {
$scope.applicationRoles = ApplicationRole.query({realm : realm.realm, userId : user.username, application : $scope.application.name}, function() {
$scope.applicationMappings = ApplicationRoleMapping.query({realm : realm.realm, userId : user.username, application : $scope.application.name}, function(){
for (var i = 0; i < $scope.applicationMappings.length; i++) {
var role = $scope.applicationMappings[i];
for (var j = 0; j < $scope.applicationRoles.length; j++) {
var realmRole = $scope.applicationRoles[j];
if (realmRole.id == role.id) {
var idx = $scope.applicationRoles.indexOf(realmRole);
if (idx != -1) {
$scope.applicationRoles.splice(idx, 1);
break;
}
}
}
}
});
}
);
} else {
$scope.applicationRoles = null;
}
};
});
module.controller('UserListCtrl', function($scope, realm, User) {
$scope.realm = realm;
$scope.searchQuery = function() {
$scope.searchLoaded = false;
$scope.currentSearch = $scope.search;
var params = { realm: realm.realm };
if ($scope.search) {
params.search = $scope.search;
}
$scope.users = User.query(params, function() {
$scope.searchLoaded = true;
$scope.lastSearch = params.search;
});
};
});
module.controller('UserDetailCtrl', function($scope, realm, user, User, $location, Dialog, Notifications) {
$scope.realm = realm;
$scope.user = angular.copy(user);
$scope.create = !user.username;
$scope.changed = false; // $scope.create;
// ID - Name map for required actions. IDs are enum names.
var userReqActionList = [
{id: "VERIFY_EMAIL", text: "Verify Email"},
{id: "UPDATE_PROFILE", text: "Update Profile"},
{id: "CONFIGURE_TOTP", text: "Configure Totp"},
{id: "UPDATE_PASSWORD", text: "Update Password"}
];
// Options for the req actions tag selector
$scope.userReqActionsOptions = {
'multiple' : true,
'tags' : userReqActionList
};
// Model for the req actions tag selector
$scope.userActions = [];
for (var i = 0; i < userReqActionList.length; i++){
var action = userReqActionList[i];
if ($scope.user.requiredActions && $scope.user.requiredActions.indexOf(action.id) > -1){
$scope.userActions.push({id: action.id, text: action.text});
}
}
// Watching ui-select2 model to properly format the req actions for user
$scope.$watch("userActions", function(newValue, oldValue) {
$scope.user.requiredActions = [];
for (var i=0; i < newValue.length; i++){
var action = newValue[i];
$scope.user.requiredActions.push(action.id);
}
});
$scope.$watch('user', function() {
if (!angular.equals($scope.user, user)) {
$scope.changed = true;
}
}, true);
$scope.save = function() {
if ($scope.create) {
User.save({
realm: realm.realm
}, $scope.user, function () {
$scope.changed = false;
user = angular.copy($scope.user);
$location.url("/realms/" + realm.realm + "/users/" + $scope.user.username);
Notifications.success("The user has been created.");
});
} else {
User.update({
realm: realm.realm,
userId: $scope.user.username
}, $scope.user, function () {
$scope.changed = false;
user = angular.copy($scope.user);
Notifications.success("Your changes have been saved to the user.");
});
}
};
$scope.reset = function() {
$scope.user = angular.copy(user);
$scope.changed = false;
};
$scope.cancel = function() {
$location.url("/realms/" + realm.realm + "/users");
};
$scope.remove = function() {
Dialog.confirmDelete($scope.user.username, 'user', function() {
$scope.user.$remove({
realm : realm.realm,
userId : $scope.user.username
}, function() {
$location.url("/realms/" + realm.realm + "/users");
Notifications.success("The user has been deleted.");
});
});
};
});
module.controller('UserCredentialsCtrl', function($scope, realm, user, User, UserCredentials, Notifications, Dialog) {
console.log('UserCredentialsCtrl');
$scope.realm = realm;
$scope.user = angular.copy(user);
$scope.isTotp = false;
if(!!user.totp){
$scope.isTotp = user.totp;
}
$scope.resetPassword = function() {
if ($scope.pwdChange) {
if ($scope.password != $scope.confirmPassword) {
Notifications.error("Password and confirmation does not match.");
return;
}
}
Dialog.confirm('Reset password', 'Are you sure you want to reset the users password?', function() {
UserCredentials.resetPassword({ realm: realm.realm, userId: user.username }, { type : "password", value : $scope.password }, function() {
Notifications.success("The password has been reset");
$scope.password = null;
$scope.confirmPassword = null;
}, function() {
Notifications.error("Failed to reset user password");
});
}, function() {
$scope.password = null;
$scope.confirmPassword = null;
});
};
$scope.removeTotp = function() {
Dialog.confirm('Remove totp', 'Are you sure you want to remove the users totp configuration?', function() {
UserCredentials.removeTotp({ realm: realm.realm, userId: user.username }, { }, function() {
Notifications.success("The users totp configuration has been removed");
$scope.user.totp = false;
}, function() {
Notifications.error("Failed to remove the users totp configuration");
});
});
};
$scope.resetPasswordEmail = function() {
Dialog.confirm('Reset password email', 'Are you sure you want to send password reset email to user?', function() {
UserCredentials.resetPasswordEmail({ realm: realm.realm, userId: user.username }, { }, function() {
Notifications.success("Password reset email sent to user");
}, function() {
Notifications.error("Failed to send password reset mail to user");
});
});
};
$scope.$watch('user', function() {
if (!angular.equals($scope.user, user)) {
$scope.userChange = true;
} else {
$scope.userChange = false;
}
}, true);
$scope.$watch('password', function() {
if (!!$scope.password){
$scope.pwdChange = true;
} else {
$scope.pwdChange = false;
}
}, true);
$scope.reset = function() {
$scope.password = "";
$scope.confirmPassword = "";
$scope.user = angular.copy(user);
$scope.isTotp = false;
if(!!user.totp){
$scope.isTotp = user.totp;
}
$scope.pwdChange = false;
$scope.userChange = false;
};
});
module.controller('RoleMappingCtrl', function($scope, realm, User, users, role, RoleMapping, Notifications) {
$scope.realm = realm;
$scope.realmId = realm.realm || realm.realm;
$scope.allUsers = User.query({ realm : $scope.realmId });
$scope.users = users;
$scope.role = role;
$scope.addUser = function() {
var user = $scope.newUser;
$scope.newUser = null;
for ( var i = 0; i < $scope.allUsers.length; i++) {
if ($scope.allUsers[i].userId == user) {
user = $scope.allUsers[i];
RoleMapping.save({
realm : $scope.realmId,
role : role
}, user, function() {
$scope.users = RoleMapping.query({
realm : $scope.realmId,
role : role
});
Notifications.success("The role mapping has been added for the user.");
});
}
}
}
$scope.removeUser = function(userId) {
for (var i = 0; i < $scope.users.length; i++) {
var user = $scope.users[i];
if ($scope.users[i].userId == userId) {
RoleMapping.delete({
realm : $scope.realmId,
role : role
}, user, function() {
$scope.users = RoleMapping.query({
realm : $scope.realmId,
role : role
});
Notifications.success("The role mapping has been removed for the user.");
});
}
}
}
});
@@ -1,167 +0,0 @@
'use strict';
var module = angular.module('keycloak.loaders', [ 'keycloak.services', 'ngResource' ]);
module.factory('Loader', function($q) {
var loader = {};
loader.get = function(service, id) {
return function() {
var i = id && id();
var delay = $q.defer();
service.get(i, function(entry) {
delay.resolve(entry);
}, function() {
delay.reject('Unable to fetch ' + i);
});
return delay.promise;
};
}
loader.query = function(service, id) {
return function() {
var i = id && id();
var delay = $q.defer();
service.query(i, function(entry) {
delay.resolve(entry);
}, function() {
delay.reject('Unable to fetch ' + i);
});
return delay.promise;
};
}
return loader;
});
module.factory('RealmListLoader', function(Loader, Realm, $q) {
return Loader.get(Realm);
});
module.factory('ServerInfoLoader', function(Loader, ServerInfo, $q) {
return Loader.get(ServerInfo);
});
module.factory('RealmLoader', function(Loader, Realm, $route, $q) {
return Loader.get(Realm, function() {
return {
id : $route.current.params.realm
}
});
});
module.factory('UserListLoader', function(Loader, User, $route, $q) {
return Loader.query(User, function() {
return {
realm : $route.current.params.realm
}
});
});
module.factory('UserLoader', function(Loader, User, $route, $q) {
return Loader.get(User, function() {
return {
realm : $route.current.params.realm,
userId : $route.current.params.user
}
});
});
module.factory('RoleLoader', function(Loader, Role, $route, $q) {
return Loader.get(Role, function() {
return {
realm : $route.current.params.realm,
role : $route.current.params.role
}
});
});
module.factory('RoleListLoader', function(Loader, Role, $route, $q) {
return Loader.query(Role, function() {
return {
realm : $route.current.params.realm
}
});
});
module.factory('ApplicationRoleLoader', function(Loader, ApplicationRole, $route, $q) {
return Loader.get(ApplicationRole, function() {
return {
realm : $route.current.params.realm,
application : $route.current.params.application,
role : $route.current.params.role
}
});
});
module.factory('ApplicationInstallationLoader', function(Loader, ApplicationInstallation, $route, $q) {
return Loader.get(ApplicationInstallation, function() {
return {
realm : $route.current.params.realm,
application : $route.current.params.application
}
});
});
module.factory('ApplicationRoleListLoader', function(Loader, ApplicationRole, $route, $q) {
return Loader.query(ApplicationRole, function() {
return {
realm : $route.current.params.realm,
application : $route.current.params.application
}
});
});
module.factory('ApplicationLoader', function(Loader, Application, $route, $q) {
return Loader.get(Application, function() {
return {
realm : $route.current.params.realm,
application : $route.current.params.application
}
});
});
module.factory('ApplicationListLoader', function(Loader, Application, $route, $q) {
return Loader.query(Application, function() {
return {
realm : $route.current.params.realm
}
});
});
module.factory('RoleMappingLoader', function(Loader, RoleMapping, $route, $q) {
var realm = $route.current.params.realm || $route.current.params.application;
return Loader.query(RoleMapping, function() {
return {
realm : realm,
role : $route.current.params.role
}
});
});
module.factory('OAuthClientLoader', function(Loader, OAuthClient, $route, $q) {
return Loader.get(OAuthClient, function() {
return {
realm : $route.current.params.realm,
id : $route.current.params.oauth
}
});
});
module.factory('OAuthClientListLoader', function(Loader, OAuthClient, $route, $q) {
return Loader.query(OAuthClient, function() {
return {
realm : $route.current.params.realm
}
});
});
module.factory('OAuthClientInstallationLoader', function(Loader, OAuthClientInstallation, $route, $q) {
return Loader.get(OAuthClientInstallation, function() {
return {
realm : $route.current.params.realm,
oauth : $route.current.params.oauth
}
});
});
@@ -1,700 +0,0 @@
'use strict';
var module = angular.module('keycloak.services', [ 'ngResource' ]);
module.service('Dialog', function($dialog) {
var dialog = {};
var escapeHtml = function(str) {
var div = document.createElement('div');
div.appendChild(document.createTextNode(str));
return div.innerHTML;
};
dialog.confirmDelete = function(name, type, success) {
var title = 'Delete ' + escapeHtml(type.charAt(0).toUpperCase() + type.slice(1));
var msg = '<span class="primary">Are you sure you want to permanently delete the ' + escapeHtml(type) + ' <strong>' + escapeHtml(name) + '</strong>?</span>';
var btns = [ {
result : 'cancel',
label : 'Cancel',
cssClass : 'btn btn-default'
}, {
result : 'ok',
label : 'Delete',
cssClass : 'btn btn-danger'
} ];
$dialog.messageBox(title, msg, btns).open().then(function(result) {
if (result == "ok") {
success();
}
});
}
dialog.confirmGenerateKeys = function(name, type, success) {
var title = 'Generate new keys for realm';
var msg = '<span class="primary">Are you sure you want to permanently generate new keys for <strong>' + name + '</strong>?</span>';
var btns = [ {
result : 'cancel',
label : 'Cancel',
cssClass : 'btn btn-default'
}, {
result : 'ok',
label : 'Generate new keys',
cssClass : 'btn btn-danger'
} ];
$dialog.messageBox(title, msg, btns).open().then(function(result) {
if (result == "ok") {
success();
}
});
}
dialog.confirm = function(title, message, success, cancel) {
var title = title;
var msg = '<span class="primary">' + message + '"</span>';
var btns = [ {
result : 'cancel',
label : 'Cancel',
cssClass : 'btn btn-default'
}, {
result : 'ok',
label : title,
cssClass : 'btn btn-danger'
} ];
$dialog.messageBox(title, msg, btns).open().then(function(result) {
if (result == "ok") {
success();
} else {
cancel && cancel();
}
});
}
return dialog
});
module.factory('Notifications', function($rootScope, $timeout) {
// time (in ms) the notifications are shown
var delay = 5000;
var notifications = {};
var scheduled = null;
var schedulePop = function() {
if (scheduled) {
$timeout.cancel(scheduled);
}
scheduled = $timeout(function() {
$rootScope.notification = null;
scheduled = null;
}, delay);
};
if (!$rootScope.notifications) {
$rootScope.notifications = [];
}
notifications.message = function(type, header, message) {
$rootScope.notification = {
type : type,
header: header,
message : message
};
schedulePop();
}
notifications.info = function(message) {
notifications.message("info", "Info!", message);
};
notifications.success = function(message) {
notifications.message("success", "Success!", message);
};
notifications.error = function(message) {
notifications.message("danger", "Error!", message);
};
notifications.warn = function(message) {
notifications.message("warning", "Warning!", message);
};
return notifications;
});
module.factory('Realm', function($resource) {
return $resource('/auth/rest/admin/realms/:id', {
id : '@realm'
}, {
update : {
method : 'PUT'
},
create : {
method : 'POST',
params : { id : ''}
}
});
});
module.factory('ServerInfo', function($resource) {
return $resource('/auth/rest/admin/serverinfo');
});
module.factory('User', function($resource) {
return $resource('/auth/rest/admin/realms/:realm/users/:userId', {
realm : '@realm',
userId : '@userId'
}, {
update : {
method : 'PUT'
}
});
});
module.factory('UserCredentials', function($resource) {
var credentials = {};
credentials.resetPassword = $resource('/auth/rest/admin/realms/:realm/users/:userId/reset-password', {
realm : '@realm',
userId : '@userId'
}, {
update : {
method : 'PUT'
}
}).update;
credentials.removeTotp = $resource('/auth/rest/admin/realms/:realm/users/:userId/remove-totp', {
realm : '@realm',
userId : '@userId'
}, {
update : {
method : 'PUT'
}
}).update;
credentials.resetPasswordEmail = $resource('/auth/rest/admin/realms/:realm/users/:userId/reset-password-email', {
realm : '@realm',
userId : '@userId'
}, {
update : {
method : 'PUT'
}
}).update;
return credentials;
});
module.factory('RealmRoleMapping', function($resource) {
return $resource('/auth/rest/admin/realms/:realm/users/:userId/role-mappings/realm', {
realm : '@realm',
userId : '@userId'
});
});
module.factory('ApplicationRoleMapping', function($resource) {
return $resource('/auth/rest/admin/realms/:realm/users/:userId/role-mappings/applications/:application', {
realm : '@realm',
userId : '@userId',
application : "@application"
});
});
module.factory('ApplicationRealmScopeMapping', function($resource) {
return $resource('/auth/rest/admin/realms/:realm/applications/:application/scope-mappings/realm', {
realm : '@realm',
application : '@application'
});
});
module.factory('ApplicationApplicationScopeMapping', function($resource) {
return $resource('/auth/rest/admin/realms/:realm/applications/:application/scope-mappings/applications/:targetApp', {
realm : '@realm',
application : '@application',
targetApp : '@targetApp'
});
});
module.factory('RealmRoles', function($resource) {
return $resource('/auth/rest/admin/realms/:realm/roles', {
realm : '@realm'
});
});
module.factory('RoleRealmComposites', function($resource) {
return $resource('/auth/rest/admin/realms/:realm/roles-by-id/:role/composites/realm', {
realm : '@realm',
role : '@role'
});
});
module.factory('RoleApplicationComposites', function($resource) {
return $resource('/auth/rest/admin/realms/:realm/roles-by-id/:role/composites/applications/:application', {
realm : '@realm',
role : '@role',
application : "@application"
});
});
function roleControl($scope, realm, role, roles, applications,
ApplicationRole, RoleById, RoleRealmComposites, RoleApplicationComposites,
$http, $location, Notifications, Dialog) {
$scope.$watch(function () {
return $location.path();
}, function () {
$scope.path = $location.path().substring(1).split("/");
});
$scope.$watch('role', function () {
if (!angular.equals($scope.role, role)) {
$scope.changed = true;
}
}, true);
$scope.update = function () {
RoleById.update({
realm: realm.realm,
role: role.id
}, $scope.role, function () {
$scope.changed = false;
role = angular.copy($scope.role);
Notifications.success("Your changes have been saved to the role.");
});
};
$scope.reset = function () {
$scope.role = angular.copy(role);
$scope.changed = false;
};
if (!role.id) return;
$scope.compositeSwitch = role.composite;
$scope.compositeSwitchDisabled = role.composite;
$scope.realmRoles = angular.copy(roles);
$scope.selectedRealmRoles = [];
$scope.selectedRealmMappings = [];
$scope.realmMappings = [];
$scope.applications = applications;
$scope.applicationRoles = [];
$scope.selectedApplicationRoles = [];
$scope.selectedApplicationMappings = [];
$scope.applicationMappings = [];
console.log('remove self');
for (var j = 0; j < $scope.realmRoles.length; j++) {
if ($scope.realmRoles[j].id == role.id) {
var realmRole = $scope.realmRoles[j];
var idx = $scope.realmRoles.indexOf(realmRole);
$scope.realmRoles.splice(idx, 1);
break;
}
}
$scope.realmMappings = RoleRealmComposites.query({realm : realm.realm, role : role.id}, function(){
for (var i = 0; i < $scope.realmMappings.length; i++) {
var role = $scope.realmMappings[i];
for (var j = 0; j < $scope.realmRoles.length; j++) {
var realmRole = $scope.realmRoles[j];
if (realmRole.id == role.id) {
var idx = $scope.realmRoles.indexOf(realmRole);
if (idx != -1) {
$scope.realmRoles.splice(idx, 1);
break;
}
}
}
}
});
$scope.addRealmRole = function() {
$scope.compositeSwitchDisabled=true;
$http.post('/auth/rest/admin/realms/' + realm.realm + '/roles-by-id/' + role.id + '/composites',
$scope.selectedRealmRoles).success(function() {
for (var i = 0; i < $scope.selectedRealmRoles.length; i++) {
var role = $scope.selectedRealmRoles[i];
var idx = $scope.realmRoles.indexOf($scope.selectedRealmRoles[i]);
if (idx != -1) {
$scope.realmRoles.splice(idx, 1);
$scope.realmMappings.push(role);
}
}
$scope.selectRealmRoles = [];
});
};
$scope.deleteRealmRole = function() {
$scope.compositeSwitchDisabled=true;
$http.delete('/auth/rest/admin/realms/' + realm.realm + '/roles-by-id/' + role.id + '/composites',
{data : $scope.selectedRealmMappings, headers : {"content-type" : "application/json"}}).success(function() {
for (var i = 0; i < $scope.selectedRealmMappings.length; i++) {
var role = $scope.selectedRealmMappings[i];
var idx = $scope.realmMappings.indexOf($scope.selectedRealmMappings[i]);
if (idx != -1) {
$scope.realmMappings.splice(idx, 1);
$scope.realmRoles.push(role);
}
}
$scope.selectedRealmMappings = [];
});
};
$scope.addApplicationRole = function() {
$scope.compositeSwitchDisabled=true;
$http.post('/auth/rest/admin/realms/' + realm.realm + '/roles-by-id/' + role.id + '/composites',
$scope.selectedApplicationRoles).success(function() {
for (var i = 0; i < $scope.selectedApplicationRoles.length; i++) {
var role = $scope.selectedApplicationRoles[i];
var idx = $scope.applicationRoles.indexOf($scope.selectedApplicationRoles[i]);
if (idx != -1) {
$scope.applicationRoles.splice(idx, 1);
$scope.applicationMappings.push(role);
}
}
$scope.selectedApplicationRoles = [];
});
};
$scope.deleteApplicationRole = function() {
$scope.compositeSwitchDisabled=true;
$http.delete('/auth/rest/admin/realms/' + realm.realm + '/roles-by-id/' + role.id + '/composites',
{data : $scope.selectedApplicationMappings, headers : {"content-type" : "application/json"}}).success(function() {
for (var i = 0; i < $scope.selectedApplicationMappings.length; i++) {
var role = $scope.selectedApplicationMappings[i];
var idx = $scope.applicationMappings.indexOf($scope.selectedApplicationMappings[i]);
if (idx != -1) {
$scope.applicationMappings.splice(idx, 1);
$scope.applicationRoles.push(role);
}
}
$scope.selectedApplicationMappings = [];
});
};
$scope.changeApplication = function() {
$scope.applicationRoles = ApplicationRole.query({realm : realm.realm, application : $scope.compositeApp.name}, function() {
$scope.applicationMappings = RoleApplicationComposites.query({realm : realm.realm, role : role.id, application : $scope.compositeApp.name}, function(){
for (var i = 0; i < $scope.applicationMappings.length; i++) {
var role = $scope.applicationMappings[i];
for (var j = 0; j < $scope.applicationRoles.length; j++) {
var realmRole = $scope.applicationRoles[j];
if (realmRole.id == role.id) {
var idx = $scope.applicationRoles.indexOf(realmRole);
if (idx != -1) {
$scope.applicationRoles.splice(idx, 1);
break;
}
}
}
}
});
for (var j = 0; j < $scope.applicationRoles.length; j++) {
if ($scope.applicationRoles[j] == role.id) {
var appRole = $scope.applicationRoles[j];
var idx = $scope.applicationRoles.indexof(appRole);
$scope.applicationRoles.splice(idx, 1);
break;
}
}
}
);
};
}
module.factory('Role', function($resource) {
return $resource('/auth/rest/admin/realms/:realm/roles/:role', {
realm : '@realm',
role : '@role'
}, {
update : {
method : 'PUT'
}
});
});
module.factory('RoleById', function($resource) {
return $resource('/auth/rest/admin/realms/:realm/roles-by-id/:role', {
realm : '@realm',
role : '@role'
}, {
update : {
method : 'PUT'
}
});
});
module.factory('ApplicationRole', function($resource) {
return $resource('/auth/rest/admin/realms/:realm/applications/:application/roles/:role', {
realm : '@realm',
application : "@application",
role : '@role'
}, {
update : {
method : 'PUT'
}
});
});
module.factory('Application', function($resource) {
return $resource('/auth/rest/admin/realms/:realm/applications/:application', {
realm : '@realm',
application : '@application'
}, {
update : {
method : 'PUT'
}
});
});
module.factory('ApplicationInstallation', function($resource) {
var url = '/auth/rest/admin/realms/:realm/applications/:application/installation/json';
return {
url : function(parameters)
{
return url.replace(':realm', parameters.realm).replace(':application', parameters.application);
}
}
});
module.factory('ApplicationInstallationJBoss', function($resource) {
var url = '/auth/rest/admin/realms/:realm/applications/:application/installation/jboss';
return {
url : function(parameters)
{
return url.replace(':realm', parameters.realm).replace(':application', parameters.application);
}
}
});
module.factory('ApplicationCredentials', function($resource) {
return $resource('/auth/rest/admin/realms/:realm/applications/:application/client-secret', {
realm : '@realm',
application : '@application'
}, {
update : {
method : 'POST'
}
});
});
module.factory('ApplicationOrigins', function($resource) {
return $resource('/auth/rest/admin/realms/:realm/applications/:application/allowed-origins', {
realm : '@realm',
application : '@application'
}, {
update : {
method : 'PUT',
isArray : true
}
});
});
module.factory('OAuthClient', function($resource) {
return $resource('/auth/rest/admin/realms/:realm/oauth-clients/:id', {
realm : '@realm',
id : '@id'
}, {
update : {
method : 'PUT'
}
});
});
module.factory('OAuthClientCredentials', function($resource) {
return $resource('/auth/rest/admin/realms/:realm/oauth-clients/:oauth/client-secret', {
realm : '@realm',
oauth : '@oauth'
}, {
update : {
method : 'POST'
}
});
});
module.factory('OAuthClientRealmScopeMapping', function($resource) {
return $resource('/auth/rest/admin/realms/:realm/oauth-clients/:oauth/scope-mappings/realm', {
realm : '@realm',
oauth : '@oauth'
});
});
module.factory('OAuthClientApplicationScopeMapping', function($resource) {
return $resource('/auth/rest/admin/realms/:realm/oauth-clients/:oauth/scope-mappings/applications/:targetApp', {
realm : '@realm',
oauth : '@oauth',
targetApp : '@targetApp'
});
});
module.factory('OAuthClientInstallation', function($resource) {
var url = '/auth/rest/admin/realms/:realm/oauth-clients/:oauth/installation';
var resource = $resource('/auth/rest/admin/realms/:realm/oauth-clients/:oauth/installation', {
realm : '@realm',
oauth : '@oauth'
}, {
update : {
method : 'PUT'
}
});
resource.url = function(parameters) {
return url.replace(':realm', parameters.realm).replace(':oauth', parameters.oauth);
}
return resource;
});
module.factory('Current', function(Realm, $route) {
var current = {};
current.realms = {};
current.realm = null;
current.applications = {};
current.application = null;
current.refresh = function() {
current.realm = null;
current.realms = Realm.query(null, function(realms) {
if ($route.current.params.realm) {
for (var i = 0; i < realms.length; i++) {
if (realms[i].realm == $route.current.params.realm) {
current.realm = realms[i];
}
}
}
});
}
current.refresh();
return current;
});
module.factory('TimeUnit', function() {
var t = {};
t.autoUnit = function(time) {
var unit = 'Seconds';
if (time % 60 == 0) {
unit = 'Minutes';
time = time / 60;
}
if (time % 60 == 0) {
unit = 'Hours';
time = time / 60;
}
if (time % 24 == 0) {
unit = 'Days'
time = time / 24;
}
return unit;
}
t.toSeconds = function(time, unit) {
switch (unit) {
case 'Seconds': return time;
case 'Minutes': return time * 60;
case 'Hours': return time * 3600;
case 'Days': return time * 86400;
default: throw 'invalid unit ' + unit;
}
}
t.toUnit = function(time, unit) {
switch (unit) {
case 'Seconds': return time;
case 'Minutes': return Math.ceil(time / 60);
case 'Hours': return Math.ceil(time / 3600);
case 'Days': return Math.ceil(time / 86400);
default: throw 'invalid unit ' + unit;
}
}
t.convert = function(time, from, to) {
var seconds = t.toSeconds(time, from);
return t.toUnit(seconds, to);
}
return t;
});
module.factory('PasswordPolicy', function() {
var p = {};
p.policyMessages = {
length: "Minimal password length (integer type). Default value is 8.",
digits: "Minimal number (integer type) of digits in password. Default value is 1.",
lowerCase: "Minimal number (integer type) of lowercase characters in password. Default value is 1.",
upperCase: "Minimal number (integer type) of uppercase characters in password. Default value is 1.",
specialChars: "Minimal number (integer type) of special characters in password. Default value is 1."
}
p.allPolicies = [
{ name: 'length', value: 8 },
{ name: 'digits', value: 1 },
{ name: 'lowerCase', value: 1 },
{ name: 'upperCase', value: 1 },
{ name: 'specialChars', value: 1 }
];
p.parse = function(policyString) {
var policies = [];
if (!policyString || policyString.length == 0){
return policies;
}
var policyArray = policyString.split(" and ");
for (var i = 0; i < policyArray.length; i ++){
var policyToken = policyArray[i];
var re = /(\w+)\(*(\d*)\)*/;
var policyEntry = re.exec(policyToken);
policies.push({ name: policyEntry[1], value: parseInt(policyEntry[2]) });
}
return policies;
};
p.toString = function(policies) {
if (!policies || policies.length == 0) {
return null;
}
var policyString = "";
for (var i in policies){
policyString += policies[i].name;
if ( policies[i].value ){
policyString += '(' + policies[i].value + ')';
}
policyString += " and ";
}
policyString = policyString.substring(0, policyString.length - 5);
return policyString;
};
return p;
});
@@ -1,457 +0,0 @@
/**
* @license AngularJS v1.0.7
* (c) 2010-2012 Google, Inc. http://angularjs.org
* License: MIT
*/
(function(window, angular, undefined) {
'use strict';
/**
* @ngdoc overview
* @name ngResource
* @description
*/
/**
* @ngdoc object
* @name ngResource.$resource
* @requires $http
*
* @description
* A factory which creates a resource object that lets you interact with
* [RESTful](http://en.wikipedia.org/wiki/Representational_State_Transfer) server-side data sources.
*
* The returned resource object has action methods which provide high-level behaviors without
* the need to interact with the low level {@link ng.$http $http} service.
*
* # Installation
* To use $resource make sure you have included the `angular-resource.js` that comes in Angular
* package. You can also find this file on Google CDN, bower as well as at
* {@link http://code.angularjs.org/ code.angularjs.org}.
*
* Finally load the module in your application:
*
* angular.module('app', ['ngResource']);
*
* and you are ready to get started!
*
* @param {string} url A parameterized URL template with parameters prefixed by `:` as in
* `/user/:username`. If you are using a URL with a port number (e.g.
* `http://example.com:8080/api`), you'll need to escape the colon character before the port
* number, like this: `$resource('http://example.com\\:8080/api')`.
*
* @param {Object=} paramDefaults Default values for `url` parameters. These can be overridden in
* `actions` methods.
*
* Each key value in the parameter object is first bound to url template if present and then any
* excess keys are appended to the url search query after the `?`.
*
* Given a template `/path/:verb` and parameter `{verb:'greet', salutation:'Hello'}` results in
* URL `/path/greet?salutation=Hello`.
*
* If the parameter value is prefixed with `@` then the value of that parameter is extracted from
* the data object (useful for non-GET operations).
*
* @param {Object.<Object>=} actions Hash with declaration of custom action that should extend the
* default set of resource actions. The declaration should be created in the following format:
*
* {action1: {method:?, params:?, isArray:?},
* action2: {method:?, params:?, isArray:?},
* ...}
*
* Where:
*
* - `action` – {string} – The name of action. This name becomes the name of the method on your
* resource object.
* - `method` – {string} – HTTP request method. Valid methods are: `GET`, `POST`, `PUT`, `DELETE`,
* and `JSONP`
* - `params` – {object=} – Optional set of pre-bound parameters for this action.
* - isArray – {boolean=} – If true then the returned object for this action is an array, see
* `returns` section.
*
* @returns {Object} A resource "class" object with methods for the default set of resource actions
* optionally extended with custom `actions`. The default set contains these actions:
*
* { 'get': {method:'GET'},
* 'save': {method:'POST'},
* 'query': {method:'GET', isArray:true},
* 'remove': {method:'DELETE'},
* 'delete': {method:'DELETE'} };
*
* Calling these methods invoke an {@link ng.$http} with the specified http method,
* destination and parameters. When the data is returned from the server then the object is an
* instance of the resource class. The actions `save`, `remove` and `delete` are available on it
* as methods with the `$` prefix. This allows you to easily perform CRUD operations (create,
* read, update, delete) on server-side data like this:
* <pre>
var User = $resource('/user/:userId', {userId:'@id'});
var user = User.get({userId:123}, function() {
user.abc = true;
user.$save();
});
</pre>
*
* It is important to realize that invoking a $resource object method immediately returns an
* empty reference (object or array depending on `isArray`). Once the data is returned from the
* server the existing reference is populated with the actual data. This is a useful trick since
* usually the resource is assigned to a model which is then rendered by the view. Having an empty
* object results in no rendering, once the data arrives from the server then the object is
* populated with the data and the view automatically re-renders itself showing the new data. This
* means that in most case one never has to write a callback function for the action methods.
*
* The action methods on the class object or instance object can be invoked with the following
* parameters:
*
* - HTTP GET "class" actions: `Resource.action([parameters], [success], [error])`
* - non-GET "class" actions: `Resource.action([parameters], postData, [success], [error])`
* - non-GET instance actions: `instance.$action([parameters], [success], [error])`
*
*
* @example
*
* # Credit card resource
*
* <pre>
// Define CreditCard class
var CreditCard = $resource('/user/:userId/card/:cardId',
{userId:123, cardId:'@id'}, {
charge: {method:'POST', params:{charge:true}}
});
// We can retrieve a collection from the server
var cards = CreditCard.query(function() {
// GET: /user/123/card
// server returns: [ {id:456, number:'1234', name:'Smith'} ];
var card = cards[0];
// each item is an instance of CreditCard
expect(card instanceof CreditCard).toEqual(true);
card.name = "J. Smith";
// non GET methods are mapped onto the instances
card.$save();
// POST: /user/123/card/456 {id:456, number:'1234', name:'J. Smith'}
// server returns: {id:456, number:'1234', name: 'J. Smith'};
// our custom method is mapped as well.
card.$charge({amount:9.99});
// POST: /user/123/card/456?amount=9.99&charge=true {id:456, number:'1234', name:'J. Smith'}
});
// we can create an instance as well
var newCard = new CreditCard({number:'0123'});
newCard.name = "Mike Smith";
newCard.$save();
// POST: /user/123/card {number:'0123', name:'Mike Smith'}
// server returns: {id:789, number:'01234', name: 'Mike Smith'};
expect(newCard.id).toEqual(789);
* </pre>
*
* The object returned from this function execution is a resource "class" which has "static" method
* for each action in the definition.
*
* Calling these methods invoke `$http` on the `url` template with the given `method` and `params`.
* When the data is returned from the server then the object is an instance of the resource type and
* all of the non-GET methods are available with `$` prefix. This allows you to easily support CRUD
* operations (create, read, update, delete) on server-side data.
<pre>
var User = $resource('/user/:userId', {userId:'@id'});
var user = User.get({userId:123}, function() {
user.abc = true;
user.$save();
});
</pre>
*
* It's worth noting that the success callback for `get`, `query` and other method gets passed
* in the response that came from the server as well as $http header getter function, so one
* could rewrite the above example and get access to http headers as:
*
<pre>
var User = $resource('/user/:userId', {userId:'@id'});
User.get({userId:123}, function(u, getResponseHeaders){
u.abc = true;
u.$save(function(u, putResponseHeaders) {
//u => saved user object
//putResponseHeaders => $http header getter
});
});
</pre>
* # Buzz client
Let's look at what a buzz client created with the `$resource` service looks like:
<doc:example>
<doc:source jsfiddle="false">
<script>
function BuzzController($resource) {
this.userId = 'googlebuzz';
this.Activity = $resource(
'https://www.googleapis.com/buzz/v1/activities/:userId/:visibility/:activityId/:comments',
{alt:'json', callback:'JSON_CALLBACK'},
{get:{method:'JSONP', params:{visibility:'@self'}}, replies: {method:'JSONP', params:{visibility:'@self', comments:'@comments'}}}
);
}
BuzzController.prototype = {
fetch: function() {
this.activities = this.Activity.get({userId:this.userId});
},
expandReplies: function(activity) {
activity.replies = this.Activity.replies({userId:this.userId, activityId:activity.id});
}
};
BuzzController.$inject = ['$resource'];
</script>
<div ng-controller="BuzzController">
<input ng-model="userId"/>
<button ng-click="fetch()">fetch</button>
<hr/>
<div ng-repeat="item in activities.data.items">
<h1 style="font-size: 15px;">
<img src="{{item.actor.thumbnailUrl}}" style="max-height:30px;max-width:30px;"/>
<a href="{{item.actor.profileUrl}}">{{item.actor.name}}</a>
<a href ng-click="expandReplies(item)" style="float: right;">Expand replies: {{item.links.replies[0].count}}</a>
</h1>
{{item.object.content | html}}
<div ng-repeat="reply in item.replies.data.items" style="margin-left: 20px;">
<img src="{{reply.actor.thumbnailUrl}}" style="max-height:30px;max-width:30px;"/>
<a href="{{reply.actor.profileUrl}}">{{reply.actor.name}}</a>: {{reply.content | html}}
</div>
</div>
</div>
</doc:source>
<doc:scenario>
</doc:scenario>
</doc:example>
*/
angular.module('ngResource', ['ng']).
factory('$resource', ['$http', '$parse', function($http, $parse) {
var DEFAULT_ACTIONS = {
'get': {method:'GET'},
'save': {method:'POST'},
'query': {method:'GET', isArray:true},
'remove': {method:'DELETE'},
'delete': {method:'DELETE'}
};
var noop = angular.noop,
forEach = angular.forEach,
extend = angular.extend,
copy = angular.copy,
isFunction = angular.isFunction,
getter = function(obj, path) {
return $parse(path)(obj);
};
/**
* We need our custom method because encodeURIComponent is too aggressive and doesn't follow
* http://www.ietf.org/rfc/rfc3986.txt with regards to the character set (pchar) allowed in path
* segments:
* segment = *pchar
* pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
* pct-encoded = "%" HEXDIG HEXDIG
* unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
* sub-delims = "!" / "$" / "&" / "'" / "(" / ")"
* / "*" / "+" / "," / ";" / "="
*/
function encodeUriSegment(val) {
return encodeUriQuery(val, true).
replace(/%26/gi, '&').
replace(/%3D/gi, '=').
replace(/%2B/gi, '+');
}
/**
* This method is intended for encoding *key* or *value* parts of query component. We need a custom
* method becuase encodeURIComponent is too agressive and encodes stuff that doesn't have to be
* encoded per http://tools.ietf.org/html/rfc3986:
* query = *( pchar / "/" / "?" )
* pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
* unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
* pct-encoded = "%" HEXDIG HEXDIG
* sub-delims = "!" / "$" / "&" / "'" / "(" / ")"
* / "*" / "+" / "," / ";" / "="
*/
function encodeUriQuery(val, pctEncodeSpaces) {
return encodeURIComponent(val).
replace(/%40/gi, '@').
replace(/%3A/gi, ':').
replace(/%24/g, '$').
replace(/%2C/gi, ',').
replace(/%20/g, (pctEncodeSpaces ? '%20' : '+'));
}
function Route(template, defaults) {
this.template = template = template + '#';
this.defaults = defaults || {};
var urlParams = this.urlParams = {};
forEach(template.split(/\W/), function(param){
if (param && (new RegExp("(^|[^\\\\]):" + param + "\\W").test(template))) {
urlParams[param] = true;
}
});
this.template = template.replace(/\\:/g, ':');
}
Route.prototype = {
url: function(params) {
var self = this,
url = this.template,
val,
encodedVal;
params = params || {};
forEach(this.urlParams, function(_, urlParam){
val = params.hasOwnProperty(urlParam) ? params[urlParam] : self.defaults[urlParam];
if (angular.isDefined(val) && val !== null) {
encodedVal = encodeUriSegment(val);
url = url.replace(new RegExp(":" + urlParam + "(\\W)", "g"), encodedVal + "$1");
} else {
url = url.replace(new RegExp("(\/?):" + urlParam + "(\\W)", "g"), function(match,
leadingSlashes, tail) {
if (tail.charAt(0) == '/') {
return tail;
} else {
return leadingSlashes + tail;
}
});
}
});
url = url.replace(/\/?#$/, '');
var query = [];
forEach(params, function(value, key){
if (!self.urlParams[key]) {
query.push(encodeUriQuery(key) + '=' + encodeUriQuery(value));
}
});
query.sort();
url = url.replace(/\/*$/, '');
return url + (query.length ? '?' + query.join('&') : '');
}
};
function ResourceFactory(url, paramDefaults, actions) {
var route = new Route(url);
actions = extend({}, DEFAULT_ACTIONS, actions);
function extractParams(data, actionParams){
var ids = {};
actionParams = extend({}, paramDefaults, actionParams);
forEach(actionParams, function(value, key){
ids[key] = value.charAt && value.charAt(0) == '@' ? getter(data, value.substr(1)) : value;
});
return ids;
}
function Resource(value){
copy(value || {}, this);
}
forEach(actions, function(action, name) {
action.method = angular.uppercase(action.method);
var hasBody = action.method == 'POST' || action.method == 'PUT' || action.method == 'PATCH';
Resource[name] = function(a1, a2, a3, a4) {
var params = {};
var data;
var success = noop;
var error = null;
switch(arguments.length) {
case 4:
error = a4;
success = a3;
//fallthrough
case 3:
case 2:
if (isFunction(a2)) {
if (isFunction(a1)) {
success = a1;
error = a2;
break;
}
success = a2;
error = a3;
//fallthrough
} else {
params = a1;
data = a2;
success = a3;
break;
}
case 1:
if (isFunction(a1)) success = a1;
else if (hasBody) data = a1;
else params = a1;
break;
case 0: break;
default:
throw "Expected between 0-4 arguments [params, data, success, error], got " +
arguments.length + " arguments.";
}
var value = this instanceof Resource ? this : (action.isArray ? [] : new Resource(data));
$http({
method: action.method,
url: route.url(extend({}, extractParams(data, action.params || {}), params)),
data: data
}).then(function(response) {
var data = response.data;
if (data) {
if (action.isArray) {
value.length = 0;
forEach(data, function(item) {
value.push(new Resource(item));
});
} else {
copy(data, value);
}
}
(success||noop)(value, response.headers);
}, error);
return value;
};
Resource.prototype['$' + name] = function(a1, a2, a3) {
var params = extractParams(this),
success = noop,
error;
switch(arguments.length) {
case 3: params = a1; success = a2; error = a3; break;
case 2:
case 1:
if (isFunction(a1)) {
success = a1;
error = a2;
} else {
params = a1;
success = a2 || noop;
}
case 0: break;
default:
throw "Expected between 1-3 arguments [params, success, error], got " +
arguments.length + " arguments.";
}
var data = hasBody ? this : undefined;
Resource[name].call(this, params, data, success, error);
};
});
Resource.bind = function(additionalParamDefaults){
return ResourceFactory(url, extend({}, paramDefaults, additionalParamDefaults), actions);
};
return Resource;
}
return ResourceFactory;
}]);
})(window, window.angular);
@@ -1,537 +0,0 @@
/**
* @license AngularJS v1.0.7
* (c) 2010-2012 Google, Inc. http://angularjs.org
* License: MIT
*/
(function(window, angular, undefined) {
'use strict';
/**
* @ngdoc overview
* @name ngSanitize
* @description
*/
/*
* HTML Parser By Misko Hevery (misko@hevery.com)
* based on: HTML Parser By John Resig (ejohn.org)
* Original code by Erik Arvidsson, Mozilla Public License
* http://erik.eae.net/simplehtmlparser/simplehtmlparser.js
*
* // Use like so:
* htmlParser(htmlString, {
* start: function(tag, attrs, unary) {},
* end: function(tag) {},
* chars: function(text) {},
* comment: function(text) {}
* });
*
*/
/**
* @ngdoc service
* @name ngSanitize.$sanitize
* @function
*
* @description
* The input is sanitized by parsing the html into tokens. All safe tokens (from a whitelist) are
* then serialized back to properly escaped html string. This means that no unsafe input can make
* it into the returned string, however, since our parser is more strict than a typical browser
* parser, it's possible that some obscure input, which would be recognized as valid HTML by a
* browser, won't make it through the sanitizer.
*
* @param {string} html Html input.
* @returns {string} Sanitized html.
*
* @example
<doc:example module="ngSanitize">
<doc:source>
<script>
function Ctrl($scope) {
$scope.snippet =
'<p style="color:blue">an html\n' +
'<em onmouseover="this.textContent=\'PWN3D!\'">click here</em>\n' +
'snippet</p>';
}
</script>
<div ng-controller="Ctrl">
Snippet: <textarea ng-model="snippet" cols="60" rows="3"></textarea>
<table>
<tr>
<td>Filter</td>
<td>Source</td>
<td>Rendered</td>
</tr>
<tr id="html-filter">
<td>html filter</td>
<td>
<pre>&lt;div ng-bind-html="snippet"&gt;<br/>&lt;/div&gt;</pre>
</td>
<td>
<div ng-bind-html="snippet"></div>
</td>
</tr>
<tr id="escaped-html">
<td>no filter</td>
<td><pre>&lt;div ng-bind="snippet"&gt;<br/>&lt;/div&gt;</pre></td>
<td><div ng-bind="snippet"></div></td>
</tr>
<tr id="html-unsafe-filter">
<td>unsafe html filter</td>
<td><pre>&lt;div ng-bind-html-unsafe="snippet"&gt;<br/>&lt;/div&gt;</pre></td>
<td><div ng-bind-html-unsafe="snippet"></div></td>
</tr>
</table>
</div>
</doc:source>
<doc:scenario>
it('should sanitize the html snippet ', function() {
expect(using('#html-filter').element('div').html()).
toBe('<p>an html\n<em>click here</em>\nsnippet</p>');
});
it('should escape snippet without any filter', function() {
expect(using('#escaped-html').element('div').html()).
toBe("&lt;p style=\"color:blue\"&gt;an html\n" +
"&lt;em onmouseover=\"this.textContent='PWN3D!'\"&gt;click here&lt;/em&gt;\n" +
"snippet&lt;/p&gt;");
});
it('should inline raw snippet if filtered as unsafe', function() {
expect(using('#html-unsafe-filter').element("div").html()).
toBe("<p style=\"color:blue\">an html\n" +
"<em onmouseover=\"this.textContent='PWN3D!'\">click here</em>\n" +
"snippet</p>");
});
it('should update', function() {
input('snippet').enter('new <b>text</b>');
expect(using('#html-filter').binding('snippet')).toBe('new <b>text</b>');
expect(using('#escaped-html').element('div').html()).toBe("new &lt;b&gt;text&lt;/b&gt;");
expect(using('#html-unsafe-filter').binding("snippet")).toBe('new <b>text</b>');
});
</doc:scenario>
</doc:example>
*/
var $sanitize = function(html) {
var buf = [];
htmlParser(html, htmlSanitizeWriter(buf));
return buf.join('');
};
// Regular Expressions for parsing tags and attributes
var START_TAG_REGEXP = /^<\s*([\w:-]+)((?:\s+[\w:-]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)\s*>/,
END_TAG_REGEXP = /^<\s*\/\s*([\w:-]+)[^>]*>/,
ATTR_REGEXP = /([\w:-]+)(?:\s*=\s*(?:(?:"((?:[^"])*)")|(?:'((?:[^'])*)')|([^>\s]+)))?/g,
BEGIN_TAG_REGEXP = /^</,
BEGING_END_TAGE_REGEXP = /^<\s*\//,
COMMENT_REGEXP = /<!--(.*?)-->/g,
CDATA_REGEXP = /<!\[CDATA\[(.*?)]]>/g,
URI_REGEXP = /^((ftp|https?):\/\/|mailto:|#)/,
NON_ALPHANUMERIC_REGEXP = /([^\#-~| |!])/g; // Match everything outside of normal chars and " (quote character)
// Good source of info about elements and attributes
// http://dev.w3.org/html5/spec/Overview.html#semantics
// http://simon.html5.org/html-elements
// Safe Void Elements - HTML5
// http://dev.w3.org/html5/spec/Overview.html#void-elements
var voidElements = makeMap("area,br,col,hr,img,wbr");
// Elements that you can, intentionally, leave open (and which close themselves)
// http://dev.w3.org/html5/spec/Overview.html#optional-tags
var optionalEndTagBlockElements = makeMap("colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr"),
optionalEndTagInlineElements = makeMap("rp,rt"),
optionalEndTagElements = angular.extend({}, optionalEndTagInlineElements, optionalEndTagBlockElements);
// Safe Block Elements - HTML5
var blockElements = angular.extend({}, optionalEndTagBlockElements, makeMap("address,article,aside," +
"blockquote,caption,center,del,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5,h6," +
"header,hgroup,hr,ins,map,menu,nav,ol,pre,script,section,table,ul"));
// Inline Elements - HTML5
var inlineElements = angular.extend({}, optionalEndTagInlineElements, makeMap("a,abbr,acronym,b,bdi,bdo," +
"big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,q,ruby,rp,rt,s,samp,small," +
"span,strike,strong,sub,sup,time,tt,u,var"));
// Special Elements (can contain anything)
var specialElements = makeMap("script,style");
var validElements = angular.extend({}, voidElements, blockElements, inlineElements, optionalEndTagElements);
//Attributes that have href and hence need to be sanitized
var uriAttrs = makeMap("background,cite,href,longdesc,src,usemap");
var validAttrs = angular.extend({}, uriAttrs, makeMap(
'abbr,align,alt,axis,bgcolor,border,cellpadding,cellspacing,class,clear,'+
'color,cols,colspan,compact,coords,dir,face,headers,height,hreflang,hspace,'+
'ismap,lang,language,nohref,nowrap,rel,rev,rows,rowspan,rules,'+
'scope,scrolling,shape,span,start,summary,target,title,type,'+
'valign,value,vspace,width'));
function makeMap(str) {
var obj = {}, items = str.split(','), i;
for (i = 0; i < items.length; i++) obj[items[i]] = true;
return obj;
}
/**
* @example
* htmlParser(htmlString, {
* start: function(tag, attrs, unary) {},
* end: function(tag) {},
* chars: function(text) {},
* comment: function(text) {}
* });
*
* @param {string} html string
* @param {object} handler
*/
function htmlParser( html, handler ) {
var index, chars, match, stack = [], last = html;
stack.last = function() { return stack[ stack.length - 1 ]; };
while ( html ) {
chars = true;
// Make sure we're not in a script or style element
if ( !stack.last() || !specialElements[ stack.last() ] ) {
// Comment
if ( html.indexOf("<!--") === 0 ) {
index = html.indexOf("-->");
if ( index >= 0 ) {
if (handler.comment) handler.comment( html.substring( 4, index ) );
html = html.substring( index + 3 );
chars = false;
}
// end tag
} else if ( BEGING_END_TAGE_REGEXP.test(html) ) {
match = html.match( END_TAG_REGEXP );
if ( match ) {
html = html.substring( match[0].length );
match[0].replace( END_TAG_REGEXP, parseEndTag );
chars = false;
}
// start tag
} else if ( BEGIN_TAG_REGEXP.test(html) ) {
match = html.match( START_TAG_REGEXP );
if ( match ) {
html = html.substring( match[0].length );
match[0].replace( START_TAG_REGEXP, parseStartTag );
chars = false;
}
}
if ( chars ) {
index = html.indexOf("<");
var text = index < 0 ? html : html.substring( 0, index );
html = index < 0 ? "" : html.substring( index );
if (handler.chars) handler.chars( decodeEntities(text) );
}
} else {
html = html.replace(new RegExp("(.*)<\\s*\\/\\s*" + stack.last() + "[^>]*>", 'i'), function(all, text){
text = text.
replace(COMMENT_REGEXP, "$1").
replace(CDATA_REGEXP, "$1");
if (handler.chars) handler.chars( decodeEntities(text) );
return "";
});
parseEndTag( "", stack.last() );
}
if ( html == last ) {
throw "Parse Error: " + html;
}
last = html;
}
// Clean up any remaining tags
parseEndTag();
function parseStartTag( tag, tagName, rest, unary ) {
tagName = angular.lowercase(tagName);
if ( blockElements[ tagName ] ) {
while ( stack.last() && inlineElements[ stack.last() ] ) {
parseEndTag( "", stack.last() );
}
}
if ( optionalEndTagElements[ tagName ] && stack.last() == tagName ) {
parseEndTag( "", tagName );
}
unary = voidElements[ tagName ] || !!unary;
if ( !unary )
stack.push( tagName );
var attrs = {};
rest.replace(ATTR_REGEXP, function(match, name, doubleQuotedValue, singleQoutedValue, unqoutedValue) {
var value = doubleQuotedValue
|| singleQoutedValue
|| unqoutedValue
|| '';
attrs[name] = decodeEntities(value);
});
if (handler.start) handler.start( tagName, attrs, unary );
}
function parseEndTag( tag, tagName ) {
var pos = 0, i;
tagName = angular.lowercase(tagName);
if ( tagName )
// Find the closest opened tag of the same type
for ( pos = stack.length - 1; pos >= 0; pos-- )
if ( stack[ pos ] == tagName )
break;
if ( pos >= 0 ) {
// Close all the open elements, up the stack
for ( i = stack.length - 1; i >= pos; i-- )
if (handler.end) handler.end( stack[ i ] );
// Remove the open elements from the stack
stack.length = pos;
}
}
}
/**
* decodes all entities into regular string
* @param value
* @returns {string} A string with decoded entities.
*/
var hiddenPre=document.createElement("pre");
function decodeEntities(value) {
hiddenPre.innerHTML=value.replace(/</g,"&lt;");
return hiddenPre.innerText || hiddenPre.textContent || '';
}
/**
* Escapes all potentially dangerous characters, so that the
* resulting string can be safely inserted into attribute or
* element text.
* @param value
* @returns escaped text
*/
function encodeEntities(value) {
return value.
replace(/&/g, '&amp;').
replace(NON_ALPHANUMERIC_REGEXP, function(value){
return '&#' + value.charCodeAt(0) + ';';
}).
replace(/</g, '&lt;').
replace(/>/g, '&gt;');
}
/**
* create an HTML/XML writer which writes to buffer
* @param {Array} buf use buf.jain('') to get out sanitized html string
* @returns {object} in the form of {
* start: function(tag, attrs, unary) {},
* end: function(tag) {},
* chars: function(text) {},
* comment: function(text) {}
* }
*/
function htmlSanitizeWriter(buf){
var ignore = false;
var out = angular.bind(buf, buf.push);
return {
start: function(tag, attrs, unary){
tag = angular.lowercase(tag);
if (!ignore && specialElements[tag]) {
ignore = tag;
}
if (!ignore && validElements[tag] == true) {
out('<');
out(tag);
angular.forEach(attrs, function(value, key){
var lkey=angular.lowercase(key);
if (validAttrs[lkey]==true && (uriAttrs[lkey]!==true || value.match(URI_REGEXP))) {
out(' ');
out(key);
out('="');
out(encodeEntities(value));
out('"');
}
});
out(unary ? '/>' : '>');
}
},
end: function(tag){
tag = angular.lowercase(tag);
if (!ignore && validElements[tag] == true) {
out('</');
out(tag);
out('>');
}
if (tag == ignore) {
ignore = false;
}
},
chars: function(chars){
if (!ignore) {
out(encodeEntities(chars));
}
}
};
}
// define ngSanitize module and register $sanitize service
angular.module('ngSanitize', []).value('$sanitize', $sanitize);
/**
* @ngdoc directive
* @name ngSanitize.directive:ngBindHtml
*
* @description
* Creates a binding that will sanitize the result of evaluating the `expression` with the
* {@link ngSanitize.$sanitize $sanitize} service and innerHTML the result into the current element.
*
* See {@link ngSanitize.$sanitize $sanitize} docs for examples.
*
* @element ANY
* @param {expression} ngBindHtml {@link guide/expression Expression} to evaluate.
*/
angular.module('ngSanitize').directive('ngBindHtml', ['$sanitize', function($sanitize) {
return function(scope, element, attr) {
element.addClass('ng-binding').data('$binding', attr.ngBindHtml);
scope.$watch(attr.ngBindHtml, function ngBindHtmlWatchAction(value) {
value = $sanitize(value);
element.html(value || '');
});
};
}]);
/**
* @ngdoc filter
* @name ngSanitize.filter:linky
* @function
*
* @description
* Finds links in text input and turns them into html links. Supports http/https/ftp/mailto and
* plain email address links.
*
* @param {string} text Input text.
* @returns {string} Html-linkified text.
*
* @usage
<span ng-bind-html="linky_expression | linky"></span>
*
* @example
<doc:example module="ngSanitize">
<doc:source>
<script>
function Ctrl($scope) {
$scope.snippet =
'Pretty text with some links:\n'+
'http://angularjs.org/,\n'+
'mailto:us@somewhere.org,\n'+
'another@somewhere.org,\n'+
'and one more: ftp://127.0.0.1/.';
}
</script>
<div ng-controller="Ctrl">
Snippet: <textarea ng-model="snippet" cols="60" rows="3"></textarea>
<table>
<tr>
<td>Filter</td>
<td>Source</td>
<td>Rendered</td>
</tr>
<tr id="linky-filter">
<td>linky filter</td>
<td>
<pre>&lt;div ng-bind-html="snippet | linky"&gt;<br>&lt;/div&gt;</pre>
</td>
<td>
<div ng-bind-html="snippet | linky"></div>
</td>
</tr>
<tr id="escaped-html">
<td>no filter</td>
<td><pre>&lt;div ng-bind="snippet"&gt;<br>&lt;/div&gt;</pre></td>
<td><div ng-bind="snippet"></div></td>
</tr>
</table>
</doc:source>
<doc:scenario>
it('should linkify the snippet with urls', function() {
expect(using('#linky-filter').binding('snippet | linky')).
toBe('Pretty text with some links:&#10;' +
'<a href="http://angularjs.org/">http://angularjs.org/</a>,&#10;' +
'<a href="mailto:us@somewhere.org">us@somewhere.org</a>,&#10;' +
'<a href="mailto:another@somewhere.org">another@somewhere.org</a>,&#10;' +
'and one more: <a href="ftp://127.0.0.1/">ftp://127.0.0.1/</a>.');
});
it ('should not linkify snippet without the linky filter', function() {
expect(using('#escaped-html').binding('snippet')).
toBe("Pretty text with some links:\n" +
"http://angularjs.org/,\n" +
"mailto:us@somewhere.org,\n" +
"another@somewhere.org,\n" +
"and one more: ftp://127.0.0.1/.");
});
it('should update', function() {
input('snippet').enter('new http://link.');
expect(using('#linky-filter').binding('snippet | linky')).
toBe('new <a href="http://link">http://link</a>.');
expect(using('#escaped-html').binding('snippet')).toBe('new http://link.');
});
</doc:scenario>
</doc:example>
*/
angular.module('ngSanitize').filter('linky', function() {
var LINKY_URL_REGEXP = /((ftp|https?):\/\/|(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s\.\;\,\(\)\{\}\<\>]/,
MAILTO_REGEXP = /^mailto:/;
return function(text) {
if (!text) return text;
var match;
var raw = text;
var html = [];
// TODO(vojta): use $sanitize instead
var writer = htmlSanitizeWriter(html);
var url;
var i;
while ((match = raw.match(LINKY_URL_REGEXP))) {
// We can not end in these as they are sometimes found at the end of the sentence
url = match[0];
// if we did not match ftp/http/mailto then assume mailto
if (match[2] == match[3]) url = 'mailto:' + url;
i = match.index;
writer.chars(raw.substr(0, i));
writer.start('a', {href:url});
writer.chars(match[0].replace(MAILTO_REGEXP, ''));
writer.end('a');
raw = raw.substring(i + match[0].length);
}
writer.chars(raw);
return html.join('');
};
});
})(window, window.angular);
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
@@ -1,195 +0,0 @@
/**
* Enhanced Select2 Dropmenus
*
* @AJAX Mode - When in this mode, your value will be an object (or array of objects) of the data used by Select2
* This change is so that you do not have to do an additional query yourself on top of Select2's own query
* @params [options] {object} The configuration options passed to $.fn.select2(). Refer to the documentation
*/
angular.module('ui.select2', []).value('uiSelect2Config', {}).directive('uiSelect2', ['uiSelect2Config', '$timeout', function (uiSelect2Config, $timeout) {
var options = {};
if (uiSelect2Config) {
angular.extend(options, uiSelect2Config);
}
return {
require: 'ngModel',
compile: function (tElm, tAttrs) {
var watch,
repeatOption,
repeatAttr,
isSelect = tElm.is('select'),
isMultiple = (tAttrs.multiple !== undefined);
// Enable watching of the options dataset if in use
if (tElm.is('select')) {
repeatOption = tElm.find('option[ng-repeat], option[data-ng-repeat]');
if (repeatOption.length) {
repeatAttr = repeatOption.attr('ng-repeat') || repeatOption.attr('data-ng-repeat');
watch = jQuery.trim(repeatAttr.split('|')[0]).split(' ').pop();
}
}
return function (scope, elm, attrs, controller) {
// instance-specific options
var opts = angular.extend({}, options, scope.$eval(attrs.uiSelect2));
/*
Convert from Select2 view-model to Angular view-model.
*/
var convertToAngularModel = function(select2_data) {
var model;
if (opts.simple_tags) {
model = []
angular.forEach(select2_data, function(value, index) {
model.push(value.id)
})
} else {
model = select2_data
}
return model
}
/*
Convert from Angular view-model to Select2 view-model.
*/
var convertToSelect2Model = function(angular_data) {
var model = []
if (!angular_data) {
return model;
}
if (opts.simple_tags) {
model = [];
angular.forEach(
angular_data,
function(value, index) {
model.push({'id': value, 'text': value});
})
} else {
model = angular_data;
}
return model
}
if (isSelect) {
// Use <select multiple> instead
delete opts.multiple;
delete opts.initSelection;
} else if (isMultiple) {
opts.multiple = true;
}
if (controller) {
// Watch the model for programmatic changes
scope.$watch(tAttrs.ngModel, function(current, old) {
if (!current) {
return
}
if (current == old) {
return
}
controller.$render()
}, true)
controller.$render = function () {
if (isSelect) {
elm.select2('val', controller.$viewValue);
} else {
if (opts.multiple) {
elm.select2(
'data', convertToSelect2Model(controller.$viewValue));
} else {
if (angular.isObject(controller.$viewValue)) {
elm.select2('data', controller.$viewValue);
} else if (!controller.$viewValue) {
elm.select2('data', null);
} else {
elm.select2('val', controller.$viewValue);
}
}
}
};
// Watch the options dataset for changes
if (watch) {
scope.$watch(watch, function (newVal, oldVal, scope) {
if (!newVal) return;
// Delayed so that the options have time to be rendered
$timeout(function () {
elm.select2('val', controller.$viewValue);
// Refresh angular to remove the superfluous option
elm.trigger('change');
});
});
}
// Update valid and dirty statuses
controller.$parsers.push(function (value) {
var div = elm.prev()
div
.toggleClass('ng-invalid', !controller.$valid)
.toggleClass('ng-valid', controller.$valid)
.toggleClass('ng-invalid-required', !controller.$valid)
.toggleClass('ng-valid-required', controller.$valid)
.toggleClass('ng-dirty', controller.$dirty)
.toggleClass('ng-pristine', controller.$pristine);
return value;
});
if (!isSelect) {
// Set the view and model value and update the angular template manually for the ajax/multiple select2.
elm.bind("change", function () {
if (scope.$$phase) return;
scope.$apply(function () {
controller.$setViewValue(
convertToAngularModel(elm.select2('data')));
});
});
if (opts.initSelection) {
var initSelection = opts.initSelection;
opts.initSelection = function (element, callback) {
initSelection(element, function (value) {
controller.$setViewValue(convertToAngularModel(value));
callback(value);
});
};
}
}
}
elm.bind("$destroy", function() {
elm.select2("destroy");
});
attrs.$observe('disabled', function (value) {
elm.select2('enable', !value);
});
attrs.$observe('readonly', function (value) {
elm.select2('readonly', !!value);
});
if (attrs.ngMultiple) {
scope.$watch(attrs.ngMultiple, function(newVal) {
elm.select2(opts);
});
}
// Initialize the plugin late so that the injected DOM does not disrupt the template compiler
$timeout(function () {
elm.select2(opts);
// Set initial value - I'm not sure about this but it seems to need to be there
elm.val(controller.$viewValue);
// important!
controller.$render();
// Not sure if I should just check for !isSelect OR if I should check for 'tags' key
if (!opts.initSelection && !isSelect)
controller.$setViewValue(
convertToAngularModel(elm.select2('data')));
});
};
}
};
}]);
@@ -1,185 +0,0 @@
/*
* jQuery Idle Timeout 1.1
* Copyright (c) 2011 Eric Hynds
*
* http://www.erichynds.com/jquery/a-new-and-improved-jquery-idle-timeout-plugin/
*
* Depends:
* - jQuery 1.4.2+
* - jQuery Idle Timer (by Paul Irish, http://paulirish.com/2009/jquery-idletimer-plugin/)
*
* Dual licensed under the MIT and GPL licenses:
* http://www.opensource.org/licenses/mit-license.php
* http://www.gnu.org/licenses/gpl.html
*
*/
(function($, win){
var idleTimeout = {
init: function( element, resume, options ){
var self = this, elem;
this.warning = elem = $(element);
this.resume = $(resume);
this.options = options;
this.countdownOpen = false;
this.failedRequests = options.failedRequests;
this._startTimer();
// expose obj to data cache so peeps can call internal methods
$.data( elem[0], 'idletimout', this );
// start the idle timer
$.idleTimer(options.idleAfter * 1000);
// once the user becomes idle
$(document).bind("idle.idleTimer", function(){
// if the user is idle and a countdown isn't already running
if( $.data(document, 'idleTimer') === 'idle' && !self.countdownOpen ){
self._stopTimer();
self.countdownOpen = true;
self._idle();
}
});
// bind continue link
this.resume.bind("click", function(e){
e.preventDefault();
win.clearInterval(self.countdown); // stop the countdown
self.countdownOpen = false; // stop countdown
self._startTimer(); // start up the timer again
self._keepAlive( false ); // ping server
options.onResume.call( self.warning ); // call the resume callback
});
},
_idle: function(){
var self = this,
options = this.options,
warning = this.warning[0],
counter = options.warningLength;
// fire the onIdle function
options.onIdle.call(warning);
// set inital value in the countdown placeholder
options.onCountdown.call(warning, counter);
// create a timer that runs every second
this.countdown = win.setInterval(function(){
if(--counter === 0){
window.clearInterval(self.countdown);
options.onTimeout.call(warning);
} else {
options.onCountdown.call(warning, counter);
}
}, 1000);
},
_startTimer: function(){
var self = this;
if (this.options.pollingInterval > 0) {
this.timer = win.setTimeout(function () {
self._keepAlive();
}, this.options.pollingInterval * 1000);
}
},
_stopTimer: function(){
// reset the failed requests counter
this.failedRequests = this.options.failedRequests;
win.clearTimeout(this.timer);
},
_keepAlive: function( recurse ){
var self = this,
options = this.options;
if( typeof recurse === "undefined" ){
recurse = true;
}
// if too many requests failed, abort
if( !this.failedRequests ){
console.log('aborting...');
this._stopTimer();
options.onAbort.call( this.warning[0] );
return;
}
$.ajax({
timeout: options.AJAXTimeout,
url: options.keepAliveURL,
error: function(){
console.log('failure for keepalive');
self.failedRequests--;
},
success: function(response){
console.log('success for keepalive');
/* if($.trim(response) !== options.serverResponseEquals){
self.failedRequests--;
}*/
},
complete: function(){
if( recurse ){
self._startTimer();
}
}
});
}
};
// expose
$.idleTimeout = function(element, resume, options){
idleTimeout.init( element, resume, $.extend($.idleTimeout.options, options) );
return this;
};
// options
$.idleTimeout.options = {
// number of seconds after user is idle to show the warning
warningLength: 30,
// url to call to keep the session alive while the user is active
keepAliveURL: "",
// the response from keepAliveURL must equal this text:
serverResponseEquals: "OK",
// user is considered idle after this many seconds. 10 minutes default
idleAfter: 600,
// a polling request will be sent to the server every X seconds
pollingInterval: 60,
// number of failed polling requests until we abort this script
failedRequests: 5,
// the $.ajax timeout in MILLISECONDS!
AJAXTimeout: 250,
/*
Callbacks
"this" refers to the element found by the first selector passed to $.idleTimeout.
*/
// callback to fire when the session times out
onTimeout: $.noop,
// fires when the user becomes idle
onIdle: $.noop,
// fires during each second of warningLength
onCountdown: $.noop,
// fires when the user resumes the session
onResume: $.noop,
// callback to fire when the script is aborted due to too many failed requests
onAbort: $.noop
};
})(jQuery, window);
@@ -1,116 +0,0 @@
(function($){
$.idleTimer = function f(newTimeout){
//$.idleTimer.tId = -1 //timeout ID
var idle = false, //indicates if the user is idle
enabled = true, //indicates if the idle timer is enabled
timeout = 30000, //the amount of time (ms) before the user is considered idle
events = 'mousemove keydown DOMMouseScroll mousewheel mousedown', // activity is one of these events
//f.olddate = undefined, // olddate used for getElapsedTime. stored on the function
/* (intentionally not documented)
* Toggles the idle state and fires an appropriate event.
* @return {void}
*/
toggleIdleState = function(){
//toggle the state
idle = !idle;
// reset timeout counter
f.olddate = +new Date;
//fire appropriate event
$(document).trigger( $.data(document,'idleTimer', idle ? "idle" : "active" ) + '.idleTimer');
},
/**
* Stops the idle timer. This removes appropriate event handlers
* and cancels any pending timeouts.
* @return {void}
* @method stop
* @static
*/
stop = function(){
//set to disabled
enabled = false;
//clear any pending timeouts
clearTimeout($.idleTimer.tId);
//detach the event handlers
$(document).unbind('.idleTimer');
},
/* (intentionally not documented)
* Handles a user event indicating that the user isn't idle.
* @param {Event} event A DOM2-normalized event object.
* @return {void}
*/
handleUserEvent = function(){
//clear any existing timeout
clearTimeout($.idleTimer.tId);
//if the idle timer is enabled
if (enabled){
//if it's idle, that means the user is no longer idle
if (idle){
toggleIdleState();
}
//set a new timeout
$.idleTimer.tId = setTimeout(toggleIdleState, timeout);
}
};
/**
* Starts the idle timer. This adds appropriate event handlers
* and starts the first timeout.
* @param {int} newTimeout (Optional) A new value for the timeout period in ms.
* @return {void}
* @method $.idleTimer
* @static
*/
f.olddate = f.olddate || +new Date;
//assign a new timeout if necessary
if (typeof newTimeout == "number"){
timeout = newTimeout;
} else if (newTimeout === 'destroy') {
stop();
return this;
} else if (newTimeout === 'getElapsedTime'){
return (+new Date) - f.olddate;
}
//assign appropriate event handlers
$(document).bind($.trim((events+' ').split(' ').join('.idleTimer ')),handleUserEvent);
//set a timeout to toggle state
$.idleTimer.tId = setTimeout(toggleIdleState, timeout);
// assume the user is active for the first x seconds.
$.data(document,'idleTimer',"active");
}; // end of $.idleTimer()
})(jQuery);
@@ -1,36 +0,0 @@
<div class="bs-sidebar col-md-3 clearfix" data-ng-include data-src="'partials/realm-menu.html'"></div>
<div id="content-area" class="col-md-9" role="main">
<ul class="nav nav-tabs nav-tabs-pf" data-ng-show="!create">
<li><a href="#/realms/{{realm.realm}}/applications/{{application.name}}">Settings</a></li>
<li class="active"><a href="#/realms/{{realm.realm}}/applications/{{application.name}}/credentials">Credentials</a></li>
<li><a href="#/realms/{{realm.realm}}/applications/{{application.name}}/installation">Installation</a></li>
<li><a href="#/realms/{{realm.realm}}/applications/{{application.name}}/roles">Roles</a></li>
<li><a href="#/realms/{{realm.realm}}/applications/{{application.name}}/scope-mappings">Scope</a></li>
<li><a href="#/realms/{{realm.realm}}/applications/{{application.name}}/sessions">Sessions</a></li>
</ul>
<div id="content">
<ol class="breadcrumb" data-ng-hide="create">
<li><a href="#/realms/{{realm.realm}}">{{realm.realm}}</a></li>
<li><a href="#/realms/{{realm.realm}}/applications">Applications</a></li>
<li><a href="#/realms/{{realm.realm}}/applications/{{application.name}}">{{application.name}}</a></li>
<li class="active">Credentials</li>
</ol>
<h2 data-ng-hide="create"><span>{{application.name}}</span> Credentials</h2>
<form class="form-horizontal" name="credentialForm" novalidate>
<fieldset >
<legend><span class="text">Client Secret</span></legend>
<div class="form-group">
<label class="col-sm-2 control-label" for="secret">Secret</label>
<div class="col-sm-4">
<input ng-disabled="true" class="form-control" type="text" id="secret" name="secret" data-ng-model="secret" autofocus
required>
</div>
</div>
</fieldset>
<div class="pull-right form-actions">
<button type="submit" data-ng-click="changePassword()" class="btn btn-primary btn-lg">Regenerate Secret
</button>
</div>
</form>
</div>
</div>
@@ -1,122 +0,0 @@
<div class="bs-sidebar col-md-3 clearfix" data-ng-include data-src="'partials/realm-menu.html'"></div>
<div id="content-area" class="col-md-9" role="main">
<ul class="nav nav-tabs nav-tabs-pf" data-ng-show="!create">
<li class="active"><a href="#/realms/{{realm.realm}}/applications/{{application.name}}">Settings</a></li>
<li><a href="#/realms/{{realm.realm}}/applications/{{application.name}}/credentials">Credentials</a></li>
<li><a href="#/realms/{{realm.realm}}/applications/{{application.name}}/installation">Installation</a></li>
<li><a href="#/realms/{{realm.realm}}/applications/{{application.name}}/roles">Roles</a></li>
<li><a href="#/realms/{{realm.realm}}/applications/{{application.name}}/scope-mappings">Scope</a></li>
<li><a href="#/realms/{{realm.realm}}/applications/{{application.name}}/sessions">Sessions</a></li>
</ul>
<div id="content">
<ol class="breadcrumb" data-ng-show="create">
<li><a href="#/realms/{{realm.realm}}">{{realm.realm}}</a></li>
<li><a href="#/realms/{{realm.realm}}/applications">Applications</a></li>
<li class="active">Add Application</li>
</ol>
<h2 data-ng-show="create"><span>{{realm.realm}}</span> Add Application</h2>
<p class="subtitle" data-ng-show="create"><span class="required">*</span> Required fields</p>
<ol class="breadcrumb" data-ng-hide="create">
<li><a href="#/realms/{{realm.realm}}">{{realm.realm}}</a></li>
<li><a href="#/realms/{{realm.realm}}/applications">Applications</a></li>
<li><a href="#/realms/{{realm.realm}}/applications/{{application.name}}">{{application.name}}</a></li>
<li class="active">Settings</li>
</ol>
<h2 data-ng-hide="create"><span>{{application.name}}</span> Settings</h2>
<form class="form-horizontal" name="applicationForm" novalidate>
<fieldset class="border-top">
<div class="form-group">
<label class="col-sm-2 control-label" for="name">Name <span class="required" data-ng-show="create">*</span></label>
<div class="col-sm-4">
<input class="form-control" type="text" id="name" name="name" data-ng-model="application.name" autofocus required>
</div>
</div>
<div class="form-group clearfix block">
<label class="col-sm-2 control-label" for="enabled">Enabled</label>
<div class="col-sm-4">
<input ng-model="application.enabled" name="enabled" id="enabled" onoffswitch />
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label" for="baseUrl">Base URL</label>
<div class="col-sm-4">
<input class="form-control" type="text" name="baseUrl" id="baseUrl"
data-ng-model="application.baseUrl">
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label" for="adminUrl">Admin URL</label>
<div class="col-sm-4">
<input class="form-control" type="text" name="adminUrl" id="adminUrl"
data-ng-model="application.adminUrl">
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label" for="newWebOrigin">Web Origin</label>
<div class="col-sm-4">
<div ng-repeat="webOrigin in application.webOrigins" class="row kc-item-deletable">
<div class="col-sm-9">
<input class="form-control kc-button-control"
type="text" data-ng-class="{'input-below':!$first}"
name="webOrigin" id="webOrigin"
data-ng-model="webOrigin" readonly/>
</div>
<div class="col-sm-2">
<button class="btn btn-danger"
type="button" data-ng-click="deleteWebOrigin($index)">Delete</button>
</div>
</div>
<div class="row">
<div class="col-sm-9">
<input class="form-control kc-button-control"
type="text" name="newWebOrigin" id="newWebOrigin"
placeholder="New Web Origin..." data-ng-model="newWebOrigin"
data-ng-class="{'input-below':application.webOrigins.length}"/>
</div>
<div class="col-sm-2">
<button class="btn btn-primary"
data-ng-click="addWebOrigin()" ng-show="newWebOrigin.length > 0">Add</button>
</div>
</div>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label" for="newRedirectUri">Redirect URI</label>
<div class="col-sm-4">
<div ng-repeat="redirectUri in application.redirectUris" class="row kc-item-deletable">
<div class="col-sm-9">
<input class="form-control" type="text" data-ng-class="{'input-below':!$first}"
name="redirectUri" id="redirectUri" data-ng-model="redirectUri" readonly />
</div>
<div class="col-sm-2">
<button class="btn btn-danger" type="button" data-ng-click="deleteRedirectUri($index)">
Delete</button>
</div>
</div>
<div class="row">
<div class="col-sm-9">
<input class="form-control" type="text" name="newRedirectUri" id="newRedirectUri"
placeholder="New Redirect URI..." data-ng-model="newRedirectUri"
data-ng-class="{'input-below':application.redirectUris.length}" />
</div>
<div class="col-sm-2">
<button class="btn btn-primary" data-ng-click="addRedirectUri()" ng-show="newRedirectUri.length > 0">Add</button>
</div>
</div>
</div>
</div>
</fieldset>
<div class="pull-right form-actions" data-ng-show="create">
<button kc-cancel data-ng-click="cancel()">Cancel</button>
<button kc-save data-ng-show="changed">Save</button>
</div>
<div class="pull-right form-actions" data-ng-show="!create">
<button kc-reset data-ng-show="changed">Clear changes</button>
<button kc-save data-ng-show="changed">Save</button>
<button kc-delete data-ng-click="remove()" data-ng-hide="changed">Delete</button>
</div>
</form>
</div>
</div>
@@ -1,100 +0,0 @@
<div class="bs-sidebar col-md-3 clearfix" data-ng-include data-src="'partials/realm-menu.html'"></div>
<div id="content-area" class="col-md-9" role="main">
<ul class="nav nav-tabs nav-tabs-pf" data-ng-show="!create">
<li><a href="#/realms/{{realm.realm}}/applications/{{application.name}}">Settings</a></li>
<li><a href="#/realms/{{realm.realm}}/applications/{{application.name}}/credentials">Credentials</a></li>
<li><a href="#">Installation</a></li>
<li><a href="#/realms/{{realm.realm}}/applications/{{application.name}}/roles">Roles</a></li>
<li class="active"><a href="#/realms/{{realm.realm}}/applications/{{application.name}}/scope-mappings">Scope</a></li>
<li><a href="#/realms/{{realm.realm}}/applications/{{application.name}}/sessions">Sessions</a></li>
</ul>
<div id="content">
<ol class="breadcrumb" data-ng-hide="create">
<li><a href="#/realms/{{realm.realm}}">{{realm.realm}}</a></li>
<li><a href="#/realms/{{realm.realm}}/applications">Applications</a></li>
<li><a href="#/realms/{{realm.realm}}/applications/{{application.name}}">{{application.name}}</a></li>
<li class="active">Scope</li>
</ol>
<h2><span>{{application.name}}</span> Scope Mappings</h2>
<p class="subtitle"></p>
<form class="form-horizontal" name="realmForm" novalidate>
<fieldset>
<legend><span class="text">Realm Roles</span></legend>
<div class="form-group col-sm-10">
<div class="controls changing-selectors">
<div class="select-title">
<label class="control-label" for="available">Available Roles</label>
<select id="available" class="form-control" multiple size="5"
ng-multiple="true"
ng-model="selectedRealmRoles"
ng-options="r.name for r in realmRoles">
</select>
</div>
<div class="middle-buttons kc-vertical">
<button class="kc-button" type="submit" ng-click="addRealmRole()" tooltip="Move right" tooltip-placement="right">
<span class="kc-icon-arrow-right">Move right</span>
</button>
<button class="kc-button" type="submit" ng-click="deleteRealmRole()" tooltip="Move left" tooltip-placement="right">
<span class="kc-icon-arrow-left">Move left</span>
</button>
</div>
<div class="select-title">
<label class="control-label" for="assigned">Assigned Roles</label>
<select id="assigned" class="form-control" multiple size=5
ng-multiple="true"
ng-model="selectedRealmMappings"
ng-options="r.name for r in realmMappings">
</select>
</div>
</div>
</div>
</fieldset>
<fieldset ng-show="applications.length > 0">
<legend><span class="text">Application Roles</span> </legend>
<div class="form-group input-select">
<label class="col-sm-2 control-label" for="applications">Application</label>
<div class="col-sm-4">
<div class="input-group">
<div class="select-kc">
<select id="applications" name="applications" ng-change="changeApplication()" ng-model="targetApp" ng-options="a.name for a in (applications|remove:application:'id')">
<option value="" selected> Select an Application </option>
</select>
</div>
</div>
</div>
</div>
<div class="form-group" ng-show="targetApp">
<div class="controls changing-selectors col-sm-10">
<div class="select-title">
<label class="control-label" for="app-available">Available Roles</label>
<select id="app-available" class="form-control" multiple size="5"
ng-multiple="true"
ng-model="selectedApplicationRoles"
ng-options="r.name for r in applicationRoles">
</select>
</div>
<div class="middle-buttons kc-vertical">
<button class="kc-button" type="submit" ng-click="addApplicationRole()" tooltip="Move right" tooltip-placement="right">
<span class="kc-icon-arrow-right">Move right</span>
</button>
<button class="kc-button" type="submit" ng-click="deleteApplicationRole()" tooltip="Move left" tooltip-placement="right">
<span class="kc-icon-arrow-left">Move left</span>
</button>
</div>
<div class="select-title">
<label class="control-label" for="app-assigned">Assigned Roles</label>
<select id="app-assigned" class="form-control" multiple size=5
ng-multiple="true"
ng-model="selectedApplicationMappings"
ng-options="r.name for r in applicationMappings">
</select>
</div>
</div>
</div>
</fieldset>
</form>
</div>
</div>
@@ -1,22 +0,0 @@
<div class="bs-sidebar col-md-3 clearfix" data-ng-include data-src="'partials/realm-menu.html'"></div>
<div id="content-area" class="col-md-9" role="main">
<ul class="nav nav-tabs nav-tabs-pf" data-ng-show="!create">
<li><a href="#/realms/{{realm.realm}}/applications/{{application.name}}">Settings</a></li>
<li><a href="#/realms/{{realm.realm}}/applications/{{application.name}}/credentials">Credentials</a></li>
<li><a href="#/realms/{{realm.realm}}/applications/{{application.name}}/installation">Installation</a></li>
<li><a href="#/realms/{{realm.realm}}/applications/{{application.name}}/roles">Roles</a></li>
<li><a href="#/realms/{{realm.realm}}/applications/{{application.name}}/scope-mappings">Scope</a></li>
<li class="active"><a href="#/realms/{{realm.realm}}/applications/{{application.name}}/sessions">Sessions</a></li>
</ul>
<div id="content">
<ol class="breadcrumb" data-ng-hide="create">
<li><a href="#/realms/{{realm.realm}}">{{realm.realm}}</a></li>
<li><a href="#/realms/{{realm.realm}}/applications">Applications</a></li>
<li><a href="#/realms/{{realm.realm}}/applications/{{application.name}}">{{application.name}}</a></li>
<li class="active">Sessions</li>
</ol>
<h2 data-ng-hide="create"><span>{{application.name}}</span> Sessions (Placeholder Page)</h2>
</div>
</div>
@@ -1,48 +0,0 @@
<nav id="kc-navigation" class="navbar" role="navigation">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse-1">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<h1 class="navbar-title"></h1>
</div>
<div class="collapse navbar-collapse navbar-collapse-1">
<ul class="nav navbar-nav navbar-utility" data-ng-show="auth.loggedIn">
<li class="dropdown">
<a data-toggle="dropdown" class="dropdown-toggle" href="#">
<span class="pficon pficon-user"></span>
{{auth.user.displayName}}<b class="caret"></b>
</a>
<ul class="dropdown-menu">
<li><a href="/auth/rest/realms/keycloak-admin/account?referrer=admin-console">Manage Account</a></li>
<li class="separator"><a href="/auth/rest/admin/logout">Sign Out</a></li>
</ul>
</li>
</ul>
<ul class="nav navbar-nav navbar-primary persistent-secondary" data-ng-controller="RealmDropdownCtrl">
<li class="dropdown context" data-ng-show="showNav()">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
{{current.realm.realm}}
<b class="caret"></b>
</a>
<ul class="dropdown-menu">
<li data-ng-repeat="realm in current.realms">
<a href="" ng-click="changeRealm(realm.realm)">{{realm.realm}}</a>
</li>
</ul>
</li>
<li class="active pull-right" data-ng-show="auth.loggedIn">
<a class="button primary" href="#/create/realm" data-ng-class="path[0] == 'create' && path[1] == 'realm' && 'active'"
data-ng-show="auth.loggedIn">Add Realm</a>
</li>
</ul>
</div>
</nav>
<!-- TODO remove once this page is properly styled -->
<style type="text/css">
.icon-spinner6 {
cursor: pointer;
}
</style>
@@ -1,104 +0,0 @@
<div class="bs-sidebar col-md-3 clearfix" data-ng-include data-src="'partials/realm-menu.html'"></div>
<div id="content-area" class="col-md-9" role="main">
<ul class="nav nav-tabs nav-tabs-pf" data-ng-show="!create">
<li class="active"><a href="#/realms/{{realm.realm}}/oauth-clients/{{oauth.id}}">Settings</a></li>
<li><a href="#/realms/{{realm.realm}}/oauth-clients/{{oauth.id}}/credentials">Credentials</a></li>
<li><a href="#/realms/{{realm.realm}}/oauth-clients/{{oauth.id}}/scope-mappings">Scope</a></li>
<li><a href="#/realms/{{realm.realm}}/oauth-clients/{{oauth.id}}/installation">Installation</a></li>
</ul>
<div id="content">
<ol class="breadcrumb" data-ng-show="create">
<li><a href="#/realms/{{realm.realm}}">{{realm.realm}}</a></li>
<li><a href="#/realms/{{realm.realm}}/oauth-clients">OAuth Clients</a></li>
<li class="active">Add OAuth Client</li>
</ol>
<h2 data-ng-show="create"><span>{{realm.realm}}</span> Add OAuth Client</h2>
<p class="subtitle" data-ng-show="create"><span class="required">*</span> Required fields</p>
<ol class="breadcrumb" data-ng-hide="create">
<li><a href="#/realms/{{realm.realm}}">{{realm.realm}}</a></li>
<li><a href="#/realms/{{realm.realm}}/oauth-clients">OAuth Clients</a></li>
<li><a href="#/realms/{{realm.realm}}/oauth-clients/{{oauth.id}}">{{oauth.name}}</a></li>
<li class="active">Settings</li>
</ol>
<h2 data-ng-hide="create"><span>{{oauth.name}}</span> Settings</h2>
<form class="form-horizontal" name="oauthForm" novalidate>
<fieldset class="border-top">
<div class="form-group">
<label class="col-sm-2 control-label" for="name">Name <span class="required" data-ng-show="create">*</span></label>
<div class="col-sm-4">
<input class="form-control" type="text" id="name" name="name" data-ng-model="oauth.name" autofocus
required>
</div>
</div>
<div class="form-group clearfix block">
<label class="col-sm-2 control-label" for="enabled">Enabled</label>
<div class="col-sm-4">
<input ng-model="oauth.enabled" name="enabled" id="enabled" onoffswitch />
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label" for="newWebOrigin">Web Origin</label>
<div class="col-sm-4">
<div ng-repeat="webOrigin in oauth.webOrigins" class="kc-item-deletable row">
<div class="col-sm-9">
<input class="form-control" type="text" data-ng-class="{'input-below':!$first}"
name="webOrigin" id="webOrigin" data-ng-model="webOrigin" readonly />
</div>
<div class="col-sm-2">
<button class="btn btn-danger" type="button" data-ng-click="deleteWebOrigin($index)">
Delete</button>
</div>
</div>
<div class="row">
<div class="col-sm-9">
<input class="form-control" type="text" name="newWebOrigin" id="newWebOrigin"
placeholder="New Web Origin..." data-ng-model="newWebOrigin"
data-ng-class="{'input-below':oauth.webOrigins.length}" />
</div>
<div class="col-sm-2">
<button class="btn btn-primary" data-ng-click="addWebOrigin()" ng-show="newWebOrigin.length > 0">Add</button>
</div>
</div>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label" for="newRedirectUri">Redirect URI</label>
<div class="col-sm-4">
<div ng-repeat="redirectUri in oauth.redirectUris" class="kc-item-deletable row">
<div class="col-sm-9">
<input class="form-control" type="text" data-ng-class="{'input-below':!$first}"
name="redirectUri" id="redirectUri" data-ng-model="redirectUri" readonly />
</div>
<div class="col-sm-2">
<button class="btn btn-danger" type="button" data-ng-click="deleteRedirectUri($index)">
Delete</button>
</div>
</div>
<div class="row">
<div class="col-sm-9">
<input class="form-control" type="text" name="newRedirectUri" id="newRedirectUri"
placeholder="New Redirect URI..." data-ng-model="newRedirectUri"
data-ng-class="{'input-below':oauth.redirectUris.length}" />
</div>
<div class="col-sm-2">
<button class="btn btn-primary" data-ng-click="addRedirectUri()" ng-show="newRedirectUri.length > 0">Add</button>
</div>
</div>
</div>
</div>
</fieldset>
<div class="pull-right form-actions" data-ng-show="create">
<button kc-cancel data-ng-click="cancel()">Cancel</button>
<button kc-save data-ng-show="changed">Save</button>
</div>
<div class="pull-right form-actions" data-ng-show="!create">
<button kc-reset data-ng-show="changed">Clear changes</button>
<button kc-save data-ng-show="changed">Save</button>
<button kc-delete data-ng-click="remove()" data-ng-hide="changed">Delete</button>
</div>
</form>
</div>
</div>
@@ -1,26 +0,0 @@
<div class="bs-sidebar col-sm-3" data-ng-include data-src="'partials/realm-menu.html'"></div>
<div id="content-area" class="col-md-9" role="main">
<ul class="nav nav-tabs nav-tabs-pf" data-ng-show="!create">
<li><a href="#/realms/{{realm.realm}}/oauth-clients/{{oauth.id}}">Settings</a></li>
<li><a href="#/realms/{{realm.realm}}/oauth-clients/{{oauth.id}}/credentials">Credentials</a></li>
<li><a href="#/realms/{{realm.realm}}/oauth-clients/{{oauth.id}}/scope-mappings">Scope</a></li>
<li class="active"><a href="#/realms/{{realm.realm}}/oauth-clients/{{oauth.id}}/installation">Installation</a></li>
</ul>
<div id="content">
<h2>OAuth Client Installation</h2>
<form class="form-horizontal" name="realmForm" novalidate>
<fieldset>
<div class="form-group">
<div class="col-sm-12">
<textarea class="form-control" rows="20" kc-select-action="click">{{installation | json}}</textarea>
</div>
</div>
</fieldset>
</form>
<div class="pull-right form-actions">
<a class="btn btn-primary btn-lg" href="{{download}}" download="keycloak.json" type="submit">Download</a>
</div>
</div>
</div>
@@ -1,98 +0,0 @@
<div class="bs-sidebar col-md-3 clearfix" data-ng-include data-src="'partials/realm-menu.html'"></div>
<div id="content-area" class="col-md-9" role="main">
<ul class="nav nav-tabs nav-tabs-pf" data-ng-show="!create">
<li><a href="#/realms/{{realm.realm}}/oauth-clients/{{oauth.id}}">Settings</a></li>
<li><a href="#/realms/{{realm.realm}}/oauth-clients/{{oauth.id}}/credentials">Credentials</a></li>
<li class="active"><a href="#/realms/{{realm.realm}}/oauth-clients/{{oauth.id}}/scope-mappings">Scope</a></li>
<li><a href="#/realms/{{realm.realm}}/oauth-clients/{{oauth.id}}/installation">Installation</a></li>
</ul>
<div id="content">
<ol class="breadcrumb" data-ng-hide="create">
<li><a href="#/realms/{{realm.realm}}">{{realm.realm}}</a></li>
<li><a href="#/realms/{{realm.realm}}/oauth-clients">OAuth Clients</a></li>
<li><a href="#/realms/{{realm.realm}}/oauth-clients/{{oauth.id}}">{{oauth.name}}</a></li>
<li class="active">Scope</li>
</ol>
<h2><span>{{oauth.name}}</span> Scope Mappings</h2>
<p class="subtitle"></p>
<form class="form-horizontal" name="realmForm" novalidate>
<fieldset>
<legend><span class="text">Realm Roles</span></legend>
<div class="form-group col-sm-10">
<div class="controls changing-selectors">
<div class="select-title">
<label class="control-label" for="available">Available Roles</label>
<select id="available" class="form-control" multiple size="5"
ng-multiple="true"
ng-model="selectedRealmRoles"
ng-options="r.name for r in realmRoles">
</select>
</div>
<div class="middle-buttons kc-vertical">
<button class="kc-button" type="submit" ng-click="addRealmRole()" tooltip="Move right" tooltip-placement="right">
<span class="kc-icon-arrow-right">Move right</span>
</button>
<button class="kc-button" type="submit" ng-click="deleteRealmRole()" tooltip="Move left" tooltip-placement="right">
<span class="kc-icon-arrow-left">Move left</span>
</button>
</div>
<div class="select-title">
<label class="control-label" for="assigned">Assigned Roles</label>
<select id="assigned" class="form-control" multiple size=5
ng-multiple="true"
ng-model="selectedRealmMappings"
ng-options="r.name for r in realmMappings">
</select>
</div>
</div>
</div>
</fieldset>
<fieldset ng-show="applications.length > 0">
<legend><span class="text">Application Roles</span> </legend>
<div class="form-group input-select">
<label class="col-sm-2 control-label" for="applications">Application</label>
<div class="col-sm-4">
<div class="input-group">
<div class="select-kc">
<select id="applications" name="applications" ng-change="changeApplication()" ng-model="targetApp" ng-options="a.name for a in (applications)">
<option value="" selected> Select an Application </option>
</select>
</div>
</div>
</div>
</div>
<div class="form-group" data-ng-show="targetApp">
<div class="controls changing-selectors col-sm-10">
<div class="select-title">
<label class="control-label" for="app-available">Available Roles</label>
<select id="app-available" class="form-control" multiple size="5"
ng-multiple="true"
ng-model="selectedApplicationRoles"
ng-options="r.name for r in applicationRoles">
</select>
</div>
<div class="middle-buttons kc-vertical">
<button class="kc-button" type="submit" ng-click="addApplicationRole()" tooltip="Move right" tooltip-placement="right">
<span class="kc-icon-arrow-right">Move right</span>
</button>
<button class="kc-button" type="submit" ng-click="deleteApplicationRole()" tooltip="Move left" tooltip-placement="right">
<span class="kc-icon-arrow-left">Move left</span>
</button>
</div>
<div class="select-title">
<label class="control-label" for="app-assigned">Assigned Roles</label>
<select id="app-assigned" class="form-control" multiple size=5
ng-multiple="true"
ng-model="selectedApplicationMappings"
ng-options="r.name for r in applicationMappings">
</select>
</div>
</div>
</div>
</fieldset>
</form>
</div>
</div>
@@ -1,104 +0,0 @@
<div class="bs-sidebar col-sm-3 " data-ng-include data-src="'partials/realm-menu.html'"></div>
<div id="content-area" class="col-sm-9" role="main">
<kc-navigation data-kc-current="general" data-kc-realm="realm.realm" data-kc-social="social"></kc-navigation>
<div id="content">
<ol class="breadcrumb" data-ng-hide="createRealm">
<li><a href="#/realms/{{realm.realm}}">{{realm.realm}}</a></li>
<li><a href="#/realms/{{realm.realm}}">Settings</a></li>
<li class="active">General</li>
</ol>
<h2 class="pull-left" data-ng-show="createRealm">Add Realm</h2>
<h2 data-ng-hide="createRealm"><span>{{realm.realm}}</span> General Settings</h2>
<p class="subtitle" data-ng-show="createRealm"><span class="required">*</span> Required fields</p>
<form class="form-horizontal" name="realmForm" novalidate>
<fieldset>
<legend class="aj-collapse open"><span class="text">Required Settings</span></legend>
<div class="form-group">
<label class="col-sm-2 control-label" for="name">Name <span class="required" data-ng-show="createRealm">*</span></label>
<div class="col-sm-4">
<input class="form-control" type="text" id="name" name="name" data-ng-model="realm.realm" autofocus required>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label" for="enabled">Enabled</label>
<div class="col-sm-4">
<input ng-model="realm.enabled" name="enabled" id="enabled" onoffswitch />
</div>
</div>
</fieldset>
<fieldset>
<legend><span class="text">Login Options</span></legend>
<div class="form-group">
<label class="col-sm-2 control-label" for="social">Social login</label>
<div class="col-sm-4">
<input ng-model="realm.social" name="social" id="social" onoffswitch />
</div>
</div>
<div class="form-group" data-ng-show="realm.social">
<label class="col-sm-2 control-label" for="updateProfileOnInitialSocialLogin">Update profile on first social login</label>
<div class="col-sm-4">
<input ng-model="realm.updateProfileOnInitialSocialLogin" name="updateProfileOnInitialSocialLogin" id="updateProfileOnInitialSocialLogin" onoffswitch />
</div>
</div>
<div class="form-group">
<label for="registrationAllowed" class="col-sm-2 control-label">User registration</label>
<div class="col-sm-4">
<input ng-model="realm.registrationAllowed" name="registrationAllowed" id="registrationAllowed" onoffswitch />
</div>
</div>
<div class="form-group">
<label for="resetPasswordAllowed" class="col-sm-2 control-label">Reset password</label>
<div class="col-sm-4">
<input ng-model="realm.resetPasswordAllowed" name="resetPasswordAllowed" id="resetPasswordAllowed" onoffswitch />
</div>
</div>
<div class="form-group">
<label for="verifyEmail" class="col-sm-2 control-label">Verify email</label>
<div class="col-sm-4">
<input ng-model="realm.verifyEmail" name="verifyEmail" id="verifyEmail" onoffswitch />
</div>
</div>
<div class="form-group">
<label for="requireSsl" class="col-sm-2 control-label">Require SSL</label>
<div class="col-sm-4">
<input ng-model="realm.requireSsl" name="requireSsl" id="requireSsl" onoffswitch />
</div>
</div>
</fieldset>
<fieldset>
<legend><span class="text">Optional Settings</span></legend>
<div class="form-group">
<label class="col-sm-2 control-label" for="loginTheme">Login Theme</label>
<div class="col-sm-4">
<select kc-select id="loginTheme"
data-kc-placeholder="Select one..."
data-kc-model="realm.loginTheme"
data-kc-options="serverInfo.themes.login">
</select>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label" for="accountTheme">Account Theme</label>
<div class="col-sm-4">
<select kc-select id="accountTheme"
data-kc-placeholder="Select one..."
data-kc-model="realm.accountTheme"
data-kc-options="serverInfo.themes.account">
</select>
</div>
</div>
</fieldset>
<div class="pull-right form-actions" data-ng-show="createRealm">
<button kc-cancel data-ng-click="cancel()">Cancel</button>
<button kc-save data-ng-show="changed">Save</button>
</div>
<div class="pull-right form-actions" data-ng-show="!createRealm">
<button kc-reset data-ng-show="changed">Clear changes</button>
<button kc-save data-ng-show="changed">Save</button>
<button kc-delete data-ng-click="remove()" data-ng-hide="changed">Delete</button>
</div>
</form>
</div>
</div>
@@ -1,116 +0,0 @@
<h2 class="pull-left" data-ng-show="createRealm">Add Realm</h2>
<h2 data-ng-hide="createRealm"><span>{{realm.realm}}</span> General Settings</h2>
<p class="subtitle" data-ng-show="createRealm"><span class="required">*</span> Required fields</p>
<form class="form-horizontal" name="realmForm" novalidate>
<fieldset>
<legend uncollapsed class="aj-collapse open"><span class="text">Required Settings</span></legend>
<div class="form-group">
<label class="col-sm-2 control-label" for="name">Name <span class="required" data-ng-show="createRealm">*</span></label>
<div class="col-sm-4">
<input class="form-control" type="text" id="name" name="name" data-ng-model="realm.realm" autofocus required>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label control-label" for="enabled">Enabled</label>
<div class="col-sm-4">
<input ng-model="realm.enabled" name="enabled" id="enabled" onoffswitch />
</div>
</div>
</fieldset>
<fieldset>
<legend uncollapsed><span class="text">Login Options</span></legend>
<div class="form-group clearfix block">
<label for="social" class="col-sm-2 control-label">Social login</label>
<div class="col-sm-4">
<input ng-model="realm.social" name="social" id="social" onoffswitch />
</div>
</div>
<div class="form-group clearfix block" data-ng-show="realm.social">
<label for="updateProfileOnInitialSocialLogin" class="col-sm-2 control-label">Update profile on first social login</label>
<div class="col-sm-4">
<input ng-model="realm.updateProfileOnInitialSocialLogin" name="updateProfileOnInitialSocialLogin" id="updateProfileOnInitialSocialLogin" onoffswitch />
</div>
</div>
<div class="form-group clearfix block">
<label for="registrationAllowed" class="col-sm-2 control-label">User registration</label>
<div class="col-sm-4">
<input ng-model="realm.registrationAllowed" name="registrationAllowed" id="registrationAllowed" onoffswitch />
</div>
</div>
<div class="form-group clearfix block">
<label for="resetPasswordAllowed" class="col-sm-2 control-label">Reset password</label>
<div class="col-sm-4">
<input ng-model="realm.resetPasswordAllowed" name="resetPasswordAllowed" id="resetPasswordAllowed" onoffswitch />
</div>
</div>
<div class="form-group clearfix block">
<label for="verifyEmail" class="col-sm-2 control-label">Verify email</label>
<div class="col-sm-4">
<input ng-model="realm.verifyEmail" name="verifyEmail" id="verifyEmail" onoffswitch />
</div>
</div>
<div class="form-group clearfix block">
<label for="requireSsl" class="col-sm-2 control-label">Require SSL</label>
<div class="col-sm-4">
<input ng-model="realm.requireSsl" name="requireSsl" id="requireSsl" onoffswitch />
</div>
</div>
</fieldset>
<fieldset>
<legend uncollapsed><span class="text">Optional Settings</span></legend>
<div class="form-group row">
<label class="col-sm-2 control-label" for="loginTheme">Login Theme</label>
<!--<select id="loginTheme" name="loginTheme" ng-model="realm.loginTheme" ng-options="t for t in serverInfo.themes.login"></select>-->
<div class="col-sm-4">
<div class="dropdown">
<button class="btn btn-default dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown">
{{realm.loginTheme}}
<span class="caret"></span>
</button>
<ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenu1">
<li role="presentation" data-ng-repeat="t in serverInfo.themes.login">
<a role="menuitem" tabindex="-1" href="" data-ng-click="realm.loginTheme = t">{{t}}</a>
</li>
</ul>
</div>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label" for="accountTheme">Account Theme</label>
<!--<select id="accountTheme" name="accountTheme" ng-model="realm.accountTheme" ng-options="t for t in serverInfo.themes.account"></select>-->
<div class="col-sm-4">
<div class="dropdown">
<button class="btn btn-default dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown">
{{realm.accountTheme}}
<span class="caret"></span>
</button>
<ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenu1">
<li role="presentation" data-ng-repeat="t in serverInfo.themes.account">
<a role="menuitem" tabindex="-1" href="" data-ng-click="realm.accountTheme = t">{{t}}</a>
</li>
</ul>
</div>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label" for="accountTheme2">Account Theme2</label>
<!--<select id="accountTheme" name="accountTheme" ng-model="realm.accountTheme" ng-options="t for t in serverInfo.themes.account"></select>-->
<div class="col-sm-4">
<kc-select data-kc-model="realm.accountTheme" data-kc-options="serverInfo.themes.account"/>
</div>
</div>
</fieldset>
<div class="pull-right form-actions" data-ng-show="createRealm">
<button kc-cancel data-ng-click="cancel()">Cancel</button>
<button kc-save data-ng-show="changed">Save</button>
</div>
<div class="pull-right form-actions" data-ng-show="!createRealm">
<button kc-reset data-ng-show="changed">Clear changes</button>
<button kc-save data-ng-show="changed">Save</button>
<button kc-delete data-ng-click="remove()" data-ng-hide="changed">Delete</button>
</div>
</form>
</div>
@@ -1,27 +0,0 @@
<div class="bs-sidebar col-sm-3 " data-ng-include data-src="'partials/realm-menu.html'"></div>
<div id="content-area" class="col-sm-9" role="main">
<data-kc-navigation data-kc-current="keys" data-kc-realm="realm.realm" data-kc-social="realm.social"></data-kc-navigation>
<div id="content">
<ol class="breadcrumb">
<li><a href="#/realms/{{realm.realm}}">{{realm.realm}}</a></li>
<li><a href="#/realms/{{realm.realm}}">Settings</a></li>
<li class="active">Keys</li>
</ol>
<h2><span>{{realm.realm}}</span> Keys</h2>
<form class="form-horizontal" name="realmForm" novalidate>
<fieldset class="border-top">
<div class="form-group">
<label class="col-sm-2 control-label" for="publicKey">Public key</label>
<div class="col-sm-10">
<textarea type="text" id="publicKey" name="publicKey" class="form-control" rows="5"
kc-select-action="click" readonly>{{realm.publicKey}}</textarea>
</div>
</div>
</fieldset>
<div class="pull-right form-actions">
<button class="btn btn-primary btn-lg" type="submit" data-ng-click="generate()">Generate new keys</button>
</div>
</form>
</div>
</div>
@@ -1,34 +0,0 @@
<div id="wrapper" class="container">
<div class="row">
<div class="bs-sidebar col-md-3 clearfix">
<ul data-ng-hide="createRealm">
<li class="active"><a href="#/realms">Realms</a></li>
</ul>
</div>
<div id="content-area" class="col-md-9" role="main">
<div class="top-nav" data-ng-hide="createRealm">
<ul class="rcue-tabs">
</ul>
</div>
<div id="content">
<h1>
<span class="gray">Realms</span>
</h1>
<table class="table table-striped table-bordered">
<thead>
<tr>
<th>Realm</th>
</tr>
</thead>
<tr data-ng-repeat="r in realms">
<td><a href="#/realms/{{r.realm}}">{{r.realm}}</a></td>
</tr>
</table>
</div>
</div>
<div id="container-right-bg"></div>
</div>
</div>
@@ -1,10 +0,0 @@
<ul data-ng-hide="createRealm">
<li data-ng-class="((!path[2] || path[1] == 'role' || path[2] == 'roles' || path[2] == 'token-settings' ||
path[2] == 'social-settings' || path[2] == 'required-credentials' || path[2] == 'default-roles' || path[2] == 'registration-settings' ||
path[2] == 'keys-settings' || path[2] == 'smtp-settings') && path[3] != 'applications') && 'active'"><a href="#/realms/{{realm.realm}}">Settings</a></li>
<li data-ng-class="(path[2] == 'users' || path[1] == 'user') && 'active'"><a href="#/realms/{{realm.realm}}/users">Users</a>
</li>
<li data-ng-class="(path[2] == 'applications' || path[1] == 'application' || path[3] == 'applications') && 'active'"><a href="#/realms/{{realm.realm}}/applications">Applications</a></li>
<li data-ng-class="(path[2] == 'oauth-clients' || path[1] == 'oauth-client') && 'active'"><a href="#/realms/{{realm.realm}}/oauth-clients">OAuth Clients</a></li>
</ul>
@@ -1,103 +0,0 @@
<div class="bs-sidebar col-sm-3 " data-ng-include data-src="'partials/realm-menu.html'"></div>
<div id="content-area" class="col-sm-9" role="main">
<data-kc-navigation data-kc-current="social" data-kc-realm="realm.realm" data-kc-social="realm.social"></data-kc-navigation>
<div id="content">
<ol class="breadcrumb">
<li><a href="#/realms/{{realm.realm}}">{{realm.realm}}</a></li>
<li><a href="#/realms/{{realm.realm}}">Settings</a></li>
<li class="active">Social</li>
</ol>
<h2><span>{{realm.realm}}</span> Social Providers Settings</h2>
<div class="alert alert-info alert-dismissable">
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">
<span class="pficon pficon-close"></span>
</button>
<span class="pficon pficon-info"></span>
<strong>Social Callback URL:</strong> {{callbackUrl}}</p>
</div>
<form name="realmForm" novalidate>
<fieldset>
<div>
<table class="table">
<caption class="hidden">Table of social providers</caption>
<thead>
<tr>
<th colspan="5" class="kc-table-actions">
<div class="pull-right">
<div class="select-kc">
<select ng-model="newProviderId"
ng-options="(p|capitalize) for p in (allProviders|remove:configuredProviders)"
data-ng-change="addProvider(newProviderId); newProviderId = null">
<option value="" disabled selected>Add provider...</option>
</select>
</div>
</div>
</th>
</tr>
<tr ng-show="configuredProviders.length > 0">
<th>Provider</th>
<th>Key <span class="required">*</span></th>
<th>Secret <span class="required">*</span></th>
<th colspan="1">Actions</th>
</tr>
</thead>
<tbody ng-show="configuredProviders.length > 0">
<tr ng-repeat="pId in configuredProviders">
<td>
<div class="clearfix">
<input class="form-control input-small disabled" type="text" value="{{pId|capitalize}}" readonly>
</div>
</td>
<td>
<input class="form-control" type="text" placeholder="Key" ng-model="realm.socialProviders[pId+'.key']"
ng-class="{'dirty': postSaveProviders.indexOf(pId) > -1}" required>
</td>
<td>
<input class="form-control" type="text" placeholder="Secret" ng-model="realm.socialProviders[pId+'.secret']"
ng-class="{'dirty': postSaveProviders.indexOf(pId) > -1}" required>
</td>
<td>
<div class="action-div"><i class="pficon pficon-delete" ng-click="removeProvider(pId)"></i></div>
</td>
</tr>
</tbody>
</table>
</div>
</fieldset>
<div class="pull-right form-actions">
<button type="submit" kc-reset data-ng-show="changed">Clear changes</button>
<button type="submit" kc-save class="primary" data-ng-show="changed">Save changes</button>
</div>
</form>
</div>
</div>
</div>
<!-- TODO remove once this page is properly styled -->
<style type="text/css">
.social-provider input.ng-invalid.dirty,
.social-provider input.ng-invalid.ng-dirty {
background-color: #FFEEEE;
}
.social-provider .actions > div {
display: inline-block;
overflow: hidden;
}
.social-provider td {
font-size: 10px;
}
.social-provider .action-div {
display: inline-block;
margin: 5px;
}
.social-provider .icon-remove, .social-provider .icon-question {
cursor: pointer;
}
</style>
@@ -1,76 +0,0 @@
<div class="bs-sidebar col-sm-3 " data-ng-include data-src="'partials/realm-menu.html'"></div>
<div id="content-area" class="col-sm-9" role="main">
<data-kc-navigation data-kc-current="token" data-kc-realm="realm.realm" data-kc-social="realm.social"></data-kc-navigation>
<div id="content">
<ol class="breadcrumb">
<li><a href="#/realms/{{realm.realm}}">{{realm.realm}}</a></li>
<li><a href="#/realms/{{realm.realm}}">Settings</a></li>
<li class="active">Token</li>
</ol>
<h2><span>{{realm.realm}}</span> Token Settings</h2>
<form class="form-horizontal" name="realmForm" novalidate>
<fieldset class="border-top">
<div class="form-group input-select">
<label class="col-sm-2 control-label" for="tokenLifespan">Token lifespan</label>
<div class="col-sm-10">
<div class="row">
<div class="col-sm-2">
<input class="form-control" type="number" required min="1"
max="31536000" data-ng-model="realm.tokenLifespan"
id="tokenLifespan" name="tokenLifespan"/>
</div>
<div class="col-sm-2 select-kc">
<select name="tokenLifespanUnit" data-ng-model="realm.tokenLifespanUnit" >
<option data-ng-selected="!realm.tokenLifespanUnit">Seconds</option>
<option>Minutes</option>
<option>Hours</option>
<option>Days</option>
</select>
</div>
</div>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label" for="accessCodeLifespan">Access code lifespan</label>
<div class="col-sm-10">
<div class="row">
<div class="col-sm-2">
<input class="form-control" type="number" required min="1" max="31536000" data-ng-model="realm.accessCodeLifespan" id="accessCodeLifespan" name="accessCodeLifespan">
</div>
<div class="col-sm-2 select-kc">
<select name="accessCodeLifespanUnit" data-ng-model="realm.accessCodeLifespanUnit">
<option data-ng-selected="!realm.accessCodeLifespanUnit">Seconds</option>
<option>Minutes</option>
<option>Hours</option>
<option>Days</option>
</select>
</div>
</div>
</div>
</div>
<div class="form-group input-select">
<label class="col-sm-2 control-label" for="accessCodeLifespanUserAction" class="two-lines">Access code user action lifespan</label>
<div class="col-sm-10">
<div class="row">
<div class="col-sm-2">
<input class="form-control" type="number" required min="1" max="31536000" data-ng-model="realm.accessCodeLifespanUserAction" id="accessCodeLifespanUserAction" name="accessCodeLifespanUserAction">
</div>
<div class="col-sm-2 select-kc">
<select name="accessCodeLifespanUserActionUnit" data-ng-model="realm.accessCodeLifespanUserActionUnit">
<option data-ng-selected="!realm.accessCodeLifespanUserActionUnit">Seconds</option>
<option>Minutes</option>
<option>Hours</option>
<option>Days</option>
</select>
</div>
</div>
</div>
</div>
</fieldset>
<div class="pull-right form-actions">
<button kc-reset data-ng-show="changed">Clear changes</button>
<button kc-save data-ng-show="changed">Save</button>
</div>
</form>
</div>
</div>
@@ -1,46 +0,0 @@
<div class="bs-sidebar col-md-3 clearfix" data-ng-include data-src="'partials/realm-menu.html'"></div>
<div id="content-area" class="col-md-9" role="main">
<ul class="nav nav-tabs nav-tabs-pf" data-ng-show="!create">
<li><a href="#/realms/{{realm.realm}}/users/{{user.username}}">Attributes</a></li>
<li class="active"><a href="#/realms/{{realm.realm}}/users/{{user.username}}/user-credentials">Credentials</a></li>
<li><a href="#/realms/{{realm.realm}}/users/{{user.username}}/role-mappings">Role Mappings</a></li>
</ul>
<div id="content">
<ol class="breadcrumb">
<li><a href="#/realms/{{realm.realm}}">{{realm.realm}}</a></li>
<li class="active">Users</li>
</ol>
<h2><span>{{user.username}}'s</span> Credentials</h2>
<form class="form-horizontal" name="userForm" novalidate>
<fieldset class="border-top">
<legend><span class="text">Credential Management</span></legend>
<div class="form-group">
<label class="col-sm-2 control-label" for="password">Reset password</label>
<div class="col-sm-4 kc-multiline">
<input class="form-control" type="password" id="password" name="password" data-ng-model="password" placeholder="Temporary password" required>
<input class="form-control" type="password" id="confirmPassword" name="confirmPassword" data-ng-model="confirmPassword" placeholder="Password confirmation" required>
<button class="btn btn-danger" type="submit" data-ng-click="resetPassword()" data-ng-show="password">Reset Password</button>
</div>
</div>
<div class="form-group" data-ng-show="user.email">
<label class="col-sm-2 control-label" for="password">Reset password email</label>
<div class="col-sm-4">
<button class="btn btn-danger" type="submit" data-ng-click="resetPasswordEmail()" >Send Email</button>
</div>
</div>
<div class="form-group" data-ng-show="user.totp">
<label class="col-sm-2 control-label" for="password">Remove totp</label>
<div class="col-sm-4" data-ng-show="user.totp">
<button class="btn btn-danger" type="submit" data-ng-click="removeTotp()">Remove TOTP</button>
</div>
</div>
</fieldset>
</form>
</div>
</div>
@@ -1,14 +0,0 @@
<div class="modal-dialog" tabindex="-1" role="dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">
<span class="pficon pficon-close"></span>
</button>
<h4 class="modal-title" id="myModalLabel">{{ title }}</h4>
</div>
<div class="modal-body"><p ng-bind-html-unsafe="message"></p></div>
<div class="modal-footer">
<button ng-repeat="btn in buttons" ng-click="close(btn.result)" class="" ng-class="btn.cssClass">{{ btn.label }}</button>
</div>
</div>
</div>
@@ -1,10 +0,0 @@
<ul class="nav nav-tabs nav-tabs-pf">
<li ng-class="{active: kcCurrent == 'general'}"><a href="#/realms/{{kcRealm}}">General</a></li>
<li ng-class="{active: kcCurrent == 'social'}" data-ng-show="kcSocial"><a href="#/realms/{{kcRealm}}/social-settings">Social</a></li>
<li ng-class="{active: kcCurrent == 'roles'}"><a href="#/realms/{{kcRealm}}/roles">Roles</a></li>
<li ng-class="{active: kcCurrent == 'defRoles'}"><a href="#/realms/{{kcRealm}}/default-roles">Default Roles</a></li>
<li ng-class="{active: kcCurrent == 'credentials'}"><a href="#/realms/{{kcRealm}}/required-credentials">Credentials</a></li>
<li ng-class="{active: kcCurrent == 'token'}"><a href="#/realms/{{kcRealm}}/token-settings">Token</a></li>
<li ng-class="{active: kcCurrent == 'keys'}"><a href="#/realms/{{kcRealm}}/keys-settings">Keys</a></li>
<li ng-class="{active: kcCurrent == 'email'}"><a href="#/realms/{{kcRealm}}/smtp-settings">Email</a></li>
</ul>
@@ -1,5 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<web-fragment version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-fragment_3_0.xsd ">
</web-fragment>
+53
View File
@@ -0,0 +1,53 @@
<?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.2.0.Beta1</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>keycloak-broker-core</artifactId>
<name>Keycloak Broker Core</name>
<description/>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-core</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-model-api</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-events-api</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxrs</artifactId>
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>
@@ -0,0 +1,62 @@
/*
* JBoss, Home of Professional Open Source
*
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.keycloak.broker.provider;
import org.keycloak.events.EventBuilder;
import org.keycloak.models.IdentityProviderModel;
import org.keycloak.models.RealmModel;
import org.keycloak.models.UserSessionModel;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
/**
* @author Pedro Igor
*/
public abstract class AbstractIdentityProvider<C extends IdentityProviderModel> implements IdentityProvider<C> {
private final C config;
public AbstractIdentityProvider(C config) {
this.config = config;
}
public C getConfig() {
return this.config;
}
@Override
public Response export(UriInfo uriInfo, RealmModel realm, String format) {
return Response.noContent().build();
}
@Override
public void close() {
// no-op
}
@Override
public Object callback(RealmModel realm, AuthenticationCallback callback, EventBuilder event) {
return null;
}
@Override
public Response keycloakInitiatedBrowserLogout(UserSessionModel userSession, UriInfo uriInfo, RealmModel realm) {
return null;
}
}
@@ -0,0 +1,57 @@
/*
* JBoss, Home of Professional Open Source
*
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.keycloak.broker.provider;
import org.keycloak.Config;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.KeycloakSessionFactory;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
/**
* @author Pedro Igor
*/
public abstract class AbstractIdentityProviderFactory<T extends IdentityProvider> implements IdentityProviderFactory<T> {
@Override
public void close() {
}
@Override
public void init(Config.Scope config) {
}
@Override
public void postInit(KeycloakSessionFactory factory) {
}
@Override
public T create(KeycloakSession session) {
return null;
}
@Override
public Map<String, String> parseConfig(InputStream inputStream) {
return new HashMap<String, String>();
}
}
@@ -0,0 +1,83 @@
/*
* JBoss, Home of Professional Open Source
*
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.keycloak.broker.provider;
import org.jboss.resteasy.spi.HttpRequest;
import org.keycloak.models.ClientSessionModel;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.RealmModel;
import javax.ws.rs.core.UriInfo;
/**
* @author Pedro Igor
*/
public class AuthenticationRequest {
private final KeycloakSession session;
private final UriInfo uriInfo;
private final String state;
private final HttpRequest httpRequest;
private final RealmModel realm;
private final String redirectUri;
private final ClientSessionModel clientSession;
public AuthenticationRequest(KeycloakSession session, RealmModel realm, ClientSessionModel clientSession, HttpRequest httpRequest, UriInfo uriInfo, String state, String redirectUri) {
this.session = session;
this.realm = realm;
this.httpRequest = httpRequest;
this.uriInfo = uriInfo;
this.state = state;
this.redirectUri = redirectUri;
this.clientSession = clientSession;
}
public KeycloakSession getSession() {
return session;
}
public UriInfo getUriInfo() {
return this.uriInfo;
}
public String getState() {
return this.state;
}
public HttpRequest getHttpRequest() {
return this.httpRequest;
}
public RealmModel getRealm() {
return this.realm;
}
/**
* <p>Returns the redirect url that must be included in an authentication request in order to process responses from an
* identity provider.</p>
*
* @return
*/
public String getRedirectUri() {
return this.redirectUri;
}
public ClientSessionModel getClientSession() {
return this.clientSession;
}
}
@@ -0,0 +1,135 @@
/*
* JBoss, Home of Professional Open Source
*
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.keycloak.broker.provider;
/**
* <p>Represents all identity information obtained from an {@link IdentityProvider} after a
* successful authentication.</p>
*
* @author Pedro Igor
*/
public class FederatedIdentity {
private String id;
private String username;
private String firstName;
private String lastName;
private String email;
private String token;
private String identityProviderId;
private String brokerSessionId;
private String brokerUserId;
public FederatedIdentity(String id) {
if (id == null) {
throw new RuntimeException("No identifier provider for identity.");
}
this.id = id;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getFirstName() {
return firstName;
}
public void setName(String name) {
if (name != null) {
int i = name.lastIndexOf(' ');
if (i != -1) {
firstName = name.substring(0, i);
lastName = name.substring(i + 1);
} else {
firstName = name;
}
}
}
public String getLastName() {
return lastName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public void setToken(String token) {
this.token = token;
}
public String getToken() {
return this.token;
}
public String getIdentityProviderId() {
return this.identityProviderId;
}
public void setIdentityProviderId(String identityProviderId) {
this.identityProviderId = identityProviderId;
}
public String getBrokerSessionId() {
return brokerSessionId;
}
public void setBrokerSessionId(String brokerSessionId) {
this.brokerSessionId = brokerSessionId;
}
public String getBrokerUserId() {
return brokerUserId;
}
public void setBrokerUserId(String brokerUserId) {
this.brokerUserId = brokerUserId;
}
@Override
public String toString() {
return "{" +
"id='" + id + '\'' +
", username='" + username + '\'' +
", firstName='" + firstName + '\'' +
", lastName='" + lastName + '\'' +
", email='" + email + '\'' +
", token='" + token + '\'' +
", identityProviderId='" + identityProviderId + '\'' +
'}';
}
}
@@ -0,0 +1,32 @@
/*
* JBoss, Home of Professional Open Source
*
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.keycloak.broker.provider;
/**
* @author pedroigor
*/
public class IdentityBrokerException extends RuntimeException {
public IdentityBrokerException(String message) {
super(message);
}
public IdentityBrokerException(String message, Throwable t) {
super(message, t);
}
}
@@ -0,0 +1,100 @@
/*
* JBoss, Home of Professional Open Source
*
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.keycloak.broker.provider;
import org.keycloak.events.EventBuilder;
import org.keycloak.models.FederatedIdentityModel;
import org.keycloak.models.IdentityProviderModel;
import org.keycloak.models.RealmModel;
import org.keycloak.models.UserSessionModel;
import org.keycloak.provider.Provider;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import java.util.Map;
/**
* @author Pedro Igor
*/
public interface IdentityProvider<C extends IdentityProviderModel> extends Provider {
public interface AuthenticationCallback {
/**
* This method should be called by provider after the JAXRS callback endpoint has finished authentication
* with the remote IDP
*
* @param userNotes notes to add to the UserSessionModel
* @param identityProviderConfig provider config
* @param federatedIdentity federated identity
* @param code relayState or state parameter used to identity the client session
* @return
*/
public Response authenticated(Map<String, String> userNotes, IdentityProviderModel identityProviderConfig, FederatedIdentity federatedIdentity, String code);
}
/**
* JAXRS callback endpoint for when the remote IDP wants to callback to keycloak.
*
* @return
*/
Object callback(RealmModel realm, AuthenticationCallback callback, EventBuilder event);
/**
* <p>Initiates the authentication process by sending an authentication request to an identity provider. This method is called
* only once during the authentication.</p>
*
* <p>Depending on how the authentication is performed, this method may redirect the user to the identity provider for authentication.
* In this case, the response would contain a {@link javax.ws.rs.core.Response} that will be used to redirect the user.</p>
*
* <p>However, if the authentication flow does not require a redirect to the identity provider (eg.: simple challenge/response mechanism), this method may return a response containing
* a {@link FederatedIdentity} representing the identity information for an user. In this case, the authentication flow stops.</p>
*
* @param request The initial authentication request. Contains all the contextual information in order to build an authentication request to the
* identity provider.
* @return
*/
Response handleRequest(AuthenticationRequest request);
/**
* <p>Returns a {@link javax.ws.rs.core.Response} containing the token previously stored during the authentication process for a
* specific user.</p>
*
* @param identity
* @return
*/
Response retrieveToken(FederatedIdentityModel identity);
/**
* Called when a Keycloak application initiates a logout through the browser. This is expected to do a logout
* with the IDP
*
* @param userSession
* @param uriInfo
* @param realm
* @return null if this is not supported by this provider
*/
Response keycloakInitiatedBrowserLogout(UserSessionModel userSession, UriInfo uriInfo, RealmModel realm);
/**
* Export a representation of the IdentityProvider in a specific format. For example, a SAML EntityDescriptor
*
* @return
*/
Response export(UriInfo uriInfo, RealmModel realm, String format);
}
@@ -0,0 +1,56 @@
/*
* JBoss, Home of Professional Open Source
*
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.keycloak.broker.provider;
import org.keycloak.models.IdentityProviderModel;
import org.keycloak.provider.ProviderFactory;
import java.io.InputStream;
import java.util.Map;
/**
* @author Pedro Igor
*/
public interface IdentityProviderFactory<T extends IdentityProvider> extends ProviderFactory<T> {
/**
* <p>A friendly name for this factory.</p>
*
* @return
*/
String getName();
/**
* <p>Creates an {@link IdentityProvider} based on the configuration contained in
* <code>model</code>.</p>
*
* @param model The configuration to be used to create the identity provider.
* @return
*/
T create(IdentityProviderModel model);
/**
* <p>Creates an {@link IdentityProvider} based on the configuration from
* <code>inputStream</code>.</p>
*
* @param model The model containing the common abd basic configuration for an identity provider.
* @param inputStream The input stream from where configuration will be loaded from..
* @return
*/
Map<String, String> parseConfig(InputStream inputStream);
}
@@ -0,0 +1,45 @@
/*
* JBoss, Home of Professional Open Source
*
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.keycloak.broker.provider;
import org.keycloak.provider.Provider;
import org.keycloak.provider.ProviderFactory;
import org.keycloak.provider.Spi;
/**
* @author Pedro Igor
*/
public class IdentityProviderSpi implements Spi {
public static final String IDENTITY_PROVIDER_SPI_NAME = "identity_provider";
@Override
public String getName() {
return IDENTITY_PROVIDER_SPI_NAME;
}
@Override
public Class<? extends Provider> getProviderClass() {
return IdentityProvider.class;
}
@Override
public Class<? extends ProviderFactory> getProviderFactoryClass() {
return IdentityProviderFactory.class;
}
}
@@ -0,0 +1 @@
org.keycloak.broker.provider.IdentityProviderSpi
+57
View File
@@ -0,0 +1,57 @@
<?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.2.0.Beta1</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>keycloak-broker-oidc</artifactId>
<name>Keycloak Broker - OpenID Connect Identity Provider</name>
<description/>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-core</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-broker-core</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-core-asl</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-events-api</artifactId>
<version>${project.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-services</artifactId>
<version>${project.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.jboss.logging</groupId>
<artifactId>jboss-logging</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
@@ -0,0 +1,233 @@
/*
* JBoss, Home of Professional Open Source
*
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.keycloak.broker.oidc;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.map.ObjectMapper;
import org.jboss.logging.Logger;
import org.keycloak.ClientConnection;
import org.keycloak.OAuth2Constants;
import org.keycloak.broker.oidc.util.SimpleHttp;
import org.keycloak.broker.provider.AbstractIdentityProvider;
import org.keycloak.broker.provider.AuthenticationRequest;
import org.keycloak.broker.provider.FederatedIdentity;
import org.keycloak.broker.provider.IdentityBrokerException;
import org.keycloak.events.Errors;
import org.keycloak.events.EventBuilder;
import org.keycloak.events.EventType;
import org.keycloak.models.FederatedIdentityModel;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.RealmModel;
import org.keycloak.services.messages.Messages;
import org.keycloak.services.resources.flows.Flows;
import javax.ws.rs.GET;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriBuilder;
import javax.ws.rs.core.UriInfo;
import java.io.IOException;
import java.net.URI;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author Pedro Igor
*/
public abstract class AbstractOAuth2IdentityProvider<C extends OAuth2IdentityProviderConfig> extends AbstractIdentityProvider<C> {
protected static final Logger logger = Logger.getLogger(AbstractOAuth2IdentityProvider.class);
public static final String OAUTH2_GRANT_TYPE_AUTHORIZATION_CODE = "authorization_code";
public static final String FEDERATED_ACCESS_TOKEN = "FEDERATED_ACCESS_TOKEN";
public static final String FEDERATED_REFRESH_TOKEN = "FEDERATED_REFRESH_TOKEN";
public static final String FEDERATED_TOKEN_EXPIRATION = "FEDERATED_TOKEN_EXPIRATION";
protected static ObjectMapper mapper = new ObjectMapper();
public static final String OAUTH2_PARAMETER_ACCESS_TOKEN = "access_token";
public static final String OAUTH2_PARAMETER_SCOPE = "scope";
public static final String OAUTH2_PARAMETER_STATE = "state";
public static final String OAUTH2_PARAMETER_RESPONSE_TYPE = "response_type";
public static final String OAUTH2_PARAMETER_REDIRECT_URI = "redirect_uri";
public static final String OAUTH2_PARAMETER_CODE = "code";
public static final String OAUTH2_PARAMETER_CLIENT_ID = "client_id";
public static final String OAUTH2_PARAMETER_CLIENT_SECRET = "client_secret";
public static final String OAUTH2_PARAMETER_GRANT_TYPE = "grant_type";
public AbstractOAuth2IdentityProvider(C config) {
super(config);
if (config.getDefaultScope() == null || config.getDefaultScope().isEmpty()) {
config.setDefaultScope(getDefaultScopes());
}
}
@Override
public Object callback(RealmModel realm, AuthenticationCallback callback, EventBuilder event) {
return new Endpoint(callback, realm, event);
}
@Override
public Response handleRequest(AuthenticationRequest request) {
try {
URI authorizationUrl = createAuthorizationUrl(request).build();
return Response.temporaryRedirect(authorizationUrl).build();
} catch (Exception e) {
throw new IdentityBrokerException("Could not create authentication request.", e);
}
}
@Override
public Response retrieveToken(FederatedIdentityModel identity) {
return Response.ok(identity.getToken()).build();
}
@Override
public C getConfig() {
return super.getConfig();
}
protected String extractTokenFromResponse(String response, String tokenName) {
if (response.startsWith("{")) {
try {
return mapper.readTree(response).get(tokenName).getTextValue();
} catch (IOException e) {
throw new IdentityBrokerException("Could not extract token [" + tokenName + "] from response [" + response + "].", e);
}
} else {
Matcher matcher = Pattern.compile(tokenName + "=([^&]+)").matcher(response);
if (matcher.find()) {
return matcher.group(1);
}
}
return null;
}
protected FederatedIdentity getFederatedIdentity(Map<String, String> notes, String response) {
String accessToken = extractTokenFromResponse(response, OAUTH2_PARAMETER_ACCESS_TOKEN);
if (accessToken == null) {
throw new IdentityBrokerException("No access token from server.");
}
return doGetFederatedIdentity(accessToken);
}
protected FederatedIdentity doGetFederatedIdentity(String accessToken) {
return null;
}
;
protected UriBuilder createAuthorizationUrl(AuthenticationRequest request) {
return UriBuilder.fromUri(getConfig().getAuthorizationUrl())
.queryParam(OAUTH2_PARAMETER_SCOPE, getConfig().getDefaultScope())
.queryParam(OAUTH2_PARAMETER_STATE, request.getState())
.queryParam(OAUTH2_PARAMETER_RESPONSE_TYPE, "code")
.queryParam(OAUTH2_PARAMETER_CLIENT_ID, getConfig().getClientId())
.queryParam(OAUTH2_PARAMETER_REDIRECT_URI, request.getRedirectUri());
}
protected String getJsonProperty(JsonNode jsonNode, String name) {
if (jsonNode.has(name)) {
return jsonNode.get(name).asText();
}
return null;
}
protected JsonNode asJsonNode(String json) throws IOException {
return mapper.readTree(json);
}
protected abstract String getDefaultScopes();
protected class Endpoint {
protected AuthenticationCallback callback;
protected RealmModel realm;
protected EventBuilder event;
@Context
protected KeycloakSession session;
@Context
protected ClientConnection clientConnection;
@Context
protected HttpHeaders headers;
@Context
protected UriInfo uriInfo;
public Endpoint(AuthenticationCallback callback, RealmModel realm, EventBuilder event) {
this.callback = callback;
this.realm = realm;
this.event = event;
}
@GET
public Response authResponse(@QueryParam(AbstractOAuth2IdentityProvider.OAUTH2_PARAMETER_STATE) String state,
@QueryParam(AbstractOAuth2IdentityProvider.OAUTH2_PARAMETER_CODE) String authorizationCode,
@QueryParam(OAuth2Constants.ERROR) String error) {
if (error != null) {
//logger.error("Failed " + getConfig().getAlias() + " broker login: " + error);
event.event(EventType.LOGIN);
event.error(error);
return Flows.forwardToSecurityFailurePage(session, realm, uriInfo, headers, Messages.IDENTITY_PROVIDER_UNEXPECTED_ERROR);
}
try {
if (authorizationCode != null) {
String response = generateTokenRequest(authorizationCode).asString();
HashMap<String, String> userNotes = new HashMap<String, String>();
FederatedIdentity federatedIdentity = getFederatedIdentity(userNotes, response);
if (getConfig().isStoreToken()) {
federatedIdentity.setToken(response);
}
return callback.authenticated(userNotes, getConfig(), federatedIdentity, state);
}
} catch (Exception e) {
logger.error("Failed to make identity provider oauth callback", e);
}
event.event(EventType.LOGIN);
event.error(Errors.IDENTITY_PROVIDER_LOGIN_FAILURE);
return Flows.forwardToSecurityFailurePage(session, realm, uriInfo, headers, Messages.IDENTITY_PROVIDER_UNEXPECTED_ERROR);
}
public SimpleHttp generateTokenRequest(String authorizationCode) {
return SimpleHttp.doPost(getConfig().getTokenUrl())
.param(OAUTH2_PARAMETER_CODE, authorizationCode)
.param(OAUTH2_PARAMETER_CLIENT_ID, getConfig().getClientId())
.param(OAUTH2_PARAMETER_CLIENT_SECRET, getConfig().getClientSecret())
.param(OAUTH2_PARAMETER_REDIRECT_URI, uriInfo.getAbsolutePath().toString())
.param(OAUTH2_PARAMETER_GRANT_TYPE, OAUTH2_GRANT_TYPE_AUTHORIZATION_CODE);
}
}
}
@@ -0,0 +1,100 @@
package org.keycloak.broker.oidc;
import org.keycloak.broker.oidc.util.SimpleHttp;
import org.keycloak.constants.AdapterConstants;
import org.keycloak.events.EventBuilder;
import org.keycloak.jose.jws.JWSInput;
import org.keycloak.jose.jws.crypto.RSAProvider;
import org.keycloak.models.RealmModel;
import org.keycloak.models.UserSessionModel;
import org.keycloak.representations.adapters.action.AdminAction;
import org.keycloak.representations.adapters.action.LogoutAction;
import org.keycloak.services.managers.AuthenticationManager;
import org.keycloak.util.JsonSerialization;
import org.keycloak.util.PemUtils;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.core.Response;
import java.io.IOException;
import java.security.PublicKey;
/**
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $
*/
public class KeycloakOIDCIdentityProvider extends OIDCIdentityProvider {
public KeycloakOIDCIdentityProvider(OIDCIdentityProviderConfig config) {
super(config);
}
@Override
public Object callback(RealmModel realm, AuthenticationCallback callback, EventBuilder event) {
return new KeycloakEndpoint(callback, realm, event);
}
protected class KeycloakEndpoint extends OIDCEndpoint {
public KeycloakEndpoint(AuthenticationCallback callback, RealmModel realm, EventBuilder event) {
super(callback, realm, event);
}
@POST
@Path(AdapterConstants.K_LOGOUT)
public Response backchannelLogout(String input) {
JWSInput token = new JWSInput(input);
PublicKey key = getExternalIdpKey();
if (key != null) {
if (!verify(token, key)) {
logger.warn("Failed to verify logout request");
return Response.status(400).build();
}
}
LogoutAction action = null;
try {
action = JsonSerialization.readValue(token.getContent(), LogoutAction.class);
} catch (IOException e) {
throw new RuntimeException(e);
}
if (!validateAction(action)) return Response.status(400).build();
if (action.getKeycloakSessionIds() != null) {
for (String sessionId : action.getKeycloakSessionIds()) {
String brokerSessionId = getConfig().getAlias() + "." + sessionId;
UserSessionModel userSession = session.sessions().getUserSessionByBrokerSessionId(realm, brokerSessionId);
if (userSession != null) {
AuthenticationManager.backchannelLogout(session, realm, userSession, uriInfo, clientConnection, headers);
}
}
}
return Response.ok().build();
}
protected boolean validateAction(AdminAction action) {
if (!action.validate()) {
logger.warn("admin request failed, not validated" + action.getAction());
return false;
}
if (action.isExpired()) {
logger.warn("admin request failed, expired token");
return false;
}
if (!getConfig().getClientId().equals(action.getResource())) {
logger.warn("Resource name does not match");
return false;
}
return true;
}
@Override
public SimpleHttp generateTokenRequest(String authorizationCode) {
return super.generateTokenRequest(authorizationCode)
.param(AdapterConstants.APPLICATION_SESSION_STATE, "n/a"); // hack to get backchannel logout to work
}
}
}
@@ -0,0 +1,56 @@
/*
* JBoss, Home of Professional Open Source
*
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.keycloak.broker.oidc;
import org.keycloak.broker.provider.AbstractIdentityProviderFactory;
import org.keycloak.models.IdentityProviderModel;
import org.keycloak.protocol.oidc.representations.OIDCConfigurationRepresentation;
import org.keycloak.util.JsonSerialization;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
/**
* @author Pedro Igor
*/
public class KeycloakOIDCIdentityProviderFactory extends AbstractIdentityProviderFactory<KeycloakOIDCIdentityProvider> {
public static final String PROVIDER_ID = "keycloak-oidc";
@Override
public String getName() {
return "Keycloak OpenID Connect";
}
@Override
public KeycloakOIDCIdentityProvider create(IdentityProviderModel model) {
return new KeycloakOIDCIdentityProvider(new OIDCIdentityProviderConfig(model));
}
@Override
public String getId() {
return PROVIDER_ID;
}
@Override
public Map<String, String> parseConfig(InputStream inputStream) {
return OIDCIdentityProviderFactory.parseOIDCConfig(inputStream);
}
}
@@ -0,0 +1,78 @@
/*
* JBoss, Home of Professional Open Source
*
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.keycloak.broker.oidc;
import org.keycloak.models.IdentityProviderModel;
/**
* @author Pedro Igor
*/
public class OAuth2IdentityProviderConfig extends IdentityProviderModel {
public OAuth2IdentityProviderConfig(IdentityProviderModel model) {
super(model);
}
public String getAuthorizationUrl() {
return getConfig().get("authorizationUrl");
}
public void setAuthorizationUrl(String authorizationUrl) {
getConfig().put("authorizationUrl", authorizationUrl);
}
public String getTokenUrl() {
return getConfig().get("tokenUrl");
}
public void setTokenUrl(String tokenUrl) {
getConfig().put("tokenUrl", tokenUrl);
}
public String getUserInfoUrl() {
return getConfig().get("userInfoUrl");
}
public void setUserInfoUrl(String userInfoUrl) {
getConfig().put("userInfoUrl", userInfoUrl);
}
public String getClientId() {
return getConfig().get("clientId");
}
public void setClientId(String clientId) {
getConfig().put("clientId", clientId);
}
public String getClientSecret() {
return getConfig().get("clientSecret");
}
public void setClientSecret(String clientSecret) {
getConfig().put("clientSecret", clientSecret);
}
public String getDefaultScope() {
return getConfig().get("defaultScope");
}
public void setDefaultScope(String defaultScope) {
getConfig().put("defaultScope", defaultScope);
}
}
@@ -0,0 +1,280 @@
/*
* JBoss, Home of Professional Open Source
*
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.keycloak.broker.oidc;
import org.codehaus.jackson.JsonNode;
import org.jboss.logging.Logger;
import org.keycloak.RSATokenVerifier;
import org.keycloak.broker.oidc.util.SimpleHttp;
import org.keycloak.broker.provider.AuthenticationRequest;
import org.keycloak.broker.provider.FederatedIdentity;
import org.keycloak.broker.provider.IdentityBrokerException;
import org.keycloak.events.Errors;
import org.keycloak.events.EventBuilder;
import org.keycloak.events.EventType;
import org.keycloak.jose.jws.JWSInput;
import org.keycloak.jose.jws.crypto.RSAProvider;
import org.keycloak.models.RealmModel;
import org.keycloak.models.UserSessionModel;
import org.keycloak.representations.AccessTokenResponse;
import org.keycloak.representations.IDToken;
import org.keycloak.services.managers.AuthenticationManager;
import org.keycloak.services.messages.Messages;
import org.keycloak.services.resources.IdentityBrokerService;
import org.keycloak.services.resources.RealmsResource;
import org.keycloak.services.resources.flows.Flows;
import org.keycloak.util.JsonSerialization;
import org.keycloak.util.PemUtils;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriBuilder;
import javax.ws.rs.core.UriInfo;
import java.io.IOException;
import java.security.PublicKey;
import java.util.Map;
/**
* @author Pedro Igor
*/
public class OIDCIdentityProvider extends AbstractOAuth2IdentityProvider<OIDCIdentityProviderConfig> {
protected static final Logger logger = Logger.getLogger(OIDCIdentityProvider.class);
public static final String OAUTH2_PARAMETER_PROMPT = "prompt";
public static final String SCOPE_OPENID = "openid";
public static final String FEDERATED_ID_TOKEN = "FEDERATED_ID_TOKEN";
public OIDCIdentityProvider(OIDCIdentityProviderConfig config) {
super(config);
String defaultScope = config.getDefaultScope();
if (!defaultScope.contains(SCOPE_OPENID)) {
config.setDefaultScope(SCOPE_OPENID + " " + defaultScope);
}
}
@Override
public Object callback(RealmModel realm, AuthenticationCallback callback, EventBuilder event) {
return new OIDCEndpoint(callback, realm, event);
}
protected PublicKey getExternalIdpKey() {
String signingCert = getConfig().getCertificateSignatureVerifier();
try {
if (signingCert != null && !signingCert.trim().equals("")) {
return PemUtils.decodeCertificate(signingCert).getPublicKey();
} else if (getConfig().getPublicKeySignatureVerifier() != null && !getConfig().getPublicKeySignatureVerifier().trim().equals("")) {
return PemUtils.decodePublicKey(getConfig().getPublicKeySignatureVerifier());
}
} catch (Exception e) {
throw new RuntimeException(e);
}
return null;
}
protected boolean verify(JWSInput jws, PublicKey key) {
if (key == null) return true;
if (!getConfig().isValidateSignature()) return true;
return RSAProvider.verify(jws, key);
}
protected class OIDCEndpoint extends Endpoint {
public OIDCEndpoint(AuthenticationCallback callback, RealmModel realm, EventBuilder event) {
super(callback, realm, event);
}
@GET
@Path("logout_response")
public Response logoutResponse(@Context UriInfo uriInfo,
@QueryParam("state") String state) {
UserSessionModel userSession = session.sessions().getUserSession(realm, state);
if (userSession == null) {
logger.error("no valid user session");
EventBuilder event = new EventBuilder(realm, session, clientConnection);
event.event(EventType.LOGOUT);
event.error(Errors.USER_SESSION_NOT_FOUND);
return Flows.forwardToSecurityFailurePage(session, realm, uriInfo, headers, Messages.IDENTITY_PROVIDER_UNEXPECTED_ERROR);
}
if (userSession.getState() != UserSessionModel.State.LOGGING_OUT) {
logger.error("usersession in different state");
EventBuilder event = new EventBuilder(realm, session, clientConnection);
event.event(EventType.LOGOUT);
event.error(Errors.USER_SESSION_NOT_FOUND);
return Flows.forwardToSecurityFailurePage(session, realm, uriInfo, headers, Messages.SESSION_NOT_ACTIVE);
}
return AuthenticationManager.finishBrowserLogout(session, realm, userSession, uriInfo, clientConnection, headers);
}
}
@Override
public Response keycloakInitiatedBrowserLogout(UserSessionModel userSession, UriInfo uriInfo, RealmModel realm) {
if (getConfig().getLogoutUrl() == null || getConfig().getLogoutUrl().trim().equals("")) return null;
UriBuilder logoutUri = UriBuilder.fromUri(getConfig().getLogoutUrl())
.queryParam("state", userSession.getId());
String idToken = userSession.getNote(FEDERATED_ID_TOKEN);
if (idToken != null) logoutUri.queryParam("id_token_hint", idToken);
String redirect = RealmsResource.brokerUrl(uriInfo)
.path(IdentityBrokerService.class, "getEndpoint")
.path(OIDCEndpoint.class, "logoutResponse")
.build(realm.getName(), getConfig().getAlias()).toString();
logoutUri.queryParam("post_logout_redirect_uri", redirect);
return Response.status(302).location(logoutUri.build()).build();
}
@Override
protected UriBuilder createAuthorizationUrl(AuthenticationRequest request) {
UriBuilder authorizationUrl = super.createAuthorizationUrl(request);
String prompt = getConfig().getPrompt();
if (prompt != null && !prompt.isEmpty()) {
authorizationUrl.queryParam(OAUTH2_PARAMETER_PROMPT, prompt);
}
return authorizationUrl;
}
@Override
protected FederatedIdentity getFederatedIdentity(Map<String, String> notes, String response) {
AccessTokenResponse tokenResponse = null;
try {
tokenResponse = JsonSerialization.readValue(response, AccessTokenResponse.class);
} catch (IOException e) {
throw new IdentityBrokerException("Could not decode access token response.", e);
}
PublicKey key = getExternalIdpKey();
String accessToken = verifyAccessToken(key, tokenResponse);
String encodedIdToken = tokenResponse.getIdToken();
notes.put(FEDERATED_ACCESS_TOKEN, accessToken);
notes.put(FEDERATED_ID_TOKEN, encodedIdToken);
notes.put(FEDERATED_REFRESH_TOKEN, tokenResponse.getRefreshToken());
notes.put(FEDERATED_TOKEN_EXPIRATION, Long.toString(tokenResponse.getExpiresIn()));
IDToken idToken = validateIdToken(key, encodedIdToken);
try {
String id = idToken.getSubject();
String name = idToken.getName();
String preferredUsername = idToken.getPreferredUsername();
String email = idToken.getEmail();
if (id == null || name == null || preferredUsername == null || email == null && getConfig().getUserInfoUrl() != null) {
JsonNode userInfo = SimpleHttp.doGet(getConfig().getUserInfoUrl())
.header("Authorization", "Bearer " + accessToken)
.asJson();
id = getJsonProperty(userInfo, "sub");
name = getJsonProperty(userInfo, "name");
preferredUsername = getJsonProperty(userInfo, "preferred_username");
email = getJsonProperty(userInfo, "email");
}
FederatedIdentity identity = new FederatedIdentity(id);
identity.setId(id);
identity.setName(name);
identity.setEmail(email);
identity.setBrokerUserId(getConfig().getAlias() + "." + id);
if (tokenResponse.getSessionState() != null) {
identity.setBrokerSessionId(getConfig().getAlias() + "." + tokenResponse.getSessionState());
}
if (preferredUsername == null) {
preferredUsername = email;
}
if (preferredUsername == null) {
preferredUsername = id;
}
identity.setUsername(preferredUsername);
if (getConfig().isStoreToken()) {
identity.setToken(response);
}
return identity;
} catch (Exception e) {
throw new IdentityBrokerException("Could not fetch attributes from userinfo endpoint.", e);
}
}
private String verifyAccessToken(PublicKey key, AccessTokenResponse tokenResponse) {
String accessToken = tokenResponse.getToken();
if (accessToken == null) {
throw new IdentityBrokerException("No access_token from server.");
}
return accessToken;
}
private IDToken validateIdToken(PublicKey key, String encodedToken) {
if (encodedToken == null) {
throw new IdentityBrokerException("No id_token from server.");
}
try {
JWSInput jws = new JWSInput(encodedToken);
if (!verify(jws, key)) {
throw new IdentityBrokerException("IDToken signature validation failed");
}
IDToken idToken = jws.readJsonContent(IDToken.class);
String aud = idToken.getAudience();
String iss = idToken.getIssuer();
if (aud != null && !aud.equals(getConfig().getClientId())) {
throw new IdentityBrokerException("Wrong audience from id_token..");
}
String trustedIssuers = getConfig().getIssuer();
if (trustedIssuers != null) {
String[] issuers = trustedIssuers.split(",");
for (String trustedIssuer : issuers) {
if (iss != null && iss.equals(trustedIssuer.trim())) {
return idToken;
}
}
throw new IdentityBrokerException("Wrong issuer from id_token. Got: " + iss + " expected: " + getConfig().getIssuer());
}
return idToken;
} catch (IOException e) {
throw new IdentityBrokerException("Could not decode id token.", e);
}
}
@Override
protected String getDefaultScopes() {
return "openid";
}
}
@@ -0,0 +1,76 @@
/*
* JBoss, Home of Professional Open Source
*
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.keycloak.broker.oidc;
import org.keycloak.models.IdentityProviderModel;
/**
* @author Pedro Igor
*/
public class OIDCIdentityProviderConfig extends OAuth2IdentityProviderConfig {
public OIDCIdentityProviderConfig(IdentityProviderModel identityProviderModel) {
super(identityProviderModel);
}
public String getPrompt() {
return getConfig().get("prompt");
}
public void setPrompt(String prompt) {
getConfig().put("prompt", prompt);
}
public String getIssuer() {
return getConfig().get("issuer");
}
public void setIssuer(String issuer) {
getConfig().put("issuer", issuer);
}
public String getLogoutUrl() {
return getConfig().get("logoutUrl");
}
public void setLogoutUrl(String url) {
getConfig().put("logoutUrl", url);
}
public String getCertificateSignatureVerifier() {
return getConfig().get("certificateSignatureVerifier");
}
public void setCertificateSignatureVerifier(String signingCertificate) {
getConfig().put("certificateSignatureVerifier", signingCertificate);
}
public String getPublicKeySignatureVerifier() {
return getConfig().get("publicKeySignatureVerifier");
}
public void setPublicKeySignatureVerifier(String signingCertificate) {
getConfig().put("publicKeySignatureVerifier", signingCertificate);
}
public boolean isValidateSignature() {
return Boolean.valueOf(getConfig().get("validateSignature"));
}
public void setValidateSignature(boolean validateSignature) {
getConfig().put("validateSignature", String.valueOf(validateSignature));
}
}
@@ -0,0 +1,100 @@
/*
* JBoss, Home of Professional Open Source
*
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.keycloak.broker.oidc;
import org.codehaus.jackson.annotate.JsonProperty;
import org.keycloak.broker.oidc.util.SimpleHttp;
import org.keycloak.broker.provider.AbstractIdentityProviderFactory;
import org.keycloak.jose.jwk.JWK;
import org.keycloak.jose.jwk.JWKParser;
import org.keycloak.models.IdentityProviderModel;
import org.keycloak.models.utils.KeycloakModelUtils;
import org.keycloak.protocol.oidc.representations.JSONWebKeySet;
import org.keycloak.protocol.oidc.representations.OIDCConfigurationRepresentation;
import org.keycloak.util.JsonSerialization;
import org.keycloak.util.PemUtils;
import java.io.IOException;
import java.io.InputStream;
import java.security.PublicKey;
import java.util.Map;
/**
* @author Pedro Igor
*/
public class OIDCIdentityProviderFactory extends AbstractIdentityProviderFactory<OIDCIdentityProvider> {
public static final String PROVIDER_ID = "oidc";
@Override
public String getName() {
return "OpenID Connect v1.0";
}
@Override
public OIDCIdentityProvider create(IdentityProviderModel model) {
return new OIDCIdentityProvider(new OIDCIdentityProviderConfig(model));
}
@Override
public String getId() {
return PROVIDER_ID;
}
@Override
public Map<String, String> parseConfig(InputStream inputStream) {
return parseOIDCConfig(inputStream);
}
protected static Map<String, String> parseOIDCConfig(InputStream inputStream) {
OIDCConfigurationRepresentation rep = null;
try {
rep = JsonSerialization.readValue(inputStream, OIDCConfigurationRepresentation.class);
} catch (IOException e) {
throw new RuntimeException("failed to load openid connect metadata", e);
}
OIDCIdentityProviderConfig config = new OIDCIdentityProviderConfig(new IdentityProviderModel());
config.setIssuer(rep.getIssuer());
config.setLogoutUrl(rep.getLogoutEndpoint());
config.setAuthorizationUrl(rep.getAuthorizationEndpoint());
config.setTokenUrl(rep.getTokenEndpoint());
config.setUserInfoUrl(rep.getUserinfoEndpoint());
if (rep.getJwksUri() != null) {
String uri = rep.getJwksUri();
String keySetString = null;
try {
keySetString = SimpleHttp.doGet(uri).asString();
JSONWebKeySet keySet = JsonSerialization.readValue(keySetString, JSONWebKeySet.class);
for (JWK jwk : keySet.getKeys()) {
JWKParser parse = JWKParser.create(jwk);
if (parse.getJwk().getPublicKeyUse().equals(JWK.SIG_USE)) {
PublicKey key = parse.toPublicKey();
config.setPublicKeySignatureVerifier(KeycloakModelUtils.getPemFromKey(key));
config.setValidateSignature(true);
break;
}
}
} catch (IOException e) {
throw new RuntimeException("F ailed to query JWKSet from: " + uri, e);
}
}
return config.getConfig();
}
}
@@ -1,6 +1,7 @@
package org.keycloak.social.utils;
package org.keycloak.broker.oidc.util;
import org.json.JSONObject;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.map.ObjectMapper;
import java.io.IOException;
import java.io.InputStream;
@@ -12,12 +13,16 @@ import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
import java.util.zip.GZIPInputStream;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
* @author Vlastimil Elias (velias at redhat dot com)
*/
public class SimpleHttp {
private static ObjectMapper mapper = new ObjectMapper();
private String url;
private String method;
private Map<String, String> headers;
@@ -52,8 +57,8 @@ public class SimpleHttp {
return this;
}
public JSONObject asJson() throws IOException {
return new JSONObject(asString());
public JsonNode asJson() throws IOException {
return mapper.readTree(asString());
}
public String asString() throws IOException {
@@ -113,7 +118,11 @@ public class SimpleHttp {
connection.setDoOutput(false);
}
String ce = connection.getHeaderField("Content-Encoding");
is = connection.getInputStream();
if ("gzip".equals(ce)) {
is = new GZIPInputStream(is);
}
return toString(is);
} finally {
if (os != null) {
@@ -0,0 +1,2 @@
org.keycloak.broker.oidc.OIDCIdentityProviderFactory
org.keycloak.broker.oidc.KeycloakOIDCIdentityProviderFactory
Executable
+23
View File
@@ -0,0 +1,23 @@
<?xml version="1.0"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<parent>
<artifactId>keycloak-parent</artifactId>
<groupId>org.keycloak</groupId>
<version>1.2.0.Beta1</version>
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>keycloak-broker-parent</artifactId>
<name>Keycloak Broker Parent</name>
<description/>
<packaging>pom</packaging>
<modules>
<module>core</module>
<module>oidc</module>
<module>saml</module>
</modules>
</project>
+53
View File
@@ -0,0 +1,53 @@
<?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.2.0.Beta1</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>keycloak-broker-saml</artifactId>
<name>Keycloak Broker - SAML Identity Provider</name>
<description/>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-broker-core</artifactId>
<version>${project.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-saml-protocol</artifactId>
<version>${project.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.picketlink</groupId>
<artifactId>picketlink-federation</artifactId>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-services</artifactId>
<version>${project.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-events-api</artifactId>
<version>${project.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.jboss.logging</groupId>
<artifactId>jboss-logging</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
@@ -0,0 +1,458 @@
package org.keycloak.broker.saml;
import org.jboss.logging.Logger;
import org.keycloak.ClientConnection;
import org.keycloak.VerificationException;
import org.keycloak.broker.provider.FederatedIdentity;
import org.keycloak.broker.provider.IdentityBrokerException;
import org.keycloak.broker.provider.IdentityProvider;
import org.keycloak.events.Details;
import org.keycloak.events.Errors;
import org.keycloak.events.EventBuilder;
import org.keycloak.events.EventType;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.RealmModel;
import org.keycloak.models.UserSessionModel;
import org.keycloak.protocol.saml.SAML2LogoutResponseBuilder;
import org.keycloak.protocol.saml.SAMLRequestParser;
import org.keycloak.protocol.saml.SamlProtocol;
import org.keycloak.protocol.saml.SamlProtocolUtils;
import org.keycloak.services.managers.AuthenticationManager;
import org.keycloak.services.messages.Messages;
import org.keycloak.services.resources.flows.Flows;
import org.picketlink.common.constants.GeneralConstants;
import org.picketlink.common.constants.JBossSAMLConstants;
import org.picketlink.common.constants.JBossSAMLURIConstants;
import org.picketlink.common.exceptions.ConfigurationException;
import org.picketlink.common.exceptions.ProcessingException;
import org.picketlink.common.util.DocumentUtil;
import org.picketlink.common.util.StaxParserUtil;
import org.picketlink.identity.federation.api.saml.v2.response.SAML2Response;
import org.picketlink.identity.federation.core.parsers.saml.SAMLParser;
import org.picketlink.identity.federation.core.saml.v2.common.SAMLDocumentHolder;
import org.picketlink.identity.federation.core.util.JAXPValidationUtil;
import org.picketlink.identity.federation.core.util.XMLEncryptionUtil;
import org.picketlink.identity.federation.core.util.XMLSignatureUtil;
import org.picketlink.identity.federation.saml.v2.assertion.AssertionType;
import org.picketlink.identity.federation.saml.v2.assertion.AuthnStatementType;
import org.picketlink.identity.federation.saml.v2.assertion.EncryptedAssertionType;
import org.picketlink.identity.federation.saml.v2.assertion.NameIDType;
import org.picketlink.identity.federation.saml.v2.assertion.SubjectType;
import org.picketlink.identity.federation.saml.v2.protocol.LogoutRequestType;
import org.picketlink.identity.federation.saml.v2.protocol.RequestAbstractType;
import org.picketlink.identity.federation.saml.v2.protocol.ResponseType;
import org.picketlink.identity.federation.saml.v2.protocol.StatusResponseType;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import javax.ws.rs.Consumes;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriBuilder;
import javax.ws.rs.core.UriInfo;
import javax.xml.namespace.QName;
import java.io.IOException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.cert.X509Certificate;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $
*/
public class SAMLEndpoint {
protected static final Logger logger = Logger.getLogger(SAMLEndpoint.class);
public static final String SAML_FEDERATED_SESSION_INDEX = "SAML_FEDERATED_SESSION_INDEX";
public static final String SAML_FEDERATED_SUBJECT = "SAML_FEDERATED_SUBJECT";
public static final String SAML_FEDERATED_SUBJECT_NAMEFORMAT = "SAML_FEDERATED_SUBJECT_NAMEFORMAT";
protected RealmModel realm;
protected EventBuilder event;
protected SAMLIdentityProviderConfig config;
protected IdentityProvider.AuthenticationCallback callback;
@Context
private UriInfo uriInfo;
@Context
private KeycloakSession session;
@Context
private ClientConnection clientConnection;
@Context
private HttpHeaders headers;
public SAMLEndpoint(RealmModel realm, SAMLIdentityProviderConfig config, IdentityProvider.AuthenticationCallback callback) {
this.realm = realm;
this.config = config;
this.callback = callback;
}
@GET
public Response redirectBinding(@QueryParam(GeneralConstants.SAML_REQUEST_KEY) String samlRequest,
@QueryParam(GeneralConstants.SAML_RESPONSE_KEY) String samlResponse,
@QueryParam(GeneralConstants.RELAY_STATE) String relayState) {
return new RedirectBinding().execute(samlRequest, samlResponse, relayState);
}
/**
*/
@POST
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public Response postBinding(@FormParam(GeneralConstants.SAML_REQUEST_KEY) String samlRequest,
@FormParam(GeneralConstants.SAML_RESPONSE_KEY) String samlResponse,
@FormParam(GeneralConstants.RELAY_STATE) String relayState) {
return new PostBinding().execute(samlRequest, samlResponse, relayState);
}
protected abstract class Binding {
private boolean checkSsl() {
if (uriInfo.getBaseUri().getScheme().equals("https")) {
return true;
} else {
return !realm.getSslRequired().isRequired(clientConnection);
}
}
protected Response basicChecks(String samlRequest, String samlResponse) {
if (!checkSsl()) {
event.event(EventType.LOGIN);
event.error(Errors.SSL_REQUIRED);
return Flows.forwardToSecurityFailurePage(session, realm, uriInfo, headers, Messages.HTTPS_REQUIRED);
}
if (!realm.isEnabled()) {
event.event(EventType.LOGIN_ERROR);
event.error(Errors.REALM_DISABLED);
return Flows.forwardToSecurityFailurePage(session, realm, uriInfo, headers, Messages.REALM_NOT_ENABLED);
}
if (samlRequest == null && samlResponse == null) {
event.event(EventType.LOGIN);
event.error(Errors.INVALID_REQUEST);
return Flows.forwardToSecurityFailurePage(session, realm, uriInfo, headers, Messages.INVALID_REQUEST );
}
return null;
}
protected abstract String getBindingType();
protected abstract void verifySignature(SAMLDocumentHolder documentHolder) throws VerificationException;
protected abstract SAMLDocumentHolder extractRequestDocument(String samlRequest);
protected abstract SAMLDocumentHolder extractResponseDocument(String response);
protected PublicKey getIDPKey() {
X509Certificate certificate = null;
try {
certificate = XMLSignatureUtil.getX509CertificateFromKeyInfoString(config.getSigningCertificate().replaceAll("\\s", ""));
} catch (ProcessingException e) {
throw new RuntimeException(e);
}
return certificate.getPublicKey();
}
public Response execute(String samlRequest, String samlResponse, String relayState) {
event = new EventBuilder(realm, session, clientConnection);
Response response = basicChecks(samlRequest, samlResponse);
if (response != null) return response;
if (samlRequest != null) return handleSamlRequest(samlRequest, relayState);
else return handleSamlResponse(samlResponse, relayState);
}
protected Response handleSamlRequest(String samlRequest, String relayState) {
SAMLDocumentHolder holder = extractRequestDocument(samlRequest);
RequestAbstractType requestAbstractType = (RequestAbstractType) holder.getSamlObject();
// validate destination
if (!uriInfo.getAbsolutePath().equals(requestAbstractType.getDestination())) {
event.event(EventType.IDENTITY_PROVIDER_RESPONSE);
event.error(Errors.INVALID_SAML_RESPONSE);
event.detail(Details.REASON, "invalid_destination");
return Flows.forwardToSecurityFailurePage(session, realm, uriInfo, headers, Messages.INVALID_REQUEST);
}
if (config.isValidateSignature()) {
try {
verifySignature(holder);
} catch (VerificationException e) {
logger.error("validation failed", e);
event.event(EventType.IDENTITY_PROVIDER_RESPONSE);
event.error(Errors.INVALID_SIGNATURE);
return Flows.forwardToSecurityFailurePage(session, realm, uriInfo, headers, Messages.INVALID_REQUESTER);
}
}
if (requestAbstractType instanceof LogoutRequestType) {
logger.debug("** logout request");
event.event(EventType.LOGOUT);
LogoutRequestType logout = (LogoutRequestType) requestAbstractType;
return logoutRequest(logout, relayState);
} else {
event.event(EventType.LOGIN);
event.error(Errors.INVALID_TOKEN);
return Flows.forwardToSecurityFailurePage(session, realm, uriInfo, headers, Messages.INVALID_REQUEST);
}
}
protected Response logoutRequest(LogoutRequestType request, String relayState) {
String brokerUserId = config.getAlias() + "." + request.getNameID().getValue();
if (request.getSessionIndex() == null || request.getSessionIndex().isEmpty()) {
List<UserSessionModel> userSessions = session.sessions().getUserSessionByBrokerUserId(realm, brokerUserId);
for (UserSessionModel userSession : userSessions) {
try {
AuthenticationManager.backchannelLogout(session, realm, userSession, uriInfo, clientConnection, headers);
} catch (Exception e) {
logger.warn("failed to do backchannel logout for userSession", e);
}
}
} else {
for (String sessionIndex : request.getSessionIndex()) {
String brokerSessionId = brokerUserId + "." + sessionIndex;
UserSessionModel userSession = session.sessions().getUserSessionByBrokerSessionId(realm, brokerSessionId);
if (userSession != null) {
try {
AuthenticationManager.backchannelLogout(session, realm, userSession, uriInfo, clientConnection, headers);
} catch (Exception e) {
logger.warn("failed to do backchannel logout for userSession", e);
}
}
}
}
String issuerURL = getEntityId(uriInfo, realm);
SAML2LogoutResponseBuilder builder = new SAML2LogoutResponseBuilder();
builder.logoutRequestID(request.getID());
builder.destination(config.getSingleLogoutServiceUrl());
builder.issuer(issuerURL);
builder.relayState(relayState);
if (config.isWantAuthnRequestsSigned()) {
builder.signWith(realm.getPrivateKey(), realm.getPublicKey(), realm.getCertificate())
.signDocument();
}
try {
if (config.isPostBindingResponse()) {
return builder.postBinding().response();
} else {
return builder.redirectBinding().response();
}
} catch (ConfigurationException e) {
throw new RuntimeException(e);
} catch (ProcessingException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
private String getEntityId(UriInfo uriInfo, RealmModel realm) {
return UriBuilder.fromUri(uriInfo.getBaseUri()).path("realms").path(realm.getName()).build().toString();
}
protected Response handleLoginResponse(String samlResponse, SAMLDocumentHolder holder, ResponseType responseType, String relayState) {
try {
AssertionType assertion = getAssertion(responseType);
SubjectType subject = assertion.getSubject();
SubjectType.STSubType subType = subject.getSubType();
NameIDType subjectNameID = (NameIDType) subType.getBaseID();
Map<String, String> notes = new HashMap<>();
notes.put(SAML_FEDERATED_SUBJECT, subjectNameID.getValue());
if (subjectNameID.getFormat() != null) notes.put(SAML_FEDERATED_SUBJECT_NAMEFORMAT, subjectNameID.getFormat().toString());
FederatedIdentity identity = new FederatedIdentity(subjectNameID.getValue());
identity.setUsername(subjectNameID.getValue());
if (subjectNameID.getFormat().toString().equals(JBossSAMLURIConstants.NAMEID_FORMAT_EMAIL.get())) {
identity.setEmail(subjectNameID.getValue());
}
if (config.isStoreToken()) {
identity.setToken(samlResponse);
}
AuthnStatementType authn = null;
for (Object statement : assertion.getStatements()) {
if (statement instanceof AuthnStatementType) {
authn = (AuthnStatementType)statement;
break;
}
}
String brokerUserId = config.getAlias() + "." + subjectNameID.getValue();
identity.setBrokerUserId(brokerUserId);
if (authn != null && authn.getSessionIndex() != null) {
identity.setBrokerSessionId(identity.getBrokerUserId() + "." + authn.getSessionIndex());
notes.put(SAML_FEDERATED_SESSION_INDEX, authn.getSessionIndex());
}
return callback.authenticated(notes, config, identity, relayState);
} catch (Exception e) {
throw new IdentityBrokerException("Could not process response from SAML identity provider.", e);
}
}
private AssertionType getAssertion(ResponseType responseType) throws ProcessingException {
List<ResponseType.RTChoiceType> assertions = responseType.getAssertions();
if (assertions.isEmpty()) {
throw new IdentityBrokerException("No assertion from response.");
}
ResponseType.RTChoiceType rtChoiceType = assertions.get(0);
EncryptedAssertionType encryptedAssertion = rtChoiceType.getEncryptedAssertion();
if (encryptedAssertion != null) {
decryptAssertion(responseType, realm.getPrivateKey());
}
return responseType.getAssertions().get(0).getAssertion();
}
public Response handleSamlResponse(String samlResponse, String relayState) {
SAMLDocumentHolder holder = extractResponseDocument(samlResponse);
StatusResponseType statusResponse = (StatusResponseType)holder.getSamlObject();
// validate destination
if (!uriInfo.getAbsolutePath().toString().equals(statusResponse.getDestination())) {
event.event(EventType.IDENTITY_PROVIDER_RESPONSE);
event.error(Errors.INVALID_SAML_RESPONSE);
event.detail(Details.REASON, "invalid_destination");
return Flows.forwardToSecurityFailurePage(session, realm, uriInfo, headers, Messages.INVALID_FEDERATED_IDENTITY_ACTION);
}
if (config.isValidateSignature()) {
try {
verifySignature(holder);
} catch (VerificationException e) {
logger.error("validation failed", e);
event.event(EventType.IDENTITY_PROVIDER_RESPONSE);
event.error(Errors.INVALID_SIGNATURE);
return Flows.forwardToSecurityFailurePage(session, realm, uriInfo, headers, Messages.INVALID_FEDERATED_IDENTITY_ACTION);
}
}
if (statusResponse instanceof ResponseType) {
return handleLoginResponse(samlResponse, holder, (ResponseType)statusResponse, relayState);
} else {
// todo need to check that it is actually a LogoutResponse
return handleLogoutResponse(holder, statusResponse, relayState);
}
//throw new RuntimeException("Unknown response type");
}
protected Response handleLogoutResponse(SAMLDocumentHolder holder, StatusResponseType responseType, String relayState) {
if (relayState == null) {
logger.error("no valid user session");
event.event(EventType.LOGOUT);
event.error(Errors.USER_SESSION_NOT_FOUND);
return Flows.forwardToSecurityFailurePage(session, realm, uriInfo, headers, Messages.IDENTITY_PROVIDER_UNEXPECTED_ERROR);
}
UserSessionModel userSession = session.sessions().getUserSession(realm, relayState);
if (userSession == null) {
logger.error("no valid user session");
event.event(EventType.LOGOUT);
event.error(Errors.USER_SESSION_NOT_FOUND);
return Flows.forwardToSecurityFailurePage(session, realm, uriInfo, headers, Messages.IDENTITY_PROVIDER_UNEXPECTED_ERROR);
}
if (userSession.getState() != UserSessionModel.State.LOGGING_OUT) {
logger.error("usersession in different state");
event.event(EventType.LOGOUT);
event.error(Errors.USER_SESSION_NOT_FOUND);
return Flows.forwardToSecurityFailurePage(session, realm, uriInfo, headers, Messages.SESSION_NOT_ACTIVE);
}
return AuthenticationManager.finishBrowserLogout(session, realm, userSession, uriInfo, clientConnection, headers);
}
protected ResponseType decryptAssertion(ResponseType responseType, PrivateKey privateKey) throws ProcessingException {
SAML2Response saml2Response = new SAML2Response();
try {
Document doc = saml2Response.convert(responseType);
Element enc = DocumentUtil.getElement(doc, new QName(JBossSAMLConstants.ENCRYPTED_ASSERTION.get()));
if (enc == null) {
throw new IdentityBrokerException("No encrypted assertion found.");
}
String oldID = enc.getAttribute(JBossSAMLConstants.ID.get());
Document newDoc = DocumentUtil.createDocument();
Node importedNode = newDoc.importNode(enc, true);
newDoc.appendChild(importedNode);
Element decryptedDocumentElement = XMLEncryptionUtil.decryptElementInDocument(newDoc, privateKey);
SAMLParser parser = new SAMLParser();
JAXPValidationUtil.checkSchemaValidation(decryptedDocumentElement);
AssertionType assertion = (AssertionType) parser.parse(StaxParserUtil.getXMLEventReader(DocumentUtil
.getNodeAsStream(decryptedDocumentElement)));
responseType.replaceAssertion(oldID, new ResponseType.RTChoiceType(assertion));
return responseType;
} catch (Exception e) {
throw new IdentityBrokerException("Could not decrypt assertion.", e);
}
}
}
protected class PostBinding extends Binding {
@Override
protected void verifySignature(SAMLDocumentHolder documentHolder) throws VerificationException {
SamlProtocolUtils.verifyDocumentSignature(documentHolder.getSamlDocument(), getIDPKey());
}
@Override
protected SAMLDocumentHolder extractRequestDocument(String samlRequest) {
return SAMLRequestParser.parseRequestPostBinding(samlRequest);
}
@Override
protected SAMLDocumentHolder extractResponseDocument(String response) {
return SAMLRequestParser.parseResponsePostBinding(response);
}
@Override
protected String getBindingType() {
return SamlProtocol.SAML_POST_BINDING;
}
}
protected class RedirectBinding extends Binding {
@Override
protected void verifySignature(SAMLDocumentHolder documentHolder) throws VerificationException {
PublicKey publicKey = getIDPKey();
SamlProtocolUtils.verifyRedirectSignature(publicKey, uriInfo);
}
@Override
protected SAMLDocumentHolder extractRequestDocument(String samlRequest) {
return SAMLRequestParser.parseRequestRedirectBinding(samlRequest);
}
@Override
protected SAMLDocumentHolder extractResponseDocument(String response) {
return SAMLRequestParser.parseRequestRedirectBinding(response);
}
@Override
protected String getBindingType() {
return SamlProtocol.SAML_REDIRECT_BINDING;
}
}
}
@@ -0,0 +1,185 @@
/*
* JBoss, Home of Professional Open Source
*
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.keycloak.broker.saml;
import org.keycloak.broker.provider.AbstractIdentityProvider;
import org.keycloak.broker.provider.AuthenticationRequest;
import org.keycloak.broker.provider.IdentityBrokerException;
import org.keycloak.events.EventBuilder;
import org.keycloak.models.FederatedIdentityModel;
import org.keycloak.models.RealmModel;
import org.keycloak.models.UserSessionModel;
import org.keycloak.protocol.saml.SAML2AuthnRequestBuilder;
import org.keycloak.protocol.saml.SAML2LogoutRequestBuilder;
import org.keycloak.protocol.saml.SAML2NameIDPolicyBuilder;
import org.picketlink.common.constants.JBossSAMLURIConstants;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriBuilder;
import javax.ws.rs.core.UriInfo;
import java.security.KeyPair;
import java.security.PrivateKey;
import java.security.PublicKey;
/**
* @author Pedro Igor
*/
public class SAMLIdentityProvider extends AbstractIdentityProvider<SAMLIdentityProviderConfig> {
public SAMLIdentityProvider(SAMLIdentityProviderConfig config) {
super(config);
}
@Override
public Object callback(RealmModel realm, AuthenticationCallback callback, EventBuilder event) {
return new SAMLEndpoint(realm, getConfig(), callback);
}
@Override
public Response handleRequest(AuthenticationRequest request) {
try {
UriInfo uriInfo = request.getUriInfo();
RealmModel realm = request.getRealm();
String issuerURL = getEntityId(uriInfo, realm);
String destinationUrl = getConfig().getSingleSignOnServiceUrl();
String nameIDPolicyFormat = getConfig().getNameIDPolicyFormat();
if (nameIDPolicyFormat == null) {
nameIDPolicyFormat = JBossSAMLURIConstants.NAMEID_FORMAT_PERSISTENT.get();
}
String protocolBinding = JBossSAMLURIConstants.SAML_HTTP_REDIRECT_BINDING.get();
String assertionConsumerServiceUrl = request.getRedirectUri();
if (getConfig().isPostBindingResponse()) {
protocolBinding = JBossSAMLURIConstants.SAML_HTTP_POST_BINDING.get();
}
SAML2AuthnRequestBuilder authnRequestBuilder = new SAML2AuthnRequestBuilder()
.assertionConsumerUrl(assertionConsumerServiceUrl)
.destination(destinationUrl)
.issuer(issuerURL)
.forceAuthn(getConfig().isForceAuthn())
.protocolBinding(protocolBinding)
.nameIdPolicy(SAML2NameIDPolicyBuilder.format(nameIDPolicyFormat))
.relayState(request.getState());
if (getConfig().isWantAuthnRequestsSigned()) {
PrivateKey privateKey = realm.getPrivateKey();
PublicKey publicKey = realm.getPublicKey();
if (privateKey == null) {
throw new IdentityBrokerException("Identity Provider [" + getConfig().getAlias() + "] wants a signed authentication request. But the Realm [" + realm.getName() + "] does not have a private key.");
}
if (publicKey == null) {
throw new IdentityBrokerException("Identity Provider [" + getConfig().getAlias() + "] wants a signed authentication request. But the Realm [" + realm.getName() + "] does not have a public key.");
}
KeyPair keypair = new KeyPair(publicKey, privateKey);
authnRequestBuilder.signWith(keypair);
authnRequestBuilder.signDocument();
}
if (getConfig().isPostBindingAuthnRequest()) {
return authnRequestBuilder.postBinding().request();
} else {
return authnRequestBuilder.redirectBinding().request();
}
} catch (Exception e) {
throw new IdentityBrokerException("Could not create authentication request.", e);
}
}
private String getEntityId(UriInfo uriInfo, RealmModel realm) {
return UriBuilder.fromUri(uriInfo.getBaseUri()).path("realms").path(realm.getName()).build().toString();
}
@Override
public Response retrieveToken(FederatedIdentityModel identity) {
return Response.ok(identity.getToken()).build();
}
@Override
public Response keycloakInitiatedBrowserLogout(UserSessionModel userSession, UriInfo uriInfo, RealmModel realm) {
if (getConfig().getSingleLogoutServiceUrl() == null || getConfig().getSingleLogoutServiceUrl().trim().equals("")) return null;
SAML2LogoutRequestBuilder logoutBuilder = new SAML2LogoutRequestBuilder()
.issuer(getEntityId(uriInfo, realm))
.sessionIndex(userSession.getNote(SAMLEndpoint.SAML_FEDERATED_SESSION_INDEX))
.userPrincipal(userSession.getNote(SAMLEndpoint.SAML_FEDERATED_SUBJECT), userSession.getNote(SAMLEndpoint.SAML_FEDERATED_SUBJECT_NAMEFORMAT))
.destination(getConfig().getSingleLogoutServiceUrl());
if (getConfig().isWantAuthnRequestsSigned()) {
logoutBuilder.signWith(realm.getPrivateKey(), realm.getPublicKey(), realm.getCertificate())
.signDocument();
}
try {
return logoutBuilder.relayState(userSession.getId()).postBinding().request();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
public Response export(UriInfo uriInfo, RealmModel realm, String format) {
String authnBinding = JBossSAMLURIConstants.SAML_HTTP_REDIRECT_BINDING.get();
if (getConfig().isPostBindingAuthnRequest()) {
authnBinding = JBossSAMLURIConstants.SAML_HTTP_POST_BINDING.get();
}
String endpoint = uriInfo.getBaseUriBuilder()
.path("realms").path(realm.getName())
.path("broker")
.path(getConfig().getAlias())
.path("endpoint")
.build().toString();
String descriptor =
"<EntityDescriptor entityID=\"" + getEntityId(uriInfo, realm) + "\">\n" +
" <SPSSODescriptor AuthnRequestsSigned=\"" + getConfig().isWantAuthnRequestsSigned() + "\"\n" +
" protocolSupportEnumeration=\"urn:oasis:names:tc:SAML:2.0:protocol urn:oasis:names:tc:SAML:1.1:protocol http://schemas.xmlsoap.org/ws/2003/07/secext\">\n" +
" <NameIDFormat>" + getConfig().getNameIDPolicyFormat() + "\n" +
" </NameIDFormat>\n" +
" <SingleLogoutService Binding=\"" + authnBinding + "\" Location=\"" + endpoint + "\"/>\n" +
" <AssertionConsumerService\n" +
" Binding=\"" + authnBinding + "\" Location=\"" + endpoint + "\"\n" +
" index=\"1\" isDefault=\"true\" />\n";
if (getConfig().isWantAuthnRequestsSigned()) {
descriptor +=
" <KeyDescriptor use=\"signing\">\n" +
" <dsig:KeyInfo xmlns:dsig=\"http://www.w3.org/2000/09/xmldsig#\">\n" +
" <dsig:X509Data>\n" +
" <dsig:X509Certificate>\n" + realm.getCertificatePem() + "\n" +
" </dsig:X509Certificate>\n" +
" </dsig:X509Data>\n" +
" </dsig:KeyInfo>\n" +
" </KeyDescriptor>\n";
}
descriptor +=
" </SPSSODescriptor>\n" +
"</EntityDescriptor>\n";
return Response.ok(descriptor, MediaType.APPLICATION_XML_TYPE).build();
}
}
@@ -0,0 +1,113 @@
/*
* JBoss, Home of Professional Open Source
*
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.keycloak.broker.saml;
import org.keycloak.models.IdentityProviderModel;
/**
* @author Pedro Igor
*/
public class SAMLIdentityProviderConfig extends IdentityProviderModel {
public SAMLIdentityProviderConfig() {
}
public SAMLIdentityProviderConfig(IdentityProviderModel identityProviderModel) {
super(identityProviderModel);
}
public String getSingleSignOnServiceUrl() {
return getConfig().get("singleSignOnServiceUrl");
}
public void setSingleSignOnServiceUrl(String singleSignOnServiceUrl) {
getConfig().put("singleSignOnServiceUrl", singleSignOnServiceUrl);
}
public String getSingleLogoutServiceUrl() {
return getConfig().get("singleLogoutServiceUrl");
}
public void setSingleLogoutServiceUrl(String singleLogoutServiceUrl) {
getConfig().put("singleLogoutServiceUrl", singleLogoutServiceUrl);
}
public boolean isValidateSignature() {
return Boolean.valueOf(getConfig().get("validateSignature"));
}
public void setValidateSignature(boolean validateSignature) {
getConfig().put("validateSignature", String.valueOf(validateSignature));
}
public boolean isForceAuthn() {
return Boolean.valueOf(getConfig().get("forceAuthn"));
}
public void setForceAuthn(boolean forceAuthn) {
getConfig().put("forceAuthn", String.valueOf(forceAuthn));
}
public String getSigningCertificate() {
return getConfig().get("signingCertificate");
}
public void setSigningCertificate(String signingCertificate) {
getConfig().put("signingCertificate", signingCertificate);
}
public String getNameIDPolicyFormat() {
return getConfig().get("nameIDPolicyFormat");
}
public void setNameIDPolicyFormat(String nameIDPolicyFormat) {
getConfig().put("nameIDPolicyFormat", nameIDPolicyFormat);
}
public boolean isWantAuthnRequestsSigned() {
return Boolean.valueOf(getConfig().get("wantAuthnRequestsSigned"));
}
public void setWantAuthnRequestsSigned(boolean wantAuthnRequestsSigned) {
getConfig().put("wantAuthnRequestsSigned", String.valueOf(wantAuthnRequestsSigned));
}
public String getEncryptionPublicKey() {
return getConfig().get("encryptionPublicKey");
}
public void setEncryptionPublicKey(String encryptionPublicKey) {
getConfig().put("encryptionPublicKey", encryptionPublicKey);
}
public boolean isPostBindingAuthnRequest() {
return Boolean.valueOf(getConfig().get("postBindingAuthnRequest"));
}
public void setPostBindingAuthnRequest(boolean postBindingAuthnRequest) {
getConfig().put("postBindingAuthnRequest", String.valueOf(postBindingAuthnRequest));
}
public boolean isPostBindingResponse() {
return Boolean.valueOf(getConfig().get("postBindingResponse"));
}
public void setPostBindingResponse(boolean postBindingResponse) {
getConfig().put("postBindingResponse", String.valueOf(postBindingResponse));
}
}
@@ -0,0 +1,153 @@
/*
* JBoss, Home of Professional Open Source
*
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.keycloak.broker.saml;
import org.keycloak.broker.provider.AbstractIdentityProviderFactory;
import org.keycloak.models.IdentityProviderModel;
import org.picketlink.common.constants.JBossSAMLURIConstants;
import org.picketlink.common.exceptions.ParsingException;
import org.picketlink.common.util.DocumentUtil;
import org.picketlink.identity.federation.core.parsers.saml.SAMLParser;
import org.picketlink.identity.federation.saml.v2.metadata.EndpointType;
import org.picketlink.identity.federation.saml.v2.metadata.EntitiesDescriptorType;
import org.picketlink.identity.federation.saml.v2.metadata.EntityDescriptorType;
import org.picketlink.identity.federation.saml.v2.metadata.IDPSSODescriptorType;
import org.picketlink.identity.federation.saml.v2.metadata.KeyDescriptorType;
import org.picketlink.identity.federation.saml.v2.metadata.KeyTypes;
import org.w3c.dom.Element;
import javax.xml.namespace.QName;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author Pedro Igor
*/
public class SAMLIdentityProviderFactory extends AbstractIdentityProviderFactory<SAMLIdentityProvider> {
public static final String PROVIDER_ID = "saml";
@Override
public String getName() {
return "SAML v2.0";
}
@Override
public SAMLIdentityProvider create(IdentityProviderModel model) {
return new SAMLIdentityProvider(new SAMLIdentityProviderConfig(model));
}
@Override
public Map<String, String> parseConfig(InputStream inputStream) {
try {
Object parsedObject = new SAMLParser().parse(inputStream);
EntityDescriptorType entityType;
if (EntitiesDescriptorType.class.isInstance(parsedObject)) {
entityType = (EntityDescriptorType) ((EntitiesDescriptorType) parsedObject).getEntityDescriptor().get(0);
} else {
entityType = (EntityDescriptorType) parsedObject;
}
List<EntityDescriptorType.EDTChoiceType> choiceType = entityType.getChoiceType();
if (!choiceType.isEmpty()) {
EntityDescriptorType.EDTChoiceType edtChoiceType = choiceType.get(0);
List<EntityDescriptorType.EDTDescriptorChoiceType> descriptors = edtChoiceType.getDescriptors();
if (!descriptors.isEmpty()) {
EntityDescriptorType.EDTDescriptorChoiceType edtDescriptorChoiceType = descriptors.get(0);
IDPSSODescriptorType idpDescriptor = edtDescriptorChoiceType.getIdpDescriptor();
if (idpDescriptor != null) {
SAMLIdentityProviderConfig samlIdentityProviderConfig = new SAMLIdentityProviderConfig();
String singleSignOnServiceUrl = null;
boolean postBinding = false;
for (EndpointType endpoint : idpDescriptor.getSingleSignOnService()) {
if (endpoint.getBinding().toString().equals(JBossSAMLURIConstants.SAML_HTTP_POST_BINDING.get())) {
singleSignOnServiceUrl = endpoint.getLocation().toString();
postBinding = true;
break;
} else if (endpoint.getBinding().toString().equals(JBossSAMLURIConstants.SAML_HTTP_REDIRECT_BINDING.get())){
singleSignOnServiceUrl = endpoint.getLocation().toString();
}
}
String singleLogoutServiceUrl = null;
for (EndpointType endpoint : idpDescriptor.getSingleLogoutService()) {
if (postBinding && endpoint.getBinding().toString().equals(JBossSAMLURIConstants.SAML_HTTP_POST_BINDING.get())) {
singleLogoutServiceUrl = endpoint.getLocation().toString();
break;
} else if (!postBinding && endpoint.getBinding().toString().equals(JBossSAMLURIConstants.SAML_HTTP_REDIRECT_BINDING.get())){
singleLogoutServiceUrl = endpoint.getLocation().toString();
break;
}
}
samlIdentityProviderConfig.setSingleLogoutServiceUrl(singleLogoutServiceUrl);
samlIdentityProviderConfig.setSingleSignOnServiceUrl(singleSignOnServiceUrl);
samlIdentityProviderConfig.setWantAuthnRequestsSigned(idpDescriptor.isWantAuthnRequestsSigned());
samlIdentityProviderConfig.setValidateSignature(idpDescriptor.isWantAuthnRequestsSigned());
samlIdentityProviderConfig.setPostBindingResponse(postBinding);
samlIdentityProviderConfig.setPostBindingAuthnRequest(postBinding);
List<KeyDescriptorType> keyDescriptor = idpDescriptor.getKeyDescriptor();
String defaultCertificate = null;
if (keyDescriptor != null) {
for (KeyDescriptorType keyDescriptorType : keyDescriptor) {
Element keyInfo = keyDescriptorType.getKeyInfo();
Element x509KeyInfo = DocumentUtil.getChildElement(keyInfo, new QName("dsig", "X509Certificate"));
if (KeyTypes.SIGNING.equals(keyDescriptorType.getUse())) {
samlIdentityProviderConfig.setSigningCertificate(x509KeyInfo.getTextContent());
} else if (KeyTypes.ENCRYPTION.equals(keyDescriptorType.getUse())) {
samlIdentityProviderConfig.setEncryptionPublicKey(x509KeyInfo.getTextContent());
} else if (keyDescriptorType.getUse() == null) {
defaultCertificate = x509KeyInfo.getTextContent();
}
}
}
if (defaultCertificate != null) {
if (samlIdentityProviderConfig.getSigningCertificate() == null) {
samlIdentityProviderConfig.setSigningCertificate(defaultCertificate);
}
if (samlIdentityProviderConfig.getEncryptionPublicKey() == null) {
samlIdentityProviderConfig.setEncryptionPublicKey(defaultCertificate);
}
}
return samlIdentityProviderConfig.getConfig();
}
}
}
} catch (ParsingException pe) {
throw new RuntimeException("Could not parse IdP SAML Metadata", pe);
}
return new HashMap<String, String>();
}
@Override
public String getId() {
return PROVIDER_ID;
}
}
@@ -0,0 +1 @@
org.keycloak.broker.saml.SAMLIdentityProviderFactory
+47
View File
@@ -0,0 +1,47 @@
<?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.2.0.Beta1</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>keycloak-connections-file</artifactId>
<name>Keycloak Connections File</name>
<description/>
<dependencies>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-export-import-api</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-export-import-single-file</artifactId>
<version>${project.version}</version>
</dependency>
<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.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.jboss.logging</groupId>
<artifactId>jboss-logging</artifactId>
</dependency>
</dependencies>
</project>
@@ -0,0 +1,86 @@
/*
* Copyright 2015 Red Hat Inc. and/or its affiliates and other contributors
* as indicated by the @author tags. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package org.keycloak.connections.file;
import org.keycloak.models.KeycloakSession;
/**
* Provides the InMemoryModel and notifies the factory to save it when
* the session is done.
*
* @author Stan Silvert ssilvert@redhat.com (C) 2015 Red Hat Inc.
*/
public class DefaultFileConnectionProvider implements FileConnectionProvider {
private final DefaultFileConnectionProviderFactory factory;
private final KeycloakSession session;
private final InMemoryModel inMemoryModel;
private boolean isRollbackOnly = false;
public DefaultFileConnectionProvider(DefaultFileConnectionProviderFactory factory,
KeycloakSession session,
InMemoryModel inMemoryModel) {
this.factory = factory;
this.session = session;
this.inMemoryModel = inMemoryModel;
}
@Override
public InMemoryModel getModel() {
return inMemoryModel;
}
@Override
public void sessionClosed(KeycloakSession session) {
factory.sessionClosed(session);
}
@Override
public void close() {
}
@Override
public void begin() {
}
@Override
public void commit() {
factory.commit(session);
}
@Override
public void rollback() {
factory.rollback(session);
}
@Override
public void setRollbackOnly() {
isRollbackOnly = true;
}
@Override
public boolean getRollbackOnly() {
return isRollbackOnly;
}
@Override
public boolean isActive() {
return factory.isActive(session);
}
}
@@ -0,0 +1,202 @@
/*
* Copyright 2015 Red Hat Inc. and/or its affiliates and other contributors
* as indicated by the @author tags. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package org.keycloak.connections.file;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.jboss.logging.Logger;
import org.keycloak.Config;
import org.keycloak.exportimport.Strategy;
import org.keycloak.exportimport.util.ExportUtils;
import org.keycloak.exportimport.util.ImportUtils;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.KeycloakSessionFactory;
import org.keycloak.models.RealmModel;
import org.keycloak.representations.idm.RealmRepresentation;
import org.keycloak.util.JsonSerialization;
/**
* This class dispenses a FileConnectionProvider to Keycloak sessions. It
* makes sure that only one InMemoryModel is provided for each session and it
* handles thread contention for the file where the model is read or saved.
*
* @author Stan Silvert ssilvert@redhat.com (C) 2015 Red Hat Inc.
*/
public class DefaultFileConnectionProviderFactory implements FileConnectionProviderFactory {
protected static final Logger logger = Logger.getLogger(DefaultFileConnectionProviderFactory.class);
private File kcdata;
private final Map<KeycloakSession, FileConnectionProvider> allProviders = new HashMap<KeycloakSession, FileConnectionProvider>();
@Override
public void init(Config.Scope config) {
String fileName = config.get("fileName");
if (fileName == null) {
fileName = "keycloak-model.json";
}
String directory = config.get("directory");
if (directory == null) {
directory = System.getProperty("jboss.server.data.dir");
}
if (directory == null) {
directory = ".";
}
kcdata = new File(directory, fileName);
}
public void sessionClosed(KeycloakSession session) {
synchronized(allProviders) {
allProviders.remove(session);
//logger.info("Removed session " + session.hashCode());
//logger.info("sessionClosed: Session count=" + allModels.size());
}
}
void readModelFile(KeycloakSession session) {
synchronized(allProviders) {
if (!kcdata.exists()) {
return;
}
FileInputStream fis = null;
try {
fis = new FileInputStream(kcdata);
ImportUtils.importFromStream(session, JsonSerialization.mapper, fis, Strategy.IGNORE_EXISTING);
} catch (IOException ioe) {
logger.error("Unable to read model file " + kcdata.getAbsolutePath(), ioe);
} finally {
//logger.info("Read model file for session=" + session.hashCode());
try {
if (fis != null) {
fis.close();
}
} catch (IOException e) {
logger.error("Failed to close output stream.", e);
}
}
}
}
void writeModelFile(KeycloakSession session) {
synchronized(allProviders) {
FileOutputStream outStream = null;
try {
outStream = new FileOutputStream(kcdata);
exportModel(session, outStream);
} catch (IOException e) {
logger.error("Unable to write model file " + kcdata.getAbsolutePath(), e);
} finally {
//logger.info("Wrote model file for session=" + session.hashCode());
try {
if (outStream != null) {
outStream.close();
}
} catch (IOException e) {
logger.error("Failed to close output stream.", e);
}
}
}
}
private void exportModel(KeycloakSession session, FileOutputStream outStream) throws IOException {
List<RealmModel> realms = session.realms().getRealms();
List<RealmRepresentation> reps = new ArrayList<RealmRepresentation>();
for (RealmModel realm : realms) {
reps.add(ExportUtils.exportRealm(session, realm, true));
}
JsonSerialization.prettyMapper.writeValue(outStream, reps);
}
@Override
public FileConnectionProvider create(KeycloakSession session) {
synchronized (allProviders) {
FileConnectionProvider fcProvider = allProviders.get(session);
if (fcProvider == null) {
InMemoryModel model = new InMemoryModel();
fcProvider = new DefaultFileConnectionProvider(this, session, model);
allProviders.put(session, fcProvider);
session.getTransaction().enlist(fcProvider);
readModelFile(session);
//logger.info("Added session " + session.hashCode() + " total sessions=" + allModels.size());
}
return fcProvider;
}
}
// commitCount is used for debugging. This allows you to easily run a test
// to a particular point and then examine the JSON file.
//private static int commitCount = 0;
void commit(KeycloakSession session) {
//commitCount++;
synchronized (allProviders) {
// in case commit was somehow called twice on the same session
if (!allProviders.containsKey(session)) return;
try {
writeModelFile(session);
} finally {
allProviders.remove(session);
//logger.info("Removed session " + session.hashCode());
//logger.info("*** commitCount=" + commitCount);
//logger.info("commit(): Session count=" + allModels.size());
}
// if (commitCount == 16) {Thread.dumpStack();System.exit(0);}
}
}
void rollback(KeycloakSession session) {
synchronized (allProviders) {
allProviders.remove(session);
//logger.info("rollback(): Session count=" + allModels.size());
}
}
boolean isActive(KeycloakSession session) {
synchronized (allProviders) {
return allProviders.containsKey(session);
}
}
@Override
public void close() {
}
@Override
public String getId() {
return "default";
}
@Override
public void postInit(KeycloakSessionFactory factory) {
}
}
@@ -0,0 +1,31 @@
/*
* Copyright 2015 Red Hat Inc. and/or its affiliates and other contributors
* as indicated by the @author tags. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package org.keycloak.connections.file;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.KeycloakTransaction;
import org.keycloak.provider.Provider;
/**
* @author Stan Silvert ssilvert@redhat.com (C) 2015 Red Hat Inc.
*/
public interface FileConnectionProvider extends Provider, KeycloakTransaction {
InMemoryModel getModel();
void sessionClosed(KeycloakSession session);
}
@@ -0,0 +1,25 @@
/*
* Copyright 2015 Red Hat Inc. and/or its affiliates and other contributors
* as indicated by the @author tags. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package org.keycloak.connections.file;
import org.keycloak.provider.ProviderFactory;
/**
* @author Stan Silvert ssilvert@redhat.com (C) 2015 Red Hat Inc.
*/
public interface FileConnectionProviderFactory extends ProviderFactory<FileConnectionProvider> {
}
@@ -0,0 +1,27 @@
package org.keycloak.connections.file;
import org.keycloak.provider.Provider;
import org.keycloak.provider.ProviderFactory;
import org.keycloak.provider.Spi;
/**
* @author Stan Silvert ssilvert@redhat.com (C) 2015 Red Hat Inc.
*/
public class FileConnectionSpi implements Spi {
@Override
public String getName() {
return "connectionsFile";
}
@Override
public Class<? extends Provider> getProviderClass() {
return FileConnectionProvider.class;
}
@Override
public Class<? extends ProviderFactory> getProviderFactoryClass() {
return FileConnectionProviderFactory.class;
}
}
@@ -0,0 +1,99 @@
/*
* Copyright 2015 Red Hat Inc. and/or its affiliates and other contributors
* as indicated by the @author tags. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package org.keycloak.connections.file;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import org.keycloak.models.RealmModel;
import org.keycloak.models.UserModel;
/**
* This class provides an in-memory copy of the entire model for each
* Keycloak session. At the start of the session, the model is read
* from JSON. When the session's transaction ends, the model is written back
* out.
*
* @author Stan Silvert ssilvert@redhat.com (C) 2015 Red Hat Inc.
*/
public class InMemoryModel {
private final Map<String, RealmModel> allRealms = new HashMap<String, RealmModel>();
// realmId, userId, userModel
private final Map<String, Map<String,UserModel>> allUsers = new HashMap<String, Map<String,UserModel>>();
public InMemoryModel() {
}
public void putRealm(String id, RealmModel realm) {
allRealms.put(id, realm);
allUsers.put(id, new HashMap<String, UserModel>());
}
public RealmModel getRealm(String id) {
return allRealms.get(id);
}
public Collection<RealmModel> getRealms() {
return allRealms.values();
}
public RealmModel getRealmByName(String name) {
for (RealmModel realm : getRealms()) {
if (realm.getName().equals(name)) return realm;
}
return null;
}
public boolean removeRealm(String id) {
allUsers.remove(id);
return (allRealms.remove(id) != null);
}
protected Map<String, UserModel> realmUsers(String realmId) {
Map<String, UserModel> realmUsers = allUsers.get(realmId);
if (realmUsers == null) throw new NullPointerException("Realm users not found for id=" + realmId);
return realmUsers;
}
public void putUser(String realmId, String userId, UserModel user) {
realmUsers(realmId).put(userId, user);
}
public UserModel getUser(String realmId, String userId) {
return realmUsers(realmId).get(userId);
}
public boolean hasUserWithUsername(String realmId, String username) {
for (UserModel user : getUsers(realmId)) {
if (user.getUsername().equals(username)) return true;
}
return false;
}
public Collection<UserModel> getUsers(String realmId) {
return realmUsers(realmId).values();
}
public boolean removeUser(String realmId, String userId) {
return (realmUsers(realmId).remove(userId) != null);
}
}
@@ -0,0 +1 @@
org.keycloak.connections.file.DefaultFileConnectionProviderFactory
@@ -0,0 +1 @@
org.keycloak.connections.file.FileConnectionSpi
+33
View File
@@ -0,0 +1,33 @@
<?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.2.0.Beta1</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>keycloak-connections-infinispan</artifactId>
<name>Keycloak Connections Infinispan</name>
<description/>
<dependencies>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-core</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-model-api</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.infinispan</groupId>
<artifactId>infinispan-core</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
@@ -0,0 +1,26 @@
package org.keycloak.connections.infinispan;
import org.infinispan.Cache;
import org.infinispan.manager.EmbeddedCacheManager;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public class DefaultInfinispanConnectionProvider implements InfinispanConnectionProvider {
private EmbeddedCacheManager cacheManager;
public DefaultInfinispanConnectionProvider(EmbeddedCacheManager cacheManager) {
this.cacheManager = cacheManager;
}
@Override
public <K, V> Cache<K, V> getCache(String name) {
return cacheManager.getCache(name);
}
@Override
public void close() {
}
}
@@ -0,0 +1,132 @@
package org.keycloak.connections.infinispan;
import org.infinispan.configuration.cache.CacheMode;
import org.infinispan.configuration.cache.Configuration;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.configuration.global.GlobalConfigurationBuilder;
import org.infinispan.manager.DefaultCacheManager;
import org.infinispan.manager.EmbeddedCacheManager;
import org.jboss.logging.Logger;
import org.keycloak.Config;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.KeycloakSessionFactory;
import javax.naming.InitialContext;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public class DefaultInfinispanConnectionProviderFactory implements InfinispanConnectionProviderFactory {
protected static final Logger logger = Logger.getLogger(DefaultInfinispanConnectionProviderFactory.class);
private Config.Scope config;
private EmbeddedCacheManager cacheManager;
private boolean containerManaged;
@Override
public InfinispanConnectionProvider create(KeycloakSession session) {
lazyInit();
return new DefaultInfinispanConnectionProvider(cacheManager);
}
@Override
public void close() {
if (cacheManager != null && !containerManaged) {
cacheManager.stop();
}
cacheManager = null;
}
@Override
public String getId() {
return "default";
}
@Override
public void init(Config.Scope config) {
this.config = config;
}
@Override
public void postInit(KeycloakSessionFactory factory) {
}
private void lazyInit() {
if (cacheManager == null) {
synchronized (this) {
if (cacheManager == null) {
String cacheContainer = config.get("cacheContainer");
if (cacheContainer != null) {
initContainerManaged(cacheContainer);
} else {
initEmbedded();
}
}
}
}
}
private void initContainerManaged(String cacheContainerLookup) {
try {
cacheManager = (EmbeddedCacheManager) new InitialContext().lookup(cacheContainerLookup);
containerManaged = true;
logger.debugv("Using container managed Infinispan cache container, lookup={1}", cacheContainerLookup);
} catch (Exception e) {
throw new RuntimeException("Failed to retrieve cache container", e);
}
}
private void initEmbedded() {
GlobalConfigurationBuilder gcb = new GlobalConfigurationBuilder();
boolean clustered = config.getBoolean("clustered", false);
boolean async = config.getBoolean("async", true);
boolean allowDuplicateJMXDomains = config.getBoolean("allowDuplicateJMXDomains", true);
if (clustered) {
gcb.transport().defaultTransport();
}
gcb.globalJmxStatistics().allowDuplicateDomains(allowDuplicateJMXDomains);
cacheManager = new DefaultCacheManager(gcb.build());
containerManaged = false;
logger.debug("Started embedded Infinispan cache container");
ConfigurationBuilder invalidationConfigBuilder = new ConfigurationBuilder();
if (clustered) {
invalidationConfigBuilder.clustering().cacheMode(async ? CacheMode.INVALIDATION_ASYNC : CacheMode.INVALIDATION_SYNC);
}
Configuration invalidationCacheConfiguration = invalidationConfigBuilder.build();
cacheManager.defineConfiguration(InfinispanConnectionProvider.REALM_CACHE_NAME, invalidationCacheConfiguration);
cacheManager.defineConfiguration(InfinispanConnectionProvider.USER_CACHE_NAME, invalidationCacheConfiguration);
ConfigurationBuilder sessionConfigBuilder = new ConfigurationBuilder();
if (clustered) {
String sessionsMode = config.get("sessionsMode", "distributed");
if (sessionsMode.equalsIgnoreCase("replicated")) {
sessionConfigBuilder.clustering().cacheMode(async ? CacheMode.REPL_ASYNC : CacheMode.REPL_SYNC);
} else if (sessionsMode.equalsIgnoreCase("distributed")) {
sessionConfigBuilder.clustering().cacheMode(async ? CacheMode.DIST_ASYNC : CacheMode.DIST_SYNC);
} else {
throw new RuntimeException("Invalid value for sessionsMode");
}
sessionConfigBuilder.clustering().hash()
.numOwners(config.getInt("sessionsOwners", 2))
.numSegments(config.getInt("sessionsSegments", 60)).build();
}
Configuration sessionCacheConfiguration = sessionConfigBuilder.build();
cacheManager.defineConfiguration(InfinispanConnectionProvider.SESSION_CACHE_NAME, sessionCacheConfiguration);
cacheManager.defineConfiguration(InfinispanConnectionProvider.LOGIN_FAILURE_CACHE_NAME, sessionCacheConfiguration);
}
}
@@ -0,0 +1,18 @@
package org.keycloak.connections.infinispan;
import org.infinispan.Cache;
import org.keycloak.provider.Provider;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public interface InfinispanConnectionProvider extends Provider {
static final String REALM_CACHE_NAME = "realms";
static final String USER_CACHE_NAME = "users";
static final String SESSION_CACHE_NAME = "sessions";
static final String LOGIN_FAILURE_CACHE_NAME = "loginFailures";
<K, V> Cache<K, V> getCache(String name);
}
@@ -0,0 +1,9 @@
package org.keycloak.connections.infinispan;
import org.keycloak.provider.ProviderFactory;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public interface InfinispanConnectionProviderFactory extends ProviderFactory<InfinispanConnectionProvider> {
}
@@ -0,0 +1,27 @@
package org.keycloak.connections.infinispan;
import org.keycloak.provider.Provider;
import org.keycloak.provider.ProviderFactory;
import org.keycloak.provider.Spi;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public class InfinispanConnectionSpi implements Spi {
@Override
public String getName() {
return "connectionsInfinispan";
}
@Override
public Class<? extends Provider> getProviderClass() {
return InfinispanConnectionProvider.class;
}
@Override
public Class<? extends ProviderFactory> getProviderFactoryClass() {
return InfinispanConnectionProviderFactory.class;
}
}
@@ -0,0 +1 @@
org.keycloak.connections.infinispan.DefaultInfinispanConnectionProviderFactory
@@ -0,0 +1 @@
org.keycloak.connections.infinispan.InfinispanConnectionSpi
+78
View File
@@ -0,0 +1,78 @@
<?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.2.0.Beta1</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>keycloak-connections-jpa-liquibase</artifactId>
<name>Keycloak Connections JPA Liquibase Updater</name>
<description/>
<dependencies>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-connections-jpa</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-model-api</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
<exclusions>
<exclusion>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.jboss.logging</groupId>
<artifactId>jboss-logging</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-maven-plugin</artifactId>
<configuration>
<changeLogFile>META-INF/jpa-changelog-master.xml</changeLogFile>
<url>${url}</url>
<driver>${driver}</driver>
<username>${username}</username>
<password>${password}</password>
<referenceUrl>${referenceUrl}</referenceUrl>
<referenceDriver>${driver}</referenceDriver>
<referenceUsername>${username}</referenceUsername>
<referencePassword>${password}</referencePassword>
</configuration>
<dependencies>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>${h2.version}</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
<properties>
<username>sa</username>
<password></password>
<driver>org.h2.Driver</driver>
</properties>
</project>
@@ -0,0 +1,231 @@
package org.keycloak.connections.jpa.updater.liquibase;
import liquibase.Contexts;
import liquibase.Liquibase;
import liquibase.changelog.ChangeSet;
import liquibase.changelog.DatabaseChangeLog;
import liquibase.changelog.RanChangeSet;
import liquibase.database.Database;
import liquibase.database.DatabaseFactory;
import liquibase.database.core.DB2Database;
import liquibase.database.core.DerbyDatabase;
import liquibase.database.core.FirebirdDatabase;
import liquibase.database.core.H2Database;
import liquibase.database.core.HsqlDatabase;
import liquibase.database.core.InformixDatabase;
import liquibase.database.core.MSSQLDatabase;
import liquibase.database.core.MySQLDatabase;
import liquibase.database.core.OracleDatabase;
import liquibase.database.core.PostgresDatabase;
import liquibase.database.core.SQLiteDatabase;
import liquibase.database.core.SybaseASADatabase;
import liquibase.database.core.SybaseDatabase;
import liquibase.database.jvm.JdbcConnection;
import liquibase.exception.LiquibaseException;
import liquibase.logging.LogFactory;
import liquibase.logging.LogLevel;
import liquibase.resource.ClassLoaderResourceAccessor;
import liquibase.servicelocator.ServiceLocator;
import org.jboss.logging.Logger;
import org.keycloak.connections.jpa.updater.JpaUpdaterProvider;
import org.keycloak.models.KeycloakSession;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public class LiquibaseJpaUpdaterProvider implements JpaUpdaterProvider {
private static final Logger logger = Logger.getLogger(LiquibaseJpaUpdaterProvider.class);
private static final String CHANGELOG = "META-INF/jpa-changelog-master.xml";
@Override
public String getCurrentVersionSql() {
return "SELECT ID from DATABASECHANGELOG ORDER BY DATEEXECUTED DESC LIMIT 1";
}
@Override
public void update(KeycloakSession session, Connection connection) {
logger.debug("Starting database update");
// Need ThreadLocal as liquibase doesn't seem to have API to inject custom objects into tasks
ThreadLocalSessionContext.setCurrentSession(session);
try {
Liquibase liquibase = getLiquibase(connection);
List<ChangeSet> changeSets = liquibase.listUnrunChangeSets((Contexts) null);
if (!changeSets.isEmpty()) {
if (changeSets.get(0).getId().equals(FIRST_VERSION)) {
Statement statement = connection.createStatement();
try {
statement.executeQuery("SELECT id FROM REALM");
logger.infov("Updating database from {0} to {1}", FIRST_VERSION, changeSets.get(changeSets.size() - 1).getId());
liquibase.markNextChangeSetRan(null);
} catch (SQLException e) {
logger.info("Initializing database schema");
}
} else {
if (logger.isDebugEnabled()) {
List<RanChangeSet> ranChangeSets = liquibase.getDatabase().getRanChangeSetList();
logger.debugv("Updating database from {0} to {1}", ranChangeSets.get(ranChangeSets.size() - 1).getId(), changeSets.get(changeSets.size() - 1).getId());
} else {
logger.infov("Updating database");
}
}
liquibase.update((Contexts) null);
}
} catch (Exception e) {
throw new RuntimeException("Failed to update database", e);
} finally {
ThreadLocalSessionContext.removeCurrentSession();
}
logger.debug("Completed database update");
}
@Override
public void validate(Connection connection) {
try {
Liquibase liquibase = getLiquibase(connection);
liquibase.validate();
} catch (Exception e) {
throw new RuntimeException("Failed to validate database", e);
}
}
private Liquibase getLiquibase(Connection connection) throws Exception {
ServiceLocator sl = ServiceLocator.getInstance();
if (!System.getProperties().containsKey("liquibase.scan.packages")) {
if (sl.getPackages().remove("liquibase.core")) {
sl.addPackageToScan("liquibase.core.xml");
}
if (sl.getPackages().remove("liquibase.parser")) {
sl.addPackageToScan("liquibase.parser.core.xml");
}
if (sl.getPackages().remove("liquibase.serializer")) {
sl.addPackageToScan("liquibase.serializer.core.xml");
}
sl.getPackages().remove("liquibase.ext");
sl.getPackages().remove("liquibase.sdk");
}
LogFactory.setInstance(new LogWrapper());
Database database = DatabaseFactory.getInstance().findCorrectDatabaseImplementation(new JdbcConnection(connection));
return new Liquibase(CHANGELOG, new ClassLoaderResourceAccessor(getClass().getClassLoader()), database);
}
@Override
public void close() {
}
private static class LogWrapper extends LogFactory {
private liquibase.logging.Logger logger = new liquibase.logging.Logger() {
@Override
public void setName(String name) {
}
@Override
public void setLogLevel(String level) {
}
@Override
public void setLogLevel(LogLevel level) {
}
@Override
public void setLogLevel(String logLevel, String logFile) {
}
@Override
public void severe(String message) {
LiquibaseJpaUpdaterProvider.logger.error(message);
}
@Override
public void severe(String message, Throwable e) {
LiquibaseJpaUpdaterProvider.logger.error(message, e);
}
@Override
public void warning(String message) {
LiquibaseJpaUpdaterProvider.logger.warn(message);
}
@Override
public void warning(String message, Throwable e) {
LiquibaseJpaUpdaterProvider.logger.warn(message, e);
}
@Override
public void info(String message) {
LiquibaseJpaUpdaterProvider.logger.debug(message);
}
@Override
public void info(String message, Throwable e) {
LiquibaseJpaUpdaterProvider.logger.debug(message, e);
}
@Override
public void debug(String message) {
LiquibaseJpaUpdaterProvider.logger.trace(message);
}
@Override
public LogLevel getLogLevel() {
if (LiquibaseJpaUpdaterProvider.logger.isTraceEnabled()) {
return LogLevel.DEBUG;
} else if (LiquibaseJpaUpdaterProvider.logger.isDebugEnabled()) {
return LogLevel.INFO;
} else {
return LogLevel.WARNING;
}
}
@Override
public void debug(String message, Throwable e) {
LiquibaseJpaUpdaterProvider.logger.trace(message, e);
}
@Override
public void setChangeLog(DatabaseChangeLog databaseChangeLog) {
}
@Override
public void setChangeSet(ChangeSet changeSet) {
}
@Override
public int getPriority() {
return 0;
}
};
@Override
public liquibase.logging.Logger getLog(String name) {
return logger;
}
@Override
public liquibase.logging.Logger getLog() {
return logger;
}
}
}
@@ -0,0 +1,37 @@
package org.keycloak.connections.jpa.updater.liquibase;
import org.keycloak.Config;
import org.keycloak.connections.jpa.updater.JpaUpdaterProvider;
import org.keycloak.connections.jpa.updater.JpaUpdaterProviderFactory;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.KeycloakSessionFactory;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public class LiquibaseJpaUpdaterProviderFactory implements JpaUpdaterProviderFactory {
@Override
public JpaUpdaterProvider create(KeycloakSession session) {
return new LiquibaseJpaUpdaterProvider();
}
@Override
public void init(Config.Scope config) {
}
@Override
public void postInit(KeycloakSessionFactory factory) {
}
@Override
public void close() {
}
@Override
public String getId() {
return "liquibase";
}
}
@@ -0,0 +1,23 @@
package org.keycloak.connections.jpa.updater.liquibase;
import org.keycloak.models.KeycloakSession;
/**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
*/
public class ThreadLocalSessionContext {
private static final ThreadLocal<KeycloakSession> currentSession = new ThreadLocal<KeycloakSession>();
public static KeycloakSession getCurrentSession() {
return currentSession.get();
}
public static void setCurrentSession(KeycloakSession session) {
currentSession.set(session);
}
public static void removeCurrentSession() {
currentSession.remove();
}
}
@@ -0,0 +1,85 @@
package org.keycloak.connections.jpa.updater.liquibase.custom;
import liquibase.change.custom.CustomSqlChange;
import liquibase.database.Database;
import liquibase.database.jvm.JdbcConnection;
import liquibase.exception.CustomChangeException;
import liquibase.exception.SetupException;
import liquibase.exception.ValidationErrors;
import liquibase.resource.ResourceAccessor;
import liquibase.snapshot.SnapshotGeneratorFactory;
import liquibase.statement.SqlStatement;
import liquibase.statement.core.UpdateStatement;
import liquibase.structure.core.Schema;
import liquibase.structure.core.Table;
import org.keycloak.models.utils.KeycloakModelUtils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.util.ArrayList;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public class AddRealmCodeSecret implements CustomSqlChange {
private String confirmationMessage;
@Override
public SqlStatement[] generateStatements(Database database) throws CustomChangeException {
try {
StringBuilder sb = new StringBuilder();
sb.append("Generated codeSecret for realms: ");
Connection connection = ((JdbcConnection) (database.getConnection())).getWrappedConnection();
ArrayList<SqlStatement> statements = new ArrayList<SqlStatement>();
String correctedTableName = database.correctObjectName("REALM", Table.class);
if (SnapshotGeneratorFactory.getInstance().has(new Table().setName(correctedTableName), database)) {
ResultSet resultSet = connection.createStatement().executeQuery("SELECT ID FROM REALM WHERE CODE_SECRET IS NULL");
while (resultSet.next()) {
String id = resultSet.getString(1);
UpdateStatement statement = new UpdateStatement(null, null, correctedTableName)
.addNewColumnValue("CODE_SECRET", KeycloakModelUtils.generateCodeSecret())
.setWhereClause("ID='" + id + "'");
statements.add(statement);
if (!resultSet.isFirst()) {
sb.append(", ");
}
sb.append(id);
}
if (!statements.isEmpty()) {
confirmationMessage = sb.toString();
}
}
return statements.toArray(new SqlStatement[statements.size()]);
} catch (Exception e) {
throw new CustomChangeException("Failed to add realm code secret", e);
}
}
@Override
public String getConfirmationMessage() {
return confirmationMessage;
}
@Override
public void setUp() throws SetupException {
}
@Override
public void setFileOpener(ResourceAccessor resourceAccessor) {
}
@Override
public ValidationErrors validate(Database database) {
return null;
}
}
Loaded 100 of 2812 files, more files were not shown because too many files have changed in this diff. Show more