Guest User

Untitled

a guest
Nov 29th, 2018
248
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.54 KB | None | 0 0
  1. var express = require('express')
  2. , app = express.createServer()
  3. , cookie = require('cookie')
  4. , io = require('socket.io')
  5. , _ = require('underscore')._
  6. , redis = require('redis')
  7. , dbmysql = require('db-mysql')
  8. , mysql = new dbmysql.Database({
  9. hostname: '',
  10. port: 3306,
  11. user: '',
  12. password: '',
  13. database: '',
  14. initCommand: 'SET NAMES utf8'
  15. }).on('error', function(error) {
  16. console.log('ERROR: ' + error);
  17. }).on('ready', function(server) {
  18. console.log('Connected to ' + server.hostname + ' (' + server.version + ')');
  19. });
  20.  
  21. var sessionStore = new express.session.MemoryStore({ reapInterval: 60000 * 10 });
  22. app.configure(function(){
  23. app.set('views', __dirname + '/views');
  24. app.set('view engine', 'ejs');
  25. app.use(express.cookieParser());
  26. app.use(express.session({
  27. "secret": "secret",
  28. "store": sessionStore,
  29. "key": 'express.sid',
  30. }));
  31. app.use(express.bodyParser());
  32. app.use(express.methodOverride());
  33. app.use(app.router);
  34. app.use(express.static(__dirname + '/public'));
  35. });
  36.  
  37. app.configure('development', function(){
  38. app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
  39. });
  40.  
  41. app.configure('production', function(){
  42. app.use(express.errorHandler());
  43. });
  44.  
  45. function requireLogin (req, res, next) {
  46. if (req.session.username) {
  47. // User is authenticated, let him in
  48. next();
  49. } else {
  50. // Otherwise, we redirect him to login form
  51. res.redirect("/login");
  52. }
  53. }
  54.  
  55. function validateLogin(username,password,callback) {
  56. mysql.connect(function(err){
  57. if(err) { console.log(err); callback(false,null); }
  58. var res = mysql.query('SELECT * FROM sf_guard_user WHERE username LIKE "'+mysql.escape(username)+'" AND password LIKE SHA1(CONCAT(salt,"'+mysql.escape(password)+'"))')
  59. .execute(function(error, rows, cols) {
  60. if (error) {
  61. console.log('ERROR: ' + error);
  62. callback(false,null);
  63. }
  64. callback(_.size(rows) == 1, rows[0]);
  65. });
  66. });
  67. }
  68.  
  69. app.get("/login", function (req, res) {
  70. res.render("login", { "username": req.session.username, "error": null });
  71. });
  72. app.post("/login", function (req, res) {
  73. var options = { "username": req.body.username, "error": null };
  74. if (!req.body.username) {
  75. options.error = "User name is required";
  76. res.render("login", options);
  77. } else if (!req.body.password) {
  78. options.error = "Password is required";
  79. res.render("login",options);
  80. } else if (req.body.username == req.session.username) {
  81. // User has not changed username, accept it as-is
  82. res.redirect("/");
  83. } else if (!req.body.username.match(/^[a-zA-Z0-9\-_]{3,}$/)) {
  84. options.error = "User name must have at least 3 alphanumeric characters";
  85. res.render("login", options);
  86. } else {
  87. validateLogin(req.body.username,req.body.password, function(auth,account){
  88. if(!auth)
  89. {
  90. options.error = "Username or password is invalid.";
  91. res.render("login", options);
  92. } else {
  93. req.session.username = req.body.username;
  94. req.session.account = account.id;
  95. res.redirect("/");
  96. }
  97. });
  98. }
  99. });
  100. app.get('/', [requireLogin], function(req, res){
  101. res.render('index');
  102. });
  103.  
  104. io = io.listen(app.listen(process.env.npm_package_config_port || 3000, function(){
  105. console.log("Express server listening on port %d in %s mode", process.env.npm_package_config_port || 3000, app.settings.env);
  106. }));
  107.  
  108. var RedisStore = require('socket.io/lib/stores/redis')
  109. , pub = redis.createClient()
  110. , sub = redis.createClient()
  111. , client = redis.createClient();
  112.  
  113. io.configure(function(){
  114. io.enable('browser client minification'); // send minified client
  115. io.enable('browser client etag'); // apply etag caching logic based on version number
  116. io.enable('browser client gzip'); // gzip the file
  117. io.set('log level', 1); // reduce logging
  118. io.set('transports', [ // enable all transports (optional if you want flashsocket)
  119. 'websocket'
  120. // , 'flashsocket'
  121. , 'htmlfile'
  122. , 'xhr-polling'
  123. , 'jsonp-polling'
  124. ]);
  125. io.set('store', new RedisStore({
  126. redisPub : pub
  127. , redisSub : sub
  128. , redisClient : client
  129. }));
  130. });
  131.  
  132. io.sockets.authorization(function (handshakeData, callback) {
  133. // Read cookies from handshake headers
  134. var cookies = cookie.parse(handshakeData.headers.cookie);
  135. // We're now able to retrieve session ID
  136. var sessionID = cookies['express.sid'];
  137. // No session? Refuse connection
  138. if (!sessionID) {
  139. callback('No session', false);
  140. } else {
  141. // Store session ID in handshake data, we'll use it later to associate
  142. // session with open sockets
  143. handshakeData.sessionID = sessionID;
  144. // On récupère la session utilisateur, et on en extrait son username
  145. // Hack pour avoir le bon format de sessionID
  146. var mySessionID = handshakeData.mySessionID = sessionID.substr(2,sessionID.indexOf('.')-2);
  147. sessionStore.get(mySessionID, function (err, session) {
  148. if (!err && session && session.username) {
  149. // On stocke ce username dans les données de l'authentification, pour réutilisation directe plus tard
  150. handshakeData.username = session.username;
  151. // OK, on accepte la connexion
  152. callback(null, true);
  153. } else {
  154. // Session incomplète, ou non trouvée
  155. callback(err || 'User not authenticated', false);
  156. }
  157. });
  158. }
  159. });
  160.  
  161. var connections = {};
  162. io.sockets.on('connection', function (socket) {
  163. var sessionID = socket.handshake.sessionID; // Store session ID from handshake
  164. console.log(socket.handshake);
  165. // this is required if we want to access this data when user leaves, as handshake is
  166. // not available in "disconnect" event.
  167. socket.set('username', socket.handshake.username, function(){
  168. console.log(socket.handshake.username + ' connected !');
  169. }); // Same here, to allow event "bye" with username
  170. if ('undefined' == typeof connections[sessionID]) {
  171. connections[sessionID] = { "length": 0 };
  172. // First connection
  173. }
  174. // Add connection to pool
  175. connections[sessionID][socket.id] = socket;
  176. connections[sessionID].length ++;
  177.  
  178. // do sth
  179.  
  180. socket.on('disconnect', function () {
  181.  
  182. // do sth
  183.  
  184. var userConnections = connections[sessionID];
  185. if (userConnections.length && userConnections[socket.id]) {
  186. // Forget this socket
  187. userConnections.length --;
  188. delete userConnections[socket.id];
  189. }
  190. if (userConnections.length == 0) {
  191. // No more active sockets for this user: say bye
  192. console.log(socket.get('username') + ' disconnected !');
  193. }
  194. });
  195. socket.on('error', function(err) {
  196. console.log(err);
  197. });
  198. });
Add Comment
Please, Sign In to add comment