BDC support.
authorLuke Leighton <lkcl@samba.org>
Wed, 21 Jul 1999 00:32:09 +0000 (00:32 +0000)
committerLuke Leighton <lkcl@samba.org>
Wed, 21 Jul 1999 00:32:09 +0000 (00:32 +0000)
(This used to be commit 2331aa32ab36c3ee5fd8cfbe972e57299939e33d)

14 files changed:
source3/include/proto.h
source3/include/rpc_netlogon.h
source3/lib/domain_namemap.c
source3/lib/sids.c
source3/lib/util.c
source3/lib/util_pwdb.c
source3/libsmb/smbdes.c
source3/passdb/smbpassfile.c
source3/rpc_client/cli_netlogon.c
source3/rpc_parse/parse_net.c
source3/rpc_parse/parse_prs.c
source3/rpcclient/cmd_netlogon.c
source3/rpcclient/display.c
source3/utils/smbpasswd.c

index 4cea4b6ceea096f3346dfecae6f3821314ca9af3..10d2054d1e3914a1b4b7f625817492c10494752e 100644 (file)
@@ -474,6 +474,7 @@ enum remote_arch_types get_remote_arch(void);
 char *align4(char *q, char *base);
 char *align2(char *q, char *base);
 void out_ascii(FILE *f, unsigned char *buf,int len);
+void out_struct(FILE *f,char *buf1,int len, int per_line);
 void out_data(FILE *f,char *buf1,int len, int per_line);
 void print_asc(int level, unsigned char const *buf,int len);
 void dump_data(int level, const char *buf1, int len);
