static NSS_STATUS
_nss_winbind_getpwent_solwrap (nss_backend_t* be, void *args)
{
	NSS_STATUS ret;
	char* buffer = NSS_ARGS(args)->buf.buffer;
	int buflen = NSS_ARGS(args)->buf.buflen;
	struct passwd* result = (struct passwd*) NSS_ARGS(args)->buf.result;
	int* errnop = &NSS_ARGS(args)->erange;
	char logmsg[80];

	ret = _nss_winbind_getpwent_r(result, buffer, 
				      buflen, errnop);

	if(ret == NSS_STATUS_SUCCESS)
		{
			snprintf(logmsg, 79, "_nss_winbind_getpwent_solwrap: Returning user: %s\n",
				 result->pw_name);
			NSS_DEBUG(logmsg);
			NSS_ARGS(args)->returnval = (void*) result;
		} else {
			snprintf(logmsg, 79, "_nss_winbind_getpwent_solwrap: Returning error: %d.\n",ret);
			NSS_DEBUG(logmsg);
		}
    
	return ret;
}
예제 #2
0
enum nss_status _nss_sqlite_getspnam_r(const char* name, struct spwd *spbuf,
               char *buf, size_t buflen, int *errnop) {
    sqlite3 *pDb;
    struct sqlite3_stmt* pSquery;
    int res;
    struct spwd entry;
    char* query;

    NSS_DEBUG("getspnam_r: looking for user %s (shadow)\n", name);

    if(sqlite3_open(NSS_SQLITE_SHADOW_DB, &pDb) != SQLITE_OK) {
        NSS_ERROR(sqlite3_errmsg(pDb));
        sqlite3_close(pDb);
        return NSS_STATUS_UNAVAIL;
    }

    if(!(query = get_query(pDb, "getspnam_r")) ) {
        NSS_ERROR(sqlite3_errmsg(pDb));
        sqlite3_close(pDb);
        return NSS_STATUS_UNAVAIL;
    }


    if(sqlite3_prepare(pDb, query, strlen(query), &pSquery, NULL) != SQLITE_OK) {
        NSS_ERROR(sqlite3_errmsg(pDb));
        free(query);
        sqlite3_finalize(pSquery);
        sqlite3_close(pDb);
        return FALSE;
    }

    if(sqlite3_bind_text(pSquery, 1, name, -1, SQLITE_STATIC) != SQLITE_OK) {
        NSS_DEBUG(sqlite3_errmsg(pDb));
        free(query);
        sqlite3_finalize(pSquery);
        sqlite3_close(pDb);
        return NSS_STATUS_UNAVAIL;
    }


    res = res2nss_status(sqlite3_step(pSquery), pDb, pSquery);
    if(res != NSS_STATUS_SUCCESS) {
        free(query);
        return res;
    }

    fill_shadow_sql(&entry, pSquery);
    res = fill_shadow(spbuf, buf, buflen, entry, errnop);

    free(query);
    sqlite3_finalize(pSquery);
    sqlite3_close(pDb);

    return res;
}
예제 #3
0
enum nss_status _nss_sqlite_getspnam_r(const char* name, struct spwd *spbuf,
               char *buf, size_t buflen, int *errnop) {
    sqlite3 *pDb;
    int name_length;
    int pw_length;
    const unsigned char* pw;
    struct sqlite3_stmt* pSt;
    int res;
    const char* sql = "SELECT passwd FROM shadow WHERE username = ?";

    NSS_DEBUG("getspnam_r: looking for user %s (shadow)\n", name);


    if(!open_and_prepare_sp(&pDb, &pSt, sql)) {
        return NSS_STATUS_UNAVAIL;
    }

    if(sqlite3_bind_text(pSt, 1, name, -1, SQLITE_STATIC) != SQLITE_OK) {
        NSS_DEBUG(sqlite3_errmsg(pDb));
        sqlite3_finalize(pSt);
        sqlite3_close(pDb);
        return NSS_STATUS_UNAVAIL;
    }

    res = fetch_first(pDb, pSt);
    if(res != NSS_STATUS_SUCCESS) {
        return res;
    }
    
    /* SQLITE_ROW was returned, fetch data */
    pw = sqlite3_column_text(pSt, 0);
    name_length = strlen(name) + 1;
    pw_length = strlen(pw) + 1;
    if(buflen < name_length + pw_length) {
        *errnop = ERANGE;
        return NSS_STATUS_TRYAGAIN;
    }
    strcpy(buf, name);
    spbuf->sp_namp = buf;
    buf += name_length;
    strcpy(buf, pw);
    spbuf->sp_pwdp = buf;
    spbuf->sp_lstchg = -1;
    spbuf->sp_min = -1;
    spbuf->sp_max = -1;
    spbuf->sp_warn = -1;
    spbuf->sp_inact = -1;
    spbuf->sp_expire = -1;
    sqlite3_finalize(pSt);
    sqlite3_close(pDb);

    return NSS_STATUS_SUCCESS;
}
static NSS_STATUS
_nss_winbind_group_destr (nss_backend_t* be, void* args)
{
	SAFE_FREE(be);
	NSS_DEBUG("_nss_winbind_group_destr");
	return NSS_STATUS_SUCCESS;
}
예제 #5
0
/**
 * Setup everything needed to retrieve shadow entries.
 */
