@@ -309,47 +309,29 @@ func (r *HelmRepositoryOCIReconciler) reconcile(ctx context.Context, sp *patch.S
309
309
authenticator authn.Authenticator
310
310
keychain authn.Keychain
311
311
tlsConfig * tls.Config
312
- tmpCertsDir string
313
- tlsLoginOpt helmreg.LoginOption
312
+ secret * corev1.Secret
314
313
err error
315
314
)
316
315
// Configure any authentication related options.
317
316
if obj .Spec .SecretRef != nil {
318
- // Attempt to retrieve secret.
319
- name := types.NamespacedName {
320
- Namespace : obj .GetNamespace (),
321
- Name : obj .Spec .SecretRef .Name ,
322
- }
323
- var secret corev1.Secret
324
- if err := r .Client .Get (ctx , name , & secret ); err != nil {
325
- conditions .MarkFalse (obj , meta .ReadyCondition , sourcev1 .AuthenticationFailedReason , err .Error ())
326
- result , retErr = ctrl.Result {}, err
327
- return
328
- }
329
- keychain , err = authFromSecret (ctx , r .Client , obj .Spec .URL , secret )
317
+ secret , err = r .getSecret (ctx , obj )
330
318
if err != nil {
331
319
conditions .MarkFalse (obj , meta .ReadyCondition , sourcev1 .AuthenticationFailedReason , err .Error ())
332
320
result , retErr = ctrl.Result {}, err
333
321
return
334
322
}
335
- tlsConfig , err = getter . TLSClientConfigFromSecret ( secret , obj .Spec .URL )
323
+ keychain , err = authFromSecret ( ctx , r . Client , obj .Spec .URL , * secret )
336
324
if err != nil {
337
325
conditions .MarkFalse (obj , meta .ReadyCondition , sourcev1 .AuthenticationFailedReason , err .Error ())
338
326
result , retErr = ctrl.Result {}, err
339
327
return
340
328
}
341
- tlsLoginOpt , tmpCertsDir , err = makeTLSLoginOption ( & secret )
329
+ tlsConfig , err = getter . TLSClientConfigFromSecret ( * secret , obj . Spec . URL )
342
330
if err != nil {
343
331
conditions .MarkFalse (obj , meta .ReadyCondition , sourcev1 .AuthenticationFailedReason , err .Error ())
344
332
result , retErr = ctrl.Result {}, err
345
333
return
346
334
}
347
- defer func () {
348
- if err := os .RemoveAll (tmpCertsDir ); err != nil {
349
- r .eventLogf (ctx , obj , corev1 .EventTypeWarning , meta .FailedReason ,
350
- "failed to delete temporary certificates directory: %s" , err )
351
- }
352
- }()
353
335
} else if obj .Spec .Provider != helmv1 .GenericOCIProvider && obj .Spec .Type == helmv1 .HelmRepositoryTypeOCI {
354
336
auth , authErr := oidcAuth (ctxTimeout , obj .Spec .URL , obj .Spec .Provider )
355
337
if authErr != nil && ! errors .Is (authErr , oci .ErrUnconfiguredProvider ) {
@@ -400,8 +382,22 @@ func (r *HelmRepositoryOCIReconciler) reconcile(ctx context.Context, sp *patch.S
400
382
// Attempt to login to the registry if credentials are provided.
401
383
if loginOpt != nil {
402
384
opts := []helmreg.LoginOption {loginOpt }
403
- if tlsLoginOpt != nil {
404
- opts = append (opts , tlsLoginOpt )
385
+ if tlsConfig != nil && secret != nil {
386
+ tlsLoginOpt , tmpCertsDir , err := registry .TLSLoginOptionFromSecret (secret )
387
+ if err != nil {
388
+ conditions .MarkFalse (obj , meta .ReadyCondition , sourcev1 .AuthenticationFailedReason , err .Error ())
389
+ result , retErr = ctrl.Result {}, err
390
+ return
391
+ }
392
+ defer func () {
393
+ if err := os .RemoveAll (tmpCertsDir ); err != nil {
394
+ r .eventLogf (ctx , obj , corev1 .EventTypeWarning , meta .FailedReason ,
395
+ "failed to delete temporary certificates directory: %s" , err )
396
+ }
397
+ }()
398
+ if tlsLoginOpt != nil {
399
+ opts = append (opts , tlsLoginOpt )
400
+ }
405
401
}
406
402
err = chartRepo .Login (opts ... )
407
403
if err != nil {
@@ -429,6 +425,22 @@ func (r *HelmRepositoryOCIReconciler) reconcileDelete(ctx context.Context, obj *
429
425
return ctrl.Result {}, nil
430
426
}
431
427
428
+ func (r * HelmRepositoryOCIReconciler ) getSecret (ctx context.Context , obj * helmv1.HelmRepository ) (* corev1.Secret , error ) {
429
+ if obj .Spec .SecretRef == nil {
430
+ return nil , nil
431
+ }
432
+ name := types.NamespacedName {
433
+ Namespace : obj .GetNamespace (),
434
+ Name : obj .Spec .SecretRef .Name ,
435
+ }
436
+ var secret corev1.Secret
437
+ err := r .Client .Get (ctx , name , & secret )
438
+ if err != nil {
439
+ return nil , err
440
+ }
441
+ return & secret , nil
442
+ }
443
+
432
444
// eventLogf records events, and logs at the same time.
433
445
//
434
446
// This log is different from the debug log in the EventRecorder, in the sense
@@ -470,80 +482,6 @@ func makeLoginOption(auth authn.Authenticator, keychain authn.Keychain, registry
470
482
return nil , nil
471
483
}
472
484
473
- func makeTLSLoginOption (secret * corev1.Secret ) (helmreg.LoginOption , string , error ) {
474
- var errs []error
475
- certFile , keyFile , caFile , tmpDir , err := certsFilesFromSecret (secret )
476
- if err != nil {
477
- errs = append (errs , err )
478
- if tmpDir != "" {
479
- if err := os .RemoveAll (tmpDir ); err != nil {
480
- errs = append (errs , err )
481
- }
482
- }
483
- return nil , "" , kerrors .NewAggregate (errs )
484
- }
485
-
486
- if (certFile != "" && keyFile != "" ) || caFile != "" {
487
- return helmreg .LoginOptTLSClientConfig (certFile , keyFile , caFile ), tmpDir , nil
488
- }
489
-
490
- return nil , "" , nil
491
- }
492
-
493
- func certsFilesFromSecret (secret * corev1.Secret ) (string , string , string , string , error ) {
494
- certBytes , keyBytes , caBytes := secret .Data ["certFile" ], secret .Data ["keyFile" ], secret .Data ["caFile" ]
495
- switch {
496
- case len (certBytes )+ len (keyBytes )+ len (caBytes ) == 0 :
497
- return "" , "" , "" , "" , nil
498
- case (len (certBytes ) > 0 && len (keyBytes ) == 0 ) || (len (keyBytes ) > 0 && len (certBytes ) == 0 ):
499
- return "" , "" , "" , "" , fmt .Errorf ("invalid '%s' secret data: fields 'certFile' and 'keyFile' require each other's presence" ,
500
- secret .Name )
501
- }
502
-
503
- var (
504
- certFile string
505
- keyFile string
506
- caFile string
507
- err error
508
- )
509
-
510
- // create temporary folder to store the certs
511
- tmpDir , err := os .MkdirTemp ("" , "helm-repo-oci-certs" )
512
- if err != nil {
513
- return "" , "" , "" , "" , err
514
- }
515
-
516
- if len (certBytes ) > 0 && len (keyBytes ) > 0 {
517
- certFile , err = writeTofile (certBytes , "cert.pem" , tmpDir )
518
- if err != nil {
519
- return "" , "" , "" , "" , err
520
- }
521
- keyFile , err = writeTofile (keyBytes , "key.pem" , tmpDir )
522
- if err != nil {
523
- return "" , "" , "" , "" , err
524
- }
525
- }
526
- if len (caBytes ) > 0 {
527
- caFile , err = writeTofile (caBytes , "ca.pem" , tmpDir )
528
- if err != nil {
529
- return "" , "" , "" , "" , err
530
- }
531
- }
532
- return certFile , keyFile , caFile , tmpDir , nil
533
- }
534
-
535
- func writeTofile (data []byte , filename , tmpDir string ) (string , error ) {
536
- file , err := os .CreateTemp (tmpDir , filename )
537
- if err != nil {
538
- return "" , err
539
- }
540
- defer file .Close ()
541
- if _ , err := file .Write (data ); err != nil {
542
- return "" , err
543
- }
544
- return file .Name (), nil
545
- }
546
-
547
485
func conditionsDiff (a , b []string ) []string {
548
486
bMap := make (map [string ]struct {}, len (b ))
549
487
for _ , j := range b {
0 commit comments