pam_winbind: Return if we do not have a domain
[gd/samba-autobuild/.git] / nsswitch / winbind_nss_linux.c
index 3099413ec70597c5d858a08c34973cc8e8dd734c..b5c50efcb39a48da940fcfbf9c50c9825aa80fd8 100644 (file)
@@ -57,19 +57,6 @@ NSS_STATUS _nss_winbind_getgrgid_r(gid_t gid, struct group *result, char *buffer
 NSS_STATUS _nss_winbind_initgroups_dyn(char *user, gid_t group, long int *start,
                                       long int *size, gid_t **groups,
                                       long int limit, int *errnop);
-NSS_STATUS _nss_winbind_getusersids(const char *user_sid, char **group_sids,
-                                   int *num_groups, char *buffer, size_t buf_size,
-                                   int *errnop);
-NSS_STATUS _nss_winbind_nametosid(const char *name, char **sid, char *buffer,
-                                 size_t buflen, int *errnop);
-NSS_STATUS _nss_winbind_sidtoname(const char *sid, char **name, char *buffer,
-                                 size_t buflen, int *errnop);
-NSS_STATUS _nss_winbind_sidtouid(const char *sid, uid_t *uid, int *errnop);
-NSS_STATUS _nss_winbind_sidtogid(const char *sid, gid_t *gid, int *errnop);
-NSS_STATUS _nss_winbind_uidtosid(uid_t uid, char **sid, char *buffer,
-                                size_t buflen, int *errnop);
-NSS_STATUS _nss_winbind_gidtosid(gid_t gid, char **sid, char *buffer,
-                                size_t buflen, int *errnop);
 
 /*************************************************************************
  ************************************************************************/
@@ -203,29 +190,33 @@ static NSS_STATUS fill_pwent(struct passwd *result,
                                  struct winbindd_pw *pw,
                                  char **buffer, size_t *buflen)
 {
+       size_t len;
+
        /* User name */
+       len = strlen(pw->pw_name) + 1;
 
        if ((result->pw_name =
-            get_static(buffer, buflen, strlen(pw->pw_name) + 1)) == NULL) {
+            get_static(buffer, buflen, len)) == NULL) {
 
                /* Out of memory */
 
                return NSS_STATUS_TRYAGAIN;
        }
 
-       strcpy(result->pw_name, pw->pw_name);
+       memcpy(result->pw_name, pw->pw_name, len);
 
        /* Password */
+       len = strlen(pw->pw_passwd) + 1;
 
        if ((result->pw_passwd =
-            get_static(buffer, buflen, strlen(pw->pw_passwd) + 1)) == NULL) {
+            get_static(buffer, buflen, len)) == NULL) {
 
                /* Out of memory */
 
                return NSS_STATUS_TRYAGAIN;
        }
 
-       strcpy(result->pw_passwd, pw->pw_passwd);
+       memcpy(result->pw_passwd, pw->pw_passwd, len);
 
        /* [ug]id */
 
@@ -233,40 +224,43 @@ static NSS_STATUS fill_pwent(struct passwd *result,
        result->pw_gid = pw->pw_gid;
 
        /* GECOS */
+       len = strlen(pw->pw_gecos) + 1;
 
        if ((result->pw_gecos =
-            get_static(buffer, buflen, strlen(pw->pw_gecos) + 1)) == NULL) {
+            get_static(buffer, buflen, len)) == NULL) {
 
                /* Out of memory */
 
                return NSS_STATUS_TRYAGAIN;
        }
 
-       strcpy(result->pw_gecos, pw->pw_gecos);
+       memcpy(result->pw_gecos, pw->pw_gecos, len);
 
        /* Home directory */
+       len = strlen(pw->pw_dir) + 1;
 
        if ((result->pw_dir =
-            get_static(buffer, buflen, strlen(pw->pw_dir) + 1)) == NULL) {
+            get_static(buffer, buflen, len)) == NULL) {
 
                /* Out of memory */
 
                return NSS_STATUS_TRYAGAIN;
        }
 
-       strcpy(result->pw_dir, pw->pw_dir);
+       memcpy(result->pw_dir, pw->pw_dir, len);
 
        /* Logon shell */
+       len = strlen(pw->pw_shell) + 1;
 
        if ((result->pw_shell =
-            get_static(buffer, buflen, strlen(pw->pw_shell) + 1)) == NULL) {
+            get_static(buffer, buflen, len)) == NULL) {
 
                /* Out of memory */
 
                return NSS_STATUS_TRYAGAIN;
        }
 