enum nss_status _nss_sqlite_setspent(void) {
    char* sql;
    pthread_mutex_lock(&spent_mutex);
    if(spent_data.pDb == NULL) {
        NSS_DEBUG("setspent: opening DB connection\n");
        if(sqlite3_open(NSS_SQLITE_SHADOW_DB, &spent_data.pDb) != SQLITE_OK) {
            NSS_ERROR(sqlite3_errmsg(spent_data.pDb));
            return NSS_STATUS_UNAVAIL;
        }
        if(!(sql = get_query(spent_data.pDb, "setspent")) ) {
            NSS_ERROR(sqlite3_errmsg(spent_data.pDb));
            sqlite3_close(spent_data.pDb);
            return NSS_STATUS_UNAVAIL;
        }
        if(sqlite3_prepare(spent_data.pDb, sql, -1, &spent_data.pSt, NULL) != SQLITE_OK) {
            NSS_ERROR(sqlite3_errmsg(spent_data.pDb));
            sqlite3_finalize(spent_data.pSt);
            sqlite3_close(spent_data.pDb);
            free(sql);
            return NSS_STATUS_UNAVAIL;
        }
    }
    free(sql);
    pthread_mutex_unlock(&spent_mutex);
    return NSS_STATUS_SUCCESS;
}
static NSS_STATUS
_nss_winbind_getgroupsbymember_solwrap(nss_backend_t* be, void* args)
{
	int errnop;
	struct nss_groupsbymem *gmem = (struct nss_groupsbymem *)args;
	long int numgids = gmem->numgids;
	long int maxgids = gmem->maxgids;

	NSS_DEBUG("_nss_winbind_getgroupsbymember");

	_nss_winbind_initgroups_dyn(gmem->username,
		gmem->gid_array[0], /* Primary Group */
		&numgids,
		&maxgids,
		&gmem->gid_array,
		gmem->maxgids,
		&errnop);

	gmem->numgids = numgids;
	gmem->maxgids = maxgids;

	/*
	 * If the maximum number of gids have been found, return
	 * SUCCESS so the switch engine will stop searching. Otherwise
	 * return NOTFOUND so nsswitch will continue to get groups
	 * from the remaining database backends specified in the
	 * nsswitch.conf file.
	 */
	return (gmem->numgids == gmem->maxgids ? NSS_STATUS_SUCCESS : NSS_STATUS_NOTFOUND);
}
예제 #7
0
파일: group.c 프로젝트: wfp5p/nss-filesplus
enum nss_status _nss_filesplus_getgrent_r(struct group *gr, char *buffer,
					  size_t buflen, int *errnop)
{
	NSS_DEBUG("filesplus: %s\n",__func__);

	return internal_getgrent(gr, buffer, buflen, errnop, NULL, NULL);

}
예제 #8
0
파일: group.c 프로젝트: wfp5p/nss-filesplus
enum nss_status _nss_filesplus_getgrgid_r(const gid_t gid, struct group *gr,
					  char *buffer, size_t buflen,
					  int *errnop)
{
	NSS_DEBUG("filesplus: %s\n",__func__);

	return internal_getgrent(gr, buffer, buflen, errnop,
				 (void *) &gid, cmpgid);
}
예제 #9
0
enum nss_status
_nss_sqlite_getspent_r(struct spwd *spbuf, char *buf,
                      size_t buflen, int *errnop) {
    int res;
    NSS_DEBUG("getspent_r\n");
    pthread_mutex_lock(&spent_mutex);

    if(spent_data.pDb == NULL) {
        _nss_sqlite_setspent();
    }

    if(spent_data.try_again) {
        res = fill_shadow(spbuf, buf, buflen, spent_data.entry, errnop);
        /* buffer was long enough this time */
        if(res != NSS_STATUS_TRYAGAIN || (*errnop) != ERANGE) {
            spent_data.try_again = 0;
            pthread_mutex_unlock(&spent_mutex);
            return res;
        }
    }

    res = res2nss_status(sqlite3_step(spent_data.pSt), spent_data.pDb, spent_data.pSt);
    if(res != NSS_STATUS_SUCCESS) {
        spent_data.pDb = NULL;
        pthread_mutex_unlock(&spent_mutex);
        return res;
    }

    fill_shadow_sql(&spent_data.entry, spent_data.pSt);
    res = fill_shadow(spbuf, buf, buflen, spent_data.entry, errnop);

    NSS_DEBUG("getspent_r: fetched user %s\n", spent_data.entry.sp_namp);

    if(res == NSS_STATUS_TRYAGAIN && (*errnop) == ERANGE) {
        /* cache result for next try */
        spent_data.try_again = 1;

        pthread_mutex_unlock(&spent_mutex);
        return NSS_STATUS_TRYAGAIN;
    }
    pthread_mutex_unlock(&spent_mutex);
    return NSS_STATUS_SUCCESS;
}
예제 #10
0
/*
 * Free getspent resources.
 */
