1/*
2 * Copyright (c) 2012 Apple Inc. All Rights Reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
11 * file.
12 *
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
20 *
21 * @APPLE_LICENSE_HEADER_END@
22 */
23
24//
25//  timestampclient.m
26//  libsecurity_keychain
27//
28
29#import "timestampclient.h"
30
31void sendTSARequest(CFDataRef tsaReq, const char *tsaURL, TSARequestCompletionBlock completionBlock)
32{
33    NSAutoreleasePool *pool = 	[[NSAutoreleasePool alloc] init];
34
35    NSString *urlStr = [NSString stringWithCString:tsaURL encoding:NSUTF8StringEncoding];
36    TimeStampClient *client = [[TimeStampClient alloc] initWithURLString:urlStr];
37    [client post:(NSData *)tsaReq];
38    [client start3:completionBlock];
39    [client release];
40    [pool release];
41}
42
43@implementation TimeStampClient
44
45@synthesize delegate;
46@synthesize url;
47@synthesize urlRequest;
48
49- (id)init
50{
51    self = [super init];
52    return self;
53}
54
55- (id)initWithURLString:(NSString *)urlStr
56{
57    if ((self = [super init]))
58    {
59        NSString *escapedURLStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
60        self.url = [NSURL URLWithString:escapedURLStr];
61        self.urlRequest = [[NSMutableURLRequest alloc] initWithURL:self.url
62            cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:(NSTimeInterval)15.0];
63    }
64    return self;
65}
66
67- (void)dealloc
68{
69    [url release];
70    [urlRequest release];
71    [super dealloc];
72}
73
74- (void)post: (NSData *)data
75{
76    NSMutableURLRequest *request = self.urlRequest;
77
78    [request setHTTPMethod:@"POST"];
79    [request setHTTPBody:data];
80    [request setValue:@"application/timestamp-query" forHTTPHeaderField:@"Content-Type"];
81}
82
83- (void)start3:(TSARequestCompletionBlock)completionBlock
84{
85    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0),
86    ^{
87        NSOperationQueue *opq = [[NSOperationQueue alloc] init];
88        [NSURLConnection sendAsynchronousRequest:self.urlRequest
89            queue:opq completionHandler: completionBlock
90        ];
91    });
92}
93
94@end
95
96
97
98
99