diff options
-rw-r--r-- | src/chttpd/src/chttpd_db.erl | 1 | ||||
-rw-r--r-- | src/couch/src/couch_att.erl | 22 | ||||
-rw-r--r-- | src/couch/src/couch_doc.erl | 4 |
3 files changed, 26 insertions, 1 deletions
diff --git a/src/chttpd/src/chttpd_db.erl b/src/chttpd/src/chttpd_db.erl index 2c3ec6356..cae1c11a1 100644 --- a/src/chttpd/src/chttpd_db.erl +++ b/src/chttpd/src/chttpd_db.erl @@ -1266,6 +1266,7 @@ db_attachment_req(#httpd{method=Method, user_ctx=Ctx}=Req, Db, DocId, FileNamePa DocEdited = Doc#doc{ atts = NewAtt ++ [A || A <- Atts, couch_att:fetch(name, A) /= FileName] }, + couch_att:validate_attachment_count(length(DocEdited#doc.atts)), W = chttpd:qs_value(Req, "w", integer_to_list(mem3:quorum(Db))), case fabric:update_doc(Db, DocEdited, [{user_ctx,Ctx}, {w,W}]) of {ok, UpdatedRev} -> diff --git a/src/couch/src/couch_att.erl b/src/couch/src/couch_att.erl index d699b6a8f..fa45b932d 100644 --- a/src/couch/src/couch_att.erl +++ b/src/couch/src/couch_att.erl @@ -52,7 +52,8 @@ -export([ max_attachment_size/0, - validate_attachment_size/3 + validate_attachment_size/3, + validate_attachment_count/1 ]). -compile(nowarn_deprecated_type). @@ -718,6 +719,25 @@ max_attachment_size() -> end. +max_attachment_count() -> + case config:get("couchdb", "max_attachments_per_document", "infinity") of + "infinity" -> + infinity; + MaxAttSize -> + list_to_integer(MaxAttSize) + end. + + +validate_attachment_count(AttCount) -> + case max_attachment_count() of + infinity -> ok; + MaxAttCount when AttCount =< MaxAttCount -> ok; + _TooManyAttachments -> + throw({request_entity_too_large, + <<"hit max_attachments_per_document">>}) + end. + + validate_attachment_size(AttName, AttSize, MaxAttSize) when is_integer(AttSize), AttSize > MaxAttSize -> throw({request_entity_too_large, {attachment, AttName}}); diff --git a/src/couch/src/couch_doc.erl b/src/couch/src/couch_doc.erl index f960ec5c2..a39ff1752 100644 --- a/src/couch/src/couch_doc.erl +++ b/src/couch/src/couch_doc.erl @@ -135,6 +135,7 @@ from_json_obj_validate(EJson, DbName) -> Doc = from_json_obj(EJson, DbName), case couch_ejson_size:encoded_size(Doc#doc.body) =< MaxSize of true -> + validate_attachment_count(Doc#doc.atts), validate_attachment_sizes(Doc#doc.atts), Doc; false -> @@ -153,6 +154,9 @@ validate_attachment_sizes(Atts) -> end, Atts). +validate_attachment_count(Atts) -> + couch_att:validate_attachment_count(length(Atts)). + from_json_obj({Props}) -> from_json_obj({Props}, undefined). |