Advertisement
Guest User

Untitled

a guest
Jul 10th, 2016
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.55 KB | None | 0 0
  1. //Modules require
  2. var path = require('path');
  3. var express = require('express');
  4. var cookieParser = require('cookie-parser');
  5. var bodyParser = require('body-parser');
  6. var socketio = require('socket.io');
  7. var log = require('./log');
  8. var validator = require("email-validator");
  9. var session = require("express-session");
  10. var User = require('./models/user').User;
  11. var Project = require('./models/project').Project;
  12. var ObjectId = require('mongodb').ObjectID
  13. var app = express();
  14. var io = require('socket.io')(1273);
  15. var cookie = require('cookie');
  16. var connect = require('connect');
  17. var MongoStore = require('connect-mongo')(session);
  18. var sessionStore = new MongoStore({ url: 'mongodb://localhost/session' });
  19. var url = require("url.js");
  20.  
  21. //Functions
  22. var ObID = function(id)
  23. {
  24. try {
  25. id = ObjectId(id);
  26. }catch(err) {
  27. err = false;
  28. id = '';
  29. }
  30. return id;
  31. }
  32.  
  33. var link_format = function (link) {
  34. link_par = url.parse(link);
  35.  
  36. if (!link_par.scheme) {
  37. link = 'http://' + link;
  38. }
  39.  
  40. if (!link_par.path) {
  41. link = link + '/';
  42. }
  43.  
  44. return link.toLowerCase();
  45. }
  46.  
  47. var json = function(data)
  48. {
  49. return JSON.stringify(data);
  50. }
  51.  
  52. var login = function(user, req, res)
  53. {
  54. var rand = Math.random() + '';
  55.  
  56. User.update({email: user.email}, {ip: req.remote_addr, rand: rand}, { multi: true }, function(){
  57. log('[' + user.email + '] авторизован', ' Auth ');
  58. req.session.rand = rand;
  59. req.session._id = user._id;
  60. res.send(json({res: 'ok', auth: 'ok'}));
  61. });
  62. }
  63.  
  64. var vEmail = function(email)
  65. {
  66. var re = /\S+@\S+\.\S+/;
  67. return re.test(email);
  68. };
  69.  
  70. var vPhone = function(phone)
  71. {
  72. var phoneno = /^\+?([0-9]{2})\)?[-. ]?([0-9]{4})[-. ]?([0-9]{4})$/;
  73. return phoneno.test(phone);
  74. };
  75.  
  76. var explode = function(delimiter, string)
  77. {
  78. var emptyArray = { 0: '' };
  79. if ( arguments.length != 2
  80. || typeof arguments[0] == 'undefined'
  81. || typeof arguments[1] == 'undefined' )
  82. {
  83. return null;
  84. }
  85. if ( delimiter === ''
  86. || delimiter === false
  87. || delimiter === null )
  88. {
  89. return false;
  90. }
  91. if ( typeof delimiter == 'function'
  92. || typeof delimiter == 'object'
  93. || typeof string == 'function'
  94. || typeof string == 'object' )
  95. {
  96. return emptyArray;
  97. }
  98. if ( delimiter === true ) {
  99. delimiter = '1';
  100. }
  101. return string.toString().split ( delimiter.toString() );
  102. }
  103.  
  104.  
  105.  
  106. //Config
  107. app.set('views', path.join(__dirname, 'views'));
  108. app.set('view engine', 'ejs');
  109. app.set('port', 8080);
  110. app.set('secret', 'secretkeyforadscreator');
  111. app.set('key', 'sid');
  112.  
  113. //Http server start
  114. app.listen(app.get('port'));
  115. log('Start in '+app.get('port'), ' Server ');
  116.  
  117. //Use modules
  118. app.use(bodyParser.json());
  119. app.use(bodyParser.urlencoded({ extended: false }));
  120. app.use(cookieParser());
  121. app.use(express.static(path.join(__dirname, 'public')));
  122. app.use(session({
  123. secret: app.get('secret'),
  124. key: app.get('key'),
  125. resave: true,
  126. store: sessionStore,
  127. saveUninitialized: true
  128. }))
  129.  
  130. //Remote addr
  131. app.use(function(req, res, next){
  132. req.remote_addr = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
  133. req.remote_addr = req.remote_addr.replace(new RegExp(":",'g'),"").replace(new RegExp("f",'g'),"");
  134. //console.log(req.session._id);
  135. next();
  136. });
  137.  
  138. //Uri segment
  139. app.use(function(req, res, next){
  140. req.uri = explode('/', req.url + "");
  141. next();
  142. });
  143.  
  144. //Middleware api
  145. app.use('/api', function(req, res, next){
  146. switch(req.body.action){
  147. case 'reg':
  148. var data = req.body;
  149. var email = data.email;
  150. var password = data.password;
  151. var password2 = data.password2;
  152. var firstn = data.firstn;
  153. var lastn = data.lastn;
  154. var phone = data.phone;
  155. var rand = Math.random() + '';
  156.  
  157. User.find({email: email}, function(err, users){
  158. if(users.length > 0){
  159. res.send(json({res: 'ok', reg: 'no', mess: 'Пользователь с таким email уже существует'}));
  160. }else if(firstn.length < 2){
  161. res.send(json({res: 'ok', reg: 'no', mess: 'Имя не может быть менее двух символов'}));
  162. }else if(lastn.length < 2){
  163. res.send(json({res: 'ok', reg: 'no', mess: 'Фамилия не может быть менее двух символов'}));
  164. }else if(!vEmail(email)){
  165. res.send(json({res: 'ok', reg: 'no', mess: 'Не правильный формат email'}));
  166. }else if(password.length < 8){
  167. res.send(json({res: 'ok', reg: 'no', mess: 'Пароль не может быть менее 8 символов'}));
  168. }else if(password !== password2){
  169. res.send(json({res: 'ok', reg: 'no', mess: 'Пароли не совпадают'}));
  170. }else{
  171. var new_user = new User({
  172. email: email,
  173. password: password,
  174. ip: req.remote_addr,
  175. firstn: firstn,
  176. lastn: lastn,
  177. rand: rand
  178. });
  179.  
  180. new_user.save(function(err, user){
  181. if(err)
  182. {
  183. res.send(json({res: 'error', reg: 'no'}));
  184. }
  185. else
  186. {
  187. log('[' + user.email + '] зарегистрирован', ' Auth ');
  188. req.session.rand = user.rand;
  189. req.session._id = user._id;
  190. res.send(json({res: 'ok', reg: 'ok'}));
  191. }
  192. });
  193. }
  194. })
  195. break;
  196. case 'auth':
  197. var data = req.body;
  198. var email = data.email || '';
  199. var password = data.password || '';
  200.  
  201. User.findOne({email: email}, function(err, user){
  202. //if(err) throw err;
  203. user ? user.checkPassword(password) ? login(user, req, res):
  204. res.send(json({res: 'ok', auth: 'no'})):res.send(json({res: 'ok', auth: 'no'}));
  205. });
  206. break;
  207. default:
  208. res.send(json({res: 'error'}));
  209. break;
  210. }
  211. });
  212.  
  213. //Middleware auth
  214. app.use(function(req, res, next){
  215. req.session._id = req.session._id || '';
  216.  
  217. var find = {};
  218.  
  219. find['_id'] = ObID(req.session._id);
  220. find['ip'] = req.remote_addr;
  221.  
  222. User.findOne(find, function(err, user){
  223. (user) ? (req.user = user) : (req.user = false);
  224. (user) ? (req.session.user = user) : (req.session.user = false);
  225. (req.url !== '/auth' && req.url !== '/reg' && !req.user)? (res.redirect('/auth')): next();
  226. });
  227. })
  228.  
  229. //Log pages
  230. app.use(function(req, res, next){
  231. if(req.user){
  232. log('['+req.user.email+'] запросил "'+req.url+'"', ' Http ');
  233. }else{
  234. log('['+req.remote_addr+'] запросил "'+req.url+'"', ' Http ');
  235. }
  236. next();
  237. });
  238.  
  239. //Http pages
  240. app.use(function (req, res, next) {
  241. if (req.url !== '/auth' && req.url !== '/reg'){
  242. next();
  243. } else {
  244. for (var i in io.sockets.sockets) {
  245. var socket = io.sockets.sockets[i];
  246.  
  247. if (socket.handshake.id + '' === req.session.user._id + '') {
  248. socket.disconnect();
  249. }
  250. }
  251.  
  252. req.session.destroy(function () {
  253. req.user = false;
  254. res.render('auth', { form: req.url.replace('/', '') });
  255. });
  256.  
  257. }
  258.  
  259. });
  260.  
  261. app.get('/', function(req, res, next){
  262. res.render('projects', {href: req.uri[1]});
  263. });
  264.  
  265. app.use(function (req, res, next) {
  266. res.render('404', { href: req.uri[1] });
  267. });
  268.  
  269. io.on('connection', function (socket) {
  270.  
  271. socket.emits = function (event, data) {
  272. evetn = event || false;
  273. data = data || false;
  274.  
  275. if (event && data) {
  276. for (var i in io.sockets.sockets) {
  277. var client = io.sockets.sockets[i];
  278.  
  279. if (client.handshake.id + '' === socket.handshake.id + '') {
  280. client.emit(event, data);
  281. }
  282. }
  283. }
  284.  
  285. }
  286.  
  287. var data = socket.handshake;
  288. var ssid = cookie.parse(data.headers.cookie, 'secret=' + app.get('secret'))[app.get('key')];
  289.  
  290. var sid = cookieParser.signedCookie(ssid, app.get('secret'));
  291.  
  292. sessionStore.load(sid, function (err, session) {
  293. if (session.user) {
  294. var user = session.user;
  295. log('[' + user.email + '] покдлючен', ' IO ');
  296. socket.handshake.id = user._id;
  297.  
  298. socket.on('create_project', function (data) {
  299. var name = data.name;
  300. var link = data.link;
  301.  
  302. link = link_format(link);
  303.  
  304. var new_project = new Project({ owner: user._id, name: name, link: link });
  305.  
  306. new_project.save(function (err, project) {
  307. log('[' + session.user.email + '] создал проект', ' IO ');
  308. socket.emits('add_project', project);
  309. });
  310. });
  311.  
  312. socket.on('edit_project_save', function (data) {
  313. var id = data.id;
  314. var name = data.name;
  315. var link = data.link;
  316.  
  317. link = link_format(link);
  318.  
  319. Project.update({ _id: ObID(id) }, { name: name, link: link }, { multi: true }, function (err, result) {
  320. Project.findOne({ _id: ObID(id) }, function (err, project) {
  321. log('[' + session.user.email + '] изменил проект', ' IO ');
  322. socket.emits('edit_project_save', project);
  323. });
  324.  
  325. });
  326. });
  327.  
  328. socket.on('edit_project', function (id) {
  329. Project.find({ _id: ObID(id) }, function (err, projects) {
  330. socket.emit('edit_project', projects);
  331. });
  332. });
  333.  
  334. socket.on('remove_project', function (id) {
  335. Project.find({ _id: ObID(id) }).remove(function () {
  336. log('[' + session.user.email + '] удалил проект', ' IO ');
  337. socket.emits('remove_project', id);
  338. });
  339. });
  340.  
  341. socket.on('projects_load', function () {
  342. log('[' + user.email + '] запросил список проектов', ' IO ');
  343.  
  344. Project.find({ owner: user._id }, function (err, projects) {
  345. if (err) {
  346. socket.emit('error', 'Ошибка подключения к базе')
  347. } else {
  348. socket.emit('projects_load', projects);
  349. }
  350. });
  351. });
  352.  
  353. socket.on('disconnect', function () {
  354. log('[' + session.user.email + '] отключен', ' IO ');
  355. })
  356. } else {
  357. socket.disconnect();
  358. }
  359. });
  360.  
  361.  
  362. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement