keycloak-aplcache
Changes
.gitignore 4(+4 -0)
.travis.yml 1(+1 -0)
adapters/oidc/wildfly-elytron/src/main/java/org/keycloak/adapters/elytron/ElytronHttpFacade.java 5(+5 -0)
adapters/oidc/wildfly-elytron/src/main/java/org/keycloak/adapters/elytron/KeycloakHttpServerAuthenticationMechanism.java 2(+1 -1)
adapters/saml/wildfly-elytron/src/main/java/org/keycloak/adapters/saml/elytron/ElytronHttpFacade.java 15(+8 -7)
adapters/saml/wildfly-elytron/src/main/java/org/keycloak/adapters/saml/elytron/KeycloakHttpServerAuthenticationMechanism.java 2(+1 -1)
pom.xml 1(+1 -0)
saml-core/src/main/java/org/keycloak/saml/processing/core/saml/v2/writers/SAMLAssertionWriter.java 11(+10 -1)
saml-core/src/main/java/org/keycloak/saml/processing/core/saml/v2/writers/SAMLResponseWriter.java 11(+10 -1)
services/pom.xml 6(+6 -0)
services/src/main/java/org/keycloak/authentication/authenticators/broker/IdpEmailVerificationAuthenticator.java 2(+1 -1)
services/src/test/resources/org/keycloak/test/broker/saml/saml-response-ds-ns-above-signature.xml 89(+89 -0)
services/src/test/resources/org/keycloak/test/broker/saml/saml-response-ds-ns-in-signature.xml 88(+88 -0)
themes/pom.xml 44(+44 -0)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular/angular.js 33372(+0 -33372)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular/angular.min.js 332(+0 -332)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular/angular.min.js.gzip 0(+0 -0)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular/angular.min.js.map 8(+0 -8)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular/angular-csp.css 21(+0 -21)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular/LICENSE.md 21(+0 -21)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular/package.json 25(+0 -25)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-cookies/angular-cookies.js 331(+0 -331)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-cookies/angular-cookies.min.js 9(+0 -9)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-cookies/angular-cookies.min.js.map 8(+0 -8)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-cookies/bower.json 10(+0 -10)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-cookies/index.js 2(+0 -2)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-cookies/LICENSE.md 21(+0 -21)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-cookies/package.json 33(+0 -33)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-cookies/README.md 68(+0 -68)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-loader/angular-loader.js 533(+0 -533)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-loader/angular-loader.min.js 10(+0 -10)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-loader/angular-loader.min.js.map 8(+0 -8)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-loader/bower.json 10(+0 -10)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-loader/LICENSE.md 21(+0 -21)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-loader/package.json 33(+0 -33)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-loader/README.md 65(+0 -65)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-resource/angular-resource.js 858(+0 -858)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-resource/angular-resource.min.js 15(+0 -15)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-resource/angular-resource.min.js.map 8(+0 -8)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-resource/bower.json 10(+0 -10)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-resource/index.js 2(+0 -2)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-resource/LICENSE.md 21(+0 -21)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-resource/package.json 33(+0 -33)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-resource/README.md 68(+0 -68)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-route/angular-route.js 1229(+0 -1229)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-route/angular-route.min.js 17(+0 -17)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-route/angular-route.min.js.map 8(+0 -8)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-route/bower.json 10(+0 -10)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-route/index.js 2(+0 -2)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-route/LICENSE.md 21(+0 -21)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-route/package.json 33(+0 -33)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-route/README.md 68(+0 -68)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-sanitize/angular-sanitize.js 756(+0 -756)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-sanitize/angular-sanitize.min.js 16(+0 -16)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-sanitize/angular-sanitize.min.js.map 8(+0 -8)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-sanitize/bower.json 10(+0 -10)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-sanitize/index.js 2(+0 -2)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-sanitize/LICENSE.md 21(+0 -21)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-sanitize/package.json 33(+0 -33)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-sanitize/README.md 68(+0 -68)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-translate/.npmignore 26(+0 -26)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-translate/.nvmrc 1(+0 -1)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-translate/CHANGELOG.md 916(+0 -916)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-translate/dist/angular-translate.js 3709(+0 -3709)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-translate/dist/angular-translate.min.js 6(+0 -6)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-translate/dist/angular-translate-handler-log/angular-translate-handler-log.js 50(+0 -50)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-translate/dist/angular-translate-handler-log/angular-translate-handler-log.min.js 6(+0 -6)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-translate/dist/angular-translate-interpolation-messageformat/angular-translate-interpolation-messageformat.js 197(+0 -197)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-translate/dist/angular-translate-interpolation-messageformat/angular-translate-interpolation-messageformat.min.js 6(+0 -6)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-translate/dist/angular-translate-loader-partial/angular-translate-loader-partial.js 557(+0 -557)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-translate/dist/angular-translate-loader-partial/angular-translate-loader-partial.min.js 6(+0 -6)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-translate/dist/angular-translate-loader-static-files/angular-translate-loader-static-files.js 112(+0 -112)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-translate/dist/angular-translate-loader-static-files/angular-translate-loader-static-files.min.js 6(+0 -6)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-translate/dist/angular-translate-loader-url/angular-translate-loader-url.js 73(+0 -73)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-translate/dist/angular-translate-loader-url/angular-translate-loader-url.min.js 6(+0 -6)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-translate/dist/angular-translate-storage-cookie/angular-translate-storage-cookie.js 121(+0 -121)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-translate/dist/angular-translate-storage-cookie/angular-translate-storage-cookie.min.js 6(+0 -6)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-translate/dist/angular-translate-storage-local/angular-translate-storage-local.js 123(+0 -123)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-translate/dist/angular-translate-storage-local/angular-translate-storage-local.min.js 6(+0 -6)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-translate/LICENSE 21(+0 -21)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-translate/package.json 107(+0 -107)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-translate/README.md 88(+0 -88)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-translate-loader-url/angular-translate-loader-url.js 73(+0 -73)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-translate-loader-url/angular-translate-loader-url.min.js 6(+0 -6)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-translate-loader-url/bower.json 12(+0 -12)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-translate-loader-url/package.json 24(+0 -24)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-translate-loader-url/README.md 29(+0 -29)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-treeview/.npmignore 38(+0 -38)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-treeview/build/webpack.config.base.js 52(+0 -52)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-treeview/images/plus.png 0(+0 -0)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-treeview/index.js 7(+0 -7)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-treeview/LICENSE 21(+0 -21)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-treeview/package.json 32(+0 -32)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-treeview/README.md 1(+0 -1)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-treeview/src/tree.js 164(+0 -164)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-treeview/src/view/imgs/file.png 0(+0 -0)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-treeview/src/view/imgs/folder.png 0(+0 -0)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-treeview/src/view/imgs/folder-closed.png 0(+0 -0)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-treeview/src/view/imgs/plus.png 0(+0 -0)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-treeview/src/view/imgs/remove.png 0(+0 -0)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-treeview/src/view/node.html 24(+0 -24)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-treeview/src/view/tree.html 7(+0 -7)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-treeview/src/view/tree.less 33(+0 -33)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-treeview/tree.js 604(+0 -604)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-ui-select2/.bowerrc 3(+0 -3)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-ui-select2/.jshintrc 11(+0 -11)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-ui-select2/.npmignore 3(+0 -3)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-ui-select2/.travis.yml 13(+0 -13)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-ui-select2/bower.json 20(+0 -20)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-ui-select2/CONTRIBUTING.md 8(+0 -8)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-ui-select2/demo/app.js 114(+0 -114)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-ui-select2/demo/bower.json 11(+0 -11)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-ui-select2/demo/index.html 225(+0 -225)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-ui-select2/docs/index.html 47(+0 -47)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-ui-select2/docs/styles.css 4(+0 -4)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-ui-select2/Gruntfile.js 59(+0 -59)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-ui-select2/LICENSE 21(+0 -21)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-ui-select2/package.json 30(+0 -30)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-ui-select2/README.md 173(+0 -173)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-ui-select2/src/select2.js 238(+0 -238)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-ui-select2/test/karma.conf.js 80(+0 -80)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/angular-ui-select2/test/select2Spec.js 411(+0 -411)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/autofill-event/.npmignore 2(+0 -2)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/autofill-event/autofill-event.js 132(+0 -132)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/autofill-event/bower.json 18(+0 -18)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/autofill-event/package.json 24(+0 -24)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/autofill-event/README.md 1(+0 -1)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/CHANGELOG.md 5(+0 -5)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/dist/css/bootstrap.css 6757(+0 -6757)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/dist/css/bootstrap.css.map 1(+0 -1)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/dist/css/bootstrap.min.css 6(+0 -6)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/dist/css/bootstrap.min.css.map 1(+0 -1)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/dist/css/bootstrap-theme.css 587(+0 -587)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/dist/css/bootstrap-theme.css.map 1(+0 -1)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/dist/css/bootstrap-theme.min.css 6(+0 -6)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/dist/css/bootstrap-theme.min.css.map 1(+0 -1)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/dist/fonts/glyphicons-halflings-regular.eot 0(+0 -0)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/dist/fonts/glyphicons-halflings-regular.svg 288(+0 -288)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf 0(+0 -0)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/dist/fonts/glyphicons-halflings-regular.woff 0(+0 -0)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/dist/fonts/glyphicons-halflings-regular.woff2 0(+0 -0)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/dist/js/bootstrap.js 2377(+0 -2377)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/dist/js/bootstrap.min.js 7(+0 -7)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/dist/js/npm.js 13(+0 -13)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/fonts/glyphicons-halflings-regular.eot 0(+0 -0)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/fonts/glyphicons-halflings-regular.svg 288(+0 -288)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/fonts/glyphicons-halflings-regular.ttf 0(+0 -0)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/fonts/glyphicons-halflings-regular.woff 0(+0 -0)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/fonts/glyphicons-halflings-regular.woff2 0(+0 -0)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/grunt/.jshintrc 7(+0 -7)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/grunt/bs-commonjs-generator.js 30(+0 -30)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/grunt/bs-glyphicons-data-generator.js 42(+0 -42)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/grunt/bs-lessdoc-parser.js 237(+0 -237)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/grunt/bs-raw-files-generator.js 44(+0 -44)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/grunt/change-version.js 109(+0 -109)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/grunt/configBridge.json 46(+0 -46)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/grunt/npm-shrinkwrap.json 2679(+0 -2679)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/grunt/sauce_browsers.yml 82(+0 -82)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/Gruntfile.js 511(+0 -511)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/js/affix.js 162(+0 -162)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/js/alert.js 94(+0 -94)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/js/button.js 125(+0 -125)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/js/carousel.js 237(+0 -237)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/js/collapse.js 212(+0 -212)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/js/dropdown.js 165(+0 -165)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/js/modal.js 339(+0 -339)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/js/popover.js 108(+0 -108)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/js/scrollspy.js 172(+0 -172)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/js/tab.js 155(+0 -155)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/js/tooltip.js 520(+0 -520)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/js/transition.js 59(+0 -59)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/alerts.less 73(+0 -73)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/badges.less 66(+0 -66)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/bootstrap.less 56(+0 -56)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/breadcrumbs.less 26(+0 -26)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/button-groups.less 244(+0 -244)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/buttons.less 166(+0 -166)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/carousel.less 270(+0 -270)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/close.less 34(+0 -34)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/code.less 69(+0 -69)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/component-animations.less 33(+0 -33)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/dropdowns.less 216(+0 -216)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/forms.less 613(+0 -613)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/glyphicons.less 305(+0 -305)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/grid.less 84(+0 -84)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/input-groups.less 171(+0 -171)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/jumbotron.less 54(+0 -54)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/labels.less 64(+0 -64)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/list-group.less 130(+0 -130)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/media.less 66(+0 -66)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/mixins.less 40(+0 -40)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/mixins/alerts.less 14(+0 -14)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/mixins/background-variant.less 9(+0 -9)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/mixins/border-radius.less 18(+0 -18)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/mixins/buttons.less 65(+0 -65)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/mixins/center-block.less 7(+0 -7)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/mixins/clearfix.less 22(+0 -22)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/mixins/forms.less 85(+0 -85)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/mixins/gradients.less 59(+0 -59)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/mixins/grid.less 122(+0 -122)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/mixins/grid-framework.less 91(+0 -91)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/mixins/hide-text.less 21(+0 -21)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/mixins/image.less 33(+0 -33)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/mixins/labels.less 12(+0 -12)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/mixins/list-group.less 30(+0 -30)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/mixins/nav-divider.less 10(+0 -10)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/mixins/nav-vertical-align.less 9(+0 -9)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/mixins/opacity.less 8(+0 -8)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/mixins/pagination.less 24(+0 -24)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/mixins/panels.less 24(+0 -24)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/mixins/progress-bar.less 10(+0 -10)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/mixins/reset-filter.less 8(+0 -8)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/mixins/reset-text.less 18(+0 -18)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/mixins/resize.less 6(+0 -6)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/mixins/responsive-visibility.less 15(+0 -15)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/mixins/size.less 10(+0 -10)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/mixins/tab-focus.less 9(+0 -9)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/mixins/table-row.less 28(+0 -28)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/mixins/text-emphasis.less 9(+0 -9)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/mixins/text-overflow.less 8(+0 -8)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/mixins/vendor-prefixes.less 227(+0 -227)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/modals.less 150(+0 -150)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/navbar.less 660(+0 -660)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/navs.less 242(+0 -242)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/normalize.less 424(+0 -424)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/pager.less 54(+0 -54)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/pagination.less 89(+0 -89)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/panels.less 271(+0 -271)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/popovers.less 131(+0 -131)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/print.less 101(+0 -101)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/progress-bars.less 87(+0 -87)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/responsive-embed.less 35(+0 -35)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/responsive-utilities.less 194(+0 -194)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/scaffolding.less 161(+0 -161)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/tables.less 234(+0 -234)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/theme.less 291(+0 -291)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/thumbnails.less 36(+0 -36)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/tooltip.less 101(+0 -101)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/type.less 302(+0 -302)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/utilities.less 55(+0 -55)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/variables.less 869(+0 -869)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/less/wells.less 29(+0 -29)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/package.json 89(+0 -89)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/bootstrap/README.md 142(+0 -142)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/filesaver/.jshintrc 24(+0 -24)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/filesaver/.npmignore 2(+0 -2)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/filesaver/.travis.yml 3(+0 -3)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/filesaver/api.md 110(+0 -110)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/filesaver/devtools/createdocs.js 1(+0 -1)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/filesaver/docs/api.md 110(+0 -110)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/filesaver/docs/footer.md 24(+0 -24)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/filesaver/docs/readme.md 39(+0 -39)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/filesaver/node_modules/.bin/mkdirp 15(+0 -15)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/filesaver/node_modules/.bin/mkdirp.cmd 7(+0 -7)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/filesaver/package.json 36(+0 -36)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/filesaver/README.md 172(+0 -172)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/filesaver/src/changename.js 81(+0 -81)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/filesaver/src/Filesaver.js 213(+0 -213)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/filesaver/test/assets/test.txt 1(+0 -1)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/filesaver/test/filesaver-test.js 173(+0 -173)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/font-awesome/.npmignore 42(+0 -42)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/font-awesome/css/font-awesome.css 2337(+0 -2337)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/font-awesome/css/font-awesome.css.map 7(+0 -7)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/font-awesome/css/font-awesome.min.css 4(+0 -4)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/font-awesome/fonts/FontAwesome.otf 0(+0 -0)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/font-awesome/fonts/fontawesome-webfont.eot 0(+0 -0)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/font-awesome/fonts/fontawesome-webfont.svg 2671(+0 -2671)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/font-awesome/fonts/fontawesome-webfont.ttf 0(+0 -0)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/font-awesome/fonts/fontawesome-webfont.woff 0(+0 -0)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/font-awesome/fonts/fontawesome-webfont.woff2 0(+0 -0)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/font-awesome/HELP-US-OUT.txt 7(+0 -7)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/font-awesome/less/animated.less 34(+0 -34)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/font-awesome/less/bordered-pulled.less 25(+0 -25)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/font-awesome/less/core.less 12(+0 -12)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/font-awesome/less/fixed-width.less 6(+0 -6)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/font-awesome/less/font-awesome.less 18(+0 -18)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/font-awesome/less/icons.less 789(+0 -789)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/font-awesome/less/larger.less 13(+0 -13)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/font-awesome/less/list.less 19(+0 -19)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/font-awesome/less/mixins.less 60(+0 -60)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/font-awesome/less/path.less 15(+0 -15)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/font-awesome/less/rotated-flipped.less 20(+0 -20)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/font-awesome/less/screen-reader.less 5(+0 -5)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/font-awesome/less/stacked.less 20(+0 -20)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/font-awesome/less/variables.less 800(+0 -800)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/font-awesome/package.json 44(+0 -44)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/font-awesome/README.md 106(+0 -106)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/font-awesome/scss/_animated.scss 34(+0 -34)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/font-awesome/scss/_bordered-pulled.scss 25(+0 -25)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/font-awesome/scss/_core.scss 12(+0 -12)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/font-awesome/scss/_fixed-width.scss 6(+0 -6)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/font-awesome/scss/_icons.scss 789(+0 -789)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/font-awesome/scss/_larger.scss 13(+0 -13)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/font-awesome/scss/_list.scss 19(+0 -19)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/font-awesome/scss/_mixins.scss 60(+0 -60)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/font-awesome/scss/_path.scss 15(+0 -15)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/font-awesome/scss/_rotated-flipped.scss 20(+0 -20)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/font-awesome/scss/_screen-reader.scss 5(+0 -5)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/font-awesome/scss/_stacked.scss 20(+0 -20)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/font-awesome/scss/_variables.scss 800(+0 -800)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/font-awesome/scss/font-awesome.scss 18(+0 -18)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/AUTHORS.txt 301(+0 -301)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/dist/core.js 476(+0 -476)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/dist/jquery.js 10253(+0 -10253)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/dist/jquery.min.js 4(+0 -4)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/dist/jquery.min.map 1(+0 -1)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/dist/jquery.slim.js 8160(+0 -8160)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/dist/jquery.slim.min.js 4(+0 -4)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/dist/jquery.slim.min.map 1(+0 -1)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/external/sizzle/dist/sizzle.js 2272(+0 -2272)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/external/sizzle/dist/sizzle.min.js 3(+0 -3)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/external/sizzle/dist/sizzle.min.map 1(+0 -1)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/external/sizzle/LICENSE.txt 36(+0 -36)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/LICENSE.txt 36(+0 -36)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/package.json 97(+0 -97)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/.eslintrc.json 5(+0 -5)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/ajax.js 855(+0 -855)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/ajax/jsonp.js 102(+0 -102)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/ajax/load.js 76(+0 -76)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/ajax/parseXML.js 30(+0 -30)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/ajax/script.js 77(+0 -77)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/ajax/var/location.js 5(+0 -5)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/ajax/var/nonce.js 7(+0 -7)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/ajax/var/rquery.js 5(+0 -5)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/ajax/xhr.js 169(+0 -169)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/attributes.js 13(+0 -13)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/attributes/attr.js 141(+0 -141)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/attributes/classes.js 174(+0 -174)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/attributes/prop.js 143(+0 -143)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/attributes/support.js 33(+0 -33)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/attributes/val.js 190(+0 -190)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/callbacks.js 234(+0 -234)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/core.js 476(+0 -476)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/core/access.js 70(+0 -70)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/core/DOMEval.js 16(+0 -16)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/core/init.js 128(+0 -128)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/core/nodeName.js 13(+0 -13)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/core/parseHTML.js 65(+0 -65)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/core/ready.js 86(+0 -86)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/core/readyException.js 13(+0 -13)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/core/ready-no-deferred.js 96(+0 -96)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/core/stripAndCollapse.js 14(+0 -14)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/core/support.js 20(+0 -20)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/core/var/rsingleTag.js 6(+0 -6)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/css.js 438(+0 -438)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/css/addGetHookIf.js 26(+0 -26)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/css/adjustCSS.js 71(+0 -71)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/css/curCSS.js 65(+0 -65)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/css/hiddenVisibleSelectors.js 15(+0 -15)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/css/showHide.js 105(+0 -105)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/css/support.js 89(+0 -89)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/css/var/cssExpand.js 5(+0 -5)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/css/var/getStyles.js 17(+0 -17)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/css/var/isHiddenWithinTree.js 34(+0 -34)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/css/var/rmargin.js 5(+0 -5)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/css/var/rnumnonpx.js 7(+0 -7)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/css/var/swap.js 26(+0 -26)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/data.js 179(+0 -179)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/data/Data.js 161(+0 -161)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/data/var/acceptData.js 19(+0 -19)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/data/var/dataPriv.js 7(+0 -7)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/data/var/dataUser.js 7(+0 -7)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/deferred.js 391(+0 -391)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/deferred/exceptionHook.js 21(+0 -21)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/deprecated.js 40(+0 -40)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/dimensions.js 56(+0 -56)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/effects.js 699(+0 -699)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/effects/animatedSelector.js 15(+0 -15)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/effects/Tween.js 123(+0 -123)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/event.js 746(+0 -746)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/event/ajax.js 22(+0 -22)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/event/alias.js 29(+0 -29)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/event/focusin.js 55(+0 -55)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/event/support.js 11(+0 -11)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/event/trigger.js 185(+0 -185)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/exports/amd.js 26(+0 -26)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/exports/global.js 34(+0 -34)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/jquery.js 41(+0 -41)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/manipulation.js 488(+0 -488)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/manipulation/_evalUrl.js 23(+0 -23)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/manipulation/buildFragment.js 104(+0 -104)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/manipulation/getAll.js 32(+0 -32)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/manipulation/setGlobalEval.js 22(+0 -22)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/manipulation/support.js 35(+0 -35)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/manipulation/var/rcheckableType.js 5(+0 -5)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/manipulation/var/rscriptType.js 5(+0 -5)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/manipulation/var/rtagName.js 5(+0 -5)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/manipulation/wrapMap.js 29(+0 -29)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/offset.js 229(+0 -229)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/queue.js 145(+0 -145)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/queue/delay.js 24(+0 -24)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/selector.js 3(+0 -3)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/selector-native.js 237(+0 -237)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/selector-sizzle.js 19(+0 -19)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/serialize.js 130(+0 -130)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/traversing.js 191(+0 -191)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/traversing/findFilter.js 106(+0 -106)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/traversing/var/dir.js 22(+0 -22)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/traversing/var/rneedsContext.js 8(+0 -8)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/traversing/var/siblings.js 17(+0 -17)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/var/arr.js 5(+0 -5)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/var/class2type.js 6(+0 -6)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/var/concat.js 7(+0 -7)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/var/document.js 5(+0 -5)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/var/documentElement.js 7(+0 -7)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/var/fnToString.js 7(+0 -7)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/var/getProto.js 5(+0 -5)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/var/hasOwn.js 7(+0 -7)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/var/indexOf.js 7(+0 -7)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/var/ObjectFunctionString.js 7(+0 -7)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/var/pnum.js 5(+0 -5)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/var/push.js 7(+0 -7)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/var/rcssNum.js 9(+0 -9)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/var/rnothtmlwhite.js 8(+0 -8)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/var/slice.js 7(+0 -7)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/var/support.js 6(+0 -6)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/var/toString.js 7(+0 -7)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/jquery/src/wrap.js 77(+0 -77)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/minimist/.travis.yml 4(+0 -4)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/minimist/example/parse.js 2(+0 -2)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/minimist/index.js 187(+0 -187)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/minimist/package.json 40(+0 -40)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/minimist/readme.markdown 73(+0 -73)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/minimist/test/dash.js 24(+0 -24)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/minimist/test/default_bool.js 20(+0 -20)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/minimist/test/dotted.js 16(+0 -16)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/minimist/test/long.js 31(+0 -31)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/minimist/test/parse.js 318(+0 -318)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/minimist/test/parse_modified.js 9(+0 -9)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/minimist/test/short.js 67(+0 -67)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/minimist/test/whitespace.js 8(+0 -8)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/mkdirp/bin/usage.txt 12(+0 -12)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/mkdirp/examples/pow.js 6(+0 -6)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/mkdirp/package.json 27(+0 -27)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/mkdirp/readme.markdown 100(+0 -100)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/mkdirp/test/chmod.js 41(+0 -41)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/mkdirp/test/clobber.js 38(+0 -38)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/mkdirp/test/mkdirp.js 28(+0 -28)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/mkdirp/test/opts_fs.js 29(+0 -29)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/mkdirp/test/opts_fs_sync.js 27(+0 -27)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/mkdirp/test/perm.js 32(+0 -32)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/mkdirp/test/perm_sync.js 36(+0 -36)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/mkdirp/test/race.js 37(+0 -37)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/mkdirp/test/rel.js 32(+0 -32)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/mkdirp/test/return.js 25(+0 -25)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/mkdirp/test/return_sync.js 24(+0 -24)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/mkdirp/test/root.js 19(+0 -19)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/mkdirp/test/sync.js 32(+0 -32)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/mkdirp/test/umask.js 28(+0 -28)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/mkdirp/test/umask_sync.js 32(+0 -32)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/ng-file-upload/dist/FileAPI.flash.swf 0(+0 -0)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/ng-file-upload/dist/FileAPI.js 4313(+0 -4313)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/ng-file-upload/dist/FileAPI.min.js 6(+0 -6)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/ng-file-upload/dist/ng-file-upload.js 2476(+0 -2476)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/ng-file-upload/dist/ng-file-upload.min.js 3(+0 -3)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/ng-file-upload/dist/ng-file-upload-all.js 2898(+0 -2898)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/ng-file-upload/dist/ng-file-upload-all.min.js 3(+0 -3)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/ng-file-upload/dist/ng-file-upload-shim.js 421(+0 -421)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/ng-file-upload/dist/ng-file-upload-shim.min.js 2(+0 -2)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/ng-file-upload/index.js 2(+0 -2)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/ng-file-upload/LICENSE 20(+0 -20)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/ng-file-upload/package.json 42(+0 -42)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/ng-file-upload/README.md 616(+0 -616)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/safename/.jshintrc 24(+0 -24)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/safename/.travis.yml 3(+0 -3)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/safename/bower.json 27(+0 -27)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/safename/docs/api.md 61(+0 -61)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/safename/docs/createdocs.js 1(+0 -1)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/safename/docs/footer.md 24(+0 -24)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/safename/docs/readme.md 45(+0 -45)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/safename/package.json 30(+0 -30)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/safename/README.md 130(+0 -130)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/safename/safename.js 164(+0 -164)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/safename/test/safename-test.js 30(+0 -30)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/select2/component.json 66(+0 -66)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/select2/composer.json 29(+0 -29)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/select2/package.json 20(+0 -20)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/select2/README.md 104(+0 -104)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/select2/release.sh 79(+0 -79)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/select2/select2.css 704(+0 -704)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/select2/select2.jquery.json 36(+0 -36)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/select2/select2.js 3508(+0 -3508)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/select2/select2_locale_ar.js 19(+0 -19)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/select2/select2_locale_az.js 20(+0 -20)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/select2/select2_locale_bg.js 20(+0 -20)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/select2/select2_locale_ca.js 19(+0 -19)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/select2/select2_locale_cs.js 51(+0 -51)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/select2/select2_locale_da.js 19(+0 -19)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/select2/select2_locale_de.js 18(+0 -18)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/select2/select2_locale_el.js 19(+0 -19)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/select2/select2_locale_en.js.template 20(+0 -20)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/select2/select2_locale_es.js 17(+0 -17)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/select2/select2_locale_et.js 19(+0 -19)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/select2/select2_locale_eu.js 45(+0 -45)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/select2/select2_locale_fa.js 21(+0 -21)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/select2/select2_locale_fi.js 30(+0 -30)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/select2/select2_locale_fr.js 18(+0 -18)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/select2/select2_locale_gl.js 45(+0 -45)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/select2/select2_locale_he.js 19(+0 -19)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/select2/select2_locale_hr.js 24(+0 -24)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/select2/select2_locale_hu.js 17(+0 -17)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/select2/select2_locale_id.js 19(+0 -19)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/select2/select2_locale_is.js 17(+0 -17)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/select2/select2_locale_it.js 17(+0 -17)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/select2/select2_locale_ja.js 17(+0 -17)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/select2/select2_locale_ka.js 19(+0 -19)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/select2/select2_locale_ko.js 19(+0 -19)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/select2/select2_locale_lt.js 26(+0 -26)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/select2/select2_locale_lv.js 19(+0 -19)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/select2/select2_locale_mk.js 19(+0 -19)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/select2/select2_locale_ms.js 19(+0 -19)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/select2/select2_locale_nl.js 17(+0 -17)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/select2/select2_locale_no.js 20(+0 -20)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/select2/select2_locale_pl.js 25(+0 -25)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/select2/select2_locale_pt-BR.js 17(+0 -17)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/select2/select2_locale_pt-PT.js 17(+0 -17)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/select2/select2_locale_ro.js 17(+0 -17)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/select2/select2_locale_rs.js 19(+0 -19)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/select2/select2_locale_ru.js 23(+0 -23)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/select2/select2_locale_sk.js 50(+0 -50)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/select2/select2_locale_sv.js 19(+0 -19)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/select2/select2_locale_th.js 19(+0 -19)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/select2/select2_locale_tr.js 19(+0 -19)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/select2/select2_locale_ug-CN.js 16(+0 -16)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/select2/select2_locale_uk.js 25(+0 -25)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/select2/select2_locale_vi.js 20(+0 -20)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/select2/select2_locale_zh-CN.js 16(+0 -16)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/select2/select2_locale_zh-TW.js 16(+0 -16)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/select2/select2-bootstrap.css 87(+0 -87)
themes/src/main/resources/theme/keycloak/common/resources/node_modules/select2/select2-spinner.gif 0(+0 -0)
Details
.gitignore 4(+4 -0)
diff --git a/.gitignore b/.gitignore
index 32e898b..bf5d094 100644
--- a/.gitignore
+++ b/.gitignore
@@ -49,3 +49,7 @@ target
# Maven shade
#############
*dependency-reduced-pom.xml
+
+# nodejs #
+##########
+node_modules
\ No newline at end of file
.travis.yml 1(+1 -0)
diff --git a/.travis.yml b/.travis.yml
index 83b8707..d3ea4f1 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,4 +1,5 @@
language: java
+dist: precise
cache:
cache: false
diff --git a/adapters/oidc/wildfly-elytron/src/main/java/org/keycloak/adapters/elytron/ElytronHttpFacade.java b/adapters/oidc/wildfly-elytron/src/main/java/org/keycloak/adapters/elytron/ElytronHttpFacade.java
index bc2e903..4472af7 100644
--- a/adapters/oidc/wildfly-elytron/src/main/java/org/keycloak/adapters/elytron/ElytronHttpFacade.java
+++ b/adapters/oidc/wildfly-elytron/src/main/java/org/keycloak/adapters/elytron/ElytronHttpFacade.java
@@ -90,6 +90,11 @@ class ElytronHttpFacade implements OIDCHttpFacade {
void authenticationComplete() {
if (securityIdentity != null) {
+ HttpScope requestScope = request.getScope(Scope.EXCHANGE);
+ RefreshableKeycloakSecurityContext keycloakSecurityContext = account.getKeycloakSecurityContext();
+
+ requestScope.setAttachment(KeycloakSecurityContext.class.getName(), keycloakSecurityContext);
+
this.request.authenticationComplete(response -> {
if (!restored) {
responseConsumer.accept(response);
diff --git a/adapters/oidc/wildfly-elytron/src/main/java/org/keycloak/adapters/elytron/KeycloakHttpServerAuthenticationMechanism.java b/adapters/oidc/wildfly-elytron/src/main/java/org/keycloak/adapters/elytron/KeycloakHttpServerAuthenticationMechanism.java
index 3fcf9bf..8d0cd1d 100644
--- a/adapters/oidc/wildfly-elytron/src/main/java/org/keycloak/adapters/elytron/KeycloakHttpServerAuthenticationMechanism.java
+++ b/adapters/oidc/wildfly-elytron/src/main/java/org/keycloak/adapters/elytron/KeycloakHttpServerAuthenticationMechanism.java
@@ -71,7 +71,7 @@ class KeycloakHttpServerAuthenticationMechanism implements HttpServerAuthenticat
AdapterDeploymentContext deploymentContext = getDeploymentContext(request);
if (deploymentContext == null) {
- LOGGER.debugf("Ignoring request for path [%s] from mechanism [%s]. No deployment context found.", request.getRequestURI());
+ LOGGER.debugf("Ignoring request for path [%s] from mechanism [%s]. No deployment context found.", request.getRequestURI(), getMechanismName());
request.noAuthenticationInProgress();
return;
}
diff --git a/adapters/saml/wildfly-elytron/src/main/java/org/keycloak/adapters/saml/elytron/ElytronHttpFacade.java b/adapters/saml/wildfly-elytron/src/main/java/org/keycloak/adapters/saml/elytron/ElytronHttpFacade.java
index 88e96f8..68c6922 100644
--- a/adapters/saml/wildfly-elytron/src/main/java/org/keycloak/adapters/saml/elytron/ElytronHttpFacade.java
+++ b/adapters/saml/wildfly-elytron/src/main/java/org/keycloak/adapters/saml/elytron/ElytronHttpFacade.java
@@ -47,10 +47,8 @@ import org.wildfly.security.auth.callback.AnonymousAuthorizationCallback;
import org.wildfly.security.auth.callback.AuthenticationCompleteCallback;
import org.wildfly.security.auth.callback.SecurityIdentityCallback;
import org.wildfly.security.auth.server.SecurityIdentity;
-import org.wildfly.security.http.HttpAuthenticationException;
import org.wildfly.security.http.HttpScope;
import org.wildfly.security.http.HttpServerCookie;
-import org.wildfly.security.http.HttpServerMechanismsResponder;
import org.wildfly.security.http.HttpServerRequest;
import org.wildfly.security.http.HttpServerResponse;
import org.wildfly.security.http.Scope;
@@ -87,11 +85,14 @@ class ElytronHttpFacade implements HttpFacade {
void authenticationComplete() {
this.securityIdentity = SecurityIdentityUtil.authorize(this.callbackHandler, samlSession.getPrincipal());
- this.request.authenticationComplete(response -> {
- if (!restored) {
- responseConsumer.accept(response);
- }
- }, () -> ((ElytronTokeStore) sessionStore).logout(true));
+
+ if (this.securityIdentity != null) {
+ this.request.authenticationComplete(response -> {
+ if (!restored) {
+ responseConsumer.accept(response);
+ }
+ }, () -> ((ElytronTokeStore) sessionStore).logout(true));
+ }
}
void authenticationCompleteAnonymous() {
diff --git a/adapters/saml/wildfly-elytron/src/main/java/org/keycloak/adapters/saml/elytron/KeycloakHttpServerAuthenticationMechanism.java b/adapters/saml/wildfly-elytron/src/main/java/org/keycloak/adapters/saml/elytron/KeycloakHttpServerAuthenticationMechanism.java
index 9fce501..1f71bae 100644
--- a/adapters/saml/wildfly-elytron/src/main/java/org/keycloak/adapters/saml/elytron/KeycloakHttpServerAuthenticationMechanism.java
+++ b/adapters/saml/wildfly-elytron/src/main/java/org/keycloak/adapters/saml/elytron/KeycloakHttpServerAuthenticationMechanism.java
@@ -65,7 +65,7 @@ class KeycloakHttpServerAuthenticationMechanism implements HttpServerAuthenticat
SamlDeploymentContext deploymentContext = getDeploymentContext(request);
if (deploymentContext == null) {
- LOGGER.debugf("Ignoring request for path [%s] from mechanism [%s]. No deployment context found.", request.getRequestURI());
+ LOGGER.debugf("Ignoring request for path [%s] from mechanism [%s]. No deployment context found.", request.getRequestURI(), getMechanismName());
request.noAuthenticationInProgress();
return;
}
pom.xml 1(+1 -0)
diff --git a/pom.xml b/pom.xml
index 503b101..68efc36 100755
--- a/pom.xml
+++ b/pom.xml
@@ -80,6 +80,7 @@
<sun.jaxb.version>2.2.11</sun.jaxb.version>
<sun.xsom.version>20140925</sun.xsom.version>
<undertow.version>1.4.11.Final</undertow.version>
+ <woodstox.version>5.0.3</woodstox.version>
<xmlsec.version>2.0.5</xmlsec.version>
<!-- Authorization Drools Policy Provider -->
diff --git a/saml-core/src/main/java/org/keycloak/saml/processing/core/saml/v2/writers/SAMLAssertionWriter.java b/saml-core/src/main/java/org/keycloak/saml/processing/core/saml/v2/writers/SAMLAssertionWriter.java
index 867aceb..41461bf 100755
--- a/saml-core/src/main/java/org/keycloak/saml/processing/core/saml/v2/writers/SAMLAssertionWriter.java
+++ b/saml-core/src/main/java/org/keycloak/saml/processing/core/saml/v2/writers/SAMLAssertionWriter.java
@@ -47,6 +47,7 @@ import java.net.URI;
import java.util.List;
import java.util.Set;
+import javax.xml.crypto.dsig.XMLSignature;
import static org.keycloak.saml.common.constants.JBossSAMLURIConstants.ASSERTION_NSURI;
/**
@@ -69,8 +70,17 @@ public class SAMLAssertionWriter extends BaseWriter {
* @throws org.keycloak.saml.common.exceptions.ProcessingException
*/
public void write(AssertionType assertion) throws ProcessingException {
+ write(assertion, false);
+ }
+
+ public void write(AssertionType assertion, boolean forceWriteDsigNamespace) throws ProcessingException {
+ Element sig = assertion.getSignature();
+
StaxUtil.writeStartElement(writer, ASSERTION_PREFIX, JBossSAMLConstants.ASSERTION.get(), ASSERTION_NSURI.get());
StaxUtil.writeNameSpace(writer, ASSERTION_PREFIX, ASSERTION_NSURI.get());
+ if (forceWriteDsigNamespace && sig != null && sig.getPrefix() != null && ! sig.hasAttribute("xmlns:" + sig.getPrefix())) {
+ StaxUtil.writeNameSpace(writer, sig.getPrefix(), XMLSignature.XMLNS);
+ }
StaxUtil.writeDefaultNameSpace(writer, ASSERTION_NSURI.get());
// Attributes
@@ -82,7 +92,6 @@ public class SAMLAssertionWriter extends BaseWriter {
if (issuer != null)
write(issuer, new QName(ASSERTION_NSURI.get(), JBossSAMLConstants.ISSUER.get(), ASSERTION_PREFIX));
- Element sig = assertion.getSignature();
if (sig != null)
StaxUtil.writeDOMElement(writer, sig);
diff --git a/saml-core/src/main/java/org/keycloak/saml/processing/core/saml/v2/writers/SAMLResponseWriter.java b/saml-core/src/main/java/org/keycloak/saml/processing/core/saml/v2/writers/SAMLResponseWriter.java
index 9327a73..d2a59b9 100755
--- a/saml-core/src/main/java/org/keycloak/saml/processing/core/saml/v2/writers/SAMLResponseWriter.java
+++ b/saml-core/src/main/java/org/keycloak/saml/processing/core/saml/v2/writers/SAMLResponseWriter.java
@@ -38,6 +38,7 @@ import javax.xml.stream.XMLStreamWriter;
import java.net.URI;
import java.util.List;
import org.keycloak.dom.saml.v2.protocol.ExtensionsType;
+import javax.xml.crypto.dsig.XMLSignature;
/**
* Write a SAML Response to stream
@@ -63,8 +64,17 @@ public class SAMLResponseWriter extends BaseWriter {
* @throws org.keycloak.saml.common.exceptions.ProcessingException
*/
public void write(ResponseType response) throws ProcessingException {
+ write(response, false);
+ }
+
+ public void write(ResponseType response, boolean forceWriteDsigNamespace) throws ProcessingException {
+ Element sig = response.getSignature();
+
StaxUtil.writeStartElement(writer, PROTOCOL_PREFIX, JBossSAMLConstants.RESPONSE.get(), JBossSAMLURIConstants.PROTOCOL_NSURI.get());
+ if (forceWriteDsigNamespace && sig != null && sig.getPrefix() != null && ! sig.hasAttribute("xmlns:" + sig.getPrefix())) {
+ StaxUtil.writeNameSpace(writer, sig.getPrefix(), XMLSignature.XMLNS);
+ }
StaxUtil.writeNameSpace(writer, PROTOCOL_PREFIX, JBossSAMLURIConstants.PROTOCOL_NSURI.get());
StaxUtil.writeNameSpace(writer, ASSERTION_PREFIX, JBossSAMLURIConstants.ASSERTION_NSURI.get());
@@ -75,7 +85,6 @@ public class SAMLResponseWriter extends BaseWriter {
write(issuer, new QName(JBossSAMLURIConstants.ASSERTION_NSURI.get(), JBossSAMLConstants.ISSUER.get(), ASSERTION_PREFIX));
}
- Element sig = response.getSignature();
if (sig != null) {
StaxUtil.writeDOMElement(writer, sig);
}
services/pom.xml 6(+6 -0)
diff --git a/services/pom.xml b/services/pom.xml
index b5741f9..733b812 100755
--- a/services/pom.xml
+++ b/services/pom.xml
@@ -145,6 +145,12 @@
<artifactId>jackson-annotations</artifactId>
</dependency>
<dependency>
+ <groupId>com.fasterxml.woodstox</groupId>
+ <artifactId>woodstox-core</artifactId>
+ <version>${woodstox.version}</version> <!-- this version has to match that of used in Wildfly -->
+ <scope>test</scope>
+ </dependency>
+ <dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
</dependency>
diff --git a/services/src/main/java/org/keycloak/authentication/authenticators/broker/IdpEmailVerificationAuthenticator.java b/services/src/main/java/org/keycloak/authentication/authenticators/broker/IdpEmailVerificationAuthenticator.java
index ca841d0..d118634 100755
--- a/services/src/main/java/org/keycloak/authentication/authenticators/broker/IdpEmailVerificationAuthenticator.java
+++ b/services/src/main/java/org/keycloak/authentication/authenticators/broker/IdpEmailVerificationAuthenticator.java
@@ -116,7 +116,7 @@ public class IdpEmailVerificationAuthenticator extends AbstractIdpAuthenticator
UriInfo uriInfo = session.getContext().getUri();
AuthenticationSessionModel authSession = context.getAuthenticationSession();
- int validityInSecs = realm.getActionTokenGeneratedByAdminLifespan();
+ int validityInSecs = realm.getActionTokenGeneratedByUserLifespan();
int absoluteExpirationInSecs = Time.currentTime() + validityInSecs;
EventBuilder event = context.getEvent().clone().event(EventType.SEND_IDENTITY_PROVIDER_LINK)
diff --git a/services/src/main/java/org/keycloak/broker/saml/SAMLDataMarshaller.java b/services/src/main/java/org/keycloak/broker/saml/SAMLDataMarshaller.java
index 508fcbd..dc32463 100644
--- a/services/src/main/java/org/keycloak/broker/saml/SAMLDataMarshaller.java
+++ b/services/src/main/java/org/keycloak/broker/saml/SAMLDataMarshaller.java
@@ -51,11 +51,11 @@ public class SAMLDataMarshaller extends DefaultDataMarshaller {
if (obj instanceof ResponseType) {
ResponseType responseType = (ResponseType) obj;
SAMLResponseWriter samlWriter = new SAMLResponseWriter(StaxUtil.getXMLStreamWriter(bos));
- samlWriter.write(responseType);
+ samlWriter.write(responseType, true);
} else if (obj instanceof AssertionType) {
AssertionType assertion = (AssertionType) obj;
SAMLAssertionWriter samlWriter = new SAMLAssertionWriter(StaxUtil.getXMLStreamWriter(bos));
- samlWriter.write(assertion);
+ samlWriter.write(assertion, true);
} else if (obj instanceof AuthnStatementType) {
AuthnStatementType authnStatement = (AuthnStatementType) obj;
SAMLAssertionWriter samlWriter = new SAMLAssertionWriter(StaxUtil.getXMLStreamWriter(bos));
diff --git a/services/src/test/java/org/keycloak/test/broker/saml/SAMLDataMarshallerTest.java b/services/src/test/java/org/keycloak/test/broker/saml/SAMLDataMarshallerTest.java
index 9a68621..c8647f3 100755
--- a/services/src/test/java/org/keycloak/test/broker/saml/SAMLDataMarshallerTest.java
+++ b/services/src/test/java/org/keycloak/test/broker/saml/SAMLDataMarshallerTest.java
@@ -25,17 +25,22 @@ import org.keycloak.dom.saml.v2.assertion.AssertionType;
import org.keycloak.dom.saml.v2.assertion.AuthnStatementType;
import org.keycloak.dom.saml.v2.assertion.NameIDType;
import org.keycloak.dom.saml.v2.protocol.ResponseType;
+import org.keycloak.saml.processing.core.parsers.saml.SAMLParser;
+import java.io.InputStream;
+import org.hamcrest.CoreMatchers;
+import static org.hamcrest.CoreMatchers.instanceOf;
+import static org.junit.Assert.assertThat;
/**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
*/
public class SAMLDataMarshallerTest {
- private static final String TEST_RESPONSE = "<samlp:Response xmlns:samlp=\"urn:oasis:names:tc:SAML:2.0:protocol\" xmlns:saml=\"urn:oasis:names:tc:SAML:2.0:assertion\" ID=\"ID_4804cf50-cd96-4b92-823e-89adaa0c78ba\" Version=\"2.0\" IssueInstant=\"2015-11-06T11:00:33.920Z\" Destination=\"http://localhost:8081/auth/realms/realm-with-broker/broker/kc-saml-idp-basic/endpoint\" InResponseTo=\"ID_c6b90123-f0bb-4c5c-bf9d-388d5bbe467a\"><saml:Issuer xmlns:saml=\"urn:oasis:names:tc:SAML:2.0:assertion\">http://localhost:8082/auth/realms/realm-with-saml-idp-basic</saml:Issuer><samlp:Status><samlp:StatusCode Value=\"urn:oasis:names:tc:SAML:2.0:status:Success\"></samlp:StatusCode></samlp:Status><saml:Assertion xmlns:saml=\"urn:oasis:names:tc:SAML:2.0:assertion\" xmlns=\"urn:oasis:names:tc:SAML:2.0:assertion\" ID=\"ID_29b196c2-d641-45c8-a423-8ed8e54d4cf9\" Version=\"2.0\" IssueInstant=\"2015-11-06T11:00:33.911Z\"><saml:Issuer xmlns:saml=\"urn:oasis:names:tc:SAML:2.0:assertion\">http://localhost:8082/auth/realms/realm-with-saml-idp-basic</saml:Issuer><saml:Subject><saml:NameID xmlns:saml=\"urn:oasis:names:tc:SAML:2.0:assertion\" Format=\"urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified\">test-user</saml:NameID><saml:SubjectConfirmation Method=\"urn:oasis:names:tc:SAML:2.0:cm:bearer\"><saml:SubjectConfirmationData InResponseTo=\"ID_c6b90123-f0bb-4c5c-bf9d-388d5bbe467a\" NotOnOrAfter=\"2015-11-06T11:05:31.911Z\" Recipient=\"http://localhost:8081/auth/realms/realm-with-broker/broker/kc-saml-idp-basic/endpoint\"></saml:SubjectConfirmationData></saml:SubjectConfirmation></saml:Subject><saml:Conditions NotBefore=\"2015-11-06T11:00:31.911Z\" NotOnOrAfter=\"2015-11-06T11:01:31.911Z\"><saml:AudienceRestriction><saml:Audience>http://localhost:8081/auth/realms/realm-with-broker</saml:Audience></saml:AudienceRestriction></saml:Conditions><saml:AuthnStatement AuthnInstant=\"2015-11-06T11:00:33.923Z\" SessionIndex=\"fa0f4fd3-8a11-44f4-9acb-ee30c5bb8fe5\"><saml:AuthnContext><saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:unspecified</saml:AuthnContextClassRef></saml:AuthnContext></saml:AuthnStatement><saml:AttributeStatement><saml:Attribute Name=\"mobile\" NameFormat=\"urn:oasis:names:tc:SAML:2.0:attrname-format:basic\"><saml:AttributeValue xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xsi:type=\"xs:string\">617-666-7777</saml:AttributeValue></saml:Attribute><saml:Attribute Name=\"urn:oid:1.2.840.113549.1.9.1\" FriendlyName=\"email\" NameFormat=\"urn:oasis:names:tc:SAML:2.0:attrname-format:basic\"><saml:AttributeValue xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xsi:type=\"xs:string\">test-user@localhost</saml:AttributeValue></saml:Attribute></saml:AttributeStatement><saml:AttributeStatement><saml:Attribute Name=\"Role\" NameFormat=\"urn:oasis:names:tc:SAML:2.0:attrname-format:basic\"><saml:AttributeValue xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xsi:type=\"xs:string\">manager</saml:AttributeValue></saml:Attribute></saml:AttributeStatement></saml:Assertion></samlp:Response>";
+ private static final String TEST_RESPONSE = "<samlp:Response xmlns:samlp=\"urn:oasis:names:tc:SAML:2.0:protocol\" xmlns:saml=\"urn:oasis:names:tc:SAML:2.0:assertion\" ID=\"ID_4804cf50-cd96-4b92-823e-89adaa0c78ba\" Version=\"2.0\" IssueInstant=\"2015-11-06T11:00:33.920Z\" Destination=\"http://localhost:8081/auth/realms/realm-with-broker/broker/kc-saml-idp-basic/endpoint\" InResponseTo=\"ID_c6b90123-f0bb-4c5c-bf9d-388d5bbe467a\"><saml:Issuer xmlns:saml=\"urn:oasis:names:tc:SAML:2.0:assertion\">http://localhost:8082/auth/realms/realm-with-saml-idp-basic</saml:Issuer><samlp:Status><samlp:StatusCode Value=\"urn:oasis:names:tc:SAML:2.0:status:Success\"/></samlp:Status><saml:Assertion xmlns:saml=\"urn:oasis:names:tc:SAML:2.0:assertion\" xmlns=\"urn:oasis:names:tc:SAML:2.0:assertion\" ID=\"ID_29b196c2-d641-45c8-a423-8ed8e54d4cf9\" Version=\"2.0\" IssueInstant=\"2015-11-06T11:00:33.911Z\"><saml:Issuer xmlns:saml=\"urn:oasis:names:tc:SAML:2.0:assertion\">http://localhost:8082/auth/realms/realm-with-saml-idp-basic</saml:Issuer><saml:Subject><saml:NameID xmlns:saml=\"urn:oasis:names:tc:SAML:2.0:assertion\" Format=\"urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified\">test-user</saml:NameID><saml:SubjectConfirmation Method=\"urn:oasis:names:tc:SAML:2.0:cm:bearer\"><saml:SubjectConfirmationData InResponseTo=\"ID_c6b90123-f0bb-4c5c-bf9d-388d5bbe467a\" NotOnOrAfter=\"2015-11-06T11:05:31.911Z\" Recipient=\"http://localhost:8081/auth/realms/realm-with-broker/broker/kc-saml-idp-basic/endpoint\"/></saml:SubjectConfirmation></saml:Subject><saml:Conditions NotBefore=\"2015-11-06T11:00:31.911Z\" NotOnOrAfter=\"2015-11-06T11:01:31.911Z\"><saml:AudienceRestriction><saml:Audience>http://localhost:8081/auth/realms/realm-with-broker</saml:Audience></saml:AudienceRestriction></saml:Conditions><saml:AuthnStatement AuthnInstant=\"2015-11-06T11:00:33.923Z\" SessionIndex=\"fa0f4fd3-8a11-44f4-9acb-ee30c5bb8fe5\"><saml:AuthnContext><saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:unspecified</saml:AuthnContextClassRef></saml:AuthnContext></saml:AuthnStatement><saml:AttributeStatement><saml:Attribute Name=\"mobile\" NameFormat=\"urn:oasis:names:tc:SAML:2.0:attrname-format:basic\"><saml:AttributeValue xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xsi:type=\"xs:string\">617-666-7777</saml:AttributeValue></saml:Attribute><saml:Attribute Name=\"urn:oid:1.2.840.113549.1.9.1\" FriendlyName=\"email\" NameFormat=\"urn:oasis:names:tc:SAML:2.0:attrname-format:basic\"><saml:AttributeValue xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xsi:type=\"xs:string\">test-user@localhost</saml:AttributeValue></saml:Attribute></saml:AttributeStatement><saml:AttributeStatement><saml:Attribute Name=\"Role\" NameFormat=\"urn:oasis:names:tc:SAML:2.0:attrname-format:basic\"><saml:AttributeValue xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xsi:type=\"xs:string\">manager</saml:AttributeValue></saml:Attribute></saml:AttributeStatement></saml:Assertion></samlp:Response>";
- private static final String TEST_ASSERTION = "<saml:Assertion xmlns:saml=\"urn:oasis:names:tc:SAML:2.0:assertion\" xmlns=\"urn:oasis:names:tc:SAML:2.0:assertion\" ID=\"ID_29b196c2-d641-45c8-a423-8ed8e54d4cf9\" Version=\"2.0\" IssueInstant=\"2015-11-06T11:00:33.911Z\"><saml:Issuer xmlns:saml=\"urn:oasis:names:tc:SAML:2.0:assertion\">http://localhost:8082/auth/realms/realm-with-saml-idp-basic</saml:Issuer><saml:Subject><saml:NameID xmlns:saml=\"urn:oasis:names:tc:SAML:2.0:assertion\" Format=\"urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified\">test-user</saml:NameID><saml:SubjectConfirmation Method=\"urn:oasis:names:tc:SAML:2.0:cm:bearer\"><saml:SubjectConfirmationData InResponseTo=\"ID_c6b90123-f0bb-4c5c-bf9d-388d5bbe467a\" NotOnOrAfter=\"2015-11-06T11:05:31.911Z\" Recipient=\"http://localhost:8081/auth/realms/realm-with-broker/broker/kc-saml-idp-basic/endpoint\"></saml:SubjectConfirmationData></saml:SubjectConfirmation></saml:Subject><saml:Conditions NotBefore=\"2015-11-06T11:00:31.911Z\" NotOnOrAfter=\"2015-11-06T11:01:31.911Z\"><saml:AudienceRestriction><saml:Audience>http://localhost:8081/auth/realms/realm-with-broker</saml:Audience></saml:AudienceRestriction></saml:Conditions><saml:AuthnStatement AuthnInstant=\"2015-11-06T11:00:33.923Z\" SessionIndex=\"fa0f4fd3-8a11-44f4-9acb-ee30c5bb8fe5\"><saml:AuthnContext><saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:unspecified</saml:AuthnContextClassRef></saml:AuthnContext></saml:AuthnStatement><saml:AttributeStatement><saml:Attribute Name=\"mobile\" NameFormat=\"urn:oasis:names:tc:SAML:2.0:attrname-format:basic\"><saml:AttributeValue xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xsi:type=\"xs:string\">617-666-7777</saml:AttributeValue></saml:Attribute><saml:Attribute Name=\"urn:oid:1.2.840.113549.1.9.1\" FriendlyName=\"email\" NameFormat=\"urn:oasis:names:tc:SAML:2.0:attrname-format:basic\"><saml:AttributeValue xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xsi:type=\"xs:string\">test-user@localhost</saml:AttributeValue></saml:Attribute></saml:AttributeStatement><saml:AttributeStatement><saml:Attribute Name=\"Role\" NameFormat=\"urn:oasis:names:tc:SAML:2.0:attrname-format:basic\"><saml:AttributeValue xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xsi:type=\"xs:string\">manager</saml:AttributeValue></saml:Attribute></saml:AttributeStatement></saml:Assertion>";
+ private static final String TEST_ASSERTION = "<saml:Assertion xmlns:saml=\"urn:oasis:names:tc:SAML:2.0:assertion\" xmlns=\"urn:oasis:names:tc:SAML:2.0:assertion\" ID=\"ID_29b196c2-d641-45c8-a423-8ed8e54d4cf9\" Version=\"2.0\" IssueInstant=\"2015-11-06T11:00:33.911Z\"><saml:Issuer xmlns:saml=\"urn:oasis:names:tc:SAML:2.0:assertion\">http://localhost:8082/auth/realms/realm-with-saml-idp-basic</saml:Issuer><saml:Subject><saml:NameID xmlns:saml=\"urn:oasis:names:tc:SAML:2.0:assertion\" Format=\"urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified\">test-user</saml:NameID><saml:SubjectConfirmation Method=\"urn:oasis:names:tc:SAML:2.0:cm:bearer\"><saml:SubjectConfirmationData InResponseTo=\"ID_c6b90123-f0bb-4c5c-bf9d-388d5bbe467a\" NotOnOrAfter=\"2015-11-06T11:05:31.911Z\" Recipient=\"http://localhost:8081/auth/realms/realm-with-broker/broker/kc-saml-idp-basic/endpoint\"/></saml:SubjectConfirmation></saml:Subject><saml:Conditions NotBefore=\"2015-11-06T11:00:31.911Z\" NotOnOrAfter=\"2015-11-06T11:01:31.911Z\"><saml:AudienceRestriction><saml:Audience>http://localhost:8081/auth/realms/realm-with-broker</saml:Audience></saml:AudienceRestriction></saml:Conditions><saml:AuthnStatement AuthnInstant=\"2015-11-06T11:00:33.923Z\" SessionIndex=\"fa0f4fd3-8a11-44f4-9acb-ee30c5bb8fe5\"><saml:AuthnContext><saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:unspecified</saml:AuthnContextClassRef></saml:AuthnContext></saml:AuthnStatement><saml:AttributeStatement><saml:Attribute Name=\"mobile\" NameFormat=\"urn:oasis:names:tc:SAML:2.0:attrname-format:basic\"><saml:AttributeValue xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xsi:type=\"xs:string\">617-666-7777</saml:AttributeValue></saml:Attribute><saml:Attribute Name=\"urn:oid:1.2.840.113549.1.9.1\" FriendlyName=\"email\" NameFormat=\"urn:oasis:names:tc:SAML:2.0:attrname-format:basic\"><saml:AttributeValue xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xsi:type=\"xs:string\">test-user@localhost</saml:AttributeValue></saml:Attribute></saml:AttributeStatement><saml:AttributeStatement><saml:Attribute Name=\"Role\" NameFormat=\"urn:oasis:names:tc:SAML:2.0:attrname-format:basic\"><saml:AttributeValue xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xsi:type=\"xs:string\">manager</saml:AttributeValue></saml:Attribute></saml:AttributeStatement></saml:Assertion>";
- private static final String TEST_ASSERTION_WITH_NAME_ID = "<saml:Assertion xmlns:saml=\"urn:oasis:names:tc:SAML:2.0:assertion\" xmlns=\"urn:oasis:names:tc:SAML:2.0:assertion\" ID=\"ID_29b196c2-d641-45c8-a423-8ed8e54d4cf9\" Version=\"2.0\" IssueInstant=\"2015-11-06T11:00:33.911Z\"><saml:Issuer xmlns:saml=\"urn:oasis:names:tc:SAML:2.0:assertion\">http://localhost:8082/auth/realms/realm-with-saml-idp-basic</saml:Issuer><saml:Subject><saml:NameID xmlns:saml=\"urn:oasis:names:tc:SAML:2.0:assertion\" Format=\"urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified\">test-user</saml:NameID><saml:SubjectConfirmation Method=\"urn:oasis:names:tc:SAML:2.0:cm:bearer\"><saml:SubjectConfirmationData InResponseTo=\"ID_c6b90123-f0bb-4c5c-bf9d-388d5bbe467a\" NotOnOrAfter=\"2015-11-06T11:05:31.911Z\" Recipient=\"http://localhost:8081/auth/realms/realm-with-broker/broker/kc-saml-idp-basic/endpoint\"></saml:SubjectConfirmationData></saml:SubjectConfirmation></saml:Subject><saml:Conditions NotBefore=\"2015-11-06T11:00:31.911Z\" NotOnOrAfter=\"2015-11-06T11:01:31.911Z\"><saml:AudienceRestriction><saml:Audience>http://localhost:8081/auth/realms/realm-with-broker</saml:Audience></saml:AudienceRestriction></saml:Conditions><saml:AuthnStatement AuthnInstant=\"2015-11-06T11:00:33.923Z\" SessionIndex=\"fa0f4fd3-8a11-44f4-9acb-ee30c5bb8fe5\"><saml:AuthnContext><saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:unspecified</saml:AuthnContextClassRef></saml:AuthnContext></saml:AuthnStatement><saml:AttributeStatement><saml:Attribute Name=\"mobile\" NameFormat=\"urn:oasis:names:tc:SAML:2.0:attrname-format:basic\"><saml:AttributeValue xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xsi:type=\"xs:string\">617-666-7777</saml:AttributeValue></saml:Attribute><saml:Attribute Name=\"urn:oid:1.2.840.113549.1.9.1\" FriendlyName=\"email\" NameFormat=\"urn:oasis:names:tc:SAML:2.0:attrname-format:basic\"><saml:AttributeValue xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xsi:type=\"xs:string\">test-user@localhost</saml:AttributeValue></saml:Attribute></saml:AttributeStatement><saml:AttributeStatement><saml:Attribute Name=\"Role\" NameFormat=\"urn:oasis:names:tc:SAML:2.0:attrname-format:basic\"><saml:AttributeValue><saml:NameID xmlns:saml=\"urn:oasis:names:tc:SAML:2.0:assertion\" Format=\"urn:oasis:names:tc:SAML:2.0:nameid-format:persistent\">b2c6275838784dba219c92f53ea5493c8ef4da09</saml:NameID></saml:AttributeValue></saml:Attribute></saml:AttributeStatement></saml:Assertion>";
+ private static final String TEST_ASSERTION_WITH_NAME_ID = "<saml:Assertion xmlns:saml=\"urn:oasis:names:tc:SAML:2.0:assertion\" xmlns=\"urn:oasis:names:tc:SAML:2.0:assertion\" ID=\"ID_29b196c2-d641-45c8-a423-8ed8e54d4cf9\" Version=\"2.0\" IssueInstant=\"2015-11-06T11:00:33.911Z\"><saml:Issuer xmlns:saml=\"urn:oasis:names:tc:SAML:2.0:assertion\">http://localhost:8082/auth/realms/realm-with-saml-idp-basic</saml:Issuer><saml:Subject><saml:NameID xmlns:saml=\"urn:oasis:names:tc:SAML:2.0:assertion\" Format=\"urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified\">test-user</saml:NameID><saml:SubjectConfirmation Method=\"urn:oasis:names:tc:SAML:2.0:cm:bearer\"><saml:SubjectConfirmationData InResponseTo=\"ID_c6b90123-f0bb-4c5c-bf9d-388d5bbe467a\" NotOnOrAfter=\"2015-11-06T11:05:31.911Z\" Recipient=\"http://localhost:8081/auth/realms/realm-with-broker/broker/kc-saml-idp-basic/endpoint\"/></saml:SubjectConfirmation></saml:Subject><saml:Conditions NotBefore=\"2015-11-06T11:00:31.911Z\" NotOnOrAfter=\"2015-11-06T11:01:31.911Z\"><saml:AudienceRestriction><saml:Audience>http://localhost:8081/auth/realms/realm-with-broker</saml:Audience></saml:AudienceRestriction></saml:Conditions><saml:AuthnStatement AuthnInstant=\"2015-11-06T11:00:33.923Z\" SessionIndex=\"fa0f4fd3-8a11-44f4-9acb-ee30c5bb8fe5\"><saml:AuthnContext><saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:unspecified</saml:AuthnContextClassRef></saml:AuthnContext></saml:AuthnStatement><saml:AttributeStatement><saml:Attribute Name=\"mobile\" NameFormat=\"urn:oasis:names:tc:SAML:2.0:attrname-format:basic\"><saml:AttributeValue xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xsi:type=\"xs:string\">617-666-7777</saml:AttributeValue></saml:Attribute><saml:Attribute Name=\"urn:oid:1.2.840.113549.1.9.1\" FriendlyName=\"email\" NameFormat=\"urn:oasis:names:tc:SAML:2.0:attrname-format:basic\"><saml:AttributeValue xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xsi:type=\"xs:string\">test-user@localhost</saml:AttributeValue></saml:Attribute></saml:AttributeStatement><saml:AttributeStatement><saml:Attribute Name=\"Role\" NameFormat=\"urn:oasis:names:tc:SAML:2.0:attrname-format:basic\"><saml:AttributeValue><saml:NameID xmlns:saml=\"urn:oasis:names:tc:SAML:2.0:assertion\" Format=\"urn:oasis:names:tc:SAML:2.0:nameid-format:persistent\">b2c6275838784dba219c92f53ea5493c8ef4da09</saml:NameID></saml:AttributeValue></saml:Attribute></saml:AttributeStatement></saml:Assertion>";
private static final String TEST_AUTHN_TYPE = "<saml:AuthnStatement xmlns:saml=\"urn:oasis:names:tc:SAML:2.0:assertion\" xmlns=\"urn:oasis:names:tc:SAML:2.0:assertion\" AuthnInstant=\"2015-11-06T11:00:33.923Z\" SessionIndex=\"fa0f4fd3-8a11-44f4-9acb-ee30c5bb8fe5\"><saml:AuthnContext><saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:unspecified</saml:AuthnContextClassRef></saml:AuthnContext></saml:AuthnStatement>";
@@ -95,4 +100,40 @@ public class SAMLDataMarshallerTest {
String serialized = serializer.serialize(authnStatement);
Assert.assertEquals(TEST_AUTHN_TYPE, serialized);
}
+
+ @Test
+ public void testSerializeWithNamespaceInSignatureElement() throws Exception {
+ SAMLParser parser = new SAMLParser();
+ try (InputStream st = SAMLDataMarshallerTest.class.getResourceAsStream("saml-response-ds-ns-in-signature.xml")) {
+ Object parsedObject = parser.parse(st);
+ assertThat(parsedObject, instanceOf(ResponseType.class));
+
+ ResponseType response = (ResponseType) parsedObject;
+
+ SAMLDataMarshaller serializer = new SAMLDataMarshaller();
+ String serialized = serializer.serialize(response.getAssertions().get(0).getAssertion());
+
+ AssertionType deserialized = serializer.deserialize(serialized, AssertionType.class);
+ assertThat(deserialized, CoreMatchers.notNullValue());
+ assertThat(deserialized.getID(), CoreMatchers.is("id-4r-Xj702KQsM0gJyu3Fqpuwfe-LvDrEcQZpxKrhC"));
+ }
+ }
+
+ @Test
+ public void testSerializeWithNamespaceNotInSignatureElement() throws Exception {
+ SAMLParser parser = new SAMLParser();
+ try (InputStream st = SAMLDataMarshallerTest.class.getResourceAsStream("saml-response-ds-ns-above-signature.xml")) {
+ Object parsedObject = parser.parse(st);
+ assertThat(parsedObject, instanceOf(ResponseType.class));
+
+ ResponseType response = (ResponseType) parsedObject;
+
+ SAMLDataMarshaller serializer = new SAMLDataMarshaller();
+ String serialized = serializer.serialize(response.getAssertions().get(0).getAssertion());
+
+ AssertionType deserialized = serializer.deserialize(serialized, AssertionType.class);
+ assertThat(deserialized, CoreMatchers.notNullValue());
+ assertThat(deserialized.getID(), CoreMatchers.is("id-4r-Xj702KQsM0gJyu3Fqpuwfe-LvDrEcQZpxKrhC"));
+ }
+ }
}
diff --git a/services/src/test/resources/org/keycloak/test/broker/saml/saml-response-ds-ns-above-signature.xml b/services/src/test/resources/org/keycloak/test/broker/saml/saml-response-ds-ns-above-signature.xml
new file mode 100644
index 0000000..dfa74aa
--- /dev/null
+++ b/services/src/test/resources/org/keycloak/test/broker/saml/saml-response-ds-ns-above-signature.xml
@@ -0,0 +1,89 @@
+<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
+ xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"
+ xmlns:enc="http://www.w3.org/2001/04/xmlenc#"
+ xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
+ xmlns:x500="urn:oasis:names:tc:SAML:2.0:profiles:attribute:X500"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ Destination="http://SERVER/auth/realms/MY_REALM/broker/saml/endpoint"
+ ID="id-EYgqtumZ-P-Ph7t37f-brUKMwB5MKix0sNjr-0YV"
+ IssueInstant="2017-06-28T03:34:26Z"
+ Version="2.0">
+ <saml:Issuer Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">SSO</saml:Issuer>
+ <samlp:Status>
+ <samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success" />
+ </samlp:Status>
+ <saml:Assertion ID="id-4r-Xj702KQsM0gJyu3Fqpuwfe-LvDrEcQZpxKrhC"
+ IssueInstant="2017-06-28T03:34:26Z"
+ Version="2.0"
+ >
+ <saml:Issuer Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">SSO</saml:Issuer>
+ <dsig:Signature>
+ <dsig:SignedInfo>
+ <dsig:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
+ <dsig:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
+ <dsig:Reference URI="#id-4r-Xj702KQsM0gJyu3Fqpuwfe-LvDrEcQZpxKrhC">
+ <dsig:Transforms>
+ <dsig:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
+ <dsig:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
+ </dsig:Transforms>
+ <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
+ <dsig:DigestValue>DIGEST</dsig:DigestValue>
+ </dsig:Reference>
+ </dsig:SignedInfo>
+ <dsig:SignatureValue>SIG_VAL</dsig:SignatureValue>
+ </dsig:Signature>
+ <saml:Subject>
+ <saml:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">my_email@my_provider.com</saml:NameID>
+ <saml:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
+ <saml:SubjectConfirmationData NotOnOrAfter="2017-06-28T03:39:26Z"
+ Recipient="http://SERVER/auth/realms/MY_REALM/broker/saml/endpoint"
+ />
+ </saml:SubjectConfirmation>
+ </saml:Subject>
+ <saml:Conditions NotBefore="2017-06-28T03:34:26Z"
+ NotOnOrAfter="2017-06-28T03:39:26Z"
+ >
+ <saml:AudienceRestriction>
+ <saml:Audience>http://SERVER/auth/realms/MY_REALM</saml:Audience>
+ </saml:AudienceRestriction>
+ </saml:Conditions>
+ <saml:AuthnStatement AuthnInstant="2017-06-28T03:34:26Z"
+ SessionIndex="id-4efQg54WPFyzSEPsepFVZSb8KmeVYtonQNZO1iAE"
+ SessionNotOnOrAfter="2017-06-28T04:34:26Z"
+ >
+ <saml:AuthnContext>
+ <saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</saml:AuthnContextClassRef>
+ </saml:AuthnContext>
+ </saml:AuthnStatement>
+ <saml:AttributeStatement>
+ <saml:Attribute Name="lastName"
+ NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic"
+ >
+ <saml:AttributeValue xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ xsi:type="xs:string"
+ >Yadav</saml:AttributeValue>
+ </saml:Attribute>
+ <saml:Attribute Name="username"
+ NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic"
+ >
+ <saml:AttributeValue xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ xsi:type="xs:string"
+ >H183561</saml:AttributeValue>
+ </saml:Attribute>
+ <saml:Attribute Name="email"
+ NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic"
+ >
+ <saml:AttributeValue xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ xsi:type="xs:string"
+ >my_email@my_provider.com</saml:AttributeValue>
+ </saml:Attribute>
+ <saml:Attribute Name="firstName"
+ NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic"
+ >
+ <saml:AttributeValue xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ xsi:type="xs:string"
+ >MY_NAME</saml:AttributeValue>
+ </saml:Attribute>
+ </saml:AttributeStatement>
+ </saml:Assertion>
+</samlp:Response>
diff --git a/services/src/test/resources/org/keycloak/test/broker/saml/saml-response-ds-ns-in-signature.xml b/services/src/test/resources/org/keycloak/test/broker/saml/saml-response-ds-ns-in-signature.xml
new file mode 100644
index 0000000..8460b8e
--- /dev/null
+++ b/services/src/test/resources/org/keycloak/test/broker/saml/saml-response-ds-ns-in-signature.xml
@@ -0,0 +1,88 @@
+<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
+ xmlns:enc="http://www.w3.org/2001/04/xmlenc#"
+ xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
+ xmlns:x500="urn:oasis:names:tc:SAML:2.0:profiles:attribute:X500"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ Destination="http://SERVER/auth/realms/MY_REALM/broker/saml/endpoint"
+ ID="id-EYgqtumZ-P-Ph7t37f-brUKMwB5MKix0sNjr-0YV"
+ IssueInstant="2017-06-28T03:34:26Z"
+ Version="2.0">
+ <saml:Issuer Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">SSO</saml:Issuer>
+ <samlp:Status>
+ <samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success" />
+ </samlp:Status>
+ <saml:Assertion ID="id-4r-Xj702KQsM0gJyu3Fqpuwfe-LvDrEcQZpxKrhC"
+ IssueInstant="2017-06-28T03:34:26Z"
+ Version="2.0"
+ >
+ <saml:Issuer Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">SSO</saml:Issuer>
+ <dsig:Signature xmlns:dsig="http://www.w3.org/2000/09/xmldsig#">
+ <dsig:SignedInfo>
+ <dsig:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
+ <dsig:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
+ <dsig:Reference URI="#id-4r-Xj702KQsM0gJyu3Fqpuwfe-LvDrEcQZpxKrhC">
+ <dsig:Transforms>
+ <dsig:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
+ <dsig:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
+ </dsig:Transforms>
+ <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
+ <dsig:DigestValue>DIGEST</dsig:DigestValue>
+ </dsig:Reference>
+ </dsig:SignedInfo>
+ <dsig:SignatureValue>SIG_VAL</dsig:SignatureValue>
+ </dsig:Signature>
+ <saml:Subject>
+ <saml:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">my_email@my_provider.com</saml:NameID>
+ <saml:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
+ <saml:SubjectConfirmationData NotOnOrAfter="2017-06-28T03:39:26Z"
+ Recipient="http://SERVER/auth/realms/MY_REALM/broker/saml/endpoint"
+ />
+ </saml:SubjectConfirmation>
+ </saml:Subject>
+ <saml:Conditions NotBefore="2017-06-28T03:34:26Z"
+ NotOnOrAfter="2017-06-28T03:39:26Z"
+ >
+ <saml:AudienceRestriction>
+ <saml:Audience>http://SERVER/auth/realms/MY_REALM</saml:Audience>
+ </saml:AudienceRestriction>
+ </saml:Conditions>
+ <saml:AuthnStatement AuthnInstant="2017-06-28T03:34:26Z"
+ SessionIndex="id-4efQg54WPFyzSEPsepFVZSb8KmeVYtonQNZO1iAE"
+ SessionNotOnOrAfter="2017-06-28T04:34:26Z"
+ >
+ <saml:AuthnContext>
+ <saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</saml:AuthnContextClassRef>
+ </saml:AuthnContext>
+ </saml:AuthnStatement>
+ <saml:AttributeStatement>
+ <saml:Attribute Name="lastName"
+ NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic"
+ >
+ <saml:AttributeValue xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ xsi:type="xs:string"
+ >Yadav</saml:AttributeValue>
+ </saml:Attribute>
+ <saml:Attribute Name="username"
+ NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic"
+ >
+ <saml:AttributeValue xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ xsi:type="xs:string"
+ >H183561</saml:AttributeValue>
+ </saml:Attribute>
+ <saml:Attribute Name="email"
+ NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic"
+ >
+ <saml:AttributeValue xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ xsi:type="xs:string"
+ >my_email@my_provider.com</saml:AttributeValue>
+ </saml:Attribute>
+ <saml:Attribute Name="firstName"
+ NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic"
+ >
+ <saml:AttributeValue xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ xsi:type="xs:string"
+ >MY_NAME</saml:AttributeValue>
+ </saml:Attribute>
+ </saml:AttributeStatement>
+ </saml:Assertion>
+</samlp:Response>
themes/pom.xml 44(+44 -0)
diff --git a/themes/pom.xml b/themes/pom.xml
index e97d0e6..c21dd8f 100755
--- a/themes/pom.xml
+++ b/themes/pom.xml
@@ -50,5 +50,49 @@
</build>
</profile>
</profiles>
+
+ <build>
+ <plugins>
+ <plugin>
+ <artifactId>maven-clean-plugin</artifactId>
+ <configuration>
+ <filesets>
+ <fileset>
+ <directory>src/main/resources/theme/keycloak/common/resources/node_modules</directory>
+ </fileset>
+ </filesets>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>com.github.eirslett</groupId>
+ <artifactId>frontend-maven-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>install node and yarn</id>
+ <goals>
+ <goal>install-node-and-yarn</goal>
+ </goals>
+ <phase>generate-resources</phase>
+ </execution>
+ <execution>
+ <id>yarn install</id>
+ <goals>
+ <goal>yarn</goal>
+ </goals>
+ <phase>process-resources</phase>
+ <configuration>
+ <arguments>install --production=false --frozen-lockfile</arguments>
+ </configuration>
+ </execution>
+ </executions>
+ <configuration>
+ <nodeVersion>v6.11.1</nodeVersion>
+ <yarnVersion>v0.27.5</yarnVersion>
+ <workingDirectory>src/main/resources/theme/keycloak/common/resources</workingDirectory>
+ <installDirectory>target</installDirectory>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
</project>
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/README.md b/themes/src/main/resources/theme/keycloak/common/resources/README.md
new file mode 100644
index 0000000..a5ef852
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/README.md
@@ -0,0 +1,24 @@
+Management of javascript libraries
+===================================================
+
+Javascript libraries under the *./lib* directory are not managed. These
+libraries are not available in the public npm repo and are thus checked into
+GitHub.
+
+Javascript libraries under *./node_modules* directory are managed with yarn.
+THEY SHOULD NOT BE CHECKED INTO GITHUB!
+
+Adding or Removing javascript libraries
+---------------------------------------
+To add/remove/update javascript libraries you should always use yarn so that
+the yarn.lock file will be updated. Then, just check in the modified version
+of package.json and yarn.lock. To do this, you should locally install
+nodejs/npm and yarn.
+
+Do not use *npm install --save*. If you try to update a dependency using
+package.json and fail to update yarn.lock, then the next build will fail.
+
+To locally install nodejs/npm and yarn, see:
+
+* [Install nodejs and npm](https://www.npmjs.com/get-npm)
+* [Install yarn](https://yarnpkg.com/lang/en/docs/install/)