OSDN Git Service

ライブラリーを更新した
[webchat/WebChat.git] / chatServer.js
index ae3847e..7cd3b4b 100644 (file)
@@ -24,24 +24,27 @@ $log_directory = "log";     //ログファイルを置くフォルダー
 $log_file_name = "logfile%d.txt";      //ログファイル名(%dはそのままにしておくこと)\r
 $splited_log_file_name = "logfile%d_%s.txt"    //分割後のファイル名(%dと%sはそのままにしておくこと)\r
 $pastlogfile_pattern = "logfile%d(_+.*)?\.txt";        //過去ログと判定する正規表現\r
-$logfile_pattern = "logfile[0-9]+(_*.*)?\.txt" //過去ログと判定する正規表現\r
-\r
+$secret = "5514EA2B-C9B2-4D65-8D81-1F33A180A0C2";\r
 /**\r
  * Module dependencies.\r
  */\r
 \r
 // Server\r
-var express = require('express');\r
+var express = require("express");\r
+\r
+var app = express();\r
 \r
-var app = module.exports = express.createServer();\r
+var http = require("http");\r
 \r
 var util = require("util");\r
 \r
-var lazy = require("lazy");\r
+var lazy = require("./lazy.js");\r
 \r
 var fs = require("fs");\r
 \r
-var parseCookie = require("connect").utils.parseCookie;\r
+var cookie = require("express/node_modules/cookie");\r
+\r
+var connectUtils = require("express/node_modules/connect/lib/utils");\r
 \r
 var RedisStore = require("connect-redis")(express);\r
 var sessionStore = new RedisStore({host:$redisHost,port:$redisPort,pass:$redisPassword});\r
