OSDN Git Service

過去ログ表示機能を廃止した
[webchat/WebChat.git] / chat.js
diff --git a/chat.js b/chat.js
index a2fd994..4370bbe 100644 (file)
--- a/chat.js
+++ b/chat.js
@@ -1,25 +1,17 @@
-$max_room_number = 3;       //最大ルーム数\r
-$spilt_size = 1024 * 512;      //分割するサイズ\r
+$spilt_size = 1024 * 512;   //分割するサイズ\r
 $reset_password_diff = 1000 * 60 * 60; //ルームパスワードをリセットする間隔\r
 $gc_time_interval = 1000 * 60 * 60;    //ゴミ掃除を行う間隔\r
-$invaild_token_message = "トークンが一致しませんでした";\r
-$block_message = "メッセージの送信に失敗しました";      //ブロック時のメッセージ\r
-$not_match_password = "パスワードが一致しませんでした"; //パスワードが一致しない場合に表示されるメッセージ\r
-$password_setted_message = "パスワードを設定しました";     //パスワードが設定されたときに表示されるメッセージ\r
-$password_resetted_message = "パスワードをリセットしました";     //パスワードが再設定されたときに表示されるメッセージ\r
-$failed_set_password_message = "パスワードの設定に失敗しました";        //パスワードが再設定されたときに表示されるメッセージ\r
 $ip_ban_list_file_name = "ipbanlist.txt";      //アクセスを禁止するIPが記録されているファイル\r
 $room_configure_file_name = "roomlist.txt";    //ルームの設定が記録されているファイル\r
-$username = "admin";   //管理者用のページにアクセスできるユーザ名\r
-$password = "admin";   //管理者用のページにアクセスするのに必要なパスワード\r
 $system_name = "system";       //システム発言を表す名前\r
 $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 lazy = require("./lazy.js");\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
@@ -36,20 +28,19 @@ module.exports = function(app,server,express,session){
        app.get("/chat", chat_proc);\r
        app.all("/log/*",express.basicAuth(auth_proc));\r
        app.get("/log/*",log_proc);\r
-       app.all("/admin_chat",express.basicAuth(auth_proc));\r
-       app.get("/admin_chat", adminchat_proc);\r
-       app.all("/admin",express.basicAuth(auth_proc));\r
-       app.get("/admin", admin_proc);\r
-       app.post("/admin",admin_postproc);\r
+       app.all("/chat/admin",express.basicAuth(auth_proc));\r
+       app.get("/chat/admin", admin_proc);\r
+       app.post("/chat/admin",admin_postproc);\r
 \r
        var io = require("socket.io").listen(server);\r
        io.configure("production", function(){\r
+               io.set("transports", config.transports);\r
                io.enable("browser client minification");  // minified されたクライアントファイルを送信する\r
-       io.enable("browser client etag");          // バージョンによって etag によるキャッシングを有効にする\r
-       io.set("log level", 1);                    // ログレベルを設定(デフォルトより下げている)\r
+               io.enable("browser client etag");          // バージョンによって etag によるキャッシングを有効にする\r
+               io.set("log level", 1);                    // ログレベルを設定(デフォルトより下げている)\r
        });\r
 \r
-       for(var i = 0; i < $max_room_number; i++)\r
+       for(var i = 0; i < config.max_room_number; i++)\r
        {\r
                clients[i] =io\r
                .of(GetNameFromRoomNumber(i))\r
@@ -65,49 +56,34 @@ function chat_proc(req, res){
        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:info.token});\r
+       res.render("chat",{rno:room_number,token:req.session._csrf});\r
 }\r
 \r
 function auth_proc(user, pass) {\r
-       return user === $username && pass === $password;\r
+       return user === config.username && pass === config.password;\r
 }\r
 \r
 function log_proc(req, res) {\r
        res.sendfile(__dirname + req.url);\r
 }\r
 \r
-function adminchat_proc(req, res){\r
-       var info = new security.SessionInfomation(true);\r
-       req.session.items = info;\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:info.token});\r
-}\r
-\r
 function admin_postproc(req,res){\r
-       if(req.session.items.token != req.body.token)\r
-       {\r
-               res.send($invaild_token_message);\r
-               return;\r
-       }\r
        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.newroomlist,function(){\r
-                       res.redirect("/admin");\r
+               $rooms.Update(req.body,function(){\r
+                       res.redirect("/chat/admin");\r
                });\r
        }\r
 }\r
