diff --git a/themes/src/main/resources/theme/keycloak/admin/resources/css/styles.css b/themes/src/main/resources/theme/keycloak/admin/resources/css/styles.css
index 6f72a78cb3..8b0a4d36ac 100755
--- a/themes/src/main/resources/theme/keycloak/admin/resources/css/styles.css
+++ b/themes/src/main/resources/theme/keycloak/admin/resources/css/styles.css
@@ -399,4 +399,9 @@ table.kc-authz-table-expanded {
.no-gutter > [class*='col-'] {
padding-right:0!important;
padding-left:0!important;
+}
+
+.password-conceal {
+ font-family: 'text-security-disc';
+ font-size: 14px;
}
\ No newline at end of file
diff --git a/themes/src/main/resources/theme/keycloak/admin/theme.properties b/themes/src/main/resources/theme/keycloak/admin/theme.properties
index 8519d8907c..83e4e92d6c 100755
--- a/themes/src/main/resources/theme/keycloak/admin/theme.properties
+++ b/themes/src/main/resources/theme/keycloak/admin/theme.properties
@@ -1,3 +1,3 @@
parent=base
import=common/keycloak
-styles=lib/patternfly/css/patternfly.css node_modules/select2/select2.css css/styles.css lib/angular/treeview/css/angular.treeview.css
\ No newline at end of file
+styles=lib/patternfly/css/patternfly.css node_modules/select2/select2.css css/styles.css lib/angular/treeview/css/angular.treeview.css node_modules/text-security/dist/text-security.css
\ No newline at end of file
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/.npmignore b/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/.npmignore
new file mode 100644
index 0000000000..2a11bc9b24
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/.npmignore
@@ -0,0 +1,4 @@
+demo.html
+.eslintrc*
+.vscode/
+.idea/
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/LICENSE b/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/LICENSE
new file mode 100644
index 0000000000..a664c94276
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2016 Oskari Noppa
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/README.md b/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/README.md
new file mode 100644
index 0000000000..3f421f24e8
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/README.md
@@ -0,0 +1,52 @@
+# text-security
+Cross-browser alternative to `-webkit-text-security`
+
+This is a simple set of fonts that only consists of 3 different characters.
+Disc
circle
and square
. For example, setting `font-family: "text-security-circle"` for
+an element should then display all the element's characters in a concealed
+way, like it was a password field.
+
+This is useful if you want to get the benefits of `input[type="password"]`
+but also combine that with other element types, like `input[type="tel"]`. In
+fact, the project was created for this exact purpose [as an answer to a
+StackOverflow
+question](https://stackoverflow.com/questions/36935576/how-to-make-input-type-tel-work-as-type-password/36950075#36950075).
+
+## Installation
+```
+npm install text-security
+```
+
+You can use the fonts by adding this repo as a dependency and including
+`dist/text-security.css` in your project, like so
+
+`
`
+
+## Building with custom modifications
+If you want to make your own tweaks, the `npm run build` command has two
+optional arguments for you. By default, 768 different unicode characters are
+included in the fonts, making it reliable for different use-cases but also
+adding quite a big font files as a dependency. You can use the
+`--max={number}` option to reduce the amount of included unicode characters.
+
+If you are feeling wild, you can also add your custom shapes by dropping them
+to *assets* folder and running the build with `--shapes={string}` option. The
+value should be comma-separated list of svg file names (don't include the
+file extension in the name). The default value is `circle,square,disc`.
+The generated css will have class names with `text-security-*` prefix
+followed by the name of the shape, like `text-security-disc`.
+
+## Demo
+*demo.html* contains a proof-of-concept demo file, which you can just open in
+any browser. The same thing can also be found [as a
+fiddle](https://jsfiddle.net/449Lamue/6/). In development, you can also try
+out the library by just including the css using RawGit `
`
\ No newline at end of file
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/assets/circle.svg b/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/assets/circle.svg
new file mode 100644
index 0000000000..32095841b7
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/assets/circle.svg
@@ -0,0 +1,16 @@
+
+
\ No newline at end of file
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/assets/disc.svg b/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/assets/disc.svg
new file mode 100644
index 0000000000..dbee77f1ff
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/assets/disc.svg
@@ -0,0 +1,5 @@
+
+
\ No newline at end of file
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/assets/square.svg b/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/assets/square.svg
new file mode 100644
index 0000000000..60dc8eb3e6
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/assets/square.svg
@@ -0,0 +1,5 @@
+
+
\ No newline at end of file
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/dist/text-security-circle.eot b/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/dist/text-security-circle.eot
new file mode 100644
index 0000000000..6581a44717
Binary files /dev/null and b/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/dist/text-security-circle.eot differ
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/dist/text-security-circle.svg b/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/dist/text-security-circle.svg
new file mode 100644
index 0000000000..4bd8ce8f87
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/dist/text-security-circle.svg
@@ -0,0 +1,2316 @@
+
+
+
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/dist/text-security-circle.ttf b/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/dist/text-security-circle.ttf
new file mode 100644
index 0000000000..0f62fc3805
Binary files /dev/null and b/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/dist/text-security-circle.ttf differ
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/dist/text-security-circle.woff b/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/dist/text-security-circle.woff
new file mode 100644
index 0000000000..675185141c
Binary files /dev/null and b/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/dist/text-security-circle.woff differ
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/dist/text-security-disc.eot b/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/dist/text-security-disc.eot
new file mode 100644
index 0000000000..21f4c8738b
Binary files /dev/null and b/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/dist/text-security-disc.eot differ
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/dist/text-security-disc.svg b/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/dist/text-security-disc.svg
new file mode 100644
index 0000000000..f12aad29c7
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/dist/text-security-disc.svg
@@ -0,0 +1,2316 @@
+
+
+
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/dist/text-security-disc.ttf b/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/dist/text-security-disc.ttf
new file mode 100644
index 0000000000..566a358672
Binary files /dev/null and b/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/dist/text-security-disc.ttf differ
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/dist/text-security-disc.woff b/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/dist/text-security-disc.woff
new file mode 100644
index 0000000000..160d2898ba
Binary files /dev/null and b/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/dist/text-security-disc.woff differ
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/dist/text-security-square.eot b/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/dist/text-security-square.eot
new file mode 100644
index 0000000000..25ec7c68c9
Binary files /dev/null and b/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/dist/text-security-square.eot differ
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/dist/text-security-square.svg b/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/dist/text-security-square.svg
new file mode 100644
index 0000000000..dd80a747c4
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/dist/text-security-square.svg
@@ -0,0 +1,2316 @@
+
+
+
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/dist/text-security-square.ttf b/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/dist/text-security-square.ttf
new file mode 100644
index 0000000000..bea2cf8ec0
Binary files /dev/null and b/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/dist/text-security-square.ttf differ
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/dist/text-security-square.woff b/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/dist/text-security-square.woff
new file mode 100644
index 0000000000..1c4b7a9974
Binary files /dev/null and b/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/dist/text-security-square.woff differ
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/dist/text-security.css b/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/dist/text-security.css
new file mode 100644
index 0000000000..89e45814f8
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/dist/text-security.css
@@ -0,0 +1,24 @@
+@font-face {
+ font-family: 'text-security-circle';
+ src: url('text-security-circle.eot');
+ src: url('text-security-circle.eot?#iefix') format('embedded-opentype'),
+ url('text-security-circle.woff') format('woff'),
+ url('text-security-circle.ttf') format('truetype'),
+ url('text-security-circle.svg#text-security') format('svg');
+}
+@font-face {
+ font-family: 'text-security-square';
+ src: url('text-security-square.eot');
+ src: url('text-security-square.eot?#iefix') format('embedded-opentype'),
+ url('text-security-square.woff') format('woff'),
+ url('text-security-square.ttf') format('truetype'),
+ url('text-security-square.svg#text-security') format('svg');
+}
+@font-face {
+ font-family: 'text-security-disc';
+ src: url('text-security-disc.eot');
+ src: url('text-security-disc.eot?#iefix') format('embedded-opentype'),
+ url('text-security-disc.woff') format('woff'),
+ url('text-security-disc.ttf') format('truetype'),
+ url('text-security-disc.svg#text-security') format('svg');
+}
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/index.js b/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/index.js
new file mode 100644
index 0000000000..7a48412ac3
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/index.js
@@ -0,0 +1,89 @@
+var
+ icons2font = require('svgicons2svgfont'),
+ fs = require('fs'),
+ path = require('path'),
+ svg2ttf = require('svg2ttf'),
+ ttf2eot = require('ttf2eot'),
+ ttf2woff = require('ttf2woff'),
+ args = require('yargs').argv;
+/**
+ * We need to loop through the unicode character list and pass them all for svgicons2svgfont.
+ * If you want to reduce the file-sizes with the cost of worse character support, you can
+ * specify --max={number} when building. This number will be the highest supported character
+ * code. For example, building with `npm run build -- --max=126` would only support the Basic Latin unicode block.
+ *
+ * @todo Perhaps this could be better achieved by just defining the notdef glyph?
+ * That would probably reduce the file sizes quite a bit, but I'm not quite sure how that would work with the
+ * tff and woff versions.
+ * @param {number=} [max=767]
+ */
+var MAX_VALUE = args.max || 767;
+/**
+ * Comma-separated list of the supported shapes.
+ * @param {string} [shapes='circle,square,disc']
+ */
+var SHAPES = args.shapes || 'circle,square,disc';
+
+var styleTemplate = fs.readFileSync('style-template.css', 'utf-8'), stylesheet = '',
+ characters = [];
+
+for (var i = 0; i <= MAX_VALUE; i++){
+ characters.push(String.fromCharCode(i));
+}
+
+function bufferFrom(source) {
+ return typeof Buffer.from === 'function' ? Buffer.from(source) : new Buffer(source);
+}
+
+function logError(err) {
+ if (err) {
+ console.error(err);
+ }
+}
+
+var DIST_DIR = path.join(__dirname, 'dist');
+
+if (!fs.existsSync(DIST_DIR)) {
+ fs.mkdirSync(DIST_DIR);
+}
+
+SHAPES.split(',').forEach(function (shape) {
+ var
+ fontName = 'text-security-' + shape,
+ fontPath = path.join(DIST_DIR, fontName),
+ fontStream = icons2font({
+ fontName: fontName
+ });
+
+ fontStream
+ .pipe(fs.createWriteStream(fontPath + '.svg'))//Create the .svg font
+ .on('finish', function () {
+ //Create the other formats using the newly created font and Fontello's conversion libs
+
+ var ttf = svg2ttf(fs.readFileSync(fontPath + '.svg', 'utf-8'), {});
+ fs.writeFileSync(fontPath + '.ttf', bufferFrom(ttf.buffer), 'utf-8');
+
+ // ttf2eot and ttf2woff expect a buffer, while svg2ttf seems to expect a string
+ // this would be better read from the buffer, but will do for now
+ var ttfFile = fs.readFileSync(fontPath + '.ttf');
+
+ var eot = ttf2eot(ttfFile, {});
+ fs.writeFile(fontPath + '.eot', bufferFrom(eot.buffer), 'utf-8', logError);
+
+ var woff = ttf2woff(ttfFile, {});
+ fs.writeFile(fontPath + '.woff', bufferFrom(woff.buffer), 'utf-8', logError);
+ })
+ .on('error', logError);
+
+ var glyph = fs.createReadStream(path.join(__dirname, 'assets', shape + '.svg'));
+ glyph.metadata = {
+ unicode: characters,
+ name: shape
+ };
+ fontStream.write(glyph);
+ fontStream.end();
+ //Append the new shape to the generated stylesheet
+ stylesheet += styleTemplate.replace(/\{\{shape}}/g, shape) + '\n';
+});
+
+fs.writeFile(path.join(__dirname, 'dist', 'text-security.css'), stylesheet, logError);
\ No newline at end of file
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/package.json b/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/package.json
new file mode 100644
index 0000000000..bf7d7f1083
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/package.json
@@ -0,0 +1,60 @@
+{
+ "_from": "text-security@^1.0.1",
+ "_id": "text-security@1.0.1",
+ "_inBundle": false,
+ "_integrity": "sha512-Y5fStAKoEvLr6h2oz/nkSm+P3b5f3t+JAnNkycFJr15mz32XvrfBONjO+fNAnKaP5+YuD69tVNmlmKmfZu9ZGw==",
+ "_location": "/text-security",
+ "_phantomChildren": {},
+ "_requested": {
+ "type": "range",
+ "registry": true,
+ "raw": "text-security@^1.0.1",
+ "name": "text-security",
+ "escapedName": "text-security",
+ "rawSpec": "^1.0.1",
+ "saveSpec": null,
+ "fetchSpec": "^1.0.1"
+ },
+ "_requiredBy": [
+ "/"
+ ],
+ "_resolved": "https://registry.npmjs.org/text-security/-/text-security-1.0.1.tgz",
+ "_shasum": "9a04f42c322123b1f1fffa49d1d62c638fe72ba3",
+ "_spec": "text-security@^1.0.1",
+ "_where": "/home/st/dev/keycloak/themes/src/main/resources/theme/keycloak/common/resources",
+ "author": {
+ "name": "Oskari Noppa"
+ },
+ "bugs": {
+ "url": "https://github.com/noppa/text-security/issues"
+ },
+ "bundleDependencies": false,
+ "deprecated": false,
+ "description": "Cross-browser alternative to -webkit-text-security",
+ "devDependencies": {
+ "svg2ttf": "4.0.0",
+ "svgicons2svgfont": "5.0.0",
+ "ttf2eot": "2.0.0",
+ "ttf2woff": "2.0.1",
+ "yargs": "4.6.0"
+ },
+ "homepage": "https://github.com/noppa/text-security#readme",
+ "keywords": [
+ "-webkit-text-security",
+ "conceal",
+ "password"
+ ],
+ "license": "MIT",
+ "main": "index.js",
+ "name": "text-security",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/noppa/text-security.git"
+ },
+ "scripts": {
+ "build": "node index.js",
+ "prebuild": "npm install",
+ "test": ""
+ },
+ "version": "1.0.1"
+}
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/style-template.css b/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/style-template.css
new file mode 100644
index 0000000000..4691893525
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/node_modules/text-security/style-template.css
@@ -0,0 +1,8 @@
+@font-face {
+ font-family: 'text-security-{{shape}}';
+ src: url('text-security-{{shape}}.eot');
+ src: url('text-security-{{shape}}.eot?#iefix') format('embedded-opentype'),
+ url('text-security-{{shape}}.woff') format('woff'),
+ url('text-security-{{shape}}.ttf') format('truetype'),
+ url('text-security-{{shape}}.svg#text-security') format('svg');
+}
\ No newline at end of file
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/package.json b/themes/src/main/resources/theme/keycloak/common/resources/package.json
index f0150f0f1f..067ca36078 100644
--- a/themes/src/main/resources/theme/keycloak/common/resources/package.json
+++ b/themes/src/main/resources/theme/keycloak/common/resources/package.json
@@ -4,22 +4,23 @@
"description": "Keycloak Admin Console",
"license": "Apache-2.0",
"dependencies": {
- "angular": "^1.6.6",
- "angular-cookies": "^1.6.6",
- "angular-loader": "^1.6.6",
- "angular-resource": "^1.6.6",
- "angular-route": "^1.6.6",
- "angular-sanitize": "^1.6.6",
- "angular-translate": "^2.15.1",
- "angular-translate-loader-url": "^2.15.1",
- "angular-treeview": "^0.1.5",
- "angular-ui-select2": "^0.0.5",
- "autofill-event": "^0.0.1",
- "bootstrap": "^3.3.7",
- "filesaver": "^0.0.13",
- "font-awesome": "^4.7.0",
- "jquery": "^3.2.1",
- "ng-file-upload": "^12.2.13",
- "select2": "3.5.1"
+ "angular": "1.6.6",
+ "angular-cookies": "1.6.6",
+ "angular-loader": "1.6.6",
+ "angular-resource": "1.6.6",
+ "angular-route": "1.6.6",
+ "angular-sanitize": "1.6.6",
+ "angular-translate": "2.15.1",
+ "angular-translate-loader-url": "2.15.1",
+ "angular-treeview": "0.1.5",
+ "angular-ui-select2": "0.0.5",
+ "autofill-event": "0.0.1",
+ "bootstrap": "3.3.7",
+ "filesaver": "0.0.13",
+ "font-awesome": "4.7.0",
+ "jquery": "3.2.1",
+ "ng-file-upload": "12.2.13",
+ "select2": "3.5.1",
+ "text-security": "1.0.1"
}
}