Mercurial
annotate s3/s3_uploader.c @ 196:83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
| author | MrJuneJune <me@mrjunejune.com> |
|---|---|
| date | Sat, 14 Feb 2026 16:08:15 -0800 |
| parents | |
| children | 6cdee35a7ba9 |
| rev | line source |
|---|---|
|
196
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
1 #include "s3_uploader.h" |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
2 #include "seobeo/seobeo.h" |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
3 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
4 #include <stdio.h> |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
5 #include <stdlib.h> |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
6 #include <string.h> |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
7 #include <time.h> |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
8 #include <ctype.h> |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
9 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
10 #include <openssl/hmac.h> |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
11 #include <openssl/sha.h> |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
12 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
13 #define S3_ARENA_SIZE (10 * ONE_MEGA_BYTE) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
14 #define S3_RESULT_ARENA_SIZE (64 * 1024) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
15 #define S3_SERVICE_NAME "s3" |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
16 #define S3_AWS4_REQUEST "aws4_request" |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
17 #define S3_ALGORITHM "AWS4-HMAC-SHA256" |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
18 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
19 // --- Internal Structures --- // |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
20 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
21 typedef struct { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
22 char date[9]; // YYYYMMDD |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
23 char datetime[17]; // YYYYMMDDTHHMMSSZ |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
24 } S3_Timestamp; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
25 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
26 // --- Forward Declarations --- // |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
27 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
28 static void s3__get_timestamp(S3_Timestamp *p_ts); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
29 static void s3__sha256_hex(const uint8 *data, size_t len, char *out); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
30 static void s3__hmac_sha256(const uint8 *key, size_t key_len, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
31 const uint8 *data, size_t data_len, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
32 uint8 *out); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
33 static void s3__hex_encode(const uint8 *data, size_t len, char *out); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
34 static char *s3__uri_encode(const char *str, Dowa_Arena *p_arena); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
35 static char *s3__build_canonical_request(const char *method, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
36 const char *uri, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
37 const char *query, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
38 const char *headers, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
39 const char *signed_headers, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
40 const char *payload_hash, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
41 Dowa_Arena *p_arena); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
42 static char *s3__build_string_to_sign(const char *datetime, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
43 const char *date, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
44 const char *region, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
45 const char *canonical_request, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
46 Dowa_Arena *p_arena); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
47 static void s3__calculate_signing_key(const char *secret_key, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
48 const char *date, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
49 const char *region, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
50 uint8 *out); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
51 static char *s3__build_authorization_header(const char *access_key, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
52 const char *date, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
53 const char *region, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
54 const char *signed_headers, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
55 const uint8 *signing_key, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
56 const char *string_to_sign, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
57 Dowa_Arena *p_arena); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
58 static uint8 *s3__load_file(const char *path, size_t *p_size); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
59 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
60 // --- Public API Implementation --- // |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
61 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
62 S3_Result S3_Upload_File(const S3_Config *p_config, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
63 const char *local_path, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
64 const char *s3_key) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
65 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
66 const char *content_type = S3_Guess_Content_Type(local_path); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
67 return S3_Upload_File_With_Content_Type(p_config, local_path, s3_key, content_type); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
68 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
69 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
70 S3_Result S3_Upload_File_With_Content_Type(const S3_Config *p_config, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
71 const char *local_path, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
72 const char *s3_key, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
73 const char *content_type) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
74 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
75 S3_Result result = {0}; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
76 result.p_arena = Dowa_Arena_Create(S3_RESULT_ARENA_SIZE); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
77 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
78 size_t file_size = 0; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
79 uint8 *file_data = s3__load_file(local_path, &file_size); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
80 if (!file_data) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
81 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
82 result.success = FALSE; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
83 result.status_code = 0; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
84 result.error_message = Dowa_String_Copy_Arena("Failed to read file", result.p_arena); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
85 return result; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
86 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
87 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
88 result = S3_Upload_Data(p_config, file_data, file_size, s3_key, content_type); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
89 free(file_data); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
90 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
91 return result; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
92 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
93 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
94 S3_Result S3_Upload_Data(const S3_Config *p_config, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
95 const uint8 *data, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
96 size_t data_length, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
97 const char *s3_key, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
98 const char *content_type) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
99 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
100 S3_Result result = {0}; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
101 result.p_arena = Dowa_Arena_Create(S3_RESULT_ARENA_SIZE); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
102 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
103 if (!p_config || !data || !s3_key) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
104 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
105 result.success = FALSE; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
106 result.error_message = Dowa_String_Copy_Arena("Invalid parameters", result.p_arena); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
107 return result; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
108 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
109 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
110 Dowa_Arena *p_arena = Dowa_Arena_Create(S3_ARENA_SIZE); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
111 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
112 // Get timestamp |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
113 S3_Timestamp ts; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
114 s3__get_timestamp(&ts); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
115 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
116 // Calculate payload hash |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
117 char payload_hash[65]; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
118 s3__sha256_hex(data, data_length, payload_hash); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
119 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
120 // Build host |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
121 char *host; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
122 if (p_config->endpoint) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
123 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
124 host = Dowa_String_Copy_Arena((char *)p_config->endpoint, p_arena); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
125 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
126 else if (p_config->use_path_style) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
127 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
128 size_t host_len = strlen("s3.") + strlen(p_config->region) + strlen(".amazonaws.com") + 1; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
129 host = Dowa_Arena_Allocate(p_arena, host_len); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
130 snprintf(host, host_len, "s3.%s.amazonaws.com", p_config->region); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
131 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
132 else |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
133 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
134 size_t host_len = strlen(p_config->bucket) + strlen(".s3.") + strlen(p_config->region) + strlen(".amazonaws.com") + 1; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
135 host = Dowa_Arena_Allocate(p_arena, host_len); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
136 snprintf(host, host_len, "%s.s3.%s.amazonaws.com", p_config->bucket, p_config->region); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
137 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
138 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
139 // Build URI path |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
140 char *uri_path; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
141 char *encoded_key = s3__uri_encode(s3_key, p_arena); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
142 if (p_config->use_path_style) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
143 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
144 size_t uri_len = strlen("/") + strlen(p_config->bucket) + strlen("/") + strlen(encoded_key) + 1; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
145 uri_path = Dowa_Arena_Allocate(p_arena, uri_len); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
146 snprintf(uri_path, uri_len, "/%s/%s", p_config->bucket, encoded_key); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
147 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
148 else |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
149 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
150 size_t uri_len = strlen("/") + strlen(encoded_key) + 1; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
151 uri_path = Dowa_Arena_Allocate(p_arena, uri_len); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
152 snprintf(uri_path, uri_len, "/%s", encoded_key); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
153 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
154 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
155 // Build canonical headers (must be sorted alphabetically) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
156 char content_length_str[32]; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
157 snprintf(content_length_str, sizeof(content_length_str), "%zu", data_length); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
158 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
159 size_t headers_len = 512 + strlen(host) + strlen(content_type) + strlen(content_length_str); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
160 char *canonical_headers = Dowa_Arena_Allocate(p_arena, headers_len); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
161 snprintf(canonical_headers, headers_len, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
162 "content-length:%s\n" |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
163 "content-type:%s\n" |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
164 "host:%s\n" |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
165 "x-amz-content-sha256:%s\n" |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
166 "x-amz-date:%s\n", |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
167 content_length_str, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
168 content_type, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
169 host, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
170 payload_hash, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
171 ts.datetime); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
172 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
173 const char *signed_headers = "content-length;content-type;host;x-amz-content-sha256;x-amz-date"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
174 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
175 // Build canonical request |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
176 char *canonical_request = s3__build_canonical_request("PUT", |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
177 uri_path, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
178 "", // No query string |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
179 canonical_headers, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
180 signed_headers, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
181 payload_hash, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
182 p_arena); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
183 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
184 // Build string to sign |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
185 char *string_to_sign = s3__build_string_to_sign(ts.datetime, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
186 ts.date, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
187 p_config->region, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
188 canonical_request, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
189 p_arena); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
190 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
191 // Calculate signing key |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
192 uint8 signing_key[32]; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
193 s3__calculate_signing_key(p_config->secret_access_key, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
194 ts.date, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
195 p_config->region, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
196 signing_key); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
197 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
198 // Build authorization header |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
199 char *auth_header = s3__build_authorization_header(p_config->access_key_id, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
200 ts.date, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
201 p_config->region, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
202 signed_headers, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
203 signing_key, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
204 string_to_sign, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
205 p_arena); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
206 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
207 // Build URL |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
208 size_t url_len = strlen("https://") + strlen(host) + strlen(uri_path) + 1; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
209 char *url = Dowa_Arena_Allocate(p_arena, url_len); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
210 snprintf(url, url_len, "https://%s%s", host, uri_path); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
211 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
212 // Execute request using seobeo |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
213 Seobeo_Client_Request *p_req = Seobeo_Client_Request_Create(url); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
214 Seobeo_Client_Request_Set_Method(p_req, "PUT"); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
215 Seobeo_Client_Request_Set_Body(p_req, (const char *)data, data_length); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
216 Seobeo_Client_Request_Add_Header_Map(p_req, "Content-Type", content_type); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
217 Seobeo_Client_Request_Add_Header_Map(p_req, "x-amz-date", ts.datetime); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
218 Seobeo_Client_Request_Add_Header_Map(p_req, "x-amz-content-sha256", payload_hash); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
219 Seobeo_Client_Request_Add_Header_Map(p_req, "Authorization", auth_header); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
220 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
221 Seobeo_Client_Response *p_resp = Seobeo_Client_Request_Execute(p_req); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
222 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
223 if (p_resp) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
224 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
225 result.status_code = p_resp->status_code; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
226 if (p_resp->status_code >= 200 && p_resp->status_code < 300) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
227 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
228 result.success = TRUE; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
229 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
230 // Extract ETag from response headers |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
231 if (p_resp->headers) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
232 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
233 char *etag = Dowa_HashMap_Get(p_resp->headers, "etag"); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
234 if (!etag) etag = Dowa_HashMap_Get(p_resp->headers, "ETag"); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
235 if (etag) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
236 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
237 result.etag = Dowa_String_Copy_Arena(etag, result.p_arena); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
238 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
239 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
240 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
241 else |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
242 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
243 result.success = FALSE; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
244 if (p_resp->body && p_resp->body_length > 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
245 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
246 result.error_message = Dowa_String_Copy_Arena(p_resp->body, result.p_arena); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
247 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
248 else |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
249 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
250 result.error_message = Dowa_String_Copy_Arena("Upload failed", result.p_arena); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
251 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
252 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
253 Seobeo_Client_Response_Destroy(p_resp); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
254 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
255 else |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
256 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
257 result.success = FALSE; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
258 result.error_message = Dowa_String_Copy_Arena("Failed to execute request", result.p_arena); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
259 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
260 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
261 Seobeo_Client_Request_Destroy(p_req); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
262 Dowa_Arena_Free(p_arena); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
263 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
264 return result; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
265 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
266 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
267 void S3_Result_Destroy(S3_Result *p_result) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
268 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
269 if (p_result && p_result->p_arena) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
270 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
271 Dowa_Arena_Free(p_result->p_arena); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
272 p_result->p_arena = NULL; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
273 p_result->error_message = NULL; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
274 p_result->etag = NULL; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
275 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
276 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
277 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
278 // --- Presigned URL Implementation --- // |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
279 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
280 static char *s3__uri_encode_strict(const char *str, Dowa_Arena *p_arena) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
281 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
282 // Stricter encoding for query string values (no forward slash allowed) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
283 if (!str) return NULL; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
284 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
285 size_t len = strlen(str); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
286 size_t max_len = len * 3 + 1; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
287 char *out = Dowa_Arena_Allocate(p_arena, max_len); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
288 char *p = out; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
289 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
290 for (size_t i = 0; i < len; i++) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
291 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
292 char c = str[i]; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
293 if ((c >= 'A' && c <= 'Z') || |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
294 (c >= 'a' && c <= 'z') || |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
295 (c >= '0' && c <= '9') || |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
296 c == '-' || c == '_' || c == '.' || c == '~') |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
297 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
298 *p++ = c; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
299 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
300 else |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
301 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
302 sprintf(p, "%%%02X", (unsigned char)c); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
303 p += 3; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
304 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
305 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
306 *p = '\0'; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
307 return out; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
308 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
309 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
310 static S3_Presigned_URL s3__presign_url(const S3_Config *p_config, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
311 const char *s3_key, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
312 const char *method, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
313 const char *content_type, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
314 int32 expires_seconds) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
315 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
316 S3_Presigned_URL result = {0}; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
317 result.p_arena = Dowa_Arena_Create(S3_RESULT_ARENA_SIZE); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
318 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
319 if (!p_config || !s3_key) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
320 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
321 result.success = FALSE; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
322 result.error_message = Dowa_String_Copy_Arena("Invalid parameters", result.p_arena); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
323 return result; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
324 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
325 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
326 Dowa_Arena *p_arena = Dowa_Arena_Create(S3_ARENA_SIZE); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
327 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
328 // Get timestamp |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
329 S3_Timestamp ts; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
330 s3__get_timestamp(&ts); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
331 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
332 // Build host |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
333 char *host; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
334 if (p_config->endpoint) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
335 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
336 host = Dowa_String_Copy_Arena((char *)p_config->endpoint, p_arena); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
337 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
338 else if (p_config->use_path_style) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
339 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
340 size_t host_len = strlen("s3.") + strlen(p_config->region) + strlen(".amazonaws.com") + 1; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
341 host = Dowa_Arena_Allocate(p_arena, host_len); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
342 snprintf(host, host_len, "s3.%s.amazonaws.com", p_config->region); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
343 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
344 else |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
345 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
346 size_t host_len = strlen(p_config->bucket) + strlen(".s3.") + strlen(p_config->region) + strlen(".amazonaws.com") + 1; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
347 host = Dowa_Arena_Allocate(p_arena, host_len); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
348 snprintf(host, host_len, "%s.s3.%s.amazonaws.com", p_config->bucket, p_config->region); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
349 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
350 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
351 // Build URI path |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
352 char *uri_path; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
353 char *encoded_key = s3__uri_encode(s3_key, p_arena); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
354 if (p_config->use_path_style) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
355 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
356 size_t uri_len = strlen("/") + strlen(p_config->bucket) + strlen("/") + strlen(encoded_key) + 1; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
357 uri_path = Dowa_Arena_Allocate(p_arena, uri_len); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
358 snprintf(uri_path, uri_len, "/%s/%s", p_config->bucket, encoded_key); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
359 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
360 else |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
361 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
362 size_t uri_len = strlen("/") + strlen(encoded_key) + 1; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
363 uri_path = Dowa_Arena_Allocate(p_arena, uri_len); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
364 snprintf(uri_path, uri_len, "/%s", encoded_key); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
365 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
366 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
367 // Build credential scope |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
368 size_t scope_len = strlen(p_config->access_key_id) + strlen(ts.date) + strlen(p_config->region) + |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
369 strlen(S3_SERVICE_NAME) + strlen(S3_AWS4_REQUEST) + 10; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
370 char *credential = Dowa_Arena_Allocate(p_arena, scope_len); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
371 snprintf(credential, scope_len, "%s/%s/%s/%s/%s", |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
372 p_config->access_key_id, ts.date, p_config->region, S3_SERVICE_NAME, S3_AWS4_REQUEST); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
373 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
374 char *encoded_credential = s3__uri_encode_strict(credential, p_arena); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
375 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
376 // Build signed headers (host is required, content-type for PUT) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
377 const char *signed_headers; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
378 if (content_type && strcmp(method, "PUT") == 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
379 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
380 signed_headers = "content-type;host"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
381 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
382 else |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
383 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
384 signed_headers = "host"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
385 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
386 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
387 // Build canonical query string (must be sorted alphabetically) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
388 char expires_str[16]; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
389 snprintf(expires_str, sizeof(expires_str), "%d", expires_seconds); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
390 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
391 size_t query_len = 1024 + strlen(encoded_credential); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
392 char *canonical_query = Dowa_Arena_Allocate(p_arena, query_len); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
393 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
394 if (content_type && strcmp(method, "PUT") == 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
395 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
396 char *encoded_content_type = s3__uri_encode_strict(content_type, p_arena); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
397 snprintf(canonical_query, query_len, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
398 "X-Amz-Algorithm=%s" |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
399 "&X-Amz-Credential=%s" |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
400 "&X-Amz-Date=%s" |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
401 "&X-Amz-Expires=%s" |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
402 "&X-Amz-SignedHeaders=%s" |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
403 "&x-amz-content-type=%s", |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
404 S3_ALGORITHM, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
405 encoded_credential, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
406 ts.datetime, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
407 expires_str, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
408 signed_headers, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
409 encoded_content_type); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
410 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
411 else |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
412 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
413 snprintf(canonical_query, query_len, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
414 "X-Amz-Algorithm=%s" |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
415 "&X-Amz-Credential=%s" |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
416 "&X-Amz-Date=%s" |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
417 "&X-Amz-Expires=%s" |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
418 "&X-Amz-SignedHeaders=%s", |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
419 S3_ALGORITHM, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
420 encoded_credential, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
421 ts.datetime, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
422 expires_str, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
423 signed_headers); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
424 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
425 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
426 // Build canonical headers |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
427 size_t headers_len = 256 + strlen(host) + (content_type ? strlen(content_type) : 0); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
428 char *canonical_headers = Dowa_Arena_Allocate(p_arena, headers_len); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
429 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
430 if (content_type && strcmp(method, "PUT") == 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
431 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
432 snprintf(canonical_headers, headers_len, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
433 "content-type:%s\nhost:%s\n", |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
434 content_type, host); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
435 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
436 else |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
437 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
438 snprintf(canonical_headers, headers_len, "host:%s\n", host); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
439 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
440 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
441 // For presigned URLs, payload is UNSIGNED-PAYLOAD |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
442 const char *payload_hash = "UNSIGNED-PAYLOAD"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
443 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
444 // Build canonical request |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
445 char *canonical_request = s3__build_canonical_request(method, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
446 uri_path, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
447 canonical_query, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
448 canonical_headers, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
449 signed_headers, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
450 payload_hash, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
451 p_arena); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
452 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
453 // Build string to sign |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
454 char *string_to_sign = s3__build_string_to_sign(ts.datetime, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
455 ts.date, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
456 p_config->region, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
457 canonical_request, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
458 p_arena); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
459 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
460 // Calculate signing key |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
461 uint8 signing_key[32]; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
462 s3__calculate_signing_key(p_config->secret_access_key, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
463 ts.date, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
464 p_config->region, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
465 signing_key); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
466 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
467 // Calculate signature |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
468 uint8 signature[32]; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
469 s3__hmac_sha256(signing_key, 32, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
470 (const uint8 *)string_to_sign, strlen(string_to_sign), |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
471 signature); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
472 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
473 char signature_hex[65]; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
474 s3__hex_encode(signature, 32, signature_hex); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
475 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
476 // Build final presigned URL |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
477 size_t url_len = strlen("https://") + strlen(host) + strlen(uri_path) + 1 + |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
478 strlen(canonical_query) + strlen("&X-Amz-Signature=") + 64 + 1; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
479 char *url = Dowa_Arena_Allocate(result.p_arena, url_len); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
480 snprintf(url, url_len, "https://%s%s?%s&X-Amz-Signature=%s", |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
481 host, uri_path, canonical_query, signature_hex); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
482 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
483 result.success = TRUE; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
484 result.url = url; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
485 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
486 Dowa_Arena_Free(p_arena); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
487 return result; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
488 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
489 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
490 S3_Presigned_URL S3_Presign_Put(const S3_Config *p_config, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
491 const char *s3_key, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
492 const char *content_type, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
493 int32 expires_seconds) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
494 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
495 return s3__presign_url(p_config, s3_key, "PUT", content_type, expires_seconds); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
496 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
497 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
498 S3_Presigned_URL S3_Presign_Get(const S3_Config *p_config, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
499 const char *s3_key, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
500 int32 expires_seconds) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
501 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
502 return s3__presign_url(p_config, s3_key, "GET", NULL, expires_seconds); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
503 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
504 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
505 void S3_Presigned_URL_Destroy(S3_Presigned_URL *p_url) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
506 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
507 if (p_url && p_url->p_arena) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
508 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
509 Dowa_Arena_Free(p_url->p_arena); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
510 p_url->p_arena = NULL; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
511 p_url->url = NULL; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
512 p_url->error_message = NULL; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
513 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
514 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
515 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
516 const char *S3_Guess_Content_Type(const char *filename) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
517 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
518 if (!filename) return "application/octet-stream"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
519 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
520 const char *dot = strrchr(filename, '.'); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
521 if (!dot) return "application/octet-stream"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
522 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
523 dot++; // Skip the dot |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
524 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
525 // Common content types |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
526 if (strcasecmp(dot, "html") == 0 || strcasecmp(dot, "htm") == 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
527 return "text/html"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
528 if (strcasecmp(dot, "css") == 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
529 return "text/css"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
530 if (strcasecmp(dot, "js") == 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
531 return "application/javascript"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
532 if (strcasecmp(dot, "json") == 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
533 return "application/json"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
534 if (strcasecmp(dot, "xml") == 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
535 return "application/xml"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
536 if (strcasecmp(dot, "txt") == 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
537 return "text/plain"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
538 if (strcasecmp(dot, "csv") == 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
539 return "text/csv"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
540 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
541 // Images |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
542 if (strcasecmp(dot, "png") == 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
543 return "image/png"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
544 if (strcasecmp(dot, "jpg") == 0 || strcasecmp(dot, "jpeg") == 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
545 return "image/jpeg"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
546 if (strcasecmp(dot, "gif") == 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
547 return "image/gif"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
548 if (strcasecmp(dot, "svg") == 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
549 return "image/svg+xml"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
550 if (strcasecmp(dot, "webp") == 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
551 return "image/webp"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
552 if (strcasecmp(dot, "ico") == 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
553 return "image/x-icon"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
554 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
555 // Audio/Video |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
556 if (strcasecmp(dot, "mp3") == 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
557 return "audio/mpeg"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
558 if (strcasecmp(dot, "mp4") == 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
559 return "video/mp4"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
560 if (strcasecmp(dot, "webm") == 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
561 return "video/webm"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
562 if (strcasecmp(dot, "ogg") == 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
563 return "audio/ogg"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
564 if (strcasecmp(dot, "wav") == 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
565 return "audio/wav"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
566 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
567 // Documents |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
568 if (strcasecmp(dot, "pdf") == 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
569 return "application/pdf"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
570 if (strcasecmp(dot, "zip") == 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
571 return "application/zip"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
572 if (strcasecmp(dot, "gz") == 0 || strcasecmp(dot, "gzip") == 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
573 return "application/gzip"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
574 if (strcasecmp(dot, "tar") == 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
575 return "application/x-tar"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
576 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
577 // Fonts |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
578 if (strcasecmp(dot, "woff") == 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
579 return "font/woff"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
580 if (strcasecmp(dot, "woff2") == 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
581 return "font/woff2"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
582 if (strcasecmp(dot, "ttf") == 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
583 return "font/ttf"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
584 if (strcasecmp(dot, "otf") == 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
585 return "font/otf"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
586 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
587 return "application/octet-stream"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
588 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
589 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
590 // --- Internal Implementation --- // |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
591 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
592 static void s3__get_timestamp(S3_Timestamp *p_ts) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
593 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
594 time_t now = time(NULL); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
595 struct tm *utc = gmtime(&now); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
596 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
597 strftime(p_ts->date, sizeof(p_ts->date), "%Y%m%d", utc); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
598 strftime(p_ts->datetime, sizeof(p_ts->datetime), "%Y%m%dT%H%M%SZ", utc); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
599 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
600 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
601 static void s3__hex_encode(const uint8 *data, size_t len, char *out) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
602 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
603 static const char hex[] = "0123456789abcdef"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
604 for (size_t i = 0; i < len; i++) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
605 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
606 out[i * 2] = hex[(data[i] >> 4) & 0x0F]; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
607 out[i * 2 + 1] = hex[data[i] & 0x0F]; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
608 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
609 out[len * 2] = '\0'; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
610 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
611 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
612 static void s3__sha256_hex(const uint8 *data, size_t len, char *out) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
613 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
614 uint8 hash[SHA256_DIGEST_LENGTH]; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
615 SHA256(data, len, hash); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
616 s3__hex_encode(hash, SHA256_DIGEST_LENGTH, out); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
617 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
618 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
619 static void s3__hmac_sha256(const uint8 *key, size_t key_len, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
620 const uint8 *data, size_t data_len, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
621 uint8 *out) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
622 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
623 unsigned int out_len = 0; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
624 HMAC(EVP_sha256(), key, (int)key_len, data, data_len, out, &out_len); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
625 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
626 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
627 static char *s3__uri_encode(const char *str, Dowa_Arena *p_arena) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
628 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
629 if (!str) return NULL; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
630 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
631 size_t len = strlen(str); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
632 // Worst case: every char becomes %XX (3 chars) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
633 size_t max_len = len * 3 + 1; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
634 char *out = Dowa_Arena_Allocate(p_arena, max_len); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
635 char *p = out; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
636 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
637 for (size_t i = 0; i < len; i++) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
638 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
639 char c = str[i]; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
640 // Unreserved characters per RFC 3986 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
641 if ((c >= 'A' && c <= 'Z') || |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
642 (c >= 'a' && c <= 'z') || |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
643 (c >= '0' && c <= '9') || |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
644 c == '-' || c == '_' || c == '.' || c == '~' || c == '/') |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
645 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
646 *p++ = c; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
647 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
648 else |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
649 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
650 sprintf(p, "%%%02X", (unsigned char)c); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
651 p += 3; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
652 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
653 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
654 *p = '\0'; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
655 return out; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
656 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
657 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
658 static char *s3__build_canonical_request(const char *method, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
659 const char *uri, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
660 const char *query, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
661 const char *headers, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
662 const char *signed_headers, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
663 const char *payload_hash, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
664 Dowa_Arena *p_arena) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
665 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
666 size_t len = strlen(method) + strlen(uri) + strlen(query) + |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
667 strlen(headers) + strlen(signed_headers) + strlen(payload_hash) + 10; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
668 char *out = Dowa_Arena_Allocate(p_arena, len); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
669 snprintf(out, len, "%s\n%s\n%s\n%s\n%s\n%s", |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
670 method, uri, query, headers, signed_headers, payload_hash); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
671 return out; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
672 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
673 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
674 static char *s3__build_string_to_sign(const char *datetime, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
675 const char *date, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
676 const char *region, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
677 const char *canonical_request, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
678 Dowa_Arena *p_arena) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
679 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
680 // Hash the canonical request |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
681 char canonical_hash[65]; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
682 s3__sha256_hex((const uint8 *)canonical_request, strlen(canonical_request), canonical_hash); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
683 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
684 // Build credential scope |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
685 size_t scope_len = strlen(date) + strlen(region) + strlen(S3_SERVICE_NAME) + strlen(S3_AWS4_REQUEST) + 4; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
686 char *scope = Dowa_Arena_Allocate(p_arena, scope_len); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
687 snprintf(scope, scope_len, "%s/%s/%s/%s", date, region, S3_SERVICE_NAME, S3_AWS4_REQUEST); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
688 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
689 // Build string to sign |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
690 size_t len = strlen(S3_ALGORITHM) + strlen(datetime) + strlen(scope) + strlen(canonical_hash) + 10; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
691 char *out = Dowa_Arena_Allocate(p_arena, len); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
692 snprintf(out, len, "%s\n%s\n%s\n%s", S3_ALGORITHM, datetime, scope, canonical_hash); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
693 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
694 return out; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
695 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
696 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
697 static void s3__calculate_signing_key(const char *secret_key, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
698 const char *date, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
699 const char *region, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
700 uint8 *out) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
701 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
702 // AWS4 + SecretAccessKey |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
703 size_t key_len = 4 + strlen(secret_key) + 1; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
704 char *k_secret = malloc(key_len); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
705 snprintf(k_secret, key_len, "AWS4%s", secret_key); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
706 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
707 uint8 k_date[32]; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
708 uint8 k_region[32]; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
709 uint8 k_service[32]; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
710 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
711 s3__hmac_sha256((const uint8 *)k_secret, strlen(k_secret), |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
712 (const uint8 *)date, strlen(date), k_date); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
713 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
714 s3__hmac_sha256(k_date, 32, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
715 (const uint8 *)region, strlen(region), k_region); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
716 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
717 s3__hmac_sha256(k_region, 32, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
718 (const uint8 *)S3_SERVICE_NAME, strlen(S3_SERVICE_NAME), k_service); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
719 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
720 s3__hmac_sha256(k_service, 32, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
721 (const uint8 *)S3_AWS4_REQUEST, strlen(S3_AWS4_REQUEST), out); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
722 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
723 free(k_secret); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
724 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
725 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
726 static char *s3__build_authorization_header(const char *access_key, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
727 const char *date, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
728 const char *region, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
729 const char *signed_headers, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
730 const uint8 *signing_key, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
731 const char *string_to_sign, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
732 Dowa_Arena *p_arena) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
733 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
734 // Calculate signature |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
735 uint8 signature[32]; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
736 s3__hmac_sha256(signing_key, 32, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
737 (const uint8 *)string_to_sign, strlen(string_to_sign), |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
738 signature); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
739 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
740 char signature_hex[65]; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
741 s3__hex_encode(signature, 32, signature_hex); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
742 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
743 // Build credential |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
744 size_t cred_len = strlen(access_key) + strlen(date) + strlen(region) + |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
745 strlen(S3_SERVICE_NAME) + strlen(S3_AWS4_REQUEST) + 10; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
746 char *credential = Dowa_Arena_Allocate(p_arena, cred_len); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
747 snprintf(credential, cred_len, "%s/%s/%s/%s/%s", |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
748 access_key, date, region, S3_SERVICE_NAME, S3_AWS4_REQUEST); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
749 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
750 // Build full authorization header |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
751 size_t auth_len = strlen(S3_ALGORITHM) + strlen(credential) + |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
752 strlen(signed_headers) + strlen(signature_hex) + 64; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
753 char *auth = Dowa_Arena_Allocate(p_arena, auth_len); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
754 snprintf(auth, auth_len, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
755 "%s Credential=%s, SignedHeaders=%s, Signature=%s", |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
756 S3_ALGORITHM, credential, signed_headers, signature_hex); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
757 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
758 return auth; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
759 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
760 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
761 static uint8 *s3__load_file(const char *path, size_t *p_size) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
762 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
763 FILE *f = fopen(path, "rb"); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
764 if (!f) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
765 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
766 *p_size = 0; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
767 return NULL; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
768 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
769 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
770 fseek(f, 0, SEEK_END); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
771 long size = ftell(f); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
772 fseek(f, 0, SEEK_SET); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
773 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
774 if (size <= 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
775 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
776 fclose(f); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
777 *p_size = 0; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
778 return NULL; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
779 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
780 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
781 uint8 *data = malloc((size_t)size); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
782 if (!data) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
783 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
784 fclose(f); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
785 *p_size = 0; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
786 return NULL; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
787 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
788 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
789 size_t read = fread(data, 1, (size_t)size, f); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
790 fclose(f); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
791 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
792 if (read != (size_t)size) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
793 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
794 free(data); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
795 *p_size = 0; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
796 return NULL; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
797 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
798 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
799 *p_size = (size_t)size; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
800 return data; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
801 } |