@@ -59,10 +62,9 @@ app.configure(function(){
        app.set("view engine", "ejs");\r
        app.use(express.bodyParser());\r
        app.use(express.methodOverride());\r
-       app.use(express.cookieParser());\r
+       app.use(express.cookieParser($secret));\r
        app.use(express.session({\r
                store:sessionStore,\r
-               secret: "5514EA2B-C9B2-4D65-8D81-1F33A180A0C2",\r
                cookie: { httpOnly: false }\r
        }));\r
        app.use(app.router);\r
@@ -77,10 +79,16 @@ app.configure('production', function(){
   app.use(express.errorHandler()); \r
 });\r
 \r
+function SessionInfomation(token,admin)\r
+{\r
+       this.token = token;\r
+       this.admin = admin;\r
+}\r
+\r
 // Routes\r
 app.get("/chat", function(req, res){\r
        var auth_string = getRandomString($token_length);\r
-       req.session.items = {token:auth_string};\r
+       req.session.items = new SessionInfomation(auth_string,false);\r
 \r
        var room_number = 0;\r
        if(typeof(req.query.rno) != "undefined")\r
@@ -88,14 +96,28 @@ app.get("/chat", function(req, res){
        res.render("chat",{rno:room_number,token:auth_string});\r
 });\r
 \r
-app.all("/log/" + $logfile_pattern,express.basicAuth(function (user, pass) {\r
+app.all("/log/*",express.basicAuth(function (user, pass) {\r
        return user === $username && pass === $password;\r
 }));\r
 \r
-app.get("/log/" + $logfile_pattern, function(req, res){\r
+app.get("/log/*",function (req, res) {\r
        res.sendfile(__dirname + req.url);\r
 });\r
 \r
+app.all("/admin_chat",express.basicAuth(function (user, pass) {\r
+       return user === $username && pass === $password;\r
+}));\r
+\r
+app.get("/admin_chat", function(req, res){\r
+       var auth_string = getRandomString($token_length);\r
+       req.session.items = new SessionInfomation(auth_string,true);\r
+\r
+       var room_number = 0;\r
+       if(typeof(req.query.rno) != "undefined")\r
+               room_number = req.query.rno;\r
+       res.render("chat",{rno:room_number,token:auth_string});\r
+});\r
+\r
 app.all("/admin",express.basicAuth(function (user, pass) {\r
        return user === $username && pass === $password;\r
 }));\r
@@ -169,14 +191,13 @@ function removeLog(files,callback)
        });\r
 }\r
 \r
-app.listen($port);\r
-console.log("Express server listening on port %d in %s mode", app.address().port, app.settings.env);\r
+var server = http.createServer(app).listen($port);\r
 \r
 /*\r
  * サーバー部分\r
  */\r
 \r
-var io = require("socket.io").listen(app);\r
+var io = require("socket.io").listen(server);\r
 io.configure('production', function(){\r
   io.enable('browser client minification');  // minified されたクライアントファイルを送信する\r
   io.enable('browser client etag');          // バージョンによって etag によるキャッシングを有効にする\r
@@ -214,6 +235,7 @@ for(var i = 0; i < $max_room_number; i++)
                }else{\r
                        roomconfig.type = 0;\r
                }\r
+               roomconfig.admin = socket.handshake.admin;\r
                socket.json.emit("send roominfo",roomconfig);\r
 \r
                var romcount = $rooms.Get(rno).GetRomCount();\r
@@ -246,7 +268,7 @@ for(var i = 0; i < $max_room_number; i++)
 \r
 function createLogDirectory()\r
 {\r
-       path.exists($log_directory,function(exists){\r
+       fs.exists($log_directory,function(exists){\r
                if(exists == false)\r
                        fs.mkdirSync($log_directory);\r
        });\r
@@ -255,8 +277,8 @@ function createLogDirectory()
 function ParseAuthorization(handshakeData, callback)\r
 {\r
        if(handshakeData.headers.cookie) {\r
-               var cookie = handshakeData.headers.cookie;\r
-               var sessionID = parseCookie(cookie)["connect.sid"];\r
+               var signedCookie = cookie.parse(handshakeData.headers.cookie);\r
+               var sessionID = connectUtils.parseSignedCookies(signedCookie, $secret)["connect.sid"];\r
                sessionStore.get(sessionID, function (err, session) {\r
                        var result = null;\r
                        if (ipbanlist.IsBaned(handshakeData.address.address))\r
@@ -265,7 +287,11 @@ function ParseAuthorization(handshakeData, callback)
                                result = err;\r
                        else if(handshakeData.query.token != session.items.token)\r
                                result = "invaild token";\r
-                       sessionStore.destroy(sessionID);\r
+                       if(typeof(session) != "undefined" && result == null)\r
+                       {\r
+                               handshakeData.admin = session.items.admin;\r
+                               handshakeData.sessionID = sessionID;\r
+                       }\r
                        callback(result,result == null && !err);\r
                });\r
        } else {\r
@@ -283,6 +309,8 @@ function ParseDisconnect(socket,msg)
        socket.json.emit("send romcount",romcount);\r
        socket.json.broadcast.emit("send romcount",romcount);\r
 \r
+       sessionStore.destroy(socket.handshake.sessionID);\r
+\r
        console.log("disconnected");\r
 }\r
 \r
@@ -411,6 +439,9 @@ function ParseSendMsg(socket,msg)
 \r
        var repacked_msg = CreateMessage(msg.name,date,msg.message);\r
 \r
+       if(socket.handshake.admin)\r
+               repacked_msg.ip = ip;\r
+\r
        socket.json.emit("req msg", repacked_msg);\r
 \r
        socket.json.broadcast.emit("req msg", repacked_msg);\r
@@ -454,14 +485,14 @@ function ParseGetPastLog(socket,file)
                return;\r
        var path = $log_directory + "/" + file;\r
        var log = new ChatLog(path);\r
-       log.ToArray(function(array){\r
+       log.ToArray(socket.handshake.admin,function(array){\r
                socket.json.emit("req pastlog",array);\r
        });\r
 }\r
 \r
 function ChatLog(path)\r
 {\r
-       this.ToArray = function(callback)\r
+       this.ToArray = function(hasIp,callback)\r
        {\r
                var state = fs.stat(path,function(err,state){\r
                        if(err)\r
@@ -469,9 +500,12 @@ function ChatLog(path)
                        var array = new Array();\r
                        var stream = fs.createReadStream(path);\r
                        new lazy(stream)\r
-                               .lines\r
+                               .spilt(";")\r
                                .forEach(function(line){\r
-                                       array.push(CreateMessageFromText(line.toString()));\r
+                                       var msg = CreateMessageFromText(line.toString());\r
+                                       if(hasIp == false)\r
+                                               msg.ip = "";\r
+                                       array.push(msg);\r
                                })\r
                                .join(function(){\r
                                        callback(array);\r
@@ -493,7 +527,7 @@ function ChatLog(path)
                                msg.date + "<>" +\r
                                ip + "<>" +\r
                                msg.message +\r
-                               "\n";\r
+                               ";";\r
                return text;\r
        }\r
 \r
@@ -549,6 +583,7 @@ function CreateMessage(name,date,message)
 {\r
        var result = {name:name,\r
                date:date,\r
+               ip:"",\r
                message:message};\r
        return result;\r
 }\r
@@ -556,6 +591,7 @@ function CreateMessageFromText(text)
 {\r
        var data = text.split("<>");\r
        var msg = {name:data[0],\r
+               ip:data[2],\r
                date:data[1],\r
                message:data[3]};\r
        return msg;\r
@@ -613,7 +649,7 @@ function RoomInfomationCollection()
        }\r
        function GetRoomList(callback){\r
                Clear();\r
-               path.exists($room_configure_file_name,function(exists){\r
+               fs.exists($room_configure_file_name,function(exists){\r
                        if(exists == false)\r
                        {\r
                                if(typeof(callback) == "function")\r
@@ -658,13 +694,17 @@ function RoomInfomationCollection()
        function Clear(){\r
                collection = {};\r
                for(var i = 0; i < $max_room_number; i++)\r
-                       Add(i,null,false);\r
+                       Add(i,null,null);\r
        };\r
        function Add(rno,pass,hiddenlogflag){\r
                collection[rno] = new RoomInfomation(pass,hiddenlogflag);\r
                if(pass != null)\r
                        collection[rno].owner = $system_name;\r
        };\r
+       var $gc_interval_id = setInterval(function(){\r
+               for(var rno in this.rom_list)\r
+                       collection[rno].GCRomList();\r
+       },$gc_time_interval);\r
        GetRoomList();\r
 }\r
 \r
@@ -680,7 +720,8 @@ function RoomInfomation(pass,hiddenlogflag)
        this.IsVolatile = function(){\r
                return this.owner == null &&\r
                        this.password == null &&\r
-                       this.time == null;\r
+                       this.time == null &&\r
+                       this.hiddenlog == null;\r
        }\r
        this.GetRomCount = function(){\r
                var count = 0;\r
@@ -750,7 +791,7 @@ function RoomInfomation(pass,hiddenlogflag)
                }\r
                return false;\r
        };\r
-       var $gc_interval_id = setInterval(function(){\r
+       this.GCRomList = function(){\r
                var date = new Date();\r
                var current_time = date.getTime();\r
                for(var ip in this.rom_list)\r
@@ -758,7 +799,7 @@ function RoomInfomation(pass,hiddenlogflag)
                        if(current_time - this.rom_list[ip].time >= $gc_time_interval)\r
                                delete this.rom_list[ip];\r
                }\r
-       },$gc_time_interval);\r
+       };\r
 }\r
 \r
 //IPBANクラス\r
@@ -803,7 +844,7 @@ function IpBanCollecion()
        function GetIpBanList(callback)\r
        {\r
                collection = {};\r
-               path.exists($ip_ban_list_file_name,function(exists){\r
+               fs.exists($ip_ban_list_file_name,function(exists){\r
                        if(exists == false)\r
                        {\r
                                if(typeof(callback) == "function")\r