1
- use std:: path:: Path ;
2
-
1
+ use age:: x25519:: Identity ;
3
2
use bollard:: {
4
3
network:: ListNetworksOptions ,
5
4
service:: { ContainerSummary , Volume } ,
6
5
volume:: ListVolumesOptions ,
7
6
} ;
8
7
use linked_hash_map:: LinkedHashMap ;
8
+ use std:: path:: Path ;
9
9
10
10
use crate :: {
11
- age_utils,
11
+ age_utils:: { self , Variable } ,
12
12
api:: WorkspaceApi ,
13
13
constants,
14
14
labels:: { self , Labels , ROLE } ,
@@ -211,21 +211,61 @@ impl<'a> WorkspaceApi<'a> {
211
211
Ok ( ( ) )
212
212
}
213
213
214
+ pub fn encrypt (
215
+ & self ,
216
+ identity : Identity ,
217
+ name : & str ,
218
+ vars : LinkedHashMap < String , String > ,
219
+ ) -> Result < LinkedHashMap < String , String > , AnyError > {
220
+ let encrypted = self . encrypt_value ( identity, vars[ name] . to_string ( ) ) ?;
221
+ let mut new_vars = vars. clone ( ) ;
222
+ new_vars. insert ( name. to_string ( ) , encrypted) ;
223
+ Ok ( new_vars)
224
+ }
225
+
226
+ pub fn encrypt_value (
227
+ & self ,
228
+ identity : Identity ,
229
+ clear_text : String ,
230
+ ) -> Result < String , AnyError > {
231
+ age_utils:: encrypt ( clear_text, identity. to_public ( ) )
232
+ }
233
+
214
234
pub async fn decrypt (
215
235
& self ,
216
236
vars : Option < LinkedHashMap < String , String > > ,
217
- ) -> Result < LinkedHashMap < String , String > , AnyError > {
237
+ ) -> Result < LinkedHashMap < String , age_utils :: Variable > , AnyError > {
218
238
log:: debug!( "Checking if vars need decryption" ) ;
219
239
if let Some ( vars) = age_utils:: needs_decryption ( vars. clone ( ) ) {
220
240
log:: debug!( "Decrypting vars" ) ;
221
241
let identity = self . read_age_identity ( ) . await ?;
222
242
age_utils:: decrypt ( & identity, vars)
223
243
} else {
224
244
log:: debug!( "No encrypted vars found" ) ;
225
- Ok ( vars. unwrap_or_default ( ) )
245
+ let mut ret = LinkedHashMap :: < String , Variable > :: new ( ) ;
246
+ match vars {
247
+ Some ( vars) => {
248
+ for ( k, v) in vars {
249
+ ret. insert ( k, Variable :: ClearText { value : v } ) ;
250
+ }
251
+ Ok ( ret)
252
+ }
253
+ None => Ok ( ret) ,
254
+ }
226
255
}
227
256
}
228
257
258
+ pub fn variables_to_string (
259
+ & self ,
260
+ vars : & LinkedHashMap < String , Variable > ,
261
+ ) -> LinkedHashMap < String , String > {
262
+ let mut ret = LinkedHashMap :: < String , String > :: new ( ) ;
263
+ for ( k, v) in vars {
264
+ ret. insert ( k. clone ( ) , v. to_string ( ) ) ;
265
+ }
266
+ ret
267
+ }
268
+
229
269
pub async fn edit ( & self , workspace_key : & str ) -> Result < ( ) , AnyError > {
230
270
let labels = Labels :: new ( Some ( workspace_key) , Some ( WORK_ROLE ) ) ;
231
271
for c in self . api . container . get_all ( & labels) . await ? {
@@ -234,15 +274,36 @@ impl<'a> WorkspaceApi<'a> {
234
274
let format = FileFormat :: from_path ( config_source) ;
235
275
let config =
236
276
RoozCfg :: deserialize_config ( & labels[ labels:: CONFIG_BODY ] , format) ?. unwrap ( ) ;
277
+ let decrypted = self . decrypt ( config. clone ( ) . vars ) . await ?;
237
278
let decrypted_config = RoozCfg {
238
- vars : Some ( self . decrypt ( config . clone ( ) . vars ) . await ? ) ,
279
+ vars : Some ( self . variables_to_string ( & decrypted ) ) ,
239
280
..config
240
281
} ;
241
- let edited_config = edit:: edit ( decrypted_config. to_string ( format) ?) ?;
242
-
243
- println ! ( "edited: {}" , edited_config) ;
282
+ let edited_string = edit:: edit ( decrypted_config. to_string ( format) ?) ?;
283
+
284
+ let edited_config = RoozCfg :: from_string ( & edited_string, format) ?;
285
+
286
+ let identity = self . read_age_identity ( ) . await ?;
287
+
288
+ let mut encrypted_vars = LinkedHashMap :: < String , String > :: new ( ) ;
289
+ for ( k, v) in & decrypted {
290
+ let edited_value = & edited_config. clone ( ) . vars . unwrap ( ) [ k] ;
291
+ match v {
292
+ Variable :: ClearText { .. } => {
293
+ encrypted_vars. insert ( k. to_string ( ) , edited_value. to_string ( ) )
294
+ }
295
+ Variable :: Secret { .. } => encrypted_vars. insert (
296
+ k. to_string ( ) ,
297
+ self . encrypt_value ( identity. clone ( ) , edited_value. to_string ( ) ) ?,
298
+ ) ,
299
+ } ;
300
+ }
301
+ let encrypted_config = RoozCfg {
302
+ vars : Some ( encrypted_vars) ,
303
+ ..edited_config
304
+ } ;
244
305
245
- // encrypt
306
+ println ! ( "{}" , encrypted_config . to_string ( format ) ? )
246
307
// save to label
247
308
// apply
248
309
}
0 commit comments