2014-07-16_16:36:10.05549 18:36:10.055 [info] Application lager started on node 'couchdb@couch1-testing.[TLD]' 2014-07-16_16:36:10.05585 18:36:10.055 [info] Application couch_log started on node 'couchdb@couch1-testing.[TLD]' 2014-07-16_16:36:10.06152 Apache CouchDB 8675de9 is starting. 2014-07-16_16:36:10.06350 18:36:10.063 [info] Starting couch_sup 2014-07-16_16:36:10.17425 18:36:10.173 [info] needed 21.856 ms to open new _users 2014-07-16_16:36:10.18232 18:36:10.181 [error] CRASH REPORT Process <0.174.0> with 1 neighbours exited with reason: call to undefined function couch_index_server:validate(<<"_users">>, {doc,<<"_design/_auth">>,{0,[]},{[{<<"language">>,<<"javascript">>},{<<"validate_doc_update">>,...}]},...}) in gen_server:init_it/6 line 328 2014-07-16_16:36:10.18295 18:36:10.181 [error] Supervisor couch_secondary_services had child auth_cache started with couch_auth_cache:start_link() at undefined exit with reason call to undefined function couch_index_server:validate(<<"_users">>, {doc,<<"_design/_auth">>,{0,[]},{[{<<"language">>,<<"javascript">>},{<<"validate_doc_update">>,...}]},...}) in context start_error 2014-07-16_16:36:10.18338 18:36:10.183 [error] Supervisor couch_sup had child couch_secondary_services started with couch_secondary_sup:start_link() at undefined exit with reason {shutdown,{failed_to_start_child,auth_cache,{undef,[{couch_index_server,validate,[<<"_users">>,{doc,<<"_design/_auth">>,{0,[]},{[{<<"language">>,<<"javascript">>},{<<"validate_doc_update">>,<<"\n function(newDoc, oldDoc, userCtx, secObj) {\n if (newDoc._deleted === true) {\n // allow deletes by admins and matching users\n // without checking the other fields\n if ((userCtx.roles.indexOf('_admin') !== -1) ||\n (userCtx.name == oldDoc.name)) ...">>}]},...}],...},...]}}} in context start_error 2014-07-16_16:36:10.18671 Error starting Apache CouchDB: 2014-07-16_16:36:10.18671 2014-07-16_16:36:10.18671 {error, 2014-07-16_16:36:10.18671 {shutdown, 2014-07-16_16:36:10.18671 {failed_to_start_child,couch_secondary_services, 2014-07-16_16:36:10.18671 {shutdown, 2014-07-16_16:36:10.18671 {failed_to_start_child,auth_cache, 2014-07-16_16:36:10.18671 {undef, 2014-07-16_16:36:10.18671 [{couch_index_server,validate, 2014-07-16_16:36:10.18671 [<<"_users">>, 2014-07-16_16:36:10.18671 {doc,<<"_design/_auth">>, 2014-07-16_16:36:10.18671 {0,[]}, 2014-07-16_16:36:10.18671 {[{<<"language">>,<<"javascript">>}, 2014-07-16_16:36:10.18671 {<<"validate_doc_update">>, 2014-07-16_16:36:10.18671 <<"\n function(newDoc, oldDoc, userCtx, secObj) {\n if (newDoc._deleted === true) {\n // allow deletes by admins and matching users\n // without checking the other fields\n if ((userCtx.roles.indexOf('_admin') !== -1) ||\n (userCtx.name == oldDoc.name)) {\n return;\n } else {\n throw({forbidden: 'Only admins may delete other user docs.'});\n }\n }\n\n if ((oldDoc && oldDoc.type !== 'user') || newDoc.type !== 'user') {\n throw({forbidden : 'doc.type must be user'});\n } // we only allow user docs for now\n\n if (!newDoc.name) {\n throw({forbidden: 'doc.name is required'});\n }\n\n if (!newDoc.roles) {\n throw({forbidden: 'doc.roles must exist'});\n }\n\n if (!isArray(newDoc.roles)) {\n throw({forbidden: 'doc.roles must be an array'});\n }\n\n for (var idx = 0; idx < newDoc.roles.length; idx++) {\n if (typeof newDoc.roles[idx] !== 'string') {\n throw({forbidden: 'doc.roles can only contain strings'});\n }\n }\n\n if (newDoc._id !== ('org.couchdb.user:' + newDoc.name)) {\n throw({\n forbidden: 'Doc ID must be of the form org.couchdb.user:name'\n });\n }\n\n if (oldDoc) { // validate all updates\n if (oldDoc.name !== newDoc.name) {\n throw({forbidden: 'Usernames can not be changed.'});\n }\n }\n\n if (newDoc.password_sha && !newDoc.salt) {\n throw({\n forbidden: 'Users with password_sha must have a salt.' +\n 'See /_utils/script/couch.js for example code.'\n });\n }\n\n if (newDoc.password_scheme === \"pbkdf2\") {\n if (typeof(newDoc.iterations) !== \"number\") {\n throw({forbidden: \"iterations must be a number.\"});\n }\n if (typeof(newDoc.derived_key) !== \"string\") {\n throw({forbidden: \"derived_key must be a string.\"});\n }\n }\n\n var is_server_or_database_admin = function(userCtx, secObj) {\n // see if the user is a server admin\n if(userCtx.roles.indexOf('_admin') !== -1) {\n return true; // a server admin\n }\n\n // see if the user a database admin specified by name\n if(secObj && secObj.admins && secObj.admins.names) {\n if(secObj.admins.names.indexOf(userCtx.name) !== -1) {\n return true; // database admin\n }\n }\n\n // see if the user a database admin specified by role\n if(secObj && secObj.admins && secObj.admins.roles) {\n var db_roles = secObj.admins.roles;\n for(var idx = 0; idx < userCtx.roles.length; idx++) {\n var user_role = userCtx.roles[idx];\n if(db_roles.indexOf(user_role) !== -1) {\n return true; // role matches!\n }\n }\n }\n\n return false; // default to no admin\n }\n\n if (!is_server_or_database_admin(userCtx, secObj)) {\n if (oldDoc) { // validate non-admin updates\n if (userCtx.name !== newDoc.name) {\n throw({\n forbidden: 'You may only update your own user document.'\n });\n }\n // validate role updates\n var oldRoles = oldDoc.roles.sort();\n var newRoles = newDoc.roles.sort();\n\n if (oldRoles.length !== newRoles.length) {\n throw({forbidden: 'Only _admin may edit roles'});\n }\n\n for (var i = 0; i < oldRoles.length; i++) {\n if (oldRoles[i] !== newRoles[i]) {\n throw({forbidden: 'Only _admin may edit roles'});\n }\n }\n } else if (newDoc.roles.length > 0) {\n throw({forbidden: 'Only _admin may set roles'});\n }\n }\n\n // no system roles in users db\n for (var i = 0; i < newDoc.roles.length; i++) {\n if (newDoc.roles[i][0] === '_') {\n throw({\n forbidden:\n 'No system roles (starting with underscore) in users db.'\n });\n }\n }\n\n // no system names as names\n if (newDoc.name[0] === '_') {\n throw({forbidden: 'Username may not start with underscore.'});\n }\n\n var badUserNameChars = [':'];\n\n for (var i = 0; i < badUserNameChars.length; i++) {\n if (newDoc.name.indexOf(badUserNameChars[i]) >= 0) {\n throw({forbidden: 'Character `' + badUserNameChars[i] +\n '` is not allowed in usernames.'});\n }\n }\n }\n">>}]}, 2014-07-16_16:36:10.18682 [],false,[]}], 2014-07-16_16:36:10.18682 []}, 2014-07-16_16:36:10.18682 {couch_db,validate_ddoc,2, 2014-07-16_16:36:10.18682 [{file,"src/couch_db.erl"},{line,527}]}, 2014-07-16_16:36:10.18682 {couch_db,'-prep_and_validate_updates/6-fun-1-', 2014-07-16_16:36:10.18682 3, 2014-07-16_16:36:10.18682 [{file,"src/couch_db.erl"},{line,626}]}, 2014-07-16_16:36:10.18682 {lists,foldl,3,[{file,"lists.erl"},{line,1248}]}, 2014-07-16_16:36:10.18682 {couch_db,prep_and_validate_updates,6, 2014-07-16_16:36:10.18682 [{file,"src/couch_db.erl"},{line,617}]}, 2014-07-16_16:36:10.18682 {couch_db,update_docs,4, 2014-07-16_16:36:10.18682 [{file,"src/couch_db.erl"},{line,846}]}, 2014-07-16_16:36:10.18682 {couch_db,update_doc,4, 2014-07-16_16:36:10.18682 [{file,"src/couch_db.erl"},{line,468}]}, 2014-07-16_16:36:10.18682 {couch_auth_cache,ensure_auth_ddoc_exists,2, 2014-07-16_16:36:10.18682 [{file,"src/couch_auth_cache.erl"}, 2014-07-16_16:36:10.18682 {line,425}]}]}}}}}} 2014-07-16_16:36:10.18682 2014-07-16_16:36:10.20064 18:36:10.187 [error] CRASH REPORT Process <0.118.0> with 0 neighbours exited with reason: {{shutdown,{failed_to_start_child,couch_secondary_services,{shutdown,{failed_to_start_child,auth_cache,{undef,[{couch_index_server,validate,[<<"_users">>,{doc,<<"_design/_auth">>,{0,[]},{[{<<"language">>,<<"javascript">>},{<<"validate_doc_update">>,<<"\n function(newDoc, oldDoc, userCtx, secObj) {\n if (newDoc._deleted === true) {\n // allow deletes by admins and matching users\n // without checking the other fields\n if ((userCtx.roles.indexOf('_admin'...">>}]},...}],...},...]}}}}},...} in application_master:init/4 line 133 2014-07-16_16:36:10.20089 18:36:10.187 [info] Application couch exited with reason: {{shutdown,{failed_to_start_child,couch_secondary_services,{shutdown,{failed_to_start_child,auth_cache,{undef,[{couch_index_server,validate,[<<"_users">>,{doc,<<"_design/_auth">>,{0,[]},{[{<<"language">>,<<"javascript">>},{<<"validate_doc_update">>,<<"\n function(newDoc, oldDoc, userCtx, secObj) {\n if (newDoc._deleted === true) {\n // allow deletes by admins and matching users\n // without checking the other fields\n if ((userCtx.roles.indexOf('_admin'...">>}]},...}],...},...]}}}}},...} 2014-07-16_16:36:11.70706 {"Kernel pid terminated",application_controller,"{application_start_failure,couch,{{shutdown,{failed_to_start_child,couch_secondary_services,{shutdown,{failed_to_start_child,auth_cache,{undef,[{couch_index_server,validate,[<<\"_users\">>,{doc,<<\"_design/_auth\">>,{0,[]},{[{<<\"language\">>,<<\"javascript\">>},{<<\"validate_doc_update\">>,<<\"\n function(newDoc, oldDoc, userCtx, secObj) {\n if (newDoc._deleted === true) {\n // allow deletes by admins and matching users\n // without checking the other fields\n if ((userCtx.roles.indexOf('_admin') !== -1) ||\n (userCtx.name == oldDoc.name)) {\n return;\n } else {\n throw({forbidden: 'Only admins may delete other user docs.'});\n }\n }\n\n if ((oldDoc && oldDoc.type !== 'user') || newDoc.type !== 'user') {\n throw({forbidden : 'doc.type must be user'});\n } // we only allow user docs for now\n\n if (!newDoc.name) {\n throw({forbidden: 'doc.name is required'});\n }\n\n if (!newDoc.roles) {\n throw({forbidden: 'doc.roles must exist'});\n }\n\n if (!isArray(newDoc.roles)) {\n throw({forbidden: 'doc.roles must be an array'});\n }\n\n for (var idx = 0; idx < newDoc.roles.length; idx++) {\n if (typeof newDoc.roles[idx] !== 'string') {\n throw({forbidden: 'doc.roles can only contain strings'});\n }\n }\n\n if (newDoc._id !== ('org.couchdb.user:' + newDoc.name)) {\n throw({\n forbidden: 'Doc ID must be of the form org.couchdb.user:name'\n });\n }\n\n if (oldDoc) { // validate all updates\n if (oldDoc.name !== newDoc.name) {\n throw({forbidden: 'Usernames can not be changed.'});\n }\n }\n\n if (newDoc.password_sha && !newDoc.salt) {\n throw({\n forbidden: 'Users with password_sha must have a salt.' +\n 'See /_utils/script/couch.js for example code.'\n });\n }\n\n if (newDoc.password_scheme === \\"pbkdf2\\") {\n if (typeof(newDoc.iterations) !== \\"number\\") {\n throw({forbidden: \\"iterations must be a number.\\"});\n }\n if (typeof(newDoc.derived_key) !== \\"string\\") {\n throw({forbidden: \\"derived_key must be a string.\\"});\n }\n }\n\n var is_server_or_database_admin = function(userCtx, secObj) {\n // see if the user is a server admin\n if(userCtx.roles.indexOf('_admin') !== -1) {\n return true; // a server admin\n }\n\n // see if the user a database admin specified by name\n if(secObj && secObj.admins && secObj.admins.names) {\n if(secObj.admins.names.indexOf(userCtx.name) !== -1) {\n return true; // database admin\n }\n }\n\n // see if the user a database admin specified by role\n if(secObj && secObj.admins && secObj.admins.roles) {\n var db_roles = secObj.admins.roles;\n for(var idx = 0; idx < userCtx.roles.length; idx++) {\n var user_role = userCtx.roles[idx];\n if(db_roles.indexOf(user_role) !== -1) {\n return true; // role matches!\n }\n }\n }\n\n return false; // default to no admin\n }\n\n if (!is_server_or_database_admin(userCtx, secObj)) {\n if (oldDoc) { // validate non-admin updates\n if (userCtx.name !== newDoc.name) {\n throw({\n forbidden: 'You may only update your own user document.'\n });\n }\n // validate role updates\n var oldRoles = oldDoc.roles.sort();\n var newRoles = newDoc.roles.sort();\n\n if (oldRoles.length !== newRoles.length) {\n throw({forbidden: 'Only _admin may edit roles'});\n }\n\n for (var i = 0; i < oldRoles.length; i++) {\n if (oldRoles[i] !== newRoles[i]) {\n throw({forbidden: 'Only _admin may edit roles'});\n }\n }\n } else if (newDoc.roles.length > 0) {\n throw({forbidden: 'Only _admin may set roles'});\n }\n }\n\n // no system roles in users db\n for (var i = 0; i < newDoc.roles.length; i++) {\n if (newDoc.roles[i][0] === '_') {\n throw({\n forbidden:\n 'No system roles (starting with underscore) in users db.'\n });\n }\n }\n\n // no system names as names\n if (newDoc.name[0] === '_') {\n throw({forbidden: 'Username may not start with underscore.'});\n }\n\n var badUserNameChars = [':'];\n\n for (var i = 0; i < badUserNameChars.length; i++) {\n if (newDoc.name.indexOf(badUserNameChars[i]) >= 0) {\n throw({forbidden: 'Character `' + badUserNameChars[i] +\n '` is not allowed in usernames.'});\n }\n }\n }\n\">>}]},[],false,[]}],[]},{couch_db,validate_ddoc,2,[{file,\"src/couch_db.erl\"},{line,527}]},{couch_db,'-prep_and_validate_updates/6-fun-1-',3,[{file,\"src/couch_db.erl\"},{line,626}]},{lists,foldl,3,[{file,\"lists.erl\"},{line,1248}]},{couch_db,prep_and_validate_updates,6,[{file,\"src/couch_db.erl\"},{line,617}]},{couch_db,update_docs,4,[{file,\"src/couch_db.erl\"},{line,846}]},{couch_db,update_doc,4,[{file,\"src/couch_db.erl\"},{line,468}]},{couch_auth_cache,ensure_auth_ddoc_exists,2,[{file,\"src/couch_auth_cache.erl\"},{line,425}]}]}}}}},{couch_app,start,[normal,[]]}}}"} 2014-07-16_16:36:11.70773 Kernel pid terminated (application_controller) ({application_start_failure,couch,{{shutdown,{failed_to_start_child,couch_secondary_services,{shutdown,{failed_to_start_child,auth_cache,{undef,[{couch