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; }
/* 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; }