-       strcpy(result->pw_shell, pw->pw_shell);
+       memcpy(result->pw_shell, pw->pw_shell, len);
 
        /* The struct passwd for Solaris has some extra fields which must
           be initialised or nscd crashes. */
@@ -292,29 +286,32 @@ static NSS_STATUS fill_grent(struct group *result, struct winbindd_gr *gr,
        char *name;
        int i;
        char *tst;
+       size_t len;
 
        /* Group name */
+       len = strlen(gr->gr_name) + 1;
 
        if ((result->gr_name =
-            get_static(buffer, buflen, strlen(gr->gr_name) + 1)) == NULL) {
+            get_static(buffer, buflen, len)) == NULL) {
 
                /* Out of memory */
 
                return NSS_STATUS_TRYAGAIN;
        }
 
-       strcpy(result->gr_name, gr->gr_name);
+       memcpy(result->gr_name, gr->gr_name, len);
 
        /* Password */
+       len = strlen(gr->gr_passwd) + 1;
 
        if ((result->gr_passwd =
-            get_static(buffer, buflen, strlen(gr->gr_passwd) + 1)) == NULL) {
+            get_static(buffer, buflen, len)) == NULL) {
 
                /* Out of memory */
                return NSS_STATUS_TRYAGAIN;
        }
 
-       strcpy(result->gr_passwd, gr->gr_passwd);
+       memcpy(result->gr_passwd, gr->gr_passwd, len);
 
        /* gid */
 
@@ -355,13 +352,15 @@ static NSS_STATUS fill_grent(struct group *result, struct winbindd_gr *gr,
 
        while(next_token_alloc((const char **)&gr_mem, &name, ",")) {
                /* Allocate space for member */
+               len = strlen(name) + 1;
+
                if (((result->gr_mem)[i] =
-                    get_static(buffer, buflen, strlen(name) + 1)) == NULL) {
+                    get_static(buffer, buflen, len)) == NULL) {
                        free(name);
                        /* Out of memory */
                        return NSS_STATUS_TRYAGAIN;
                }
-               strcpy((result->gr_mem)[i], name);
+               memcpy((result->gr_mem)[i], name, len);
                free(name);
                i++;
        }
@@ -1158,361 +1157,3 @@ _nss_winbind_initgroups_dyn(char *user, gid_t group, long int *start,
 
        return ret;
 }