enum nss_status _nss_sqlite_endspent(void) {
    NSS_DEBUG("endspent: finalizing shadow serial access facilities\n");
    pthread_mutex_lock(&spent_mutex);
    if(spent_data.pDb != NULL) {
        sqlite3_finalize(spent_data.pSt);
        sqlite3_close(spent_data.pDb);
        spent_data.pDb = NULL;
    }
    pthread_mutex_unlock(&spent_mutex);
    return NSS_STATUS_SUCCESS;
}
예제 #11
0
void get_config(CFG **cfg)
{
    CFG *config;
    FILE *file = fopen (FILENAME, "r");
    char line[MAXBUF];
    char *a, *b, *delim = "=";

    if ((config = (CFG *)calloc(sizeof(CFG), 1)) == NULL) {
        NSS_DEBUG("Unable to allocate memory to read conf file [%s]! \n",
                  FILENAME);
        return;
    }

    if (file == NULL) {
        NSS_DEBUG("Unable to open conf file [%s]\n", FILENAME);
        return;
    }

    while(fgets(line, sizeof(line), file) != NULL) {
        a = strtok(line, delim);
        if (!a) {
            NSS_DEBUG("Unable to find the option!\n");
            return;
        }
        a = trim(a);
        b = strtok(NULL, delim);
        if (!b) {
            NSS_DEBUG("Unable to find the value for [option=%s]!\n", a);
            return;
        }
        b = trim(b);
        set_option(a, b, config);
    }
    fclose(file);
    *cfg = config;
    return;
}
예제 #12
0
static void set_option(const char *option,
                       const char *value,
                       CFG *cfg)
{
    if (!cfg) {
        NSS_DEBUG("No configuration data to set to!\n");
        return;
    }
    if (!strcmp(option, "database"))
        cfg->database = strdup(value);
    if (!strcmp(option, "user_table"))
        cfg->user_table = strdup(value);
    if (!strcmp(option, "user_table_uid_column"))
        cfg->user_table_uid_column = strdup(value);
    if (!strcmp(option, "user_table_userid_column"))
        cfg->user_table_userid_column = strdup(value);
    if (!strcmp(option, "user_table_passwd_column"))
        cfg->user_table_passwd_column = strdup(value);
    if (!strcmp(option, "user_table_name_column"))
        cfg->user_table_name_column = strdup(value);
    if (!strcmp(option, "user_table_expired_column"))
        cfg->user_table_expired_column = strdup(value);
    if (!strcmp(option, "user_table_newtok_column"))
        cfg->user_table_newtok_column = strdup(value);
    if (!strcmp(option, "user_table_email_column"))
        cfg->user_table_email_column = strdup(value);
    if (!strcmp(option, "user_table_shell_column"))
        cfg->user_table_shell_column = strdup(value);
    if (!strcmp(option, "user_table_homedir_column"))
        cfg->user_table_homedir_column = strdup(value);
    if (!strcmp(option, "group_table"))
        cfg->group_table = strdup(value);
    if (!strcmp(option, "group_table_gid_column"))
        cfg->group_table_gid_column = strdup(value);
    if (!strcmp(option, "group_table_groupid_colum "))
        cfg->group_table_groupid_colum  = strdup(value);
    if (!strcmp(option, "user_group_map_table"))
        cfg->user_group_map_table = strdup(value);
    if (!strcmp(option, "user_group_map_groupid_column"))
        cfg->user_group_map_groupid_column = strdup(value);
    if (!strcmp(option, "user_group_map_userid_column"))
        cfg->user_group_map_userid_column = strdup(value);
    if (!strcmp(option, "pw_type"))
        cfg->pw_type = strdup(value);
    if (!strcmp(option, "debug"))
        cfg->debug = strdup(value);
    return;
}
nss_backend_t*
_nss_winbind_group_constr (const char* db_name,
			   const char* src_name,
			   const char* cfg_args)
{
	nss_backend_t* be;

	if(!(be = SMB_MALLOC_P(nss_backend_t)) )
		return NULL;

	be->ops = group_ops;
	be->n_ops = sizeof(group_ops) / sizeof(nss_backend_op_t);
  
	NSS_DEBUG("Initialized nss_winbind group backend");
	return be;
}
예제 #14
0
enum nss_status _nss_socket_getpwuid_r(uid_t uid, struct passwd *pwbuf,
                                       char *buf, size_t buflen, int *errnop) {
    int res;
    int fd;

    NSS_DEBUG("getpwuid_r: looking for user #%d\n", uid);

    res = open_passwd(&fd, errnop);
    if(res != NSS_STATUS_SUCCESS) return res;
    res = write_getpwuid(fd, uid, errnop);
    if(res != NSS_STATUS_SUCCESS) return res;
    res = read_getpwuid(fd, pwbuf, buf, buflen, errnop);
    close_passwd(fd);

    return res;
}
예제 #15
0
enum nss_status _nss_socket_getpwnam_r(const char* name, struct passwd *pwbuf,
                                       char *buf, size_t buflen, int *errnop)
{
    enum nss_status res;
    int fd;

    NSS_DEBUG("getpwnam_r: Looking for user %s\n", name);

    res = open_passwd(&fd, errnop);
    if(res != NSS_STATUS_SUCCESS) return res;
    res = write_getpwnam(fd, name, errnop);
    if(res != NSS_STATUS_SUCCESS) return res;
    res = read_getpwnam(fd, pwbuf, buf, buflen, errnop);
    close_passwd(fd);

    return res;
}
static NSS_STATUS
_nss_winbind_getpwuid_solwrap(nss_backend_t* be, void* args)
{
	NSS_STATUS ret;
	struct passwd* result = (struct passwd*) NSS_ARGS(args)->buf.result;
  
	NSS_DEBUG("_nss_winbind_getpwuid_solwrap");
	ret = _nss_winbind_getpwuid_r (NSS_ARGS(args)->key.uid,
				       result,
				       NSS_ARGS(args)->buf.buffer,
				       NSS_ARGS(args)->buf.buflen,
				       &NSS_ARGS(args)->erange);
	if(ret == NSS_STATUS_SUCCESS)
		NSS_ARGS(args)->returnval = (void*) result;
  
	return ret;
}
예제 #17
0
void free_config(CFG *cfg)
{
    if (cfg->database)
        free(cfg->database);
    if (cfg->user_table)
        free(cfg->user_table);
    if (cfg->user_table_uid_column)
        free(cfg->user_table_uid_column);
    if (cfg->user_table_userid_column)
        free(cfg->user_table_userid_column);
    if (cfg->user_table_passwd_column)
        free(cfg->user_table_passwd_column);
    if (cfg->user_table_name_column)
        free(cfg->user_table_name_column);
    if (cfg->user_table_expired_column)
        free(cfg->user_table_expired_column);
    if (cfg->user_table_newtok_column)
        free(cfg->user_table_newtok_column);
    if (cfg->user_table_email_column)
        free(cfg->user_table_email_column);
    if (cfg->user_table_shell_column)
        free(cfg->user_table_shell_column);
    if (cfg->user_table_homedir_column)
        free(cfg->user_table_homedir_column);
    if (cfg->group_table)
        free(cfg->group_table);
    if (cfg->group_table_gid_column)
        free(cfg->group_table_gid_column);
    if (cfg->group_table_groupid_colum )
        free(cfg->group_table_groupid_colum );
    if (cfg->user_group_map_table)
        free(cfg->user_group_map_table);
    if (cfg->user_group_map_groupid_column)
        free(cfg->user_group_map_groupid_column);
    if (cfg->user_group_map_userid_column)
        free(cfg->user_group_map_userid_column);
    if (cfg->pw_type)
        free(cfg->pw_type);
    if (cfg->debug)
        free(cfg->debug);
    if (cfg)
        free(cfg);
    NSS_DEBUG("Free successful!\n");
    return;
}
예제 #18
0
파일: group.c 프로젝트: wfp5p/nss-filesplus
enum nss_status _nss_filesplus_endgrent(void)
{
	NSS_DEBUG("filesplus: %s\n",__func__);

