1*1c60b9acSAndroid Build Coastguard Worker /*
2*1c60b9acSAndroid Build Coastguard Worker * lws-minimal-secure-streams-avs
3*1c60b9acSAndroid Build Coastguard Worker *
4*1c60b9acSAndroid Build Coastguard Worker * This file is made available under the Creative Commons CC0 1.0
5*1c60b9acSAndroid Build Coastguard Worker * Universal Public Domain Dedication.
6*1c60b9acSAndroid Build Coastguard Worker */
7*1c60b9acSAndroid Build Coastguard Worker
8*1c60b9acSAndroid Build Coastguard Worker #include <libwebsockets.h>
9*1c60b9acSAndroid Build Coastguard Worker #include <string.h>
10*1c60b9acSAndroid Build Coastguard Worker #include <signal.h>
11*1c60b9acSAndroid Build Coastguard Worker
12*1c60b9acSAndroid Build Coastguard Worker extern int
13*1c60b9acSAndroid Build Coastguard Worker avs_example_start(struct lws_context *context);
14*1c60b9acSAndroid Build Coastguard Worker
15*1c60b9acSAndroid Build Coastguard Worker int interrupted, bad = 1;
16*1c60b9acSAndroid Build Coastguard Worker static lws_state_notify_link_t nl;
17*1c60b9acSAndroid Build Coastguard Worker
18*1c60b9acSAndroid Build Coastguard Worker static const char *canned_root_token_payload =
19*1c60b9acSAndroid Build Coastguard Worker "grant_type=refresh_token"
20*1c60b9acSAndroid Build Coastguard Worker "&refresh_token=Atzr|IwEBIJedGXjDqsU_vMxykqOMg"
21*1c60b9acSAndroid Build Coastguard Worker "SHfYe3CPcedueWEMWSDMaDnEmiW8RlR1Kns7Cb4B-TOSnqp7ifVsY4BMY2B8tpHfO39XP"
22*1c60b9acSAndroid Build Coastguard Worker "zfu9HapGjTR458IyHX44FE71pWJkGZ79uVBpljP4sazJuk8XS3Oe_yLnm_DIO6fU1nU3Y"
23*1c60b9acSAndroid Build Coastguard Worker "0flYmsOiOAQE_gRk_pdlmEtHnpMA-9rLw3mkY5L89Ty9kUygBsiFaYatouROhbsTn8-jW"
24*1c60b9acSAndroid Build Coastguard Worker "k1zZLUDpT6ICtBXSnrCIg0pUbZevPFhTwdXd6eX-u4rq0W-XaDvPWFO7au-iPb4Zk5eZE"
25*1c60b9acSAndroid Build Coastguard Worker "iX6sissYrtNmuEXc2uHu7MnQO1hHCaTdIO2CANVumf-PHSD8xseamyh04sLV5JgFzY45S"
26*1c60b9acSAndroid Build Coastguard Worker "KvKMajiUZuLkMokOx86rjC2Hdkx5DO7G-dbG1ufBDG-N79pFMSs7Ck5pc283IdLoJkCQc"
27*1c60b9acSAndroid Build Coastguard Worker "AGvTX8o8I29QqkcGou-9TKhOJmpX8As94T61ok0UqqEKPJ7RhfQHHYdCtsdwxgvfVr9qI"
28*1c60b9acSAndroid Build Coastguard Worker "xL_hDCcTho8opCVX-6QhJHl6SQFlTw13"
29*1c60b9acSAndroid Build Coastguard Worker "&client_id="
30*1c60b9acSAndroid Build Coastguard Worker "amzn1.application-oa2-client.4823334c434b4190a2b5a42c07938a2d";
31*1c60b9acSAndroid Build Coastguard Worker
32*1c60b9acSAndroid Build Coastguard Worker static int
app_system_state_nf(lws_state_manager_t * mgr,lws_state_notify_link_t * link,int current,int target)33*1c60b9acSAndroid Build Coastguard Worker app_system_state_nf(lws_state_manager_t *mgr, lws_state_notify_link_t *link,
34*1c60b9acSAndroid Build Coastguard Worker int current, int target)
35*1c60b9acSAndroid Build Coastguard Worker {
36*1c60b9acSAndroid Build Coastguard Worker struct lws_context *context = lws_system_context_from_system_mgr(mgr);
37*1c60b9acSAndroid Build Coastguard Worker lws_system_blob_t *ab = lws_system_get_blob(context,
38*1c60b9acSAndroid Build Coastguard Worker LWS_SYSBLOB_TYPE_AUTH, 1 /* AUTH_IDX_ROOT */);
39*1c60b9acSAndroid Build Coastguard Worker size_t size;
40*1c60b9acSAndroid Build Coastguard Worker
41*1c60b9acSAndroid Build Coastguard Worker /*
42*1c60b9acSAndroid Build Coastguard Worker * For the things we care about, let's notice if we are trying to get
43*1c60b9acSAndroid Build Coastguard Worker * past them when we haven't solved them yet, and make the system
44*1c60b9acSAndroid Build Coastguard Worker * state wait while we trigger the dependent action.
45*1c60b9acSAndroid Build Coastguard Worker */
46*1c60b9acSAndroid Build Coastguard Worker switch (target) {
47*1c60b9acSAndroid Build Coastguard Worker case LWS_SYSTATE_REGISTERED:
48*1c60b9acSAndroid Build Coastguard Worker size = lws_system_blob_get_size(ab);
49*1c60b9acSAndroid Build Coastguard Worker if (size)
50*1c60b9acSAndroid Build Coastguard Worker break;
51*1c60b9acSAndroid Build Coastguard Worker
52*1c60b9acSAndroid Build Coastguard Worker /* let's register our canned root token so auth can use it */
53*1c60b9acSAndroid Build Coastguard Worker lws_system_blob_direct_set(ab,
54*1c60b9acSAndroid Build Coastguard Worker (const uint8_t *)canned_root_token_payload,
55*1c60b9acSAndroid Build Coastguard Worker strlen(canned_root_token_payload));
56*1c60b9acSAndroid Build Coastguard Worker break;
57*1c60b9acSAndroid Build Coastguard Worker case LWS_SYSTATE_OPERATIONAL:
58*1c60b9acSAndroid Build Coastguard Worker if (current == LWS_SYSTATE_OPERATIONAL)
59*1c60b9acSAndroid Build Coastguard Worker avs_example_start(context);
60*1c60b9acSAndroid Build Coastguard Worker break;
61*1c60b9acSAndroid Build Coastguard Worker case LWS_SYSTATE_POLICY_INVALID:
62*1c60b9acSAndroid Build Coastguard Worker /*
63*1c60b9acSAndroid Build Coastguard Worker * This is a NOP since we used direct set... but in a real
64*1c60b9acSAndroid Build Coastguard Worker * system this could easily change to be done on the heap, then
65*1c60b9acSAndroid Build Coastguard Worker * this would be important
66*1c60b9acSAndroid Build Coastguard Worker */
67*1c60b9acSAndroid Build Coastguard Worker lws_system_blob_destroy(lws_system_get_blob(context,
68*1c60b9acSAndroid Build Coastguard Worker LWS_SYSBLOB_TYPE_AUTH,
69*1c60b9acSAndroid Build Coastguard Worker 1 /* AUTH_IDX_ROOT */));
70*1c60b9acSAndroid Build Coastguard Worker break;
71*1c60b9acSAndroid Build Coastguard Worker }
72*1c60b9acSAndroid Build Coastguard Worker
73*1c60b9acSAndroid Build Coastguard Worker return 0;
74*1c60b9acSAndroid Build Coastguard Worker }
75*1c60b9acSAndroid Build Coastguard Worker
76*1c60b9acSAndroid Build Coastguard Worker static void
sigint_handler(int sig)77*1c60b9acSAndroid Build Coastguard Worker sigint_handler(int sig)
78*1c60b9acSAndroid Build Coastguard Worker {
79*1c60b9acSAndroid Build Coastguard Worker interrupted = 1;
80*1c60b9acSAndroid Build Coastguard Worker }
81*1c60b9acSAndroid Build Coastguard Worker
82*1c60b9acSAndroid Build Coastguard Worker static lws_state_notify_link_t * const app_notifier_list[] = {
83*1c60b9acSAndroid Build Coastguard Worker &nl, NULL
84*1c60b9acSAndroid Build Coastguard Worker };
85*1c60b9acSAndroid Build Coastguard Worker
main(int argc,const char ** argv)86*1c60b9acSAndroid Build Coastguard Worker int main(int argc, const char **argv)
87*1c60b9acSAndroid Build Coastguard Worker {
88*1c60b9acSAndroid Build Coastguard Worker struct lws_context_creation_info info;
89*1c60b9acSAndroid Build Coastguard Worker struct lws_context *context;
90*1c60b9acSAndroid Build Coastguard Worker int n = 0;
91*1c60b9acSAndroid Build Coastguard Worker
92*1c60b9acSAndroid Build Coastguard Worker signal(SIGINT, sigint_handler);
93*1c60b9acSAndroid Build Coastguard Worker memset(&info, 0, sizeof info); /* otherwise uninitialized garbage */
94*1c60b9acSAndroid Build Coastguard Worker lws_cmdline_option_handle_builtin(argc, argv, &info);
95*1c60b9acSAndroid Build Coastguard Worker
96*1c60b9acSAndroid Build Coastguard Worker lwsl_user("LWS secure streams - AVS test client [-d<verb>]\n");
97*1c60b9acSAndroid Build Coastguard Worker
98*1c60b9acSAndroid Build Coastguard Worker info.options = LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;
99*1c60b9acSAndroid Build Coastguard Worker info.fd_limit_per_thread = 1 + 6 + 1;
100*1c60b9acSAndroid Build Coastguard Worker info.protocols = lws_sspc_protocols;
101*1c60b9acSAndroid Build Coastguard Worker info.port = CONTEXT_PORT_NO_LISTEN;
102*1c60b9acSAndroid Build Coastguard Worker
103*1c60b9acSAndroid Build Coastguard Worker /* integrate us with lws system state management when context created */
104*1c60b9acSAndroid Build Coastguard Worker nl.name = "app";
105*1c60b9acSAndroid Build Coastguard Worker nl.notify_cb = app_system_state_nf;
106*1c60b9acSAndroid Build Coastguard Worker info.register_notifier_list = app_notifier_list;
107*1c60b9acSAndroid Build Coastguard Worker
108*1c60b9acSAndroid Build Coastguard Worker context = lws_create_context(&info);
109*1c60b9acSAndroid Build Coastguard Worker if (!context) {
110*1c60b9acSAndroid Build Coastguard Worker lwsl_err("lws init failed\n");
111*1c60b9acSAndroid Build Coastguard Worker return 1;
112*1c60b9acSAndroid Build Coastguard Worker }
113*1c60b9acSAndroid Build Coastguard Worker
114*1c60b9acSAndroid Build Coastguard Worker /* the event loop */
115*1c60b9acSAndroid Build Coastguard Worker
116*1c60b9acSAndroid Build Coastguard Worker while (n >= 0 && !interrupted)
117*1c60b9acSAndroid Build Coastguard Worker n = lws_service(context, 0);
118*1c60b9acSAndroid Build Coastguard Worker
119*1c60b9acSAndroid Build Coastguard Worker lws_context_destroy(context);
120*1c60b9acSAndroid Build Coastguard Worker lwsl_user("Completed: %s\n", bad ? "failed" : "OK");
121*1c60b9acSAndroid Build Coastguard Worker
122*1c60b9acSAndroid Build Coastguard Worker return bad;
123*1c60b9acSAndroid Build Coastguard Worker }
124