@@ -119,12 +95,13 @@ function admin_proc(req,res)
        var iplist = ipbanlist.GetText();\r
 \r
        fs.readdir($log_directory,function(err,list){\r
+               res.setHeader("X-FRAME-OPTIONS","DENY");\r
                res.render("admin", {\r
                        files: list,\r
                        log_directory:$log_directory,\r
                        ipbanlist:iplist,\r
-                       token:info.token,\r
-                       roomlist:$rooms.GetString()\r
+                       token:req.session._csrf,\r
+                       roomlist:$rooms.GetMessage()\r
                });\r
        });\r
 }\r
@@ -151,6 +128,14 @@ function removeLog(files,callback)
 //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
@@ -158,17 +143,17 @@ function RoomInfomationCollection()
        this.IsContains = function(rno){\r
                return rno in collection;\r
        };\r
-       this.GetString = function(){\r
-               var retval = "";\r
+       this.GetMessage = function(){\r
+               var retval = new Array();\r
                for(var rno in collection)\r
                {\r
-                       if($rooms.Get(rno).IsVolatile())\r
-                               continue;\r
-                       var pass = collection[rno].password;\r
-                       if(pass == null)\r
-                               pass = "";\r
-                       var hiddenlog = collection[rno].hiddenlog;\r
-                       retval += rno + ":" + pass + ":" + hiddenlog + "\r\n";\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
@@ -180,71 +165,59 @@ function RoomInfomationCollection()
                }\r
                return retval;\r
        }\r
-       this.Update = function(text,callfunc){\r
+       this.Update = function(data,callfunc){\r
+               Clear();\r
                async.waterfall([\r
-                       function(callback){\r
-                               fs.open($room_configure_file_name,"w",callback);\r
-                       },\r
-                       function(fd,callback){\r
-                               var buf = new Buffer(text);\r
-                               fs.write(fd,buf,0,Buffer.byteLength(text),null,function(){\r
-                                       callback(null,fd);\r
-                               });\r
+                       function(next){\r
+                               pool.query("TRUNCATE TABLE rooms",null,next);\r
                        },\r
-                       function(fd,callback){\r
-                               fs.close(fd,function(){\r
-                                       GetRoomList(callfunc);\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
-               ]);\r
+               ],callfunc);\r
        }\r
        function GetRoomList(callback){\r
                Clear();\r
-               fs.exists($room_configure_file_name,function(exists){\r
-                       if(exists == false)\r
-                       {\r
-                               if(typeof(callback) == "function")\r
-                                       callback();\r
-                               return;\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
-                       var stream = fs.createReadStream($room_configure_file_name);\r
-                       new lazy(stream)\r
-                               .lines\r
-                               .forEach(function(line){\r
-                                       var token = line.toString().replace(/(\r|\n|\r\n)/gm, "").split(":");\r
-                                       if(token.length == 1)\r
-                                       {\r
-                                               Add(token[0],null,false);\r
-                                       }\r
-                                       else if(token.length == 2)\r
-                                       {\r
-                                               var rno = token[0];\r
-                                               var pass = token[1];\r
-                                               if(pass == "")\r
-                                                       pass = null;\r
-                                               Add(rno, pass,false);\r
-                                       }\r
-                                       else if(token.length == 3)\r
-                                       {\r
-                                               var rno = token[0];\r
-                                               var pass = token[1];\r
-                                               if(pass == "")\r
-                                                       pass = null;\r
-                                               var hiddenlog = false;\r
-                                               if(token[2] == "true")\r
-                                                       hiddenlog = true;\r
-                                               Add(rno, pass,hiddenlog);\r
-                                       }\r
-                               })\r
-                               .join(function(){\r
-                                       if(typeof(callback) == "function")\r
-                                               callback();\r
-                               });\r
-               });\r
+               ],callback);\r
        }\r
        function Clear(){\r
                collection = {};\r
-               for(var i = 0; i < $max_room_number; i++)\r
+               for(var i = 0; i < config.max_room_number; i++)\r
                        Add(i,null,null);\r
        };\r
        function Add(rno,pass,hiddenlogflag){\r
@@ -372,6 +345,14 @@ function RoomInfomation(pass,hiddenlogflag)
 //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
@@ -391,49 +372,42 @@ function IpBanCollecion()
                return text;\r
        }\r
        this.Update = function(text,callfunc){\r
+               collection = {};\r
                async.waterfall([\r
-                       function(callback){\r
-                               fs.open($ip_ban_list_file_name,"w",callback);\r
+                       function(next){\r
+                               pool.query("TRUNCATE TABLE ipbanlist",null,next);\r
                        },\r
-                       function(fd,callback){\r
-                               var buf = new Buffer(text);\r
-                               fs.write(fd,buf,0,Buffer.byteLength(text),null,function(){\r
-                                       callback(null,fd);\r
-                               });\r
-                       },\r
-                       function(fd,callback){\r
-                               fs.close(fd,function(){\r
-                                       GetIpBanList(callfunc);\r
-                               });\r
-                       }\r
-               ]);\r
-       }\r
-       function GetIpBanList(callback)\r
-       {\r
-               collection = {};\r
-               fs.exists($ip_ban_list_file_name,function(exists){\r
-                       if(exists == false)\r
-                       {\r
-                               if(typeof(callback) == "function")\r
-                                       callback();\r
-                               return;\r
-                       }\r
-                       var stream = fs.createReadStream($ip_ban_list_file_name);\r
-                       new lazy(stream)\r
-                               .lines\r
-                               .forEach(function(line){\r
-                                       var token = line.toString().replace(/(\r|\n|\r\n)/gm, "").split(":");\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
-                               })\r
-                               .join(function(){\r
-                                       if(typeof(callback) == "function")\r
-                                               callback();\r
-                               });\r
-               });\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
@@ -463,16 +437,12 @@ function ParseConnect(socket)
        room.AddRom(ip);\r
 \r
        var roomconfig = room.GetConfig();\r
-       roomconfig.admin = socket.handshake.admin;\r
        socket.json.emit("send roominfo",roomconfig);\r
 \r
        var romcount = room.GetRomCount();\r
        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
@@ -504,13 +474,12 @@ function ParseAuthorization(handshakeData, callback)
                                result = "failed get from session store";\r
                        else if(err)\r
                                result = err;\r
-                       else if(handshakeData.query.token != session.items.token)\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
-                       {\r
-                               handshakeData.admin = session.items.admin;\r
+                       if(result == null)\r
                                handshakeData.sessionID = sessionID;\r
-                       }\r
                        callback(result,result == null && !err);\r
                });\r
        } else {\r
@@ -539,9 +508,9 @@ function ParseSetPassword(socket,msg)
                message:null,\r
        };\r
        if($rooms.Get(rno).IsVolatile() == false && $rooms.Get(rno).SetPassword(msg.owner,msg.password))\r
-               newMeg.message = $password_setted_message;\r
+               newMeg.message = resource.password_setted_message;\r
        else\r
-               newMeg.message = $failed_set_password_message;\r
+               newMeg.message = resource.failed_set_password_message;\r
        ParseSendMsg(socket,newMeg);\r
 }\r
 \r
@@ -551,7 +520,7 @@ function ParseJoin(socket,msg)
 \r
        if(ipbanlist.IsBlockedToWrite(ip))\r
        {\r
-               socket.emit("error",$block_message);\r
+               socket.emit("error",resource.block_message);\r
                return;\r
        }\r
 \r
@@ -577,7 +546,7 @@ function ParseJoin(socket,msg)
                }\r
                else\r
                {\r
-                       socket.emit("error",$not_match_password);\r
+                       socket.emit("error",resource.unmatch_password);\r
                        return;\r
                }\r
        }\r
