Repository URL to install this package:
//
// DEMotifPluginConfiguration.m
// HelloCordova
//
// Created by Marco Bonati on 06/02/2017.
//
//
#import <Foundation/Foundation.h>
#import "DEMotifConnectorPluginConfiguration.h"
#pragma mark Defines
#define MOTIFCONNECTOR_CFG_PARAM_SERVERURL @"motif.serverUrl"
#define MOTIFCONNECTOR_CFG_PARAM_REQUESTPATH @"motif.requestPath"
#define MOTIFCONNECTOR_CFG_PARAM_RETRYCOUNT @"motif.retryCount"
#define MOTIFCONNECTOR_CFG_PARAM_HTTP_TIMEOUT @"motif.httpTimeout"
#define MOTIFCONNECTOR_CFG_PARAM_RETRY_DELAY @"motif.retryDelay"
#define MOTIFCONNECTOR_CFG_PARAM_E2E_ENCRYPTION @"motif.end2EndEncryption"
#define MOTIFCONNECTOR_CFG_PARAM_E2E_ENCRYPTION_DEBUG @"motif.end2endEncryptionTrace"
#define MOTIFCONNECTOR_CFG_PARAM_DISABLE_SSL_CERT @"motif.disableSSLCertificate"
#define MOTIFCONNECTOR_CFG_PARAM_ACTIVITY_INDICATOR @"motif.activityIndicator"
#define MOTIFCONNECTOR_CFG_PARAM_ALLOWS_VPN @"motif.allowsVPN"
#define MOTIFCONNECTOR_CFG_PARAM_REQUESTPATH_DEFAULT @"/json"
#define MOTIFCONNECTOR_CFG_PARAM_SSL_PINNING @"motif.sslPinningCheck"
#define MOTIFCONNECTOR_CFG_PARAM_SSL_PINNING_SUBJ @"motif.sslPinningCheck.subject"
#define MOTIFCONNECTOR_CFG_PARAM_SSL_PINNING_ISSUER @"motif.sslPinningCheck.issuer"
#define MOTIFCONNECTOR_CFG_PARAM_SSL_PINNING_PUBLICKEY @"motif.sslPinningCheck.publicKey"
#define MOTIFCONNECTOR_CFG_PARAM_SSL_PINNING_SERIALNUM @"motif.sslPinningCheck.serialNumber"
#define MOTIFCONNECTOR_CFG_PARAM_SSL_PRINT_CERT @"motif.printSSLCertificate"
#pragma mark SSL Pinning Configuration Implementation
@interface DESSLPinningConfiguration : NSObject<DECertificatePinningConfiguration>
{
NSDictionary* _cordovaSettings;
}
@end
@implementation DESSLPinningConfiguration
- (id)initWithCordovaSettings:(NSDictionary*)cordovaSettings
{
_cordovaSettings = cordovaSettings;
return self;
}
/**
* When pinning is enabled, if this method returns YES, when making a server request the certificate data will be logged.
* This is useful for the first configuration off the pinning system. The logged data can be used to pupulate the other fields of the configuration.
*
*
* @return YES to log the certificate data.
*/
- (BOOL) logCertificateData
{
return [DEMotifConnectorPluginConfiguration getBooleanValueForKey:MOTIFCONNECTOR_CFG_PARAM_SSL_PRINT_CERT withDefaultValue:NO forSettings:_cordovaSettings];
}
/**
* The subject info that the certificate must contain to be considered valid.
*
* @return A string describing the subject or nil to skip this check.
*/
- (NSString *) subject
{
NSString * value =[DEMotifConnectorPluginConfiguration getStringValueForKey:MOTIFCONNECTOR_CFG_PARAM_SSL_PINNING_SUBJ withDefaultValue:nil forSettings:_cordovaSettings];
if(value == nil){
value = [DEMotifConnectorPluginConfiguration getStringValueForKey:@"motif.sslPinnigCheck.subject" withDefaultValue:nil forSettings:_cordovaSettings];
}
return value;
}
/**
* The issuer info that the certificate must contain to be considered valid.
*
* @return A string describing the subject or nil to skip this check.
*/
- (NSString *) issuer
{
return [DEMotifConnectorPluginConfiguration getStringValueForKey:MOTIFCONNECTOR_CFG_PARAM_SSL_PINNING_ISSUER withDefaultValue:nil forSettings:_cordovaSettings];
}
/**
* The public key info that the certificate must contain to be considered valid.
*
* @return A string describing the public key, nil to skip this check.
*/
- (NSString *) publicKey
{
NSString* value = [DEMotifConnectorPluginConfiguration getStringValueForKey:MOTIFCONNECTOR_CFG_PARAM_SSL_PINNING_PUBLICKEY withDefaultValue:nil forSettings:_cordovaSettings];
if(value == nil){
value = [DEMotifConnectorPluginConfiguration getStringValueForKey:@"motif.sslPinnigCheck.publicKey" withDefaultValue:nil forSettings:_cordovaSettings];
}
return value;
}
/**
* The serial number info that the certificate must contain to be considered valid.
*
* @return A string describing the serial number or nil to skip this check.
*/
- (NSString *) serialNumber
{
return [DEMotifConnectorPluginConfiguration getStringValueForKey:MOTIFCONNECTOR_CFG_PARAM_SSL_PINNING_SERIALNUM withDefaultValue:nil forSettings:_cordovaSettings];
}
@end
#pragma mark Configuration Implementation
@implementation DEMotifConnectorPluginConfiguration
{
NSDictionary* _cordovaSettings;
DESSLPinningConfiguration* _sslPinningConfig;
}
- (id)initWithCordovaSettings:(NSDictionary*)cordovaSettings
{
_cordovaSettings = cordovaSettings;
BOOL sslPinningEnabled = [self getBooleanValueForKey:MOTIFCONNECTOR_CFG_PARAM_SSL_PINNING withDefaultValue:NO];
if (sslPinningEnabled){
_sslPinningConfig = [[DESSLPinningConfiguration alloc]initWithCordovaSettings:cordovaSettings];
} else {
_sslPinningConfig = nil;
}
return self;
}
- (NSString *) serverAddress
{
return [_cordovaSettings objectForKey:[MOTIFCONNECTOR_CFG_PARAM_SERVERURL lowercaseString]];
}
/**
* The path on the server where to execute the post requests.
*/
- (NSString *) serverPostPath
{
return [self getStringValueForKey:MOTIFCONNECTOR_CFG_PARAM_REQUESTPATH withDefaultValue:MOTIFCONNECTOR_CFG_PARAM_REQUESTPATH_DEFAULT];
}
/**
* Number of times thet a request can be executed before returning an error.
*/
- (NSInteger) serverRequestTryCount
{
return [self getIntValueForKey:MOTIFCONNECTOR_CFG_PARAM_RETRYCOUNT withDefaultValue:3];
}
/**
* The time to wait before having a data timeout. In seconds.
*/
- (double) serverTimeoutSeconds
{
return ([self getDoubleValueForKey:MOTIFCONNECTOR_CFG_PARAM_HTTP_TIMEOUT withDefaultValue:30000]/1000);
}
/**
* The amount of time to wait after an error accurs before retrying the server request. In milliseconds.
*/
- (double) serverRequestRetryDelayMillis
{
return [self getDoubleValueForKey:MOTIFCONNECTOR_CFG_PARAM_RETRY_DELAY withDefaultValue:3000];
}
- (BOOL) end2EndEncryptionEnabled
{
return [self getBooleanValueForKey:MOTIFCONNECTOR_CFG_PARAM_E2E_ENCRYPTION withDefaultValue:NO];
}
/**
* Enable or disable the E2E Encryption protocol logging.
*/
- (BOOL) end2EndEncryptionDebugEnabled
{
return [self getBooleanValueForKey:MOTIFCONNECTOR_CFG_PARAM_E2E_ENCRYPTION_DEBUG withDefaultValue:NO];
}
/**
* Allows to accepts selft signed certificates WARN: don't use this in PRODUCTION Environment! This is only for debugging pourpose
*/
- (BOOL) allowsInvalidSSLCertificate
{
return [self getBooleanValueForKey:MOTIFCONNECTOR_CFG_PARAM_DISABLE_SSL_CERT withDefaultValue:NO];
}
/**
* Returns a certificate pinning configuration if needed
**/
- (id<DECertificatePinningConfiguration>) certificatePinningConfiguration
{
return _sslPinningConfig;
}
- (BOOL) activityIndicatorEnabled
{
return [self getBooleanValueForKey:MOTIFCONNECTOR_CFG_PARAM_ACTIVITY_INDICATOR withDefaultValue:NO];
}
- (BOOL) allowsVPN
{
return [self getBooleanValueForKey:MOTIFCONNECTOR_CFG_PARAM_ALLOWS_VPN withDefaultValue:NO];
}
#pragma mark local utilities
- (BOOL)getBooleanValueForKey:(NSString*)key withDefaultValue:(BOOL)defaultValue
{
return [DEMotifConnectorPluginConfiguration getBooleanValueForKey:key withDefaultValue:defaultValue forSettings:_cordovaSettings];
}
- (int)getIntValueForKey:(NSString*)key withDefaultValue:(int)defaultValue
{
return [DEMotifConnectorPluginConfiguration getIntValueForKey:key withDefaultValue:defaultValue forSettings:_cordovaSettings];
}
- (double)getDoubleValueForKey:(NSString*)key withDefaultValue:(double)defaultValue
{
return [DEMotifConnectorPluginConfiguration getDoubleValueForKey:key withDefaultValue:defaultValue forSettings:_cordovaSettings];
}
- (NSString*)getStringValueForKey:(NSString*)key withDefaultValue:(NSString*)defaultValue
{
return [DEMotifConnectorPluginConfiguration getStringValueForKey:key withDefaultValue:defaultValue forSettings:_cordovaSettings];
}
#pragma mark Static utilities
+ (BOOL)getBooleanValueForKey:(NSString*)key withDefaultValue:(BOOL)defaultValue forSettings:(NSDictionary*)cordovaSettings
{
NSString *sValue = [cordovaSettings objectForKey:[key lowercaseString]];
if (sValue && [sValue isEqualToString:@"true"]){
return YES;
} else if (sValue && [sValue isEqualToString:@"false"]) {
return NO;
} else {
return defaultValue;
}
}
+ (int)getIntValueForKey:(NSString*)key withDefaultValue:(int)defaultValue forSettings:(NSDictionary*)cordovaSettings
{
NSString *sValue = [cordovaSettings objectForKey:[key lowercaseString]];
if (sValue){
return [sValue intValue];
} else {
return defaultValue;
}
}
+ (double)getDoubleValueForKey:(NSString*)key withDefaultValue:(double)defaultValue forSettings:(NSDictionary*)cordovaSettings
{
NSString *sValue = [cordovaSettings objectForKey:[key lowercaseString]];
if (sValue){
return [sValue doubleValue];
} else {
return defaultValue;
}
}
+ (NSString*)getStringValueForKey:(NSString*)key withDefaultValue:(NSString*)defaultValue forSettings:(NSDictionary*)cordovaSettings
{
NSString *sValue = [cordovaSettings objectForKey:[key lowercaseString]];
if (sValue) {
return sValue;
} else {
return defaultValue;
}
}
@end