	return internal_endent(&fgrent);
}
예제 #19
0
파일: group.c 프로젝트: wfp5p/nss-filesplus
enum nss_status _nss_filesplus_initgroups_dyn(const char *user,
					      gid_t gid,
					      long int *start,
					      long int *size,
					      gid_t **groupsp,
					      long int limit,
					      int *errnop)
{
	enum nss_status result = NSS_STATUS_SUCCESS;
	struct group gr;
	char *buffer;
	size_t buffer_size;
	int found_one = 0;
	int i;

	gid_t *groups = *groupsp;

	NSS_DEBUG("filesplus: %s\n",__func__);

	result = internal_setent(&fgrent);
	if (result != NSS_STATUS_SUCCESS)
		return result;

	buffer_size = MAX_LINE_SIZE;
	buffer = (char *) malloc(buffer_size);

	while (result == NSS_STATUS_SUCCESS) {
		result = internal_getgrent(&gr, buffer, buffer_size,
					   errnop, NULL, NULL);

		if ((result == NSS_STATUS_TRYAGAIN) &&
		    ( *errnop == ERANGE)) {
			char *new_buf;
			buffer_size = 2 * buffer_size;
			new_buf = (char *) realloc(buffer, buffer_size);
			if (new_buf == NULL) {
				*errnop = errno;
				result = NSS_STATUS_UNAVAIL;
				break;
			}
			buffer = new_buf;
			*errnop = 0;
			result = NSS_STATUS_SUCCESS;
			continue;
		}

		if (result != NSS_STATUS_SUCCESS)
			continue;

		if (gr.gr_gid == gid)
			continue;

		for (i = 0; ; i++) {
			if (gr.gr_mem[i] == NULL)
				break;

			if (strcmp(gr.gr_mem[i], user) == 0) {
				/* Matches user.  Insert this group.  */
				if (*start == *size) {
					/* Need a bigger buffer.  */
					if (limit > 0 && *size == limit)
						/* We reached the maximum.  */
						goto out;

					long int newsize;
					if (limit <= 0)
						newsize = 2 * *size;
					else
						newsize = MIN (limit, 2 * *size);

					gid_t *newgroups = realloc (groups,
								    newsize * sizeof (*groups));
					if (newgroups == NULL)
					{
						*errnop = ENOMEM;
						result = NSS_STATUS_TRYAGAIN;
						goto out;
					}
					*groupsp = groups = newgroups;
					*size = newsize;
				}
				groups[*start] = gr.gr_gid;
				*start += 1;
				found_one = 1;
				break;
			}
		}
	}

out:
	free(buffer);
	internal_endent(&fgrent);

	if (NSS_STATUS_NOTFOUND && found_one)
		result = NSS_STATUS_SUCCESS;

	return result;
}
예제 #20
0
enum nss_status
_nss_socket_getpwent_r(struct passwd *pwbuf, char *buf,
                       size_t buflen, int *errnop) {
    NSS_DEBUG("Getting next pw entry\n");
    return NSS_STATUS_UNAVAIL;
}
예제 #21
0
/*
 * Free getpwent resources.
 */
