LsaLookupNames client call (first used as lookupnames command in rpcclient).
authorLuke Leighton <lkcl@samba.org>
Wed, 25 Nov 1998 19:57:04 +0000 (19:57 +0000)
committerLuke Leighton <lkcl@samba.org>
Wed, 25 Nov 1998 19:57:04 +0000 (19:57 +0000)
(This used to be commit 68342a29a892e515cf2b22d759476d61944bcd59)

13 files changed:
source3/include/proto.h
source3/include/rpc_lsa.h
source3/include/rpc_misc.h
source3/lsarpcd/srv_lsa.c
source3/passdb/passdb.c
source3/rpc_client/cli_lsarpc.c
source3/rpc_parse/parse_lsa.c
source3/rpc_parse/parse_misc.c
source3/rpc_server/srv_lsa.c
source3/rpc_server/srv_sid.c
source3/rpcclient/cmd_lsarpc.c
source3/rpcclient/rpcclient.c
source3/smbd/groupname.c

index 33c734a2106684c6ba7b10584c673bebe618603b..6fbc2d3192dadd4166ce0ec11e78a6a6270df653 100644 (file)
@@ -1252,11 +1252,11 @@ BOOL pm_process( char *FileName,
 
 /*The following definitions come from  passdb/ldap.c  */
 
-struct passdb_ops *ldap_initialize_password_db(void);
+struct passdb_ops *ldap_initialise_password_db(void);
 
 /*The following definitions come from  passdb/nispass.c  */
 
-struct passdb_ops *nisplus_initialize_password_db(void);
+struct passdb_ops *nisplus_initialise_password_db(void);
 
 /*The following definitions come from  passdb/pass_check.c  */
 
@@ -1412,6 +1412,12 @@ BOOL cli_nt_logoff(struct cli_state *cli, NET_ID_INFO_CTR *ctr);
 BOOL do_lsa_open_policy(struct cli_state *cli,
                        char *server_name, POLICY_HND *hnd,
                        BOOL sec_qos);
+BOOL do_lsa_lookup_names(struct cli_state *cli,
+                       POLICY_HND *hnd,
+                       int num_names,
+                       char **names,
+                       DOM_SID **sids,
+                       int *num_sids);
 BOOL do_lsa_lookup_sids(struct cli_state *cli,
                        POLICY_HND *hnd,
                        int num_sids,
@@ -1591,8 +1597,10 @@ void make_q_lookup_sids(LSA_Q_LOOKUP_SIDS *q_l, POLICY_HND *hnd,
                                uint16 level);
 void lsa_io_q_lookup_sids(char *desc, LSA_Q_LOOKUP_SIDS *q_s, prs_struct *ps, int depth);
 void lsa_io_r_lookup_sids(char *desc,  LSA_R_LOOKUP_SIDS *r_s, prs_struct *ps, int depth);
-void lsa_io_q_lookup_rids(char *desc,  LSA_Q_LOOKUP_RIDS *q_r, prs_struct *ps, int depth);
-void lsa_io_r_lookup_rids(char *desc,  LSA_R_LOOKUP_RIDS *r_r, prs_struct *ps, int depth);
+void make_q_lookup_names(LSA_Q_LOOKUP_NAMES *q_l, POLICY_HND *hnd,
+                               int num_names, char **names);
+void lsa_io_q_lookup_names(char *desc,  LSA_Q_LOOKUP_NAMES *q_r, prs_struct *ps, int depth);
+void lsa_io_r_lookup_names(char *desc,  LSA_R_LOOKUP_NAMES *r_r, prs_struct *ps, int depth);
 void make_lsa_q_close(LSA_Q_CLOSE *q_c, POLICY_HND *hnd);
 void lsa_io_q_close(char *desc,  LSA_Q_CLOSE *q_c, prs_struct *ps, int depth);
 void lsa_io_r_close(char *desc,  LSA_R_CLOSE *r_c, prs_struct *ps, int depth);
@@ -2283,6 +2291,7 @@ BOOL api_wkssvc_rpc(pipes_struct *p, prs_struct *data);
 /*The following definitions come from  rpcclient/cmd_lsarpc.c  */
 
 void cmd_lsa_query_info(struct client_info *info);
+void cmd_lsa_lookup_names(struct client_info *info);
 void cmd_lsa_lookup_sids(struct client_info *info);
 
 /*The following definitions come from  rpcclient/cmd_netlogon.c  */
index b8aaa562f08e7fbcad3b425b9a0595c4439ef791..1df18a7674d8c1ef7e725dd3678db539c406f5a8 100644 (file)
@@ -48,9 +48,6 @@ enum SID_NAME_USE
 #define LSA_OPENPOLICY2        0x2c
 #define LSA_OPENSECRET         0x1C
 
-/* XXXX these are here to get a compile! */
-#define LSA_LOOKUPRIDS      0xFD
-
 #define LSA_MAX_GROUPS 32
 #define LSA_MAX_SIDS 32
 
@@ -290,37 +287,37 @@ typedef struct lsa_r_lookup_sids
 } LSA_R_LOOKUP_SIDS;
 
 
-#define UNKNOWN_LEN 1
-
-/* LSA_Q_LOOKUP_RIDS - LSA Lookup RIDs */
-typedef struct lsa_q_lookup_rids
+/* LSA_Q_LOOKUP_NAMES - LSA Lookup NAMEs */
+typedef struct lsa_q_lookup_names
 {
     POLICY_HND pol; /* policy handle */
     uint32 num_entries;
     uint32 num_entries2;
-    uint32 buffer_dom_sid; /* undocumented domain SID buffer pointer */
-    uint32 buffer_dom_name; /* undocumented domain name buffer pointer */
-    UNISTR3 lookup_name[MAX_LOOKUP_SIDS]; /* names to be looked up */
-    uint8 undoc[UNKNOWN_LEN]; /* completely undocumented bytes of unknown length */
+    UNIHDR  hdr_name[MAX_LOOKUP_SIDS]; /* name buffer pointers */
+    UNISTR2 uni_name[MAX_LOOKUP_SIDS]; /* names to be looked up */
 
-} LSA_Q_LOOKUP_RIDS;
+    uint32 num_trans_entries; 
+    uint32 ptr_trans_sids; /* undocumented domain SID buffer pointer */
+    uint32 lookup_level; 
+    uint32 mapped_count; 
 
-/* LSA_R_LOOKUP_RIDS - response to LSA Lookup RIDs by name */
-typedef struct lsa_r_lookup_rids
-{
-    DOM_R_REF dom_ref; /* domain reference info */
+} LSA_Q_LOOKUP_NAMES;
 
-    uint32 num_entries;
-    uint32 undoc_buffer; /* undocumented buffer pointer */
+/* LSA_R_LOOKUP_NAMES - response to LSA Lookup NAMEs by name */
+typedef struct lsa_r_lookup_names
+{
+       DOM_R_REF *dom_ref; /* domain reference info */
 
-    uint32 num_entries2; 
-    DOM_RID2 dom_rid[MAX_LOOKUP_SIDS]; /* domain RIDs being looked up */
+       uint32 num_entries;
+       uint32 undoc_buffer; /* undocumented buffer pointer */
+       uint32 num_entries2; 
+       DOM_RID2 *dom_rid; /* domain RIDs being looked up */
 
-    uint32 num_entries3
+       uint32 mapped_count
 
-  uint32 status; /* return code */
+       uint32 status; /* return code */
 
-} LSA_R_LOOKUP_RIDS;
+} LSA_R_LOOKUP_NAMES;
 
 
 #endif /* _RPC_LSA_H */
