blob: 0e7bf8dc0a94d22f42163fff65a486aa26bfd402 [file] [log] [blame]
Adrien Béraud6ecaa402021-04-06 17:37:25 -04001const env = require('dotenv/config')
Larbi Gharibe9af9732021-03-31 15:08:01 +01002
3const express = require('express')
Adrien Béraud6ecaa402021-04-06 17:37:25 -04004const http = require('http')
Larbi Gharibe9af9732021-03-31 15:08:01 +01005const session = require('express-session')
Adrien Béraud6ecaa402021-04-06 17:37:25 -04006//const cookieParser = require('cookie-parser')
7//const io = require('socket.io')(server)
8const path = require('path')
9const passport = require('passport')
10 , LocalStrategy = require('passport-local').Strategy
Larbi Gharibe9af9732021-03-31 15:08:01 +010011
Adrien Béraud947e8792021-04-15 18:32:44 -040012//const redis = require('redis-url').connect()
13//const RedisStore = require('connect-redis')(session)
Adrien Béraud6ecaa402021-04-06 17:37:25 -040014/*const passportSocketIo = require('passport.socketio')*/
Larbi Gharibe9af9732021-03-31 15:08:01 +010015
Adrien Béraud6ecaa402021-04-06 17:37:25 -040016const indexRouter = require('./routes/index')
17
Larbi Gharibe9af9732021-03-31 15:08:01 +010018//const cors = require('cors')
19
Adrien Béraud6ecaa402021-04-06 17:37:25 -040020const JamiRestApi = require('./routes/jami')
21const JamiDaemon = require('./JamiDaemon')
Larbi Gharibe9af9732021-03-31 15:08:01 +010022
Adrien Bérauda2bf6fd2021-04-08 01:06:37 -040023const webpack = require('webpack')
24const webpackConfig = require('./client/webpack.config.js')
25const compiler = webpack(webpackConfig)
26
Adrien Béraud6ecaa402021-04-06 17:37:25 -040027//const sessionStore = new RedisStore({ client: redis })
28const sessionStore = new session.MemoryStore()
Larbi Gharibe9af9732021-03-31 15:08:01 +010029
Adrien Béraud6ecaa402021-04-06 17:37:25 -040030const app = express()
Adrien Béraud947e8792021-04-15 18:32:44 -040031app.use(require('webpack-dev-middleware')(compiler, {
32 publicPath: webpackConfig.output.publicPath
33}));
34app.use(require('webpack-hot-middleware')(compiler));
Larbi Gharibe9af9732021-03-31 15:08:01 +010035/*
36 Configuation for Passeport Js
37*/
Adrien Béraud6ecaa402021-04-06 17:37:25 -040038app.disable('x-powered-by');
Larbi Gharibe9af9732021-03-31 15:08:01 +010039
Larbi Gharibe9af9732021-03-31 15:08:01 +010040app.use(session({
Adrien Béraud947e8792021-04-15 18:32:44 -040041 store: sessionStore,
Larbi Gharibe9af9732021-03-31 15:08:01 +010042 resave: false,
Adrien Béraud6ecaa402021-04-06 17:37:25 -040043 saveUninitialized: true,
Larbi Gharibe9af9732021-03-31 15:08:01 +010044 cookie: {
Adrien Béraud6ecaa402021-04-06 17:37:25 -040045 secure: false,//process.env.ENVIRONMENT !== 'development' && process.env.ENVIRONMENT !== 'test',
Larbi Gharibe9af9732021-03-31 15:08:01 +010046 maxAge: 2419200000
47 },
48 secret: process.env.SECRET_KEY_BASE
49}));
Larbi Gharibe9af9732021-03-31 15:08:01 +010050app.use(passport.initialize());
51app.use(passport.session());
52// app.use(app.router);
53//app.use(cors())
54
55/*
56 Share sessions between Passport.js and Socket.io
57*/
58
59function logSuccess() {
60 console.log("passportSocketIo authorized user with Success 😁");
61}
62
63function logFail() {
64 console.log("passportSocketIo failed to authorized user 👺");
65}
66
67/*
68io.use(passportSocketIo.authorize({
69 key: 'connect.sid',
70 secret: process.env.SECRET_KEY_BASE,
71 store: sessionStore,
72 passport: passport,
73 cookieParser: cookieParser,
74 //success: logSuccess(),
75 // fail: logFail(),
76}));
77*/
78
79/*
80
81 tempAccounts holds users accounts while tempting to authenticate them on Jams.
82 connectedUsers holds users accounts after they got authenticated by Jams.
83
Adrien Béraud6ecaa402021-04-06 17:37:25 -040084 Users should be removed from connectedUsers when receiving a disconnect
Larbi Gharibe9af9732021-03-31 15:08:01 +010085 web socket call
86
87*/
88const tempAccounts = {};
89const connectedUsers = {};
90
Adrien Béraud6ecaa402021-04-06 17:37:25 -040091const jami = new JamiDaemon();
92const apiRouter = new JamiRestApi(jami).getRouter()
Larbi Gharibe9af9732021-03-31 15:08:01 +010093
Adrien Béraud6ecaa402021-04-06 17:37:25 -040094passport.serializeUser((user, done) => {
Larbi Gharibe9af9732021-03-31 15:08:01 +010095 console.log(user)
96 connectedUsers[user.accountId] = user;
97 console.log("=============================SerializeUser called " + user.accountId)
98 done(null, user.accountId);
99});
100
Larbi Gharibe9af9732021-03-31 15:08:01 +0100101const deserializeUser = (id, done) => {
102 console.log("=============================DeserializeUser called on: " + id + " " + connectedUsers[id])
103 done(null, connectedUsers[id]);
104};
105passport.deserializeUser(deserializeUser);
106
107//var tempAccountId = '';
108
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400109const jamsStrategy = new LocalStrategy(
Larbi Gharibe9af9732021-03-31 15:08:01 +0100110 (username, password, done) => {
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400111
Larbi Gharibe9af9732021-03-31 15:08:01 +0100112 const newUser = {};
113 newUser.username = username;
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400114 //newUser.socketid =
Larbi Gharibe9af9732021-03-31 15:08:01 +0100115
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400116 const accountId = jami.addAccount({
117 'managerUri': 'https://jams.savoirfairelinux.com',
118 'managerUsername': username,
119 'archivePassword': password
120 });
Larbi Gharibe9af9732021-03-31 15:08:01 +0100121
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400122 const newProps = jami.getAccount(accountId).details;
Larbi Gharibe9af9732021-03-31 15:08:01 +0100123 console.log(newProps);
124 //Object.entries(newProps).forEach(v => console.log(v[0], v[1]))
125 //tempAccountId = accountId;
126 newUser.accountId = accountId;
127 console.log("AccountId: " + accountId);
128 connectedUsers[accountId] = newUser;
129 tempAccounts[accountId] = { done, newUser };
130
131 //return done(null, newUser);
132
133 /*User.findOne({ username: username }, function (err, user) {
134 if (err) { return done(err); }
135 if (!user) {
136 return done(null, false, { message: 'Incorrect username.' });
137 }
138 if (!user.validPassword(password)) {
139 return done(null, false, { message: 'Incorrect password.' });
140 }
141 return done(null, user);
142 });*/
143 }
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400144);
145jamsStrategy.name = "jams";
Larbi Gharibe9af9732021-03-31 15:08:01 +0100146
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400147const localStrategy = new LocalStrategy(
148 (username, password, done) => {
149 console.log("localStrategy: " + username + " " + password);
150
151 const newUser = {};
152 newUser.accountId = jami.getAccountList()[0].getId();
153 console.log("Local AccountId: " + newUser.accountId);
154 connectedUsers[newUser.accountId] = newUser;
155 done(null, newUser);
156 }
157);
158
159passport.use(jamsStrategy);
160passport.use(localStrategy);
161
162const secured = (req, res, next) => {
163 console.log(`isSecured ${req.user}`);
164 if (req.user && req.user.accountId) {
165 return next();
166 }
167 res.status(401).end()
168};
169const securedRedirect = (req, res, next) => {
170 if (req.user && req.user.accountId) {
171 return next();
172 }
173 req.session.returnTo = req.originalUrl;
174 res.redirect('/login');
175};
176
177app.post('/auth', passport.authenticate('jams'), (req, res) => {
178 res.json({ loggedin: true })
Larbi Gharibe9af9732021-03-31 15:08:01 +0100179});
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400180app.post('/api/localLogin', passport.authenticate('local'), (req, res) => {
181 res.json({ loggedin: true })
182});
183
184app.use('/api', secured, apiRouter);
185
Larbi Gharibe9af9732021-03-31 15:08:01 +0100186app.use('/', indexRouter);
187
188/* GET React App */
189
Adrien Béraudc4dd44a2021-04-08 01:05:24 -0400190app.use(express.static(path.join(__dirname, 'client', 'dist')))
Larbi Gharibe9af9732021-03-31 15:08:01 +0100191
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400192app.use((req, res, next) => {
Adrien Béraudc4dd44a2021-04-08 01:05:24 -0400193 res.sendFile(path.join(__dirname, 'client', 'dist', 'index.html'));
Larbi Gharibe9af9732021-03-31 15:08:01 +0100194});
195
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400196const server = http.Server(app);
Larbi Gharibe9af9732021-03-31 15:08:01 +0100197server.listen(3000);
198
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400199/*
Larbi Gharibe9af9732021-03-31 15:08:01 +0100200io.on('connection', (socket) => {
201 console.log("Client just connected !")
202 socket.on('SendMessage', (data) => {
203 console.log("Message " + data.text + " sent to " + data.destinationId + " by " + socket.session.user.accountId);
204 const msgMap = new jami.dring.StringMap();
205 msgMap.set('text/plain', data.text);
206 jami.dring.sendAccountTextMessage(socket.session.user.accountId, data.destinationId, msgMap);
207 });
208});
209
Larbi Gharibe9af9732021-03-31 15:08:01 +0100210io.use((socket, next) => {
211 cookieParser(socket.handshake, {}, (err) => {
212 if (err) {
213 console.log("error in parsing cookie");
214 return next(err);
215 }
216 if (!socket.handshake.signedCookies) {
217 console.log("no secureCookies|signedCookies found");
218 return next(new Error("no secureCookies found"));
219 }
220 sessionStore.get(socket.handshake.signedCookies["connect.sid"], (err, session) => {
221 socket.session = session;
222 if (!err && !session) err = new Error('session not found');
223 if (err) {
224 console.log('failed connection to socket.io:', err);
225 } else {
226 console.log(session);
227 console.log('successful connection to socket.io ' + session.passport.user);
228 const userKey = session.passport.user;
229 deserializeUser(userKey, (err, user) => {
230 console.log("deserializeUser: " + user)
231 if (err)
232 return next(err, true);
233 if (!user)
234 return next("User not found", false);
235
236 console.log("User associated socket id: " + socket.id)
237 user.socketId = socket.id;
238 socket.session.user = user;
239 console.log("User added to session --------> " + user.accountId);
Larbi Gharibe9af9732021-03-31 15:08:01 +0100240 //auth.success(data, accept);
241 next(err, true);
242 });
243 }
244 });
245 });
246});
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400247*/