Mercurial
annotate auth/test/auth_http_test.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 "auth/auth_http.h" |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
2 |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
3 #include <assert.h> |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
4 #include <stdio.h> |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
5 #include <string.h> |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
6 #include <time.h> |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
7 #include <unistd.h> |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
8 |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
9 static const uint8 k_secret[] = |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
10 "0123456789abcdef0123456789abcdef"; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
11 |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
12 static Seobeo_Request_Entry *make_request( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
13 Dowa_Arena *p_arena, |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
14 const char *host, |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
15 const char *origin, |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
16 const char *cookie, |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
17 const char *csrf) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
18 { |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
19 Seobeo_Request_Entry *request = NULL; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
20 if (host) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
21 Dowa_HashMap_Push_Arena(request, "Host", (char *)host, p_arena); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
22 if (origin) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
23 Dowa_HashMap_Push_Arena(request, "Origin", (char *)origin, p_arena); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
24 if (cookie) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
25 Dowa_HashMap_Push_Arena(request, "Cookie", (char *)cookie, p_arena); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
26 if (csrf) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
27 Dowa_HashMap_Push_Arena( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
28 request, "X-CSRF-Token", (char *)csrf, p_arena); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
29 return request; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
30 } |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
31 |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
32 int main(void) |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
33 { |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
34 Dowa_Arena *p_arena = Dowa_Arena_Create(16 * 1024); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
35 assert(p_arena); |
|
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 char cookie_value[16]; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
38 assert(Auth_HTTP_Parse_Cookie( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
39 "other=x; mjj_session=token; final=y", |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
40 AUTH_HTTP_SESSION_COOKIE_NAME, cookie_value, sizeof(cookie_value))); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
41 assert(strcmp(cookie_value, "token") == 0); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
42 assert(!Auth_HTTP_Parse_Cookie( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
43 "not_mjj_session=token", AUTH_HTTP_SESSION_COOKIE_NAME, |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
44 cookie_value, sizeof(cookie_value))); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
45 |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
46 Seobeo_Request_Entry *same_origin = make_request( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
47 p_arena, "localhost:6969", "http://localhost:6969", NULL, NULL); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
48 Seobeo_Request_Entry *wrong_origin = make_request( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
49 p_arena, "localhost:6969", "https://example.com", NULL, NULL); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
50 assert(Auth_HTTP_Same_Origin(same_origin)); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
51 assert(!Auth_HTTP_Same_Origin(wrong_origin)); |
|
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 char csrf[AUTH_CRYPTO_TOKEN_SIZE] = {0}; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
54 assert(Auth_HTTP_Derive_CSRF( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
55 k_secret, sizeof(k_secret) - 1, "binding", csrf, sizeof(csrf))); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
56 Seobeo_Request_Entry *csrf_request = make_request( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
57 p_arena, "localhost", "https://localhost", NULL, csrf); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
58 assert(Auth_HTTP_Verify_CSRF( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
59 csrf_request, k_secret, sizeof(k_secret) - 1, "binding")); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
60 assert(!Auth_HTTP_Verify_CSRF_Token( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
61 k_secret, sizeof(k_secret) - 1, "binding", "wrong-token")); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
62 assert(!Auth_HTTP_Verify_CSRF( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
63 wrong_origin, k_secret, sizeof(k_secret) - 1, "binding")); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
64 |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
65 char database_path[256]; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
66 snprintf(database_path, sizeof(database_path), |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
67 "auth_http_test_%ld_%ld.db", (long)getpid(), (long)time(NULL)); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
68 unlink(database_path); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
69 Auth_Store *p_store = Auth_Store_Create(database_path); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
70 assert(p_store); |
|
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 char password_hash[AUTH_CRYPTO_PASSWORD_HASH_ENCODED_SIZE]; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
73 assert(Auth_Crypto_Password_Hash( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
74 "test-password", password_hash, sizeof(password_hash)) == |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
75 AUTH_CRYPTO_OK); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
76 char user_id[37]; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
77 assert(Auth_Store_Create_User( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
78 p_store, "httpuser", password_hash, "member", FALSE, user_id) == |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
79 AUTH_STORE_OK); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
80 |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
81 char token[AUTH_CRYPTO_TOKEN_SIZE]; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
82 char token_digest[AUTH_CRYPTO_TOKEN_DIGEST_SIZE]; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
83 char stored_csrf_digest[AUTH_CRYPTO_TOKEN_DIGEST_SIZE]; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
84 assert(Auth_Crypto_Token_Generate(token, sizeof(token)) == AUTH_CRYPTO_OK); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
85 assert(Auth_Crypto_Token_Digest( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
86 token, token_digest, sizeof(token_digest)) == AUTH_CRYPTO_OK); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
87 assert(Auth_Crypto_Token_Digest( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
88 csrf, stored_csrf_digest, sizeof(stored_csrf_digest)) == AUTH_CRYPTO_OK); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
89 int64 now = (int64)time(NULL); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
90 Auth_Session_Record session; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
91 assert(Auth_Store_Create_Session( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
92 p_store, user_id, token_digest, stored_csrf_digest, |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
93 3600, 86400, now, &session) == AUTH_STORE_OK); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
94 |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
95 char cookie_header[AUTH_CRYPTO_TOKEN_SIZE + 32]; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
96 snprintf(cookie_header, sizeof(cookie_header), "%s=%s", |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
97 AUTH_HTTP_SESSION_COOKIE_NAME, token); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
98 Seobeo_Request_Entry *user_request = make_request( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
99 p_arena, "localhost", NULL, cookie_header, NULL); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
100 Auth_HTTP_Authenticated_User user; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
101 assert(Auth_HTTP_Resolve_Authenticated_User( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
102 user_request, p_store, k_secret, sizeof(k_secret) - 1, |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
103 now + 1, 3600, &user) == AUTH_HTTP_RESOLVE_OK); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
104 assert(strcmp(user.user.id, user_id) == 0); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
105 assert(strcmp(user.token_digest, token_digest) == 0); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
106 assert(user.csrf_token[0] != '\0'); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
107 assert(Auth_Store_Revoke_Session(p_store, token_digest) == AUTH_STORE_OK); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
108 assert(Auth_HTTP_Resolve_Authenticated_User( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
109 user_request, p_store, k_secret, sizeof(k_secret) - 1, |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
110 now + 2, 3600, &user) == AUTH_HTTP_RESOLVE_NOT_FOUND); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
111 |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
112 Seobeo_Request_Entry *anonymous_request = make_request( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
113 p_arena, "localhost", NULL, NULL, NULL); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
114 assert(Auth_HTTP_Resolve_Authenticated_User( |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
115 anonymous_request, p_store, k_secret, sizeof(k_secret) - 1, |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
116 now + 1, 3600, &user) == AUTH_HTTP_RESOLVE_NOT_FOUND); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
117 |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
118 Auth_Store_Destroy(p_store); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
119 unlink(database_path); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
120 Dowa_Arena_Free(p_arena); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
121 puts("auth_http_test: PASS"); |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
122 return 0; |
|
b3b547563ec7
Add Google connector service and agent wiki
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
123 } |