@@ -36,10 +36,35 @@ function userHome() {
3636 return process . env [ ( process . platform == 'win32' ) ? 'USERPROFILE' : 'HOME' ] ;
3737}
3838
39+ function mkFullPath ( pathToCreate ) {
40+ let joinedDirs = [ ] ;
41+ let pathToKnownHostsParts = pathToCreate . split ( path . sep )
42+ pathToKnownHostsParts = pathToKnownHostsParts . map ( ( part ) => {
43+ if ( ! part . length ) return path . sep
44+ return part ;
45+ } ) ;
46+ pathToKnownHostsParts . forEach ( ( dir ) => {
47+ joinedDirs . push ( dir ) ;
48+ let newPath = path . join . apply ( null , joinedDirs )
49+ try {
50+ fs . accessSync ( newPath ) ;
51+ return ;
52+ }
53+ catch ( _ ) {
54+ try {
55+ fs . mkdirSync ( newPath ) ;
56+ } catch ( e ) {
57+ if ( e . code != 'EEXIST' ) throw e ;
58+ }
59+ }
60+ } ) ;
61+ }
62+
3963function loadFingerprint ( serverId , knownHostsPath , cb ) {
40- if ( ! fs . existsSync ( knownHostsPath ) ) {
41- cb ( null ) ;
42- return ;
64+ try {
65+ fs . accessSync ( knownHostsPath ) ;
66+ } catch ( e ) {
67+ return cb ( null )
4368 }
4469 let found = false ;
4570 require ( 'readline' ) . createInterface ( {
@@ -57,6 +82,13 @@ function loadFingerprint( serverId, knownHostsPath, cb ) {
5782}
5883
5984function storeFingerprint ( serverId , knownHostsPath , fingerprint ) {
85+ // If file doesn't exist, create full path to it
86+ try {
87+ fs . accessSync ( knownHostsPath ) ;
88+ } catch ( _ ) {
89+ let pathWithoutFile = [ ] . concat ( knownHostsPath . split ( path . sep ) ) . slice ( 0 , - 1 ) . join ( path . sep ) ;
90+ mkFullPath ( pathWithoutFile ) ;
91+ }
6092 fs . appendFile ( knownHostsPath , serverId + " " + fingerprint + EOL , "utf8" , ( err ) => {
6193 if ( err ) {
6294 console . log ( err ) ;
0 commit comments