Fix nasty 500 error on POST to /_config
diff --git a/src/config.erl b/src/config.erl
index 640d7c2..1feed6b 100644
--- a/src/config.erl
+++ b/src/config.erl
@@ -253,7 +253,7 @@
true = ets:insert(?MODULE, {{Sec, Key}, Val}),
couch_log:notice("~p: [~s] ~s set to ~s for reason ~p",
[?MODULE, Sec, Key, Val, Reason]),
- case {Persist, Config#config.write_filename} of
+ ConfigWriteReturn = case {Persist, Config#config.write_filename} of
{true, undefined} ->
ok;
{true, FileName} ->
@@ -261,16 +261,21 @@
_ ->
ok
end,
- Event = {config_change, Sec, Key, Val, Persist},
- gen_event:sync_notify(config_event, Event),
- {reply, ok, Config}
+ case ConfigWriteReturn of
+ ok ->
+ Event = {config_change, Sec, Key, Val, Persist},
+ gen_event:sync_notify(config_event, Event),
+ {reply, ok, Config};
+ {error, _Else} ->
+ {reply, {error, _Else}, Config}
+ end
end;
handle_call({delete, Sec, Key, Persist, Reason}, _From, Config) ->
true = ets:delete(?MODULE, {Sec,Key}),
couch_log:notice("~p: [~s] ~s deleted for reason ~p",
[?MODULE, Sec, Key, Reason]),
- case {Persist, Config#config.write_filename} of
+ ConfigDeleteReturn = case {Persist, Config#config.write_filename} of
{true, undefined} ->
ok;
{true, FileName} ->
@@ -278,9 +283,15 @@
_ ->
ok
end,
- Event = {config_change, Sec, Key, deleted, Persist},
- gen_event:sync_notify(config_event, Event),
- {reply, ok, Config};
+ case ConfigDeleteReturn of
+ ok ->
+ Event = {config_change, Sec, Key, deleted, Persist},
+ gen_event:sync_notify(config_event, Event),
+ {reply, ok, Config};
+ _Else ->
+ {reply, _Else, Config}
+ end;
+
handle_call(reload, _From, Config) ->
DiskKVs = lists:foldl(fun(IniFile, DiskKVs0) ->
{ok, ParsedIniValues} = parse_ini_file(IniFile),
diff --git a/src/config_writer.erl b/src/config_writer.erl
index 2812686..159437c 100644
--- a/src/config_writer.erl
+++ b/src/config_writer.erl
@@ -35,7 +35,7 @@
NewLines = process_file_lines(Lines, [], SectionLine, Pattern, Key, Value),
NewFileContents = reverse_and_add_newline(strip_empty_lines(NewLines), []),
- ok = file:write_file(File, NewFileContents).
+ file:write_file(File, NewFileContents).
process_file_lines([Section|Rest], SeenLines, Section, Pattern, Key, Value) ->
diff --git a/test/config_tests.erl b/test/config_tests.erl
index 7a5b56d..6afb591 100644
--- a/test/config_tests.erl
+++ b/test/config_tests.erl
@@ -297,6 +297,45 @@
}.
+config_access_right_test_() ->
+ {
+ "Config file access right tests",
+ {
+ foreach,
+ fun setup/0,
+ fun teardown/1,
+ [
+ fun should_write_config_to_file/0,
+ fun should_delete_config_from_file/0,
+ fun should_not_write_config_to_file/0,
+ fun should_not_delete_config_from_file/0
+ ]
+ }
+ }.
+
+
+should_write_config_to_file() ->
+ ?assertEqual(ok, config:set("admins", "foo", "500", true)).
+
+
+should_delete_config_from_file() ->
+ ?assertEqual(ok, config:delete("admins", "foo", true)).
+
+
+should_not_write_config_to_file() ->
+ meck:new(config_writer),
+ meck:expect(config_writer, save_to_file, fun(_, _) -> {error, eacces} end),
+ ?assertEqual({error, eacces}, config:set("admins", "foo", "500", true)),
+ meck:unload(config_writer).
+
+
+should_not_delete_config_from_file() ->
+ meck:new(config_writer),
+ meck:expect(config_writer, save_to_file, fun(_, _) -> {error, eacces} end),
+ ?assertEqual({error, eacces}, config:delete("admins", "foo", true)),
+ meck:unload(config_writer).
+
+
should_load_all_configs() ->
?assert(length(config:all()) > 0).