[ https://issues.apache.org/jira/browse/COUCHDB-1287?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13153432#comment-13153432 ]
Jason Smith commented on COUCHDB-1287: -------------------------------------- Thanks, Benoit. I avoid the word "dropbox" because of confusion with the folder sync service. What would CouchDB users expect when enabling a "dropbox" flag. Jan proposed "allow_anonymous_writes" because it is clear. What is the intention of the patch? The most direct answer is the first and second paragraph of this issue description: to send a private message from user A to user B. Without an inbox db, the solution is a shared db for every combination of users, which is (1) impractical, and (2) not scalable. Note also requirement 3: All updates are still subject to validate_doc_update(). What is going on with your example? Querying /_security gives me illegal_database_name. Did you mean /testdb/_security? This feature is to *suspend the security rules*. We must be attentive to detail. I am interested in your idea about doing this at at the DB level. I avoided this for a debatable reason: I wanted a minimal patch, easy to understand, changing as little as possible. My core code is 20 lines of focused code. It's all in one place. In our brains, it has locality of reference. But I invite you to defend your security trade-off. Now "dropbox-nature" must be considered throughout the code base, even view handlers. Is it easy to get it right? Well, you got it wrong. Make /testdb private by adding a members list. But a database member can query /testdb but not /testdb/_all_docs. Worse, anonymous users can query /testdb! They can see the doc_count and other details. That is a regression. What's going on? I think we are building different, unrelated features, in which case maybe yours can go in a new ticket? My patch set includes 50 tests demonstrating what may happen and what may not happen. I included an analysis of the patch's security implications. How about yours? I am thankful for your review. No doubt, you are also sensitive to my frustration: I work hard to contribute to CouchDB, only to see (for the second time) a bigwig committer swoop down, make a quick critique, and post a half-hearted rewrite, showing no evidence of equivalent thoughtfulness and deliberation. But where are these modules and externals which I have broken? Are they under the Apache CouchDB project? Is there a plugin policy which I have violated? I am not yet persuaded by vague invocations of externals or module authors. (What is a "module" author anyway?) I am intrigued! But not yet persuaded. It sounds like a convenient hypothetical hurdle. Agreed! Testing based on paths is awkward. But: Pattern matching request paths is the fundamental architecture of CouchDB 1.x. Why does that disqualify new functionality? Plugin authors like me[1] already tackle the problem that _admin is the assumed privilege level. I find Paul's (anticipated) criticism more compelling: security. My initial implementation was based on HTTP verbs and it was inadequate. Thus, to answer Paul: yes, I am pattern matching; but notice that the patterns are for *approval*, any non-match, anything unexpected, anything except those situations we have explicitly greenlighted, falls back to the current execution path. So, I share your concern completely, but I hope I've shown that I thought it through, and I consider the risk worthwhile. Committers: you are the stewards of a code base built upon pattern matching paths, manually running couch_db:check_is_admin/1 for every possible privileged query. How can you argue against my whitelisted, fail-safe design with a straight face? :) [1]: https://github.com/iriscouch/browserid_couchdb https://github.com/iriscouch/futon_couchdb https://github.com/iriscouch/pingquery_couchdb https://github.com/iriscouch/die_couchdb https://github.com/iriscouch/cgi_couchdb > Inbox Database ("write-only" mode) > ---------------------------------- > > Key: COUCHDB-1287 > URL: https://issues.apache.org/jira/browse/COUCHDB-1287 > Project: CouchDB > Issue Type: New Feature > Components: HTTP Interface > Affects Versions: 1.2 > Reporter: Jason Smith > Priority: Minor > Attachments: > 0001-handle-dropbox-db.-Add-dropbox-true-to-security-obje.patch, > A_0001-Refactor-reader_acl-test-functions-into-a-loop.patch, > A_0002-Refactor-the-actual-read-check-out-of-the-member-che.patch, > A_0003-Allow-non-member-writes-if-_security.members.allow_a.patch, > B_0001-Refactor-reader_acl-test-functions-into-a-loop.patch, > B_0002-Refactor-the-actual-read-check-out-of-the-member-che.patch, > B_0003-Allow-non-member-updates-if-_security.members.allow_.patch > > > Currently, we can only grant combined read+write access in the _security > object "members" section. A user can either do both or neither. This prevents > a very common requirement for couch apps: sending private information from > less-privileged users to more-privileged users. > There is no (reasonable) way to make an "inbox" where anybody may create a > doc for me, but only I may read it. An inbox database allows user-to-user, or > user-to-admin private messages. (Not only chat messages, but asynchronous > notifications--with a per-user inbox, perhaps even service requests and > responses.) > There is no reason _security.members (formerly .readers) should control write > access. validate_doc_update() functions do this better. > I propose a boolean flag, _security.members.allow_anonymous_writes. If it is > true, then CouchDB will allow document updates from non-members, giving > validate_doc_update() the final word on accepting or rejecting the update. > Requirements: > 1. Everything about _security stays the same (backward-compatible) > 2. If members.allow_anonymous_writes === true, then most PUT and POSTs may > proceed > 3. All updates are still subject to approval by all validate_doc_update > functions, same as before. > These are the known changes to the security model. I consider these all to be > either very unlikely in practice, or worth the trade-off. > * If you write to an inbox DB, you know, for a time, a subset of its > documents (but that's the point) > * An _update function could reveal a document to the user, with or without > changing it. However, an admin must install such a misguided update function. > * You can launch timing attacks to learn information about validate_doc_update > * You might discover whether doc IDs exist in the DB or not > * You might discover a well-known open source validation function. You can > look for bugs in its source code. > * Zero or more things which Jason can't think of -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa For more information on JIRA, see: http://www.atlassian.com/software/jira