1 var config = require("./configure.js");
\r
2 var resource = require("./resources.js");
\r
3 var util = require("util");
\r
4 var async = require("async");
\r
5 var security = require("./security.js");
\r
6 var ejs = require("ejs");
\r
7 require("date-utils");
\r
9 var collection = new ProfileCollection();
\r
11 module.exports = function(app){
\r
12 app.get("/profile",list_proc);
\r
13 app.get("/profile/admin",admin_proc);
\r
14 app.post("/profile/admin",admin_postproc);
\r
15 app.get("/profile/detail",detail_proc);
\r
16 app.post("/profile/detail",detail_postproc);
\r
17 app.post("/profile/edit",edit_postproc);
\r
18 app.get("/profile/registor",registor_proc);
\r
19 app.post("/profile/registor",registor_postproc);
\r
22 function admin_proc(req, res)
\r
24 var info = new security.SessionInfomation(true);
\r
25 req.session.items = info;
\r
28 PrepaerListAsync(req,callback);
\r
30 ],function(err,result){
\r
32 RenderMessage(res,err,info);
\r
34 result.token = req.session._csrf;
\r
35 res.setHeader("X-FRAME-OPTIONS","DENY");
\r
36 res.render("profile/admin",result);
\r
41 function admin_postproc(req,res)
\r
45 if(typeof(req.body.removeall) != "undefined")
\r
46 collection.ClearAsync(cb);
\r
47 if(typeof(req.body.remove) != "undefined")
\r
48 collection.RemoveRangeAsync(req.body.names,cb);
\r
50 ],function(err,result){
\r
52 RenderMessage(res,err,req.session.items);
\r
54 RenderMessage(res,resource.success_remove,req.session.items);
\r
58 function list_proc(req, res)
\r
60 if(typeof(req.session.items) != "undefined")
\r
61 req.session.items.admin = false;
\r
64 PrepaerListAsync(req,cb);
\r
66 ],function(err,result){
\r
68 RenderMessage(res,err,req.session.items);
\r
70 res.render("profile/list",result);
\r
74 function PrepaerListAsync(req,callback)
\r
76 var limit = config.db_limit;
\r
79 if(typeof(req.query.start) != "undefined")
\r
80 start = parseInt(req.query.start);
\r
81 if(typeof(req.query.limit) != "undefined")
\r
82 limit = parseInt(req.query.limit);
\r
86 if(typeof(req.query.search) != "undefined")
\r
88 parttern = req.query.search;
\r
89 collection.FindByNameAsync(parttern,start,limit,cb);
\r
91 collection.ToArrayAsync(start,limit,cb);
\r
94 ],function(err,result){
\r
98 var next = start + limit;
\r
99 var prev = start - limit;
\r
102 for(var i = 0; i < result.length; i++)
\r
103 result[i].lastmodified = result[i].lastmodified.toFormat("YYYY/MM/DD HH:MI:SS");
\r
104 callback(null,{list:result,search:parttern,next:next,prev:prev,limit:limit});
\r
109 function detail_proc(req, res)
\r
111 if(typeof(req.query.name) == "undefined")
\r
113 RenderMessage(res,resource.invaild_parameter,req.session.items);
\r
117 if(typeof(req.session.items) == "undefined")
\r
118 req.session.items = new security.SessionInfomation(false);
\r
122 collection.GetAsync(req.query.name,cb);
\r
124 ],function(err,result){
\r
126 RenderMessage(res,err,req.session.items);
\r
127 else if(result.length == 0)
\r
128 RenderMessage(res,resource.notfound_name,req.session.items);
\r
130 res.setHeader("X-FRAME-OPTIONS","DENY");
\r
131 res.render("profile/detail",{list:result,alias:config.alias,token:req.session._csrf,admin:req.session.items.admin});
\r
136 function detail_postproc(req, res)
\r
138 if(typeof(req.body.remove) != "undefined"){
\r
141 if(typeof(req.session.items) != "undefined" && req.session.items.admin)
\r
144 collection.AuthAsync(req.body.name,req.body.password,cb);
\r
146 function(result,cb){
\r
148 collection.RemoveAsync(req.body.name,cb);
\r
152 ],function(err,result){
\r
154 RenderMessage(res,err,req.session.items);
\r
155 else if(result == null)
\r
156 RenderMessage(res,resource.unmatch_password,req.session.items);
\r
158 RenderMessage(res,resource.success_remove,req.session.items);
\r
160 }else if(typeof(req.body.edit) != "undefined"){
\r
163 if(typeof(req.session.items) != "undefined" && req.session.items.admin)
\r
166 collection.AuthAsync(req.body.name,req.body.password,cb);
\r
168 function(result,cb){
\r
170 collection.GetAsync(req.body.name,cb);
\r
174 ],function(err,result){
\r
176 RenderMessage(res,err,req.session.items);
\r
177 }else if(result != null){
\r
178 res.setHeader("X-FRAME-OPTIONS","DENY");
\r
179 res.render("profile/edit",{list:result,token:req.session._csrf,alias:config.alias});
\r
181 RenderMessage(res,resource.unmatch_password,req.session.items);
\r
185 RenderMessage(res,resource.invaild_parameter,req.session.items);
\r
189 function edit_postproc(req, res)
\r
191 if(typeof(req.body.name) == "undefined")
\r
193 RenderMessage(res,resource.invaild_parameter,req.session.items);
\r
195 }else if(typeof(req.body.edit) != "undefined"){
\r
196 var validator = new Validator();
\r
197 if(validator.Validate(req.body,config.alias))
\r
199 RenderMessage(validator.Message,req.session.items);
\r
204 if(req.body.updatepassword == false)
\r
205 collection.UpdatAsync(req.body.name,req.body,null,cb);
\r
207 collection.UpdatAsync(req.body.name,req.body,req.body.password,cb);
\r
209 ],function(err,result){
\r
211 RenderMessage(res,err,req.session.items);
\r
213 RenderMessage(res,resource.success_edit,req.session.items);
\r
216 RenderMessage(res,resource.invaild_parameter,req.session.items);
\r
220 function registor_postproc(req, res)
\r
222 if(typeof(req.body.registor) != "undefined"){
\r
223 var validator = new Validator();
\r
224 if(validator.Validate(req.body,config.alias))
\r
226 RenderMessage(res,validator.Message,req.session.items);
\r
231 collection.AddAsync(req.body,cb);
\r
233 ],function(err,result){
\r
235 RenderMessage(res,err,req.session.items);
\r
237 RenderMessage(res,resource.success_registor,req.session.items);
\r
240 RenderMessage(resource.invaild_parameter,req.session.items);
\r
244 function registor_proc(req, res)
\r
246 if(typeof(req.session.items) == "undefined")
\r
247 req.session.items = new security.SessionInfomation(false);
\r
249 res.setHeader("X-FRAME-OPTIONS","DENY");
\r
250 res.render("profile/registor",{token:req.session._csrf,alias:config.alias});
\r
253 function RenderMessage(res,msg,info)
\r
255 if(typeof(info) == "undefined" || typeof(info.admin) == "undefined")
\r
256 res.render("profile/message",{message:msg,admin:false});
\r
258 res.render("profile/message",{message:msg,admin:info.admin});
\r
262 // ProfileCollectionクラス
\r
264 function ProfileCollection()
\r
266 var MySQLPool = new require("./mysql_pool.js");
\r
267 var murmurhash = require("murmurhash");
\r
268 var pool = new MySQLPool({
\r
269 host : config.db_host,
\r
270 user : config.db_user,
\r
271 password : config.db_password,
\r
272 port : config.db_port,
\r
273 database : "webchat",
\r
275 this.AuthAsync = function(name,password,cb){
\r
278 pool.query("SELECT password FROM list WHERE name_hash = ? and name = ?",[murmurhash.v3(name),name],next);
\r
280 function(result,next){
\r
281 if(result[0].password == md5_hex(password))
\r
288 this.GetAsync = function(name,cb){
\r
289 pool.query("SELECT * FROM list WHERE name_hash = ? and name = ?",[murmurhash.v3(name),name],cb);
\r
291 this.AddAsync = function(data,cb){
\r
292 var item = GetItem(data);
\r
293 pool.query("INSERT INTO list SET ?",[item],cb);
\r
295 this.UpdatAsync = function(name,data,newpassword,cb){
\r
296 var item = GetItem(data);
\r
297 if(newpassword != null)
\r
298 item.password = md5_hex(newpassword);
\r
299 pool.query("UPDATE list SET ? WHERE name = ?",[item,name],cb);
\r
301 this.ClearAsync = function(cb){
\r
302 pool.query("TRUNCATE TABLE list",null,cb);
\r
304 this.RemoveRangeAsync = function(names,cb){
\r
305 pool.query("DELETE FROM list WHERE name IN (?)",[names],cb);
\r
307 this.RemoveAsync = function(name,cb){
\r
308 pool.query("DELETE FROM list WHERE name_hash = ? and name = ?",[murmurhash.v3(name),name],cb);
\r
310 this.FindByNameAsync = function(pattern,start,count,cb){
\r
311 pool.query("SELECT * FROM list WHERE name LIKE ? LIMIT ?,?",[pattern+"%",start,count],cb);
\r
313 this.ToArrayAsync = function(start,count,cb){
\r
314 pool.query("SELECT name,lastmodified FROM list LIMIT ?,?",[start,count],cb);
\r
317 var crypto = require("crypto");
\r
318 function md5_hex(src)
\r
320 var md5 = crypto.createHash('md5');
\r
321 md5.update(src, 'utf8');
\r
322 return md5.digest('hex');
\r
325 function GetItem(data)
\r
328 name_hash:murmurhash.v3(data.name),
\r
329 lastmodified:new Date(),
\r
331 for(var key in config.alias)
\r
333 if(key == "password")
\r
334 item[key] = md5_hex(data[key]);
\r
336 item[key] = data[key];
\r
345 function Validator()
\r
349 // エラーがあった場合は真。そうでない場合は偽を返す
\r
351 // @body バリテーションの対象となる連想配列
\r
352 // @alias バリテーションを行う要素のリスト
\r
353 this.Validate = function(body,alias){
\r
354 var result = false;
\r
356 for(var key in alias)
\r
358 var message = IsValidate(body[key],alias[key].type,alias[key].rule);
\r
359 if(message != null)
\r
361 this.Message += "<p>" + alias[key].name + ":" + message + "</p>\n";
\r
367 // バリテーション時にエラーがあった場合、メッセージが記録される
\r
369 function IsValidate(data,type,rule){
\r
370 if(typeof(data) == "undefined")
\r
371 throw "data is undefined";
\r
372 if(typeof(type) == "undefined")
\r
373 throw "type is undefined";
\r
377 if(typeof(rule) != "undefined" && typeof(rule.isnotempty) != "undefined"
\r
378 && rule.isnotempty && data == "")
\r
379 return resource.is_not_empty;
\r
386 if(typeof(data) != "string")
\r
387 result = resource.is_not_string;
\r
390 if(data.match(/[^0-9]/g))
\r
391 result = resource.is_not_number;
\r
394 if(data != "" && !data.match(/^[A-Za-z0-9]+[\w\-\+]+@[\w\.-]+\.\w{2,}$/))
\r
395 result = resource.is_not_mail;
\r
399 if(typeof(rule) == "function")
\r
400 result = rule(data,type);
\r