param: make server role list common and include auto (for the new default)
[ira/wip.git] / source3 / param / loadparm.c
index a2c5e6905b1c5e50dd1f885adbe6086e760a9dce..11da2a968751d62c05c7a157a0e32254069a2529 100644 (file)
@@ -64,8 +64,9 @@
 #include "ads.h"
 #include "../librpc/gen_ndr/svcctl.h"
 #include "intl.h"
-#include "smb_signing.h"
+#include "../libcli/smb/smb_signing.h"
 #include "dbwrap/dbwrap.h"
+#include "dbwrap/dbwrap_rbt.h"
 #include "smbldap.h"
 #include "../lib/util/bitmap.h"
 
@@ -434,22 +435,24 @@ static const struct enum_list enum_csc_policy[] = {
 
 /* SMB signing types. */
 static const struct enum_list enum_smb_signing_vals[] = {
-       {false, "No"},
-       {false, "False"},
-       {false, "0"},
-       {false, "Off"},
-       {false, "disabled"},
-       {true, "Yes"},
-       {true, "True"},
-       {true, "1"},
-       {true, "On"},
-       {true, "enabled"},
-       {Auto, "auto"},
-       {Required, "required"},
-       {Required, "mandatory"},
-       {Required, "force"},
-       {Required, "forced"},
-       {Required, "enforced"},
+       {SMB_SIGNING_DEFAULT, "default"},
+       {SMB_SIGNING_OFF, "No"},
+       {SMB_SIGNING_OFF, "False"},
+       {SMB_SIGNING_OFF, "0"},
+       {SMB_SIGNING_OFF, "Off"},
+       {SMB_SIGNING_OFF, "disabled"},
+       {SMB_SIGNING_IF_REQUIRED, "if_required"},
+       {SMB_SIGNING_IF_REQUIRED, "Yes"},
+       {SMB_SIGNING_IF_REQUIRED, "True"},
+       {SMB_SIGNING_IF_REQUIRED, "1"},
+       {SMB_SIGNING_IF_REQUIRED, "On"},
+       {SMB_SIGNING_IF_REQUIRED, "enabled"},
+       {SMB_SIGNING_IF_REQUIRED, "auto"},
+       {SMB_SIGNING_REQUIRED, "required"},
+       {SMB_SIGNING_REQUIRED, "mandatory"},
+       {SMB_SIGNING_REQUIRED, "force"},
+       {SMB_SIGNING_REQUIRED, "forced"},
+       {SMB_SIGNING_REQUIRED, "enforced"},
        {-1, NULL}
 };
 
@@ -509,6 +512,23 @@ static const struct enum_list enum_kerberos_method[] = {
        {-1, NULL}
 };
 
+/* Server role options */
+static const struct enum_list enum_server_role[] = {
+       {ROLE_AUTO, "auto"},
+       {ROLE_STANDALONE, "standalone"},
+       {ROLE_DOMAIN_MEMBER, "member server"},
+       {ROLE_DOMAIN_MEMBER, "member"},
+       /* note that currently
+          ROLE_DOMAIN_CONTROLLER == ROLE_DOMAIN_BDC */
+       {ROLE_DOMAIN_CONTROLLER, "domain controller"},
+       {ROLE_DOMAIN_BDC, "backup domain controller"},
+       {ROLE_DOMAIN_BDC, "bdc"},
+       {ROLE_DOMAIN_BDC, "dc"},
+       {ROLE_DOMAIN_PDC, "primary domain controller"},
+       {ROLE_DOMAIN_PDC, "pdc"},
+       {-1, NULL}
+};
+
 /* Note: We do not initialise the defaults union - it is not allowed in ANSI C
  *
  * The FLAG_HIDE is explicit. Parameters set this way do NOT appear in any edit
@@ -659,6 +679,15 @@ static struct parm_struct parm_table[] = {
                .enum_list      = enum_config_backend,
                .flags          = FLAG_HIDE|FLAG_ADVANCED|FLAG_META,
        },
+       {
+               .label          = "server role",
+               .type           = P_ENUM,
+               .p_class        = P_GLOBAL,
+               .offset         = GLOBAL_VAR(ServerRole),
+               .special        = NULL,
+               .enum_list      = enum_server_role,
+               .flags          = FLAG_BASIC | FLAG_ADVANCED,
+       },
 
        {N_("Security Options"), P_SEP, P_SEPARATOR},
 
@@ -1147,7 +1176,7 @@ static struct parm_struct parm_table[] = {
                .offset         = LOCAL_VAR(bAclCheckPermissions),
                .special        = NULL,
                .enum_list      = NULL,
-               .flags          = FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE,
+               .flags          = FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE | FLAG_DEPRECATED,
        },
        {
                .label          = "acl group control",
@@ -4793,6 +4822,7 @@ static void init_globals(bool reinit_globals)
        Globals.PrintcapCacheTime = 750;        /* 12.5 minutes */
 
        Globals.ConfigBackend = config_backend;
+       Globals.ServerRole = ROLE_STANDALONE;
 
        /* Was 65535 (0xFFFF). 0x4101 matches W2K and causes major speed improvements... */
        /* Discovered by 2 days of pain by Don McCall @ HP :-). */
@@ -4977,8 +5007,8 @@ static void init_globals(bool reinit_globals)
        Globals.bUseSpnego = true;
        Globals.bClientUseSpnego = true;
 
-       Globals.client_signing = Auto;
-       Globals.server_signing = false;
+       Globals.client_signing = SMB_SIGNING_DEFAULT;
+       Globals.server_signing = SMB_SIGNING_DEFAULT;
 
        Globals.bDeferSharingViolations = true;
        string_set(&Globals.smb_ports, SMB_PORTS);
@@ -5360,6 +5390,7 @@ FN_GLOBAL_INTEGER(lp_lock_spin_time, iLockSpinTime)
 FN_GLOBAL_INTEGER(lp_usershare_max_shares, iUsershareMaxShares)
 FN_GLOBAL_CONST_STRING(lp_socket_options, szSocketOptions)
 FN_GLOBAL_INTEGER(lp_config_backend, ConfigBackend)
+FN_GLOBAL_INTEGER(lp_server_role, ServerRole)
 FN_GLOBAL_INTEGER(lp_smb2_max_read, ismb2_max_read)
 FN_GLOBAL_INTEGER(lp_smb2_max_write, ismb2_max_write)
 FN_GLOBAL_INTEGER(lp_smb2_max_trans, ismb2_max_trans)
@@ -6398,6 +6429,7 @@ static int getservicebyname(const char *pszServiceName, struct loadparm_service
        int iService = -1;
        char *canon_name;
        TDB_DATA data;
+       NTSTATUS status;
 
        if (ServiceHash == NULL) {
                return -1;
@@ -6405,9 +6437,13 @@ static int getservicebyname(const char *pszServiceName, struct loadparm_service
 
        canon_name = canonicalize_servicename(talloc_tos(), pszServiceName);
 
-       data = dbwrap_fetch_bystring(ServiceHash, canon_name, canon_name);
+       status = dbwrap_fetch_bystring(ServiceHash, canon_name, canon_name,
+                                      &data);
 
-       if ((data.dptr != NULL) && (data.dsize == sizeof(iService))) {
+       if (NT_STATUS_IS_OK(status) &&
+           (data.dptr != NULL) &&
+           (data.dsize == sizeof(iService)))
+       {
                iService = *(int *)data.dptr;
        }
 
@@ -8540,12 +8576,18 @@ static int process_usershare_file(const char *dir_name, const char *file_name, i
        }
 
        {
-               TDB_DATA data = dbwrap_fetch_bystring(
-                       ServiceHash, canon_name, canon_name);
+               TDB_DATA data;
+               NTSTATUS status;
+
+               status = dbwrap_fetch_bystring(ServiceHash, canon_name,
+                                              canon_name, &data);
 
                iService = -1;
 
-               if ((data.dptr != NULL) && (data.dsize == sizeof(iService))) {
+               if (NT_STATUS_IS_OK(status) &&
+                   (data.dptr != NULL) &&
+                   (data.dsize == sizeof(iService)))
+               {
                        iService = *(int *)data.dptr;
                }
        }
@@ -9693,3 +9735,8 @@ bool lp_readraw(void)
        }
        return _lp_readraw();
 }
+
+void _lp_set_server_role(int server_role)
+{
+       Globals.ServerRole = server_role;
+}