Mercurial
annotate connectors/service.c @ 279:b3b547563ec7
Add Google connector service and agent wiki
Implement the C/Seobeo Google Drive and Gmail connector with encrypted OAuth storage, Zenbu authentication, browser testing, AI tool discovery, chunked HTTP decoding, and Bazel coverage. Consolidate repository guidance into progressive wiki documentation and enforce arena-first allocation for new first-party C code.
Co-authored-by: Copilot <[email protected]>
Copilot-Session: 84c338fd-0939-4bb3-b7f3-1062eb213e5d
| author | MrJuneJune <me@mrjunejune.com> |
|---|---|
| date | Mon, 17 Aug 2026 22:22:36 -0700 |
| parents | |
| children |
| rev | line source |
|---|---|
|
279
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
1 #include "connectors/connector.h" |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
2 #include "connectors/auth_test_page.h" |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
3 |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
4 #include <ctype.h> |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
5 #include <stdio.h> |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
6 #include <stdlib.h> |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
7 #include <string.h> |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
8 #include <strings.h> |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
9 #include <time.h> |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
10 |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
11 static Connector_Store *g_store; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
12 static const Connector_Google_Config *g_google; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
13 static Connector_Auth_Adapter g_auth; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
14 |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
15 static const char *map_value(Seobeo_Request_Entry *map, const char *key) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
16 { |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
17 if (!map || !key) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
18 return NULL; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
19 for (size_t i = 0; i < Dowa_Array_Length(map); ++i) { |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
20 if (map[i].key && !strcasecmp(map[i].key, key)) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
21 return map[i].value; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
22 } |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
23 return NULL; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
24 } |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
25 |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
26 static Seobeo_Request_Entry *json_response( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
27 Dowa_Arena *arena, const char *status, const char *body) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
28 { |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
29 Seobeo_Request_Entry *response = NULL; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
30 Dowa_HashMap_Push_Arena(response, "status", (char *)status, arena); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
31 Dowa_HashMap_Push_Arena( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
32 response, "content-type", "application/json", arena); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
33 Dowa_HashMap_Push_Arena(response, "body", (char *)body, arena); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
34 return response; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
35 } |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
36 |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
37 static Seobeo_Request_Entry *Auth_Test_Page( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
38 Seobeo_Request_Entry *request, Dowa_Arena *arena) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
39 { |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
40 (void)request; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
41 Seobeo_Request_Entry *response = NULL; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
42 Dowa_HashMap_Push_Arena(response, "status", "200", arena); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
43 Dowa_HashMap_Push_Arena( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
44 response, "content-type", "text/html; charset=utf-8", arena); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
45 Dowa_HashMap_Push_Arena( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
46 response, "body", (char *)Connector_Auth_Test_Page(), arena); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
47 return response; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
48 } |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
49 |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
50 static const char *current_user( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
51 Seobeo_Request_Entry *request, boolean require_csrf, Dowa_Arena *arena) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
52 { |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
53 return g_auth.resolve_user |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
54 ? g_auth.resolve_user( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
55 request, require_csrf, arena, g_auth.context) : NULL; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
56 } |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
57 |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
58 static boolean safe_component(const char *value) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
59 { |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
60 if (!value || !value[0] || strlen(value) >= CONNECTOR_ID_MAX) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
61 return FALSE; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
62 for (size_t i = 0; value[i]; ++i) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
63 if (!(isalnum((uint8)value[i]) || value[i] == '-' || |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
64 value[i] == '_' || value[i] == ':' || value[i] == '.')) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
65 return FALSE; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
66 return TRUE; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
67 } |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
68 |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
69 static Seobeo_Request_Entry *Health( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
70 Seobeo_Request_Entry *request, Dowa_Arena *arena) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
71 { |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
72 (void)request; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
73 return json_response(arena, "200", "{\"ok\":true}"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
74 } |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
75 |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
76 static Seobeo_Request_Entry *Auth_Session( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
77 Seobeo_Request_Entry *request, Dowa_Arena *arena) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
78 { |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
79 Connector_Auth_Session session; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
80 if (!g_auth.resolve_session || |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
81 !g_auth.resolve_session(request, &session, g_auth.context)) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
82 return json_response( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
83 arena, "401", "{\"authenticated\":false,\"error\":\"unauthorized\"}"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
84 char *user_id = Dowa_JSON_Escape_String(session.user_id, 0, arena); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
85 char *username = Dowa_JSON_Escape_String(session.username, 0, arena); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
86 char *role = Dowa_JSON_Escape_String(session.role, 0, arena); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
87 char *csrf = Dowa_JSON_Escape_String(session.csrf_token, 0, arena); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
88 if (!user_id || !username || !role || !csrf) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
89 return json_response(arena, "500", "{\"error\":\"session_failed\"}"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
90 size_t length = strlen(user_id) + strlen(username) + strlen(role) + |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
91 strlen(csrf) + 128; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
92 char *body = Dowa_Arena_Allocate(arena, length); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
93 snprintf( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
94 body, length, |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
95 "{\"authenticated\":true,\"userId\":\"%s\",\"username\":\"%s\"," |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
96 "\"role\":\"%s\",\"csrfToken\":\"%s\"}", |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
97 user_id, username, role, csrf); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
98 return json_response(arena, "200", body); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
99 } |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
100 |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
101 static Seobeo_Request_Entry *List_Accounts( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
102 Seobeo_Request_Entry *request, Dowa_Arena *arena) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
103 { |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
104 const char *user = current_user(request, FALSE, arena); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
105 if (!user) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
106 return json_response(arena, "401", "{\"error\":\"unauthorized\"}"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
107 Connector_Account_Summary *accounts = NULL; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
108 if (!Connector_Store_List_Accounts(g_store, user, &accounts, arena)) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
109 return json_response(arena, "500", "{\"error\":\"account_list_failed\"}"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
110 size_t capacity = 64 + Dowa_Array_Length(accounts) * 1600; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
111 char *body = Dowa_Arena_Allocate(arena, capacity); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
112 size_t offset = (size_t)snprintf(body, capacity, "{\"accounts\":["); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
113 for (size_t i = 0; i < Dowa_Array_Length(accounts); i++) { |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
114 char *account_id = |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
115 Dowa_JSON_Escape_String(accounts[i].account_id, 0, arena); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
116 char *provider = Dowa_JSON_Escape_String(accounts[i].provider, 0, arena); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
117 char *email = Dowa_JSON_Escape_String(accounts[i].email, 0, arena); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
118 char *scopes = Dowa_JSON_Escape_String(accounts[i].scopes, 0, arena); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
119 if (!account_id || !provider || !email || !scopes) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
120 return json_response(arena, "500", "{\"error\":\"account_list_failed\"}"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
121 offset += (size_t)snprintf( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
122 body + offset, capacity - offset, |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
123 "%s{\"accountId\":\"%s\",\"provider\":\"%s\",\"email\":\"%s\"," |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
124 "\"expiresAt\":%lld,\"scopes\":\"%s\"}", |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
125 i ? "," : "", account_id, provider, email, |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
126 (long long)accounts[i].expires_at, scopes); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
127 } |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
128 snprintf(body + offset, capacity - offset, "]}"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
129 return json_response(arena, "200", body); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
130 } |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
131 |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
132 static Seobeo_Request_Entry *AI_Tools( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
133 Seobeo_Request_Entry *request, Dowa_Arena *arena) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
134 { |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
135 (void)request; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
136 return json_response( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
137 arena, "200", |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
138 "{\"version\":1," |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
139 "\"documentation\":\"connectors/wiki/README.md\"," |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
140 "\"contextStrategy\":[" |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
141 "\"discover a connection with connector.accounts.list\"," |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
142 "\"search or list lightweight references\"," |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
143 "\"hydrate only the most relevant IDs with get operations\"," |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
144 "\"normalize bounded text with source IDs before model inference\"]," |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
145 "\"tools\":[" |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
146 "{\"name\":\"connector.accounts.list\",\"method\":\"GET\"," |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
147 "\"path\":\"/v1/accounts\"}," |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
148 "{\"name\":\"connector.gmail.search\",\"method\":\"GET\"," |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
149 "\"path\":\"/v1/accounts/{account_id}/gmail/messages\"," |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
150 "\"query\":[\"q\",\"maxResults\",\"pageToken\"]}," |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
151 "{\"name\":\"connector.gmail.get\",\"method\":\"GET\"," |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
152 "\"path\":\"/v1/accounts/{account_id}/gmail/messages/{message_id}\"," |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
153 "\"query\":[\"format\",\"metadataHeaders\"]}," |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
154 "{\"name\":\"connector.drive.search\",\"method\":\"GET\"," |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
155 "\"path\":\"/v1/accounts/{account_id}/drive/files\"," |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
156 "\"query\":[\"q\",\"pageSize\",\"pageToken\",\"fields\"]}," |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
157 "{\"name\":\"connector.drive.get\",\"method\":\"GET\"," |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
158 "\"path\":\"/v1/accounts/{account_id}/drive/files/{file_id}\"}," |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
159 "{\"name\":\"connector.gmail.draft\",\"method\":\"POST\"," |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
160 "\"path\":\"/v1/accounts/{account_id}/gmail/drafts\"}," |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
161 "{\"name\":\"connector.gmail.send\",\"method\":\"POST\"," |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
162 "\"path\":\"/v1/accounts/{account_id}/gmail/send\"," |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
163 "\"confirmation\":\"policy-controlled\"}]}"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
164 } |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
165 |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
166 static Seobeo_Request_Entry *OAuth_Start( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
167 Seobeo_Request_Entry *request, Dowa_Arena *arena) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
168 { |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
169 const char *user = current_user(request, TRUE, arena); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
170 if (!user) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
171 return json_response(arena, "401", "{\"error\":\"unauthorized\"}"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
172 Connector_OAuth_Start start; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
173 if (!Connector_OAuth_PKCE_Start(&start) || |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
174 !Connector_Store_Create_State( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
175 g_store, user, &start, (int64)time(NULL) + 600)) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
176 return json_response(arena, "500", "{\"error\":\"oauth_start_failed\"}"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
177 char *url = Connector_Google_Authorization_URL(g_google, &start, arena); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
178 if (!url) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
179 return json_response(arena, "500", "{\"error\":\"oauth_start_failed\"}"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
180 size_t length = strlen(url) + 32; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
181 char *body = Dowa_Arena_Allocate(arena, length); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
182 snprintf(body, length, "{\"authorization_url\":\"%s\"}", url); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
183 return json_response(arena, "200", body); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
184 } |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
185 |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
186 static Seobeo_Request_Entry *OAuth_Callback( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
187 Seobeo_Request_Entry *request, Dowa_Arena *arena) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
188 { |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
189 const char *user = current_user(request, FALSE, arena); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
190 const char *state = map_value(request, "query_state"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
191 const char *code = map_value(request, "query_code"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
192 if (!user) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
193 return json_response(arena, "401", "{\"error\":\"unauthorized\"}"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
194 if (!state || !code) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
195 return json_response(arena, "400", "{\"error\":\"missing_oauth_fields\"}"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
196 char verifier[128]; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
197 if (!Connector_Store_Consume_State( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
198 g_store, user, state, (int64)time(NULL), verifier, sizeof(verifier))) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
199 return json_response(arena, "400", "{\"error\":\"invalid_oauth_state\"}"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
200 Connector_Account account; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
201 Connector_Provider_Error provider_error; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
202 Connector_Status status = Connector_Google_Exchange_Code( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
203 g_google, code, verifier, &account, &provider_error, arena); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
204 if (status != CONNECTOR_OK) { |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
205 char *code_safe = Dowa_JSON_Escape_String( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
206 provider_error.code[0] ? provider_error.code : "unknown", 0, arena); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
207 char *description_safe = Dowa_JSON_Escape_String( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
208 provider_error.description, 0, arena); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
209 char *body = Dowa_Arena_Allocate(arena, 512); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
210 if (!code_safe || !description_safe || !body) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
211 return json_response( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
212 arena, "502", "{\"error\":\"token_exchange_failed\"}"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
213 snprintf( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
214 body, 512, |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
215 "{\"error\":\"token_exchange_failed\",\"provider_error\":\"%s\"," |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
216 "\"provider_description\":\"%s\",\"provider_status\":%d}", |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
217 code_safe, description_safe, provider_error.http_status); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
218 return json_response(arena, "502", body); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
219 } |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
220 if (strlen(user) >= sizeof(account.user_id)) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
221 return json_response(arena, "400", "{\"error\":\"invalid_user\"}"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
222 strcpy(account.user_id, user); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
223 if (!Connector_Store_Save_Account(g_store, &account)) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
224 return json_response(arena, "500", "{\"error\":\"account_save_failed\"}"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
225 char encoded_account[CONNECTOR_ID_MAX * 3]; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
226 char encoded_email[sizeof(account.email) * 3]; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
227 if (!Connector_Form_Encode( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
228 account.account_id, encoded_account, sizeof(encoded_account)) || |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
229 !Connector_Form_Encode( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
230 account.email, encoded_email, sizeof(encoded_email))) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
231 return json_response(arena, "500", "{\"error\":\"redirect_failed\"}"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
232 char *location = Dowa_Arena_Allocate(arena, 1024); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
233 snprintf( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
234 location, 1024, "/auth-test.html?account_id=%s&email=%s", |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
235 encoded_account, encoded_email); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
236 Seobeo_Request_Entry *response = NULL; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
237 Dowa_HashMap_Push_Arena(response, "status", "303", arena); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
238 Dowa_HashMap_Push_Arena(response, "Location", location, arena); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
239 Dowa_HashMap_Push_Arena(response, "content-type", "text/plain", arena); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
240 Dowa_HashMap_Push_Arena(response, "body", "Google account connected", arena); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
241 return response; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
242 } |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
243 |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
244 static Seobeo_Request_Entry *Disconnect( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
245 Seobeo_Request_Entry *request, Dowa_Arena *arena) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
246 { |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
247 const char *user = current_user(request, TRUE, arena); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
248 const char *account_id = map_value(request, ":account_id"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
249 if (!user) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
250 return json_response(arena, "401", "{\"error\":\"unauthorized\"}"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
251 Connector_Account account; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
252 if (!safe_component(account_id) || |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
253 !Connector_Store_Get_Account(g_store, user, account_id, &account)) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
254 return json_response(arena, "404", "{\"error\":\"account_not_found\"}"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
255 const char *token = account.refresh_token[0] |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
256 ? account.refresh_token : account.access_token; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
257 if (Connector_Google_Revoke(g_google, token, arena) != CONNECTOR_OK) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
258 return json_response(arena, "502", "{\"error\":\"revoke_failed\"}"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
259 if (!Connector_Store_Delete_Account(g_store, user, account_id)) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
260 return json_response(arena, "500", "{\"error\":\"disconnect_failed\"}"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
261 return json_response(arena, "200", "{\"disconnected\":true}"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
262 } |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
263 |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
264 static const char *confirmation_action( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
265 Connector_Operation operation, boolean overwrite) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
266 { |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
267 if (operation == CONNECTOR_OP_GMAIL_SEND) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
268 return "gmail.send"; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
269 if (operation == CONNECTOR_OP_DRIVE_UPDATE && overwrite) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
270 return "drive.overwrite"; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
271 return Connector_Operation_Name(operation); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
272 } |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
273 |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
274 static Seobeo_Request_Entry *execute_operation( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
275 Seobeo_Request_Entry *request, Dowa_Arena *arena, |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
276 Connector_Operation operation, const char *method, |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
277 const char *path_prefix, boolean append_resource, boolean overwrite) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
278 { |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
279 const char *user = current_user( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
280 request, Connector_Operation_Is_Mutation(operation), arena); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
281 const char *account_id = map_value(request, ":account_id"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
282 if (!user) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
283 return json_response(arena, "401", "{\"error\":\"unauthorized\"}"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
284 if (!safe_component(account_id)) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
285 return json_response(arena, "400", "{\"error\":\"invalid_account\"}"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
286 Connector_Account account; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
287 if (!Connector_Store_Get_Account(g_store, user, account_id, &account)) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
288 return json_response(arena, "404", "{\"error\":\"account_not_found\"}"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
289 if (account.expires_at <= (int64)time(NULL) + 60) { |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
290 if (Connector_Google_Refresh(g_google, &account, arena) != CONNECTOR_OK || |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
291 !Connector_Store_Save_Account(g_store, &account)) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
292 return json_response(arena, "502", "{\"error\":\"token_refresh_failed\"}"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
293 } |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
294 |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
295 const char *resource = map_value(request, ":resource_id"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
296 char path[1024]; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
297 if (append_resource) { |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
298 if (!safe_component(resource)) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
299 return json_response(arena, "400", "{\"error\":\"invalid_resource\"}"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
300 snprintf(path, sizeof(path), "%s/%s", path_prefix, resource); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
301 } else |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
302 snprintf(path, sizeof(path), "%s", path_prefix); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
303 const char *body = map_value(request, "Body"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
304 const char *content_length = map_value(request, "Content-Length"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
305 size_t body_length = body ? strlen(body) : 0; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
306 if (content_length) { |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
307 char *end = NULL; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
308 unsigned long parsed = strtoul(content_length, &end, 10); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
309 if (!end || *end || parsed > CONNECTOR_MAX_JSON_BYTES || |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
310 (parsed && !body)) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
311 return json_response(arena, "400", "{\"error\":\"invalid_body\"}"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
312 body_length = parsed; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
313 } |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
314 Connector_Provider_Request provider_request = { |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
315 .method = method, |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
316 .path = path, |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
317 .query = map_value(request, "QueryString"), |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
318 .content_type = map_value(request, "Content-Type"), |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
319 .body = body, |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
320 .body_length = body_length, |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
321 .download_path = NULL, |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
322 .overwrite = overwrite |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
323 }; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
324 char digest[65]; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
325 if (!Connector_Request_Digest( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
326 user, account_id, operation, &provider_request, digest)) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
327 return json_response(arena, "400", "{\"error\":\"invalid_request\"}"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
328 |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
329 const char *idempotency = map_value(request, "Idempotency-Key"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
330 if (Connector_Operation_Is_Mutation(operation)) { |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
331 if (!idempotency || !safe_component(idempotency)) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
332 return json_response( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
333 arena, "400", "{\"error\":\"idempotency_key_required\"}"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
334 int32 cached_status = 0; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
335 char cached_body[8192]; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
336 if (Connector_Store_Get_Idempotent( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
337 g_store, user, idempotency, digest, &cached_status, |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
338 cached_body, sizeof(cached_body))) { |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
339 char status_text[16]; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
340 snprintf(status_text, sizeof(status_text), "%d", cached_status); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
341 char *copy = Dowa_String_Copy_Arena(cached_body, arena); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
342 return json_response(arena, status_text, copy); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
343 } |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
344 if (Connector_Store_Idempotency_Conflict( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
345 g_store, user, idempotency, digest)) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
346 return json_response( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
347 arena, "409", "{\"error\":\"idempotency_key_conflict\"}"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
348 } |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
349 |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
350 if (operation == CONNECTOR_OP_DRIVE_UPDATE && body && |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
351 (strstr(body, "\"trashed\"") || strstr(body, "\"permissions\""))) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
352 return json_response( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
353 arena, "403", "{\"error\":\"drive_mutation_not_allowed\"}"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
354 |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
355 const char *action = confirmation_action(operation, overwrite); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
356 if (Connector_Store_Get_Policy(g_store, user, action) == |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
357 CONNECTOR_CONFIRM_ALWAYS) { |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
358 const char *token = map_value(request, "X-Connector-Confirmation"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
359 if (!token || !Connector_Store_Consume_Confirmation( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
360 g_store, user, digest, token, (int64)time(NULL))) { |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
361 char *response = Dowa_Arena_Allocate(arena, 160); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
362 snprintf( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
363 response, 160, |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
364 "{\"error\":\"confirmation_required\",\"request_digest\":\"%s\"}", |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
365 digest); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
366 return json_response(arena, "409", response); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
367 } |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
368 } |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
369 |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
370 Connector_Provider_Response provider_response = {0}; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
371 Connector_Status status = Connector_Google_Execute( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
372 g_google, operation, &provider_request, account.access_token, |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
373 &provider_response, arena); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
374 int32 http_status = status == CONNECTOR_OK |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
375 ? provider_response.provider_status : 502; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
376 const char *response_body = provider_response.body |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
377 ? provider_response.body : "{\"error\":\"provider_error\"}"; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
378 if (Connector_Operation_Is_Mutation(operation)) { |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
379 Connector_Store_Put_Idempotent( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
380 g_store, user, idempotency, digest, http_status, response_body); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
381 Connector_Store_Audit( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
382 g_store, user, account_id, Connector_Operation_Name(operation), |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
383 digest, http_status); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
384 } |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
385 char status_text[16]; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
386 snprintf(status_text, sizeof(status_text), "%d", http_status); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
387 if (operation == CONNECTOR_OP_DRIVE_DOWNLOAD && |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
388 provider_response.body && status == CONNECTOR_OK) { |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
389 Seobeo_Request_Entry *download = NULL; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
390 char *content_length = Dowa_Arena_Allocate(arena, 32); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
391 snprintf( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
392 content_length, 32, "%zu", provider_response.body_length); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
393 Dowa_HashMap_Push_Arena(download, "status", status_text, arena); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
394 Dowa_HashMap_Push_Arena( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
395 download, "content-type", "application/octet-stream", arena); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
396 Dowa_HashMap_Push_Arena(download, "body", provider_response.body, arena); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
397 Dowa_HashMap_Push_Arena( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
398 download, "content-length", content_length, arena); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
399 return download; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
400 } |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
401 return json_response(arena, status_text, response_body); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
402 } |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
403 |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
404 #define OP_HANDLER(name, operation, method, path, resource, overwrite) \ |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
405 static Seobeo_Request_Entry *name( \ |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
406 Seobeo_Request_Entry *request, Dowa_Arena *arena) { \ |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
407 return execute_operation( \ |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
408 request, arena, operation, method, path, resource, overwrite); \ |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
409 } |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
410 |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
411 OP_HANDLER(Drive_List, CONNECTOR_OP_DRIVE_LIST, "GET", "/drive/v3/files", FALSE, FALSE) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
412 OP_HANDLER(Drive_Get, CONNECTOR_OP_DRIVE_GET, "GET", "/drive/v3/files", TRUE, FALSE) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
413 OP_HANDLER(Drive_Changes, CONNECTOR_OP_DRIVE_CHANGES, "GET", "/drive/v3/changes", FALSE, FALSE) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
414 OP_HANDLER(Drive_Create, CONNECTOR_OP_DRIVE_CREATE, "POST", "/drive/v3/files", FALSE, FALSE) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
415 OP_HANDLER(Drive_Upload, CONNECTOR_OP_DRIVE_UPLOAD, "POST", "/upload/drive/v3/files", FALSE, FALSE) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
416 OP_HANDLER(Drive_Update, CONNECTOR_OP_DRIVE_UPDATE, "PATCH", "/upload/drive/v3/files", TRUE, TRUE) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
417 OP_HANDLER(Gmail_List, CONNECTOR_OP_GMAIL_LIST, "GET", "/gmail/v1/users/me/messages", FALSE, FALSE) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
418 OP_HANDLER(Gmail_Get, CONNECTOR_OP_GMAIL_GET, "GET", "/gmail/v1/users/me/messages", TRUE, FALSE) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
419 OP_HANDLER(Gmail_History, CONNECTOR_OP_GMAIL_HISTORY, "GET", "/gmail/v1/users/me/history", FALSE, FALSE) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
420 OP_HANDLER(Gmail_Draft, CONNECTOR_OP_GMAIL_DRAFT_CREATE, "POST", "/gmail/v1/users/me/drafts", FALSE, FALSE) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
421 OP_HANDLER(Gmail_Send, CONNECTOR_OP_GMAIL_SEND, "POST", "/gmail/v1/users/me/messages/send", FALSE, FALSE) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
422 |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
423 static Seobeo_Request_Entry *Drive_Download( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
424 Seobeo_Request_Entry *request, Dowa_Arena *arena) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
425 { |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
426 Seobeo_Request_Entry *query = Dowa_HashMap_Get_Ptr(request, "QueryString"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
427 if (query && query->value && query->value[0]) { |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
428 size_t length = strlen(query->value) + 11; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
429 char *with_media = Dowa_Arena_Allocate(arena, length); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
430 snprintf(with_media, length, "%s&alt=media", query->value); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
431 query->value = with_media; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
432 } else |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
433 Dowa_HashMap_Push_Arena(request, "QueryString", "alt=media", arena); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
434 return execute_operation( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
435 request, arena, CONNECTOR_OP_DRIVE_DOWNLOAD, "GET", |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
436 "/drive/v3/files", TRUE, FALSE); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
437 } |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
438 |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
439 static Seobeo_Request_Entry *Gmail_Attachment( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
440 Seobeo_Request_Entry *request, Dowa_Arena *arena) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
441 { |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
442 const char *message = map_value(request, ":message_id"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
443 const char *attachment = map_value(request, ":resource_id"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
444 if (!safe_component(message) || !safe_component(attachment)) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
445 return json_response(arena, "400", "{\"error\":\"invalid_resource\"}"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
446 char path[512]; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
447 snprintf( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
448 path, sizeof(path), "/gmail/v1/users/me/messages/%s/attachments", |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
449 message); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
450 return execute_operation( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
451 request, arena, CONNECTOR_OP_GMAIL_ATTACHMENT, "GET", path, TRUE, FALSE); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
452 } |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
453 |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
454 static Seobeo_Request_Entry *Create_Confirmation( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
455 Seobeo_Request_Entry *request, Dowa_Arena *arena) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
456 { |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
457 const char *user = current_user(request, TRUE, arena); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
458 const char *body = map_value(request, "Body"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
459 if (!user) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
460 return json_response(arena, "401", "{\"error\":\"unauthorized\"}"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
461 if (!body || strlen(body) > 4096) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
462 return json_response(arena, "400", "{\"error\":\"invalid_body\"}"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
463 Dowa_JSON_Value parsed = Dowa_JSON_Parse(body, (int32)strlen(body), arena); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
464 if (parsed.type != DOWA_JSON_OBJECT) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
465 return json_response(arena, "400", "{\"error\":\"invalid_json\"}"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
466 char *digest = Dowa_JSON_Get_String(parsed.object_val, "request_digest"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
467 if (!digest || strlen(digest) != 64) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
468 return json_response(arena, "400", "{\"error\":\"invalid_digest\"}"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
469 Connector_OAuth_Start random; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
470 if (!Connector_OAuth_PKCE_Start(&random) || |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
471 !Connector_Store_Create_Confirmation( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
472 g_store, user, digest, random.state, (int64)time(NULL) + 300)) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
473 return json_response(arena, "500", "{\"error\":\"confirmation_failed\"}"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
474 char *response = Dowa_Arena_Allocate(arena, 180); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
475 snprintf( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
476 response, 180, "{\"confirmation_token\":\"%s\",\"expires_in\":300}", |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
477 random.state); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
478 return json_response(arena, "201", response); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
479 } |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
480 |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
481 static boolean configurable_confirmation_action(const char *action) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
482 { |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
483 return action && |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
484 (!strcmp(action, "gmail.send") || !strcmp(action, "drive.overwrite")); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
485 } |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
486 |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
487 static Seobeo_Request_Entry *Get_Confirmation_Policy( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
488 Seobeo_Request_Entry *request, Dowa_Arena *arena) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
489 { |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
490 const char *user = current_user(request, FALSE, arena); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
491 const char *action = map_value(request, ":action"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
492 if (!user) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
493 return json_response(arena, "401", "{\"error\":\"unauthorized\"}"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
494 if (!configurable_confirmation_action(action)) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
495 return json_response(arena, "400", "{\"error\":\"invalid_action\"}"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
496 Connector_Confirmation_Policy policy = |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
497 Connector_Store_Get_Policy(g_store, user, action); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
498 char *response = Dowa_Arena_Allocate(arena, 96); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
499 snprintf( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
500 response, 96, "{\"action\":\"%s\",\"policy\":\"%s\"}", |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
501 action, policy == CONNECTOR_CONFIRM_ALWAYS ? "always" : "never"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
502 return json_response(arena, "200", response); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
503 } |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
504 |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
505 static Seobeo_Request_Entry *Set_Confirmation_Policy( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
506 Seobeo_Request_Entry *request, Dowa_Arena *arena) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
507 { |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
508 const char *user = current_user(request, TRUE, arena); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
509 const char *action = map_value(request, ":action"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
510 const char *body = map_value(request, "Body"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
511 if (!user) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
512 return json_response(arena, "401", "{\"error\":\"unauthorized\"}"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
513 if (!configurable_confirmation_action(action)) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
514 return json_response(arena, "400", "{\"error\":\"invalid_action\"}"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
515 if (!body || strlen(body) > 256) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
516 return json_response(arena, "400", "{\"error\":\"invalid_body\"}"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
517 Dowa_JSON_Value parsed = Dowa_JSON_Parse(body, (int32)strlen(body), arena); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
518 if (parsed.type != DOWA_JSON_OBJECT) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
519 return json_response(arena, "400", "{\"error\":\"invalid_json\"}"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
520 const char *policy_text = |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
521 Dowa_JSON_Get_String(parsed.object_val, "policy"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
522 Connector_Confirmation_Policy policy; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
523 if (policy_text && !strcmp(policy_text, "always")) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
524 policy = CONNECTOR_CONFIRM_ALWAYS; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
525 else if (policy_text && !strcmp(policy_text, "never")) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
526 policy = CONNECTOR_CONFIRM_NEVER; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
527 else |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
528 return json_response(arena, "400", "{\"error\":\"invalid_policy\"}"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
529 if (!Connector_Store_Set_Policy(g_store, user, action, policy)) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
530 return json_response(arena, "500", "{\"error\":\"policy_save_failed\"}"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
531 return json_response(arena, "200", policy == CONNECTOR_CONFIRM_ALWAYS |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
532 ? "{\"policy\":\"always\"}" : "{\"policy\":\"never\"}"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
533 } |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
534 |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
535 static Seobeo_Request_Entry *Rejected_Mutation( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
536 Seobeo_Request_Entry *request, Dowa_Arena *arena) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
537 { |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
538 (void)request; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
539 return json_response( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
540 arena, "403", |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
541 "{\"error\":\"operation_not_allowed\",\"allowed_mutations\":[" |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
542 "\"drive.create\",\"drive.upload\",\"drive.update\"," |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
543 "\"gmail.draft.create\",\"gmail.send\"]}"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
544 } |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
545 |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
546 void Connector_Service_Configure( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
547 Connector_Store *store, const Connector_Google_Config *google, |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
548 Connector_Auth_Adapter auth) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
549 { |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
550 g_store = store; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
551 g_google = google; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
552 g_auth = auth; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
553 } |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
554 |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
555 void Connector_Service_Register_Routes(void) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
556 { |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
557 Seobeo_Router_Register("GET", "/health", Health); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
558 Seobeo_Router_Register("GET", "/auth-test.html", Auth_Test_Page); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
559 Seobeo_Router_Register("GET", "/v1/ai/tools", AI_Tools); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
560 Seobeo_Router_Register("GET", "/v1/auth/session", Auth_Session); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
561 Seobeo_Router_Register("GET", "/v1/accounts", List_Accounts); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
562 Seobeo_Router_Register("POST", "/v1/oauth/google/start", OAuth_Start); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
563 Seobeo_Router_Register("GET", "/v1/oauth/google/callback", OAuth_Callback); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
564 Seobeo_Router_Register("DELETE", "/v1/accounts/:account_id", Disconnect); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
565 Seobeo_Router_Register("POST", "/v1/confirmations", Create_Confirmation); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
566 Seobeo_Router_Register( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
567 "GET", "/v1/settings/confirmations/:action", |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
568 Get_Confirmation_Policy); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
569 Seobeo_Router_Register( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
570 "PUT", "/v1/settings/confirmations/:action", |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
571 Set_Confirmation_Policy); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
572 Seobeo_Router_Register("GET", "/v1/accounts/:account_id/drive/files", Drive_List); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
573 Seobeo_Router_Register("GET", "/v1/accounts/:account_id/drive/files/:resource_id", Drive_Get); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
574 Seobeo_Router_Register("GET", "/v1/accounts/:account_id/drive/files/:resource_id/download", Drive_Download); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
575 Seobeo_Router_Register("GET", "/v1/accounts/:account_id/drive/changes", Drive_Changes); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
576 Seobeo_Router_Register("POST", "/v1/accounts/:account_id/drive/files", Drive_Create); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
577 Seobeo_Router_Register("POST", "/v1/accounts/:account_id/drive/uploads", Drive_Upload); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
578 Seobeo_Router_Register("PATCH", "/v1/accounts/:account_id/drive/files/:resource_id", Drive_Update); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
579 Seobeo_Router_Register("DELETE", "/v1/accounts/:account_id/drive/files/:resource_id", Rejected_Mutation); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
580 Seobeo_Router_Register("POST", "/v1/accounts/:account_id/drive/files/:resource_id/permissions", Rejected_Mutation); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
581 Seobeo_Router_Register("GET", "/v1/accounts/:account_id/gmail/messages", Gmail_List); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
582 Seobeo_Router_Register("GET", "/v1/accounts/:account_id/gmail/messages/:resource_id", Gmail_Get); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
583 Seobeo_Router_Register("GET", "/v1/accounts/:account_id/gmail/messages/:message_id/attachments/:resource_id", Gmail_Attachment); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
584 Seobeo_Router_Register("GET", "/v1/accounts/:account_id/gmail/history", Gmail_History); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
585 Seobeo_Router_Register("POST", "/v1/accounts/:account_id/gmail/drafts", Gmail_Draft); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
586 Seobeo_Router_Register("POST", "/v1/accounts/:account_id/gmail/send", Gmail_Send); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
587 Seobeo_Router_Register("DELETE", "/v1/accounts/:account_id/gmail/messages/:resource_id", Rejected_Mutation); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
588 Seobeo_Router_Register("PATCH", "/v1/accounts/:account_id/gmail/messages/:resource_id/labels", Rejected_Mutation); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
589 Seobeo_Router_Register("PATCH", "/v1/accounts/:account_id/gmail/messages/:resource_id/read-state", Rejected_Mutation); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
590 } |