Hi, 

I have managed to get dillo.cc to use the 'save_dir' preference to set
which download path is unveiled. This was done by moving the unveil
call to a point after which prefs are initialized and dillorc is
parsed. Here is what the patch looks like:

--- dillo.cc    Sat Jun 29 16:33:08 2024
+++ dillo.cc    Tue Jul 30 14:18:28 2024
@@ -23,6 +23,7 @@
 
 #include <stdio.h>
 #include <unistd.h>
+#include <err.h>
 #include <stdlib.h>
 #include <time.h>
 #include <sys/types.h>
@@ -463,6 +464,58 @@ int main(int argc, char **argv)
    }
    dLib_show_messages(prefs.show_msg);
 
+   // Use unveil on OpenBSD
+   #ifdef __OpenBSD__
+   if (unveil("/usr/local/share/fonts", "r") == -1) {
+       err(1, "unveil failed");
+   }
+   if (unveil("/usr/local/share/icons", "r") == -1) {
+       err(1, "unveil failed");
+   }
+   if (unveil("/usr/X11R6/share/X11/locale", "r") == -1) {
+       err(1, "unveil failed");
+   }
+   if (unveil("/usr/X11R6/lib/X11/fonts", "r") == -1) {
+       err(1, "unveil failed");
+   }
+   if (unveil("/usr/local/etc/dillo", "r") == -1) {
+       err(1, "unveil failed");
+   }
+   if (unveil("/tmp", "rwc") == -1) {
+       err(1, "unveil failed");
+   }
+   if (unveil("/usr/local/bin/dpid", "x") == -1) {
+       err(1, "unveil failed");
+   }
+   if (unveil("/etc/fonts", "r") == -1) {
+       err(1, "unveil failed");
+   }
+   if (unveil("/etc/resolv.conf", "r") == -1) {
+       err(1, "unveil failed");
+   }
+   if (unveil("/etc/ssl/cert.pem", "r") == -1) {
+       err(1, "unveil failed");
+   }
+   if (unveil(prefs.save_dir, "rwc") == -1) {
+       err(1, "unveil failed");
+   }
+   char *dil_loc = dStrconcat(dGethomedir(), "/.dillo", NULL);
+   if (unveil(dil_loc, "rwc") == -1) {
+       err(1, "unveil failed");
+   }
+   dFree(dil_loc);
+   char *icons_loc = dStrconcat(dGethomedir(), "/.icons", NULL);      
+   if (unveil(icons_loc, "r") == -1) {
+       err(1, "unveil failed");
+   }
+   dFree(icons_loc);
+   char *xauth_loc = dStrconcat(dGethomedir(), "/.Xauthority", NULL);
    
+   if (unveil(xauth_loc, "r") == -1) {
+       err(1, "unveil failed");
+   }
+   dFree(xauth_loc);
+   #endif
+   
    // initialize internal modules
    a_Dpi_init();
    a_Dns_init();


I have tried to do the same for downloads.cc, but haven't quite got it
yet. Since prefs are not initialized in downloads.cc, I tried to copy
that from dillo.cc, but am getting some linker errors when compliling.
I probably missed something obvious. Any ideas?

ld: error: undefined symbol: a_Prefs_init
>>> referenced by downloads.cc
>>>               downloads_dpi-downloads.o:(main)
mv -f .deps/vsource.Tpo .deps/vsource.Po

ld: error: undefined symbol: Paths::init()
>>> referenced by downloads.cc
>>>               downloads_dpi-downloads.o:(main)

ld: error: undefined symbol: Paths::getPrefsFP(char const*)
>>> referenced by downloads.cc
>>>               downloads_dpi-downloads.o:(main)

ld: error: undefined symbol: PrefsParser::parse(__sFILE*)
>>> referenced by downloads.cc
>>>               downloads_dpi-downloads.o:(main)

ld: error: undefined symbol: prefs
>>> referenced by downloads.cc
>>>               downloads_dpi-downloads.o:(main)
c++: error: linker command failed with exit code 1 (use -v to see
invocation)

Here is what I tried:

--- downloads.cc        Sat Jun 29 16:33:08 2024
+++ downloads.cc        Tue Jul 30 15:07:04 2024
@@ -18,6 +18,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
+#include <err.h>
 #include <errno.h>
 #include <fcntl.h>
 #include <ctype.h>
@@ -42,6 +43,9 @@
 #include <FL/Fl_Box.H>
 #include <FL/Fl_Button.H>
 
+#include "../src/paths.hh"
+#include "../src/prefs.h"
+#include "../src/prefsparser.hh"
 #include "config.h"
 #include "dpiutil.h"
 #include "../dpip/dpip.h"
@@ -1104,6 +1108,48 @@ static void custLabelMeasure(const Fl_Label* o,
int& W
 int main()
 {
    int ww = 420, wh = 85;
+   FILE *fp;
+
+   // set the default values for the preferences
+   a_Prefs_init();
+
+   // create ~/.dillo if not present
+   Paths::init();
+
+   // parse dillorc
+   if ((fp = Paths::getPrefsFP(PATHS_RC_PREFS))) {
+      PrefsParser::parse(fp);
+   }
+
+   /* Use unveil on OpenBSD */
+   #ifdef __OpenBSD__
+   if (unveil("/tmp", "rwc") == -1) {
+       err(1, "unveil failed");
+   }
+   if (unveil("/etc/fonts", "r") == -1) {
+       err(1, "unveil failed");
+   }
+   if (unveil("/usr/local/bin/wget", "x") == -1) {
+       err(1, "unveil failed");
+   }
+   char *xauth_loc = dStrconcat(dGethomedir(), "/.Xauthority", NULL);
+   if (unveil(xauth_loc, "r") == -1) {
+       err(1, "unveil failed");
+   }
+   dFree(xauth_loc);
+   if (unveil("/usr/local/share/fonts", "r") == -1) {
+       err(1, "unveil failed");
+   }
+   char *dil_loc = dStrconcat(dGethomedir(), "/.dillo", NULL);
+   if (unveil(dil_loc, "rwc") == -1) {
+       err(1, "unveil failed");
+   }
+   dFree(dil_loc);
+   if (unveil(prefs.save_dir, "rwc") == -1) {
+       err(1, "unveil failed");
+   }
+   unveil(NULL, NULL);
+   #endif
 
    Fl::lock();

Finally, I tried to also get ftp.c to use the 'save_dir' preference, 
but had less luck. I think the issue comes from the fact that this is a
C program, and the others are C++. 

I'm wondering, is this whole unveil idea realistic at this point? Maybe
I'm just too inexperienced to be doing this work. I am quite willing to
keep going, but it will probably involve many more messages to the list
with problems similar to the ones above. I don't want to overwhelm the
list and devs with my beginner programming mistakes, it feels like I'm
placing an unfair burden on you.  

Regards,
Alex
_______________________________________________
Dillo-dev mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to