blob: 861409e97528f9ee7538b910cb8b173ec43e8576 [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éraud6ecaa402021-04-06 17:37:25 -040012const redis = require('redis-url').connect()
Larbi Gharibe9af9732021-03-31 15:08:01 +010013const 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 parser = require('fast-xml-parser')
Larbi Gharibe9af9732021-03-31 15:08:01 +010021
Adrien Béraud6ecaa402021-04-06 17:37:25 -040022const JamiRestApi = require('./routes/jami')
23const JamiDaemon = require('./JamiDaemon')
Larbi Gharibe9af9732021-03-31 15:08:01 +010024
Adrien Béraud6ecaa402021-04-06 17:37:25 -040025//const sessionStore = new RedisStore({ client: redis })
26const sessionStore = new session.MemoryStore()
Larbi Gharibe9af9732021-03-31 15:08:01 +010027
Adrien Béraud6ecaa402021-04-06 17:37:25 -040028const app = express()
Larbi Gharibe9af9732021-03-31 15:08:01 +010029
30/*
31 Configuation for Passeport Js
32*/
Adrien Béraud6ecaa402021-04-06 17:37:25 -040033//app.use(cookieParser(process.env.SECRET_KEY_BASE));
34app.disable('x-powered-by');
Larbi Gharibe9af9732021-03-31 15:08:01 +010035
Larbi Gharibe9af9732021-03-31 15:08:01 +010036app.use(session({
Adrien Béraud6ecaa402021-04-06 17:37:25 -040037 //store: sessionStore,
Larbi Gharibe9af9732021-03-31 15:08:01 +010038 resave: false,
Adrien Béraud6ecaa402021-04-06 17:37:25 -040039 saveUninitialized: true,
Larbi Gharibe9af9732021-03-31 15:08:01 +010040 cookie: {
Adrien Béraud6ecaa402021-04-06 17:37:25 -040041 secure: false,//process.env.ENVIRONMENT !== 'development' && process.env.ENVIRONMENT !== 'test',
Larbi Gharibe9af9732021-03-31 15:08:01 +010042 maxAge: 2419200000
43 },
44 secret: process.env.SECRET_KEY_BASE
45}));
Larbi Gharibe9af9732021-03-31 15:08:01 +010046app.use(passport.initialize());
47app.use(passport.session());
48// app.use(app.router);
49//app.use(cors())
50
51/*
52 Share sessions between Passport.js and Socket.io
53*/
54
55function logSuccess() {
56 console.log("passportSocketIo authorized user with Success 😁");
57}
58
59function logFail() {
60 console.log("passportSocketIo failed to authorized user 👺");
61}
62
63/*
64io.use(passportSocketIo.authorize({
65 key: 'connect.sid',
66 secret: process.env.SECRET_KEY_BASE,
67 store: sessionStore,
68 passport: passport,
69 cookieParser: cookieParser,
70 //success: logSuccess(),
71 // fail: logFail(),
72}));
73*/
74
75/*
76
77 tempAccounts holds users accounts while tempting to authenticate them on Jams.
78 connectedUsers holds users accounts after they got authenticated by Jams.
79
Adrien Béraud6ecaa402021-04-06 17:37:25 -040080 Users should be removed from connectedUsers when receiving a disconnect
Larbi Gharibe9af9732021-03-31 15:08:01 +010081 web socket call
82
83*/
84const tempAccounts = {};
85const connectedUsers = {};
86
Adrien Béraud6ecaa402021-04-06 17:37:25 -040087const jami = new JamiDaemon();
88const apiRouter = new JamiRestApi(jami).getRouter()
Larbi Gharibe9af9732021-03-31 15:08:01 +010089
Adrien Béraud6ecaa402021-04-06 17:37:25 -040090passport.serializeUser((user, done) => {
Larbi Gharibe9af9732021-03-31 15:08:01 +010091 console.log(user)
92 connectedUsers[user.accountId] = user;
93 console.log("=============================SerializeUser called " + user.accountId)
94 done(null, user.accountId);
95});
96
Larbi Gharibe9af9732021-03-31 15:08:01 +010097const deserializeUser = (id, done) => {
98 console.log("=============================DeserializeUser called on: " + id + " " + connectedUsers[id])
99 done(null, connectedUsers[id]);
100};
101passport.deserializeUser(deserializeUser);
102
103//var tempAccountId = '';
104
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400105const jamsStrategy = new LocalStrategy(
Larbi Gharibe9af9732021-03-31 15:08:01 +0100106 (username, password, done) => {
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400107
Larbi Gharibe9af9732021-03-31 15:08:01 +0100108 const newUser = {};
109 newUser.username = username;
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400110 //newUser.socketid =
Larbi Gharibe9af9732021-03-31 15:08:01 +0100111
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400112 const accountId = jami.addAccount({
113 'managerUri': 'https://jams.savoirfairelinux.com',
114 'managerUsername': username,
115 'archivePassword': password
116 });
Larbi Gharibe9af9732021-03-31 15:08:01 +0100117
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400118 const newProps = jami.getAccount(accountId).details;
Larbi Gharibe9af9732021-03-31 15:08:01 +0100119 console.log(newProps);
120 //Object.entries(newProps).forEach(v => console.log(v[0], v[1]))
121 //tempAccountId = accountId;
122 newUser.accountId = accountId;
123 console.log("AccountId: " + accountId);
124 connectedUsers[accountId] = newUser;
125 tempAccounts[accountId] = { done, newUser };
126
127 //return done(null, newUser);
128
129 /*User.findOne({ username: username }, function (err, user) {
130 if (err) { return done(err); }
131 if (!user) {
132 return done(null, false, { message: 'Incorrect username.' });
133 }
134 if (!user.validPassword(password)) {
135 return done(null, false, { message: 'Incorrect password.' });
136 }
137 return done(null, user);
138 });*/
139 }
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400140);
141jamsStrategy.name = "jams";
Larbi Gharibe9af9732021-03-31 15:08:01 +0100142
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400143const localStrategy = new LocalStrategy(
144 (username, password, done) => {
145 console.log("localStrategy: " + username + " " + password);
146
147 const newUser = {};
148 newUser.accountId = jami.getAccountList()[0].getId();
149 console.log("Local AccountId: " + newUser.accountId);
150 connectedUsers[newUser.accountId] = newUser;
151 done(null, newUser);
152 }
153);
154
155passport.use(jamsStrategy);
156passport.use(localStrategy);
157
158const secured = (req, res, next) => {
159 console.log(`isSecured ${req.user}`);
160 if (req.user && req.user.accountId) {
161 return next();
162 }
163 res.status(401).end()
164};
165const securedRedirect = (req, res, next) => {
166 if (req.user && req.user.accountId) {
167 return next();
168 }
169 req.session.returnTo = req.originalUrl;
170 res.redirect('/login');
171};
172
173app.post('/auth', passport.authenticate('jams'), (req, res) => {
174 res.json({ loggedin: true })
Larbi Gharibe9af9732021-03-31 15:08:01 +0100175});
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400176app.post('/api/localLogin', passport.authenticate('local'), (req, res) => {
177 res.json({ loggedin: true })
178});
179
180app.use('/api', secured, apiRouter);
181
Larbi Gharibe9af9732021-03-31 15:08:01 +0100182app.use('/', indexRouter);
183
184/* GET React App */
185
186app.use(express.static(path.join(__dirname, 'public')))
187
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400188app.use((req, res, next) => {
Larbi Gharibe9af9732021-03-31 15:08:01 +0100189 res.sendFile(path.join(__dirname, 'public', 'index.html'));
190});
191
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400192const server = http.Server(app);
Larbi Gharibe9af9732021-03-31 15:08:01 +0100193server.listen(3000);
194
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400195/*
Larbi Gharibe9af9732021-03-31 15:08:01 +0100196io.on('connection', (socket) => {
197 console.log("Client just connected !")
198 socket.on('SendMessage', (data) => {
199 console.log("Message " + data.text + " sent to " + data.destinationId + " by " + socket.session.user.accountId);
200 const msgMap = new jami.dring.StringMap();
201 msgMap.set('text/plain', data.text);
202 jami.dring.sendAccountTextMessage(socket.session.user.accountId, data.destinationId, msgMap);
203 });
204});
205
Larbi Gharibe9af9732021-03-31 15:08:01 +0100206io.use((socket, next) => {
207 cookieParser(socket.handshake, {}, (err) => {
208 if (err) {
209 console.log("error in parsing cookie");
210 return next(err);
211 }
212 if (!socket.handshake.signedCookies) {
213 console.log("no secureCookies|signedCookies found");
214 return next(new Error("no secureCookies found"));
215 }
216 sessionStore.get(socket.handshake.signedCookies["connect.sid"], (err, session) => {
217 socket.session = session;
218 if (!err && !session) err = new Error('session not found');
219 if (err) {
220 console.log('failed connection to socket.io:', err);
221 } else {
222 console.log(session);
223 console.log('successful connection to socket.io ' + session.passport.user);
224 const userKey = session.passport.user;
225 deserializeUser(userKey, (err, user) => {
226 console.log("deserializeUser: " + user)
227 if (err)
228 return next(err, true);
229 if (!user)
230 return next("User not found", false);
231
232 console.log("User associated socket id: " + socket.id)
233 user.socketId = socket.id;
234 socket.session.user = user;
235 console.log("User added to session --------> " + user.accountId);
Larbi Gharibe9af9732021-03-31 15:08:01 +0100236 //auth.success(data, accept);
237 next(err, true);
238 });
239 }
240 });
241 });
242});
Adrien Béraud6ecaa402021-04-06 17:37:25 -0400243*/