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 |
|
---|
33 | using WebKit::WebPushD::PushMessageForTesting;
|
---|
34 |
|
---|
35 | __attribute__((__noreturn__))
|
---|
36 | static 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 |
|
---|
57 | static 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 |
|
---|
79 | int 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 | }
|
---|