s3:lib: Introduce cmdline context wrapper
authorChristof Schmitt <cs@samba.org>
Mon, 20 Aug 2018 21:44:28 +0000 (14:44 -0700)
committerAndreas Schneider <asn@cryptomilk.org>
Fri, 7 Sep 2018 15:26:14 +0000 (17:26 +0200)
Command line tools need acccess to the same messaging context provided
by server_messaging_context, as common code for db_open uses that
context. We want to have additional checking for command line tools
without having that code part of the servers. Introduce a wrapper
library to use for command line tools with the additional checks, that
then acquires the server_messaging_context.

BUG: https://bugzilla.samba.org/show_bug.cgi?id=13465

Signed-off-by: Christof Schmitt <cs@samba.org>
Reviewed-by: Ralph Boehme <slow@samba.org>
source3/lib/cmdline_contexts.c [new file with mode: 0644]
source3/lib/cmdline_contexts.h [new file with mode: 0644]
source3/wscript_build

diff --git a/source3/lib/cmdline_contexts.c b/source3/lib/cmdline_contexts.c
new file mode 100644 (file)
index 0000000..5713f7f
--- /dev/null
@@ -0,0 +1,70 @@
+/*
+   Unix SMB/CIFS implementation.
+   cmdline context wrapper.
+
+   Copyright (C) Christof Schmitt <cs@samba.org> 2018
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "cmdline_contexts.h"
+#include "includes.h"
+#include "messages.h"
+
+struct messaging_context *cmdline_messaging_context(const char *config_file)
+{
+       struct messaging_context *msg_ctx = NULL;
+
+       /*
+        * Ensure that a config is loaded, in case the underlying
+        * messaging_init needs to create directories or sockets.
+        */
+       if (!lp_loaded()) {
+               if (!lp_load_initial_only(config_file)) {
+                       return NULL;
+               }
+       }
+
+       /*
+        * Clustered Samba can only work as root due to required
+        * access to the registry and ctdb, which in turn requires
+        * messaging access as root.
+        */
+       if (lp_clustering() && geteuid() != 0) {
+               fprintf(stderr, "Cluster mode requires running as root.\n");
+               exit(1);
+       }
+
+       msg_ctx = server_messaging_context();
+       if (msg_ctx == NULL) {
+               if (geteuid() == 0) {
+                       fprintf(stderr,
+                               "Unable to initialize messaging context!\n");
+                       exit(1);
+               } else {
+                       /*
+                        * Non-cluster, non-root: Log error, but leave
+                        * it up to the caller how to proceed.
+                        */
+                       DBG_NOTICE("Unable to initialize messaging context.\n");
+               }
+       }
+
+       return msg_ctx;
+}
+
+void cmdline_messaging_context_free(void)
+{
+       server_messaging_context_free();
+}
diff --git a/source3/lib/cmdline_contexts.h b/source3/lib/cmdline_contexts.h
new file mode 100644 (file)
index 0000000..21f81f0
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+   Unix SMB/CIFS implementation.
+   cmdline context wrapper.
+
+   Copyright (C) Christof Schmitt <cs@samba.org> 2018
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef _LIB_CMDLINE_CONTEXTS_H
+#define _LIB_CMDLINE_CONTEXTS_H
+
+struct messaging_context *cmdline_messaging_context(const char *config_file);
+void cmdline_messaging_context_free(void);
+
+#endif
index d96c03078e1b3a9e4f672c2d0dd8070bacd8c853..5f6fce391c49e3d9120b139950ffcb4f87a66d8e 100644 (file)
@@ -278,6 +278,11 @@ bld.SAMBA3_LIBRARY('util_cmdline',
                    deps='secrets3',
                    private_library=True)
 
+bld.SAMBA3_LIBRARY('cmdline_contexts',
+                   source='lib/cmdline_contexts.c',
+                   deps='samba3core',
+                   private_library=True)
+
 bld.SAMBA3_SUBSYSTEM('KRBCLIENT',
                      source='libads/kerberos.c libads/ads_status.c',
                      public_deps='krb5samba asn1util k5crypto gssapi LIBTSOCKET CLDAP LIBNMB')