Improper use of PLATFORM(TVOS) in PAL
[WebKit-https.git] / Source / WebCore / PAL / pal / spi / cocoa / NSKeyedArchiverSPI.h
1 /*
2  * Copyright (C) 2017 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #pragma once
27
28 #import <Availability.h>
29 #import <wtf/Assertions.h>
30 #import <wtf/RetainPtr.h>
31
32 #define USE_SECURE_ARCHIVER_API ((PLATFORM(MAC) && __MAC_OS_X_VERSION_MAX_ALLOWED >= 101302 && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101300) || (PLATFORM(IOS_FAMILY) && __IPHONE_OS_VERSION_MIN_REQUIRED >= 110200) || (PLATFORM(WATCHOS) && __WATCH_OS_VERSION_MIN_REQUIRED >= 40200) || (PLATFORM(APPLETV) && __TV_OS_VERSION_MIN_REQUIRED >= 110200))
33
34 #define USE_SECURE_ARCHIVER_FOR_ATTRIBUTED_STRING ((PLATFORM(MAC) && __MAC_OS_X_VERSION_MAX_ALLOWED >= 101302 && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101300) || (PLATFORM(IOS_FAMILY) && __IPHONE_OS_VERSION_MIN_REQUIRED >= 130000) || (PLATFORM(WATCHOS) && __WATCH_OS_VERSION_MIN_REQUIRED >= 60000) || (PLATFORM(APPLETV) && __TV_OS_VERSION_MIN_REQUIRED >= 130000))
35
36 #if USE(SECURE_ARCHIVER_API)
37 #if USE(APPLE_INTERNAL_SDK)
38 #import <Foundation/NSKeyedArchiver_Private.h>
39 #else
40 #import <Foundation/NSCoder.h>
41 #import <Foundation/NSKeyedArchiver.h>
42
43 NS_ASSUME_NONNULL_BEGIN
44
45 @interface NSKeyedArchiver (NSKeyedArchiverSecureCodingInitializers)
46 - (instancetype)initRequiringSecureCoding:(BOOL)requiresSecureCoding API_AVAILABLE(macos(10.13), ios(11.0));
47 + (nullable NSData *)archivedDataWithRootObject:(id)object requiringSecureCoding:(BOOL)requiresSecureCoding error:(NSError **)error API_AVAILABLE(macos(10.13), ios(11.0));
48 @end
49
50 @interface NSKeyedUnarchiver (NSKeyedUnarchiverSecureCodingInitializer)
51 - (nullable instancetype)initForReadingFromData:(NSData *)data error:(NSError **)error API_AVAILABLE(macos(10.13), ios(11.0));
52 + (nullable id)unarchivedObjectOfClass:(Class)cls fromData:(NSData *)data error:(NSError **)error API_AVAILABLE(macos(10.13), ios(11.0));
53 + (nullable id)unarchivedObjectOfClasses:(NSSet<Class> *)classes fromData:(NSData *)data error:(NSError **)error API_AVAILABLE(macos(10.13), ios(11.0));
54 @end
55
56 NS_ASSUME_NONNULL_END
57
58 #endif /* USE(APPLE_INTERNAL_SDK) */
59 #endif /* USE(SECURE_ARCHIVER_API) */
60
61 inline NSData *_Nullable securelyArchivedDataWithRootObject(id _Nonnull object)
62 {
63 #if USE(SECURE_ARCHIVER_API)
64     NSError *error;
65     NSData *data = [NSKeyedArchiver archivedDataWithRootObject:object requiringSecureCoding:YES error:&error];
66     if (!data)
67         LOG_ERROR("Unable to archive data: %@", error);
68     return data;
69 #else
70     return [NSKeyedArchiver archivedDataWithRootObject:object];
71 #endif
72 }
73
74 inline NSData *_Nullable insecurelyArchivedDataWithRootObject(id _Nonnull object)
75 {
76 #if USE(SECURE_ARCHIVER_API)
77     NSError *error;
78     NSData *data = [NSKeyedArchiver archivedDataWithRootObject:object requiringSecureCoding:NO error:&error];
79     if (!data)
80         LOG_ERROR("Unable to archive data: %@", error);
81     return data;
82 #else
83     return [NSKeyedArchiver archivedDataWithRootObject:object];
84 #endif
85 }
86
87 inline id _Nullable insecurelyUnarchiveObjectFromData(NSData * _Nonnull data)
88 {
89     ALLOW_DEPRECATED_DECLARATIONS_BEGIN
90     return [NSKeyedUnarchiver unarchiveObjectWithData:data];
91     ALLOW_DEPRECATED_DECLARATIONS_END
92 }
93
94 inline id _Nullable unarchivedObjectOfClassesFromData(NSSet<Class> * _Nonnull classes, NSData * _Nonnull data)
95 {
96 #if USE(SECURE_ARCHIVER_API)
97 #if !USE(SECURE_ARCHIVER_FOR_ATTRIBUTED_STRING)
98     // Remove this code when the fix from <rdar://problem/31376830> is deployed to all relevant build targets.
99     if ([classes containsObject:[NSAttributedString class]])
100         return insecurelyUnarchiveObjectFromData(data);
101 #endif
102     NSError *error;
103     id value = [NSKeyedUnarchiver unarchivedObjectOfClasses:classes fromData:data error:&error];
104     if (!value)
105         LOG_ERROR("Unable to unarchive data: %@", error);
106     return value;
107 #else
108     UNUSED_PARAM(classes);
109     return insecurelyUnarchiveObjectFromData(data);
110 #endif
111 }
112
113 inline RetainPtr<NSKeyedArchiver> secureArchiver()
114 {
115 #if USE(SECURE_ARCHIVER_API)
116     NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initRequiringSecureCoding:YES];
117 #else
118     NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] init];
119     [archiver setRequiresSecureCoding:YES];
120 #endif
121     return adoptNS(archiver);
122 }
123
124 inline RetainPtr<NSKeyedUnarchiver> secureUnarchiverFromData(NSData *_Nonnull data)
125 {
126 #if USE(SECURE_ARCHIVER_API)
127     NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingFromData:data error:nil];
128     unarchiver.decodingFailurePolicy = NSDecodingFailurePolicyRaiseException;
129 #else
130     NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
131     [unarchiver setRequiresSecureCoding:YES];
132 #endif
133     return adoptNS(unarchiver);
134 }
135
136 inline id _Nullable decodeObjectOfClassForKeyFromCoder(Class _Nonnull cls, NSString * _Nonnull key, NSCoder * _Nonnull coder)
137 {
138 #if USE(SECURE_ARCHIVER_API)
139     return [coder decodeObjectOfClass:cls forKey:key];
140 #else
141     UNUSED_PARAM(cls);
142     return [coder decodeObjectForKey:key];
143 #endif
144 }