OSDN Git Service

全ての項目でbbcodeを使えるようにした
[webchat/WebChat.git] / profile.js
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
8 \r
9 var collection = new ProfileCollection();\r
10 \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
20 };\r
21 \r
22 function admin_proc(req, res)\r
23 {\r
24         var info = new security.SessionInfomation(true);\r
25         req.session.items = info;\r
26         async.waterfall([\r
27                 function(callback){\r
28                         PrepaerListAsync(req,callback);\r
29                 }\r
30         ],function(err,result){\r
31                 if(err != null)\r
32                         RenderMessage(res,err,info);\r
33                 else{\r
34                         result.token = req.session._csrf;\r
35                         res.setHeader("X-FRAME-OPTIONS","DENY");\r
36                         res.render("profile/admin",result);\r
37                 }\r
38         });\r
39 }\r
40 \r
41 function admin_postproc(req,res)\r
42 {\r
43         async.waterfall([\r
44                 function(cb){\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
49                 }\r
50         ],function(err,result){\r
51                 if(err != null)\r
52                         RenderMessage(res,err,req.session.items);\r
53                 else\r
54                         RenderMessage(res,resource.success_remove,req.session.items);\r
55         });\r
56 }\r
57 \r
58 function list_proc(req, res)\r
59 {\r
60         if(typeof(req.session.items) != "undefined")\r
61                 req.session.items.admin = false;\r
62         async.waterfall([\r
63                 function(cb){\r
64                         PrepaerListAsync(req,cb);\r
65                 }\r
66         ],function(err,result){\r
67                 if(err != null)\r
68                         RenderMessage(res,err,req.session.items);\r
69                 else\r
70                         res.render("profile/list",result);\r
71         });\r
72 }\r
73 \r
74 function PrepaerListAsync(req,callback)\r
75 {\r
76         var limit = config.db_limit;\r
77         var start = 0;\r
78         var parttern = "";\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
83 \r
84         async.waterfall([\r
85                 function(cb){\r
86                         if(typeof(req.query.search) != "undefined")\r
87                         {\r
88                                 parttern = req.query.search;\r
89                                 collection.FindByNameAsync(parttern,start,limit,cb);\r
90                         }else{\r
91                                 collection.ToArrayAsync(start,limit,cb);\r
92                         }\r
93                 }\r
94         ],function(err,result){\r
95                 if(err != null){\r
96                         callback(err,null);\r
97                 }else{\r
98                         var next = start + limit;\r
99                         var prev = start - limit;\r
100                         if(prev < 0)\r
101                                 prev = 0;\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
105                 }\r
106         });\r
107 }\r
108 \r
109 function detail_proc(req, res)\r
110 {\r
111         if(typeof(req.query.name) == "undefined")\r
112         {\r
113                 RenderMessage(res,resource.invaild_parameter,req.session.items);\r
114                 return;\r
115         }\r
116 \r
117         if(typeof(req.session.items) == "undefined")\r
118                 req.session.items = new security.SessionInfomation(false);\r
119 \r
120         async.waterfall([\r
121                 function(cb){\r
122                         collection.GetAsync(req.query.name,cb);\r
123                 },\r
124         ],function(err,result){\r
125                 if(err != null)\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
129                 else{\r
130                         res.setHeader("X-FRAME-OPTIONS","DENY");\r
131                         res.render("profile/detail",{list:result,alias:config.alias,visiblefield:config.visiblefield,token:req.session._csrf,admin:req.session.items.admin});\r
132                 }\r
133         });\r
134 }\r
135 \r
136 function detail_postproc(req, res)\r
137 {\r
138         if(typeof(req.body.remove) != "undefined"){\r
139                 async.waterfall([\r
140                         function(cb){\r
141                                 if(typeof(req.session.items) != "undefined" && req.session.items.admin)\r
142                                         cb(null,true);\r
143                                 else\r
144                                         collection.AuthAsync(req.body.name,req.body.password,cb);\r
145                         },\r
146                         function(result,cb){\r
147                                 if(result)\r
148                                         collection.RemoveAsync(req.body.name,cb);\r
149                                 else\r
150                                         cb(null,null);\r
151                         }\r
152                 ],function(err,result){\r
153                         if(err != null)\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
157                         else\r
158                                 RenderMessage(res,resource.success_remove,req.session.items);\r
159                 });\r
160         }else if(typeof(req.body.edit) != "undefined"){\r
161                 async.waterfall([\r
162                         function(cb){\r
163                                 if(typeof(req.session.items) != "undefined" && req.session.items.admin)\r
164                                         cb(null,true);\r
165                                 else\r
166                                         collection.AuthAsync(req.body.name,req.body.password,cb);\r
167                         },\r
168                         function(result,cb){\r
169                                 if(result)\r
170                                         collection.GetAsync(req.body.name,cb);\r
171                                 else\r
172                                         cb(null,null);\r
173                         }\r
174                 ],function(err,result){\r
175                         if(err != null){\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,inputtype:config.inputtype});\r
180                         }else{\r
181                                 RenderMessage(res,resource.unmatch_password,req.session.items);\r
182                         }\r
183                 });\r
184         }else{\r
185                 RenderMessage(res,resource.invaild_parameter,req.session.items);\r
186         }\r
187 }\r
188 \r
189 function edit_postproc(req, res)\r
190 {\r
191         if(typeof(req.body.name) == "undefined")\r
192         {\r
193                 RenderMessage(res,resource.invaild_parameter,req.session.items);\r
194                 return;\r
195         }else if(typeof(req.body.edit) != "undefined"){\r
196                 async.waterfall([\r
197                         function(cb){\r
198                                 if(req.body.updatepw == false)\r
199                                         collection.UpdatAsync(req.body.name,req.body,null,cb);\r
200                                 else\r
201                                         collection.UpdatAsync(req.body.name,req.body,req.body.password,cb);\r
202                         },\r
203                 ],function(err,result){\r
204                         if(err != null)\r
205                                 RenderMessage(res,err,req.session.items);\r
206                         else\r
207                                 RenderMessage(res,resource.success_edit,req.session.items);\r
208                 });\r
209         }else{\r
210                 RenderMessage(res,resource.invaild_parameter,req.session.items);\r
211         }\r
212 }\r
213 \r
214 function registor_postproc(req, res)\r
215 {\r
216         if(typeof(req.body.registor) != "undefined"){\r
217                 async.waterfall([\r
218                         function(cb){\r
219                                 collection.AddAsync(req.body,cb);\r
220                         }\r
221                 ],function(err,result){\r
222                         if(err != null)\r
223                                 RenderMessage(res,err,req.session.items);\r
224                         else\r
225                                 RenderMessage(res,resource.success_registor,req.session.items);\r
226                 });\r
227         }else{\r
228                 RenderMessage(resource.invaild_parameter,req.session.items);\r
229         }\r
230 }\r
231 \r
232 function registor_proc(req, res)\r
233 {\r
234         if(typeof(req.session.items) == "undefined")\r
235                 req.session.items = new security.SessionInfomation(false);\r
236 \r
237         res.setHeader("X-FRAME-OPTIONS","DENY");\r
238         res.render("profile/registor",{token:req.session._csrf,alias:config.alias,inputtype:config.inputtype});\r
239 }\r
240 \r
241 function RenderMessage(res,msg,info)\r
242 {\r
243         if(typeof(info) == "undefined" || typeof(info.admin) == "undefined")\r
244                 res.render("profile/message",{message:msg,admin:false});\r
245         else\r
246                 res.render("profile/message",{message:msg,admin:info.admin});\r
247 }\r
248 \r
249 //\r
250 // ProfileCollectionクラス\r
251 //\r
252 function ProfileCollection()\r
253 {\r
254         var MySQLPool = new require("./mysql_pool.js");\r
255         var murmurhash = require("murmurhash");\r
256         var pool = new MySQLPool({\r
257                                 host     : config.db_host,\r
258                                 user     : config.db_user,\r
259                                 password : config.db_password,\r
260                                 port     : config.db_port,\r
261                                 database : "webchat",\r
262                         });\r
263         this.AuthAsync = function(name,password,cb){\r
264                 async.waterfall([\r
265                         function(next){\r
266                                 pool.query("SELECT * FROM list WHERE name_hash = ? and name = ?",[murmurhash.v3(name),name],next);\r
267                         },\r
268                         function(result,next){\r
269                                 if(result[0].password == md5_hex(password))\r
270                                         next(null,true);\r
271                                 else\r
272                                         next(null,false);\r
273                         }\r
274                 ],cb);\r
275         }\r
276         this.GetAsync = function(name,cb){\r
277                 pool.query("SELECT * FROM list WHERE name_hash = ? and name = ?",[murmurhash.v3(name),name],cb);\r
278         }\r
279         this.AddAsync = function(data,cb){\r
280                 var item = GetItem(data);\r
281                 pool.query("INSERT INTO list SET ?",[item],cb);\r
282         }\r
283         this.UpdatAsync = function(name,data,newpassword,cb){\r
284                 var item = GetItem(data);\r
285                 if(newpassword != null)\r
286                         item.password = md5_hex(newpassword);\r
287                 pool.query("UPDATE list SET ? WHERE name = ?",[item,name],cb);\r
288         }\r
289         this.ClearAsync = function(cb){\r
290                 pool.query("TRUNCATE TABLE list",null,cb);\r
291         }\r
292         this.RemoveRangeAsync = function(names,cb){\r
293                 pool.query("DELETE FROM list WHERE name IN (?)",[names],cb);\r
294         }\r
295         this.RemoveAsync = function(name,cb){\r
296                 pool.query("DELETE FROM list WHERE name_hash = ? and name = ?",[murmurhash.v3(name),name],cb);\r
297         }\r
298         this.FindByNameAsync = function(pattern,start,count,cb){\r
299                 pool.query("SELECT * FROM list WHERE name LIKE ? LIMIT ?,?",[pattern+"%",start,count],cb);\r
300         }\r
301         this.ToArrayAsync = function(start,count,cb){\r
302                 pool.query("SELECT name,lastmodified FROM list LIMIT ?,?",[start,count],cb);\r
303         }\r
304 \r
305         var crypto = require("crypto");\r
306         function md5_hex(src)\r
307         {\r
308                 var md5 = crypto.createHash('md5');\r
309                 md5.update(src, 'utf8');\r
310         return md5.digest('hex');\r
311         }\r
312 \r
313         function GetItem(data)\r
314         {\r
315                 var item = {\r
316                         name_hash:murmurhash.v3(data.name),\r
317                         name:data.name,\r
318                         password:md5_hex(data.password),\r
319                         lastmodified:new Date(),\r
320                 };\r
321                 for(var key in config.alias)\r
322                         item[key] = data[key];\r
323                 return item;\r
324         }\r
325 }\r
326 \r