Source/NSURLCredentialStorage+TNLAdditions.m (107 lines of code) (raw):
//
// NSURLCredentialStorage+TNLAdditions.m
// TwitterNetworkLayer
//
// Created on 12/5/14.
// Copyright © 2020 Twitter. All rights reserved.
//
#import "NSURLCredentialStorage+TNLAdditions.h"
#import "TNL_Project.h"
#import "TNLRequestConfiguration_Project.h"
NS_ASSUME_NONNULL_BEGIN
@interface TNLSharedCredentialStorageProxy : NSProxy
@end
@interface TNLURLCredentialStorageDemuxProxy : TNLSharedCredentialStorageProxy
@end
NSURLCredentialStorage *TNLGetURLCredentialStorageDemuxProxy()
{
static TNLURLCredentialStorageDemuxProxy *sProxy;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sProxy = [TNLURLCredentialStorageDemuxProxy alloc];
});
return (id)sProxy;
}
@implementation NSURLCredentialStorage (TNLAdditions)
+ (NSURLCredentialStorage *)tnl_sharedCredentialStorageProxy
{
static TNLSharedCredentialStorageProxy *sProxy;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sProxy = [TNLSharedCredentialStorageProxy alloc];
});
return (id)sProxy;
}
@end
@implementation TNLSharedCredentialStorageProxy
- (nullable NSMethodSignature *)methodSignatureForSelector:(SEL)sel
{
return [[NSURLCredentialStorage sharedCredentialStorage] methodSignatureForSelector:sel];
}
- (void)forwardInvocation:(NSInvocation *)invocation
{
[invocation invokeWithTarget:[NSURLCredentialStorage sharedCredentialStorage]];
}
@end
@implementation TNLURLCredentialStorageDemuxProxy
// Legacy is not supported since there isn't a good place to associate the request config with the protection space
// Modern - API_AVAILABLE(macos(10.10), ios(8.0), watchos(2.0), tvos(9.0))
- (void)getCredentialsForProtectionSpace:(NSURLProtectionSpace *)protectionSpace
task:(NSURLSessionTask *)task
completionHandler:(void (^) (NSDictionary<NSString *, NSURLCredential *> * _Nullable credentials))completionHandler
{
TNLRequestConfiguration *config = TNLRequestConfigurationGetAssociatedWithRequest(task.originalRequest);
NSURLCredentialStorage *store = TNLUnwrappedURLCredentialStorage(config.URLCredentialStorage);
if (store) {
[store getCredentialsForProtectionSpace:protectionSpace
task:task
completionHandler:completionHandler];
} else {
completionHandler(nil);
}
}
- (void)setCredential:(NSURLCredential *)credential
forProtectionSpace:(NSURLProtectionSpace *)protectionSpace
task:(NSURLSessionTask *)task
{
TNLRequestConfiguration *config = TNLRequestConfigurationGetAssociatedWithRequest(task.originalRequest);
NSURLCredentialStorage *store = TNLUnwrappedURLCredentialStorage(config.URLCredentialStorage);
if (store) {
[store setCredential:credential
forProtectionSpace:protectionSpace
task:task];
}
}
- (void)removeCredential:(NSURLCredential *)credential
forProtectionSpace:(NSURLProtectionSpace *)protectionSpace
options:(nullable NSDictionary<NSString *, id> *)options
task:(NSURLSessionTask *)task
{
TNLRequestConfiguration *config = TNLRequestConfigurationGetAssociatedWithRequest(task.originalRequest);
NSURLCredentialStorage *store = TNLUnwrappedURLCredentialStorage(config.URLCredentialStorage);
if (store) {
[store removeCredential:credential
forProtectionSpace:protectionSpace
options:options
task:task];
}
}
- (void)getDefaultCredentialForProtectionSpace:(NSURLProtectionSpace *)space
task:(NSURLSessionTask *)task
completionHandler:(void (^) (NSURLCredential * _Nullable credential))completionHandler
{
TNLRequestConfiguration *config = TNLRequestConfigurationGetAssociatedWithRequest(task.originalRequest);
NSURLCredentialStorage *store = TNLUnwrappedURLCredentialStorage(config.URLCredentialStorage);
if (store) {
[store getDefaultCredentialForProtectionSpace:space
task:task
completionHandler:completionHandler];
} else {
completionHandler(nil);
}
}
- (void)setDefaultCredential:(NSURLCredential *)credential
forProtectionSpace:(NSURLProtectionSpace *)protectionSpace
task:(NSURLSessionTask *)task
{
TNLRequestConfiguration *config = TNLRequestConfigurationGetAssociatedWithRequest(task.originalRequest);
NSURLCredentialStorage *store = TNLUnwrappedURLCredentialStorage(config.URLCredentialStorage);
if (store) {
[store setDefaultCredential:credential
forProtectionSpace:protectionSpace
task:task];
}
}
@end
NS_ASSUME_NONNULL_END