@@ -25,14 +25,23 @@ public partial class CertifyManager
2525 /// <returns></returns>
2626 public async Task < ManagedCertificate > GetManagedCertificate ( string id )
2727 {
28- var item = await _itemManager . GetById ( id ) ;
29- if ( item != null )
28+ if ( id . StartsWith ( "ext-" ) )
3029 {
31- item . InstanceId = _serverConfig . HubAssignedInstanceId ;
32- item . DateRetrieved = DateTime . UtcNow ;
30+ // look for item via external managed certificate provider
31+ return _externallyManagedCertificatesCache
32+ . FirstOrDefault ( i => i . Id == id ) ;
3333 }
34+ else
35+ {
36+ var item = await _itemManager . GetById ( id ) ;
37+ if ( item != null )
38+ {
39+ item . InstanceId = _serverConfig . HubAssignedInstanceId ;
40+ item . DateRetrieved = DateTime . UtcNow ;
41+ }
3442
35- return item ;
43+ return item ;
44+ }
3645 }
3746
3847 /// <summary>
@@ -58,47 +67,70 @@ public async Task<List<ManagedCertificate>> GetManagedCertificates(ManagedCertif
5867 return list ;
5968 }
6069
70+ List < ManagedCertificate > _externallyManagedCertificatesCache = [ ] ;
71+ private DateTimeOffset _externallyManagedCacheUpdated = DateTimeOffset . MinValue ;
72+
6173 private async Task < List < ManagedCertificate > > GetExternallyManagedCertificates ( ManagedCertificateFilter filter )
6274 {
63- var externalList = new List < ManagedCertificate > ( ) ;
75+ if ( _externallyManagedCacheUpdated > DateTimeOffset . UtcNow . AddMinutes ( - 10 ) )
76+ {
77+ // return cached results
78+ return _externallyManagedCertificatesCache ;
79+ }
80+
6481 if ( _pluginManager ? . CertificateManagerProviders ? . Any ( ) == true )
6582 {
66- // TODO: cache providers/results
83+ List < ManagedCertificate > list = [ ] ;
6784
6885 // check if we have any external sources of managed certificates
6986 foreach ( var p in _pluginManager . CertificateManagerProviders )
7087 {
7188 if ( p != null )
7289 {
73- var pluginType = p . GetType ( ) ;
74- var providers = p . GetProviders ( pluginType ) ;
75-
76- foreach ( var cp in providers )
90+ try
7791 {
78- if ( cp ? . IsEnabled == true )
79- {
80- try
81- {
82- var certManager = p . GetProvider ( pluginType , cp . Id ) ;
83- var certs = await certManager . GetManagedCertificates ( filter ) ;
92+ var pluginType = p . GetType ( ) ;
93+ var providers = p . GetProviders ( pluginType ) ;
8494
85- externalList . AddRange ( certs ) ;
86- }
87- catch ( Exception ex )
95+ foreach ( var cp in providers )
96+ {
97+ if ( cp ? . IsEnabled == true )
8898 {
89- _serviceLog ? . Error ( $ "Failed to query certificate manager plugin { cp . Title } { ex } ") ;
99+ try
100+ {
101+ var certManager = p . GetProvider ( pluginType , cp . Id ) ;
102+ var certs = await certManager . GetManagedCertificates ( filter ) ;
103+
104+ list . AddRange ( certs ) ;
105+ }
106+ catch ( Exception ex )
107+ {
108+ _serviceLog ? . Error ( $ "Failed to query certificate manager plugin { cp . Title } { ex } ") ;
109+ }
90110 }
91111 }
92112 }
113+ catch ( Exception ex )
114+ {
115+ _serviceLog ? . Error ( $ "Failed to query certificate manager providers { ex } ") ;
116+ }
93117 }
94118 else
95119 {
96120 _serviceLog ? . Error ( $ "Failed to create one or more certificate manager plugins") ;
97121 }
98122 }
123+
124+ lock ( _externallyManagedCertificatesCache )
125+ {
126+ // reset cache
127+ _externallyManagedCertificatesCache = list ;
128+ }
99129 }
100130
101- return externalList ;
131+ _externallyManagedCacheUpdated = DateTimeOffset . UtcNow ;
132+
133+ return _externallyManagedCertificatesCache ;
102134 }
103135
104136 /// <summary>
@@ -152,6 +184,17 @@ public async Task<ManagedCertificateSearchResult> GetManagedCertificateResults(M
152184 summary . AwaitingUser = ms . Count ( c => c . Health == ManagedCertificateHealth . AwaitingUser ) ;
153185 summary . NoCertificate = ms . Count ( c => c . DateStart == null ) ;
154186
187+ if ( _externallyManagedCertificatesCache . Any ( ) )
188+ {
189+ summary . ExternallyManaged = _externallyManagedCertificatesCache . Count ;
190+ summary . Total += _externallyManagedCertificatesCache . Count ;
191+ summary . Healthy += _externallyManagedCertificatesCache . Count ( c => c . Health == ManagedCertificateHealth . OK ) ;
192+ summary . Error += _externallyManagedCertificatesCache . Count ( c => c . Health == ManagedCertificateHealth . Error ) ;
193+ summary . Warning += _externallyManagedCertificatesCache . Count ( c => c . Health == ManagedCertificateHealth . Warning ) ;
194+ summary . AwaitingUser += _externallyManagedCertificatesCache . Count ( c => c . Health == ManagedCertificateHealth . AwaitingUser ) ;
195+ summary . NoCertificate += _externallyManagedCertificatesCache . Count ( c => c . DateStart == null ) ;
196+ }
197+
155198 // count items with invalid config (e.g. multiple primary domains)
156199 summary . InvalidConfig = ms . Count ( c => c . DomainOptions . Count ( d => d . IsPrimaryDomain ) > 1 ) ;
157200
0 commit comments