source: webkit/trunk/Source/WebKit/webpushd/webpushtool/WebPushToolMain.mm@ 286764

Last change on this file since 286764 was 286764, checked in by beidson@apple.com, 3 years ago

Add ability to inject messages into webpushd
https://bugs.webkit.org/show_bug.cgi?id=233988

Reviewed by Alex Christensen.

Source/WebKit:

Covered by API tests.

This patch:

  • Adds WKWebsiteDataStore SPI to fetch pending push messages for the embedding application
  • Gives webpushd code to inject a push message for a given bundle identifier
  • Gives webpushtool the ability to send one of these fake messages
  • Gives webpushtool the ability to reconnect to the next daemon instance after the current connection is dropped
  • Tests the injection and fetching of push messages via TestWebKitAPI
  • Configurations/webpushtool.xcconfig:
  • WebKit.xcodeproj/project.pbxproj:
  • Resources/webpushtool.entitlements:
  • NetworkProcess/NetworkProcess.cpp:

(WebKit::NetworkProcess::getPendingPushMessages):
(WebKit::NetworkProcess::processPushMessage):

  • NetworkProcess/NetworkProcess.h:
  • NetworkProcess/NetworkProcess.messages.in:
  • NetworkProcess/Notifications/NetworkNotificationManager.cpp:

(WebKit::NetworkNotificationManager::getPendingPushMessages):
(WebKit::ReplyCaller<Vector<WebPushMessage>::callReply):

  • NetworkProcess/Notifications/NetworkNotificationManager.h:
  • Shared/Cocoa/WebPushMessageCocoa.mm: Copied from Source/WebKit/webpushd/webpushtool/WebPushToolConnection.h.

(WebKit::WebPushMessage::fromDictionary):
(WebKit::WebPushMessage::toDictionary const):

  • Shared/PushMessageForTesting.h: Copied from Source/WebKit/Shared/WebPushDaemonConstants.h.

(WebKit::WebPushD::PushMessageForTesting::encode const):
(WebKit::WebPushD::PushMessageForTesting::decode):

  • Shared/WebPushDaemonConstants.h:

(WebKit::WebPushD::messageTypeSendsReply):

  • Shared/WebPushMessage.h: Copied from Source/WebKit/webpushd/webpushtool/WebPushToolConnection.h.

(WebKit::WebPushMessage::encode const):
(WebKit::WebPushMessage::decode):

  • UIProcess/API/Cocoa/WKWebsiteDataStore.mm:

(-[WKWebsiteDataStore _getPendingPushMessages:]):
(-[WKWebsiteDataStore _processPushMessage:completionHandler:]):
(-[WKWebsiteDataStore _processPushMessage:registration:completionHandler:]): Deleted.

  • UIProcess/API/Cocoa/WKWebsiteDataStorePrivate.h:
  • UIProcess/Network/NetworkProcessProxy.cpp:

(WebKit::NetworkProcessProxy::getPendingPushMessages):
(WebKit::NetworkProcessProxy::processPushMessage):

  • UIProcess/Network/NetworkProcessProxy.h:

Tools:

  • TestWebKitAPI/Configurations/TestWebKitAPI-iOS.entitlements:
  • TestWebKitAPI/Configurations/TestWebKitAPI-macOS-internal.entitlements:
  • TestWebKitAPI/Configurations/TestWebKitAPI-macOS.entitlements:
  • TestWebKitAPI/Tests/WebKitCocoa/PushAPI.mm:

(messageDictionary):

  • TestWebKitAPI/Tests/WebKitCocoa/WebPushDaemon.mm:

(TestWebKitAPI::createMessageDictionary):
(TestWebKitAPI::sendMessageToDaemon):
(TestWebKitAPI::sendMessageToDaemonWaitingForReply):
(TestWebKitAPI::sendConfigurationWithAuditToken):
(TestWebKitAPI::createAndConfigureConnectionToService):
(TestWebKitAPI::encodeString):
(TestWebKitAPI::TEST):
(TestWebKitAPI::function):

  • TestWebKitAPI/cocoa/TestWKWebView.h:
