blob: 0c926611acabe0ca1aff8d55835940908c685cc0 [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éraud3b5d9a62021-04-17 18:40:27 -040026const loadConfig = async (filePath) => {
27 try {
28 return JSON.parse(await fs.readFile(filePath))
29 } catch {
30 return {}
31 }
Adrien Béraud824a7132021-04-17 17:25:27 -040032}
33
Larbi Gharibe9af9732021-03-31 15:08:01 +010034/*
Adrien Béraud3b5d9a62021-04-17 18:40:27 -040035Share sessions between Passport.js and Socket.io
Larbi Gharibe9af9732021-03-31 15:08:01 +010036*/
37
38function logSuccess() {
39 console.log("passportSocketIo authorized user with Success 😁");
40}
41
42function logFail() {
43 console.log("passportSocketIo failed to authorized user 👺");
44}
45
46/*
Larbi Gharibe9af9732021-03-31 15:08:01 +010047
Adrien Béraud3b5d9a62021-04-17 18:40:27 -040048tempAccounts holds users accounts while tempting to authenticate them on Jams.
49connectedUsers holds users accounts after they got authenticated by Jams.
Larbi Gharibe9af9732021-03-31 15:08:01 +010050
Adrien Béraud3b5d9a62021-04-17 18:40:27 -040051Users should be removed from connectedUsers when receiving a disconnect
52web socket call
Larbi Gharibe9af9732021-03-31 15:08:01 +010053
54*/
55const tempAccounts = {};
56const connectedUsers = {};
57
Adrien Béraud3b5d9a62021-04-17 18:40:27 -040058const createServer = async (appConfig) => {
59 const app = express()
60 console.log(`Loading server for ${app.get('env')} with config:`)
61 console.log(appConfig)
62 const development = app.get('env') === 'development'
Larbi Gharibe9af9732021-03-31 15:08:01 +010063
Adrien Béraud3b5d9a62021-04-17 18:40:27 -040064 if (development) {
65 const webpack = require('webpack')
66 const webpackConfig = require('./client/webpack.config.js')
67 const compiler = webpack(webpackConfig)
68 app.use(require('webpack-dev-middleware')(compiler, {
69 publicPath: webpackConfig.output.publicPath
70 }));
71 app.use(require('webpack-hot-middleware')(compiler));
Larbi Gharibe9af9732021-03-31 15:08:01 +010072 }
Larbi Gharibe9af9732021-03-31 15:08:01 +010073
Adrien Béraud3b5d9a62021-04-17 18:40:27 -040074 /*
75 Configuation for Passeport Js
76 */
77 app.disable('x-powered-by');
Adrien Béraud6ecaa402021-04-06 17:37:25 -040078
Adrien Béraud3b5d9a62021-04-17 18:40:27 -040079 app.use(session({
80 store: sessionStore,
81 resave: false,
82 saveUninitialized: true,
83 cookie: {
84 secure: false,//!development,
85 maxAge: 2419200000
86 },
87 secret: process.env.SECRET_KEY_BASE
88 }));
89 app.use(passport.initialize());
90 app.use(passport.session());
91 // app.use(app.router);
92 //app.use(cors())
Adrien Béraud6ecaa402021-04-06 17:37:25 -040093
Adrien Béraud3b5d9a62021-04-17 18:40:27 -040094 const jami = new JamiDaemon();
95 const apiRouter = new JamiRestApi(jami).getRouter()
Adrien Béraud6ecaa402021-04-06 17:37:25 -040096
Adrien Béraud3b5d9a62021-04-17 18:40:27 -040097 /*
98 io.use(passportSocketIo.authorize({
99 key: 'connect.sid',
100 secret: process.env.SECRET_KEY_BASE,
101 store: sessionStore,
102 passport: passport,
103 cookieParser: cookieParser,
104 //success: logSuccess(),
105 // fail: logFail(),
106 }));
107 */
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400108
Adrien Béraud3b5d9a62021-04-17 18:40:27 -0400109 passport.serializeUser((user, done) => {
110 console.log(user)
111 connectedUsers[user.accountId] = user;
112 console.log("=============================SerializeUser called " + user.accountId)
113 done(null, user.accountId);
114 });
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400115
Adrien Béraud3b5d9a62021-04-17 18:40:27 -0400116 const deserializeUser = (id, done) => {
117 console.log("=============================DeserializeUser called on: " + id + " " + connectedUsers[id])
118 done(null, connectedUsers[id]);
119 };
120 passport.deserializeUser(deserializeUser);
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400121
Adrien Béraud3b5d9a62021-04-17 18:40:27 -0400122 //var tempAccountId = '';
Larbi Gharibe9af9732021-03-31 15:08:01 +0100123
Adrien Béraud3b5d9a62021-04-17 18:40:27 -0400124 const jamsStrategy = new LocalStrategy(
125 (username, password, done) => {
Larbi Gharibe9af9732021-03-31 15:08:01 +0100126
Adrien Béraud3b5d9a62021-04-17 18:40:27 -0400127 const newUser = {};
128 newUser.username = username;
129 //newUser.socketid =
Larbi Gharibe9af9732021-03-31 15:08:01 +0100130
Adrien Béraud3b5d9a62021-04-17 18:40:27 -0400131 const accountId = jami.addAccount({
132 'managerUri': 'https://jams.savoirfairelinux.com',
133 'managerUsername': username,
134 'archivePassword': password
135 });
Larbi Gharibe9af9732021-03-31 15:08:01 +0100136
Adrien Béraud3b5d9a62021-04-17 18:40:27 -0400137 const newProps = jami.getAccount(accountId).details;
138 console.log(newProps);
139 //Object.entries(newProps).forEach(v => console.log(v[0], v[1]))
140 //tempAccountId = accountId;
141 newUser.accountId = accountId;
142 console.log("AccountId: " + accountId);
143 connectedUsers[accountId] = newUser;
144 tempAccounts[accountId] = { done, newUser };
145
146 //return done(null, newUser);
147
148 /*User.findOne({ username: username }, function (err, user) {
149 if (err) { return done(err); }
150 if (!user) {
151 return done(null, false, { message: 'Incorrect username.' });
152 }
153 if (!user.validPassword(password)) {
154 return done(null, false, { message: 'Incorrect password.' });
155 }
156 return done(null, user);
157 });*/
158 }
159 );
160 jamsStrategy.name = "jams";
161
162 const localStrategy = new LocalStrategy(
163 (username, password, done) => {
164 console.log("localStrategy: " + username + " " + password);
165
166 const newUser = {};
167 newUser.accountId = jami.getAccountList()[0].getId();
168 console.log("Local AccountId: " + newUser.accountId);
169 connectedUsers[newUser.accountId] = newUser;
170 done(null, newUser);
171 }
172 );
173
174 passport.use(jamsStrategy);
175 passport.use(localStrategy);
176
177 const secured = (req, res, next) => {
178 console.log(`isSecured ${req.user}`);
179 if (req.user && req.user.accountId) {
180 return next();
181 }
182 res.status(401).end()
183 };
184 const securedRedirect = (req, res, next) => {
185 if (req.user && req.user.accountId) {
186 return next();
187 }
188 req.session.returnTo = req.originalUrl;
189 res.redirect('/login');
190 };
191
192 app.post('/auth', passport.authenticate('jams'), (req, res) => {
193 res.json({ loggedin: true })
194 });
195 app.post('auth/localLogin', passport.authenticate('local'), (req, res) => {
196 res.json({ loggedin: true })
197 });
198
199 app.use('/api', secured, apiRouter);
200
201 app.use('/', indexRouter);
202
203 /* GET React App */
204
205 app.use(express.static(path.join(__dirname, 'client', 'dist')))
206
207 app.use((req, res, next) => {
208 res.sendFile(path.join(__dirname, 'client', 'dist', 'index.html'));
209 });
210
211 return http.Server(app);
212}
213
214loadConfig()
215 .then(createServer)
216 .then(server => {
217 server.listen(3000);
218 })
Larbi Gharibe9af9732021-03-31 15:08:01 +0100219
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400220/*
Larbi Gharibe9af9732021-03-31 15:08:01 +0100221io.on('connection', (socket) => {
222 console.log("Client just connected !")
223 socket.on('SendMessage', (data) => {
224 console.log("Message " + data.text + " sent to " + data.destinationId + " by " + socket.session.user.accountId);
225 const msgMap = new jami.dring.StringMap();
226 msgMap.set('text/plain', data.text);
227 jami.dring.sendAccountTextMessage(socket.session.user.accountId, data.destinationId, msgMap);
228 });
229});
230
Larbi Gharibe9af9732021-03-31 15:08:01 +0100231io.use((socket, next) => {
232 cookieParser(socket.handshake, {}, (err) => {
233 if (err) {
234 console.log("error in parsing cookie");
235 return next(err);
236 }
237 if (!socket.handshake.signedCookies) {
238 console.log("no secureCookies|signedCookies found");
239 return next(new Error("no secureCookies found"));
240 }
241 sessionStore.get(socket.handshake.signedCookies["connect.sid"], (err, session) => {
242 socket.session = session;
243 if (!err && !session) err = new Error('session not found');
244 if (err) {
245 console.log('failed connection to socket.io:', err);
246 } else {
247 console.log(session);
248 console.log('successful connection to socket.io ' + session.passport.user);
249 const userKey = session.passport.user;
250 deserializeUser(userKey, (err, user) => {
251 console.log("deserializeUser: " + user)
252 if (err)
253 return next(err, true);
254 if (!user)
255 return next("User not found", false);
256
257 console.log("User associated socket id: " + socket.id)
258 user.socketId = socket.id;
259 socket.session.user = user;
260 console.log("User added to session --------> " + user.accountId);
Larbi Gharibe9af9732021-03-31 15:08:01 +0100261 //auth.success(data, accept);
262 next(err, true);
263 });
264 }
265 });
266 });
267});
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400268*/