OSDN Git Service

編集時と登録時にバリテーションを行うようにした
authorkonekoneko <jbh03215@hotmail.co.jp>
Thu, 29 Nov 2012 08:22:23 +0000 (17:22 +0900)
committerkonekoneko <jbh03215@hotmail.co.jp>
Thu, 29 Nov 2012 08:22:23 +0000 (17:22 +0900)
configure.js
profile.js
public/profile/message.ejs
resources.js

index df776e1..4f852c9 100644 (file)
        //type データ型を指定する。指定可能な型は以下の通り\r
        //      text    文字列型を受け付ける\r
        //      password        文字列型を受け付ける。update<key名>の値をチェックすることで更新するかどうか判定できる\r
+       //      number  数値型を受け付ける\r
        //      textarea        改行を含む文字列型を受け付ける\r
        //visible 詳細画面に表示するなら真。そうでないなら偽\r
+       //rule バリテーション時のルール\r
+       // 関数をしていた場合は成功時にnullを返す\r
+       // isnotemptyメンバーが真の場合、必須メンバーであることを表す\r
        alias : {\r
                name :\r
                        {\r
                                name : "名前",\r
                                type : "text",\r
                                visible : true,\r
+                               rule : {isnotempty : true}\r
                        },\r
                password :\r
                        {\r
                mailto :\r
                        {\r
                                name : "メールアドレス",\r
-                               type : "text",\r
+                               type : "mail",\r
                                visible : false,\r
                        },\r
                age :\r
                        {\r
                                name : "年齢",\r
-                               type : "text",\r
+                               type : "number",\r
                                visible : true,\r
                        },\r
                height :\r
                        {\r
                                name : "身長",\r
-                               type : "text",\r
+                               type : "number",\r
                                visible : true,\r
                        },\r
                weight :\r
                        {\r
                                name : "体重",\r
-                               type : "text",\r
+                               type : "number",\r
                                visible : true,\r
                        },\r
                gender :\r
index 76b3018..55d247c 100644 (file)
@@ -193,6 +193,12 @@ function edit_postproc(req, res)
                RenderMessage(res,resource.invaild_parameter,req.session.items);\r
                return;\r
        }else if(typeof(req.body.edit) != "undefined"){\r
+               var validator = new Validator();\r
+               if(validator.Validate(req.body,config.alias))\r
+               {\r
+                       RenderMessage(validator.Message,req.session.items);\r
+                       return;\r
+               }\r
                async.waterfall([\r
                        function(cb){\r
                                if(req.body.updatepassword == false)\r
@@ -214,6 +220,12 @@ function edit_postproc(req, res)
 function registor_postproc(req, res)\r
 {\r
        if(typeof(req.body.registor) != "undefined"){\r
+               var validator = new Validator();\r
+               if(validator.Validate(req.body,config.alias))\r
+               {\r
+                       RenderMessage(res,validator.Message,req.session.items);\r
+                       return;\r
+               }\r
                async.waterfall([\r
                        function(cb){\r
                                collection.AddAsync(req.body,cb);\r
@@ -263,7 +275,7 @@ function ProfileCollection()
        this.AuthAsync = function(name,password,cb){\r
                async.waterfall([\r
                        function(next){\r
-                               pool.query("SELECT * FROM list WHERE name_hash = ? and name = ?",[murmurhash.v3(name),name],next);\r
+                               pool.query("SELECT password FROM list WHERE name_hash = ? and name = ?",[murmurhash.v3(name),name],next);\r
                        },\r
                        function(result,next){\r
                                if(result[0].password == md5_hex(password))\r
@@ -314,13 +326,79 @@ function ProfileCollection()
        {\r
                var item = {\r
                        name_hash:murmurhash.v3(data.name),\r
-                       name:data.name,\r
-                       password:md5_hex(data.password),\r
                        lastmodified:new Date(),\r
                };\r
                for(var key in config.alias)\r
-                       item[key] = data[key];\r
+               {\r
+                       if(key == "password")\r
+                               item[key] = md5_hex(data[key]);\r
+                       else\r
+                               item[key] = data[key];\r
+               }\r
                return item;\r
        }\r
 }\r
 \r
+//\r
+// Validatorクラス\r
+//\r
+function Validator()\r
+{\r
+       //\r
+       // バリテーションを行う。\r
+       // エラーがあった場合は真。そうでない場合は偽を返す\r
+       //\r
+       // @body バリテーションの対象となる連想配列\r
+       // @alias バリテーションを行う要素のリスト\r
+       this.Validate = function(body,alias){\r
+               var result = false;\r
+               this.Message = "";\r
+               for(var key in alias)\r
+               {\r
+                       var message = IsValidate(body[key],alias[key].type,alias[key].rule);\r
+                       if(message != null)\r
+                       {\r
+                               this.Message += "<p>" + alias[key].name + ":" + message + "</p>\n";\r
+                               result = true;\r
+                       }\r
+               }\r
+               return result;\r
+       }\r
+       // バリテーション時にエラーがあった場合、メッセージが記録される\r
+       this.Message = "";\r
+       function IsValidate(data,type,rule){\r
+               if(typeof(data) == "undefined")\r
+                       throw "data is undefined";\r
+               if(typeof(type) == "undefined")\r
+                       throw "type is undefined";\r
+\r
+               var result = null;\r
+\r
+               if(typeof(rule) != "undefined" && typeof(rule.isnotempty) != "undefined"\r
+                       && rule.isnotempty && data == "")\r
+                       return resource.is_not_empty;\r
+\r
+               switch(type)\r
+               {\r
+                       case "text":\r
+                       case "textarea":\r
+                       case "password":\r
+                               if(typeof(data) != "string")\r
+                                       result = resource.is_not_string;\r
+                               break;\r
+                       case "number":\r
+                               if(data.match(/[^0-9]/g))\r
+                                       result = resource.is_not_number;\r
+                               break;\r
+                       case "mail":\r
+                               if(data != "" && !data.match(/^[A-Za-z0-9]+[\w\-\+]+@[\w\.-]+\.\w{2,}$/))\r
+                                       result = resource.is_not_mail;\r
+                               break;\r
+               }\r
+\r
+               if(typeof(rule) == "function")\r
+                       result = rule(data,type);\r
+\r
+               return result;\r
+       }\r
+}
\ No newline at end of file
index 79cb6fb..e51838f 100644 (file)
@@ -8,7 +8,7 @@
 <body>\r
 <h1>メッセージ</h1>\r
 <div id="content">\r
-       <p><%= message %></p>\r
+       <p><%- message %></p>\r
        <p>\r
                <% if(admin){ %>\r
                        <a href="/profile/admin">TOP</a>\r
index 5b281fd..e18b37d 100644 (file)
@@ -10,4 +10,8 @@
        password_setted_message : "パスワードを設定しました",\r
        password_resetted_message : "パスワードをリセットしました",\r
        failed_set_password_message : "パスワードの設定に失敗しました",\r
+       is_not_empty : "必須項目です",\r
+       is_not_string : "文字列ではありません",\r
+       is_not_number : "数字ではありません",\r
+       is_not_mail : "メールアドレスではありません",\r
 };\r