-
-
-/* return a list of group SIDs for a user SID */
-NSS_STATUS
-_nss_winbind_getusersids(const char *user_sid, char **group_sids,
-                        int *num_groups,
-                        char *buffer, size_t buf_size, int *errnop)
-{
-       NSS_STATUS ret;
-       struct winbindd_request request;
-       struct winbindd_response response;
-
-#ifdef DEBUG_NSS
-       fprintf(stderr, "[%5d]: getusersids %s\n", getpid(), user_sid);
-#endif
-
-#if HAVE_PTHREAD
-       pthread_mutex_lock(&winbind_nss_mutex);
-#endif
-
-       ZERO_STRUCT(request);
-       ZERO_STRUCT(response);
-
-       strncpy(request.data.sid, user_sid,sizeof(request.data.sid) - 1);
-       request.data.sid[sizeof(request.data.sid) - 1] = '\0';
-
-       ret = winbindd_request_response(NULL, WINBINDD_GETUSERSIDS,
-                                       &request, &response);
-
-       if (ret != NSS_STATUS_SUCCESS) {
-               goto done;
-       }
-
-       if (buf_size < response.length - sizeof(response)) {
-               ret = NSS_STATUS_TRYAGAIN;
-               errno = *errnop = ERANGE;
-               goto done;
-       }
-
-       *num_groups = response.data.num_entries;
-       *group_sids = buffer;
-       memcpy(buffer, response.extra_data.data, response.length - sizeof(response));
-       errno = *errnop = 0;
-
- done:
-       winbindd_free_response(&response);
-
-#if HAVE_PTHREAD
-       pthread_mutex_unlock(&winbind_nss_mutex);
-#endif
-
-       return ret;
-}
-
-
-/* map a user or group name to a SID string */
-NSS_STATUS
-_nss_winbind_nametosid(const char *name, char **sid, char *buffer,
-                      size_t buflen, int *errnop)
-{
-       NSS_STATUS ret;
-       struct winbindd_response response;
-       struct winbindd_request request;
-
-#ifdef DEBUG_NSS
-       fprintf(stderr, "[%5d]: nametosid %s\n", getpid(), name);
-#endif
-
-#if HAVE_PTHREAD
-       pthread_mutex_lock(&winbind_nss_mutex);
-#endif
-
-       ZERO_STRUCT(response);
-       ZERO_STRUCT(request);
-
-       strncpy(request.data.name.name, name,
-               sizeof(request.data.name.name) - 1);
-       request.data.name.name[sizeof(request.data.name.name) - 1] = '\0';
-
-       ret = winbindd_request_response(NULL, WINBINDD_LOOKUPNAME,
-                                       &request, &response);
-       if (ret != NSS_STATUS_SUCCESS) {
-               *errnop = errno = EINVAL;
-               goto failed;
-       }
-
-       if (buflen < strlen(response.data.sid.sid)+1) {
-               ret = NSS_STATUS_TRYAGAIN;
-               *errnop = errno = ERANGE;
-               goto failed;
-       }
-
-       *errnop = errno = 0;
-       *sid = buffer;
-       strcpy(*sid, response.data.sid.sid);
-
-failed:
-       winbindd_free_response(&response);
-
-#if HAVE_PTHREAD
-       pthread_mutex_unlock(&winbind_nss_mutex);
-#endif
-
-       return ret;
-}
-
-/* map a sid string to a user or group name */
-NSS_STATUS
-_nss_winbind_sidtoname(const char *sid, char **name, char *buffer,
-                      size_t buflen, int *errnop)
-{
-       NSS_STATUS ret;
-       struct winbindd_response response;
-       struct winbindd_request request;
-       static char sep_char;
-       unsigned needed;
-
-#ifdef DEBUG_NSS
-       fprintf(stderr, "[%5d]: sidtoname %s\n", getpid(), sid);
-#endif
-
-#if HAVE_PTHREAD
-       pthread_mutex_lock(&winbind_nss_mutex);
-#endif
-
-       ZERO_STRUCT(response);
-       ZERO_STRUCT(request);
-
-       /* we need to fetch the separator first time through */
-       if (!sep_char) {
-               ret = winbindd_request_response(NULL, WINBINDD_INFO,
-                                               &request, &response);
-               if (ret != NSS_STATUS_SUCCESS) {
-                       *errnop = errno = EINVAL;
-                       goto failed;
-               }
-
-               sep_char = response.data.info.winbind_separator;
-               winbindd_free_response(&response);
-       }
-
-
-       strncpy(request.data.sid, sid,
-               sizeof(request.data.sid) - 1);
-       request.data.sid[sizeof(request.data.sid) - 1] = '\0';
-
-       ret = winbindd_request_response(NULL, WINBINDD_LOOKUPSID,
-                                       &request, &response);
-       if (ret != NSS_STATUS_SUCCESS) {
-               *errnop = errno = EINVAL;
-               goto failed;
-       }
-
-       needed =
-               strlen(response.data.name.dom_name) +
-               strlen(response.data.name.name) + 2;
-
-       if (buflen < needed) {
-               ret = NSS_STATUS_TRYAGAIN;
-               *errnop = errno = ERANGE;
-               goto failed;
-       }
-
-       snprintf(buffer, needed, "%s%c%s",
-                response.data.name.dom_name,
-                sep_char,
-                response.data.name.name);
-
-       *name = buffer;
-       *errnop = errno = 0;
-
-failed:
-       winbindd_free_response(&response);
-
-#if HAVE_PTHREAD
-       pthread_mutex_unlock(&winbind_nss_mutex);
-#endif
-
-       return ret;
-}
-
-/* map a sid to a uid */
-NSS_STATUS
-_nss_winbind_sidtouid(const char *sid, uid_t *uid, int *errnop)
-{
-       NSS_STATUS ret;
-       struct winbindd_response response;
-       struct winbindd_request request;
-
-#ifdef DEBUG_NSS
-       fprintf(stderr, "[%5d]: sidtouid %s\n", getpid(), sid);
-#endif
-
-#if HAVE_PTHREAD
-       pthread_mutex_lock(&winbind_nss_mutex);
-#endif
-
-       ZERO_STRUCT(request);
-       ZERO_STRUCT(response);
-
-       strncpy(request.data.sid, sid, sizeof(request.data.sid) - 1);
-       request.data.sid[sizeof(request.data.sid) - 1] = '\0';
-
-       ret = winbindd_request_response(NULL, WINBINDD_SID_TO_UID,
-                                       &request, &response);
-       if (ret != NSS_STATUS_SUCCESS) {
-               *errnop = errno = EINVAL;
-               goto failed;
-       }
-
-       *uid = response.data.uid;
-
-failed:
-
-#if HAVE_PTHREAD
-       pthread_mutex_unlock(&winbind_nss_mutex);
-#endif
-
-       return ret;
-}
-
-/* map a sid to a gid */
-NSS_STATUS
-_nss_winbind_sidtogid(const char *sid, gid_t *gid, int *errnop)
-{
-       NSS_STATUS ret;
-       struct winbindd_response response;
-       struct winbindd_request request;
-
-#ifdef DEBUG_NSS
-       fprintf(stderr, "[%5d]: sidtogid %s\n", getpid(), sid);
-#endif
-
-#if HAVE_PTHREAD
-       pthread_mutex_lock(&winbind_nss_mutex);
-#endif
-
-       ZERO_STRUCT(request);
-       ZERO_STRUCT(response);
-
-       strncpy(request.data.sid, sid, sizeof(request.data.sid) - 1);
-       request.data.sid[sizeof(request.data.sid) - 1] = '\0';
-
-       ret = winbindd_request_response(NULL, WINBINDD_SID_TO_GID,
-                                       &request, &response);
-       if (ret != NSS_STATUS_SUCCESS) {
-               *errnop = errno = EINVAL;
-               goto failed;
-       }
-
-       *gid = response.data.gid;
-
-failed:
-
-#if HAVE_PTHREAD
-       pthread_mutex_unlock(&winbind_nss_mutex);
-#endif
-
-       return ret;
-}
-
-/* map a uid to a SID string */
-NSS_STATUS
-_nss_winbind_uidtosid(uid_t uid, char **sid, char *buffer,
-                     size_t buflen, int *errnop)
-{
-       NSS_STATUS ret;
-       struct winbindd_response response;
-       struct winbindd_request request;
-
-#ifdef DEBUG_NSS
-       fprintf(stderr, "[%5u]: uidtosid %u\n", (unsigned int)getpid(), (unsigned int)uid);
-#endif
-
-#if HAVE_PTHREAD
-       pthread_mutex_lock(&winbind_nss_mutex);
-#endif
-
-       ZERO_STRUCT(response);
-       ZERO_STRUCT(request);
-
-       request.data.uid = uid;
-
-       ret = winbindd_request_response(NULL, WINBINDD_UID_TO_SID,
-                                       &request, &response);
-       if (ret != NSS_STATUS_SUCCESS) {
-               *errnop = errno = EINVAL;
-               goto failed;
-       }
-
-       if (buflen < strlen(response.data.sid.sid)+1) {
-               ret = NSS_STATUS_TRYAGAIN;
-               *errnop = errno = ERANGE;
-               goto failed;
-       }
-
-       *errnop = errno = 0;
-       *sid = buffer;
-       strcpy(*sid, response.data.sid.sid);
-
-failed:
-       winbindd_free_response(&response);
-
-#if HAVE_PTHREAD
-       pthread_mutex_unlock(&winbind_nss_mutex);
-#endif
-
-       return ret;
-}
-
-/* map a gid to a SID string */
-NSS_STATUS
-_nss_winbind_gidtosid(gid_t gid, char **sid, char *buffer,
-                     size_t buflen, int *errnop)
-{
-       NSS_STATUS ret;
-       struct winbindd_response response;
-       struct winbindd_request request;
-
-#ifdef DEBUG_NSS
-       fprintf(stderr, "[%5u]: gidtosid %u\n", (unsigned int)getpid(), (unsigned int)gid);
-#endif
-
-#if HAVE_PTHREAD
-       pthread_mutex_lock(&winbind_nss_mutex);
-#endif
-
-       ZERO_STRUCT(response);
-       ZERO_STRUCT(request);
-
-       request.data.gid = gid;
-
-       ret = winbindd_request_response(NULL, WINBINDD_GID_TO_SID,
-                                       &request, &response);
-       if (ret != NSS_STATUS_SUCCESS) {
-               *errnop = errno = EINVAL;
-               goto failed;
-       }
-
-       if (buflen < strlen(response.data.sid.sid)+1) {
-               ret = NSS_STATUS_TRYAGAIN;
-               *errnop = errno = ERANGE;
-               goto failed;
-       }
-
-       *errnop = errno = 0;
-       *sid = buffer;
-       strcpy(*sid, response.data.sid.sid);
-
-failed:
-       winbindd_free_response(&response);
-
-#if HAVE_PTHREAD
-       pthread_mutex_unlock(&winbind_nss_mutex);
-#endif
-
-       return ret;
-}