18#if defined(_WIN32) && !defined(__MINGW32__) && (!defined(_MSC_VER) || _MSC_VER < 1600) && \
22typedef unsigned __int32 uint32_t;
23typedef unsigned __int8 bool;
40#define bincookie_is_secure(cookie_ptr) (cookie_ptr->flags & secure)
45#define bincookie_domain_access_full(cookie_ptr) \
46 (((char *)cookie_ptr + cookie_ptr->domain_offset)[0] == '.')
51#define bincookie_iter_state_init(s) \
58#define bincookie_domain(c) ((char *)c + c->domain_offset)
63#define bincookie_path(c) \
71#define bincookie_name(c) \
79#define bincookie_value(c) ((char *)c + c->value_offset)
81#define APPLE_EPOCH_OFFSET 978307200
86#define bincookie_expiration_time(c) \
87 (c->expiry_date_epoch + APPLE_EPOCH_OFFSET)
92#define bincookie_creation_time(c) \
93 (c->create_date_epoch + APPLE_EPOCH_OFFSET)
105 uint32_t page_offset;
112 unsigned char unk1[4];
114 unsigned char unk2[4];
116 uint32_t domain_offset;
117 uint32_t name_offset;
118 uint32_t path_offset;
119 uint32_t value_offset;
121 unsigned char unk[8];
123 double expiry_date_epoch;
124 double create_date_epoch;
129 unsigned char unk1[4];
131 uint32_t num_cookies;
132 uint32_t cookie_offsets[];
137 unsigned char magic[4];
139 uint32_t page_sizes[];
155 for (uint32_t i = 0; i < bc->
num_pages; i++) {
156 if (page_offset > num_bytes || num_bytes - page_offset <
sizeof(
bincookie_page_t)) {
161 if (offsets_room /
sizeof(uint32_t) < page->
num_cookies) {
166 if (cookie_offset > num_bytes - page_offset ||
172 size_t cookie_pos = page_offset + cookie_offset;
177 for (
size_t k = 0; k <
sizeof(string_offsets) /
sizeof(string_offsets[0]); k++) {
178 if (string_offsets[k] >= num_bytes - cookie_pos) {
193 const long last_pos = ftell(fin);
197 size_t read = fread(magic,
sizeof(magic), 1, fin);
198 bool is_cook = magic[0] ==
'c' && magic[1] ==
'o' && magic[2] ==
'o' && magic[3] ==
'k';
199 if (read != 1 || !is_cook) {
204 fseek(fin, 0, SEEK_END);
205 size_t num_bytes = (size_t)ftell(fin);
217 memset(cook, 0, num_bytes);
220 if (fread(cook, num_bytes, 1, fin) != 1) {
235 for (uint32_t i = 0; i < cook->
num_pages; i++) {
247 fseek(fin, last_pos, SEEK_SET);
256 FILE *binary_file = fopen(file_path,
"rb");
291 if (*i < page->num_cookies) {
static bincookie_page_t *const bincookie_iter_pages(const bincookie_t *bc, bincookie_iter_state_t *const state)
Iterate pages of a binarycookies file.
Definition bincookie.h:279
static bincookie_t *const bincookie_init_file(FILE *fin)
Read a binarycookies file.
Definition bincookie.h:201
static bincookie_t *const bincookie_init_path(const char *file_path)
Read a binarycookies file.
Definition bincookie.h:264
static bool bincookie_validate_pages(const bincookie_t *bc, size_t num_bytes)
Definition bincookie.h:162
static bincookie_cookie_t *const bincookie_iter_cookies(const bincookie_page_t *page, unsigned int *i)
Iterate cookies of a page.
Definition bincookie.h:298
bincookie_flag
Security enabled for a cookie.
Definition bincookie.h:107
@ http_only
Definition bincookie.h:109
@ secure
Definition bincookie.h:108
Cookie data structure.
Definition bincookie.h:119
uint32_t name_offset
Definition bincookie.h:126
uint32_t value_offset
Definition bincookie.h:128
uint32_t domain_offset
Definition bincookie.h:125
uint32_t path_offset
Definition bincookie.h:127
Keeps track of iteration state when iterating cookie file pages.
Definition bincookie.h:113
uint32_t page_offset
Definition bincookie.h:114
uint32_t page_index
Definition bincookie.h:115
Cookie page structure. A page can consist of 1 or more cookies.
Definition bincookie.h:137
uint32_t cookie_offsets[]
Definition bincookie.h:141
uint32_t num_cookies
Definition bincookie.h:140
bincookie file structure.
Definition bincookie.h:145
uint32_t num_pages
Definition bincookie.h:147
uint32_t page_sizes[]
Definition bincookie.h:148