OSDN Git Service

name_hashは被る可能性があるので、primaryではなくindexを指定するようにした
[webchat/WebChat.git] / chat.js
diff --git a/chat.js b/chat.js
index c49bb9d..853db1c 100644 (file)
--- a/chat.js
+++ b/chat.js
@@ -7,21 +7,16 @@ $system_name = "system";      //システム発言を表す名前
 $log_directory = "log";        //ログファイルを置くフォルダー\r
 $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
-\r
-var resource = require("./resources.js");\r
-var config = require("./configure.js");\r
-var security = require("./security.js");\r
-var lazy = require("lazy");\r
-var fs = require("fs");\r
-var async = require("async");\r
-var path = require("path");\r
-var util = require("util");\r
-var cookie = require("express/node_modules/cookie");\r
-var connectUtils = require("express/node_modules/connect/lib/utils");\r
 \r
 var clients = new Array();\r
 \r
+var IpBan = require("./ipban.js")\r
+var ipbanlist = new IpBan();\r
+var RoomInfomationCollection = require("./room.js");\r
+var $rooms = new RoomInfomationCollection();\r
+\r
+createLogDirectory();\r
+\r
 var sessionStore;\r
 \r
 module.exports = function(app,server,express,session){\r
@@ -33,6 +28,7 @@ module.exports = function(app,server,express,session){
        app.get("/chat/admin", admin_proc);\r
        app.post("/chat/admin",admin_postproc);\r
 \r
+       var config = require("./configure.js");\r
        var io = require("socket.io").listen(server);\r
        io.configure("production", function(){\r
                io.set("transports", config.transports);\r
@@ -51,6 +47,7 @@ module.exports = function(app,server,express,session){
 };\r
 \r
 function chat_proc(req, res){\r
+       var security = require("./security.js");\r
        var info = new security.SessionInfomation(false);\r
        req.session.items = info;\r
 \r
@@ -61,6 +58,7 @@ function chat_proc(req, res){
 }\r
 \r
 function auth_proc(user, pass) {\r
+       var config = require("./configure.js");\r
        return user === config.username && pass === config.password;\r
 }\r
 \r
@@ -72,28 +70,30 @@ function admin_postproc(req,res){
        if(typeof(req.body.erase) != "undefined")\r
        {\r
                removeLog(req.body.file,function(){\r
-                       res.redirect("/admin");\r
+                       res.redirect("/chat/admin");\r
                });\r
        }\r
        if(typeof(req.body.registor) != "undefined")\r
        {\r
                ipbanlist.Update(req.body.newbanlist,function(){\r
-                       res.redirect("/admin");\r
+                       res.redirect("/chat/admin");\r
                });\r
        }\r
        if(typeof(req.body.updateroom) != "undefined")\r
        {\r
                $rooms.Update(req.body,function(){\r
-                       res.redirect("/admin");\r
+                       res.redirect("/chat/admin");\r
                });\r
        }\r
 }\r
 \r
 function admin_proc(req,res)\r
 {\r
+       var security = require("./security.js");\r
        var info = new security.SessionInfomation(true);\r
        req.session.items = info;\r
        var iplist = ipbanlist.GetText();\r
+       var fs = require("fs");\r
 \r
        fs.readdir($log_directory,function(err,list){\r
                res.setHeader("X-FRAME-OPTIONS","DENY");\r
@@ -115,9 +115,10 @@ function removeLog(files,callback)
                        callback();\r
                return;\r
        }\r
-\r
+       var async = require("async");\r
        async.map(files,\r
        function(item,callback){\r
+               var fs = require("fs");\r
                fs.unlink($log_directory + "/" + item,callback);\r
        },\r
        function(err,results){\r
@@ -126,300 +127,9 @@ function removeLog(files,callback)
        });\r
 }\r
 \r
-//RoomInfomationCollecionクラス\r
-function RoomInfomationCollection()\r
-{\r
-       var MySQLPool = new require("./mysql_pool.js");\r
-       var pool = new MySQLPool({\r
-                               host     : config.db_host,\r
-                               user     : config.db_user,\r
-                               password : config.db_password,\r
-                               port     : config.db_port,\r
-                               database : config.db_name,\r
-                       });\r
-       var collection = {};\r
-       this.Get = function(rno){\r
-               return collection[rno];\r
-       }\r
-       this.IsContains = function(rno){\r
-               return rno in collection;\r
-       };\r
-       this.GetMessage = function(){\r
-               var retval = new Array();\r
-               for(var rno in collection)\r
-               {\r
-                       item={};\r
-                       item.applyflag = !$rooms.Get(rno).IsVolatile();\r
-                       item.password = collection[rno].password;\r
-                       if(item.password == null)\r
-                               item.password = "";\r
-                       item.hiddenlog = collection[rno].hiddenlog;\r
-                       retval.push(item);\r
-               }\r
-               return retval;\r
-       };\r
-       this.GetKeys = function(){\r
-               var retval = {};\r
-               for(var rno in collection)\r
-               {\r
-                       retval[rno] = {};\r
-               }\r
-               return retval;\r
-       }\r
-       this.Update = function(data,callfunc){\r
-               Clear();\r
-               async.waterfall([\r
-                       function(next){\r
-                               pool.query("TRUNCATE TABLE rooms",null,next);\r
-                       },\r
-                       function(result,next){\r
-                               console.log(util.inspect(data));\r
-                               var items = new Array();\r
-                               var config = data.config;\r
-                               for(var i = 0; i < config.length; i++)\r
-                               {\r
-                                       var rno = Number(config[i].applyflag);\r
-                                       if(isNaN(rno))\r
-                                               continue;\r
-                                       var password,romonly;\r
-                                       if(typeof(config[rno].password)=="undefined")\r
-                                               password = null;\r
-                                       else if(config[rno].password == "")\r
-                                               password = null;\r
-                                       else\r
-                                               password = config[rno].password;\r
-                                       if(typeof(config[rno].hiddenlog)=="undefined")\r
-                                               romonly = false;\r
-                                       else\r
-                                               romonly = config[rno].hiddenlog == "romonly";\r
-\r
-                                       Add(rno,password,romonly);\r
-                                       items.push(new Array(rno,password,romonly));\r
-                               }\r
-                               pool.query("INSERT INTO rooms VALUES ?",[items],callfunc);\r
-                       }\r
-               ],callfunc);\r
-       }\r
-       function GetRoomList(callback){\r
-               Clear();\r
-               async.waterfall([\r
-                       function(next){\r
-                               pool.query("SELECT * FROM rooms",null,next);\r
-                       },\r
-                       function(result,next){\r
-                               for(var i = 0; i < result.length; i++)\r
-                               {\r
-                                       //MySQLではTINYINTが使われている\r
-                                       Add(result[i].number,result[i].password,result[i].hiddenlog != 0);\r
-                               }\r
-                               next(null,null);\r
-                       }\r
-               ],callback);\r
-       }\r
-       function Clear(){\r
-               collection = {};\r
-               for(var i = 0; i < config.max_room_number; i++)\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
-//RoomInfomationクラス\r
-function RoomInfomation(pass,hiddenlogflag)\r
-{\r
-       this.password = pass;\r
-       this.rom_list = {};\r
-       this.authed_list = {};\r
-       this.owner = null;\r
-       this.time = null;\r
-       this.hiddenlog = hiddenlogflag;\r
-       this.GetConfig = function(){\r
-               var roomconfig = {};\r
-               if(this.IsVolatile() == false)\r
-               {\r
-                       if(this.IsFixedPassword())\r
-                               roomconfig.type = 2;\r
-                       else if(this.IsHiddenLogFromRom())\r
-                               roomconfig.type = 3;\r
-                       else\r
-                               roomconfig.type = 1;\r
-                       roomconfig.IsOwned = !this.IsFirstAuth();\r
-               }else{\r
-                       roomconfig.type = 0;\r
-               }\r
-               return roomconfig;\r
-       }\r
-       this.IsVolatile = function(){\r
-               return this.owner == null &&\r
-                       this.password == null &&\r
-                       this.time == null &&\r
-                       this.hiddenlog == null;\r
-       }\r
-       this.GetRomCount = function(){\r
-               var count = 0;\r
-               for(var key in this.rom_list)\r
-                       count++;\r
-               return count;\r
-       };\r
-       this.AddRom = function(ip){\r
-               var date = new Date();\r
-               this.rom_list[ip] = {time:date.getTime()};\r
-       };\r
-       this.RemoveRom = function(ip){\r
-               delete this.rom_list[ip];\r
-       };\r
-       this.Reset = function(owner){\r
-               var date = new Date();\r
-               var time = date.getTime();\r
-               this.password = null;\r
-               this.authed_list = {};\r
-               this.owner = owner;\r
-               this.time = time;\r
-       };\r
-       this.IsFirstAuth = function(){\r
-               return this.owner == null;\r
-       };\r
-       this.IsAuthed = function(name){\r
-               return name == this.owner ||\r
-                       name in this.authed_list;\r
-       };\r
-       this.IsHiddenLogFromRom = function(){\r
-               return this.hiddenlog;\r
-       };\r
-       this.IsFixedPassword = function(){\r
-               return this.owner == $system_name;\r
-       };\r
-       this.IsOwner = function(name){\r
-               return this.owner == name;\r
-       };\r
-       this.IsTimeout = function(){\r
-               var date = new Date();\r
-               var current_time = date.getTime();\r
-               return !this.IsFixedPassword() &&\r
-                       current_time - this.time >= $reset_password_diff;\r
-       };\r
-       this.RemoveAuth = function(name)\r
-       {\r
-               delete this.authed_list[name];\r
-       };\r
-       this.Auth = function(name,password){\r
-               if(this.password != password)\r
-                       return false;\r
-               var date = new Date();\r
-               var time = date.getTime();\r
-               this.time = time;\r
-               this.authed_list[name] = "";\r
-               return true;\r
-       };\r
-       this.SetPassword = function(owner,password){\r
-               if(owner == this.owner &&\r
-                       !this.IsFixedPassword() &&\r
-                       !this.IsHiddenLogFromRom())\r
-               {\r
-                       var date = new Date();\r
-                       this.time = date.getTime();\r
-                       this.password = password;\r
-                       return true;\r
-               }\r
-               return false;\r
-       };\r
-       this.GCRomList = function(){\r
-               var date = new Date();\r
-               var current_time = date.getTime();\r
-               for(var ip in this.rom_list)\r
-               {\r
-                       if(current_time - this.rom_list[ip].time >= $gc_time_interval)\r
-                               delete this.rom_list[ip];\r
-               }\r
-       };\r
-}\r
-\r
-//IPBANクラス\r
-function IpBanCollecion()\r
-{\r
-       var MySQLPool = new require("./mysql_pool.js");\r
-       var pool = new MySQLPool({\r
-                               host     : config.db_host,\r
-                               user     : config.db_user,\r
-                               password : config.db_password,\r
-                               port     : config.db_port,\r
-                               database : config.db_name,\r
-                       });\r
-       var collection = {};\r
-       this.IsBaned = function(ip){\r
-               return collection[ip] == "r";\r
-       }\r
-       this.IsBlockedToWrite = function(ip){\r
-               return ip in collection;\r
-       }\r
-       this.GetText = function(){\r
-               var text = "";\r
-               for(var key in collection)\r
-               {\r
-                       if(collection[key] == "")\r
-                               text += key + "\r\n";\r
-                       else\r
-                               text += key + ":" + collection[key] + "\r\n";\r
-               }\r
-               return text;\r
-       }\r
-       this.Update = function(text,callfunc){\r
-               collection = {};\r
-               async.waterfall([\r
-                       function(next){\r
-                               pool.query("TRUNCATE TABLE ipbanlist",null,next);\r
-                       },\r
-                       function(result,next){\r
-                               var items = new Array();\r
-                               lines = text.split("\r\n");\r
-                               for(var i = 0; i < lines.length; i++)\r
-                               {\r
-                                       var token = lines[i].split(":");\r
-                                       var ip = token[0];\r
-                                       if(ip == "")\r
-                                               continue;\r
-                                       if(token.length == 1)\r
-                                               collection[ip] = "";\r
-                                       else\r
-                                               collection[ip] = token[1];\r
-                                       items.push(new Array(ip,collection[ip]));\r
-                               }\r
-                               pool.query("INSERT INTO ipbanlist VALUES ?",[items],next);\r
-                       },\r
-               ],callfunc);\r
-       }\r
-       function GetIpBanList(callfunc)\r
-       {\r
-               async.waterfall([\r
-                       function(next){\r
-                               pool.query("SELECT * FROM ipbanlist",null,next);\r
-                       },\r
-                       function(result,next){\r
-                               for(var i = 0; i < result.length; i++)\r
-                                       collection[result[i].ip] = result[i].type;\r
-                               next(null,null);\r
-                       },\r
-               ],callfunc);\r
-       }\r
-       GetIpBanList();\r
-}\r
-\r
-var ipbanlist = new IpBanCollecion();\r
-var $rooms = new RoomInfomationCollection();\r
-\r
-createLogDirectory();\r
-\r
 function createLogDirectory()\r
 {\r
+       var fs = require("fs");\r
        fs.exists($log_directory,function(exists){\r
                if(exists == false)\r
                        fs.mkdirSync($log_directory);\r
@@ -444,9 +154,6 @@ function ParseConnect(socket)
        socket.json.emit("send romcount",romcount);\r
        socket.json.broadcast.emit("send romcount",romcount);\r
 \r
-       socket.on("get pastLogList", function (msg) {\r
-               ParseGetPastLogList(socket,msg);\r
-       });\r
        socket.on("get pastLog", function (msg) {\r
                ParseGetPastLog(socket,msg);\r
        });\r
@@ -469,7 +176,9 @@ function ParseConnect(socket)
 \r
 function ParseAuthorization(handshakeData, callback)\r
 {\r
+       var connectUtils = require("express/node_modules/connect/lib/utils");\r
        if(handshakeData.headers.cookie) {\r
+               var cookie = require("express/node_modules/cookie");\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
@@ -478,9 +187,11 @@ function ParseAuthorization(handshakeData, callback)
                                result = "failed get from session store";\r
                        else if(err)\r
                                result = err;\r
+                       else if(typeof(session) == "undefined" || typeof(session._csrf) == "undefined")\r
+                               result = "session is undefined";\r
                        else if(handshakeData.query.token != session._csrf)\r
                                result = "invaild token";\r
-                       if(typeof(session) != "undefined" && result == null)\r
+                       if(result == null)\r
                                handshakeData.sessionID = sessionID;\r
                        callback(result,result == null && !err);\r
                });\r
@@ -509,6 +220,7 @@ function ParseSetPassword(socket,msg)
                name:$system_name,\r
                message:null,\r
        };\r
+       var resource = require("./resources.js");\r
        if($rooms.Get(rno).IsVolatile() == false && $rooms.Get(rno).SetPassword(msg.owner,msg.password))\r
                newMeg.message = resource.password_setted_message;\r
        else\r
@@ -522,6 +234,7 @@ function ParseJoin(socket,msg)
 \r
        if(ipbanlist.IsBlockedToWrite(ip))\r
        {\r
+               var resource = require("./resources.js");\r
                socket.emit("error",resource.block_message);\r
                return;\r
        }\r
@@ -534,6 +247,7 @@ function ParseJoin(socket,msg)
        socket.json.emit("send romcount",romcount);\r
        socket.json.broadcast.emit("send romcount",romcount);\r
 \r
+       var util = require("util");\r
        if($rooms.Get(rno).IsVolatile() == false)\r
        {\r
                if($rooms.Get(rno).IsTimeout() ||\r
@@ -548,6 +262,7 @@ function ParseJoin(socket,msg)
                }\r
                else\r
                {\r
+                       var resource = require("./resources.js");\r
                        socket.emit("error",resource.unmatch_password);\r
                        return;\r
                }\r
@@ -564,6 +279,7 @@ function ParseQuit(socket,msg)
 {\r
        var ip = GetClientIPAdress(socket);\r
 \r
+       var resource = require("./resources.js");\r
        if(ipbanlist.IsBlockedToWrite(ip))\r
        {\r
                socket.emit("error",resource.block_message);\r
@@ -597,6 +313,7 @@ function ParseQuit(socket,msg)
                        $rooms.Get(rno).RemoveAuth(msg.name);\r
        }\r
 \r
+       var util = require("util");\r
        newMeg.message = util.format("/quitedby %s",msg.name);\r
        ParseSendMsg(socket,newMeg);\r
 }\r
@@ -609,6 +326,7 @@ function ParseSendMsg(socket,msg)
 \r
        if(ip in ipbanlist)\r
        {\r
+               var resource = require("./resources.js");\r
                socket.emit("error",resource.block_message);\r
                return;\r
        }\r
@@ -634,6 +352,7 @@ function ParseSendMsg(socket,msg)
 \r
        socket.json.broadcast.emit("req msg", repacked_msg);\r
 \r
+       var util = require("util");\r
        var path = $log_directory + "/" + util.format($log_file_name,rno);\r
        var log = new ChatLog(path);\r
        log.Save(repacked_msg,ip,rno);\r
@@ -651,28 +370,13 @@ function GetRoomNumberFromName(name)
        throw "GetRoomNumberFromName error";\r
 }\r
 \r
-function ParseGetPastLogList(socket,msg)\r
-{\r
-       var list = fs.readdir($log_directory,function(err,files){\r
-               var text = "";\r
-               var rno = GetRoomNumberFromName(socket.namespace.name);\r
-               var pattern = $pastlogfile_pattern.replace("%d",rno);\r
-               for(var i = 0; i < files.length; i++)\r
-               {\r
-                       var logname = files[i];\r
-                       if(logname.match(pattern))\r
-                               text += files[i] + "\n";\r
-               }\r
-               socket.emit("req pastloglist",text);\r
-       });\r
-}\r
-\r
 function ParseGetPastLog(socket,file)\r
 {\r
        if(file == "")\r
                return;\r
        var path = $log_directory + "/" + file;\r
        var log = new ChatLog(path);\r
+       var config = require("./configure.js");\r
        log.ToArray(config.showip,function(array){\r
                socket.json.emit("req pastlog",array);\r
        });\r
@@ -682,11 +386,13 @@ function ChatLog(path)
 {\r
        this.ToArray = function(hasIp,callback)\r
        {\r
+               var fs = require("fs");\r
                var state = fs.stat(path,function(err,state){\r
                        if(err)\r
                                return;\r
                        var array = new Array();\r
                        var stream = fs.createReadStream(path);\r
+                       var lazy = require("lazy");\r
                        new lazy(stream)\r
                                .lines\r
                                .forEach(function(line){\r
@@ -721,6 +427,8 @@ function ChatLog(path)
 \r
        function SplitLog(rno,callback)\r
        {\r
+               var util = require("util");\r
+               var fs = require("fs");\r
                var state = fs.stat(path,function(err,state){\r
                        if(err && typeof(callback) == "function")\r
                        {\r
@@ -744,6 +452,8 @@ function ChatLog(path)
 \r
        function WritePastLog(path,text)\r
        {\r
+               var fs = require("fs");\r
+               var async = require("async");\r
                async.waterfall([\r
                        function(callback){\r
                                fs.open(path,"a",callback);\r