fix: ensure unicode binary is used everywhere in data backup
This commit is contained in:
parent
7b9d943c33
commit
332e5e7b56
|
@ -626,8 +626,13 @@ to_version(Version) when is_binary(Version) ->
|
||||||
to_version(Version) when is_list(Version) ->
|
to_version(Version) when is_list(Version) ->
|
||||||
Version.
|
Version.
|
||||||
|
|
||||||
|
%% TODO: do not allow abs file path here.
|
||||||
|
%% i.e. Filename0 should be a relative path only
|
||||||
|
%% or the path prefix is in an white-list
|
||||||
upload_backup_file(Filename0, Bin) ->
|
upload_backup_file(Filename0, Bin) ->
|
||||||
case ensure_file_name(Filename0) of
|
%% ensure it's a binary, so filenmae:join will always return binary
|
||||||
|
Filename1 = to_unicode_bin(Filename0),
|
||||||
|
case ensure_file_name(Filename1) of
|
||||||
{ok, Filename} ->
|
{ok, Filename} ->
|
||||||
case check_json(Bin) of
|
case check_json(Bin) of
|
||||||
{ok, _} ->
|
{ok, _} ->
|
||||||
|
@ -665,25 +670,22 @@ list_backup_file() ->
|
||||||
lists:filtermap(Filter, backup_files()).
|
lists:filtermap(Filter, backup_files()).
|
||||||
|
|
||||||
backup_files() ->
|
backup_files() ->
|
||||||
backup_files(backup_dir()) ++ backup_files(backup_dir_old_version()).
|
backup_files(backup_dir()) ++
|
||||||
|
backup_files(backup_dir_old_version()).
|
||||||
|
|
||||||
backup_files(Dir) ->
|
backup_files(Dir) ->
|
||||||
{ok, FilesAll} = file:list_dir_all(Dir),
|
{ok, FilesAll} = file:list_dir_all(Dir),
|
||||||
Files = lists:filtermap(fun legal_filename/1, FilesAll),
|
Files = lists:filtermap(fun legal_filename/1, FilesAll),
|
||||||
[filename:join([Dir, File]) || File <- Files].
|
[filename:join([Dir, to_unicode_bin(File)]) || File <- Files].
|
||||||
|
|
||||||
look_up_file(Filename) when is_binary(Filename) ->
|
|
||||||
look_up_file(binary_to_list(Filename));
|
|
||||||
look_up_file(Filename) ->
|
look_up_file(Filename) ->
|
||||||
DefOnNotFound = fun(_Filename) -> {error, not_found} end,
|
DefOnNotFound = fun(_Filename) -> {error, not_found} end,
|
||||||
do_look_up_file(Filename, DefOnNotFound).
|
do_look_up_file(Filename, DefOnNotFound).
|
||||||
|
|
||||||
do_look_up_file(Filename, OnNotFound) when is_binary(Filename) ->
|
|
||||||
do_look_up_file(binary_to_list(Filename), OnNotFound);
|
|
||||||
do_look_up_file(Filename, OnNotFound) ->
|
do_look_up_file(Filename, OnNotFound) ->
|
||||||
Filter =
|
Filter =
|
||||||
fun(MaybeFile) ->
|
fun(MaybeFile) ->
|
||||||
filename:basename(MaybeFile) == Filename
|
filename:basename(MaybeFile) =:= Filename
|
||||||
end,
|
end,
|
||||||
case lists:filter(Filter, backup_files()) of
|
case lists:filter(Filter, backup_files()) of
|
||||||
[] ->
|
[] ->
|
||||||
|
@ -830,6 +832,8 @@ import(Filename, OverridesJson) ->
|
||||||
-endif.
|
-endif.
|
||||||
|
|
||||||
-spec(check_import_json(binary() | string()) -> {ok, map()} | {error, term()}).
|
-spec(check_import_json(binary() | string()) -> {ok, map()} | {error, term()}).
|
||||||
|
check_import_json(Filename) when is_list(Filename) ->
|
||||||
|
check_import_json(to_unicode_bin(Filename));
|
||||||
check_import_json(Filename) ->
|
check_import_json(Filename) ->
|
||||||
OnNotFound =
|
OnNotFound =
|
||||||
fun(F) ->
|
fun(F) ->
|
||||||
|
@ -872,14 +876,8 @@ backup_dir_old_version() ->
|
||||||
emqx:get_env(data_dir).
|
emqx:get_env(data_dir).
|
||||||
|
|
||||||
legal_filename(Filename) ->
|
legal_filename(Filename) ->
|
||||||
case to_unicode_bin(Filename) of
|
MaybeJson = filename:extension(Filename),
|
||||||
<<"/", _/binary>> ->
|
MaybeJson == ".json" orelse MaybeJson == <<".json">>.
|
||||||
%% never allow abs path
|
|
||||||
false;
|
|
||||||
_ ->
|
|
||||||
MaybeJson = filename:extension(Filename),
|
|
||||||
MaybeJson == ".json" orelse MaybeJson == <<".json">>
|
|
||||||
end.
|
|
||||||
|
|
||||||
check_json(MaybeJson) ->
|
check_json(MaybeJson) ->
|
||||||
case emqx_json:safe_decode(MaybeJson, [return_maps]) of
|
case emqx_json:safe_decode(MaybeJson, [return_maps]) of
|
||||||
|
|
Loading…
Reference in New Issue