first pass at updating head branch to be to be the same as the SAMBA_2_0 branch
[kai/samba.git] / source3 / rpcclient / cmd_reg.c
index fd5fc71828d5d0d27bb4767a268c164fe43ed956..fcc12c530cc62258637602a543748daa211c7cb4 100644 (file)
@@ -388,12 +388,12 @@ void cmd_reg_create_val(struct client_info *info)
        {
                case 0x01: /* UNISTR */
                {
-                       make_buffer3_str(&value, tmp, strlen(tmp)+1);
+                       init_buffer3_str(&value, tmp, strlen(tmp)+1);
                        break;
                }
                case 0x03: /* BYTES */
                {
-                       make_buffer3_hex(&value, tmp);
+                       init_buffer3_hex(&value, tmp);
                        break;
                }
                case 0x04: /* DWORD */
@@ -407,7 +407,7 @@ void cmd_reg_create_val(struct client_info *info)
                        {
                                tmp_val = strtol(tmp, (char**)NULL, 10);
                        }
-                       make_buffer3_uint32(&value, tmp_val);
+                       init_buffer3_uint32(&value, tmp_val);
                        break;
                }
                default:
@@ -637,7 +637,7 @@ void cmd_reg_create_key(struct client_info *info)
        fstring parent_name;
        fstring key_name;
        fstring key_class;
-       SEC_INFO sam_access;
+       SEC_ACCESS sam_access;
 
        DEBUG(5, ("cmd_reg_create_key: smb_cli->fd:%d\n", smb_cli->fd));
 
@@ -661,7 +661,7 @@ void cmd_reg_create_key(struct client_info *info)
        }
 
        /* set access permissions */
-       sam_access.perms = SEC_RIGHTS_READ;
+       sam_access.mask = SEC_RIGHTS_READ;
 
        /* open WINREG session. */
        res = res ? cli_nt_session_open(smb_cli, PIPE_WINREG) : False;
@@ -717,7 +717,7 @@ void cmd_reg_create_key(struct client_info *info)
 /****************************************************************************
 nt registry security info
 ****************************************************************************/
-void cmd_reg_get_key_sec(struct client_info *info)
+void cmd_reg_test_key_sec(struct client_info *info)
 {
        BOOL res = True;
        BOOL res3 = True;
@@ -732,7 +732,7 @@ void cmd_reg_get_key_sec(struct client_info *info)
         */
 
        uint32 sec_buf_size;
-       SEC_DESC_BUF sec_buf;
+       SEC_DESC_BUF *psdb;
 
        DEBUG(5, ("cmd_reg_get_key_sec: smb_cli->fd:%d\n", smb_cli->fd));
 
@@ -765,23 +765,27 @@ void cmd_reg_get_key_sec(struct client_info *info)
                                 key_name, 0x02000000, &key_pol) : False;
 
        /* query key sec info.  first call sets sec_buf_size. */
-       sec_buf_size = 0;
-       sec_buf.sec = NULL;
 
+       sec_buf_size = 0;
        res4 = res3 ? do_reg_get_key_sec(smb_cli, &key_pol,
-                               &sec_buf_size, &sec_buf) : False;
+                               &sec_buf_size, &psdb) : False;
        
+       free_sec_desc_buf(&psdb);
+
        res4 = res4 ? do_reg_get_key_sec(smb_cli, &key_pol,
-                               &sec_buf_size, &sec_buf) : False;
+                               &sec_buf_size, &psdb) : False;
 
