s3-rpc_server: Correctly register lsa, samr and netlogon.
authorAndreas Schneider <asn@samba.org>
Fri, 15 Jul 2011 16:34:17 +0000 (18:34 +0200)
committerSimo Sorce <idra@samba.org>
Sun, 21 Aug 2011 13:05:02 +0000 (09:05 -0400)
Signed-off-by: Andreas Schneider <asn@samba.org>
Signed-off-by: Simo Sorce <idra@samba.org>
source3/rpc_server/rpc_service_setup.c
source3/rpc_server/rpc_service_setup.h

index f6cc97d7267bf9616b5f858faa241bd2e8332c27..cd968c54978ef0f201da11db5617dd655a1da066 100644 (file)
@@ -96,6 +96,75 @@ enum rpc_service_mode_e rpc_spoolss_mode(void)
        return state;
 }
 
+enum rpc_service_mode_e rpc_lsarpc_mode(void)
+{
+       const char *rpcsrv_type;
+       enum rpc_service_mode_e mode;
+
+       rpcsrv_type = lp_parm_const_string(GLOBAL_SECTION_SNUM,
+                                          "rpc_server",
+                                          "lsarpc",
+                                          "embedded");
+
+       if (strcasecmp_m(rpcsrv_type, "embedded") == 0) {
+               mode = RPC_SERVICE_MODE_EMBEDDED;
+       } else if (strcasecmp_m(rpcsrv_type, "external") == 0) {
+               mode = RPC_SERVICE_MODE_EXTERNAL;
+       } else if (strcasecmp_m(rpcsrv_type, "daemon") == 0) {
+               mode = RPC_SERVICE_MODE_DAEMON;
+       } else {
+               mode = RPC_SERVICE_MODE_DISABLED;
+       }
+
+       return mode;
+}
+
+enum rpc_service_mode_e rpc_samr_mode(void)
+{
+       const char *rpcsrv_type;
+       enum rpc_service_mode_e mode;
+
+       rpcsrv_type = lp_parm_const_string(GLOBAL_SECTION_SNUM,
+                                          "rpc_server",
+                                          "samr",
+                                          "embedded");
+
+       if (strcasecmp_m(rpcsrv_type, "embedded") == 0) {
+               mode = RPC_SERVICE_MODE_EMBEDDED;
+       } else if (strcasecmp_m(rpcsrv_type, "external") == 0) {
+               mode = RPC_SERVICE_MODE_EXTERNAL;
+       } else if (strcasecmp_m(rpcsrv_type, "daemon") == 0) {
+               mode = RPC_SERVICE_MODE_DAEMON;
+       } else {
+               mode = RPC_SERVICE_MODE_DISABLED;
+       }
+
+       return mode;
+}
+
+enum rpc_service_mode_e rpc_netlogon_mode(void)
+{
+       const char *rpcsrv_type;
+       enum rpc_service_mode_e mode;
+
+       rpcsrv_type = lp_parm_const_string(GLOBAL_SECTION_SNUM,
+                                          "rpc_server",
+                                          "netlogon",
+                                          "embedded");
+
+       if (strcasecmp_m(rpcsrv_type, "embedded") == 0) {
+               mode = RPC_SERVICE_MODE_EMBEDDED;
+       } else if (strcasecmp_m(rpcsrv_type, "external") == 0) {
+               mode = RPC_SERVICE_MODE_EXTERNAL;
+       } else if (strcasecmp_m(rpcsrv_type, "daemon") == 0) {
+               mode = RPC_SERVICE_MODE_DAEMON;
+       } else {
+               mode = RPC_SERVICE_MODE_DISABLED;
+       }
+
+       return mode;
+}
+
 static bool rpc_setup_epmapper(struct tevent_context *ev_ctx,
                               struct messaging_context *msg_ctx)
 {
@@ -234,6 +303,7 @@ static bool rpc_setup_lsarpc(struct tevent_context *ev_ctx,
        const char *pipe_name = "lsarpc";
        struct dcerpc_binding_vector *v2;
        enum rpc_service_mode_e epm_mode = rpc_epmapper_mode();
+       enum rpc_service_mode_e lsarpc_mode = rpc_lsarpc_mode();
        NTSTATUS status;
        bool ok;
 
@@ -242,7 +312,8 @@ static bool rpc_setup_lsarpc(struct tevent_context *ev_ctx,
                return false;
        }
 
-       if (epm_mode != RPC_SERVICE_MODE_DISABLED) {
+       if (lsarpc_mode == RPC_SERVICE_MODE_EMBEDDED &&
+           epm_mode != RPC_SERVICE_MODE_DISABLED) {
                v2 = dcerpc_binding_vector_dup(talloc_tos(), v);
                if (v2 == NULL) {
                        return false;
@@ -291,6 +362,7 @@ static bool rpc_setup_samr(struct tevent_context *ev_ctx,
        const char *pipe_name = "samr";
        struct dcerpc_binding_vector *v2;
        enum rpc_service_mode_e epm_mode = rpc_epmapper_mode();
+       enum rpc_service_mode_e samr_mode = rpc_samr_mode();
        NTSTATUS status;
        bool ok;
 
@@ -299,7 +371,8 @@ static bool rpc_setup_samr(struct tevent_context *ev_ctx,
                return false;
        }
 
-       if (epm_mode != RPC_SERVICE_MODE_DISABLED) {
+       if (samr_mode == RPC_SERVICE_MODE_EMBEDDED &&
+           epm_mode != RPC_SERVICE_MODE_DISABLED) {
                v2 = dcerpc_binding_vector_dup(talloc_tos(), v);
                if (v2 == NULL) {
                        return false;
@@ -348,6 +421,7 @@ static bool rpc_setup_netlogon(struct tevent_context *ev_ctx,
        const char *pipe_name = "netlogon";
        struct dcerpc_binding_vector *v2;
        enum rpc_service_mode_e epm_mode = rpc_epmapper_mode();
+       enum rpc_service_mode_e netlogon_mode = rpc_netlogon_mode();
        NTSTATUS status;
        bool ok;
 
@@ -356,7 +430,8 @@ static bool rpc_setup_netlogon(struct tevent_context *ev_ctx,
                return false;
        }
 
-       if (epm_mode != RPC_SERVICE_MODE_DISABLED) {
+       if (netlogon_mode == RPC_SERVICE_MODE_EMBEDDED &&
+           epm_mode != RPC_SERVICE_MODE_DISABLED) {
                v2 = dcerpc_binding_vector_dup(talloc_tos(), v);
                if (v2 == NULL) {
                        return false;
index d369b829f5639bd120c1a8388c10aa70fc5ab540..aef347bdcd84eb249e603d8fe7687c1a6e1b5538 100644 (file)
@@ -45,6 +45,10 @@ enum rpc_service_mode_e rpc_epmapper_mode(void);
  */
 enum rpc_service_mode_e rpc_spoolss_mode(void);
 
+enum rpc_service_mode_e rpc_lsarpc_mode(void);
+enum rpc_service_mode_e rpc_samr_mode(void);
+enum rpc_service_mode_e rpc_netlogon_mode(void);
+
 /**
  * @brief Register an endpoint at the endpoint mapper.
  *