add account selection, settings, login modal
Change-Id: Ica6d38270c783de070bf1d5bb30603173dbeb0df
diff --git a/jaas-client/src/AuthManager.js b/jaas-client/src/AuthManager.js
new file mode 100644
index 0000000..09aef64
--- /dev/null
+++ b/jaas-client/src/AuthManager.js
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2017-2021 Savoir-faire Linux Inc.
+ *
+ * Author: Adrien Béraud <adrien.beraud@savoirfairelinux.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+//import cookie from 'cookie';
+
+class AuthManager {
+ constructor() {
+ console.log("AuthManager()")
+ this.authenticated = true//'connect.sid' in cookie.parse(document.cookie)
+ this.authenticating = false
+ this.tasks = []
+ this.onAuthChanged = undefined
+ }
+ setOnAuthChanged(onAuthChanged) {
+ this.onAuthChanged = onAuthChanged
+ }
+
+ isAuthenticated() {
+ return this.authenticated
+ }
+
+ authenticate() {
+ if (this.authenticating)
+ return
+ console.log("Starting authentication")
+ this.authenticating = true
+ fetch('/api/localLogin?username=local&password=local', { method:"POST" })
+ .then(response => {
+ console.log(response)
+ this.authenticating = false
+ this.authenticated = response.ok && response.status === 200
+ if (this.onAuthChanged)
+ this.onAuthChanged(this.authenticated)
+ while (this.tasks.length !== 0) {
+ const task = this.tasks.shift()
+ if (this.authenticated)
+ fetch(task.url, task.init).then(res => task.resolve(res))
+ else
+ task.reject(new Error("Authentication failed"))
+ }
+ })
+ }
+
+ disconnect() {
+ console.log("Disconnect")
+ this.authenticated = false
+ if (this.onAuthChanged)
+ this.onAuthChanged(this.authenticated)
+ }
+
+ fetch(url, init) {
+ console.log(`get ${url}`)
+ if (!this.authenticated) {
+ return new Promise((resolve, reject) => this.tasks.push({url, init, resolve, reject}))
+ }
+ return fetch(url, init)
+ .then(response => {
+ console.log(`Got status ${response.status}`)
+ if (response.status === 401) {
+ this.disconnect()
+ return this.fetch(url, init)
+ }
+ return response
+ })
+ }
+}
+
+export default new AuthManager()
\ No newline at end of file