blob: 246b962954251ecd4eb161a4852cb8ade2f545f2 [file] [log] [blame]
Adrien Béraud824a7132021-04-17 17:25:27 -04001require('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éraud6ecaa402021-04-06 17:37:25 -040023//const sessionStore = new RedisStore({ client: redis })
24const sessionStore = new session.MemoryStore()
Larbi Gharibe9af9732021-03-31 15:08:01 +010025
Adrien Béraud6ecaa402021-04-06 17:37:25 -040026const app = express()
Adrien Béraud824a7132021-04-17 17:25:27 -040027console.log(`Loading server for ${app.get('env')}`)
28const development = app.get('env') === 'development'
29
30if (development) {
31 const webpack = require('webpack')
32 const webpackConfig = require('./client/webpack.config.js')
33 const compiler = webpack(webpackConfig)
34 app.use(require('webpack-dev-middleware')(compiler, {
35 publicPath: webpackConfig.output.publicPath
36 }));
37 app.use(require('webpack-hot-middleware')(compiler));
38}
39
Larbi Gharibe9af9732021-03-31 15:08:01 +010040/*
41 Configuation for Passeport Js
42*/
Adrien Béraud6ecaa402021-04-06 17:37:25 -040043app.disable('x-powered-by');
Larbi Gharibe9af9732021-03-31 15:08:01 +010044
Larbi Gharibe9af9732021-03-31 15:08:01 +010045app.use(session({
Adrien Béraud947e8792021-04-15 18:32:44 -040046 store: sessionStore,
Larbi Gharibe9af9732021-03-31 15:08:01 +010047 resave: false,
Adrien Béraud6ecaa402021-04-06 17:37:25 -040048 saveUninitialized: true,
Larbi Gharibe9af9732021-03-31 15:08:01 +010049 cookie: {
Adrien Béraud6ecaa402021-04-06 17:37:25 -040050 secure: false,//process.env.ENVIRONMENT !== 'development' && process.env.ENVIRONMENT !== 'test',
Larbi Gharibe9af9732021-03-31 15:08:01 +010051 maxAge: 2419200000
52 },
53 secret: process.env.SECRET_KEY_BASE
54}));
Larbi Gharibe9af9732021-03-31 15:08:01 +010055app.use(passport.initialize());
56app.use(passport.session());
57// app.use(app.router);
58//app.use(cors())
59
60/*
61 Share sessions between Passport.js and Socket.io
62*/
63
64function logSuccess() {
65 console.log("passportSocketIo authorized user with Success 😁");
66}
67
68function logFail() {
69 console.log("passportSocketIo failed to authorized user 👺");
70}
71
72/*
73io.use(passportSocketIo.authorize({
74 key: 'connect.sid',
75 secret: process.env.SECRET_KEY_BASE,
76 store: sessionStore,
77 passport: passport,
78 cookieParser: cookieParser,
79 //success: logSuccess(),
80 // fail: logFail(),
81}));
82*/
83
84/*
85
86 tempAccounts holds users accounts while tempting to authenticate them on Jams.
87 connectedUsers holds users accounts after they got authenticated by Jams.
88
Adrien Béraud6ecaa402021-04-06 17:37:25 -040089 Users should be removed from connectedUsers when receiving a disconnect
Larbi Gharibe9af9732021-03-31 15:08:01 +010090 web socket call
91
92*/
93const tempAccounts = {};
94const connectedUsers = {};
95
Adrien Béraud6ecaa402021-04-06 17:37:25 -040096const jami = new JamiDaemon();
97const apiRouter = new JamiRestApi(jami).getRouter()
Larbi Gharibe9af9732021-03-31 15:08:01 +010098
Adrien Béraud6ecaa402021-04-06 17:37:25 -040099passport.serializeUser((user, done) => {
Larbi Gharibe9af9732021-03-31 15:08:01 +0100100 console.log(user)
101 connectedUsers[user.accountId] = user;
102 console.log("=============================SerializeUser called " + user.accountId)
103 done(null, user.accountId);
104});
105
Larbi Gharibe9af9732021-03-31 15:08:01 +0100106const deserializeUser = (id, done) => {
107 console.log("=============================DeserializeUser called on: " + id + " " + connectedUsers[id])
108 done(null, connectedUsers[id]);
109};
110passport.deserializeUser(deserializeUser);
111
112//var tempAccountId = '';
113
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400114const jamsStrategy = new LocalStrategy(
Larbi Gharibe9af9732021-03-31 15:08:01 +0100115 (username, password, done) => {
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400116
Larbi Gharibe9af9732021-03-31 15:08:01 +0100117 const newUser = {};
118 newUser.username = username;
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400119 //newUser.socketid =
Larbi Gharibe9af9732021-03-31 15:08:01 +0100120
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400121 const accountId = jami.addAccount({
122 'managerUri': 'https://jams.savoirfairelinux.com',
123 'managerUsername': username,
124 'archivePassword': password
125 });
Larbi Gharibe9af9732021-03-31 15:08:01 +0100126
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400127 const newProps = jami.getAccount(accountId).details;
Larbi Gharibe9af9732021-03-31 15:08:01 +0100128 console.log(newProps);
129 //Object.entries(newProps).forEach(v => console.log(v[0], v[1]))
130 //tempAccountId = accountId;
131 newUser.accountId = accountId;
132 console.log("AccountId: " + accountId);
133 connectedUsers[accountId] = newUser;
134 tempAccounts[accountId] = { done, newUser };
135
136 //return done(null, newUser);
137
138 /*User.findOne({ username: username }, function (err, user) {
139 if (err) { return done(err); }
140 if (!user) {
141 return done(null, false, { message: 'Incorrect username.' });
142 }
143 if (!user.validPassword(password)) {
144 return done(null, false, { message: 'Incorrect password.' });
145 }
146 return done(null, user);
147 });*/
148 }
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400149);
150jamsStrategy.name = "jams";
Larbi Gharibe9af9732021-03-31 15:08:01 +0100151
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400152const localStrategy = new LocalStrategy(
153 (username, password, done) => {
154 console.log("localStrategy: " + username + " " + password);
155
156 const newUser = {};
157 newUser.accountId = jami.getAccountList()[0].getId();
158 console.log("Local AccountId: " + newUser.accountId);
159 connectedUsers[newUser.accountId] = newUser;
160 done(null, newUser);
161 }
162);
163
164passport.use(jamsStrategy);
165passport.use(localStrategy);
166
167const secured = (req, res, next) => {
168 console.log(`isSecured ${req.user}`);
169 if (req.user && req.user.accountId) {
170 return next();
171 }
172 res.status(401).end()
173};
174const securedRedirect = (req, res, next) => {
175 if (req.user && req.user.accountId) {
176 return next();
177 }
178 req.session.returnTo = req.originalUrl;
179 res.redirect('/login');
180};
181
182app.post('/auth', passport.authenticate('jams'), (req, res) => {
183 res.json({ loggedin: true })
Larbi Gharibe9af9732021-03-31 15:08:01 +0100184});
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400185app.post('/api/localLogin', passport.authenticate('local'), (req, res) => {
186 res.json({ loggedin: true })
187});
188
189app.use('/api', secured, apiRouter);
190
Larbi Gharibe9af9732021-03-31 15:08:01 +0100191app.use('/', indexRouter);
192
193/* GET React App */
194
Adrien Béraudc4dd44a2021-04-08 01:05:24 -0400195app.use(express.static(path.join(__dirname, 'client', 'dist')))
Larbi Gharibe9af9732021-03-31 15:08:01 +0100196
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400197app.use((req, res, next) => {
Adrien Béraudc4dd44a2021-04-08 01:05:24 -0400198 res.sendFile(path.join(__dirname, 'client', 'dist', 'index.html'));
Larbi Gharibe9af9732021-03-31 15:08:01 +0100199});
200
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400201const server = http.Server(app);
Larbi Gharibe9af9732021-03-31 15:08:01 +0100202server.listen(3000);
203
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400204/*
Larbi Gharibe9af9732021-03-31 15:08:01 +0100205io.on('connection', (socket) => {
206 console.log("Client just connected !")
207 socket.on('SendMessage', (data) => {
208 console.log("Message " + data.text + " sent to " + data.destinationId + " by " + socket.session.user.accountId);
209 const msgMap = new jami.dring.StringMap();
210 msgMap.set('text/plain', data.text);
211 jami.dring.sendAccountTextMessage(socket.session.user.accountId, data.destinationId, msgMap);
212 });
213});
214
Larbi Gharibe9af9732021-03-31 15:08:01 +0100215io.use((socket, next) => {
216 cookieParser(socket.handshake, {}, (err) => {
217 if (err) {
218 console.log("error in parsing cookie");
219 return next(err);
220 }
221 if (!socket.handshake.signedCookies) {
222 console.log("no secureCookies|signedCookies found");
223 return next(new Error("no secureCookies found"));
224 }
225 sessionStore.get(socket.handshake.signedCookies["connect.sid"], (err, session) => {
226 socket.session = session;
227 if (!err && !session) err = new Error('session not found');
228 if (err) {
229 console.log('failed connection to socket.io:', err);
230 } else {
231 console.log(session);
232 console.log('successful connection to socket.io ' + session.passport.user);
233 const userKey = session.passport.user;
234 deserializeUser(userKey, (err, user) => {
235 console.log("deserializeUser: " + user)
236 if (err)
237 return next(err, true);
238 if (!user)
239 return next("User not found", false);
240
241 console.log("User associated socket id: " + socket.id)
242 user.socketId = socket.id;
243 socket.session.user = user;
244 console.log("User added to session --------> " + user.accountId);
Larbi Gharibe9af9732021-03-31 15:08:01 +0100245 //auth.success(data, accept);
246 next(err, true);
247 });
248 }
249 });
250 });
251});
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400252*/