Prefs struct is mostly ownership safe now.

This commit is contained in:
2026-01-07 23:59:06 -05:00
parent 3061a4ae71
commit d4e9e37118
8 changed files with 56 additions and 69 deletions
+6 -6
View File
@@ -127,13 +127,13 @@ int a_Http_init(void)
char *env_proxy = getenv("http_proxy");
HTTP_Language_hdr = prefs.http_language ?
dStrconcat("Accept-Language: ", prefs.http_language, "\r\n", NULL) :
dStrconcat("Accept-Language: ", prefs.http_language.value().c_str(), "\r\n", NULL) :
dStrdup("");
if (env_proxy && strlen(env_proxy))
HTTP_Proxy = a_Url_new(env_proxy, NULL).release();
if (!HTTP_Proxy && prefs.http_proxy)
HTTP_Proxy = a_Url_dup(prefs.http_proxy).release();
HTTP_Proxy = a_Url_dup(prefs.http_proxy.get()).release();
/* This allows for storing the proxy password in "user:passwd" format
* in dillorc, but as this constitutes a security problem, it was disabled.
@@ -159,7 +159,7 @@ int a_Http_proxy_auth(void)
*/
void a_Http_set_proxy_passwd(const char *str)
{
char *http_proxyauth = dStrconcat(prefs.http_proxyuser, ":", str, NULL);
char *http_proxyauth = dStrconcat(prefs.http_proxyuser.value().c_str(), ":", str, NULL);
HTTP_Proxy_Auth_base64 = a_Misc_encode_base64(http_proxyauth);
dFree(http_proxyauth);
}
@@ -337,10 +337,10 @@ static char *Http_get_referer(const DilloUrl *url)
{
char *referer = NULL;
if (!strcmp(prefs.http_referer, "host")) {
if (!strcmp(prefs.http_referer.c_str(), "host")) {
referer = dStrconcat("Referer: ", URL_SCHEME(url), "://",
URL_AUTHORITY(url), "/", "\r\n", NULL);
} else if (!strcmp(prefs.http_referer, "path")) {
} else if (!strcmp(prefs.http_referer.c_str(), "path")) {
referer = dStrconcat("Referer: ", URL_SCHEME(url), "://",
URL_AUTHORITY(url),
URL_PATH_(url) ? URL_PATH(url) : "/", "\r\n", NULL);
@@ -684,7 +684,7 @@ static int Http_must_use_proxy(const char *hostname)
if (prefs.no_proxy) {
size_t host_len = strlen(hostname);
np = dStrdup(prefs.no_proxy);
np = dStrdup(prefs.no_proxy.value().c_str());
for (p = np; (tok = dStrsep(&p, " ")); ) {
int start = host_len - strlen(tok);
+13 -9
View File
@@ -58,6 +58,8 @@
#include <openssl/x509v3.h> /* for hostname checking */
#include <openssl/crypto.h> /* OpenSSL_version */
#include <sstream>
#define CERT_STATUS_NONE 0
#define CERT_STATUS_RECEIVING 1
#define CERT_STATUS_CLEAN 2
@@ -324,26 +326,28 @@ void a_Tls_openssl_init(void)
*/
static int Tls_save_certificate_home(X509 * cert)
{
char buf[4096];
std::string buf;
FILE * fp = NULL;
uint_t i = 0;
int ret = 1;
/* Attempt to create .flenser/certs blindly - check later */
snprintf(buf, 4096, "%s/.flenser/", dGethomedir());
mkdir(buf, 01777);
snprintf(buf, 4096, "%s/.flenser/certs/", dGethomedir());
mkdir(buf, 01777);
buf= dGethomedir_string().value() + "/.flenser/";
mkdir(buf.c_str(), 01777);
buf= dGethomedir_string().value() + "/.flenser/certs/";
mkdir(buf.c_str(), 01777);
do {
snprintf(buf, 4096, "%s/.flenser/certs/%lx.%u",
dGethomedir(), X509_subject_name_hash(cert), i);
std::ostringstream oss;
oss << dGethomedir_string().value() + "/.flenser/certs/" << X509_subject_name_hash( cert ) << '.' << i;
buf= oss.str();
fp=fopen(buf, "r");
fp=fopen(buf.c_str(), "r");
if (fp == NULL){
/* File name doesn't exist so we can use it safely */
fp=fopen(buf, "w");
fp=fopen(buf.c_str(), "w");
if (fp == NULL){
MSG("Unable to open cert save file in home dir\n");
break;
+1 -1
View File
@@ -80,7 +80,7 @@ void a_Dicache_init(void)
if (prefs.ignore_image_formats) {
for (int i = 0; i < DIC_MAX; i++) {
if (dStriAsciiStr(prefs.ignore_image_formats, format_name[i])) {
if (dStriAsciiStr(prefs.ignore_image_formats.value().c_str(), format_name[i])) {
disabled_formats[i] = 1;
_MSG("Image format %s disabled\n", format_name[i]);
}
+4 -4
View File
@@ -407,7 +407,7 @@ int main(int argc, char **argv)
// Sets WM_CLASS hint on X11
Fl_Window::default_xclass("flenser");
Fl::scheme(prefs.theme);
Fl::scheme(prefs.theme.c_str());
// Disable drag and drop as it crashes on MacOSX
Fl::dnd_text_ops(0);
@@ -445,7 +445,7 @@ int main(int argc, char **argv)
/* Proxy authentication */
if (prefs.http_proxyuser && !a_Http_proxy_auth()) {
const char *passwd = a_UIcmd_get_passwd(prefs.http_proxyuser);
const char *passwd = a_UIcmd_get_passwd(prefs.http_proxyuser.value().c_str());
if (passwd) {
a_Http_set_proxy_passwd(passwd);
} else {
@@ -462,8 +462,8 @@ int main(int argc, char **argv)
strcmp(URL_PATH(prefs.start_page), "blank") == 0)
a_UIcmd_open_url(bw, NULL); // NULL URL focuses location
else {
a_UIcmd_open_url(bw, prefs.start_page);
a_UIcmd_set_location_text(bw, URL_STR(prefs.start_page));
a_UIcmd_open_url(bw, prefs.start_page.get());
a_UIcmd_set_location_text(bw, URL_STR(prefs.start_page.get()));
}
} else {
for (int i = idx; i < argc; i++) {
+1 -1
View File
@@ -448,7 +448,7 @@ void a_Nav_forw(BrowserWindow *bw)
*/
void a_Nav_home(BrowserWindow *bw)
{
a_Nav_push(bw, prefs.home, NULL);
a_Nav_push(bw, prefs.home.get(), NULL);
}
/*
+9 -24
View File
@@ -62,21 +62,17 @@ void a_Prefs_init(void)
prefs.xpos = PREFS_GEOMETRY_DEFAULT_XPOS;
prefs.ypos = PREFS_GEOMETRY_DEFAULT_YPOS;
prefs.home = a_Url_new(PREFS_HOME, NULL).release();
prefs.http_language = NULL;
prefs.http_proxy = NULL;
prefs.home = a_Url_new(PREFS_HOME, NULL);
prefs.http_max_conns = 6;
prefs.http_persistent_conns = TRUE;
prefs.http_proxyuser = NULL;
prefs.http_referer = dStrdup(PREFS_HTTP_REFERER);
prefs.http_referer = PREFS_HTTP_REFERER;
prefs.http_strict_transport_security = TRUE;
prefs.http_force_https = FALSE;
prefs.http_user_agent = dStrdup(PREFS_HTTP_USER_AGENT);
prefs.http_user_agent = PREFS_HTTP_USER_AGENT;
prefs.limit_text_width = FALSE;
prefs.adjust_min_width = TRUE;
prefs.adjust_table_min_width = TRUE;
prefs.load_images=TRUE;
prefs.ignore_image_formats = NULL;
prefs.load_background_images=FALSE;
prefs.load_stylesheets=TRUE;
prefs.middle_click_drags_page = TRUE;
@@ -84,11 +80,11 @@ void a_Prefs_init(void)
prefs.right_click_closes_tab = TRUE;
prefs.scroll_switches_tabs = TRUE;
prefs.scroll_switches_tabs_reverse = FALSE;
prefs.no_proxy = dStrdup(PREFS_NO_PROXY);
prefs.no_proxy = PREFS_NO_PROXY;
prefs.link_actions = dList_new(16);
prefs.panel_size = P_medium;
prefs.parse_embedded_css=TRUE;
prefs.save_dir = dStrdup(PREFS_SAVE_DIR);
prefs.save_dir = PREFS_SAVE_DIR;
prefs.scroll_step = 100;
prefs.scroll_page_overlap = 50;
prefs.search_urls = dList_new(16);
@@ -116,9 +112,9 @@ void a_Prefs_init(void)
prefs.show_tooltip = TRUE;
prefs.show_ui_tooltip = TRUE;
prefs.small_icons = FALSE;
prefs.start_page = a_Url_new(PREFS_START_PAGE, NULL).release();
prefs.new_tab_page = a_Url_new(PREFS_NEW_TAB_PAGE, NULL).release();
prefs.theme = dStrdup(PREFS_THEME);
prefs.start_page = a_Url_new(PREFS_START_PAGE, NULL);
prefs.new_tab_page = a_Url_new(PREFS_NEW_TAB_PAGE, NULL);
prefs.theme = PREFS_THEME;
prefs.ui_button_highlight_color = -1;
prefs.ui_fg_color = -1;
prefs.ui_main_bg_color = -1;
@@ -142,22 +138,11 @@ void a_Prefs_init(void)
* memory-deallocation.
* (Call this one at exit time)
*/
void a_Prefs_freeall(void)
void a_Prefs_freeall()
{
int i;
delete prefs.home;
dFree(prefs.http_language);
delete prefs.http_proxy;
dFree(prefs.http_proxyuser);
dFree(prefs.http_referer);
dFree(prefs.http_user_agent);
dFree(prefs.no_proxy);
dFree(prefs.save_dir);
for (i = 0; i < dList_length(prefs.search_urls); ++i)
dFree(dList_nth_data(prefs.search_urls, i));
dList_free(prefs.search_urls);
delete prefs.start_page;
delete prefs.new_tab_page;
dFree(prefs.theme);
}
+12 -12
View File
@@ -42,16 +42,16 @@ struct DilloPrefs
int height;
int xpos;
int ypos;
char *http_language;
std::optional< std::string > http_language;
int32_t http_max_conns;
DilloUrl *http_proxy;
char *http_proxyuser;
char *http_referer;
char *http_user_agent;
char *no_proxy;
DilloUrl *start_page;
DilloUrl *home;
DilloUrl *new_tab_page;
std::unique_ptr< DilloUrl > http_proxy;
std::optional< std::string > http_proxyuser;
std::string http_referer;
std::string http_user_agent;
std::optional< std::string > no_proxy;
std::unique_ptr< DilloUrl > start_page;
std::unique_ptr< DilloUrl > home;
std::unique_ptr< DilloUrl > new_tab_page;
bool allow_white_bg;
int32_t white_bg_replacement;
int32_t bg_color;
@@ -68,7 +68,7 @@ struct DilloPrefs
bool contrast_visited_color;
bool show_tooltip;
bool show_ui_tooltip;
char *theme;
std::string theme;
int panel_size;
bool small_icons;
bool limit_text_width;
@@ -100,7 +100,7 @@ struct DilloPrefs
bool show_quit_dialog;
bool fullwindow_start;
bool load_images;
char *ignore_image_formats;
std::optional< std::string > ignore_image_formats;
bool load_background_images;
bool load_stylesheets;
bool parse_embedded_css;
@@ -120,7 +120,7 @@ struct DilloPrefs
bool scroll_switches_tabs_reverse;
bool search_url_idx;
Dlist *search_urls;
char *save_dir;
std::optional< std::string > save_dir;
bool show_msg;
bool show_extra_warnings;
bool middle_click_drags_page;
+9 -11
View File
@@ -810,8 +810,8 @@ void a_UIcmd::a_UIcmd_open_url(BrowserWindow *bw, const DilloUrl *url)
static void UIcmd_open_url_nbw(BrowserWindow *new_bw, const DilloUrl *url)
{
if (!url && prefs.new_tab_page) {
if (strcmp(URL_STR(prefs.new_tab_page), "about:blank") != 0)
url = prefs.new_tab_page;
if (strcmp(URL_STR(prefs.new_tab_page.get()), "about:blank") != 0)
url = prefs.new_tab_page.get();
}
/* When opening a new BrowserWindow (tab or real window) we focus
@@ -892,7 +892,7 @@ void a_UIcmd::a_UIcmd_forw_popup(void *vbw, int x, int y)
*/
void a_UIcmd::a_UIcmd_home(void *vbw)
{
a_UIcmd_open_url((BrowserWindow*)vbw, prefs.home);
a_UIcmd_open_url((BrowserWindow*)vbw, prefs.home.get());
}
/*
@@ -1030,17 +1030,15 @@ static char *UIcmd_make_save_filename(const DilloUrl *url)
/*
* Set the default directory for saving files.
*/
void a_UIcmd::a_UIcmd_init(void)
void a_UIcmd::a_UIcmd_init()
{
const char *dir = prefs.save_dir;
if( not prefs.save_dir.has_value() ) return;
if (dir && *dir) {
std::string dir= prefs.save_dir.value();
// assert a trailing '/'
save_dir =
(dir[strlen(dir)-1] == '/')
? dStrdup(dir)
: dStrconcat(dir, "/", NULL);
}
if( dir.back() != '/' ) dir+= '/';
save_dir = dStrdup( dir.c_str() );
}
/*