@@ -194,7 +194,7 @@ @interface AWSWebIdentityCredentialsProvider()
194
194
195
195
@property (nonatomic , strong ) AWSSTS *sts;
196
196
@property (nonatomic , strong ) AWSUICKeyChainStore *keychain;
197
- @property (nonatomic , strong ) AWSCredentials *internalCredentials;
197
+ @property (atomic , strong ) AWSCredentials *internalCredentials;
198
198
199
199
@end
200
200
@@ -267,22 +267,26 @@ - (void)invalidateCachedTemporaryCredentials {
267
267
#pragma mark -
268
268
269
269
- (AWSCredentials *)internalCredentials {
270
- if (! _internalCredentials) {
271
- _internalCredentials = [[AWSCredentials alloc ] initFromKeychain: self .keychain];
270
+ @synchronized (self) {
271
+ if (! _internalCredentials) {
272
+ _internalCredentials = [[AWSCredentials alloc ] initFromKeychain: self .keychain];
273
+ }
274
+ return _internalCredentials;
272
275
}
273
- return _internalCredentials;
274
276
}
275
277
276
278
- (void )setInternalCredentials : (AWSCredentials *)internalCredentials {
277
- _internalCredentials = internalCredentials;
278
-
279
- self.keychain [AWSCredentialsProviderKeychainAccessKeyId] = internalCredentials.accessKey ;
280
- self.keychain [AWSCredentialsProviderKeychainSecretAccessKey] = internalCredentials.secretKey ;
281
- self.keychain [AWSCredentialsProviderKeychainSessionToken] = internalCredentials.sessionKey ;
282
- if (internalCredentials.expiration ) {
283
- self.keychain [AWSCredentialsProviderKeychainExpiration] = [NSString stringWithFormat: @" %f " , [internalCredentials.expiration timeIntervalSince1970 ]];
284
- } else {
285
- self.keychain [AWSCredentialsProviderKeychainExpiration] = nil ;
279
+ @synchronized (self) {
280
+ _internalCredentials = internalCredentials;
281
+
282
+ self.keychain [AWSCredentialsProviderKeychainAccessKeyId] = internalCredentials.accessKey ;
283
+ self.keychain [AWSCredentialsProviderKeychainSecretAccessKey] = internalCredentials.secretKey ;
284
+ self.keychain [AWSCredentialsProviderKeychainSessionToken] = internalCredentials.sessionKey ;
285
+ if (internalCredentials.expiration ) {
286
+ self.keychain [AWSCredentialsProviderKeychainExpiration] = [NSString stringWithFormat: @" %f " , [internalCredentials.expiration timeIntervalSince1970 ]];
287
+ } else {
288
+ self.keychain [AWSCredentialsProviderKeychainExpiration] = nil ;
289
+ }
286
290
}
287
291
}
288
292
@@ -298,9 +302,9 @@ @interface AWSCognitoCredentialsProvider()
298
302
@property (nonatomic , strong ) AWSExecutor *refreshExecutor;
299
303
@property (nonatomic , strong ) dispatch_semaphore_t semaphore;
300
304
@property (atomic , assign ) BOOL useEnhancedFlow;
301
- @property (nonatomic , strong ) AWSCredentials *internalCredentials;
305
+ @property (atomic , strong ) AWSCredentials *internalCredentials;
302
306
@property (atomic , assign , getter =isRefreshingCredentials) BOOL refreshingCredentials;
303
- @property (nonatomic , strong ) NSDictionary <NSString *, NSString *> *cachedLogins;
307
+ @property (atomic , strong ) NSDictionary <NSString *, NSString *> *cachedLogins;
304
308
// This is a temporary solution to bypass the requirement of protocol check for `AWSIdentityProviderManager`.
305
309
@property (nonatomic , strong ) NSString *customRoleArnOverride;
306
310
@@ -659,7 +663,8 @@ - (void)setUpWithRegionType:(AWSRegionType)regionType
659
663
// 2. The cached credentials is nil.
660
664
// 3. The credentials expire within 10 minutes.
661
665
credentials = self.internalCredentials .copy ;
662
- if ((!self.cachedLogins || [self .cachedLogins isEqualToDictionary: logins])
666
+ NSDictionary <NSString *, NSString *> *cachedLogins = self.cachedLogins ;
667
+ if ((!cachedLogins || [cachedLogins isEqualToDictionary: logins])
663
668
&& credentials
664
669
&& credentials.isValid ) {
665
670
return [AWSTask taskWithResult: credentials];
@@ -679,7 +684,8 @@ - (void)setUpWithRegionType:(AWSRegionType)regionType
679
684
return [AWSTask cancelledTask ];
680
685
}
681
686
credentials = self.internalCredentials .copy ;
682
- if ((!self.cachedLogins || [self .cachedLogins isEqualToDictionary: logins])
687
+ cachedLogins = self.cachedLogins ;
688
+ if ((!cachedLogins || [cachedLogins isEqualToDictionary: logins])
683
689
&& credentials
684
690
&& credentials.isValid ) {
685
691
return [AWSTask taskWithResult: credentials];
@@ -806,30 +812,39 @@ - (NSString *)identityId {
806
812
if (identityId) {
807
813
return identityId;
808
814
}
809
- return [self .keychain stringForKey: AWSCredentialsProviderKeychainIdentityId];
815
+
816
+ @synchronized (self) {
817
+ return [self .keychain stringForKey: AWSCredentialsProviderKeychainIdentityId];
818
+ }
810
819
}
811
820
812
821
- (void )setIdentityId : (NSString *)identityId {
813
- self.keychain [AWSCredentialsProviderKeychainIdentityId] = identityId;
822
+ @synchronized (self) {
823
+ self.keychain [AWSCredentialsProviderKeychainIdentityId] = identityId;
824
+ }
814
825
}
815
826
816
827
- (AWSCredentials *)internalCredentials {
817
- if (! _internalCredentials) {
818
- _internalCredentials = [[AWSCredentials alloc ] initFromKeychain: self .keychain];
828
+ @synchronized (self) {
829
+ if (!_internalCredentials) {
830
+ _internalCredentials = [[AWSCredentials alloc ] initFromKeychain: self .keychain];
831
+ }
832
+ return _internalCredentials;
819
833
}
820
- return _internalCredentials;
821
834
}
822
835
823
836
- (void )setInternalCredentials : (AWSCredentials *)internalCredentials {
824
- _internalCredentials = internalCredentials;
825
-
826
- self.keychain [AWSCredentialsProviderKeychainAccessKeyId] = internalCredentials.accessKey ;
827
- self.keychain [AWSCredentialsProviderKeychainSecretAccessKey] = internalCredentials.secretKey ;
828
- self.keychain [AWSCredentialsProviderKeychainSessionToken] = internalCredentials.sessionKey ;
829
- if (internalCredentials.expiration ) {
830
- self.keychain [AWSCredentialsProviderKeychainExpiration] = [NSString stringWithFormat: @" %f " , [internalCredentials.expiration timeIntervalSince1970 ]];
831
- } else {
832
- self.keychain [AWSCredentialsProviderKeychainExpiration] = nil ;
837
+ @synchronized (self) {
838
+ _internalCredentials = internalCredentials;
839
+
840
+ self.keychain [AWSCredentialsProviderKeychainAccessKeyId] = internalCredentials.accessKey ;
841
+ self.keychain [AWSCredentialsProviderKeychainSecretAccessKey] = internalCredentials.secretKey ;
842
+ self.keychain [AWSCredentialsProviderKeychainSessionToken] = internalCredentials.sessionKey ;
843
+ if (internalCredentials.expiration ) {
844
+ self.keychain [AWSCredentialsProviderKeychainExpiration] = [NSString stringWithFormat: @" %f " , [internalCredentials.expiration timeIntervalSince1970 ]];
845
+ } else {
846
+ self.keychain [AWSCredentialsProviderKeychainExpiration] = nil ;
847
+ }
833
848
}
834
849
}
835
850
0 commit comments