]> git.saurik.com Git - apple/security.git/blame - libsecurity_manifest/lib/SecureDownload.cpp
Security-55471.14.18.tar.gz
[apple/security.git] / libsecurity_manifest / lib / SecureDownload.cpp
CommitLineData
b1ab9ed8
A
1/*
2 * Copyright (c) 2004 Apple Computer, 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#include <Security/Security.h>
25#include <security_utilities/security_utilities.h>
b1ab9ed8 26#include <security_cdsa_utilities/cssmbridge.h>
427c49bc 27#include <../sec/Security/SecBase.h>
b1ab9ed8
A
28#include "Download.h"
29#include "SecureDownload.h"
30
31
32#define API_BEGIN \
33 try {
34
35#define API_END \
36 } \
37 catch (const MacOSError &err) { return err.osStatus(); } \
427c49bc
A
38 catch (const std::bad_alloc &) { return errSecAllocate; } \
39 catch (...) { return errSecInternalComponent; } \
40 return errSecSuccess;
b1ab9ed8
A
41
42#define API_END_GENERIC_CATCH } catch (...) { return; }
43
44#define API_END_ERROR_CATCH(bad) } catch (...) { return bad; }
45
46
47
48OSStatus SecureDownloadCreateWithTicket (CFDataRef ticket,
49 SecureDownloadTrustSetupCallback setup,
50 void* setupContext,
51 SecureDownloadTrustEvaluateCallback evaluate,
52 void* evaluateContext,
53 SecureDownloadRef* downloadRef)
54{
55 API_BEGIN
56
57 Download* sd = new Download ();
58 sd->Initialize (ticket, setup, setupContext, evaluate, evaluateContext);
59 Required (downloadRef) = sd;
60
61 API_END
62}
63
64
65
66OSStatus SecureDownloadCopyURLs (SecureDownloadRef downloadRef, CFArrayRef* urls)
67{
68 API_BEGIN
69
70 Required (downloadRef);
71 Download* d = (Download*) downloadRef;
72 Required (urls) = d->CopyURLs ();
73
74 API_END
75}
76
77
78
79OSStatus SecureDownloadCopyName (SecureDownloadRef downloadRef, CFStringRef* name)
80{
81 API_BEGIN
82
83 Required (downloadRef);
84 Download* d = (Download*) downloadRef;
85 Required (name) = d->CopyName ();
86
87 API_END
88}
89
90
91
92OSStatus SecureDownloadCopyCreationDate (SecureDownloadRef downloadRef, CFDateRef* date)
93{
94 API_BEGIN
95
96 Required (downloadRef);
97 Download* d = (Download*) downloadRef;
98 Required (date) = d->CopyDate ();
99
100 API_END
101}
102
103
104
105OSStatus SecureDownloadGetDownloadSize (SecureDownloadRef downloadRef, SInt64* size)
106{
107 API_BEGIN
108
109 Required (downloadRef);
110 Download* d = (Download*) downloadRef;
111 Required (size) = d->GetDownloadSize ();
112
113 API_END
114}
115
116
117
118OSStatus SecureDownloadUpdateWithData (SecureDownloadRef downloadRef, CFDataRef data)
119{
120 API_BEGIN
121 Required (downloadRef);
122 Required (data);
123 Download* d = (Download*) downloadRef;
124 d->UpdateWithData (data);
125 API_END
126}
127
128
129
130OSStatus SecureDownloadFinished (SecureDownloadRef downloadRef)
131{
132 API_BEGIN
133 Required (downloadRef);
134 Download* d = (Download*) downloadRef;
135 d->Finalize ();
136 API_END
137}
138
139
140
141OSStatus SecureDownloadRelease (SecureDownloadRef downloadRef)
142{
143 API_BEGIN
144 Required (downloadRef);
145 delete (Download*) downloadRef;
146 API_END
147}
148
149
150
151OSStatus SecureDownloadCopyTicketLocation (CFURLRef url, CFURLRef *ticketLocation)
152{
153 API_BEGIN
154 Required (ticketLocation);
155 Required (url);
156
157 // copy the resource specifier
158 CFStringRef resourceSpecifier = CFURLCopyResourceSpecifier (url);
159 if (resourceSpecifier == NULL)
160 {
161 CFError::throwMe ();
162 }
163
164 // make a new URL from the resource specifier
165 *ticketLocation = CFURLCreateWithString (NULL, resourceSpecifier, NULL);
166 if (*ticketLocation == NULL)
167 {
168 CFError::throwMe ();
169 }
170
171 // check the scheme to make sure that it isn't a file url
172 CFStringRef scheme = CFURLCopyScheme (*ticketLocation);
173 if (scheme != NULL)
174 {
175 CFComparisonResult equal = CFStringCompare (scheme, CFSTR("file"), kCFCompareCaseInsensitive);
176 CFRelease (scheme);
177
178 if (equal == kCFCompareEqualTo)
179 {
180 CFRelease (*ticketLocation);
181 *ticketLocation = NULL;
182 MacOSError::throwMe (errSecureDownloadInvalidDownload);
183 }
184 }
185
186 CFRelease (resourceSpecifier);
187 API_END
188}