diff --git a/.gitignore b/.gitignore index d37af39152d28c7126cfd2606471870e65e60b58..ab6bef8bba52c3ab4cd8b7ac9576f8ea3831a5c6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ out/ - +.idea/ # Created by https://www.toptal.com/developers/gitignore/api/node,java # Edit at https://www.toptal.com/developers/gitignore?templates=node,java diff --git a/plugins/deadlock-extension/package-lock.json b/plugins/deadlock-extension/package-lock.json index 3c1a051e4b24d8b79f82e896c77a8502b3a137d8..512652dc20420de06302ce8adcea73ed29f37dca 100644 --- a/plugins/deadlock-extension/package-lock.json +++ b/plugins/deadlock-extension/package-lock.json @@ -228,6 +228,11 @@ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -787,6 +792,11 @@ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, + "js-sha256": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz", + "integrity": "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==" + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -815,6 +825,15 @@ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, + "keycloak-js": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/keycloak-js/-/keycloak-js-11.0.0.tgz", + "integrity": "sha512-hjpIrO+ujaRsSJC76xEpVlZVAPpXm3OZYruxGa/cZ/PF7lwp9kRmIinqCxdg0jttr4dogCbOZ2YrFpqPx4a8mw==", + "requires": { + "base64-js": "1.3.1", + "js-sha256": "0.9.0" + } + }, "levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", diff --git a/plugins/deadlock-extension/package.json b/plugins/deadlock-extension/package.json index e9d216ca64b1cec6d39ec3466d4c074257a50aa4..9d9d2e1fbff8072add49b7c86027fd4849aedac2 100644 --- a/plugins/deadlock-extension/package.json +++ b/plugins/deadlock-extension/package.json @@ -36,6 +36,7 @@ }, "dependencies": { "@types/marked": "^1.1.0", + "keycloak-js": "^11.0.0", "marked": "^1.1.1" }, "devDependencies": { diff --git a/plugins/deadlock-extension/src/config.ts b/plugins/deadlock-extension/src/config.ts new file mode 100644 index 0000000000000000000000000000000000000000..713367bd7067ab3cc47e813dec71c25ef32cc3e8 --- /dev/null +++ b/plugins/deadlock-extension/src/config.ts @@ -0,0 +1,5 @@ +import * as path from 'path'; + +export const CONFIG_PATH = '/home/config/'; +export const USER_CHALLENGE_PATH = path.join(CONFIG_PATH, 'user-challenge.json'); +export const KEYCLOAK_CONFIG_PATH = path.join(CONFIG_PATH, 'keycloak.json'); diff --git a/plugins/deadlock-extension/src/extension.ts b/plugins/deadlock-extension/src/extension.ts index f4e553fb34083190fdd79e938c7b1d6ec2298682..46d36914134c5bf18ca23b7b4bd48effca6cabcd 100644 --- a/plugins/deadlock-extension/src/extension.ts +++ b/plugins/deadlock-extension/src/extension.ts @@ -4,12 +4,14 @@ import { Uri } from 'vscode'; // eslint-disable-next-line @typescript-eslint/no-var-requires const marked = require('marked'); +import keycloakManager from './keycloakManager'; +import { USER_CHALLENGE_PATH } from './config'; + interface UserChallengeConfig { paths: Record<string, string>; host: string; } -const CONFIG_PATH = '/home/config/'; let readMeContent = ''; let userChallengeConfig: UserChallengeConfig; @@ -17,7 +19,7 @@ function init() { const currentWorkspace = vscode.workspace.workspaceFolders; vscode.workspace - .openTextDocument(Uri.parse(path.join(CONFIG_PATH, 'user-challenge.json'))) + .openTextDocument(Uri.parse(USER_CHALLENGE_PATH)) .then((userConfig) => { userChallengeConfig = JSON.parse(userConfig.getText()); DeadlockPanel.update(); @@ -35,6 +37,13 @@ function init() { DeadlockPanel.update(); }); } + + keycloakManager.loadKeycloakIfNecessary(() => { + console.log('keycloak is ready'); + if (keycloakManager.getKeycloak() && keycloakManager.getKeycloak().token) { + console.log(keycloakManager.getKeycloak().token); + } + }); } export function activate(context: vscode.ExtensionContext) { diff --git a/plugins/deadlock-extension/src/keycloakManager.js b/plugins/deadlock-extension/src/keycloakManager.js new file mode 100644 index 0000000000000000000000000000000000000000..0d60dc06c04092bdd94ac34bf2e196854d3f33af --- /dev/null +++ b/plugins/deadlock-extension/src/keycloakManager.js @@ -0,0 +1,52 @@ +import Keycloak from 'keycloak-js/dist/keycloak'; +import { KEYCLOAK_CONFIG_PATH } from './config'; + +let keycloak; +let isAuthenticated = false; +const keycloakManager = {}; + +keycloakManager.getKeycloak = () => keycloak; + +keycloakManager.setKeycloak = (kc) => { + keycloak = kc; +}; + +keycloakManager.resetKeycloak = () => { + keycloak = undefined; +}; + +keycloakManager.loadKeycloakIfNecessary = (cb) => { + if (!keycloakManager.getKeycloak()) { + keycloakManager.loadKeycloak().then(() => cb()); + } else { + cb(); + } +}; + +keycloakManager.isAuthenticated = () => isAuthenticated; + +keycloakManager.logout = () => keycloakManager.getKeycloak().logout(); + +keycloakManager.getAvatar = () => keycloakManager.getKeycloak().tokenParsed.avatar_url; + +keycloakManager.loadKeycloak = () => { + let keycloak = Keycloak(KEYCLOAK_CONFIG_PATH); + return new Promise((resolve, reject) => { + keycloak.init({ onLoad: 'check-sso' }).success((authenticated) => { + if (authenticated) { + keycloakManager.setKeycloak(keycloak); + setInterval(() => { + keycloak.updateToken(10).error(() => keycloak.logout()); + }, 10000); + isAuthenticated = true; + resolve(); + } else { + keycloakManager.resetKeycloak(); + keycloak.login(); + reject(); + } + }); + }); +}; + +export default keycloakManager;