From 5491e8b98c217c215754649c9e15588fcb65a18b Mon Sep 17 00:00:00 2001
From: Alex <apuret@e-biz.fr>
Date: Mon, 27 Jul 2020 11:29:17 +0200
Subject: [PATCH] feat: add keycloak

---
 .gitignore                                    |  2 +-
 plugins/deadlock-extension/package-lock.json  | 19 +++++++
 plugins/deadlock-extension/package.json       |  1 +
 plugins/deadlock-extension/src/config.ts      |  5 ++
 plugins/deadlock-extension/src/extension.ts   | 13 ++++-
 .../deadlock-extension/src/keycloakManager.js | 52 +++++++++++++++++++
 6 files changed, 89 insertions(+), 3 deletions(-)
 create mode 100644 plugins/deadlock-extension/src/config.ts
 create mode 100644 plugins/deadlock-extension/src/keycloakManager.js

diff --git a/.gitignore b/.gitignore
index d37af391..ab6bef8b 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 3c1a051e..512652dc 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 e9d216ca..9d9d2e1f 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 00000000..713367bd
--- /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 f4e553fb..46d36914 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 00000000..0d60dc06
--- /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;
-- 
GitLab