ObjXMPP  Check-in [991c7aeff2]

Overview
Comment:Stop caching authentication mechanisms

We don't need to do that. In fact we had to do additional work.

Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256: 991c7aeff2dc2bc8df7a2dbf4ed7d3ee4d00586f05c2061391aebcf9426f9f90
User & Date: florob@babelmonkeys.de on 2011-03-10 21:14:32
Other Links: manifest | tags
Context
2011-03-17
20:36
Improve stanza handling and call delegate for iq, message and presence. check-in: 8742a0f583 user: js tags: trunk
2011-03-10
21:14
Stop caching authentication mechanisms check-in: 991c7aeff2 user: florob@babelmonkeys.de tags: trunk
2011-03-09
03:32
Add basic STARTTLS support check-in: 3a3855f187 user: florob@babelmonkeys.de tags: trunk
Changes

Modified src/XMPPConnection.h from [1b5e581e8a] to [845301f1bf].

59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
59
60
61
62
63
64
65

66
67
68
69
70
71
72







-







	/// The JID bound to this connection (this is determined by the server)
	XMPPJID *JID;
	/// The port to connect to
	short port;
	/// Whether to use TLS
	BOOL useTLS;
	id <XMPPConnectionDelegate> delegate;
	OFMutableArray *mechanisms;
	XMPPAuthenticator *authModule;
}

@property (copy) OFString *username;
@property (copy) OFString *password;
@property (copy) OFString *server;
@property (copy) OFString *resource;

Modified src/XMPPConnection.m from [365d927559] to [4a47a74ef8].

52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
52
53
54
55
56
57
58


59
60
61
62
63
64
65







-
-







	sock = [[OFTCPSocket alloc] init];
	parser = [[OFXMLParser alloc] init];
	elementBuilder = [[OFXMLElementBuilder alloc] init];

	port = 5222;
	useTLS = YES;

	mechanisms = [[OFMutableArray alloc] init];

	parser.delegate = self;
	elementBuilder.delegate = self;

	return self;
}

- (void)dealloc
268
269
270
271
272
273
274
275
276
277
278
279
280
281



282




283
284



285
286
287
288
289
290
291
292
293
294
295
296
297












298
299

300
301
302
303
304
305
306
307
308
309
310
311
266
267
268
269
270
271
272


273
274
275
276
277
278
279
280
281
282
283
284
285


286
287
288
289












290
291
292
293
294
295
296
297
298
299
300
301


302
303




304
305
306
307
308
309
310







-
-





+
+
+

+
+
+
+
-
-
+
+
+

-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+

-
-
-
-







		    [jidElem.children.firstObject stringValue]];
		of_log(@"Bound to JID: %@", [JID fullJID]);
	}
}

- (void)_handleFeatures: (OFXMLElement*)elem
{
	OFArray *mechs = [elem elementsForName: @"mechanisms"
				     namespace: NS_SASL];
	OFXMLElement *starttls = [elem
	    elementsForName: @"starttls"
		  namespace: NS_STARTTLS].firstObject;
	OFXMLElement *bind = [elem elementsForName: @"bind"
					 namespace: NS_BIND].firstObject;
	OFArray *mechs = [elem elementsForName: @"mechanisms"
				     namespace: NS_SASL];
	OFMutableArray *mechanisms = [OFMutableArray array];

	if (starttls != nil)
		[self sendStanza: [OFXMLElement elementWithName: @"starttls"
						      namespace: NS_STARTTLS]];
	else if ([mechs count]) {
	for (OFXMLElement *mech in [mechs.firstObject children])
		[mechanisms addObject: [mech.children.firstObject stringValue]];
		for (OFXMLElement *mech in [mechs.firstObject children])
			[mechanisms addObject:
			    [mech.children.firstObject stringValue]];

	if ([mechanisms containsObject: @"SCRAM-SHA-1"]) {
		authModule = [[XMPPSCRAMAuth alloc]
		    initWithAuthcid: username
			   password: password
			       hash: [OFSHA1Hash class]];
		[self _sendAuth: @"SCRAM-SHA-1"];
	} else if ([mechanisms containsObject: @"PLAIN"]) {
		authModule = [[XMPPPLAINAuth alloc]
		    initWithAuthcid: username
			   password: password];
		[self _sendAuth: @"PLAIN"];
	}
		if ([mechanisms containsObject: @"SCRAM-SHA-1"]) {
			authModule = [[XMPPSCRAMAuth alloc]
			    initWithAuthcid: username
				   password: password
				       hash: [OFSHA1Hash class]];
			[self _sendAuth: @"SCRAM-SHA-1"];
		} else if ([mechanisms containsObject: @"PLAIN"]) {
			authModule = [[XMPPPLAINAuth alloc]
			    initWithAuthcid: username
				   password: password];
			[self _sendAuth: @"PLAIN"];
		}

	if (bind != nil)
	} else if (bind != nil)
		[self _sendResourceBind];

	if (starttls != nil)
		[self sendStanza: [OFXMLElement elementWithName: @"starttls"
						      namespace: NS_STARTTLS]];
}

- (void)elementBuilder: (OFXMLElementBuilder*)b
       didBuildElement: (OFXMLElement*)elem
{
	elem.defaultNamespace = NS_CLIENT;
	[elem setPrefix: @"stream"
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
318
319
320
321
322
323
324


325
326
327
328
329
330
331







-
-








	if ([elem.namespace isEqual: NS_STARTTLS]) {
		if ([elem.name isEqual: @"proceed"]) {
			/* FIXME: Catch errors here */
			sock = [[GTLSSocket alloc] initWithSocket: sock];

			/* Stream restart */
			[mechanisms release];
			mechanisms = [[OFMutableArray alloc] init];
			parser.delegate = self;
			[self _startStream];
		} else if ([elem.name isEqual: @"failure"])
			/* TODO: Find/create an exception to throw here */
			@throw [OFException newWithClass: isa];
	}

352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
349
350
351
352
353
354
355


356

357
358
359
360
361
362
363







-
-

-







		} else if ([elem.name isEqual: @"success"]) {
			[authModule parseServerFinalMessage:
			    [OFDataArray dataArrayWithBase64EncodedString:
				[elem.children.firstObject stringValue]]];
			of_log(@"Auth successful");

			/* Stream restart */
			[mechanisms release];
			mechanisms = [[OFMutableArray alloc] init];
			parser.delegate = self;

			[self _startStream];
		} else if ([elem.name isEqual: @"failure"]) {
			of_log(@"Auth failed!");
			// FIXME: Do more parsing/handling
			@throw [XMPPAuthFailedException
			    newWithClass: isa
			      connection: self