From 663f31cd6e6887e1f2ece661c85ebbbb343cf13b Mon Sep 17 00:00:00 2001 From: ading2210 Date: Sun, 7 Jan 2024 19:26:15 -0500 Subject: [PATCH] include certs in compiled output --- client/build.sh | 9 +++---- client/main.c | 11 +++++---- client/main.js | 45 +++++++++++++++++++++++++++++++++-- client/tools/generate_cert.sh | 18 ++++++++++++++ 4 files changed, 71 insertions(+), 12 deletions(-) create mode 100755 client/tools/generate_cert.sh diff --git a/client/build.sh b/client/build.sh index 39cdd16..ded13ae 100755 --- a/client/build.sh +++ b/client/build.sh @@ -7,16 +7,13 @@ LIB_DIR="build/curl-wasm/lib/" CACERT_FILE="cacert.pem" OUT_FILE="out/libcurl.js" -EXPORTED_FUNCS="_main,_perform_request" +EXPORTED_FUNCS="_load_certs,_perform_request" RUNTIME_METHODS="addFunction,removeFunction,allocate,ALLOC_NORMAL" COMPILER_OPTIONS="-o $OUT_FILE -lcurl -lssl -lcrypto -lcjson -I $INCLUDE_DIR -L $LIB_DIR" -EMSCRIPTEN_OPTIONS="-lwebsocket.js -sWEBSOCKET_URL=wss://debug.ading.dev/ws -sSINGLE_FILE -sASYNCIFY -sALLOW_TABLE_GROWTH -sEXPORTED_FUNCTIONS=$EXPORTED_FUNCS -sEXPORTED_RUNTIME_METHODS=$RUNTIME_METHODS --preload-file $CACERT_FILE" - -if [ ! -f $CACERT_FILE ]; then - wget "https://curl.se/ca/cacert.pem" -O $CACERT_FILE -fi +EMSCRIPTEN_OPTIONS="-lwebsocket.js -sWEBSOCKET_URL=wss://debug.ading.dev/ws -sSINGLE_FILE -sASYNCIFY -sALLOW_TABLE_GROWTH -sEXPORTED_FUNCTIONS=$EXPORTED_FUNCS -sEXPORTED_RUNTIME_METHODS=$RUNTIME_METHODS" tools/all_deps.sh +tools/generate_cert.sh rm -rf out mkdir -p out diff --git a/client/main.c b/client/main.c index b056028..e9baf71 100644 --- a/client/main.c +++ b/client/main.c @@ -1,12 +1,13 @@ #include #include -#include #include +#include #include "curl/curl.h" -#include "cjson/cJSON.h" #include "curl/easy.h" #include "curl/header.h" +#include "cjson/cJSON.h" +#include "cacert.h" typedef void(*DataCallback)(char* chunk_ptr, int chunk_size); typedef void(*EndCallback)(int error, char* response_json); @@ -170,6 +171,8 @@ char* copy_bytes(const char* ptr, const int size) { return new_ptr; } -int main() { - printf("emscripten libcurl module loaded\n"); +void load_certs() { + FILE *file = fopen("/cacert.pem", "wb"); + fwrite(_cacert_pem, 1, _cacert_pem_len, file); + fclose(file); } \ No newline at end of file diff --git a/client/main.js b/client/main.js index 80fc8a0..44aad58 100644 --- a/client/main.js +++ b/client/main.js @@ -67,6 +67,33 @@ const status_messages = { 511: "Network Authentication Required" } +//a case insensitive dictionary for request headers +class Headers { + constructor(obj) { + for (let key in obj) { + this[key] = obj[key]; + } + return new Proxy(this, this); + } + get(target, prop) { + let keys = Object.keys(this); + for (let key of keys) { + if (key.toLowerCase() === prop.toLowerCase()) { + return this[key]; + } + } + } + set(target, prop, value) { + let keys = Object.keys(this); + for (let key of keys) { + if (key.toLowerCase() === prop.toLowerCase()) { + this[key] = value; + } + } + this[prop] = value; + } +} + function is_str(obj) { return typeof obj === 'string' || obj instanceof String; } @@ -145,7 +172,7 @@ function create_response(response_data, response_info) { return response_obj; } -function libcurl_fetch(url, params={}) { +function create_options(params) { let body = null; if (params.body) { if (is_str(params.body)) { @@ -156,10 +183,22 @@ function libcurl_fetch(url, params={}) { } params.body = true; } + + if (!params.headers) params.headers = {}; + params.headers = new Headers(params.headers); + if (params.referer) { - if (!params.headers) params.headers = {}; params.headers["Referer"] = params.referer; } + if (!params.headers["User-Agent"]) { + params.headers["User-Agent"] = navigator.userAgent; + } + + return body; +} + +function libcurl_fetch(url, params={}) { + let body = create_options(params); return new Promise((resolve, reject) => { let chunks = []; @@ -180,6 +219,8 @@ function libcurl_fetch(url, params={}) { } async function main() { + console.log("emscripten module loaded"); + _load_certs(); console.log(await libcurl_fetch("https://httpbin.org/anything")); } diff --git a/client/tools/generate_cert.sh b/client/tools/generate_cert.sh new file mode 100755 index 0000000..84c9aad --- /dev/null +++ b/client/tools/generate_cert.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +#export ca certs to a c header file + +set -e + +CURL_PREFIX=$(realpath build/curl-wasm) +CACERT_FILE="$(realpath build/cacert.pem)" +CACERT_HEADER="$CURL_PREFIX/include/cacert.h" + +CACERT_DIR="$(dirname $CACERT_FILE)" +REPLACE_STR="$(echo $CACERT_DIR | tr '/-' '_')" + +if [ ! -f $CACERT_FILE ]; then + wget "https://curl.se/ca/cacert.pem" -O $CACERT_FILE +fi +xxd -i $CACERT_FILE > $CACERT_HEADER +sed -i "s/$REPLACE_STR//" $CACERT_HEADER \ No newline at end of file