1 $spilt_size = 1024 * 512; //分割するサイズ
\r
2 $reset_password_diff = 1000 * 60 * 60; //ルームパスワードをリセットする間隔
\r
3 $gc_time_interval = 1000 * 60 * 60; //ゴミ掃除を行う間隔
\r
4 $ip_ban_list_file_name = "ipbanlist.txt"; //アクセスを禁止するIPが記録されているファイル
\r
5 $room_configure_file_name = "roomlist.txt"; //ルームの設定が記録されているファイル
\r
6 $system_name = "system"; //システム発言を表す名前
\r
7 $log_directory = "log"; //ログファイルを置くフォルダー
\r
8 $log_file_name = "logfile%d.txt"; //ログファイル名(%dはそのままにしておくこと)
\r
9 $splited_log_file_name = "logfile%d_%s.txt" //分割後のファイル名(%dと%sはそのままにしておくこと)
\r
11 var clients = new Array();
\r
13 var IpBan = require("./ipban.js")
\r
14 var ipbanlist = new IpBan();
\r
15 var RoomInfomationCollection = require("./room.js");
\r
16 var $rooms = new RoomInfomationCollection();
\r
18 createLogDirectory();
\r
22 module.exports = function(app,server,express,session){
\r
23 sessionStore = session;
\r
24 app.get("/chat", chat_proc);
\r
25 app.all("/log/*",express.basicAuth(auth_proc));
\r
26 app.get("/log/*",log_proc);
\r
27 app.all("/chat/admin",express.basicAuth(auth_proc));
\r
28 app.get("/chat/admin", admin_proc);
\r
29 app.post("/chat/admin",admin_postproc);
\r
31 var config = require("./configure.js");
\r
32 var io = require("socket.io").listen(server);
\r
33 io.configure("production", function(){
\r
34 io.set("transports", config.transports);
\r
35 io.enable("browser client minification"); // minified されたクライアントファイルを送信する
\r
36 io.enable("browser client etag"); // バージョンによって etag によるキャッシングを有効にする
\r
37 io.set("log level", 1); // ログレベルを設定(デフォルトより下げている)
\r
40 for(var i = 0; i < config.max_room_number; i++)
\r
43 .of(GetNameFromRoomNumber(i))
\r
44 .authorization(ParseAuthorization)
\r
45 .on("connection",ParseConnect);
\r
49 function chat_proc(req, res){
\r
50 var security = require("./security.js");
\r
51 var info = new security.SessionInfomation(false);
\r
52 req.session.items = info;
\r
54 var room_number = 0;
\r
55 if(typeof(req.query.rno) != "undefined")
\r
56 room_number = req.query.rno;
\r
57 res.render("chat",{rno:room_number,token:req.session._csrf});
\r
60 function auth_proc(user, pass) {
\r
61 var config = require("./configure.js");
\r
62 return user === config.username && pass === config.password;
\r
65 function log_proc(req, res) {
\r
66 res.sendfile(__dirname + req.url);
\r
69 function admin_postproc(req,res){
\r
70 if(typeof(req.body.erase) != "undefined")
\r
72 removeLog(req.body.file,function(){
\r
73 res.redirect("/chat/admin");
\r
76 if(typeof(req.body.registor) != "undefined")
\r
78 ipbanlist.Update(req.body.newbanlist,function(){
\r
79 res.redirect("/chat/admin");
\r
82 if(typeof(req.body.updateroom) != "undefined")
\r
84 $rooms.Update(req.body,function(){
\r
85 res.redirect("/chat/admin");
\r
90 function admin_proc(req,res)
\r
92 var security = require("./security.js");
\r
93 var info = new security.SessionInfomation(true);
\r
94 req.session.items = info;
\r
95 var iplist = ipbanlist.GetText();
\r
96 var fs = require("fs");
\r
98 fs.readdir($log_directory,function(err,list){
\r
99 res.setHeader("X-FRAME-OPTIONS","DENY");
\r
100 res.render("admin", {
\r
102 log_directory:$log_directory,
\r
104 token:req.session._csrf,
\r
105 roomlist:$rooms.GetMessage()
\r
110 function removeLog(files,callback)
\r
112 if(typeof(files) == "undefined")
\r
114 if(typeof(callback) == "function")
\r
118 var async = require("async");
\r
120 function(item,callback){
\r
121 var fs = require("fs");
\r
122 fs.unlink($log_directory + "/" + item,callback);
\r
124 function(err,results){
\r
125 if(typeof(callback) == "function")
\r
130 function createLogDirectory()
\r
132 var fs = require("fs");
\r
133 fs.exists($log_directory,function(exists){
\r
134 if(exists == false)
\r
135 fs.mkdirSync($log_directory);
\r
139 function ParseConnect(socket)
\r
141 var ip = GetClientIPAdress(socket);
\r
142 console.log("connected from %s",ip);
\r
144 var rno = GetRoomNumberFromName(socket.namespace.name);
\r
146 var room = $rooms.Get(rno);
\r
150 var roomconfig = room.GetConfig();
\r
151 socket.json.emit("send roominfo",roomconfig);
\r
153 var romcount = room.GetRomCount();
\r
154 socket.json.emit("send romcount",romcount);
\r
155 socket.json.broadcast.emit("send romcount",romcount);
\r
157 socket.on("get pastLog", function (msg) {
\r
158 ParseGetPastLog(socket,msg);
\r
160 socket.on("join",function(msg){
\r
161 ParseJoin(socket,msg);
\r
163 socket.on("quit",function(msg){
\r
164 ParseQuit(socket,msg);
\r
166 socket.on("set password",function(msg){
\r
167 ParseSetPassword(socket,msg);
\r
169 socket.on("send msg", function (msg) {
\r
170 ParseSendMsg(socket,msg);
\r
172 socket.on("disconnect", function (msg) {
\r
173 ParseDisconnect(socket,msg);
\r
177 function ParseAuthorization(handshakeData, callback)
\r
179 var connectUtils = require("express/node_modules/connect/lib/utils");
\r
180 if(handshakeData.headers.cookie) {
\r
181 var cookie = require("express/node_modules/cookie");
\r
182 var signedCookie = cookie.parse(handshakeData.headers.cookie);
\r
183 var sessionID = connectUtils.parseSignedCookies(signedCookie, $secret)["connect.sid"];
\r
184 sessionStore.get(sessionID, function (err, session) {
\r
186 if (ipbanlist.IsBaned(handshakeData.address.address))
\r
187 result = "failed get from session store";
\r
190 else if(typeof(session) == "undefined" || typeof(session._csrf) == "undefined")
\r
191 result = "session is undefined";
\r
192 else if(handshakeData.query.token != session._csrf)
\r
193 result = "invaild token";
\r
195 handshakeData.sessionID = sessionID;
\r
196 callback(result,result == null && !err);
\r
199 return callback("failed get cookie", false);
\r
203 function ParseDisconnect(socket,msg)
\r
205 var ip = GetClientIPAdress(socket);
\r
206 var rno = GetRoomNumberFromName(socket.namespace.name);
\r
207 $rooms.Get(rno).RemoveRom(ip);
\r
209 var romcount = $rooms.Get(rno).GetRomCount();
\r
210 socket.json.emit("send romcount",romcount);
\r
211 socket.json.broadcast.emit("send romcount",romcount);
\r
213 console.log("disconnected");
\r
216 function ParseSetPassword(socket,msg)
\r
218 var rno = GetRoomNumberFromName(socket.namespace.name);
\r
223 var resource = require("./resources.js");
\r
224 if($rooms.Get(rno).IsVolatile() == false && $rooms.Get(rno).SetPassword(msg.owner,msg.password))
\r
225 newMeg.message = resource.password_setted_message;
\r
227 newMeg.message = resource.failed_set_password_message;
\r
228 ParseSendMsg(socket,newMeg);
\r
231 function ParseJoin(socket,msg)
\r
233 var ip = GetClientIPAdress(socket);
\r
235 if(ipbanlist.IsBlockedToWrite(ip))
\r
237 var resource = require("./resources.js");
\r
238 socket.emit("error",resource.block_message);
\r
242 var rno = GetRoomNumberFromName(socket.namespace.name);
\r
244 $rooms.Get(rno).RemoveRom(ip);
\r
246 var romcount = $rooms.Get(rno).GetRomCount();
\r
247 socket.json.emit("send romcount",romcount);
\r
248 socket.json.broadcast.emit("send romcount",romcount);
\r
250 var util = require("util");
\r
251 if($rooms.Get(rno).IsVolatile() == false)
\r
253 if($rooms.Get(rno).IsTimeout() ||
\r
254 $rooms.Get(rno).IsFirstAuth())
\r
256 $rooms.Get(rno).Reset(msg.name);
\r
257 ParseGetPastLog(socket,util.format($log_file_name,rno));
\r
259 else if($rooms.Get(rno).Auth(msg.name,msg.password))
\r
261 ParseGetPastLog(socket,util.format($log_file_name,rno));
\r
265 var resource = require("./resources.js");
\r
266 socket.emit("error",resource.unmatch_password);
\r
273 message:util.format("/enteredby %s %s %s",msg.name,msg.color,msg.mailto),
\r
275 ParseSendMsg(socket,newMeg);
\r
278 function ParseQuit(socket,msg)
\r
280 var ip = GetClientIPAdress(socket);
\r
282 var resource = require("./resources.js");
\r
283 if(ipbanlist.IsBlockedToWrite(ip))
\r
285 socket.emit("error",resource.block_message);
\r
289 var rno = GetRoomNumberFromName(socket.namespace.name);
\r
293 message:resource.password_resetted_message,
\r
296 $rooms.Get(rno).AddRom(ip);
\r
298 var romcount = $rooms.Get(rno).GetRomCount();
\r
299 socket.json.emit("send romcount",romcount);
\r
300 socket.json.broadcast.emit("send romcount",romcount);
\r
302 if($rooms.Get(rno).IsVolatile() == false)
\r
304 if($rooms.Get(rno).IsOwner(msg.name))
\r
306 $rooms.Get(rno).Reset(null);
\r
307 ParseSendMsg(socket,newMeg);
\r
309 if(!$rooms.Get(rno).IsFirstAuth() &&
\r
310 !$rooms.Get(rno).IsAuthed(msg.name))
\r
313 $rooms.Get(rno).RemoveAuth(msg.name);
\r
316 var util = require("util");
\r
317 newMeg.message = util.format("/quitedby %s",msg.name);
\r
318 ParseSendMsg(socket,newMeg);
\r
323 function ParseSendMsg(socket,msg)
\r
325 var ip = GetClientIPAdress(socket);
\r
327 if(ip in ipbanlist)
\r
329 var resource = require("./resources.js");
\r
330 socket.emit("error",resource.block_message);
\r
334 var rno = GetRoomNumberFromName(socket.namespace.name);
\r
336 if(msg.name != $system_name &&
\r
337 $rooms.Get(rno).IsVolatile() == false &&
\r
338 !$rooms.Get(rno).IsAuthed(msg.name) &&
\r
339 !$rooms.Get(rno).IsOwner(rno,msg.name))
\r
344 var date = new Date();
\r
346 var repacked_msg = CreateMessage(msg.name,date,msg.message);
\r
348 if(socket.handshake.admin)
\r
349 repacked_msg.ip = ip;
\r
351 socket.json.emit("req msg", repacked_msg);
\r
353 socket.json.broadcast.emit("req msg", repacked_msg);
\r
355 var util = require("util");
\r
356 var path = $log_directory + "/" + util.format($log_file_name,rno);
\r
357 var log = new ChatLog(path);
\r
358 log.Save(repacked_msg,ip,rno);
\r
361 function GetNameFromRoomNumber(number)
\r
363 return "/" + number;
\r
366 function GetRoomNumberFromName(name)
\r
368 if(name.charAt(0) == "/")
\r
369 return parseInt(name.substr(1));
\r
370 throw "GetRoomNumberFromName error";
\r
373 function ParseGetPastLog(socket,file)
\r
377 var path = $log_directory + "/" + file;
\r
378 var log = new ChatLog(path);
\r
379 var config = require("./configure.js");
\r
380 log.ToArray(config.showip,function(array){
\r
381 socket.json.emit("req pastlog",array);
\r
385 function ChatLog(path)
\r
387 this.ToArray = function(hasIp,callback)
\r
389 var fs = require("fs");
\r
390 var state = fs.stat(path,function(err,state){
\r
393 var array = new Array();
\r
394 var stream = fs.createReadStream(path);
\r
395 var lazy = require("lazy");
\r
398 .forEach(function(line){
\r
399 var msg = CreateMessageFromText(line.toString());
\r
410 this.Save = function(msg,ip,rno){
\r
411 var text = GetTextFromMessage(msg,ip);
\r
413 SplitLog(rno,function(){
\r
414 WritePastLog(path,text);
\r
418 function GetTextFromMessage(msg,ip)
\r
420 var text = msg.name + "<>" +
\r
428 function SplitLog(rno,callback)
\r
430 var util = require("util");
\r
431 var fs = require("fs");
\r
432 var state = fs.stat(path,function(err,state){
\r
433 if(err && typeof(callback) == "function")
\r
438 if(state.size > $spilt_size)
\r
440 var date = new Date();
\r
441 var dateString = ""+date.getFullYear()+date.getMonth()+date.getDate()+date.getHours()+date.getMinutes()+date.getSeconds();
\r
443 var newpath = $log_directory + "/" +
\r
444 util.format($splited_log_file_name,rno,dateString);
\r
445 fs.rename(path,newpath,callback);
\r
447 if(typeof(callback) == "function")
\r
453 function WritePastLog(path,text)
\r
455 var fs = require("fs");
\r
456 var async = require("async");
\r
458 function(callback){
\r
459 fs.open(path,"a",callback);
\r
461 function(fd,callback){
\r
462 var buf = new Buffer(text);
\r
463 fs.write(fd,buf,0,Buffer.byteLength(text),null,function(){
\r
474 function GetClientIPAdress(socket)
\r
476 return socket.handshake.headers["x-forwarded-for"] || socket.handshake.address.address;
\r
480 function CreateMessage(name,date,message)
\r
482 var result = {name:name,
\r
488 function CreateMessageFromText(text)
\r
490 var data = text.split("<>");
\r
491 var msg = {name:data[0],
\r