@@ -85,6 +85,88 @@ const resolveAuthorizedKeysSource = (
8585 : matchingPublicKey
8686 } )
8787
88+ const resolveManagedAuthorizedKeysSource = (
89+ fs : FileSystem . FileSystem ,
90+ path : Path . Path ,
91+ baseDir : string ,
92+ preferredSource : string ,
93+ resolved : string
94+ ) : Effect . Effect < string | null , PlatformError , FileSystem . FileSystem | Path . Path > =>
95+ Effect . gen ( function * ( _ ) {
96+ const preferred = resolvePathFromBase ( path , baseDir , preferredSource )
97+ const preferredExists = yield * _ ( fs . exists ( preferred ) )
98+ if ( preferredExists && preferred !== resolved ) {
99+ return preferred
100+ }
101+
102+ return yield * _ ( resolveAuthorizedKeysSource ( fs , path , process . cwd ( ) ) )
103+ } )
104+
105+ const ensureMissingAuthorizedKeysPlaceholder = (
106+ fs : FileSystem . FileSystem ,
107+ path : Path . Path ,
108+ resolved : string ,
109+ state : ExistingFileState
110+ ) : Effect . Effect < void , PlatformError > =>
111+ Effect . gen ( function * ( _ ) {
112+ if ( state === "missing" ) {
113+ yield * _ ( fs . makeDirectory ( path . dirname ( resolved ) , { recursive : true } ) )
114+ yield * _ ( fs . writeFileString ( resolved , "" ) )
115+ }
116+
117+ yield * _ (
118+ Effect . logError (
119+ `Authorized keys not found. Create ${ resolved } with your public key to enable SSH.`
120+ )
121+ )
122+ } )
123+
124+ const readAuthorizedKeysContents = (
125+ fs : FileSystem . FileSystem ,
126+ source : string
127+ ) : Effect . Effect < string | null , PlatformError > =>
128+ Effect . gen ( function * ( _ ) {
129+ const desiredContents = ( yield * _ ( fs . readFileString ( source ) ) ) . trim ( )
130+ if ( desiredContents . length === 0 ) {
131+ yield * _ ( Effect . logWarning ( `Authorized keys source ${ source } is empty. Skipping SSH key sync.` ) )
132+ return null
133+ }
134+
135+ return desiredContents
136+ } )
137+
138+ type AuthorizedKeysSyncTarget = {
139+ readonly fs : FileSystem . FileSystem
140+ readonly path : Path . Path
141+ readonly state : ExistingFileState
142+ readonly resolved : string
143+ readonly managedDefaultAuthorizedKeys : string
144+ readonly source : string
145+ readonly desiredContents : string
146+ }
147+
148+ const syncAuthorizedKeysTarget = ( {
149+ desiredContents,
150+ fs,
151+ managedDefaultAuthorizedKeys,
152+ path,
153+ resolved,
154+ source,
155+ state
156+ } : AuthorizedKeysSyncTarget ) : Effect . Effect < void , PlatformError > =>
157+ Effect . gen ( function * ( _ ) {
158+ if ( state === "exists" ) {
159+ if ( resolved === managedDefaultAuthorizedKeys ) {
160+ yield * _ ( appendKeyIfMissing ( fs , resolved , source , desiredContents ) )
161+ }
162+ return
163+ }
164+
165+ yield * _ ( fs . makeDirectory ( path . dirname ( resolved ) , { recursive : true } ) )
166+ yield * _ ( fs . copyFile ( source , resolved ) )
167+ yield * _ ( Effect . log ( `Authorized keys copied from ${ source } to ${ resolved } ` ) )
168+ } )
169+
88170const ensureAuthorizedKeys = (
89171 baseDir : string ,
90172 authorizedKeysPath : string ,
@@ -107,41 +189,30 @@ const ensureAuthorizedKeys = (
107189 return
108190 }
109191
110- const preferred = resolvePathFromBase ( path , baseDir , preferredSource )
111- const preferredExists = yield * _ ( fs . exists ( preferred ) )
112- const preferredManagedSource = preferredExists && preferred !== resolved ? preferred : null
113- const source = preferredManagedSource === null
114- ? yield * _ ( resolveAuthorizedKeysSource ( fs , path , process . cwd ( ) ) )
115- : preferredManagedSource
192+ const source = yield * _ (
193+ resolveManagedAuthorizedKeysSource ( fs , path , baseDir , preferredSource , resolved )
194+ )
116195 if ( source === null ) {
117- if ( state === "missing" ) {
118- yield * _ ( fs . makeDirectory ( path . dirname ( resolved ) , { recursive : true } ) )
119- yield * _ ( fs . writeFileString ( resolved , "" ) )
120- }
121- yield * _ (
122- Effect . logError (
123- `Authorized keys not found. Create ${ resolved } with your public key to enable SSH.`
124- )
125- )
126- return
127- }
128-
129- const desiredContents = ( yield * _ ( fs . readFileString ( source ) ) ) . trim ( )
130- if ( desiredContents . length === 0 ) {
131- yield * _ ( Effect . logWarning ( `Authorized keys source ${ source } is empty. Skipping SSH key sync.` ) )
196+ yield * _ ( ensureMissingAuthorizedKeysPlaceholder ( fs , path , resolved , state ) )
132197 return
133198 }
134199
135- if ( state === "exists" ) {
136- if ( resolved === managedDefaultAuthorizedKeys ) {
137- yield * _ ( appendKeyIfMissing ( fs , resolved , source , desiredContents ) )
138- }
200+ const desiredContents = yield * _ ( readAuthorizedKeysContents ( fs , source ) )
201+ if ( desiredContents === null ) {
139202 return
140203 }
141204
142- yield * _ ( fs . makeDirectory ( path . dirname ( resolved ) , { recursive : true } ) )
143- yield * _ ( fs . copyFile ( source , resolved ) )
144- yield * _ ( Effect . log ( `Authorized keys copied from ${ source } to ${ resolved } ` ) )
205+ yield * _ (
206+ syncAuthorizedKeysTarget ( {
207+ fs,
208+ path,
209+ state,
210+ resolved,
211+ managedDefaultAuthorizedKeys,
212+ source,
213+ desiredContents
214+ } )
215+ )
145216 } )
146217 )
147218
0 commit comments