예제 #1
0
int smbftpd_mode_get(int default_mode, const char *exception, const char *user)
{
	enum smbftpd_mode mode = default_mode;

	if (is_user_in_list(user, exception)) {
		if (default_mode == MODE_NORMAL) {
			mode = MODE_SMB;
		} else if (default_mode == MODE_SMB) {
			mode = MODE_NORMAL;
		}
	}

	return mode;
}
int add_user_to_list(char *username, int is_all) {
	if (!bad_list || (bad_list == MAP_FAILED))
		return -1;
	int uid = BAD_LVE;
	if (lock_read_map() == 0) {
		uid = get_uid(username);
		unlock_rdwr_map();
	}
	if (is_all && uid == BAD_LVE) {
		uid = 0;
	}
	if (!is_user_in_list(username)) {
		if ((bad_list->numbers + 1) == MAX_ITEMS_IN_TABLE)
			return -2;
		if (sem_wait(sem) == 0) {
			strlcpy(bad_list->items[bad_list->numbers].username, username,
			USERNAMEMAXLEN);
			bad_list->items[bad_list->numbers++].uid = uid;
			sem_post(sem);
		}
	}
	return 0;
}
예제 #3
0
/* Get shares that is accessable by szUser and put in smbftpd_share_t
 *
 * Return Values:
 *	0: Success
 *	-1: Failed
 */
int smbftpd_valid_share_get(const char *user, const char *home_dir,
							smbftpd_share_t *shares, smbftpd_valid_share_t **ppvalid_shares)
{
	smbftpd_share_t *curr;
	struct stat statcheck;
	char *home = NULL;
	int writable = 0;
	int err = -1;
	int deny;

	if (NULL == user) {
		syslog(LOG_ERR, "%s (%d) bad parameter", __FILE__, __LINE__);
		return -1;
	}

	if (NULL == shares) {
		*ppvalid_shares = NULL;
		return 0;
	}

	curr = shares;
	while (curr) {
		home = NULL;
		deny = 1;
		writable = 0;

		if (strcmp(curr->share, "homes") == 0) {
			char *ptr = real_full_path(home_dir);
			if (!ptr) {
				goto SKIP;
			}
			home = strdup(ptr);
			if (!home) {
				syslog(LOG_ERR, "%s (%d) Failed to strdup(%s). (%s)",
					   __FILE__, __LINE__, smbftpd_session.home, strerror(errno));
				goto Error;
			}
			deny = 0;
			writable = 1;
			goto SKIP;
		}

		if (1 == is_user_in_list(user, curr->rw)) {
			writable = 1;
			deny = 0;
		}

		if (deny == 1) {
			if (1 == is_user_in_list(user, curr->ro)) {
				deny = 0;
			}
		}
SKIP:
		// Shared is accessable for szUser
		if (deny == 0) {
			if (home || ((!stat(curr->path, &statcheck)) &&
				(S_ISDIR(statcheck.st_mode)))) {
				smbftpd_valid_share_t *pSet;

				pSet = calloc(1, sizeof(smbftpd_valid_share_t));
				if (pSet == NULL) {
					syslog(LOG_ERR, "%s (%d) Ran out of memory.", __FILE__, __LINE__);
					if (home) {
						free(home);
					}
					goto Error;
				}
				pSet->share = home?strdup("home"):strdup(curr->share);
				pSet->path = home?home:strdup(curr->path);
				pSet->browseable = curr->browseable;

				if (writable) {
					pSet->writable = 1;
				}
				if (is_user_in_list(user, curr->disable_download)) {
					pSet->disable_download = 1;
				}
				if (is_user_in_list(user, curr->disable_ls)) {
					pSet->disable_ls = 1;
				}
				if (is_user_in_list(user, curr->disable_modify)) {
					pSet->disable_modify = 1;
				}
				pSet->next = *ppvalid_shares;
				*ppvalid_shares = pSet;

			}
		}
		curr = curr->next;
	}

	err = 0;
Error:
	if (err) {
		smbftpd_valid_share_free(ppvalid_shares);
	}
	return err;
}