@@ -1759,7 +1760,10 @@ BOOL cli_net_sam_logoff(struct cli_state *cli, uint16 nt_pipe_fnum, NET_ID_INFO_
 BOOL cli_net_sam_sync(struct cli_state *cli, uint16 nt_pipe_fnum, uint32 database_id, uint32 *num_deltas, SAM_DELTA_HDR *hdr_deltas, SAM_DELTA_CTR *deltas);
 BOOL change_trust_account_password(char *domain, char *remote_machine_list,
                                        uint16 sec_chan);
-BOOL do_sam_sync(struct cli_state *cli);
+BOOL do_sam_sync(struct cli_state *cli,
+                               SAM_DELTA_HDR hdr_deltas[MAX_SAM_DELTAS],
+                               SAM_DELTA_CTR deltas    [MAX_SAM_DELTAS],
+                               uint32 *num_deltas);
 
 /*The following definitions come from  rpc_client/cli_pipe.c  */
 
@@ -2247,7 +2251,8 @@ void make_sam_account_info(SAM_ACCOUNT_INFO *info, char *user_name,
                           char *full_name, uint32 user_rid, uint32 group_rid,
                           char *home_dir, char *dir_drive, char *logon_script,
                           char *acct_desc, uint32 acb_info, char *profile);
-void net_io_r_sam_sync(char *desc, NET_R_SAM_SYNC *r_s, prs_struct *ps, int depth);
+void net_io_r_sam_sync(char *desc, uint8 sess_key[16],
+                               NET_R_SAM_SYNC *r_s, prs_struct *ps, int depth);
 
 /*The following definitions come from  rpc_parse/parse_prs.c  */
 
@@ -2261,6 +2266,7 @@ void prs_align(prs_struct *ps);
 BOOL prs_grow(prs_struct *ps);
 BOOL prs_uint8(char *name, prs_struct *ps, int depth, uint8 *data8);
 BOOL prs_uint16(char *name, prs_struct *ps, int depth, uint16 *data16);
+BOOL prs_hash1(prs_struct *ps, uint32 offset, uint8 sess_key[16]);
 BOOL prs_uint32(char *name, prs_struct *ps, int depth, uint32 *data32);
 BOOL prs_uint8s(BOOL charmode, char *name, prs_struct *ps, int depth, uint8 *data8s, int len);
 BOOL prs_uint16s(BOOL charmode, char *name, prs_struct *ps, int depth, uint16 *data16s, int len);
@@ -3253,6 +3259,13 @@ void display_at_enum_info(FILE *out_hnd, enum action_type action,
 void display_at_job_info(FILE *out_hnd, enum action_type action,
                     AT_JOB_INFO *job, fstring command);
 void display_eventlog_eventrecord(FILE *out_hnd, enum action_type action, EVENTLOGRECORD *ev);
+void display_sam_sync_ctr(FILE *out_hnd, enum action_type action,
+                               SAM_DELTA_HDR *delta,
+                               SAM_DELTA_CTR *ctr);
+void display_sam_sync(FILE *out_hnd, enum action_type action,
+                               SAM_DELTA_HDR *deltas,
+                               SAM_DELTA_CTR *ctr,
+                               uint32 num);
 
 /*The following definitions come from  rpcclient/rpcclient.c  */
 
@@ -3316,7 +3329,7 @@ SMB_BIG_UINT sys_disk_free(char *path,SMB_BIG_UINT *bsize,SMB_BIG_UINT *dfree,SM
 
 BOOL init_dfs_table(void);
 int under_dfs(connection_struct *conn, const char *path,
-                               char *local_path, size_t path_len);
+                               char *local_path, size_t local_plen);
 
 /*The following definitions come from  smbd/dir.c  */
 
index 2c02e96d18f559dab985c105e7fe78178f7d0310..6e28280dccf5074e8e1c4e600f4f19fa2e09ea46 100644 (file)
@@ -447,6 +447,26 @@ typedef struct sam_group_info_info
 
 } SAM_GROUP_INFO;
 
+/* SAM_PWD */
+typedef struct sam_passwd_info
+{
+       uint32 unk_0; /* 0x0000 0002 */
+
+       UNIHDR hdr_lm_pwd;
+       uint8  buf_lm_pwd[16];
+
+       uint32 ptr_1; 
+
+       UNIHDR hdr_nt_pwd;
+       uint8  buf_nt_pwd[16];
+
+       uint32 ptr_2; 
+       uint32 ptr_3; 
+       uint32 ptr_4; 
+       uint32 ptr_5; 
+
+} SAM_PWD;
+
 /* SAM_ACCOUNT_INFO (0x5) */
 typedef struct sam_account_info_info
 {
@@ -485,7 +505,6 @@ typedef struct sam_account_info_info
        uint16 country;
        uint16 codepage;
 
-       BUFHDR2 hdr_priv_data;
        BUFHDR2 hdr_sec_desc;  /* security descriptor */
 
        UNIHDR  hdr_profile;
@@ -507,7 +526,7 @@ typedef struct sam_account_info_info
        BUFFER4 buf_logon_hrs;
        UNISTR2 uni_comment;
        UNISTR2 uni_parameters;
-       BUFFER4 buf_priv_data;
+       SAM_PWD pass;
        BUFFER4 buf_sec_desc;
        UNISTR2 uni_profile;
 
index fb6ecf2acf94fc1ed1b641143c469ce008e0c1db..ed4325a4d719e79ff389225de34a68b18a451ad7 100644 (file)
@@ -891,6 +891,8 @@ static BOOL lookup_remote_ntname(const char *ntname, DOM_SID *sid, uint8 *type)
        uint8 *types;
        const char *names[1];
 
+       DEBUG(5,("lookup_remote_ntname: %s\n", ntname));
+
        if (!cli_connect_serverlist(&cli, lp_passwordserver()))
        {
                return False;
index 7eb968a435eced7fc512a1116175513b1e0cf561..c75168ee56617d41caee218f98f6b48875cb8369 100644 (file)
@@ -196,7 +196,7 @@ BOOL get_domain_sids(DOM_SID *sid3, DOM_SID *sid5, char *servers)
 
        if (!cli_connect_serverlist(&cli, servers))
        {
-               DEBUG(0,("get_member_domain_sid: unable to initialise client connection.\n"));
+               DEBUG(0,("get_domain_sids: unable to initialise client connection.\n"));
                return False;
        }
 
index 8a9452ee00aa2b38ee47a07df3d85441fd7bb796..9a4d0d9e252c92b3c0c0ea7fd23aeb5aa0e26acc 100644 (file)
@@ -2931,6 +2931,33 @@ void out_ascii(FILE *f, unsigned char *buf,int len)
        }
 }
 
+void out_struct(FILE *f,char *buf1,int len, int per_line)
+{
+       unsigned char *buf = (unsigned char *)buf1;
+       int i;
+
+       if (len<=0)
+       {
+               return;
+       }
+
+       fprintf(f, "{\n\t");
+       for (i=0;i<len;)
+       {
+               fprintf(f, "0x%02X",(int)buf[i]);
+               i++;
+               if (i != len)
+               {
+                       fprintf(f, ", ");
+               }
+               if (i%per_line == 0 && i != len)
+               {      
+                       fprintf(f, "\n\t");
+               }
+       }
+       fprintf(f, "\n};\n");    
+}
+
 void out_data(FILE *f,char *buf1,int len, int per_line)
 {
        unsigned char *buf = (unsigned char *)buf1;
index f78bdfff5d20de2183294a1cb99e013968e810a1..0bf0cd9c4f0af5f783346b7a1edc07a6359950b9 100644 (file)
@@ -625,7 +625,16 @@ BOOL pwdb_initialise(BOOL is_server)
        }
        else
        {
-               if (!get_domain_sids(&global_member_sid, &global_sam_sid, global_myname))
+               char *srvs;
+               if (lp_server_role() == ROLE_DOMAIN_PDC)
+               {
+                       srvs = global_myname;
+               }
+               else
+               {
+                       srvs = lp_passwordserver();
+               }
+               if (!get_domain_sids(&global_member_sid, &global_sam_sid, srvs))
                {
                        return False;
                }
index 579d0dd8b4b81f2f54813a575259f128733ccd2e..fa7d64cec867c2161d6992d66ef3b6cc18734479 100644 (file)
@@ -365,6 +365,10 @@ void SamOEMhash( unsigned char *data, unsigned char *key, int val)
   unsigned char index_j = 0;
   unsigned char j = 0;
   int ind;
+  int len = 0;
+  if (val == 1) len = 516;
+  if (val == 0) len = 16;
+  if (val == 2) len = 68;
 
   for (ind = 0; ind < 256; ind++)
   {
@@ -381,7 +385,7 @@ void SamOEMhash( unsigned char *data, unsigned char *key, int val)
      s_box[ind] = s_box[j];
      s_box[j] = tc;
   }
-  for( ind = 0; ind < (val ? 516 : 16); ind++)
+  for( ind = 0; ind < len; ind++)
   {
     unsigned char tc;
     unsigned char t;
index 0165d76488e2099d43f6a5b1ab3956826a25e711..ecf9efe303e24a6f63bc9cffae1483c01f340f6c 100644 (file)
@@ -52,6 +52,8 @@ static void get_trust_account_file_name( char *domain, char *name, char *mac_fil
   pstrcat(mac_file, ".");
   pstrcat(mac_file, name);
   pstrcat(mac_file, ".mac");
+
+  DEBUG(5,("trust_account_file_name: %s\n", mac_file));
 }
  
 /************************************************************************
index c7483677f058a96b83923142532dcae84a6a0744..188390ae54a55529bc2b6288bf07c0462646b818 100644 (file)
@@ -505,7 +505,7 @@ BOOL cli_net_sam_sync(struct cli_state *cli, uint16 nt_pipe_fnum, uint32 databas
                r_s.hdr_deltas = hdr_deltas;
                r_s.deltas = deltas;
 
-               net_io_r_sam_sync("", &r_s, &rbuf, 0);
+               net_io_r_sam_sync("", cli->sess_key, &r_s, &rbuf, 0);
                ok = (rbuf.offset != 0);
 
                if (ok && r_s.status != 0 && r_s.status != NT_STATUS_MORE_ENTRIES)
@@ -713,20 +713,19 @@ domain %s.\n", timestring(), domain));
   return False;
 }
 
-BOOL do_sam_sync(struct cli_state *cli)
+BOOL do_sam_sync(struct cli_state *cli,
+                               SAM_DELTA_HDR hdr_deltas[MAX_SAM_DELTAS],
+                               SAM_DELTA_CTR deltas    [MAX_SAM_DELTAS],
+                               uint32 *num_deltas)
 {
        uint16 nt_pipe_fnum;
        BOOL res = True;
        unsigned char trust_passwd[16];
-       int i, j;
 
-       SAM_DELTA_HDR hdr_deltas[MAX_SAM_DELTAS];
-       SAM_DELTA_CTR deltas[MAX_SAM_DELTAS];
-       uint32 num_deltas;
-       fstring name;
-       char *data;
+       *num_deltas = 0;
 
-       DEBUG(2,("Attempting SAM synchronisation with PDC\n"));
+       DEBUG(2,("Attempting SAM sync with PDC, domain: %s name: %s\n",
+               cli->domain, global_myname));
 
        res = res ? trust_get_passwd(trust_passwd, cli->domain, global_myname) : False;
 
@@ -736,10 +735,10 @@ BOOL do_sam_sync(struct cli_state *cli)
        res = res ? cli_nt_setup_creds(cli, nt_pipe_fnum, cli->mach_acct,
                                       trust_passwd, SEC_CHAN_BDC) : False;
 
-       res = res ? cli_net_sam_sync(cli, nt_pipe_fnum, 0, &num_deltas, hdr_deltas, deltas) : False;
-
        memset(trust_passwd, 0, 16);
 
+       res = res ? cli_net_sam_sync(cli, nt_pipe_fnum, 0, num_deltas, hdr_deltas, deltas) : False;
+
        /* close the session */
        cli_nt_session_close(cli, nt_pipe_fnum);
 
@@ -749,34 +748,7 @@ BOOL do_sam_sync(struct cli_state *cli)
                return False;
        }
 
-       DEBUG(0, ("SAM synchronisation returned %d entries\n", num_deltas));
-
-       for (i = 0; i < num_deltas; i++)
-       {
-               switch (hdr_deltas[i].type)
-               {
-               case 1:
-                       unistr2_to_ascii(name, &(deltas[i].domain_info.uni_dom_name), sizeof(fstring)-1); 
-                       DEBUG(0, ("Domain: %s\n", name));
-                       break;
-                       
-               case 2:
-                       unistr2_to_ascii(name, &(deltas[i].group_info.uni_grp_name), sizeof(fstring)-1); 
-                       DEBUG(0, ("Group: %s\n", name));
-                       break;
-
-               case 5:
-                       unistr2_to_ascii(name, &(deltas[i].account_info.uni_acct_name), sizeof(fstring)-1); 
-                       DEBUG(0, ("Account: %s\n", name));
-
-                       data = deltas[i].account_info.buf_priv_data.buffer;
-                       for (j = 0; j < deltas[i].account_info.buf_priv_data.buf_len; j++)
-                       {
-                               snprintf(&name[2*j], 3, "%02X", data[j]);
-                       }
-                       DEBUG(0, ("Private Data: %s\n", name));
-               }
-       }
+       DEBUG(0, ("SAM synchronisation returned %d entries\n", *num_deltas));
 
        return True;
 }
index 271ac3afeb964d0aaff57d82947190bda789c1e9..b74fb7ab0df05b8f005a0ab0126a314df2066895 100644 (file)
@@ -1288,7 +1288,6 @@ void make_sam_account_info(SAM_ACCOUNT_INFO *info, char *user_name,
         make_uni_hdr(&(info->hdr_workstations), 0);
         make_uni_hdr(&(info->hdr_comment), 0);
         make_uni_hdr(&(info->hdr_parameters), 0);
-       make_bufhdr2(&(info->hdr_priv_data), 0, 0, 0);
        make_bufhdr2(&(info->hdr_sec_desc), 0, 0, 0);
 
        info->user_rid = user_rid;
@@ -1326,8 +1325,37 @@ void make_sam_account_info(SAM_ACCOUNT_INFO *info, char *user_name,
 /*******************************************************************
 reads or writes a structure.
 ********************************************************************/
-static void net_io_sam_account_info(char *desc, SAM_ACCOUNT_INFO *info, prs_struct *ps, int depth)
+static void net_io_sam_passwd_info(char *desc, SAM_PWD *pwd,
+                               prs_struct *ps, int depth)
 {
+       if (pwd == NULL) return;
+
+       prs_debug(ps, depth, desc, "net_io_sam_passwd_info");
+       depth++;
+
+       prs_uint32("unk_0 ", ps, depth, &(pwd->unk_0 ));
+
+       smb_io_unihdr ("hdr_lm_pwd", &(pwd->hdr_lm_pwd), ps, depth);
+       prs_uint8s(False, "buf_lm_pwd", ps, depth, pwd->buf_lm_pwd, 16);
+       
+       prs_uint32("ptr_1 ", ps, depth, &(pwd->ptr_1 ));
+
+       smb_io_unihdr ("hdr_nt_pwd", &(pwd->hdr_nt_pwd), ps, depth);
+       prs_uint8s(False, "buf_nt_pwd", ps, depth, pwd->buf_nt_pwd, 16);
+       
+       prs_uint32("ptr_2 ", ps, depth, &(pwd->ptr_2 ));
+       prs_uint32("ptr_3 ", ps, depth, &(pwd->ptr_3 ));
+       prs_uint32("ptr_4 ", ps, depth, &(pwd->ptr_4 ));
+       prs_uint32("ptr_5 ", ps, depth, &(pwd->ptr_5 ));
+}
+
+/*******************************************************************
+reads or writes a structure.
+********************************************************************/
+static void net_io_sam_account_info(char *desc, uint8 sess_key[16],
+                       SAM_ACCOUNT_INFO *info, prs_struct *ps, int depth)
+{
+       BUFHDR2 hdr_priv_data;
        int i;
 
        if (info == NULL) return;
@@ -1370,7 +1398,7 @@ static void net_io_sam_account_info(char *desc, SAM_ACCOUNT_INFO *info, prs_stru
        prs_uint16("country" , ps, depth, &(info->country ));
        prs_uint16("codepage", ps, depth, &(info->codepage));
 
-       smb_io_bufhdr2("hdr_priv_data", &(info->hdr_priv_data), ps, depth);
+       smb_io_bufhdr2("hdr_priv_data", &(hdr_priv_data), ps, depth);
        smb_io_bufhdr2("hdr_sec_desc" , &(info->hdr_sec_desc) , ps, depth);
        smb_io_unihdr ("hdr_profile"  , &(info->hdr_profile)  , ps, depth);
 
@@ -1386,34 +1414,66 @@ static void net_io_sam_account_info(char *desc, SAM_ACCOUNT_INFO *info, prs_stru
 
        smb_io_unistr2("uni_acct_name", &(info->uni_acct_name),
                       info->hdr_acct_name.buffer, ps, depth);
+       prs_align(ps);
        smb_io_unistr2("uni_full_name", &(info->uni_full_name),
                       info->hdr_full_name.buffer, ps, depth);
+       prs_align(ps);
        smb_io_unistr2("uni_home_dir ", &(info->uni_home_dir ),
                       info->hdr_home_dir .buffer, ps, depth);
+       prs_align(ps);
        smb_io_unistr2("uni_dir_drive", &(info->uni_dir_drive),
                       info->hdr_dir_drive.buffer, ps, depth);
+       prs_align(ps);
        smb_io_unistr2("uni_logon_script", &(info->uni_logon_script),
                       info->hdr_logon_script.buffer, ps, depth);
+       prs_align(ps);
        smb_io_unistr2("uni_acct_desc", &(info->uni_acct_desc),
                       info->hdr_acct_desc.buffer, ps, depth);
+       prs_align(ps);
        smb_io_unistr2("uni_workstations", &(info->uni_workstations),
                       info->hdr_workstations.buffer, ps, depth);
+       prs_align(ps);
 
        prs_uint32("unknown1", ps, depth, &(info->unknown1));
        prs_uint32("unknown2", ps, depth, &(info->unknown2));
 
        smb_io_buffer4("buf_logon_hrs" , &(info->buf_logon_hrs ),
                       info->ptr_logon_hrs, ps, depth);
+       prs_align(ps);
        smb_io_unistr2("uni_comment"   , &(info->uni_comment   ),
                       info->hdr_comment.buffer, ps, depth);
+       prs_align(ps);
        smb_io_unistr2("uni_parameters", &(info->uni_parameters),
                       info->hdr_parameters.buffer, ps, depth);
-       smb_io_buffer4("buf_priv_data" , &(info->buf_priv_data ),
-                      info->hdr_priv_data.buffer, ps, depth);
+       prs_align(ps);
+       if (hdr_priv_data.buffer != 0)
+       {
+               int old_offset;
+               uint32 len = 0x44;
+               prs_uint32("pwd_len", ps, depth, &len);
+               old_offset = ps->offset;
+               if (len == 0x44)
+               {
+                       if (ps->io)
+                       {
+                               /* reading */
+                               prs_hash1(ps, ps->offset, sess_key);
+                       }
+                       net_io_sam_passwd_info("pass", &(info->pass), ps, depth);
+                       if (!ps->io)
+                       {
+                               /* writing */
+                               prs_hash1(ps, old_offset, sess_key);
+                       }
+               }
+               ps->offset = old_offset + len;
+       }
        smb_io_buffer4("buf_sec_desc"  , &(info->buf_sec_desc  ),
                       info->hdr_sec_desc.buffer, ps, depth);
+       prs_align(ps);
        smb_io_unistr2("uni_profile"   , &(info->uni_profile   ),
                       info->hdr_profile.buffer, ps, depth);
+       prs_align(ps);
 }
 
 /*******************************************************************
@@ -1551,7 +1611,9 @@ static void net_io_sam_alias_mem_info(char *desc, SAM_ALIAS_MEM_INFO *info, prs_
 /*******************************************************************
 reads or writes a structure.
 ********************************************************************/
-static void net_io_sam_delta_ctr(char *desc, SAM_DELTA_CTR *delta, uint16 type, prs_struct *ps, int depth)
+static void net_io_sam_delta_ctr(char *desc, uint8 sess_key[16],
+                               SAM_DELTA_CTR *delta, uint16 type,
+                               prs_struct *ps, int depth)
 {
        if (delta == NULL) return;
 
@@ -1560,34 +1622,56 @@ static void net_io_sam_delta_ctr(char *desc, SAM_DELTA_CTR *delta, uint16 type,
 
        switch (type)
        {
-       case 1:
-               net_io_sam_domain_info("", &(delta->domain_info), ps, depth);
-               break;
-       case 2:
-               net_io_sam_group_info("", &(delta->group_info), ps, depth);
-               break;
-       case 5:
-               net_io_sam_account_info("", &(delta->account_info), ps, depth);
-               break;
-       case 8:
-               net_io_sam_group_mem_info("", &(delta->grp_mem_info), ps, depth);
-               break;
-       case 9:
-               net_io_sam_alias_info("", &(delta->alias_info), ps, depth);
-               break;
-       case 0xC:
-               net_io_sam_alias_mem_info("", &(delta->als_mem_info), ps, depth);
-               break;
-       default:
-               DEBUG(0, ("Replication error: Unknown delta type %x\n", type));
+               case 1:
+               {
+                       net_io_sam_domain_info("", &(delta->domain_info),
+                                                  ps, depth);
+                       break;
+               }
+               case 2:
+               {
+                       net_io_sam_group_info("", &(delta->group_info), 
+                                                  ps, depth);
+                       break;
+               }
+               case 5:
+               {
+                       net_io_sam_account_info("", sess_key,
+                                               &(delta->account_info), 
+                                                  ps, depth);
+                       break;
+               }
+               case 8:
+               {
+                       net_io_sam_group_mem_info("", &(delta->grp_mem_info), 
+                                                  ps, depth);
+                       break;
+               }
+               case 9:
+               {
+                       net_io_sam_alias_info("", &(delta->alias_info), 
+                                                  ps, depth);
+                       break;
+               }
+               case 0xC:
+               {
+                       net_io_sam_alias_mem_info("", &(delta->als_mem_info), 
+                                                  ps, depth);
+                       break;
+               }
+               default:
+               {
+                       DEBUG(0, ("Replication error: Unknown delta type %x\n", type));
+                       break;
+               }
        }
-
 }
 
 /*******************************************************************
 reads or writes a structure.
 ********************************************************************/
-void net_io_r_sam_sync(char *desc, NET_R_SAM_SYNC *r_s, prs_struct *ps, int depth)
+void net_io_r_sam_sync(char *desc, uint8 sess_key[16],
+                               NET_R_SAM_SYNC *r_s, prs_struct *ps, int depth)
 {
        int i;
 
@@ -1620,7 +1704,8 @@ void net_io_r_sam_sync(char *desc, NET_R_SAM_SYNC *r_s, prs_struct *ps, int dept
 
                        for (i = 0; i < r_s->num_deltas2; i++)
                        {
-                               net_io_sam_delta_ctr("", &r_s->deltas[i],
+                               net_io_sam_delta_ctr("", sess_key,
+                                         &r_s->deltas[i],
                                          r_s->hdr_deltas[i].type3, ps, depth);
                        }
                }
index a231fb57cfb2148415c9885d93f2ce6ef42ec76d..c55ec9c2257ed4b04c097c00b0abbb7ba6af6ea0 100644 (file)
@@ -128,6 +128,27 @@ BOOL prs_uint16(char *name, prs_struct *ps, int depth, uint16 *data16)
        return True;
 }
 
+/*******************************************************************
+ hash a stream.
+ ********************************************************************/
+BOOL prs_hash1(prs_struct *ps, uint32 offset, uint8 sess_key[16])
+{
+       char *q = mem_data(&(ps->data), offset);
+       if (q == NULL) return False;
+
+#ifdef DEBUG_PASSWORD
+       DEBUG(100,("prs_hash1\n"));
+       dump_data(100, sess_key, 16);
+       dump_data(100, q, 68);
+#endif
+       SamOEMhash(q, sess_key, 2);
+#ifdef DEBUG_PASSWORD
+       dump_data(100, q, 68);
+#endif
+
+       return True;
+}
+
 /*******************************************************************
  stream a uint32
  ********************************************************************/
index def5dba297471c81ad90f89760af49a6f78ba7ad..1d99b99f9ce3ef85eda9172a7e9641f5eb956d7c 100644 (file)
@@ -179,5 +179,14 @@ experimental SAM synchronisation.
 ****************************************************************************/
 void cmd_sam_sync(struct client_info *info)
 {
-       do_sam_sync(smb_cli);
+       SAM_DELTA_HDR hdr_deltas[MAX_SAM_DELTAS];
+       SAM_DELTA_CTR deltas[MAX_SAM_DELTAS];
+       uint32 num;
+
+       if (do_sam_sync(smb_cli, hdr_deltas, deltas, &num))
+       {
+               display_sam_sync(out_hnd, ACTION_HEADER   , hdr_deltas, deltas, num);
+               display_sam_sync(out_hnd, ACTION_ENUMERATE, hdr_deltas, deltas, num);
+               display_sam_sync(out_hnd, ACTION_FOOTER   , hdr_deltas, deltas, num);
+       }
 }
index dc801805c686dbeb8e14ee58605c69fceb619e1d..97e1cc834449fb2e65fb5322561822182e1b579b 100644 (file)
@@ -1903,6 +1903,94 @@ void display_eventlog_eventrecord(FILE *out_hnd, enum action_type action, EVENTL
        }
 }
 
+/****************************************************************************
+ display sam sync structure
+ ****************************************************************************/
+void display_sam_sync_ctr(FILE *out_hnd, enum action_type action,
+                               SAM_DELTA_HDR *delta,
+                               SAM_DELTA_CTR *ctr)
+{
+       fstring name;
+
+       switch (action)
+       {
+               case ACTION_HEADER:
+               {
+                       break;
+               }
+               case ACTION_ENUMERATE:
+               {
+                       switch (delta->type)
+                       {
+                               case 1:
+                               {
+                                       unistr2_to_ascii(name, &(ctr->domain_info.uni_dom_name), sizeof(name)-1); 
+                                       fprintf(out_hnd, "Domain: %s\n", name);
+                                       break;
+                               }
+                               case 2:
+                               {
+                                       unistr2_to_ascii(name, &(ctr->group_info.uni_grp_name), sizeof(name)-1); 
+                                       fprintf(out_hnd, "Group: %s\n", name);
+                                       break;
+                               }
+                               case 5:
+                               {
+                                       unistr2_to_ascii(name, &(ctr->account_info.uni_acct_name), sizeof(name)-1); 
+                                       fprintf(out_hnd, "Account: %s\n", name);
+
+                                       out_struct(out_hnd,
+                                               ctr->account_info.pass.buf_lm_pwd, 16, 8);
+                                       out_struct(out_hnd,
+                                               ctr->account_info.pass.buf_nt_pwd, 16, 8);
+                                               
+                               }
+                       }
+                       break;
+               }
+               case ACTION_FOOTER:
+               {
+                       break;
+               }
+       }
+}
+
+/****************************************************************************
+ display sam sync structure
+ ****************************************************************************/
+void display_sam_sync(FILE *out_hnd, enum action_type action,
+                               SAM_DELTA_HDR *deltas,
+                               SAM_DELTA_CTR *ctr,
+                               uint32 num)
+{
+       switch (action)
+       {
+               case ACTION_HEADER:
+               {
+                       fprintf(out_hnd, "\tSAM Database Sync\n"); 
+                       fprintf(out_hnd, "\t-----------------\n");
+
+                       break;
+               }
+               case ACTION_ENUMERATE:
+               {
+                       int i;
+                       for (i = 0; i < num; i++)
+                       {
+                               display_sam_sync_ctr(out_hnd, ACTION_HEADER   , &deltas[i], &ctr[i]);
+                               display_sam_sync_ctr(out_hnd, ACTION_ENUMERATE, &deltas[i], &ctr[i]);
+                               display_sam_sync_ctr(out_hnd, ACTION_FOOTER   , &deltas[i], &ctr[i]);
+                       }
+                       break;
+               }
+               case ACTION_FOOTER:
+               {
+                       fprintf(out_hnd, "\n");
+                       break;
+               }
+       }
+}
+
 
 #if COPY_THIS_TEMPLATE
 /****************************************************************************
index 29f2d364e56dd89a0bfcd9de81b62c0294bd3083..e9360651da450b6367ab3dfbec769c9b6dee2e8b 100644 (file)
@@ -89,6 +89,8 @@ static int join_domain(char *domain, char *remote)
        BOOL ret;
        uint16 sec_chan;
 
+       DEBUG(5,("join_domain: domain %s remote %s\n", domain, remote));
+
        pstrcpy(remote_machine, remote ? remote : "");
        fstrcpy(trust_passwd, global_myname);
        strlower(trust_passwd);
@@ -97,19 +99,28 @@ static int join_domain(char *domain, char *remote)
        switch (lp_server_role())
        {
                case ROLE_DOMAIN_PDC:
+               {
                        DEBUG(0, ("Cannot join domain - we are PDC!\n"));
-                       return;
+                       return 1;
+               }
                case ROLE_DOMAIN_BDC:
+               {
+                       DEBUG(0, ("Joining Domain as BDC\n"));
                        sec_chan = SEC_CHAN_BDC;
                        break;
+               }
                default:
+               {
+                       DEBUG(0, ("Joining Domain as Workstation\n"));
                        sec_chan = SEC_CHAN_WKSTA;
+               }
        }
 
        /*
         * Create the machine account password file.
         */
-       if(!trust_password_lock( domain, global_myname, True)) {
+       if(!trust_password_lock( domain, global_myname, True))
+       {
                fprintf(stderr, "unable to open the machine account password file for \
 machine %s in domain %s.\n", global_myname, domain); 
                return 1;
@@ -119,7 +130,8 @@ machine %s in domain %s.\n", global_myname, domain);
         * Write the old machine account password.
         */
        
-       if(!set_trust_account_password( orig_trust_passwd_hash)) {              
+       if(!set_trust_account_password( orig_trust_passwd_hash))
+       {              
                fprintf(stderr, "unable to write the machine account password for \
 machine %s in domain %s.\n", global_myname, domain);
                trust_password_unlock();
@@ -130,7 +142,8 @@ machine %s in domain %s.\n", global_myname, domain);
         * If we are given a remote machine assume this is the PDC.
         */
        
-       if(remote == NULL) {
+       if(remote == NULL)
+       {
                pstrcpy(remote_machine, lp_passwordserver());
        }
 
@@ -145,12 +158,15 @@ unable to join domain.\n");
        trust_password_unlock();
        
        if(!ret) {
-               trust_password_delete( domain, global_myname);
                fprintf(stderr,"Unable to join domain %s.\n",domain);
        } else {
                printf("Joined domain %s.\n",domain);
        }
        
+#if 0
+       trust_password_delete( domain, global_myname);
+#endif
+
        return (int)ret;
 }