index aa1f100dfb7066f7cfc7881ee69d3cb15756a927..786aad32d2dd039dd018d5271ad18ff46b94bd5f 100644 (file)
@@ -188,29 +188,28 @@ typedef struct unistr3_info
 /* DOM_RID2 - domain RID structure for ntlsa pipe */
 typedef struct domrid2_info
 {
-  uint32 type; /* value is 5 */
-  uint32 undoc; /* value is non-zero */
-  uint32 rid;
-  uint32 rid_idx; /* don't know what this is */
+       uint8 type; /* value is SID_NAME_USE enum */
+       uint32 rid;
+       uint32 rid_idx; /* referenced domain index */
 
 } DOM_RID2;
 
 /* DOM_RID3 - domain RID structure for samr pipe */
 typedef struct domrid3_info
 {
-  uint32 rid;        /* domain-relative (to a SID) id */
-  uint32 type1;      /* value is 0x1 */
-  uint32 ptr_type;   /* undocumented pointer */
-  uint32 type2;      /* value is 0x1 */
+       uint32 rid;        /* domain-relative (to a SID) id */
+       uint32 type1;      /* value is 0x1 */
+       uint32 ptr_type;   /* undocumented pointer */
+       uint32 type2;      /* value is 0x1 */
 
 } DOM_RID3;
 
 /* DOM_RID4 - rid + user attributes */
 typedef struct domrid4_info
 {
-  uint32 unknown;      
-  uint16 attr;
-  uint32 rid;  /* user RID */
+       uint32 unknown;      
+       uint16 attr;
+       uint32 rid;  /* user RID */
 
 } DOM_RID4;
 
index 8c9db172d232d3d353ea02b2ea26dd3599ff057b..abbe4ccd936970d3669fdb991c165b684640a2bf 100644 (file)
@@ -195,9 +195,9 @@ static int make_dom_ref(DOM_R_REF *ref, char *dom_name, DOM_SID *dom_sid)
 }
 
 /***************************************************************************
-make_reply_lookup_rids
+make_reply_lookup_names
  ***************************************************************************/
