diff options
author | Hans Nilsson <[email protected]> | 2015-06-05 14:48:47 +0200 |
---|---|---|
committer | Hans Nilsson <[email protected]> | 2015-06-05 14:48:47 +0200 |
commit | cbda735e138a764e78cf668bcf9eec292bc5cc11 (patch) | |
tree | 7a2d38aba9952b6a0e196596ff9dfccea8612ec5 /lib/ssh/src | |
parent | 3f58cd3cf433343b9eb33cc433a26e43995e75d7 (diff) | |
parent | 834b38ff07d835d68f5ab62f78b40aa9c6341b6b (diff) | |
download | otp-cbda735e138a764e78cf668bcf9eec292bc5cc11.tar.gz otp-cbda735e138a764e78cf668bcf9eec292bc5cc11.tar.bz2 otp-cbda735e138a764e78cf668bcf9eec292bc5cc11.zip |
Merge branch 'hans/ssh/check_dirs/OTP-12788'
* hans/ssh/check_dirs/OTP-12788:
ssh: Check that user_dir and system_dir exists and are readable
Diffstat (limited to 'lib/ssh/src')
-rw-r--r-- | lib/ssh/src/ssh.erl | 34 |
1 files changed, 31 insertions, 3 deletions
diff --git a/lib/ssh/src/ssh.erl b/lib/ssh/src/ssh.erl index 4a07473f74..18951c8c89 100644 --- a/lib/ssh/src/ssh.erl +++ b/lib/ssh/src/ssh.erl @@ -24,6 +24,7 @@ -include("ssh.hrl"). -include("ssh_connect.hrl"). -include_lib("public_key/include/public_key.hrl"). +-include_lib("kernel/include/file.hrl"). -export([start/0, start/1, stop/0, connect/3, connect/4, close/1, connection_info/2, channel_info/3, @@ -389,9 +390,9 @@ handle_option([Opt | Rest], SocketOptions, SshOptions) -> handle_ssh_option({minimal_remote_max_packet_size, Value} = Opt) when is_integer(Value), Value >=0 -> Opt; handle_ssh_option({system_dir, Value} = Opt) when is_list(Value) -> - Opt; + check_dir(Opt); handle_ssh_option({user_dir, Value} = Opt) when is_list(Value) -> - Opt; + check_dir(Opt); handle_ssh_option({user_dir_fun, Value} = Opt) when is_function(Value) -> Opt; handle_ssh_option({silently_accept_hosts, Value} = Opt) when is_boolean(Value) -> @@ -581,4 +582,31 @@ handle_ip(Inet) -> %% Default to ipv4 [inet | Inet] end end. - + +check_dir({_,Dir} = Opt) -> + case directory_exist_readable(Dir) of + ok -> + Opt; + {error,Error} -> + throw({error, {eoptions,{Opt,Error}}}) + end. + +directory_exist_readable(Dir) -> + case file:read_file_info(Dir) of + {ok, #file_info{type = directory, + access = Access}} -> + case Access of + read -> ok; + read_write -> ok; + _ -> {error, eacces} + end; + + {ok, #file_info{}}-> + {error, enotdir}; + + {error, Error} -> + {error, Error} + end. + + + |