Advertisement
Guest User

Untitled

a guest
Oct 22nd, 2014
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var mysql = require('mysql');
  2.  
  3. var serverDB = (function(connectionData, callback) {
  4.     var queries = {
  5.         markRead    : "UPDATE messages SET readable = TRUE WHERE message_id = ?",
  6.         getHistory  : "SELECT * FROM messages WHERE (date_time >= ?) AND ((from_login = ? AND to_login = ?) OR (from_login = ? AND to_login = ?) ) ORDER BY date_time",
  7.         getUG       : "SELECT * FROM users; SELECT * FROM groups",
  8.         login       : "SELECT 1 FROM users WHERE login = ? AND password = ?",
  9.         userExists  : "SELECT 1 FROM users WHERE login = ?",
  10.         insertMess  : "INSERT INTO messages SET ?",
  11.         addUser     : "INSERT INTO users SET ?",
  12.         deleteUser  : "DELETE FROM users WHERE login = ?"
  13.     };
  14.  
  15.     var connData = connectionData;
  16.     connData.multipleStatements = true;
  17.    
  18.     var mysqlConnection = mysql.createConnection (connectionData);
  19.     mysqlConnection.connect ( function (error) {
  20.         if (error)
  21.             throw error;
  22.         console.log ('Successfully connected to MySQL server.');
  23.        
  24.         if (callback)
  25.             callback(this);
  26.     });
  27.    
  28.    
  29.     function _messageSetRead(id, callback) {
  30.         var query = util.format (queries.markRead, id);
  31.         mysqlConnection.query (query, function (err) {
  32.             if (err)
  33.                 throw err;
  34.             if (callback)
  35.                 callback();
  36.         });
  37.     }
  38.    
  39.     function _getHistory (loginFrom, loginTo, dateAfter, callback) {
  40.         mysqlConnection.query (
  41.                 queries.getHistory,
  42.                 [dateAfter, loginFrom, loginTo, loginTo, loginFrom],
  43.                 function (err, rows) {
  44.                     if (err)
  45.                         throw err;
  46.                     if (callback)
  47.                         callback (rows);
  48.                 }
  49.         );
  50.     }
  51.    
  52.     function _getUG(callback) {
  53.         mysqlConnection.query (queries.getUG, function (err, result) {
  54.             if (err)
  55.                 throw err;
  56.             if (callback)
  57.                 callback (result[0], result[1]);
  58.         });
  59.     }
  60.    
  61.     function _checkUser(login, password, callback){
  62.         mysqlConnection.query (queries.login, [login, password], function (err, result) {
  63.             if (err)
  64.                 throw err;
  65.             if (callback)
  66.                 callback (result.length !== 0);
  67.         });
  68.     }
  69.    
  70.     function _insertMessage (from, to, message, time, callback){
  71.         var insertSet = {
  72.             'from_login' : from,
  73.             'to_login' : to,
  74.             'message' : message,
  75.             'date_time' : time
  76.         }; 
  77.        
  78.         mysqlConnection.query (queries.insertMess, insertSet, function (err, result) {
  79.             if (err)
  80.                 throw err;
  81.             if (callback)
  82.                 callback (result.id);
  83.         });
  84.     }
  85.    
  86.     function _userExists (login, callback){
  87.         mysqlConnection.query (queries.userExists, login, function (err, result) {
  88.             if(err)
  89.                 throw err;
  90.             if (callback)
  91.                 callback (result.length !== 0);
  92.         });
  93.     }
  94.  
  95.     function _addUser (user, callback){
  96.         mysqlConnection.query (queries.addUser, user, function (err, result) {
  97.             if(err)
  98.                 throw err;
  99.             if (callback)
  100.                 callback();
  101.         });
  102.     }
  103.  
  104.     function _deleteUser (login, callback){
  105.         mysqlConnection.query (queries.deleteUser, login, function (err, result) {
  106.             if(err)
  107.                 throw err;
  108.             if (callback)
  109.                 callback();
  110.         });
  111.     }
  112.    
  113.     return {
  114.         messageSetRead : _messageSetRead,
  115.         getHistory : _getHistory,
  116.         getUG : _getUG,
  117.         checkUser : _checkUser,
  118.         insertMessage : _insertMessage,
  119.         userExists : _userExists,
  120.         addUser : _addUser,
  121.         deleteUser : _deleteUser,
  122.     };
  123.  
  124. })({
  125.      host     : '178.62.178.14',
  126.      user     : 'root',
  127.      password : 'databasepassword',
  128.      database : 'corporative_messenger'
  129. });
  130.  
  131. function ChatClient (clientSocket) {
  132.     this.websocket = clientSocket;
  133.     this.authorized = false;
  134.     this.authorizedAdmin = false;
  135.     this.websocket.on ('message', this.onMessage);
  136.     this.websocket.on ('close', this.onClose);
  137.     this.websocket.on ('error', this.onError);
  138. }
  139.  
  140. ChatClient.prototype.onClose = function (){
  141.     server.disconnect (this);
  142. }
  143.  
  144. ChatClient.prototype.onError = function() {
  145.  
  146. }
  147.  
  148. ChatClient.prototype.onMessage = function(message) {
  149.     try {
  150.         var messageData = JSON.parse(message);
  151.  
  152.         if (this.authorizedAdmin){
  153.             switch (message.type) {
  154.                 case 'AdminAddUser': break;
  155.                 case 'AdminAddGroup': this.historyRequest (message.to, message.date_time); break;
  156.                 case 'AdminDeleteUser': this.messageRead (message.id); break;
  157.                 case 'AdminDeleteGroup': this.getUsersGroups (); break;
  158.             }
  159.         }
  160.         if (this.authorized){
  161.             switch (message.type) {
  162.                 case 'SendMessageRequest': this.sendMessage (message.to, message.message); break;
  163.                 case 'HistoryRequest': this.historyRequest (message.to, message.date_time); break;
  164.                 case 'MessageAlreadyReadable': this.messageRead (message.id); break;
  165.                 case 'GetUsersGroups': this.getUsersGroups (); break;
  166.  
  167.                 default: console.log ('Unknown event ' + message.type + 'from ' + this.login);
  168.             }
  169.         }else {
  170.             switch (messageData.type) {
  171.                     case 'AuthorizeRequest' : this.obtainSession (message.login, message.password); break;
  172.                     case 'ConfirmSession': this.confirmSession (this.login, message.session_id); break;
  173.                    
  174.                     default: console.log ('Unknown event ' + message.type + 'from ' + this.login);
  175.             }
  176.         }
  177.     } catch (e) {
  178.         console.log ('Bad message from ' + this.login);
  179.     }
  180. };
  181.  
  182.  
  183. ChatClient.prototype.adminAddUser = function (user, callback){
  184.     server.addUser (user, function(answer) {
  185.         this.sendData (answer, callback);
  186.     });
  187. }
  188.  
  189. ChatClient.prototype.adminDeleteUser = function (user, callback){
  190.     server.deleteUser (user, function(answer) {
  191.         this.sendData (answer, callback);
  192.     });
  193. }
  194.  
  195. ChatClient.prototype.adminAddGroup = function (group, callback) {
  196.     server.addGroup (group, function(answer) {
  197.         this.sendData (answer, callback);
  198.     });
  199. }
  200.  
  201. ChatClient.prototype.adminDeleteGroup = function (group, callback) {
  202.     server.deleteGroup (group, function(answer) {
  203.         this.sendData (answer, callback);
  204.     });
  205. }
  206.  
  207. ChatClient.prototype.successAuth = function (callback){
  208.     server.successAuth (this, callback);
  209. }
  210.  
  211. ChatClient.prototype.getUsersGroups = function (callback){
  212.     serverDB.getUG (function(users, groups){
  213.         this.sendData ({
  214.             type : 'UsersGroups',
  215.             allUsers: users,
  216.             groupName: groups
  217.         }, callback);
  218.     });
  219. }
  220. ChatClient.prototype.sendData = function (data, callback){
  221.     if (this.websocket)
  222.         this.websocket.send (JSON.stringify (data), function (error) {
  223.             if (error)
  224.                 throw error;
  225.             if (callback)
  226.                 callback();
  227.         });
  228. }
  229.  
  230. ChatClient.prototype.authorize = function (login, password, callback){    
  231.     serverDB.checkUser (login, password, function (authorized){
  232.         if (authorized){
  233.             this.login = login;
  234.             this.authorized = true;
  235.             if (login == 'admin')
  236.                 this.authorizedAdmin = authorized;
  237.  
  238.             this.sendData ({
  239.                 type: 'AuthorizeRequestAnswer',
  240.                 answer: 'SuccessAuthorization'
  241.             }, function () {
  242.                 this.successAuth (callback);
  243.             })
  244.         } else {
  245.             this.sendData ({
  246.                 type: 'AuthorizeRequestAnswer',
  247.                 answer: 'WrongLoginOrPassword'
  248.             }, callback);
  249.         }
  250.     });
  251. }
  252.  
  253.  
  254. ChatClient.prototype.sessionExpired = function (callback) {
  255.     this.sendData ({
  256.         type: 'AdminYouHasBeenDeleted'
  257.     }, function () {
  258.         this.websocket.close();
  259.         if (callback)
  260.             callback();
  261.     });
  262.  
  263. }
  264.  
  265. ChatClient.prototype.sendMessage = function (to, message, callback) {
  266.     var currentTime = new Date();
  267.     serverDB.insertMessage (this.login, to, message, currentTime, function (id) {
  268.         var messageData = {
  269.             type: 'RenderMessageRequest',
  270.             id:         id,
  271.             from:       this.login,
  272.             to:         to,
  273.             message:    message,
  274.             date_time:  currentTime,
  275.             readable:   false
  276.         };
  277.  
  278.         server.sendTo(this.login, messageData, function (){
  279.             server.sendTo (msg.to, messageData, callback);
  280.         });
  281.     });
  282. }
  283.  
  284. ChatClient.prototype.historyRequest = function (loginTo, dateAfter, callback) {
  285.     serverDB.getHistory (this.login, loginTo, dateAfter, function (history){
  286.         this.sendData ({
  287.             type: 'HistoryRequestAnswer',
  288.             answer: history
  289.         }, callback);
  290.     });
  291. }
  292.  
  293. ChatClient.prototype.messageRead = function (id, callback) {
  294.     serverDB.messageSetRead (id, callback);
  295. }
  296.  
  297. ChatClient.prototype.userOnlineStatus = function (user, ustate, callback){
  298.     this.sendData ({
  299.         type: 'OnlineOfflineStateRequest',
  300.         login: user,
  301.         state: ustate
  302.     }, callback);
  303. }
  304.  
  305. ChatClient.prototype.addUser = function (userd, callback){
  306.     this.sendData ({
  307.         type: 'AdminAddUserAnswer',
  308.         user: userd,
  309.         answer: 'UserHasBeenAdded'
  310.     }, callback);
  311. }
  312.  
  313. ChatClient.prototype.deleteUser = function (logind, callback){
  314.     if (logind == this.login)
  315.         this.sessionExpired (callback);
  316.     else {
  317.         this.sendData ({
  318.             type: 'AdminUserHasBeenDeleted',
  319.             login: logind
  320.         }, callback);
  321.     }
  322. }
  323.  
  324. ChatClient.prototype.addGroup = function (group_name, callback) {  
  325. }
  326.  
  327. ChatClient.prototype.deleteGroup = function (group_id, callback) {  
  328. }
  329.  
  330. // ----------------------------------------------------------------------------
  331. var server = (function (){
  332.     var TWebSocketServer = require('ws').Server;
  333.     var TMySQL =  require('mysql');
  334.     var wsserver = new TWebSocketServer ({ port: 1337 });
  335.  
  336.     var connectedClients = [];
  337.     var authorizedClients = {};
  338.  
  339.     wsserver.on ('connection', function (ws){
  340.         connectedClients.push (new ChatClient (ws));
  341.     });
  342.  
  343.     wsserver.on ('error', function (error) {
  344.         if (error)
  345.             throw error;
  346.     });
  347.  
  348.     function successAuth (client, callback){
  349.         authorizedClients [client.login] = client;
  350.     }
  351.  
  352.     function disconnect (client) {
  353.         delete authorizedClients [client.login];
  354.         connectedClients.remove (client);
  355.     }
  356.  
  357.     function sendTo (login, messageData, callback) {
  358.         if (authorizedClients[login])
  359.             authorizedClients[login].sendData (messageData, callback);
  360.     }
  361.  
  362.     function addUser (user, callback){
  363.         serverDB.userExists (user.login, function (r){
  364.             if (r) {
  365.                 if (callback)
  366.                     callback ({
  367.                         type: 'AdminAddUserAnswer',
  368.                         answer: 'UserAlreadyExist',
  369.                         user: user
  370.                     });
  371.             }else {
  372.                 serverDB.addUser (user, function (){
  373.                     authorizedClients.forEach (function (client){
  374.                         client.addUser (user);
  375.                     });
  376.  
  377.                     if (callback)
  378.                         callback ({
  379.                             type: 'AdminAddUserAnswer',
  380.                             answer: 'UserHasBeenAdded',
  381.                             user: user
  382.                         });
  383.                 });
  384.             }
  385.         });
  386.     }
  387.  
  388.     function deleteUser (user, callback){
  389.         serverDB.userExists (user.login, function (r){
  390.             if (!r) {
  391.                 if (callback)
  392.                     callback ({
  393.                         type: 'AdminDeleteUserAnswer',
  394.                         answer: 'UserDoesNotExist',
  395.                         user: user
  396.                     });
  397.             }else {
  398.                 serverDB.deleteUser (user, function (){
  399.                     authorizedClients.forEach (function (client){
  400.                         client.deleteUser (user);
  401.                     });
  402.  
  403.                     if (callback)
  404.                         callback ({
  405.                             type: 'AdminDeleteUserAnswer',
  406.                             answer: 'UserHasBeenDeleted',
  407.                             user: user
  408.                         });
  409.                 });
  410.             }
  411.         });
  412.     }    
  413.  
  414.     function adminAddGroup (group, callback){
  415.  
  416.     }
  417.  
  418.     function deleteGroup (group, callback){
  419.  
  420.     }
  421.  
  422.     Array.prototype.remove = function (value) {
  423.         var i = this.indexOf(value);
  424.         if (i === -1) return;
  425.         this.splice(i, 1);
  426.     };
  427.  
  428.     return {
  429.  
  430.     }
  431. })();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement