winbindd: winbindd_priv_pipe_dir() -> bool_dispatch_table
[samba.git] / source3 / winbindd / idmap_nss.c
index 5bb2389c93faef2a64ea43acbbb0ed9c19876b2c..3fe98cbc729666e4442565febede3132e922ee06 100644 (file)
@@ -1,57 +1,54 @@
 /* 
    Unix SMB/CIFS implementation.
 
-   idmap PASSDB backend
+   idmap NSS backend
 
    Copyright (C) Simo Sorce 2006
-   
+
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
-   
+
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
-   
+
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 #include "includes.h"
+#include "system/passwd.h"
 #include "winbindd.h"
+#include "nsswitch/winbind_client.h"
+#include "idmap.h"
+#include "lib/winbind_util.h"
 
 #undef DBGC_CLASS
 #define DBGC_CLASS DBGC_IDMAP
 
 /*****************************
- Initialise idmap database. 
+ Initialise idmap database.
 *****************************/
 
 static NTSTATUS idmap_nss_int_init(struct idmap_domain *dom)
-{      
-       dom->initialized = True;
+{
        return NT_STATUS_OK;
 }
 
 /**********************************
- lookup a set of unix ids. 
+ lookup a set of unix ids.
 **********************************/
 
 static NTSTATUS idmap_nss_unixids_to_sids(struct idmap_domain *dom, struct id_map **ids)
 {
-       TALLOC_CTX *ctx;
        int i;
 
-       if (! dom->initialized) {
-               return NT_STATUS_UNSUCCESSFUL;
-       }
-
-       ctx = talloc_new(dom);
-       if ( ! ctx) {
-               DEBUG(0, ("Out of memory!\n"));
-               return NT_STATUS_NO_MEMORY;
+       /* initialize the status to avoid suprise */
+       for (i = 0; ids[i]; i++) {
+               ids[i]->status = ID_UNKNOWN;
        }
 
        for (i = 0; ids[i]; i++) {
@@ -59,8 +56,8 @@ static NTSTATUS idmap_nss_unixids_to_sids(struct idmap_domain *dom, struct id_ma
                struct group *gr;
                const char *name;
                enum lsa_SidType type;
-               BOOL ret;
-               
+               bool ret;
+
                switch (ids[i]->xid.type) {
                case ID_TYPE_UID:
                        pw = getpwuid((uid_t)ids[i]->xid.id);
@@ -87,10 +84,10 @@ static NTSTATUS idmap_nss_unixids_to_sids(struct idmap_domain *dom, struct id_ma
 
                /* by default calls to winbindd are disabled
                   the following call will not recurse so this is safe */
-               winbind_on();
+               (void)winbind_on();
                /* Lookup name from PDC using lsa_lookup_names() */
                ret = winbind_lookup_name(dom->name, name, ids[i]->sid, &type);
-               winbind_off();
+               (void)winbind_off();
 
                if (!ret) {
                        /* TODO: how do we know if the name is really not mapped,
@@ -119,44 +116,36 @@ static NTSTATUS idmap_nss_unixids_to_sids(struct idmap_domain *dom, struct id_ma
                        break;
                }
        }
-
-
-       talloc_free(ctx);
        return NT_STATUS_OK;
 }
 
 /**********************************
- lookup a set of sids. 
+ lookup a set of sids.
 **********************************/
 
 static NTSTATUS idmap_nss_sids_to_unixids(struct idmap_domain *dom, struct id_map **ids)
 {
-       TALLOC_CTX *ctx;
        int i;
 
-       if (! dom->initialized) {
-               return NT_STATUS_UNSUCCESSFUL;
-       }
-
-       ctx = talloc_new(dom);
-       if ( ! ctx) {
-               DEBUG(0, ("Out of memory!\n"));
-               return NT_STATUS_NO_MEMORY;
+       /* initialize the status to avoid suprise */
+       for (i = 0; ids[i]; i++) {
+               ids[i]->status = ID_UNKNOWN;
        }
 
        for (i = 0; ids[i]; i++) {
-               struct passwd *pw;
                struct group *gr;
                enum lsa_SidType type;
-               const char *dom_name = NULL;
-               const char *name = NULL;
-               BOOL ret;
+               const char *p = NULL;
+               char *name = NULL;
+               bool ret;
 
                /* by default calls to winbindd are disabled
                   the following call will not recurse so this is safe */
-               winbind_on();
-               ret = winbind_lookup_sid(ctx, ids[i]->sid, &dom_name, &name, &type);
-               winbind_off();
+               (void)winbind_on();
+               ret = winbind_lookup_sid(talloc_tos(), ids[i]->sid, NULL,
+                                        &p, &type);
+               (void)winbind_off();
+               name = discard_const_p(char, p);
 
                if (!ret) {
                        /* TODO: how do we know if the name is really not mapped,
@@ -166,17 +155,20 @@ static NTSTATUS idmap_nss_sids_to_unixids(struct idmap_domain *dom, struct id_ma
                }
 
                switch (type) {
-               case SID_NAME_USER:
+               case SID_NAME_USER: {
+                       struct passwd *pw;
 
                        /* this will find also all lower case name and use username level */
-                       
-                       pw = Get_Pwnam(name);
+
+                       pw = Get_Pwnam_alloc(talloc_tos(), name);
                        if (pw) {
                                ids[i]->xid.id = pw->pw_uid;
                                ids[i]->xid.type = ID_TYPE_UID;
                                ids[i]->status = ID_MAPPED;
                        }
+                       TALLOC_FREE(pw);
                        break;
+               }
 
                case SID_NAME_DOM_GRP:
                case SID_NAME_ALIAS:
@@ -194,9 +186,8 @@ static NTSTATUS idmap_nss_sids_to_unixids(struct idmap_domain *dom, struct id_ma
                        ids[i]->status = ID_UNKNOWN;
                        break;
                }
+               TALLOC_FREE(name);
        }
-
-       talloc_free(ctx);
        return NT_STATUS_OK;
 }
 
@@ -204,20 +195,14 @@ static NTSTATUS idmap_nss_sids_to_unixids(struct idmap_domain *dom, struct id_ma
  Close the idmap tdb instance
 **********************************/
 
-static NTSTATUS idmap_nss_close(struct idmap_domain *dom)
-{
-       return NT_STATUS_OK;
-}
-
 static struct idmap_methods nss_methods = {
 
        .init = idmap_nss_int_init,
        .unixids_to_sids = idmap_nss_unixids_to_sids,
        .sids_to_unixids = idmap_nss_sids_to_unixids,
-       .close_fn = idmap_nss_close
 };
 
-NTSTATUS idmap_nss_init(void)
+NTSTATUS idmap_nss_init(TALLOC_CTX *mem_ctx)
 {
        return smb_register_idmap(SMB_IDMAP_INTERFACE_VERSION, "nss", &nss_methods);
 }