FreeRDP
Loading...
Searching...
No Matches
ConnectionParams.m
1/*
2 Connection Parameters abstraction
3
4 Copyright 2013 Thincast Technologies GmbH, Author: Dorian Johnson
5
6 This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
7 If a copy of the MPL was not distributed with this file, You can obtain one at
8 http://mozilla.org/MPL/2.0/.
9 */
10
11#import "ConnectionParams.h"
12#import "GlobalDefaults.h"
13#import "EncryptionController.h"
14#import "Utils.h"
15#import "TSXAdditions.h"
16
17@interface ConnectionParams (Private)
18- (id)initWithConnectionParams:(ConnectionParams *)params;
19@end
20
21@implementation ConnectionParams
22
23// Designated initializer.
24- (id)initWithDictionary:(NSDictionary *)dict
25{
26 if (!(self = [super init]))
27 return nil;
28
29 _connection_params = [dict mutableDeepCopy];
30
31 [self decryptPasswordForKey:@"password"];
32 [self decryptPasswordForKey:@"tsg_password"];
33
34 return self;
35}
36
37- (void)decryptPasswordForKey:(NSString *)key
38{
39 if ([[_connection_params objectForKey:key] isKindOfClass:[NSData class]])
40 {
41 NSString *plaintext_password = [[[EncryptionController sharedEncryptionController]
42 decryptor] decryptString:[_connection_params objectForKey:key]];
43 [self setValue:plaintext_password forKey:key];
44 }
45}
46
47- (id)initWithBaseDefaultParameters
48{
49 return [self initWithDictionary:[[NSUserDefaults standardUserDefaults]
50 dictionaryForKey:@"TSXDefaultComputerBookmarkSettings"]];
51}
52
53- (id)init
54{
55 return [self initWithDictionary:[NSDictionary dictionary]];
56}
57
58- (id)initWithConnectionParams:(ConnectionParams *)params
59{
60 return [self initWithDictionary:params->_connection_params];
61}
62- (void)dealloc
63{
64 [_connection_params release];
65 _connection_params = nil;
66 [super dealloc];
67}
68
69- (id)copyWithZone:(NSZone *)zone
70{
71 return [[ConnectionParams alloc] initWithDictionary:_connection_params];
72}
73
74- (NSString *)description
75{
76 return [NSString stringWithFormat:@"ConnectionParams: %@", [_connection_params description]];
77}
78
79#pragma mark -
80#pragma mark NSCoder
81
82+ (BOOL)supportsSecureCoding
83{
84 return YES;
85}
86
87- (id)initWithCoder:(NSCoder *)decoder
88{
89 if ([decoder containsValueForKey:@"connectionParams"])
90 {
91 NSSet *classes = [NSSet setWithObjects:[NSDictionary class], [NSString class],
92 [NSNumber class], [NSData class], nil];
93 return [self initWithDictionary:[decoder decodeObjectOfClasses:classes
94 forKey:@"connectionParams"]];
95 }
96
97 return [self init];
98}
99
100- (void)encodeWithCoder:(NSCoder *)coder
101{
102 NSSet *unserializable_keys = [NSSet setWithObjects:@"view", nil];
103 NSMutableDictionary *serializable_params =
104 [[NSMutableDictionary alloc] initWithCapacity:[_connection_params count]];
105
106 for (NSString *k in _connection_params)
107 if (([k characterAtIndex:0] != '_') && ![unserializable_keys containsObject:k])
108 [serializable_params setObject:[_connection_params objectForKey:k] forKey:k];
109
110 if ([serializable_params objectForKey:@"password"] != nil)
111 [self serializeDecryptedForKey:@"password" forParams:serializable_params];
112 if ([serializable_params objectForKey:@"tsg_password"] != nil)
113 [self serializeDecryptedForKey:@"tsg_password" forParams:serializable_params];
114
115 [coder encodeObject:serializable_params forKey:@"connectionParams"];
116 [serializable_params release];
117}
118
119- (void)serializeDecryptedForKey:(NSString *)key forParams:(NSMutableDictionary *)params
120{
121 NSData *encrypted_password = [[[EncryptionController sharedEncryptionController] encryptor]
122 encryptString:[params objectForKey:key]];
123
124 if (encrypted_password)
125 [params setObject:encrypted_password forKey:key];
126 else
127 [params removeObjectForKey:key];
128}
129
130#pragma mark -
131#pragma mark NSKeyValueCoding
132
133- (void)setValue:(id)value forKey:(NSString *)key
134{
135 [self willChangeValueForKey:key];
136
137 if (value == nil)
138 [self setNilValueForKey:key];
139 else
140 [_connection_params setValue:value forKey:key];
141
142 [self didChangeValueForKey:key];
143}
144
145- (void)setValue:(id)value forKeyPath:(NSString *)key
146{
147 [self willChangeValueForKey:key];
148
149 if (value == nil)
150 [self setNilValueForKey:key];
151 else
152 [_connection_params setValue:value forKeyPath:key];
153
154 [self didChangeValueForKey:key];
155}
156
157- (void)setNilValueForKey:(NSString *)key
158{
159 [_connection_params removeObjectForKey:key];
160}
161
162- (id)valueForKey:(NSString *)key
163{
164 return [_connection_params valueForKey:key];
165}
166
167- (NSArray *)allKeys
168{
169 return [_connection_params allKeys];
170}
171
172#pragma mark -
173#pragma mark KV convenience
174
175- (BOOL)hasValueForKey:(NSString *)key
176{
177 return [_connection_params objectForKey:key] != nil;
178}
179
180- (void)setInt:(int)integer forKey:(NSString *)key
181{
182 [self setValue:[NSNumber numberWithInteger:integer] forKey:key];
183}
184- (int)intForKey:(NSString *)key
185{
186 return [[self valueForKey:key] intValue];
187}
188
189- (void)setBool:(BOOL)v forKey:(NSString *)key
190{
191 [self setValue:[NSNumber numberWithBool:v] forKey:key];
192}
193- (BOOL)boolForKey:(NSString *)key
194{
195 return [[_connection_params objectForKey:key] boolValue];
196}
197
198- (const char *)UTF8StringForKey:(NSString *)key
199{
200 id val = [self valueForKey:key];
201 const char *str;
202
203 if ([val respondsToSelector:@selector(UTF8String)] && (str = [val UTF8String]))
204 return str;
205
206 return "";
207}
208
209- (NSString *)StringForKey:(NSString *)key
210{
211 return [self valueForKey:key];
212}
213
214- (BOOL)hasValueForKeyPath:(NSString *)key
215{
216 return [_connection_params valueForKeyPath:key] != nil;
217}
218
219- (void)setInt:(int)integer forKeyPath:(NSString *)key
220{
221 [self setValue:[NSNumber numberWithInteger:integer] forKeyPath:key];
222}
223- (int)intForKeyPath:(NSString *)key
224{
225 return [[self valueForKeyPath:key] intValue];
226}
227
228- (void)setBool:(BOOL)v forKeyPath:(NSString *)key
229{
230 [self setValue:[NSNumber numberWithBool:v] forKeyPath:key];
231}
232
233- (BOOL)boolForKeyPath:(NSString *)key
234{
235 return [[self valueForKeyPath:key] boolValue];
236}
237
238- (const char *)UTF8StringForKeyPath:(NSString *)key
239{
240 id val = [self valueForKeyPath:key];
241 const char *str;
242
243 if ([val respondsToSelector:@selector(UTF8String)] && (str = [val UTF8String]))
244 return str;
245
246 return "";
247}
248
249- (NSString *)StringForKeyPath:(NSString *)key
250{
251 return [self valueForKeyPath:key];
252}
253
254- (int)intForKey:(NSString *)key with3GEnabled:(BOOL)enabled
255{
256 if (enabled && [self boolForKey:@"enable_3g_settings"])
257 return [self intForKeyPath:[NSString stringWithFormat:@"settings_3g.%@", key]];
258 return [self intForKeyPath:key];
259}
260
261- (BOOL)boolForKey:(NSString *)key with3GEnabled:(BOOL)enabled
262{
263 if (enabled && [self boolForKey:@"enable_3g_settings"])
264 return [self boolForKeyPath:[NSString stringWithFormat:@"settings_3g.%@", key]];
265 return [self boolForKeyPath:key];
266}
267
268@end