-static void make_reply_lookup_rids(LSA_R_LOOKUP_RIDS *r_l,
+static void make_reply_lookup_names(LSA_R_LOOKUP_NAMES *r_l,
                                int num_entries,
                                DOM_SID dom_sids [MAX_LOOKUP_SIDS],
                                uint8   dom_types[MAX_LOOKUP_SIDS])
@@ -338,24 +338,24 @@ static void lsa_reply_lookup_sids(prs_struct *rdata,
 }
 
 /***************************************************************************
-lsa_reply_lookup_rids
+lsa_reply_lookup_names
  ***************************************************************************/
-static void lsa_reply_lookup_rids(prs_struct *rdata,
+static void lsa_reply_lookup_names(prs_struct *rdata,
                                int num_entries,
                                DOM_SID dom_sids [MAX_LOOKUP_SIDS],
                                uint8   dom_types[MAX_LOOKUP_SIDS])
 {
-       LSA_R_LOOKUP_RIDS r_l;
+       LSA_R_LOOKUP_NAMES r_l;
 
        ZERO_STRUCT(r_l);
 
        /* set up the LSA Lookup RIDs response */
-       make_reply_lookup_rids(&r_l, num_entries, dom_sids, dom_types);
+       make_reply_lookup_names(&r_l, num_entries, dom_sids, dom_types);
 
        r_l.status = 0x0;
 
        /* store the response in the SMB stream */
-       lsa_io_r_lookup_rids("", &r_l, rdata, 0);
+       lsa_io_r_lookup_names("", &r_l, rdata, 0);
 }
 
 /***************************************************************************
@@ -478,7 +478,7 @@ static void api_lsa_lookup_names( uint16 vuid, prs_struct *data,
                                   prs_struct *rdata )
 {
        int i;
-       LSA_Q_LOOKUP_RIDS q_l;
+       LSA_Q_LOOKUP_NAMES q_l;
        DOM_SID dom_sids [MAX_LOOKUP_SIDS];
        uint8   dom_types[MAX_LOOKUP_SIDS];
 
@@ -486,15 +486,15 @@ static void api_lsa_lookup_names( uint16 vuid, prs_struct *data,
        ZERO_ARRAY(dom_sids);   
 
        /* grab the info class and policy handle */
-       lsa_io_q_lookup_rids("", &q_l, data, 0);
+       lsa_io_q_lookup_names("", &q_l, data, 0);
 
-       SMB_ASSERT_ARRAY(q_l.lookup_name, q_l.num_entries);
+       SMB_ASSERT_ARRAY(q_l.uni_name, q_l.num_entries);
 
        /* convert received RIDs to strings, so we can do them. */
        for (i = 0; i < q_l.num_entries; i++)
        {
                fstring name;
-               fstrcpy(name, unistr2(q_l.lookup_name[i].str.buffer));
+               fstrcpy(name, unistr2_to_str(&q_l.uni_name[i]));
 
                if (!lookup_name(name, &dom_sids[i], &dom_types[i]))
                {
@@ -503,7 +503,7 @@ static void api_lsa_lookup_names( uint16 vuid, prs_struct *data,
        }
 
        /* construct reply.  return status is always 0x0 */
-       lsa_reply_lookup_rids(rdata,
+       lsa_reply_lookup_names(rdata,
                               q_l.num_entries,
                              dom_sids, /* text-converted SIDs */
                              dom_types); /* SID_NAME_USE types */
index a7635308b7bd233a9b0fb8a11581c3a93c449319..ca5dd8b5859033e3a717be8bb310f131e492a6f1 100644 (file)
@@ -111,7 +111,8 @@ struct smb_passwd *iterate_getsmbpwuid(uid_t smb_userid)
        }
 
        while ((pwd = getsmbpwent(fp)) != NULL && pwd->smb_userid != smb_userid)
-      ;
+       {
+       }
 
        if (pwd != NULL)
        {
@@ -144,7 +145,8 @@ struct smb_passwd *iterate_getsmbpwnam(char *name)
        }
 
        while ((pwd = getsmbpwent(fp)) != NULL && !strequal(pwd->smb_name, name))
-      ;
+       {
+       }
 
        if (pwd != NULL)
        {
@@ -349,7 +351,8 @@ struct sam_passwd *iterate_getsam21pwuid(uid_t uid)
        }
 
        while ((pwd = getsam21pwent(fp)) != NULL && pwd->smb_userid != uid)
-      ;
+       {
+       }
 
        if (pwd != NULL)
        {
@@ -514,30 +517,33 @@ struct sam_passwd *pwdb_smb_to_sam(struct smb_passwd *user)
 
 char *pwdb_encode_acct_ctrl(uint16 acct_ctrl, size_t length)
 {
-  static fstring acct_str;
-  size_t i = 0;
+       static fstring acct_str;
+       size_t i = 0;
 
-  acct_str[i++] = '[';
+       acct_str[i++] = '[';
 
-  if (acct_ctrl & ACB_PWNOTREQ ) acct_str[i++] = 'N';
-  if (acct_ctrl & ACB_DISABLED ) acct_str[i++] = 'D';
-  if (acct_ctrl & ACB_HOMDIRREQ) acct_str[i++] = 'H';
-  if (acct_ctrl & ACB_TEMPDUP  ) acct_str[i++] = 'T'; 
-  if (acct_ctrl & ACB_NORMAL   ) acct_str[i++] = 'U';
-  if (acct_ctrl & ACB_MNS      ) acct_str[i++] = 'M';
-  if (acct_ctrl & ACB_WSTRUST  ) acct_str[i++] = 'W';
-  if (acct_ctrl & ACB_SVRTRUST ) acct_str[i++] = 'S';
-  if (acct_ctrl & ACB_AUTOLOCK ) acct_str[i++] = 'L';
-  if (acct_ctrl & ACB_PWNOEXP  ) acct_str[i++] = 'X';
-  if (acct_ctrl & ACB_DOMTRUST ) acct_str[i++] = 'I';
+       if (acct_ctrl & ACB_PWNOTREQ ) acct_str[i++] = 'N';
+       if (acct_ctrl & ACB_DISABLED ) acct_str[i++] = 'D';
+       if (acct_ctrl & ACB_HOMDIRREQ) acct_str[i++] = 'H';
+       if (acct_ctrl & ACB_TEMPDUP  ) acct_str[i++] = 'T'; 
+       if (acct_ctrl & ACB_NORMAL   ) acct_str[i++] = 'U';
+       if (acct_ctrl & ACB_MNS      ) acct_str[i++] = 'M';
+       if (acct_ctrl & ACB_WSTRUST  ) acct_str[i++] = 'W';
+       if (acct_ctrl & ACB_SVRTRUST ) acct_str[i++] = 'S';
+       if (acct_ctrl & ACB_AUTOLOCK ) acct_str[i++] = 'L';
+       if (acct_ctrl & ACB_PWNOEXP  ) acct_str[i++] = 'X';
+       if (acct_ctrl & ACB_DOMTRUST ) acct_str[i++] = 'I';
 
-  for ( ; i < length - 2 ; i++ ) { acct_str[i] = ' '; }
+       for ( ; i < length - 2 ; i++ )
+       {
+               acct_str[i] = ' ';
+       }
 
-  i = length - 2;
-  acct_str[i++] = ']';
-  acct_str[i++] = '\0';
+       i = length - 2;
+       acct_str[i++] = ']';
+       acct_str[i++] = '\0';
 
-  return acct_str;
+       return acct_str;
 }     
 
 /**********************************************************
@@ -575,7 +581,7 @@ uint16 pwdb_decode_acct_ctrl(const char *p)
                        case 'L': { acct_ctrl |= ACB_AUTOLOCK ; break; /* 'L'ocked account. */ } 
                        case 'X': { acct_ctrl |= ACB_PWNOEXP  ; break; /* No 'X'piry on password */ } 
                        case 'I': { acct_ctrl |= ACB_DOMTRUST ; break; /* 'I'nterdomain trust account. */ }
-            case ' ': { break; }
+                       case ' ': { break; }
                        case ':':
                        case '\n':
                        case '\0': 
index a43b65ad64e4d6a42495d928a9735ad8317469fe..48dd90ffa952179bf167d22093f60d5ee38502ff 100644 (file)
@@ -98,6 +98,119 @@ BOOL do_lsa_open_policy(struct cli_state *cli,
        return valid_pol;
 }
 
+/****************************************************************************
+do a LSA Lookup Names
+****************************************************************************/
+BOOL do_lsa_lookup_names(struct cli_state *cli,
+                       POLICY_HND *hnd,
+                       int num_names,
+                       char **names,
+                       DOM_SID **sids,
+                       int *num_sids)
+{
+       prs_struct rbuf;
+       prs_struct buf; 
+       LSA_Q_LOOKUP_NAMES q_l;
+       BOOL valid_response = False;
+
+       if (hnd == NULL || num_sids == 0 || sids == NULL) return False;
+
+       prs_init(&buf , 1024, 4, SAFETY_MARGIN, False);
+       prs_init(&rbuf, 0   , 4, SAFETY_MARGIN, True );
+
+       /* create and send a MSRPC command with api LSA_LOOKUP_NAMES */
+
+       DEBUG(4,("LSA Lookup NAMEs\n"));
+
+       /* store the parameters */
+       make_q_lookup_names(&q_l, hnd, num_names, names);
+
+       /* turn parameters into data stream */
+       lsa_io_q_lookup_names("", &q_l, &buf, 0);
+
+       /* send the data on \PIPE\ */
+       if (rpc_api_pipe_req(cli, LSA_LOOKUPNAMES, &buf, &rbuf))
+       {
+               LSA_R_LOOKUP_NAMES r_l;
+               DOM_R_REF ref;
+               DOM_RID2 t_rids[MAX_LOOKUP_SIDS];
+               BOOL p;
+
+               ZERO_STRUCT(ref);
+               ZERO_STRUCT(t_rids);
+
+               r_l.dom_ref = &ref;
+               r_l.dom_rid = t_rids;
+
+               lsa_io_r_lookup_names("", &r_l, &rbuf, 0);
+               p = rbuf.offset != 0;
+               
+               if (p && r_l.status != 0)
+               {
+                       /* report error code */
+                       DEBUG(0,("LSA_LOOKUP_NAMES: %s\n", get_nt_error_msg(r_l.status)));
+                       p = False;
+               }
+
+               if (p)
+               {
+                       if (r_l.undoc_buffer != 0 && ref.undoc_buffer != 0)
+                       {
+                               valid_response = True;
+                       }
+               }
+
+               if (num_sids != NULL && valid_response)
+               {
+                       (*num_sids) = r_l.num_entries;
+               }
+               if (valid_response)
+               {
+                       int i;
+                       for (i = 0; i < r_l.num_entries; i++)
+                       {
+                               if (t_rids[i].rid_idx >= ref.num_ref_doms_1 &&
+                                   t_rids[i].rid_idx != 0xffffffff)
+                               {
+                                       DEBUG(0,("LSA_LOOKUP_NAMES: domain index %d out of bounds\n",
+                                                 t_rids[i].rid_idx));
+                                       valid_response = False;
+                                       break;
+                               }
+                       }
+               }
+
+               if (sids != NULL && valid_response && r_l.num_entries != 0)
+               {
+                       (*sids) = (DOM_SID*)malloc((*num_sids) * sizeof(DOM_SID));
+               }
+
+               if (sids != NULL && (*sids) != NULL)
+               {
+                       int i;
+                       /* take each name, construct a SID */
+                       for (i = 0; i < (*num_sids); i++)
+                       {
+                               uint32 dom_idx = t_rids[i].rid_idx;
+                               DOM_SID *sid = &(*sids)[i];
+                               if (dom_idx != 0xffffffff)
+                               {
+                                       sid_copy(sid, &ref.ref_dom[dom_idx].ref_dom.sid);
+                               }
+                               else
+                               {
+                                       ZERO_STRUCTP(sid);
+                               }
+                       }
+               }
+       }
+
+       prs_mem_free(&rbuf);
+       prs_mem_free(&buf );
+
+       return valid_response;
+}
+
 /****************************************************************************
 do a LSA Lookup SIDs
 ****************************************************************************/
@@ -190,13 +303,21 @@ BOOL do_lsa_lookup_sids(struct cli_state *cli,
                                fstring dom_name;
                                fstring full_name;
                                uint32 dom_idx = t_names.name[i].domain_idx;
-                               fstrcpy(dom_name, unistr2(ref.ref_dom[dom_idx].uni_dom_name.buffer));
-                               fstrcpy(name    , unistr2(t_names.uni_name[i].buffer));
-                               
-                               slprintf(full_name, sizeof(full_name), "\\%s\\%s",
-                                        dom_name, name);
 
-                               (*names)[i] = strdup(full_name);
+                               if (dom_idx != 0xffffffff)
+                               {
+                                       fstrcpy(dom_name, unistr2(ref.ref_dom[dom_idx].uni_dom_name.buffer));
+                                       fstrcpy(name    , unistr2(t_names.uni_name[i].buffer));
+                                       
+                                       slprintf(full_name, sizeof(full_name), "\\%s\\%s",
+                                                dom_name, name);
+
+                                       (*names)[i] = strdup(full_name);
+                               }
+                               else
+                               {
+                                       (*names)[i] = NULL;
+                               }
                        }
                }
        }
index 818e7a0baf5cca7d7fe1be221709c3e399cdaa35..5adff5256d91e0ae53bde7046de19498a39985b5 100644 (file)
@@ -563,7 +563,7 @@ static void lsa_io_sid_enum(char *desc, LSA_SID_ENUM *sen,
 }
 
 /*******************************************************************
-makes an LSA_R_ENUM_TRUST_DOM structure.
+makes a structure.
 ********************************************************************/
 void make_q_lookup_sids(LSA_Q_LOOKUP_SIDS *q_l, POLICY_HND *hnd,
                                int num_sids, DOM_SID **sids,
@@ -571,7 +571,7 @@ void make_q_lookup_sids(LSA_Q_LOOKUP_SIDS *q_l, POLICY_HND *hnd,
 {
        if (q_l == NULL) return;
 
-       DEBUG(5,("make_r_enum_trust_dom\n"));
+       DEBUG(5,("make_q_lookup_sids\n"));
 
        memcpy(&(q_l->pol), hnd, sizeof(q_l->pol));
        make_lsa_sid_enum(&(q_l->sids), num_sids, sids);
@@ -667,16 +667,47 @@ void lsa_io_r_lookup_sids(char *desc,  LSA_R_LOOKUP_SIDS *r_s, prs_struct *ps, i
        prs_uint32("status      ", ps, depth, &(r_s->status));
 }
 
+/*******************************************************************
+makes a structure.
+********************************************************************/
+void make_q_lookup_names(LSA_Q_LOOKUP_NAMES *q_l, POLICY_HND *hnd,
+                               int num_names, char **names)
+{
+       int i;
+       if (q_l == NULL) return;
+
+       DEBUG(5,("make_q_lookup_names\n"));
+
+       memcpy(&(q_l->pol), hnd, sizeof(q_l->pol));
+
+       SMB_ASSERT_ARRAY(q_l->uni_name, q_l->num_entries);
+
+       q_l->num_entries     = num_names;
+       q_l->num_entries2    = num_names;
+
+       for (i = 0; i < num_names; i++)
+       {
+               int len = strlen(names[i]);
+               make_uni_hdr(&q_l->hdr_name[i], len, len, len != 0);
+               make_unistr2(&q_l->uni_name[i], names[i], len);
+       }
+
+       q_l->num_trans_entries  = 0;
+       q_l->ptr_trans_sids  = 0;
+       q_l->lookup_level = 1;
+       q_l->mapped_count = 0;
+}
+
 /*******************************************************************
 reads or writes a structure.
 ********************************************************************/
-void lsa_io_q_lookup_rids(char *desc,  LSA_Q_LOOKUP_RIDS *q_r, prs_struct *ps, int depth)
+void lsa_io_q_lookup_names(char *desc,  LSA_Q_LOOKUP_NAMES *q_r, prs_struct *ps, int depth)
 {
        int i;
 
        if (q_r == NULL) return;
 
-       prs_debug(ps, depth, desc, "lsa_io_q_lookup_rids");
+       prs_debug(ps, depth, desc, "lsa_io_q_lookup_names");
        depth++;
 
        prs_align(ps);
@@ -685,47 +716,52 @@ void lsa_io_q_lookup_rids(char *desc,  LSA_Q_LOOKUP_RIDS *q_r, prs_struct *ps, i
 
        prs_uint32("num_entries    ", ps, depth, &(q_r->num_entries));
        prs_uint32("num_entries2   ", ps, depth, &(q_r->num_entries2));
-       prs_uint32("buffer_dom_sid ", ps, depth, &(q_r->buffer_dom_sid)); /* undocumented domain SID buffer pointer */
-       prs_uint32("buffer_dom_name", ps, depth, &(q_r->buffer_dom_name)); /* undocumented domain name buffer pointer */
 
-       SMB_ASSERT_ARRAY(q_r->lookup_name, q_r->num_entries);
+       SMB_ASSERT_ARRAY(q_r->uni_name, q_r->num_entries);
 
        for (i = 0; i < q_r->num_entries; i++)
        {
-               smb_io_unistr3("dom_name", &(q_r->lookup_name[i]), ps, depth); /* names to be looked up */
+               smb_io_unihdr("hdr_name", &(q_r->hdr_name[i]), ps, depth); /* pointer names */
        }
 
-       prs_uint8s (False, "undoc          ", ps, depth, q_r->undoc, UNKNOWN_LEN);
+       for (i = 0; i < q_r->num_entries; i++)
+       {
+               smb_io_unistr2("dom_name", &(q_r->uni_name[i]), q_r->hdr_name[i].buffer, ps, depth); /* names to be looked up */
+               prs_align(ps);
+       }
+
+       prs_uint32("num_trans_entries ", ps, depth, &(q_r->num_trans_entries));
+       prs_uint32("ptr_trans_sids ", ps, depth, &(q_r->ptr_trans_sids));
+       prs_uint32("lookup_level   ", ps, depth, &(q_r->lookup_level  ));
+       prs_uint32("mapped_count   ", ps, depth, &(q_r->mapped_count  ));
 }
 
 /*******************************************************************
 reads or writes a structure.
 ********************************************************************/
-void lsa_io_r_lookup_rids(char *desc,  LSA_R_LOOKUP_RIDS *r_r, prs_struct *ps, int depth)
+void lsa_io_r_lookup_names(char *desc,  LSA_R_LOOKUP_NAMES *r_r, prs_struct *ps, int depth)
 {
        int i;
 
        if (r_r == NULL) return;
 
-       prs_debug(ps, depth, desc, "lsa_io_r_lookup_rids");
+       prs_debug(ps, depth, desc, "lsa_io_r_lookup_names");
        depth++;
 
        prs_align(ps);
        
-       lsa_io_dom_r_ref("", &(r_r->dom_ref), ps, depth); /* domain reference info */
+       lsa_io_dom_r_ref("", r_r->dom_ref, ps, depth); /* domain reference info */
 
        prs_uint32("num_entries ", ps, depth, &(r_r->num_entries));
        prs_uint32("undoc_buffer", ps, depth, &(r_r->undoc_buffer));
        prs_uint32("num_entries2", ps, depth, &(r_r->num_entries2));
 
-       SMB_ASSERT_ARRAY(r_r->dom_rid, r_r->num_entries2);
-
        for (i = 0; i < r_r->num_entries2; i++)
        {
                smb_io_dom_rid2("", &(r_r->dom_rid[i]), ps, depth); /* domain RIDs being looked up */
        }
 
-       prs_uint32("num_entries3", ps, depth, &(r_r->num_entries3));
+       prs_uint32("mapped_count", ps, depth, &(r_r->mapped_count));
 
        prs_uint32("status      ", ps, depth, &(r_r->status));
 }
index 97d4f3d56376b31a0dda33f888c98c7ad2e11787..ad268f60a47a4321005c4015ba96655d940d5f7e 100644 (file)
@@ -674,7 +674,6 @@ creates a DOM_RID2 structure.
 void make_dom_rid2(DOM_RID2 *rid2, uint32 rid, uint8 type)
 {
        rid2->type    = type;
-       rid2->undoc   = 0x5;
        rid2->rid     = rid;
        rid2->rid_idx = 0;
 }
@@ -691,14 +690,8 @@ void smb_io_dom_rid2(char *desc,  DOM_RID2 *rid2, prs_struct *ps, int depth)
 
        prs_align(ps);
        
-       /* should be value 5, so enforce it */
-       rid2->type = 5;
-
-       /* should be value 5, so enforce it */
-       rid2->undoc = 5;
-
-       prs_uint32("type   ", ps, depth, &(rid2->type));
-       prs_uint32("undoc  ", ps, depth, &(rid2->undoc   ));
+       prs_uint8("type   ", ps, depth, &(rid2->type));
+       prs_align(ps);
        prs_uint32("rid    ", ps, depth, &(rid2->rid     ));
        prs_uint32("rid_idx", ps, depth, &(rid2->rid_idx ));
 }
index 8c9db172d232d3d353ea02b2ea26dd3599ff057b..abbe4ccd936970d3669fdb991c165b684640a2bf 100644 (file)
@@ -195,9 +195,9 @@ static int make_dom_ref(DOM_R_REF *ref, char *dom_name, DOM_SID *dom_sid)
 }
 
 /***************************************************************************
-make_reply_lookup_rids
+make_reply_lookup_names
  ***************************************************************************/
-static void make_reply_lookup_rids(LSA_R_LOOKUP_RIDS *r_l,
+static void make_reply_lookup_names(LSA_R_LOOKUP_NAMES *r_l,
                                int num_entries,
                                DOM_SID dom_sids [MAX_LOOKUP_SIDS],
                                uint8   dom_types[MAX_LOOKUP_SIDS])
@@ -338,24 +338,24 @@ static void lsa_reply_lookup_sids(prs_struct *rdata,
 }
 
 /***************************************************************************
-lsa_reply_lookup_rids
+lsa_reply_lookup_names
  ***************************************************************************/
-static void lsa_reply_lookup_rids(prs_struct *rdata,
+static void lsa_reply_lookup_names(prs_struct *rdata,
                                int num_entries,
                                DOM_SID dom_sids [MAX_LOOKUP_SIDS],
                                uint8   dom_types[MAX_LOOKUP_SIDS])
 {
-       LSA_R_LOOKUP_RIDS r_l;
+       LSA_R_LOOKUP_NAMES r_l;
 
        ZERO_STRUCT(r_l);
 
        /* set up the LSA Lookup RIDs response */
-       make_reply_lookup_rids(&r_l, num_entries, dom_sids, dom_types);
+       make_reply_lookup_names(&r_l, num_entries, dom_sids, dom_types);
 
        r_l.status = 0x0;
 
        /* store the response in the SMB stream */
-       lsa_io_r_lookup_rids("", &r_l, rdata, 0);
+       lsa_io_r_lookup_names("", &r_l, rdata, 0);
 }
 
 /***************************************************************************
@@ -478,7 +478,7 @@ static void api_lsa_lookup_names( uint16 vuid, prs_struct *data,
                                   prs_struct *rdata )
 {
        int i;
-       LSA_Q_LOOKUP_RIDS q_l;
+       LSA_Q_LOOKUP_NAMES q_l;
        DOM_SID dom_sids [MAX_LOOKUP_SIDS];
        uint8   dom_types[MAX_LOOKUP_SIDS];
 
@@ -486,15 +486,15 @@ static void api_lsa_lookup_names( uint16 vuid, prs_struct *data,
        ZERO_ARRAY(dom_sids);   
 
        /* grab the info class and policy handle */
-       lsa_io_q_lookup_rids("", &q_l, data, 0);
+       lsa_io_q_lookup_names("", &q_l, data, 0);
 
-       SMB_ASSERT_ARRAY(q_l.lookup_name, q_l.num_entries);
+       SMB_ASSERT_ARRAY(q_l.uni_name, q_l.num_entries);
 
        /* convert received RIDs to strings, so we can do them. */
        for (i = 0; i < q_l.num_entries; i++)
        {
                fstring name;
-               fstrcpy(name, unistr2(q_l.lookup_name[i].str.buffer));
+               fstrcpy(name, unistr2_to_str(&q_l.uni_name[i]));
 
                if (!lookup_name(name, &dom_sids[i], &dom_types[i]))
                {
@@ -503,7 +503,7 @@ static void api_lsa_lookup_names( uint16 vuid, prs_struct *data,
        }
 
        /* construct reply.  return status is always 0x0 */
-       lsa_reply_lookup_rids(rdata,
+       lsa_reply_lookup_names(rdata,
                               q_l.num_entries,
                              dom_sids, /* text-converted SIDs */
                              dom_types); /* SID_NAME_USE types */
index 216fab657f92b5f42f50c93d2ff22508b71c1453..0317bb32f560463cfece8be9f2c15cdc0557846f 100644 (file)
@@ -432,10 +432,6 @@ Error was %s\n", sid_file, strerror(errno) ));
 ***************************************************************************/
 BOOL map_domain_name_to_sid(DOM_SID *sid, char **nt_domain)
 {
-       fstring sid_str;
-       sid_to_string(sid_str, sid);
-       DEBUG(5,("map_domain_name_to_sid: %s\n", sid_str));
-
        if (nt_domain == NULL)
        {
                *sid = global_sam_sid;
@@ -451,6 +447,16 @@ BOOL map_domain_name_to_sid(DOM_SID *sid, char **nt_domain)
                return True;
        }
 
+       if ((*nt_domain)[0] == 0)
+       {
+               DEBUG(5,("map_domain_name_to_sid: overriding blank name to %s\n",
+                         global_sam_name));
+               free(*nt_domain);
+               (*nt_domain) = strdup(global_sam_name);
+               *sid = global_sam_sid;
+               return True;
+       }
+
        if (strequal((*nt_domain), global_sam_name))
        {
                *sid = global_sam_sid;
index a23e7a650b7db4532a2294faaebfba9e2210d1b0..4a907fa3441d804f6c627b41ca9df2dac69141cc 100644 (file)
@@ -121,7 +121,97 @@ void cmd_lsa_query_info(struct client_info *info)
 }
 
 /****************************************************************************
-nt lsa query
+lookup names
+****************************************************************************/
+void cmd_lsa_lookup_names(struct client_info *info)
+{
+       fstring temp;
+       int i;
+       fstring srv_name;
+       int num_names = 0;
+       char *names[10];
+       DOM_SID *sids;
+       int num_sids = 0;
+#if 0
+       DOM_SID sid[10];
+       DOM_SID *sids[10];
+#endif
+       BOOL res = True;
+
+       fstrcpy(srv_name, "\\\\");
+       fstrcat(srv_name, info->myhostname);
+       strupper(srv_name);
+
+       DEBUG(4,("cmd_lsa_lookup_names: server: %s\n", srv_name));
+
+       while (num_names < 10 && next_token(NULL, temp, NULL, sizeof(temp)))
+       {
+               names[num_names] = strdup(temp);
+               num_names++;
+       }
+
+       if (num_names == 0)
+       {
+               fprintf(out_hnd, "lookupnames <name> [<name> ...]\n");
+               return;
+       }
+
+       /* open LSARPC session. */
+       res = res ? cli_nt_session_open(smb_cli, PIPE_LSARPC) : False;
+
+       /* lookup domain controller; receive a policy handle */
+       res = res ? do_lsa_open_policy(smb_cli,
+                               srv_name,
+                               &info->dom.lsa_info_pol, True) : False;
+
+       /* send lsa lookup sids call */
+       res = res ? do_lsa_lookup_names(smb_cli, 
+                                      &info->dom.lsa_info_pol,
+                                      num_names, names,
+                                      &sids, &num_sids) : False;
+
+       res = res ? do_lsa_close(smb_cli, &info->dom.lsa_info_pol) : False;
+
+       /* close the session */
+       cli_nt_session_close(smb_cli);
+
+       if (res)
+       {
+               DEBUG(5,("cmd_lsa_lookup_names: query succeeded\n"));
+       }
+       else
+       {
+               DEBUG(5,("cmd_lsa_lookup_names: query failed\n"));
+       }
+
+       if (sids != NULL)
+       {
+               fprintf(out_hnd,"Lookup Names:\n");
+               for (i = 0; i < num_sids; i++)
+               {
+                       sid_to_string(temp, &sids[i]);
+                       fprintf(out_hnd, "SID: %s -> %s\n", names[i], temp);
+#if 0
+                       if (sids[i] != NULL)
+                       {
+                               free(sids[i]);
+                       }
+#endif
+               }
+               free(sids);
+       }
+
+       for (i = 0; i < num_names; i++)
+       {
+               if (names[i] != NULL)
+               {
+                       free(names[i]);
+               }
+       }
+}
+
+/****************************************************************************
+lookup sids
 ****************************************************************************/
 void cmd_lsa_lookup_sids(struct client_info *info)
 {
index 80d66a3af42424ab8371c1ddce0d9057c8c10cb8..220c81d61e3d4d625dc405ed8c26122144ab61fb 100644 (file)
@@ -122,6 +122,7 @@ struct
   {"srvfiles",   cmd_srv_enum_files,   "List files on a server"},
   {"lsaquery",   cmd_lsa_query_info,   "Query Info Policy (domain member or server)"},
   {"lookupsids", cmd_lsa_lookup_sids,  "Resolve names from SIDs"},
+  {"lookupnames",cmd_lsa_lookup_names,  "Resolve SIDs from names"},
   {"enumusers",  cmd_sam_enum_users,   "SAM User Database Query (experimental!)"},
   {"ntpass",     cmd_sam_ntchange_pwd, "NT SAM Password Change"},
   {"samuser",    cmd_sam_query_user,   "<username> SAM User Query (experimental!)"},
index 3c09c1183036bb4575946f4c9ecd136bd80a83fd..95992cc84b8984aa5241ec4b2cfd0cf6e7fd8089 100644 (file)
@@ -207,16 +207,9 @@ failed. Error was %s.\n", grp->unix_name, strerror(errno) ));
                                  grp->nt_domain));
                        return False;
                }
-
-               DEBUG(0,("unix_name_to_group_info: cannot resolve domain %s\n",
-                         grp->nt_domain));
-
-               return False;
-       }
-       else
-       {
-               return make_mydomain_sid(grp, type);
        }
+
+       return make_mydomain_sid(grp, type);
 }
 
 static BOOL make_name_entry(name_map_entry **new_ep,
@@ -301,8 +294,6 @@ static void load_name_map(GROUP_TYPE type)
                map_list           = &aliasname_map_list;
        }
 
-       DEBUG(10,("load_name_map : %s\n", map_file));
-
        if (!(*initialised))
        {
                ubi_slInitList(map_list);