File size: 5.1 KB
Line 
1/*
2 * Copyright (C) 2021 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 "PushMessageForTesting.h"
28#import "WebPushToolConnection.h"
29#import <Foundation/Foundation.h>
30#import <optional>
31#import <wtf/MainThread.h>
32
33using WebKit::WebPushD::PushMessageForTesting;
34
35__attribute__((__noreturn__))
36static void printUsageAndTerminate(NSString *message)
37{
38 fprintf(stderr, "%s\n\n", message.UTF8String);
39
40 fprintf(stderr, "Usage: webpushtool [options]\n");
41 fprintf(stderr, "\n");
42 fprintf(stderr, " --development\n");
43 fprintf(stderr, " Connects to mach service \"org.webkit.webpushtestdaemon.service\" (Default)\n");
44 fprintf(stderr, " --production\n");
45 fprintf(stderr, " Connects to mach service \"com.apple.webkit.webpushd.service\"\n");
46 fprintf(stderr, " --streamDebugMessages\n");
47 fprintf(stderr, " Stream debug messages from webpushd\n");
48 fprintf(stderr, " --reconnect\n");
49 fprintf(stderr, " Reconnect after connection is lost\n");
50 fprintf(stderr, " --push <target app identifier> <registration URL> <message>\n");
51 fprintf(stderr, " Inject a test push messasge to the target app and registration URL\n");
52 fprintf(stderr, "\n");
53
54 exit(-1);
55}
56
57static std::unique_ptr<PushMessageForTesting> pushMessageFromArguments(NSEnumerator<NSString *> *enumerator)
58{
59 NSString *appIdentifier = [enumerator nextObject];
60 if (!appIdentifier)
61 return nullptr;
62
63 NSString *registrationString = [enumerator nextObject];
64 if (!registrationString)
65 return nullptr;
66
67 NSURL *registrationURL = [NSURL URLWithString:registrationString];
68 if (!registrationURL)
69 return nullptr;
70
71 NSString *message = [enumerator nextObject];
72 if (!message)
73 return nullptr;
74
75 PushMessageForTesting pushMessage = { appIdentifier, registrationURL, message };
76 return makeUniqueWithoutFastMallocCheck<PushMessageForTesting>(WTFMove(pushMessage));
77}
78
79int main(int, const char **)
80{
81 WTF::initializeMainThread();
82
83 auto preferTestService = WebPushTool::PreferTestService::Yes;
84 auto reconnect = WebPushTool::Reconnect::No;
85 std::optional<WebPushTool::Action> action;
86 std::unique_ptr<PushMessageForTesting> pushMessage;
87
88 @autoreleasepool {
89 NSArray *arguments = [[NSProcessInfo processInfo] arguments];
90 if (arguments.count == 1)
91 printUsageAndTerminate(@"No arguments provided");
92
93 NSEnumerator<NSString *> *enumerator = [[arguments subarrayWithRange:NSMakeRange(1, arguments.count - 1)] objectEnumerator];
94 NSString *argument = [enumerator nextObject];
95 while (argument) {
96 if ([argument isEqualToString:@"--production"])
97 preferTestService = WebPushTool::PreferTestService::No;
98 else if ([argument isEqualToString:@"--development"])
99 preferTestService = WebPushTool::PreferTestService::Yes;
100 else if ([argument isEqualToString:@"--streamDebugMessages"])
101 action = WebPushTool::Action::StreamDebugMessages;
102 else if ([argument isEqualToString:@"--reconnect"])
103 reconnect = WebPushTool::Reconnect::Yes;
104 else if ([argument isEqualToString:@"--push"]) {
105 pushMessage = pushMessageFromArguments(enumerator);
106 if (!pushMessage)
107 printUsageAndTerminate([NSString stringWithFormat:@"Invalid push arguments specified"]);
108 } else
109 printUsageAndTerminate([NSString stringWithFormat:@"Invalid option provided: %@", argument]);
110
111 argument = [enumerator nextObject];
112 }
113 }
114
115 if (!action && !pushMessage)
116 printUsageAndTerminate(@"No action provided");
117
118 auto connection = WebPushTool::Connection::create(*action, preferTestService, reconnect);
119 if (pushMessage)
120 connection->setPushMessage(WTFMove(pushMessage));
121
122 connection->connectToService();
123
124 CFRunLoopRun();
125 return 0;
126}
Note: See TracBrowser for help on using the repository browser.