@@ -595,7 +564,7 @@ function ParseQuit(socket,msg)
 \r
        if(ipbanlist.IsBlockedToWrite(ip))\r
        {\r
-               socket.emit("error",$block_message);\r
+               socket.emit("error",resource.block_message);\r
                return;\r
        }\r
 \r
@@ -603,7 +572,7 @@ function ParseQuit(socket,msg)
 \r
        var newMeg = {\r
                name:$system_name,\r
-               message:$password_resetted_message,\r
+               message:resource.password_resetted_message,\r
        };\r
 \r
        $rooms.Get(rno).AddRom(ip);\r
@@ -638,7 +607,7 @@ function ParseSendMsg(socket,msg)
 \r
        if(ip in ipbanlist)\r
        {\r
-               socket.emit("error",$block_message);\r
+               socket.emit("error",resource.block_message);\r
                return;\r
        }\r
 \r
@@ -680,29 +649,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
-       log.ToArray(socket.handshake.admin,function(array){\r
+       log.ToArray(config.showip,function(array){\r
                socket.json.emit("req pastlog",array);\r
        });\r
 }\r
@@ -717,7 +670,7 @@ function ChatLog(path)
                        var array = new Array();\r
                        var stream = fs.createReadStream(path);\r
                        new lazy(stream)\r
-                               .spilt(";")\r
+                               .lines\r
                                .forEach(function(line){\r
                                        var msg = CreateMessageFromText(line.toString());\r
                                        if(hasIp == false)\r
@@ -744,7 +697,7 @@ function ChatLog(path)
                                msg.date + "<>" +\r
                                ip + "<>" +\r
                                msg.message +\r
-                               ";";\r
+                               "\n";\r
                return text;\r
        }\r
 \r