add account selection, settings, login modal

Change-Id: Ica6d38270c783de070bf1d5bb30603173dbeb0df
diff --git a/app.js b/app.js
index 5f616cd..861409e 100644
--- a/app.js
+++ b/app.js
@@ -1,49 +1,48 @@
-require('dotenv/config');
+const env = require('dotenv/config')
 
 const express = require('express')
-const app = express();
-const server = require('http').Server(app);
+const http = require('http')
 const session = require('express-session')
-const io = require('socket.io')(server);
-const path = require('path');
+//const cookieParser = require('cookie-parser')
+//const io = require('socket.io')(server)
+const path = require('path')
+const passport = require('passport')
+    , LocalStrategy = require('passport-local').Strategy
 
-//const redis = require('redis')
-const redis = require('redis-url').connect();
+const redis = require('redis-url').connect()
 const RedisStore = require('connect-redis')(session)
-/*var passportSocketIo = require('passport.socketio');*/
-//const cookieParser = require('cookie-parser');
-const cookieParser = require('cookie-parser')(process.env.SECRET_KEY_BASE); // <- your secret here
+/*const passportSocketIo = require('passport.socketio')*/
 
-var indexRouter = require('./routes/index');
+const indexRouter = require('./routes/index')
+
 //const cors = require('cors')
 
-var parser = require('fast-xml-parser');
+const parser = require('fast-xml-parser')
 
-const RingDaemon = require('./RingDaemon.js');
-const passport = require('passport')
-    , LocalStrategy = require('passport-local').Strategy;
+const JamiRestApi = require('./routes/jami')
+const JamiDaemon = require('./JamiDaemon')
 
-const sessionStore = new RedisStore({ client: redis });
+//const sessionStore = new RedisStore({ client: redis })
+const sessionStore = new session.MemoryStore()
 
+const app = express()
 
 /*
     Configuation for Passeport Js
 */
+//app.use(cookieParser(process.env.SECRET_KEY_BASE));
+app.disable('x-powered-by');
 
-// app.use(express.static('public'));
-// app.use(cookieParser());
-// app.use(bodyParser());
 app.use(session({
-    store: sessionStore,
+    //store: sessionStore,
     resave: false,
-    saveUninitialized: false,
+    saveUninitialized: true,
     cookie: {
-        secure: process.env.ENVIRONMENT !== 'development' && process.env.ENVIRONMENT !== 'test',
+        secure: false,//process.env.ENVIRONMENT !== 'development' && process.env.ENVIRONMENT !== 'test',
         maxAge: 2419200000
     },
     secret: process.env.SECRET_KEY_BASE
 }));
-
 app.use(passport.initialize());
 app.use(passport.session());
 // app.use(app.router);
@@ -78,55 +77,23 @@
     tempAccounts holds users accounts while tempting to authenticate them on Jams.
     connectedUsers  holds users accounts after they got authenticated by Jams.
 
-    Users should be removed from connectedUsers when receiving a disconnect 
+    Users should be removed from connectedUsers when receiving a disconnect
     web socket call
 
 */
 const tempAccounts = {};
 const connectedUsers = {};
 