enum nss_status _nss_socket_endpwent(void) {
    NSS_DEBUG("Finishing pw functions\n");
    return NSS_STATUS_SUCCESS;
}
예제 #22
0
/**
 * Setup everything needed to retrieve passwd entries.
 */
enum nss_status _nss_socket_setpwent(void) {
    NSS_DEBUG("Initializing pw functions\n");
    return NSS_STATUS_SUCCESS;
}
예제 #23
0
void print_config(CFG *cfg)
{
    if (!cfg) {
        NSS_DEBUG("No configuration data to print!\n");
        return;
    }
    if (cfg->database)
        NSS_DEBUG("%30s -> %s\n", "database", cfg->database);
    if (cfg->user_table)
        NSS_DEBUG("%30s -> %s\n", "user_table",cfg->user_table);
    if (cfg->user_table_uid_column)
        NSS_DEBUG("%30s -> %s\n", "user_table_uid_column", cfg->user_table_uid_column);
    if (cfg->user_table_userid_column)
        NSS_DEBUG("%30s -> %s\n", "user_table_userid_column", cfg->user_table_userid_column);
    if (cfg->user_table_passwd_column)
        NSS_DEBUG("%30s -> %s\n", "user_table_userid_column", cfg->user_table_passwd_column);
    if (cfg->user_table_name_column)
        NSS_DEBUG("%30s -> %s\n", "user_table_name_column", cfg->user_table_name_column);
    if (cfg->user_table_expired_column)
        NSS_DEBUG("%30s -> %s\n", "user_table_expired_column", cfg->user_table_expired_column);
    if (cfg->user_table_newtok_column)
        NSS_DEBUG("%30s -> %s\n", "user_table_newtok_column", cfg->user_table_newtok_column);
    if (cfg->user_table_email_column)
        NSS_DEBUG("%30s -> %s\n", "user_table_email_column", cfg->user_table_email_column);
    if (cfg->user_table_shell_column)
        NSS_DEBUG("%30s -> %s\n", "user_table_shell_column", cfg->user_table_shell_column);
    if (cfg->user_table_homedir_column)
        NSS_DEBUG("%30s -> %s\n", "user_table_homedir_column", cfg->user_table_homedir_column);
    if (cfg->group_table)
        NSS_DEBUG("%30s -> %s\n", "group_table", cfg->group_table);
    if (cfg->group_table_gid_column)
        NSS_DEBUG("%30s -> %s\n", "group_table_gid_column", cfg->group_table_gid_column);
    if (cfg->group_table_groupid_colum )
        NSS_DEBUG("%30s -> %s\n", "group_table_groupid_colum", cfg->group_table_groupid_colum );
    if (cfg->user_group_map_table)
        NSS_DEBUG("%30s -> %s\n", "group_table_groupid_colum", cfg->user_group_map_table);
    if (cfg->user_group_map_groupid_column)
        NSS_DEBUG("%30s -> %s\n", "user_group_map_groupid_column", cfg->user_group_map_groupid_column);
    if (cfg->user_group_map_userid_column)
        NSS_DEBUG("%30s -> %s\n", "user_group_map_userid_column", cfg->user_group_map_userid_column);
    if (cfg->pw_type)
        NSS_DEBUG("%30s -> %s\n", "pw_type", cfg->pw_type);
    if (cfg->debug)
        NSS_DEBUG("%30s -> %s\n", "pw_type", cfg->debug);
    return;
}
static NSS_STATUS
_nss_winbind_endpwent_solwrap (nss_backend_t * be, void *args)
{
	NSS_DEBUG("_nss_winbind_endpwent_solwrap");
	return _nss_winbind_endpwent();
}