Dear Wiki user,

You have subscribed to a wiki page or wiki category on "Couchdb Wiki" for 
change notification.

The "Document_Update_Validation" page has been changed by StephaneAlnet.
The comment on this change is: Added some toolbox examples for the validation 
function..
http://wiki.apache.org/couchdb/Document_Update_Validation?action=diff&rev1=2&rev2=3

--------------------------------------------------

     a. name - String user name
     a. roles - Array of roles to which user belongs. Currently only admin role 
is supported.
  
+ 
+ == Toolbox ==
+ Some of these functions are found in 
http://guide.couchdb.org/draft/validation.html . Use them inside your 
validate_doc_update functions.
+ {{{
+ 
+   function required(field, message /* optional */) {
+     message = message || "Document must have a " + field;
+     if (!newDoc[field]) throw({forbidden : message});
+   }
+ 
+   function unchanged(field) {
+     if (oldDoc && toJSON(oldDoc[field]) != toJSON(newDoc[field]))
+       throw({forbidden : "Field can't be changed: " + field});
+   }
+ 
+   function user_is(role) {
+     return userCtx.roles.indexOf(role) >= 0;
+   }
+ 
+ }}}
+ 
+ Here is a validation function I use to manage update Authorization using the 
roles as an ACL. A user may modify documents for which the accounts listed in 
his "roles" ACL are a prefix of the account specified.
+ 
+ {{{
+   function user_match(account,message /* optional */) {
+     for (var i in userCtx.roles) {
+       var prefix = userCtx.roles[i];
+       /* prefix-matching: "roles" will contain strings like "account:0003546" 
-- or define your own matching rules */
+       if( ("account:"+account).substring(0,prefix.length) === prefix ) return;
+     }
+     throw({forbidden : message||"No access to this account"});
+   }
+ 
+   /* Usage */
+   if(oldDoc) {
+     unchanged("account");
+     user_match(newDoc.account,"You are not authorized to modify this 
document");
+   } else {
+     user_match(newDoc.account,"You are not authorized to create this 
document");
+   }
+ }}}
+ 

Reply via email to