The big character set handling changeover!
[kai/samba.git] / source3 / rpc_server / srv_lsa_nt.c
index 0a20aec8f45106ee44d718714764482de1c63ed4..cd97dfc6d1f7aeddd9a5f31b4681283a36e14d99 100644 (file)
@@ -72,7 +72,7 @@ static int init_dom_ref(DOM_R_REF *ref, char *dom_name, DOM_SID *dom_sid)
        if (dom_name != NULL) {
                for (num = 0; num < ref->num_ref_doms_1; num++) {
                        fstring domname;
-                       fstrcpy(domname, dos_unistr2_to_str(&ref->ref_dom[num].uni_dom_name));
+                       rpcstr_pull(domname, &ref->ref_dom[num].uni_dom_name, sizeof(domname), -1, 0);
                        if (strequal(domname, dom_name))
                                return num;
                }
@@ -108,7 +108,7 @@ static int init_dom_ref(DOM_R_REF *ref, char *dom_name, DOM_SID *dom_sid)
  ***************************************************************************/
 
 static void init_lsa_rid2s(DOM_R_REF *ref, DOM_RID2 *rid2,
-                               int num_entries, UNISTR2 name[MAX_LOOKUP_SIDS],
+                               int num_entries, UNISTR2 *name,
                                uint32 *mapped_count, BOOL endian)
 {
        int i;
@@ -128,7 +128,7 @@ static void init_lsa_rid2s(DOM_R_REF *ref, DOM_RID2 *rid2,
 
                /* Split name into domain and user component */
 
-               pstrcpy(full_name, dos_unistr2_to_str(&name[i]));
+               rpcstr_pull(full_name, &name[i], sizeof(full_name), -1, 0);
                split_domain_name(full_name, dom_name, user);
 
                /* Lookup name */
@@ -325,7 +325,7 @@ uint32 _lsa_enum_trust_dom(pipes_struct *p, LSA_Q_ENUM_TRUST_DOM *q_u, LSA_R_ENU
 }
 
 /***************************************************************************
- _lsa_query_info
+ _lsa_query_info. See the POLICY_INFOMATION_CLASS docs at msdn.
  ***************************************************************************/
 
 uint32 _lsa_query_info(pipes_struct *p, LSA_Q_QUERY_INFO *q_u, LSA_R_QUERY_INFO *r_u)
@@ -355,27 +355,25 @@ uint32 _lsa_query_info(pipes_struct *p, LSA_Q_QUERY_INFO *q_u, LSA_R_QUERY_INFO
             break;
                }
        case 0x03:
-               switch (lp_server_role())
-               {
+               /* Request PolicyPrimaryDomainInformation. */
+               switch (lp_server_role()) {
                        case ROLE_DOMAIN_PDC:
                        case ROLE_DOMAIN_BDC:
                                name = global_myworkgroup;
                                sid = &global_sam_sid;
                                break;
                        case ROLE_DOMAIN_MEMBER:
+                               name = global_myworkgroup;
+                               /* We need to return the Domain SID here. */
                                if (secrets_fetch_domain_sid(global_myworkgroup,
-                                       &domain_sid))
-                               {
-                                       /* I'm sure this should be myname, not myworkgroup. JRA. */
-                                       name = global_myname;
+                                                            &domain_sid))
                                        sid = &domain_sid;
-                               }
                                else
                                        return NT_STATUS_CANT_ACCESS_DOMAIN_INFO;
                                break;
                        case ROLE_STANDALONE:
-                               name = global_myname;
-                               sid = &global_sam_sid;
+                               name = global_myworkgroup;
+                               sid = NULL; /* Tell it we're not in a domain. */
                                break;
                        default:
                                return NT_STATUS_CANT_ACCESS_DOMAIN_INFO;
@@ -383,26 +381,19 @@ uint32 _lsa_query_info(pipes_struct *p, LSA_Q_QUERY_INFO *q_u, LSA_R_QUERY_INFO
                init_dom_query(&r_u->dom.id3, name, sid);
                break;
        case 0x05:
-               /* AS/U shows this needs to be the same as level 3. JRA. */
-               switch (lp_server_role())
-               {
+               /* Request PolicyAccountDomainInformation. */
+               switch (lp_server_role()) {
                        case ROLE_DOMAIN_PDC:
                        case ROLE_DOMAIN_BDC:
                                name = global_myworkgroup;
                                sid = &global_sam_sid;
                                break;
                        case ROLE_DOMAIN_MEMBER:
-                               if (secrets_fetch_domain_sid(global_myworkgroup,
-                                       &domain_sid))
-                               {
-                                       name = global_myname;
-                                       sid = &domain_sid;
-                               }
-                               else
-                                       return NT_STATUS_CANT_ACCESS_DOMAIN_INFO;
+                               name = global_myworkgroup;
+                               sid = &global_sam_sid;
                                break;
                        case ROLE_STANDALONE:
-                               name = global_myname;
+                               name = global_myworkgroup;
                                sid = &global_sam_sid;
                                break;
                        default:
@@ -411,8 +402,7 @@ uint32 _lsa_query_info(pipes_struct *p, LSA_Q_QUERY_INFO *q_u, LSA_R_QUERY_INFO
                init_dom_query(&r_u->dom.id5, name, sid);
                break;
        case 0x06:
-               switch (lp_server_role())
-               {
+               switch (lp_server_role()) {
                        case ROLE_DOMAIN_BDC:
                                /*
                                 * only a BDC is a backup controller
@@ -520,3 +510,33 @@ uint32 _lsa_open_secret(pipes_struct *p, LSA_Q_OPEN_SECRET *q_u, LSA_R_OPEN_SECR
 {
        return NT_STATUS_OBJECT_NAME_NOT_FOUND;
 }
+
+uint32 _lsa_unk_get_connuser(pipes_struct *p, LSA_Q_UNK_GET_CONNUSER *q_u, LSA_R_UNK_GET_CONNUSER *r_u)
+{
+  fstring username, domname;
+  int ulen, dlen;
+  user_struct *vuser = get_valid_user_struct(p->vuid);
+  
+  if (vuser == NULL)
+    return NT_STATUS_CANT_ACCESS_DOMAIN_INFO;
+  
+  fstrcpy(username, vuser->user.smb_name);
+  fstrcpy(domname, vuser->user.domain);
+  
+  ulen = strlen(username);
+  dlen = strlen(domname);
+  
+  init_uni_hdr(&r_u->hdr_user_name, ulen);
+  r_u->ptr_user_name = 1;
+  init_unistr2(&r_u->uni2_user_name, username, ulen);
+
+  r_u->unk1 = 1;
+  
+  init_uni_hdr(&r_u->hdr_dom_name, dlen);
+  r_u->ptr_dom_name = 1;
+  init_unistr2(&r_u->uni2_dom_name, domname, dlen);
+
+  r_u->status = NT_STATUS_NO_PROBLEMO;
+  
+  return r_u->status;
+}