-const callbackMap = {
-    "IncomingAccountMessage": (accountId, from, message) => {
-        console.log("Received message: " + accountId + " " + from + " " + message["text/plain"]);
+const jami = new JamiDaemon();
+const apiRouter = new JamiRestApi(jami).getRouter()
 
-        if (parser.validate(message["text/plain"]) === true) {
-            console.log(message["text/plain"]);
-        } else {
-
-            user = connectedUsers[accountId];
-            console.log(user.socketId)
-            io.to(user.socketId).emit('receivedMessage', message["text/plain"]);
-            //io.emit('receivedMessage', message["text/plain"]);
-        }
-    },
-    "RegistrationStateChanged": (accountId, state, /*int*/ code, detail) => {
-        console.log("RegistrationStateChanged: " + accountId + " " + state + " " + code + " " + detail);
-        if (state === "REGISTERED") {
-            if (tempAccounts[accountId]) {
-
-                const ctx = tempAccounts[accountId];
-                ctx.newUser.accountId = accountId;
-                ctx.newUser.jamiId = jami.dring.getAccountDetails(accountId).get("Account.username");
-                //connectedUsers[accountId] = ctx.newUser;
-                ctx.done(null, ctx.newUser);
-                delete tempAccounts[accountId];
-            }
-        } else if (state === "ERROR_AUTH") {
-            done(null, false);
-            //remove account
-        }
-    }
-}
-const jami = new RingDaemon(callbackMap);
-
-passport.serializeUser(function (user, done) {
+passport.serializeUser((user, done) => {
     console.log(user)
     connectedUsers[user.accountId] = user;
     console.log("=============================SerializeUser called " + user.accountId)
     done(null, user.accountId);
 });
 
-
 const deserializeUser = (id, done) => {
     console.log("=============================DeserializeUser called on: " + id + " " + connectedUsers[id])
     done(null, connectedUsers[id]);
@@ -135,25 +102,20 @@
 
 //var tempAccountId = '';
 
-passport.use(new LocalStrategy(
+const jamsStrategy = new LocalStrategy(
     (username, password, done) => {
+
         const newUser = {};
         newUser.username = username;
-        //newUser.socketid = 
+        //newUser.socketid =
 
-        const template = jami.dring.getAccountTemplate("RING");
+        const accountId = jami.addAccount({
+            'managerUri': 'https://jams.savoirfairelinux.com',
+            'managerUsername': username,
+            'archivePassword': password
+        });
 
-        /*
-            For test purpose we are not checking if a user can SSO using Jams,
-            instead we juste create a new user an get he's or her's newly created accountId
-        */
-        template.set("Account.managerUri", "https://jams.savoirfairelinux.com");
-        template.set("Account.managerUsername", username);
-        template.set("Account.archivePassword", password);
-
-        const accountId = jami.dring.addAccount(template);
-
-        const newProps = jami.getAccountDetails(accountId);
+        const newProps = jami.getAccount(accountId).details;
         console.log(newProps);
         //Object.entries(newProps).forEach(v => console.log(v[0], v[1]))
         //tempAccountId = accountId;
@@ -175,23 +137,62 @@
             return done(null, user);
         });*/
     }
-));
+);
+jamsStrategy.name = "jams";
 
-app.post('/api/login', passport.authenticate('local'), function (req, res) {
-    res.json({ loggedin: true });
+const localStrategy = new LocalStrategy(
+    (username, password, done) => {
+        console.log("localStrategy: " + username + " " + password);
+
+        const newUser = {};
+        newUser.accountId = jami.getAccountList()[0].getId();
+        console.log("Local AccountId: " + newUser.accountId);
+        connectedUsers[newUser.accountId] = newUser;
+        done(null, newUser);
+    }
+);
+
+passport.use(jamsStrategy);
+passport.use(localStrategy);
+
+const secured = (req, res, next) => {
+    console.log(`isSecured ${req.user}`);
+    if (req.user && req.user.accountId) {
+        return next();
+    }
+    res.status(401).end()
+};
+const securedRedirect = (req, res, next) => {
+    if (req.user && req.user.accountId) {
+        return next();
+    }
+    req.session.returnTo = req.originalUrl;
+    res.redirect('/login');
+};
+
+app.post('/auth', passport.authenticate('jams'), (req, res) => {
+    res.json({ loggedin: true })
 });
+app.post('/api/localLogin', passport.authenticate('local'), (req, res) => {
+    res.json({ loggedin: true })
+});
+
+app.use('/api', secured, apiRouter);
+
 app.use('/', indexRouter);
 
 /* GET React App */
 
 app.use(express.static(path.join(__dirname, 'public')))
 
-app.use(function (req, res, next) {
+app.use((req, res, next) => {
     res.sendFile(path.join(__dirname, 'public', 'index.html'));
 });
 
+const server = http.Server(app);
 server.listen(3000);
 
+/*
 io.on('connection', (socket) => {
     console.log("Client just connected !")
     socket.on('SendMessage', (data) => {
@@ -202,7 +203,6 @@
     });
 });
 
-
 io.use((socket, next) => {
     cookieParser(socket.handshake, {}, (err) => {
         if (err) {
@@ -233,8 +233,6 @@
                     user.socketId = socket.id;
                     socket.session.user = user;
                     console.log("User added to session --------> " + user.accountId);
-                    /*data[auth.userProperty] = user;
-                    data[auth.userProperty].logged_in = true;*/
                     //auth.success(data, accept);
                     next(err, true);
                 });
@@ -242,3 +240,4 @@
         });
     });
 });
+*/