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