Perform IDNA's ToASCII operation on the server's domain name

This commit is contained in:
Florian Zeitz 2011-02-18 01:56:41 +01:00
parent bb8d5e5f05
commit 5e8481027e
3 changed files with 94 additions and 7 deletions

View file

@ -24,6 +24,7 @@
#include <assert.h>
#include <stringprep.h>
#include <idna.h>
#import "XMPPConnection.h"
#import "XMPPStanza.h"
@ -116,14 +117,15 @@
{
OFString *old = server;
char *srv;
Stringprep_rc rc;
Idna_rc rc;
if ((rc = stringprep_profile([server_ cString], &srv,
"Nameprep", 0)) != STRINGPREP_OK)
@throw [XMPPStringPrepFailedException newWithClass: isa
connection: self
profile: @"Nameprep"
string: server_];
if ((rc = idna_to_ascii_8z([server_ cString],
&srv, IDNA_USE_STD3_ASCII_RULES)) != IDNA_SUCCESS)
@throw [XMPPIDNATranslationFailedException
newWithClass: isa
connection: self
operation: @"ToASCII"
string: server_];
@try {
server = [[OFString alloc] initWithCString: srv];

View file

@ -54,3 +54,21 @@
profile: (OFString*)profile
string: (OFString*)string;
@end
@interface XMPPIDNATranslationFailedException: XMPPException
{
OFString *operation;
OFString *string;
}
@property (readonly, nonatomic) OFString *operation, *string;
+ newWithClass: (Class)class_
connection: (XMPPConnection*)conn
operation: (OFString*)operation
string: (OFString*)string;
- initWithClass: (Class)class_
connection: (XMPPConnection*)conn
operation: (OFString*)operation
string: (OFString*)string;
@end

View file

@ -144,3 +144,70 @@
return description;
}
@end
@implementation XMPPIDNATranslationFailedException
@synthesize operation, string;
+ newWithClass: (Class)class_
connection: (XMPPConnection*)conn
operation: (OFString*)operation
string: (OFString*)string
{
return [[self alloc] initWithClass: class_
connection: conn
operation: operation
string: string];
}
- initWithClass: (Class)class_
connection: (XMPPConnection*)conn
{
Class c = isa;
[self release];
@throw [OFNotImplementedException newWithClass: c
selector: _cmd];
}
- initWithClass: (Class)class_
connection: (XMPPConnection*)conn
operation: (OFString*)operation_
string: (OFString*)string_
{
self = [super initWithClass: class_
connection: conn];
@try {
operation = [operation_ copy];
string = [string_ copy];
} @catch (id e) {
[self release];
@throw e;
}
return self;
}
- (void)dealloc
{
[operation release];
[string release];
[super dealloc];
}
- (OFString*)description
{
OFAutoreleasePool *pool;
if (description != nil)
return description;
pool = [[OFAutoreleasePool alloc] init];
description = [[OFString alloc] initWithFormat:
@"IDNA operation %@ failed on string '%@'!",
operation, string];
[pool release];
return description;
}
@end