s3-samr: Replace client_id in samr server.
authorAndreas Schneider <asn@samba.org>
Wed, 15 Jun 2011 16:03:30 +0000 (18:03 +0200)
committerAndrew Bartlett <abartlet@samba.org>
Mon, 4 Jul 2011 08:28:10 +0000 (18:28 +1000)
Signed-off-by: Andrew Bartlett <abartlet@samba.org>
source3/rpc_server/samr/srv_samr_nt.c

index a253f307ac6b7c54bd03af637443f9d6a1fbdd60..475a204d5592c3ac3496b9fb84daacefd0d0039d 100644 (file)
@@ -44,6 +44,7 @@
 #include "passdb.h"
 #include "auth.h"
 #include "rpc_server/srv_access_check.h"
+#include "../lib/tsocket/tsocket.h"
 
 #undef DBGC_CLASS
 #define DBGC_CLASS DBGC_RPC_SRV
@@ -1825,7 +1826,9 @@ NTSTATUS _samr_ChangePasswordUser2(struct pipes_struct *p,
 {
        NTSTATUS status;
        char *user_name = NULL;
+       char *rhost;
        fstring wks;
+       int rc;
 
        DEBUG(5,("_samr_ChangePasswordUser2: %d\n", __LINE__));
 
@@ -1846,13 +1849,27 @@ NTSTATUS _samr_ChangePasswordUser2(struct pipes_struct *p,
                return NT_STATUS_NO_MEMORY;
        }
 
+       rc = get_remote_hostname(p->remote_address,
+                                &rhost,
+                                talloc_tos());
+       if (rc < 0) {
+               return NT_STATUS_NO_MEMORY;
+       }
+       if (strequal(rhost,"UNKNOWN")) {
+               rhost = tsocket_address_inet_addr_string(p->remote_address,
+                                                        talloc_tos());
+               if (rhost == NULL) {
+                       return NT_STATUS_NO_MEMORY;
+               }
+       }
+
        /*
         * UNIX username case mangling not required, pass_oem_change
         * is case insensitive.
         */
 
        status = pass_oem_change(user_name,
-                                p->client_id->name,
+                                rhost,
                                 r->in.lm_password->data,
                                 r->in.lm_verifier->hash,
                                 r->in.nt_password->data,
@@ -1878,6 +1895,8 @@ NTSTATUS _samr_OemChangePasswordUser2(struct pipes_struct *p,
        NTSTATUS status;
        char *user_name = NULL;
        const char *wks = NULL;
+       char *rhost;
+       int rc;
 
        DEBUG(5,("_samr_OemChangePasswordUser2: %d\n", __LINE__));
 
@@ -1909,8 +1928,22 @@ NTSTATUS _samr_OemChangePasswordUser2(struct pipes_struct *p,
                return NT_STATUS_INVALID_PARAMETER;
        }
 
+       rc = get_remote_hostname(p->remote_address,
+                                &rhost,
+                                talloc_tos());
+       if (rc < 0) {
+               return NT_STATUS_NO_MEMORY;
+       }
+       if (strequal(rhost,"UNKNOWN")) {
+               rhost = tsocket_address_inet_addr_string(p->remote_address,
+                                                        talloc_tos());
+               if (rhost == NULL) {
+                       return NT_STATUS_NO_MEMORY;
+               }
+       }
+
        status = pass_oem_change(user_name,
-                                p->client_id->name,
+                                rhost,
                                 r->in.password->data,
                                 r->in.hash->hash,
                                 0,
@@ -1940,6 +1973,8 @@ NTSTATUS _samr_ChangePasswordUser3(struct pipes_struct *p,
        struct samr_DomInfo1 *dominfo = NULL;
        struct userPwdChangeFailureInformation *reject = NULL;
        uint32_t tmp;
+       char *rhost;
+       int rc;
 
        DEBUG(5,("_samr_ChangePasswordUser3: %d\n", __LINE__));
 
@@ -1962,13 +1997,27 @@ NTSTATUS _samr_ChangePasswordUser3(struct pipes_struct *p,
                return NT_STATUS_NO_MEMORY;
        }
 
+       rc = get_remote_hostname(p->remote_address,
+                                &rhost,
+                                talloc_tos());
+       if (rc < 0) {
+               return NT_STATUS_NO_MEMORY;
+       }
+       if (strequal(rhost,"UNKNOWN")) {
+               rhost = tsocket_address_inet_addr_string(p->remote_address,
+                                                        talloc_tos());
+               if (rhost == NULL) {
+                       return NT_STATUS_NO_MEMORY;
+               }
+       }
+
        /*
         * UNIX username case mangling not required, pass_oem_change
         * is case insensitive.
         */
 
        status = pass_oem_change(user_name,
-                                p->client_id->name,
+                                rhost,
                                 r->in.lm_password->data,
                                 r->in.lm_verifier->hash,
                                 r->in.nt_password->data,
@@ -5004,6 +5053,8 @@ NTSTATUS _samr_SetUserInfo(struct pipes_struct *p,
        uint32_t acc_required = 0;
        uint32_t fields = 0;
        bool ret;
+       char *rhost;
+       int rc;
 
        DEBUG(5,("_samr_SetUserInfo: %d\n", __LINE__));
 
@@ -5086,6 +5137,20 @@ NTSTATUS _samr_SetUserInfo(struct pipes_struct *p,
                return NT_STATUS_NO_SUCH_USER;
        }
 
+       rc = get_remote_hostname(p->remote_address,
+                                &rhost,
+                                talloc_tos());
+       if (rc < 0) {
+               return NT_STATUS_NO_MEMORY;
+       }
+       if (strequal(rhost,"UNKNOWN")) {
+               rhost = tsocket_address_inet_addr_string(p->remote_address,
+                                                        talloc_tos());
+               if (rhost == NULL) {
+                       return NT_STATUS_NO_MEMORY;
+               }
+       }
+
        /* ================ BEGIN Privilege BLOCK ================ */
 
        become_root();
@@ -5185,7 +5250,7 @@ NTSTATUS _samr_SetUserInfo(struct pipes_struct *p,
 
                        status = set_user_info_23(p->mem_ctx,
                                                  &info->info23,
-                                                 p->client_id->name,
+                                                 rhost,
                                                  pwd);
                        break;
 
@@ -5200,7 +5265,7 @@ NTSTATUS _samr_SetUserInfo(struct pipes_struct *p,
                        dump_data(100, info->info24.password.data, 516);
 
                        status = set_user_info_24(p->mem_ctx,
-                                                 p->client_id->name,
+                                                 rhost,
                                                  &info->info24, pwd);
                        break;
 
@@ -5215,7 +5280,7 @@ NTSTATUS _samr_SetUserInfo(struct pipes_struct *p,
                        dump_data(100, info->info25.password.data, 532);
 
                        status = set_user_info_25(p->mem_ctx,
-                                                 p->client_id->name,
+                                                 rhost,
                                                  &info->info25, pwd);
                        break;
 
@@ -5230,7 +5295,7 @@ NTSTATUS _samr_SetUserInfo(struct pipes_struct *p,
                        dump_data(100, info->info26.password.data, 516);
 
                        status = set_user_info_26(p->mem_ctx,
-                                                 p->client_id->name,
+                                                 rhost,
                                                  &info->info26, pwd);
                        break;