[PATCH] ssh: ensure ~/.ssh exists

Tuncer Ayaz <>
Fri Sep 3 12:52:42 CEST 2010


Make sure that ~/.ssh exists before trying to open files like
~/.ssh/known_hosts.

Reported-By: Daniel Goertzen
---
 lib/ssh/src/ssh_file.erl |   18 ++++++++++++++++--
 1 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/lib/ssh/src/ssh_file.erl b/lib/ssh/src/ssh_file.erl
index 5572349..963f0cf 100755
--- a/lib/ssh/src/ssh_file.erl
+++ b/lib/ssh/src/ssh_file.erl
@@ -27,6 +27,8 @@
 -include("PKCS-1.hrl").
 -include("DSS.hrl").
 
+-include_lib("kernel/include/file.hrl").
+
 -export([public_host_dsa_key/2,private_host_dsa_key/2,
 	 public_host_rsa_key/2,private_host_rsa_key/2,
 	 public_host_key/2,private_host_key/2,
@@ -43,6 +45,9 @@
 
 -define(DBG_PATHS, true).
 
+-define(PERM_700, 8#00700).
+-define(PERM_644, 8#00644).
+
 %% API
 public_host_dsa_key(Type, Opts) ->
     File = file_name(Type, "ssh_host_dsa_key.pub", Opts),
@@ -113,8 +118,10 @@ do_lookup_host_key(Host, Alg, Opts) ->
 
 add_host_key(Host, Key, Opts) ->
     Host1 = add_ip(replace_localhost(Host)),
-    case file:open(file_name(user, "known_hosts", Opts),[write,append]) of
+    KnownHosts = file_name(user, "known_hosts", Opts),
+    case file:open(KnownHosts, [write,append]) of
    	{ok, Fd} ->
+	    ok = chmod(KnownHosts, ?PERM_644),
    	    Res = add_key_fd(Fd, Host1, Key),
    	    file:close(Fd),
    	    Res;
@@ -527,4 +534,11 @@ file_name(Type, Name, Opts) ->
 
 default_user_dir()->
     {ok,[[Home|_]]} = init:get_argument(home),
-    filename:join(Home, ".ssh").
+    UserDir = filename:join(Home, ".ssh"),
+    ok = filelib:ensure_dir(filename:join(UserDir, "dummy")),
+    ok = chmod(UserDir, ?PERM_700),
+    UserDir.
+
+chmod(Path, Perms) ->
+    {ok, FileInfo} = file:read_file_info(Path),
+    ok = file:write_file_info(Path, FileInfo#file_info{mode=Perms}).


More information about the erlang-patches mailing list