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 var result = validator.Validate(req.body,config.alias,true);
\r
198 if(result.length > 0)
\r
200 RenderMessage(res,result,req.session.items);
\r
205 collection.UpdatAsync(req.body.name,req.body,cb);
\r
207 ],function(err,result){
\r
209 RenderMessage(res,err,req.session.items);
\r
211 RenderMessage(res,resource.success_edit,req.session.items);
\r
214 RenderMessage(res,resource.invaild_parameter,req.session.items);
\r
218 function registor_postproc(req, res)
\r
220 if(typeof(req.body.registor) != "undefined"){
\r
221 var validator = new Validator();
\r
222 var result = validator.Validate(req.body,config.alias,false);
\r
223 if(result.length > 0)
\r
225 RenderMessage(res,result,req.session.items);
\r
230 collection.AddAsync(req.body,cb);
\r
232 ],function(err,result){
\r
234 RenderMessage(res,err,req.session.items);
\r
236 RenderMessage(res,resource.success_registor,req.session.items);
\r
239 RenderMessage(resource.invaild_parameter,req.session.items);
\r
243 function registor_proc(req, res)
\r
245 if(typeof(req.session.items) == "undefined")
\r
246 req.session.items = new security.SessionInfomation(false);
\r
248 res.setHeader("X-FRAME-OPTIONS","DENY");
\r
249 res.render("profile/registor",{token:req.session._csrf,alias:config.alias});
\r
252 function RenderMessage(res,msg,info)
\r
254 if(typeof(msg) == "string")
\r
255 msg = new Array(msg);
\r
256 if(typeof(info) == "undefined" || typeof(info.admin) == "undefined")
\r
257 res.render("profile/message",{message:msg,admin:false});
\r
259 res.render("profile/message",{message:msg,admin:info.admin});
\r
263 // ProfileCollectionクラス
\r
265 function ProfileCollection()
\r
267 var murmurhash = require("murmurhash");
\r
268 var Profile = require("./init").GetProfileColletion;
\r
269 this.AuthAsync = function(name,password,cb){
\r
272 Profile.find({name_hash:murmurhash.v3(name), name:name}).done(next);
\r
274 function(result,next){
\r
275 if(result.password == md5_hex(password))
\r
282 this.GetAsync = function(name,cb){
\r
283 Profile.find({name_hash:murmurhash.v3(name), name:name}).done(cb);
\r
285 this.AddAsync = function(data,cb){
\r
286 newProfile = Profile.build(GetItem(data));
\r
287 newProfile.save().done(cb);
\r
289 this.UpdatAsync = function(name,data,cb){
\r
290 Profile.update(GetItem(data),{name_hash:murmurhash.v3(name), name:name}).done(cb);
\r
292 this.ClearAsync = function(cb){
\r
293 Profile.drop().done(cb);
\r
295 this.RemoveRangeAsync = function(names,cb){
\r
296 Profile.destroy({where:{
\r
301 this.RemoveAsync = function(name,cb){
\r
302 Profile.destroy({name_hash:murmurhash.v3(name), name:name}).done(cb);
\r
304 this.FindByNameAsync = function(pattern,start,count,cb){
\r
313 this.ToArrayAsync = function(start,count,cb){
\r
314 Profile.findAll({offset:start,limit:count}).done(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,newpw)
\r
328 name_hash:murmurhash.v3(data.name),
\r
329 lastmodified:new Date(),
\r
331 for(var key in config.alias)
\r
333 if(typeof(config.alias[key].nodefinetable) != "undefined" &&
\r
334 config.alias[key].nodefinetable)
\r
336 if(config.alias[key].visible_edit)
\r
338 if(config.alias[key].type == "password")
\r
340 if(data[key] != "")
\r
341 item[key] = md5_hex(data[key]);
\r
343 else if(data[key] == "" && typeof(config.alias[key].defaultvalue) != "undefined")
\r
345 item[key] = config.alias[key].defaultvalue;
\r
349 item[key] = data[key];
\r
360 function Validator()
\r
364 // エラーがあった場合は真。そうでない場合は偽を返す
\r
366 // @body バリテーションの対象となる連想配列
\r
367 // @alias バリテーションを行う要素のリスト
\r
368 // @editflag 編集時なら真
\r
369 this.Validate = function(body,alias,editflag){
\r
370 var result = new Array();
\r
371 for(var key in alias)
\r
373 if(alias[key].visible_edit == false)
\r
376 if(typeof(alias[key].isnotempty) != "undefined" &&
\r
377 alias[key].isnotempty && body[key] == "")
\r
378 message = resource.is_not_empty;
\r
379 else if(typeof(alias[key].isnotemptyonregistor) != "undefined" &&
\r
380 alias[key].isnotemptyonregistor && body[key] == "" &&
\r
382 message = resource.is_not_empty;
\r
383 else if(typeof(alias[key].mustmatchitem) != "undefined" &&
\r
384 body[key] != body[alias[key].mustmatchitem])
\r
385 message = util.format(resource.must_match_item,alias[alias[key].mustmatchitem].name);
\r
387 message = IsValidate(body[key],alias[key].type,alias[key].rule);
\r
388 if(message != null)
\r
389 result.push(alias[key].name + ":" + message);
\r
393 function IsValidate(data,type,rule){
\r
394 if(typeof(data) == "undefined")
\r
395 throw "data is undefined";
\r
396 if(typeof(type) == "undefined")
\r
397 throw "type is undefined";
\r
406 if(typeof(data) != "string")
\r
407 result = resource.is_not_string;
\r
410 if(data.match(/[^0-9]/g))
\r
411 result = resource.is_not_number;
\r
414 if(data != "" && !data.match(/^[A-Za-z0-9]+[\w\-\+]+@[\w\.-]+\.\w{2,}$/))
\r
415 result = resource.is_not_mail;
\r
419 if(typeof(rule) == "function")
\r
420 result = rule(data,type);
\r