-$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 security = require("./security.js");\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
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 config = require("./configure.js");\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
};\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
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
+ var config = require("./configure.js");\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
\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
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
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
});\r
}\r
\r
-//RoomInfomationCollecionクラス\r
-function RoomInfomationCollection()\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.GetString = function(){\r
- var retval = "";\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
- }\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(text,callfunc){\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
- },\r
- function(fd,callback){\r
- fs.close(fd,function(){\r
- GetRoomList(callfunc);\r
- });\r
- }\r
- ]);\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
- }\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
- }\r
- function Clear(){\r
- collection = {};\r
- for(var i = 0; i < $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 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
- async.waterfall([\r
- function(callback){\r
- fs.open($ip_ban_list_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
- },\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
- var ip = token[0];\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
- }\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
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
\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
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
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 = $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
\r
if(ipbanlist.IsBlockedToWrite(ip))\r
{\r
- socket.emit("error",$block_message);\r
+ var resource = require("./resources.js");\r
+ socket.emit("error",resource.block_message);\r
return;\r
}\r
\r
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
}\r
else\r
{\r
- socket.emit("error",$not_match_password);\r
+ var resource = require("./resources.js");\r
+ socket.emit("error",resource.unmatch_password);\r
return;\r
}\r
}\r
{\r
var ip = GetClientIPAdress(socket);\r
\r
+ var resource = require("./resources.js");\r
if(ipbanlist.IsBlockedToWrite(ip))\r
{\r
- socket.emit("error",$block_message);\r
+ socket.emit("error",resource.block_message);\r
return;\r
}\r
\r
\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
$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
\r
if(ip in ipbanlist)\r
{\r
- socket.emit("error",$block_message);\r
+ var resource = require("./resources.js");\r
+ socket.emit("error",resource.block_message);\r
return;\r
}\r
\r
\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
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
+ var config = require("./configure.js");\r
+ log.ToArray(config.showip,function(array){\r
socket.json.emit("req pastlog",array);\r
});\r
}\r
{\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
- .spilt(";")\r
+ .lines\r
.forEach(function(line){\r
var msg = CreateMessageFromText(line.toString());\r
if(hasIp == false)\r
msg.date + "<>" +\r
ip + "<>" +\r
msg.message +\r
- ";";\r
+ "\n";\r
return text;\r
}\r
\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
\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