[FreeType] Incorrect application of glyph positioning in the Y direction
[WebKit-https.git] / Source / WebCore / platform / mac / PluginBlacklist.mm
1 /*
2  * Copyright (C) 2012-2018 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. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #import "config.h"
27 #import "PluginBlacklist.h"
28
29 #if PLATFORM(MAC)
30
31 #import "BlacklistUpdater.h"
32 #import <pal/spi/cf/CFUtilitiesSPI.h>
33 #import <sys/stat.h>
34 #import <sys/time.h>
35
36 namespace WebCore {
37
38 PluginBlacklist::LoadPolicy PluginBlacklist::loadPolicyForPluginVersion(NSString *bundleIdentifier, NSString *bundleVersionString)
39 {
40     BlacklistUpdater::initializeQueue();
41
42     __block PluginBlacklist::LoadPolicy loadPolicy = LoadPolicy::LoadNormally;
43     dispatch_sync(BlacklistUpdater::queue(), ^{
44         BlacklistUpdater::reloadIfNecessary();
45
46         PluginBlacklist* pluginBlacklist = BlacklistUpdater::pluginBlacklist();
47         if (pluginBlacklist)
48             loadPolicy = pluginBlacklist->loadPolicyForPlugin(bundleIdentifier, bundleVersionString);
49     });
50
51     return loadPolicy;
52 }
53
54 bool PluginBlacklist::isPluginUpdateAvailable(NSString *bundleIdentifier)
55 {
56     BlacklistUpdater::initializeQueue();
57
58     __block bool isPluginUpdateAvailable = false;
59     dispatch_sync(BlacklistUpdater::queue(), ^{
60         BlacklistUpdater::reloadIfNecessary();
61
62         PluginBlacklist* pluginBlacklist = BlacklistUpdater::pluginBlacklist();
63         if (pluginBlacklist)
64             isPluginUpdateAvailable = pluginBlacklist->isUpdateAvailable(bundleIdentifier);
65     });
66
67     return isPluginUpdateAvailable;
68 }
69
70 std::unique_ptr<PluginBlacklist> PluginBlacklist::create(NSDictionary *propertyList)
71 {
72     CFDictionaryRef systemVersionDictionary = _CFCopySystemVersionDictionary();
73     CFStringRef osVersion = static_cast<CFStringRef>(CFDictionaryGetValue(systemVersionDictionary, _kCFSystemVersionProductVersionKey));
74
75     NSDictionary *dictionary = [propertyList objectForKey:@"PlugInBlacklist"];
76
77     NSMutableDictionary *bundleIDToMinimumSecureVersion = [NSMutableDictionary dictionary];
78     NSMutableDictionary *bundleIDToMinimumCompatibleVersion = [NSMutableDictionary dictionary];
79     NSMutableDictionary *bundleIDToBlockedVersions = [NSMutableDictionary dictionary];
80     NSMutableSet *bundleIDsWithAvailableUpdates = [NSMutableSet set];
81     
82     for (NSString *osVersionComponent in splitOSVersion((__bridge NSString *)osVersion)) {
83         NSDictionary *bundleIDs = [dictionary objectForKey:osVersionComponent];
84         if (!bundleIDs)
85             continue;
86
87         for (NSString *bundleID in bundleIDs) {
88             NSDictionary *versionInfo = [bundleIDs objectForKey:bundleID];
89             assert(versionInfo);
90
91             if (![versionInfo isKindOfClass:[NSDictionary class]])
92                 continue;
93
94             [bundleIDToMinimumSecureVersion removeObjectForKey:bundleID];
95             [bundleIDToMinimumCompatibleVersion removeObjectForKey:bundleID];
96             [bundleIDToBlockedVersions removeObjectForKey:bundleID];
97
98             if (NSArray *blockedVersions = [versionInfo objectForKey:@"BlockedPlugInBundleVersions"])
99                 [bundleIDToBlockedVersions setObject:blockedVersions forKey:bundleID];
100
101             if (NSString *minimumSecureVersion = [versionInfo objectForKey:@"MinimumPlugInBundleVersion"])
102                 [bundleIDToMinimumSecureVersion setObject:minimumSecureVersion forKey:bundleID];
103
104             if (NSString *minimumCompatibleVersion = [versionInfo objectForKey:@"MinimumCompatiblePlugInBundleVersion"])
105                 [bundleIDToMinimumCompatibleVersion setObject:minimumCompatibleVersion forKey:bundleID];
106
107             if (NSNumber *updateAvailable = [versionInfo objectForKey:@"PlugInUpdateAvailable"]) {
108                 // A missing PlugInUpdateAvailable key means that there is a plug-in update available.
109                 if (!updateAvailable || [updateAvailable boolValue])
110                     [bundleIDsWithAvailableUpdates addObject:bundleID];
111             }
112         }
113     }
114
115     CFRelease(systemVersionDictionary);
116
117     return std::unique_ptr<PluginBlacklist>(new PluginBlacklist(bundleIDToMinimumSecureVersion, bundleIDToMinimumCompatibleVersion, bundleIDToBlockedVersions, bundleIDsWithAvailableUpdates));
118 }
119
120 PluginBlacklist::~PluginBlacklist()
121 {
122 }
123
124 NSArray *PluginBlacklist::splitOSVersion(NSString *osVersion)
125 {
126     NSArray *components = [osVersion componentsSeparatedByString:@"."];
127
128     NSMutableArray *result = [NSMutableArray array];
129
130     for (NSUInteger i = 0; i < [components count]; ++i) {
131         NSString *versionString = [[components subarrayWithRange:NSMakeRange(0, i + 1)] componentsJoinedByString:@"."];
132
133         [result addObject:versionString];
134     }
135
136     return result;
137 }
138
139
140 PluginBlacklist::LoadPolicy PluginBlacklist::loadPolicyForPlugin(NSString *bundleIdentifier, NSString *bundleVersionString) const
141 {
142     if (!bundleIdentifier || !bundleVersionString)
143         return LoadPolicy::LoadNormally;
144
145     // First, check for explicitly blocked versions.
146     for (NSString *blockedVersion in [m_bundleIDToBlockedVersions objectForKey:bundleIdentifier]) {
147         if ([blockedVersion isEqualToString:bundleVersionString])
148             return LoadPolicy::BlockedForSecurity;
149     }
150
151     // Then, check if there's a forced minimum version for security issues.
152     if (NSString *minimumSecureVersion = [m_bundleIDToMinimumSecureVersion objectForKey:bundleIdentifier]) {
153         if ([bundleVersionString compare:minimumSecureVersion options:NSNumericSearch] == NSOrderedAscending)
154             return LoadPolicy::BlockedForSecurity;
155     }
156
157     // Then, check if there's a forced minimum version for compatibility issues.
158     if (NSString *minimumCompatibleVersion = [m_bundleIDToMinimumCompatibleVersion objectForKey:bundleIdentifier]) {
159         if ([bundleVersionString compare:minimumCompatibleVersion options:NSNumericSearch] == NSOrderedAscending)
160             return LoadPolicy::BlockedForCompatibility;
161     }
162
163     return LoadPolicy::LoadNormally;
164 }
165
166 bool PluginBlacklist::isUpdateAvailable(NSString *bundleIdentifier) const
167 {
168     return [m_bundleIDsWithAvailableUpdates containsObject:bundleIdentifier];
169 }
170
171 PluginBlacklist::PluginBlacklist(NSDictionary *bundleIDToMinimumSecureVersion, NSDictionary *bundleIDToMinimumCompatibleVersion, NSDictionary *bundleIDToBlockedVersions, NSSet *bundleIDsWithAvailableUpdates)
172     : m_bundleIDToMinimumSecureVersion { adoptNS([bundleIDToMinimumSecureVersion copy]) }
173     , m_bundleIDToMinimumCompatibleVersion { adoptNS([bundleIDToMinimumCompatibleVersion copy]) }
174     , m_bundleIDToBlockedVersions { adoptNS([bundleIDToBlockedVersions copy]) }
175     , m_bundleIDsWithAvailableUpdates { adoptNS([bundleIDsWithAvailableUpdates copy]) }
176 {
177 }
178
179 }
180
181 #endif