259 lines
6.1 KiB
Objective-C
259 lines
6.1 KiB
Objective-C
/*
|
|
Connection Parameters abstraction
|
|
|
|
Copyright 2013 Thincast Technologies GmbH, Author: Dorian Johnson
|
|
|
|
This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
|
|
If a copy of the MPL was not distributed with this file, You can obtain one at
|
|
http://mozilla.org/MPL/2.0/.
|
|
*/
|
|
|
|
#import "ConnectionParams.h"
|
|
#import "GlobalDefaults.h"
|
|
#import "EncryptionController.h"
|
|
#import "Utils.h"
|
|
#import "TSXAdditions.h"
|
|
|
|
@interface ConnectionParams (Private)
|
|
- (id)initWithConnectionParams:(ConnectionParams *)params;
|
|
@end
|
|
|
|
@implementation ConnectionParams
|
|
|
|
// Designated initializer.
|
|
- (id)initWithDictionary:(NSDictionary *)dict
|
|
{
|
|
if (!(self = [super init]))
|
|
return nil;
|
|
|
|
_connection_params = [dict mutableDeepCopy];
|
|
|
|
[self decryptPasswordForKey:@"password"];
|
|
[self decryptPasswordForKey:@"tsg_password"];
|
|
|
|
return self;
|
|
}
|
|
|
|
- (void)decryptPasswordForKey:(NSString *)key
|
|
{
|
|
if ([[_connection_params objectForKey:key] isKindOfClass:[NSData class]])
|
|
{
|
|
NSString *plaintext_password = [[[EncryptionController sharedEncryptionController]
|
|
decryptor] decryptString:[_connection_params objectForKey:key]];
|
|
[self setValue:plaintext_password forKey:key];
|
|
}
|
|
}
|
|
|
|
- (id)initWithBaseDefaultParameters
|
|
{
|
|
return [self initWithDictionary:[[NSUserDefaults standardUserDefaults]
|
|
dictionaryForKey:@"TSXDefaultComputerBookmarkSettings"]];
|
|
}
|
|
|
|
- (id)init
|
|
{
|
|
return [self initWithDictionary:[NSDictionary dictionary]];
|
|
}
|
|
|
|
- (id)initWithConnectionParams:(ConnectionParams *)params
|
|
{
|
|
return [self initWithDictionary:params->_connection_params];
|
|
}
|
|
- (void)dealloc
|
|
{
|
|
[_connection_params release];
|
|
_connection_params = nil;
|
|
[super dealloc];
|
|
}
|
|
|
|
- (id)copyWithZone:(NSZone *)zone
|
|
{
|
|
return [[ConnectionParams alloc] initWithDictionary:_connection_params];
|
|
}
|
|
|
|
- (NSString *)description
|
|
{
|
|
return [NSString stringWithFormat:@"ConnectionParams: %@", [_connection_params description]];
|
|
}
|
|
|
|
#pragma mark -
|
|
#pragma mark NSCoder
|
|
|
|
- (id)initWithCoder:(NSCoder *)decoder
|
|
{
|
|
if ([decoder containsValueForKey:@"connectionParams"])
|
|
return [self initWithDictionary:[decoder decodeObjectForKey:@"connectionParams"]];
|
|
|
|
return [self init];
|
|
}
|
|
|
|
- (void)encodeWithCoder:(NSCoder *)coder
|
|
{
|
|
NSSet *unserializable_keys = [NSSet setWithObjects:@"view", nil];
|
|
NSMutableDictionary *serializable_params =
|
|
[[NSMutableDictionary alloc] initWithCapacity:[_connection_params count]];
|
|
|
|
for (NSString *k in _connection_params)
|
|
if (([k characterAtIndex:0] != '_') && ![unserializable_keys containsObject:k])
|
|
[serializable_params setObject:[_connection_params objectForKey:k] forKey:k];
|
|
|
|
if ([serializable_params objectForKey:@"password"] != nil)
|
|
[self serializeDecryptedForKey:@"password" forParams:serializable_params];
|
|
if ([serializable_params objectForKey:@"tsg_password"] != nil)
|
|
[self serializeDecryptedForKey:@"tsg_password" forParams:serializable_params];
|
|
|
|
[coder encodeObject:serializable_params forKey:@"connectionParams"];
|
|
[serializable_params release];
|
|
}
|
|
|
|
- (void)serializeDecryptedForKey:(NSString *)key forParams:(NSMutableDictionary *)params
|
|
{
|
|
NSData *encrypted_password = [[[EncryptionController sharedEncryptionController] encryptor]
|
|
encryptString:[params objectForKey:key]];
|
|
|
|
if (encrypted_password)
|
|
[params setObject:encrypted_password forKey:key];
|
|
else
|
|
[params removeObjectForKey:key];
|
|
}
|
|
|
|
#pragma mark -
|
|
#pragma mark NSKeyValueCoding
|
|
|
|
- (void)setValue:(id)value forKey:(NSString *)key
|
|
{
|
|
[self willChangeValueForKey:key];
|
|
|
|
if (value == nil)
|
|
[self setNilValueForKey:key];
|
|
else
|
|
[_connection_params setValue:value forKey:key];
|
|
|
|
[self didChangeValueForKey:key];
|
|
}
|
|
|
|
- (void)setValue:(id)value forKeyPath:(NSString *)key
|
|
{
|
|
[self willChangeValueForKey:key];
|
|
|
|
if (value == nil)
|
|
[self setNilValueForKey:key];
|
|
else
|
|
[_connection_params setValue:value forKeyPath:key];
|
|
|
|
[self didChangeValueForKey:key];
|
|
}
|
|
|
|
- (void)setNilValueForKey:(NSString *)key
|
|
{
|
|
[_connection_params removeObjectForKey:key];
|
|
}
|
|
|
|
- (id)valueForKey:(NSString *)key
|
|
{
|
|
return [_connection_params valueForKey:key];
|
|
}
|
|
|
|
- (NSArray *)allKeys
|
|
{
|
|
return [_connection_params allKeys];
|
|
}
|
|
|
|
#pragma mark -
|
|
#pragma mark KV convenience
|
|
|
|
- (BOOL)hasValueForKey:(NSString *)key
|
|
{
|
|
return [_connection_params objectForKey:key] != nil;
|
|
}
|
|
|
|
- (void)setInt:(int)integer forKey:(NSString *)key
|
|
{
|
|
[self setValue:[NSNumber numberWithInteger:integer] forKey:key];
|
|
}
|
|
- (int)intForKey:(NSString *)key
|
|
{
|
|
return [[self valueForKey:key] intValue];
|
|
}
|
|
|
|
- (void)setBool:(BOOL)v forKey:(NSString *)key
|
|
{
|
|
[self setValue:[NSNumber numberWithBool:v] forKey:key];
|
|
}
|
|
- (BOOL)boolForKey:(NSString *)key
|
|
{
|
|
return [[_connection_params objectForKey:key] boolValue];
|
|
}
|
|
|
|
- (const char *)UTF8StringForKey:(NSString *)key
|
|
{
|
|
id val = [self valueForKey:key];
|
|
const char *str;
|
|
|
|
if ([val respondsToSelector:@selector(UTF8String)] && (str = [val UTF8String]))
|
|
return str;
|
|
|
|
return "";
|
|
}
|
|
|
|
- (NSString *)StringForKey:(NSString *)key
|
|
{
|
|
return [self valueForKey:key];
|
|
}
|
|
|
|
- (BOOL)hasValueForKeyPath:(NSString *)key
|
|
{
|
|
return [_connection_params valueForKeyPath:key] != nil;
|
|
}
|
|
|
|
- (void)setInt:(int)integer forKeyPath:(NSString *)key
|
|
{
|
|
[self setValue:[NSNumber numberWithInteger:integer] forKeyPath:key];
|
|
}
|
|
- (int)intForKeyPath:(NSString *)key
|
|
{
|
|
return [[self valueForKeyPath:key] intValue];
|
|
}
|
|
|
|
- (void)setBool:(BOOL)v forKeyPath:(NSString *)key
|
|
{
|
|
[self setValue:[NSNumber numberWithBool:v] forKeyPath:key];
|
|
}
|
|
|
|
- (BOOL)boolForKeyPath:(NSString *)key
|
|
{
|
|
return [[self valueForKeyPath:key] boolValue];
|
|
}
|
|
|
|
- (const char *)UTF8StringForKeyPath:(NSString *)key
|
|
{
|
|
id val = [self valueForKeyPath:key];
|
|
const char *str;
|
|
|
|
if ([val respondsToSelector:@selector(UTF8String)] && (str = [val UTF8String]))
|
|
return str;
|
|
|
|
return "";
|
|
}
|
|
|
|
- (NSString *)StringForKeyPath:(NSString *)key
|
|
{
|
|
return [self valueForKeyPath:key];
|
|
}
|
|
|
|
- (int)intForKey:(NSString *)key with3GEnabled:(BOOL)enabled
|
|
{
|
|
if (enabled && [self boolForKey:@"enable_3g_settings"])
|
|
return [self intForKeyPath:[NSString stringWithFormat:@"settings_3g.%@", key]];
|
|
return [self intForKeyPath:key];
|
|
}
|
|
|
|
- (BOOL)boolForKey:(NSString *)key with3GEnabled:(BOOL)enabled
|
|
{
|
|
if (enabled && [self boolForKey:@"enable_3g_settings"])
|
|
return [self boolForKeyPath:[NSString stringWithFormat:@"settings_3g.%@", key]];
|
|
return [self boolForKeyPath:key];
|
|
}
|
|
|
|
@end
|