-       if (res4 && sec_buf.len > 0 && sec_buf.sec != NULL)
+       if (res4 && psdb->len > 0 && psdb->sec != NULL)
        {
-               display_sec_desc(out_hnd, ACTION_HEADER   , sec_buf.sec);
-               display_sec_desc(out_hnd, ACTION_ENUMERATE, sec_buf.sec);
-               display_sec_desc(out_hnd, ACTION_FOOTER   , sec_buf.sec);
-               free(sec_buf.sec);
+               display_sec_desc(out_hnd, ACTION_HEADER   , psdb->sec);
+               display_sec_desc(out_hnd, ACTION_ENUMERATE, psdb->sec);
+               display_sec_desc(out_hnd, ACTION_FOOTER   , psdb->sec);
+
+               res4 = res4 ? do_reg_set_key_sec(smb_cli, &key_pol, psdb) : False;
        }
 
+       free_sec_desc_buf(&psdb);
+
        /* close the key handle */
        if ((*key_name) != 0)
        {
@@ -805,3 +809,93 @@ void cmd_reg_get_key_sec(struct client_info *info)
        }
 }
 
+/****************************************************************************
+nt registry security info
+****************************************************************************/
+void cmd_reg_get_key_sec(struct client_info *info)
+{
+       BOOL res = True;
+       BOOL res3 = True;
+       BOOL res4 = True;
+
+       POLICY_HND key_pol;
+       fstring full_keyname;
+       fstring key_name;
+
+       /*
+        * security info
+        */
+
+       uint32 sec_buf_size;
+       SEC_DESC_BUF *psdb;
+
+       DEBUG(5, ("cmd_reg_get_key_sec: smb_cli->fd:%d\n", smb_cli->fd));
+
+       if (!next_token(NULL, full_keyname, NULL, sizeof(full_keyname)))
+       {
+               fprintf(out_hnd, "reggetsec <key_name>\n");
+               return;
+       }
+
+       /* open WINREG session. */
+       res = res ? cli_nt_session_open(smb_cli, PIPE_WINREG) : False;
+
+       /* open registry receive a policy handle */
+       res = res ? do_reg_connect(smb_cli, full_keyname, key_name,
+                               &info->dom.reg_pol_connect) : False;
+
+       if ((*key_name) != 0)
+       {
+               /* open an entry */
+               res3 = res  ? do_reg_open_entry(smb_cli, &info->dom.reg_pol_connect,
+                                        key_name, 0x02000000, &key_pol) : False;
+       }
+       else
+       {
+               memcpy(&key_pol, &info->dom.reg_pol_connect, sizeof(key_pol));
+       }
+
+       /* open an entry */
+       res3 = res ? do_reg_open_entry(smb_cli, &info->dom.reg_pol_connect,
+                                key_name, 0x02000000, &key_pol) : False;
+
+       /* Get the size. */
+       sec_buf_size = 0;
+       res4 = res3 ? do_reg_get_key_sec(smb_cli, &key_pol,
+                               &sec_buf_size, &psdb) : False;
+       
+       free_sec_desc_buf(&psdb);
+
+       res4 = res4 ? do_reg_get_key_sec(smb_cli, &key_pol,
+                               &sec_buf_size, &psdb) : False;
+
+       if (res4 && psdb->len > 0 && psdb->sec != NULL)
+       {
+               display_sec_desc(out_hnd, ACTION_HEADER   , psdb->sec);
+               display_sec_desc(out_hnd, ACTION_ENUMERATE, psdb->sec);
+               display_sec_desc(out_hnd, ACTION_FOOTER   , psdb->sec);
+       }
+
+       free_sec_desc_buf(&psdb);
+
+       /* close the key handle */
+       if ((*key_name) != 0)
+       {
+               res3 = res3 ? do_reg_close(smb_cli, &key_pol) : False;
+       }
+
+       /* close the registry handles */
+       res  = res  ? do_reg_close(smb_cli, &info->dom.reg_pol_connect) : False;
+
+       /* close the session */
+       cli_nt_session_close(smb_cli);
+
+       if (res && res3 && res4)
+       {
+               DEBUG(5,("cmd_reg_get_key_sec: query succeeded\n"));
+       }
+       else
+       {
+               DEBUG(5,("cmd_reg_get_key_sec: query failed\n"));
+       }
+}