Files
tor/debian/patches/06_add_compile_time_defaults.dpatch
T
Peter Palfrader c6a7ab729c Update debian defaults in preparation for starting as root.
Previously the debian defaults were only loaded when we started Tor as
the debian-tor user.  Now they are also loaded when started as root.
In addition to logging, pidfile, datadir and runasdaemon we also change
the User and Group options from their NULL default to "debian-tor" so that
Tor correctly setuids/setgids to the role user the package created.

This will allow us to start the daemon as root.


svn:r13685
2008-02-23 12:59:52 +00:00

140 lines
3.6 KiB
Plaintext
Executable File

#! /bin/sh -e
## 06_add_compile_time_defaults.dpatch by <weasel@debian.org>
##
## All lines beginning with `## DP:' are a description of the patch.
## DP: No description.
if [ $# -lt 1 ]; then
echo "`basename $0`: script expects -patch|-unpatch as argument" >&2
exit 1
fi
[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts
patch_opts="${patch_opts:--f --no-backup-if-mismatch} ${2:+-d $2}"
case "$1" in
-patch) patch -p1 ${patch_opts} < $0;;
-unpatch) patch -R -p1 ${patch_opts} < $0;;
*)
echo "`basename $0`: script expects -patch|-unpatch as argument" >&2
exit 1;;
esac
exit 0
@DPATCH@
diff -urNad trunk~/src/or/config.c trunk/src/or/config.c
--- trunk~/src/or/config.c 2008-02-23 11:08:40.000000000 +0100
+++ trunk/src/or/config.c 2008-02-23 13:43:05.000000000 +0100
@@ -15,6 +15,7 @@
#define CONFIG_PRIVATE
#include "or.h"
+#include <pwd.h>
#ifdef MS_WINDOWS
#include <shlobj.h>
#endif
@@ -660,6 +661,8 @@
#if defined(HAVE_EVENT_GET_VERSION) && defined(HAVE_EVENT_GET_METHOD)
static void check_libevent_version(const char *m, int server);
#endif
+static int debian_running_as_debiantor();
+static int debian_config_fix_defaults();
/** Magic value for or_options_t. */
#define OR_OPTIONS_MAGIC 9090909
@@ -3522,7 +3525,7 @@
int
options_init_from_torrc(int argc, char **argv)
{
- or_options_t *oldoptions, *newoptions;
+ or_options_t *oldoptions, *newoptions = NULL;
config_line_t *cl;
char *cf=NULL, *fname=NULL, *errmsg=NULL;
int i, retval;
@@ -3531,6 +3534,9 @@
static char **backup_argv;
static int backup_argc;
+ if (debian_config_fix_defaults() < 0)
+ goto err;
+
if (argv) { /* first time we're called. save commandline args */
backup_argv = argv;
backup_argc = argc;
@@ -3666,7 +3672,8 @@
err:
tor_free(fname);
torrc_fname = NULL;
- config_free(&options_format, newoptions);
+ if (newoptions)
+ config_free(&options_format, newoptions);
if (errmsg) {
log(LOG_WARN,LD_CONFIG,"Failed to parse/validate config: %s", errmsg);
tor_free(errmsg);
@@ -5011,3 +5018,64 @@
puts(routerparse_c_id);
}
+/* Checks whether we are running as the debian-tor user.
+ * Returns -1 on error, 1 if we are debian-tor, 0 if not */
+static int
+debian_running_as_debiantor()
+{
+ struct passwd *pw = NULL;
+ int uid;
+
+ uid = getuid();
+ /* If we run as root we also apply our debian defaults. */
+ if (uid == 0)
+ return 1;
+
+ pw = getpwuid(uid);
+ if (!pw) {
+ log(LOG_WARN, LD_GENERAL, "Could not get passwd information for uid %d.", uid);
+ return -1;
+ }
+ assert(pw->pw_name);
+ if (strcmp(pw->pw_name, "debian-tor") == 0)
+ return 1;
+ else
+ return 0;
+}
+
+static int
+debian_config_fix_defaults()
+{
+ config_var_t *var;
+ static int fixed = 0;
+ int running_as_debian;
+
+ if (fixed) return 0;
+ fixed = 1;
+
+ running_as_debian = debian_running_as_debiantor();
+ if (running_as_debian < 0) return -1;
+ if (!running_as_debian) return 0;
+
+ var = config_find_option(&options_format, "DataDirectory");
+ tor_assert(var);
+ var->initvalue = tor_strdup("/var/lib/tor");
+
+ var = config_find_option(&options_format, "PidFile");
+ tor_assert(var);
+ var->initvalue = tor_strdup("/var/run/tor/tor.pid");
+
+ var = config_find_option(&options_format, "RunAsDaemon");
+ tor_assert(var);
+ var->initvalue = tor_strdup("1");
+
+ var = config_find_option(&options_format, "User");
+ tor_assert(var);
+ var->initvalue = tor_strdup("debian-tor");
+
+ var = config_find_option(&options_format, "Group");
+ tor_assert(var);
+ var->initvalue = tor_strdup("debian-tor");
+
+ return 0;
+}